ZGlmZiAtLWdpdCBhLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlODBkOAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kCkBAIC0wLDAgKzEsOSBAQAorIyMgQ1B5dGhvbiBNaXJyb3IKKworaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9jcHl0aG9uIGlzIGEgY3B5dGhvbiBtaXJyb3IgcmVwb3NpdG9yeS4gUHVsbCByZXF1ZXN0cworYXJlIG5vdCBhY2NlcHRlZCBvbiB0aGlzIHJlcG8gYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbG9zZWQuCisKKyMjIyBTdWJtaXQgcGF0Y2hlcyBhdCBodHRwczovL2J1Z3MucHl0aG9uLm9yZworCitGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250cmlidXRpbmcgdG8gQ1B5dGhvbiwgc2VlIHRoZQorW2RldmVsb3BlcidzIGd1aWRlXShodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8jY29udHJpYnV0aW5nKS4KZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGQyNjdkMTUuLmE1MTEzOTMgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNzMsNiArNzMsNyBAQAogaXBjaC8KIGxpYnB5dGhvbiouYQogbGlicHl0aG9uKi5zbyoKK2xpYnB5dGhvbiouZHlsaWIKIHBsYXRmb3JtCiBweWJ1aWxkZGlyLnR4dAogcHljb25maWcuaApkaWZmIC0tZ2l0IGEvLmhnaWdub3JlIGIvLmhnaWdub3JlCmluZGV4IGNmOTQ1M2EuLmEzZmZjZjQgMTAwNjQ0Ci0tLSBhLy5oZ2lnbm9yZQorKysgYi8uaGdpZ25vcmUKQEAgLTIsNiArMiw3IEBACiAucHVyaWZ5CiAuc3ZuLwogXi5pZGVhLworXi52c2NvZGUvCiAuRFNfU3RvcmUKIE1ha2VmaWxlJAogTWFrZWZpbGUucHJlJApAQCAtNDMsNiArNDQsNyBAQAogc3ludGF4OiBnbG9iCiBsaWJweXRob24qLmEKIGxpYnB5dGhvbiouc28qCitsaWJweXRob24qLmR5bGliCiAqLnN3cAogKi5vCiAqLnB5YwpkaWZmIC0tZ2l0IGEvLmhndGFncyBiLy5oZ3RhZ3MKaW5kZXggZWQ0ZmM5Mi4uMTc2OTAyYyAxMDA2NDQKLS0tIGEvLmhndGFncworKysgYi8uaGd0YWdzCkBAIC0xNDgsNiArMTQ4LDcgQEAKIDczN2VmY2FkZjVhNjc4YjE4NGUwZmE0MzFhYWUxMTI3NmJmMDY2NDggdjMuNC40CiAzNjMxYmI0YTI0OTAyOTJlYmY4MWQzZTk0N2FlMzZkYTE0NWRhNTY0IHYzLjQuNXJjMQogNjE5YjYxZTUwNWQwZTJjY2M4NTE2YjM2NmU0ZGRkMTk3MWI0NmE2ZiB2My40LjUKKzM2MzFiYjRhMjQ5MDI5MmViZjgxZDNlOTQ3YWUzNmRhMTQ1ZGE1NjQgdjMuNC41cmMxCiA1ZDRiNmE1N2Q1ZmQ3NTY0YmY3M2YzZGIwZTQ2ZmU1ZWViMDBiY2Q4IHYzLjUuMGExCiAwMzM3YmQ3ZWJjYjY1NTlkNjk2NzliYzcwMjUwNTlhZDFjZTRmNDMyIHYzLjUuMGEyCiA4MjY1NmUyOGI1ZTVjNGFlNDhkOGRkOGI1ZjBkNzk2ODkwOGE4MmI2IHYzLjUuMGEzCkBAIC0xNjUsMyArMTY2LDcgQEAKIDM3YTA3Y2VlNTk2OWU2ZDM2NzI1ODMxODdhNzNjZjYzNmZmMjhlMWIgdjMuNS4xCiA2OGZlZWM2NDg4YjI2MzI3YTg1YTYzNDYwNWRkMjhlY2E0ZGFhNWYxIHYzLjUuMnJjMQogNGRlZjJhMjkwMWE1NjE4ZWE0NWJjYzhmMmExNDExZWYzM2FmMThhZCB2My41LjIKKzU4OTZkYTM3MmZiMDQ0ZTM4NTk1ZmI3NDQ5NWRlMWUxZTdjOGZiM2MgdjMuNi4wYTEKKzM3ODg5MzQyMzU1MjIzZTJmYzE0MzhkZTNkYzdmZmNkNjI1YzYwZjcgdjMuNi4wYTIKK2YzZWRmMTNkYzMzOWI4OTQyYWU2YjMwOTc3MWFiMTk3ZGQ4Y2U2ZmEgdjMuNi4wYTMKKzAxN2NmMjYwOTM2YjQ0NDc4OGM5YjY3MWQxOTViN2JmZDgzZGJkMjUgdjMuNi4wYTQKZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZSBiL0RvYy9NYWtlZmlsZQppbmRleCA4Nzg2ODVkLi4yMDJlOGUxIDEwMDY0NAotLS0gYS9Eb2MvTWFrZWZpbGUKKysrIGIvRG9jL01ha2VmaWxlCkBAIC0xNTMsNyArMTUzLDcgQEAKIAljcCAtcFBSIGJ1aWxkL2VwdWIvUHl0aG9uLmVwdWIgZGlzdC9weXRob24tJChESVNUVkVSU0lPTiktZG9jcy5lcHViCiAKIGNoZWNrOgotCSQoUFlUSE9OKSB0b29scy9yc3RsaW50LnB5IC1pIHRvb2xzCisJJChQWVRIT04pIHRvb2xzL3JzdGxpbnQucHkgLWkgdG9vbHMgLWkgdmVudgogCiBzZXJ2ZToKIAkuLi9Ub29scy9zY3JpcHRzL3NlcnZlLnB5IGJ1aWxkL2h0bWwKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9hcmcucnN0IGIvRG9jL2MtYXBpL2FyZy5yc3QKaW5kZXggZDVlNDcwMy4uZjkzMjk5NyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2FyZy5yc3QKKysrIGIvRG9jL2MtYXBpL2FyZy5yc3QKQEAgLTIyMyw4ICsyMjMsNyBAQAogICAgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgd2lsbCB1c2UgdGhpcyBsb2NhdGlvbiBhcyB0aGUgYnVmZmVyIGFuZCBpbnRlcnByZXQgdGhlCiAgICBpbml0aWFsIHZhbHVlIG9mICpcKmJ1ZmZlcl9sZW5ndGgqIGFzIHRoZSBidWZmZXIgc2l6ZS4gIEl0IHdpbGwgdGhlbiBjb3B5IHRoZQogICAgZW5jb2RlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBhbmQgTlVMLXRlcm1pbmF0ZSBpdC4gIElmIHRoZSBidWZmZXIgaXMgbm90IGxhcmdlCi0gICBlbm91Z2gsIGEgOmV4YzpgVHlwZUVycm9yYCB3aWxsIGJlIHNldC4KLSAgIE5vdGU6IHN0YXJ0aW5nIGZyb20gUHl0aG9uIDMuNiBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgc2V0LgorICAgZW5vdWdoLCBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgc2V0LgogCiAgICBJbiBib3RoIGNhc2VzLCAqXCpidWZmZXJfbGVuZ3RoKiBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBkYXRhCiAgICB3aXRob3V0IHRoZSB0cmFpbGluZyBOVUwgYnl0ZS4KQEAgLTQyNCw4ICs0MjMsMTUgQEAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhciAqa2V5d29yZHNbXSwgLi4uKQogCiAgICBQYXJzZSB0aGUgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYm90aCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkCi0gICBwYXJhbWV0ZXJzIGludG8gbG9jYWwgdmFyaWFibGVzLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUsIGl0Ci0gICByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgIHBhcmFtZXRlcnMgaW50byBsb2NhbCB2YXJpYWJsZXMuICBUaGUgKmtleXdvcmRzKiBhcmd1bWVudCBpcyBhCisgICAqTlVMTCotdGVybWluYXRlZCBhcnJheSBvZiBrZXl3b3JkIHBhcmFtZXRlciBuYW1lcy4gIEVtcHR5IG5hbWVzIGRlbm90ZQorICAgOnJlZjpgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4KKyAgIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzOyBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGZhbHNlIGFuZCByYWlzZXMgdGhlCisgICBhcHByb3ByaWF0ZSBleGNlcHRpb24uCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciA6cmVmOmBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycworICAgICAgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhciAqa2V5d29yZHNbXSwgdmFfbGlzdCB2YXJncykKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdCBiL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdAppbmRleCAxOWNiYjNiLi4yMjZiNjE5IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKKysrIGIvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CkBAIC0zMzQsNiArMzM0LDE0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAogCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXJyX1Jlc291cmNlV2FybmluZyhQeU9iamVjdCAqc291cmNlLCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKworICAgRnVuY3Rpb24gc2ltaWxhciB0byA6YzpmdW5jOmBQeUVycl9XYXJuRm9ybWF0YCwgYnV0ICpjYXRlZ29yeSogaXMKKyAgIDpleGM6YFJlc291cmNlV2FybmluZ2AgYW5kIHBhc3MgKnNvdXJjZSogdG8gOmZ1bmM6YHdhcm5pbmdzLldhcm5pbmdNZXNzYWdlYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogUXVlcnlpbmcgdGhlIGVycm9yIGluZGljYXRvcgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW1wb3J0LnJzdCBiL0RvYy9jLWFwaS9pbXBvcnQucnN0CmluZGV4IDI5MzZmNGYuLjVhMDgzY2UgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pbXBvcnQucnN0CisrKyBiL0RvYy9jLWFwaS9pbXBvcnQucnN0CkBAIC0yMDcsMTMgKzIwNywxMyBAQAogCiAuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5SW1wb3J0X0dldEltcG9ydGVyKFB5T2JqZWN0ICpwYXRoKQogCi0gICBSZXR1cm4gYW4gaW1wb3J0ZXIgb2JqZWN0IGZvciBhIDpkYXRhOmBzeXMucGF0aGAvOmF0dHI6YHBrZy5fX3BhdGhfX2AgaXRlbQorICAgUmV0dXJuIGEgZmluZGVyIG9iamVjdCBmb3IgYSA6ZGF0YTpgc3lzLnBhdGhgLzphdHRyOmBwa2cuX19wYXRoX19gIGl0ZW0KICAgICpwYXRoKiwgcG9zc2libHkgYnkgZmV0Y2hpbmcgaXQgZnJvbSB0aGUgOmRhdGE6YHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYAogICAgZGljdC4gIElmIGl0IHdhc24ndCB5ZXQgY2FjaGVkLCB0cmF2ZXJzZSA6ZGF0YTpgc3lzLnBhdGhfaG9va3NgIHVudGlsIGEgaG9vawogICAgaXMgZm91bmQgdGhhdCBjYW4gaGFuZGxlIHRoZSBwYXRoIGl0ZW0uICBSZXR1cm4gYGBOb25lYGAgaWYgbm8gaG9vayBjb3VsZDsKLSAgIHRoaXMgdGVsbHMgb3VyIGNhbGxlciBpdCBzaG91bGQgZmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBpbXBvcnQgbWVjaGFuaXNtLgotICAgQ2FjaGUgdGhlIHJlc3VsdCBpbiA6ZGF0YTpgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgLiAgUmV0dXJuIGEgbmV3IHJlZmVyZW5jZQotICAgdG8gdGhlIGltcG9ydGVyIG9iamVjdC4KKyAgIHRoaXMgdGVsbHMgb3VyIGNhbGxlciB0aGF0IHRoZSA6dGVybTpgcGF0aCBiYXNlZCBmaW5kZXJgIGNvdWxkIG5vdCBmaW5kIGEKKyAgIGZpbmRlciBmb3IgdGhpcyBwYXRoIGl0ZW0uIENhY2hlIHRoZSByZXN1bHQgaW4gOmRhdGE6YHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYC4KKyAgIFJldHVybiBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIGZpbmRlciBvYmplY3QuCiAKIAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgX1B5SW1wb3J0X0luaXQoKQpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2luaXQucnN0IGIvRG9jL2MtYXBpL2luaXQucnN0CmluZGV4IDYzOTgxOWMuLmQ3NzgzNmEgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pbml0LnJzdAorKysgYi9Eb2MvYy1hcGkvaW5pdC5yc3QKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgIHRyaXBsZTogbW9kdWxlOyBzZWFyY2g7IHBhdGgKICAgICAgIHNpbmdsZTogUHlTeXNfU2V0QXJndigpCiAgICAgICBzaW5nbGU6IFB5U3lzX1NldEFyZ3ZFeCgpCi0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAKICAgIEluaXRpYWxpemUgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIEluIGFuIGFwcGxpY2F0aW9uIGVtYmVkZGluZyAgUHl0aG9uLCB0aGlzCiAgICBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb3RoZXIgUHl0aG9uL0MgQVBJIGZ1bmN0aW9uczsgd2l0aCB0aGUKQEAgLTM0LDcgKzM0LDcgQEAKICAgIG1vZHVsZXMgOm1vZDpgYnVpbHRpbnNgLCA6bW9kOmBfX21haW5fX2AgYW5kIDptb2Q6YHN5c2AuICBJdCBhbHNvIGluaXRpYWxpemVzCiAgICB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoIChgYHN5cy5wYXRoYGApLiBJdCBkb2VzIG5vdCBzZXQgYGBzeXMuYXJndmBgOyB1c2UKICAgIDpjOmZ1bmM6YFB5U3lzX1NldEFyZ3ZFeGAgZm9yIHRoYXQuICBUaGlzIGlzIGEgbm8tb3Agd2hlbiBjYWxsZWQgZm9yIGEgc2Vjb25kIHRpbWUKLSAgICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZTsgaXQgaXMgYQorICAgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBmaXJzdCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWU7IGl0IGlzIGEKICAgIGZhdGFsIGVycm9yIGlmIHRoZSBpbml0aWFsaXphdGlvbiBmYWlscy4KIAogCkBAIC00OCwxOSArNDgsMjAgQEAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfSXNJbml0aWFsaXplZCgpCiAKICAgIFJldHVybiB0cnVlIChub256ZXJvKSB3aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGZhbHNlCi0gICAoemVybykgaWYgbm90LiAgQWZ0ZXIgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGlzIGNhbGxlZCwgdGhpcyByZXR1cm5zIGZhbHNlIHVudGlsCisgICAoemVybykgaWYgbm90LiAgQWZ0ZXIgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgaXMgY2FsbGVkLCB0aGlzIHJldHVybnMgZmFsc2UgdW50aWwKICAgIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGlzIGNhbGxlZCBhZ2Fpbi4KIAogCi0uLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9GaW5hbGl6ZSgpCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0ZpbmFsaXplRXgoKQogCiAgICBVbmRvIGFsbCBpbml0aWFsaXphdGlvbnMgbWFkZSBieSA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhbmQgc3Vic2VxdWVudCB1c2Ugb2YKICAgIFB5dGhvbi9DIEFQSSBmdW5jdGlvbnMsIGFuZCBkZXN0cm95IGFsbCBzdWItaW50ZXJwcmV0ZXJzIChzZWUKICAgIDpjOmZ1bmM6YFB5X05ld0ludGVycHJldGVyYCBiZWxvdykgdGhhdCB3ZXJlIGNyZWF0ZWQgYW5kIG5vdCB5ZXQgZGVzdHJveWVkIHNpbmNlCiAgICB0aGUgbGFzdCBjYWxsIHRvIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLiAgSWRlYWxseSwgdGhpcyBmcmVlcyBhbGwgbWVtb3J5CiAgICBhbGxvY2F0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQKLSAgIHRpbWUgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhZ2FpbiBmaXJzdCkuICBUaGVyZSBpcyBubyByZXR1cm4KLSAgIHZhbHVlOyBlcnJvcnMgZHVyaW5nIGZpbmFsaXphdGlvbiBhcmUgaWdub3JlZC4KKyAgIHRpbWUgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhZ2FpbiBmaXJzdCkuICBOb3JtYWxseSB0aGUKKyAgIHJldHVybiB2YWx1ZSBpcyAwLiAgSWYgdGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIGZpbmFsaXphdGlvbgorICAgKGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEpLCAtMSBpcyByZXR1cm5lZC4KIAogICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgYSBudW1iZXIgb2YgcmVhc29ucy4gIEFuIGVtYmVkZGluZyBhcHBsaWNhdGlvbgogICAgbWlnaHQgd2FudCB0byByZXN0YXJ0IFB5dGhvbiB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0IHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYuCkBAIC03OSw3ICs4MCwxNSBAQAogICAgZnJlZWQuICBTb21lIG1lbW9yeSBhbGxvY2F0ZWQgYnkgZXh0ZW5zaW9uIG1vZHVsZXMgbWF5IG5vdCBiZSBmcmVlZC4gIFNvbWUKICAgIGV4dGVuc2lvbnMgbWF5IG5vdCB3b3JrIHByb3Blcmx5IGlmIHRoZWlyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgaXMgY2FsbGVkIG1vcmUKICAgIHRoYW4gb25jZTsgdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGFwcGxpY2F0aW9uIGNhbGxzIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFuZAotICAgOmM6ZnVuYzpgUHlfRmluYWxpemVgIG1vcmUgdGhhbiBvbmNlLgorICAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgbW9yZSB0aGFuIG9uY2UuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKKy4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0ZpbmFsaXplKCkKKworICAgVGhpcyBpcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIHZlcnNpb24gb2YgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgdGhhdAorICAgZGlzcmVnYXJkcyB0aGUgcmV0dXJuIHZhbHVlLgogCiAKIFByb2Nlc3Mtd2lkZSBwYXJhbWV0ZXJzCkBAIC0xMDcsNyArMTE2LDcgQEAKICAgIE5vdGUgdGhhdCA6ZGF0YTpgc3lzLnN0ZGVycmAgYWx3YXlzIHVzZXMgdGhlICJiYWNrc2xhc2hyZXBsYWNlIiBlcnJvcgogICAgaGFuZGxlciwgcmVnYXJkbGVzcyBvZiB0aGlzIChvciBhbnkgb3RoZXIpIHNldHRpbmcuCiAKLSAgIElmIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBpcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGNhbGxlZAorICAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgaXMgY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCB0byBiZSBjYWxsZWQKICAgIGFnYWluIGluIG9yZGVyIHRvIGFmZmVjdCBzdWJzZXF1ZW50IGNhbGxzIHRvIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLgogCiAgICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgYSBub256ZXJvIHZhbHVlIG9uIGVycm9yIChlLmcuIGNhbGxpbmcgYWZ0ZXIgdGhlCkBAIC05MTgsNyArOTI3LDcgQEAKICAgIGVudHJ5LikKIAogICAgLi4gaW5kZXg6OgotICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogICAgICAgc2luZ2xlOiBQeV9Jbml0aWFsaXplKCkKIAogICAgRXh0ZW5zaW9uIG1vZHVsZXMgYXJlIHNoYXJlZCBiZXR3ZWVuIChzdWItKWludGVycHJldGVycyBhcyBmb2xsb3dzOiB0aGUgZmlyc3QKQEAgLTkyOCw3ICs5MzcsNyBAQAogICAgYW5kIGZpbGxlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvcHk7IHRoZSBleHRlbnNpb24ncyBgYGluaXRgYCBmdW5jdGlvbiBpcwogICAgbm90IGNhbGxlZC4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgaGFwcGVucyB3aGVuIGFuIGV4dGVuc2lvbiBpcwogICAgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGludGVycHJldGVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmUtaW5pdGlhbGl6ZWQgYnkgY2FsbGluZwotICAgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGFuZCA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYDsgaW4gdGhhdCBjYXNlLCB0aGUgZXh0ZW5zaW9uJ3MKKyAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGFuZCA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYDsgaW4gdGhhdCBjYXNlLCB0aGUgZXh0ZW5zaW9uJ3MKICAgIGBgaW5pdG1vZHVsZWBgIGZ1bmN0aW9uICppcyogY2FsbGVkIGFnYWluLgogCiAgICAuLiBpbmRleDo6IHNpbmdsZTogY2xvc2UoKSAoaW4gbW9kdWxlIG9zKQpAQCAtOTM2LDE0ICs5NDUsMTQgQEAKIAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogCi0gICAuLiBpbmRleDo6IHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogCiAgICBEZXN0cm95IHRoZSAoc3ViLSlpbnRlcnByZXRlciByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gdGhyZWFkIHN0YXRlLiBUaGUgZ2l2ZW4KICAgIHRocmVhZCBzdGF0ZSBtdXN0IGJlIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZS4gIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiB0aHJlYWQKICAgIHN0YXRlcyBiZWxvdy4gIFdoZW4gdGhlIGNhbGwgcmV0dXJucywgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIGlzICpOVUxMKi4gIEFsbAogICAgdGhyZWFkIHN0YXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlcnByZXRlciBhcmUgZGVzdHJveWVkLiAgKFRoZSBnbG9iYWwKICAgIGludGVycHJldGVyIGxvY2sgbXVzdCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIGlzIHN0aWxsIGhlbGQKLSAgIHdoZW4gaXQgcmV0dXJucy4pICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgd2lsbCBkZXN0cm95IGFsbCBzdWItaW50ZXJwcmV0ZXJzIHRoYXQKKyAgIHdoZW4gaXQgcmV0dXJucy4pICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCB3aWxsIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgdGhhdAogICAgaGF2ZW4ndCBiZWVuIGV4cGxpY2l0bHkgZGVzdHJveWVkIGF0IHRoYXQgcG9pbnQuCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2ludHJvLnJzdCBiL0RvYy9jLWFwaS9pbnRyby5yc3QKaW5kZXggYmMzYTc1Mi4uNzQ2ODFkMiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2ludHJvLnJzdAorKysgYi9Eb2MvYy1hcGkvaW50cm8ucnN0CkBAIC02NCw5ICs2NCwxMCBAQAogbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3JpZXMgOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGUvcHl0aG9udmVyc2lvbi9gIGFuZAogOmZpbGU6YHtleGVjX3ByZWZpeH0vaW5jbHVkZS9weXRob252ZXJzaW9uL2AsIHdoZXJlIDplbnZ2YXI6YHByZWZpeGAgYW5kCiA6ZW52dmFyOmBleGVjX3ByZWZpeGAgYXJlIGRlZmluZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVycyB0byBQeXRob24ncwotOnByb2dyYW06YGNvbmZpZ3VyZWAgc2NyaXB0IGFuZCAqdmVyc2lvbiogaXMgYGBzeXMudmVyc2lvbls6M11gYC4gIE9uIFdpbmRvd3MsCi10aGUgaGVhZGVycyBhcmUgaW5zdGFsbGVkIGluIDpmaWxlOmB7cHJlZml4fS9pbmNsdWRlYCwgd2hlcmUgOmVudnZhcjpgcHJlZml4YCBpcwotdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc3BlY2lmaWVkIHRvIHRoZSBpbnN0YWxsZXIuCis6cHJvZ3JhbTpgY29uZmlndXJlYCBzY3JpcHQgYW5kICp2ZXJzaW9uKiBpcworYGAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml1gYC4gIE9uIFdpbmRvd3MsIHRoZSBoZWFkZXJzIGFyZSBpbnN0YWxsZWQKK2luIDpmaWxlOmB7cHJlZml4fS9pbmNsdWRlYCwgd2hlcmUgOmVudnZhcjpgcHJlZml4YCBpcyB0aGUgaW5zdGFsbGF0aW9uCitkaXJlY3Rvcnkgc3BlY2lmaWVkIHRvIHRoZSBpbnN0YWxsZXIuCiAKIFRvIGluY2x1ZGUgdGhlIGhlYWRlcnMsIHBsYWNlIGJvdGggZGlyZWN0b3JpZXMgKGlmIGRpZmZlcmVudCkgb24geW91ciBjb21waWxlcidzCiBzZWFyY2ggcGF0aCBmb3IgaW5jbHVkZXMuICBEbyAqbm90KiBwbGFjZSB0aGUgcGFyZW50IGRpcmVjdG9yaWVzIG9uIHRoZSBzZWFyY2gKQEAgLTU3OCw5ICs1NzksOSBAQAogYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gc3RhcnQgb3ZlciAobWFrZSBhbm90aGVyIGNhbGwgdG8KIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgKSBvciB0aGUgYXBwbGljYXRpb24gaXMgc2ltcGx5IGRvbmUgd2l0aCBpdHMgIHVzZSBvZgogUHl0aG9uIGFuZCB3YW50cyB0byBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgUHl0aG9uLiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkCi1ieSBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYC4gIFRoZSBmdW5jdGlvbiA6YzpmdW5jOmBQeV9Jc0luaXRpYWxpemVkYCByZXR1cm5zCitieSBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgLiAgVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0lzSW5pdGlhbGl6ZWRgIHJldHVybnMKIHRydWUgaWYgUHl0aG9uIGlzIGN1cnJlbnRseSBpbiB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUuICBNb3JlIGluZm9ybWF0aW9uIGFib3V0Ci10aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLiBOb3RpY2UgdGhhdCA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAKK3RoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgCiBkb2VzICpub3QqIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgZS5nLiBtZW1vcnkKIGFsbG9jYXRlZCBieSBleHRlbnNpb24gbW9kdWxlcyBjdXJyZW50bHkgY2Fubm90IGJlIHJlbGVhc2VkLgogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvbWVtb3J5LnJzdCBiL0RvYy9jLWFwaS9tZW1vcnkucnN0CmluZGV4IDI5MGVmMDkuLjNmZjU0NTIgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9tZW1vcnkucnN0CisrKyBiL0RvYy9jLWFwaS9tZW1vcnkucnN0CkBAIC04NSw5ICs4NSwxMiBAQAogCiAuLiBzZWVhbHNvOjoKIAorICAgVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlCisgICB0aGUgbWVtb3J5IGFsbG9jYXRvcnMgdXNlZCBieSBQeXRob24uCisKICAgIFRoZSA6ZW52dmFyOmBQWVRIT05NQUxMT0NTVEFUU2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gcHJpbnQKLSAgIG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgZXZlcnkgdGltZSBhIG5ldyBvYmplY3QgYXJlbmEgaXMgY3JlYXRlZCwgYW5kCi0gICBvbiBzaHV0ZG93bi4KKyAgIHN0YXRpc3RpY3Mgb2YgdGhlIDpyZWY6YHB5bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IgPHB5bWFsbG9jPmAgZXZlcnkgdGltZSBhCisgICBuZXcgcHltYWxsb2Mgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KIAogCiBSYXcgTWVtb3J5IEludGVyZmFjZQpAQCAtMTYyLDE1ICsxNjUsMTcgQEAKIGJlaGF2aW9yIHdoZW4gcmVxdWVzdGluZyB6ZXJvIGJ5dGVzLCBhcmUgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW5nIGFuZCByZWxlYXNpbmcKIG1lbW9yeSBmcm9tIHRoZSBQeXRob24gaGVhcC4KIAotVGhlIGRlZmF1bHQgbWVtb3J5IGJsb2NrIGFsbG9jYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotOmM6ZnVuYzpgbWFsbG9jYCwgOmM6ZnVuYzpgY2FsbG9jYCwgOmM6ZnVuYzpgcmVhbGxvY2AgYW5kIDpjOmZ1bmM6YGZyZWVgOyBjYWxsCi1gYG1hbGxvYygxKWBgIChvciBgYGNhbGxvYygxLCAxKWBgKSB3aGVuIHJlcXVlc3RpbmcgemVybyBieXRlcy4KK0J5IGRlZmF1bHQsIHRoZXNlIGZ1bmN0aW9ucyB1c2UgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YC4KIAogLi4gd2FybmluZzo6CiAKICAgIFRoZSA6dGVybTpgR0lMIDxnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jaz5gIG11c3QgYmUgaGVsZCB3aGVuIHVzaW5nIHRoZXNlCiAgICBmdW5jdGlvbnMuCiAKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisKKyAgIFRoZSBkZWZhdWx0IGFsbG9jYXRvciBpcyBub3cgcHltYWxsb2MgaW5zdGVhZCBvZiBzeXN0ZW0gOmM6ZnVuYzpgbWFsbG9jYC4KKwogLi4gYzpmdW5jdGlvbjo6IHZvaWQqIFB5TWVtX01hbGxvYyhzaXplX3QgbikKIAogICAgQWxsb2NhdGVzICpuKiBieXRlcyBhbmQgcmV0dXJucyBhIHBvaW50ZXIgb2YgdHlwZSA6Yzp0eXBlOmB2b2lkXCpgIHRvIHRoZQpAQCAtMjkyLDE1ICsyOTcsMzIgQEAKIAogICAgRW51bSB1c2VkIHRvIGlkZW50aWZ5IGFuIGFsbG9jYXRvciBkb21haW4uIERvbWFpbnM6CiAKLSAgICogOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX1JBV2A6IGZ1bmN0aW9ucyA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmF3Q2FsbG9jYCBhbmQKLSAgICAgOmM6ZnVuYzpgUHlNZW1fUmF3RnJlZWAKLSAgICogOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWA6IGZ1bmN0aW9ucyA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU1lbV9SZWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fQ2FsbG9jYCBhbmQgOmM6ZnVuYzpgUHlNZW1fRnJlZWAKLSAgICogOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmA6IGZ1bmN0aW9ucyA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU9iamVjdF9SZWFsbG9jYCwgOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbG9jYCBhbmQKLSAgICAgOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAKKyAgIC4uIGM6dmFyOjogUFlNRU1fRE9NQUlOX1JBVwogCisgICAgICBGdW5jdGlvbnM6CisKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmF3TWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SYXdDYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd0ZyZWVgCisKKyAgIC4uIGM6dmFyOjogUFlNRU1fRE9NQUlOX01FTQorCisgICAgICBGdW5jdGlvbnM6CisKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCwKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fQ2FsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9GcmVlYAorCisgICAuLiBjOnZhcjo6IFBZTUVNX0RPTUFJTl9PQkoKKworICAgICAgRnVuY3Rpb25zOgorCisgICAgICAqIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlPYmplY3RfUmVhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeU1lbV9HZXRBbGxvY2F0b3IoUHlNZW1BbGxvY2F0b3JEb21haW4gZG9tYWluLCBQeU1lbUFsbG9jYXRvckV4ICphbGxvY2F0b3IpCiAKQEAgLTMyNSw0MyArMzQ3LDYyIEBACiAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5TWVtX1NldHVwRGVidWdIb29rcyh2b2lkKQogCi0gICBTZXR1cCBob29rcyB0byBkZXRlY3QgYnVncyBpbiB0aGUgZm9sbG93aW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yCi0gICBmdW5jdGlvbnM6Ci0KLSAgIC0gOmM6ZnVuYzpgUHlNZW1fUmF3TWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmF3UmVhbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1Jhd0NhbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX1Jhd0ZyZWVgCi0gICAtIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9DYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU1lbV9GcmVlYAotICAgLSA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9SZWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlPYmplY3RfQ2FsbG9jYCwgOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAKKyAgIFNldHVwIGhvb2tzIHRvIGRldGVjdCBidWdzIGluIHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvciBmdW5jdGlvbnMuCiAKICAgIE5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgaXMgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweENCYGAsIGZyZWVkIG1lbW9yeSBpcwotICAgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweERCYGAuIEFkZGl0aW9uYWwgY2hlY2tzOgorICAgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweERCYGAuCiAKLSAgIC0gZGV0ZWN0IEFQSSB2aW9sYXRpb25zLCBleDogOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgYnVmZmVyCisgICBSdW50aW1lIGNoZWNrczoKKworICAgLSBEZXRlY3QgQVBJIHZpb2xhdGlvbnMsIGV4OiA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCBjYWxsZWQgb24gYSBidWZmZXIKICAgICAgYWxsb2NhdGVkIGJ5IDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AKLSAgIC0gZGV0ZWN0IHdyaXRlIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIHVuZGVyZmxvdykKLSAgIC0gZGV0ZWN0IHdyaXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIG92ZXJmbG93KQorICAgLSBEZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQorICAgLSBEZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisgICAtIENoZWNrIHRoYXQgdGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgaXMgaGVsZCB3aGVuCisgICAgIGFsbG9jYXRvciBmdW5jdGlvbnMgb2YgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgKGV4OgorICAgICA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBhbmQgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OgorICAgICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgKSBkb21haW5zIGFyZSBjYWxsZWQKIAotICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBpZiBQeXRob24gaXMgbm90IGNvbXBpbGVkIGlzIGRlYnVnIG1vZGUuCisgICBPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIHVzZSB0aGUgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlCisgICB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZC4gVGhlIHRyYWNlYmFjayBpcyBvbmx5CisgICBkaXNwbGF5ZWQgaWYgOm1vZDpgdHJhY2VtYWxsb2NgIGlzIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgdGhlCisgICBtZW1vcnkgYmxvY2sgd2FzIHRyYWNlZC4KKworICAgVGhlc2UgaG9va3MgYXJlIGluc3RhbGxlZCBieSBkZWZhdWx0IGlmIFB5dGhvbiBpcyBjb21waWxlZCBpbiBkZWJ1ZworICAgbW9kZS4gVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gaW5zdGFsbAorICAgZGVidWcgaG9va3Mgb24gYSBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhpcyBmdW5jdGlvbiBub3cgYWxzbyB3b3JrcyBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorICAgICAgT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBub3cgdXNlIDptb2Q6YHRyYWNlbWFsbG9jYCB0byBnZXQgdGhlIHRyYWNlYmFjaworICAgICAgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZC4gVGhlIGRlYnVnIGhvb2tzIG5vdyBhbHNvIGNoZWNrCisgICAgICBpZiB0aGUgR0lMIGlzIGhlbGQgd2hlbiBmdW5jdGlvbnMgb2YgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgYW5kCisgICAgICA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCBkb21haW5zIGFyZSBjYWxsZWQuCiAKIAotQ3VzdG9taXplIFB5T2JqZWN0IEFyZW5hIEFsbG9jYXRvcgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLi4gX3B5bWFsbG9jOgogCi1QeXRob24gaGFzIGEgKnB5bWFsbG9jKiBhbGxvY2F0b3IgZm9yIGFsbG9jYXRpb25zIHNtYWxsZXIgdGhhbiA1MTIgYnl0ZXMuIFRoaXMKLWFsbG9jYXRvciBpcyBvcHRpbWl6ZWQgZm9yIHNtYWxsIG9iamVjdHMgd2l0aCBhIHNob3J0IGxpZmV0aW1lLiBJdCB1c2VzIG1lbW9yeQotbWFwcGluZ3MgY2FsbGVkICJhcmVuYXMiIHdpdGggYSBmaXhlZCBzaXplIG9mIDI1NiBLQi4gSXQgZmFsbHMgYmFjayB0bwotOmM6ZnVuYzpgUHlNZW1fUmF3TWFsbG9jYCBhbmQgOmM6ZnVuYzpgUHlNZW1fUmF3UmVhbGxvY2AgZm9yIGFsbG9jYXRpb25zIGxhcmdlcgotdGhhbiA1MTIgYnl0ZXMuICAqcHltYWxsb2MqIGlzIHRoZSBkZWZhdWx0IGFsbG9jYXRvciB1c2VkIGJ5Ci06YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgLgorVGhlIHB5bWFsbG9jIGFsbG9jYXRvcgorPT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgZGVmYXVsdCBhcmVuYSBhbGxvY2F0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKK1B5dGhvbiBoYXMgYSAqcHltYWxsb2MqIGFsbG9jYXRvciBvcHRpbWl6ZWQgZm9yIHNtYWxsIG9iamVjdHMgKHNtYWxsZXIgb3IgZXF1YWwKK3RvIDUxMiBieXRlcykgd2l0aCBhIHNob3J0IGxpZmV0aW1lLiBJdCB1c2VzIG1lbW9yeSBtYXBwaW5ncyBjYWxsZWQgImFyZW5hcyIKK3dpdGggYSBmaXhlZCBzaXplIG9mIDI1NiBLQi4gSXQgZmFsbHMgYmFjayB0byA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgIGFuZAorOmM6ZnVuYzpgUHlNZW1fUmF3UmVhbGxvY2AgZm9yIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIDUxMiBieXRlcy4KKworKnB5bWFsbG9jKiBpcyB0aGUgZGVmYXVsdCBhbGxvY2F0b3Igb2YgdGhlIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIChleDoKKzpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGFuZCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCAoZXg6Cis6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBkb21haW5zLgorCitUaGUgYXJlbmEgYWxsb2NhdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKICogOmM6ZnVuYzpgVmlydHVhbEFsbG9jYCBhbmQgOmM6ZnVuYzpgVmlydHVhbEZyZWVgIG9uIFdpbmRvd3MsCiAqIDpjOmZ1bmM6YG1tYXBgIGFuZCA6YzpmdW5jOmBtdW5tYXBgIGlmIGF2YWlsYWJsZSwKICogOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAgb3RoZXJ3aXNlLgogCitDdXN0b21pemUgcHltYWxsb2MgQXJlbmEgQWxsb2NhdG9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAuLiBjOnR5cGU6OiBQeU9iamVjdEFyZW5hQWxsb2NhdG9yCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QgYi9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QKaW5kZXggY2M4NDMxNC4uZTllOGFkZCAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0CisrKyBiL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdApAQCAtMTUwLDggKzE1MCw5IEBACiBUaGUgOmF0dHI6YG1sX2ZsYWdzYCBmaWVsZCBpcyBhIGJpdGZpZWxkIHdoaWNoIGNhbiBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZmxhZ3MuCiBUaGUgaW5kaXZpZHVhbCBmbGFncyBpbmRpY2F0ZSBlaXRoZXIgYSBjYWxsaW5nIGNvbnZlbnRpb24gb3IgYSBiaW5kaW5nCiBjb252ZW50aW9uLiAgT2YgdGhlIGNhbGxpbmcgY29udmVudGlvbiBmbGFncywgb25seSA6Y29uc3Q6YE1FVEhfVkFSQVJHU2AgYW5kCi06Y29uc3Q6YE1FVEhfS0VZV09SRFNgIGNhbiBiZSBjb21iaW5lZC4gQW55IG9mIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gZmxhZ3MKLWNhbiBiZSBjb21iaW5lZCB3aXRoIGEgYmluZGluZyBmbGFnLgorOmNvbnN0OmBNRVRIX0tFWVdPUkRTYCBjYW4gYmUgY29tYmluZWQgKGJ1dCBub3RlIHRoYXQgOmNvbnN0OmBNRVRIX0tFWVdPUkRTYAorYWxvbmUgaXMgZXF1aXZhbGVudCB0byBgYE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFNgYCkuIEFueSBvZiB0aGUgY2FsbGluZworY29udmVudGlvbiBmbGFncyBjYW4gYmUgY29tYmluZWQgd2l0aCBhIGJpbmRpbmcgZmxhZy4KIAogCiAuLiBkYXRhOjogTUVUSF9WQVJBUkdTCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvc3lzLnJzdCBiL0RvYy9jLWFwaS9zeXMucnN0CmluZGV4IDNkODNiMjcuLjAzNWNkYzEgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9zeXMucnN0CisrKyBiL0RvYy9jLWFwaS9zeXMucnN0CkBAIC01LDYgKzUsMTcgQEAKIE9wZXJhdGluZyBTeXN0ZW0gVXRpbGl0aWVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCisuLiBjOmZ1bmN0aW9uOjogUHlPYmplY3QqIFB5T1NfRlNQYXRoKFB5T2JqZWN0ICpwYXRoKQorCisgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uIGZvciAqcGF0aCouIElmIHRoZSBvYmplY3QgaXMgYQorICAgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdCwgdGhlbiBpdHMgcmVmZXJlbmNlIGNvdW50IGlzCisgICBpbmNyZW1lbnRlZC4gSWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UsCisgICB0aGVuIDptZXRoOmB+b3MuUGF0aExpa2UuX19mc3BhdGhfX2AgaXMgcmV0dXJuZWQgYXMgbG9uZyBhcyBpdCBpcyBhCisgICA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0LiBPdGhlcndpc2UgOmV4YzpgVHlwZUVycm9yYCBpcyByYWlzZWQKKyAgIGFuZCBgYE5VTExgYCBpcyByZXR1cm5lZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9GZElzSW50ZXJhY3RpdmUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogCkBAIC0yMTIsMjAgKzIyMywyNCBAQAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRXhpdChpbnQgc3RhdHVzKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IGV4aXQoKQogCi0gICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBhbmQgdGhlbiBjYWxscyB0aGUKLSAgIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBgYGV4aXQoc3RhdHVzKWBgLgorICAgRXhpdCB0aGUgY3VycmVudCBwcm9jZXNzLiAgVGhpcyBjYWxscyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBhbmQgdGhlbiBjYWxscyB0aGUKKyAgIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBgYGV4aXQoc3RhdHVzKWBgLiAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKKyAgIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIGV4aXQgc3RhdHVzIGlzIHNldCB0byAxMjAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBFcnJvcnMgZnJvbSBmaW5hbGl6YXRpb24gbm8gbG9uZ2VyIGlnbm9yZWQuCiAKIAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9BdEV4aXQodm9pZCAoKmZ1bmMpICgpKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IGNsZWFudXAgZnVuY3Rpb25zCiAKLSAgIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGNsZWFudXAKKyAgIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgY2xlYW51cAogICAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgYW5kIHNob3VsZCByZXR1cm4gbm8gdmFsdWUuICBBdCBtb3N0CiAgICAzMiBjbGVhbnVwIGZ1bmN0aW9ucyBjYW4gYmUgcmVnaXN0ZXJlZC4gIFdoZW4gdGhlIHJlZ2lzdHJhdGlvbiBpcyBzdWNjZXNzZnVsLAogICAgOmM6ZnVuYzpgUHlfQXRFeGl0YCByZXR1cm5zIGBgMGBgOyBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGBgLTFgYC4gIFRoZSBjbGVhbnVwCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvdW5pY29kZS5yc3QgYi9Eb2MvYy1hcGkvdW5pY29kZS5yc3QKaW5kZXggYTA2NzJjYS4uMDE5NDUzZiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3VuaWNvZGUucnN0CisrKyBiL0RvYy9jLWFwaS91bmljb2RlLnJzdApAQCAtNTI1LDExICs1MjUsNiBAQAogICAgY29waWVkIGFzLWlzIHRvIHRoZSByZXN1bHQgc3RyaW5nLCBhbmQgYW55IGV4dHJhIGFyZ3VtZW50cyBkaXNjYXJkZWQuCiAKICAgIC4uIG5vdGU6OgotCi0gICAgICBUaGUgYCIlbGxkImAgYW5kIGAiJWxsdSJgIGZvcm1hdCBzcGVjaWZpZXJzIGFyZSBvbmx5IGF2YWlsYWJsZQotICAgICAgd2hlbiA6Y29uc3Q6YEhBVkVfTE9OR19MT05HYCBpcyBkZWZpbmVkLgotCi0gICAuLiBub3RlOjoKICAgICAgIFRoZSB3aWR0aCBmb3JtYXR0ZXIgdW5pdCBpcyBudW1iZXIgb2YgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBieXRlcy4KICAgICAgIFRoZSBwcmVjaXNpb24gZm9ybWF0dGVyIHVuaXQgaXMgbnVtYmVyIG9mIGJ5dGVzIGZvciBgYCIlcyJgYCBhbmQKICAgICAgIGBgIiVWImBgIChpZiB0aGUgYGBQeU9iamVjdCpgYCBhcmd1bWVudCBpcyBOVUxMKSwgYW5kIGEgbnVtYmVyIG9mCkBAIC04MTUsMTMgKzgxMCwxNiBAQAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5VW5pY29kZV9GU0NvbnZlcnRlcihQeU9iamVjdCogb2JqLCB2b2lkKiByZXN1bHQpCiAKLSAgIFBhcnNlVHVwbGUgY29udmVydGVyOiBlbmNvZGUgOmNsYXNzOmBzdHJgIG9iamVjdHMgdG8gOmNsYXNzOmBieXRlc2AgdXNpbmcKKyAgIFBhcnNlVHVwbGUgY29udmVydGVyOiBlbmNvZGUgOmNsYXNzOmBzdHJgIG9iamVjdHMgLS0gb2J0YWluZWQgZGlyZWN0bHkgb3IKKyAgIHRocm91Z2ggdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSAtLSB0byA6Y2xhc3M6YGJ5dGVzYCB1c2luZwogICAgOmM6ZnVuYzpgUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdGA7IDpjbGFzczpgYnl0ZXNgIG9iamVjdHMgYXJlIG91dHB1dCBhcy1pcy4KICAgICpyZXN1bHQqIG11c3QgYmUgYSA6Yzp0eXBlOmBQeUJ5dGVzT2JqZWN0KmAgd2hpY2ggbXVzdCBiZSByZWxlYXNlZCB3aGVuIGl0IGlzCiAgICBubyBsb25nZXIgdXNlZC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4xCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgogCiBUbyBkZWNvZGUgZmlsZSBuYW1lcyBkdXJpbmcgYXJndW1lbnQgcGFyc2luZywgdGhlIGBgIk8mImBgIGNvbnZlcnRlciBzaG91bGQgYmUKIHVzZWQsIHBhc3NpbmcgOmM6ZnVuYzpgUHlVbmljb2RlX0ZTRGVjb2RlcmAgYXMgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb246CmRpZmYgLS1naXQgYS9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0IGIvRG9jL2RhdGEvcmVmY291bnRzLmRhdAppbmRleCBlMzg4MTk1Li44YjQ2OWY0IDEwMDY0NAotLS0gYS9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0CisrKyBiL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQKQEAgLTkyMSw2ICs5MjEsOSBAQAogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcjppbnQ6OjoKIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I6UHlPYmplY3QqOm86MDoKIAorUHlPU19GU1BhdGg6UHlPYmplY3QqOjorMToKK1B5T1NfRlNQYXRoOlB5T2JqZWN0KjpwYXRoOjA6CisKIFB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOjorMToKIFB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOmNhbGxhYmxlX29iamVjdDowOgogUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6YXJnczowOgpkaWZmIC0tZ2l0IGEvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0IGIvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CmluZGV4IDY0MDMzZGMuLmFiMmY2MTYgMTAwNjQ0Ci0tLSBhL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdAorKysgYi9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKQEAgLTY3LDcgKzY3LDkgQEAKICAgICAgICBQeV9Jbml0aWFsaXplKCk7CiAgICAgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJmcm9tIHRpbWUgaW1wb3J0IHRpbWUsY3RpbWVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaW50KCdUb2RheSBpcycsIGN0aW1lKHRpbWUoKSkpXG4iKTsKLSAgICAgICBQeV9GaW5hbGl6ZSgpOworICAgICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgICAgIGV4aXQoMTIwKTsKKyAgICAgICB9CiAgICAgICAgUHlNZW1fUmF3RnJlZShwcm9ncmFtKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KQEAgLTc2LDcgKzc4LDcgQEAKIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIHRvIGluZm9ybSB0aGUgaW50ZXJwcmV0ZXIgYWJvdXQgcGF0aHMgdG8gUHl0aG9uIHJ1bi10aW1lCiBsaWJyYXJpZXMuICBOZXh0LCB0aGUgUHl0aG9uIGludGVycHJldGVyIGlzIGluaXRpYWxpemVkIHdpdGgKIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgLCBmb2xsb3dlZCBieSB0aGUgZXhlY3V0aW9uIG9mIGEgaGFyZC1jb2RlZCBQeXRob24gc2NyaXB0Ci10aGF0IHByaW50cyB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgY2FsbCBzaHV0cwordGhhdCBwcmludHMgdGhlIGRhdGUgYW5kIHRpbWUuICBBZnRlcndhcmRzLCB0aGUgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgY2FsbCBzaHV0cwogdGhlIGludGVycHJldGVyIGRvd24sIGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIHByb2dyYW0uICBJbiBhIHJlYWwgcHJvZ3JhbSwKIHlvdSBtYXkgd2FudCB0byBnZXQgdGhlIFB5dGhvbiBzY3JpcHQgZnJvbSBhbm90aGVyIHNvdXJjZSwgcGVyaGFwcyBhIHRleHQtZWRpdG9yCiByb3V0aW5lLCBhIGZpbGUsIG9yIGEgZGF0YWJhc2UuICBHZXR0aW5nIHRoZSBQeXRob24gY29kZSBmcm9tIGEgZmlsZSBjYW4gYmV0dGVyCmRpZmYgLS1naXQgYS9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdCBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CmluZGV4IDY5NDc1M2UuLjljNWUyMGQgMTAwNjQ0Ci0tLSBhL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CisrKyBiL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0CkBAIC04MzgsNyArODM4LDggQEAKIFRvIGNvbnZlcnQsIGUuZy4sIHRoZSBudW1iZXIgMTQ0IHRvIHRoZSBzdHJpbmcgJzE0NCcsIHVzZSB0aGUgYnVpbHQtaW4gdHlwZQogY29uc3RydWN0b3IgOmZ1bmM6YHN0cmAuICBJZiB5b3Ugd2FudCBhIGhleGFkZWNpbWFsIG9yIG9jdGFsIHJlcHJlc2VudGF0aW9uLCB1c2UKIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgOmZ1bmM6YGhleGAgb3IgOmZ1bmM6YG9jdGAuICBGb3IgZmFuY3kgZm9ybWF0dGluZywgc2VlCi10aGUgOnJlZjpgZm9ybWF0c3RyaW5nc2Agc2VjdGlvbiwgZS5nLiBgYCJ7OjA0ZH0iLmZvcm1hdCgxNDQpYGAgeWllbGRzCit0aGUgOnJlZjpgZi1zdHJpbmdzYCBhbmQgOnJlZjpgZm9ybWF0c3RyaW5nc2Agc2VjdGlvbnMsCitlLmcuIGBgIns6MDRkfSIuZm9ybWF0KDE0NClgYCB5aWVsZHMKIGBgJzAxNDQnYGAgYW5kIGBgIns6LjNmfSIuZm9ybWF0KDEuMC8zLjApYGAgeWllbGRzIGBgJzAuMzMzJ2BgLgogCiAKZGlmZiAtLWdpdCBhL0RvYy9nbG9zc2FyeS5yc3QgYi9Eb2MvZ2xvc3NhcnkucnN0CmluZGV4IDQ1Yjc5NGYuLjNkMDVjMTQgMTAwNjQ0Ci0tLSBhL0RvYy9nbG9zc2FyeS5yc3QKKysrIGIvRG9jL2dsb3NzYXJ5LnJzdApAQCAtNzE4LDYgKzcxOCw4IEBACiAKICAgICAgICAgICAgZGVmIGZ1bmMoZm9vLCBiYXI9Tm9uZSk6IC4uLgogCisgICAgICAuLiBfcG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcjoKKwogICAgICAgKiA6ZGZuOmBwb3NpdGlvbmFsLW9ubHlgOiBzcGVjaWZpZXMgYW4gYXJndW1lbnQgdGhhdCBjYW4gYmUgc3VwcGxpZWQgb25seQogICAgICAgICBieSBwb3NpdGlvbi4gIFB5dGhvbiBoYXMgbm8gc3ludGF4IGZvciBkZWZpbmluZyBwb3NpdGlvbmFsLW9ubHkKICAgICAgICAgcGFyYW1ldGVycy4gIEhvd2V2ZXIsIHNvbWUgYnVpbHQtaW4gZnVuY3Rpb25zIGhhdmUgcG9zaXRpb25hbC1vbmx5CkBAIC03NzYsNiArNzc4LDE2IEBACiAgICAgICBPbmUgb2YgdGhlIGRlZmF1bHQgOnRlcm06YG1ldGEgcGF0aCBmaW5kZXJzIDxtZXRhIHBhdGggZmluZGVyPmAgd2hpY2gKICAgICAgIHNlYXJjaGVzIGFuIDp0ZXJtOmBpbXBvcnQgcGF0aGAgZm9yIG1vZHVsZXMuCiAKKyAgIHBhdGgtbGlrZSBvYmplY3QKKyAgICAgIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIHN5c3RlbSBwYXRoLiBBIHBhdGgtbGlrZSBvYmplY3QgaXMgZWl0aGVyCisgICAgICBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QgcmVwcmVzZW50aW5nIGEgcGF0aCwgb3IgYW4gb2JqZWN0CisgICAgICBpbXBsZW1lbnRpbmcgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIHByb3RvY29sLiBBbiBvYmplY3QgdGhhdCBzdXBwb3J0cworICAgICAgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIHByb3RvY29sIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSA6Y2xhc3M6YHN0cmAgb3IKKyAgICAgIDpjbGFzczpgYnl0ZXNgIGZpbGUgc3lzdGVtIHBhdGggYnkgY2FsbGluZyB0aGUgOmZ1bmM6YG9zLmZzcGF0aGAgZnVuY3Rpb247CisgICAgICA6ZnVuYzpgb3MuZnNkZWNvZGVgIGFuZCA6ZnVuYzpgb3MuZnNlbmNvZGVgIGNhbiBiZSB1c2VkIHRvIGd1YXJhbnRlZSBhCisgICAgICA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgcmVzdWx0IGluc3RlYWQsIHJlc3BlY3RpdmVseS4gSW50cm9kdWNlZAorICAgICAgYnkgOnBlcDpgNTE5YC4KKwogICAgcG9ydGlvbgogICAgICAgQSBzZXQgb2YgZmlsZXMgaW4gYSBzaW5nbGUgZGlyZWN0b3J5IChwb3NzaWJseSBzdG9yZWQgaW4gYSB6aXAgZmlsZSkKICAgICAgIHRoYXQgY29udHJpYnV0ZSB0byBhIG5hbWVzcGFjZSBwYWNrYWdlLCBhcyBkZWZpbmVkIGluIDpwZXA6YDQyMGAuCkBAIC05NTgsNyArOTcwLDcgQEAKICAgICAgIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgYmVoYXZpb3VyIG9mIG90aGVyIFB5dGhvbiBhcHBsaWNhdGlvbnMKICAgICAgIHJ1bm5pbmcgb24gdGhlIHNhbWUgc3lzdGVtLgogCi0gICAgICBTZWUgYWxzbyA6cmVmOmBzY3JpcHRzLXB5dmVudmAuCisgICAgICBTZWUgYWxzbyA6bW9kOmB2ZW52YC4KIAogICAgdmlydHVhbCBtYWNoaW5lCiAgICAgICBBIGNvbXB1dGVyIGRlZmluZWQgZW50aXJlbHkgaW4gc29mdHdhcmUuICBQeXRob24ncyB2aXJ0dWFsIG1hY2hpbmUKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CmluZGV4IGNmZTk4NjguLjdhNjAxNjUgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKKysrIGIvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdApAQCAtNTQ3LDcgKzU0Nyw4IEBACiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgInByb2cucHkiLCBsaW5lIDExLCBpbiA8bW9kdWxlPgogICAgICAgIGlmIGFyZ3MudmVyYm9zaXR5ID49IDI6Ci0gICBUeXBlRXJyb3I6IHVub3JkZXJhYmxlIHR5cGVzOiBOb25lVHlwZSgpID49IGludCgpCisgICBUeXBlRXJyb3I6ICc+PScgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnTm9uZVR5cGUnIGFuZCAnaW50JworCiAKICogRmlyc3Qgb3V0cHV0IHdlbnQgd2VsbCwgYW5kIGZpeGVzIHRoZSBidWcgd2UgaGFkIGJlZm9yZS4KICAgVGhhdCBpcywgd2Ugd2FudCBhbnkgdmFsdWUgPj0gMiB0byBiZSBhcyB2ZXJib3NlIGFzIHBvc3NpYmxlLgpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL3J1bi1mdW5jLmMgYi9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYwppbmRleCA5ODZkNjcwLi5lYWQ3YmRkIDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYworKysgYi9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYwpAQCAtNjMsNiArNjMsOCBAQAogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkIFwiJXNcIlxuIiwgYXJndlsxXSk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJldHVybiAxMjA7CisgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL3Rlc3QucHkgYi9Eb2MvaW5jbHVkZXMvdGVzdC5weQppbmRleCA3ZWJmNDZhLi45ZTlkNGE2IDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvdGVzdC5weQorKysgYi9Eb2MvaW5jbHVkZXMvdGVzdC5weQpAQCAtMjA0LDcgKzIwNCw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQotUExBVF9TUEVDID0gIiVzLSVzIiAlIChnZXRfcGxhdGZvcm0oKSwgc3lzLnZlcnNpb25bMDozXSkKK1BMQVRfU1BFQyA9ICIlcy0lZC4lZCIgJSAoZ2V0X3BsYXRmb3JtKCksICpzeXMudmVyc2lvbl9pbmZvWzoyXSkKIHNyYyA9IG9zLnBhdGguam9pbigiYnVpbGQiLCAibGliLiVzIiAlIFBMQVRfU1BFQykKIHN5cy5wYXRoLmFwcGVuZChzcmMpCiAKZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy90emluZm8tZXhhbXBsZXMucHkgYi9Eb2MvaW5jbHVkZXMvdHppbmZvLWV4YW1wbGVzLnB5CmluZGV4IDNhOGNmNDcuLmFlNWE1MDkgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy90emluZm8tZXhhbXBsZXMucHkKKysrIGIvRG9jL2luY2x1ZGVzL3R6aW5mby1leGFtcGxlcy5weQpAQCAtMSw0NiArMSwxMyBAQAotZnJvbSBkYXRldGltZSBpbXBvcnQgdHppbmZvLCB0aW1lZGVsdGEsIGRhdGV0aW1lCitmcm9tIGRhdGV0aW1lIGltcG9ydCB0emluZm8sIHRpbWVkZWx0YSwgZGF0ZXRpbWUsIHRpbWV6b25lCiAKIFpFUk8gPSB0aW1lZGVsdGEoMCkKIEhPVVIgPSB0aW1lZGVsdGEoaG91cnM9MSkKLQotIyBBIFVUQyBjbGFzcy4KLQotY2xhc3MgVVRDKHR6aW5mbyk6Ci0gICAgIiIiVVRDIiIiCi0KLSAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIFpFUk8KLQotICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gIlVUQyIKLQotICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gWkVSTwotCi11dGMgPSBVVEMoKQotCi0jIEEgY2xhc3MgYnVpbGRpbmcgdHppbmZvIG9iamVjdHMgZm9yIGZpeGVkLW9mZnNldCB0aW1lIHpvbmVzLgotIyBOb3RlIHRoYXQgRml4ZWRPZmZzZXQoMCwgIlVUQyIpIGlzIGEgZGlmZmVyZW50IHdheSB0byBidWlsZCBhCi0jIFVUQyB0emluZm8gb2JqZWN0LgotCi1jbGFzcyBGaXhlZE9mZnNldCh0emluZm8pOgotICAgICIiIkZpeGVkIG9mZnNldCBpbiBtaW51dGVzIGVhc3QgZnJvbSBVVEMuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lKToKLSAgICAgICAgc2VsZi5fX29mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzPW9mZnNldCkKLSAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCi0KLSAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKLSAgICAgICAgcmV0dXJuIHNlbGYuX19vZmZzZXQKLQotICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKLQotICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgotICAgICAgICByZXR1cm4gWkVSTworU0VDT05EID0gdGltZWRlbHRhKHNlY29uZHM9MSkKIAogIyBBIGNsYXNzIGNhcHR1cmluZyB0aGUgcGxhdGZvcm0ncyBpZGVhIG9mIGxvY2FsIHRpbWUuCi0KKyMgKE1heSByZXN1bHQgaW4gd3JvbmcgdmFsdWVzIG9uIGhpc3RvcmljYWwgdGltZXMgaW4KKyMgIHRpbWV6b25lcyB3aGVyZSBVVEMgb2Zmc2V0IGFuZC9vciB0aGUgRFNUIHJ1bGVzIGhhZAorIyAgY2hhbmdlZCBpbiB0aGUgcGFzdC4pCiBpbXBvcnQgdGltZSBhcyBfdGltZQogCiBTVERPRkZTRVQgPSB0aW1lZGVsdGEoc2Vjb25kcyA9IC1fdGltZS50aW1lem9uZSkKQEAgLTUzLDYgKzIwLDE2IEBACiAKIGNsYXNzIExvY2FsVGltZXpvbmUodHppbmZvKToKIAorICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KToKKyAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCisgICAgICAgIHN0YW1wID0gKGR0IC0gZGF0ZXRpbWUoMTk3MCwgMSwgMSwgdHppbmZvPXNlbGYpKSAvLyBTRUNPTkQKKyAgICAgICAgYXJncyA9IF90aW1lLmxvY2FsdGltZShzdGFtcClbOjZdCisgICAgICAgIGRzdF9kaWZmID0gRFNURElGRiAvLyBTRUNPTkQKKyAgICAgICAgIyBEZXRlY3QgZm9sZAorICAgICAgICBmb2xkID0gKGFyZ3MgPT0gX3RpbWUubG9jYWx0aW1lKHN0YW1wIC0gZHN0X2RpZmYpKQorICAgICAgICByZXR1cm4gZGF0ZXRpbWUoKmFyZ3MsIG1pY3Jvc2Vjb25kPWR0Lm1pY3Jvc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvPXNlbGYsIGZvbGQ9Zm9sZCkKKwogICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgogICAgICAgICBpZiBzZWxmLl9pc2RzdChkdCk6CiAgICAgICAgICAgICByZXR1cm4gRFNUT0ZGU0VUCkBAIC05OSwyMCArNzYsMzcgQEAKICMgSW4gdGhlIFVTLCBzaW5jZSAyMDA3LCBEU1Qgc3RhcnRzIGF0IDJhbSAoc3RhbmRhcmQgdGltZSkgb24gdGhlIHNlY29uZAogIyBTdW5kYXkgaW4gTWFyY2gsIHdoaWNoIGlzIHRoZSBmaXJzdCBTdW5kYXkgb24gb3IgYWZ0ZXIgTWFyIDguCiBEU1RTVEFSVF8yMDA3ID0gZGF0ZXRpbWUoMSwgMywgOCwgMikKLSMgYW5kIGVuZHMgYXQgMmFtIChEU1QgdGltZTsgMWFtIHN0YW5kYXJkIHRpbWUpIG9uIHRoZSBmaXJzdCBTdW5kYXkgb2YgTm92LgotRFNURU5EXzIwMDcgPSBkYXRldGltZSgxLCAxMSwgMSwgMSkKKyMgYW5kIGVuZHMgYXQgMmFtIChEU1QgdGltZSkgb24gdGhlIGZpcnN0IFN1bmRheSBvZiBOb3YuCitEU1RFTkRfMjAwNyA9IGRhdGV0aW1lKDEsIDExLCAxLCAyKQogIyBGcm9tIDE5ODcgdG8gMjAwNiwgRFNUIHVzZWQgdG8gc3RhcnQgYXQgMmFtIChzdGFuZGFyZCB0aW1lKSBvbiB0aGUgZmlyc3QKLSMgU3VuZGF5IGluIEFwcmlsIGFuZCB0byBlbmQgYXQgMmFtIChEU1QgdGltZTsgMWFtIHN0YW5kYXJkIHRpbWUpIG9uIHRoZSBsYXN0CisjIFN1bmRheSBpbiBBcHJpbCBhbmQgdG8gZW5kIGF0IDJhbSAoRFNUIHRpbWUpIG9uIHRoZSBsYXN0CiAjIFN1bmRheSBvZiBPY3RvYmVyLCB3aGljaCBpcyB0aGUgZmlyc3QgU3VuZGF5IG9uIG9yIGFmdGVyIE9jdCAyNS4KIERTVFNUQVJUXzE5ODdfMjAwNiA9IGRhdGV0aW1lKDEsIDQsIDEsIDIpCi1EU1RFTkRfMTk4N18yMDA2ID0gZGF0ZXRpbWUoMSwgMTAsIDI1LCAxKQorRFNURU5EXzE5ODdfMjAwNiA9IGRhdGV0aW1lKDEsIDEwLCAyNSwgMikKICMgRnJvbSAxOTY3IHRvIDE5ODYsIERTVCB1c2VkIHRvIHN0YXJ0IGF0IDJhbSAoc3RhbmRhcmQgdGltZSkgb24gdGhlIGxhc3QKLSMgU3VuZGF5IGluIEFwcmlsICh0aGUgb25lIG9uIG9yIGFmdGVyIEFwcmlsIDI0KSBhbmQgdG8gZW5kIGF0IDJhbSAoRFNUIHRpbWU7Ci0jIDFhbSBzdGFuZGFyZCB0aW1lKSBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0b2Jlciwgd2hpY2ggaXMgdGhlIGZpcnN0IFN1bmRheQorIyBTdW5kYXkgaW4gQXByaWwgKHRoZSBvbmUgb24gb3IgYWZ0ZXIgQXByaWwgMjQpIGFuZCB0byBlbmQgYXQgMmFtIChEU1QgdGltZSkKKyMgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdG9iZXIsIHdoaWNoIGlzIHRoZSBmaXJzdCBTdW5kYXkKICMgb24gb3IgYWZ0ZXIgT2N0IDI1LgogRFNUU1RBUlRfMTk2N18xOTg2ID0gZGF0ZXRpbWUoMSwgNCwgMjQsIDIpCiBEU1RFTkRfMTk2N18xOTg2ID0gRFNURU5EXzE5ODdfMjAwNgogCitkZWYgdXNfZHN0X3JhbmdlKHllYXIpOgorICAgICMgRmluZCBzdGFydCBhbmQgZW5kIHRpbWVzIGZvciBVUyBEU1QuIEZvciB5ZWFycyBiZWZvcmUgMTk2NywgcmV0dXJuCisgICAgIyBzdGFydCA9IGVuZCBmb3Igbm8gRFNULgorICAgIGlmIDIwMDYgPCB5ZWFyOgorICAgICAgICBkc3RzdGFydCwgZHN0ZW5kID0gRFNUU1RBUlRfMjAwNywgRFNURU5EXzIwMDcKKyAgICBlbGlmIDE5ODYgPCB5ZWFyIDwgMjAwNzoKKyAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzE5ODdfMjAwNiwgRFNURU5EXzE5ODdfMjAwNgorICAgIGVsaWYgMTk2NiA8IHllYXIgPCAxOTg3OgorICAgICAgICBkc3RzdGFydCwgZHN0ZW5kID0gRFNUU1RBUlRfMTk2N18xOTg2LCBEU1RFTkRfMTk2N18xOTg2CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIChkYXRldGltZSh5ZWFyLCAxLCAxKSwgKSAqIDIKKworICAgIHN0YXJ0ID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKGRzdHN0YXJ0LnJlcGxhY2UoeWVhcj15ZWFyKSkKKyAgICBlbmQgPSBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoZHN0ZW5kLnJlcGxhY2UoeWVhcj15ZWFyKSkKKyAgICByZXR1cm4gc3RhcnQsIGVuZAorCisKIGNsYXNzIFVTVGltZVpvbmUodHppbmZvKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3VycywgcmVwcm5hbWUsIHN0ZG5hbWUsIGRzdG5hbWUpOgpAQCAtMTQxLDI3ICsxMzUsMzkgQEAKICAgICAgICAgICAgICMgaW1wbGVtZW50YXRpb24pIHBhc3NlcyBhIGRhdGV0aW1lIHdpdGggZHQudHppbmZvIGlzIHNlbGYuCiAgICAgICAgICAgICByZXR1cm4gWkVSTwogICAgICAgICBhc3NlcnQgZHQudHppbmZvIGlzIHNlbGYKLQotICAgICAgICAjIEZpbmQgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgVVMgRFNULiBGb3IgeWVhcnMgYmVmb3JlIDE5NjcsIHJldHVybgotICAgICAgICAjIFpFUk8gZm9yIG5vIERTVC4KLSAgICAgICAgaWYgMjAwNiA8IGR0LnllYXI6Ci0gICAgICAgICAgICBkc3RzdGFydCwgZHN0ZW5kID0gRFNUU1RBUlRfMjAwNywgRFNURU5EXzIwMDcKLSAgICAgICAgZWxpZiAxOTg2IDwgZHQueWVhciA8IDIwMDc6Ci0gICAgICAgICAgICBkc3RzdGFydCwgZHN0ZW5kID0gRFNUU1RBUlRfMTk4N18yMDA2LCBEU1RFTkRfMTk4N18yMDA2Ci0gICAgICAgIGVsaWYgMTk2NiA8IGR0LnllYXIgPCAxOTg3OgotICAgICAgICAgICAgZHN0c3RhcnQsIGRzdGVuZCA9IERTVFNUQVJUXzE5NjdfMTk4NiwgRFNURU5EXzE5NjdfMTk4NgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIFpFUk8KLQotICAgICAgICBzdGFydCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihkc3RzdGFydC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCi0gICAgICAgIGVuZCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihkc3RlbmQucmVwbGFjZSh5ZWFyPWR0LnllYXIpKQotCisgICAgICAgIHN0YXJ0LCBlbmQgPSB1c19kc3RfcmFuZ2UoZHQueWVhcikKICAgICAgICAgIyBDYW4ndCBjb21wYXJlIG5haXZlIHRvIGF3YXJlIG9iamVjdHMsIHNvIHN0cmlwIHRoZSB0aW1lem9uZSBmcm9tCiAgICAgICAgICMgZHQgZmlyc3QuCi0gICAgICAgIGlmIHN0YXJ0IDw9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpIDwgZW5kOgorICAgICAgICBkdCA9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIGlmIHN0YXJ0ICsgSE9VUiA8PSBkdCA8IGVuZCAtIEhPVVI6CisgICAgICAgICAgICAjIERTVCBpcyBpbiBlZmZlY3QuCiAgICAgICAgICAgICByZXR1cm4gSE9VUgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIFpFUk8KKyAgICAgICAgaWYgZW5kIC0gSE9VUiA8PSBkdCA8IGVuZDoKKyAgICAgICAgICAgICMgRm9sZCAoYW4gYW1iaWd1b3VzIGhvdXIpOiB1c2UgZHQuZm9sZCB0byBkaXNhbWJpZ3VhdGUuCisgICAgICAgICAgICByZXR1cm4gWkVSTyBpZiBkdC5mb2xkIGVsc2UgSE9VUgorICAgICAgICBpZiBzdGFydCA8PSBkdCA8IHN0YXJ0ICsgSE9VUjoKKyAgICAgICAgICAgICMgR2FwIChhIG5vbi1leGlzdGVudCBob3VyKTogcmV2ZXJzZSB0aGUgZm9sZCBydWxlLgorICAgICAgICAgICAgcmV0dXJuIEhPVVIgaWYgZHQuZm9sZCBlbHNlIFpFUk8KKyAgICAgICAgIyBEU1QgaXMgb2ZmLgorICAgICAgICByZXR1cm4gWkVSTworCisgICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOgorICAgICAgICBhc3NlcnQgZHQudHppbmZvIGlzIHNlbGYKKyAgICAgICAgc3RhcnQsIGVuZCA9IHVzX2RzdF9yYW5nZShkdC55ZWFyKQorICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UodHppbmZvPXNlbGYpCisgICAgICAgIGVuZCA9IGVuZC5yZXBsYWNlKHR6aW5mbz1zZWxmKQorICAgICAgICBzdGRfdGltZSA9IGR0ICsgc2VsZi5zdGRvZmZzZXQKKyAgICAgICAgZHN0X3RpbWUgPSBzdGRfdGltZSArIEhPVVIKKyAgICAgICAgaWYgZW5kIDw9IGRzdF90aW1lIDwgZW5kICsgSE9VUjoKKyAgICAgICAgICAgICMgUmVwZWF0ZWQgaG91cgorICAgICAgICAgICAgcmV0dXJuIHN0ZF90aW1lLnJlcGxhY2UoZm9sZD0xKQorICAgICAgICBpZiBzdGRfdGltZSA8IHN0YXJ0IG9yIGRzdF90aW1lID49IGVuZDoKKyAgICAgICAgICAgICMgU3RhbmRhcmQgdGltZQorICAgICAgICAgICAgcmV0dXJuIHN0ZF90aW1lCisgICAgICAgIGlmIHN0YXJ0IDw9IHN0ZF90aW1lIDwgZW5kIC0gSE9VUjoKKyAgICAgICAgICAgICMgRGF5bGlnaHQgc2F2aW5nIHRpbWUKKyAgICAgICAgICAgIHJldHVybiBkc3RfdGltZQorCiAKIEVhc3Rlcm4gID0gVVNUaW1lWm9uZSgtNSwgIkVhc3Rlcm4iLCAgIkVTVCIsICJFRFQiKQogQ2VudHJhbCAgPSBVU1RpbWVab25lKC02LCAiQ2VudHJhbCIsICAiQ1NUIiwgIkNEVCIpCmRpZmYgLS1naXQgYS9Eb2MvaW5zdGFsbGluZy9pbmRleC5yc3QgYi9Eb2MvaW5zdGFsbGluZy9pbmRleC5yc3QKaW5kZXggMWVmMzE0OS4uYjIyNDY1ZCAxMDA2NDQKLS0tIGEvRG9jL2luc3RhbGxpbmcvaW5kZXgucnN0CisrKyBiL0RvYy9pbnN0YWxsaW5nL2luZGV4LnJzdApAQCAtMiw5ICsyLDkgQEAKIAogLi4gX2luc3RhbGxpbmctaW5kZXg6CiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIEluc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqCitJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIDpFbWFpbDogZGlzdHV0aWxzLXNpZ0BweXRob24ub3JnCiAKQEAgLTM0LDI0ICszNCwyNCBAQAogCiAqIGBgcGlwYGAgaXMgdGhlIHByZWZlcnJlZCBpbnN0YWxsZXIgcHJvZ3JhbS4gU3RhcnRpbmcgd2l0aCBQeXRob24gMy40LCBpdAogICBpcyBpbmNsdWRlZCBieSBkZWZhdWx0IHdpdGggdGhlIFB5dGhvbiBiaW5hcnkgaW5zdGFsbGVycy4KLSogYSB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGEgc2VtaS1pc29sYXRlZCBQeXRob24gZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MKKyogQSAqdmlydHVhbCBlbnZpcm9ubWVudCogaXMgYSBzZW1pLWlzb2xhdGVkIFB5dGhvbiBlbnZpcm9ubWVudCB0aGF0IGFsbG93cwogICBwYWNrYWdlcyB0byBiZSBpbnN0YWxsZWQgZm9yIHVzZSBieSBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24sIHJhdGhlciB0aGFuCi0gIGJlaW5nIGluc3RhbGxlZCBzeXN0ZW0gd2lkZQotKiBgYHB5dmVudmBgIGlzIHRoZSBzdGFuZGFyZCB0b29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cywgYW5kIGhhcworICBiZWluZyBpbnN0YWxsZWQgc3lzdGVtIHdpZGUuCisqIGBgdmVudmBgIGlzIHRoZSBzdGFuZGFyZCB0b29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cywgYW5kIGhhcwogICBiZWVuIHBhcnQgb2YgUHl0aG9uIHNpbmNlIFB5dGhvbiAzLjMuIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNCwgaXQKLSAgZGVmYXVsdHMgdG8gaW5zdGFsbGluZyBgYHBpcGBgIGludG8gYWxsIGNyZWF0ZWQgdmlydHVhbCBlbnZpcm9ubWVudHMKKyAgZGVmYXVsdHMgdG8gaW5zdGFsbGluZyBgYHBpcGBgIGludG8gYWxsIGNyZWF0ZWQgdmlydHVhbCBlbnZpcm9ubWVudHMuCiAqIGBgdmlydHVhbGVudmBgIGlzIGEgdGhpcmQgcGFydHkgYWx0ZXJuYXRpdmUgKGFuZCBwcmVkZWNlc3NvcikgdG8KLSAgYGBweXZlbnZgYC4gSXQgYWxsb3dzIHZpcnR1YWwgZW52aXJvbm1lbnRzIHRvIGJlIHVzZWQgb24gdmVyc2lvbnMgb2YKLSAgUHl0aG9uIHByaW9yIHRvIDMuNCwgd2hpY2ggZWl0aGVyIGRvbid0IHByb3ZpZGUgYGBweXZlbnZgYCBhdCBhbGwsIG9yCisgIGBgdmVudmBgLiBJdCBhbGxvd3MgdmlydHVhbCBlbnZpcm9ubWVudHMgdG8gYmUgdXNlZCBvbiB2ZXJzaW9ucyBvZgorICBQeXRob24gcHJpb3IgdG8gMy40LCB3aGljaCBlaXRoZXIgZG9uJ3QgcHJvdmlkZSBgYHZlbnZgYCBhdCBhbGwsIG9yCiAgIGFyZW4ndCBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBgYHBpcGBgIGludG8gY3JlYXRlZCBlbnZpcm9ubWVudHMuCi0qIHRoZSBgUHl0aG9uIFBhY2thZ2luZyBJbmRleCA8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT5gX18gaXMgYSBwdWJsaWMKKyogVGhlIGBQeXRob24gUGFja2FnaW5nIEluZGV4IDxodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpPmBfXyBpcyBhIHB1YmxpYwogICByZXBvc2l0b3J5IG9mIG9wZW4gc291cmNlIGxpY2Vuc2VkIHBhY2thZ2VzIG1hZGUgYXZhaWxhYmxlIGZvciB1c2UgYnkKLSAgb3RoZXIgUHl0aG9uIHVzZXJzCisgIG90aGVyIFB5dGhvbiB1c2Vycy4KICogdGhlIGBQeXRob24gUGFja2FnaW5nIEF1dGhvcml0eQogICA8aHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvPmBfXyBhcmUgdGhlIGdyb3VwIG9mCiAgIGRldmVsb3BlcnMgYW5kIGRvY3VtZW50YXRpb24gYXV0aG9ycyByZXNwb25zaWJsZSBmb3IgdGhlIG1haW50ZW5hbmNlIGFuZAogICBldm9sdXRpb24gb2YgdGhlIHN0YW5kYXJkIHBhY2thZ2luZyB0b29scyBhbmQgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYW5kCi0gIGZpbGUgZm9ybWF0IHN0YW5kYXJkcy4gVGhleSBtYWludGFpbiBhIHZhcmlldHkgb2YgdG9vbHMsIGRvY3VtZW50YXRpb24KKyAgZmlsZSBmb3JtYXQgc3RhbmRhcmRzLiBUaGV5IG1haW50YWluIGEgdmFyaWV0eSBvZiB0b29scywgZG9jdW1lbnRhdGlvbiwKICAgYW5kIGlzc3VlIHRyYWNrZXJzIG9uIGJvdGggYEdpdEh1YiA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGE+YF9fIGFuZAogICBgQml0QnVja2V0IDxodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS8+YF9fLgogKiBgYGRpc3R1dGlsc2BgIGlzIHRoZSBvcmlnaW5hbCBidWlsZCBhbmQgZGlzdHJpYnV0aW9uIHN5c3RlbSBmaXJzdCBhZGRlZCB0bwpAQCAtNjIsNiArNjIsMTkgQEAKICAgb2YgdGhlIG1haWxpbmcgbGlzdCB1c2VkIHRvIGNvb3JkaW5hdGUgUHl0aG9uIHBhY2thZ2luZyBzdGFuZGFyZHMKICAgZGV2ZWxvcG1lbnQpLgogCisuLiBkZXByZWNhdGVkOjogMy42CisgICBgYHB5dmVudmBgIHdhcyB0aGUgcmVjb21tZW5kZWQgdG9vbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMgZm9yCisgICBQeXRob24gMy4zIGFuZCAzLjQsIGFuZCBpcyBgZGVwcmVjYXRlZCBpbiBQeXRob24gMy42CisgICA8aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvZGV2L3doYXRzbmV3LzMuNi5odG1sI2RlcHJlY2F0ZWQtZmVhdHVyZXM+YF8uCisKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy41CisgICBUaGUgdXNlIG9mIGBgdmVudmBgIGlzIG5vdyByZWNvbW1lbmRlZCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMuCisKKy4uIHNlZWFsc286OgorCisgICBgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlOiBDcmVhdGluZyBhbmQgdXNpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMKKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvI2NyZWF0aW5nLXZpcnR1YWwtZW52aXJvbm1lbnRzPmBfXworCiAKIEJhc2ljIHVzYWdlCiA9PT09PT09PT09PQpAQCAtMTAwLDEzICsxMTMsMTQgQEAKIE1vcmUgaW5mb3JtYXRpb24gYW5kIHJlc291cmNlcyByZWdhcmRpbmcgYGBwaXBgYCBhbmQgaXRzIGNhcGFiaWxpdGllcyBjYW4gYmUKIGZvdW5kIGluIHRoZSBgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnPmBfXy4KIAotYGBweXZlbnZgYCBoYXMgaXRzIG93biBkb2N1bWVudGF0aW9uIGF0IDpyZWY6YHNjcmlwdHMtcHl2ZW52YC4gSW5zdGFsbGluZwotaW50byBhbiBhY3RpdmUgdmlydHVhbCBlbnZpcm9ubWVudCB1c2VzIHRoZSBjb21tYW5kcyBzaG93biBhYm92ZS4KK0NyZWF0aW9uIG9mIHZpcnR1YWwgZW52aXJvbm1lbnRzIGlzIGRvbmUgdGhyb3VnaCB0aGUgOm1vZDpgdmVudmAgbW9kdWxlLgorSW5zdGFsbGluZyBwYWNrYWdlcyBpbnRvIGFuIGFjdGl2ZSB2aXJ0dWFsIGVudmlyb25tZW50IHVzZXMgdGhlIGNvbW1hbmRzIHNob3duCithYm92ZS4KIAogLi4gc2VlYWxzbzo6CiAKICAgICBgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlOiBJbnN0YWxsaW5nIFB5dGhvbiBEaXN0cmlidXRpb24gUGFja2FnZXMKLSAgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvaW5zdGFsbGluZy8+YF9fCisgICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8+YF9fCiAKIAogSG93IGRvIEkgLi4uPwpAQCAtMTI0LDcgKzEzOCw3IEBACiAuLiBzZWVhbHNvOjoKIAogICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogUmVxdWlyZW1lbnRzIGZvciBJbnN0YWxsaW5nIFBhY2thZ2VzCi0gICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvaW5zdGFsbGluZy8jcmVxdWlyZW1lbnRzLWZvci1pbnN0YWxsaW5nLXBhY2thZ2VzPmBfXworICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8jcmVxdWlyZW1lbnRzLWZvci1pbnN0YWxsaW5nLXBhY2thZ2VzPmBfXwogCiAKIC4uIGluc3RhbGxpbmctcGVyLXVzZXItaW5zdGFsbGF0aW9uOgpAQCAtMTQyLDIwICsxNTYsMTkgQEAKIEEgbnVtYmVyIG9mIHNjaWVudGlmaWMgUHl0aG9uIHBhY2thZ2VzIGhhdmUgY29tcGxleCBiaW5hcnkgZGVwZW5kZW5jaWVzLCBhbmQKIGFyZW4ndCBjdXJyZW50bHkgZWFzeSB0byBpbnN0YWxsIHVzaW5nIGBgcGlwYGAgZGlyZWN0bHkuIEF0IHRoaXMgcG9pbnQgaW4KIHRpbWUsIGl0IHdpbGwgb2Z0ZW4gYmUgZWFzaWVyIGZvciB1c2VycyB0byBpbnN0YWxsIHRoZXNlIHBhY2thZ2VzIGJ5Ci1gb3RoZXIgbWVhbnMKLTxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zY2llbmNlLz5gX18KK2BvdGhlciBtZWFucyA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9zY2llbmNlLz5gX18KIHJhdGhlciB0aGFuIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCB0aGVtIHdpdGggYGBwaXBgYC4KIAogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IEluc3RhbGxpbmcgU2NpZW50aWZpYyBQYWNrYWdlcwotICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NjaWVuY2UvPmBfXworICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvc2NpZW5jZS8+YF9fCiAKIAogLi4uIHdvcmsgd2l0aCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBQeXRob24gaW5zdGFsbGVkIGluIHBhcmFsbGVsPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1PbiBMaW51eCwgTWFjIE9TIFggYW5kIG90aGVyIFBPU0lYIHN5c3RlbXMsIHVzZSB0aGUgdmVyc2lvbmVkIFB5dGhvbiBjb21tYW5kcworT24gTGludXgsIE1hYyBPUyBYLCBhbmQgb3RoZXIgUE9TSVggc3lzdGVtcywgdXNlIHRoZSB2ZXJzaW9uZWQgUHl0aG9uIGNvbW1hbmRzCiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBgYC1tYGAgc3dpdGNoIHRvIHJ1biB0aGUgYXBwcm9wcmlhdGUgY29weSBvZgogYGBwaXBgYDo6CiAKQEAgLTE2NCw3ICsxNzcsNyBAQAogICAgcHl0aG9uMyAgIC1tIHBpcCBpbnN0YWxsIFNvbWVQYWNrYWdlICAjIGRlZmF1bHQgUHl0aG9uIDMKICAgIHB5dGhvbjMuNCAtbSBwaXAgaW5zdGFsbCBTb21lUGFja2FnZSAgIyBzcGVjaWZpY2FsbHkgUHl0aG9uIDMuNAogCi0oYXBwcm9wcmlhdGVseSB2ZXJzaW9uZWQgYGBwaXBgYCBjb21tYW5kcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUpCitBcHByb3ByaWF0ZWx5IHZlcnNpb25lZCBgYHBpcGBgIGNvbW1hbmRzIG1heSBhbHNvIGJlIGF2YWlsYWJsZS4KIAogT24gV2luZG93cywgdXNlIHRoZSBgYHB5YGAgUHl0aG9uIGxhdW5jaGVyIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGBgLW1gYAogc3dpdGNoOjoKQEAgLTIxMiwxMSArMjI1LDExIEBACiB0aGFuIG5lZWRpbmcgdG8gYnVpbGQgdGhlbSB0aGVtc2VsdmVzLgogCiBTb21lIG9mIHRoZSBzb2x1dGlvbnMgZm9yIGluc3RhbGxpbmcgYHNjaWVudGlmaWMgc29mdHdhcmUKLTxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zY2llbmNlLz5gX18KLXRoYXQgaXMgbm90IHlldCBhdmFpbGFibGUgYXMgcHJlLWJ1aWx0IGBgd2hlZWxgYCBmaWxlcyBtYXkgYWxzbyBoZWxwIHdpdGgKKzxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL3NjaWVuY2UvPmBfXwordGhhdCBhcmUgbm90IHlldCBhdmFpbGFibGUgYXMgcHJlLWJ1aWx0IGBgd2hlZWxgYCBmaWxlcyBtYXkgYWxzbyBoZWxwIHdpdGgKIG9idGFpbmluZyBvdGhlciBiaW5hcnkgZXh0ZW5zaW9ucyB3aXRob3V0IG5lZWRpbmcgdG8gYnVpbGQgdGhlbSBsb2NhbGx5LgogCiAuLiBzZWVhbHNvOjoKIAogICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogQmluYXJ5IEV4dGVuc2lvbnMKLSAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9leHRlbnNpb25zLz5gX18KKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2V4dGVuc2lvbnMvPmBfXwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0CmluZGV4IGFlNzJkMjYuLmUwMjM2MGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QKQEAgLTU4LDEzICs1OCwxMyBAQAogICAgICAgVGhlIGFzeW5jaHJvbm91cyBvdXRwdXQgYnVmZmVyIHNpemUgKGRlZmF1bHQgYGA0MDk2YGApLgogCiAgICBVbmxpa2UgOmNsYXNzOmBhc3luY29yZS5kaXNwYXRjaGVyYCwgOmNsYXNzOmBhc3luY19jaGF0YCBhbGxvd3MgeW91IHRvCi0gICBkZWZpbmUgYSBmaXJzdC1pbi1maXJzdC1vdXQgcXVldWUgKGZpZm8pIG9mICpwcm9kdWNlcnMqLiBBIHByb2R1Y2VyIG5lZWQKKyAgIGRlZmluZSBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUgb2YgKnByb2R1Y2VycyouIEEgcHJvZHVjZXIgbmVlZAogICAgaGF2ZSBvbmx5IG9uZSBtZXRob2QsIDptZXRoOmBtb3JlYCwgd2hpY2ggc2hvdWxkIHJldHVybiBkYXRhIHRvIGJlCiAgICB0cmFuc21pdHRlZCBvbiB0aGUgY2hhbm5lbC4KICAgIFRoZSBwcm9kdWNlciBpbmRpY2F0ZXMgZXhoYXVzdGlvbiAoKmkuZS4qIHRoYXQgaXQgY29udGFpbnMgbm8gbW9yZSBkYXRhKSBieQogICAgaGF2aW5nIGl0cyA6bWV0aDpgbW9yZWAgbWV0aG9kIHJldHVybiB0aGUgZW1wdHkgYnl0ZXMgb2JqZWN0LiBBdCB0aGlzIHBvaW50Ci0gICB0aGUgOmNsYXNzOmBhc3luY19jaGF0YCBvYmplY3QgcmVtb3ZlcyB0aGUgcHJvZHVjZXIgZnJvbSB0aGUgZmlmbyBhbmQgc3RhcnRzCi0gICB1c2luZyB0aGUgbmV4dCBwcm9kdWNlciwgaWYgYW55LiBXaGVuIHRoZSBwcm9kdWNlciBmaWZvIGlzIGVtcHR5IHRoZQorICAgdGhlIDpjbGFzczpgYXN5bmNfY2hhdGAgb2JqZWN0IHJlbW92ZXMgdGhlIHByb2R1Y2VyIGZyb20gdGhlIHF1ZXVlIGFuZCBzdGFydHMKKyAgIHVzaW5nIHRoZSBuZXh0IHByb2R1Y2VyLCBpZiBhbnkuIFdoZW4gdGhlIHByb2R1Y2VyIHF1ZXVlIGlzIGVtcHR5IHRoZQogICAgOm1ldGg6YGhhbmRsZV93cml0ZWAgbWV0aG9kIGRvZXMgbm90aGluZy4gWW91IHVzZSB0aGUgY2hhbm5lbCBvYmplY3QncwogICAgOm1ldGg6YHNldF90ZXJtaW5hdG9yYCBtZXRob2QgdG8gZGVzY3JpYmUgaG93IHRvIHJlY29nbml6ZSB0aGUgZW5kIG9mLCBvcgogICAgYW4gaW1wb3J0YW50IGJyZWFrcG9pbnQgaW4sIGFuIGluY29taW5nIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSByZW1vdGUKQEAgLTc4LDggKzc4LDggQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5jbG9zZV93aGVuX2RvbmUoKQogCi0gICBQdXNoZXMgYSBgYE5vbmVgYCBvbiB0byB0aGUgcHJvZHVjZXIgZmlmby4gV2hlbiB0aGlzIHByb2R1Y2VyIGlzIHBvcHBlZCBvZmYKLSAgIHRoZSBmaWZvIGl0IGNhdXNlcyB0aGUgY2hhbm5lbCB0byBiZSBjbG9zZWQuCisgICBQdXNoZXMgYSBgYE5vbmVgYCBvbiB0byB0aGUgcHJvZHVjZXIgcXVldWUuIFdoZW4gdGhpcyBwcm9kdWNlciBpcyBwb3BwZWQgb2ZmCisgICB0aGUgcXVldWUgaXQgY2F1c2VzIHRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZC4KIAogCiAuLiBtZXRob2Q6OiBhc3luY19jaGF0LmNvbGxlY3RfaW5jb21pbmdfZGF0YShkYXRhKQpAQCAtOTIsNyArOTIsNyBAQAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5kaXNjYXJkX2J1ZmZlcnMoKQogCiAgICBJbiBlbWVyZ2VuY2llcyB0aGlzIG1ldGhvZCB3aWxsIGRpc2NhcmQgYW55IGRhdGEgaGVsZCBpbiB0aGUgaW5wdXQgYW5kL29yCi0gICBvdXRwdXQgYnVmZmVycyBhbmQgdGhlIHByb2R1Y2VyIGZpZm8uCisgICBvdXRwdXQgYnVmZmVycyBhbmQgdGhlIHByb2R1Y2VyIHF1ZXVlLgogCiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuZm91bmRfdGVybWluYXRvcigpCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5wdXNoKGRhdGEpCiAKLSAgIFB1c2hlcyBkYXRhIG9uIHRvIHRoZSBjaGFubmVsJ3MgZmlmbyB0byBlbnN1cmUgaXRzIHRyYW5zbWlzc2lvbi4KKyAgIFB1c2hlcyBkYXRhIG9uIHRvIHRoZSBjaGFubmVsJ3MgcXVldWUgdG8gZW5zdXJlIGl0cyB0cmFuc21pc3Npb24uCiAgICBUaGlzIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0byBoYXZlIHRoZSBjaGFubmVsIHdyaXRlIHRoZSBkYXRhIG91dCB0byB0aGUKICAgIG5ldHdvcmssIGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB5b3VyIG93biBwcm9kdWNlcnMgaW4gbW9yZSBjb21wbGV4CiAgICBzY2hlbWVzIHRvIGltcGxlbWVudCBlbmNyeXB0aW9uIGFuZCBjaHVua2luZywgZm9yIGV4YW1wbGUuCkBAIC0xMTgsNyArMTE4LDcgQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5wdXNoX3dpdGhfcHJvZHVjZXIocHJvZHVjZXIpCiAKLSAgIFRha2VzIGEgcHJvZHVjZXIgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBwcm9kdWNlciBmaWZvIGFzc29jaWF0ZWQgd2l0aAorICAgVGFrZXMgYSBwcm9kdWNlciBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIHByb2R1Y2VyIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aAogICAgdGhlIGNoYW5uZWwuICBXaGVuIGFsbCBjdXJyZW50bHktcHVzaGVkIHByb2R1Y2VycyBoYXZlIGJlZW4gZXhoYXVzdGVkIHRoZQogICAgY2hhbm5lbCB3aWxsIGNvbnN1bWUgdGhpcyBwcm9kdWNlcidzIGRhdGEgYnkgY2FsbGluZyBpdHMgOm1ldGg6YG1vcmVgCiAgICBtZXRob2QgYW5kIHNlbmQgdGhlIGRhdGEgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdAppbmRleCBlZWQ0ZjA4Li42NzA2MDAxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0CkBAIC0xMTAsOCArMTEwLDkgQEAKICAgIGNhbGxlZCBhZnRlciA6bWV0aDpgY2FsbF9zb29uYCByZXR1cm5zLCB3aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgZXZlbnQKICAgIGxvb3AuCiAKLSAgIFRoaXMgb3BlcmF0ZXMgYXMgYSBGSUZPIHF1ZXVlLCBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgaW4KLSAgIHdoaWNoIHRoZXkgYXJlIHJlZ2lzdGVyZWQuICBFYWNoIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKyAgIFRoaXMgb3BlcmF0ZXMgYXMgYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLCBjYWxsYmFja3MKKyAgIGFyZSBjYWxsZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJlZ2lzdGVyZWQuICBFYWNoIGNhbGxiYWNrCisgICB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCiAKICAgIEFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciB0aGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCiAgICBjYWxsYmFjayB3aGVuIGl0IGlzIGNhbGxlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdCBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdAppbmRleCA4NzhkOGRiLi40ZjVmMGYyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CkBAIC01MywxMyArNTMsMTQgQEAKICAgIHRoYW4gb25lIGxpbmUgbWF5IGJlIHBhc3NlZCBhdCBhIHRpbWUuCiAKIAotLi4gZnVuY3Rpb246OiBiMmFfYmFzZTY0KGRhdGEpCisuLiBmdW5jdGlvbjo6IGIyYV9iYXNlNjQoZGF0YSwgXCosIG5ld2xpbmU9VHJ1ZSkKIAogICAgQ29udmVydCBiaW5hcnkgZGF0YSB0byBhIGxpbmUgb2YgQVNDSUkgY2hhcmFjdGVycyBpbiBiYXNlNjQgY29kaW5nLiBUaGUgcmV0dXJuCi0gICB2YWx1ZSBpcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhci4gIFRoZSBuZXdsaW5lIGlzCi0gICBhZGRlZCBiZWNhdXNlIHRoZSBvcmlnaW5hbCB1c2UgY2FzZSBmb3IgdGhpcyBmdW5jdGlvbiB3YXMgdG8gZmVlZCBpdCBhCi0gICBzZXJpZXMgb2YgNTcgYnl0ZSBpbnB1dCBsaW5lcyB0byBnZXQgb3V0cHV0IGxpbmVzIHRoYXQgY29uZm9ybSB0byB0aGUKLSAgIE1JTUUtYmFzZTY0IHN0YW5kYXJkLiAgT3RoZXJ3aXNlIHRoZSBvdXRwdXQgY29uZm9ybXMgdG8gOnJmYzpgMzU0OGAuCisgICB2YWx1ZSBpcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhciBpZiAqbmV3bGluZSogaXMKKyAgIHRydWUuICBUaGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24gY29uZm9ybXMgdG8gOnJmYzpgMzU0OGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCB0aGUgKm5ld2xpbmUqIHBhcmFtZXRlci4KIAogCiAuLiBmdW5jdGlvbjo6IGEyYl9xcChkYXRhLCBoZWFkZXI9RmFsc2UpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jbWF0aC5yc3QgYi9Eb2MvbGlicmFyeS9jbWF0aC5yc3QKaW5kZXggNjJkZGI2Yi4uZDkzNWM0MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY21hdGgucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NtYXRoLnJzdApAQCAtMjUzLDYgKzI1Myw0MCBAQAogCiAgICBUaGUgbWF0aGVtYXRpY2FsIGNvbnN0YW50ICplKiwgYXMgYSBmbG9hdC4KIAorLi4gZGF0YTo6IHRhdQorCisgICBUaGUgbWF0aGVtYXRpY2FsIGNvbnN0YW50ICrPhCosIGFzIGEgZmxvYXQuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiBkYXRhOjogaW5mCisKKyAgIEZsb2F0aW5nLXBvaW50IHBvc2l0aXZlIGluZmluaXR5LiBFcXVpdmFsZW50IHRvIGBgZmxvYXQoJ2luZicpYGAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiBkYXRhOjogaW5magorCisgICBDb21wbGV4IG51bWJlciB3aXRoIHplcm8gcmVhbCBwYXJ0IGFuZCBwb3NpdGl2ZSBpbmZpbml0eSBpbWFnaW5hcnkKKyAgIHBhcnQuIEVxdWl2YWxlbnQgdG8gYGBjb21wbGV4KDAuMCwgZmxvYXQoJ2luZicpKWBgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZGF0YTo6IG5hbgorCisgICBBIGZsb2F0aW5nLXBvaW50ICJub3QgYSBudW1iZXIiIChOYU4pIHZhbHVlLiAgRXF1aXZhbGVudCB0bworICAgYGBmbG9hdCgnbmFuJylgYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIGRhdGE6OiBuYW5qCisKKyAgIENvbXBsZXggbnVtYmVyIHdpdGggemVybyByZWFsIHBhcnQgYW5kIE5hTiBpbWFnaW5hcnkgcGFydC4gRXF1aXZhbGVudCB0bworICAgYGBjb21wbGV4KDAuMCwgZmxvYXQoJ25hbicpKWBgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAuLiBpbmRleDo6IG1vZHVsZTogbWF0aAogCiBOb3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBvZiBmdW5jdGlvbnMgaXMgc2ltaWxhciwgYnV0IG5vdCBpZGVudGljYWwsIHRvIHRoYXQgaW4KQEAgLTI3Niw1ICszMTAsMyBAQAogICAgS2FoYW4sIFc6ICBCcmFuY2ggY3V0cyBmb3IgY29tcGxleCBlbGVtZW50YXJ5IGZ1bmN0aW9uczsgb3IsIE11Y2ggYWRvIGFib3V0CiAgICBub3RoaW5nJ3Mgc2lnbiBiaXQuICBJbiBJc2VybGVzLCBBLiwgYW5kIFBvd2VsbCwgTS4gKGVkcy4pLCBUaGUgc3RhdGUgb2YgdGhlIGFydAogICAgaW4gbnVtZXJpY2FsIGFuYWx5c2lzLiBDbGFyZW5kb24gUHJlc3MgKDE5ODcpIHBwMTY1LTIxMS4KLQotCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2RlLnJzdCBiL0RvYy9saWJyYXJ5L2NvZGUucnN0CmluZGV4IDQ0M2FmNjkuLjRjY2UxZmEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvZGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvZGUucnN0CkBAIC0zMCwxNSArMzAsMTkgQEAKICAgIGBgc3lzLnBzMWBgIGFuZCBgYHN5cy5wczJgYCwgYW5kIGlucHV0IGJ1ZmZlcmluZy4KIAogCi0uLiBmdW5jdGlvbjo6IGludGVyYWN0KGJhbm5lcj1Ob25lLCByZWFkZnVuYz1Ob25lLCBsb2NhbD1Ob25lKQorLi4gZnVuY3Rpb246OiBpbnRlcmFjdChiYW5uZXI9Tm9uZSwgcmVhZGZ1bmM9Tm9uZSwgbG9jYWw9Tm9uZSwgZXhpdG1zZz1Ob25lKQogCiAgICBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBydW4gYSByZWFkLWV2YWwtcHJpbnQgbG9vcC4gIFRoaXMgY3JlYXRlcyBhIG5ldwogICAgaW5zdGFuY2Ugb2YgOmNsYXNzOmBJbnRlcmFjdGl2ZUNvbnNvbGVgIGFuZCBzZXRzICpyZWFkZnVuYyogdG8gYmUgdXNlZCBhcwogICAgdGhlIDptZXRoOmBJbnRlcmFjdGl2ZUNvbnNvbGUucmF3X2lucHV0YCBtZXRob2QsIGlmIHByb3ZpZGVkLiAgSWYgKmxvY2FsKiBpcwogICAgcHJvdmlkZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgOmNsYXNzOmBJbnRlcmFjdGl2ZUNvbnNvbGVgIGNvbnN0cnVjdG9yIGZvcgogICAgdXNlIGFzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIGludGVycHJldGVyIGxvb3AuICBUaGUgOm1ldGg6YGludGVyYWN0YAotICAgbWV0aG9kIG9mIHRoZSBpbnN0YW5jZSBpcyB0aGVuIHJ1biB3aXRoICpiYW5uZXIqIHBhc3NlZCBhcyB0aGUgYmFubmVyIHRvCi0gICB1c2UsIGlmIHByb3ZpZGVkLiAgVGhlIGNvbnNvbGUgb2JqZWN0IGlzIGRpc2NhcmRlZCBhZnRlciB1c2UuCisgICBtZXRob2Qgb2YgdGhlIGluc3RhbmNlIGlzIHRoZW4gcnVuIHdpdGggKmJhbm5lciogYW5kICpleGl0bXNnKiBwYXNzZWQgYXMgdGhlCisgICBiYW5uZXIgYW5kIGV4aXQgbWVzc2FnZSB0byB1c2UsIGlmIHByb3ZpZGVkLiAgVGhlIGNvbnNvbGUgb2JqZWN0IGlzIGRpc2NhcmRlZAorICAgYWZ0ZXIgdXNlLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgKmV4aXRtc2cqIHBhcmFtZXRlci4KIAogCiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfY29tbWFuZChzb3VyY2UsIGZpbGVuYW1lPSI8aW5wdXQ+Iiwgc3ltYm9sPSJzaW5nbGUiKQpAQCAtMTM2LDcgKzE0MCw3IEBACiBpbnRlcnByZXRlciBvYmplY3RzIGFzIHdlbGwgYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuCiAKIAotLi4gbWV0aG9kOjogSW50ZXJhY3RpdmVDb25zb2xlLmludGVyYWN0KGJhbm5lcj1Ob25lKQorLi4gbWV0aG9kOjogSW50ZXJhY3RpdmVDb25zb2xlLmludGVyYWN0KGJhbm5lcj1Ob25lLCBleGl0bXNnPU5vbmUpCiAKICAgIENsb3NlbHkgZW11bGF0ZSB0aGUgaW50ZXJhY3RpdmUgUHl0aG9uIGNvbnNvbGUuIFRoZSBvcHRpb25hbCAqYmFubmVyKiBhcmd1bWVudAogICAgc3BlY2lmeSB0aGUgYmFubmVyIHRvIHByaW50IGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJhY3Rpb247IGJ5IGRlZmF1bHQgaXQgcHJpbnRzIGEKQEAgLTE0NCw5ICsxNDgsMTYgQEAKICAgIGJ5IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjb25zb2xlIG9iamVjdCBpbiBwYXJlbnRoZXNlcyAoc28gYXMgbm90IHRvIGNvbmZ1c2UKICAgIHRoaXMgd2l0aCB0aGUgcmVhbCBpbnRlcnByZXRlciAtLSBzaW5jZSBpdCdzIHNvIGNsb3NlISkuCiAKKyAgIFRoZSBvcHRpb25hbCAqZXhpdG1zZyogYXJndW1lbnQgc3BlY2lmaWVzIGFuIGV4aXQgbWVzc2FnZSBwcmludGVkIHdoZW4gZXhpdGluZy4KKyAgIFBhc3MgdGhlIGVtcHR5IHN0cmluZyB0byBzdXBwcmVzcyB0aGUgZXhpdCBtZXNzYWdlLiBJZiAqZXhpdG1zZyogaXMgbm90IGdpdmVuIG9yCisgICBOb25lLCBhIGRlZmF1bHQgbWVzc2FnZSBpcyBwcmludGVkLgorCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgVG8gc3VwcHJlc3MgcHJpbnRpbmcgYW55IGJhbm5lciwgcGFzcyBhbiBlbXB0eSBzdHJpbmcuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBQcmludCBhbiBleGl0IG1lc3NhZ2Ugd2hlbiBleGl0aW5nLgorCiAKIC4uIG1ldGhvZDo6IEludGVyYWN0aXZlQ29uc29sZS5wdXNoKGxpbmUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0CmluZGV4IGFlYjZhNzMuLmU0Yjc1YTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdApAQCAtNDEsMTMgKzQxLDE2IEBACiA6Y2xhc3M6YEhhc2hhYmxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19oYXNoX19gYAogOmNsYXNzOmBJdGVyYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAKIDpjbGFzczpgSXRlcmF0b3JgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgICAgICAgYGBfX25leHRfX2BgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgCis6Y2xhc3M6YFJldmVyc2libGVgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCAgICAgIGBgX19yZXZlcnNlZF9fYGAKIDpjbGFzczpgR2VuZXJhdG9yYCAgICAgICAgIDpjbGFzczpgSXRlcmF0b3JgICAgICAgYGBzZW5kYGAsIGBgdGhyb3dgYCAgICAgYGBjbG9zZWBgLCBgYF9faXRlcl9fYGAsIGBgX19uZXh0X19gYAogOmNsYXNzOmBTaXplZGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogOmNsYXNzOmBDYWxsYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fY2FsbF9fYGAKKzpjbGFzczpgQ29sbGVjdGlvbmAgICAgICAgIDpjbGFzczpgU2l6ZWRgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2l0ZXJfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgICAgICBgYF9fbGVuX19gYAogCi06Y2xhc3M6YFNlcXVlbmNlYCAgICAgICAgICA6Y2xhc3M6YFNpemVkYCwgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIGBgX19jb250YWluc19fYGAsIGBgX19pdGVyX19gYCwgYGBfX3JldmVyc2VkX19gYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2xlbl9fYGAgICAgICAgICAgICAgYGBpbmRleGBgLCBhbmQgYGBjb3VudGBgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAKKzpjbGFzczpgU2VxdWVuY2VgICAgICAgICAgIDpjbGFzczpgUmV2ZXJzaWJsZWAsICAgYGBfX2dldGl0ZW1fX2BgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwgYGBfX2l0ZXJfX2BgLCBgYF9fcmV2ZXJzZWRfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb2xsZWN0aW9uYCAgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYGluZGV4YGAsIGFuZCBgYGNvdW50YGAKIAogOmNsYXNzOmBNdXRhYmxlU2VxdWVuY2VgICAgOmNsYXNzOmBTZXF1ZW5jZWAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBJbmhlcml0ZWQgOmNsYXNzOmBTZXF1ZW5jZWAgbWV0aG9kcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX3NldGl0ZW1fX2BgLCAgICAgICAgYGBhcHBlbmRgYCwgYGByZXZlcnNlYGAsIGBgZXh0ZW5kYGAsIGBgcG9wYGAsCkBAIC01OCw5ICs2MSw5IEBACiA6Y2xhc3M6YEJ5dGVTdHJpbmdgICAgICAgICA6Y2xhc3M6YFNlcXVlbmNlYCAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNlcXVlbmNlYCBtZXRob2RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19sZW5fX2BgCiAKLTpjbGFzczpgU2V0YCAgICAgICAgICAgICAgIDpjbGFzczpgU2l6ZWRgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwgICAgICAgYGBfX2xlX19gYCwgYGBfX2x0X19gYCwgYGBfX2VxX19gYCwgYGBfX25lX19gYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2l0ZXJfX2BgLCAgICAgICAgICAgYGBfX2d0X19gYCwgYGBfX2dlX19gYCwgYGBfX2FuZF9fYGAsIGBgX19vcl9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAgICAgIGBgX19sZW5fX2BgICAgICAgICAgICAgIGBgX19zdWJfX2BgLCBgYF9feG9yX19gYCwgYW5kIGBgaXNkaXNqb2ludGBgCis6Y2xhc3M6YFNldGAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbGxlY3Rpb25gICAgIGBgX19jb250YWluc19fYGAsICAgICAgIGBgX19sZV9fYGAsIGBgX19sdF9fYGAsIGBgX19lcV9fYGAsIGBgX19uZV9fYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19pdGVyX19gYCwgICAgICAgICAgIGBgX19ndF9fYGAsIGBgX19nZV9fYGAsIGBgX19hbmRfX2BgLCBgYF9fb3JfX2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYF9fc3ViX19gYCwgYGBfX3hvcl9fYGAsIGFuZCBgYGlzZGlzam9pbnRgYAogCiA6Y2xhc3M6YE11dGFibGVTZXRgICAgICAgICA6Y2xhc3M6YFNldGAgICAgICAgICAgIGBgX19jb250YWluc19fYGAsICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNldGAgbWV0aG9kcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgLCAgICAgICAgICAgYGBjbGVhcmBgLCBgYHBvcGBgLCBgYHJlbW92ZWBgLCBgYF9faW9yX19gYCwKQEAgLTY4LDkgKzcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBhZGRgYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBkaXNjYXJkYGAKIAotOmNsYXNzOmBNYXBwaW5nYCAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYGtleXNgYCwgYGBpdGVtc2BgLCBgYHZhbHVlc2BgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAsICAgICBgYF9faXRlcl9fYGAsICAgICAgICAgICBgYGdldGBgLCBgYF9fZXFfX2BgLCBhbmQgYGBfX25lX19gYAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgICAgICBgYF9fbGVuX19gYAorOmNsYXNzOmBNYXBwaW5nYCAgICAgICAgICAgOmNsYXNzOmBDb2xsZWN0aW9uYCAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYGtleXNgYCwgYGBpdGVtc2BgLCBgYHZhbHVlc2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAsICAgICAgICAgICBgYGdldGBgLCBgYF9fZXFfX2BgLCBhbmQgYGBfX25lX19gYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogCiA6Y2xhc3M6YE11dGFibGVNYXBwaW5nYCAgICA6Y2xhc3M6YE1hcHBpbmdgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YE1hcHBpbmdgIG1ldGhvZHMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19zZXRpdGVtX19gYCwgICAgICAgIGBgcG9wYGAsIGBgcG9waXRlbWBgLCBgYGNsZWFyYGAsIGBgdXBkYXRlYGAsCkBAIC0xMDUsMTIgKzEwOCwyNSBAQAogICAgQUJDIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgOm1ldGg6YF9faXRlcl9fYCBtZXRob2QuCiAgICBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZiA6dGVybTpgaXRlcmFibGVgLgogCisuLiBjbGFzczo6IENvbGxlY3Rpb24KKworICAgQUJDIGZvciBzaXplZCBpdGVyYWJsZSBjb250YWluZXIgY2xhc3Nlcy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIGNsYXNzOjogSXRlcmF0b3IKIAogICAgQUJDIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgOm1ldGg6YH5pdGVyYXRvci5fX2l0ZXJfX2AgYW5kCiAgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYCBtZXRob2RzLiAgU2VlIGFsc28gdGhlIGRlZmluaXRpb24gb2YKICAgIDp0ZXJtOmBpdGVyYXRvcmAuCiAKKy4uIGNsYXNzOjogUmV2ZXJzaWJsZQorCisgICBBQkMgZm9yIGl0ZXJhYmxlIGNsYXNzZXMgdGhhdCBhbHNvIHByb3ZpZGUgdGhlIDptZXRoOmBfX3JldmVyc2VkX19gCisgICBtZXRob2QuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBjbGFzczo6IEdlbmVyYXRvcgogCiAgICBBQkMgZm9yIGdlbmVyYXRvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm90b2NvbCBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKaW5kZXggYTE0NzI4Ny4uNmRhZWU2ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdApAQCAtNzYzLDcgKzc2Myw3IEBACiBzZWxmLWRvY3VtZW50aW5nIGNvZGUuICBUaGV5IGNhbiBiZSB1c2VkIHdoZXJldmVyIHJlZ3VsYXIgdHVwbGVzIGFyZSB1c2VkLCBhbmQKIHRoZXkgYWRkIHRoZSBhYmlsaXR5IHRvIGFjY2VzcyBmaWVsZHMgYnkgbmFtZSBpbnN0ZWFkIG9mIHBvc2l0aW9uIGluZGV4LgogCi0uLiBmdW5jdGlvbjo6IG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpCisuLiBmdW5jdGlvbjo6IG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCAqLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpCiAKICAgICBSZXR1cm5zIGEgbmV3IHR1cGxlIHN1YmNsYXNzIG5hbWVkICp0eXBlbmFtZSouICBUaGUgbmV3IHN1YmNsYXNzIGlzIHVzZWQgdG8KICAgICBjcmVhdGUgdHVwbGUtbGlrZSBvYmplY3RzIHRoYXQgaGF2ZSBmaWVsZHMgYWNjZXNzaWJsZSBieSBhdHRyaWJ1dGUgbG9va3VwIGFzCkBAIC03OTQsNyArNzk0LDExIEBACiAgICAgbGlnaHR3ZWlnaHQgYW5kIHJlcXVpcmUgbm8gbW9yZSBtZW1vcnkgdGhhbiByZWd1bGFyIHR1cGxlcy4KIAogICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4xCi0gICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yICpyZW5hbWUqLgorICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yICpyZW5hbWUqLgorCisgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICBUaGUgKnZlcmJvc2UqIGFuZCAqcmVuYW1lKiBwYXJhbWV0ZXJzIGJlY2FtZQorICAgICAgIDpyZWY6YGtleXdvcmQtb25seSBhcmd1bWVudHMgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KIAogCiAuLiBkb2N0ZXN0OjoKQEAgLTg0Niw3ICs4NTAsOSBAQAogLi4gbWV0aG9kOjogc29tZW5hbWVkdHVwbGUuX2FzZGljdCgpCiAKICAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmBPcmRlcmVkRGljdGAgd2hpY2ggbWFwcyBmaWVsZCBuYW1lcyB0byB0aGVpciBjb3JyZXNwb25kaW5nCi0gICAgdmFsdWVzOjoKKyAgICB2YWx1ZXM6CisKKyAgICAuLiBkb2N0ZXN0OjoKIAogICAgICAgICA+Pj4gcCA9IFBvaW50KHg9MTEsIHk9MjIpCiAgICAgICAgID4+PiBwLl9hc2RpY3QoKQpAQCAtOTA4LDcgKzkxNCw5IEBACiBmdW5jdGlvbmFsaXR5IHdpdGggYSBzdWJjbGFzcy4gIEhlcmUgaXMgaG93IHRvIGFkZCBhIGNhbGN1bGF0ZWQgZmllbGQgYW5kCiBhIGZpeGVkLXdpZHRoIHByaW50IGZvcm1hdDoKIAotICAgID4+PiBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6CisuLiBkb2N0ZXN0OjoKKworICAgID4+PiBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsIFsneCcsICd5J10pKToKICAgICAuLi4gICAgIF9fc2xvdHNfXyA9ICgpCiAgICAgLi4uICAgICBAcHJvcGVydHkKICAgICAuLi4gICAgIGRlZiBoeXBvdChzZWxmKToKQEAgLTk1OSw2ICs5NjcsMTEgQEAKICAgICAgIGNvbnN0cnVjdG9yIHRoYXQgaXMgY29udmVuaWVudCBmb3IgdXNlIGNhc2VzIHdoZXJlIG5hbWVkIHR1cGxlcyBhcmUgYmVpbmcKICAgICAgIHN1YmNsYXNzZWQuCiAKKyAgICAqIFNlZSA6bWV0aDpgdHlwZXMuU2ltcGxlTmFtZXNwYWNlYCBmb3IgYSBtdXRhYmxlIG5hbWVzcGFjZSBiYXNlZCBvbiBhbgorICAgICAgdW5kZXJseWluZyBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgYSB0dXBsZS4KKworICAgICogU2VlIDptZXRoOmB0eXBpbmcuTmFtZWRUdXBsZWAgZm9yIGEgd2F5IHRvIGFkZCB0eXBlIGhpbnRzIGZvciBuYW1lZCB0dXBsZXMuCisKIAogOmNsYXNzOmBPcmRlcmVkRGljdGAgb2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTgwLDggKzk5Myw5IEBACiAgICAgLi4gbWV0aG9kOjogcG9waXRlbShsYXN0PVRydWUpCiAKICAgICAgICAgVGhlIDptZXRoOmBwb3BpdGVtYCBtZXRob2QgZm9yIG9yZGVyZWQgZGljdGlvbmFyaWVzIHJldHVybnMgYW5kIHJlbW92ZXMgYQotICAgICAgICAoa2V5LCB2YWx1ZSkgcGFpci4gIFRoZSBwYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiAqbGFzdCogaXMgdHJ1ZQotICAgICAgICBvciBGSUZPIG9yZGVyIGlmIGZhbHNlLgorICAgICAgICAoa2V5LCB2YWx1ZSkgcGFpci4gIFRoZSBwYWlycyBhcmUgcmV0dXJuZWQgaW4KKyAgICAgICAgOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgIG9yZGVyIGlmICpsYXN0KiBpcyB0cnVlCisgICAgICAgIG9yIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgb3JkZXIgaWYgZmFsc2UuCiAKICAgICAuLiBtZXRob2Q6OiBtb3ZlX3RvX2VuZChrZXksIGxhc3Q9VHJ1ZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAppbmRleCA1MTFjNTgxLi45MWJkZDE4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdApAQCAtMTAyLDcgKzEwMiw4IEBACiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfZGlyKGRpciwgbWF4bGV2ZWxzPTEwLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xLCB3b3JrZXJzPTEpCiAKICAgIFJlY3Vyc2l2ZWx5IGRlc2NlbmQgdGhlIGRpcmVjdG9yeSB0cmVlIG5hbWVkIGJ5ICpkaXIqLCBjb21waWxpbmcgYWxsIDpmaWxlOmAucHlgCi0gICBmaWxlcyBhbG9uZyB0aGUgd2F5LgorICAgZmlsZXMgYWxvbmcgdGhlIHdheS4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBhbGwgdGhlIGZpbGVzIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwKKyAgIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KIAogICAgVGhlICptYXhsZXZlbHMqIHBhcmFtZXRlciBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkZXB0aCBvZiB0aGUgcmVjdXJzaW9uOyBpdAogICAgZGVmYXVsdHMgdG8gYGAxMGBgLgpAQCAtMTU0LDcgKzE1NSw4IEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9maWxlKGZ1bGxuYW1lLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xKQogCi0gICBDb21waWxlIHRoZSBmaWxlIHdpdGggcGF0aCAqZnVsbG5hbWUqLgorICAgQ29tcGlsZSB0aGUgZmlsZSB3aXRoIHBhdGggKmZ1bGxuYW1lKi4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZmlsZQorICAgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgYSBmYWxzZSB2YWx1ZSBvdGhlcndpc2UuCiAKICAgIElmICpkZGlyKiBpcyBnaXZlbiwgaXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGNvbXBpbGVkCiAgICBmb3IgdXNlIGluIGNvbXBpbGF0aW9uIHRpbWUgdHJhY2ViYWNrcywgYW5kIGlzIGFsc28gY29tcGlsZWQgaW4gdG8gdGhlCkBAIC0xOTAsOCArMTkyLDEwIEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPVRydWUsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwgbGVnYWN5PUZhbHNlLCBvcHRpbWl6ZT0tMSkKIAotICAgQnl0ZS1jb21waWxlIGFsbCB0aGUgOmZpbGU6YC5weWAgZmlsZXMgZm91bmQgYWxvbmcgYGBzeXMucGF0aGBgLiBJZgotICAgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKKyAgIEJ5dGUtY29tcGlsZSBhbGwgdGhlIDpmaWxlOmAucHlgIGZpbGVzIGZvdW5kIGFsb25nIGBgc3lzLnBhdGhgYC4gUmV0dXJuIGEKKyAgIHRydWUgdmFsdWUgaWYgYWxsIHRoZSBmaWxlcyBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KKworICAgSWYgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKICAgIGluIHRoZSBzZWFyY2guICBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSA6ZnVuYzpgY29tcGlsZV9kaXJgCiAgICBmdW5jdGlvbi4gIE5vdGUgdGhhdCB1bmxpa2UgdGhlIG90aGVyIGNvbXBpbGUgZnVuY3Rpb25zLCBgYG1heGxldmVsc2BgCiAgICBkZWZhdWx0cyB0byBgYDBgYC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbmN1cnJlbnQuZnV0dXJlcy5yc3QgYi9Eb2MvbGlicmFyeS9jb25jdXJyZW50LmZ1dHVyZXMucnN0CmluZGV4IGFlMDNmNGIuLmQ4NTU3NmIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbmN1cnJlbnQuZnV0dXJlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29uY3VycmVudC5mdXR1cmVzLnJzdApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICBleGVjdXRvci5zdWJtaXQod2FpdF9vbl9mdXR1cmUpCiAKIAotLi4gY2xhc3M6OiBUaHJlYWRQb29sRXhlY3V0b3IobWF4X3dvcmtlcnM9Tm9uZSkKKy4uIGNsYXNzOjogVGhyZWFkUG9vbEV4ZWN1dG9yKG1heF93b3JrZXJzPU5vbmUsIHRocmVhZF9uYW1lX3ByZWZpeD0nJykKIAogICAgQW4gOmNsYXNzOmBFeGVjdXRvcmAgc3ViY2xhc3MgdGhhdCB1c2VzIGEgcG9vbCBvZiBhdCBtb3N0ICptYXhfd29ya2VycyoKICAgIHRocmVhZHMgdG8gZXhlY3V0ZSBjYWxscyBhc3luY2hyb25vdXNseS4KQEAgLTEzNyw2ICsxMzcsMTAgQEAKICAgICAgIHNob3VsZCBiZSBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMKICAgICAgIGZvciA6Y2xhc3M6YFByb2Nlc3NQb29sRXhlY3V0b3JgLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIFRoZSAqdGhyZWFkX25hbWVfcHJlZml4KiBhcmd1bWVudCB3YXMgYWRkZWQgdG8gYWxsb3cgdXNlcnMgdG8KKyAgICAgIGNvbnRyb2wgdGhlIHRocmVhZGluZy5UaHJlYWQgbmFtZXMgZm9yIHdvcmtlciB0aHJlYWRzIGNyZWF0ZWQgYnkKKyAgICAgIHRoZSBwb29sIGZvciBlYXNpZXIgZGVidWdnaW5nLgogCiAuLiBfdGhyZWFkcG9vbGV4ZWN1dG9yLWV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbnN0YW50cy5yc3QgYi9Eb2MvbGlicmFyeS9jb25zdGFudHMucnN0CmluZGV4IGQ1YTBmMDkuLmYwNzQyY2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbnN0YW50cy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29uc3RhbnRzLnJzdApAQCAtMzMsMTYgKzMzLDIyIEBACiAgICAoZS5nLiA6bWV0aDpgX19pbXVsX19gLCA6bWV0aDpgX19pYW5kX19gLCBldGMuKSBmb3IgdGhlIHNhbWUgcHVycG9zZS4KICAgIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLgogCi0uLiBub3RlOjoKKyAgIC4uIG5vdGU6OgogCi0gICBXaGVuIGBgTm90SW1wbGVtZW50ZWRgYCBpcyByZXR1cm5lZCwgdGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlCi0gICByZWZsZWN0ZWQgb3BlcmF0aW9uIG9uIHRoZSBvdGhlciB0eXBlLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcKLSAgIG9uIHRoZSBvcGVyYXRvci4gIElmIGFsbCBhdHRlbXB0ZWQgb3BlcmF0aW9ucyByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLCB0aGUKLSAgIGludGVycHJldGVyIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICAgICAgV2hlbiBhIGJpbmFyeSAob3IgaW4tcGxhY2UpIG1ldGhvZCByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYCB0aGUKKyAgICAgIGludGVycHJldGVyIHdpbGwgdHJ5IHRoZSByZWZsZWN0ZWQgb3BlcmF0aW9uIG9uIHRoZSBvdGhlciB0eXBlIChvciBzb21lCisgICAgICBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvcikuICBJZiBhbGwgYXR0ZW1wdHMgcmV0dXJuCisgICAgICBgYE5vdEltcGxlbWVudGVkYGAsIHRoZSBpbnRlcnByZXRlciB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKyAgICAgIEluY29ycmVjdGx5IHJldHVybmluZyBgYE5vdEltcGxlbWVudGVkYGAgd2lsbCByZXN1bHQgaW4gYSBtaXNsZWFkaW5nCisgICAgICBlcnJvciBtZXNzYWdlIG9yIHRoZSBgYE5vdEltcGxlbWVudGVkYGAgdmFsdWUgYmVpbmcgcmV0dXJuZWQgdG8gUHl0aG9uIGNvZGUuCiAKLSAgIFNlZQotICAgOnJlZjpgaW1wbGVtZW50aW5nLXRoZS1hcml0aG1ldGljLW9wZXJhdGlvbnNgCi0gICBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgU2VlIDpyZWY6YGltcGxlbWVudGluZy10aGUtYXJpdGhtZXRpYy1vcGVyYXRpb25zYCBmb3IgZXhhbXBsZXMuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBgYE5vdEltcGxlbnRlZEVycm9yYGAgYW5kIGBgTm90SW1wbGVtZW50ZWRgYCBhcmUgbm90IGludGVyY2hhbmdlYWJsZSwKKyAgICAgIGV2ZW4gdGhvdWdoIHRoZXkgaGF2ZSBzaW1pbGFyIG5hbWVzIGFuZCBwdXJwb3Nlcy4KKyAgICAgIFNlZSA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCBmb3IgZGV0YWlscyBvbiB3aGVuIHRvIHVzZSBpdC4KIAogCiAuLiBkYXRhOjogRWxsaXBzaXMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbnRleHRsaWIucnN0IGIvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKaW5kZXggY2Y4NWZjZC4uZGQzNGM5NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QKQEAgLTE4LDYgKzE4LDE4IEBACiAKIEZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBwcm92aWRlZDoKIAorLi4gY2xhc3M6OiBBYnN0cmFjdENvbnRleHRNYW5hZ2VyCisKKyAgIEFuIDp0ZXJtOmBhYnN0cmFjdCBiYXNlIGNsYXNzYCBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudAorICAgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGFuZCA6bWV0aDpgb2JqZWN0Ll9fZXhpdF9fYC4gQSBkZWZhdWx0CisgICBpbXBsZW1lbnRhdGlvbiBmb3IgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGlzIHByb3ZpZGVkIHdoaWNoIHJldHVybnMKKyAgIGBgc2VsZmBgIHdoaWxlIDptZXRoOmBvYmplY3QuX19leGl0X19gIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB3aGljaCBieSBkZWZhdWx0CisgICByZXR1cm5zIGBgTm9uZWBgLiBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZiA6cmVmOmB0eXBlY29udGV4dG1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisKIC4uIGRlY29yYXRvcjo6IGNvbnRleHRtYW5hZ2VyCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgYSA6dGVybTpgZGVjb3JhdG9yYCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGZhY3RvcnkKQEAgLTQ0Nyw5ICs0NTksOSBAQAogYWNxdWlzaXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zLCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24sCiBhbmQgbWFwcyB0aGVtIHRvIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2w6OgogCi0gICBmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyLCBFeGl0U3RhY2sKKyAgIGZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIsIEV4aXRTdGFjawogCi0gICBjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CisgICBjbGFzcyBSZXNvdXJjZU1hbmFnZXIoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWNxdWlyZV9yZXNvdXJjZSwgcmVsZWFzZV9yZXNvdXJjZSwgY2hlY2tfcmVzb3VyY2Vfb2s9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuYWNxdWlyZV9yZXNvdXJjZSA9IGFjcXVpcmVfcmVzb3VyY2UKQEAgLTU3OCwxMCArNTkwLDEwIEBACiAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAKICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnRW50ZXJpbmc6IHt9Jy5mb3JtYXQoc2VsZi5uYW1lKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnRW50ZXJpbmc6ICVzJywgc2VsZi5uYW1lKQogCiAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjLCBleGNfdGIpOgotICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdFeGl0aW5nOiB7fScuZm9ybWF0KHNlbGYubmFtZSkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ0V4aXRpbmc6ICVzJywgc2VsZi5uYW1lKQogCiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyBib3RoIGEgY29udGV4dCBtYW5hZ2VyOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHQucnN0IGIvRG9jL2xpYnJhcnkvY3J5cHQucnN0CmluZGV4IGEyMWMxZTcuLmRiZDQyNzQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NyeXB0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKQEAgLTY4LDcgKzY4LDcgQEAKIAogICAgQSBsaXN0IG9mIGF2YWlsYWJsZSBwYXNzd29yZCBoYXNoaW5nIGFsZ29yaXRobXMsIGFzCiAgICBgYGNyeXB0Lk1FVEhPRF8qYGAgb2JqZWN0cy4gIFRoaXMgbGlzdCBpcyBzb3J0ZWQgZnJvbSBzdHJvbmdlc3QgdG8KLSAgIHdlYWtlc3QsIGFuZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QgYGBjcnlwdC5NRVRIT0RfQ1JZUFRgYC4KKyAgIHdlYWtlc3QuCiAKIAogTW9kdWxlIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdCBiL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QKaW5kZXggMWVkZGZkYy4uOGViNGI4MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0CkBAIC0xNSw0ICsxNSw2IEBACiAuLiB0b2N0cmVlOjoKIAogICAgaGFzaGxpYi5yc3QKKyAgIGhhc2hsaWItYmxha2UyLnJzdAogICAgaG1hYy5yc3QKKyAgIHNlY3JldHMucnN0CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jc3YucnN0IGIvRG9jL2xpYnJhcnkvY3N2LnJzdAppbmRleCA3ZmI0ZmM4Li42MzQxYmMzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jc3YucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Nzdi5yc3QKQEAgLTE0OSwxOCArMTQ5LDI1IEBACiAuLiBjbGFzczo6IERpY3RSZWFkZXIoY3N2ZmlsZSwgZmllbGRuYW1lcz1Ob25lLCByZXN0a2V5PU5vbmUsIHJlc3R2YWw9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3Q9J2V4Y2VsJywgKmFyZ3MsICoqa3dkcykKIAotICAgQ3JlYXRlIGFuIG9iamVjdCB3aGljaCBvcGVyYXRlcyBsaWtlIGEgcmVndWxhciByZWFkZXIgYnV0IG1hcHMgdGhlCi0gICBpbmZvcm1hdGlvbiByZWFkIGludG8gYSBkaWN0IHdob3NlIGtleXMgYXJlIGdpdmVuIGJ5IHRoZSBvcHRpb25hbAotICAgKmZpZWxkbmFtZXMqIHBhcmFtZXRlci4gIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIGEgOm1vZDpgc2VxdWVuY2UKLSAgIDxjb2xsZWN0aW9ucy5hYmM+YCB3aG9zZSBlbGVtZW50cyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZHMgb2YgdGhlCi0gICBpbnB1dCBkYXRhIGluIG9yZGVyLiBUaGVzZSBlbGVtZW50cyBiZWNvbWUgdGhlIGtleXMgb2YgdGhlIHJlc3VsdGluZwotICAgZGljdGlvbmFyeS4gIElmIHRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRoZSB2YWx1ZXMgaW4gdGhlCi0gICBmaXJzdCByb3cgb2YgdGhlICpjc3ZmaWxlKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpZWxkbmFtZXMuICBJZiB0aGUgcm93IHJlYWQKLSAgIGhhcyBtb3JlIGZpZWxkcyB0aGFuIHRoZSBmaWVsZG5hbWVzIHNlcXVlbmNlLCB0aGUgcmVtYWluaW5nIGRhdGEgaXMgYWRkZWQgYXMKLSAgIGEgc2VxdWVuY2Uga2V5ZWQgYnkgdGhlIHZhbHVlIG9mICpyZXN0a2V5Ki4gIElmIHRoZSByb3cgcmVhZCBoYXMgZmV3ZXIKLSAgIGZpZWxkcyB0aGFuIHRoZSBmaWVsZG5hbWVzIHNlcXVlbmNlLCB0aGUgcmVtYWluaW5nIGtleXMgdGFrZSB0aGUgdmFsdWUgb2YKLSAgIHRoZSBvcHRpb25hbCAqcmVzdHZhbCogcGFyYW1ldGVyLiAgQW55IG90aGVyIG9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzCi0gICBhcmUgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIDpjbGFzczpgcmVhZGVyYCBpbnN0YW5jZS4KKyAgIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBvcGVyYXRlcyBsaWtlIGEgcmVndWxhciByZWFkZXIgYnV0IG1hcHMgdGhlCisgICBpbmZvcm1hdGlvbiBpbiBlYWNoIHJvdyB0byBhbiA6bW9kOmBPcmRlcmVkRGljdCA8Y29sbGVjdGlvbnMuT3JkZXJlZERpY3Q+YAorICAgd2hvc2Uga2V5cyBhcmUgZ2l2ZW4gYnkgdGhlIG9wdGlvbmFsICpmaWVsZG5hbWVzKiBwYXJhbWV0ZXIuCisKKyAgIFRoZSAqZmllbGRuYW1lcyogcGFyYW1ldGVyIGlzIGEgOnRlcm06YHNlcXVlbmNlYC4gIElmICpmaWVsZG5hbWVzKiBpcworICAgb21pdHRlZCwgdGhlIHZhbHVlcyBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSAqY3N2ZmlsZSogd2lsbCBiZSB1c2VkIGFzIHRoZQorICAgZmllbGRuYW1lcy4gIFJlZ2FyZGxlc3Mgb2YgaG93IHRoZSBmaWVsZG5hbWVzIGFyZSBkZXRlcm1pbmVkLCB0aGUgb3JkZXJlZAorICAgZGljdGlvbmFyeSBwcmVzZXJ2ZXMgdGhlaXIgb3JpZ2luYWwgb3JkZXJpbmcuCisKKyAgIElmIGEgcm93IGhhcyBtb3JlIGZpZWxkcyB0aGFuIGZpZWxkbmFtZXMsIHRoZSByZW1haW5pbmcgZGF0YSBpcyBwdXQgaW4gYQorICAgbGlzdCBhbmQgc3RvcmVkIHdpdGggdGhlIGZpZWxkbmFtZSBzcGVjaWZpZWQgYnkgKnJlc3RrZXkqICh3aGljaCBkZWZhdWx0cworICAgdG8gYGBOb25lYGApLiAgSWYgYSBub24tYmxhbmsgcm93IGhhcyBmZXdlciBmaWVsZHMgdGhhbiBmaWVsZG5hbWVzLCB0aGUKKyAgIG1pc3NpbmcgdmFsdWVzIGFyZSBmaWxsZWQtaW4gd2l0aCBgYE5vbmVgYC4KKworICAgQWxsIG90aGVyIG9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIHVuZGVybHlpbmcKKyAgIDpjbGFzczpgcmVhZGVyYCBpbnN0YW5jZS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFJldHVybmVkIHJvd3MgYXJlIG5vdyBvZiB0eXBlIDpjbGFzczpgT3JkZXJlZERpY3RgLgogCiAgICBBIHNob3J0IHVzYWdlIGV4YW1wbGU6OgogCkBAIC0xNzAsOSArMTc3LDExIEBACiAgICAgICAgLi4uICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAuLi4gICAgICAgICBwcmludChyb3dbJ2ZpcnN0X25hbWUnXSwgcm93WydsYXN0X25hbWUnXSkKICAgICAgICAuLi4KLSAgICAgICBCYWtlZCBCZWFucwotICAgICAgIExvdmVseSBTcGFtCi0gICAgICAgV29uZGVyZnVsIFNwYW0KKyAgICAgICBFcmljIElkbGUKKyAgICAgICBKb2huIENsZWVzZQorCisgICAgICAgPj4+IHByaW50KHJvdykKKyAgICAgICBPcmRlcmVkRGljdChbKCdmaXJzdF9uYW1lJywgJ0pvaG4nKSwgKCdsYXN0X25hbWUnLCAnQ2xlZXNlJyldKQogCiAKIC4uIGNsYXNzOjogRGljdFdyaXRlcihjc3ZmaWxlLCBmaWVsZG5hbWVzLCByZXN0dmFsPScnLCBleHRyYXNhY3Rpb249J3JhaXNlJywgXApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3R5cGVzLnJzdCBiL0RvYy9saWJyYXJ5L2N0eXBlcy5yc3QKaW5kZXggYTY3NTc5MC4uMjg3MDk0MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3R5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jdHlwZXMucnN0CkBAIC0xMjM5LDkgKzEyMzksMTAgQEAKIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwgYW5kIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgogCiBUaGUgcHVycG9zZSBvZiB0aGUgOmZ1bmM6YGZpbmRfbGlicmFyeWAgZnVuY3Rpb24gaXMgdG8gbG9jYXRlIGEgbGlicmFyeSBpbiBhIHdheQotc2ltaWxhciB0byB3aGF0IHRoZSBjb21waWxlciBkb2VzIChvbiBwbGF0Zm9ybXMgd2l0aCBzZXZlcmFsIHZlcnNpb25zIG9mIGEKLXNoYXJlZCBsaWJyYXJ5IHRoZSBtb3N0IHJlY2VudCBzaG91bGQgYmUgbG9hZGVkKSwgd2hpbGUgdGhlIGN0eXBlcyBsaWJyYXJ5Ci1sb2FkZXJzIGFjdCBsaWtlIHdoZW4gYSBwcm9ncmFtIGlzIHJ1biwgYW5kIGNhbGwgdGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5Lgorc2ltaWxhciB0byB3aGF0IHRoZSBjb21waWxlciBvciBydW50aW1lIGxvYWRlciBkb2VzIChvbiBwbGF0Zm9ybXMgd2l0aCBzZXZlcmFsCit2ZXJzaW9ucyBvZiBhIHNoYXJlZCBsaWJyYXJ5IHRoZSBtb3N0IHJlY2VudCBzaG91bGQgYmUgbG9hZGVkKSwgd2hpbGUgdGhlIGN0eXBlcworbGlicmFyeSBsb2FkZXJzIGFjdCBsaWtlIHdoZW4gYSBwcm9ncmFtIGlzIHJ1biwgYW5kIGNhbGwgdGhlIHJ1bnRpbWUgbG9hZGVyCitkaXJlY3RseS4KIAogVGhlIDptb2Q6YGN0eXBlcy51dGlsYCBtb2R1bGUgcHJvdmlkZXMgYSBmdW5jdGlvbiB3aGljaCBjYW4gaGVscCB0byBkZXRlcm1pbmUKIHRoZSBsaWJyYXJ5IHRvIGxvYWQuCkBAIC0xMjU5LDggKzEyNjAsMTQgQEAKIFRoZSBleGFjdCBmdW5jdGlvbmFsaXR5IGlzIHN5c3RlbSBkZXBlbmRlbnQuCiAKIE9uIExpbnV4LCA6ZnVuYzpgZmluZF9saWJyYXJ5YCB0cmllcyB0byBydW4gZXh0ZXJuYWwgcHJvZ3JhbXMKLShgYC9zYmluL2xkY29uZmlnYGAsIGBgZ2NjYGAsIGFuZCBgYG9iamR1bXBgYCkgdG8gZmluZCB0aGUgbGlicmFyeSBmaWxlLiAgSXQKLXJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUuICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKKyhgYC9zYmluL2xkY29uZmlnYGAsIGBgZ2NjYGAsIGBgb2JqZHVtcGBgIGFuZCBgYGxkYGApIHRvIGZpbmQgdGhlIGxpYnJhcnkgZmlsZS4KK0l0IHJldHVybnMgdGhlIGZpbGVuYW1lIG9mIHRoZSBsaWJyYXJ5IGZpbGUuCisKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICBPbiBMaW51eCwgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgYExEX0xJQlJBUllfUEFUSGBgIGlzIHVzZWQKKyAgIHdoZW4gc2VhcmNoaW5nIGZvciBsaWJyYXJpZXMsIGlmIGEgbGlicmFyeSBjYW5ub3QgYmUgZm91bmQgYnkgYW55IG90aGVyIG1lYW5zLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKIAogICAgPj4+IGZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQogICAgPj4+IGZpbmRfbGlicmFyeSgibSIpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKaW5kZXggOTI1NGFlOC4uZWNhYWQwNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdApAQCAtNTIyLDcgKzUyMiw3IEBACiAKIEluc3RhbmNlIG1ldGhvZHM6CiAKLS4uIG1ldGhvZDo6IGRhdGUucmVwbGFjZSh5ZWFyLCBtb250aCwgZGF5KQorLi4gbWV0aG9kOjogZGF0ZS5yZXBsYWNlKHllYXI9c2VsZi55ZWFyLCBtb250aD1zZWxmLm1vbnRoLCBkYXk9c2VsZi5kYXkpCiAKICAgIFJldHVybiBhIGRhdGUgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgZXhjZXB0IGZvciB0aG9zZSBwYXJhbWV0ZXJzIGdpdmVuIG5ldwogICAgdmFsdWVzIGJ5IHdoaWNoZXZlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGlmIGBgZCA9PQpAQCAtNjEwLDcgKzYxMCw4IEBACiAuLiBtZXRob2Q6OiBkYXRlLl9fZm9ybWF0X18oZm9ybWF0KQogCiAgICBTYW1lIGFzIDptZXRoOmAuZGF0ZS5zdHJmdGltZWAuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGVgIG9iamVjdCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKKyAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRlYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtNjgyLDIyICs2ODMsMjYgQEAKIAogQ29uc3RydWN0b3I6CiAKLS4uIGNsYXNzOjogZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91cj0wLCBtaW51dGU9MCwgc2Vjb25kPTAsIG1pY3Jvc2Vjb25kPTAsIHR6aW5mbz1Ob25lKQorLi4gY2xhc3M6OiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCkKIAogICAgVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gICp0emluZm8qIG1heSBiZSBgYE5vbmVgYCwgb3IgYW4KICAgIGluc3RhbmNlIG9mIGEgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzLiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludGVnZXJzLAogICAgaW4gdGhlIGZvbGxvd2luZyByYW5nZXM6CiAKLSAgICogYGBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUmBgCi0gICAqIGBgMSA8PSBtb250aCA8PSAxMmBgCi0gICAqIGBgMSA8PSBkYXkgPD0gbnVtYmVyIG9mIGRheXMgaW4gdGhlIGdpdmVuIG1vbnRoIGFuZCB5ZWFyYGAKLSAgICogYGAwIDw9IGhvdXIgPCAyNGBgCi0gICAqIGBgMCA8PSBtaW51dGUgPCA2MGBgCi0gICAqIGBgMCA8PSBzZWNvbmQgPCA2MGBgCi0gICAqIGBgMCA8PSBtaWNyb3NlY29uZCA8IDEwMDAwMDBgYAorICAgKiBgYE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSYGAsCisgICAqIGBgMSA8PSBtb250aCA8PSAxMmBgLAorICAgKiBgYDEgPD0gZGF5IDw9IG51bWJlciBvZiBkYXlzIGluIHRoZSBnaXZlbiBtb250aCBhbmQgeWVhcmBgLAorICAgKiBgYDAgPD0gaG91ciA8IDI0YGAsCisgICAqIGBgMCA8PSBtaW51dGUgPCA2MGBgLAorICAgKiBgYDAgPD0gc2Vjb25kIDwgNjBgYCwKKyAgICogYGAwIDw9IG1pY3Jvc2Vjb25kIDwgMTAwMDAwMGBgLAorICAgKiBgYGZvbGQgaW4gWzAsIDFdYGAuCiAKICAgIElmIGFuIGFyZ3VtZW50IG91dHNpZGUgdGhvc2UgcmFuZ2VzIGlzIGdpdmVuLCA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQuCiAKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlIGBgZm9sZGBgIGFyZ3VtZW50LgorCiBPdGhlciBjb25zdHJ1Y3RvcnMsIGFsbCBjbGFzcyBtZXRob2RzOgogCiAuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLnRvZGF5KCkKQEAgLTc1Nyw2ICs3NjIsOCBAQAogICAgICAgaW5zdGVhZCBvZiA6ZXhjOmBWYWx1ZUVycm9yYCBvbiA6YzpmdW5jOmBsb2NhbHRpbWVgIG9yIDpjOmZ1bmM6YGdtdGltZWAKICAgICAgIGZhaWx1cmUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6bWV0aDpgZnJvbXRpbWVzdGFtcGAgbWF5IHJldHVybiBpbnN0YW5jZXMgd2l0aCA6YXR0cjpgLmZvbGRgIHNldCB0byAxLgogCiAuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodGltZXN0YW1wKQogCkBAIC03OTMsMTYgKzgwMCwyMyBAQAogICAgbWljcm9zZWNvbmQgb2YgdGhlIHJlc3VsdCBhcmUgYWxsIDAsIGFuZCA6YXR0cjpgLnR6aW5mb2AgaXMgYGBOb25lYGAuCiAKIAotLi4gY2xhc3NtZXRob2Q6OiBkYXRldGltZS5jb21iaW5lKGRhdGUsIHRpbWUpCisuLiBjbGFzc21ldGhvZDo6IGRhdGV0aW1lLmNvbWJpbmUoZGF0ZSwgdGltZSwgdHppbmZvPXNlbGYudHppbmZvKQogCiAgICBSZXR1cm4gYSBuZXcgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCB3aG9zZSBkYXRlIGNvbXBvbmVudHMgYXJlIGVxdWFsIHRvIHRoZQotICAgZ2l2ZW4gOmNsYXNzOmBkYXRlYCBvYmplY3QncywgYW5kIHdob3NlIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YC50emluZm9gCi0gICBhdHRyaWJ1dGVzIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gOmNsYXNzOmAudGltZWAgb2JqZWN0J3MuIEZvciBhbnkKLSAgIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqLAotICAgYGBkID09IGRhdGV0aW1lLmNvbWJpbmUoZC5kYXRlKCksIGQudGltZXR6KCkpYGAuICBJZiBkYXRlIGlzIGEKKyAgIGdpdmVuIDpjbGFzczpgZGF0ZWAgb2JqZWN0J3MsIGFuZCB3aG9zZSB0aW1lIGNvbXBvbmVudHMKKyAgIGFyZSBlcXVhbCB0byB0aGUgZ2l2ZW4gOmNsYXNzOmAudGltZWAgb2JqZWN0J3MuICBJZiB0aGUgKnR6aW5mbyoKKyAgIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBpdHMgdmFsdWUgaXMgdXNlZCB0byBzZXQgdGhlIDphdHRyOmAudHppbmZvYCBhdHRyaWJ1dGUKKyAgIG9mIHRoZSByZXN1bHQsIG90aGVyd2lzZSB0aGUgOmF0dHI6YH4udGltZS50emluZm9gIGF0dHJpYnV0ZSBvZiB0aGUgKnRpbWUqIGFyZ3VtZW50CisgICBpcyB1c2VkLgorCisgICBGb3IgYW55IDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgKmQqLAorICAgYGBkID09IGRhdGV0aW1lLmNvbWJpbmUoZC5kYXRlKCksIGQudGltZSgpLCBkLnR6aW5mbylgYC4gIElmIGRhdGUgaXMgYQogICAgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCwgaXRzIHRpbWUgY29tcG9uZW50cyBhbmQgOmF0dHI6YC50emluZm9gIGF0dHJpYnV0ZXMKICAgIGFyZSBpZ25vcmVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0emluZm8qIGFyZ3VtZW50LgorCiAKIC4uIGNsYXNzbWV0aG9kOjogZGF0ZXRpbWUuc3RycHRpbWUoZGF0ZV9zdHJpbmcsIGZvcm1hdCkKIApAQCAtODc4LDYgKzg5MiwxNiBAQAogICAgb3IgYGBOb25lYGAgaWYgbm9uZSB3YXMgcGFzc2VkLgogCiAKKy4uIGF0dHJpYnV0ZTo6IGRhdGV0aW1lLmZvbGQKKworICAgSW4gYGBbMCwgMV1gYC4gIFVzZWQgdG8gZGlzYW1iaWd1YXRlIHdhbGwgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuICAoQQorICAgcmVwZWF0ZWQgaW50ZXJ2YWwgb2NjdXJzIHdoZW4gY2xvY2tzIGFyZSByb2xsZWQgYmFjayBhdCB0aGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZworICAgdGltZSBvciB3aGVuIHRoZSBVVEMgb2Zmc2V0IGZvciB0aGUgY3VycmVudCB6b25lIGlzIGRlY3JlYXNlZCBmb3IgcG9saXRpY2FsIHJlYXNvbnMuKQorICAgVGhlIHZhbHVlIDAgKDEpIHJlcHJlc2VudHMgdGhlIGVhcmxpZXIgKGxhdGVyKSBvZiB0aGUgdHdvIG1vbWVudHMgd2l0aCB0aGUgc2FtZSB3YWxsCisgICB0aW1lIHJlcHJlc2VudGF0aW9uLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogU3VwcG9ydGVkIG9wZXJhdGlvbnM6CiAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC05NjYsMjMgKzk5MCwzNCBAQAogCiAuLiBtZXRob2Q6OiBkYXRldGltZS50aW1lKCkKIAotICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQgYW5kIG1pY3Jvc2Vjb25kLgorICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kIGFuZCBmb2xkLgogICAgOmF0dHI6YC50emluZm9gIGlzIGBgTm9uZWBgLiAgU2VlIGFsc28gbWV0aG9kIDptZXRoOmB0aW1ldHpgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhlIGZvbGQgdmFsdWUgaXMgY29waWVkIHRvIHRoZSByZXR1cm5lZCA6Y2xhc3M6YC50aW1lYCBvYmplY3QuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUudGltZXR6KCkKIAotICAgUmV0dXJuIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aXRoIHNhbWUgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCBhbmQKKyAgIFJldHVybiA6Y2xhc3M6YC50aW1lYCBvYmplY3Qgd2l0aCBzYW1lIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCwgYW5kCiAgICB0emluZm8gYXR0cmlidXRlcy4gIFNlZSBhbHNvIG1ldGhvZCA6bWV0aDpgdGltZWAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGUgZm9sZCB2YWx1ZSBpcyBjb3BpZWQgdG8gdGhlIHJldHVybmVkIDpjbGFzczpgLnRpbWVgIG9iamVjdC4KIAotLi4gbWV0aG9kOjogZGF0ZXRpbWUucmVwbGFjZShbeWVhclssIG1vbnRoWywgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV1dXV0pCisKKy4uIG1ldGhvZDo6IGRhdGV0aW1lLnJlcGxhY2UoeWVhcj1zZWxmLnllYXIsIG1vbnRoPXNlbGYubW9udGgsIGRheT1zZWxmLmRheSwgXAorICAgaG91cj1zZWxmLmhvdXIsIG1pbnV0ZT1zZWxmLm1pbnV0ZSwgc2Vjb25kPXNlbGYuc2Vjb25kLCBtaWNyb3NlY29uZD1zZWxmLm1pY3Jvc2Vjb25kLCBcCisgICB0emluZm89c2VsZi50emluZm8sICogZm9sZD0wKQogCiAgICBSZXR1cm4gYSBkYXRldGltZSB3aXRoIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIGV4Y2VwdCBmb3IgdGhvc2UgYXR0cmlidXRlcyBnaXZlbgogICAgbmV3IHZhbHVlcyBieSB3aGljaGV2ZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZC4gIE5vdGUgdGhhdAogICAgYGB0emluZm89Tm9uZWBgIGNhbiBiZSBzcGVjaWZpZWQgdG8gY3JlYXRlIGEgbmFpdmUgZGF0ZXRpbWUgZnJvbSBhbiBhd2FyZQogICAgZGF0ZXRpbWUgd2l0aCBubyBjb252ZXJzaW9uIG9mIGRhdGUgYW5kIHRpbWUgZGF0YS4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgYGBmb2xkYGAgYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuYXN0aW1lem9uZSh0ej1Ob25lKQogCkBAIC05OTEsMjMgKzEwMjYsMjAgQEAKICAgICpzZWxmKiwgYnV0IGluICp0eioncyBsb2NhbCB0aW1lLgogCiAgICBJZiBwcm92aWRlZCwgKnR6KiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgOmNsYXNzOmB0emluZm9gIHN1YmNsYXNzLCBhbmQgaXRzCi0gICA6bWV0aDpgdXRjb2Zmc2V0YCBhbmQgOm1ldGg6YGRzdGAgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYGBOb25lYGAuICAqc2VsZiogbXVzdAotICAgYmUgYXdhcmUgKGBgc2VsZi50emluZm9gYCBtdXN0IG5vdCBiZSBgYE5vbmVgYCwgYW5kIGBgc2VsZi51dGNvZmZzZXQoKWBgIG11c3QKLSAgIG5vdCByZXR1cm4gYGBOb25lYGApLgorICAgOm1ldGg6YHV0Y29mZnNldGAgYW5kIDptZXRoOmBkc3RgIG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGBgTm9uZWBgLiAgSWYgKnNlbGYqCisgICBpcyBuYWl2ZSAoYGBzZWxmLnR6aW5mbyBpcyBOb25lYGApLCBpdCBpcyBwcmVzdW1lZCB0byByZXByZXNlbnQgdGltZSBpbiB0aGUKKyAgIHN5c3RlbSB0aW1lem9uZS4KIAogICAgSWYgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIChvciB3aXRoIGBgdHo9Tm9uZWBgKSB0aGUgc3lzdGVtIGxvY2FsCi0gICB0aW1lem9uZSBpcyBhc3N1bWVkLiAgVGhlIGBgLnR6aW5mb2BgIGF0dHJpYnV0ZSBvZiB0aGUgY29udmVydGVkCisgICB0aW1lem9uZSBpcyBhc3N1bWVkIGZvciB0aGUgdGFyZ2V0IHRpbWV6b25lLiAgVGhlIGBgLnR6aW5mb2BgIGF0dHJpYnV0ZSBvZiB0aGUgY29udmVydGVkCiAgICBkYXRldGltZSBpbnN0YW5jZSB3aWxsIGJlIHNldCB0byBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YHRpbWV6b25lYAogICAgd2l0aCB0aGUgem9uZSBuYW1lIGFuZCBvZmZzZXQgb2J0YWluZWQgZnJvbSB0aGUgT1MuCiAKICAgIElmIGBgc2VsZi50emluZm9gYCBpcyAqdHoqLCBgYHNlbGYuYXN0aW1lem9uZSh0eilgYCBpcyBlcXVhbCB0byAqc2VsZio6ICBubwogICAgYWRqdXN0bWVudCBvZiBkYXRlIG9yIHRpbWUgZGF0YSBpcyBwZXJmb3JtZWQuIEVsc2UgdGhlIHJlc3VsdCBpcyBsb2NhbAotICAgdGltZSBpbiB0aW1lIHpvbmUgKnR6KiwgcmVwcmVzZW50aW5nIHRoZSBzYW1lIFVUQyB0aW1lIGFzICpzZWxmKjogIGFmdGVyCi0gICBgYGFzdHogPSBkdC5hc3RpbWV6b25lKHR6KWBgLCBgYGFzdHogLSBhc3R6LnV0Y29mZnNldCgpYGAgd2lsbCB1c3VhbGx5IGhhdmUKLSAgIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgZGF0YSBhcyBgYGR0IC0gZHQudXRjb2Zmc2V0KClgYC4gVGhlIGRpc2N1c3Npb24KLSAgIG9mIGNsYXNzIDpjbGFzczpgdHppbmZvYCBleHBsYWlucyB0aGUgY2FzZXMgYXQgRGF5bGlnaHQgU2F2aW5nIFRpbWUgdHJhbnNpdGlvbgotICAgYm91bmRhcmllcyB3aGVyZSB0aGlzIGNhbm5vdCBiZSBhY2hpZXZlZCAoYW4gaXNzdWUgb25seSBpZiAqdHoqIG1vZGVscyBib3RoCi0gICBzdGFuZGFyZCBhbmQgZGF5bGlnaHQgdGltZSkuCisgICB0aW1lIGluIHRoZSB0aW1lem9uZSAqdHoqLCByZXByZXNlbnRpbmcgdGhlIHNhbWUgVVRDIHRpbWUgYXMgKnNlbGYqOiAgYWZ0ZXIKKyAgIGBgYXN0eiA9IGR0LmFzdGltZXpvbmUodHopYGAsIGBgYXN0eiAtIGFzdHoudXRjb2Zmc2V0KClgYCB3aWxsIGhhdmUKKyAgIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgZGF0YSBhcyBgYGR0IC0gZHQudXRjb2Zmc2V0KClgYC4KIAogICAgSWYgeW91IG1lcmVseSB3YW50IHRvIGF0dGFjaCBhIHRpbWUgem9uZSBvYmplY3QgKnR6KiB0byBhIGRhdGV0aW1lICpkdCogd2l0aG91dAogICAgYWRqdXN0bWVudCBvZiBkYXRlIGFuZCB0aW1lIGRhdGEsIHVzZSBgYGR0LnJlcGxhY2UodHppbmZvPXR6KWBgLiAgSWYgeW91CkBAIC0xMDI5LDYgKzEwNjEsMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICAqdHoqIG5vdyBjYW4gYmUgb21pdHRlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSA6bWV0aDpgYXN0aW1lem9uZWAgbWV0aG9kIGNhbiBub3cgYmUgY2FsbGVkIG9uIG5haXZlIGluc3RhbmNlcyB0aGF0CisgICAgICBhcmUgcHJlc3VtZWQgdG8gcmVwcmVzZW50IHN5c3RlbSBsb2NhbCB0aW1lLgorCiAKIC4uIG1ldGhvZDo6IGRhdGV0aW1lLnV0Y29mZnNldCgpCiAKQEAgLTExMDUsNiArMTE0MSwxMCBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSA6bWV0aDpgdGltZXN0YW1wYCBtZXRob2QgdXNlcyB0aGUgOmF0dHI6YC5mb2xkYCBhdHRyaWJ1dGUgdG8KKyAgICAgIGRpc2FtYmlndWF0ZSB0aGUgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuCisKICAgIC4uIG5vdGU6OgogCiAgICAgICBUaGVyZSBpcyBubyBtZXRob2QgdG8gb2J0YWluIHRoZSBQT1NJWCB0aW1lc3RhbXAgZGlyZWN0bHkgZnJvbSBhCkBAIC0xMTM4LDcgKzExNzgsNyBAQAogICAgYGBzZWxmLmRhdGUoKS5pc29jYWxlbmRhcigpYGAuCiAKIAotLi4gbWV0aG9kOjogZGF0ZXRpbWUuaXNvZm9ybWF0KHNlcD0nVCcpCisuLiBtZXRob2Q6OiBkYXRldGltZS5pc29mb3JtYXQoc2VwPSdUJywgdGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwKICAgIFlZWVktTU0tRERUSEg6TU06U1MubW1tbW1tIG9yLCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCkBAIC0xMTU5LDYgKzExOTksMzcgQEAKICAgICAgID4+PiBkYXRldGltZSgyMDAyLCAxMiwgMjUsIHR6aW5mbz1UWigpKS5pc29mb3JtYXQoJyAnKQogICAgICAgJzIwMDItMTItMjUgMDA6MDA6MDAtMDY6MzknCiAKKyAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqdGltZXNwZWMqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgIGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSAodGhlIGRlZmF1bHQgaXMgYGAnYXV0bydgYCkuCisgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgIC0gYGAnYXV0bydgYDogU2FtZSBhcyBgYCdzZWNvbmRzJ2BgIGlmIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwKKyAgICAgc2FtZSBhcyBgYCdtaWNyb3NlY29uZHMnYGAgb3RoZXJ3aXNlLgorICAgLSBgYCdob3VycydgYDogSW5jbHVkZSB0aGUgOmF0dHI6YGhvdXJgIGluIHRoZSB0d28tZGlnaXQgSEggZm9ybWF0LgorICAgLSBgYCdtaW51dGVzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCBhbmQgOmF0dHI6YG1pbnV0ZWAgaW4gSEg6TU0gZm9ybWF0LgorICAgLSBgYCdzZWNvbmRzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCwgOmF0dHI6YG1pbnV0ZWAsIGFuZCA6YXR0cjpgc2Vjb25kYAorICAgICBpbiBISDpNTTpTUyBmb3JtYXQuCisgICAtIGBgJ21pbGxpc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUsIGJ1dCB0cnVuY2F0ZSBmcmFjdGlvbmFsIHNlY29uZAorICAgICBwYXJ0IHRvIG1pbGxpc2Vjb25kcy4gSEg6TU06U1Muc3NzIGZvcm1hdC4KKyAgIC0gYGAnbWljcm9zZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSBpbiBISDpNTTpTUy5tbW1tbW0gZm9ybWF0LgorCisgICAuLiBub3RlOjoKKworICAgICAgRXhjbHVkZWQgdGltZSBjb21wb25lbnRzIGFyZSB0cnVuY2F0ZWQsIG5vdCByb3VuZGVkLgorCisgICA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCBvbiBhbiBpbnZhbGlkICp0aW1lc3BlYyogYXJndW1lbnQuCisKKworICAgICAgPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisgICAgICA+Pj4gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJykKKyAgICAgICcyMDAyLTEyLTI1VDAwOjAwJworICAgICAgPj4+IGR0ID0gZGF0ZXRpbWUoMjAxNSwgMSwgMSwgMTIsIDMwLCA1OSwgMCkKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpCisgICAgICAnMjAxNS0wMS0wMVQxMjozMDo1OS4wMDAwMDAnCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0aW1lc3BlYyogYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuX19zdHJfXygpCiAKQEAgLTExODUsNyArMTI1Niw4IEBACiAuLiBtZXRob2Q6OiBkYXRldGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLmRhdGV0aW1lLnN0cmZ0aW1lYC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQorICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCiAgICBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlCiAgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKQEAgLTEzMDIsMTYgKzEzNzQsMTcgQEAKIEEgdGltZSBvYmplY3QgcmVwcmVzZW50cyBhIChsb2NhbCkgdGltZSBvZiBkYXksIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyCiBkYXksIGFuZCBzdWJqZWN0IHRvIGFkanVzdG1lbnQgdmlhIGEgOmNsYXNzOmB0emluZm9gIG9iamVjdC4KIAotLi4gY2xhc3M6OiB0aW1lKGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSkKKy4uIGNsYXNzOjogdGltZShob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCkKIAogICAgQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuICAqdHppbmZvKiBtYXkgYmUgYGBOb25lYGAsIG9yIGFuIGluc3RhbmNlIG9mIGEKICAgIDpjbGFzczpgdHppbmZvYCBzdWJjbGFzcy4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRlZ2VycywgaW4gdGhlCiAgICBmb2xsb3dpbmcgcmFuZ2VzOgogCi0gICAqIGBgMCA8PSBob3VyIDwgMjRgYAotICAgKiBgYDAgPD0gbWludXRlIDwgNjBgYAotICAgKiBgYDAgPD0gc2Vjb25kIDwgNjBgYAotICAgKiBgYDAgPD0gbWljcm9zZWNvbmQgPCAxMDAwMDAwYGAuCisgICAqIGBgMCA8PSBob3VyIDwgMjRgYCwKKyAgICogYGAwIDw9IG1pbnV0ZSA8IDYwYGAsCisgICAqIGBgMCA8PSBzZWNvbmQgPCA2MGBgLAorICAgKiBgYDAgPD0gbWljcm9zZWNvbmQgPCAxMDAwMDAwYGAsCisgICAqIGBgZm9sZCBpbiBbMCwgMV1gYC4KIAogICAgSWYgYW4gYXJndW1lbnQgb3V0c2lkZSB0aG9zZSByYW5nZXMgaXMgZ2l2ZW4sIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4gIEFsbAogICAgZGVmYXVsdCB0byBgYDBgYCBleGNlcHQgKnR6aW5mbyosIHdoaWNoIGRlZmF1bHRzIHRvIDpjb25zdDpgTm9uZWAuCkBAIC0xMzY0LDYgKzE0MzcsMTcgQEAKICAgIGBgTm9uZWBgIGlmIG5vbmUgd2FzIHBhc3NlZC4KIAogCisuLiBhdHRyaWJ1dGU6OiB0aW1lLmZvbGQKKworICAgSW4gYGBbMCwgMV1gYC4gIFVzZWQgdG8gZGlzYW1iaWd1YXRlIHdhbGwgdGltZXMgZHVyaW5nIGEgcmVwZWF0ZWQgaW50ZXJ2YWwuICAoQQorICAgcmVwZWF0ZWQgaW50ZXJ2YWwgb2NjdXJzIHdoZW4gY2xvY2tzIGFyZSByb2xsZWQgYmFjayBhdCB0aGUgZW5kIG9mIGRheWxpZ2h0IHNhdmluZworICAgdGltZSBvciB3aGVuIHRoZSBVVEMgb2Zmc2V0IGZvciB0aGUgY3VycmVudCB6b25lIGlzIGRlY3JlYXNlZCBmb3IgcG9saXRpY2FsIHJlYXNvbnMuKQorICAgVGhlIHZhbHVlIDAgKDEpIHJlcHJlc2VudHMgdGhlIGVhcmxpZXIgKGxhdGVyKSBvZiB0aGUgdHdvIG1vbWVudHMgd2l0aCB0aGUgc2FtZSB3YWxsCisgICB0aW1lIHJlcHJlc2VudGF0aW9uLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBTdXBwb3J0ZWQgb3BlcmF0aW9uczoKIAogKiBjb21wYXJpc29uIG9mIDpjbGFzczpgLnRpbWVgIHRvIDpjbGFzczpgLnRpbWVgLCB3aGVyZSAqYSogaXMgY29uc2lkZXJlZCBsZXNzCkBAIC0xMzk5LDIxICsxNDgzLDU4IEBACiAKIEluc3RhbmNlIG1ldGhvZHM6CiAKLS4uIG1ldGhvZDo6IHRpbWUucmVwbGFjZShbaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV0pCisuLiBtZXRob2Q6OiB0aW1lLnJlcGxhY2UoaG91cj1zZWxmLmhvdXIsIG1pbnV0ZT1zZWxmLm1pbnV0ZSwgc2Vjb25kPXNlbGYuc2Vjb25kLCBcCisgICBtaWNyb3NlY29uZD1zZWxmLm1pY3Jvc2Vjb25kLCB0emluZm89c2VsZi50emluZm8sICogZm9sZD0wKQogCiAgICBSZXR1cm4gYSA6Y2xhc3M6YC50aW1lYCB3aXRoIHRoZSBzYW1lIHZhbHVlLCBleGNlcHQgZm9yIHRob3NlIGF0dHJpYnV0ZXMgZ2l2ZW4KICAgIG5ldyB2YWx1ZXMgYnkgd2hpY2hldmVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQuICBOb3RlIHRoYXQKICAgIGBgdHppbmZvPU5vbmVgYCBjYW4gYmUgc3BlY2lmaWVkIHRvIGNyZWF0ZSBhIG5haXZlIDpjbGFzczpgLnRpbWVgIGZyb20gYW4KICAgIGF3YXJlIDpjbGFzczpgLnRpbWVgLCB3aXRob3V0IGNvbnZlcnNpb24gb2YgdGhlIHRpbWUgZGF0YS4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgYGBmb2xkYGAgYXJndW1lbnQuCiAKLS4uIG1ldGhvZDo6IHRpbWUuaXNvZm9ybWF0KCkKKworLi4gbWV0aG9kOjogdGltZS5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1MubW1tbW1tIG9yLCBpZgotICAgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUyBJZiA6bWV0aDpgdXRjb2Zmc2V0YCBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIGEKKyAgIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwgSEg6TU06U1MgSWYgOm1ldGg6YHV0Y29mZnNldGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCBhCiAgICA2LWNoYXJhY3RlciBzdHJpbmcgaXMgYXBwZW5kZWQsIGdpdmluZyB0aGUgVVRDIG9mZnNldCBpbiAoc2lnbmVkKSBob3VycyBhbmQKICAgIG1pbnV0ZXM6IEhIOk1NOlNTLm1tbW1tbStISDpNTSBvciwgaWYgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUytISDpNTQogCisgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKnRpbWVzcGVjKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUgKHRoZSBkZWZhdWx0IGlzIGBgJ2F1dG8nYGApLgorICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAtIGBgJ2F1dG8nYGA6IFNhbWUgYXMgYGAnc2Vjb25kcydgYCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCisgICAgIHNhbWUgYXMgYGAnbWljcm9zZWNvbmRzJ2BgIG90aGVyd2lzZS4KKyAgIC0gYGAnaG91cnMnYGA6IEluY2x1ZGUgdGhlIDphdHRyOmBob3VyYCBpbiB0aGUgdHdvLWRpZ2l0IEhIIGZvcm1hdC4KKyAgIC0gYGAnbWludXRlcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAgYW5kIDphdHRyOmBtaW51dGVgIGluIEhIOk1NIGZvcm1hdC4KKyAgIC0gYGAnc2Vjb25kcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAsIDphdHRyOmBtaW51dGVgLCBhbmQgOmF0dHI6YHNlY29uZGAKKyAgICAgaW4gSEg6TU06U1MgZm9ybWF0LgorICAgLSBgYCdtaWxsaXNlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lLCBidXQgdHJ1bmNhdGUgZnJhY3Rpb25hbCBzZWNvbmQKKyAgICAgcGFydCB0byBtaWxsaXNlY29uZHMuIEhIOk1NOlNTLnNzcyBmb3JtYXQuCisgICAtIGBgJ21pY3Jvc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUgaW4gSEg6TU06U1MubW1tbW1tIGZvcm1hdC4KKworICAgLi4gbm90ZTo6CisKKyAgICAgIEV4Y2x1ZGVkIHRpbWUgY29tcG9uZW50cyBhcmUgdHJ1bmNhdGVkLCBub3Qgcm91bmRlZC4KKworICAgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSByYWlzZWQgb24gYW4gaW52YWxpZCAqdGltZXNwZWMqIGFyZ3VtZW50LgorCisKKyAgICAgID4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lCisgICAgICA+Pj4gdGltZShob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MTIzNDU2KS5pc29mb3JtYXQodGltZXNwZWM9J21pbnV0ZXMnKQorICAgICAgJzEyOjM0JworICAgICAgPj4+IGR0ID0gdGltZShob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MCkKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpCisgICAgICAnMTI6MzQ6NTYuMDAwMDAwJworICAgICAgPj4+IGR0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpCisgICAgICAnMTI6MzQ6NTYnCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0aW1lc3BlYyogYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogdGltZS5fX3N0cl9fKCkKIApAQCAtMTQzMCw3ICsxNTUxLDggQEAKIC4uIG1ldGhvZDo6IHRpbWUuX19mb3JtYXRfXyhmb3JtYXQpCiAKICAgIFNhbWUgYXMgOm1ldGg6YC50aW1lLnN0cmZ0aW1lYC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgZm9ybWF0IHN0cmluZwotICAgZm9yIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKKyAgIGZvciBhIDpjbGFzczpgLnRpbWVgIG9iamVjdCBpbiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nCisgICBsaXRlcmFscyA8Zi1zdHJpbmdzPmAgYW5kIHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtMTY4MCw5ICsxODAyLDE5IEBACiBXaGVuIERTVCBzdGFydHMgKHRoZSAic3RhcnQiIGxpbmUpLCB0aGUgbG9jYWwgd2FsbCBjbG9jayBsZWFwcyBmcm9tIDE6NTkgdG8KIDM6MDAuICBBIHdhbGwgdGltZSBvZiB0aGUgZm9ybSAyOk1NIGRvZXNuJ3QgcmVhbGx5IG1ha2Ugc2Vuc2Ugb24gdGhhdCBkYXksIHNvCiBgYGFzdGltZXpvbmUoRWFzdGVybilgYCB3b24ndCBkZWxpdmVyIGEgcmVzdWx0IHdpdGggYGBob3VyID09IDJgYCBvbiB0aGUgZGF5IERTVAotYmVnaW5zLiAgSW4gb3JkZXIgZm9yIDptZXRoOmBhc3RpbWV6b25lYCB0byBtYWtlIHRoaXMgZ3VhcmFudGVlLCB0aGUKLTptZXRoOmB0emluZm8uZHN0YCBtZXRob2QgbXVzdCBjb25zaWRlciB0aW1lcyBpbiB0aGUgIm1pc3NpbmcgaG91ciIgKDI6TU0gZm9yCi1FYXN0ZXJuKSB0byBiZSBpbiBkYXlsaWdodCB0aW1lLgorYmVnaW5zLiAgRm9yIGV4YW1wbGUsIGF0IHRoZSBTcHJpbmcgZm9yd2FyZCB0cmFuc2l0aW9uIG9mIDIwMTYsIHdlIGdldAorCisgICAgPj4+IHUwID0gZGF0ZXRpbWUoMjAxNiwgMywgMTMsIDUsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDQpOgorICAgIC4uLiAgICAgdSA9IHUwICsgaSpIT1VSCisgICAgLi4uICAgICB0ID0gdS5hc3RpbWV6b25lKEVhc3Rlcm4pCisgICAgLi4uICAgICBwcmludCh1LnRpbWUoKSwgJ1VUQyA9JywgdC50aW1lKCksIHQudHpuYW1lKCkpCisgICAgLi4uCisgICAgMDU6MDA6MDAgVVRDID0gMDA6MDA6MDAgRVNUCisgICAgMDY6MDA6MDAgVVRDID0gMDE6MDA6MDAgRVNUCisgICAgMDc6MDA6MDAgVVRDID0gMDM6MDA6MDAgRURUCisgICAgMDg6MDA6MDAgVVRDID0gMDQ6MDA6MDAgRURUCisKIAogV2hlbiBEU1QgZW5kcyAodGhlICJlbmQiIGxpbmUpLCB0aGVyZSdzIGEgcG90ZW50aWFsbHkgd29yc2UgcHJvYmxlbTogdGhlcmUncyBhbgogaG91ciB0aGF0IGNhbid0IGJlIHNwZWxsZWQgdW5hbWJpZ3VvdXNseSBpbiBsb2NhbCB3YWxsIHRpbWU6IHRoZSBsYXN0IGhvdXIgb2YKQEAgLTE2OTEsMjggKzE4MjMsNDEgQEAKIHRvIDE6MDAgKHN0YW5kYXJkIHRpbWUpIGFnYWluLiBMb2NhbCB0aW1lcyBvZiB0aGUgZm9ybSAxOk1NIGFyZSBhbWJpZ3VvdXMuCiA6bWV0aDpgYXN0aW1lem9uZWAgbWltaWNzIHRoZSBsb2NhbCBjbG9jaydzIGJlaGF2aW9yIGJ5IG1hcHBpbmcgdHdvIGFkamFjZW50IFVUQwogaG91cnMgaW50byB0aGUgc2FtZSBsb2NhbCBob3VyIHRoZW4uICBJbiB0aGUgRWFzdGVybiBleGFtcGxlLCBVVEMgdGltZXMgb2YgdGhlCi1mb3JtIDU6TU0gYW5kIDY6TU0gYm90aCBtYXAgdG8gMTpNTSB3aGVuIGNvbnZlcnRlZCB0byBFYXN0ZXJuLiAgSW4gb3JkZXIgZm9yCi06bWV0aDpgYXN0aW1lem9uZWAgdG8gbWFrZSB0aGlzIGd1YXJhbnRlZSwgdGhlIDptZXRoOmB0emluZm8uZHN0YCBtZXRob2QgbXVzdAotY29uc2lkZXIgdGltZXMgaW4gdGhlICJyZXBlYXRlZCBob3VyIiB0byBiZSBpbiBzdGFuZGFyZCB0aW1lLiAgVGhpcyBpcyBlYXNpbHkKLWFycmFuZ2VkLCBhcyBpbiB0aGUgZXhhbXBsZSwgYnkgZXhwcmVzc2luZyBEU1Qgc3dpdGNoIHRpbWVzIGluIHRoZSB0aW1lIHpvbmUncwotc3RhbmRhcmQgbG9jYWwgdGltZS4KK2Zvcm0gNTpNTSBhbmQgNjpNTSBib3RoIG1hcCB0byAxOk1NIHdoZW4gY29udmVydGVkIHRvIEVhc3Rlcm4sIGJ1dCBlYXJsaWVyIHRpbWVzCitoYXZlIHRoZSA6YXR0cjpgfmRhdGV0aW1lLmZvbGRgIGF0dHJpYnV0ZSBzZXQgdG8gMCBhbmQgdGhlIGxhdGVyIHRpbWVzIGhhdmUgaXQgc2V0IHRvIDEuCitGb3IgZXhhbXBsZSwgYXQgdGhlIEZhbGwgYmFjayB0cmFuc2l0aW9uIG9mIDIwMTYsIHdlIGdldAogCi1BcHBsaWNhdGlvbnMgdGhhdCBjYW4ndCBiZWFyIHN1Y2ggYW1iaWd1aXRpZXMgc2hvdWxkIGF2b2lkIHVzaW5nIGh5YnJpZAorICAgID4+PiB1MCA9IGRhdGV0aW1lKDIwMTYsIDExLCA2LCA0LCB0emluZm89dGltZXpvbmUudXRjKQorICAgID4+PiBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAuLi4gICAgIHUgPSB1MCArIGkqSE9VUgorICAgIC4uLiAgICAgdCA9IHUuYXN0aW1lem9uZShFYXN0ZXJuKQorICAgIC4uLiAgICAgcHJpbnQodS50aW1lKCksICdVVEMgPScsIHQudGltZSgpLCB0LnR6bmFtZSgpLCB0LmZvbGQpCisgICAgLi4uCisgICAgMDQ6MDA6MDAgVVRDID0gMDA6MDA6MDAgRURUIDAKKyAgICAwNTowMDowMCBVVEMgPSAwMTowMDowMCBFRFQgMAorICAgIDA2OjAwOjAwIFVUQyA9IDAxOjAwOjAwIEVTVCAxCisgICAgMDc6MDA6MDAgVVRDID0gMDI6MDA6MDAgRVNUIDAKKworTm90ZSB0aGF0IHRoZSA6Y2xhc3M6YGRhdGV0aW1lYCBpbnN0YW5jZXMgdGhhdCBkaWZmZXIgb25seSBieSB0aGUgdmFsdWUgb2YgdGhlCis6YXR0cjpgfmRhdGV0aW1lLmZvbGRgIGF0dHJpYnV0ZSBhcmUgY29uc2lkZXJlZCBlcXVhbCBpbiBjb21wYXJpc29ucy4KKworQXBwbGljYXRpb25zIHRoYXQgY2FuJ3QgYmVhciB3YWxsLXRpbWUgYW1iaWd1aXRpZXMgc2hvdWxkIGV4cGxpY2l0bHkgY2hlY2sgdGhlCit2YWx1ZSBvZiB0aGUgOmF0dHI6YH5kYXRldGltZS5mb2xkYCBhdHRyaWJ1dGUgb3IgYXZvaWQgdXNpbmcgaHlicmlkCiA6Y2xhc3M6YHR6aW5mb2Agc3ViY2xhc3NlczsgdGhlcmUgYXJlIG5vIGFtYmlndWl0aWVzIHdoZW4gdXNpbmcgOmNsYXNzOmB0aW1lem9uZWAsCiBvciBhbnkgb3RoZXIgZml4ZWQtb2Zmc2V0IDpjbGFzczpgdHppbmZvYCBzdWJjbGFzcyAoc3VjaCBhcyBhIGNsYXNzIHJlcHJlc2VudGluZwogb25seSBFU1QgKGZpeGVkIG9mZnNldCAtNSBob3VycyksIG9yIG9ubHkgRURUIChmaXhlZCBvZmZzZXQgLTQgaG91cnMpKS4KIAogLi4gc2VlYWxzbzo6CiAKLSAgIGBweXR6IDxodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3B5dHovPmBfCisgICBgZGF0ZXR1aWwudHogPGh0dHBzOi8vZGF0ZXV0aWwucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL3R6Lmh0bWw+YF8KICAgICAgIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IGhhcyA6Y2xhc3M6YHRpbWV6b25lYCBjbGFzcyBmb3IgaGFuZGxpbmcgYXJiaXRyYXJ5CiAgICAgICBmaXhlZCBvZmZzZXRzIGZyb20gVVRDIGFuZCA6YXR0cjpgdGltZXpvbmUudXRjYCBhcyBVVEMgdGltZXpvbmUgaW5zdGFuY2UuCiAKLSAgICAgICpweXR6KiBsaWJyYXJ5IGJyaW5ncyB0aGUgKklBTkEgdGltZXpvbmUgZGF0YWJhc2UqIChhbHNvIGtub3duIGFzIHRoZQorICAgICAgKmRhdGV0dWlsLnR6KiBsaWJyYXJ5IGJyaW5ncyB0aGUgKklBTkEgdGltZXpvbmUgZGF0YWJhc2UqIChhbHNvIGtub3duIGFzIHRoZQogICAgICAgT2xzb24gZGF0YWJhc2UpIHRvIFB5dGhvbiBhbmQgaXRzIHVzYWdlIGlzIHJlY29tbWVuZGVkLgogCiAgICBgSUFOQSB0aW1lem9uZSBkYXRhYmFzZSA8aHR0cHM6Ly93d3cuaWFuYS5vcmcvdGltZS16b25lcz5gXwotICAgICAgVGhlIFRpbWUgWm9uZSBEYXRhYmFzZSAob2Z0ZW4gY2FsbGVkIHR6IG9yIHpvbmVpbmZvKSBjb250YWlucyBjb2RlIGFuZAorICAgICAgVGhlIFRpbWUgWm9uZSBEYXRhYmFzZSAob2Z0ZW4gY2FsbGVkIHR6LCB0emRhdGEgb3Igem9uZWluZm8pIGNvbnRhaW5zIGNvZGUgYW5kCiAgICAgICBkYXRhIHRoYXQgcmVwcmVzZW50IHRoZSBoaXN0b3J5IG9mIGxvY2FsIHRpbWUgZm9yIG1hbnkgcmVwcmVzZW50YXRpdmUKICAgICAgIGxvY2F0aW9ucyBhcm91bmQgdGhlIGdsb2JlLiBJdCBpcyB1cGRhdGVkIHBlcmlvZGljYWxseSB0byByZWZsZWN0IGNoYW5nZXMKICAgICAgIG1hZGUgYnkgcG9saXRpY2FsIGJvZGllcyB0byB0aW1lIHpvbmUgYm91bmRhcmllcywgVVRDIG9mZnNldHMsIGFuZApAQCAtMTczMiw3ICsxODc3LDcgQEAKIG1hZGUgdG8gY2l2aWwgdGltZS4KIAogCi0uLiBjbGFzczo6IHRpbWV6b25lKG9mZnNldFssIG5hbWVdKQorLi4gY2xhc3M6OiB0aW1lem9uZShvZmZzZXQsIG5hbWU9Tm9uZSkKIAogICBUaGUgKm9mZnNldCogYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSA6Y2xhc3M6YHRpbWVkZWx0YWAKICAgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb2NhbCB0aW1lIGFuZCBVVEMuICBJdCBtdXN0CkBAIC0xNzQxLDEwICsxODg2LDcgQEAKICAgb3RoZXJ3aXNlIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KIAogICBUaGUgKm5hbWUqIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkIGl0IG11c3QgYmUgYSBzdHJpbmcgdGhhdAotICBpcyB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYGB0em5hbWUoZHQpYGAgbWV0aG9kLiAgT3RoZXJ3aXNlLAotICBgYHR6bmFtZShkdClgYCByZXR1cm5zIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKLSAgYGBvZmZzZXQubWludXRlc2BgIHJlc3BlY3RpdmVseS4KKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGRhdGV0aW1lLnR6bmFtZWAgbWV0aG9kLgogCiAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCkBAIC0xNzU3LDExICsxODk5LDE5IEBACiAKIC4uIG1ldGhvZDo6IHRpbWV6b25lLnR6bmFtZShkdCkKIAotICBSZXR1cm4gdGhlIGZpeGVkIHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YHRpbWV6b25lYCBpbnN0YW5jZSBpcwotICBjb25zdHJ1Y3RlZCBvciBhIHN0cmluZyAnVVRDc0hIOk1NJywgd2hlcmUgcyBpcyB0aGUgc2lnbiBvZgotICAqb2Zmc2V0KiwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCisgIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlCisgIGlzIGNvbnN0cnVjdGVkLiAgSWYgKm5hbWUqIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZQorICBuYW1lIHJldHVybmVkIGJ5IGBgdHpuYW1lKGR0KWBgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUKKyAgYGBvZmZzZXRgYCBhcyBmb2xsb3dzLiAgSWYgKm9mZnNldCogaXMgYGB0aW1lZGVsdGEoMClgYCwgdGhlIG5hbWUKKyAgaXMgIlVUQyIsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZyAnVVRDwrFISDpNTScsIHdoZXJlIMKxIGlzIHRoZSBzaWduCisgIG9mIGBgb2Zmc2V0YGAsIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAogICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgogCisgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgIE5hbWUgZ2VuZXJhdGVkIGZyb20gYGBvZmZzZXQ9dGltZWRlbHRhKDApYGAgaXMgbm93IHBsYWluICdVVEMnLCBub3QKKyAgICAgJ1VUQyswMDowMCcuCisKKwogLi4gbWV0aG9kOjogdGltZXpvbmUuZHN0KGR0KQogCiAgIEFsd2F5cyByZXR1cm5zIGBgTm9uZWBgLgpAQCAtMTkxMSw2ICsyMDYxLDM0IEBACiB8IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiAKK1NldmVyYWwgYWRkaXRpb25hbCBkaXJlY3RpdmVzIG5vdCByZXF1aXJlZCBieSB0aGUgQzg5IHN0YW5kYXJkIGFyZSBpbmNsdWRlZCBmb3IKK2NvbnZlbmllbmNlLiBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBjb3JyZXNwb25kIHRvIElTTyA4NjAxIGRhdGUgdmFsdWVzLiBUaGVzZQorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyB3aGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cmZ0aW1lYAorbWV0aG9kLiBUaGUgSVNPIDg2MDEgeWVhciBhbmQgSVNPIDg2MDEgd2VlayBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlCit3aXRoIHRoZSB5ZWFyIGFuZCB3ZWVrIG51bWJlciBkaXJlY3RpdmVzIGFib3ZlLiBDYWxsaW5nIDptZXRoOmBzdHJwdGltZWAgd2l0aAoraW5jb21wbGV0ZSBvciBhbWJpZ3VvdXMgSVNPIDg2MDEgZGlyZWN0aXZlcyB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuCisKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgRGlyZWN0aXZlIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICB8IE5vdGVzIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PSsKK3wgYGAlR2BgICAgIHwgSVNPIDg2MDEgeWVhciB3aXRoIGNlbnR1cnkgICAgIHwgMDAwMSwgMDAwMiwgLi4uLCAyMDEzLCB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgcmVwcmVzZW50aW5nIHRoZSB5ZWFyIHRoYXQgICAgIHwgMjAxNCwgLi4uLCA5OTk4LCA5OTk5ICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgY29udGFpbnMgdGhlIGdyZWF0ZXIgcGFydCBvZiAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIElTTyB3ZWVrIChgYCVWYGApLiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAldWBgICAgIHwgSVNPIDg2MDEgd2Vla2RheSBhcyBhIGRlY2ltYWwgIHwgMSwgMiwgLi4uLCA3ICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdoZXJlIDEgaXMgTW9uZGF5LiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAlVmBgICAgIHwgSVNPIDg2MDEgd2VlayBhcyBhIGRlY2ltYWwgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdpdGggTW9uZGF5IGFzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgV2VlayAwMSBpcyB0aGUgd2VlayBjb250YWluaW5nIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgSmFuIDQuICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgIHdlcmUgYWRkZWQuCisKIE5vdGVzOgogCiAoMSkKQEAgLTE5NzUsNyArMjE1MywxNCBAQAogCiAoNykKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgYGAlVWBgIGFuZCBgYCVXYGAgYXJlIG9ubHkgdXNlZAotICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlIHNwZWNpZmllZC4KKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBjYWxlbmRhciB5ZWFyIChgYCVZYGApCisgICBhcmUgc3BlY2lmaWVkLgorCisoOCkKKyAgIFNpbWlsYXIgdG8gYGAlVWBgIGFuZCBgYCVXYGAsIGBgJVZgYCBpcyBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlCisgICBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBJU08geWVhciAoYGAlR2BgKSBhcmUgc3BlY2lmaWVkIGluIGEKKyAgIDptZXRoOmBzdHJwdGltZWAgZm9ybWF0IHN0cmluZy4gQWxzbyBub3RlIHRoYXQgYGAlR2BgIGFuZCBgYCVZYGAgYXJlIG5vdAorICAgaW50ZXJjaGFuZ2VhYmxlLgogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2RibS5yc3QKaW5kZXggMmExZGI5MS4uMzJlODBiMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYm0ucnN0CkBAIC0zNTEsNiArMzUxLDEwIEBACiAgICAgICA6ZnVuYzpgLm9wZW5gIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGRhdGFiYXNlIHdoZW4gdGhlIGZsYWcgaGFzIHRoZSB2YWx1ZQogICAgICAgYGAnbidgYC4KIAorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgQ3JlYXRpbmcgZGF0YWJhc2UgaW4gYGAncidgYCBhbmQgYGAndydgYCBtb2Rlcy4gIE1vZGlmeWluZyBkYXRhYmFzZSBpbgorICAgICAgYGAncidgYCBtb2RlLgorCiAgICBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUKICAgIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nYCBjbGFzcywgOmNsYXNzOmBkdW1iZGJtYCBvYmplY3RzCiAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0IGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKaW5kZXggYjVjZTBiMS4uZWU3NDZlOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKQEAgLTQ0Nyw2ICs0NDcsMTkgQEAKICAgICAgIGBgRGVjaW1hbCgnMzIxZSs1JykuYWRqdXN0ZWQoKWBgIHJldHVybnMgc2V2ZW4uICBVc2VkIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IHdpdGggcmVzcGVjdCB0byB0aGUgZGVjaW1hbCBwb2ludC4KIAorICAgLi4gbWV0aG9kOjogYXNfaW50ZWdlcl9yYXRpbygpCisKKyAgICAgIFJldHVybiBhIHBhaXIgYGAobiwgZClgYCBvZiBpbnRlZ2VycyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4KKyAgICAgIDpjbGFzczpgRGVjaW1hbGAgaW5zdGFuY2UgYXMgYSBmcmFjdGlvbiwgaW4gbG93ZXN0IHRlcm1zIGFuZAorICAgICAgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yOjoKKworICAgICAgICAgID4+PiBEZWNpbWFsKCctMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICgtMTU3LCA1MCkKKworICAgICAgVGhlIGNvbnZlcnNpb24gaXMgZXhhY3QuICBSYWlzZSBPdmVyZmxvd0Vycm9yIG9uIGluZmluaXRpZXMgYW5kIFZhbHVlRXJyb3IKKyAgICAgIG9uIE5hTnMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAgICAuLiBtZXRob2Q6OiBhc190dXBsZSgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QgYi9Eb2MvbGlicmFyeS9kaXMucnN0CmluZGV4IGQyZDhhYzcuLmI3NGRmMGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGlzLnJzdApAQCAtMzEsOSArMzEsOSBAQAogCiAgICA+Pj4gZGlzLmRpcyhteWZ1bmMpCiAgICAgIDIgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKGxlbikKLSAgICAgICAgICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCi0gICAgICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgOSBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgICAgMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCisgICAgICAgICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgNiBSRVRVUk5fVkFMVUUKIAogKFRoZSAiMiIgaXMgYSBsaW5lIG51bWJlcikuCiAKQEAgLTY4Miw4ICs2ODIsNyBAQAogICAgLi4gWFhYIGV4cGxhaW4gdGhlIFdIWSBzdHVmZiEKIAogCi1BbGwgb2YgdGhlIGZvbGxvd2luZyBvcGNvZGVzIGV4cGVjdCBhcmd1bWVudHMuICBBbiBhcmd1bWVudCBpcyB0d28gYnl0ZXMsIHdpdGgKLXRoZSBtb3JlIHNpZ25pZmljYW50IGJ5dGUgbGFzdC4KK0FsbCBvZiB0aGUgZm9sbG93aW5nIG9wY29kZXMgdXNlIHRoZWlyIGFyZ3VtZW50cy4KIAogLi4gb3Bjb2RlOjogU1RPUkVfTkFNRSAobmFtZWkpCiAKQEAgLTc2OSw2ICs3NjgsMjMgQEAKICAgIHRvIGhvbGQgKmNvdW50KiBlbnRyaWVzLgogCiAKKy4uIG9wY29kZTo6IEJVSUxEX0NPTlNUX0tFWV9NQVAgKGNvdW50KQorCisgICBUaGUgdmVyc2lvbiBvZiA6b3Bjb2RlOmBCVUlMRF9NQVBgIHNwZWNpYWxpemVkIGZvciBjb25zdGFudCBrZXlzLiAgKmNvdW50KgorICAgdmFsdWVzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBzdGFjay4gIFRoZSB0b3AgZWxlbWVudCBvbiB0aGUgc3RhY2sgY29udGFpbnMKKyAgIGEgdHVwbGUgb2Yga2V5cy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gb3Bjb2RlOjogQlVJTERfU1RSSU5HIChjb3VudCkKKworICAgQ29uY2F0ZW5hdGVzICpjb3VudCogc3RyaW5ncyBmcm9tIHRoZSBzdGFjayBhbmQgcHVzaGVzIHRoZSByZXN1bHRpbmcgc3RyaW5nCisgICBvbnRvIHRoZSBzdGFjay4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gb3Bjb2RlOjogTE9BRF9BVFRSIChuYW1laSkKIAogICAgUmVwbGFjZXMgVE9TIHdpdGggYGBnZXRhdHRyKFRPUywgY29fbmFtZXNbbmFtZWldKWBgLgpAQCAtOTI5LDI3ICs5NDUsMTYgQEAKIC4uIG9wY29kZTo6IE1BS0VfRlVOQ1RJT04gKGFyZ2MpCiAKICAgIFB1c2hlcyBhIG5ldyBmdW5jdGlvbiBvYmplY3Qgb24gdGhlIHN0YWNrLiAgRnJvbSBib3R0b20gdG8gdG9wLCB0aGUgY29uc3VtZWQKLSAgIHN0YWNrIG11c3QgY29uc2lzdCBvZgorICAgc3RhY2sgbXVzdCBjb25zaXN0IG9mIHZhbHVlcyBpZiB0aGUgYXJndW1lbnQgY2FycmllcyBhIHNwZWNpZmllZCBmbGFnIHZhbHVlCiAKLSAgICogYGBhcmdjICYgMHhGRmBgIGRlZmF1bHQgYXJndW1lbnQgb2JqZWN0cyBpbiBwb3NpdGlvbmFsIG9yZGVyCi0gICAqIGBgKGFyZ2MgPj4gOCkgJiAweEZGYGAgcGFpcnMgb2YgbmFtZSBhbmQgZGVmYXVsdCBhcmd1bWVudCwgd2l0aCB0aGUgbmFtZQotICAgICBqdXN0IGJlbG93IHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrLCBmb3Iga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMKLSAgICogYGAoYXJnYyA+PiAxNikgJiAweDdGRkZgYCBwYXJhbWV0ZXIgYW5ub3RhdGlvbiBvYmplY3RzCi0gICAqIGEgdHVwbGUgbGlzdGluZyB0aGUgcGFyYW1ldGVyIG5hbWVzIGZvciB0aGUgYW5ub3RhdGlvbnMgKG9ubHkgaWYgdGhlcmUgYXJlCi0gICAgIG9ueSBhbm5vdGF0aW9uIG9iamVjdHMpCisgICAqIGBgMHgwMWBgIGEgdHVwbGUgb2YgZGVmYXVsdCBhcmd1bWVudCBvYmplY3RzIGluIHBvc2l0aW9uYWwgb3JkZXIKKyAgICogYGAweDAyYGAgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzJyBkZWZhdWx0IHZhbHVlcworICAgKiBgYDB4MDRgYCBhbiBhbm5vdGF0aW9uIGRpY3Rpb25hcnkKKyAgICogYGAweDA4YGAgYSB0dXBsZSBjb250YWluaW5nIGNlbGxzIGZvciBmcmVlIHZhcmlhYmxlcywgbWFraW5nIGEgY2xvc3VyZQogICAgKiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIChhdCBUT1MxKQogICAgKiB0aGUgOnRlcm06YHF1YWxpZmllZCBuYW1lYCBvZiB0aGUgZnVuY3Rpb24gKGF0IFRPUykKIAogCi0uLiBvcGNvZGU6OiBNQUtFX0NMT1NVUkUgKGFyZ2MpCi0KLSAgIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LCBzZXRzIGl0cyAqX19jbG9zdXJlX18qIHNsb3QsIGFuZCBwdXNoZXMgaXQgb24KLSAgIHRoZSBzdGFjay4gIFRPUyBpcyB0aGUgOnRlcm06YHF1YWxpZmllZCBuYW1lYCBvZiB0aGUgZnVuY3Rpb24sIFRPUzEgaXMgdGhlCi0gICBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24sIGFuZCBUT1MyIGlzIHRoZSB0dXBsZSBjb250YWluaW5nIGNlbGxzIGZvcgotICAgdGhlIGNsb3N1cmUncyBmcmVlIHZhcmlhYmxlcy4gICphcmdjKiBpcyBpbnRlcnByZXRlZCBhcyBpbiBgYE1BS0VfRlVOQ1RJT05gYDsKLSAgIHRoZSBhbm5vdGF0aW9ucyBhbmQgZGVmYXVsdHMgYXJlIGFsc28gaW4gdGhlIHNhbWUgb3JkZXIgYmVsb3cgVE9TMi4KLQotCiAuLiBvcGNvZGU6OiBCVUlMRF9TTElDRSAoYXJnYykKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiBzbGljZQpAQCAtOTg5LDYgKzk5NCwyOCBAQAogICAgYXJndW1lbnRzLgogCiAKKy4uIG9wY29kZTo6IEZPUk1BVF9WQUxVRSAoZmxhZ3MpCisKKyAgIFVzZWQgZm9yIGltcGxlbWVudGluZyBmb3JtYXR0ZWQgbGl0ZXJhbCBzdHJpbmdzIChmLXN0cmluZ3MpLiAgUG9wcworICAgYW4gb3B0aW9uYWwgKmZtdF9zcGVjKiBmcm9tIHRoZSBzdGFjaywgdGhlbiBhIHJlcXVpcmVkICp2YWx1ZSouCisgICAqZmxhZ3MqIGlzIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisKKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAwYGA6ICp2YWx1ZSogaXMgZm9ybWF0dGVkIGFzLWlzLgorICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDFgYDogY2FsbCA6ZnVuYzpgc3RyYCBvbiAqdmFsdWUqIGJlZm9yZQorICAgICBmb3JtYXR0aW5nIGl0LgorICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDJgYDogY2FsbCA6ZnVuYzpgcmVwcmAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAzYGA6IGNhbGwgOmZ1bmM6YGFzY2lpYCBvbiAqdmFsdWUqIGJlZm9yZQorICAgICBmb3JtYXR0aW5nIGl0LgorICAgKiBgYChmbGFncyAmIDB4MDQpID09IDB4MDRgYDogcG9wICpmbXRfc3BlYyogZnJvbSB0aGUgc3RhY2sgYW5kIHVzZQorICAgICBpdCwgZWxzZSB1c2UgYW4gZW1wdHkgKmZtdF9zcGVjKi4KKworICAgRm9ybWF0dGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgOmM6ZnVuYzpgUHlPYmplY3RfRm9ybWF0YC4gIFRoZQorICAgcmVzdWx0IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIC4uIG9wY29kZTo6IEhBVkVfQVJHVU1FTlQKIAogICAgVGhpcyBpcyBub3QgcmVhbGx5IGFuIG9wY29kZS4gIEl0IGlkZW50aWZpZXMgdGhlIGRpdmlkaW5nIGxpbmUgYmV0d2VlbgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW1haWwuY29udGVudG1hbmFnZXIucnN0IGIvRG9jL2xpYnJhcnkvZW1haWwuY29udGVudG1hbmFnZXIucnN0CmluZGV4IGMyNWQwNzMuLmE5YzA3OGIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VtYWlsLmNvbnRlbnRtYW5hZ2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbWFpbC5jb250ZW50bWFuYWdlci5yc3QKQEAgLTQzMyw1ICs0MzMsNSBAQAogCiAgICAgICAgSWYgKmhlYWRlcnMqIGlzIHNwZWNpZmllZCBhbmQgaXMgYSBsaXN0IG9mIHN0cmluZ3Mgb2YgdGhlIGZvcm0KICAgICAgICBgYGhlYWRlcm5hbWU6IGhlYWRlcnZhbHVlYGAgb3IgYSBsaXN0IG9mIGBgaGVhZGVyYGAgb2JqZWN0cwotICAgICAgIChkaXN0aW5ndWlzZWQgZnJvbSBzdHJpbmdzIGJ5IGhhdmluZyBhIGBgbmFtZWBgIGF0dHJpYnV0ZSksIGFkZCB0aGUKKyAgICAgICAoZGlzdGluZ3Vpc2hlZCBmcm9tIHN0cmluZ3MgYnkgaGF2aW5nIGEgYGBuYW1lYGAgYXR0cmlidXRlKSwgYWRkIHRoZQogICAgICAgIGhlYWRlcnMgdG8gKm1zZyouCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9lbnVtLnJzdCBiL0RvYy9saWJyYXJ5L2VudW0ucnN0CmluZGV4IGEzZDVhZmMuLmZmYzg1ZmUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2VudW0ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2VudW0ucnN0CkBAIC0yMyw5ICsyMyw5IEBACiBNb2R1bGUgQ29udGVudHMKIC0tLS0tLS0tLS0tLS0tLQogCi1UaGlzIG1vZHVsZSBkZWZpbmVzIHR3byBlbnVtZXJhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHVuaXF1ZQotc2V0cyBvZiBuYW1lcyBhbmQgdmFsdWVzOiA6Y2xhc3M6YEVudW1gIGFuZCA6Y2xhc3M6YEludEVudW1gLiAgSXQgYWxzbyBkZWZpbmVzCi1vbmUgZGVjb3JhdG9yLCA6ZnVuYzpgdW5pcXVlYC4KK1RoaXMgbW9kdWxlIGRlZmluZXMgZm91ciBlbnVtZXJhdGlvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHVuaXF1ZQorc2V0cyBvZiBuYW1lcyBhbmQgdmFsdWVzOiA6Y2xhc3M6YEVudW1gLCA6Y2xhc3M6YEludEVudW1gLCBhbmQKKzpjbGFzczpgSW50RmxhZ3NgLiAgSXQgYWxzbyBkZWZpbmVzIG9uZSBkZWNvcmF0b3IsIDpmdW5jOmB1bmlxdWVgLgogCiAuLiBjbGFzczo6IEVudW0KIApAQCAtMzcsMTAgKzM3LDIzIEBACiAgICAgQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgZW51bWVyYXRlZCBjb25zdGFudHMgdGhhdCBhcmUgYWxzbwogICAgIHN1YmNsYXNzZXMgb2YgOmNsYXNzOmBpbnRgLgogCisuLiBjbGFzczo6IEludEZsYWcKKworICAgIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGVudW1lcmF0ZWQgY29uc3RhbnRzIHRoYXQgY2FuIGJlIGNvbWJpbmVkIHVzaW5nCisgICAgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzIHdpdGhvdXQgbG9zaW5nIHRoZWlyIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVyc2hpcC4KKyAgICA6Y2xhc3M6YEludEZsYWdgIG1lbWJlcnMgYXJlIGFsc28gc3ViY2xhc3NlcyBvZiA6Y2xhc3M6YGludGAuCisKKy4uIGNsYXNzOjogRmxhZworCisgICAgQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgZW51bWVyYXRlZCBjb25zdGFudHMgdGhhdCBjYW4gYmUgY29tYmluZWQgdXNpbmcKKyAgICB0aGUgYml0d2lzZSBvcGVyYXRpb25zIHdpdGhvdXQgbG9zaW5nIHRoZWlyIDpjbGFzczpgRmxhZ2AgbWVtYmVyc2hpcC4KKwogLi4gZnVuY3Rpb246OiB1bmlxdWUKIAogICAgIEVudW0gY2xhc3MgZGVjb3JhdG9yIHRoYXQgZW5zdXJlcyBvbmx5IG9uZSBuYW1lIGlzIGJvdW5kIHRvIGFueSBvbmUgdmFsdWUuCiAKKy4uIHZlcnNpb25hZGRlZDo6IDMuNiAgYGBGbGFnYGAsIGBgSW50RmxhZ2BgCisKIAogQ3JlYXRpbmcgYW4gRW51bQogLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjU3LDcgKzI3MCw3IEBACiAgICAgPj4+IENvbG9yLnJlZCA8IENvbG9yLmJsdWUKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgotICAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IENvbG9yKCkgPCBDb2xvcigpCisgICAgVHlwZUVycm9yOiAnPCcgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnQ29sb3InIGFuZCAnQ29sb3InCiAKIEVxdWFsaXR5IGNvbXBhcmlzb25zIGFyZSBkZWZpbmVkIHRob3VnaDo6CiAKQEAgLTQ3OCw3ICs0OTEsNyBAQAogSW50RW51bQogXl5eXl5eXgogCi1BIHZhcmlhdGlvbiBvZiA6Y2xhc3M6YEVudW1gIGlzIHByb3ZpZGVkIHdoaWNoIGlzIGFsc28gYSBzdWJjbGFzcyBvZgorVGhlIGZpcnN0IHZhcmlhdGlvbiBvZiA6Y2xhc3M6YEVudW1gIHRoYXQgaXMgcHJvdmlkZWQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mCiA6Y2xhc3M6YGludGAuICBNZW1iZXJzIG9mIGFuIDpjbGFzczpgSW50RW51bWAgY2FuIGJlIGNvbXBhcmVkIHRvIGludGVnZXJzOwogYnkgZXh0ZW5zaW9uLCBpbnRlZ2VyIGVudW1lcmF0aW9ucyBvZiBkaWZmZXJlbnQgdHlwZXMgY2FuIGFsc28gYmUgY29tcGFyZWQKIHRvIGVhY2ggb3RoZXI6OgpAQCAtNTIxLDEzICs1MzQsMTIxIEBACiAgICAgPj4+IFtpIGZvciBpIGluIHJhbmdlKFNoYXBlLnNxdWFyZSldCiAgICAgWzAsIDFdCiAKLUZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb2RlLCA6Y2xhc3M6YEVudW1gIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkLAotc2luY2UgOmNsYXNzOmBJbnRFbnVtYCBicmVha3Mgc29tZSBzZW1hbnRpYyBwcm9taXNlcyBvZiBhbiBlbnVtZXJhdGlvbiAoYnkKLWJlaW5nIGNvbXBhcmFibGUgdG8gaW50ZWdlcnMsIGFuZCB0aHVzIGJ5IHRyYW5zaXRpdml0eSB0byBvdGhlcgotdW5yZWxhdGVkIGVudW1lcmF0aW9ucykuICBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IGluIHNwZWNpYWwgY2FzZXMgd2hlcmUKLXRoZXJlJ3Mgbm8gb3RoZXIgY2hvaWNlOyBmb3IgZXhhbXBsZSwgd2hlbiBpbnRlZ2VyIGNvbnN0YW50cyBhcmUKLXJlcGxhY2VkIHdpdGggZW51bWVyYXRpb25zIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZCB3aXRoIGNvZGUKLXRoYXQgc3RpbGwgZXhwZWN0cyBpbnRlZ2Vycy4KKworSW50RmxhZworXl5eXl5eXgorCitUaGUgbmV4dCB2YXJpYXRpb24gb2YgOmNsYXNzOmBFbnVtYCBwcm92aWRlZCwgOmNsYXNzOmBJbnRGbGFnYCwgaXMgYWxzbyBiYXNlZAorb24gOmNsYXNzOmBpbnRgLiAgVGhlIGRpZmZlcmVuY2UgYmVpbmcgOmNsYXNzOmBJbnRGbGFnYCBtZW1iZXJzIGNhbiBiZSBjb21iaW5lZAordXNpbmcgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzICgmLCBcfCwgXiwgfikgYW5kIHRoZSByZXN1bHQgaXMgc3RpbGwgYW4KKzpjbGFzczpgSW50RmxhZ2AgbWVtYmVyLiAgSG93ZXZlciwgYXMgdGhlIG5hbWUgaW1wbGllcywgOmNsYXNzOmBJbnRGbGFnYAorbWVtYmVycyBhbHNvIHN1YmNsYXNzIDpjbGFzczpgaW50YCBhbmQgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgYW4gOmNsYXNzOmBpbnRgIGlzLgorQW55IG9wZXJhdGlvbiBvbiBhbiA6Y2xhc3M6YEludEZsYWdgIG1lbWJlciBiZXNpZGVzIHRoZSBiaXQtd2lzZSBvcGVyYXRpb25zCit3aWxsIGxvc2UgdGhlIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVyc2hpcC4KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK1NhbXBsZSA6Y2xhc3M6YEludEZsYWdgIGNsYXNzOjoKKworICAgID4+PiBmcm9tIGVudW0gaW1wb3J0IEludEZsYWcKKyAgICA+Pj4gY2xhc3MgUGVybShJbnRGbGFnKToKKyAgICAuLi4gICAgIFIgPSA0CisgICAgLi4uICAgICBXID0gMgorICAgIC4uLiAgICAgWCA9IDEKKyAgICAuLi4KKyAgICA+Pj4gUGVybS5SIHwgUGVybS5XCisgICAgPFBlcm0uUnxXOiA2PgorICAgID4+PiBQZXJtLlIgKyBQZXJtLlcKKyAgICA2CisgICAgPj4+IFJXID0gUGVybS5SIHwgUGVybS5XCisgICAgPj4+IFBlcm0uUiBpbiBSVworICAgIFRydWUKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBuYW1lIHRoZSBjb21iaW5hdGlvbnM6OgorCisgICAgPj4+IGNsYXNzIFBlcm0oSW50RmxhZyk6CisgICAgLi4uICAgICBSID0gNAorICAgIC4uLiAgICAgVyA9IDIKKyAgICAuLi4gICAgIFggPSAxCisgICAgLi4uICAgICBSV1ggPSA3CisgICAgPj4+IFBlcm0uUldYCisgICAgPFBlcm0uUldYOiA3PgorICAgID4+PiB+UGVybS5SV1gKKyAgICA8UGVybS4tODogLTg+CisKK0Fub3RoZXIgaW1wb3J0YW50IGRpZmZlcmVuY2UgYmV0d2VlbiA6Y2xhc3M6YEludEZsYWdgIGFuZCA6Y2xhc3M6YEVudW1gIGlzIHRoYXQKK2lmIG5vIGZsYWdzIGFyZSBzZXQgKHRoZSB2YWx1ZSBpcyAwKSwgaXRzIGJvb2xlYW4gZXZhbHVhdGlvbiBpcyA6ZGF0YTpgRmFsc2VgOjoKKworICAgID4+PiBQZXJtLlIgJiBQZXJtLlgKKyAgICA8UGVybS4wOiAwPgorICAgID4+PiBib29sKFBlcm0uUiAmIFBlcm0uWCkKKyAgICBGYWxzZQorCitCZWNhdXNlIDpjbGFzczpgSW50RmxhZ2AgbWVtYmVycyBhcmUgYWxzbyBzdWJjbGFzc2VzIG9mIDpjbGFzczpgaW50YCB0aGV5IGNhbgorYmUgY29tYmluZWQgd2l0aCB0aGVtOjoKKworICAgID4+PiBQZXJtLlggfCA4CisgICAgPFBlcm0uOHxYOiA5PgorCisKK0ZsYWcKK15eXl4KKworVGhlIGxhc3QgdmFyaWF0aW9uIGlzIDpjbGFzczpgRmxhZ2AuICBMaWtlIDpjbGFzczpgSW50RmxhZ2AsIDpjbGFzczpgRmxhZ2AKK21lbWJlcnMgY2FuIGJlIGNvbWJpbmVkIHVzaW5nIHRoZSBiaXR3aXNlIG9wZXJhdG9ycyAoJiwgXHwsIF4sIH4pLiAgVW5saWtlCis6Y2xhc3M6YEludEZsYWdgLCB0aGV5IGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoLCBub3IgY29tcGFyZWQgYWdhaW5zdCwgYW55CitvdGhlciA6Y2xhc3M6YEZsYWdgIGVudW1lcmF0aW9uLCBub3IgOmNsYXNzOmBpbnRgLgorCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworTGlrZSA6Y2xhc3M6YEludEZsYWdgLCBpZiBhIGNvbWJpbmF0aW9uIG9mIDpjbGFzczpgRmxhZ2AgbWVtYmVycyByZXN1bHRzIGluIG5vCitmbGFncyBiZWluZyBzZXQsIHRoZSBib29sZWFuIGV2YWx1YXRpb24gaXMgOmRhdGE6YEZhbHNlYDo6CisKKyAgICA+Pj4gZnJvbSBlbnVtIGltcG9ydCBGbGFnCisgICAgPj4+IGNsYXNzIENvbG9yKEZsYWcpOgorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLgorICAgID4+PiBDb2xvci5yZWQgJiBDb2xvci5ncmVlbgorICAgIDxDb2xvci4wOiAwPgorICAgID4+PiBib29sKENvbG9yLnJlZCAmIENvbG9yLmdyZWVuKQorICAgIEZhbHNlCisKK0luZGl2aWR1YWwgZmxhZ3Mgc2hvdWxkIGhhdmUgdmFsdWVzIHRoYXQgYXJlIHBvd2VycyBvZiB0d28gKDEsIDIsIDQsIDgsIC4uLiksCit3aGlsZSBjb21iaW5hdGlvbnMgb2YgZmxhZ3Mgd29uJ3Q6OgorCisgICAgPj4+IGNsYXNzIENvbG9yKEZsYWcpOgorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLiAgICAgd2hpdGUgPSA3CisgICAgLi4uICAgICAjIG9yCisgICAgLi4uICAgICAjIHdoaXRlID0gcmVkIHwgYmx1ZSB8IGdyZWVuCisKK0dpdmluZyBhIG5hbWUgdG8gdGhlICJubyBmbGFncyBzZXQiIGNvbmRpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaXRzIGJvb2xlYW4KK3ZhbHVlOjoKKworICAgID4+PiBjbGFzcyBDb2xvcihGbGFnKToKKyAgICAuLi4gICAgIGJsYWNrID0gMAorICAgIC4uLiAgICAgcmVkID0gMQorICAgIC4uLiAgICAgYmx1ZSA9IDIKKyAgICAuLi4gICAgIGdyZWVuID0gNAorICAgIC4uLgorICAgID4+PiBDb2xvci5ibGFjaworICAgIDxDb2xvci5ibGFjazogMD4KKyAgICA+Pj4gYm9vbChDb2xvci5ibGFjaykKKyAgICBGYWxzZQorCisuLiBub3RlOjoKKworICAgIEZvciB0aGUgbWFqb3JpdHkgb2YgbmV3IGNvZGUsIDpjbGFzczpgRW51bWAgYW5kIDpjbGFzczpgRmxhZ2AgYXJlIHN0cm9uZ2x5CisgICAgcmVjb21tZW5kZWQsIHNpbmNlIDpjbGFzczpgSW50RW51bWAgYW5kIDpjbGFzczpgSW50RmxhZ2AgYnJlYWsgc29tZQorICAgIHNlbWFudGljIHByb21pc2VzIG9mIGFuIGVudW1lcmF0aW9uIChieSBiZWluZyBjb21wYXJhYmxlIHRvIGludGVnZXJzLCBhbmQKKyAgICB0aHVzIGJ5IHRyYW5zaXRpdml0eSB0byBvdGhlciB1bnJlbGF0ZWQgZW51bWVyYXRpb25zKS4gIDpjbGFzczpgSW50RW51bWAKKyAgICBhbmQgOmNsYXNzOmBJbnRGbGFnYCBzaG91bGQgYmUgdXNlZCBvbmx5IGluIGNhc2VzIHdoZXJlIDpjbGFzczpgRW51bWAgYW5kCisgICAgOmNsYXNzOmBGbGFnYCB3aWxsIG5vdCBkbzsgZm9yIGV4YW1wbGUsIHdoZW4gaW50ZWdlciBjb25zdGFudHMgYXJlIHJlcGxhY2VkCisgICAgd2l0aCBlbnVtZXJhdGlvbnMsIG9yIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgc3lzdGVtcy4KIAogCiBPdGhlcnMKQEAgLTU1OCw3ICs2NzksOCBAQAogNC4gJS1zdHlsZSBmb3JtYXR0aW5nOiAgYCVzYCBhbmQgYCVyYCBjYWxsIHRoZSA6Y2xhc3M6YEVudW1gIGNsYXNzJ3MKICAgIDptZXRoOmBfX3N0cl9fYCBhbmQgOm1ldGg6YF9fcmVwcl9fYCByZXNwZWN0aXZlbHk7IG90aGVyIGNvZGVzIChzdWNoIGFzCiAgICBgJWlgIG9yIGAlaGAgZm9yIEludEVudW0pIHRyZWF0IHRoZSBlbnVtIG1lbWJlciBhcyBpdHMgbWl4ZWQtaW4gdHlwZS4KLTUuIDptZXRoOmBzdHIuZm9ybWF0YCAob3IgOmZ1bmM6YGZvcm1hdGApIHdpbGwgdXNlIHRoZSBtaXhlZC1pbgorNS4gOnJlZjpgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIDptZXRoOmBzdHIuZm9ybWF0YCwKKyAgIGFuZCA6ZnVuYzpgZm9ybWF0YCB3aWxsIHVzZSB0aGUgbWl4ZWQtaW4KICAgIHR5cGUncyA6bWV0aDpgX19mb3JtYXRfX2AuICBJZiB0aGUgOmNsYXNzOmBFbnVtYCBjbGFzcydzIDpmdW5jOmBzdHJgIG9yCiAgICA6ZnVuYzpgcmVwcmAgaXMgZGVzaXJlZCwgdXNlIHRoZSBgIXNgIG9yIGAhcmAgZm9ybWF0IGNvZGVzLgogCkBAIC01NjYsMTAgKzY4OCwxMCBAQAogSW50ZXJlc3RpbmcgZXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoaWxlIDpjbGFzczpgRW51bWAgYW5kIDpjbGFzczpgSW50RW51bWAgYXJlIGV4cGVjdGVkIHRvIGNvdmVyIHRoZSBtYWpvcml0eSBvZgotdXNlLWNhc2VzLCB0aGV5IGNhbm5vdCBjb3ZlciB0aGVtIGFsbC4gIEhlcmUgYXJlIHJlY2lwZXMgZm9yIHNvbWUgZGlmZmVyZW50Ci10eXBlcyBvZiBlbnVtZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBkaXJlY3RseSwgb3IgYXMgZXhhbXBsZXMgZm9yIGNyZWF0aW5nCi1vbmUncyBvd24uCitXaGlsZSA6Y2xhc3M6YEVudW1gLCA6Y2xhc3M6YEludEVudW1gLCA6Y2xhc3M6YEludEZsYWdgLCBhbmQgOmNsYXNzOmBGbGFnYCBhcmUKK2V4cGVjdGVkIHRvIGNvdmVyIHRoZSBtYWpvcml0eSBvZiB1c2UtY2FzZXMsIHRoZXkgY2Fubm90IGNvdmVyIHRoZW0gYWxsLiAgSGVyZQorYXJlIHJlY2lwZXMgZm9yIHNvbWUgZGlmZmVyZW50IHR5cGVzIG9mIGVudW1lcmF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5LAorb3IgYXMgZXhhbXBsZXMgZm9yIGNyZWF0aW5nIG9uZSdzIG93bi4KIAogCiBBdXRvTnVtYmVyCkBAIC03MzAsMTAgKzg1Miw1NiBAQAogRmluZXIgUG9pbnRzCiBeXl5eXl5eXl5eXl4KIAorU3VwcG9ydGVkIGBgX19kdW5kZXJfX2BgIG5hbWVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworOmF0dHI6YF9fbWVtYmVyc19fYCBpcyBhbiA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvZiBgYG1lbWJlcl9uYW1lYGA6YGBtZW1iZXJgYAoraXRlbXMuICBJdCBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY2xhc3MuCisKKzptZXRoOmBfX25ld19fYCwgaWYgc3BlY2lmaWVkLCBtdXN0IGNyZWF0ZSBhbmQgcmV0dXJuIHRoZSBlbnVtIG1lbWJlcnM7IGl0IGlzCithbHNvIGEgdmVyeSBnb29kIGlkZWEgdG8gc2V0IHRoZSBtZW1iZXIncyA6YXR0cjpgX3ZhbHVlX2AgYXBwcm9wcmlhdGVseS4gIE9uY2UKK2FsbCB0aGUgbWVtYmVycyBhcmUgY3JlYXRlZCBpdCBpcyBubyBsb25nZXIgdXNlZC4KKworCitTdXBwb3J0ZWQgYGBfc3VuZGVyX2BgIG5hbWVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKy0gYGBfbmFtZV9gYCAtLSBuYW1lIG9mIHRoZSBtZW1iZXIKKy0gYGBfdmFsdWVfYGAgLS0gdmFsdWUgb2YgdGhlIG1lbWJlcjsgY2FuIGJlIHNldCAvIG1vZGlmaWVkIGluIGBgX19uZXdfX2BgCisKKy0gYGBfbWlzc2luZ19gYCAtLSBhIGxvb2t1cCBmdW5jdGlvbiB1c2VkIHdoZW4gYSB2YWx1ZSBpcyBub3QgZm91bmQ7IG1heSBiZQorICBvdmVycmlkZGVuCistIGBgX29yZGVyX2BgIC0tIHVzZWQgaW4gUHl0aG9uIDIvMyBjb2RlIHRvIGVuc3VyZSBtZW1iZXIgb3JkZXIgaXMgY29uc2lzdGVudAorICAoY2xhc3MgYXR0cmlidXRlLCByZW1vdmVkIGR1cmluZyBjbGFzcyBjcmVhdGlvbikKKworLi4gdmVyc2lvbmFkZGVkOjogMy42IGBgX21pc3NpbmdfYGAsIGBgX29yZGVyX2BgCisKK1RvIGhlbHAga2VlcCBQeXRob24gMiAvIFB5dGhvbiAzIGNvZGUgaW4gc3luYyBhbiA6YXR0cjpgX29yZGVyX2AgYXR0cmlidXRlIGNhbgorYmUgcHJvdmlkZWQuICBJdCB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgYWN0dWFsIG9yZGVyIG9mIHRoZSBlbnVtZXJhdGlvbgorYW5kIHJhaXNlIGFuIGVycm9yIGlmIHRoZSB0d28gZG8gbm90IG1hdGNoOjoKKworICAgID4+PiBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAuLi4gICAgIF9vcmRlcl8gPSAncmVkIGdyZWVuIGJsdWUnCisgICAgLi4uICAgICByZWQgPSAxCisgICAgLi4uICAgICBibHVlID0gMworICAgIC4uLiAgICAgZ3JlZW4gPSAyCisgICAgLi4uCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFR5cGVFcnJvcjogbWVtYmVyIG9yZGVyIGRvZXMgbm90IG1hdGNoIF9vcmRlcl8KKworLi4gbm90ZTo6CisKKyAgICBJbiBQeXRob24gMiBjb2RlIHRoZSA6YXR0cjpgX29yZGVyX2AgYXR0cmlidXRlIGlzIG5lY2Vzc2FyeSBhcyBkZWZpbml0aW9uCisgICAgb3JkZXIgaXMgbG9zdCBiZWZvcmUgaXQgY2FuIGJlIHJlY29yZGVkLgorCitgYEVudW1gYCBtZW1iZXIgdHlwZQorfn5+fn5+fn5+fn5+fn5+fn5+fn4KKwogOmNsYXNzOmBFbnVtYCBtZW1iZXJzIGFyZSBpbnN0YW5jZXMgb2YgYW4gOmNsYXNzOmBFbnVtYCBjbGFzcywgYW5kIGV2ZW4KIHRob3VnaCB0aGV5IGFyZSBhY2Nlc3NpYmxlIGFzIGBFbnVtQ2xhc3MubWVtYmVyYCwgdGhleSBzaG91bGQgbm90IGJlIGFjY2Vzc2VkCiBkaXJlY3RseSBmcm9tIHRoZSBtZW1iZXIgYXMgdGhhdCBsb29rdXAgbWF5IGZhaWwgb3IsIHdvcnNlLCByZXR1cm4gc29tZXRoaW5nCi1iZXNpZGVzIHRoZSA6Y2xhc3M6YEVudW1gIG1lbWJlciB5b3UgbG9va2luZyBmb3I6OgorYmVzaWRlcyB0aGUgYGBFbnVtYGAgbWVtYmVyIHlvdSBsb29raW5nIGZvcjo6CiAKICAgICA+Pj4gY2xhc3MgRmllbGRUeXBlcyhFbnVtKToKICAgICAuLi4gICAgIG5hbWUgPSAwCkBAIC03NDcsNyArOTE1LDI0IEBACiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAKLVRoZSA6YXR0cjpgX19tZW1iZXJzX19gIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY2xhc3MuCisKK0Jvb2xlYW4gdmFsdWUgb2YgYGBFbnVtYGAgY2xhc3NlcyBhbmQgbWVtYmVycworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2BgRW51bWBgIG1lbWJlcnMgdGhhdCBhcmUgbWl4ZWQgd2l0aCBub24tRW51bSB0eXBlcyAoc3VjaCBhcworOmNsYXNzOmBpbnRgLCA6Y2xhc3M6YHN0cmAsIGV0Yy4pIGFyZSBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBtaXhlZC1pbgordHlwZSdzIHJ1bGVzOyBvdGhlcndpc2UsIGFsbCBtZW1iZXJzIGV2YWx1YXRlIGFzIDpkYXRhOmBUcnVlYC4gIFRvIG1ha2UgeW91ciBvd24KK0VudW0ncyBib29sZWFuIGV2YWx1YXRpb24gZGVwZW5kIG9uIHRoZSBtZW1iZXIncyB2YWx1ZSBhZGQgdGhlIGZvbGxvd2luZyB0bworeW91ciBjbGFzczo6CisKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYudmFsdWUpCisKK2BgRW51bWBgIGNsYXNzZXMgYWx3YXlzIGV2YWx1YXRlIGFzIDpkYXRhOmBUcnVlYC4KKworCitgYEVudW1gYCBjbGFzc2VzIHdpdGggbWV0aG9kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogSWYgeW91IGdpdmUgeW91ciA6Y2xhc3M6YEVudW1gIHN1YmNsYXNzIGV4dHJhIG1ldGhvZHMsIGxpa2UgdGhlIGBQbGFuZXRgXwogY2xhc3MgYWJvdmUsIHRob3NlIG1ldGhvZHMgd2lsbCBzaG93IHVwIGluIGEgOmZ1bmM6YGRpcmAgb2YgdGhlIG1lbWJlciwKQEAgLTc1OCwxMSArOTQzLDMgQEAKICAgICA+Pj4gZGlyKFBsYW5ldC5FQVJUSCkKICAgICBbJ19fY2xhc3NfXycsICdfX2RvY19fJywgJ19fbW9kdWxlX18nLCAnbmFtZScsICdzdXJmYWNlX2dyYXZpdHknLCAndmFsdWUnXQogCi1UaGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB3aWxsIG9ubHkgYmUgdXNlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZQotOmNsYXNzOmBFbnVtYCBtZW1iZXJzIC0tIGFmdGVyIHRoYXQgaXQgaXMgcmVwbGFjZWQuICBBbnkgY3VzdG9tIDptZXRoOmBfX25ld19fYAotbWV0aG9kIG11c3QgY3JlYXRlIHRoZSBvYmplY3QgYW5kIHNldCB0aGUgOmF0dHI6YF92YWx1ZV9gIGF0dHJpYnV0ZQotYXBwcm9wcmlhdGVseS4KLQotSWYgeW91IHdpc2ggdG8gY2hhbmdlIGhvdyA6Y2xhc3M6YEVudW1gIG1lbWJlcnMgYXJlIGxvb2tlZCB1cCB5b3Ugc2hvdWxkIGVpdGhlcgotd3JpdGUgYSBoZWxwZXIgZnVuY3Rpb24gb3IgYSA6ZnVuYzpgY2xhc3NtZXRob2RgIGZvciB0aGUgOmNsYXNzOmBFbnVtYAotc3ViY2xhc3MuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9leGNlcHRpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CmluZGV4IDVhNzE5MzMuLjE3NDdlZmUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2V4Y2VwdGlvbnMucnN0CkBAIC0yMjgsOSArMjI4LDIxIEBACiAuLiBleGNlcHRpb246OiBOb3RJbXBsZW1lbnRlZEVycm9yCiAKICAgIFRoaXMgZXhjZXB0aW9uIGlzIGRlcml2ZWQgZnJvbSA6ZXhjOmBSdW50aW1lRXJyb3JgLiAgSW4gdXNlciBkZWZpbmVkIGJhc2UKLSAgIGNsYXNzZXMsIGFic3RyYWN0IG1ldGhvZHMgc2hvdWxkIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHdoZW4gdGhleSByZXF1aXJlIGRlcml2ZWQKLSAgIGNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZC4KKyAgIGNsYXNzZXMsIGFic3RyYWN0IG1ldGhvZHMgc2hvdWxkIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHdoZW4gdGhleSByZXF1aXJlCisgICBkZXJpdmVkIGNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlIG1ldGhvZCwgb3Igd2hpbGUgdGhlIGNsYXNzIGlzIGJlaW5nCisgICBkZXZlbG9wZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbiBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZC4KIAorICAgLi4gbm90ZTo6CisKKyAgICAgIEl0IHNob3VsZCBub3QgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGVyIG9yIG1ldGhvZCBpcyBub3QKKyAgICAgIG1lYW50IHRvIGJlIHN1cHBvcnRlZCBhdCBhbGwgLS0gaW4gdGhhdCBjYXNlIGVpdGhlciBsZWF2ZSB0aGUgb3BlcmF0b3IgLworICAgICAgbWV0aG9kIHVuZGVmaW5lZCBvciwgaWYgYSBzdWJjbGFzcywgc2V0IGl0IHRvIDpkYXRhOmBOb25lYC4KKworICAgLi4gbm90ZTo6CisKKyAgICAgIGBgTm90SW1wbGVtZW50ZWRFcnJvcmBgIGFuZCBgYE5vdEltcGxlbWVudGVkYGAgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUsCisgICAgICBldmVuIHRob3VnaCB0aGV5IGhhdmUgc2ltaWxhciBuYW1lcyBhbmQgcHVycG9zZXMuICBTZWUKKyAgICAgIDpkYXRhOmBOb3RJbXBsZW1lbnRlZGAgZm9yIGRldGFpbHMgb24gd2hlbiB0byB1c2UgaXQuCiAKIC4uIGV4Y2VwdGlvbjo6IE9TRXJyb3IoW2FyZ10pCiAgICAgICAgICAgICAgICBPU0Vycm9yKGVycm5vLCBzdHJlcnJvclssIGZpbGVuYW1lWywgd2luZXJyb3JbLCBmaWxlbmFtZTJdXV0pCkBAIC00MzYsNiArNDQ4LDE1IEBACiAgICBSYWlzZWQgd2hlbiBhbiBvcGVyYXRpb24gb3IgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBhbiBvYmplY3Qgb2YgaW5hcHByb3ByaWF0ZQogICAgdHlwZS4gIFRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIGEgc3RyaW5nIGdpdmluZyBkZXRhaWxzIGFib3V0IHRoZSB0eXBlIG1pc21hdGNoLgogCisgICBUaGlzIGV4Y2VwdGlvbiBtYXkgYmUgcmFpc2VkIGJ5IHVzZXIgY29kZSB0byBpbmRpY2F0ZSB0aGF0IGFuIGF0dGVtcHRlZAorICAgb3BlcmF0aW9uIG9uIGFuIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgaXMgbm90IG1lYW50IHRvIGJlLiBJZiBhbiBvYmplY3QKKyAgIGlzIG1lYW50IHRvIHN1cHBvcnQgYSBnaXZlbiBvcGVyYXRpb24gYnV0IGhhcyBub3QgeWV0IHByb3ZpZGVkIGFuCisgICBpbXBsZW1lbnRhdGlvbiwgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAgaXMgdGhlIHByb3BlciBleGNlcHRpb24gdG8gcmFpc2UuCisKKyAgIFBhc3NpbmcgYXJndW1lbnRzIG9mIHRoZSB3cm9uZyB0eXBlIChlLmcuIHBhc3NpbmcgYSA6Y2xhc3M6YGxpc3RgIHdoZW4gYW4KKyAgIDpjbGFzczpgaW50YCBpcyBleHBlY3RlZCkgc2hvdWxkIHJlc3VsdCBpbiBhIDpleGM6YFR5cGVFcnJvcmAsIGJ1dCBwYXNzaW5nCisgICBhcmd1bWVudHMgd2l0aCB0aGUgd3JvbmcgdmFsdWUgKGUuZy4gYSBudW1iZXIgb3V0c2lkZSBleHBlY3RlZCBib3VuZGFyaWVzKQorICAgc2hvdWxkIHJlc3VsdCBpbiBhIDpleGM6YFZhbHVlRXJyb3JgLgogCiAuLiBleGNlcHRpb246OiBVbmJvdW5kTG9jYWxFcnJvcgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0IGIvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdAppbmRleCBkZWVkZWExLi5kMGM0Y2QwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QKQEAgLTcwLDYgKzcwLDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZpbGUgZGVzY3JpcHRvciB0byB0aGlzIGZ1bmN0aW9uLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgT24gV2luZG93cywgYSBoYW5kbGVyIGZvciBXaW5kb3dzIGV4Y2VwdGlvbiBpcyBhbHNvIGluc3RhbGxlZC4KKwogLi4gZnVuY3Rpb246OiBkaXNhYmxlKCkKIAogICAgRGlzYWJsZSB0aGUgZmF1bHQgaGFuZGxlcjogdW5pbnN0YWxsIHRoZSBzaWduYWwgaGFuZGxlcnMgaW5zdGFsbGVkIGJ5CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0IGIvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdAppbmRleCBhYTRjNTI5Li41ODgxZmVmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKQEAgLTcyLDkgKzcyLDggQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCiAgICAgICBDYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlci4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUuMgotICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCi0KKyAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNiAzLjgKKyAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyLgogCiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB1c2UgdGhlIGdsb2JhbCBzdGF0ZSBjcmVhdGVkIGJ5IDpmdW5jOmBmaWxlaW5wdXQuaW5wdXRgOwogaWYgdGhlcmUgaXMgbm8gYWN0aXZlIHN0YXRlLCA6ZXhjOmBSdW50aW1lRXJyb3JgIGlzIHJhaXNlZC4KQEAgLTE2Nyw4ICsxNjYsOCBAQAogICAgLi4gZGVwcmVjYXRlZDo6IDMuNAogICAgICAgVGhlIGBgJ3JVJ2BgIGFuZCBgYCdVJ2BgIG1vZGVzLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4yCi0gICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KKyAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNiAzLjgKKyAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyLgogCiAKICoqT3B0aW9uYWwgaW4tcGxhY2UgZmlsdGVyaW5nOioqIGlmIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGBgaW5wbGFjZT1UcnVlYGAgaXMKQEAgLTE5NSwxMCArMTk0LDE0IEBACiAgICBVc2FnZSBleGFtcGxlOiAgYGBmaSA9IGZpbGVpbnB1dC5GaWxlSW5wdXQob3Blbmhvb2s9ZmlsZWlucHV0Lmhvb2tfY29tcHJlc3NlZClgYAogCiAKLS4uIGZ1bmN0aW9uOjogaG9va19lbmNvZGVkKGVuY29kaW5nKQorLi4gZnVuY3Rpb246OiBob29rX2VuY29kZWQoZW5jb2RpbmcsIGVycm9ycz1Ob25lKQogCiAgICBSZXR1cm5zIGEgaG9vayB3aGljaCBvcGVucyBlYWNoIGZpbGUgd2l0aCA6ZnVuYzpgb3BlbmAsIHVzaW5nIHRoZSBnaXZlbgotICAgKmVuY29kaW5nKiB0byByZWFkIHRoZSBmaWxlLgorICAgKmVuY29kaW5nKiBhbmQgKmVycm9ycyogdG8gcmVhZCB0aGUgZmlsZS4KIAogICAgVXNhZ2UgZXhhbXBsZTogYGBmaSA9Ci0gICBmaWxlaW5wdXQuRmlsZUlucHV0KG9wZW5ob29rPWZpbGVpbnB1dC5ob29rX2VuY29kZWQoImlzby04ODU5LTEiKSlgYAorICAgZmlsZWlucHV0LkZpbGVJbnB1dChvcGVuaG9vaz1maWxlaW5wdXQuaG9va19lbmNvZGVkKCJ1dGYtOCIsCisgICAic3Vycm9nYXRlZXNjYXBlIikpYGAKKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSBvcHRpb25hbCAqZXJyb3JzKiBwYXJhbWV0ZXIuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0IGIvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdAppbmRleCA1YWY5ZmU0Li4zZTJmYjcyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QKQEAgLTg3OCwxMSArODc4LDExIEBACiAgICBPcGVuICpmaWxlKiBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyA6dGVybTpgZmlsZSBvYmplY3RgLiAgSWYgdGhlIGZpbGUKICAgIGNhbm5vdCBiZSBvcGVuZWQsIGFuIDpleGM6YE9TRXJyb3JgIGlzIHJhaXNlZC4KIAotICAgKmZpbGUqIGlzIGVpdGhlciBhIHN0cmluZyBvciBieXRlcyBvYmplY3QgZ2l2aW5nIHRoZSBwYXRobmFtZSAoYWJzb2x1dGUgb3IKLSAgIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KSBvZiB0aGUgZmlsZSB0byBiZSBvcGVuZWQgb3IKLSAgIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGJlIHdyYXBwZWQuICAoSWYgYSBmaWxlIGRlc2NyaXB0b3IKLSAgIGlzIGdpdmVuLCBpdCBpcyBjbG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgSS9PIG9iamVjdCBpcyBjbG9zZWQsIHVubGVzcwotICAgKmNsb3NlZmQqIGlzIHNldCB0byBgYEZhbHNlYGAuKQorICAgKmZpbGUqIGlzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGdpdmluZyB0aGUgcGF0aG5hbWUgKGFic29sdXRlIG9yCisgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkgb2YgdGhlIGZpbGUgdG8gYmUgb3BlbmVkIG9yIGFuCisgICBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZSB3cmFwcGVkLiAgKElmIGEgZmlsZSBkZXNjcmlwdG9yIGlzCisgICBnaXZlbiwgaXQgaXMgY2xvc2VkIHdoZW4gdGhlIHJldHVybmVkIEkvTyBvYmplY3QgaXMgY2xvc2VkLCB1bmxlc3MgKmNsb3NlZmQqCisgICBpcyBzZXQgdG8gYGBGYWxzZWBgLikKIAogICAgKm1vZGUqIGlzIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbW9kZSBpbiB3aGljaCB0aGUgZmlsZSBpcwogICAgb3BlbmVkLiAgSXQgZGVmYXVsdHMgdG8gYGAncidgYCB3aGljaCBtZWFucyBvcGVuIGZvciByZWFkaW5nIGluIHRleHQgbW9kZS4KQEAgLTEwNzcsNiArMTA3Nyw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgVGhlIGBgJ25hbWVyZXBsYWNlJ2BgIGVycm9yIGhhbmRsZXIgd2FzIGFkZGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBhZGRlZCB0byBhY2NlcHQgb2JqZWN0cyBpbXBsZW1lbnRpbmcgOmNsYXNzOmBvcy5QYXRoTGlrZWAuCisKIC4uIGZ1bmN0aW9uOjogb3JkKGMpCiAKICAgIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBvbmUgVW5pY29kZSBjaGFyYWN0ZXIsIHJldHVybiBhbiBpbnRlZ2VyCkBAIC0xNDYwLDYgKzE0NjMsOSBAQAogCiAgICBTZWUgYWxzbyA6cmVmOmBibHRpbi10eXBlLW9iamVjdHNgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3ViY2xhc3NlcyBvZiA6Y2xhc3M6YHR5cGVgIHdoaWNoIGRvbid0IG92ZXJyaWRlIGBgdHlwZS5fX25ld19fYGAgbWF5IG5vCisgICAgICBsb25nZXIgdXNlIHRoZSBvbmUtYXJndW1lbnQgZm9ybSB0byBnZXQgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LgogCiAuLiBmdW5jdGlvbjo6IHZhcnMoW29iamVjdF0pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2dsb2IucnN0IGIvRG9jL2xpYnJhcnkvZ2xvYi5yc3QKaW5kZXggMzI4ZWVmMy4uYThhNWE1MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZ2xvYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZ2xvYi5yc3QKQEAgLTE0LDcgKzE0LDcgQEAKIGFjY29yZGluZyB0byB0aGUgcnVsZXMgdXNlZCBieSB0aGUgVW5peCBzaGVsbCwgYWx0aG91Z2ggcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4KIGFyYml0cmFyeSBvcmRlci4gIE5vIHRpbGRlIGV4cGFuc2lvbiBpcyBkb25lLCBidXQgYGAqYGAsIGBgP2BgLCBhbmQgY2hhcmFjdGVyCiByYW5nZXMgZXhwcmVzc2VkIHdpdGggYGBbXWBgIHdpbGwgYmUgY29ycmVjdGx5IG1hdGNoZWQuICBUaGlzIGlzIGRvbmUgYnkgdXNpbmcKLXRoZSA6ZnVuYzpgb3MubGlzdGRpcmAgYW5kIDpmdW5jOmBmbm1hdGNoLmZubWF0Y2hgIGZ1bmN0aW9ucyBpbiBjb25jZXJ0LCBhbmQKK3RoZSA6ZnVuYzpgb3Muc2NhbmRpcmAgYW5kIDpmdW5jOmBmbm1hdGNoLmZubWF0Y2hgIGZ1bmN0aW9ucyBpbiBjb25jZXJ0LCBhbmQKIG5vdCBieSBhY3R1YWxseSBpbnZva2luZyBhIHN1YnNoZWxsLiAgTm90ZSB0aGF0IHVubGlrZSA6ZnVuYzpgZm5tYXRjaC5mbm1hdGNoYCwKIDptb2Q6YGdsb2JgIHRyZWF0cyBmaWxlbmFtZXMgYmVnaW5uaW5nIHdpdGggYSBkb3QgKGBgLmBgKSBhcyBzcGVjaWFsIGNhc2VzLgogKEZvciB0aWxkZSBhbmQgc2hlbGwgdmFyaWFibGUgZXhwYW5zaW9uLCB1c2UgOmZ1bmM6YG9zLnBhdGguZXhwYW5kdXNlcmAgYW5kCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9ncnAucnN0IGIvRG9jL2xpYnJhcnkvZ3JwLnJzdAppbmRleCBhMzBlNjIyLi43NGRlM2Y5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9ncnAucnN0CisrKyBiL0RvYy9saWJyYXJ5L2dycC5yc3QKQEAgLTQzLDYgKzQzLDkgQEAKICAgIFJldHVybiB0aGUgZ3JvdXAgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiBudW1lcmljIGdyb3VwIElELiA6ZXhjOmBLZXlFcnJvcmAKICAgIGlzIHJhaXNlZCBpZiB0aGUgZW50cnkgYXNrZWQgZm9yIGNhbm5vdCBiZSBmb3VuZC4KIAorICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorICAgICAgU2luY2UgUHl0aG9uIDMuNiB0aGUgc3VwcG9ydCBvZiBub24taW50ZWdlciBhcmd1bWVudHMgbGlrZSBmbG9hdHMgb3IKKyAgICAgIHN0cmluZ3MgaW4gOmZ1bmM6YGdldGdyZ2lkYCBpcyBkZXByZWNhdGVkLgogCiAuLiBmdW5jdGlvbjo6IGdldGdybmFtKG5hbWUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLXRyZWUucG5nIGIvRG9jL2xpYnJhcnkvaGFzaGxpYi1ibGFrZTItdHJlZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwZGNiYQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLXRyZWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLnJzdCBiL0RvYy9saWJyYXJ5L2hhc2hsaWItYmxha2UyLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EyNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYnJhcnkvaGFzaGxpYi1ibGFrZTIucnN0CkBAIC0wLDAgKzEsNDQzIEBACisuLiBfaGFzaGxpYi1ibGFrZTI6CisKKzptb2Q6YGhhc2hsaWJgIC0tLSBCTEFLRTIgaGFzaCBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gbW9kdWxlOjogaGFzaGxpYgorICAgOnN5bm9wc2lzOiBCTEFLRTIgaGFzaCBmdW5jdGlvbiBmb3IgUHl0aG9uCisuLiBzZWN0aW9uYXV0aG9yOjogRG1pdHJ5IENoZXN0bnlraAorCisuLiBpbmRleDo6CisgICBzaW5nbGU6IGJsYWtlMmIsIGJsYWtlMnMKKworQkxBS0UyXyBpcyBhIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbiwgd2hpY2ggb2ZmZXJzIGhpZ2hlc3Qgc2VjdXJpdHkgd2hpbGUKK2JlaW5nIGFzIGZhc3QgYXMgTUQ1IG9yIFNIQS0xLCBhbmQgY29tZXMgaW4gdHdvIGZsYXZvcnM6CisKKyogKipCTEFLRTJiKiosIG9wdGltaXplZCBmb3IgNjQtYml0IHBsYXRmb3JtcyBhbmQgcHJvZHVjZXMgZGlnZXN0cyBvZiBhbnkgc2l6ZQorICBiZXR3ZWVuIDEgYW5kIDY0IGJ5dGVzLAorCisqICoqQkxBS0UycyoqLCBvcHRpbWl6ZWQgZm9yIDgtIHRvIDMyLWJpdCBwbGF0Zm9ybXMgYW5kIHByb2R1Y2VzIGRpZ2VzdHMgb2YgYW55CisgIHNpemUgYmV0d2VlbiAxIGFuZCAzMiBieXRlcy4KKworQkxBS0UyIHN1cHBvcnRzICoqa2V5ZWQgbW9kZSoqIChhIGZhc3RlciBhbmQgc2ltcGxlciByZXBsYWNlbWVudCBmb3IgSE1BQ18pLAorKipzYWx0ZWQgaGFzaGluZyoqLCAqKnBlcnNvbmFsaXphdGlvbioqLCBhbmQgKip0cmVlIGhhc2hpbmcqKi4KKworSGFzaCBvYmplY3RzIGZyb20gdGhpcyBtb2R1bGUgZm9sbG93IHRoZSBBUEkgb2Ygc3RhbmRhcmQgbGlicmFyeSdzCis6bW9kOmBoYXNobGliYCBvYmplY3RzLgorCisKK01vZHVsZQorPT09PT09CisKK0NyZWF0aW5nIGhhc2ggb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05ldyBoYXNoIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyBjb25zdHJ1Y3RvciBmdW5jdGlvbnM6CisKKworLi4gZnVuY3Rpb246OiBibGFrZTJiKGRhdGE9YicnLCBkaWdlc3Rfc2l6ZT02NCwga2V5PWInJywgc2FsdD1iJycsIFwKKyAgICAgICAgICAgICAgICBwZXJzb249YicnLCBmYW5vdXQ9MSwgZGVwdGg9MSwgbGVhZl9zaXplPTAsIG5vZGVfb2Zmc2V0PTAsICBcCisgICAgICAgICAgICAgICAgbm9kZV9kZXB0aD0wLCBpbm5lcl9zaXplPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKworLi4gZnVuY3Rpb246OiBibGFrZTJzKGRhdGE9YicnLCBkaWdlc3Rfc2l6ZT0zMiwga2V5PWInJywgc2FsdD1iJycsIFwKKyAgICAgICAgICAgICAgICBwZXJzb249YicnLCBmYW5vdXQ9MSwgZGVwdGg9MSwgbGVhZl9zaXplPTAsIG5vZGVfb2Zmc2V0PTAsICBcCisgICAgICAgICAgICAgICAgbm9kZV9kZXB0aD0wLCBpbm5lcl9zaXplPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKworCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggb2JqZWN0cyBmb3IgY2FsY3VsYXRpbmcKK0JMQUtFMmIgb3IgQkxBS0Uycy4gVGhleSBvcHRpb25hbGx5IHRha2UgdGhlc2UgZ2VuZXJhbCBwYXJhbWV0ZXJzOgorCisqICpkYXRhKjogaW5pdGlhbCBjaHVuayBvZiBkYXRhIHRvIGhhc2gsIHdoaWNoIG11c3QgYmUgaW50ZXJwcmV0YWJsZSBhcyBidWZmZXIKKyAgb2YgYnl0ZXMuCisKKyogKmRpZ2VzdF9zaXplKjogc2l6ZSBvZiBvdXRwdXQgZGlnZXN0IGluIGJ5dGVzLgorCisqICprZXkqOiBrZXkgZm9yIGtleWVkIGhhc2hpbmcgKHVwIHRvIDY0IGJ5dGVzIGZvciBCTEFLRTJiLCB1cCB0byAzMiBieXRlcyBmb3IKKyAgQkxBS0UycykuCisKKyogKnNhbHQqOiBzYWx0IGZvciByYW5kb21pemVkIGhhc2hpbmcgKHVwIHRvIDE2IGJ5dGVzIGZvciBCTEFLRTJiLCB1cCB0byA4CisgIGJ5dGVzIGZvciBCTEFLRTJzKS4KKworKiAqcGVyc29uKjogcGVyc29uYWxpemF0aW9uIHN0cmluZyAodXAgdG8gMTYgYnl0ZXMgZm9yIEJMQUtFMmIsIHVwIHRvIDggYnl0ZXMKKyAgZm9yIEJMQUtFMnMpLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIGxpbWl0cyBmb3IgZ2VuZXJhbCBwYXJhbWV0ZXJzIChpbiBieXRlcyk6CisKKz09PT09PT0gPT09PT09PT09PT0gPT09PT09PT0gPT09PT09PT09ID09PT09PT09PT09CitIYXNoICAgIGRpZ2VzdF9zaXplIGxlbihrZXkpIGxlbihzYWx0KSBsZW4ocGVyc29uKQorPT09PT09PSA9PT09PT09PT09PSA9PT09PT09PSA9PT09PT09PT0gPT09PT09PT09PT0KK0JMQUtFMmIgICAgIDY0ICAgICAgICAgNjQgICAgICAgMTYgICAgICAgIDE2CitCTEFLRTJzICAgICAzMiAgICAgICAgIDMyICAgICAgIDggICAgICAgICA4Cis9PT09PT09ID09PT09PT09PT09ID09PT09PT09ID09PT09PT09PSA9PT09PT09PT09PQorCisuLiBub3RlOjoKKworICAgIEJMQUtFMiBzcGVjaWZpY2F0aW9uIGRlZmluZXMgY29uc3RhbnQgbGVuZ3RocyBmb3Igc2FsdCBhbmQgcGVyc29uYWxpemF0aW9uCisgICAgcGFyYW1ldGVycywgaG93ZXZlciwgZm9yIGNvbnZlbmllbmNlLCB0aGlzIGltcGxlbWVudGF0aW9uIGFjY2VwdHMgYnl0ZQorICAgIHN0cmluZ3Mgb2YgYW55IHNpemUgdXAgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguIElmIHRoZSBsZW5ndGggb2YgdGhlCisgICAgcGFyYW1ldGVyIGlzIGxlc3MgdGhhbiBzcGVjaWZpZWQsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zLCB0aHVzLCBmb3IKKyAgICBleGFtcGxlLCBgYGInc2FsdCdgYCBhbmQgYGBiJ3NhbHRceDAwJ2BgIGlzIHRoZSBzYW1lIHZhbHVlLiAoVGhpcyBpcyBub3QKKyAgICB0aGUgY2FzZSBmb3IgKmtleSouKQorCitUaGVzZSBzaXplcyBhcmUgYXZhaWxhYmxlIGFzIG1vZHVsZSBgY29uc3RhbnRzYF8gZGVzY3JpYmVkIGJlbG93LgorCitDb25zdHJ1Y3RvciBmdW5jdGlvbnMgYWxzbyBhY2NlcHQgdGhlIGZvbGxvd2luZyB0cmVlIGhhc2hpbmcgcGFyYW1ldGVyczoKKworKiAqZmFub3V0KjogZmFub3V0ICgwIHRvIDI1NSwgMCBpZiB1bmxpbWl0ZWQsIDEgaW4gc2VxdWVudGlhbCBtb2RlKS4KKworKiAqZGVwdGgqOiBtYXhpbWFsIGRlcHRoIG9mIHRyZWUgKDEgdG8gMjU1LCAyNTUgaWYgdW5saW1pdGVkLCAxIGluCisgIHNlcXVlbnRpYWwgbW9kZSkuCisKKyogKmxlYWZfc2l6ZSo6IG1heGltYWwgYnl0ZSBsZW5ndGggb2YgbGVhZiAoMCB0byAyKiozMi0xLCAwIGlmIHVubGltaXRlZCBvciBpbgorICBzZXF1ZW50aWFsIG1vZGUpLgorCisqICpub2RlX29mZnNldCo6IG5vZGUgb2Zmc2V0ICgwIHRvIDIqKjY0LTEgZm9yIEJMQUtFMmIsIDAgdG8gMioqNDgtMSBmb3IKKyAgQkxBS0UycywgMCBmb3IgdGhlIGZpcnN0LCBsZWZ0bW9zdCwgbGVhZiwgb3IgaW4gc2VxdWVudGlhbCBtb2RlKS4KKworKiAqbm9kZV9kZXB0aCo6IG5vZGUgZGVwdGggKDAgdG8gMjU1LCAwIGZvciBsZWF2ZXMsIG9yIGluIHNlcXVlbnRpYWwgbW9kZSkuCisKKyogKmlubmVyX3NpemUqOiBpbm5lciBkaWdlc3Qgc2l6ZSAoMCB0byA2NCBmb3IgQkxBS0UyYiwgMCB0byAzMiBmb3IKKyAgQkxBS0UycywgMCBpbiBzZXF1ZW50aWFsIG1vZGUpLgorCisqICpsYXN0X25vZGUqOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvY2Vzc2VkIG5vZGUgaXMgdGhlIGxhc3QKKyAgb25lIChgRmFsc2VgIGZvciBzZXF1ZW50aWFsIG1vZGUpLgorCisuLiBmaWd1cmU6OiBoYXNobGliLWJsYWtlMi10cmVlLnBuZworICAgOmFsdDogRXhwbGFuYXRpb24gb2YgdHJlZSBtb2RlIHBhcmFtZXRlcnMuCisKK1NlZSBzZWN0aW9uIDIuMTAgaW4gYEJMQUtFMiBzcGVjaWZpY2F0aW9uCis8aHR0cHM6Ly9ibGFrZTIubmV0L2JsYWtlMl8yMDEzMDEyOS5wZGY+YF8gZm9yIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIHRyZWUKK2hhc2hpbmcuCisKKworQ29uc3RhbnRzCistLS0tLS0tLS0KKworLi4gZGF0YTo6IGJsYWtlMmIuU0FMVF9TSVpFCisuLiBkYXRhOjogYmxha2Uycy5TQUxUX1NJWkUKKworU2FsdCBsZW5ndGggKG1heGltdW0gbGVuZ3RoIGFjY2VwdGVkIGJ5IGNvbnN0cnVjdG9ycykuCisKKworLi4gZGF0YTo6IGJsYWtlMmIuUEVSU09OX1NJWkUKKy4uIGRhdGE6OiBibGFrZTJzLlBFUlNPTl9TSVpFCisKK1BlcnNvbmFsaXphdGlvbiBzdHJpbmcgbGVuZ3RoIChtYXhpbXVtIGxlbmd0aCBhY2NlcHRlZCBieSBjb25zdHJ1Y3RvcnMpLgorCisKKy4uIGRhdGE6OiBibGFrZTJiLk1BWF9LRVlfU0laRQorLi4gZGF0YTo6IGJsYWtlMnMuTUFYX0tFWV9TSVpFCisKK01heGltdW0ga2V5IHNpemUuCisKKworLi4gZGF0YTo6IGJsYWtlMmIuTUFYX0RJR0VTVF9TSVpFCisuLiBkYXRhOjogYmxha2Uycy5NQVhfRElHRVNUX1NJWkUKKworTWF4aW11bSBkaWdlc3Qgc2l6ZSB0aGF0IHRoZSBoYXNoIGZ1bmN0aW9uIGNhbiBvdXRwdXQuCisKKworRXhhbXBsZXMKKz09PT09PT09CisKK1NpbXBsZSBoYXNoaW5nCistLS0tLS0tLS0tLS0tLQorCitUbyBjYWxjdWxhdGUgaGFzaCBvZiBzb21lIGRhdGEsIHlvdSBzaG91bGQgZmlyc3QgY29uc3RydWN0IGEgaGFzaCBvYmplY3QgYnkKK2NhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICg6ZnVuYzpgYmxha2UyYmAgb3IKKzpmdW5jOmBibGFrZTJzYCksIHRoZW4gdXBkYXRlIGl0IHdpdGggdGhlIGRhdGEgYnkgY2FsbGluZyA6bWV0aDpgdXBkYXRlYCBvbiB0aGUKK29iamVjdCwgYW5kLCBmaW5hbGx5LCBnZXQgdGhlIGRpZ2VzdCBvdXQgb2YgdGhlIG9iamVjdCBieSBjYWxsaW5nCis6bWV0aDpgZGlnZXN0YCAob3IgOm1ldGg6YGhleGRpZ2VzdGAgZm9yIGhleC1lbmNvZGVkIHN0cmluZykuCisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKCkKKyAgICA+Pj4gaC51cGRhdGUoYidIZWxsbyB3b3JsZCcpCisgICAgPj4+IGguaGV4ZGlnZXN0KCkKKyAgICAnNmZmODQzYmE2ODU4NDJhYTgyMDMxZDNmNTNjNDhiNjYzMjZkZjc2MzlhNjNkMTI4OTc0YzVjMTRmMzFhMGYzMzM0M2E4YzY1NTUxMTM0ZWQxYWUwZjJiMGRkMmJiNDk1ZGM4MTAzOWUzZWViMGFhMWJiMDM4OGJiZWFjMjkxODMnCisKKworQXMgYSBzaG9ydGN1dCwgeW91IGNhbiBwYXNzIHRoZSBmaXJzdCBjaHVuayBvZiBkYXRhIHRvIHVwZGF0ZSBkaXJlY3RseSB0byB0aGUKK2NvbnN0cnVjdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCAob3IgYXMgKmRhdGEqIGtleXdvcmQgYXJndW1lbnQpOgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBibGFrZTJiKGInSGVsbG8gd29ybGQnKS5oZXhkaWdlc3QoKQorICAgICc2ZmY4NDNiYTY4NTg0MmFhODIwMzFkM2Y1M2M0OGI2NjMyNmRmNzYzOWE2M2QxMjg5NzRjNWMxNGYzMWEwZjMzMzQzYThjNjU1NTExMzRlZDFhZTBmMmIwZGQyYmI0OTVkYzgxMDM5ZTNlZWIwYWExYmIwMzg4YmJlYWMyOTE4MycKKworWW91IGNhbiBjYWxsIDptZXRoOmBoYXNoLnVwZGF0ZWAgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZCB0byBpdGVyYXRpdmVseQordXBkYXRlIHRoZSBoYXNoOgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBpdGVtcyA9IFtiJ0hlbGxvJywgYicgJywgYid3b3JsZCddCisgICAgPj4+IGggPSBibGFrZTJiKCkKKyAgICA+Pj4gZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgLi4uICAgICBoLnVwZGF0ZShpdGVtKQorICAgID4+PiBoLmhleGRpZ2VzdCgpCisgICAgJzZmZjg0M2JhNjg1ODQyYWE4MjAzMWQzZjUzYzQ4YjY2MzI2ZGY3NjM5YTYzZDEyODk3NGM1YzE0ZjMxYTBmMzMzNDNhOGM2NTU1MTEzNGVkMWFlMGYyYjBkZDJiYjQ5NWRjODEwMzllM2VlYjBhYTFiYjAzODhiYmVhYzI5MTgzJworCisKK1VzaW5nIGRpZmZlcmVudCBkaWdlc3Qgc2l6ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQkxBS0UyIGhhcyBjb25maWd1cmFibGUgc2l6ZSBvZiBkaWdlc3RzIHVwIHRvIDY0IGJ5dGVzIGZvciBCTEFLRTJiIGFuZCB1cCB0byAzMgorYnl0ZXMgZm9yIEJMQUtFMnMuIEZvciBleGFtcGxlLCB0byByZXBsYWNlIFNIQS0xIHdpdGggQkxBS0UyYiB3aXRob3V0IGNoYW5naW5nCit0aGUgc2l6ZSBvZiBvdXRwdXQsIHdlIGNhbiB0ZWxsIEJMQUtFMmIgdG8gcHJvZHVjZSAyMC1ieXRlIGRpZ2VzdHM6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKGRpZ2VzdF9zaXplPTIwKQorICAgID4+PiBoLnVwZGF0ZShiJ1JlcGxhY2luZyBTSEExIHdpdGggdGhlIG1vcmUgc2VjdXJlIGZ1bmN0aW9uJykKKyAgICA+Pj4gaC5oZXhkaWdlc3QoKQorICAgICdkMjRmMjZjZjhkZTY2NDcyZDU4ZDRlMWIxNzc0YjRjOTE1OGIxZjRjJworICAgID4+PiBoLmRpZ2VzdF9zaXplCisgICAgMjAKKyAgICA+Pj4gbGVuKGguZGlnZXN0KCkpCisgICAgMjAKKworSGFzaCBvYmplY3RzIHdpdGggZGlmZmVyZW50IGRpZ2VzdCBzaXplcyBoYXZlIGNvbXBsZXRlbHkgZGlmZmVyZW50IG91dHB1dHMKKyhzaG9ydGVyIGhhc2hlcyBhcmUgKm5vdCogcHJlZml4ZXMgb2YgbG9uZ2VyIGhhc2hlcyk7IEJMQUtFMmIgYW5kIEJMQUtFMnMKK3Byb2R1Y2UgZGlmZmVyZW50IG91dHB1dHMgZXZlbiBpZiB0aGUgb3V0cHV0IGxlbmd0aCBpcyB0aGUgc2FtZToKKworICAgID4+PiBmcm9tIGhhc2hsaWIgaW1wb3J0IGJsYWtlMmIsIGJsYWtlMnMKKyAgICA+Pj4gYmxha2UyYihkaWdlc3Rfc2l6ZT0xMCkuaGV4ZGlnZXN0KCkKKyAgICAnNmZhMWQ4ZmNmZDcxOTA0NmQ3NjInCisgICAgPj4+IGJsYWtlMmIoZGlnZXN0X3NpemU9MTEpLmhleGRpZ2VzdCgpCisgICAgJ2ViNmVjMTVkYWY5NTQ2MjU0ZjA4MDknCisgICAgPj4+IGJsYWtlMnMoZGlnZXN0X3NpemU9MTApLmhleGRpZ2VzdCgpCisgICAgJzFiZjIxYTk4Yzc4YTFjMzc2YWU5JworICAgID4+PiBibGFrZTJzKGRpZ2VzdF9zaXplPTExKS5oZXhkaWdlc3QoKQorICAgICc1NjcwMDRiZjk2ZTRhMjU3NzNlYmY0JworCisKK0tleWVkIGhhc2hpbmcKKy0tLS0tLS0tLS0tLS0KKworS2V5ZWQgaGFzaGluZyBjYW4gYmUgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gYXMgYSBmYXN0ZXIgYW5kIHNpbXBsZXIKK3JlcGxhY2VtZW50IGZvciBgSGFzaC1iYXNlZCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKzxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2gtYmFzZWRfbWVzc2FnZV9hdXRoZW50aWNhdGlvbl9jb2RlPmBfIChITUFDKS4KK0JMQUtFMiBjYW4gYmUgc2VjdXJlbHkgdXNlZCBpbiBwcmVmaXgtTUFDIG1vZGUgdGhhbmtzIHRvIHRoZQoraW5kaWZmZXJlbnRpYWJpbGl0eSBwcm9wZXJ0eSBpbmhlcml0ZWQgZnJvbSBCTEFLRS4KKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBnZXQgYSAoaGV4LWVuY29kZWQpIDEyOC1iaXQgYXV0aGVudGljYXRpb24gY29kZSBmb3IKK21lc3NhZ2UgYGBiJ21lc3NhZ2UgZGF0YSdgYCB3aXRoIGtleSBgYGIncHNldWRvcmFuZG9tIGtleSdgYDo6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IGggPSBibGFrZTJiKGtleT1iJ3BzZXVkb3JhbmRvbSBrZXknLCBkaWdlc3Rfc2l6ZT0xNikKKyAgICA+Pj4gaC51cGRhdGUoYidtZXNzYWdlIGRhdGEnKQorICAgID4+PiBoLmhleGRpZ2VzdCgpCisgICAgJzNkMzYzZmY3NDAxZTAyMDI2ZjRhNDY4N2Q0ODYzY2VkJworCisKK0FzIGEgcHJhY3RpY2FsIGV4YW1wbGUsIGEgd2ViIGFwcGxpY2F0aW9uIGNhbiBzeW1tZXRyaWNhbGx5IHNpZ24gY29va2llcyBzZW50Cit0byB1c2VycyBhbmQgbGF0ZXIgdmVyaWZ5IHRoZW0gdG8gbWFrZSBzdXJlIHRoZXkgd2VyZW4ndCB0YW1wZXJlZCB3aXRoOjoKKworICAgID4+PiBmcm9tIGhhc2hsaWIgaW1wb3J0IGJsYWtlMmIKKyAgICA+Pj4gZnJvbSBobWFjIGltcG9ydCBjb21wYXJlX2RpZ2VzdAorICAgID4+PgorICAgID4+PiBTRUNSRVRfS0VZID0gYidwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgc2VydmVyIHNlY3JldCBrZXknCisgICAgPj4+IEFVVEhfU0laRSA9IDE2CisgICAgPj4+CisgICAgPj4+IGRlZiBzaWduKGNvb2tpZSk6CisgICAgLi4uICAgICBoID0gYmxha2UyYihkYXRhPWNvb2tpZSwgZGlnZXN0X3NpemU9QVVUSF9TSVpFLCBrZXk9U0VDUkVUX0tFWSkKKyAgICAuLi4gICAgIHJldHVybiBoLmhleGRpZ2VzdCgpCisgICAgPj4+CisgICAgPj4+IGNvb2tpZSA9IGIndXNlcjp2YXRyb2dhc2FjJworICAgID4+PiBzaWcgPSBzaWduKGNvb2tpZSkKKyAgICA+Pj4gcHJpbnQoInswfSx7MX0iLmZvcm1hdChjb29raWUuZGVjb2RlKCd1dGYtOCcpLCBzaWcpKQorICAgIHVzZXI6dmF0cm9nYXNhYywzNDljZjkwNDUzMzc2N2VkMmQ3NTUyNzlhOGRmODRkMAorICAgID4+PiBjb21wYXJlX2RpZ2VzdChjb29raWUsIHNpZykKKyAgICBUcnVlCisgICAgPj4+IGNvbXBhcmVfZGlnZXN0KGIndXNlcjpwb2xpY2FqYWMnLCBzaWcpCisgICAgRmFsc2UKKyAgICA+Pj4gY29tcGFyZV9kaWdlc3R5KGNvb2tpZSwgJzAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZjAwJykKKyAgICBGYWxzZQorCitFdmVuIHRob3VnaCB0aGVyZSdzIGEgbmF0aXZlIGtleWVkIGhhc2hpbmcgbW9kZSwgQkxBS0UyIGNhbiwgb2YgY291cnNlLCBiZSB1c2VkCitpbiBITUFDIGNvbnN0cnVjdGlvbiB3aXRoIDptb2Q6YGhtYWNgIG1vZHVsZTo6CisKKyAgICA+Pj4gaW1wb3J0IGhtYWMsIGhhc2hsaWIKKyAgICA+Pj4gbSA9IGhtYWMubmV3KGInc2VjcmV0IGtleScsIGRpZ2VzdG1vZD1oYXNobGliLmJsYWtlMnMpCisgICAgPj4+IG0udXBkYXRlKGInbWVzc2FnZScpCisgICAgPj4+IG0uaGV4ZGlnZXN0KCkKKyAgICAnZTNjODEwMjg2OGQyOGI1ZmY4NWZjMzVkZGEwNzMyOTk3MGQxYTAxZTI3M2MzNzQ4MTMyNmZlMGM4NjFjODE0MicKKworCitSYW5kb21pemVkIGhhc2hpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBzZXR0aW5nICpzYWx0KiBwYXJhbWV0ZXIgdXNlcnMgY2FuIGludHJvZHVjZSByYW5kb21pemF0aW9uIHRvIHRoZSBoYXNoCitmdW5jdGlvbi4gUmFuZG9taXplZCBoYXNoaW5nIGlzIHVzZWZ1bCBmb3IgcHJvdGVjdGluZyBhZ2FpbnN0IGNvbGxpc2lvbiBhdHRhY2tzCitvbiB0aGUgaGFzaCBmdW5jdGlvbiB1c2VkIGluIGRpZ2l0YWwgc2lnbmF0dXJlcy4KKworICAgIFJhbmRvbWl6ZWQgaGFzaGluZyBpcyBkZXNpZ25lZCBmb3Igc2l0dWF0aW9ucyB3aGVyZSBvbmUgcGFydHksIHRoZSBtZXNzYWdlCisgICAgcHJlcGFyZXIsIGdlbmVyYXRlcyBhbGwgb3IgcGFydCBvZiBhIG1lc3NhZ2UgdG8gYmUgc2lnbmVkIGJ5IGEgc2Vjb25kCisgICAgcGFydHksIHRoZSBtZXNzYWdlIHNpZ25lci4gSWYgdGhlIG1lc3NhZ2UgcHJlcGFyZXIgaXMgYWJsZSB0byBmaW5kCisgICAgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uIGNvbGxpc2lvbnMgKGkuZS4sIHR3byBtZXNzYWdlcyBwcm9kdWNpbmcgdGhlCisgICAgc2FtZSBoYXNoIHZhbHVlKSwgdGhlbiBzaGUgbWlnaHQgcHJlcGFyZSBtZWFuaW5nZnVsIHZlcnNpb25zIG9mIHRoZSBtZXNzYWdlCisgICAgdGhhdCB3b3VsZCBwcm9kdWNlIHRoZSBzYW1lIGhhc2ggdmFsdWUgYW5kIGRpZ2l0YWwgc2lnbmF0dXJlLCBidXQgd2l0aAorICAgIGRpZmZlcmVudCByZXN1bHRzIChlLmcuLCB0cmFuc2ZlcnJpbmcgJDEsMDAwLDAwMCB0byBhbiBhY2NvdW50LCByYXRoZXIgdGhhbgorICAgICQxMCkuIENyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGRlc2lnbmVkIHdpdGggY29sbGlzaW9uCisgICAgcmVzaXN0YW5jZSBhcyBhIG1ham9yIGdvYWwsIGJ1dCB0aGUgY3VycmVudCBjb25jZW50cmF0aW9uIG9uIGF0dGFja2luZworICAgIGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbnMgbWF5IHJlc3VsdCBpbiBhIGdpdmVuIGNyeXB0b2dyYXBoaWMgaGFzaAorICAgIGZ1bmN0aW9uIHByb3ZpZGluZyBsZXNzIGNvbGxpc2lvbiByZXNpc3RhbmNlIHRoYW4gZXhwZWN0ZWQuIFJhbmRvbWl6ZWQKKyAgICBoYXNoaW5nIG9mZmVycyB0aGUgc2lnbmVyIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBieSByZWR1Y2luZyB0aGUgbGlrZWxpaG9vZAorICAgIHRoYXQgYSBwcmVwYXJlciBjYW4gZ2VuZXJhdGUgdHdvIG9yIG1vcmUgbWVzc2FnZXMgdGhhdCB1bHRpbWF0ZWx5IHlpZWxkIHRoZQorICAgIHNhbWUgaGFzaCB2YWx1ZSBkdXJpbmcgdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIGdlbmVyYXRpb24gcHJvY2VzcyDigJMgZXZlbiBpZgorICAgIGl0IGlzIHByYWN0aWNhbCB0byBmaW5kIGNvbGxpc2lvbnMgZm9yIHRoZSBoYXNoIGZ1bmN0aW9uLiBIb3dldmVyLCB0aGUgdXNlCisgICAgb2YgcmFuZG9taXplZCBoYXNoaW5nIG1heSByZWR1Y2UgdGhlIGFtb3VudCBvZiBzZWN1cml0eSBwcm92aWRlZCBieSBhCisgICAgZGlnaXRhbCBzaWduYXR1cmUgd2hlbiBhbGwgcG9ydGlvbnMgb2YgdGhlIG1lc3NhZ2UgYXJlIHByZXBhcmVkCisgICAgYnkgdGhlIHNpZ25lci4KKworICAgIChgTklTVCBTUC04MDAtMTA2ICJSYW5kb21pemVkIEhhc2hpbmcgZm9yIERpZ2l0YWwgU2lnbmF0dXJlcyIKKyAgICA8aHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0xMDYvTklTVC1TUC04MDAtMTA2LnBkZj5gXykKKworSW4gQkxBS0UyIHRoZSBzYWx0IGlzIHByb2Nlc3NlZCBhcyBhIG9uZS10aW1lIGlucHV0IHRvIHRoZSBoYXNoIGZ1bmN0aW9uIGR1cmluZworaW5pdGlhbGl6YXRpb24sIHJhdGhlciB0aGFuIGFzIGFuIGlucHV0IHRvIGVhY2ggY29tcHJlc3Npb24gZnVuY3Rpb24uCisKKy4uIHdhcm5pbmc6OgorCisgICAgKlNhbHRlZCBoYXNoaW5nKiAob3IganVzdCBoYXNoaW5nKSB3aXRoIEJMQUtFMiBvciBhbnkgb3RoZXIgZ2VuZXJhbC1wdXJwb3NlCisgICAgY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLCBzdWNoIGFzIFNIQS0yNTYsIGlzIG5vdCBzdWl0YWJsZSBmb3IgaGFzaGluZworICAgIHBhc3N3b3Jkcy4gIFNlZSBgQkxBS0UyIEZBUSA8aHR0cHM6Ly9ibGFrZTIubmV0LyNxYT5gXyBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uLgorLi4KKworICAgID4+PiBpbXBvcnQgb3MKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+IG1zZyA9IGInc29tZSBtZXNzYWdlJworICAgID4+PiAjIENhbGN1bGF0ZSB0aGUgZmlyc3QgaGFzaCB3aXRoIGEgcmFuZG9tIHNhbHQuCisgICAgPj4+IHNhbHQxID0gb3MudXJhbmRvbShibGFrZTJiLlNBTFRfU0laRSkKKyAgICA+Pj4gaDEgPSBibGFrZTJiKHNhbHQ9c2FsdDEpCisgICAgPj4+IGgxLnVwZGF0ZShtc2cpCisgICAgPj4+ICMgQ2FsY3VsYXRlIHRoZSBzZWNvbmQgaGFzaCB3aXRoIGEgZGlmZmVyZW50IHJhbmRvbSBzYWx0LgorICAgID4+PiBzYWx0MiA9IG9zLnVyYW5kb20oYmxha2UyYi5TQUxUX1NJWkUpCisgICAgPj4+IGgyID0gYmxha2UyYihzYWx0PXNhbHQyKQorICAgID4+PiBoMi51cGRhdGUobXNnKQorICAgID4+PiAjIFRoZSBkaWdlc3RzIGFyZSBkaWZmZXJlbnQuCisgICAgPj4+IGgxLmRpZ2VzdCgpICE9IGgyLmRpZ2VzdCgpCisgICAgVHJ1ZQorCisKK1BlcnNvbmFsaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gZm9yY2UgaGFzaCBmdW5jdGlvbiB0byBwcm9kdWNlIGRpZmZlcmVudCBkaWdlc3RzIGZvcgordGhlIHNhbWUgaW5wdXQgZm9yIGRpZmZlcmVudCBwdXJwb3Nlcy4gUXVvdGluZyB0aGUgYXV0aG9ycyBvZiB0aGUgU2tlaW4gaGFzaAorZnVuY3Rpb246CisKKyAgICBXZSByZWNvbW1lbmQgdGhhdCBhbGwgYXBwbGljYXRpb24gZGVzaWduZXJzIHNlcmlvdXNseSBjb25zaWRlciBkb2luZyB0aGlzOworICAgIHdlIGhhdmUgc2VlbiBtYW55IHByb3RvY29scyB3aGVyZSBhIGhhc2ggdGhhdCBpcyBjb21wdXRlZCBpbiBvbmUgcGFydCBvZgorICAgIHRoZSBwcm90b2NvbCBjYW4gYmUgdXNlZCBpbiBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcGFydCBiZWNhdXNlIHR3byBoYXNoCisgICAgY29tcHV0YXRpb25zIHdlcmUgZG9uZSBvbiBzaW1pbGFyIG9yIHJlbGF0ZWQgZGF0YSwgYW5kIHRoZSBhdHRhY2tlciBjYW4KKyAgICBmb3JjZSB0aGUgYXBwbGljYXRpb24gdG8gbWFrZSB0aGUgaGFzaCBpbnB1dHMgdGhlIHNhbWUuIFBlcnNvbmFsaXppbmcgZWFjaAorICAgIGhhc2ggZnVuY3Rpb24gdXNlZCBpbiB0aGUgcHJvdG9jb2wgc3VtbWFyaWx5IHN0b3BzIHRoaXMgdHlwZSBvZiBhdHRhY2suCisKKyAgICAoYFRoZSBTa2VpbiBIYXNoIEZ1bmN0aW9uIEZhbWlseQorICAgIDxodHRwOi8vd3d3LnNrZWluLWhhc2guaW5mby9zaXRlcy9kZWZhdWx0L2ZpbGVzL3NrZWluMS4zLnBkZj5gXywKKyAgICBwLiAyMSkKKworQkxBS0UyIGNhbiBiZSBwZXJzb25hbGl6ZWQgYnkgcGFzc2luZyBieXRlcyB0byB0aGUgKnBlcnNvbiogYXJndW1lbnQ6OgorCisgICAgPj4+IGZyb20gaGFzaGxpYiBpbXBvcnQgYmxha2UyYgorICAgID4+PiBGSUxFU19IQVNIX1BFUlNPTiA9IGInTXlBcHAgRmlsZXMgSGFzaCcKKyAgICA+Pj4gQkxPQ0tfSEFTSF9QRVJTT04gPSBiJ015QXBwIEJsb2NrIEhhc2gnCisgICAgPj4+IGggPSBibGFrZTJiKGRpZ2VzdF9zaXplPTMyLCBwZXJzb249RklMRVNfSEFTSF9QRVJTT04pCisgICAgPj4+IGgudXBkYXRlKGIndGhlIHNhbWUgY29udGVudCcpCisgICAgPj4+IGguaGV4ZGlnZXN0KCkKKyAgICAnMjBkOWNkMDI0ZDRmYjA4NmFhZTgxOWExNDMyZGQyNDY2ZGUxMjk0NzgzMWI3NWM1YTMwY2YyNjc2MDk1ZDNiNCcKKyAgICA+Pj4gaCA9IGJsYWtlMmIoZGlnZXN0X3NpemU9MzIsIHBlcnNvbj1CTE9DS19IQVNIX1BFUlNPTikKKyAgICA+Pj4gaC51cGRhdGUoYid0aGUgc2FtZSBjb250ZW50JykKKyAgICA+Pj4gaC5oZXhkaWdlc3QoKQorICAgICdjZjY4ZmI1NzYxYjljNDRlNzg3OGJmYjJjNGM5YWVhNTIyNjRhODBiNzUwMDVlNjU2MTk3NzhkZTU5ZjM4M2EzJworCitQZXJzb25hbGl6YXRpb24gdG9nZXRoZXIgd2l0aCB0aGUga2V5ZWQgbW9kZSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlcml2ZSBkaWZmZXJlbnQKK2tleXMgZnJvbSBhIHNpbmdsZSBvbmUuCisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJzCisgICAgPj4+IGZyb20gYmFzZTY0IGltcG9ydCBiNjRkZWNvZGUsIGI2NGVuY29kZQorICAgID4+PiBvcmlnX2tleSA9IGI2NGRlY29kZShiJ1JtNUVQSmFpNzJxY0szUkdCcFczdlBOZlp5NU9ab3RoWStrSFk2aDIxS009JykKKyAgICA+Pj4gZW5jX2tleSA9IGJsYWtlMnMoa2V5PW9yaWdfa2V5LCBwZXJzb249YidrRW5jcnlwdCcpLmRpZ2VzdCgpCisgICAgPj4+IG1hY19rZXkgPSBibGFrZTJzKGtleT1vcmlnX2tleSwgcGVyc29uPWIna01BQycpLmRpZ2VzdCgpCisgICAgPj4+IHByaW50KGI2NGVuY29kZShlbmNfa2V5KS5kZWNvZGUoJ3V0Zi04JykpCisgICAgcmJQYjE1Uy9aOXQrYWdmZm5vNXd1aEI3N1ZiUmk2RjlJdjJxSXhVN1dIdz0KKyAgICA+Pj4gcHJpbnQoYjY0ZW5jb2RlKG1hY19rZXkpLmRlY29kZSgndXRmLTgnKSkKKyAgICBHOUd0SEZFMVlsdVhZMXpXUGxZazFlL25XZnUwV1NFYjBLUmNqaERlUC9vPQorCitUcmVlIG1vZGUKKy0tLS0tLS0tLQorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiBoYXNoaW5nIGEgbWluaW1hbCB0cmVlIHdpdGggdHdvIGxlYWYgbm9kZXM6OgorCisgICAgICAgMTAKKyAgICAgIC8gIFwKKyAgICAgMDAgIDAxCisKK1RoaXMgZXhhbXBsZSB1c2VzIDY0LWJ5dGUgaW50ZXJuYWwgZGlnZXN0cywgYW5kIHJldHVybnMgdGhlIDMyLWJ5dGUgZmluYWwKK2RpZ2VzdDo6CisKKyAgICA+Pj4gZnJvbSBoYXNobGliIGltcG9ydCBibGFrZTJiCisgICAgPj4+CisgICAgPj4+IEZBTk9VVCA9IDIKKyAgICA+Pj4gREVQVEggPSAyCisgICAgPj4+IExFQUZfU0laRSA9IDQwOTYKKyAgICA+Pj4gSU5ORVJfU0laRSA9IDY0CisgICAgPj4+CisgICAgPj4+IGJ1ZiA9IGJ5dGVhcnJheSg2MDAwKQorICAgID4+PgorICAgID4+PiAjIExlZnQgbGVhZgorICAgIC4uLiBoMDAgPSBibGFrZTJiKGJ1ZlswOkxFQUZfU0laRV0sIGZhbm91dD1GQU5PVVQsIGRlcHRoPURFUFRILAorICAgIC4uLiAgICAgICAgICAgICAgIGxlYWZfc2l6ZT1MRUFGX1NJWkUsIGlubmVyX3NpemU9SU5ORVJfU0laRSwKKyAgICAuLi4gICAgICAgICAgICAgICBub2RlX29mZnNldD0wLCBub2RlX2RlcHRoPTAsIGxhc3Rfbm9kZT1GYWxzZSkKKyAgICA+Pj4gIyBSaWdodCBsZWFmCisgICAgLi4uIGgwMSA9IGJsYWtlMmIoYnVmW0xFQUZfU0laRTpdLCBmYW5vdXQ9RkFOT1VULCBkZXB0aD1ERVBUSCwKKyAgICAuLi4gICAgICAgICAgICAgICBsZWFmX3NpemU9TEVBRl9TSVpFLCBpbm5lcl9zaXplPUlOTkVSX1NJWkUsCisgICAgLi4uICAgICAgICAgICAgICAgbm9kZV9vZmZzZXQ9MSwgbm9kZV9kZXB0aD0wLCBsYXN0X25vZGU9VHJ1ZSkKKyAgICA+Pj4gIyBSb290IG5vZGUKKyAgICAuLi4gaDEwID0gYmxha2UyYihkaWdlc3Rfc2l6ZT0zMiwgZmFub3V0PUZBTk9VVCwgZGVwdGg9REVQVEgsCisgICAgLi4uICAgICAgICAgICAgICAgbGVhZl9zaXplPUxFQUZfU0laRSwgaW5uZXJfc2l6ZT1JTk5FUl9TSVpFLAorICAgIC4uLiAgICAgICAgICAgICAgIG5vZGVfb2Zmc2V0PTAsIG5vZGVfZGVwdGg9MSwgbGFzdF9ub2RlPVRydWUpCisgICAgPj4+IGgxMC51cGRhdGUoaDAwLmRpZ2VzdCgpKQorICAgID4+PiBoMTAudXBkYXRlKGgwMS5kaWdlc3QoKSkKKyAgICA+Pj4gaDEwLmhleGRpZ2VzdCgpCisgICAgJzNhZDJhOWIzN2M2MDcwZTM3NGM3YThjNTA4ZmUyMGNhODZiNmVkNTRlMjg2ZTkzYTAzMThlOTVlODgxZGI1YWEnCisKK0NyZWRpdHMKKz09PT09PT0KKworQkxBS0UyXyB3YXMgZGVzaWduZWQgYnkgKkplYW4tUGhpbGlwcGUgQXVtYXNzb24qLCAqU2FtdWVsIE5ldmVzKiwgKlpvb2tvCitXaWxjb3gtTydIZWFybiosIGFuZCAqQ2hyaXN0aWFuIFdpbm5lcmxlaW4qIGJhc2VkIG9uIFNIQS0zXyBmaW5hbGlzdCBCTEFLRV8KK2NyZWF0ZWQgYnkgKkplYW4tUGhpbGlwcGUgQXVtYXNzb24qLCAqTHVjYSBIZW56ZW4qLCAqV2lsbGkgTWVpZXIqLCBhbmQKKypSYXBoYWVsIEMuLVcuIFBoYW4qLgorCitJdCB1c2VzIGNvcmUgYWxnb3JpdGhtIGZyb20gQ2hhQ2hhXyBjaXBoZXIgZGVzaWduZWQgYnkgKkRhbmllbCBKLiAgQmVybnN0ZWluKi4KKworVGhlIHN0ZGxpYiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBweWJsYWtlMl8gbW9kdWxlLiBJdCB3YXMgd3JpdHRlbiBieQorKkRtaXRyeSBDaGVzdG55a2gqIGJhc2VkIG9uIEMgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSAqU2FtdWVsIE5ldmVzKi4gVGhlCitkb2N1bWVudGF0aW9uIHdhcyBjb3BpZWQgZnJvbSBweWJsYWtlMl8gYW5kIHdyaXR0ZW4gYnkgKkRtaXRyeSBDaGVzdG55a2gqLgorCitUaGUgQyBjb2RlIHdhcyBwYXJ0bHkgcmV3cml0dGVuIGZvciBQeXRob24gYnkgKkNocmlzdGlhbiBIZWltZXMqLgorCitUaGUgZm9sbG93aW5nIHB1YmxpYyBkb21haW4gZGVkaWNhdGlvbiBhcHBsaWVzIGZvciBib3RoIEMgaGFzaCBmdW5jdGlvbgoraW1wbGVtZW50YXRpb24sIGV4dGVuc2lvbiBjb2RlLCBhbmQgdGhpcyBkb2N1bWVudGF0aW9uOgorCisgICBUbyB0aGUgZXh0ZW50IHBvc3NpYmxlIHVuZGVyIGxhdywgdGhlIGF1dGhvcihzKSBoYXZlIGRlZGljYXRlZCBhbGwgY29weXJpZ2h0CisgICBhbmQgcmVsYXRlZCBhbmQgbmVpZ2hib3JpbmcgcmlnaHRzIHRvIHRoaXMgc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4KKyAgIHdvcmxkd2lkZS4gVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eS4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQ0MwIFB1YmxpYyBEb21haW4gRGVkaWNhdGlvbiBhbG9uZworICAgd2l0aCB0aGlzIHNvZnR3YXJlLiBJZiBub3QsIHNlZQorICAgaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLy4KKworVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBoZWxwZWQgd2l0aCBkZXZlbG9wbWVudCBvciBjb250cmlidXRlZCB0aGVpciBjaGFuZ2VzCit0byB0aGUgcHJvamVjdCBhbmQgdGhlIHB1YmxpYyBkb21haW4gYWNjb3JkaW5nIHRvIHRoZSBDcmVhdGl2ZSBDb21tb25zIFB1YmxpYworRG9tYWluIERlZGljYXRpb24gMS4wIFVuaXZlcnNhbDoKKworKiAqQWxleGFuZHIgU29rb2xvdnNraXkqCisKKy4uIHNlZWFsc286OiBPZmZpY2lhbCBCTEFLRTIgd2Vic2l0ZTogaHR0cHM6Ly9ibGFrZTIubmV0CisKKy4uIF9CTEFLRTI6IGh0dHBzOi8vYmxha2UyLm5ldAorLi4gX0hNQUM6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaC1iYXNlZF9tZXNzYWdlX2F1dGhlbnRpY2F0aW9uX2NvZGUKKy4uIF9CTEFLRTogaHR0cHM6Ly8xMzEwMDIubmV0L2JsYWtlLworLi4gX1NIQS0zOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05JU1RfaGFzaF9mdW5jdGlvbl9jb21wZXRpdGlvbgorLi4gX0NoYUNoYTogaHR0cDovL2NyLnlwLnRvL2NoYWNoYS5odG1sCisuLiBfcHlibGFrZTI6IGh0dHBzOi8vcHl0aG9uaG9zdGVkLm9yZy9weWJsYWtlMi8KKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAppbmRleCBhMmU5NmNhLi42Y2E1MzA3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdApAQCAtNDQsOCArNDQsOCBAQAogLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlIGlzIG9uZSBjb25zdHJ1Y3RvciBtZXRob2QgbmFtZWQgZm9yIGVhY2ggdHlwZSBvZiA6ZGZuOmBoYXNoYC4gIEFsbCByZXR1cm4KLWEgaGFzaCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaW1wbGUgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZTogdXNlIDpmdW5jOmBzaGExYCB0bwotY3JlYXRlIGEgU0hBMSBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCithIGhhc2ggb2JqZWN0IHdpdGggdGhlIHNhbWUgc2ltcGxlIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6IHVzZSA6ZnVuYzpgc2hhMjU2YCB0bworY3JlYXRlIGEgU0hBLTI1NiBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCiBvYmplY3RzIDxieXRlcy1saWtlIG9iamVjdD5gIChub3JtYWxseSA6Y2xhc3M6YGJ5dGVzYCkgdXNpbmcgdGhlIDptZXRoOmB1cGRhdGVgIG1ldGhvZC4KIEF0IGFueSBwb2ludCB5b3UgY2FuIGFzayBpdCBmb3IgdGhlIDpkZm46YGRpZ2VzdGAgb2YgdGhlCiBjb25jYXRlbmF0aW9uIG9mIHRoZSBkYXRhIGZlZCB0byBpdCBzbyBmYXIgdXNpbmcgdGhlIDptZXRoOmBkaWdlc3RgIG9yCkBAIC02NCwyMSArNjQsMjcgQEAKIC4uIGluZGV4Ojogc2luZ2xlOiBPcGVuU1NMOyAodXNlIGluIG1vZHVsZSBoYXNobGliKQogCiBDb25zdHJ1Y3RvcnMgZm9yIGhhc2ggYWxnb3JpdGhtcyB0aGF0IGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGlzIG1vZHVsZSBhcmUKLTpmdW5jOmBtZDVgLCA6ZnVuYzpgc2hhMWAsIDpmdW5jOmBzaGEyMjRgLCA6ZnVuYzpgc2hhMjU2YCwgOmZ1bmM6YHNoYTM4NGAsCi1hbmQgOmZ1bmM6YHNoYTUxMmAuIEFkZGl0aW9uYWwgYWxnb3JpdGhtcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIHVwb24KLXRoZSBPcGVuU1NMIGxpYnJhcnkgdGhhdCBQeXRob24gdXNlcyBvbiB5b3VyIHBsYXRmb3JtLgorOmZ1bmM6YHNoYTFgLCA6ZnVuYzpgc2hhMjI0YCwgOmZ1bmM6YHNoYTI1NmAsIDpmdW5jOmBzaGEzODRgLAorOmZ1bmM6YHNoYTUxMmAsIDpmdW5jOmBibGFrZTJiYCwgYW5kIDpmdW5jOmBibGFrZTJzYC4KKzpmdW5jOmBtZDVgIGlzIG5vcm1hbGx5IGF2YWlsYWJsZSBhcyB3ZWxsLCB0aG91Z2ggaXQKK21heSBiZSBtaXNzaW5nIGlmIHlvdSBhcmUgdXNpbmcgYSByYXJlICJGSVBTIGNvbXBsaWFudCIgYnVpbGQgb2YgUHl0aG9uLgorQWRkaXRpb25hbCBhbGdvcml0aG1zIG1heSBhbHNvIGJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTAorbGlicmFyeSB0aGF0IFB5dGhvbiB1c2VzIG9uIHlvdXIgcGxhdGZvcm0uCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgOmZ1bmM6YGJsYWtlMmJgIGFuZCA6ZnVuYzpgYmxha2Uyc2Agd2VyZSBhZGRlZC4KIAogRm9yIGV4YW1wbGUsIHRvIG9idGFpbiB0aGUgZGlnZXN0IG9mIHRoZSBieXRlIHN0cmluZyBgYGInTm9ib2R5IGluc3BlY3RzIHRoZQogc3BhbW1pc2ggcmVwZXRpdGlvbidgYDo6CiAKICAgID4+PiBpbXBvcnQgaGFzaGxpYgotICAgPj4+IG0gPSBoYXNobGliLm1kNSgpCisgICA+Pj4gbSA9IGhhc2hsaWIuc2hhMjU2KCkKICAgID4+PiBtLnVwZGF0ZShiIk5vYm9keSBpbnNwZWN0cyIpCiAgICA+Pj4gbS51cGRhdGUoYiIgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQogICAgPj4+IG0uZGlnZXN0KCkKLSAgIGInXHhiYmRceDljXHg4M1x4ZGRceDFlXHhhNVx4YzlceGQ5XHhkZVx4YzlceGExXHg4ZFx4ZjBceGZmXHhlOScKKyAgIGInXHgwM1x4MWVceGRkfUFlXHgxNVx4OTNceGM1XHhmZVxcXHgwMG9ceGE1dSs3XHhmZFx4ZGZceGY3XHhiY05ceDg0Olx4YTZceGFmXHgwY1x4OTVceDBmS1x4OTRceDA2JwogICAgPj4+IG0uZGlnZXN0X3NpemUKLSAgIDE2CisgICAzMgogICAgPj4+IG0uYmxvY2tfc2l6ZQogICAgNjQKIApAQCAtMTA3LDcgKzExMyw5IEBACiAuLiBkYXRhOjogYWxnb3JpdGhtc19ndWFyYW50ZWVkCiAKICAgIEEgc2V0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBoYXNoIGFsZ29yaXRobXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQKLSAgIGJ5IHRoaXMgbW9kdWxlIG9uIGFsbCBwbGF0Zm9ybXMuCisgICBieSB0aGlzIG1vZHVsZSBvbiBhbGwgcGxhdGZvcm1zLiAgTm90ZSB0aGF0ICdtZDUnIGlzIGluIHRoaXMgbGlzdCBkZXNwaXRlCisgICBzb21lIHVwc3RyZWFtIHZlbmRvcnMgb2ZmZXJpbmcgYW4gb2RkICJGSVBTIGNvbXBsaWFudCIgUHl0aG9uIGJ1aWxkIHRoYXQKKyAgIGV4Y2x1ZGVzIGl0LgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIApAQCAtMjIxLDYgKzIyOSwyOSBAQAogICAgICAgUHl0aG9uIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gaW5saW5lIHZlcnNpb24gb2YgOm1vZDpgaG1hY2AuIEl0IGlzIGFib3V0CiAgICAgICB0aHJlZSB0aW1lcyBzbG93ZXIgYW5kIGRvZXNuJ3QgcmVsZWFzZSB0aGUgR0lMLgogCisuLiBmdW5jdGlvbjo6IHNjcnlwdChwYXNzd29yZCwgKiwgc2FsdCwgbiwgciwgcCwgbWF4bWVtPTAsIGRrbGVuPTY0KQorCisgICBUaGUgZnVuY3Rpb24gcHJvdmlkZXMgc2NyeXB0IHBhc3N3b3JkLWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGFzCisgICBkZWZpbmVkIGluIDpyZmM6YDc5MTRgLgorCisgICAqcGFzc3dvcmQqIGFuZCAqc2FsdCogbXVzdCBiZSBieXRlcy1saWtlIG9iamVjdHMuIEFwcGxpY2F0aW9ucyBhbmQKKyAgIGxpYnJhcmllcyBzaG91bGQgbGltaXQgKnBhc3N3b3JkKiB0byBhIHNlbnNpYmxlIGxlbmd0aCAoZS5nLiAxMDI0KS4gKnNhbHQqCisgICBzaG91bGQgYmUgYWJvdXQgMTYgb3IgbW9yZSBieXRlcyBmcm9tIGEgcHJvcGVyIHNvdXJjZSwgZS5nLiA6ZnVuYzpgb3MudXJhbmRvbWAuCisKKyAgICpuKiBpcyB0aGUgQ1BVL01lbW9yeSBjb3N0IGZhY3RvciwgKnIqIHRoZSBibG9jayBzaXplLCAqcCogcGFyYWxsZWxpemF0aW9uCisgICBmYWN0b3IgYW5kICptYXhtZW0qIGxpbWl0cyBtZW1vcnkgKE9wZW5TU0wgMS4xLjAgZGVmYXVsdHMgdG8gMzIgTUIpLgorICAgKmRrbGVuKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBkZXJpdmVkIGtleS4KKworICAgQXZhaWxhYmlsaXR5OiBPcGVuU1NMIDEuMSsKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworQkxBS0UyCistLS0tLS0KKworQkxBS0UyIHRha2VzIGFkZGl0aW9uYWwgYXJndW1lbnRzLCBzZWUgOnJlZjpgaGFzaGxpYi1ibGFrZTJgLgorCiAKIC4uIHNlZWFsc286OgogCkBAIC0yMzAsNiArMjYxLDggQEAKICAgIE1vZHVsZSA6bW9kOmBiYXNlNjRgCiAgICAgICBBbm90aGVyIHdheSB0byBlbmNvZGUgYmluYXJ5IGhhc2hlcyBmb3Igbm9uLWJpbmFyeSBlbnZpcm9ubWVudHMuCiAKKyAgIFNlZSA6cmVmOmBoYXNobGliLWJsYWtlMmAuCisKICAgIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxODAtMi9maXBzMTgwLTIucGRmCiAgICAgICBUaGUgRklQUyAxODAtMiBwdWJsaWNhdGlvbiBvbiBTZWN1cmUgSGFzaCBBbGdvcml0aG1zLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9odHRwLmNsaWVudC5yc3QgYi9Eb2MvbGlicmFyeS9odHRwLmNsaWVudC5yc3QKaW5kZXggYTljYTRiMC4uZDFiNDQ1MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaHR0cC5jbGllbnQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2h0dHAuY2xpZW50LnJzdApAQCAtMjE5LDM5ICsyMTksNjEgQEAKIDpjbGFzczpgSFRUUENvbm5lY3Rpb25gIGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIAogCi0uLiBtZXRob2Q6OiBIVFRQQ29ubmVjdGlvbi5yZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9e30pCisuLiBtZXRob2Q6OiBIVFRQQ29ubmVjdGlvbi5yZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9e30sICosIFwKKyAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPUZhbHNlKQogCiAgICBUaGlzIHdpbGwgc2VuZCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgSFRUUCByZXF1ZXN0CiAgICBtZXRob2QgKm1ldGhvZCogYW5kIHRoZSBzZWxlY3RvciAqdXJsKi4KIAogICAgSWYgKmJvZHkqIGlzIHNwZWNpZmllZCwgdGhlIHNwZWNpZmllZCBkYXRhIGlzIHNlbnQgYWZ0ZXIgdGhlIGhlYWRlcnMgYXJlCi0gICBmaW5pc2hlZC4gIEl0IG1heSBiZSBhIHN0cmluZywgYSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgLCBhbiBvcGVuCi0gICA6dGVybTpgZmlsZSBvYmplY3RgLCBvciBhbiBpdGVyYWJsZSBvZiA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgXHMuICBJZgotICAgKmJvZHkqIGlzIGEgc3RyaW5nLCBpdCBpcyBlbmNvZGVkIGFzIElTTy04ODU5LTEsIHRoZSBkZWZhdWx0IGZvciBIVFRQLiAgSWYKLSAgIGl0IGlzIGEgYnl0ZXMtbGlrZSBvYmplY3QgdGhlIGJ5dGVzIGFyZSBzZW50IGFzIGlzLiAgSWYgaXQgaXMgYSA6dGVybTpgZmlsZQotICAgb2JqZWN0YCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGlzIHNlbnQ7IHRoaXMgZmlsZSBvYmplY3Qgc2hvdWxkIHN1cHBvcnQKLSAgIGF0IGxlYXN0IHRoZSBgYHJlYWQoKWBgIG1ldGhvZC4gIElmIHRoZSBmaWxlIG9iamVjdCBoYXMgYSBgYG1vZGVgYAotICAgYXR0cmlidXRlLCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgYGByZWFkKClgYCBtZXRob2Qgd2lsbCBiZSBlbmNvZGVkIGFzCi0gICBJU08tODg1OS0xIHVubGVzcyB0aGUgYGBtb2RlYGAgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgYGBiYGAsCi0gICBvdGhlcndpc2UgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYGByZWFkKClgYCBpcyBzZW50IGFzIGlzLiAgSWYgKmJvZHkqIGlzIGFuCi0gICBpdGVyYWJsZSwgdGhlIGVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZSBhcmUgc2VudCBhcyBpcyB1bnRpbCB0aGUgaXRlcmFibGUgaXMKLSAgIGV4aGF1c3RlZC4KKyAgIGZpbmlzaGVkLiAgSXQgbWF5IGJlIGEgOmNsYXNzOmBzdHJgLCBhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAsIGFuCisgICBvcGVuIDp0ZXJtOmBmaWxlIG9iamVjdGAsIG9yIGFuIGl0ZXJhYmxlIG9mIDpjbGFzczpgYnl0ZXNgLiAgSWYgKmJvZHkqCisgICBpcyBhIHN0cmluZywgaXQgaXMgZW5jb2RlZCBhcyBJU08tODg1OS0xLCB0aGUgZGVmYXVsdCBmb3IgSFRUUC4gIElmIGl0CisgICBpcyBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCB0aGUgYnl0ZXMgYXJlIHNlbnQgYXMgaXMuICBJZiBpdCBpcyBhIDp0ZXJtOmBmaWxlCisgICBvYmplY3RgLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgaXMgc2VudDsgdGhpcyBmaWxlIG9iamVjdCBzaG91bGQKKyAgIHN1cHBvcnQgYXQgbGVhc3QgdGhlIGBgcmVhZCgpYGAgbWV0aG9kLiAgSWYgdGhlIGZpbGUgb2JqZWN0IGlzIGFuCisgICBpbnN0YW5jZSBvZiA6Y2xhc3M6YGlvLlRleHRJT0Jhc2VgLCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgYGByZWFkKClgYAorICAgbWV0aG9kIHdpbGwgYmUgZW5jb2RlZCBhcyBJU08tODg1OS0xLCBvdGhlcndpc2UgdGhlIGRhdGEgcmV0dXJuZWQgYnkKKyAgIGBgcmVhZCgpYGAgaXMgc2VudCBhcyBpcy4gIElmICpib2R5KiBpcyBhbiBpdGVyYWJsZSwgdGhlIGVsZW1lbnRzIG9mIHRoZQorICAgaXRlcmFibGUgYXJlIHNlbnQgYXMgaXMgdW50aWwgdGhlIGl0ZXJhYmxlIGlzIGV4aGF1c3RlZC4KIAotICAgVGhlICpoZWFkZXJzKiBhcmd1bWVudCBzaG91bGQgYmUgYSBtYXBwaW5nIG9mIGV4dHJhIEhUVFAKLSAgIGhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgVGhlICpoZWFkZXJzKiBhcmd1bWVudCBzaG91bGQgYmUgYSBtYXBwaW5nIG9mIGV4dHJhIEhUVFAgaGVhZGVycyB0byBzZW5kCisgICB3aXRoIHRoZSByZXF1ZXN0LgogCi0gICBJZiAqaGVhZGVycyogZG9lcyBub3QgY29udGFpbiBhIENvbnRlbnQtTGVuZ3RoIGl0ZW0sIG9uZSBpcyBhZGRlZAotICAgYXV0b21hdGljYWxseSBpZiBwb3NzaWJsZS4gIElmICpib2R5KiBpcyBgYE5vbmVgYCwgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcgotICAgaXMgc2V0IHRvIGBgMGBgIGZvciBtZXRob2RzIHRoYXQgZXhwZWN0IGEgYm9keSAoYGBQVVRgYCwgYGBQT1NUYGAsIGFuZAotICAgYGBQQVRDSGBgKS4gIElmICpib2R5KiBpcyBhIHN0cmluZyBvciBieXRlcyBvYmplY3QsIHRoZSBDb250ZW50LUxlbmd0aAotICAgaGVhZGVyIGlzIHNldCB0byBpdHMgbGVuZ3RoLiAgSWYgKmJvZHkqIGlzIGEgOnRlcm06YGZpbGUgb2JqZWN0YCBhbmQgaXQKLSAgIHdvcmtzIHRvIGNhbGwgOmZ1bmM6YH5vcy5mc3RhdGAgb24gdGhlIHJlc3VsdCBvZiBpdHMgYGBmaWxlbm8oKWBgIG1ldGhvZCwKLSAgIHRoZW4gdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBpcyBzZXQgdG8gdGhlIGBgc3Rfc2l6ZWBgIHJlcG9ydGVkIGJ5IHRoZQotICAgYGBmc3RhdGBgIGNhbGwuICBPdGhlcndpc2Ugbm8gQ29udGVudC1MZW5ndGggaGVhZGVyIGlzIGFkZGVkLgorICAgSWYgKmhlYWRlcnMqIGNvbnRhaW5zIG5laXRoZXIgQ29udGVudC1MZW5ndGggbm9yIFRyYW5zZmVyLUVuY29kaW5nLAorICAgYnV0IHRoZXJlIGlzIGEgcmVxdWVzdCBib2R5LCBvbmUgb2YgdGhvc2UKKyAgIGhlYWRlciBmaWVsZHMgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LiAgSWYKKyAgICpib2R5KiBpcyBgYE5vbmVgYCwgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBpcyBzZXQgdG8gYGAwYGAgZm9yCisgICBtZXRob2RzIHRoYXQgZXhwZWN0IGEgYm9keSAoYGBQVVRgYCwgYGBQT1NUYGAsIGFuZCBgYFBBVENIYGApLiAgSWYKKyAgICpib2R5KiBpcyBhIHN0cmluZyBvciBhIGJ5dGVzLWxpa2Ugb2JqZWN0IHRoYXQgaXMgbm90IGFsc28gYQorICAgOnRlcm06YGZpbGUgPGZpbGUgb2JqZWN0PmAsIHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgaXMKKyAgIHNldCB0byBpdHMgbGVuZ3RoLiAgQW55IG90aGVyIHR5cGUgb2YgKmJvZHkqIChmaWxlcworICAgYW5kIGl0ZXJhYmxlcyBpbiBnZW5lcmFsKSB3aWxsIGJlIGNodW5rLWVuY29kZWQsIGFuZCB0aGUKKyAgIFRyYW5zZmVyLUVuY29kaW5nIGhlYWRlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2V0IGluc3RlYWQgb2YKKyAgIENvbnRlbnQtTGVuZ3RoLgorCisgICBUaGUgKmVuY29kZV9jaHVua2VkKiBhcmd1bWVudCBpcyBvbmx5IHJlbGV2YW50IGlmIFRyYW5zZmVyLUVuY29kaW5nIGlzCisgICBzcGVjaWZpZWQgaW4gKmhlYWRlcnMqLiAgSWYgKmVuY29kZV9jaHVua2VkKiBpcyBgYEZhbHNlYGAsIHRoZQorICAgSFRUUENvbm5lY3Rpb24gb2JqZWN0IGFzc3VtZXMgdGhhdCBhbGwgZW5jb2RpbmcgaXMgaGFuZGxlZCBieSB0aGUKKyAgIGNhbGxpbmcgY29kZS4gIElmIGl0IGlzIGBgVHJ1ZWBgLCB0aGUgYm9keSB3aWxsIGJlIGNodW5rLWVuY29kZWQuCisKKyAgIC4uIG5vdGU6OgorICAgICAgQ2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgSFRUUCBwcm90b2NvbAorICAgICAgdmVyc2lvbiAxLjEuICBVbmxlc3MgdGhlIEhUVFAgc2VydmVyIGlzIGtub3duIHRvIGhhbmRsZSBIVFRQIDEuMSwKKyAgICAgIHRoZSBjYWxsZXIgbXVzdCBlaXRoZXIgc3BlY2lmeSB0aGUgQ29udGVudC1MZW5ndGgsIG9yIG11c3QgcGFzcyBhCisgICAgICA6Y2xhc3M6YHN0cmAgb3IgYnl0ZXMtbGlrZSBvYmplY3QgdGhhdCBpcyBub3QgYWxzbyBhIGZpbGUgYXMgdGhlCisgICAgICBib2R5IHJlcHJlc2VudGF0aW9uLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKICAgICAgICpib2R5KiBjYW4gbm93IGJlIGFuIGl0ZXJhYmxlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgSWYgbmVpdGhlciBDb250ZW50LUxlbmd0aCBub3IgVHJhbnNmZXItRW5jb2RpbmcgYXJlIHNldCBpbgorICAgICAgKmhlYWRlcnMqLCBmaWxlIGFuZCBpdGVyYWJsZSAqYm9keSogb2JqZWN0cyBhcmUgbm93IGNodW5rLWVuY29kZWQuCisgICAgICBUaGUgKmVuY29kZV9jaHVua2VkKiBhcmd1bWVudCB3YXMgYWRkZWQuCisgICAgICBObyBhdHRlbXB0IGlzIG1hZGUgdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LUxlbmd0aCBmb3IgZmlsZQorICAgICAgb2JqZWN0cy4KKwogLi4gbWV0aG9kOjogSFRUUENvbm5lY3Rpb24uZ2V0cmVzcG9uc2UoKQogCiAgICBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgcmVxdWVzdCBpcyBzZW50IHRvIGdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgpAQCAtMzM2LDEzICszNTgsMzIgQEAKICAgIGFuIGFyZ3VtZW50LgogCiAKLS4uIG1ldGhvZDo6IEhUVFBDb25uZWN0aW9uLmVuZGhlYWRlcnMobWVzc2FnZV9ib2R5PU5vbmUpCisuLiBtZXRob2Q6OiBIVFRQQ29ubmVjdGlvbi5lbmRoZWFkZXJzKG1lc3NhZ2VfYm9keT1Ob25lLCAqLCBlbmNvZGVfY2h1bmtlZD1GYWxzZSkKIAogICAgU2VuZCBhIGJsYW5rIGxpbmUgdG8gdGhlIHNlcnZlciwgc2lnbmFsbGluZyB0aGUgZW5kIG9mIHRoZSBoZWFkZXJzLiBUaGUKICAgIG9wdGlvbmFsICptZXNzYWdlX2JvZHkqIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBtZXNzYWdlIGJvZHkKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4gIFRoZSBtZXNzYWdlIGJvZHkgd2lsbCBiZSBzZW50IGluIHRoZSBzYW1lCi0gICBwYWNrZXQgYXMgdGhlIG1lc3NhZ2UgaGVhZGVycyBpZiBpdCBpcyBzdHJpbmcsIG90aGVyd2lzZSBpdCBpcyBzZW50IGluIGEKLSAgIHNlcGFyYXRlIHBhY2tldC4KKyAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKworICAgSWYgKmVuY29kZV9jaHVua2VkKiBpcyBgYFRydWVgYCwgdGhlIHJlc3VsdCBvZiBlYWNoIGl0ZXJhdGlvbiBvZgorICAgKm1lc3NhZ2VfYm9keSogd2lsbCBiZSBjaHVuay1lbmNvZGVkIGFzIHNwZWNpZmllZCBpbiA6cmZjOmA3MjMwYCwKKyAgIFNlY3Rpb24gMy4zLjEuICBIb3cgdGhlIGRhdGEgaXMgZW5jb2RlZCBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YKKyAgICptZXNzYWdlX2JvZHkqLiAgSWYgKm1lc3NhZ2VfYm9keSogaW1wbGVtZW50cyB0aGUgOnJlZjpgYnVmZmVyIGludGVyZmFjZQorICAgPGJ1ZmZlcm9iamVjdHM+YCB0aGUgZW5jb2Rpbmcgd2lsbCByZXN1bHQgaW4gYSBzaW5nbGUgY2h1bmsuCisgICBJZiAqbWVzc2FnZV9ib2R5KiBpcyBhIDpjbGFzczpgY29sbGVjdGlvbnMuSXRlcmFibGVgLCBlYWNoIGl0ZXJhdGlvbgorICAgb2YgKm1lc3NhZ2VfYm9keSogd2lsbCByZXN1bHQgaW4gYSBjaHVuay4gIElmICptZXNzYWdlX2JvZHkqIGlzIGEKKyAgIDp0ZXJtOmBmaWxlIG9iamVjdGAsIGVhY2ggY2FsbCB0byBgYC5yZWFkKClgYCB3aWxsIHJlc3VsdCBpbiBhIGNodW5rLgorICAgVGhlIG1ldGhvZCBhdXRvbWF0aWNhbGx5IHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgY2h1bmstZW5jb2RlZCBkYXRhCisgICBpbW1lZGlhdGVseSBhZnRlciAqbWVzc2FnZV9ib2R5Ki4KKworICAgLi4gbm90ZTo6IER1ZSB0byB0aGUgY2h1bmtlZCBlbmNvZGluZyBzcGVjaWZpY2F0aW9uLCBlbXB0eSBjaHVua3MKKyAgICAgIHlpZWxkZWQgYnkgYW4gaXRlcmF0b3IgYm9keSB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIGNodW5rLWVuY29kZXIuCisgICAgICBUaGlzIGlzIHRvIGF2b2lkIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiB0aGUgcmVhZCBvZiB0aGUgcmVxdWVzdCBieQorICAgICAgdGhlIHRhcmdldCBzZXJ2ZXIgZHVlIHRvIG1hbGZvcm1lZCBlbmNvZGluZy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBDaHVua2VkIGVuY29kaW5nIHN1cHBvcnQuICBUaGUgKmVuY29kZV9jaHVua2VkKiBwYXJhbWV0ZXIgd2FzCisgICAgICBhZGRlZC4KKwogCiAuLiBtZXRob2Q6OiBIVFRQQ29ubmVjdGlvbi5zZW5kKGRhdGEpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdAppbmRleCAxNmM0ZmFjLi5jMWVhODczIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CkBAIC05OCw4ICs5OCw4IEBACiAKICAgIC4uIGF0dHJpYnV0ZTo6IHJmaWxlCiAKLSAgICAgIENvbnRhaW5zIGFuIGlucHV0IHN0cmVhbSwgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIG9wdGlvbmFsIGlucHV0Ci0gICAgICBkYXRhLgorICAgICAgQW4gOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGZyb20KKyAgICAgIHRoZSBzdGFydCBvZiB0aGUgb3B0aW9uYWwgaW5wdXQgZGF0YS4KIAogICAgLi4gYXR0cmlidXRlOjogd2ZpbGUKIApAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgICBjbGllbnQuIFByb3BlciBhZGhlcmVuY2UgdG8gdGhlIEhUVFAgcHJvdG9jb2wgbXVzdCBiZSB1c2VkIHdoZW4gd3JpdGluZyB0bwogICAgICAgdGhpcyBzdHJlYW0uCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBUaGlzIGlzIGFuIDpjbGFzczpgaW8uQnVmZmVyZWRJT0Jhc2VgIHN0cmVhbS4KKwogICAgOmNsYXNzOmBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyYCBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgogCiAgICAuLiBhdHRyaWJ1dGU6OiBzZXJ2ZXJfdmVyc2lvbgpAQCAtMzY5LDEwICszNzIsOSBAQAogCiAgICBIYW5kbGVyID0gaHR0cC5zZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCiAKLSAgIGh0dHBkID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoIiIsIFBPUlQpLCBIYW5kbGVyKQotCi0gICBwcmludCgic2VydmluZyBhdCBwb3J0IiwgUE9SVCkKLSAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKCgiIiwgUE9SVCksIEhhbmRsZXIpIGFzIGh0dHBkOgorICAgICAgIHByaW50KCJzZXJ2aW5nIGF0IHBvcnQiLCBQT1JUKQorICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAuLiBfaHR0cC1zZXJ2ZXItY2xpOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbWFwbGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CmluZGV4IGMyNWU3ZDguLmI5YjNiOTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CkBAIC01MDAsNiArNTAwLDE3IEBACiAgICAgICAgICBNLnN0b3JlKG51bSwgJytGTEFHUycsICdcXERlbGV0ZWQnKQogICAgICAgTS5leHB1bmdlKCkKIAorICAgLi4gbm90ZTo6CisKKyAgICAgIENyZWF0aW5nIGZsYWdzIGNvbnRhaW5pbmcgJ10nIChmb3IgZXhhbXBsZTogIlt0ZXN0XSIpIHZpb2xhdGVzCisgICAgICA6cmZjOmAzNTAxYCAodGhlIElNQVAgcHJvdG9jb2wpLiAgSG93ZXZlciwgaW1hcGxpYiBoYXMgaGlzdG9yaWNhbGx5CisgICAgICBhbGxvd2VkIGNyZWF0aW9uIG9mIHN1Y2ggdGFncywgYW5kIHBvcHVsYXIgSU1BUCBzZXJ2ZXJzLCBzdWNoIGFzIEdtYWlsLAorICAgICAgYWNjZXB0IGFuZCBwcm9kdWNlIHN1Y2ggZmxhZ3MuICBUaGVyZSBhcmUgbm9uLVB5dGhvbiBwcm9ncmFtcyB3aGljaCBhbHNvCisgICAgICBjcmVhdGUgc3VjaCB0YWdzLiAgQWx0aG91Z2ggaXQgaXMgYW4gUkZDIHZpb2xhdGlvbiBhbmQgSU1BUCBjbGllbnRzIGFuZAorICAgICAgc2VydmVycyBhcmUgc3VwcG9zZWQgdG8gYmUgc3RyaWN0LCBpbWFwbGliIG5vbmV0aGVsZXNzIGNvbnRpbnVlcyB0byBhbGxvdworICAgICAgc3VjaCB0YWdzIHRvIGJlIGNyZWF0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYW5kIGFzIG9mCisgICAgICBweXRob24gMy42LCBoYW5kbGVzIHRoZW0gaWYgdGhleSBhcmUgc2VudCBmcm9tIHRoZSBzZXJ2ZXIsIHNpbmNlIHRoaXMKKyAgICAgIGltcHJvdmVzIHJlYWwtd29ybGQgY29tcGF0aWJpbGl0eS4KIAogLi4gbWV0aG9kOjogSU1BUDQuc3Vic2NyaWJlKG1haWxib3gpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcC5yc3QgYi9Eb2MvbGlicmFyeS9pbXAucnN0CmluZGV4IDk4MjhiYTYuLmNjZjVmOTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wLnJzdApAQCAtODUsNyArODUsOSBAQAogICAgLi4gZGVwcmVjYXRlZDo6IDMuMwogICAgICAgVXNlIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWNgIGluc3RlYWQgdW5sZXNzIFB5dGhvbiAzLjMKICAgICAgIGNvbXBhdGliaWxpdHkgaXMgcmVxdWlyZWQsIGluIHdoaWNoIGNhc2UgdXNlCi0gICAgICA6ZnVuYzpgaW1wb3J0bGliLmZpbmRfbG9hZGVyYC4KKyAgICAgIDpmdW5jOmBpbXBvcnRsaWIuZmluZF9sb2FkZXJgLiBGb3IgZXhhbXBsZSB1c2FnZSBvZiB0aGUgZm9ybWVyIGNhc2UsCisgICAgICBzZWUgdGhlIDpyZWY6YGltcG9ydGxpYi1leGFtcGxlc2Agc2VjdGlvbiBvZiB0aGUgOm1vZDpgaW1wb3J0bGliYAorICAgICAgZG9jdW1lbnRhdGlvbi4KIAogCiAuLiBmdW5jdGlvbjo6IGxvYWRfbW9kdWxlKG5hbWUsIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKQEAgLTExMiw5ICsxMTQsMTIgQEAKICAgICAgIElmIHByZXZpb3VzbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDpmdW5jOmBpbXAuZmluZF9tb2R1bGVgIHRoZW4KICAgICAgIGNvbnNpZGVyIHVzaW5nIDpmdW5jOmBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZWAsIG90aGVyd2lzZSB1c2UgdGhlIGxvYWRlcgogICAgICAgcmV0dXJuZWQgYnkgdGhlIHJlcGxhY2VtZW50IHlvdSBjaG9zZSBmb3IgOmZ1bmM6YGltcC5maW5kX21vZHVsZWAuIElmIHlvdQotICAgICAgY2FsbGVkIDpmdW5jOmBpbXAubG9hZF9tb2R1bGVgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkaXJlY3RseSB0aGVuIHVzZSB0aGUKLSAgICAgIGNsYXNzZXMgaW4gOm1vZDpgaW1wb3J0bGliLm1hY2hpbmVyeWAsIGUuZy4KLSAgICAgIGBgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyKG5hbWUsIHBhdGgpLmxvYWRfbW9kdWxlKClgYC4KKyAgICAgIGNhbGxlZCA6ZnVuYzpgaW1wLmxvYWRfbW9kdWxlYCBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgZGlyZWN0bHkgd2l0aCBmaWxlCisgICAgICBwYXRoIGFyZ3VtZW50cyB0aGVuIHVzZSBhIGNvbWJpbmF0aW9uIG9mCisgICAgICA6ZnVuYzpgaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb25gIGFuZAorICAgICAgOmZ1bmM6YGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWNgLiBTZWUgdGhlIDpyZWY6YGltcG9ydGxpYi1leGFtcGxlc2AKKyAgICAgIHNlY3Rpb24gb2YgdGhlIDptb2Q6YGltcG9ydGxpYmAgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvZiB0aGUgdmFyaW91cworICAgICAgYXBwcm9hY2hlcy4KIAogCiAuLiBmdW5jdGlvbjo6IG5ld19tb2R1bGUobmFtZSkKQEAgLTEyMyw3ICsxMjgsNyBAQAogICAgaW4gYGBzeXMubW9kdWxlc2BgLgogCiAgICAuLiBkZXByZWNhdGVkOjogMy40Ci0gICAgICBVc2UgOmNsYXNzOmB0eXBlcy5Nb2R1bGVUeXBlYCBpbnN0ZWFkLgorICAgICAgVXNlIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjYCBpbnN0ZWFkLgogCiAKIC4uIGZ1bmN0aW9uOjogcmVsb2FkKG1vZHVsZSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CmluZGV4IDNkODM1MDkuLmZmZDUxNjIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICBtb2R1bGUgYW5kICpwYXRoKiB3aWxsIGJlIHRoZSB2YWx1ZSBvZiA6YXR0cjpgX19wYXRoX19gIGZyb20gdGhlCiAgICAgICBwYXJlbnQgcGFja2FnZS4gSWYgYSBzcGVjIGNhbm5vdCBiZSBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuCiAgICAgICBXaGVuIHBhc3NlZCBpbiwgYGB0YXJnZXRgYCBpcyBhIG1vZHVsZSBvYmplY3QgdGhhdCB0aGUgZmluZGVyIG1heQotICAgICAgdXNlIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkIGFib3V0IHdoYXQgc3BlYyB0byByZXR1cm4uCisgICAgICB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQgZ3Vlc3MgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgICAgd2l0aGluIHRoZSA6dGVybTpgcGF0aCBlbnRyeWAgdG8gd2hpY2ggaXQgaXMgYXNzaWduZWQuICBJZiBhIHNwZWMKICAgICAgIGNhbm5vdCBiZSBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuICBXaGVuIHBhc3NlZCBpbiwgYGB0YXJnZXRgYAogICAgICAgaXMgYSBtb2R1bGUgb2JqZWN0IHRoYXQgdGhlIGZpbmRlciBtYXkgdXNlIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkCi0gICAgICBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgorICAgICAgZ3Vlc3MgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTM3OSwxMCArMzc5LDE0IEBACiAKICAgICAgICBBbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBleGVjdXRlcyB0aGUgbW9kdWxlIGluIGl0cyBvd24gbmFtZXNwYWNlCiAgICAgICAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBvciByZWxvYWRlZC4gIFRoZSBtb2R1bGUgc2hvdWxkIGFscmVhZHkKLSAgICAgICBiZSBpbml0aWFsaXplZCB3aGVuIGV4ZWNfbW9kdWxlKCkgaXMgY2FsbGVkLgorICAgICAgIGJlIGluaXRpYWxpemVkIHdoZW4gYGBleGVjX21vZHVsZSgpYGAgaXMgY2FsbGVkLiBXaGVuIHRoaXMgbWV0aG9kIGV4aXN0cywKKyAgICAgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG11c3QgYmUgZGVmaW5lZC4KIAogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG11c3QgYWxzbyBiZSBkZWZpbmVkLgorCiAgICAgLi4gbWV0aG9kOjogbG9hZF9tb2R1bGUoZnVsbG5hbWUpCiAKICAgICAgICAgQSBsZWdhY3kgbWV0aG9kIGZvciBsb2FkaW5nIGEgbW9kdWxlLiBJZiB0aGUgbW9kdWxlIGNhbm5vdCBiZQpAQCAtOTM2LDYgKzk0MCwxMCBAQAogICAgICAgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB3aGVyZQogICAgICAgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgaXMgb3B0aW9uYWwuCiAKKyAgICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKworICAgICAgICAgVXNlIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgaW5zdGVhZC4KKwogCiAuLiBjbGFzczo6IFNvdXJjZWxlc3NGaWxlTG9hZGVyKGZ1bGxuYW1lLCBwYXRoKQogCkBAIC05NzUsNiArOTgzLDEwIEBACiAgICBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHdoZXJlCiAgICBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCBpcyBvcHRpb25hbC4KIAorICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorCisgICAgICBVc2UgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpbnN0ZWFkLgorCiAKIC4uIGNsYXNzOjogRXh0ZW5zaW9uRmlsZUxvYWRlcihmdWxsbmFtZSwgcGF0aCkKIApAQCAtMTE5MiwxMiArMTIwNCwxMyBAQAogCiAuLiBmdW5jdGlvbjo6IG1vZHVsZV9mcm9tX3NwZWMoc3BlYykKIAotICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBiYXNlZCBvbiAqKnNwZWMqKiBhbmQgYGBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlKClgYC4KKyAgIENyZWF0ZSBhIG5ldyBtb2R1bGUgYmFzZWQgb24gKipzcGVjKiogYW5kCisgICA6bWV0aDpgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSA8aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZT5gLgogCi0gICBJZiBgYHNwZWMubG9hZGVyLmNyZWF0ZV9tb2R1bGUoKWBgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgdGhlbiBhbnkKLSAgIHByZS1leGlzdGluZyBhdHRyaWJ1dGVzIHdpbGwgbm90IGJlIHJlc2V0LiBBbHNvLCBubyA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAKLSAgIHdpbGwgYmUgcmFpc2VkIGlmIHRyaWdnZXJlZCB3aGlsZSBhY2Nlc3NpbmcgKipzcGVjKiogb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUKLSAgIG9uIHRoZSBtb2R1bGUuCisgICBJZiA6bWV0aDpgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSA8aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZT5gCisgICBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIHRoZW4gYW55IHByZS1leGlzdGluZyBhdHRyaWJ1dGVzIHdpbGwgbm90IGJlIHJlc2V0LgorICAgQWxzbywgbm8gOmV4YzpgQXR0cmlidXRlRXJyb3JgIHdpbGwgYmUgcmFpc2VkIGlmIHRyaWdnZXJlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICoqc3BlYyoqIG9yIHNldHRpbmcgYW4gYXR0cmlidXRlIG9uIHRoZSBtb2R1bGUuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgOmNsYXNzOmB0eXBlcy5Nb2R1bGVUeXBlYCB0byBjcmVhdGUgYQogICAgbmV3IG1vZHVsZSBhcyAqKnNwZWMqKiBpcyB1c2VkIHRvIHNldCBhcyBtYW55IGltcG9ydC1jb250cm9sbGVkIGF0dHJpYnV0ZXMgb24KQEAgLTEyNTksNyArMTI3Miw4IEBACiAKIC4uIGRlY29yYXRvcjo6IHNldF9wYWNrYWdlCiAKLSAgIEEgOnRlcm06YGRlY29yYXRvcmAgZm9yIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgdG8gc2V0IHRoZSA6YXR0cjpgX19wYWNrYWdlX19gIGF0dHJpYnV0ZSBvbiB0aGUgcmV0dXJuZWQgbW9kdWxlLiBJZiA6YXR0cjpgX19wYWNrYWdlX19gCisgICBBIDp0ZXJtOmBkZWNvcmF0b3JgIGZvciA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHRvIHNldCB0aGUKKyAgIDphdHRyOmBfX3BhY2thZ2VfX2AgYXR0cmlidXRlIG9uIHRoZSByZXR1cm5lZCBtb2R1bGUuIElmIDphdHRyOmBfX3BhY2thZ2VfX2AKICAgIGlzIHNldCBhbmQgaGFzIGEgdmFsdWUgb3RoZXIgdGhhbiBgYE5vbmVgYCBpdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgogCiAgICAuLiBkZXByZWNhdGVkOjogMy40CkBAIC0xMjkyLDEzICsxMzA2LDEyIEBACiAgICBUaGlzIGNsYXNzICoqb25seSoqIHdvcmtzIHdpdGggbG9hZGVycyB0aGF0IGRlZmluZQogICAgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgYXMgY29udHJvbCBvdmVyIHdoYXQgbW9kdWxlIHR5cGUKICAgIGlzIHVzZWQgZm9yIHRoZSBtb2R1bGUgaXMgcmVxdWlyZWQuIEZvciB0aG9zZSBzYW1lIHJlYXNvbnMsIHRoZSBsb2FkZXIncwotICAgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkIChpLmUuLCB0aGUKLSAgIGxvYWRlcidzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gYGBOb25lYGA7IHRoaXMgZXhjbHVkZXMKLSAgIDpjbGFzczpgQnVpbHRpbkltcG9ydGVyYCBhbmQgOmNsYXNzOmBFeHRlbnNpb25GaWxlTG9hZGVyYCkuIEZpbmFsbHksCi0gICBtb2R1bGVzIHdoaWNoIHN1YnN0aXR1dGUgdGhlIG9iamVjdCBwbGFjZWQgaW50byA6YXR0cjpgc3lzLm1vZHVsZXNgIHdpbGwKLSAgIG5vdCB3b3JrIGFzIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZXBsYWNlIHRoZSBtb2R1bGUgcmVmZXJlbmNlcwotICAgdGhyb3VnaG91dCB0aGUgaW50ZXJwcmV0ZXIgc2FmZWx5OyA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgc3VjaCBhCi0gICBzdWJzdGl0dXRpb24gaXMgZGV0ZWN0ZWQuCisgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG1ldGhvZCBtdXN0IHJldHVybiBgYE5vbmVgYCBvciBhCisgICB0eXBlIGZvciB3aGljaCBpdHMgYGBfX2NsYXNzX19gYCBhdHRyaWJ1dGUgY2FuIGJlIG11dGF0ZWQgYWxvbmcgd2l0aCBub3QKKyAgIHVzaW5nIDp0ZXJtOmBzbG90cyA8X19zbG90c19fPmAuIEZpbmFsbHksIG1vZHVsZXMgd2hpY2ggc3Vic3RpdHV0ZSB0aGUgb2JqZWN0CisgICBwbGFjZWQgaW50byA6YXR0cjpgc3lzLm1vZHVsZXNgIHdpbGwgbm90IHdvcmsgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5CisgICByZXBsYWNlIHRoZSBtb2R1bGUgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoZSBpbnRlcnByZXRlciBzYWZlbHk7CisgICA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgc3VjaCBhIHN1YnN0aXR1dGlvbiBpcyBkZXRlY3RlZC4KIAogICAgLi4gbm90ZTo6CiAgICAgICBGb3IgcHJvamVjdHMgd2hlcmUgc3RhcnR1cCB0aW1lIGlzIGNyaXRpY2FsLCB0aGlzIGNsYXNzIGFsbG93cyBmb3IKQEAgLTEzMDksNiArMTMyMiwxMSBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEJlZ2FuIGNhbGxpbmcgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCwgcmVtb3ZpbmcgdGhlCisgICAgICBjb21wYXRpYmlsaXR5IHdhcm5pbmcgZm9yIDpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5CdWlsdGluSW1wb3J0ZXJgIGFuZAorICAgICAgOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkV4dGVuc2lvbkZpbGVMb2FkZXJgLgorCiAgICAuLiBjbGFzc21ldGhvZDo6IGZhY3RvcnkobG9hZGVyKQogCiAgICAgICBBIHN0YXRpYyBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIGNhbGxhYmxlIHRoYXQgY3JlYXRlcyBhIGxhenkgbG9hZGVyLiBUaGlzCkBAIC0xMzIwLDMgKzEzMzgsMTIwIEBACiAgICAgICAgIGxvYWRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlRmlsZUxvYWRlcgogICAgICAgICBsYXp5X2xvYWRlciA9IGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXIuZmFjdG9yeShsb2FkZXIpCiAgICAgICAgIGZpbmRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuRmlsZUZpbmRlcihwYXRoLCAobGF6eV9sb2FkZXIsIHN1ZmZpeGVzKSkKKworLi4gX2ltcG9ydGxpYi1leGFtcGxlczoKKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1RvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLCB1c2UgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYC4KKzo6CisKKyAgaW1wb3J0IGltcG9ydGxpYgorCisgIGl0ZXJ0b29scyA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdpdGVydG9vbHMnKQorCitJZiB5b3UgbmVlZCB0byBmaW5kIG91dCBpZiBhIG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgd2l0aG91dCBhY3R1YWxseSBkb2luZyB0aGUKK2ltcG9ydCwgdGhlbiB5b3Ugc2hvdWxkIHVzZSA6ZnVuYzpgaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjYC4KKzo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi51dGlsCisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCisgIG5hbWUgPSAnaXRlcnRvb2xzJworCisgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgaWYgc3BlYyBpcyBOb25lOgorICAgICAgcHJpbnQoImNhbid0IGZpbmQgdGhlIGl0ZXJ0b29scyBtb2R1bGUiKQorICBlbHNlOgorICAgICAgIyBJZiB5b3UgY2hvc2UgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGltcG9ydCAuLi4KKyAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgICAgICMgQWRkaW5nIHRoZSBtb2R1bGUgdG8gc3lzLm1vZHVsZXMgaXMgb3B0aW9uYWwuCisgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG1vZHVsZQorCitUbyBpbXBvcnQgYSBQeXRob24gc291cmNlIGZpbGUgZGlyZWN0bHksIHVzZSB0aGUgZm9sbG93aW5nIHJlY2lwZQorKFB5dGhvbiAzLjQgYW5kIG5ld2VyIG9ubHkpOjoKKworICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKKyAgaW1wb3J0IHN5cworCisgICMgRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgaW1wb3J0IHRva2VuaXplCisgIGZpbGVfcGF0aCA9IHRva2VuaXplLl9fZmlsZV9fCisgIG1vZHVsZV9uYW1lID0gdG9rZW5pemUuX19uYW1lX18KKworICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24obW9kdWxlX25hbWUsIGZpbGVfcGF0aCkKKyAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQorICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCisgICMgT3B0aW9uYWw7IG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gaW1wb3J0IHRoZSBtb2R1bGUKKyAgIyBieSBuYW1lIGxhdGVyLgorICBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0gPSBtb2R1bGUKKworRm9yIGRlZXAgY3VzdG9taXphdGlvbnMgb2YgaW1wb3J0LCB5b3UgdHlwaWNhbGx5IHdhbnQgdG8gaW1wbGVtZW50IGFuCis6dGVybTpgaW1wb3J0ZXJgLiBUaGlzIG1lYW5zIG1hbmFnaW5nIGJvdGggdGhlIDp0ZXJtOmBmaW5kZXJgIGFuZCA6dGVybTpgbG9hZGVyYAorc2lkZSBvZiB0aGluZ3MuIEZvciBmaW5kZXJzIHRoZXJlIGFyZSB0d28gZmxhdm91cnMgdG8gY2hvb3NlIGZyb20gZGVwZW5kaW5nIG9uCit5b3VyIG5lZWRzOiBhIDp0ZXJtOmBtZXRhIHBhdGggZmluZGVyYCBvciBhIDp0ZXJtOmBwYXRoIGVudHJ5IGZpbmRlcmAuIFRoZQorZm9ybWVyIGlzIHdoYXQgeW91IHdvdWxkIHB1dCBvbiA6YXR0cjpgc3lzLm1ldGFfcGF0aGAgd2hpbGUgdGhlIGxhdHRlciBpcyB3aGF0Cit5b3UgY3JlYXRlIHVzaW5nIGEgOnRlcm06YHBhdGggZW50cnkgaG9va2Agb24gOmF0dHI6YHN5cy5wYXRoX2hvb2tzYCB3aGljaCB3b3Jrcword2l0aCA6YXR0cjpgc3lzLnBhdGhgIGVudHJpZXMgdG8gcG90ZW50aWFsbHkgY3JlYXRlIGEgZmluZGVyLiBUaGlzIGV4YW1wbGUgd2lsbAorc2hvdyB5b3UgaG93IHRvIHJlZ2lzdGVyIHlvdXIgb3duIGltcG9ydGVycyBzbyB0aGF0IGltcG9ydCB3aWxsIHVzZSB0aGVtIChmb3IKK2NyZWF0aW5nIGFuIGltcG9ydGVyIGZvciB5b3Vyc2VsZiwgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGFwcHJvcHJpYXRlCitjbGFzc2VzIGRlZmluZWQgd2l0aGluIHRoaXMgcGFja2FnZSk6OgorCisgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seS4KKyAgU3BhbU1ldGFQYXRoRmluZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5QYXRoRmluZGVyCisgIFNwYW1QYXRoRW50cnlGaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LkZpbGVGaW5kZXIKKyAgbG9hZGVyX2RldGFpbHMgPSAoaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFUykKKworICAjIFNldHRpbmcgdXAgYSBtZXRhIHBhdGggZmluZGVyLgorICAjIE1ha2Ugc3VyZSB0byBwdXQgdGhlIGZpbmRlciBpbiB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIHRoZSBsaXN0IGluIHRlcm1zIG9mCisgICMgcHJpb3JpdHkuCisgIHN5cy5tZXRhX3BhdGguYXBwZW5kKFNwYW1NZXRhUGF0aEZpbmRlcikKKworICAjIFNldHRpbmcgdXAgYSBwYXRoIGVudHJ5IGZpbmRlci4KKyAgIyBNYWtlIHN1cmUgdG8gcHV0IHRoZSBwYXRoIGhvb2sgaW4gdGhlIHByb3BlciBsb2NhdGlvbiBpbiB0aGUgbGlzdCBpbiB0ZXJtcworICAjIG9mIHByaW9yaXR5LgorICBzeXMucGF0aF9ob29rcy5hcHBlbmQoU3BhbVBhdGhFbnRyeUZpbmRlci5wYXRoX2hvb2sobG9hZGVyX2RldGFpbHMpKQorCitJbXBvcnQgaXRzZWxmIGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiBjb2RlLCBtYWtpbmcgaXQgcG9zc2libGUgdG8KK2V4cG9zZSBtb3N0IG9mIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHRocm91Z2ggaW1wb3J0bGliLiBUaGUgZm9sbG93aW5nCitoZWxwcyBpbGx1c3RyYXRlIHRoZSB2YXJpb3VzIEFQSXMgdGhhdCBpbXBvcnRsaWIgZXhwb3NlcyBieSBwcm92aWRpbmcgYW4KK2FwcHJveGltYXRlIGltcGxlbWVudGF0aW9uIG9mCis6ZnVuYzpgaW1wb3J0bGliLmltcG9ydF9tb2R1bGVgIChQeXRob24gMy40IGFuZCBuZXdlciBmb3IgdGhlIGltcG9ydGxpYiB1c2FnZSwKK1B5dGhvbiAzLjYgYW5kIG5ld2VyIGZvciBvdGhlciBwYXJ0cyBvZiB0aGUgY29kZSkuCis6OgorCisgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICBpbXBvcnQgc3lzCisKKyAgZGVmIGltcG9ydF9tb2R1bGUobmFtZSwgcGFja2FnZT1Ob25lKToKKyAgICAgICIiIkFuIGFwcHJveGltYXRlIGltcGxlbWVudGF0aW9uIG9mIGltcG9ydC4iIiIKKyAgICAgIGFic29sdXRlX25hbWUgPSBpbXBvcnRsaWIudXRpbC5yZXNvbHZlX25hbWUobmFtZSwgcGFja2FnZSkKKyAgICAgIHRyeToKKyAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbYWJzb2x1dGVfbmFtZV0KKyAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICBwYXNzCisKKyAgICAgIHBhdGggPSBOb25lCisgICAgICBpZiAnLicgaW4gYWJzb2x1dGVfbmFtZToKKyAgICAgICAgICBwYXJlbnRfbmFtZSwgXywgY2hpbGRfbmFtZSA9IGFic29sdXRlX25hbWUucnBhcnRpdGlvbignLicpCisgICAgICAgICAgcGFyZW50X21vZHVsZSA9IGltcG9ydF9tb2R1bGUocGFyZW50X25hbWUpCisgICAgICAgICAgcGF0aCA9IHBhcmVudF9tb2R1bGUuc3BlYy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucworICAgICAgZm9yIGZpbmRlciBpbiBzeXMubWV0YV9wYXRoOgorICAgICAgICAgIHNwZWMgPSBmaW5kZXIuZmluZF9zcGVjKGFic29sdXRlX25hbWUsIHBhdGgpCisgICAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgIGVsc2U6CisgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZidObyBtb2R1bGUgbmFtZWQge2Fic29sdXRlX25hbWUhcn0nKQorICAgICAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQorICAgICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQorICAgICAgc3lzLm1vZHVsZXNbYWJzb2x1dGVfbmFtZV0gPSBtb2R1bGUKKyAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgc2V0YXR0cihwYXJlbnRfbW9kdWxlLCBjaGlsZF9uYW1lLCBtb2R1bGUpCisgICAgICByZXR1cm4gbW9kdWxlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdCBiL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CmluZGV4IDhlN2VkMTkuLjE5NzdkODggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CkBAIC0zNCwxODUgKzM0LDE5MCBAQAogVGhleSBhbHNvIGhlbHAgeW91IGRldGVybWluZSB3aGVuIHlvdSBjYW4gZXhwZWN0IHRvIGZpbmQgdGhlIGZvbGxvd2luZyBzcGVjaWFsCiBhdHRyaWJ1dGVzOgogCi0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBUeXBlICAgICAgfCBBdHRyaWJ1dGUgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwKLSs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi18IG1vZHVsZSAgICB8IF9fZG9jX18gICAgICAgICB8IGRvY3VtZW50YXRpb24gc3RyaW5nICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19maWxlX18gICAgICAgIHwgZmlsZW5hbWUgKG1pc3NpbmcgZm9yICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGJ1aWx0LWluIG1vZHVsZXMpICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY2xhc3MgICAgIHwgX19kb2NfXyAgICAgICAgIHwgZG9jdW1lbnRhdGlvbiBzdHJpbmcgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX25hbWVfXyAgICAgICAgfCBuYW1lIHdpdGggd2hpY2ggdGhpcyAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgY2xhc3Mgd2FzIGRlZmluZWQgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX3F1YWxuYW1lX18gICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IF9fbW9kdWxlX18gICAgICB8IG5hbWUgb2YgbW9kdWxlIGluIHdoaWNoICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCB0aGlzIGNsYXNzIHdhcyBkZWZpbmVkICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG1ldGhvZCAgICB8IF9fZG9jX18gICAgICAgICB8IGRvY3VtZW50YXRpb24gc3RyaW5nICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgIHwgbmFtZSB3aXRoIHdoaWNoIHRoaXMgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IG1ldGhvZCB3YXMgZGVmaW5lZCAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgIHwgcXVhbGlmaWVkIG5hbWUgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX2Z1bmNfXyAgICAgICAgfCBmdW5jdGlvbiBvYmplY3QgICAgICAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgY29udGFpbmluZyBpbXBsZW1lbnRhdGlvbiB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IG9mIG1ldGhvZCAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19zZWxmX18gICAgICAgIHwgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IG1ldGhvZCBpcyBib3VuZCwgb3IgICAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGZ1bmN0aW9uICB8IF9fZG9jX18gICAgICAgICB8IGRvY3VtZW50YXRpb24gc3RyaW5nICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgIHwgbmFtZSB3aXRoIHdoaWNoIHRoaXMgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgIHwgcXVhbGlmaWVkIG5hbWUgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX2NvZGVfXyAgICAgICAgfCBjb2RlIG9iamVjdCBjb250YWluaW5nICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgY29tcGlsZWQgZnVuY3Rpb24gICAgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IDp0ZXJtOmBieXRlY29kZWAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19kZWZhdWx0c19fICAgIHwgdHVwbGUgb2YgYW55IGRlZmF1bHQgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHZhbHVlcyBmb3IgcG9zaXRpb25hbCBvciAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBrZXl3b3JkIHBhcmFtZXRlcnMgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IF9fa3dkZWZhdWx0c19fICB8IG1hcHBpbmcgb2YgYW55IGRlZmF1bHQgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCB2YWx1ZXMgZm9yIGtleXdvcmQtb25seSAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVycyAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX2dsb2JhbHNfXyAgICAgfCBnbG9iYWwgbmFtZXNwYWNlIGluIHdoaWNoIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgdGhpcyBmdW5jdGlvbiB3YXMgZGVmaW5lZCB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX2Fubm90YXRpb25zX18gfCBtYXBwaW5nIG9mIHBhcmFtZXRlcnMgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgbmFtZXMgdG8gYW5ub3RhdGlvbnM7ICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGBgInJldHVybiJgYCBrZXkgaXMgICAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCByZXNlcnZlZCBmb3IgcmV0dXJuICAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgYW5ub3RhdGlvbnMuICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB0cmFjZWJhY2sgfCB0Yl9mcmFtZSAgICAgICAgfCBmcmFtZSBvYmplY3QgYXQgdGhpcyAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgbGV2ZWwgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCB0Yl9sYXN0aSAgICAgICAgfCBpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgaW5zdHJ1Y3Rpb24gaW4gYnl0ZWNvZGUgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCB0Yl9saW5lbm8gICAgICAgfCBjdXJyZW50IGxpbmUgbnVtYmVyIGluICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgUHl0aG9uIHNvdXJjZSBjb2RlICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCB0Yl9uZXh0ICAgICAgICAgfCBuZXh0IGlubmVyIHRyYWNlYmFjayAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgb2JqZWN0IChjYWxsZWQgYnkgdGhpcyAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGxldmVsKSAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZnJhbWUgICAgIHwgZl9iYWNrICAgICAgICAgIHwgbmV4dCBvdXRlciBmcmFtZSBvYmplY3QgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICh0aGlzIGZyYW1lJ3MgY2FsbGVyKSAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9idWlsdGlucyAgICAgIHwgYnVpbHRpbnMgbmFtZXNwYWNlIHNlZW4gICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGJ5IHRoaXMgZnJhbWUgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9jb2RlICAgICAgICAgIHwgY29kZSBvYmplY3QgYmVpbmcgICAgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGV4ZWN1dGVkIGluIHRoaXMgZnJhbWUgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9nbG9iYWxzICAgICAgIHwgZ2xvYmFsIG5hbWVzcGFjZSBzZWVuIGJ5ICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHRoaXMgZnJhbWUgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9sYXN0aSAgICAgICAgIHwgaW5kZXggb2YgbGFzdCBhdHRlbXB0ZWQgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGluc3RydWN0aW9uIGluIGJ5dGVjb2RlICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9saW5lbm8gICAgICAgIHwgY3VycmVudCBsaW5lIG51bWJlciBpbiAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IFB5dGhvbiBzb3VyY2UgY29kZSAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9sb2NhbHMgICAgICAgIHwgbG9jYWwgbmFtZXNwYWNlIHNlZW4gYnkgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHRoaXMgZnJhbWUgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl9yZXN0cmljdGVkICAgIHwgMCBvciAxIGlmIGZyYW1lIGlzIGluICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZl90cmFjZSAgICAgICAgIHwgdHJhY2luZyBmdW5jdGlvbiBmb3IgdGhpcyB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGZyYW1lLCBvciBgYE5vbmVgYCAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY29kZSAgICAgIHwgY29fYXJnY291bnQgICAgIHwgbnVtYmVyIG9mIGFyZ3VtZW50cyAobm90ICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGluY2x1ZGluZyBcKiBvciBcKlwqICAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBhcmdzKSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX2NvZGUgICAgICAgICB8IHN0cmluZyBvZiByYXcgY29tcGlsZWQgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBieXRlY29kZSAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX2NvbnN0cyAgICAgICB8IHR1cGxlIG9mIGNvbnN0YW50cyB1c2VkICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBpbiB0aGUgYnl0ZWNvZGUgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX2ZpbGVuYW1lICAgICB8IG5hbWUgb2YgZmlsZSBpbiB3aGljaCAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCB0aGlzIGNvZGUgb2JqZWN0IHdhcyAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgY3JlYXRlZCAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBjb19maXJzdGxpbmVubyAgfCBudW1iZXIgb2YgZmlyc3QgbGluZSBpbiAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgUHl0aG9uIHNvdXJjZSBjb2RlICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBjb19mbGFncyAgICAgICAgfCBiaXRtYXA6IDE9b3B0aW1pemVkIGBgfGBgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgMj1uZXdsb2NhbHMgYGB8YGAgND1cKmFyZyB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGBgfGBgIDg9XCpcKmFyZyAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgY29fbG5vdGFiICAgICAgIHwgZW5jb2RlZCBtYXBwaW5nIG9mIGxpbmUgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IG51bWJlcnMgdG8gYnl0ZWNvZGUgICAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBpbmRpY2VzICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX25hbWUgICAgICAgICB8IG5hbWUgd2l0aCB3aGljaCB0aGlzIGNvZGUgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBvYmplY3Qgd2FzIGRlZmluZWQgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX25hbWVzICAgICAgICB8IHR1cGxlIG9mIG5hbWVzIG9mIGxvY2FsICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNvX25sb2NhbHMgICAgICB8IG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgY29fc3RhY2tzaXplICAgIHwgdmlydHVhbCBtYWNoaW5lIHN0YWNrICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHNwYWNlIHJlcXVpcmVkICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgY29fdmFybmFtZXMgICAgIHwgdHVwbGUgb2YgbmFtZXMgb2YgICAgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50cyBhbmQgbG9jYWwgICAgICAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGdlbmVyYXRvciB8IF9fbmFtZV9fICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgIHwgcXVhbGlmaWVkIG5hbWUgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBnaV9mcmFtZSAgICAgICAgfCBmcmFtZSAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGdpX3J1bm5pbmcgICAgICB8IGlzIHRoZSBnZW5lcmF0b3IgcnVubmluZz8gfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgZ2lfY29kZSAgICAgICAgIHwgY29kZSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBnaV95aWVsZGZyb20gICAgfCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgYnkgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgYGB5aWVsZCBmcm9tYGAsIG9yICAgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGBgTm9uZWBgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY29yb3V0aW5lIHwgX19uYW1lX18gICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX3F1YWxuYW1lX18gICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNyX2F3YWl0ICAgICAgICB8IG9iamVjdCBiZWluZyBhd2FpdGVkIG9uLCAgfAotfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCBvciBgYE5vbmVgYCAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18ICAgICAgICAgICB8IGNyX2ZyYW1lICAgICAgICB8IGZyYW1lICAgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgY3JfcnVubmluZyAgICAgIHwgaXMgdGhlIGNvcm91dGluZSBydW5uaW5nPyB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBjcl9jb2RlICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGJ1aWx0aW4gICB8IF9fZG9jX18gICAgICAgICB8IGRvY3VtZW50YXRpb24gc3RyaW5nICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgIHwgb3JpZ2luYWwgbmFtZSBvZiB0aGlzICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIG9yIG1ldGhvZCAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgIHwgcXVhbGlmaWVkIG5hbWUgICAgICAgICAgICB8Ci0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCAgICAgICAgICAgfCBfX3NlbGZfXyAgICAgICAgfCBpbnN0YW5jZSB0byB3aGljaCBhICAgICAgIHwKLXwgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgbWV0aG9kIGlzIGJvdW5kLCBvciAgICAgICB8Ci18ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IGBgTm9uZWBgICAgICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVHlwZSAgICAgIHwgQXR0cmlidXRlICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSsKK3wgbW9kdWxlICAgIHwgX19kb2NfXyAgICAgICAgICAgICAgfCBkb2N1bWVudGF0aW9uIHN0cmluZyAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19maWxlX18gICAgICAgICAgICAgfCBmaWxlbmFtZSAobWlzc2luZyBmb3IgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBidWlsdC1pbiBtb2R1bGVzKSAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgY2xhc3MgICAgIHwgX19kb2NfXyAgICAgICAgICAgICAgfCBkb2N1bWVudGF0aW9uIHN0cmluZyAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgICAgICAgfCBuYW1lIHdpdGggd2hpY2ggdGhpcyAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBjbGFzcyB3YXMgZGVmaW5lZCAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19tb2R1bGVfXyAgICAgICAgICAgfCBuYW1lIG9mIG1vZHVsZSBpbiB3aGljaCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGNsYXNzIHdhcyBkZWZpbmVkICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19kZWZpbml0aW9uX29yZGVyX18gfCB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzJ3MgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVzLCBpbiB0aGUgb3JkZXIgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbiB3aGljaCB0aGV5IHdlcmUgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBkZWZpbmVkIChpZiBrbm93bikgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgbWV0aG9kICAgIHwgX19kb2NfXyAgICAgICAgICAgICAgfCBkb2N1bWVudGF0aW9uIHN0cmluZyAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgICAgICAgfCBuYW1lIHdpdGggd2hpY2ggdGhpcyAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBtZXRob2Qgd2FzIGRlZmluZWQgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19mdW5jX18gICAgICAgICAgICAgfCBmdW5jdGlvbiBvYmplY3QgICAgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBjb250YWluaW5nIGltcGxlbWVudGF0aW9uIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBvZiBtZXRob2QgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19zZWxmX18gICAgICAgICAgICAgfCBpbnN0YW5jZSB0byB3aGljaCB0aGlzICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBtZXRob2QgaXMgYm91bmQsIG9yICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgZnVuY3Rpb24gIHwgX19kb2NfXyAgICAgICAgICAgICAgfCBkb2N1bWVudGF0aW9uIHN0cmluZyAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgICAgICAgfCBuYW1lIHdpdGggd2hpY2ggdGhpcyAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19jb2RlX18gICAgICAgICAgICAgfCBjb2RlIG9iamVjdCBjb250YWluaW5nICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBjb21waWxlZCBmdW5jdGlvbiAgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCA6dGVybTpgYnl0ZWNvZGVgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19kZWZhdWx0c19fICAgICAgICAgfCB0dXBsZSBvZiBhbnkgZGVmYXVsdCAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZXMgZm9yIHBvc2l0aW9uYWwgb3IgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkIHBhcmFtZXRlcnMgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19rd2RlZmF1bHRzX18gICAgICAgfCBtYXBwaW5nIG9mIGFueSBkZWZhdWx0ICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZXMgZm9yIGtleXdvcmQtb25seSAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19nbG9iYWxzX18gICAgICAgICAgfCBnbG9iYWwgbmFtZXNwYWNlIGluIHdoaWNoIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19hbm5vdGF0aW9uc19fICAgICAgfCBtYXBwaW5nIG9mIHBhcmFtZXRlcnMgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lcyB0byBhbm5vdGF0aW9uczsgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYCJyZXR1cm4iYGAga2V5IGlzICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCByZXNlcnZlZCBmb3IgcmV0dXJuICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBhbm5vdGF0aW9ucy4gICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgdHJhY2ViYWNrIHwgdGJfZnJhbWUgICAgICAgICAgICAgfCBmcmFtZSBvYmplY3QgYXQgdGhpcyAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBsZXZlbCAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgdGJfbGFzdGkgICAgICAgICAgICAgfCBpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbnN0cnVjdGlvbiBpbiBieXRlY29kZSAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgdGJfbGluZW5vICAgICAgICAgICAgfCBjdXJyZW50IGxpbmUgbnVtYmVyIGluICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBQeXRob24gc291cmNlIGNvZGUgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgdGJfbmV4dCAgICAgICAgICAgICAgfCBuZXh0IGlubmVyIHRyYWNlYmFjayAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgKGNhbGxlZCBieSB0aGlzICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBsZXZlbCkgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgZnJhbWUgICAgIHwgZl9iYWNrICAgICAgICAgICAgICAgfCBuZXh0IG91dGVyIGZyYW1lIG9iamVjdCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAodGhpcyBmcmFtZSdzIGNhbGxlcikgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9idWlsdGlucyAgICAgICAgICAgfCBidWlsdGlucyBuYW1lc3BhY2Ugc2VlbiAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBieSB0aGlzIGZyYW1lICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9jb2RlICAgICAgICAgICAgICAgfCBjb2RlIG9iamVjdCBiZWluZyAgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBleGVjdXRlZCBpbiB0aGlzIGZyYW1lICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9nbG9iYWxzICAgICAgICAgICAgfCBnbG9iYWwgbmFtZXNwYWNlIHNlZW4gYnkgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGZyYW1lICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9sYXN0aSAgICAgICAgICAgICAgfCBpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbnN0cnVjdGlvbiBpbiBieXRlY29kZSAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9saW5lbm8gICAgICAgICAgICAgfCBjdXJyZW50IGxpbmUgbnVtYmVyIGluICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBQeXRob24gc291cmNlIGNvZGUgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9sb2NhbHMgICAgICAgICAgICAgfCBsb2NhbCBuYW1lc3BhY2Ugc2VlbiBieSAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGZyYW1lICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl9yZXN0cmljdGVkICAgICAgICAgfCAwIG9yIDEgaWYgZnJhbWUgaXMgaW4gICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZl90cmFjZSAgICAgICAgICAgICAgfCB0cmFjaW5nIGZ1bmN0aW9uIGZvciB0aGlzIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBmcmFtZSwgb3IgYGBOb25lYGAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgY29kZSAgICAgIHwgY29fYXJnY291bnQgICAgICAgICAgfCBudW1iZXIgb2YgYXJndW1lbnRzIChub3QgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbmNsdWRpbmcgXCogb3IgXCpcKiAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBhcmdzKSAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fY29kZSAgICAgICAgICAgICAgfCBzdHJpbmcgb2YgcmF3IGNvbXBpbGVkICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBieXRlY29kZSAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fY29uc3RzICAgICAgICAgICAgfCB0dXBsZSBvZiBjb25zdGFudHMgdXNlZCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbiB0aGUgYnl0ZWNvZGUgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fZmlsZW5hbWUgICAgICAgICAgfCBuYW1lIG9mIGZpbGUgaW4gd2hpY2ggICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGNvZGUgb2JqZWN0IHdhcyAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVkICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fZmlyc3RsaW5lbm8gICAgICAgfCBudW1iZXIgb2YgZmlyc3QgbGluZSBpbiAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBQeXRob24gc291cmNlIGNvZGUgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fZmxhZ3MgICAgICAgICAgICAgfCBiaXRtYXA6IDE9b3B0aW1pemVkIGBgfGBgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAyPW5ld2xvY2FscyBgYHxgYCA0PVwqYXJnIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYHxgYCA4PVwqXCphcmcgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fbG5vdGFiICAgICAgICAgICAgfCBlbmNvZGVkIG1hcHBpbmcgb2YgbGluZSAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBudW1iZXJzIHRvIGJ5dGVjb2RlICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBpbmRpY2VzICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fbmFtZSAgICAgICAgICAgICAgfCBuYW1lIHdpdGggd2hpY2ggdGhpcyBjb2RlIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3Qgd2FzIGRlZmluZWQgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fbmFtZXMgICAgICAgICAgICAgfCB0dXBsZSBvZiBuYW1lcyBvZiBsb2NhbCAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fbmxvY2FscyAgICAgICAgICAgfCBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fc3RhY2tzaXplICAgICAgICAgfCB2aXJ0dWFsIG1hY2hpbmUgc3RhY2sgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBzcGFjZSByZXF1aXJlZCAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY29fdmFybmFtZXMgICAgICAgICAgfCB0dXBsZSBvZiBuYW1lcyBvZiAgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgYW5kIGxvY2FsICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCB2YXJpYWJsZXMgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgZ2VuZXJhdG9yIHwgX19uYW1lX18gICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZ2lfZnJhbWUgICAgICAgICAgICAgfCBmcmFtZSAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZ2lfcnVubmluZyAgICAgICAgICAgfCBpcyB0aGUgZ2VuZXJhdG9yIHJ1bm5pbmc/IHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZ2lfY29kZSAgICAgICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgZ2lfeWllbGRmcm9tICAgICAgICAgfCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgYnkgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYHlpZWxkIGZyb21gYCwgb3IgICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgY29yb3V0aW5lIHwgX19uYW1lX18gICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY3JfYXdhaXQgICAgICAgICAgICAgfCBvYmplY3QgYmVpbmcgYXdhaXRlZCBvbiwgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBvciBgYE5vbmVgYCAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY3JfZnJhbWUgICAgICAgICAgICAgfCBmcmFtZSAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY3JfcnVubmluZyAgICAgICAgICAgfCBpcyB0aGUgY29yb3V0aW5lIHJ1bm5pbmc/IHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgY3JfY29kZSAgICAgICAgICAgICAgfCBjb2RlICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgYnVpbHRpbiAgIHwgX19kb2NfXyAgICAgICAgICAgICAgfCBkb2N1bWVudGF0aW9uIHN0cmluZyAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19uYW1lX18gICAgICAgICAgICAgfCBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiBvciBtZXRob2QgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19xdWFsbmFtZV9fICAgICAgICAgfCBxdWFsaWZpZWQgbmFtZSAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgICAgICAgICAgIHwgX19zZWxmX18gICAgICAgICAgICAgfCBpbnN0YW5jZSB0byB3aGljaCBhICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBtZXRob2QgaXMgYm91bmQsIG9yICAgICAgIHwKK3wgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKIApAQCAtMjIxLDYgKzIyNiwxMCBAQAogICAgVGhlIGBgX19uYW1lX19gYCBhdHRyaWJ1dGUgb2YgZ2VuZXJhdG9ycyBpcyBub3cgc2V0IGZyb20gdGhlIGZ1bmN0aW9uCiAgICBuYW1lLCBpbnN0ZWFkIG9mIHRoZSBjb2RlIG5hbWUsIGFuZCBpdCBjYW4gbm93IGJlIG1vZGlmaWVkLgogCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorCisgICBBZGQgYGBfX2RlZmluaXRpb25fb3JkZXJfX2BgIHRvIGNsYXNzZXMuCisKIAogLi4gZnVuY3Rpb246OiBnZXRtZW1iZXJzKG9iamVjdFssIHByZWRpY2F0ZV0pCiAKQEAgLTIzNSwyNCArMjQ0LDYgQEAKICAgICAgIGxpc3RlZCBpbiB0aGUgbWV0YWNsYXNzJyBjdXN0b20gOm1ldGg6YF9fZGlyX19gLgogCiAKLS4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlaW5mbyhwYXRoKQotCi0gICBSZXR1cm5zIGEgOnRlcm06YG5hbWVkIHR1cGxlYCBgYE1vZHVsZUluZm8obmFtZSwgc3VmZml4LCBtb2RlLCBtb2R1bGVfdHlwZSlgYAotICAgb2YgdmFsdWVzIHRoYXQgZGVzY3JpYmUgaG93IFB5dGhvbiB3aWxsIGludGVycHJldCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5Ci0gICAqcGF0aCogaWYgaXQgaXMgYSBtb2R1bGUsIG9yIGBgTm9uZWBgIGlmIGl0IHdvdWxkIG5vdCBiZSBpZGVudGlmaWVkIGFzIGEKLSAgIG1vZHVsZS4gIEluIHRoYXQgdHVwbGUsICpuYW1lKiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgdGhlIG5hbWUgb2YKLSAgIGFueSBlbmNsb3NpbmcgcGFja2FnZSwgKnN1ZmZpeCogaXMgdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlIGZpbGUgbmFtZSAod2hpY2gKLSAgIG1heSBub3QgYmUgYSBkb3QtZGVsaW1pdGVkIGV4dGVuc2lvbiksICptb2RlKiBpcyB0aGUgOmZ1bmM6YG9wZW5gIG1vZGUgdGhhdAotICAgd291bGQgYmUgdXNlZCAoYGAncidgYCBvciBgYCdyYidgYCksIGFuZCAqbW9kdWxlX3R5cGUqIGlzIGFuIGludGVnZXIgZ2l2aW5nCi0gICB0aGUgdHlwZSBvZiB0aGUgbW9kdWxlLiAgKm1vZHVsZV90eXBlKiB3aWxsIGhhdmUgYSB2YWx1ZSB3aGljaCBjYW4gYmUKLSAgIGNvbXBhcmVkIHRvIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgOm1vZDpgaW1wYCBtb2R1bGU7IHNlZSB0aGUKLSAgIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG1vZHVsZSB0eXBlcy4KLQotICAgLi4gZGVwcmVjYXRlZDo6IDMuMwotICAgICAgWW91IG1heSBjaGVjayB0aGUgZmlsZSBwYXRoJ3Mgc3VmZml4IGFnYWluc3QgdGhlIHN1cHBvcnRlZCBzdWZmaXhlcwotICAgICAgbGlzdGVkIGluIDptb2Q6YGltcG9ydGxpYi5tYWNoaW5lcnlgIHRvIGluZmVyIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotCi0KIC4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlbmFtZShwYXRoKQogCiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBuYW1lZCBieSB0aGUgZmlsZSAqcGF0aCosIHdpdGhvdXQgaW5jbHVkaW5nIHRoZQpAQCAtMjY2LDggKzI1Nyw3IEBACiAgICBzdGlsbCByZXR1cm4gYGBOb25lYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgIHJhdGhlciB0aGFuIHRoZQotICAgICAgZGVwcmVjYXRlZCA6ZnVuYzpgZ2V0bW9kdWxlaW5mb2AuCisgICAgICBUaGUgZnVuY3Rpb24gaXMgYmFzZWQgZGlyZWN0bHkgb24gOm1vZDpgaW1wb3J0bGliYC4KIAogCiAuLiBmdW5jdGlvbjo6IGlzbW9kdWxlKG9iamVjdCkKQEAgLTY0Niw2ICs2MzYsMTYgQEAKICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgYXMgYSBzdHJpbmcuICBUaGUgbmFtZSBtdXN0IGJlIGEgdmFsaWQKICAgICAgIFB5dGhvbiBpZGVudGlmaWVyLgogCisgICAgICAuLiBpbXBsLWRldGFpbDo6CisKKyAgICAgICAgIENQeXRob24gZ2VuZXJhdGVzIGltcGxpY2l0IHBhcmFtZXRlciBuYW1lcyBvZiB0aGUgZm9ybSBgYC4wYGAgb24gdGhlCisgICAgICAgICBjb2RlIG9iamVjdHMgdXNlZCB0byBpbXBsZW1lbnQgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvcgorICAgICAgICAgZXhwcmVzc2lvbnMuCisKKyAgICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICAgICBUaGVzZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUgYXMgbmFtZXMgbGlrZQorICAgICAgICAgICAgYGBpbXBsaWNpdDBgYC4KKwogICAgLi4gYXR0cmlidXRlOjogUGFyYW1ldGVyLmRlZmF1bHQKIAogICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuICBJZiB0aGUgcGFyYW1ldGVyIGhhcyBubyBkZWZhdWx0CkBAIC04NTQsOCArODU0LDYgQEAKICAgIGZyb20ga3dvbmx5YXJncyB0byBkZWZhdWx0cy4gICphbm5vdGF0aW9ucyogaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXJndW1lbnQKICAgIG5hbWVzIHRvIGFubm90YXRpb25zLgogCi0gICBUaGUgZmlyc3QgZm91ciBpdGVtcyBpbiB0aGUgdHVwbGUgY29ycmVzcG9uZCB0byA6ZnVuYzpgZ2V0YXJnc3BlY2AuCi0KICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBiYXNlZCBvbiA6ZnVuYzpgc2lnbmF0dXJlYCwgYnV0IHN0aWxsIGlnbm9yZXMKICAgICAgIGBgX193cmFwcGVkX19gYCBhdHRyaWJ1dGVzIGFuZCBpbmNsdWRlcyB0aGUgYWxyZWFkeSBib3VuZCBmaXJzdApAQCAtODg0LDcgKzg4Miw3IEBACiAuLiBmdW5jdGlvbjo6IGZvcm1hdGFyZ3NwZWMoYXJnc1ssIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywga3dvbmx5YXJncywga3dvbmx5ZGVmYXVsdHMsIGFubm90YXRpb25zWywgZm9ybWF0YXJnLCBmb3JtYXR2YXJhcmdzLCBmb3JtYXR2YXJrdywgZm9ybWF0dmFsdWUsIGZvcm1hdHJldHVybnMsIGZvcm1hdGFubm90YXRpb25zXV0pCiAKICAgIEZvcm1hdCBhIHByZXR0eSBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieQotICAgOmZ1bmM6YGdldGFyZ3NwZWNgIG9yIDpmdW5jOmBnZXRmdWxsYXJnc3BlY2AuCisgICA6ZnVuYzpgZ2V0ZnVsbGFyZ3NwZWNgLgogCiAgICBUaGUgZmlyc3Qgc2V2ZW4gYXJndW1lbnRzIGFyZSAoYGBhcmdzYGAsIGBgdmFyYXJnc2BgLCBgYHZhcmt3YGAsCiAgICBgYGRlZmF1bHRzYGAsIGBga3dvbmx5YXJnc2BgLCBgYGt3b25seWRlZmF1bHRzYGAsIGBgYW5ub3RhdGlvbnNgYCkuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0IGIvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdAppbmRleCBkZmMxZGRjLi5iMGQwYThjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QKQEAgLTU5MSw3ICs1OTEsMTMgQEAKIAogLi4gZnVuY3Rpb246OiB0ZWUoaXRlcmFibGUsIG49MikKIAotICAgUmV0dXJuICpuKiBpbmRlcGVuZGVudCBpdGVyYXRvcnMgZnJvbSBhIHNpbmdsZSBpdGVyYWJsZS4gIFJvdWdobHkgZXF1aXZhbGVudCB0bzo6CisgICBSZXR1cm4gKm4qIGluZGVwZW5kZW50IGl0ZXJhdG9ycyBmcm9tIGEgc2luZ2xlIGl0ZXJhYmxlLgorCisgICBUaGUgZm9sbG93aW5nIFB5dGhvbiBjb2RlIGhlbHBzIGV4cGxhaW4gd2hhdCAqdGVlKiBkb2VzIChhbHRob3VnaCB0aGUgYWN0dWFsCisgICBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIGNvbXBsZXggYW5kIHVzZXMgb25seSBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlKS4KKworICAgUm91Z2hseSBlcXVpdmFsZW50IHRvOjoKIAogICAgICAgICBkZWYgdGVlKGl0ZXJhYmxlLCBuPTIpOgogICAgICAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvanNvbi5yc3QgYi9Eb2MvbGlicmFyeS9qc29uLnJzdAppbmRleCBlZTU4MjY2Li43MzgyNGY4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9qc29uLnJzdAorKysgYi9Eb2MvbGlicmFyeS9qc29uLnJzdApAQCAtMTI2LDcgKzEyNiw3IEBACiBCYXNpYyBVc2FnZQogLS0tLS0tLS0tLS0KIAotLi4gZnVuY3Rpb246OiBkdW1wKG9iaiwgZnAsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAorLi4gZnVuY3Rpb246OiBkdW1wKG9iaiwgZnAsICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAogICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1GYWxzZSwgKiprdykKQEAgLTE4Nyw4ICsxODcsMTEgQEAKICAgIDptZXRoOmBkZWZhdWx0YCBtZXRob2QgdG8gc2VyaWFsaXplIGFkZGl0aW9uYWwgdHlwZXMpLCBzcGVjaWZ5IGl0IHdpdGggdGhlCiAgICAqY2xzKiBrd2FyZzsgb3RoZXJ3aXNlIDpjbGFzczpgSlNPTkVuY29kZXJgIGlzIHVzZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seSA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgogCi0uLiBmdW5jdGlvbjo6IGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBcCisKKy4uIGZ1bmN0aW9uOjogZHVtcHMob2JqLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKICAgICAgICAgICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9RmFsc2UsICoqa3cpCkBAIC0yMTIsNyArMjE1LDcgQEAKICAgICAgIHRoZSBvcmlnaW5hbCBvbmUuIFRoYXQgaXMsIGBgbG9hZHMoZHVtcHMoeCkpICE9IHhgYCBpZiB4IGhhcyBub24tc3RyaW5nCiAgICAgICBrZXlzLgogCi0uLiBmdW5jdGlvbjo6IGxvYWQoZnAsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdykKKy4uIGZ1bmN0aW9uOjogbG9hZChmcCwgKiwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQogCiAgICBEZXNlcmlhbGl6ZSAqZnAqIChhIGBgLnJlYWQoKWBgLXN1cHBvcnRpbmcgOnRlcm06YGZpbGUtbGlrZSBvYmplY3RgCiAgICBjb250YWluaW5nIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0IHVzaW5nIHRoaXMgOnJlZjpgY29udmVyc2lvbgpAQCAtMjYwLDcgKzI2MywxMCBAQAogICAgSWYgdGhlIGRhdGEgYmVpbmcgZGVzZXJpYWxpemVkIGlzIG5vdCBhIHZhbGlkIEpTT04gZG9jdW1lbnQsIGEKICAgIDpleGM6YEpTT05EZWNvZGVFcnJvcmAgd2lsbCBiZSByYWlzZWQuCiAKLS4uIGZ1bmN0aW9uOjogbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5IDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCisKKy4uIGZ1bmN0aW9uOjogbG9hZHMocywgKiwgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQogCiAgICBEZXNlcmlhbGl6ZSAqcyogKGEgOmNsYXNzOmBzdHJgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OIGRvY3VtZW50KSB0byBhCiAgICBQeXRob24gb2JqZWN0IHVzaW5nIHRoaXMgOnJlZjpgY29udmVyc2lvbiB0YWJsZSA8anNvbi10by1weS10YWJsZT5gLgpAQCAtMjc0LDcgKzI4MCw3IEBACiBFbmNvZGVycyBhbmQgRGVjb2RlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBjbGFzczo6IEpTT05EZWNvZGVyKG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBzdHJpY3Q9VHJ1ZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSkKKy4uIGNsYXNzOjogSlNPTkRlY29kZXIoKiwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQogCiAgICBTaW1wbGUgSlNPTiBkZWNvZGVyLgogCkBAIC0zNDQsNiArMzUwLDkgQEAKICAgIElmIHRoZSBkYXRhIGJlaW5nIGRlc2VyaWFsaXplZCBpcyBub3QgYSB2YWxpZCBKU09OIGRvY3VtZW50LCBhCiAgICA6ZXhjOmBKU09ORGVjb2RlRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKwogICAgLi4gbWV0aG9kOjogZGVjb2RlKHMpCiAKICAgICAgIFJldHVybiB0aGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mICpzKiAoYSA6Y2xhc3M6YHN0cmAgaW5zdGFuY2UKQEAgLTM2Miw3ICszNzEsNyBAQAogICAgICAgZXh0cmFuZW91cyBkYXRhIGF0IHRoZSBlbmQuCiAKIAotLi4gY2xhc3M6OiBKU09ORW5jb2Rlcihza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBzb3J0X2tleXM9RmFsc2UsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSkKKy4uIGNsYXNzOjogSlNPTkVuY29kZXIoKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBkZWZhdWx0PU5vbmUpCiAKICAgIEV4dGVuc2libGUgSlNPTiBlbmNvZGVyIGZvciBQeXRob24gZGF0YSBzdHJ1Y3R1cmVzLgogCkBAIC00NDIsNiArNDUxLDkgQEAKICAgIHRoZSBvYmplY3Qgb3IgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgLiAgSWYgbm90IHNwZWNpZmllZCwgOmV4YzpgVHlwZUVycm9yYAogICAgaXMgcmFpc2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKwogCiAgICAuLiBtZXRob2Q6OiBkZWZhdWx0KG8pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0IGIvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKaW5kZXggOTE2YjcwMi4uOGUyN2FkMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKQEAgLTg0LDYgKzg0LDkgQEAKICAgIHdpdGggdGhhdCBlbmNvZGluZy4gIElmICpkZWxheSogaXMgdHJ1ZSwgdGhlbiBmaWxlIG9wZW5pbmcgaXMgZGVmZXJyZWQgdW50aWwgdGhlCiAgICBmaXJzdCBjYWxsIHRvIDptZXRoOmBlbWl0YC4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgZ3Jvd3MgaW5kZWZpbml0ZWx5LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQXMgd2VsbCBhcyBzdHJpbmcgdmFsdWVzLCA6Y2xhc3M6YH5wYXRobGliLlBhdGhgIG9iamVjdHMgYXJlIGFsc28gYWNjZXB0ZWQKKyAgICAgIGZvciB0aGUgKmZpbGVuYW1lKiBhcmd1bWVudC4KIAogICAgLi4gbWV0aG9kOjogY2xvc2UoKQogCkBAIC0xNjAsMTIgKzE2MywyMyBAQAogICAgd2l0aCB0aGF0IGVuY29kaW5nLiAgSWYgKmRlbGF5KiBpcyB0cnVlLCB0aGVuIGZpbGUgb3BlbmluZyBpcyBkZWZlcnJlZCB1bnRpbCB0aGUKICAgIGZpcnN0IGNhbGwgdG8gOm1ldGg6YGVtaXRgLiAgQnkgZGVmYXVsdCwgdGhlIGZpbGUgZ3Jvd3MgaW5kZWZpbml0ZWx5LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQXMgd2VsbCBhcyBzdHJpbmcgdmFsdWVzLCA6Y2xhc3M6YH5wYXRobGliLlBhdGhgIG9iamVjdHMgYXJlIGFsc28gYWNjZXB0ZWQKKyAgICAgIGZvciB0aGUgKmZpbGVuYW1lKiBhcmd1bWVudC4KKworICAgLi4gbWV0aG9kOjogcmVvcGVuSWZOZWVkZWQoKQorCisgICAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkLiAgSWYgaXQgaGFzLCB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlzCisgICAgICBmbHVzaGVkIGFuZCBjbG9zZWQgYW5kIHRoZSBmaWxlIG9wZW5lZCBhZ2FpbiwgdHlwaWNhbGx5IGFzIGEgcHJlY3Vyc29yIHRvCisgICAgICBvdXRwdXR0aW5nIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAKICAgIC4uIG1ldGhvZDo6IGVtaXQocmVjb3JkKQogCi0gICAgICBPdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGJ1dCBmaXJzdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIGhhcwotICAgICAgY2hhbmdlZC4gIElmIGl0IGhhcywgdGhlIGV4aXN0aW5nIHN0cmVhbSBpcyBmbHVzaGVkIGFuZCBjbG9zZWQgYW5kIHRoZQotICAgICAgZmlsZSBvcGVuZWQgYWdhaW4sIGJlZm9yZSBvdXRwdXR0aW5nIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUuCisgICAgICBPdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGJ1dCBmaXJzdCBjYWxscyA6bWV0aDpgcmVvcGVuSWZOZWVkZWRgIHRvCisgICAgICByZW9wZW4gdGhlIGZpbGUgaWYgaXQgaGFzIGNoYW5nZWQuCiAKIC4uIF9iYXNlLXJvdGF0aW5nLWhhbmRsZXI6CiAKQEAgLTI3OSw2ICsyOTMsOSBAQAogICAgOmZpbGU6YGFwcC5sb2cuMmAsIGV0Yy4gIGV4aXN0LCB0aGVuIHRoZXkgYXJlIHJlbmFtZWQgdG8gOmZpbGU6YGFwcC5sb2cuMmAsCiAgICA6ZmlsZTpgYXBwLmxvZy4zYCBldGMuICByZXNwZWN0aXZlbHkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBcyB3ZWxsIGFzIHN0cmluZyB2YWx1ZXMsIDpjbGFzczpgfnBhdGhsaWIuUGF0aGAgb2JqZWN0cyBhcmUgYWxzbyBhY2NlcHRlZAorICAgICAgZm9yIHRoZSAqZmlsZW5hbWUqIGFyZ3VtZW50LgogCiAgICAuLiBtZXRob2Q6OiBkb1JvbGxvdmVyKCkKIApAQCAtMzEwLDIxICszMjcsMjQgQEAKICAgIFlvdSBjYW4gdXNlIHRoZSAqd2hlbiogdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAqaW50ZXJ2YWwqLiBUaGUgbGlzdCBvZiBwb3NzaWJsZQogICAgdmFsdWVzIGlzIGJlbG93LiAgTm90ZSB0aGF0IHRoZXkgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4KIAotICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IFZhbHVlICAgICAgICAgIHwgVHlwZSBvZiBpbnRlcnZhbCAgICAgIHwKLSAgICs9PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09KwotICAgfCBgYCdTJ2BgICAgICAgICB8IFNlY29uZHMgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgIHwgYGAnTSdgYCAgICAgICAgfCBNaW51dGVzICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IGBgJ0gnYGAgICAgICAgIHwgSG91cnMgICAgICAgICAgICAgICAgIHwKLSAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBgYCdEJ2BgICAgICAgICB8IERheXMgICAgICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgIHwgYGAnVzAnLSdXNidgYCAgfCBXZWVrZGF5ICgwPU1vbmRheSkgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICB8IGBgJ21pZG5pZ2h0J2BgIHwgUm9sbCBvdmVyIGF0IG1pZG5pZ2h0IHwKLSAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBWYWx1ZSAgICAgICAgICB8IFR5cGUgb2YgaW50ZXJ2YWwgICAgICAgICAgIHwgSWYvaG93ICphdFRpbWUqIGlzIHVzZWQgfAorICAgKz09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09KworICAgfCBgYCdTJ2BgICAgICAgICB8IFNlY29uZHMgICAgICAgICAgICAgICAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCdNJ2BgICAgICAgICB8IE1pbnV0ZXMgICAgICAgICAgICAgICAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCdIJ2BgICAgICAgICB8IEhvdXJzICAgICAgICAgICAgICAgICAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCdEJ2BgICAgICAgICB8IERheXMgICAgICAgICAgICAgICAgICAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCdXMCctJ1c2J2BgICB8IFdlZWtkYXkgKDA9TW9uZGF5KSAgICAgICAgIHwgVXNlZCB0byBjb21wdXRlIGluaXRpYWwgfAorICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcm9sbG92ZXIgdGltZSAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCdtaWRuaWdodCdgYCB8IFJvbGwgb3ZlciBhdCBtaWRuaWdodCwgaWYgIHwgVXNlZCB0byBjb21wdXRlIGluaXRpYWwgfAorICAgfCAgICAgICAgICAgICAgICB8ICphdFRpbWUqIG5vdCBzcGVjaWZpZWQsICAgIHwgcm9sbG92ZXIgdGltZSAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICB8IGVsc2UgYXQgdGltZSAqYXRUaW1lKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCiAgICBXaGVuIHVzaW5nIHdlZWtkYXktYmFzZWQgcm90YXRpb24sIHNwZWNpZnkgJ1cwJyBmb3IgTW9uZGF5LCAnVzEnIGZvcgogICAgVHVlc2RheSwgYW5kIHNvIG9uIHVwIHRvICdXNicgZm9yIFN1bmRheS4gSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWUgcGFzc2VkIGZvcgpAQCAtMzUyLDE2ICszNzIsMzUgQEAKIAogICAgSWYgKmF0VGltZSogaXMgbm90IGBgTm9uZWBgLCBpdCBtdXN0IGJlIGEgYGBkYXRldGltZS50aW1lYGAgaW5zdGFuY2Ugd2hpY2gKICAgIHNwZWNpZmllcyB0aGUgdGltZSBvZiBkYXkgd2hlbiByb2xsb3ZlciBvY2N1cnMsIGZvciB0aGUgY2FzZXMgd2hlcmUgcm9sbG92ZXIKLSAgIGlzIHNldCB0byBoYXBwZW4gImF0IG1pZG5pZ2h0IiBvciAib24gYSBwYXJ0aWN1bGFyIHdlZWtkYXkiLgorICAgaXMgc2V0IHRvIGhhcHBlbiAiYXQgbWlkbmlnaHQiIG9yICJvbiBhIHBhcnRpY3VsYXIgd2Vla2RheSIuIE5vdGUgdGhhdCBpbgorICAgdGhlc2UgY2FzZXMsIHRoZSAqYXRUaW1lKiB2YWx1ZSBpcyBlZmZlY3RpdmVseSB1c2VkIHRvIGNvbXB1dGUgdGhlICppbml0aWFsKgorICAgcm9sbG92ZXIsIGFuZCBzdWJzZXF1ZW50IHJvbGxvdmVycyB3b3VsZCBiZSBjYWxjdWxhdGVkIHZpYSB0aGUgbm9ybWFsCisgICBpbnRlcnZhbCBjYWxjdWxhdGlvbi4KKworICAgLi4gbm90ZTo6IENhbGN1bGF0aW9uIG9mIHRoZSBpbml0aWFsIHJvbGxvdmVyIHRpbWUgaXMgZG9uZSB3aGVuIHRoZSBoYW5kbGVyCisgICAgICBpcyBpbml0aWFsaXNlZC4gQ2FsY3VsYXRpb24gb2Ygc3Vic2VxdWVudCByb2xsb3ZlciB0aW1lcyBpcyBkb25lIG9ubHkKKyAgICAgIHdoZW4gcm9sbG92ZXIgb2NjdXJzLCBhbmQgcm9sbG92ZXIgb2NjdXJzIG9ubHkgd2hlbiBlbWl0dGluZyBvdXRwdXQuIElmCisgICAgICB0aGlzIGlzIG5vdCBrZXB0IGluIG1pbmQsIGl0IG1pZ2h0IGxlYWQgdG8gc29tZSBjb25mdXNpb24uIEZvciBleGFtcGxlLAorICAgICAgaWYgYW4gaW50ZXJ2YWwgb2YgImV2ZXJ5IG1pbnV0ZSIgaXMgc2V0LCB0aGF0IGRvZXMgbm90IG1lYW4geW91IHdpbGwKKyAgICAgIGFsd2F5cyBzZWUgbG9nIGZpbGVzIHdpdGggdGltZXMgKGluIHRoZSBmaWxlbmFtZSkgc2VwYXJhdGVkIGJ5IGEgbWludXRlOworICAgICAgaWYsIGR1cmluZyBhcHBsaWNhdGlvbiBleGVjdXRpb24sIGxvZ2dpbmcgb3V0cHV0IGlzIGdlbmVyYXRlZCBtb3JlCisgICAgICBmcmVxdWVudGx5IHRoYW4gb25jZSBhIG1pbnV0ZSwgKnRoZW4qIHlvdSBjYW4gZXhwZWN0IHRvIHNlZSBsb2cgZmlsZXMKKyAgICAgIHdpdGggdGltZXMgc2VwYXJhdGVkIGJ5IGEgbWludXRlLiBJZiwgb24gdGhlIG90aGVyIGhhbmQsIGxvZ2dpbmcgbWVzc2FnZXMKKyAgICAgIGFyZSBvbmx5IG91dHB1dCBvbmNlIGV2ZXJ5IGZpdmUgbWludXRlcyAoc2F5KSwgdGhlbiB0aGVyZSB3aWxsIGJlIGdhcHMgaW4KKyAgICAgIHRoZSBmaWxlIHRpbWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbnV0ZXMgd2hlcmUgbm8gb3V0cHV0IChhbmQgaGVuY2Ugbm8KKyAgICAgIHJvbGxvdmVyKSBvY2N1cnJlZC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgICAgICphdFRpbWUqIHBhcmFtZXRlciB3YXMgYWRkZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBcyB3ZWxsIGFzIHN0cmluZyB2YWx1ZXMsIDpjbGFzczpgfnBhdGhsaWIuUGF0aGAgb2JqZWN0cyBhcmUgYWxzbyBhY2NlcHRlZAorICAgICAgZm9yIHRoZSAqZmlsZW5hbWUqIGFyZ3VtZW50LgorCiAgICAuLiBtZXRob2Q6OiBkb1JvbGxvdmVyKCkKIAogICAgICAgRG9lcyBhIHJvbGxvdmVyLCBhcyBkZXNjcmliZWQgYWJvdmUuCiAKLQogICAgLi4gbWV0aG9kOjogZW1pdChyZWNvcmQpCiAKICAgICAgIE91dHB1dHMgdGhlIHJlY29yZCB0byB0aGUgZmlsZSwgY2F0ZXJpbmcgZm9yIHJvbGxvdmVyIGFzIGRlc2NyaWJlZCBhYm92ZS4KQEAgLTc5OCwxMiArODM3LDE4IEBACiAgICAgICBvdmVycmlkZGVuIHRvIGltcGxlbWVudCBjdXN0b20gZmx1c2hpbmcgc3RyYXRlZ2llcy4KIAogCi0uLiBjbGFzczo6IE1lbW9yeUhhbmRsZXIoY2FwYWNpdHksIGZsdXNoTGV2ZWw9RVJST1IsIHRhcmdldD1Ob25lKQorLi4gY2xhc3M6OiBNZW1vcnlIYW5kbGVyKGNhcGFjaXR5LCBmbHVzaExldmVsPUVSUk9SLCB0YXJnZXQ9Tm9uZSwgZmx1c2hPbkNsb3NlPVRydWUpCiAKICAgIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDpjbGFzczpgTWVtb3J5SGFuZGxlcmAgY2xhc3MuIFRoZSBpbnN0YW5jZSBpcwogICAgaW5pdGlhbGl6ZWQgd2l0aCBhIGJ1ZmZlciBzaXplIG9mICpjYXBhY2l0eSouIElmICpmbHVzaExldmVsKiBpcyBub3Qgc3BlY2lmaWVkLAogICAgOmNvbnN0OmBFUlJPUmAgaXMgdXNlZC4gSWYgbm8gKnRhcmdldCogaXMgc3BlY2lmaWVkLCB0aGUgdGFyZ2V0IHdpbGwgbmVlZCB0byBiZQotICAgc2V0IHVzaW5nIDptZXRoOmBzZXRUYXJnZXRgIGJlZm9yZSB0aGlzIGhhbmRsZXIgZG9lcyBhbnl0aGluZyB1c2VmdWwuCisgICBzZXQgdXNpbmcgOm1ldGg6YHNldFRhcmdldGAgYmVmb3JlIHRoaXMgaGFuZGxlciBkb2VzIGFueXRoaW5nIHVzZWZ1bC4gSWYKKyAgICpmbHVzaE9uQ2xvc2UqIGlzIHNwZWNpZmllZCBhcyBgYEZhbHNlYGAsIHRoZW4gdGhlIGJ1ZmZlciBpcyAqbm90KiBmbHVzaGVkIHdoZW4KKyAgIHRoZSBoYW5kbGVyIGlzIGNsb3NlZC4gSWYgbm90IHNwZWNpZmllZCBvciBzcGVjaWZpZWQgYXMgYGBUcnVlYGAsIHRoZSBwcmV2aW91cworICAgYmVoYXZpb3VyIG9mIGZsdXNoaW5nIHRoZSBidWZmZXIgd2lsbCBvY2N1ciB3aGVuIHRoZSBoYW5kbGVyIGlzIGNsb3NlZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSAqZmx1c2hPbkNsb3NlKiBwYXJhbWV0ZXIgd2FzIGFkZGVkLgogCiAKICAgIC4uIG1ldGhvZDo6IGNsb3NlKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21hdGgucnN0IGIvRG9jL2xpYnJhcnkvbWF0aC5yc3QKaW5kZXggM2ZkZWExOC4uZGEyYjhjYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbWF0aC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWF0aC5yc3QKQEAgLTQyNiw2ICs0MjYsMTUgQEAKIAogICAgVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCBlID0gMi43MTgyODEuLi4sIHRvIGF2YWlsYWJsZSBwcmVjaXNpb24uCiAKKy4uIGRhdGE6OiB0YXUKKworICAgVGhlIG1hdGhlbWF0aWNhbCBjb25zdGFudCDPhCA9IDYuMjgzMTg1Li4uLCB0byBhdmFpbGFibGUgcHJlY2lzaW9uLgorICAgVGF1IGlzIGEgY2lyY2xlIGNvbnN0YW50IGVxdWFsIHRvIDLPgCwgdGhlIHJhdGlvIG9mIGEgY2lyY2xlJ3MgY2lyY3VtZmVyZW5jZSB0bworICAgaXRzIHJhZGl1cy4gVG8gbGVhcm4gbW9yZSBhYm91dCBUYXUsIGNoZWNrIG91dCBWaSBIYXJ0J3MgdmlkZW8gYFBpIGlzIChzdGlsbCkKKyAgIFdyb25nIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWpHN3ZoTU1YYWdRPmBfLCBhbmQgc3RhcnQgY2VsZWJyYXRpbmcKKyAgIGBUYXUgZGF5IDxodHRwOi8vdGF1ZGF5LmNvbS8+YF8gYnkgZWF0aW5nIHR3aWNlIGFzIG11Y2ggcGllIQorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogLi4gZGF0YTo6IGluZgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tbWFwLnJzdCBiL0RvYy9saWJyYXJ5L21tYXAucnN0CmluZGV4IDhmNTM4MzMuLmM1NDRjODAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21tYXAucnN0CisrKyBiL0RvYy9saWJyYXJ5L21tYXAucnN0CkBAIC0yNjQsMTMgKzI2NCwxOCBAQAogICAgLi4gbWV0aG9kOjogd3JpdGUoYnl0ZXMpCiAKICAgICAgIFdyaXRlIHRoZSBieXRlcyBpbiAqYnl0ZXMqIGludG8gbWVtb3J5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZQotICAgICAgZmlsZSBwb2ludGVyOyB0aGUgZmlsZSBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHBvaW50IGFmdGVyIHRoZSBieXRlcyB0aGF0Ci0gICAgICB3ZXJlIHdyaXR0ZW4uIElmIHRoZSBtbWFwIHdhcyBjcmVhdGVkIHdpdGggOmNvbnN0OmBBQ0NFU1NfUkVBRGAsIHRoZW4KKyAgICAgIGZpbGUgcG9pbnRlciBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAobmV2ZXIgbGVzcyB0aGFuCisgICAgICBgYGxlbihieXRlcylgYCwgc2luY2UgaWYgdGhlIHdyaXRlIGZhaWxzLCBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUKKyAgICAgIHJhaXNlZCkuICBUaGUgZmlsZSBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHBvaW50IGFmdGVyIHRoZSBieXRlcyB0aGF0CisgICAgICB3ZXJlIHdyaXR0ZW4uICBJZiB0aGUgbW1hcCB3YXMgY3JlYXRlZCB3aXRoIDpjb25zdDpgQUNDRVNTX1JFQURgLCB0aGVuCiAgICAgICB3cml0aW5nIHRvIGl0IHdpbGwgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgIGV4Y2VwdGlvbi4KIAogICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgICAgIFdyaXRhYmxlIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAgaXMgbm93IGFjY2VwdGVkLgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlzIG5vdyByZXR1cm5lZC4KKwogCiAgICAuLiBtZXRob2Q6OiB3cml0ZV9ieXRlKGJ5dGUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CmluZGV4IGQyMDA5OGYuLmY4ODZlY2IgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdApAQCAtNjQ3LDggKzY0Nyw5IEBACiBGb3IgcGFzc2luZyBtZXNzYWdlcyBvbmUgY2FuIHVzZSA6ZnVuYzpgUGlwZWAgKGZvciBhIGNvbm5lY3Rpb24gYmV0d2VlbiB0d28KIHByb2Nlc3Nlcykgb3IgYSBxdWV1ZSAod2hpY2ggYWxsb3dzIG11bHRpcGxlIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzKS4KIAotVGhlIDpjbGFzczpgUXVldWVgLCA6Y2xhc3M6YFNpbXBsZVF1ZXVlYCBhbmQgOmNsYXNzOmBKb2luYWJsZVF1ZXVlYCB0eXBlcyBhcmUgbXVsdGktcHJvZHVjZXIsCi1tdWx0aS1jb25zdW1lciBGSUZPIHF1ZXVlcyBtb2RlbGxlZCBvbiB0aGUgOmNsYXNzOmBxdWV1ZS5RdWV1ZWAgY2xhc3MgaW4gdGhlCitUaGUgOmNsYXNzOmBRdWV1ZWAsIDpjbGFzczpgU2ltcGxlUXVldWVgIGFuZCA6Y2xhc3M6YEpvaW5hYmxlUXVldWVgIHR5cGVzCithcmUgbXVsdGktcHJvZHVjZXIsIG11bHRpLWNvbnN1bWVyIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAKK3F1ZXVlcyBtb2RlbGxlZCBvbiB0aGUgOmNsYXNzOmBxdWV1ZS5RdWV1ZWAgY2xhc3MgaW4gdGhlCiBzdGFuZGFyZCBsaWJyYXJ5LiAgVGhleSBkaWZmZXIgaW4gdGhhdCA6Y2xhc3M6YFF1ZXVlYCBsYWNrcyB0aGUKIDptZXRoOmB+cXVldWUuUXVldWUudGFza19kb25lYCBhbmQgOm1ldGg6YH5xdWV1ZS5RdWV1ZS5qb2luYCBtZXRob2RzIGludHJvZHVjZWQKIGludG8gUHl0aG9uIDIuNSdzIDpjbGFzczpgcXVldWUuUXVldWVgIGNsYXNzLgpAQCAtODg2LDggKzg4NywxMyBAQAogCiAuLiBmdW5jdGlvbjo6IGNwdV9jb3VudCgpCiAKLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4gIE1heSByYWlzZQotICAgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAuCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uCisKKyAgIFRoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgorICAgdXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorICAgYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKKworICAgTWF5IHJhaXNlIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgLgogCiAgICAuLiBzZWVhbHNvOjoKICAgICAgIDpmdW5jOmBvcy5jcHVfY291bnRgCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vcy5wYXRoLnJzdCBiL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CmluZGV4IGJmMGRmYWMuLjQwNjA1NGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CisrKyBiL0RvYy9saWJyYXJ5L29zLnBhdGgucnN0CkBAIC02MSw2ICs2MSw5IEBACiAgICBwbGF0Zm9ybXMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiA6ZnVuYzpgbm9ybXBhdGhgIGFzCiAgICBmb2xsb3dzOiBgYG5vcm1wYXRoKGpvaW4ob3MuZ2V0Y3dkKCksIHBhdGgpKWBgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGJhc2VuYW1lKHBhdGgpCiAKQEAgLTcxLDYgKzc0LDkgQEAKICAgIGBgJy9mb28vYmFyLydgYCByZXR1cm5zIGBgJ2JhcidgYCwgdGhlIDpmdW5jOmBiYXNlbmFtZWAgZnVuY3Rpb24gcmV0dXJucyBhbgogICAgZW1wdHkgc3RyaW5nIChgYCcnYGApLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGNvbW1vbnBhdGgocGF0aHMpCiAKQEAgLTgzLDYgKzg5LDkgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgc2VxdWVuY2Ugb2YgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RzIDxwYXRoLWxpa2Ugb2JqZWN0PmAuCisKIAogLi4gZnVuY3Rpb246OiBjb21tb25wcmVmaXgobGlzdCkKIApAQCAtMTA0LDEyICsxMTMsMTggQEAKICAgICAgICAgPj4+IG9zLnBhdGguY29tbW9ucGF0aChbJy91c3IvbGliJywgJy91c3IvbG9jYWwvbGliJ10pCiAgICAgICAgICcvdXNyJwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGRpcm5hbWUocGF0aCkKIAogICAgUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBwYXRobmFtZSAqcGF0aCouICBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mCiAgICB0aGUgcGFpciByZXR1cm5lZCBieSBwYXNzaW5nICpwYXRoKiB0byB0aGUgZnVuY3Rpb24gOmZ1bmM6YHNwbGl0YC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBleGlzdHMocGF0aCkKIApAQCAtMTIzLDYgKzEzOCw5IEBACiAgICAgICAqcGF0aCogY2FuIG5vdyBiZSBhbiBpbnRlZ2VyOiBgYFRydWVgYCBpcyByZXR1cm5lZCBpZiBpdCBpcyBhbgogICAgICAgIG9wZW4gZmlsZSBkZXNjcmlwdG9yLCBgYEZhbHNlYGAgb3RoZXJ3aXNlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGxleGlzdHMocGF0aCkKIApAQCAtMTMwLDYgKzE0OCw5IEBACiAgICBicm9rZW4gc3ltYm9saWMgbGlua3MuICAgRXF1aXZhbGVudCB0byA6ZnVuYzpgZXhpc3RzYCBvbiBwbGF0Zm9ybXMgbGFja2luZwogICAgOmZ1bmM6YG9zLmxzdGF0YC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBleHBhbmR1c2VyKHBhdGgpCiAKQEAgLTE1MSw2ICsxNzIsOSBAQAogICAgSWYgdGhlIGV4cGFuc2lvbiBmYWlscyBvciBpZiB0aGUgcGF0aCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgdGlsZGUsIHRoZSBwYXRoIGlzCiAgICByZXR1cm5lZCB1bmNoYW5nZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogZXhwYW5kdmFycyhwYXRoKQogCkBAIC0xNjIsNiArMTg2LDkgQEAKICAgIE9uIFdpbmRvd3MsIGBgJW5hbWUlYGAgZXhwYW5zaW9ucyBhcmUgc3VwcG9ydGVkIGluIGFkZGl0aW9uIHRvIGBgJG5hbWVgYCBhbmQKICAgIGBgJHtuYW1lfWBgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGdldGF0aW1lKHBhdGgpCiAKQEAgLTE4Miw2ICsyMDksOSBAQAogICAgSWYgOmZ1bmM6YG9zLnN0YXRfZmxvYXRfdGltZXNgIHJldHVybnMgYGBUcnVlYGAsIHRoZSByZXN1bHQgaXMgYSBmbG9hdGluZyBwb2ludAogICAgbnVtYmVyLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGdldGN0aW1lKHBhdGgpCiAKQEAgLTE5MSwxMiArMjIxLDE4IEBACiAgICB0aGUgIDptb2Q6YHRpbWVgIG1vZHVsZSkuICBSYWlzZSA6ZXhjOmBPU0Vycm9yYCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvcgogICAgaXMgaW5hY2Nlc3NpYmxlLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGdldHNpemUocGF0aCkKIAogICAgUmV0dXJuIHRoZSBzaXplLCBpbiBieXRlcywgb2YgKnBhdGgqLiAgUmFpc2UgOmV4YzpgT1NFcnJvcmAgaWYgdGhlIGZpbGUgZG9lcwogICAgbm90IGV4aXN0IG9yIGlzIGluYWNjZXNzaWJsZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBpc2FicyhwYXRoKQogCkBAIC0yMDQsMjQgKzI0MCwzNiBAQAogICAgYmVnaW5zIHdpdGggYSBzbGFzaCwgb24gV2luZG93cyB0aGF0IGl0IGJlZ2lucyB3aXRoIGEgKGJhY2spc2xhc2ggYWZ0ZXIgY2hvcHBpbmcKICAgIG9mZiBhIHBvdGVudGlhbCBkcml2ZSBsZXR0ZXIuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogaXNmaWxlKHBhdGgpCiAKICAgIFJldHVybiBgYFRydWVgYCBpZiAqcGF0aCogaXMgYW4gZXhpc3RpbmcgcmVndWxhciBmaWxlLiAgVGhpcyBmb2xsb3dzIHN5bWJvbGljCiAgICBsaW5rcywgc28gYm90aCA6ZnVuYzpgaXNsaW5rYCBhbmQgOmZ1bmM6YGlzZmlsZWAgY2FuIGJlIHRydWUgZm9yIHRoZSBzYW1lIHBhdGguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogaXNkaXIocGF0aCkKIAogICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICpwYXRoKiBpcyBhbiBleGlzdGluZyBkaXJlY3RvcnkuICBUaGlzIGZvbGxvd3Mgc3ltYm9saWMKICAgIGxpbmtzLCBzbyBib3RoIDpmdW5jOmBpc2xpbmtgIGFuZCA6ZnVuYzpgaXNkaXJgIGNhbiBiZSB0cnVlIGZvciB0aGUgc2FtZSBwYXRoLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGlzbGluayhwYXRoKQogCiAgICBSZXR1cm4gYGBUcnVlYGAgaWYgKnBhdGgqIHJlZmVycyB0byBhIGRpcmVjdG9yeSBlbnRyeSB0aGF0IGlzIGEgc3ltYm9saWMgbGluay4KICAgIEFsd2F5cyBgYEZhbHNlYGAgaWYgc3ltYm9saWMgbGlua3MgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFB5dGhvbiBydW50aW1lLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGlzbW91bnQocGF0aCkKIApAQCAtMjM3LDYgKzI4NSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKICAgICAgIFN1cHBvcnQgZm9yIGRldGVjdGluZyBub24tcm9vdCBtb3VudCBwb2ludHMgb24gV2luZG93cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBqb2luKHBhdGgsICpwYXRocykKIApAQCAtMjU1LDEzICszMDYsMjAgQEAKICAgIGBgb3MucGF0aC5qb2luKCJjOiIsICJmb28iKWBgIHJlcHJlc2VudHMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CiAgICBkaXJlY3Rvcnkgb24gZHJpdmUgOmZpbGU6YEM6YCAoOmZpbGU6YGM6Zm9vYCksIG5vdCA6ZmlsZTpgYzpcXGZvb2AuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqcGF0aCogYW5kICpwYXRocyouCisKIAogLi4gZnVuY3Rpb246OiBub3JtY2FzZShwYXRoKQogCiAgICBOb3JtYWxpemUgdGhlIGNhc2Ugb2YgYSBwYXRobmFtZS4gIE9uIFVuaXggYW5kIE1hYyBPUyBYLCB0aGlzIHJldHVybnMgdGhlCiAgICBwYXRoIHVuY2hhbmdlZDsgb24gY2FzZS1pbnNlbnNpdGl2ZSBmaWxlc3lzdGVtcywgaXQgY29udmVydHMgdGhlIHBhdGggdG8KICAgIGxvd2VyY2FzZS4gIE9uIFdpbmRvd3MsIGl0IGFsc28gY29udmVydHMgZm9yd2FyZCBzbGFzaGVzIHRvIGJhY2t3YXJkIHNsYXNoZXMuCi0gICBSYWlzZSBhIFR5cGVFcnJvciBpZiB0aGUgdHlwZSBvZiAqcGF0aCogaXMgbm90IGBgc3RyYGAgb3IgYGBieXRlc2BgLgorICAgUmFpc2UgYSBUeXBlRXJyb3IgaWYgdGhlIHR5cGUgb2YgKnBhdGgqIGlzIG5vdCBgYHN0cmBgIG9yIGBgYnl0ZXNgYCAoZGlyZWN0bHkKKyAgIG9yIGluZGlyZWN0bHkgdGhyb3VnaCB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlKS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCiAKIAogLi4gZnVuY3Rpb246OiBub3JtcGF0aChwYXRoKQpAQCAtMjcyLDEyICszMzAsMTggQEAKICAgIHRoYXQgY29udGFpbnMgc3ltYm9saWMgbGlua3MuICBPbiBXaW5kb3dzLCBpdCBjb252ZXJ0cyBmb3J3YXJkIHNsYXNoZXMgdG8KICAgIGJhY2t3YXJkIHNsYXNoZXMuIFRvIG5vcm1hbGl6ZSBjYXNlLCB1c2UgOmZ1bmM6YG5vcm1jYXNlYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiByZWFscGF0aChwYXRoKQogCiAgICBSZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGVsaW1pbmF0aW5nIGFueSBzeW1ib2xpYwogICAgbGlua3MgZW5jb3VudGVyZWQgaW4gdGhlIHBhdGggKGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSkuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogcmVscGF0aChwYXRoLCBzdGFydD1vcy5jdXJkaXIpCiAKQEAgLTI5MCw2ICszNTQsOSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXgsIFdpbmRvd3MuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogc2FtZWZpbGUocGF0aDEsIHBhdGgyKQogCkBAIC0zMDUsNiArMzcyLDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBXaW5kb3dzIG5vdyB1c2VzIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIGFsbCBvdGhlciBwbGF0Zm9ybXMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogc2FtZW9wZW5maWxlKGZwMSwgZnAyKQogCkBAIC0zMTUsNiArMzg1LDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCiAgICAgICBBZGRlZCBXaW5kb3dzIHN1cHBvcnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogc2FtZXN0YXQoc3RhdDEsIHN0YXQyKQogCkBAIC0zMjgsNiArNDAxLDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBBZGRlZCBXaW5kb3dzIHN1cHBvcnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogc3BsaXQocGF0aCkKIApAQCAtMzQxLDYgKzQxNyw5IEBACiAgICAoYnV0IHRoZSBzdHJpbmdzIG1heSBkaWZmZXIpLiAgQWxzbyBzZWUgdGhlIGZ1bmN0aW9ucyA6ZnVuYzpgZGlybmFtZWAgYW5kCiAgICA6ZnVuYzpgYmFzZW5hbWVgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNwbGl0ZHJpdmUocGF0aCkKIApAQCAtMzU5LDYgKzQzOCw5IEBACiAgICBhbmQgc2hhcmUsIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBmb3VydGggc2VwYXJhdG9yLgogICAgZS5nLiBgYHNwbGl0ZHJpdmUoIi8vaG9zdC9jb21wdXRlci9kaXIiKWBgIHJldHVybnMgYGAoIi8vaG9zdC9jb21wdXRlciIsICIvZGlyIilgYAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNwbGl0ZXh0KHBhdGgpCiAKQEAgLTM2Nyw2ICs0NDksOSBAQAogICAgcGVyaW9kLiBMZWFkaW5nIHBlcmlvZHMgb24gdGhlIGJhc2VuYW1lIGFyZSAgaWdub3JlZDsgYGBzcGxpdGV4dCgnLmNzaHJjJylgYAogICAgcmV0dXJucyAgYGAoJy5jc2hyYycsICcnKWBgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNwbGl0dW5jKHBhdGgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L29zLnJzdCBiL0RvYy9saWJyYXJ5L29zLnJzdAppbmRleCA0MjY1YmMyLi5lMmI2ZTY0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9vcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvb3MucnN0CkBAIC01Nyw3ICs1Nyw3IEBACiAKICAgIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBtb2R1bGUgaW1wb3J0ZWQuICBUaGUgZm9sbG93aW5nCiAgICBuYW1lcyBoYXZlIGN1cnJlbnRseSBiZWVuIHJlZ2lzdGVyZWQ6IGBgJ3Bvc2l4J2BgLCBgYCdudCdgYCwKLSAgIGBgJ2NlJ2BgLCBgYCdqYXZhJ2BgLgorICAgYGAnamF2YSdgYC4KIAogICAgLi4gc2VlYWxzbzo6CiAgICAgICA6YXR0cjpgc3lzLnBsYXRmb3JtYCBoYXMgYSBmaW5lciBncmFudWxhcml0eS4gIDpmdW5jOmBvcy51bmFtZWAgZ2l2ZXMKQEAgLTE3MSwyMyArMTcxLDYwIEBACiAKIC4uIGZ1bmN0aW9uOjogZnNlbmNvZGUoZmlsZW5hbWUpCiAKLSAgIEVuY29kZSAqZmlsZW5hbWUqIHRvIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgCi0gICBlcnJvciBoYW5kbGVyLCBvciBgYCdzdHJpY3QnYGAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgYnl0ZXNgIHVuY2hhbmdlZC4KKyAgIEVuY29kZSA6dGVybTpgcGF0aC1saWtlIDxwYXRoLWxpa2Ugb2JqZWN0PmAgKmZpbGVuYW1lKiB0byB0aGUgZmlsZXN5c3RlbQorICAgZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgIG9uCisgICBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBieXRlc2AgdW5jaGFuZ2VkLgogCiAgICA6ZnVuYzpgZnNkZWNvZGVgIGlzIHRoZSByZXZlcnNlIGZ1bmN0aW9uLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1cHBvcnQgYWRkZWQgdG8gYWNjZXB0IG9iamVjdHMgaW1wbGVtZW50aW5nIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYAorICAgICAgaW50ZXJmYWNlLgorCiAKIC4uIGZ1bmN0aW9uOjogZnNkZWNvZGUoZmlsZW5hbWUpCiAKLSAgIERlY29kZSAqZmlsZW5hbWUqIGZyb20gdGhlIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAKLSAgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYCBvbiBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBzdHJgIHVuY2hhbmdlZC4KKyAgIERlY29kZSB0aGUgOnRlcm06YHBhdGgtbGlrZSA8cGF0aC1saWtlIG9iamVjdD5gICpmaWxlbmFtZSogZnJvbSB0aGUKKyAgIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgCisgICBvbiBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBzdHJgIHVuY2hhbmdlZC4KIAogICAgOmZ1bmM6YGZzZW5jb2RlYCBpcyB0aGUgcmV2ZXJzZSBmdW5jdGlvbi4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGFkZGVkIHRvIGFjY2VwdCBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAKKyAgICAgIGludGVyZmFjZS4KKworCisuLiBmdW5jdGlvbjo6IGZzcGF0aChwYXRoKQorCisgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLgorCisgICBJZiA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCisgICBPdGhlcndpc2UgOm1ldGg6YH5vcy5QYXRoTGlrZS5fX2ZzcGF0aF9fYCBpcyBjYWxsZWQgYW5kIGl0cyB2YWx1ZSBpcworICAgcmV0dXJuZWQgYXMgbG9uZyBhcyBpdCBpcyBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QuCisgICBJbiBhbGwgb3RoZXIgY2FzZXMsIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBjbGFzczo6IFBhdGhMaWtlCisKKyAgIEFuIDp0ZXJtOmBhYnN0cmFjdCBiYXNlIGNsYXNzYCBmb3Igb2JqZWN0cyByZXByZXNlbnRpbmcgYSBmaWxlIHN5c3RlbSBwYXRoLAorICAgZS5nLiA6Y2xhc3M6YHBhdGhsaWIuUHVyZVBhdGhgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gYWJzdHJhY3RtZXRob2Q6OiBfX2ZzcGF0aF9fKCkKKworICAgICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisKKyAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIG9ubHkgcmV0dXJuIGEgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdCwKKyAgICAgIHdpdGggdGhlIHByZWZlcmVuY2UgYmVpbmcgZm9yIDpjbGFzczpgc3RyYC4KKwogCiAuLiBmdW5jdGlvbjo6IGdldGVudihrZXksIGRlZmF1bHQ9Tm9uZSkKIApAQCAtODkzLDYgKzkzMCw5IEBACiAgICAgICBleGNlcHRpb24sIHRoZSBmdW5jdGlvbiBub3cgcmV0cmllcyB0aGUgc3lzdGVtIGNhbGwgaW5zdGVhZCBvZiByYWlzaW5nIGFuCiAgICAgICA6ZXhjOmBJbnRlcnJ1cHRlZEVycm9yYCBleGNlcHRpb24gKHNlZSA6cGVwOmA0NzVgIGZvciB0aGUgcmF0aW9uYWxlKS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBvcHRpb25zIGZvciB0aGUgKmZsYWdzKiBwYXJhbWV0ZXIgdG8gdGhlCiA6ZnVuYzpgfm9zLm9wZW5gIGZ1bmN0aW9uLiAgVGhleSBjYW4gYmUgY29tYmluZWQgdXNpbmcgdGhlIGJpdHdpc2UgT1Igb3BlcmF0b3IKIGBgfGBgLiAgU29tZSBvZiB0aGVtIGFyZSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMuICBGb3IgZGVzY3JpcHRpb25zIG9mCkBAIC0xMzg5LDYgKzE0MjksOSBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgICAgIEFkZGVkIHRoZSAqZGlyX2ZkKiwgKmVmZmVjdGl2ZV9pZHMqLCBhbmQgKmZvbGxvd19zeW1saW5rcyogcGFyYW1ldGVycy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZGF0YTo6IEZfT0sKICAgICAgICAgICBSX09LCkBAIC0xNDEzLDYgKzE0NTYsOSBAQAogICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyAqcGF0aCogYXMgYSBmaWxlIGRlc2NyaXB0b3IKICAgICAgIG9uIHNvbWUgcGxhdGZvcm1zLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGNoZmxhZ3MocGF0aCwgZmxhZ3MsICosIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCkBAIC0xNDM5LDYgKzE0ODUsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmZvbGxvd19zeW1saW5rcyogYXJndW1lbnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogY2htb2QocGF0aCwgbW9kZSwgKiwgZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCkBAIC0xNDgwLDYgKzE1MjksOSBAQAogICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyAqcGF0aCogYXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IsCiAgICAgICBhbmQgdGhlICpkaXJfZmQqIGFuZCAqZm9sbG93X3N5bWxpbmtzKiBhcmd1bWVudHMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogY2hvd24ocGF0aCwgdWlkLCBnaWQsICosIGRpcl9mZD1Ob25lLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMTQ5OSw2ICsxNTUxLDkgQEAKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICpwYXRoKiwKICAgICAgIGFuZCB0aGUgKmRpcl9mZCogYW5kICpmb2xsb3dfc3ltbGlua3MqIGFyZ3VtZW50cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1cHBvcnRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogY2hyb290KHBhdGgpCiAKQEAgLTE1MDYsNiArMTU2MSw5IEBACiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBmY2hkaXIoZmQpCiAKQEAgLTE1MzQsNiArMTU5Miw5IEBACiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBsY2htb2QocGF0aCwgbW9kZSkKIApAQCAtMTU0NCw2ICsxNjA1LDggQEAKIAogICAgQXZhaWxhYmlsaXR5OiBVbml4LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KIAogLi4gZnVuY3Rpb246OiBsY2hvd24ocGF0aCwgdWlkLCBnaWQpCiAKQEAgLTE1NTMsNiArMTYxNiw5IEBACiAKICAgIEF2YWlsYWJpbGl0eTogVW5peC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBsaW5rKHNyYywgZHN0LCAqLCBzcmNfZGlyX2ZkPU5vbmUsIGRzdF9kaXJfZmQ9Tm9uZSwgZm9sbG93X3N5bWxpbmtzPVRydWUpCiAKQEAgLTE1NzAsNiArMTYzNiw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIEFkZGVkIHRoZSAqc3JjX2Rpcl9mZCosICpkc3RfZGlyX2ZkKiwgYW5kICpmb2xsb3dfc3ltbGlua3MqIGFyZ3VtZW50cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpzcmMqIGFuZCAqZHN0Ki4KKwogCiAuLiBmdW5jdGlvbjo6IGxpc3RkaXIocGF0aD0nLicpCiAKQEAgLTE1NzcsOCArMTY0Niw5IEBACiAgICAqcGF0aCouICBUaGUgbGlzdCBpcyBpbiBhcmJpdHJhcnkgb3JkZXIsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzcGVjaWFsCiAgICBlbnRyaWVzIGBgJy4nYGAgYW5kIGBgJy4uJ2BgIGV2ZW4gaWYgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5LgogCi0gICAqcGF0aCogbWF5IGJlIGVpdGhlciBvZiB0eXBlIGBgc3RyYGAgb3Igb2YgdHlwZSBgYGJ5dGVzYGAuICBJZiAqcGF0aCoKLSAgIGlzIG9mIHR5cGUgYGBieXRlc2BgLCB0aGUgZmlsZW5hbWVzIHJldHVybmVkIHdpbGwgYWxzbyBiZSBvZiB0eXBlIGBgYnl0ZXNgYDsKKyAgICpwYXRoKiBtYXkgYmUgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuICBJZiAqcGF0aCogaXMgb2YgdHlwZSBgYGJ5dGVzYGAKKyAgIChkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIDpjbGFzczpgUGF0aExpa2VgIGludGVyZmFjZSksCisgICB0aGUgZmlsZW5hbWVzIHJldHVybmVkIHdpbGwgYWxzbyBiZSBvZiB0eXBlIGBgYnl0ZXNgYDsKICAgIGluIGFsbCBvdGhlciBjaXJjdW1zdGFuY2VzLCB0aGV5IHdpbGwgYmUgb2YgdHlwZSBgYHN0cmBgLgogCiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIHN1cHBvcnQgOnJlZjpgc3BlY2lmeWluZyBhIGZpbGUgZGVzY3JpcHRvcgpAQCAtMTU5OSw2ICsxNjY5LDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgKnBhdGgqLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IGxzdGF0KHBhdGgsIFwqLCBkaXJfZmQ9Tm9uZSkKIApAQCAtMTYyNSw2ICsxNjk4LDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICBBZGRlZCB0aGUgKmRpcl9mZCogcGFyYW1ldGVyLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCBmb3IgKnNyYyogYW5kICpkc3QqLgorCiAKIC4uIGZ1bmN0aW9uOjogbWtkaXIocGF0aCwgbW9kZT0wbzc3NywgKiwgZGlyX2ZkPU5vbmUpCiAKQEAgLTE2NDksNiArMTcyNSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIFRoZSAqZGlyX2ZkKiBhcmd1bWVudC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiBtYWtlZGlycyhuYW1lLCBtb2RlPTBvNzc3LCBleGlzdF9vaz1GYWxzZSkKIApAQCAtMTY4Miw2ICsxNzYxLDkgQEAKICAgICAgIG1vZGUgb2YgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4gU2luY2UgdGhpcyBiZWhhdmlvciB3YXMgaW1wb3NzaWJsZSB0bwogICAgICAgaW1wbGVtZW50IHNhZmVseSwgaXQgd2FzIHJlbW92ZWQgaW4gUHl0aG9uIDMuNC4xLiBTZWUgOmlzc3VlOmAyMTA4MmAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbWtmaWZvKHBhdGgsIG1vZGU9MG82NjYsICosIGRpcl9mZD1Ob25lKQogCkBAIC0xNzAyLDYgKzE3ODQsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmRpcl9mZCogYXJndW1lbnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbWtub2QocGF0aCwgbW9kZT0wbzYwMCwgZGV2aWNlPTAsICosIGRpcl9mZD1Ob25lKQogCkBAIC0xNzE5LDYgKzE4MDQsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmRpcl9mZCogYXJndW1lbnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogbWFqb3IoZGV2aWNlKQogCkBAIC0xNzU3LDYgKzE4NDUsOSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGRhdGE6OiBwYXRoY29uZl9uYW1lcwogCkBAIC0xNzc0LDkgKzE4NjUsMTAgQEAKICAgIG1heSBiZSBjb252ZXJ0ZWQgdG8gYW4gYWJzb2x1dGUgcGF0aG5hbWUgdXNpbmcKICAgIGBgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShwYXRoKSwgcmVzdWx0KWBgLgogCi0gICBJZiB0aGUgKnBhdGgqIGlzIGEgc3RyaW5nIG9iamVjdCwgdGhlIHJlc3VsdCB3aWxsIGFsc28gYmUgYSBzdHJpbmcgb2JqZWN0LAorICAgSWYgdGhlICpwYXRoKiBpcyBhIHN0cmluZyBvYmplY3QgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCBhCisgICA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UpLCB0aGUgcmVzdWx0IHdpbGwgYWxzbyBiZSBhIHN0cmluZyBvYmplY3QsCiAgICBhbmQgdGhlIGNhbGwgbWF5IHJhaXNlIGEgVW5pY29kZURlY29kZUVycm9yLiBJZiB0aGUgKnBhdGgqIGlzIGEgYnl0ZXMKLSAgIG9iamVjdCwgdGhlIHJlc3VsdCB3aWxsIGJlIGEgYnl0ZXMgb2JqZWN0LgorICAgb2JqZWN0IChkaXJlY3Qgb3IgaW5kaXJlY3RseSksIHRoZSByZXN1bHQgd2lsbCBiZSBhIGJ5dGVzIG9iamVjdC4KIAogICAgVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBzdXBwb3J0IDpyZWY6YHBhdGhzIHJlbGF0aXZlIHRvIGRpcmVjdG9yeSBkZXNjcmlwdG9ycwogICAgPGRpcl9mZD5gLgpAQCAtMTc4OSw2ICsxODgxLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpkaXJfZmQqIGFyZ3VtZW50LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHJlbW92ZShwYXRoLCAqLCBkaXJfZmQ9Tm9uZSkKIApAQCAtMTgwNyw2ICsxOTAyLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpkaXJfZmQqIGFyZ3VtZW50LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHJlbW92ZWRpcnMobmFtZSkKIApAQCAtMTgyMSw2ICsxOTE5LDkgQEAKICAgIHRoZXkgYXJlIGVtcHR5LiBSYWlzZXMgOmV4YzpgT1NFcnJvcmAgaWYgdGhlIGxlYWYgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZQogICAgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogcmVuYW1lKHNyYywgZHN0LCAqLCBzcmNfZGlyX2ZkPU5vbmUsIGRzdF9kaXJfZmQ9Tm9uZSkKIApAQCAtMTg0MCw2ICsxOTQxLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogICAgICAgVGhlICpzcmNfZGlyX2ZkKiBhbmQgKmRzdF9kaXJfZmQqIGFyZ3VtZW50cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpzcmMqIGFuZCAqZHN0Ki4KKwogCiAuLiBmdW5jdGlvbjo6IHJlbmFtZXMob2xkLCBuZXcpCiAKQEAgLTE4NTMsNiArMTk1Nyw5IEBACiAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBmYWlsIHdpdGggdGhlIG5ldyBkaXJlY3Rvcnkgc3RydWN0dXJlIG1hZGUgaWYgeW91IGxhY2sKICAgICAgIHBlcm1pc3Npb25zIG5lZWRlZCB0byByZW1vdmUgdGhlIGxlYWYgZGlyZWN0b3J5IG9yIGZpbGUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqb2xkKiBhbmQgKm5ldyouCisKIAogLi4gZnVuY3Rpb246OiByZXBsYWNlKHNyYywgZHN0LCAqLCBzcmNfZGlyX2ZkPU5vbmUsIGRzdF9kaXJfZmQ9Tm9uZSkKIApAQCAtMTg2Nyw2ICsxOTc0LDkgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgIGZvciAqc3JjKiBhbmQgKmRzdCouCisKIAogLi4gZnVuY3Rpb246OiBybWRpcihwYXRoLCAqLCBkaXJfZmQ9Tm9uZSkKIApAQCAtMTg4MCwzOCArMTk5MCw1OCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAgICAgICBUaGUgKmRpcl9mZCogcGFyYW1ldGVyLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiAuLiBmdW5jdGlvbjo6IHNjYW5kaXIocGF0aD0nLicpCiAKLSAgIFJldHVybiBhbiBpdGVyYXRvciBvZiA6Y2xhc3M6YERpckVudHJ5YCBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudHJpZXMKLSAgIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgKnBhdGgqLiBUaGUgZW50cmllcyBhcmUgeWllbGRlZCBpbiBhcmJpdHJhcnkKLSAgIG9yZGVyLCBhbmQgdGhlIHNwZWNpYWwgZW50cmllcyBgYCcuJ2BgIGFuZCBgYCcuLidgYCBhcmUgbm90IGluY2x1ZGVkLgorICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIDpjbGFzczpgb3MuRGlyRW50cnlgIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSAqcGF0aCouIFRoZSBlbnRyaWVzIGFyZSB5aWVsZGVkIGluCisgICBhcmJpdHJhcnkgb3JkZXIsIGFuZCB0aGUgc3BlY2lhbCBlbnRyaWVzIGBgJy4nYGAgYW5kIGBgJy4uJ2BgIGFyZSBub3QKKyAgIGluY2x1ZGVkLgogCiAgICBVc2luZyA6ZnVuYzpgc2NhbmRpcmAgaW5zdGVhZCBvZiA6ZnVuYzpgbGlzdGRpcmAgY2FuIHNpZ25pZmljYW50bHkKICAgIGluY3JlYXNlIHRoZSBwZXJmb3JtYW5jZSBvZiBjb2RlIHRoYXQgYWxzbyBuZWVkcyBmaWxlIHR5cGUgb3IgZmlsZQotICAgYXR0cmlidXRlIGluZm9ybWF0aW9uLCBiZWNhdXNlIDpjbGFzczpgRGlyRW50cnlgIG9iamVjdHMgZXhwb3NlIHRoaXMKKyAgIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6Y2xhc3M6YG9zLkRpckVudHJ5YCBvYmplY3RzIGV4cG9zZSB0aGlzCiAgICBpbmZvcm1hdGlvbiBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcyBpdCB3aGVuIHNjYW5uaW5nIGEgZGlyZWN0b3J5LgotICAgQWxsIDpjbGFzczpgRGlyRW50cnlgIG1ldGhvZHMgbWF5IHBlcmZvcm0gYSBzeXN0ZW0gY2FsbCwgYnV0Ci0gICA6ZnVuYzpgfkRpckVudHJ5LmlzX2RpcmAgYW5kIDpmdW5jOmB+RGlyRW50cnkuaXNfZmlsZWAgdXN1YWxseSBvbmx5Ci0gICByZXF1aXJlIGEgc3lzdGVtIGNhbGwgZm9yIHN5bWJvbGljIGxpbmtzOyA6ZnVuYzpgRGlyRW50cnkuc3RhdGAKKyAgIEFsbCA6Y2xhc3M6YG9zLkRpckVudHJ5YCBtZXRob2RzIG1heSBwZXJmb3JtIGEgc3lzdGVtIGNhbGwsIGJ1dAorICAgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19kaXJgIGFuZCA6ZnVuYzpgfm9zLkRpckVudHJ5LmlzX2ZpbGVgIHVzdWFsbHkgb25seQorICAgcmVxdWlyZSBhIHN5c3RlbSBjYWxsIGZvciBzeW1ib2xpYyBsaW5rczsgOmZ1bmM6YG9zLkRpckVudHJ5LnN0YXRgCiAgICBhbHdheXMgcmVxdWlyZXMgYSBzeXN0ZW0gY2FsbCBvbiBVbml4IGJ1dCBvbmx5IHJlcXVpcmVzIG9uZSBmb3IKICAgIHN5bWJvbGljIGxpbmtzIG9uIFdpbmRvd3MuCiAKLSAgIE9uIFVuaXgsICpwYXRoKiBjYW4gYmUgb2YgdHlwZSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgKHVzZQorICAgT24gVW5peCwgKnBhdGgqIGNhbiBiZSBvZiB0eXBlIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCAoZWl0aGVyCisgICBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIDpjbGFzczpgUGF0aExpa2VgIGludGVyZmFjZTsgdXNlCiAgICA6ZnVuYzpgfm9zLmZzZW5jb2RlYCBhbmQgOmZ1bmM6YH5vcy5mc2RlY29kZWAgdG8gZW5jb2RlIGFuZCBkZWNvZGUKICAgIDpjbGFzczpgYnl0ZXNgIHBhdGhzKS4gT24gV2luZG93cywgKnBhdGgqIG11c3QgYmUgb2YgdHlwZSA6Y2xhc3M6YHN0cmAuCi0gICBPbiBib3RoIHN5c3RlbXMsIHRoZSB0eXBlIG9mIHRoZSA6YXR0cjpgfkRpckVudHJ5Lm5hbWVgIGFuZAotICAgOmF0dHI6YH5EaXJFbnRyeS5wYXRoYCBhdHRyaWJ1dGVzIG9mIGVhY2ggOmNsYXNzOmBEaXJFbnRyeWAgd2lsbCBiZSBvZgorICAgT24gYm90aCBzeXN0ZW1zLCB0aGUgdHlwZSBvZiB0aGUgOmF0dHI6YH5vcy5EaXJFbnRyeS5uYW1lYCBhbmQKKyAgIDphdHRyOmB+b3MuRGlyRW50cnkucGF0aGAgYXR0cmlidXRlcyBvZiBlYWNoIDpjbGFzczpgb3MuRGlyRW50cnlgIHdpbGwgYmUgb2YKICAgIHRoZSBzYW1lIHR5cGUgYXMgKnBhdGgqLgogCisgICBUaGUgOmZ1bmM6YHNjYW5kaXJgIGl0ZXJhdG9yIHN1cHBvcnRzIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbAorICAgYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKworICAgLi4gbWV0aG9kOjogc2NhbmRpci5jbG9zZSgpCisKKyAgICAgIENsb3NlIHRoZSBpdGVyYXRvciBhbmQgZnJlZSBhY3F1aXJlZCByZXNvdXJjZXMuCisKKyAgICAgIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkIG9yIGdhcmJhZ2UKKyAgICAgIGNvbGxlY3RlZCwgb3Igd2hlbiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBpdGVyYXRpbmcuICBIb3dldmVyIGl0CisgICAgICBpcyBhZHZpc2FibGUgdG8gY2FsbCBpdCBleHBsaWNpdGx5IG9yIHVzZSB0aGUgOmtleXdvcmQ6YHdpdGhgCisgICAgICBzdGF0ZW1lbnQuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgdXNlIG9mIDpmdW5jOmBzY2FuZGlyYCB0byBkaXNwbGF5IGFsbAogICAgdGhlIGZpbGVzIChleGNsdWRpbmcgZGlyZWN0b3JpZXMpIGluIHRoZSBnaXZlbiAqcGF0aCogdGhhdCBkb24ndCBzdGFydCB3aXRoCiAgICBgYCcuJ2BgLiBUaGUgYGBlbnRyeS5pc19maWxlKClgYCBjYWxsIHdpbGwgZ2VuZXJhbGx5IG5vdCBtYWtlIGFuIGFkZGl0aW9uYWwKICAgIHN5c3RlbSBjYWxsOjoKIAotICAgICAgZm9yIGVudHJ5IGluIG9zLnNjYW5kaXIocGF0aCk6Ci0gICAgICAgICBpZiBub3QgZW50cnkubmFtZS5zdGFydHN3aXRoKCcuJykgYW5kIGVudHJ5LmlzX2ZpbGUoKToKLSAgICAgICAgICAgICBwcmludChlbnRyeS5uYW1lKQorICAgICAgd2l0aCBvcy5zY2FuZGlyKHBhdGgpIGFzIGl0OgorICAgICAgICAgIGZvciBlbnRyeSBpbiBpdDoKKyAgICAgICAgICAgICAgaWYgbm90IGVudHJ5Lm5hbWUuc3RhcnRzd2l0aCgnLicpIGFuZCBlbnRyeS5pc19maWxlKCk6CisgICAgICAgICAgICAgICAgICBwcmludChlbnRyeS5uYW1lKQogCiAgICAuLiBub3RlOjoKIApAQCAtMTkyNyw2ICsyMDU3LDE0IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbCBhbmQgdGhlCisgICAgICA6ZnVuYzpgfnNjYW5kaXIuY2xvc2UoKWAgbWV0aG9kLiAgSWYgYSA6ZnVuYzpgc2NhbmRpcmAgaXRlcmF0b3IgaXMgbmVpdGhlcgorICAgICAgZXhoYXVzdGVkIG5vciBleHBsaWNpdGx5IGNsb3NlZCBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2lsbCBiZSBlbWl0dGVkCisgICAgICBpbiBpdHMgZGVzdHJ1Y3Rvci4KKworICAgICAgVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gY2xhc3M6OiBEaXJFbnRyeQogCkBAIC0xOTM1LDE5ICsyMDczLDIyIEBACiAKICAgIDpmdW5jOmBzY2FuZGlyYCB3aWxsIHByb3ZpZGUgYXMgbXVjaCBvZiB0aGlzIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIHdpdGhvdXQKICAgIG1ha2luZyBhZGRpdGlvbmFsIHN5c3RlbSBjYWxscy4gV2hlbiBhIGBgc3RhdCgpYGAgb3IgYGBsc3RhdCgpYGAgc3lzdGVtIGNhbGwKLSAgIGlzIG1hZGUsIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0IHdpbGwgY2FjaGUgdGhlIHJlc3VsdC4KKyAgIGlzIG1hZGUsIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0IHdpbGwgY2FjaGUgdGhlIHJlc3VsdC4KIAotICAgYGBEaXJFbnRyeWBgIGluc3RhbmNlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHN0b3JlZCBpbiBsb25nLWxpdmVkIGRhdGEKKyAgIGBgb3MuRGlyRW50cnlgYCBpbnN0YW5jZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdG9yZWQgaW4gbG9uZy1saXZlZCBkYXRhCiAgICBzdHJ1Y3R1cmVzOyBpZiB5b3Uga25vdyB0aGUgZmlsZSBtZXRhZGF0YSBoYXMgY2hhbmdlZCBvciBpZiBhIGxvbmcgdGltZSBoYXMKICAgIGVsYXBzZWQgc2luY2UgY2FsbGluZyA6ZnVuYzpgc2NhbmRpcmAsIGNhbGwgYGBvcy5zdGF0KGVudHJ5LnBhdGgpYGAgdG8gZmV0Y2gKICAgIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCiAKLSAgIEJlY2F1c2UgdGhlIGBgRGlyRW50cnlgYCBtZXRob2RzIGNhbiBtYWtlIG9wZXJhdGluZyBzeXN0ZW0gY2FsbHMsIHRoZXkgbWF5CisgICBCZWNhdXNlIHRoZSBgYG9zLkRpckVudHJ5YGAgbWV0aG9kcyBjYW4gbWFrZSBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzLCB0aGV5IG1heQogICAgYWxzbyByYWlzZSA6ZXhjOmBPU0Vycm9yYC4gSWYgeW91IG5lZWQgdmVyeSBmaW5lLWdyYWluZWQKICAgIGNvbnRyb2wgb3ZlciBlcnJvcnMsIHlvdSBjYW4gY2F0Y2ggOmV4YzpgT1NFcnJvcmAgd2hlbiBjYWxsaW5nIG9uZSBvZiB0aGUKLSAgIGBgRGlyRW50cnlgYCBtZXRob2RzIGFuZCBoYW5kbGUgYXMgYXBwcm9wcmlhdGUuCisgICBgYG9zLkRpckVudHJ5YGAgbWV0aG9kcyBhbmQgaGFuZGxlIGFzIGFwcHJvcHJpYXRlLgogCi0gICBBdHRyaWJ1dGVzIGFuZCBtZXRob2RzIG9uIGEgYGBEaXJFbnRyeWBgIGluc3RhbmNlIGFyZSBhcyBmb2xsb3dzOgorICAgVG8gYmUgZGlyZWN0bHkgdXNhYmxlIGFzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLCBgYG9zLkRpckVudHJ5YGAKKyAgIGltcGxlbWVudHMgdGhlIDpjbGFzczpgUGF0aExpa2VgIGludGVyZmFjZS4KKworICAgQXR0cmlidXRlcyBhbmQgbWV0aG9kcyBvbiBhIGBgb3MuRGlyRW50cnlgYCBpbnN0YW5jZSBhcmUgYXMgZm9sbG93czoKIAogICAgLi4gYXR0cmlidXRlOjogbmFtZQogCkBAIC0xOTczLDggKzIxMTQsOSBAQAogCiAgICAgICBSZXR1cm4gdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZW50cnkuCiAKLSAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0LiBVc2UgYGBvcy5zdGF0KGVudHJ5LnBhdGgsCi0gICAgICBmb2xsb3dfc3ltbGlua3M9RmFsc2UpLnN0X2lub2BgIHRvIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdC4gVXNlCisgICAgICBgYG9zLnN0YXQoZW50cnkucGF0aCwgZm9sbG93X3N5bWxpbmtzPUZhbHNlKS5zdF9pbm9gYCB0byBmZXRjaCB1cC10by1kYXRlCisgICAgICBpbmZvcm1hdGlvbi4KIAogICAgICAgT24gdGhlIGZpcnN0LCB1bmNhY2hlZCBjYWxsLCBhIHN5c3RlbSBjYWxsIGlzIHJlcXVpcmVkIG9uIFdpbmRvd3MgYnV0CiAgICAgICBub3Qgb24gVW5peC4KQEAgLTE5ODksNyArMjEzMSw3IEBACiAgICAgICBpcyBhIGRpcmVjdG9yeSAod2l0aG91dCBmb2xsb3dpbmcgc3ltbGlua3MpOyByZXR1cm4gYGBGYWxzZWBgIGlmIHRoZQogICAgICAgZW50cnkgaXMgYW55IG90aGVyIGtpbmQgb2YgZmlsZSBvciBpZiBpdCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCiAKLSAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0LCB3aXRoIGEgc2VwYXJhdGUgY2FjaGUKKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0LCB3aXRoIGEgc2VwYXJhdGUgY2FjaGUKICAgICAgIGZvciAqZm9sbG93X3N5bWxpbmtzKiBgYFRydWVgYCBhbmQgYGBGYWxzZWBgLiBDYWxsIDpmdW5jOmBvcy5zdGF0YCBhbG9uZwogICAgICAgd2l0aCA6ZnVuYzpgc3RhdC5TX0lTRElSYCB0byBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgogCkBAIC0yMDEzLDggKzIxNTUsOCBAQAogICAgICAgaXMgYSBmaWxlICh3aXRob3V0IGZvbGxvd2luZyBzeW1saW5rcyk7IHJldHVybiBgYEZhbHNlYGAgaWYgdGhlIGVudHJ5IGlzCiAgICAgICBhIGRpcmVjdG9yeSBvciBvdGhlciBub24tZmlsZSBlbnRyeSwgb3IgaWYgaXQgZG9lc24ndCBleGlzdCBhbnltb3JlLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdC4gQ2FjaGluZywgc3lzdGVtIGNhbGxzCi0gICAgICBtYWRlLCBhbmQgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGFzIHBlciA6ZnVuYzpgfkRpckVudHJ5LmlzX2RpcmAuCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdC4gQ2FjaGluZywgc3lzdGVtIGNhbGxzCisgICAgICBtYWRlLCBhbmQgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGFzIHBlciA6ZnVuYzpgfm9zLkRpckVudHJ5LmlzX2RpcmAuCiAKICAgIC4uIG1ldGhvZDo6IGlzX3N5bWxpbmsoKQogCkBAIC0yMDIyLDcgKzIxNjQsNyBAQAogICAgICAgcmV0dXJuIGBgRmFsc2VgYCBpZiB0aGUgZW50cnkgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IG9yIGFueSBraW5kIG9mIGZpbGUsCiAgICAgICBvciBpZiBpdCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCiAKLSAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0LiBDYWxsCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdC4gQ2FsbAogICAgICAgOmZ1bmM6YG9zLnBhdGguaXNsaW5rYCB0byBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgogCiAgICAgICBPbiB0aGUgZmlyc3QsIHVuY2FjaGVkIGNhbGwsIG5vIHN5c3RlbSBjYWxsIGlzIHJlcXVpcmVkIGluIG1vc3QgY2FzZXMuCkBAIC0yMDQ3LDIzICsyMTg5LDI4IEBACiAgICAgICA6Y2xhc3M6YHN0YXRfcmVzdWx0YCBhcmUgYWx3YXlzIHNldCB0byB6ZXJvLiBDYWxsIDpmdW5jOmBvcy5zdGF0YCB0bwogICAgICAgZ2V0IHRoZXNlIGF0dHJpYnV0ZXMuCiAKLSAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0LCB3aXRoIGEgc2VwYXJhdGUgY2FjaGUKKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0LCB3aXRoIGEgc2VwYXJhdGUgY2FjaGUKICAgICAgIGZvciAqZm9sbG93X3N5bWxpbmtzKiBgYFRydWVgYCBhbmQgYGBGYWxzZWBgLiBDYWxsIDpmdW5jOmBvcy5zdGF0YCB0bwogICAgICAgZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIAogICAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgbmljZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHNldmVyYWwgYXR0cmlidXRlcwotICAgYW5kIG1ldGhvZHMgb2YgYGBEaXJFbnRyeWBgIGFuZCBvZiA6Y2xhc3M6YHBhdGhsaWIuUGF0aGAuICBJbgotICAgcGFydGljdWxhciwgdGhlIGBgbmFtZWBgIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUgbWVhbmluZywgYXMgZG8gdGhlCi0gICBgYGlzX2RpcigpYGAsIGBgaXNfZmlsZSgpYGAsIGBgaXNfc3ltbGluaygpYGAgYW5kIGBgc3RhdCgpYGAgbWV0aG9kcy4KKyAgIGFuZCBtZXRob2RzIG9mIGBgb3MuRGlyRW50cnlgYCBhbmQgb2YgOmNsYXNzOmBwYXRobGliLlBhdGhgLiAgSW4KKyAgIHBhcnRpY3VsYXIsIHRoZSBgYG5hbWVgYCBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lCisgICBtZWFuaW5nLCBhcyBkbyB0aGUgYGBpc19kaXIoKWBgLCBgYGlzX2ZpbGUoKWBgLCBgYGlzX3N5bWxpbmsoKWBgCisgICBhbmQgYGBzdGF0KClgYCBtZXRob2RzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSA6Y2xhc3M6YH5vcy5QYXRoTGlrZWAgaW50ZXJmYWNlLgorCiAKIC4uIGZ1bmN0aW9uOjogc3RhdChwYXRoLCBcKiwgZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCiAgICBHZXQgdGhlIHN0YXR1cyBvZiBhIGZpbGUgb3IgYSBmaWxlIGRlc2NyaXB0b3IuIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgYQogICAgOmM6ZnVuYzpgc3RhdGAgc3lzdGVtIGNhbGwgb24gdGhlIGdpdmVuIHBhdGguICpwYXRoKiBtYXkgYmUgc3BlY2lmaWVkIGFzCi0gICBlaXRoZXIgYSBzdHJpbmcgb3IgYXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuIFJldHVybiBhIDpjbGFzczpgc3RhdF9yZXN1bHRgCisgICBlaXRoZXIgYSBzdHJpbmcgLS0gZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSA6Y2xhc3M6YFBhdGhMaWtlYAorICAgaW50ZXJmYWNlIC0tIG9yIGFzIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLiBSZXR1cm4gYSA6Y2xhc3M6YHN0YXRfcmVzdWx0YAogICAgb2JqZWN0LgogCiAgICBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IGZvbGxvd3Mgc3ltbGlua3M7IHRvIHN0YXQgYSBzeW1saW5rIGFkZCB0aGUgYXJndW1lbnQKQEAgLTIwOTMsNiArMjI0MCw5IEBACiAgICAgICBBZGRlZCB0aGUgKmRpcl9mZCogYW5kICpmb2xsb3dfc3ltbGlua3MqIGFyZ3VtZW50cywgc3BlY2lmeWluZyBhIGZpbGUKICAgICAgIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBhIHBhdGguCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGNsYXNzOjogc3RhdF9yZXN1bHQKIApAQCAtMjMxNCwxOSArMjQ2NCwyMiBAQAogCiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBzdXBwb3J0IDpyZWY6YHNwZWNpZnlpbmcgYSBmaWxlIGRlc2NyaXB0b3IgPHBhdGhfZmQ+YC4KIAorICAgQXZhaWxhYmlsaXR5OiBVbml4LgorCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgVGhlIDpjb25zdDpgU1RfUkRPTkxZYCBhbmQgOmNvbnN0OmBTVF9OT1NVSURgIGNvbnN0YW50cyB3ZXJlIGFkZGVkLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICpwYXRoKi4KKwogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgICAgIFRoZSA6Y29uc3Q6YFNUX05PREVWYCwgOmNvbnN0OmBTVF9OT0VYRUNgLCA6Y29uc3Q6YFNUX1NZTkNIUk9OT1VTYCwKICAgICAgIDpjb25zdDpgU1RfTUFORExPQ0tgLCA6Y29uc3Q6YFNUX1dSSVRFYCwgOmNvbnN0OmBTVF9BUFBFTkRgLAogICAgICAgOmNvbnN0OmBTVF9JTU1VVEFCTEVgLCA6Y29uc3Q6YFNUX05PQVRJTUVgLCA6Y29uc3Q6YFNUX05PRElSQVRJTUVgLAogICAgICAgYW5kIDpjb25zdDpgU1RfUkVMQVRJTUVgIGNvbnN0YW50cyB3ZXJlIGFkZGVkLgogCi0gICBBdmFpbGFiaWxpdHk6IFVuaXguCi0KLSAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwotICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgKnBhdGgqLgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCiAKIAogLi4gZGF0YTo6IHN1cHBvcnRzX2Rpcl9mZApAQCAtMjQ0Nyw2ICsyNjAwLDkgQEAKICAgICAgIEFkZGVkIHRoZSAqZGlyX2ZkKiBhcmd1bWVudCwgYW5kIG5vdyBhbGxvdyAqdGFyZ2V0X2lzX2RpcmVjdG9yeSoKICAgICAgIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpzcmMqIGFuZCAqZHN0Ki4KKwogCiAuLiBmdW5jdGlvbjo6IHN5bmMoKQogCkBAIC0yNDcxLDYgKzI2MjcsMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBXaW5kb3dzCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCisKIC4uIGZ1bmN0aW9uOjogdW5saW5rKHBhdGgsICosIGRpcl9mZD1Ob25lKQogCiAgICBSZW1vdmUgKGRlbGV0ZSkgdGhlIGZpbGUgKnBhdGgqLiAgVGhpcyBmdW5jdGlvbiBpcyBzZW1hbnRpY2FsbHkKQEAgLTI0ODEsNiArMjY0MSw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKICAgICAgIFRoZSAqZGlyX2ZkKiBwYXJhbWV0ZXIuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogdXRpbWUocGF0aCwgdGltZXM9Tm9uZSwgKlssIG5zXSwgZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCkBAIC0yNTE4LDYgKzI2ODEsOSBAQAogICAgICAgQWRkZWQgc3VwcG9ydCBmb3Igc3BlY2lmeWluZyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IgKnBhdGgqLAogICAgICAgYW5kIHRoZSAqZGlyX2ZkKiwgKmZvbGxvd19zeW1saW5rcyosIGFuZCAqbnMqIHBhcmFtZXRlcnMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogd2Fsayh0b3AsIHRvcGRvd249VHJ1ZSwgb25lcnJvcj1Ob25lLCBmb2xsb3dsaW5rcz1GYWxzZSkKIApAQCAtMjYwOCw2ICsyNzc0LDkgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gbm93IGNhbGxzIDpmdW5jOmBvcy5zY2FuZGlyYCBpbnN0ZWFkIG9mIDpmdW5jOmBvcy5saXN0ZGlyYCwKICAgICAgIG1ha2luZyBpdCBmYXN0ZXIgYnkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBjYWxscyB0byA6ZnVuYzpgb3Muc3RhdGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGZ1bmN0aW9uOjogZndhbGsodG9wPScuJywgdG9wZG93bj1UcnVlLCBvbmVycm9yPU5vbmUsICosIGZvbGxvd19zeW1saW5rcz1GYWxzZSwgZGlyX2ZkPU5vbmUpCiAKQEAgLTI2NjQsNiArMjgzMyw5IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWNjZXB0cyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YC4KKwogCiBMaW51eCBleHRlbmRlZCBhdHRyaWJ1dGVzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0yNjc1LDEyICsyODQ3LDE2IEBACiAuLiBmdW5jdGlvbjo6IGdldHhhdHRyKHBhdGgsIGF0dHJpYnV0ZSwgKiwgZm9sbG93X3N5bWxpbmtzPVRydWUpCiAKICAgIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGZpbGVzeXN0ZW0gYXR0cmlidXRlICphdHRyaWJ1dGUqIGZvcgotICAgKnBhdGgqLiAqYXR0cmlidXRlKiBjYW4gYmUgYnl0ZXMgb3Igc3RyLiBJZiBpdCBpcyBzdHIsIGl0IGlzIGVuY29kZWQKLSAgIHdpdGggdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcuCisgICAqcGF0aCouICphdHRyaWJ1dGUqIGNhbiBiZSBieXRlcyBvciBzdHIgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB0aGUKKyAgIDpjbGFzczpgUGF0aExpa2VgIGludGVyZmFjZSkuIElmIGl0IGlzIHN0ciwgaXQgaXMgZW5jb2RlZCB3aXRoIHRoZSBmaWxlc3lzdGVtCisgICBlbmNvZGluZy4KIAogICAgVGhpcyBmdW5jdGlvbiBjYW4gc3VwcG9ydCA6cmVmOmBzcGVjaWZ5aW5nIGEgZmlsZSBkZXNjcmlwdG9yIDxwYXRoX2ZkPmAgYW5kCiAgICA6cmVmOmBub3QgZm9sbG93aW5nIHN5bWxpbmtzIDxmb2xsb3dfc3ltbGlua3M+YC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZnByICpwYXRoKiBhbmQgKmF0dHJpYnV0ZSouCisKIAogLi4gZnVuY3Rpb246OiBsaXN0eGF0dHIocGF0aD1Ob25lLCAqLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMjY5MiwyMSArMjg2OCwyOSBAQAogICAgVGhpcyBmdW5jdGlvbiBjYW4gc3VwcG9ydCA6cmVmOmBzcGVjaWZ5aW5nIGEgZmlsZSBkZXNjcmlwdG9yIDxwYXRoX2ZkPmAgYW5kCiAgICA6cmVmOmBub3QgZm9sbG93aW5nIHN5bWxpbmtzIDxmb2xsb3dfc3ltbGlua3M+YC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIAogLi4gZnVuY3Rpb246OiByZW1vdmV4YXR0cihwYXRoLCBhdHRyaWJ1dGUsICosIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCiAgICBSZW1vdmVzIHRoZSBleHRlbmRlZCBmaWxlc3lzdGVtIGF0dHJpYnV0ZSAqYXR0cmlidXRlKiBmcm9tICpwYXRoKi4KLSAgICphdHRyaWJ1dGUqIHNob3VsZCBiZSBieXRlcyBvciBzdHIuIElmIGl0IGlzIGEgc3RyaW5nLCBpdCBpcyBlbmNvZGVkCisgICAqYXR0cmlidXRlKiBzaG91bGQgYmUgYnl0ZXMgb3Igc3RyIChkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggdGhlCisgICA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UpLiBJZiBpdCBpcyBhIHN0cmluZywgaXQgaXMgZW5jb2RlZAogICAgd2l0aCB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZy4KIAogICAgVGhpcyBmdW5jdGlvbiBjYW4gc3VwcG9ydCA6cmVmOmBzcGVjaWZ5aW5nIGEgZmlsZSBkZXNjcmlwdG9yIDxwYXRoX2ZkPmAgYW5kCiAgICA6cmVmOmBub3QgZm9sbG93aW5nIHN5bWxpbmtzIDxmb2xsb3dfc3ltbGlua3M+YC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpwYXRoKiBhbmQgKmF0dHJpYnV0ZSouCisKIAogLi4gZnVuY3Rpb246OiBzZXR4YXR0cihwYXRoLCBhdHRyaWJ1dGUsIHZhbHVlLCBmbGFncz0wLCAqLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIAogICAgU2V0IHRoZSBleHRlbmRlZCBmaWxlc3lzdGVtIGF0dHJpYnV0ZSAqYXR0cmlidXRlKiBvbiAqcGF0aCogdG8gKnZhbHVlKi4KLSAgICphdHRyaWJ1dGUqIG11c3QgYmUgYSBieXRlcyBvciBzdHIgd2l0aCBubyBlbWJlZGRlZCBOVUxzLiBJZiBpdCBpcyBhIHN0ciwKKyAgICphdHRyaWJ1dGUqIG11c3QgYmUgYSBieXRlcyBvciBzdHIgd2l0aCBubyBlbWJlZGRlZCBOVUxzIChkaXJlY3RseSBvcgorICAgaW5kaXJlY3RseSB0aHJvdWdoIHRoZSA6Y2xhc3M6YFBhdGhMaWtlYCBpbnRlcmZhY2UpLiBJZiBpdCBpcyBhIHN0ciwKICAgIGl0IGlzIGVuY29kZWQgd2l0aCB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZy4gICpmbGFncyogbWF5IGJlCiAgICA6ZGF0YTpgWEFUVFJfUkVQTEFDRWAgb3IgOmRhdGE6YFhBVFRSX0NSRUFURWAuIElmIDpkYXRhOmBYQVRUUl9SRVBMQUNFYCBpcwogICAgZ2l2ZW4gYW5kIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgZXhpc3QsIGBgRUVYSVNUU2BgIHdpbGwgYmUgcmFpc2VkLgpAQCAtMjcyMSw2ICsyOTA1LDkgQEAKICAgICAgIEEgYnVnIGluIExpbnV4IGtlcm5lbCB2ZXJzaW9ucyBsZXNzIHRoYW4gMi42LjM5IGNhdXNlZCB0aGUgZmxhZ3MgYXJndW1lbnQKICAgICAgIHRvIGJlIGlnbm9yZWQgb24gc29tZSBmaWxlc3lzdGVtcy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAgZm9yICpwYXRoKiBhbmQgKmF0dHJpYnV0ZSouCisKIAogLi4gZGF0YTo6IFhBVFRSX1NJWkVfTUFYCiAKQEAgLTI4MjIsNiArMzAwOSw5IEBACiAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciAqcGF0aCoKICAgICAgIGZvciA6ZnVuYzpgZXhlY3ZlYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFjY2VwdHMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAuCisKIC4uIGZ1bmN0aW9uOjogX2V4aXQobikKIAogICAgRXhpdCB0aGUgcHJvY2VzcyB3aXRoIHN0YXR1cyAqbiosIHdpdGhvdXQgY2FsbGluZyBjbGVhbnVwIGhhbmRsZXJzLCBmbHVzaGluZwpAQCAtMzEzMiw2ICszMzIyLDkgQEAKICAgIDpmdW5jOmBzcGF3bnZlYCBhcmUgbm90IHRocmVhZC1zYWZlIG9uIFdpbmRvd3M7IHdlIGFkdmlzZSB5b3UgdG8gdXNlIHRoZQogICAgOm1vZDpgc3VicHJvY2Vzc2AgbW9kdWxlIGluc3RlYWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBY2NlcHRzIGEgOnRlcm06YHBhdGgtbGlrZSBvYmplY3RgLgorCiAKIC4uIGRhdGE6OiBQX05PV0FJVAogICAgICAgICAgIFBfTk9XQUlUTwpAQCAtMzYxOCw2ICszODExLDExIEBACiAKICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4gUmV0dXJucyBOb25lIGlmIHVuZGV0ZXJtaW5lZC4KIAorICAgVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCisgICB1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICBgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAorCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAKQEAgLTM3MzMsMzUgKzM5MzEsODkgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4zCiAKLS4uIF9vcy1taXNjZnVuYzoKIAotTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSYW5kb20gbnVtYmVycworLS0tLS0tLS0tLS0tLS0KIAogCi0uLiBmdW5jdGlvbjo6IHVyYW5kb20obikKKy4uIGZ1bmN0aW9uOjogZ2V0cmFuZG9tKHNpemUsIGZsYWdzPTApCiAKLSAgIFJldHVybiBhIHN0cmluZyBvZiAqbiogcmFuZG9tIGJ5dGVzIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KKyAgIEdldCB1cCB0byAqc2l6ZSogcmFuZG9tIGJ5dGVzLiBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiBsZXNzIGJ5dGVzIHRoYW4KKyAgIHJlcXVlc3RlZC4KKworICAgVGhlc2UgYnl0ZXMgY2FuIGJlIHVzZWQgdG8gc2VlZCB1c2VyLXNwYWNlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBvciBmb3IKKyAgIGNyeXB0b2dyYXBoaWMgcHVycG9zZXMuCisKKyAgIGBgZ2V0cmFuZG9tKClgYCByZWxpZXMgb24gZW50cm9weSBnYXRoZXJlZCBmcm9tIGRldmljZSBkcml2ZXJzIGFuZCBvdGhlcgorICAgc291cmNlcyBvZiBlbnZpcm9ubWVudGFsIG5vaXNlLiBVbm5lY2Vzc2FyaWx5IHJlYWRpbmcgbGFyZ2UgcXVhbnRpdGllcyBvZgorICAgZGF0YSB3aWxsIGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gIG90aGVyIHVzZXJzICBvZiB0aGUgYGAvZGV2L3JhbmRvbWBgIGFuZAorICAgYGAvZGV2L3VyYW5kb21gYCBkZXZpY2VzLgorCisgICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgYSBiaXQgbWFzayB0aGF0IGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBvZiB0aGUKKyAgIGZvbGxvd2luZyB2YWx1ZXMgT1JlZCB0b2dldGhlcjogOnB5OmRhdGE6YG9zLkdSTkRfUkFORE9NYCBhbmQKKyAgIDpweTpkYXRhOmBHUk5EX05PTkJMT0NLYC4KKworICAgU2VlIGFsc28gdGhlIGBMaW51eCBnZXRyYW5kb20oKSBtYW51YWwgcGFnZQorICAgPGh0dHA6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuMi9nZXRyYW5kb20uMi5odG1sPmBfLgorCisgICBBdmFpbGFiaWxpdHk6IExpbnV4IDMuMTcgYW5kIG5ld2VyLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZnVuY3Rpb246OiB1cmFuZG9tKHNpemUpCisKKyAgIFJldHVybiBhIHN0cmluZyBvZiAqc2l6ZSogcmFuZG9tIGJ5dGVzIHN1aXRhYmxlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KIAogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJhbmRvbSBieXRlcyBmcm9tIGFuIE9TLXNwZWNpZmljIHJhbmRvbW5lc3Mgc291cmNlLiAgVGhlCiAgICByZXR1cm5lZCBkYXRhIHNob3VsZCBiZSB1bnByZWRpY3RhYmxlIGVub3VnaCBmb3IgY3J5cHRvZ3JhcGhpYyBhcHBsaWNhdGlvbnMsCiAgICB0aG91Z2ggaXRzIGV4YWN0IHF1YWxpdHkgZGVwZW5kcyBvbiB0aGUgT1MgaW1wbGVtZW50YXRpb24uCiAKLSAgIE9uIExpbnV4LCBgYGdldHJhbmRvbSgpYGAgc3lzY2FsbCBpcyB1c2VkIGlmIGF2YWlsYWJsZSBhbmQgdGhlIHVyYW5kb20KLSAgIGVudHJvcHkgcG9vbCBpcyBpbml0aWFsaXplZCAoYGBnZXRyYW5kb20oKWBgIGRvZXMgbm90IGJsb2NrKS4KLSAgIE9uIGEgVW5peC1saWtlIHN5c3RlbSB0aGlzIHdpbGwgcXVlcnkgYGAvZGV2L3VyYW5kb21gYC4gT24gV2luZG93cywgaXQKLSAgIHdpbGwgdXNlIGBgQ3J5cHRHZW5SYW5kb20oKWBgLiAgSWYgYSByYW5kb21uZXNzIHNvdXJjZSBpcyBub3QgZm91bmQsCi0gICA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCB3aWxsIGJlIHJhaXNlZC4KKyAgIE9uIExpbnV4LCBpZiB0aGUgYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgaXMgYXZhaWxhYmxlLCBpdCBpcyB1c2VkIGluCisgICBibG9ja2luZyBtb2RlOiBibG9jayB1bnRpbCB0aGUgc3lzdGVtIHVyYW5kb20gZW50cm9weSBwb29sIGlzIGluaXRpYWxpemVkCisgICAoMTI4IGJpdHMgb2YgZW50cm9weSBhcmUgY29sbGVjdGVkIGJ5IHRoZSBrZXJuZWwpLiBTZWUgdGhlIDpwZXA6YDUyNGAgZm9yCisgICB0aGUgcmF0aW9uYWxlLiBPbiBMaW51eCwgdGhlIDpmdW5jOmBnZXRyYW5kb21gIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdldAorICAgcmFuZG9tIGJ5dGVzIGluIG5vbi1ibG9ja2luZyBtb2RlICh1c2luZyB0aGUgOmRhdGE6YEdSTkRfTk9OQkxPQ0tgIGZsYWcpIG9yCisgICB0byBwb2xsIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wgaXMgaW5pdGlhbGl6ZWQuCiAKLSAgIEZvciBhbiBlYXN5LXRvLXVzZSBpbnRlcmZhY2UgdG8gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi0gICBwcm92aWRlZCBieSB5b3VyIHBsYXRmb3JtLCBwbGVhc2Ugc2VlIDpjbGFzczpgcmFuZG9tLlN5c3RlbVJhbmRvbWAuCisgICBPbiBhIFVuaXgtbGlrZSBzeXN0ZW0sIHJhbmRvbSBieXRlcyBhcmUgcmVhZCBmcm9tIHRoZSBgYC9kZXYvdXJhbmRvbWBgCisgICBkZXZpY2UuIElmIHRoZSBgYC9kZXYvdXJhbmRvbWBgIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIG9yIG5vdCByZWFkYWJsZSwgdGhlCisgICA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYCBleGNlcHRpb24gaXMgcmFpc2VkLgorCisgICBPbiBXaW5kb3dzLCBpdCB3aWxsIHVzZSBgYENyeXB0R2VuUmFuZG9tKClgYC4KKworICAgLi4gc2VlYWxzbzo6CisgICAgICBUaGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlIHByb3ZpZGVzIGhpZ2hlciBsZXZlbCBmdW5jdGlvbnMuIEZvciBhbgorICAgICAgZWFzeS10by11c2UgaW50ZXJmYWNlIHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBwcm92aWRlZCBieSB5b3VyCisgICAgICBwbGF0Zm9ybSwgcGxlYXNlIHNlZSA6Y2xhc3M6YHJhbmRvbS5TeXN0ZW1SYW5kb21gLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNi4wCisgICAgICBPbiBMaW51eCwgYGBnZXRyYW5kb20oKWBgIGlzIG5vdyB1c2VkIGluIGJsb2NraW5nIG1vZGUgdG8gaW5jcmVhc2UgdGhlCisgICAgICBzZWN1cml0eS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUuMgotICAgICAgT24gTGludXgsIGlmIGBgZ2V0cmFuZG9tKClgYCBibG9ja3MgKHRoZSB1cmFuZG9tIGVudHJvcHkgcG9vbCBpcyBub3QKLSAgICAgIGluaXRpYWxpemVkIHlldCksIGZhbGwgYmFjayBvbiByZWFkaW5nIGBgL2Rldi91cmFuZG9tYGAuCisgICAgICBPbiBMaW51eCwgaWYgdGhlIGBgZ2V0cmFuZG9tKClgYCBzeXNjYWxsIGJsb2NrcyAodGhlIHVyYW5kb20gZW50cm9weSBwb29sCisgICAgICBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0KSwgZmFsbCBiYWNrIG9uIHJlYWRpbmcgYGAvZGV2L3VyYW5kb21gYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIE9uIExpbnV4IDMuMTcgYW5kIG5ld2VyLCB0aGUgYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgaXMgbm93IHVzZWQKICAgICAgIHdoZW4gYXZhaWxhYmxlLiAgT24gT3BlbkJTRCA1LjYgYW5kIG5ld2VyLCB0aGUgQyBgYGdldGVudHJvcHkoKWBgCiAgICAgICBmdW5jdGlvbiBpcyBub3cgdXNlZC4gVGhlc2UgZnVuY3Rpb25zIGF2b2lkIHRoZSB1c2FnZSBvZiBhbiBpbnRlcm5hbCBmaWxlCiAgICAgICBkZXNjcmlwdG9yLgorCisuLiBkYXRhOjogR1JORF9OT05CTE9DSworCisgICBCeSAgZGVmYXVsdCwgd2hlbiByZWFkaW5nIGZyb20gYGAvZGV2L3JhbmRvbWBgLCA6ZnVuYzpgZ2V0cmFuZG9tYCBibG9ja3MgaWYKKyAgIG5vIHJhbmRvbSBieXRlcyBhcmUgYXZhaWxhYmxlLCBhbmQgd2hlbiByZWFkaW5nIGZyb20gYGAvZGV2L3VyYW5kb21gYCwgaXQgYmxvY2tzCisgICBpZiB0aGUgZW50cm9weSBwb29sIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuCisKKyAgIElmIHRoZSA6cHk6ZGF0YTpgR1JORF9OT05CTE9DS2AgZmxhZyBpcyBzZXQsIHRoZW4gOmZ1bmM6YGdldHJhbmRvbWAgZG9lcyBub3QKKyAgIGJsb2NrIGluIHRoZXNlIGNhc2VzLCBidXQgaW5zdGVhZCBpbW1lZGlhdGVseSByYWlzZXMgOmV4YzpgQmxvY2tpbmdJT0Vycm9yYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIGRhdGE6OiBHUk5EX1JBTkRPTQorCisgICBJZiAgdGhpcyAgYml0ICBpcyAgc2V0LCAgdGhlbiAgcmFuZG9tIGJ5dGVzIGFyZSBkcmF3biBmcm9tIHRoZQorICAgYGAvZGV2L3JhbmRvbWBgIHBvb2wgaW5zdGVhZCBvZiB0aGUgYGAvZGV2L3VyYW5kb21gYCBwb29sLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0IGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKaW5kZXggMzg0NjExYy4uOTI1N2QyZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKQEAgLTM1LDEyICszNSw2IEBACiAgICBhY2Nlc3NpbmcgdGhlIE9TLiBJbiB0aGlzIGNhc2UsIGluc3RhbnRpYXRpbmcgb25lIG9mIHRoZSBwdXJlIGNsYXNzZXMgbWF5IGJlCiAgICB1c2VmdWwgc2luY2UgdGhvc2Ugc2ltcGx5IGRvbid0IGhhdmUgYW55IE9TLWFjY2Vzc2luZyBvcGVyYXRpb25zLgogCi0uLiBub3RlOjoKLSAgIFRoaXMgbW9kdWxlIGhhcyBiZWVuIGluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG9uIGEKLSAgIDp0ZXJtOmBwcm92aXNpb25hbCBiYXNpcyA8cHJvdmlzaW9uYWwgcGFja2FnZT5gLiBCYWNrd2FyZHMgaW5jb21wYXRpYmxlCi0gICBjaGFuZ2VzICh1cCB0byBhbmQgaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIHBhY2thZ2UpIG1heSBvY2N1ciBpZiBkZWVtZWQKLSAgIG5lY2Vzc2FyeSBieSB0aGUgY29yZSBkZXZlbG9wZXJzLgotCiAuLiBzZWVhbHNvOjoKICAgIDpwZXA6YDQyOGA6IFRoZSBwYXRobGliIG1vZHVsZSAtLSBvYmplY3Qtb3JpZW50ZWQgZmlsZXN5c3RlbSBwYXRocy4KIApAQCAtMTExLDcgKzEwNSw4IEBACiAgICAgICBQdXJlUG9zaXhQYXRoKCdzZXR1cC5weScpCiAKICAgIEVhY2ggZWxlbWVudCBvZiAqcGF0aHNlZ21lbnRzKiBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhCi0gICBwYXRoIHNlZ21lbnQsIG9yIGFub3RoZXIgcGF0aCBvYmplY3Q6OgorICAgcGF0aCBzZWdtZW50LCBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UKKyAgIHdoaWNoIHJldHVybnMgYSBzdHJpbmcsIG9yIGFub3RoZXIgcGF0aCBvYmplY3Q6OgogCiAgICAgICA+Pj4gUHVyZVBhdGgoJ2ZvbycsICdzb21lL3BhdGgnLCAnYmFyJykKICAgICAgIFB1cmVQb3NpeFBhdGgoJ2Zvby9zb21lL3BhdGgvYmFyJykKQEAgLTE1Miw2ICsxNDcsMTIgQEAKICAgIHRvIGBgUHVyZVBvc2l4UGF0aCgnYmFyJylgYCwgd2hpY2ggaXMgd3JvbmcgaWYgYGBmb29gYCBpcyBhIHN5bWJvbGljIGxpbmsKICAgIHRvIGFub3RoZXIgZGlyZWN0b3J5KQogCisgICBQdXJlIHBhdGggb2JqZWN0cyBpbXBsZW1lbnQgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSwgYWxsb3dpbmcgdGhlbQorICAgdG8gYmUgdXNlZCBhbnl3aGVyZSB0aGUgaW50ZXJmYWNlIGlzIGFjY2VwdGVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZS4KKwogLi4gY2xhc3M6OiBQdXJlUG9zaXhQYXRoKCpwYXRoc2VnbWVudHMpCiAKICAgIEEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBQdXJlUGF0aGAsIHRoaXMgcGF0aCBmbGF2b3VyIHJlcHJlc2VudHMgbm9uLVdpbmRvd3MKQEAgLTE5OSw3ICsyMDAsNyBAQAogICAgPj4+IFB1cmVXaW5kb3dzUGF0aCgnZm9vJykgPCBQdXJlUG9zaXhQYXRoKCdmb28nKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgotICAgVHlwZUVycm9yOiB1bm9yZGVyYWJsZSB0eXBlczogUHVyZVdpbmRvd3NQYXRoKCkgPCBQdXJlUG9zaXhQYXRoKCkKKyAgIFR5cGVFcnJvcjogJzwnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJ1B1cmVXaW5kb3dzUGF0aCcgYW5kICdQdXJlUG9zaXhQYXRoJwogCiAKIE9wZXJhdG9ycwpAQCAtMjE2LDYgKzIxNywxNCBAQAogICAgPj4+ICcvdXNyJyAvIHEKICAgIFB1cmVQb3NpeFBhdGgoJy91c3IvYmluJykKIAorQSBwYXRoIG9iamVjdCBjYW4gYmUgdXNlZCBhbnl3aGVyZSBhbiBvYmplY3QgaW1wbGVtZW50aW5nIDpjbGFzczpgb3MuUGF0aExpa2VgCitpcyBhY2NlcHRlZDo6CisKKyAgID4+PiBpbXBvcnQgb3MKKyAgID4+PiBwID0gUHVyZVBhdGgoJy9ldGMnKQorICAgPj4+IG9zLmZzcGF0aChwKQorICAgJy9ldGMnCisKIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwYXRoIGlzIHRoZSByYXcgZmlsZXN5c3RlbSBwYXRoIGl0c2VsZgogKGluIG5hdGl2ZSBmb3JtLCBlLmcuIHdpdGggYmFja3NsYXNoZXMgdW5kZXIgV2luZG93cyksIHdoaWNoIHlvdSBjYW4KIHBhc3MgdG8gYW55IGZ1bmN0aW9uIHRha2luZyBhIGZpbGUgcGF0aCBhcyBhIHN0cmluZzo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9waWNrbGUucnN0IGIvRG9jL2xpYnJhcnkvcGlja2xlLnJzdAppbmRleCAwZDY0MTkxLi42ZTg0MzBmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9waWNrbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRuZXdhcmdzX2V4X18oKQogCi0gICBJbiBwcm90b2NvbHMgNCBhbmQgbmV3ZXIsIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnRzIHRoZQorICAgSW4gcHJvdG9jb2xzIDIgYW5kIG5ld2VyLCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50cyB0aGUKICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgbWV0aG9kIGNhbiBkaWN0YXRlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHRoZQogICAgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuICBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIGEgcGFpcgogICAgYGAoYXJncywga3dhcmdzKWBgIHdoZXJlICphcmdzKiBpcyBhIHR1cGxlIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzCkBAIC01MDQsMTUgKzUwNCwyMiBAQAogICAgY2xhc3MgcmVxdWlyZXMga2V5d29yZC1vbmx5IGFyZ3VtZW50cy4gIE90aGVyd2lzZSwgaXQgaXMgcmVjb21tZW5kZWQgZm9yCiAgICBjb21wYXRpYmlsaXR5IHRvIGltcGxlbWVudCA6bWV0aDpgX19nZXRuZXdhcmdzX19gLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcyBub3cgdXNlZCBpbiBwcm90b2NvbHMgMiBhbmQgMy4KKwogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRuZXdhcmdzX18oKQogCi0gICBUaGlzIG1ldGhvZCBzZXJ2ZSBhIHNpbWlsYXIgcHVycG9zZSBhcyA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGJ1dAotICAgZm9yIHByb3RvY29scyAyIGFuZCBuZXdlci4gIEl0IG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgYXJndW1lbnRzIGBgYXJnc2BgCi0gICB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuCisgICBUaGlzIG1ldGhvZCBzZXJ2ZSBhIHNpbWlsYXIgcHVycG9zZSBhcyA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gLCBidXQKKyAgIHN1cHBvcnRzIG9ubHkgcG9zaXRpb25hbCBhcmd1bWVudHMuICBJdCBtdXN0IHJldHVybiBhIHR1cGxlIG9mIGFyZ3VtZW50cworICAgYGBhcmdzYGAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLgogCi0gICBJbiBwcm90b2NvbHMgNCBhbmQgbmV3ZXIsIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2lsbCBub3QgYmUgY2FsbGVkIGlmCi0gICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzIGRlZmluZWQuCisgICA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdpbGwgbm90IGJlIGNhbGxlZCBpZiA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzCisgICBkZWZpbmVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQmVmb3JlIFB5dGhvbiAzLjYsIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2FzIGNhbGxlZCBpbnN0ZWFkIG9mCisgICAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGluIHByb3RvY29scyAyIGFuZCAzLgogCiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldHN0YXRlX18oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcXVldWUucnN0IGIvRG9jL2xpYnJhcnkvcXVldWUucnN0CmluZGV4IDFjYjA5MzUuLmUzZWFhM2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9xdWV1ZS5yc3QKQEAgLTE2LDggKzE2LDkgQEAKIG1vZHVsZS4KIAogVGhlIG1vZHVsZSBpbXBsZW1lbnRzIHRocmVlIHR5cGVzIG9mIHF1ZXVlLCB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIEZJRk8gcXVldWUsIHRoZSBmaXJzdCB0YXNrcyBhZGRlZCBhcmUKLXRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEgTElGTyBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKK3doaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAKK3F1ZXVlLCB0aGUgZmlyc3QgdGFza3MgYWRkZWQgYXJlIHRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEKKzphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKIHRoZSBmaXJzdCByZXRyaWV2ZWQgKG9wZXJhdGluZyBsaWtlIGEgc3RhY2spLiAgV2l0aCBhIHByaW9yaXR5IHF1ZXVlLAogdGhlIGVudHJpZXMgYXJlIGtlcHQgc29ydGVkICh1c2luZyB0aGUgOm1vZDpgaGVhcHFgIG1vZHVsZSkgYW5kIHRoZQogbG93ZXN0IHZhbHVlZCBlbnRyeSBpcyByZXRyaWV2ZWQgZmlyc3QuCkBAIC0yNywxNCArMjgsMTYgQEAKIAogLi4gY2xhc3M6OiBRdWV1ZShtYXhzaXplPTApCiAKLSAgIENvbnN0cnVjdG9yIGZvciBhIEZJRk8gcXVldWUuICAqbWF4c2l6ZSogaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgdGhlIHVwcGVyYm91bmQKKyAgIENvbnN0cnVjdG9yIGZvciBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUuICAqbWF4c2l6ZSogaXMKKyAgIGFuIGludGVnZXIgdGhhdCBzZXRzIHRoZSB1cHBlcmJvdW5kCiAgICBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiB0aGUgcXVldWUuICBJbnNlcnRpb24gd2lsbAogICAgYmxvY2sgb25jZSB0aGlzIHNpemUgaGFzIGJlZW4gcmVhY2hlZCwgdW50aWwgcXVldWUgaXRlbXMgYXJlIGNvbnN1bWVkLiAgSWYKICAgICptYXhzaXplKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywgdGhlIHF1ZXVlIHNpemUgaXMgaW5maW5pdGUuCiAKIC4uIGNsYXNzOjogTGlmb1F1ZXVlKG1heHNpemU9MCkKIAotICAgQ29uc3RydWN0b3IgZm9yIGEgTElGTyBxdWV1ZS4gICptYXhzaXplKiBpcyBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAorICAgQ29uc3RydWN0b3IgZm9yIGEgOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLiAgKm1heHNpemUqIGlzCisgICBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAogICAgbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gdGhlIHF1ZXVlLiAgSW5zZXJ0aW9uIHdpbGwKICAgIGJsb2NrIG9uY2UgdGhpcyBzaXplIGhhcyBiZWVuIHJlYWNoZWQsIHVudGlsIHF1ZXVlIGl0ZW1zIGFyZSBjb25zdW1lZC4gIElmCiAgICAqbWF4c2l6ZSogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdCBiL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKaW5kZXggMjJmMThhMC4uNmRjNTRkMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CkBAIC00Niw3ICs0Niw4IEBACiAuLiB3YXJuaW5nOjoKIAogICAgVGhlIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9ycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gICBzZWN1cml0eSBwdXJwb3Nlcy4KKyAgIHNlY3VyaXR5IHB1cnBvc2VzLiAgRm9yIHNlY3VyaXR5IG9yIGNyeXB0b2dyYXBoaWMgdXNlcywgc2VlIHRoZQorICAgOm1vZDpgc2VjcmV0c2AgbW9kdWxlLgogCiAKIEJvb2trZWVwaW5nIGZ1bmN0aW9uczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JlLnJzdCBiL0RvYy9saWJyYXJ5L3JlLnJzdAppbmRleCA1NjliNTIyLi5kZmJlZGQ0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmUucnN0CkBAIC0zMjEsOCArMzIxLDkgQEAKIAogCiBUaGUgc3BlY2lhbCBzZXF1ZW5jZXMgY29uc2lzdCBvZiBgYCdcJ2BgIGFuZCBhIGNoYXJhY3RlciBmcm9tIHRoZSBsaXN0IGJlbG93LgotSWYgdGhlIG9yZGluYXJ5IGNoYXJhY3RlciBpcyBub3Qgb24gdGhlIGxpc3QsIHRoZW4gdGhlIHJlc3VsdGluZyBSRSB3aWxsIG1hdGNoCi10aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCBgYFwkYGAgbWF0Y2hlcyB0aGUgY2hhcmFjdGVyIGBgJyQnYGAuCitJZiB0aGUgb3JkaW5hcnkgY2hhcmFjdGVyIGlzIG5vdCBhbiBBU0NJSSBkaWdpdCBvciBhbiBBU0NJSSBsZXR0ZXIsIHRoZW4gdGhlCityZXN1bHRpbmcgUkUgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCBgYFwkYGAgbWF0Y2hlcyB0aGUKK2NoYXJhY3RlciBgYCckJ2BgLgogCiBgYFxudW1iZXJgYAogICAgTWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIG9mIHRoZSBzYW1lIG51bWJlci4gIEdyb3VwcyBhcmUgbnVtYmVyZWQKQEAgLTQ0Miw5ICs0NDMsOCBAQAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgIFRoZSBgYCdcdSdgYCBhbmQgYGAnXFUnYGAgZXNjYXBlIHNlcXVlbmNlcyBoYXZlIGJlZW4gYWRkZWQuCiAKLS4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNSAzLjYKLSAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIEFTQ0lJIGxldHRlciBub3cgcmFpc2UgYQotICAgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgd2lsbCBiZSBmb3JiaWRkZW4gaW4gUHl0aG9uIDMuNi4KKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgbm93IGFyZSBlcnJvcnMuCiAKIAogLi4gc2VlYWxzbzo6CkBAIC01MzIsMTEgKzUzMiwxMSBAQAogICAgY3VycmVudCBsb2NhbGUuIFRoZSB1c2Ugb2YgdGhpcyBmbGFnIGlzIGRpc2NvdXJhZ2VkIGFzIHRoZSBsb2NhbGUgbWVjaGFuaXNtCiAgICBpcyB2ZXJ5IHVucmVsaWFibGUsIGFuZCBpdCBvbmx5IGhhbmRsZXMgb25lICJjdWx0dXJlIiBhdCBhIHRpbWUgYW55d2F5OwogICAgeW91IHNob3VsZCB1c2UgVW5pY29kZSBtYXRjaGluZyBpbnN0ZWFkLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBpbiBQeXRob24gMwotICAgZm9yIFVuaWNvZGUgKHN0cikgcGF0dGVybnMuIFRoaXMgZmxhZyBtYWtlcyBzZW5zZSBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMuCisgICBmb3IgVW5pY29kZSAoc3RyKSBwYXR0ZXJucy4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBieXRlcyBwYXR0ZXJucy4KIAotICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy41IDMuNgotICAgICAgRGVwcmVjYXRlZCB0aGUgdXNlIG9mICA6Y29uc3Q6YHJlLkxPQ0FMRWAgd2l0aCBzdHJpbmcgcGF0dGVybnMgb3IKLSAgICAgIDpjb25zdDpgcmUuQVNDSUlgLgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDpjb25zdDpgcmUuTE9DQUxFYCBjYW4gYmUgdXNlZCBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMgYW5kIGlzCisgICAgICBub3QgY29tcGF0aWJsZSB3aXRoIDpjb25zdDpgcmUuQVNDSUlgLgogCiAKIC4uIGRhdGE6OiBNCkBAIC03NDIsOSArNzQyLDggQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBVbm1hdGNoZWQgZ3JvdXBzIGFyZSByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KIAotICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy41IDMuNgotICAgICAgVW5rbm93biBlc2NhcGVzIGNvbnNpc3Qgb2YgYGAnXCdgYCBhbmQgQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhCi0gICAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCB3aWxsIGJlIGZvcmJpZGRlbiBpbiBQeXRob24gMy42LgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIGFuIEFTQ0lJIGxldHRlciBub3cgYXJlIGVycm9ycy4KIAogCiAuLiBmdW5jdGlvbjo6IHN1Ym4ocGF0dGVybiwgcmVwbCwgc3RyaW5nLCBjb3VudD0wLCBmbGFncz0wKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0IGIvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0CmluZGV4IDRkM2MwOTkuLjM3ZTQwMGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JlYWRsaW5lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZWFkbGluZS5yc3QKQEAgLTE2Nyw2ICsxNjcsMjAgQEAKICAgIFRoaXMgY2FsbHMgOmM6ZnVuYzpgYWRkX2hpc3RvcnlgIGluIHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkuCiAKIAorLi4gZnVuY3Rpb246OiBzZXRfYXV0b19oaXN0b3J5KGVuYWJsZWQpCisKKyAgIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9tYXRpYyBjYWxscyB0byA6YzpmdW5jOmBhZGRfaGlzdG9yeWAgd2hlbiByZWFkaW5nCisgICBpbnB1dCB2aWEgcmVhZGxpbmUuICBUaGUgKmVuYWJsZWQqIGFyZ3VtZW50IHNob3VsZCBiZSBhIEJvb2xlYW4gdmFsdWUKKyAgIHRoYXQgd2hlbiB0cnVlLCBlbmFibGVzIGF1dG8gaGlzdG9yeSwgYW5kIHRoYXQgd2hlbiBGYWxzZSwgZGlzYWJsZXMKKyAgIGF1dG8gaGlzdG9yeS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIGltcGwtZGV0YWlsOjoKKyAgICAgIEF1dG8gaGlzdG9yeSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBjaGFuZ2VzIHRvIHRoaXMgZG8gbm90IHBlcnNpc3QKKyAgICAgIGFjcm9zcyBtdWx0aXBsZSBzZXNzaW9ucy4KKworCiBTdGFydHVwIGhvb2tzCiAtLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0IGIvRG9jL2xpYnJhcnkvc2VjcmV0cy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmODQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0CkBAIC0wLDAgKzEsMTk4IEBACis6bW9kOmBzZWNyZXRzYCAtLS0gR2VuZXJhdGUgc2VjdXJlIHJhbmRvbSBudW1iZXJzIGZvciBtYW5hZ2luZyBzZWNyZXRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIG1vZHVsZTo6IHNlY3JldHMKKyAgIDpzeW5vcHNpczogR2VuZXJhdGUgc2VjdXJlIHJhbmRvbSBudW1iZXJzIGZvciBtYW5hZ2luZyBzZWNyZXRzLgorCisuLiBtb2R1bGVhdXRob3I6OiBTdGV2ZW4gRCdBcHJhbm8gPHN0ZXZlK3B5dGhvbkBwZWFyd29vZC5pbmZvPgorLi4gc2VjdGlvbmF1dGhvcjo6IFN0ZXZlbiBEJ0FwcmFubyA8c3RldmUrcHl0aG9uQHBlYXJ3b29kLmluZm8+CisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gdGVzdHNldHVwOjoKKworICAgZnJvbSBzZWNyZXRzIGltcG9ydCAqCisgICBfX25hbWVfXyA9ICc8ZG9jdGVzdD4nCisKKyoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL3NlY3JldHMucHlgCisKKy0tLS0tLS0tLS0tLS0KKworVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZworcmFuZG9tIG51bWJlcnMgc3VpdGFibGUgZm9yIG1hbmFnaW5nIGRhdGEgc3VjaCBhcyBwYXNzd29yZHMsIGFjY291bnQKK2F1dGhlbnRpY2F0aW9uLCBzZWN1cml0eSB0b2tlbnMsIGFuZCByZWxhdGVkIHNlY3JldHMuCisKK0luIHBhcnRpY3VsYXJseSwgOm1vZDpgc2VjcmV0c2Agc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUKK2RlZmF1bHQgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIHRoZSA6bW9kOmByYW5kb21gIG1vZHVsZSwgd2hpY2gKK2lzIGRlc2lnbmVkIGZvciBtb2RlbGxpbmcgYW5kIHNpbXVsYXRpb24sIG5vdCBzZWN1cml0eSBvciBjcnlwdG9ncmFwaHkuCisKKy4uIHNlZWFsc286OgorCisgICA6cGVwOmA1MDZgCisKKworUmFuZG9tIG51bWJlcnMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBtb3N0IHNlY3VyZSBzb3VyY2Ugb2YKK3JhbmRvbW5lc3MgdGhhdCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMuCisKKy4uIGNsYXNzOjogU3lzdGVtUmFuZG9tCisKKyAgIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgcmFuZG9tIG51bWJlcnMgdXNpbmcgdGhlIGhpZ2hlc3QtcXVhbGl0eQorICAgc291cmNlcyBwcm92aWRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFNlZQorICAgOmNsYXNzOmByYW5kb20uU3lzdGVtUmFuZG9tYCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisuLiBmdW5jdGlvbjo6IGNob2ljZShzZXF1ZW5jZSkKKworICAgUmV0dXJuIGEgcmFuZG9tbHktY2hvc2VuIGVsZW1lbnQgZnJvbSBhIG5vbi1lbXB0eSBzZXF1ZW5jZS4KKworLi4gZnVuY3Rpb246OiByYW5kYmVsb3cobikKKworICAgUmV0dXJuIGEgcmFuZG9tIGludCBpbiB0aGUgcmFuZ2UgWzAsICpuKikuCisKKy4uIGZ1bmN0aW9uOjogcmFuZGJpdHMoaykKKworICAgUmV0dXJuIGFuIGludCB3aXRoICprKiByYW5kb20gYml0cy4KKworCitHZW5lcmF0aW5nIHRva2VucworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgc2VjdXJlCit0b2tlbnMsIHN1aXRhYmxlIGZvciBhcHBsaWNhdGlvbnMgc3VjaCBhcyBwYXNzd29yZCByZXNldHMsCitoYXJkLXRvLWd1ZXNzIFVSTHMsIGFuZCBzaW1pbGFyLgorCisuLiBmdW5jdGlvbjo6IHRva2VuX2J5dGVzKFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSBieXRlIHN0cmluZyBjb250YWluaW5nICpuYnl0ZXMqIG51bWJlciBvZiBieXRlcy4KKyAgIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMKKyAgIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5fYnl0ZXMoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgYidceGViclx4MTdEKnRceGFlXHhkNFx4ZTNTXHhiNlx4ZTJceGViUDFceDhiJworCisKKy4uIGZ1bmN0aW9uOjogdG9rZW5faGV4KFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSB0ZXh0IHN0cmluZywgaW4gaGV4YWRlY2ltYWwuICBUaGUgc3RyaW5nIGhhcyAqbmJ5dGVzKgorICAgcmFuZG9tIGJ5dGVzLCBlYWNoIGJ5dGUgY29udmVydGVkIHRvIHR3byBoZXggZGlnaXRzLiAgSWYgKm5ieXRlcyogaXMKKyAgIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMgdXNlZC4KKworICAgLi4gZG9jdGVzdDo6CisKKyAgICAgID4+PiB0b2tlbl9oZXgoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgJ2Y5YmY3OGI5YTE4Y2U2ZDQ2YTBjZDJiMGI4NmRmOWRhJworCisuLiBmdW5jdGlvbjo6IHRva2VuX3VybHNhZmUoW25ieXRlcz1Ob25lXSkKKworICAgUmV0dXJuIGEgcmFuZG9tIFVSTC1zYWZlIHRleHQgc3RyaW5nLCBjb250YWluaW5nICpuYnl0ZXMqIHJhbmRvbQorICAgYnl0ZXMuICBUaGUgdGV4dCBpcyBCYXNlNjQgZW5jb2RlZCwgc28gb24gYXZlcmFnZSBlYWNoIGJ5dGUgcmVzdWx0cworICAgaW4gYXBwcm94aW1hdGVseSAxLjMgY2hhcmFjdGVycy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdAorICAgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5fdXJsc2FmZSgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgICAnRHJtaHplNkVQY3YwZk5fODFCai1uQScKKworCitIb3cgbWFueSBieXRlcyBzaG91bGQgdG9rZW5zIHVzZT8KK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUbyBiZSBzZWN1cmUgYWdhaW5zdAorYGJydXRlLWZvcmNlIGF0dGFja3MgPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JydXRlLWZvcmNlX2F0dGFjaz5gXywKK3Rva2VucyBuZWVkIHRvIGhhdmUgc3VmZmljaWVudCByYW5kb21uZXNzLiAgVW5mb3J0dW5hdGVseSwgd2hhdCBpcworY29uc2lkZXJlZCBzdWZmaWNpZW50IHdpbGwgbmVjZXNzYXJpbHkgaW5jcmVhc2UgYXMgY29tcHV0ZXJzIGdldCBtb3JlCitwb3dlcmZ1bCBhbmQgYWJsZSB0byBtYWtlIG1vcmUgZ3Vlc3NlcyBpbiBhIHNob3J0ZXIgcGVyaW9kLiAgQXMgb2YgMjAxNSwKK2l0IGlzIGJlbGlldmVkIHRoYXQgMzIgYnl0ZXMgKDI1NiBiaXRzKSBvZiByYW5kb21uZXNzIGlzIHN1ZmZpY2llbnQgZm9yCit0aGUgdHlwaWNhbCB1c2UtY2FzZSBleHBlY3RlZCBmb3IgdGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZS4KKworRm9yIHRob3NlIHdobyB3YW50IHRvIG1hbmFnZSB0aGVpciBvd24gdG9rZW4gbGVuZ3RoLCB5b3UgY2FuIGV4cGxpY2l0bHkKK3NwZWNpZnkgaG93IG11Y2ggcmFuZG9tbmVzcyBpcyB1c2VkIGZvciB0b2tlbnMgYnkgZ2l2aW5nIGFuIDpjbGFzczpgaW50YAorYXJndW1lbnQgdG8gdGhlIHZhcmlvdXMgYGB0b2tlbl8qYGAgZnVuY3Rpb25zLiAgVGhhdCBhcmd1bWVudCBpcyB0YWtlbgorYXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiByYW5kb21uZXNzIHRvIHVzZS4KKworT3RoZXJ3aXNlLCBpZiBubyBhcmd1bWVudCBpcyBwcm92aWRlZCwgb3IgaWYgdGhlIGFyZ3VtZW50IGlzIGBgTm9uZWBgLAordGhlIGBgdG9rZW5fKmBgIGZ1bmN0aW9ucyB3aWxsIHVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBpbnN0ZWFkLgorCisuLiBub3RlOjoKKworICAgVGhhdCBkZWZhdWx0IGlzIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLCBpbmNsdWRpbmcgZHVyaW5nCisgICBtYWludGVuYW5jZSByZWxlYXNlcy4KKworCitPdGhlciBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLQorCisuLiBmdW5jdGlvbjo6IGNvbXBhcmVfZGlnZXN0KGEsIGIpCisKKyAgIFJldHVybiBgYFRydWVgYCBpZiBzdHJpbmdzICphKiBhbmQgKmIqIGFyZSBlcXVhbCwgb3RoZXJ3aXNlIGBgRmFsc2VgYCwKKyAgIGluIHN1Y2ggYSB3YXkgYXMgdG8gcmVkdWNlIHRoZSByaXNrIG9mCisgICBgdGltaW5nIGF0dGFja3MgPGh0dHA6Ly9jb2RhaGFsZS5jb20vYS1sZXNzb24taW4tdGltaW5nLWF0dGFja3MvPmBfLgorICAgU2VlIDpmdW5jOmBobWFjLmNvbXBhcmVfZGlnZXN0YCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisKK1JlY2lwZXMgYW5kIGJlc3QgcHJhY3RpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gc2hvd3MgcmVjaXBlcyBhbmQgYmVzdCBwcmFjdGljZXMgZm9yIHVzaW5nIDptb2Q6YHNlY3JldHNgCit0byBtYW5hZ2UgYSBiYXNpYyBsZXZlbCBvZiBzZWN1cml0eS4KKworR2VuZXJhdGUgYW4gZWlnaHQtY2hhcmFjdGVyIGFscGhhbnVtZXJpYyBwYXNzd29yZDoKKworLi4gdGVzdGNvZGU6OgorCisgICBpbXBvcnQgc3RyaW5nCisgICBhbHBoYWJldCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cworICAgcGFzc3dvcmQgPSAnJy5qb2luKGNob2ljZShhbHBoYWJldCkgZm9yIGkgaW4gcmFuZ2UoOCkpCisKKworLi4gbm90ZTo6CisKKyAgIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90CisgICBgc3RvcmUgcGFzc3dvcmRzIGluIGEgcmVjb3ZlcmFibGUgZm9ybWF0IDxodHRwOi8vY3dlLm1pdHJlLm9yZy9kYXRhL2RlZmluaXRpb25zLzI1Ny5odG1sPmBfLAorICAgd2hldGhlciBwbGFpbiB0ZXh0IG9yIGVuY3J5cHRlZC4gIFRoZXkgc2hvdWxkIGJlIHNhbHRlZCBhbmQgaGFzaGVkCisgICB1c2luZyBhIGNyeXB0b2dyYXBoaWNhbGx5LXN0cm9uZyBvbmUtd2F5IChpcnJldmVyc2libGUpIGhhc2ggZnVuY3Rpb24uCisKKworR2VuZXJhdGUgYSB0ZW4tY2hhcmFjdGVyIGFscGhhbnVtZXJpYyBwYXNzd29yZCB3aXRoIGF0IGxlYXN0IG9uZQorbG93ZXJjYXNlIGNoYXJhY3RlciwgYXQgbGVhc3Qgb25lIHVwcGVyY2FzZSBjaGFyYWN0ZXIsIGFuZCBhdCBsZWFzdAordGhyZWUgZGlnaXRzOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgIGltcG9ydCBzdHJpbmcKKyAgIGFscGhhYmV0ID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICB3aGlsZSBUcnVlOgorICAgICAgIHBhc3N3b3JkID0gJycuam9pbihjaG9pY2UoYWxwaGFiZXQpIGZvciBpIGluIHJhbmdlKDEwKSkKKyAgICAgICBpZiAoYW55KGMuaXNsb3dlcigpIGZvciBjIGluIHBhc3N3b3JkKQorICAgICAgICAgICAgICAgYW5kIGFueShjLmlzdXBwZXIoKSBmb3IgYyBpbiBwYXNzd29yZCkKKyAgICAgICAgICAgICAgIGFuZCBzdW0oYy5pc2RpZ2l0KCkgZm9yIGMgaW4gcGFzc3dvcmQpID49IDMpOgorICAgICAgICAgICBicmVhaworCisKK0dlbmVyYXRlIGFuIGBYS0NELXN0eWxlIHBhc3NwaHJhc2UgPGh0dHA6Ly94a2NkLmNvbS85MzYvPmBfOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgICMgT24gc3RhbmRhcmQgTGludXggc3lzdGVtcywgdXNlIGEgY29udmVuaWVudCBkaWN0aW9uYXJ5IGZpbGUuCisgICAjIE90aGVyIHBsYXRmb3JtcyBtYXkgbmVlZCB0byBwcm92aWRlIHRoZWlyIG93biB3b3JkLWxpc3QuCisgICB3aXRoIG9wZW4oJy91c3Ivc2hhcmUvZGljdC93b3JkcycpIGFzIGY6CisgICAgICAgd29yZHMgPSBbd29yZC5zdHJpcCgpIGZvciB3b3JkIGluIGZdCisgICAgICAgcGFzc3dvcmQgPSAnICcuam9pbihjaG9pY2Uod29yZHMpIGZvciBpIGluIHJhbmdlKDQpKQorCisKK0dlbmVyYXRlIGEgaGFyZC10by1ndWVzcyB0ZW1wb3JhcnkgVVJMIGNvbnRhaW5pbmcgYSBzZWN1cml0eSB0b2tlbgorc3VpdGFibGUgZm9yIHBhc3N3b3JkIHJlY292ZXJ5IGFwcGxpY2F0aW9uczoKKworLi4gdGVzdGNvZGU6OgorCisgICB1cmwgPSAnaHR0cHM6Ly9teWRvbWFpbi5jb20vcmVzZXQ9JyArIHRva2VuX3VybHNhZmUoKQorCisKKworLi4KKyAgICMgVGhpcyBtb2RlbGluZSBtdXN0IGFwcGVhciB3aXRoaW4gdGhlIGxhc3QgdGVuIGxpbmVzIG9mIHRoZSBmaWxlLgorICAga2F0ZTogaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10YWJzIG9uOyBlbmNvZGluZyB1dGYtODsKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NlbGVjdC5yc3QgYi9Eb2MvbGlicmFyeS9zZWxlY3QucnN0CmluZGV4IDZjZWM5ZjcuLjU0OTRlZWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NlbGVjdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2VsZWN0LnJzdApAQCAtMjY2LDM1ICsyNjYsNDMgQEAKIAogICAgKmV2ZW50bWFzayoKIAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCBDb25zdGFudCAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKz09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwotICAgfCA6Y29uc3Q6YEVQT0xMSU5gICAgICAgfCBBdmFpbGFibGUgZm9yIHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMT1VUYCAgICAgfCBBdmFpbGFibGUgZm9yIHdyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMUFJJYCAgICAgfCBVcmdlbnQgZGF0YSBmb3IgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMRVJSYCAgICAgfCBFcnJvciBjb25kaXRpb24gaGFwcGVuZWQgb24gdGhlIGFzc29jLiBmZCAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMSFVQYCAgICAgfCBIYW5nIHVwIGhhcHBlbmVkIG9uIHRoZSBhc3NvYy4gZmQgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMRVRgICAgICAgfCBTZXQgRWRnZSBUcmlnZ2VyIGJlaGF2aW9yLCB0aGUgZGVmYXVsdCBpcyAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCBMZXZlbCBUcmlnZ2VyIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMT05FU0hPVGAgfCBTZXQgb25lLXNob3QgYmVoYXZpb3IuIEFmdGVyIG9uZSBldmVudCBpcyAgICAgfAotICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCBwdWxsZWQgb3V0LCB0aGUgZmQgaXMgaW50ZXJuYWxseSBkaXNhYmxlZCAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMUkROT1JNYCAgfCBFcXVpdmFsZW50IHRvIDpjb25zdDpgRVBPTExJTmAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMUkRCQU5EYCAgfCBQcmlvcml0eSBkYXRhIGJhbmQgY2FuIGJlIHJlYWQuICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMV1JOT1JNYCAgfCBFcXVpdmFsZW50IHRvIDpjb25zdDpgRVBPTExPVVRgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMV1JCQU5EYCAgfCBQcmlvcml0eSBkYXRhIG1heSBiZSB3cml0dGVuLiAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgfCA6Y29uc3Q6YEVQT0xMTVNHYCAgICAgfCBJZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IENvbnN0YW50ICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworICAgfCA6Y29uc3Q6YEVQT0xMSU5gICAgICAgICB8IEF2YWlsYWJsZSBmb3IgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTE9VVGAgICAgICAgfCBBdmFpbGFibGUgZm9yIHdyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExQUklgICAgICAgIHwgVXJnZW50IGRhdGEgZm9yIHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMRVJSYCAgICAgICB8IEVycm9yIGNvbmRpdGlvbiBoYXBwZW5lZCBvbiB0aGUgYXNzb2MuIGZkICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTEhVUGAgICAgICAgfCBIYW5nIHVwIGhhcHBlbmVkIG9uIHRoZSBhc3NvYy4gZmQgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExFVGAgICAgICAgIHwgU2V0IEVkZ2UgVHJpZ2dlciBiZWhhdmlvciwgdGhlIGRlZmF1bHQgaXMgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBMZXZlbCBUcmlnZ2VyIGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExPTkVTSE9UYCAgIHwgU2V0IG9uZS1zaG90IGJlaGF2aW9yLiBBZnRlciBvbmUgZXZlbnQgaXMgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBwdWxsZWQgb3V0LCB0aGUgZmQgaXMgaW50ZXJuYWxseSBkaXNhYmxlZCAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExFWENMVVNJVkVgIHwgV2FrZSBvbmx5IG9uZSBlcG9sbCBvYmplY3Qgd2hlbiB0aGUgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3NvY2lhdGVkIGZkIGhhcyBhbiBldmVudC4gVGhlIGRlZmF1bHQgKGlmICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoaXMgZmxhZyBpcyBub3Qgc2V0KSBpcyB0byB3YWtlIGFsbCBlcG9sbCAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0cyBwb2xsaW5nIG9uIG9uIGEgZmQuICAgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMUkRIVVBgICAgICB8IFN0cmVhbSBzb2NrZXQgcGVlciBjbG9zZWQgY29ubmVjdGlvbiBvciBzaHV0ICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG93biB3cml0aW5nIGhhbGYgb2YgY29ubmVjdGlvbi4gICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMUkROT1JNYCAgICB8IEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBFUE9MTElOYCAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTFJEQkFORGAgICAgfCBQcmlvcml0eSBkYXRhIGJhbmQgY2FuIGJlIHJlYWQuICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgRVBPTExXUk5PUk1gICAgIHwgRXF1aXZhbGVudCB0byA6Y29uc3Q6YEVQT0xMT1VUYCAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCA6Y29uc3Q6YEVQT0xMV1JCQU5EYCAgICB8IFByaW9yaXR5IGRhdGEgbWF5IGJlIHdyaXR0ZW4uICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgOmNvbnN0OmBFUE9MTE1TR2AgICAgICAgfCBJZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIAogLi4gbWV0aG9kOjogZXBvbGwuY2xvc2UoKQpAQCAtMzgzLDYgKzM5MSw5IEBACiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IDpjb25zdDpgUE9MTEhVUGAgIHwgSHVuZyB1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IDpjb25zdDpgUE9MTFJESFVQYHwgU3RyZWFtIHNvY2tldCBwZWVyIGNsb3NlZCBjb25uZWN0aW9uLCBvciB8CisgICB8ICAgICAgICAgICAgICAgICAgIHwgc2h1dCBkb3duIHdyaXRpbmcgaGFsZiBvZiBjb25uZWN0aW9uICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IDpjb25zdDpgUE9MTE5WQUxgIHwgSW52YWxpZCByZXF1ZXN0OiBkZXNjcmlwdG9yIG5vdCBvcGVuICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NobGV4LnJzdCBiL0RvYy9saWJyYXJ5L3NobGV4LnJzdAppbmRleCBlODFmOTgyLi4xYTg5YmY2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zaGxleC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2hsZXgucnN0CkBAIC03MywxMSArNzMsMTEgQEAKIFRoZSA6bW9kOmBzaGxleGAgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzczoKIAogCi0uLiBjbGFzczo6IHNobGV4KGluc3RyZWFtPU5vbmUsIGluZmlsZT1Ob25lLCBwb3NpeD1GYWxzZSkKKy4uIGNsYXNzOjogc2hsZXgoaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlLCBwdW5jdHVhdGlvbl9jaGFycz1GYWxzZSkKIAogICAgQSA6Y2xhc3M6YH5zaGxleC5zaGxleGAgaW5zdGFuY2Ugb3Igc3ViY2xhc3MgaW5zdGFuY2UgaXMgYSBsZXhpY2FsIGFuYWx5emVyCiAgICBvYmplY3QuICBUaGUgaW5pdGlhbGl6YXRpb24gYXJndW1lbnQsIGlmIHByZXNlbnQsIHNwZWNpZmllcyB3aGVyZSB0byByZWFkCi0gICBjaGFyYWN0ZXJzIGZyb20uIEl0IG11c3QgYmUgYSBmaWxlLS9zdHJlYW0tbGlrZSBvYmplY3Qgd2l0aAorICAgY2hhcmFjdGVycyBmcm9tLiAgSXQgbXVzdCBiZSBhIGZpbGUtL3N0cmVhbS1saWtlIG9iamVjdCB3aXRoCiAgICA6bWV0aDpgfmlvLlRleHRJT0Jhc2UucmVhZGAgYW5kIDptZXRoOmB+aW8uVGV4dElPQmFzZS5yZWFkbGluZWAgbWV0aG9kcywgb3IKICAgIGEgc3RyaW5nLiAgSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIGlucHV0IHdpbGwgYmUgdGFrZW4gZnJvbSBgYHN5cy5zdGRpbmBgLgogICAgVGhlIHNlY29uZCBvcHRpb25hbCBhcmd1bWVudCBpcyBhIGZpbGVuYW1lIHN0cmluZywgd2hpY2ggc2V0cyB0aGUgaW5pdGlhbApAQCAtODcsOCArODcsMTkgQEAKICAgIHdoZW4gKnBvc2l4KiBpcyBub3QgdHJ1ZSAoZGVmYXVsdCksIHRoZSA6Y2xhc3M6YH5zaGxleC5zaGxleGAgaW5zdGFuY2Ugd2lsbAogICAgb3BlcmF0ZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUuICBXaGVuIG9wZXJhdGluZyBpbiBQT1NJWCBtb2RlLAogICAgOmNsYXNzOmB+c2hsZXguc2hsZXhgIHdpbGwgdHJ5IHRvIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBQT1NJWCBzaGVsbAotICAgcGFyc2luZyBydWxlcy4KKyAgIHBhcnNpbmcgcnVsZXMuICBUaGUgKnB1bmN0dWF0aW9uX2NoYXJzKiBhcmd1bWVudCBwcm92aWRlcyBhIHdheSB0byBtYWtlIHRoZQorICAgYmVoYXZpb3VyIGV2ZW4gY2xvc2VyIHRvIGhvdyByZWFsIHNoZWxscyBwYXJzZS4gIFRoaXMgY2FuIHRha2UgYSBudW1iZXIgb2YKKyAgIHZhbHVlczogdGhlIGRlZmF1bHQgdmFsdWUsIGBgRmFsc2VgYCwgcHJlc2VydmVzIHRoZSBiZWhhdmlvdXIgc2VlbiB1bmRlcgorICAgUHl0aG9uIDMuNSBhbmQgZWFybGllci4gIElmIHNldCB0byBgYFRydWVgYCwgdGhlbiBwYXJzaW5nIG9mIHRoZSBjaGFyYWN0ZXJzCisgICBgYCgpOzw+fCZgYCBpcyBjaGFuZ2VkOiBhbnkgcnVuIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGNvbnNpZGVyZWQgcHVuY3R1YXRpb24KKyAgIGNoYXJhY3RlcnMpIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuLiAgSWYgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBvZgorICAgY2hhcmFjdGVycywgdGhvc2UgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQgYXMgdGhlIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMuICBBbnkKKyAgIGNoYXJhY3RlcnMgaW4gdGhlIDphdHRyOmB3b3JkY2hhcnNgIGF0dHJpYnV0ZSB0aGF0IGFwcGVhciBpbgorICAgKnB1bmN0dWF0aW9uX2NoYXJzKiB3aWxsIGJlIHJlbW92ZWQgZnJvbSA6YXR0cjpgd29yZGNoYXJzYC4gIFNlZQorICAgOnJlZjpgaW1wcm92ZWQtc2hlbGwtY29tcGF0aWJpbGl0eWAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGUgKnB1bmN0dWF0aW9uX2NoYXJzKiBwYXJhbWV0ZXIgd2FzIGFkZGVkLgogCiAuLiBzZWVhbHNvOjoKIApAQCAtMTkxLDcgKzIwMiwxMyBAQAogLi4gYXR0cmlidXRlOjogc2hsZXgud29yZGNoYXJzCiAKICAgIFRoZSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdpbGwgYWNjdW11bGF0ZSBpbnRvIG11bHRpLWNoYXJhY3RlciB0b2tlbnMuICBCeQotICAgZGVmYXVsdCwgaW5jbHVkZXMgYWxsIEFTQ0lJIGFscGhhbnVtZXJpY3MgYW5kIHVuZGVyc2NvcmUuCisgICBkZWZhdWx0LCBpbmNsdWRlcyBhbGwgQVNDSUkgYWxwaGFudW1lcmljcyBhbmQgdW5kZXJzY29yZS4gIEluIFBPU0lYIG1vZGUsIHRoZQorICAgYWNjZW50ZWQgY2hhcmFjdGVycyBpbiB0aGUgTGF0aW4tMSBzZXQgYXJlIGFsc28gaW5jbHVkZWQuICBJZgorICAgOmF0dHI6YHB1bmN0dWF0aW9uX2NoYXJzYCBpcyBub3QgZW1wdHksIHRoZSBjaGFyYWN0ZXJzIGBgfi0uLyo/PWBgLCB3aGljaCBjYW4KKyAgIGFwcGVhciBpbiBmaWxlbmFtZSBzcGVjaWZpY2F0aW9ucyBhbmQgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMsIHdpbGwgYWxzbyBiZQorICAgaW5jbHVkZWQgaW4gdGhpcyBhdHRyaWJ1dGUsIGFuZCBhbnkgY2hhcmFjdGVycyB3aGljaCBhcHBlYXIgaW4KKyAgIGBgcHVuY3R1YXRpb25fY2hhcnNgYCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBgYHdvcmRjaGFyc2BgIGlmIHRoZXkgYXJlIHByZXNlbnQKKyAgIHRoZXJlLgogCiAKIC4uIGF0dHJpYnV0ZTo6IHNobGV4LndoaXRlc3BhY2UKQEAgLTIyMiw5ICsyMzksMTMgQEAKIAogLi4gYXR0cmlidXRlOjogc2hsZXgud2hpdGVzcGFjZV9zcGxpdAogCi0gICBJZiBgYFRydWVgYCwgdG9rZW5zIHdpbGwgb25seSBiZSBzcGxpdCBpbiB3aGl0ZXNwYWNlcy4gVGhpcyBpcyB1c2VmdWwsIGZvcgorICAgSWYgYGBUcnVlYGAsIHRva2VucyB3aWxsIG9ubHkgYmUgc3BsaXQgaW4gd2hpdGVzcGFjZXMuICBUaGlzIGlzIHVzZWZ1bCwgZm9yCiAgICBleGFtcGxlLCBmb3IgcGFyc2luZyBjb21tYW5kIGxpbmVzIHdpdGggOmNsYXNzOmB+c2hsZXguc2hsZXhgLCBnZXR0aW5nCi0gICB0b2tlbnMgaW4gYSBzaW1pbGFyIHdheSB0byBzaGVsbCBhcmd1bWVudHMuCisgICB0b2tlbnMgaW4gYSBzaW1pbGFyIHdheSB0byBzaGVsbCBhcmd1bWVudHMuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBgYFRydWVgYCwKKyAgIDphdHRyOmBwdW5jdHVhdGlvbl9jaGFyc2Agd2lsbCBoYXZlIG5vIGVmZmVjdCwgYW5kIHNwbGl0dGluZyB3aWxsIGhhcHBlbgorICAgb25seSBvbiB3aGl0ZXNwYWNlcy4gIFdoZW4gdXNpbmcgOmF0dHI6YHB1bmN0dWF0aW9uX2NoYXJzYCwgd2hpY2ggaXMKKyAgIGludGVuZGVkIHRvIHByb3ZpZGUgcGFyc2luZyBjbG9zZXIgdG8gdGhhdCBpbXBsZW1lbnRlZCBieSBzaGVsbHMsIGl0IGlzCisgICBhZHZpc2FibGUgdG8gbGVhdmUgYGB3aGl0ZXNwYWNlX3NwbGl0YGAgYXMgYGBGYWxzZWBgICh0aGUgZGVmYXVsdCB2YWx1ZSkuCiAKIAogLi4gYXR0cmlidXRlOjogc2hsZXguaW5maWxlCkBAIC0yNDUsMTAgKzI2Niw5IEBACiAgICBUaGlzIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYCBieSBkZWZhdWx0LiAgSWYgeW91IGFzc2lnbiBhIHN0cmluZyB0byBpdCwgdGhhdAogICAgc3RyaW5nIHdpbGwgYmUgcmVjb2duaXplZCBhcyBhIGxleGljYWwtbGV2ZWwgaW5jbHVzaW9uIHJlcXVlc3Qgc2ltaWxhciB0byB0aGUKICAgIGBgc291cmNlYGAga2V5d29yZCBpbiB2YXJpb3VzIHNoZWxscy4gIFRoYXQgaXMsIHRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdG9rZW4KLSAgIHdpbGwgYmUgb3BlbmVkIGFzIGEgZmlsZW5hbWUgYW5kIGlucHV0IHdpbGwKLSAgIGJlIHRha2VuIGZyb20gdGhhdCBzdHJlYW0gdW50aWwgRU9GLCBhdCB3aGljaAotICAgcG9pbnQgdGhlIDptZXRoOmB+aW8uSU9CYXNlLmNsb3NlYCBtZXRob2Qgb2YgdGhhdCBzdHJlYW0gd2lsbCBiZSBjYWxsZWQgYW5kCi0gICB0aGUgaW5wdXQgc291cmNlIHdpbGwgYWdhaW4gYmVjb21lIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uICBTb3VyY2UKKyAgIHdpbGwgYmUgb3BlbmVkIGFzIGEgZmlsZW5hbWUgYW5kIGlucHV0IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGF0IHN0cmVhbSB1bnRpbAorICAgRU9GLCBhdCB3aGljaCBwb2ludCB0aGUgOm1ldGg6YH5pby5JT0Jhc2UuY2xvc2VgIG1ldGhvZCBvZiB0aGF0IHN0cmVhbSB3aWxsIGJlCisgICBjYWxsZWQgYW5kIHRoZSBpbnB1dCBzb3VyY2Ugd2lsbCBhZ2FpbiBiZWNvbWUgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbS4gIFNvdXJjZQogICAgcmVxdWVzdHMgbWF5IGJlIHN0YWNrZWQgYW55IG51bWJlciBvZiBsZXZlbHMgZGVlcC4KIAogCkBAIC0yNzUsNiArMjk1LDE2IEBACiAgICAoYGAnJ2BgKSwgaW4gbm9uLVBPU0lYIG1vZGUsIGFuZCB0byBgYE5vbmVgYCBpbiBQT1NJWCBtb2RlLgogCiAKKy4uIGF0dHJpYnV0ZTo6IHNobGV4LnB1bmN0dWF0aW9uX2NoYXJzCisKKyAgIENoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgcHVuY3R1YXRpb24uIFJ1bnMgb2YgcHVuY3R1YXRpb24KKyAgIGNoYXJhY3RlcnMgd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbi4gSG93ZXZlciwgbm90ZSB0aGF0IG5vCisgICBzZW1hbnRpYyB2YWxpZGl0eSBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZDogZm9yIGV4YW1wbGUsICc+Pj4nIGNvdWxkIGJlCisgICByZXR1cm5lZCBhcyBhIHRva2VuLCBldmVuIHRob3VnaCBpdCBtYXkgbm90IGJlIHJlY29nbmlzZWQgYXMgc3VjaCBieSBzaGVsbHMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIC4uIF9zaGxleC1wYXJzaW5nLXJ1bGVzOgogCiBQYXJzaW5nIFJ1bGVzCkBAIC0zMjcsMyArMzU3LDYyIEBACiAqIEVPRiBpcyBzaWduYWxlZCB3aXRoIGEgOmNvbnN0OmBOb25lYCB2YWx1ZTsKIAogKiBRdW90ZWQgZW1wdHkgc3RyaW5ncyAoYGAnJ2BgKSBhcmUgYWxsb3dlZC4KKworLi4gX2ltcHJvdmVkLXNoZWxsLWNvbXBhdGliaWxpdHk6CisKK0ltcHJvdmVkIENvbXBhdGliaWxpdHkgd2l0aCBTaGVsbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK1RoZSA6Y2xhc3M6YHNobGV4YCBjbGFzcyBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5Citjb21tb24gVW5peCBzaGVsbHMgbGlrZSBgYGJhc2hgYCwgYGBkYXNoYGAsIGFuZCBgYHNoYGAuICBUbyB0YWtlIGFkdmFudGFnZSBvZgordGhpcyBjb21wYXRpYmlsaXR5LCBzcGVjaWZ5IHRoZSBgYHB1bmN0dWF0aW9uX2NoYXJzYGAgYXJndW1lbnQgaW4gdGhlCitjb25zdHJ1Y3Rvci4gIFRoaXMgZGVmYXVsdHMgdG8gYGBGYWxzZWBgLCB3aGljaCBwcmVzZXJ2ZXMgcHJlLTMuNiBiZWhhdmlvdXIuCitIb3dldmVyLCBpZiBpdCBpcyBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gcGFyc2luZyBvZiB0aGUgY2hhcmFjdGVycyBgYCgpOzw+fCZgYAoraXMgY2hhbmdlZDogYW55IHJ1biBvZiB0aGVzZSBjaGFyYWN0ZXJzIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuLiAgV2hpbGUKK3RoaXMgaXMgc2hvcnQgb2YgYSBmdWxsIHBhcnNlciBmb3Igc2hlbGxzICh3aGljaCB3b3VsZCBiZSBvdXQgb2Ygc2NvcGUgZm9yIHRoZQorc3RhbmRhcmQgbGlicmFyeSwgZ2l2ZW4gdGhlIG11bHRpcGxpY2l0eSBvZiBzaGVsbHMgb3V0IHRoZXJlKSwgaXQgZG9lcyBhbGxvdworeW91IHRvIHBlcmZvcm0gcHJvY2Vzc2luZyBvZiBjb21tYW5kIGxpbmVzIG1vcmUgZWFzaWx5IHRoYW4geW91IGNvdWxkCitvdGhlcndpc2UuICBUbyBpbGx1c3RyYXRlLCB5b3UgY2FuIHNlZSB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6OgorCisgICAgaW1wb3J0IHNobGV4CisKKyAgICBmb3IgcHVuY3QgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgaWYgcHVuY3Q6CisgICAgICAgICAgICBtZXNzYWdlID0gJ09sZCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAnTmV3JworICAgICAgICB0ZXh0ID0gImEgJiYgYjsgYyAmJiBkIHx8IGU7IGYgPidhYmMnOyAoZGVmIFwiZ2hpXCIpIgorICAgICAgICBzID0gc2hsZXguc2hsZXgodGV4dCwgcHVuY3R1YXRpb25fY2hhcnM9cHVuY3QpCisgICAgICAgIHByaW50KCclczogJXMnICUgKG1lc3NhZ2UsIGxpc3QocykpKQorCit3aGljaCBwcmludHMgb3V0OjoKKworICAgIE9sZDogWydhJywgJyYnLCAnJicsICdiJywgJzsnLCAnYycsICcmJywgJyYnLCAnZCcsICd8JywgJ3wnLCAnZScsICc7JywgJ2YnLCAnPicsICInYWJjJyIsICc7JywgJygnLCAnZGVmJywgJyJnaGkiJywgJyknXQorICAgIE5ldzogWydhJywgJyYmJywgJ2InLCAnOycsICdjJywgJyYmJywgJ2QnLCAnfHwnLCAnZScsICc7JywgJ2YnLCAnPicsICInYWJjJyIsICc7JywgJygnLCAnZGVmJywgJyJnaGkiJywgJyknXQorCitPZiBjb3Vyc2UsIHRva2VucyB3aWxsIGJlIHJldHVybmVkIHdoaWNoIGFyZSBub3QgdmFsaWQgZm9yIHNoZWxscywgYW5kIHlvdSdsbAorbmVlZCB0byBpbXBsZW1lbnQgeW91ciBvd24gZXJyb3IgY2hlY2tzIG9uIHRoZSByZXR1cm5lZCB0b2tlbnMuCisKK0luc3RlYWQgb2YgcGFzc2luZyBgYFRydWVgYCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBwdW5jdHVhdGlvbl9jaGFycyBwYXJhbWV0ZXIsCit5b3UgY2FuIHBhc3MgYSBzdHJpbmcgd2l0aCBzcGVjaWZpYyBjaGFyYWN0ZXJzLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCit3aGljaCBjaGFyYWN0ZXJzIGNvbnN0aXR1dGUgcHVuY3R1YXRpb24uIEZvciBleGFtcGxlOjoKKworICAgID4+PiBpbXBvcnQgc2hsZXgKKyAgICA+Pj4gcyA9IHNobGV4LnNobGV4KCJhICYmIGIgfHwgYyIsIHB1bmN0dWF0aW9uX2NoYXJzPSJ8IikKKyAgICA+Pj4gbGlzdChzKQorICAgIFsnYScsICcmJywgJyYnLCAnYicsICd8fCcsICdjJ10KKworLi4gbm90ZTo6IFdoZW4gYGBwdW5jdHVhdGlvbl9jaGFyc2BgIGlzIHNwZWNpZmllZCwgdGhlIDphdHRyOmB+c2hsZXgud29yZGNoYXJzYAorICAgYXR0cmlidXRlIGlzIGF1Z21lbnRlZCB3aXRoIHRoZSBjaGFyYWN0ZXJzIGBgfi0uLyo/PWBgLiAgVGhhdCBpcyBiZWNhdXNlIHRoZXNlCisgICBjaGFyYWN0ZXJzIGNhbiBhcHBlYXIgaW4gZmlsZSBuYW1lcyAoaW5jbHVkaW5nIHdpbGRjYXJkcykgYW5kIGNvbW1hbmQtbGluZQorICAgYXJndW1lbnRzIChlLmcuIGBgLS1jb2xvcj1hdXRvYGApLiBIZW5jZTo6CisKKyAgICAgID4+PiBpbXBvcnQgc2hsZXgKKyAgICAgID4+PiBzID0gc2hsZXguc2hsZXgoJ34vYSAmJiBiLWMgLS1jb2xvcj1hdXRvIHx8IGQgKi5weT8nLAorICAgICAgLi4uICAgICAgICAgICAgICAgICBwdW5jdHVhdGlvbl9jaGFycz1UcnVlKQorICAgICAgPj4+IGxpc3QocykKKyAgICAgIFsnfi9hJywgJyYmJywgJ2ItYycsICctLWNvbG9yPWF1dG8nLCAnfHwnLCAnZCcsICcqLnB5PyddCisKKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc2h1dGlsLnJzdCBiL0RvYy9saWJyYXJ5L3NodXRpbC5yc3QKaW5kZXggYTFjZjI0MS4uZmVmZDZhYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2h1dGlsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zaHV0aWwucnN0CkBAIC00MjUsNyArNDI1LDcgQEAKICAgIGltcG9ydCBsb2dnaW5nCiAKICAgIGRlZiBfbG9ncGF0aChwYXRoLCBuYW1lcyk6Ci0gICAgICAgbG9nZ2luZy5pbmZvKCdXb3JraW5nIGluICVzJyAlIHBhdGgpCisgICAgICAgbG9nZ2luZy5pbmZvKCdXb3JraW5nIGluICVzJywgcGF0aCkKICAgICAgICByZXR1cm4gW10gICAjIG5vdGhpbmcgd2lsbCBiZSBpZ25vcmVkCiAKICAgIGNvcHl0cmVlKHNvdXJjZSwgZGVzdGluYXRpb24sIGlnbm9yZT1fbG9ncGF0aCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NpdGUucnN0IGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKaW5kZXggMGE3M2Y1YS4uNDNkYWY3OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKQEAgLTUyLDcgKzUyLDggQEAKIEEgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUgaXMgYSBmaWxlIHdob3NlIG5hbWUgaGFzIHRoZSBmb3JtIDpmaWxlOmB7bmFtZX0ucHRoYAogYW5kIGV4aXN0cyBpbiBvbmUgb2YgdGhlIGZvdXIgZGlyZWN0b3JpZXMgbWVudGlvbmVkIGFib3ZlOyBpdHMgY29udGVudHMgYXJlCiBhZGRpdGlvbmFsIGl0ZW1zIChvbmUgcGVyIGxpbmUpIHRvIGJlIGFkZGVkIHRvIGBgc3lzLnBhdGhgYC4gIE5vbi1leGlzdGluZyBpdGVtcwotYXJlIG5ldmVyIGFkZGVkIHRvIGBgc3lzLnBhdGhgYC4gIE5vIGl0ZW0gaXMgYWRkZWQgdG8gYGBzeXMucGF0aGBgIG1vcmUgdGhhbgorYXJlIG5ldmVyIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCwgYW5kIG5vIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgaXRlbSByZWZlcnMgdG8gYQorZGlyZWN0b3J5IHJhdGhlciB0aGFuIGEgZmlsZS4gIE5vIGl0ZW0gaXMgYWRkZWQgdG8gYGBzeXMucGF0aGBgIG1vcmUgdGhhbgogb25jZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgc2tpcHBlZC4gIExpbmVzIHN0YXJ0aW5nCiB3aXRoIGBgaW1wb3J0YGAgKGZvbGxvd2VkIGJ5IHNwYWNlIG9yIHRhYikgYXJlIGV4ZWN1dGVkLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zbXRwZC5yc3QgYi9Eb2MvbGlicmFyeS9zbXRwZC5yc3QKaW5kZXggOTc3ZjlhOC4uMWMyNTVkZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc210cGQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NtdHBkLnJzdApAQCAtMjksNyArMjksNyBAQAogCiAKIC4uIGNsYXNzOjogU01UUFNlcnZlcihsb2NhbGFkZHIsIHJlbW90ZWFkZHIsIGRhdGFfc2l6ZV9saW1pdD0zMzU1NDQzMixcCi0gICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSkKIAogICAgQ3JlYXRlIGEgbmV3IDpjbGFzczpgU01UUFNlcnZlcmAgb2JqZWN0LCB3aGljaCBiaW5kcyB0byBsb2NhbCBhZGRyZXNzCiAgICAqbG9jYWxhZGRyKi4gIEl0IHdpbGwgdHJlYXQgKnJlbW90ZWFkZHIqIGFzIGFuIHVwc3RyZWFtIFNNVFAgcmVsYXllci4gIEl0CkBAIC00NCwyMSArNDQsMjAgQEAKICAgIGRpY3Rpb25hcnkgaXMgYSBzdWl0YWJsZSB2YWx1ZSkuICBJZiBub3Qgc3BlY2lmaWVkIHRoZSA6bW9kOmBhc3luY29yZWAKICAgIGdsb2JhbCBzb2NrZXQgbWFwIGlzIHVzZWQuCiAKLSAgICplbmFibGVfU01UUFVURjgqIGRldGVybWlucyB3aGV0aGVyIHRoZSBgYFNNVFBVVEY4YGAgZXh0ZW5zaW9uIChhcyBkZWZpbmVkCi0gICBpbiA6UkZDOmA2NTMxYCkgc2hvdWxkIGJlIGVuYWJsZWQuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuICBJZiBzZXQgdG8KLSAgIGBgVHJ1ZWBgLCAqZGVjb2RlX2RhdGEqIG11c3QgYmUgYGBGYWxzZWBgIChvdGhlcndpc2UgYW4gZXJyb3IgaXMgcmFpc2VkKS4KKyAgICplbmFibGVfU01UUFVURjgqIGRldGVybWluZXMgd2hldGhlciB0aGUgYGBTTVRQVVRGOGBgIGV4dGVuc2lvbiAoYXMgZGVmaW5lZAorICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgogICAgV2hlbiBgYFRydWVgYCwgYGBTTVRQVVRGOGBgIGlzIGFjY2VwdGVkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBgYE1BSUxgYAogICAgY29tbWFuZCBhbmQgd2hlbiBwcmVzZW50IGlzIHBhc3NlZCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYCBpbiB0aGUKLSAgIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuCisgICBgYGt3YXJnc1snbWFpbF9vcHRpb25zJ11gYCBsaXN0LiAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCoKKyAgIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUgdGltZS4KIAogICAgKmRlY29kZV9kYXRhKiBzcGVjaWZpZXMgd2hldGhlciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBTTVRQIHRyYW5zYWN0aW9uCi0gICBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOC4gIFRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgIGZvciBiYWNrd2FyZAotICAgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2lsbCBjaGFuZ2UgdG8gYGBGYWxzZWBgIGluIFB5dGhvbiAzLjY7IHNwZWNpZnkKLSAgIHRoZSBrZXl3b3JkIHZhbHVlIGV4cGxpY2l0bHkgdG8gYXZvaWQgdGhlIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AuICBXaGVuCi0gICAqZGVjb2RlX2RhdGEqIGlzIHNldCB0byBgYEZhbHNlYGAgdGhlIHNlcnZlciBhZHZlcnRpc2VzIHRoZSBgYDhCSVRNSU1FYGAKKyAgIHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04LiAgV2hlbiAqZGVjb2RlX2RhdGEqIGlzIGBgRmFsc2VgYCAodGhlCisgICBkZWZhdWx0KSwgdGhlIHNlcnZlciBhZHZlcnRpc2VzIHRoZSBgYDhCSVRNSU1FYGAKICAgIGV4dGVuc2lvbiAoOnJmYzpgNjE1MmApLCBhY2NlcHRzIHRoZSBgYEJPRFk9OEJJVE1JTUVgYCBwYXJhbWV0ZXIgdG8KICAgIHRoZSBgYE1BSUxgYCBjb21tYW5kLCBhbmQgd2hlbiBwcmVzZW50IHBhc3NlcyBpdCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYAotICAgaW4gdGhlIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuCisgICBpbiB0aGUgYGBrd2FyZ3NbJ21haWxfb3B0aW9ucyddYGAgbGlzdC4gKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCoKKyAgIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUgdGltZS4KIAogICAgLi4gbWV0aG9kOjogcHJvY2Vzc19tZXNzYWdlKHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhLCAqKmt3YXJncykKIApAQCAtNzUsOSArNzQsOCBAQAogICAgICAgd2lsbCBiZSBhIGJ5dGVzIG9iamVjdC4KIAogICAgICAgKmt3YXJncyogaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gSXQgaXMgZW1wdHkKLSAgICAgIHVubGVzcyBhdCBsZWFzdCBvbmUgb2YgYGBkZWNvZGVfZGF0YT1GYWxzZWBgIG9yIGBgZW5hYmxlX1NNVFBVVEY4PVRydWVgYAotICAgICAgd2FzIGdpdmVuIGFzIGFuIGluaXQgcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLSAgICAgIGtleXM6CisgICAgICBpZiBgYGRlY29kZV9kYXRhPVRydWVgYCB3YXMgZ2l2ZW4gYXMgYW4gaW5pdCBhcmd1bWVudCwgb3RoZXJ3aXNlCisgICAgICBpdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGtleXM6CiAKICAgICAgICAgICAqbWFpbF9vcHRpb25zKjoKICAgICAgICAgICAgICBhIGxpc3Qgb2YgYWxsIHJlY2VpdmVkIHBhcmFtZXRlcnMgdG8gdGhlIGBgTUFJTGBgCkBAIC0xMDgsOSArMTA2LDEyIEBACiAgICAgICAqbG9jYWxhZGRyKiBhbmQgKnJlbW90ZWFkZHIqIG1heSBub3cgY29udGFpbiBJUHY2IGFkZHJlc3Nlcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41Ci0gICAgICB0aGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY29uc3RydWN0b3IgYXJndW1lbnRzLCBhbmQgdGhlCi0gICAgICAqa3dhcmdzKiBhcmd1bWVudCB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYCB3aGVuIG9uZSBvciBtb3JlIG9mIHRoZXNlIGlzCi0gICAgICBzcGVjaWZpZWQuCisgICAgICBUaGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY29uc3RydWN0b3IgcGFyYW1ldGVycywgYW5kIHRoZQorICAgICAgKmt3YXJncyogcGFyYW1ldGVyIHRvIDptZXRoOmBwcm9jZXNzX21lc3NhZ2VgIHdoZW4gKmRlY29kZV9kYXRhKiBpcworICAgICAgYGBGYWxzZWBgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKmRlY29kZV9kYXRhKiBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCiAKIAogRGVidWdnaW5nU2VydmVyIE9iamVjdHMKQEAgLTE1MCw3ICsxNTEsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAuLiBjbGFzczo6IFNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGF0YV9zaXplX2xpbWl0PTMzNTU0NDMyLFwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9RmFsc2UpCiAKICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNNVFBDaGFubmVsYCBvYmplY3Qgd2hpY2ggbWFuYWdlcyB0aGUgY29tbXVuaWNhdGlvbgogICAgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBhIHNpbmdsZSBTTVRQIGNsaWVudC4KQEAgLTE2MSwyMyArMTYyLDI2IEBACiAgICBhY2NlcHRlZCBpbiBhIGBgREFUQWBgIGNvbW1hbmQuICBBIHZhbHVlIG9mIGBgTm9uZWBgIG9yIGBgMGBgIG1lYW5zIG5vCiAgICBsaW1pdC4KIAotICAgKmVuYWJsZV9TTVRQVVRGOCogZGV0ZXJtaW5zIHdoZXRoZXIgdGhlIGBgU01UUFVURjhgYCBleHRlbnNpb24gKGFzIGRlZmluZWQKLSAgIGluIDpSRkM6YDY1MzFgKSBzaG91bGQgYmUgZW5hYmxlZC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYC4gIEEKLSAgIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZCBpZiBib3RoICplbmFibGVfU01UUFVURjgqIGFuZCAqZGVjb2RlX2RhdGEqIGFyZQotICAgc2V0IHRvIGBgVHJ1ZWBgIGF0IHRoZSBzYW1lIHRpbWUuCisgICAqZW5hYmxlX1NNVFBVVEY4KiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGBgU01UUFVURjhgYCBleHRlbnNpb24gKGFzIGRlZmluZWQKKyAgIGluIDpSRkM6YDY1MzFgKSBzaG91bGQgYmUgZW5hYmxlZC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYC4KKyAgICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUKKyAgIHRpbWUuCiAKICAgIEEgZGljdGlvbmFyeSBjYW4gYmUgc3BlY2lmaWVkIGluICptYXAqIHRvIGF2b2lkIHVzaW5nIGEgZ2xvYmFsIHNvY2tldCBtYXAuCiAKICAgICpkZWNvZGVfZGF0YSogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgU01UUCB0cmFuc2FjdGlvbgotICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBUaGUgZGVmYXVsdCBpcyBgYFRydWVgYCBmb3IgYmFja3dhcmQKLSAgIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYnV0IHdpbGwgY2hhbmdlIHRvIGBgRmFsc2VgYCBpbiBQeXRob24gMy42LiAgU3BlY2lmeQotICAgdGhlIGtleXdvcmQgdmFsdWUgZXhwbGljaXRseSB0byBhdm9pZCB0aGUgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYC4KKyAgIHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04LiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgorICAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZQorICAgdGltZS4KIAogICAgVG8gdXNlIGEgY3VzdG9tIFNNVFBDaGFubmVsIGltcGxlbWVudGF0aW9uIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZQogICAgOmF0dHI6YFNNVFBTZXJ2ZXIuY2hhbm5lbF9jbGFzc2Agb2YgeW91ciA6Y2xhc3M6YFNNVFBTZXJ2ZXJgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQotICAgICAgdGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGFyZ3VtZW50cyB3ZXJlIGFkZGVkLgorICAgICAgVGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIHBhcmFtZXRlcnMgd2VyZSBhZGRlZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICpkZWNvZGVfZGF0YSogaXMgbm93IGBgRmFsc2VgYCBieSBkZWZhdWx0LgogCiAgICBUaGUgOmNsYXNzOmBTTVRQQ2hhbm5lbGAgaGFzIHRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgdmFyaWFibGVzOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zb2NrZXQucnN0IGIvRG9jL2xpYnJhcnkvc29ja2V0LnJzdAppbmRleCAwMmYyMzUwLi40YTJjZjExIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKQEAgLTEzMSw2ICsxMzEsMjIgQEAKICAgICBzdHJpbmcgZm9ybWF0LiAoZXguIGBgYicxMjoyMzozNDo0NTo1Njo2NydgYCkgVGhpcyBwcm90b2NvbCBpcyBub3QKICAgICBzdXBwb3J0ZWQgdW5kZXIgRnJlZUJTRC4KIAorLSA6Y29uc3Q6YEFGX0FMR2AgaXMgYSBMaW51eC1vbmx5IHNvY2tldCBiYXNlZCBpbnRlcmZhY2UgdG8gS2VybmVsCisgIGNyeXB0b2dyYXBoeS4gQW4gYWxnb3JpdGhtIHNvY2tldCBpcyBjb25maWd1cmVkIHdpdGggYSB0dXBsZSBvZiB0d28gdG8gZm91cgorICBlbGVtZW50cyBgYCh0eXBlLCBuYW1lIFssIGZlYXQgWywgbWFza11dKWBgLCB3aGVyZToKKworICAtICp0eXBlKiBpcyB0aGUgYWxnb3JpdGhtIHR5cGUgYXMgc3RyaW5nLCBlLmcuIGBgYWVhZGBgLCBgYGhhc2hgYCwKKyAgICBgYHNrY2lwaGVyYGAgb3IgYGBybmdgYC4KKworICAtICpuYW1lKiBpcyB0aGUgYWxnb3JpdGhtIG5hbWUgYW5kIG9wZXJhdGlvbiBtb2RlIGFzIHN0cmluZywgZS5nLgorICAgIGBgc2hhMjU2YGAsIGBgaG1hYyhzaGEyNTYpYGAsIGBgY2JjKGFlcylgYCBvciBgYGRyYmdfbm9wcl9jdHJfYWVzMjU2YGAuCisKKyAgLSAqZmVhdCogYW5kICptYXNrKiBhcmUgdW5zaWduZWQgMzJiaXQgaW50ZWdlcnMuCisKKyAgQXZhaWxhYmlsaXR5IExpbnV4IDIuNi4zOCwgc29tZSBhbGdvcml0aG0gdHlwZXMgcmVxdWlyZSBtb3JlIHJlY2VudCBLZXJuZWxzLgorCisgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAtIENlcnRhaW4gb3RoZXIgYWRkcmVzcyBmYW1pbGllcyAoOmNvbnN0OmBBRl9QQUNLRVRgLCA6Y29uc3Q6YEFGX0NBTmApCiAgIHN1cHBvcnQgc3BlY2lmaWMgcmVwcmVzZW50YXRpb25zLgogCkBAIC0yODEsNiArMjk3LDEwIEBACiAgICBpbiB0aGUgVW5peCBoZWFkZXIgZmlsZXMgYXJlIGRlZmluZWQ7IGZvciBhIGZldyBzeW1ib2xzLCBkZWZhdWx0IHZhbHVlcyBhcmUKICAgIHByb3ZpZGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBTT19ET01BSU5gYCwgYGBTT19QUk9UT0NPTGBgLCBgYFNPX1BFRVJTRUNgYCwgYGBTT19QQVNTU0VDYGAKKyAgICAgIHdlcmUgYWRkZWQuCisKIC4uIGRhdGE6OiBBRl9DQU4KICAgICAgICAgICBQRl9DQU4KICAgICAgICAgICBTT0xfQ0FOXyoKQEAgLTMyOSwxOCArMzQ5LDMzIEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAogCi0uLiBkYXRhOjogU0lPXyoKKy4uIGRhdGE6OiBTSU9fUkNWQUxMCisgICAgICAgICAgU0lPX0tFRVBBTElWRV9WQUxTCisgICAgICAgICAgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSAogICAgICAgICAgIFJDVkFMTF8qCiAKICAgIENvbnN0YW50cyBmb3IgV2luZG93cycgV1NBSW9jdGwoKS4gVGhlIGNvbnN0YW50cyBhcmUgdXNlZCBhcyBhcmd1bWVudHMgdG8gdGhlCiAgICA6bWV0aDpgfnNvY2tldC5zb2NrZXQuaW9jdGxgIG1ldGhvZCBvZiBzb2NrZXQgb2JqZWN0cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIGBgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGBgIHdhcyBhZGRlZC4KKwogCiAuLiBkYXRhOjogVElQQ18qCiAKICAgIFRJUEMgcmVsYXRlZCBjb25zdGFudHMsIG1hdGNoaW5nIHRoZSBvbmVzIGV4cG9ydGVkIGJ5IHRoZSBDIHNvY2tldCBBUEkuIFNlZQogICAgdGhlIFRJUEMgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorLi4gZGF0YTo6IEFGX0FMRworICAgICAgICAgIFNPTF9BTEcKKyAgICAgICAgICBBTEdfKgorCisgICBDb25zdGFudHMgZm9yIExpbnV4IEtlcm5lbCBjcnlwdG9ncmFwaHkuCisKKyAgIEF2YWlsYWJpbGl0eTogTGludXggPj0gMi42LjM4LgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gZGF0YTo6IEFGX0xJTksKIAogICBBdmFpbGFiaWxpdHk6IEJTRCwgT1NYLgpAQCAtODcyLDYgKzkwNywxMCBAQAogICAgaXQgaXMgcmVjb21tZW5kZWQgdG8gOm1ldGg6YGNsb3NlYCB0aGVtIGV4cGxpY2l0bHksIG9yIHRvIHVzZSBhCiAgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50IGFyb3VuZCB0aGVtLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOmV4YzpgT1NFcnJvcmAgaXMgbm93IHJhaXNlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB0aGUgdW5kZXJseWluZworICAgICAgOmM6ZnVuYzpgY2xvc2VgIGNhbGwgaXMgbWFkZS4KKwogICAgLi4gbm90ZTo6CiAKICAgICAgIDptZXRoOmBjbG9zZSgpYCByZWxlYXNlcyB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiBidXQKQEAgLTk5Miw2ICsxMDMxLDEyIEBACiAgICBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSBnZW5lcmljIDpmdW5jOmBmY250bC5mY250bGAgYW5kIDpmdW5jOmBmY250bC5pb2N0bGAKICAgIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZDsgdGhleSBhY2NlcHQgYSBzb2NrZXQgb2JqZWN0IGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50LgogCisgICBDdXJyZW50bHkgb25seSB0aGUgZm9sbG93aW5nIGNvbnRyb2wgY29kZXMgYXJlIHN1cHBvcnRlZDoKKyAgIGBgU0lPX1JDVkFMTGBgLCBgYFNJT19LRUVQQUxJVkVfVkFMU2BgLCBhbmQgYGBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBgYFNJT19MT09QQkFDS19GQVNUX1BBVEhgYCB3YXMgYWRkZWQuCisKIC4uIG1ldGhvZDo6IHNvY2tldC5saXN0ZW4oW2JhY2tsb2ddKQogCiAgICBFbmFibGUgYSBzZXJ2ZXIgdG8gYWNjZXB0IGNvbm5lY3Rpb25zLiAgSWYgKmJhY2tsb2cqIGlzIHNwZWNpZmllZCwgaXQgbXVzdApAQCAtMTI3NSw2ICsxMzIwLDE1IEBACiAgICAgICBhbiBleGNlcHRpb24sIHRoZSBtZXRob2Qgbm93IHJldHJpZXMgdGhlIHN5c3RlbSBjYWxsIGluc3RlYWQgb2YgcmFpc2luZwogICAgICAgYW4gOmV4YzpgSW50ZXJydXB0ZWRFcnJvcmAgZXhjZXB0aW9uIChzZWUgOnBlcDpgNDc1YCBmb3IgdGhlIHJhdGlvbmFsZSkuCiAKKy4uIG1ldGhvZDo6IHNvY2tldC5zZW5kbXNnX2FmYWxnKFttc2ddLCAqLCBvcFssIGl2WywgYXNzb2NsZW5bLCBmbGFnc11dXSkKKworICAgU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiA6bWV0aDpgfnNvY2tldC5zZW5kbXNnYCBmb3IgOmNvbnN0OmBBRl9BTEdgIHNvY2tldC4KKyAgIFNldCBtb2RlLCBJViwgQUVBRCBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGFuZCBmbGFncyBmb3IgOmNvbnN0OmBBRl9BTEdgIHNvY2tldC4KKworICAgQXZhaWxhYmlsaXR5OiBMaW51eCA+PSAyLjYuMzgKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIG1ldGhvZDo6IHNvY2tldC5zZW5kZmlsZShmaWxlLCBvZmZzZXQ9MCwgY291bnQ9Tm9uZSkKIAogICAgU2VuZCBhIGZpbGUgdW50aWwgRU9GIGlzIHJlYWNoZWQgYnkgdXNpbmcgaGlnaC1wZXJmb3JtYW5jZQpAQCAtMTMyMywyMSArMTM3NywyOSBAQAogICAgRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSA6cmVmOmBub3RlcyBvbiBzb2NrZXQgdGltZW91dHMgPHNvY2tldC10aW1lb3V0cz5gLgogCiAKLS4uIG1ldGhvZDo6IHNvY2tldC5zZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCB2YWx1ZSkKKy4uIG1ldGhvZDo6IHNvY2tldC5zZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCB2YWx1ZTogaW50KQorLi4gbWV0aG9kOjogc29ja2V0LnNldHNvY2tvcHQobGV2ZWwsIG9wdG5hbWUsIHZhbHVlOiBidWZmZXIpCisuLiBtZXRob2Q6OiBzb2NrZXQuc2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgTm9uZSwgb3B0bGVuOiBpbnQpCiAKICAgIC4uIGluZGV4OjogbW9kdWxlOiBzdHJ1Y3QKIAogICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc29ja2V0IG9wdGlvbiAoc2VlIHRoZSBVbml4IG1hbnVhbCBwYWdlCiAgICA6bWFucGFnZTpgc2V0c29ja29wdCgyKWApLiAgVGhlIG5lZWRlZCBzeW1ib2xpYyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlCi0gICA6bW9kOmBzb2NrZXRgIG1vZHVsZSAoOmNvbnN0OmBTT19cKmAgZXRjLikuICBUaGUgdmFsdWUgY2FuIGJlIGFuIGludGVnZXIgb3IKLSAgIGEgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCByZXByZXNlbnRpbmcgYSBidWZmZXIuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgaXMKLSAgIHVwIHRvIHRoZSBjYWxsZXIgdG8KLSAgIGVuc3VyZSB0aGF0IHRoZSBieXRlc3RyaW5nIGNvbnRhaW5zIHRoZSBwcm9wZXIgYml0cyAoc2VlIHRoZSBvcHRpb25hbCBidWlsdC1pbgotICAgbW9kdWxlIDptb2Q6YHN0cnVjdGAgZm9yIGEgd2F5IHRvIGVuY29kZSBDIHN0cnVjdHVyZXMgYXMgYnl0ZXN0cmluZ3MpLgorICAgOm1vZDpgc29ja2V0YCBtb2R1bGUgKDpjb25zdDpgU09fXCpgIGV0Yy4pLiAgVGhlIHZhbHVlIGNhbiBiZSBhbiBpbnRlZ2VyLAorICAgTm9uZSBvciBhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAgcmVwcmVzZW50aW5nIGEgYnVmZmVyLiBJbiB0aGUgbGF0ZXIKKyAgIGNhc2UgaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCB0aGUgYnl0ZXN0cmluZyBjb250YWlucyB0aGUKKyAgIHByb3BlciBiaXRzIChzZWUgdGhlIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSA6bW9kOmBzdHJ1Y3RgIGZvciBhIHdheSB0bworICAgZW5jb2RlIEMgc3RydWN0dXJlcyBhcyBieXRlc3RyaW5ncykuIFdoZW4gdmFsdWUgaXMgc2V0IHRvIE5vbmUsCisgICBvcHRsZW4gYXJndW1lbnQgaXMgcmVxdWlyZWQuIEl0J3MgZXF1aXZhbGVudCB0byBjYWxsIHNldHNvY2tvcHQgQworICAgZnVuY3Rpb24gd2l0aCBvcHR2YWw9TlVMTCBhbmQgb3B0bGVuPW9wdGxlbi4KKwogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgV3JpdGFibGUgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCBpcyBub3cgYWNjZXB0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBzZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lLCBOb25lLCBvcHRsZW46IGludCkgZm9ybSBhZGRlZC4KKwogCiAuLiBtZXRob2Q6OiBzb2NrZXQuc2h1dGRvd24oaG93KQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdAppbmRleCAwODdmNGUwLi4yMThhMzFjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKQEAgLTUyLDExICs1MiwxMiBAQAogb3ZlcnJpZGluZyBpdHMgOm1ldGg6YH5CYXNlUmVxdWVzdEhhbmRsZXIuaGFuZGxlYCBtZXRob2Q7CiB0aGlzIG1ldGhvZCB3aWxsIHByb2Nlc3MgaW5jb21pbmcKIHJlcXVlc3RzLiAgU2Vjb25kLCB5b3UgbXVzdCBpbnN0YW50aWF0ZSBvbmUgb2YgdGhlIHNlcnZlciBjbGFzc2VzLCBwYXNzaW5nIGl0Ci10aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4gIFRoZW4gY2FsbCB0aGUKK3RoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCB0aGUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKK3RoZSBzZXJ2ZXIgaW4gYSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LiBUaGVuIGNhbGwgdGhlCiA6bWV0aDpgfkJhc2VTZXJ2ZXIuaGFuZGxlX3JlcXVlc3RgIG9yCiA6bWV0aDpgfkJhc2VTZXJ2ZXIuc2VydmVfZm9yZXZlcmAgbWV0aG9kIG9mIHRoZSBzZXJ2ZXIgb2JqZWN0IHRvCiBwcm9jZXNzIG9uZSBvciBtYW55IHJlcXVlc3RzLiAgRmluYWxseSwgY2FsbCA6bWV0aDpgfkJhc2VTZXJ2ZXIuc2VydmVyX2Nsb3NlYAotdG8gY2xvc2UgdGhlIHNvY2tldC4KK3RvIGNsb3NlIHRoZSBzb2NrZXQgKHVubGVzcyB5b3UgdXNlZCBhIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQpLgogCiBXaGVuIGluaGVyaXRpbmcgZnJvbSA6Y2xhc3M6YFRocmVhZGluZ01peEluYCBmb3IgdGhyZWFkZWQgY29ubmVjdGlvbiBiZWhhdmlvciwKIHlvdSBzaG91bGQgZXhwbGljaXRseSBkZWNsYXJlIGhvdyB5b3Ugd2FudCB5b3VyIHRocmVhZHMgdG8gYmVoYXZlIG9uIGFuIGFicnVwdApAQCAtMTExLDYgKzExMiw4IEBACiAgICA6Y2xhc3M6YFVEUFNlcnZlcmAuICBTZXR0aW5nIHRoZSB2YXJpb3VzIGF0dHJpYnV0ZXMgYWxzbyBjaGFuZ2VzIHRoZQogICAgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgc2VydmVyIG1lY2hhbmlzbS4KIAorICAgOmNsYXNzOmBGb3JraW5nTWl4SW5gIGFuZCB0aGUgRm9ya2luZyBjbGFzc2VzIG1lbnRpb25lZCBiZWxvdyBhcmUKKyAgIG9ubHkgYXZhaWxhYmxlIG9uIFBPU0lYIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgOmZ1bmM6YH5vcy5mb3JrYC4KIAogLi4gY2xhc3M6OiBGb3JraW5nVENQU2VydmVyCiAgICAgICAgICAgIEZvcmtpbmdVRFBTZXJ2ZXIKQEAgLTMwNCw3ICszMDcsMTEgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZSA6bWV0aDpgfkJhc2VSZXF1ZXN0SGFuZGxlci5oYW5kbGVgCiAgICAgICBtZXRob2Qgb2YgYSA6YXR0cjpgUmVxdWVzdEhhbmRsZXJDbGFzc2AgaW5zdGFuY2UgcmFpc2VzCiAgICAgICBhbiBleGNlcHRpb24uICBUaGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gcHJpbnQgdGhlIHRyYWNlYmFjayB0bwotICAgICAgc3RhbmRhcmQgb3V0cHV0IGFuZCBjb250aW51ZSBoYW5kbGluZyBmdXJ0aGVyIHJlcXVlc3RzLgorICAgICAgc3RhbmRhcmQgZXJyb3IgYW5kIGNvbnRpbnVlIGhhbmRsaW5nIGZ1cnRoZXIgcmVxdWVzdHMuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBOb3cgb25seSBjYWxsZWQgZm9yIGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSA6ZXhjOmBFeGNlcHRpb25gCisgICAgICAgICBjbGFzcy4KIAogCiAgICAuLiBtZXRob2Q6OiBoYW5kbGVfdGltZW91dCgpCkBAIC0zNDksNiArMzU2LDExIEBACiAgICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIDpjb25zdDpgVHJ1ZWAuCiAKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1cHBvcnQgZm9yIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbCB3YXMgYWRkZWQuICBFeGl0aW5nIHRoZQorICAgICAgY29udGV4dCBtYW5hZ2VyIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA6bWV0aDpgc2VydmVyX2Nsb3NlYC4KKworCiBSZXF1ZXN0IEhhbmRsZXIgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzk3LDYgKzQwOSwxNSBAQAogICAgcmVhZCBvciB3cml0dGVuLCByZXNwZWN0aXZlbHksIHRvIGdldCB0aGUgcmVxdWVzdCBkYXRhIG9yIHJldHVybiBkYXRhCiAgICB0byB0aGUgY2xpZW50LgogCisgICBUaGUgOmF0dHI6YHJmaWxlYCBhdHRyaWJ1dGVzIG9mIGJvdGggY2xhc3NlcyBzdXBwb3J0IHRoZQorICAgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgcmVhZGFibGUgaW50ZXJmYWNlLCBhbmQKKyAgIDphdHRyOmBEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLndmaWxlYCBzdXBwb3J0cyB0aGUKKyAgIDpjbGFzczpgaW8uQnVmZmVyZWRJT0Jhc2VgIHdyaXRhYmxlIGludGVyZmFjZS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDphdHRyOmBTdHJlYW1SZXF1ZXN0SGFuZGxlci53ZmlsZWAgYWxzbyBzdXBwb3J0cyB0aGUKKyAgICAgIDpjbGFzczpgaW8uQnVmZmVyZWRJT0Jhc2VgIHdyaXRhYmxlIGludGVyZmFjZS4KKwogCiBFeGFtcGxlcwogLS0tLS0tLS0KQEAgLTQyOSwxMSArNDUwLDEwIEBACiAgICAgICAgSE9TVCwgUE9SVCA9ICJsb2NhbGhvc3QiLCA5OTk5CiAKICAgICAgICAjIENyZWF0ZSB0aGUgc2VydmVyLCBiaW5kaW5nIHRvIGxvY2FsaG9zdCBvbiBwb3J0IDk5OTkKLSAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCBQT1JUKSwgTXlUQ1BIYW5kbGVyKQotCi0gICAgICAgIyBBY3RpdmF0ZSB0aGUgc2VydmVyOyB0aGlzIHdpbGwga2VlcCBydW5uaW5nIHVudGlsIHlvdQotICAgICAgICMgaW50ZXJydXB0IHRoZSBwcm9ncmFtIHdpdGggQ3RybC1DCi0gICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgIHdpdGggc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgUE9SVCksIE15VENQSGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgICAgICAjIEFjdGl2YXRlIHRoZSBzZXJ2ZXI7IHRoaXMgd2lsbCBrZWVwIHJ1bm5pbmcgdW50aWwgeW91CisgICAgICAgICAgICMgaW50ZXJydXB0IHRoZSBwcm9ncmFtIHdpdGggQ3RybC1DCisgICAgICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKIAogQW4gYWx0ZXJuYXRpdmUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzIHRoYXQgbWFrZXMgdXNlIG9mIHN0cmVhbXMgKGZpbGUtbGlrZQogb2JqZWN0cyB0aGF0IHNpbXBsaWZ5IGNvbW11bmljYXRpb24gYnkgcHJvdmlkaW5nIHRoZSBzdGFuZGFyZCBmaWxlIGludGVyZmFjZSk6OgpAQCAtNTI1LDggKzU0NSw4IEBACiAKICAgIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgICAgSE9TVCwgUE9SVCA9ICJsb2NhbGhvc3QiLCA5OTk5Ci0gICAgICAgc2VydmVyID0gc29ja2V0c2VydmVyLlVEUFNlcnZlcigoSE9TVCwgUE9SVCksIE15VURQSGFuZGxlcikKLSAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVURQU2VydmVyKChIT1NULCBQT1JUKSwgTXlVRFBIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKIAogVGhpcyBpcyB0aGUgY2xpZW50IHNpZGU6OgogCkBAIC01ODUsMjIgKzYwNSwyMiBAQAogICAgICAgIEhPU1QsIFBPUlQgPSAibG9jYWxob3N0IiwgMAogCiAgICAgICAgc2VydmVyID0gVGhyZWFkZWRUQ1BTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBUaHJlYWRlZFRDUFJlcXVlc3RIYW5kbGVyKQotICAgICAgIGlwLCBwb3J0ID0gc2VydmVyLnNlcnZlcl9hZGRyZXNzCisgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgIGlwLCBwb3J0ID0gc2VydmVyLnNlcnZlcl9hZGRyZXNzCiAKLSAgICAgICAjIFN0YXJ0IGEgdGhyZWFkIHdpdGggdGhlIHNlcnZlciAtLSB0aGF0IHRocmVhZCB3aWxsIHRoZW4gc3RhcnQgb25lCi0gICAgICAgIyBtb3JlIHRocmVhZCBmb3IgZWFjaCByZXF1ZXN0Ci0gICAgICAgc2VydmVyX3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlci5zZXJ2ZV9mb3JldmVyKQotICAgICAgICMgRXhpdCB0aGUgc2VydmVyIHRocmVhZCB3aGVuIHRoZSBtYWluIHRocmVhZCB0ZXJtaW5hdGVzCi0gICAgICAgc2VydmVyX3RocmVhZC5kYWVtb24gPSBUcnVlCi0gICAgICAgc2VydmVyX3RocmVhZC5zdGFydCgpCi0gICAgICAgcHJpbnQoIlNlcnZlciBsb29wIHJ1bm5pbmcgaW4gdGhyZWFkOiIsIHNlcnZlcl90aHJlYWQubmFtZSkKKyAgICAgICAgICAgIyBTdGFydCBhIHRocmVhZCB3aXRoIHRoZSBzZXJ2ZXIgLS0gdGhhdCB0aHJlYWQgd2lsbCB0aGVuIHN0YXJ0IG9uZQorICAgICAgICAgICAjIG1vcmUgdGhyZWFkIGZvciBlYWNoIHJlcXVlc3QKKyAgICAgICAgICAgc2VydmVyX3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlci5zZXJ2ZV9mb3JldmVyKQorICAgICAgICAgICAjIEV4aXQgdGhlIHNlcnZlciB0aHJlYWQgd2hlbiB0aGUgbWFpbiB0aHJlYWQgdGVybWluYXRlcworICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgc2VydmVyX3RocmVhZC5zdGFydCgpCisgICAgICAgICAgIHByaW50KCJTZXJ2ZXIgbG9vcCBydW5uaW5nIGluIHRocmVhZDoiLCBzZXJ2ZXJfdGhyZWFkLm5hbWUpCiAKLSAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAxIikKLSAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAyIikKLSAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAzIikKKyAgICAgICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMSIpCisgICAgICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDIiKQorICAgICAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAzIikKIAotICAgICAgIHNlcnZlci5zaHV0ZG93bigpCi0gICAgICAgc2VydmVyLnNlcnZlcl9jbG9zZSgpCisgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bigpCiAKIAogVGhlIG91dHB1dCBvZiB0aGUgZXhhbXBsZSBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgpAQCAtNjE2LDMgKzYzNiw1IEBACiAKIFRoZSA6Y2xhc3M6YEZvcmtpbmdNaXhJbmAgY2xhc3MgaXMgdXNlZCBpbiB0aGUgc2FtZSB3YXksIGV4Y2VwdCB0aGF0IHRoZSBzZXJ2ZXIKIHdpbGwgc3Bhd24gYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0LgorQXZhaWxhYmxlIG9ubHkgb24gUE9TSVggcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6ZnVuYzpgfm9zLmZvcmtgLgorCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcHdkLnJzdCBiL0RvYy9saWJyYXJ5L3Nwd2QucnN0CmluZGV4IGZkM2M5YWQuLmM2Y2FkMmEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Nwd2QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Nwd2QucnN0CkBAIC01NSw2ICs1NSw5IEBACiAKICAgIFJldHVybiB0aGUgc2hhZG93IHBhc3N3b3JkIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gdXNlciBuYW1lLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUmFpc2VzIGEgOmV4YzpgUGVybWlzc2lvbkVycm9yYCBpbnN0ZWFkIG9mIDpleGM6YEtleUVycm9yYCBpZiB0aGUgdXNlcgorICAgICAgZG9lc24ndCBoYXZlIHByaXZpbGVnZXMuCiAKIC4uIGZ1bmN0aW9uOjogZ2V0c3BhbGwoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcWxpdGUzLnJzdCBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CmluZGV4IDViMjIyYzcuLmM0ZDRkNzggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CkBAIC02MjksOSArNjI5LDE2IEBACiAgICAuLiBhdHRyaWJ1dGU6OiBsYXN0cm93aWQKIAogICAgICAgVGhpcyByZWFkLW9ubHkgYXR0cmlidXRlIHByb3ZpZGVzIHRoZSByb3dpZCBvZiB0aGUgbGFzdCBtb2RpZmllZCByb3cuIEl0IGlzCi0gICAgICBvbmx5IHNldCBpZiB5b3UgaXNzdWVkIGFuIGBgSU5TRVJUYGAgc3RhdGVtZW50IHVzaW5nIHRoZSA6bWV0aDpgZXhlY3V0ZWAKLSAgICAgIG1ldGhvZC4gRm9yIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBgYElOU0VSVGBgIG9yIHdoZW4gOm1ldGg6YGV4ZWN1dGVtYW55YCBpcwotICAgICAgY2FsbGVkLCA6YXR0cjpgbGFzdHJvd2lkYCBpcyBzZXQgdG8gOmNvbnN0OmBOb25lYC4KKyAgICAgIG9ubHkgc2V0IGlmIHlvdSBpc3N1ZWQgYW4gYGBJTlNFUlRgYCBvciBhIGBgUkVQTEFDRWBgIHN0YXRlbWVudCB1c2luZyB0aGUKKyAgICAgIDptZXRoOmBleGVjdXRlYCBtZXRob2QuICBGb3Igb3BlcmF0aW9ucyBvdGhlciB0aGFuIGBgSU5TRVJUYGAgb3IKKyAgICAgIGBgUkVQTEFDRWBgIG9yIHdoZW4gOm1ldGg6YGV4ZWN1dGVtYW55YCBpcyBjYWxsZWQsIDphdHRyOmBsYXN0cm93aWRgIGlzCisgICAgICBzZXQgdG8gOmNvbnN0OmBOb25lYC4KKworICAgICAgSWYgdGhlIGBgSU5TRVJUYGAgb3IgYGBSRVBMQUNFYGAgc3RhdGVtZW50IGZhaWxlZCB0byBpbnNlcnQgdGhlIHByZXZpb3VzCisgICAgICBzdWNjZXNzZnVsIHJvd2lkIGlzIHJldHVybmVkLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGBgUkVQTEFDRWBgIHN0YXRlbWVudC4KIAogICAgLi4gYXR0cmlidXRlOjogZGVzY3JpcHRpb24KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3NsLnJzdCBiL0RvYy9saWJyYXJ5L3NzbC5yc3QKaW5kZXggMDFkODZjOC4uMzcwNmE2ZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3NsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zc2wucnN0CkBAIC00OSw2ICs0OSwxMiBAQAogaGVscHMgbWFuYWdlIHNldHRpbmdzIGFuZCBjZXJ0aWZpY2F0ZXMsIHdoaWNoIGNhbiB0aGVuIGJlIGluaGVyaXRlZAogYnkgU1NMIHNvY2tldHMgY3JlYXRlZCB0aHJvdWdoIHRoZSA6bWV0aDpgU1NMQ29udGV4dC53cmFwX3NvY2tldGAgbWV0aG9kLgogCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorCisgICBPcGVuU1NMIDAuOS44LCAxLjAuMCBhbmQgMS4wLjEgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisgICBJbiB0aGUgZnV0dXJlIHRoZSBzc2wgbW9kdWxlIHdpbGwgcmVxdWlyZSBhdCBsZWFzdCBPcGVuU1NMIDEuMC4yIG9yCisgICAxLjEuMC4KKwogCiBGdW5jdGlvbnMsIENvbnN0YW50cywgYW5kIEV4Y2VwdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjc5LDcgKzI4NSw3IEBACiAKICAgICAgUkM0IHdhcyBkcm9wcGVkIGZyb20gdGhlIGRlZmF1bHQgY2lwaGVyIHN0cmluZy4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUuMworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKIAogICAgICBDaGFDaGEyMC9Qb2x5MTMwNSB3YXMgYWRkZWQgdG8gdGhlIGRlZmF1bHQgY2lwaGVyIHN0cmluZy4KIApAQCAtMzIyLDcgKzMyOCw3IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgT3BlblNTTCBoYXMgZGVwcmVjYXRlZCA6ZnVuYzpgc3NsLlJBTkRfcHNldWRvX2J5dGVzYCwgdXNlCiAgICAgICA6ZnVuYzpgc3NsLlJBTkRfYnl0ZXNgIGluc3RlYWQuCkBAIC01ODcsMTMgKzU5MywxMyBAQAogICAgU2VsZWN0cyB0aGUgaGlnaGVzdCBwcm90b2NvbCB2ZXJzaW9uIHRoYXQgYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydC4KICAgIERlc3BpdGUgdGhlIG5hbWUsIHRoaXMgb3B0aW9uIGNhbiBzZWxlY3QgIlRMUyIgcHJvdG9jb2xzIGFzIHdlbGwgYXMgIlNTTCIuCiAKLSAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNS4zCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogLi4gZGF0YTo6IFBST1RPQ09MX1NTTHYyMwogCiAgICBBbGlhcyBmb3IgZGF0YTpgUFJPVE9DT0xfVExTYC4KIAotICAgLi4gZGVwcmVjYXRlZDo6IDMuNS4zCisgICAuLiBkZXByZWNhdGVkOjogMy42CiAKICAgICAgIFVzZSBkYXRhOmBQUk9UT0NPTF9UTFNgIGluc3RlYWQuCiAKQEAgLTYwOCw3ICs2MTQsNyBAQAogCiAgICAgICBTU0wgdmVyc2lvbiAyIGlzIGluc2VjdXJlLiAgSXRzIHVzZSBpcyBoaWdobHkgZGlzY291cmFnZWQuCiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBPcGVuU1NMIGhhcyByZW1vdmVkIHN1cHBvcnQgZm9yIFNTTHYyLgogCkBAIC02MjMsNyArNjI5LDcgQEAKIAogICAgICAgU1NMIHZlcnNpb24gMyBpcyBpbnNlY3VyZS4gIEl0cyB1c2UgaXMgaGlnaGx5IGRpc2NvdXJhZ2VkLgogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgT3BlblNTTCBoYXMgZGVwcmVjYXRlZCBhbGwgdmVyc2lvbiBzcGVjaWZpYyBwcm90b2NvbHMuIFVzZSB0aGUgZGVmYXVsdAogICAgICAgcHJvdG9jb2wgZGF0YTpgUFJPVE9DT0xfVExTYCB3aXRoIGZsYWdzIGxpa2UgZGF0YTpgT1BfTk9fU1NMdjNgIGluc3RlYWQuCkBAIC02MzIsNyArNjM4LDcgQEAKIAogICAgU2VsZWN0cyBUTFMgdmVyc2lvbiAxLjAgYXMgdGhlIGNoYW5uZWwgZW5jcnlwdGlvbiBwcm90b2NvbC4KIAotICAgLi4gZGVwcmVjYXRlZDo6IDMuNS4zCisgICAuLiBkZXByZWNhdGVkOjogMy42CiAKICAgICAgIE9wZW5TU0wgaGFzIGRlcHJlY2F0ZWQgYWxsIHZlcnNpb24gc3BlY2lmaWMgcHJvdG9jb2xzLiBVc2UgdGhlIGRlZmF1bHQKICAgICAgIHByb3RvY29sIGRhdGE6YFBST1RPQ09MX1RMU2Agd2l0aCBmbGFncyBsaWtlIGRhdGE6YE9QX05PX1NTTHYzYCBpbnN0ZWFkLgpAQCAtNjQ0LDcgKzY1MCw3IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgT3BlblNTTCBoYXMgZGVwcmVjYXRlZCBhbGwgdmVyc2lvbiBzcGVjaWZpYyBwcm90b2NvbHMuIFVzZSB0aGUgZGVmYXVsdAogICAgICAgcHJvdG9jb2wgZGF0YTpgUFJPVE9DT0xfVExTYCB3aXRoIGZsYWdzIGxpa2UgZGF0YTpgT1BfTk9fU1NMdjNgIGluc3RlYWQuCkBAIC02NTcsNyArNjYzLDcgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjUuMworICAgLi4gZGVwcmVjYXRlZDo6IDMuNgogCiAgICAgICBPcGVuU1NMIGhhcyBkZXByZWNhdGVkIGFsbCB2ZXJzaW9uIHNwZWNpZmljIHByb3RvY29scy4gVXNlIHRoZSBkZWZhdWx0CiAgICAgICBwcm90b2NvbCBkYXRhOmBQUk9UT0NPTF9UTFNgIHdpdGggZmxhZ3MgbGlrZSBkYXRhOmBPUF9OT19TU0x2M2AgaW5zdGVhZC4KQEAgLTY3OCw3ICs2ODQsNyBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAotICAgLi4gZGVwcmVjYXRlZDo6IDMuNS4zCisgICAuLiBkZXByZWNhdGVkOjogMy42CiAKICAgICAgIFNTTHYyIGlzIGRlcHJlY2F0ZWQKIApAQCAtNjkxLDcgKzY5Nyw3IEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCi0gICAuLiBkZXByZWNhdGVkOjogMy41LjMKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKIAogICAgICAgU1NMdjMgaXMgZGVwcmVjYXRlZAogCkBAIC0xMTQ5LDcgKzExNTUsNyBAQAogICAgICAgOmZ1bmM6YGNyZWF0ZV9kZWZhdWx0X2NvbnRleHRgIGxldHMgdGhlIDptb2Q6YHNzbGAgbW9kdWxlIGNob29zZQogICAgICAgc2VjdXJpdHkgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gcHVycG9zZS4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUuMworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKIAogICAgICAgOmRhdGE6YFBST1RPQ09MX1RMU2AgaXMgdGhlIGRlZmF1bHQgdmFsdWUuCiAKQEAgLTEyNTksNiArMTI2NSw2MiBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAorLi4gbWV0aG9kOjogU1NMQ29udGV4dC5nZXRfY2lwaGVycygpCisKKyAgIEdldCBhIGxpc3Qgb2YgZW5hYmxlZCBjaXBoZXJzLiBUaGUgbGlzdCBpcyBpbiBvcmRlciBvZiBjaXBoZXIgcHJpb3JpdHkuCisgICBTZWUgOm1ldGg6YFNTTENvbnRleHQuc2V0X2NpcGhlcnNgLgorCisgICBFeGFtcGxlOjoKKworICAgICAgID4+PiBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgID4+PiBjdHguc2V0X2NpcGhlcnMoJ0VDREhFK0FFU0dDTTohRUNEU0EnKQorICAgICAgID4+PiBjdHguZ2V0X2NpcGhlcnMoKSAgIyBPcGVuU1NMIDEuMC54CisgICAgICAgW3snYWxnX2JpdHMnOiAyNTYsCisgICAgICAgICAnZGVzY3JpcHRpb24nOiAnRUNESEUtUlNBLUFFUzI1Ni1HQ00tU0hBMzg0IFRMU3YxLjIgS3g9RUNESCAgICAgQXU9UlNBICAnCisgICAgICAgICAgICAgICAgICAgICAgICAnRW5jPUFFU0dDTSgyNTYpIE1hYz1BRUFEJywKKyAgICAgICAgICdpZCc6IDUwMzgwODQ4LAorICAgICAgICAgJ25hbWUnOiAnRUNESEUtUlNBLUFFUzI1Ni1HQ00tU0hBMzg0JywKKyAgICAgICAgICdwcm90b2NvbCc6ICdUTFN2MS9TU0x2MycsCisgICAgICAgICAnc3RyZW5ndGhfYml0cyc6IDI1Nn0sCisgICAgICAgIHsnYWxnX2JpdHMnOiAxMjgsCisgICAgICAgICAnZGVzY3JpcHRpb24nOiAnRUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2IFRMU3YxLjIgS3g9RUNESCAgICAgQXU9UlNBICAnCisgICAgICAgICAgICAgICAgICAgICAgICAnRW5jPUFFU0dDTSgxMjgpIE1hYz1BRUFEJywKKyAgICAgICAgICdpZCc6IDUwMzgwODQ3LAorICAgICAgICAgJ25hbWUnOiAnRUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2JywKKyAgICAgICAgICdwcm90b2NvbCc6ICdUTFN2MS9TU0x2MycsCisgICAgICAgICAnc3RyZW5ndGhfYml0cyc6IDEyOH1dCisKKyAgIE9uIE9wZW5TU0wgMS4xIGFuZCBuZXdlciB0aGUgY2lwaGVyIGRpY3QgY29udGFpbnMgYWRkaXRpb25hbCBmaWVsZHM6OgorICAgICAgID4+PiBjdHguZ2V0X2NpcGhlcnMoKSAgIyBPcGVuU1NMIDEuMSsKKyAgICAgICBbeydhZWFkJzogVHJ1ZSwKKyAgICAgICAgICdhbGdfYml0cyc6IDI1NiwKKyAgICAgICAgICdhdXRoJzogJ2F1dGgtcnNhJywKKyAgICAgICAgICdkZXNjcmlwdGlvbic6ICdFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQgVExTdjEuMiBLeD1FQ0RIICAgICBBdT1SU0EgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdFbmM9QUVTR0NNKDI1NikgTWFjPUFFQUQnLAorICAgICAgICAgJ2RpZ2VzdCc6IE5vbmUsCisgICAgICAgICAnaWQnOiA1MDM4MDg0OCwKKyAgICAgICAgICdrZWEnOiAna3gtZWNkaGUnLAorICAgICAgICAgJ25hbWUnOiAnRUNESEUtUlNBLUFFUzI1Ni1HQ00tU0hBMzg0JywKKyAgICAgICAgICdwcm90b2NvbCc6ICdUTFN2MS4yJywKKyAgICAgICAgICdzdHJlbmd0aF9iaXRzJzogMjU2LAorICAgICAgICAgJ3N5bW1ldHJpYyc6ICdhZXMtMjU2LWdjbSd9LAorICAgICAgICB7J2FlYWQnOiBUcnVlLAorICAgICAgICAgJ2FsZ19iaXRzJzogMTI4LAorICAgICAgICAgJ2F1dGgnOiAnYXV0aC1yc2EnLAorICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0VDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NiBUTFN2MS4yIEt4PUVDREggICAgIEF1PVJTQSAgJworICAgICAgICAgICAgICAgICAgICAgICAgJ0VuYz1BRVNHQ00oMTI4KSBNYWM9QUVBRCcsCisgICAgICAgICAnZGlnZXN0JzogTm9uZSwKKyAgICAgICAgICdpZCc6IDUwMzgwODQ3LAorICAgICAgICAgJ2tlYSc6ICdreC1lY2RoZScsCisgICAgICAgICAnbmFtZSc6ICdFQ0RIRS1SU0EtQUVTMTI4LUdDTS1TSEEyNTYnLAorICAgICAgICAgJ3Byb3RvY29sJzogJ1RMU3YxLjInLAorICAgICAgICAgJ3N0cmVuZ3RoX2JpdHMnOiAxMjgsCisgICAgICAgICAnc3ltbWV0cmljJzogJ2Flcy0xMjgtZ2NtJ31dCisKKyAgIEF2YWlsYWJpbGl0eTogT3BlblNTTCAxLjAuMisKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIG1ldGhvZDo6IFNTTENvbnRleHQuc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKIAogICAgTG9hZCBhIHNldCBvZiBkZWZhdWx0ICJjZXJ0aWZpY2F0aW9uIGF1dGhvcml0eSIgKENBKSBjZXJ0aWZpY2F0ZXMgZnJvbQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RhdGlzdGljcy5yc3QgYi9Eb2MvbGlicmFyeS9zdGF0aXN0aWNzLnJzdAppbmRleCBlYTNkN2RhLi4yMzJmYjc1MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RhdGlzdGljcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RhdGlzdGljcy5yc3QKQEAgLTM5LDYgKzM5LDggQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogOmZ1bmM6YG1lYW5gICAgICAgICAgICAgIEFyaXRobWV0aWMgbWVhbiAoImF2ZXJhZ2UiKSBvZiBkYXRhLgorOmZ1bmM6YGdlb21ldHJpY19tZWFuYCAgIEdlb21ldHJpYyBtZWFuIG9mIGRhdGEuCis6ZnVuYzpgaGFybW9uaWNfbWVhbmAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLgogOmZ1bmM6YG1lZGlhbmAgICAgICAgICAgIE1lZGlhbiAobWlkZGxlIHZhbHVlKSBvZiBkYXRhLgogOmZ1bmM6YG1lZGlhbl9sb3dgICAgICAgIExvdyBtZWRpYW4gb2YgZGF0YS4KIDpmdW5jOmBtZWRpYW5faGlnaGAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLgpAQCAtMTExLDYgKzExMyw2NiBAQAogICAgICAgYGBtZWFuKGRhdGEpYGAgaXMgZXF1aXZhbGVudCB0byBjYWxjdWxhdGluZyB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gzrwuCiAKIAorLi4gZnVuY3Rpb246OiBnZW9tZXRyaWNfbWVhbihkYXRhKQorCisgICBSZXR1cm4gdGhlIGdlb21ldHJpYyBtZWFuIG9mICpkYXRhKiwgYSBzZXF1ZW5jZSBvciBpdGVyYXRvciBvZgorICAgcmVhbC12YWx1ZWQgbnVtYmVycy4KKworICAgVGhlIGdlb21ldHJpYyBtZWFuIGlzIHRoZSAqbiotdGggcm9vdCBvZiB0aGUgcHJvZHVjdCBvZiAqbiogZGF0YSBwb2ludHMuCisgICBJdCBpcyBhIHR5cGUgb2YgYXZlcmFnZSwgYSBtZWFzdXJlIG9mIHRoZSBjZW50cmFsIGxvY2F0aW9uIG9mIHRoZSBkYXRhLgorCisgICBUaGUgZ2VvbWV0cmljIG1lYW4gaXMgYXBwcm9wcmlhdGUgd2hlbiBhdmVyYWdpbmcgcXVhbnRpdGllcyB3aGljaAorICAgYXJlIG11bHRpcGxpZWQgdG9nZXRoZXIgcmF0aGVyIHRoYW4gYWRkZWQsIGZvciBleGFtcGxlIGdyb3d0aCByYXRlcy4KKyAgIFN1cHBvc2UgYW4gaW52ZXN0bWVudCBncm93cyBieSAxMCUgaW4gdGhlIGZpcnN0IHllYXIsIGZhbGxzIGJ5IDUlIGluCisgICB0aGUgc2Vjb25kLCB0aGVuIGdyb3dzIGJ5IDEyJSBpbiB0aGUgdGhpcmQsIHdoYXQgaXMgdGhlIGF2ZXJhZ2UgcmF0ZQorICAgb2YgZ3Jvd3RoIG92ZXIgdGhlIHRocmVlIHllYXJzPworCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IGdlb21ldHJpY19tZWFuKFsxLjEwLCAwLjk1LCAxLjEyXSkKKyAgICAgIDEuMDUzODQ4MzEyMzM4MjE3MgorCisgICBnaXZpbmcgYW4gYXZlcmFnZSBncm93dGggb2YgNS4zODUlLiBVc2luZyB0aGUgYXJpdGhtZXRpYyBtZWFuIHdpbGwKKyAgIGdpdmUgYXBwcm94aW1hdGVseSA1LjY2NyUsIHdoaWNoIGlzIHRvbyBoaWdoLgorCisgICA6ZXhjOmBTdGF0aXN0aWNzRXJyb3JgIGlzIHJhaXNlZCBpZiAqZGF0YSogaXMgZW1wdHksIG9yIGFueQorICAgZWxlbWVudCBpcyBsZXNzIHRoYW4gemVyby4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gZnVuY3Rpb246OiBoYXJtb25pY19tZWFuKGRhdGEpCisKKyAgIFJldHVybiB0aGUgaGFybW9uaWMgbWVhbiBvZiAqZGF0YSosIGEgc2VxdWVuY2Ugb3IgaXRlcmF0b3Igb2YKKyAgIHJlYWwtdmFsdWVkIG51bWJlcnMuCisKKyAgIFRoZSBoYXJtb25pYyBtZWFuLCBzb21ldGltZXMgY2FsbGVkIHRoZSBzdWJjb250cmFyeSBtZWFuLCBpcyB0aGUKKyAgIHJlY2lwcm9jYWwgb2YgdGhlIGFyaXRobWV0aWMgOmZ1bmM6YG1lYW5gIG9mIHRoZSByZWNpcHJvY2FscyBvZiB0aGUKKyAgIGRhdGEuIEZvciBleGFtcGxlLCB0aGUgaGFybW9uaWMgbWVhbiBvZiB0aHJlZSB2YWx1ZXMgKmEqLCAqYiogYW5kICpjKgorICAgd2lsbCBiZSBlcXVpdmFsZW50IHRvIGBgMy8oMS9hICsgMS9iICsgMS9jKWBgLgorCisgICBUaGUgaGFybW9uaWMgbWVhbiBpcyBhIHR5cGUgb2YgYXZlcmFnZSwgYSBtZWFzdXJlIG9mIHRoZSBjZW50cmFsCisgICBsb2NhdGlvbiBvZiB0aGUgZGF0YS4gIEl0IGlzIG9mdGVuIGFwcHJvcHJpYXRlIHdoZW4gYXZlcmFnaW5nIHF1YW50aXRpZXMKKyAgIHdoaWNoIGFyZSByYXRlcyBvciByYXRpb3MsIGZvciBleGFtcGxlIHNwZWVkcy4gRm9yIGV4YW1wbGU6CisKKyAgIFN1cHBvc2UgYW4gaW52ZXN0b3IgcHVyY2hhc2VzIGFuIGVxdWFsIHZhbHVlIG9mIHNoYXJlcyBpbiBlYWNoIG9mCisgICB0aHJlZSBjb21wYW5pZXMsIHdpdGggUC9FIChwcmljZS9lYXJuaW5nKSByYXRpb3Mgb2YgMi41LCAzIGFuZCAxMC4KKyAgIFdoYXQgaXMgdGhlIGF2ZXJhZ2UgUC9FIHJhdGlvIGZvciB0aGUgaW52ZXN0b3IncyBwb3J0Zm9saW8/CisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gaGFybW9uaWNfbWVhbihbMi41LCAzLCAxMF0pICAjIEZvciBhbiBlcXVhbCBpbnZlc3RtZW50IHBvcnRmb2xpby4KKyAgICAgIDMuNgorCisgICBVc2luZyB0aGUgYXJpdGhtZXRpYyBtZWFuIHdvdWxkIGdpdmUgYW4gYXZlcmFnZSBvZiBhYm91dCA1LjE2Nywgd2hpY2gKKyAgIGlzIHRvbyBoaWdoLgorCisgICA6ZXhjOmBTdGF0aXN0aWNzRXJyb3JgIGlzIHJhaXNlZCBpZiAqZGF0YSogaXMgZW1wdHksIG9yIGFueSBlbGVtZW50CisgICBpcyBsZXNzIHRoYW4gemVyby4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gZnVuY3Rpb246OiBtZWRpYW4oZGF0YSkKIAogICAgUmV0dXJuIHRoZSBtZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgbnVtZXJpYyBkYXRhLCB1c2luZyB0aGUgY29tbW9uICJtZWFuIG9mCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKaW5kZXggMjk5NmVlZi4uMjE0NDIyZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdApAQCAtMTM2Myw2ICsxMzYzLDExIEBACiAgICBUaGUgOmF0dHI6YH5yYW5nZS5zdGFydGAsIDphdHRyOmB+cmFuZ2Uuc3RvcGAgYW5kIDphdHRyOmB+cmFuZ2Uuc3RlcGAKICAgIGF0dHJpYnV0ZXMuCiAKKy4uIHNlZWFsc286OgorCisgICAqIFRoZSBgbGluc3BhY2UgcmVjaXBlIDxodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzkwMDAvPmBfCisgICAgIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgYSBsYXp5IHZlcnNpb24gb2YgcmFuZ2UgdGhhdCBzdWl0YWJsZSBmb3IgZmxvYXRpbmcKKyAgICAgcG9pbnQgYXBwbGljYXRpb25zLgogCiAuLiBpbmRleDo6CiAgICBzaW5nbGU6IHN0cmluZzsgdGV4dCBzZXF1ZW5jZSB0eXBlCkBAIC0xNDUzLDggKzE0NTgsOCBAQAogCiAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYGBzdHJgYCBjbGFzcyBhbmQgaXRzIG1ldGhvZHMsIHNlZQogICAgOnJlZjpgdGV4dHNlcWAgYW5kIHRoZSA6cmVmOmBzdHJpbmctbWV0aG9kc2Agc2VjdGlvbiBiZWxvdy4gIFRvIG91dHB1dAotICAgZm9ybWF0dGVkIHN0cmluZ3MsIHNlZSB0aGUgOnJlZjpgZm9ybWF0c3RyaW5nc2Agc2VjdGlvbi4gIEluIGFkZGl0aW9uLAotICAgc2VlIHRoZSA6cmVmOmBzdHJpbmdzZXJ2aWNlc2Agc2VjdGlvbi4KKyAgIGZvcm1hdHRlZCBzdHJpbmdzLCBzZWUgdGhlIDpyZWY6YGYtc3RyaW5nc2AgYW5kIDpyZWY6YGZvcm1hdHN0cmluZ3NgCisgICBzZWN0aW9ucy4gIEluIGFkZGl0aW9uLCBzZWUgdGhlIDpyZWY6YHN0cmluZ3NlcnZpY2VzYCBzZWN0aW9uLgogCiAKIC4uIGluZGV4OjoKQEAgLTIwNTYsOCArMjA2MSw4IEBACiAuLiBpbmRleDo6CiAgICBzaW5nbGU6IGZvcm1hdHRpbmcsIHN0cmluZyAoJSkKICAgIHNpbmdsZTogaW50ZXJwb2xhdGlvbiwgc3RyaW5nICglKQotICAgc2luZ2xlOiBzdHJpbmc7IGZvcm1hdHRpbmcKLSAgIHNpbmdsZTogc3RyaW5nOyBpbnRlcnBvbGF0aW9uCisgICBzaW5nbGU6IHN0cmluZzsgZm9ybWF0dGluZywgcHJpbnRmCisgICBzaW5nbGU6IHN0cmluZzsgaW50ZXJwb2xhdGlvbiwgcHJpbnRmCiAgICBzaW5nbGU6IHByaW50Zi1zdHlsZSBmb3JtYXR0aW5nCiAgICBzaW5nbGU6IHNwcmludGYtc3R5bGUgZm9ybWF0dGluZwogICAgc2luZ2xlOiAlIGZvcm1hdHRpbmcKQEAgLTIwNjcsOSArMjA3MiwxMCBAQAogCiAgICBUaGUgZm9ybWF0dGluZyBvcGVyYXRpb25zIGRlc2NyaWJlZCBoZXJlIGV4aGliaXQgYSB2YXJpZXR5IG9mIHF1aXJrcyB0aGF0CiAgICBsZWFkIHRvIGEgbnVtYmVyIG9mIGNvbW1vbiBlcnJvcnMgKHN1Y2ggYXMgZmFpbGluZyB0byBkaXNwbGF5IHR1cGxlcyBhbmQKLSAgIGRpY3Rpb25hcmllcyBjb3JyZWN0bHkpLiAgVXNpbmcgdGhlIG5ld2VyIDptZXRoOmBzdHIuZm9ybWF0YCBpbnRlcmZhY2UKLSAgIGhlbHBzIGF2b2lkIHRoZXNlIGVycm9ycywgYW5kIGFsc28gcHJvdmlkZXMgYSBnZW5lcmFsbHkgbW9yZSBwb3dlcmZ1bCwKLSAgIGZsZXhpYmxlIGFuZCBleHRlbnNpYmxlIGFwcHJvYWNoIHRvIGZvcm1hdHRpbmcgdGV4dC4KKyAgIGRpY3Rpb25hcmllcyBjb3JyZWN0bHkpLiAgVXNpbmcgdGhlIG5ld2VyIDpyZWY6YGZvcm1hdHRlZAorICAgc3RyaW5nIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCBvciB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIGludGVyZmFjZQorICAgaGVscHMgYXZvaWQgdGhlc2UgZXJyb3JzLiAgVGhlc2UgYWx0ZXJuYXRpdmVzIGFsc28gcHJvdmlkZSBtb3JlIHBvd2VyZnVsLAorICAgZmxleGlibGUgYW5kIGV4dGVuc2libGUgYXBwcm9hY2hlcyB0byBmb3JtYXR0aW5nIHRleHQuCiAKIFN0cmluZyBvYmplY3RzIGhhdmUgb25lIHVuaXF1ZSBidWlsdC1pbiBvcGVyYXRpb246IHRoZSBgYCVgYCBvcGVyYXRvciAobW9kdWxvKS4KIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc3RyaW5nICpmb3JtYXR0aW5nKiBvciAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuCkBAIC0yNjMwLDggKzI2MzYsOCBAQAogICAgVGhlIHByZWZpeChlcykgdG8gc2VhcmNoIGZvciBtYXkgYmUgYW55IDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAuCiAKIAotLi4gbWV0aG9kOjogYnl0ZXMudHJhbnNsYXRlKHRhYmxlWywgZGVsZXRlXSkKLSAgICAgICAgICAgIGJ5dGVhcnJheS50cmFuc2xhdGUodGFibGVbLCBkZWxldGVdKQorLi4gbWV0aG9kOjogYnl0ZXMudHJhbnNsYXRlKHRhYmxlLCBkZWxldGU9YicnKQorICAgICAgICAgICAgYnl0ZWFycmF5LnRyYW5zbGF0ZSh0YWJsZSwgZGVsZXRlPWInJykKIAogICAgUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgb3IgYnl0ZWFycmF5IG9iamVjdCB3aGVyZSBhbGwgYnl0ZXMgb2NjdXJyaW5nIGluCiAgICB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmRlbGV0ZSogYXJlIHJlbW92ZWQsIGFuZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGhhdmUKQEAgLTI2NDcsNiArMjY1Myw5IEBACiAgICAgICA+Pj4gYidyZWFkIHRoaXMgc2hvcnQgdGV4dCcudHJhbnNsYXRlKE5vbmUsIGInYWVpb3UnKQogICAgICAgYidyZCB0aHMgc2hydCB0eHQnCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAqZGVsZXRlKiBpcyBub3cgc3VwcG9ydGVkIGFzIGEga2V5d29yZCBhcmd1bWVudC4KKwogCiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgb24gYnl0ZXMgYW5kIGJ5dGVhcnJheSBvYmplY3RzIGhhdmUgZGVmYXVsdCBiZWhhdmlvdXJzCiB0aGF0IGFzc3VtZSB0aGUgdXNlIG9mIEFTQ0lJIGNvbXBhdGlibGUgYmluYXJ5IGZvcm1hdHMsIGJ1dCBjYW4gc3RpbGwgYmUgdXNlZApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdCBiL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKaW5kZXggZDVkMjQzMC4uYzQyMWM3MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CkBAIC0xODgsNyArMTg4LDkgQEAKIAogVGhlIDptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QgYW5kIHRoZSA6Y2xhc3M6YEZvcm1hdHRlcmAgY2xhc3Mgc2hhcmUgdGhlIHNhbWUKIHN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIDpjbGFzczpgRm9ybWF0dGVyYCwKLXN1YmNsYXNzZXMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0IHN0cmluZyBzeW50YXgpLgorc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuICBUaGUgc3ludGF4IGlzCityZWxhdGVkIHRvIHRoYXQgb2YgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIGJ1dAordGhlcmUgYXJlIGRpZmZlcmVuY2VzLgogCiBGb3JtYXQgc3RyaW5ncyBjb250YWluICJyZXBsYWNlbWVudCBmaWVsZHMiIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzIGBge31gYC4KIEFueXRoaW5nIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBicmFjZXMgaXMgY29uc2lkZXJlZCBsaXRlcmFsIHRleHQsIHdoaWNoIGlzCkBAIC0yODMsNyArMjg1LDggQEAKIAogIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWQgd2l0aGluIGEKIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkIChzZWUKLTpyZWY6YGZvcm1hdHN0cmluZ3NgKS4gIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbgorOnJlZjpgZm9ybWF0c3RyaW5nc2AgYW5kIDpyZWY6YGYtc3RyaW5nc2ApLgorVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluCiA6ZnVuYzpgZm9ybWF0YCBmdW5jdGlvbi4gIEVhY2ggZm9ybWF0dGFibGUgdHlwZSBtYXkgZGVmaW5lIGhvdyB0aGUgZm9ybWF0CiBzcGVjaWZpY2F0aW9uIGlzIHRvIGJlIGludGVycHJldGVkLgogCkBAIC0zMDgsNyArMzExLDggQEAKIElmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWRlZCBieSBhICpmaWxsKgogY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgaWYgb21pdHRlZC4KIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYSBsaXRlcmFsIGN1cmx5IGJyYWNlICgiYGB7YGAiIG9yICJgYH1gYCIpIGFzCi10aGUgKmZpbGwqIGNoYXJhY3RlciB3aGVuIHVzaW5nIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAKK3RoZSAqZmlsbCogY2hhcmFjdGVyIGluIGEgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsCis8Zi1zdHJpbmdzPmAgb3Igd2hlbiB1c2luZyB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgCiBtZXRob2QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgYSBjdXJseSBicmFjZQogd2l0aCBhIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZC4gIFRoaXMgbGltaXRhdGlvbiBkb2Vzbid0CiBhZmZlY3QgdGhlIDpmdW5jOmBmb3JtYXRgIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RydWN0LnJzdCBiL0RvYy9saWJyYXJ5L3N0cnVjdC5yc3QKaW5kZXggYWUyZTM4Zi4uN2U4NjFmZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RydWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdHJ1Y3QucnN0CkBAIC0yMTYsNiArMjE2LDggQEAKICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKIHwgYGBOYGAgIHwgOmM6dHlwZTpgc2l6ZV90YCAgICAgICAgIHwgaW50ZWdlciAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCBcKDQpICAgICAgIHwKICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKK3wgYGBlYGAgIHwgXCg3KSAgICAgICAgICAgICAgICAgICAgIHwgZmxvYXQgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgfCBcKDUpICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKIHwgYGBmYGAgIHwgOmM6dHlwZTpgZmxvYXRgICAgICAgICAgIHwgZmxvYXQgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgfCBcKDUpICAgICAgIHwKICstLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKIHwgYGBkYGAgIHwgOmM6dHlwZTpgZG91YmxlYCAgICAgICAgIHwgZmxvYXQgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgfCBcKDUpICAgICAgIHwKQEAgLTI1Nyw5ICsyNTksMTAgQEAKICAgIGZpdHMgeW91ciBhcHBsaWNhdGlvbi4KIAogKDUpCi0gICBGb3IgdGhlIGBgJ2YnYGAgYW5kIGBgJ2QnYGAgY29udmVyc2lvbiBjb2RlcywgdGhlIHBhY2tlZCByZXByZXNlbnRhdGlvbiB1c2VzCi0gICB0aGUgSUVFRSA3NTQgYmluYXJ5MzIgKGZvciBgYCdmJ2BgKSBvciBiaW5hcnk2NCAoZm9yIGBgJ2QnYGApIGZvcm1hdCwKLSAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGZsb2F0aW5nLXBvaW50IGZvcm1hdCB1c2VkIGJ5IHRoZSBwbGF0Zm9ybS4KKyAgIEZvciB0aGUgYGAnZidgYCwgYGAnZCdgYCBhbmQgYGAnZSdgYCBjb252ZXJzaW9uIGNvZGVzLCB0aGUgcGFja2VkCisgICByZXByZXNlbnRhdGlvbiB1c2VzIHRoZSBJRUVFIDc1NCBiaW5hcnkzMiwgYmluYXJ5NjQgb3IgYmluYXJ5MTYgZm9ybWF0IChmb3IKKyAgIGBgJ2YnYGAsIGBgJ2QnYGAgb3IgYGAnZSdgYCByZXNwZWN0aXZlbHkpLCByZWdhcmRsZXNzIG9mIHRoZSBmbG9hdGluZy1wb2ludAorICAgZm9ybWF0IHVzZWQgYnkgdGhlIHBsYXRmb3JtLgogCiAoNikKICAgIFRoZSBgYCdQJ2BgIGZvcm1hdCBjaGFyYWN0ZXIgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSBuYXRpdmUgYnl0ZSBvcmRlcmluZwpAQCAtMjY4LDYgKzI3MSwxNiBAQAogICAgb24gdGhlIGhvc3Qgc3lzdGVtLiBUaGUgc3RydWN0IG1vZHVsZSBkb2VzIG5vdCBpbnRlcnByZXQgdGhpcyBhcyBuYXRpdmUKICAgIG9yZGVyaW5nLCBzbyB0aGUgYGAnUCdgYCBmb3JtYXQgaXMgbm90IGF2YWlsYWJsZS4KIAorKDcpCisgICBUaGUgSUVFRSA3NTQgYmluYXJ5MTYgImhhbGYgcHJlY2lzaW9uIiB0eXBlIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSAyMDA4CisgICByZXZpc2lvbiBvZiB0aGUgYElFRUUgNzU0IHN0YW5kYXJkIDxpZWVlIDc1NCBzdGFuZGFyZF8+YF8uIEl0IGhhcyBhIHNpZ24KKyAgIGJpdCwgYSA1LWJpdCBleHBvbmVudCBhbmQgMTEtYml0IHByZWNpc2lvbiAod2l0aCAxMCBiaXRzIGV4cGxpY2l0bHkgc3RvcmVkKSwKKyAgIGFuZCBjYW4gcmVwcmVzZW50IG51bWJlcnMgYmV0d2VlbiBhcHByb3hpbWF0ZWx5IGBgNi4xZS0wNWBgIGFuZCBgYDYuNWUrMDRgYAorICAgYXQgZnVsbCBwcmVjaXNpb24uIFRoaXMgdHlwZSBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBieSBDIGNvbXBpbGVyczogb24gYQorICAgdHlwaWNhbCBtYWNoaW5lLCBhbiB1bnNpZ25lZCBzaG9ydCBjYW4gYmUgdXNlZCBmb3Igc3RvcmFnZSwgYnV0IG5vdCBmb3IgbWF0aAorICAgb3BlcmF0aW9ucy4gU2VlIHRoZSBXaWtpcGVkaWEgcGFnZSBvbiB0aGUgYGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50CisgICBmb3JtYXQgPGhhbGYgcHJlY2lzaW9uIGZvcm1hdF8+YF8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKIAogQSBmb3JtYXQgY2hhcmFjdGVyIG1heSBiZSBwcmVjZWRlZCBieSBhbiBpbnRlZ3JhbCByZXBlYXQgY291bnQuICBGb3IgZXhhbXBsZSwKIHRoZSBmb3JtYXQgc3RyaW5nIGBgJzRoJ2BgIG1lYW5zIGV4YWN0bHkgdGhlIHNhbWUgYXMgYGAnaGhoaCdgYC4KQEAgLTQzMCwzICs0NDMsNyBAQAogICAgICAgVGhlIGNhbGN1bGF0ZWQgc2l6ZSBvZiB0aGUgc3RydWN0IChhbmQgaGVuY2Ugb2YgdGhlIGJ5dGVzIG9iamVjdCBwcm9kdWNlZAogICAgICAgYnkgdGhlIDptZXRoOmBwYWNrYCBtZXRob2QpIGNvcnJlc3BvbmRpbmcgdG8gOmF0dHI6YGZvcm1hdGAuCiAKKworLi4gX2hhbGYgcHJlY2lzaW9uIGZvcm1hdDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFsZi1wcmVjaXNpb25fZmxvYXRpbmctcG9pbnRfZm9ybWF0CisKKy4uIF9pZWVlIDc1NCBzdGFuZGFyZDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV9mbG9hdGluZ19wb2ludCNJRUVFXzc1NC0yMDA4CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdWJwcm9jZXNzLnJzdCBiL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0CmluZGV4IDM1NjYwNWYuLmFiMjA4ODkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0CkBAIC01MDIsNiArNTAyLDEwIEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQWRkZWQgY29udGV4dCBtYW5hZ2VyIHN1cHBvcnQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBQb3BlbiBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZyBpZiB0aGUgY2hpbGQKKyAgICAgIHByb2Nlc3MgaXMgc3RpbGwgcnVubmluZy4KKwogCiBFeGNlcHRpb25zCiBeXl5eXl5eXl5eCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zeXMucnN0IGIvRG9jL2xpYnJhcnkvc3lzLnJzdAppbmRleCBlZDVkYjA1Li44YzljYTJhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zeXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N5cy5yc3QKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgKGRlZmF1bHRpbmcgdG8gemVybyksIG9yIGFub3RoZXIgdHlwZSBvZiBvYmplY3QuICBJZiBpdCBpcyBhbiBpbnRlZ2VyLCB6ZXJvCiAgICBpcyBjb25zaWRlcmVkICJzdWNjZXNzZnVsIHRlcm1pbmF0aW9uIiBhbmQgYW55IG5vbnplcm8gdmFsdWUgaXMgY29uc2lkZXJlZAogICAgImFibm9ybWFsIHRlcm1pbmF0aW9uIiBieSBzaGVsbHMgYW5kIHRoZSBsaWtlLiAgTW9zdCBzeXN0ZW1zIHJlcXVpcmUgaXQgdG8gYmUKLSAgIGluIHRoZSByYW5nZSAwLTEyNywgYW5kIHByb2R1Y2UgdW5kZWZpbmVkIHJlc3VsdHMgb3RoZXJ3aXNlLiAgU29tZSBzeXN0ZW1zCisgICBpbiB0aGUgcmFuZ2UgMC0tMTI3LCBhbmQgcHJvZHVjZSB1bmRlZmluZWQgcmVzdWx0cyBvdGhlcndpc2UuICBTb21lIHN5c3RlbXMKICAgIGhhdmUgYSBjb252ZW50aW9uIGZvciBhc3NpZ25pbmcgc3BlY2lmaWMgbWVhbmluZ3MgdG8gc3BlY2lmaWMgZXhpdCBjb2RlcywgYnV0CiAgICB0aGVzZSBhcmUgZ2VuZXJhbGx5IHVuZGVyZGV2ZWxvcGVkOyBVbml4IHByb2dyYW1zIGdlbmVyYWxseSB1c2UgMiBmb3IgY29tbWFuZAogICAgbGluZSBzeW50YXggZXJyb3JzIGFuZCAxIGZvciBhbGwgb3RoZXIga2luZCBvZiBlcnJvcnMuICBJZiBhbm90aGVyIHR5cGUgb2YKQEAgLTI2OSw2ICsyNjksMTEgQEAKICAgIHRoZSBwcm9jZXNzIHdoZW4gY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBub3QKICAgIGludGVyY2VwdGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjbGVhbnVwIGFmdGVyIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKyAgICAgIGhhcyBjYXVnaHQgOmV4YzpgU3lzdGVtRXhpdGAgKHN1Y2ggYXMgYW4gZXJyb3IgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YQorICAgICAgaW4gdGhlIHN0YW5kYXJkIHN0cmVhbXMpLCB0aGUgZXhpdCBzdGF0dXMgaXMgY2hhbmdlZCB0byAxMjAuCisKIAogLi4gZGF0YTo6IGZsYWdzCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QgYi9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CmluZGV4IDZiYTA5NGQuLjI5MTc3YTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdApAQCAtMTY0LDcgKzE2NCw3IEBACiAuLiBmdW5jdGlvbjo6IGdldF9weXRob25fdmVyc2lvbigpCiAKICAgIFJldHVybiB0aGUgYGBNQUpPUi5NSU5PUmBgIFB5dGhvbiB2ZXJzaW9uIG51bWJlciBhcyBhIHN0cmluZy4gIFNpbWlsYXIgdG8KLSAgIGBgc3lzLnZlcnNpb25bOjNdYGAuCisgICBgYCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXWBgLgogCiAKIC4uIGZ1bmN0aW9uOjogZ2V0X3BsYXRmb3JtKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QgYi9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CmluZGV4IGI5NTBlNDEuLmY5YzUxNTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdApAQCAtNDMsNiArNDMsMTcgQEAKICAgIDpleGM6YEVPRkVycm9yYCB3aGVuIHRoZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZCwgYmVjYXVzZSB0aGV5IGNhbiByZXR1cm4KICAgIGFuIGVtcHR5IHN0cmluZyBmb3Igb3RoZXIgcmVhc29ucy4gIFNlZSB0aGUgaW5kaXZpZHVhbCBkZXNjcmlwdGlvbnMgYmVsb3cuCiAKKyAgIEEgOmNsYXNzOmBUZWxuZXRgIG9iamVjdCBpcyBhIGNvbnRleHQgbWFuYWdlciBhbmQgY2FuIGJlIHVzZWQgaW4gYQorICAgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudC4gIFdoZW4gdGhlIDprZXl3b3JkOmB3aXRoYCBibG9jayBlbmRzLCB0aGUKKyAgIDptZXRoOmBjbG9zZWAgbWV0aG9kIGlzIGNhbGxlZDo6CisKKyAgICAgICA+Pj4gZnJvbSB0ZWxuZXRsaWIgaW1wb3J0IFRlbG5ldAorICAgICAgID4+PiB3aXRoIFRlbG5ldCgnbG9jYWxob3N0JywgMjMpIGFzIHRuOgorICAgICAgIC4uLiAgICAgdG4uaW50ZXJhY3QoKQorICAgICAgIC4uLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNiBDb250ZXh0IG1hbmFnZXIgc3VwcG9ydCBhZGRlZAorCiAKIC4uIHNlZWFsc286OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZXN0LnJzdCBiL0RvYy9saWJyYXJ5L3Rlc3QucnN0CmluZGV4IDJlYTljMjcuLjcxMTRjZGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Rlc3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Rlc3QucnN0CkBAIC01ODIsNiArNTgyLDQ4IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAogCisuLiBmdW5jdGlvbjo6IGNoZWNrX19hbGxfXyh0ZXN0X2Nhc2UsIG1vZHVsZSwgbmFtZV9vZl9tb2R1bGU9Tm9uZSwgZXh0cmE9KCksIGJsYWNrbGlzdD0oKSkKKworICAgQXNzZXJ0IHRoYXQgdGhlIGBgX19hbGxfX2BgIHZhcmlhYmxlIG9mICptb2R1bGUqIGNvbnRhaW5zIGFsbCBwdWJsaWMgbmFtZXMuCisKKyAgIFRoZSBtb2R1bGUncyBwdWJsaWMgbmFtZXMgKGl0cyBBUEkpIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5CisgICBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgbWF0Y2ggdGhlIHB1YmxpYyBuYW1lIGNvbnZlbnRpb24gYW5kIHdlcmUgZGVmaW5lZCBpbgorICAgKm1vZHVsZSouCisKKyAgIFRoZSAqbmFtZV9vZl9tb2R1bGUqIGFyZ3VtZW50IGNhbiBzcGVjaWZ5IChhcyBhIHN0cmluZyBvciB0dXBsZSB0aGVyZW9mKSB3aGF0CisgICBtb2R1bGUocykgYW4gQVBJIGNvdWxkIGJlIGRlZmluZWQgaW4gaW4gb3JkZXIgdG8gYmUgZGV0ZWN0ZWQgYXMgYSBwdWJsaWMKKyAgIEFQSS4gT25lIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiAqbW9kdWxlKiBpbXBvcnRzIHBhcnQgb2YgaXRzIHB1YmxpYyBBUEkgZnJvbQorICAgb3RoZXIgbW9kdWxlcywgcG9zc2libHkgYSBDIGJhY2tlbmQgKGxpa2UgYGBjc3ZgYCBhbmQgaXRzIGBgX2NzdmBgKS4KKworICAgVGhlICpleHRyYSogYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgd291bGRuJ3Qgb3RoZXJ3aXNlIGJlIGF1dG9tYXRpY2FsbHkKKyAgIGRldGVjdGVkIGFzICJwdWJsaWMiLCBsaWtlIG9iamVjdHMgd2l0aG91dCBhIHByb3BlciBgYF9fbW9kdWxlX19gYAorICAgYXR0cmlidXRlLiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBvbmVzLgorCisgICBUaGUgKmJsYWNrbGlzdCogYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgbXVzdCBub3QgYmUgdHJlYXRlZCBhcyBwYXJ0IG9mCisgICB0aGUgcHVibGljIEFQSSBldmVuIHRob3VnaCB0aGVpciBuYW1lcyBpbmRpY2F0ZSBvdGhlcndpc2UuCisKKyAgIEV4YW1wbGUgdXNlOjoKKworICAgICAgaW1wb3J0IGJhcgorICAgICAgaW1wb3J0IGZvbworICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworICAgICAgY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZvbykKKworICAgICAgY2xhc3MgT3RoZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICBleHRyYSA9IHsnQkFSX0NPTlNUJywgJ0ZPT19DT05TVCd9CisgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IHsnYmF6J30gICMgVW5kb2N1bWVudGVkIG5hbWUuCisgICAgICAgICAgICAgICMgYmFyIGltcG9ydHMgcGFydCBvZiBpdHMgQVBJIGZyb20gX2Jhci4KKyAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgYmFyLCAoJ2JhcicsICdfYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBUaGUgOm1vZDpgdGVzdC5zdXBwb3J0YCBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CiAKIC4uIGNsYXNzOjogVHJhbnNpZW50UmVzb3VyY2UoZXhjLCAqKmt3YXJncykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RpbWUucnN0IGIvRG9jL2xpYnJhcnkvdGltZS5yc3QKaW5kZXggZTY2MjZmMi4uN2M4MWNlNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGltZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGltZS5yc3QKQEAgLTYzNywxMSArNjM3LDExIEBACiAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byByZWZlciB0byBGZWJydWFyeSAyOS4KIAogICAgICAgOnNhbXA6YE17bX0ue259LntkfWAKLSAgICAgICAgIFRoZSAqZCondGggZGF5ICgwIDw9ICpkKiA8PSA2KSBvciB3ZWVrICpuKiBvZiBtb250aCAqbSogb2YgdGhlIHllYXIgKDEKKyAgICAgICAgIFRoZSAqZCondGggZGF5ICgwIDw9ICpkKiA8PSA2KSBvZiB3ZWVrICpuKiBvZiBtb250aCAqbSogb2YgdGhlIHllYXIgKDEKICAgICAgICAgIDw9ICpuKiA8PSA1LCAxIDw9ICptKiA8PSAxMiwgd2hlcmUgd2VlayA1IG1lYW5zICJ0aGUgbGFzdCAqZCogZGF5IGluCiAgICAgICAgICBtb250aCAqbSoiIHdoaWNoIG1heSBvY2N1ciBpbiBlaXRoZXIgdGhlIGZvdXJ0aCBvciB0aGUgZmlmdGgKICAgICAgICAgIHdlZWspLiBXZWVrIDEgaXMgdGhlIGZpcnN0IHdlZWsgaW4gd2hpY2ggdGhlICpkKid0aCBkYXkgb2NjdXJzLiBEYXkKLSAgICAgICAgIHplcm8gaXMgU3VuZGF5LgorICAgICAgICAgemVybyBpcyBhIFN1bmRheS4KIAogICAgICAgYGB0aW1lYGAgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBgYG9mZnNldGBgIGV4Y2VwdCB0aGF0IG5vIGxlYWRpbmcgc2lnbgogICAgICAgKCctJyBvciAnKycpIGlzIGFsbG93ZWQuIFRoZSBkZWZhdWx0LCBpZiB0aW1lIGlzIG5vdCBnaXZlbiwgaXMgMDI6MDA6MDAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90aW1laXQucnN0IGIvRG9jL2xpYnJhcnkvdGltZWl0LnJzdAppbmRleCA1N2E0ODM0Li41YmFlMzNiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90aW1laXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RpbWVpdC5yc3QKQEAgLTEwMCw4ICsxMDAsOCBAQAogICAgY2FuIGJlIGNvbnRyb2xsZWQgYnkgcGFzc2luZyBhIG5hbWVzcGFjZSB0byAqZ2xvYmFscyouCiAKICAgIFRvIG1lYXN1cmUgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBzdGF0ZW1lbnQsIHVzZSB0aGUgOm1ldGg6YC50aW1laXRgCi0gICBtZXRob2QuICBUaGUgOm1ldGg6YC5yZXBlYXRgIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRvIGNhbGwgOm1ldGg6YC50aW1laXRgCi0gICBtdWx0aXBsZSB0aW1lcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZXN1bHRzLgorICAgbWV0aG9kLiAgVGhlIDptZXRoOmAucmVwZWF0YCBhbmQgOm1ldGg6YC5hdXRvcmFuZ2VgIG1ldGhvZHMgYXJlIGNvbnZlbmllbmNlCisgICBtZXRob2RzIHRvIGNhbGwgOm1ldGg6YC50aW1laXRgIG11bHRpcGxlIHRpbWVzLgogCiAgICBUaGUgZXhlY3V0aW9uIHRpbWUgb2YgKnNldHVwKiBpcyBleGNsdWRlZCBmcm9tIHRoZSBvdmVyYWxsIHRpbWVkIGV4ZWN1dGlvbiBydW4uCiAKQEAgLTEzNCw2ICsxMzQsMjMgQEAKICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignZm9yIGkgaW4gcmFuZ2UoMTApOiBvY3QoaSknLCAnZ2MuZW5hYmxlKCknKS50aW1laXQoKQogCiAKKyAgICAuLiBtZXRob2Q6OiBUaW1lci5hdXRvcmFuZ2UoY2FsbGJhY2s9Tm9uZSkKKworICAgICAgIEF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGhvdyBtYW55IHRpbWVzIHRvIGNhbGwgOm1ldGg6YC50aW1laXRgLgorCisgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgOm1ldGg6YC50aW1laXRgIHJlcGVhdGVkbHkKKyAgICAgICBzbyB0aGF0IHRoZSB0b3RhbCB0aW1lID49IDAuMiBzZWNvbmQsIHJldHVybmluZyB0aGUgZXZlbnR1YWwKKyAgICAgICAobnVtYmVyIG9mIGxvb3BzLCB0aW1lIHRha2VuIGZvciB0aGF0IG51bWJlciBvZiBsb29wcykuIEl0IGNhbGxzCisgICAgICAgOm1ldGg6YC50aW1laXRgIHdpdGggKm51bWJlciogc2V0IHRvIHN1Y2Nlc3NpdmUgcG93ZXJzIG9mIHRlbiAoMTAsCisgICAgICAgMTAwLCAxMDAwLCAuLi4pIHVwIHRvIGEgbWF4aW11bSBvZiBvbmUgYmlsbGlvbiwgdW50aWwgdGhlIHRpbWUgdGFrZW4KKyAgICAgICBpcyBhdCBsZWFzdCAwLjIgc2Vjb25kLCBvciB0aGUgbWF4aW11bSBpcyByZWFjaGVkLgorCisgICAgICAgIElmICpjYWxsYmFjayogaXMgZ2l2ZW4gYW5kIGlzIG5vdCAqTm9uZSosIGl0IHdpbGwgYmUgY2FsbGVkIGFmdGVyCisgICAgICAgIGVhY2ggdHJpYWwgd2l0aCB0d28gYXJndW1lbnRzOiBgYGNhbGxiYWNrKG51bWJlciwgdGltZV90YWtlbilgYC4KKworICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAgICAuLiBtZXRob2Q6OiBUaW1lci5yZXBlYXQocmVwZWF0PTMsIG51bWJlcj0xMDAwMDAwKQogCiAgICAgICBDYWxsIDptZXRoOmAudGltZWl0YCBhIGZldyB0aW1lcy4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RraW50ZXIudGl4LnJzdCBiL0RvYy9saWJyYXJ5L3RraW50ZXIudGl4LnJzdAppbmRleCA0MWYyMGRkLi4xMWVkNzU1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90a2ludGVyLnRpeC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGtpbnRlci50aXgucnN0CkBAIC0xMCw2ICsxMCwxMCBAQAogCiAuLiBpbmRleDo6IHNpbmdsZTogVGl4CiAKKy4uIGRlcHJlY2F0ZWQ6OiAzLjYKKyAgIFRoaXMgVGsgZXh0ZW5zaW9uIGlzIHVubWFpbnRhaW5lZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLiAgVXNlCisgICA6bW9kOmB0a2ludGVyLnR0a2AgaW5zdGVhZC4KKwogLS0tLS0tLS0tLS0tLS0KIAogVGhlIDptb2Q6YHRraW50ZXIudGl4YCAoVGsgSW50ZXJmYWNlIEV4dGVuc2lvbikgbW9kdWxlIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RyYWNlYmFjay5yc3QgYi9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0CmluZGV4IDNjMWQ5YmIuLjA2NmVlOTYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RyYWNlYmFjay5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHJhY2ViYWNrLnJzdApAQCAtMjkxLDYgKzI5MSwyMCBAQAogICAgICAgb2YgdHVwbGVzLiBFYWNoIHR1cGxlIHNob3VsZCBiZSBhIDQtdHVwbGUgd2l0aCBmaWxlbmFtZSwgbGluZW5vLCBuYW1lLAogICAgICAgbGluZSBhcyB0aGUgZWxlbWVudHMuCiAKKyAgIC4uIG1ldGhvZDo6IGZvcm1hdCgpCisKKyAgICAgIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MgcmVhZHkgZm9yIHByaW50aW5nLiAgRWFjaCBzdHJpbmcgaW4gdGhlCisgICAgICByZXN1bHRpbmcgbGlzdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBmcmFtZSBmcm9tIHRoZSBzdGFjay4KKyAgICAgIEVhY2ggc3RyaW5nIGVuZHMgaW4gYSBuZXdsaW5lOyB0aGUgc3RyaW5ncyBtYXkgY29udGFpbiBpbnRlcm5hbAorICAgICAgbmV3bGluZXMgYXMgd2VsbCwgZm9yIHRob3NlIGl0ZW1zIHdpdGggc291cmNlIHRleHQgbGluZXMuCisKKyAgICAgIEZvciBsb25nIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBmcmFtZSBhbmQgbGluZSwgdGhlIGZpcnN0IGZldworICAgICAgcmVwZXRpdGlvbnMgYXJlIHNob3duLCBmb2xsb3dlZCBieSBhIHN1bW1hcnkgbGluZSBzdGF0aW5nIHRoZSBleGFjdAorICAgICAgbnVtYmVyIG9mIGZ1cnRoZXIgcmVwZXRpdGlvbnMuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBMb25nIHNlcXVlbmNlcyBvZiByZXBlYXRlZCBmcmFtZXMgYXJlIG5vdyBhYmJyZXZpYXRlZC4KKwogCiA6Y2xhc3M6YEZyYW1lU3VtbWFyeWAgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdCBiL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdAppbmRleCAzYTBiMWUwLi5mNTZmMjdiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0CkBAIC0zNTksMTAgKzM1OSwzMiBAQAogICAgU2VlIGFsc28gdGhlIDpmdW5jOmBnZXRfb2JqZWN0X3RyYWNlYmFja2AgZnVuY3Rpb24uCiAKIAorRG9tYWluRmlsdGVyCiteXl5eXl5eXl5eXl4KKworLi4gY2xhc3M6OiBEb21haW5GaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBkb21haW46IGludCkKKworICAgRmlsdGVyIHRyYWNlcyBvZiBtZW1vcnkgYmxvY2tzIGJ5IHRoZWlyIGFkZHJlc3Mgc3BhY2UgKGRvbWFpbikuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKKworICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBtYXRjaCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgRmFsc2VgYCAoZXhjbHVkZSksIG1hdGNoIG1lbW9yeSBibG9ja3Mgbm90IGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGRvbWFpbgorCisgICAgICBBZGRyZXNzIHNwYWNlIG9mIGEgbWVtb3J5IGJsb2NrIChgYGludGBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgorCisKIEZpbHRlcgogXl5eXl5eCiAKLS4uIGNsYXNzOjogRmlsdGVyKGluY2x1c2l2ZTogYm9vbCwgZmlsZW5hbWVfcGF0dGVybjogc3RyLCBsaW5lbm86IGludD1Ob25lLCBhbGxfZnJhbWVzOiBib29sPUZhbHNlKQorLi4gY2xhc3M6OiBGaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBmaWxlbmFtZV9wYXR0ZXJuOiBzdHIsIGxpbmVubzogaW50PU5vbmUsIGFsbF9mcmFtZXM6IGJvb2w9RmFsc2UsIGRvbWFpbjogaW50PU5vbmUpCiAKICAgIEZpbHRlciBvbiB0cmFjZXMgb2YgbWVtb3J5IGJsb2Nrcy4KIApAQCAtMzgyLDkgKzQwNCwxNyBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIFRoZSBgYCcucHlvJ2BgIGZpbGUgZXh0ZW5zaW9uIGlzIG5vIGxvbmdlciByZXBsYWNlZCB3aXRoIGBgJy5weSdgYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSA6YXR0cjpgZG9tYWluYCBhdHRyaWJ1dGUuCisKKworICAgLi4gYXR0cmlidXRlOjogZG9tYWluCisKKyAgICAgIEFkZHJlc3Mgc3BhY2Ugb2YgYSBtZW1vcnkgYmxvY2sgKGBgaW50YGAgb3IgYGBOb25lYGApLgorCiAgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKIAotICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBvbmx5IHRyYWNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYFRydWVgYCAoaW5jbHVkZSksIG9ubHkgbWF0Y2ggbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQKICAgICAgIGluIGEgZmlsZSB3aXRoIGEgbmFtZSBtYXRjaGluZyA6YXR0cjpgZmlsZW5hbWVfcGF0dGVybmAgYXQgbGluZSBudW1iZXIKICAgICAgIDphdHRyOmBsaW5lbm9gLgogCkBAIC0zOTksNyArNDI5LDcgQEAKIAogICAgLi4gYXR0cmlidXRlOjogZmlsZW5hbWVfcGF0dGVybgogCi0gICAgICBGaWxlbmFtZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgKGBgc3RyYGApLgorICAgICAgRmlsZW5hbWUgcGF0dGVybiBvZiB0aGUgZmlsdGVyIChgYHN0cmBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgogCiAgICAuLiBhdHRyaWJ1dGU6OiBhbGxfZnJhbWVzCiAKQEAgLTQ2MiwxNCArNDkyLDE3IEBACiAgICAuLiBtZXRob2Q6OiBmaWx0ZXJfdHJhY2VzKGZpbHRlcnMpCiAKICAgICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgOmF0dHI6YHRyYWNlc2AKLSAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyoKLSAgICAgIGlzIGFuIGVtcHR5IGxpc3QsIHJldHVybiBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZgotICAgICAgdGhlIHRyYWNlcy4KKyAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRG9tYWluRmlsdGVyYCBhbmQKKyAgICAgIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyogaXMgYW4gZW1wdHkgbGlzdCwgcmV0dXJuIGEgbmV3CisgICAgICA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZiB0aGUgdHJhY2VzLgogCiAgICAgICBBbGwgaW5jbHVzaXZlIGZpbHRlcnMgYXJlIGFwcGxpZWQgYXQgb25jZSwgYSB0cmFjZSBpcyBpZ25vcmVkIGlmIG5vCiAgICAgICBpbmNsdXNpdmUgZmlsdGVycyBtYXRjaCBpdC4gQSB0cmFjZSBpcyBpZ25vcmVkIGlmIGF0IGxlYXN0IG9uZSBleGNsdXNpdmUKICAgICAgIGZpbHRlciBtYXRjaGVzIGl0LgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgOmNsYXNzOmBEb21haW5GaWx0ZXJgIGluc3RhbmNlcyBhcmUgbm93IGFsc28gYWNjZXB0ZWQgaW4gKmZpbHRlcnMqLgorCiAKICAgIC4uIGNsYXNzbWV0aG9kOjogbG9hZChmaWxlbmFtZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHlwZXMucnN0IGIvRG9jL2xpYnJhcnkvdHlwZXMucnN0CmluZGV4IDExOGJjNGMuLjVlYjg0YzEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3R5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS90eXBlcy5yc3QKQEAgLTUzLDggKzUzLDIwIEBACiAgICBpbiAqa3dkcyogYXJndW1lbnQgd2l0aCBhbnkgYGAnbWV0YWNsYXNzJ2BgIGVudHJ5IHJlbW92ZWQuIElmIG5vICprd2RzKgogICAgYXJndW1lbnQgaXMgcGFzc2VkIGluLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgZGljdC4KIAorICAgLi4gaW1wbC1kZXRhaWw6OgorCisgICAgICBDUHl0aG9uIHVzZXMgOmNsYXNzOmBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdGAgZm9yIHRoZSBkZWZhdWx0CisgICAgICBuYW1lc3BhY2UuCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGBgbmFtZXNwYWNlYGAgZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQKKyAgICAgIHR1cGxlIGhhcyBjaGFuZ2VkIGZyb20gOmZ1bmM6YGRpY3RgLiAgTm93IGFuIGluc2VydGlvbi1vcmRlci0KKyAgICAgIHByZXNlcnZpbmcgbWFwcGluZyBpcyB1c2VkIHdoZW4gdGhlIG1ldGFjbGFzcyBkb2VzIG5vdCBoYXZlIGEKKyAgICAgIGBgX19wcmVwYXJlX19gYCBtZXRob2QsCisKIC4uIHNlZWFsc286OgogCiAgICA6cmVmOmBtZXRhY2xhc3Nlc2AKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QgYi9Eb2MvbGlicmFyeS90eXBpbmcucnN0CmluZGV4IGJjNzFlMWUuLmQ5MDJhMTUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdApAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCiAKICAgICAgICBkZWYgbG9nKHNlbGYsIG1lc3NhZ2U6IHN0cikgLT4gTm9uZToKLSAgICAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygne306IHt9Jy5mb3JtYXQoc2VsZi5uYW1lLCBtZXNzYWdlKSkKKyAgICAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygnJXM6ICVzJywgc2VsZi5uYW1lLCBtZXNzYWdlKQogCiBgYEdlbmVyaWNbVF1gYCBhcyBhIGJhc2UgY2xhc3MgZGVmaW5lcyB0aGF0IHRoZSBjbGFzcyBgYExvZ2dlZFZhcmBgIHRha2VzIGEKIHNpbmdsZSB0eXBlIHBhcmFtZXRlciBgYFRgYCAuIFRoaXMgYWxzbyBtYWtlcyBgYFRgYCB2YWxpZCBhcyBhIHR5cGUgd2l0aGluIHRoZQpAQCAtNTA0LDExICs1MDQsMTUgQEAKIAogLi4gY2xhc3M6OiBJdGVyYWJsZShHZW5lcmljW1RfY29dKQogCi0gICAgQSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlYC4KKyAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZWAuCiAKIC4uIGNsYXNzOjogSXRlcmF0b3IoSXRlcmFibGVbVF9jb10pCiAKLSAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JgLgorICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yYC4KKworLi4gY2xhc3M6OiBSZXZlcnNpYmxlKEl0ZXJhYmxlW1RfY29dKQorCisgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuUmV2ZXJzaWJsZWAuCiAKIC4uIGNsYXNzOjogU3VwcG9ydHNJbnQKIApAQCAtNTI4LDExICs1MzIsNiBAQAogICAgIEFuIEFCQyB3aXRoIG9uZSBhYnN0cmFjdCBtZXRob2QgYGBfX3JvdW5kX19gYAogICAgIHRoYXQgaXMgY292YXJpYW50IGluIGl0cyByZXR1cm4gdHlwZS4KIAotLi4gY2xhc3M6OiBSZXZlcnNpYmxlCi0KLSAgICBBbiBBQkMgd2l0aCBvbmUgYWJzdHJhY3QgbWV0aG9kIGBgX19yZXZlcnNlZF9fYGAgcmV0dXJuaW5nCi0gICAgYW4gYGBJdGVyYXRvcltUX2NvXWBgLgotCiAuLiBjbGFzczo6IENvbnRhaW5lcihHZW5lcmljW1RfY29dKQogCiAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyYC4KQEAgLTU1Myw3ICs1NTIsNyBAQAogCiAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmdgLgogCi0uLiBjbGFzczo6IFNlcXVlbmNlKFNpemVkLCBJdGVyYWJsZVtUX2NvXSwgQ29udGFpbmVyW1RfY29dKQorLi4gY2xhc3M6OiBTZXF1ZW5jZShTaXplZCwgUmV2ZXJzaWJsZVtUX2NvXSwgQ29udGFpbmVyW1RfY29dKQogCiAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2VgLgogCkBAIC02MDgsNiArNjA3LDEyIEBACiAKICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLlZhbHVlc1ZpZXdgLgogCisuLiBjbGFzczo6IENvbnRleHRNYW5hZ2VyKEdlbmVyaWNbVF9jb10pCisKKyAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIGNsYXNzOjogRGljdChkaWN0LCBNdXRhYmxlTWFwcGluZ1tLVCwgVlRdKQogCiAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGRpY3RgLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5kb2MucnN0IGIvRG9jL2xpYnJhcnkvdW5kb2MucnN0CmluZGV4IDIwODMwZTIuLjI0NDQwODAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuZG9jLnJzdAorKysgYi9Eb2MvbGlicmFyeS91bmRvYy5yc3QKQEAgLTIwLDcgKzIwLDcgQEAKIGRvY3VtZW50ZWQgYmV5b25kIHRoaXMgbWVudGlvbi4gIFRoZXJlJ3MgbGl0dGxlIG5lZWQgdG8gZG9jdW1lbnQgdGhlc2UuCiAKIDptb2Q6YG50cGF0aGAKLSAgIC0tLSBJbXBsZW1lbnRhdGlvbiBvZiA6bW9kOmBvcy5wYXRoYCBvbiBXaW4zMiwgV2luNjQsIGFuZCBXaW5DRSBwbGF0Zm9ybXMuCisgICAtLS0gSW1wbGVtZW50YXRpb24gb2YgOm1vZDpgb3MucGF0aGAgb24gV2luMzIgYW5kIFdpbjY0IHBsYXRmb3Jtcy4KIAogOm1vZDpgcG9zaXhwYXRoYAogICAgLS0tIEltcGxlbWVudGF0aW9uIG9mIDptb2Q6YG9zLnBhdGhgIG9uIFBPU0lYLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QubW9jay5yc3QgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdAppbmRleCBjMTNmMDk1Li4xYmMxZWRiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdAorKysgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdApAQCAtMjYyLDYgKzI2MiwzNCBAQAogICAgIHVzZWQgdG8gc2V0IGF0dHJpYnV0ZXMgb24gdGhlIG1vY2sgYWZ0ZXIgaXQgaXMgY3JlYXRlZC4gU2VlIHRoZQogICAgIDptZXRoOmBjb25maWd1cmVfbW9ja2AgbWV0aG9kIGZvciBkZXRhaWxzLgogCisgICAgLi4gbWV0aG9kOjogYXNzZXJ0X2NhbGxlZCgqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgQXNzZXJ0IHRoYXQgdGhlIG1vY2sgd2FzIGNhbGxlZCBhdCBsZWFzdCBvbmNlLgorCisgICAgICAgICAgICA+Pj4gbW9jayA9IE1vY2soKQorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kKCkKKyAgICAgICAgICAgIDxNb2NrIG5hbWU9J21vY2subWV0aG9kKCknIGlkPScuLi4nPgorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kLmFzc2VydF9jYWxsZWQoKQorCisgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAgLi4gbWV0aG9kOjogYXNzZXJ0X2NhbGxlZF9vbmNlKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBBc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGV4YWN0bHkgb25jZS4KKworICAgICAgICAgICAgPj4+IG1vY2sgPSBNb2NrKCkKKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZCgpCisgICAgICAgICAgICA8TW9jayBuYW1lPSdtb2NrLm1ldGhvZCgpJyBpZD0nLi4uJz4KKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZC5hc3NlcnRfY2FsbGVkX29uY2UoKQorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kKCkKKyAgICAgICAgICAgIDxNb2NrIG5hbWU9J21vY2subWV0aG9kKCknIGlkPScuLi4nPgorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIEFzc2VydGlvbkVycm9yOiBFeHBlY3RlZCAnbWV0aG9kJyB0byBoYXZlIGJlZW4gY2FsbGVkIG9uY2UuIENhbGxlZCAyIHRpbWVzLgorCisgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAKICAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkX3dpdGgoKmFyZ3MsICoqa3dhcmdzKQogCkBAIC0zMzksNyArMzY3LDcgQEAKICAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKIAotICAgIC4uIG1ldGhvZDo6IHJlc2V0X21vY2soKQorICAgIC4uIG1ldGhvZDo6IHJlc2V0X21vY2soKiwgcmV0dXJuX3ZhbHVlPUZhbHNlLCBzaWRlX2VmZmVjdD1GYWxzZSkKIAogICAgICAgICBUaGUgcmVzZXRfbW9jayBtZXRob2QgcmVzZXRzIGFsbCB0aGUgY2FsbCBhdHRyaWJ1dGVzIG9uIGEgbW9jayBvYmplY3Q6CiAKQEAgLTM1MSwxMiArMzc5LDIwIEBACiAgICAgICAgICAgICA+Pj4gbW9jay5jYWxsZWQKICAgICAgICAgICAgIEZhbHNlCiAKKyAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgICAgQWRkZWQgdHdvIGtleXdvcmQgb25seSBhcmd1bWVudCB0byB0aGUgcmVzZXRfbW9jayBmdW5jdGlvbi4KKwogICAgICAgICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlcmUgeW91IHdhbnQgdG8gbWFrZSBhIHNlcmllcyBvZiBhc3NlcnRpb25zIHRoYXQKICAgICAgICAgcmV1c2UgdGhlIHNhbWUgb2JqZWN0LiBOb3RlIHRoYXQgOm1ldGg6YHJlc2V0X21vY2tgICpkb2Vzbid0KiBjbGVhciB0aGUKICAgICAgICAgcmV0dXJuIHZhbHVlLCA6YXR0cjpgc2lkZV9lZmZlY3RgIG9yIGFueSBjaGlsZCBhdHRyaWJ1dGVzIHlvdSBoYXZlCi0gICAgICAgIHNldCB1c2luZyBub3JtYWwgYXNzaWdubWVudC4gQ2hpbGQgbW9ja3MgYW5kIHRoZSByZXR1cm4gdmFsdWUgbW9jaworICAgICAgICBzZXQgdXNpbmcgbm9ybWFsIGFzc2lnbm1lbnQgYnkgZGVmYXVsdC4gSW4gY2FzZSB5b3Ugd2FudCB0byByZXNldAorICAgICAgICAqcmV0dXJuX3ZhbHVlKiBvciA6YXR0cjpgc2lkZV9lZmZlY3RgLCB0aGVuIHBhc3MgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgcGFyYW1ldGVyIGFzIGBgVHJ1ZWBgLiBDaGlsZCBtb2NrcyBhbmQgdGhlIHJldHVybiB2YWx1ZSBtb2NrCiAgICAgICAgIChpZiBhbnkpIGFyZSByZXNldCBhcyB3ZWxsLgogCisgICAgICAgIC4uIG5vdGU6OiAqcmV0dXJuX3ZhbHVlKiwgYW5kIDphdHRyOmBzaWRlX2VmZmVjdGAgYXJlIGtleXdvcmQgb25seQorICAgICAgICAgICAgICAgICAgYXJndW1lbnQuCisKIAogICAgIC4uIG1ldGhvZDo6IG1vY2tfYWRkX3NwZWMoc3BlYywgc3BlY19zZXQ9RmFsc2UpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdCBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdAppbmRleCA5Y2NhODgxLi5kZDE4OGIwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CkBAIC0xMzkzLDkgKzEzOTMsOSBAQAogCiAgICAgICBBZGQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgOm1ldGg6YHRlYXJEb3duYCB0byBjbGVhbnVwIHJlc291cmNlcwogICAgICAgdXNlZCBkdXJpbmcgdGhlIHRlc3QuIEZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBpbiByZXZlcnNlIG9yZGVyIHRvIHRoZQotICAgICAgb3JkZXIgdGhleSBhcmUgYWRkZWQgKExJRk8pLiBUaGV5IGFyZSBjYWxsZWQgd2l0aCBhbnkgYXJndW1lbnRzIGFuZAotICAgICAga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIGludG8gOm1ldGg6YGFkZENsZWFudXBgIHdoZW4gdGhleSBhcmUKLSAgICAgIGFkZGVkLgorICAgICAgb3JkZXIgdGhleSBhcmUgYWRkZWQgKDphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCkuICBUaGV5CisgICAgICBhcmUgY2FsbGVkIHdpdGggYW55IGFyZ3VtZW50cyBhbmQga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIGludG8KKyAgICAgIDptZXRoOmBhZGRDbGVhbnVwYCB3aGVuIHRoZXkgYXJlIGFkZGVkLgogCiAgICAgICBJZiA6bWV0aDpgc2V0VXBgIGZhaWxzLCBtZWFuaW5nIHRoYXQgOm1ldGg6YHRlYXJEb3duYCBpcyBub3QgY2FsbGVkLAogICAgICAgdGhlbiBhbnkgY2xlYW51cCBmdW5jdGlvbnMgYWRkZWQgd2lsbCBzdGlsbCBiZSBjYWxsZWQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0IGIvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdAppbmRleCBjNmRlMjMwLi5kNzlkOGYwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKQEAgLTExNCw4ICsxMTQsOSBAQAogICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgfCBpZiBwcmVzZW50ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotICAgU2VlIHNlY3Rpb24gOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdAotICAgb2JqZWN0LgorICAgUmVhZGluZyB0aGUgOmF0dHI6YHBvcnRgIGF0dHJpYnV0ZSB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAgaWYKKyAgIGFuIGludmFsaWQgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIFVSTC4gIFNlZSBzZWN0aW9uCisgICA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIEFkZGVkIElQdjYgVVJMIHBhcnNpbmcgY2FwYWJpbGl0aWVzLgpAQCAtMTI1LDYgKzEyNiwxMCBAQAogICAgICAgZmFsc2UpLCBpbiBhY2NvcmRhbmNlIHdpdGggOnJmYzpgMzk4NmAuICBQcmV2aW91c2x5LCBhIHdoaXRlbGlzdCBvZgogICAgICAgc2NoZW1lcyB0aGF0IHN1cHBvcnQgZnJhZ21lbnRzIGV4aXN0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPdXQtb2YtcmFuZ2UgcG9ydCBudW1iZXJzIG5vdyByYWlzZSA6ZXhjOmBWYWx1ZUVycm9yYCwgaW5zdGVhZCBvZgorICAgICAgcmV0dXJuaW5nIDpjb25zdDpgTm9uZWAuCisKIAogLi4gZnVuY3Rpb246OiBwYXJzZV9xcyhxcywga2VlcF9ibGFua192YWx1ZXM9RmFsc2UsIHN0cmljdF9wYXJzaW5nPUZhbHNlLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3JlcGxhY2UnKQogCkBAIC0yMjcsOCArMjMyLDEzIEBACiAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICB8IGlmIHByZXNlbnQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotICAgU2VlIHNlY3Rpb24gOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdAotICAgb2JqZWN0LgorICAgUmVhZGluZyB0aGUgOmF0dHI6YHBvcnRgIGF0dHJpYnV0ZSB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAgaWYKKyAgIGFuIGludmFsaWQgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIFVSTC4gIFNlZSBzZWN0aW9uCisgICA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE91dC1vZi1yYW5nZSBwb3J0IG51bWJlcnMgbm93IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpbnN0ZWFkIG9mCisgICAgICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4KIAogCiAuLiBmdW5jdGlvbjo6IHVybHVuc3BsaXQocGFydHMpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91cmxsaWIucmVxdWVzdC5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucmVxdWVzdC5yc3QKaW5kZXggMTI5MWFlYi4uZDI4ODE2NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXJsbGliLnJlcXVlc3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VybGxpYi5yZXF1ZXN0LnJzdApAQCAtMzAsMTggKzMwLDkgQEAKICAgIE9wZW4gdGhlIFVSTCAqdXJsKiwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhCiAgICA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KIAotICAgKmRhdGEqIG11c3QgYmUgYSBieXRlcyBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2VudCB0byB0aGUKLSAgIHNlcnZlciwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gKmRhdGEqIG1heSBhbHNvIGJlIGFuCi0gICBpdGVyYWJsZSBvYmplY3QgYW5kIGluIHRoYXQgY2FzZSBDb250ZW50LUxlbmd0aCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBpbgotICAgdGhlIGhlYWRlcnMuIEN1cnJlbnRseSBIVFRQIHJlcXVlc3RzIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgdXNlICpkYXRhKjsgdGhlCi0gICBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSAqZGF0YSogcGFyYW1ldGVyIGlzCi0gICBwcm92aWRlZC4KLQotICAgKmRhdGEqIHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQKLSAgIDptaW1ldHlwZTpgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCBmb3JtYXQuICBUaGUKLSAgIDpmdW5jOmB1cmxsaWIucGFyc2UudXJsZW5jb2RlYCBmdW5jdGlvbiB0YWtlcyBhIG1hcHBpbmcgb3Igc2VxdWVuY2Ugb2YKLSAgIDItdHVwbGVzIGFuZCByZXR1cm5zIGFuIEFTQ0lJIHRleHQgc3RyaW5nIGluIHRoaXMgZm9ybWF0LiBJdCBzaG91bGQKLSAgIGJlIGVuY29kZWQgdG8gYnl0ZXMgYmVmb3JlIGJlaW5nIHVzZWQgYXMgdGhlICpkYXRhKiBwYXJhbWV0ZXIuCisgICAqZGF0YSogbXVzdCBiZSBhbiBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2VudCB0byB0aGUKKyAgIHNlcnZlciwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gIFNlZSA6Y2xhc3M6YFJlcXVlc3RgCisgICBmb3IgZGV0YWlscy4KIAogICAgdXJsbGliLnJlcXVlc3QgbW9kdWxlIHVzZXMgSFRUUC8xLjEgYW5kIGluY2x1ZGVzIGBgQ29ubmVjdGlvbjpjbG9zZWBgIGhlYWRlcgogICAgaW4gaXRzIEhUVFAgcmVxdWVzdHMuCkBAIC0xOTIsMTQgKzE4MywyMSBAQAogCiAgICAqdXJsKiBzaG91bGQgYmUgYSBzdHJpbmcgY29udGFpbmluZyBhIHZhbGlkIFVSTC4KIAotICAgKmRhdGEqIG11c3QgYmUgYSBieXRlcyBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gc2VuZCB0byB0aGUKLSAgIHNlcnZlciwgb3IgYGBOb25lYGAgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gIEN1cnJlbnRseSBIVFRQIHJlcXVlc3RzIGFyZQotICAgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSAqZGF0YSo7IHRoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhCi0gICBHRVQgd2hlbiB0aGUgKmRhdGEqIHBhcmFtZXRlciBpcyBwcm92aWRlZC4gICpkYXRhKiBzaG91bGQgYmUgYSBidWZmZXIgaW4gdGhlCi0gICBzdGFuZGFyZCA6bWltZXR5cGU6YGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgZm9ybWF0LgotICAgVGhlIDpmdW5jOmB1cmxsaWIucGFyc2UudXJsZW5jb2RlYCBmdW5jdGlvbiB0YWtlcyBhIG1hcHBpbmcgb3Igc2VxdWVuY2Ugb2YKLSAgIDItdHVwbGVzIGFuZCByZXR1cm5zIGFuIEFTQ0lJIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4gSXQgc2hvdWxkIGJlCi0gICBlbmNvZGVkIHRvIGJ5dGVzIGJlZm9yZSBiZWluZyB1c2VkIGFzIHRoZSAqZGF0YSogcGFyYW1ldGVyLgorICAgKmRhdGEqIG11c3QgYmUgYW4gb2JqZWN0IHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgdG8gdGhlCisgICBzZXJ2ZXIsIG9yIGBgTm9uZWBgIGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuICBDdXJyZW50bHkgSFRUUAorICAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgKmRhdGEqLiAgVGhlIHN1cHBvcnRlZCBvYmplY3QKKyAgIHR5cGVzIGluY2x1ZGUgYnl0ZXMsIGZpbGUtbGlrZSBvYmplY3RzLCBhbmQgaXRlcmFibGVzLiAgSWYgbm8KKyAgIGBgQ29udGVudC1MZW5ndGhgYCBub3IgYGBUcmFuc2Zlci1FbmNvZGluZ2BgIGhlYWRlciBmaWVsZAorICAgaGFzIGJlZW4gcHJvdmlkZWQsIDpjbGFzczpgSFRUUEhhbmRsZXJgIHdpbGwgc2V0IHRoZXNlIGhlYWRlcnMgYWNjb3JkaW5nCisgICB0byB0aGUgdHlwZSBvZiAqZGF0YSouICBgYENvbnRlbnQtTGVuZ3RoYGAgd2lsbCBiZSB1c2VkIHRvIHNlbmQKKyAgIGJ5dGVzIG9iamVjdHMsIHdoaWxlIGBgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRgYCBhcyBzcGVjaWZpZWQgaW4KKyAgIDpyZmM6YDcyMzBgLCBTZWN0aW9uIDMuMy4xIHdpbGwgYmUgdXNlZCB0byBzZW5kIGZpbGVzIGFuZCBvdGhlciBpdGVyYWJsZXMuCisKKyAgIEZvciBhbiBIVFRQIFBPU1QgcmVxdWVzdCBtZXRob2QsICpkYXRhKiBzaG91bGQgYmUgYSBidWZmZXIgaW4gdGhlCisgICBzdGFuZGFyZCA6bWltZXR5cGU6YGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAgZm9ybWF0LiAgVGhlCisgICA6ZnVuYzpgdXJsbGliLnBhcnNlLnVybGVuY29kZWAgZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlCisgICBvZiAyLXR1cGxlcyBhbmQgcmV0dXJucyBhbiBBU0NJSSBzdHJpbmcgaW4gdGhpcyBmb3JtYXQuIEl0IHNob3VsZAorICAgYmUgZW5jb2RlZCB0byBieXRlcyBiZWZvcmUgYmVpbmcgdXNlZCBhcyB0aGUgKmRhdGEqIHBhcmFtZXRlci4KIAogICAgKmhlYWRlcnMqIHNob3VsZCBiZSBhIGRpY3Rpb25hcnksIGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYKICAgIDptZXRoOmBhZGRfaGVhZGVyYCB3YXMgY2FsbGVkIHdpdGggZWFjaCBrZXkgYW5kIHZhbHVlIGFzIGFyZ3VtZW50cy4KQEAgLTIxMSw4ICsyMDksMTAgQEAKICAgIDptb2Q6YHVybGxpYmAncyBkZWZhdWx0IHVzZXIgYWdlbnQgc3RyaW5nIGlzCiAgICBgYCJQeXRob24tdXJsbGliLzIuNiJgYCAob24gUHl0aG9uIDIuNikuCiAKLSAgIEFuIGV4YW1wbGUgb2YgdXNpbmcgYGBDb250ZW50LVR5cGVgYCBoZWFkZXIgd2l0aCAqZGF0YSogYXJndW1lbnQgd291bGQgYmUKLSAgIHNlbmRpbmcgYSBkaWN0aW9uYXJ5IGxpa2UgYGB7IkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifWBgLgorICAgQW4gYXBwcm9wcmlhdGUgYGBDb250ZW50LVR5cGVgYCBoZWFkZXIgc2hvdWxkIGJlIGluY2x1ZGVkIGlmIHRoZSAqZGF0YSoKKyAgIGFyZ3VtZW50IGlzIHByZXNlbnQuICBJZiB0aGlzIGhlYWRlciBoYXMgbm90IGJlZW4gcHJvdmlkZWQgYW5kICpkYXRhKgorICAgaXMgbm90IE5vbmUsIGBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgYCB3aWxsCisgICBiZSBhZGRlZCBhcyBhIGRlZmF1bHQuCiAKICAgIFRoZSBmaW5hbCB0d28gYXJndW1lbnRzIGFyZSBvbmx5IG9mIGludGVyZXN0IGZvciBjb3JyZWN0IGhhbmRsaW5nCiAgICBvZiB0aGlyZC1wYXJ0eSBIVFRQIGNvb2tpZXM6CkBAIC0yMzUsMTUgKzIzNSwyOCBAQAogICAgKm1ldGhvZCogc2hvdWxkIGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIHRoYXQKICAgIHdpbGwgYmUgdXNlZCAoZS5nLiBgYCdIRUFEJ2BgKS4gIElmIHByb3ZpZGVkLCBpdHMgdmFsdWUgaXMgc3RvcmVkIGluIHRoZQogICAgOmF0dHI6YH5SZXF1ZXN0Lm1ldGhvZGAgYXR0cmlidXRlIGFuZCBpcyB1c2VkIGJ5IDptZXRoOmBnZXRfbWV0aG9kKClgLgotICAgU3ViY2xhc3NlcyBtYXkgaW5kaWNhdGUgYSBkZWZhdWx0IG1ldGhvZCBieSBzZXR0aW5nIHRoZQorICAgVGhlIGRlZmF1bHQgaXMgYGAnR0VUJ2BgIGlmICpkYXRhKiBpcyBgYE5vbmVgYCBvciBgYCdQT1NUJ2BgIG90aGVyd2lzZS4KKyAgIFN1YmNsYXNzZXMgbWF5IGluZGljYXRlIGEgZGlmZmVyZW50IGRlZmF1bHQgbWV0aG9kIGJ5IHNldHRpbmcgdGhlCiAgICA6YXR0cjpgflJlcXVlc3QubWV0aG9kYCBhdHRyaWJ1dGUgaW4gdGhlIGNsYXNzIGl0c2VsZi4KIAorICAgLi4gbm90ZTo6CisgICAgICBUaGUgcmVxdWVzdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHRoZSBkYXRhIG9iamVjdCBpcyB1bmFibGUKKyAgICAgIHRvIGRlbGl2ZXIgaXRzIGNvbnRlbnQgbW9yZSB0aGFuIG9uY2UgKGUuZy4gYSBmaWxlIG9yIGFuIGl0ZXJhYmxlCisgICAgICB0aGF0IGNhbiBwcm9kdWNlIHRoZSBjb250ZW50IG9ubHkgb25jZSkgYW5kIHRoZSByZXF1ZXN0IGlzIHJldHJpZWQKKyAgICAgIGZvciBIVFRQIHJlZGlyZWN0cyBvciBhdXRoZW50aWNhdGlvbi4gIFRoZSAqZGF0YSogaXMgc2VudCB0byB0aGUKKyAgICAgIEhUVFAgc2VydmVyIHJpZ2h0IGF3YXkgYWZ0ZXIgdGhlIGhlYWRlcnMuICBUaGVyZSBpcyBubyBzdXBwb3J0IGZvcgorICAgICAgYSAxMDAtY29udGludWUgZXhwZWN0YXRpb24gaW4gdGhlIGxpYnJhcnkuCisKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICA6YXR0cjpgUmVxdWVzdC5tZXRob2RgIGFyZ3VtZW50IGlzIGFkZGVkIHRvIHRoZSBSZXF1ZXN0IGNsYXNzLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgRGVmYXVsdCA6YXR0cjpgUmVxdWVzdC5tZXRob2RgIG1heSBiZSBpbmRpY2F0ZWQgYXQgdGhlIGNsYXNzIGxldmVsLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgRG8gbm90IHJhaXNlIGFuIGVycm9yIGlmIHRoZSBgYENvbnRlbnQtTGVuZ3RoYGAgaGFzIG5vdCBiZWVuCisgICAgICBwcm92aWRlZCBhbmQgKmRhdGEqIGlzIG5laXRoZXIgYGBOb25lYGAgbm9yIGEgYnl0ZXMgb2JqZWN0LgorICAgICAgRmFsbCBiYWNrIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIGluc3RlYWQuCiAKIC4uIGNsYXNzOjogT3BlbmVyRGlyZWN0b3IoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0IGIvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdAppbmRleCBiYTcwMWMzLi43ZDMxOTMyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKQEAgLTU3LDE1ICs1Nyw0MSBAQAogICAgICAgU2V0cyB0aGUgdGltZSB0aGUgYGByb2JvdHMudHh0YGAgZmlsZSB3YXMgbGFzdCBmZXRjaGVkIHRvIHRoZSBjdXJyZW50CiAgICAgICB0aW1lLgogCisgICAuLiBtZXRob2Q6OiBjcmF3bF9kZWxheSh1c2VyYWdlbnQpCiAKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNlIG9mIHRoZSBSb2JvdEZpbGVQYXJzZXIgY2xhc3MuCisgICAgICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYGBDcmF3bC1kZWxheWBgIHBhcmFtZXRlciBmcm9tIGBgcm9ib3RzLnR4dGBgCisgICAgICBmb3IgdGhlICp1c2VyYWdlbnQqIGluIHF1ZXN0aW9uLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJhbWV0ZXIgb3IgaXQKKyAgICAgIGRvZXNuJ3QgYXBwbHkgdG8gdGhlICp1c2VyYWdlbnQqIHNwZWNpZmllZCBvciB0aGUgYGByb2JvdHMudHh0YGAgZW50cnkKKyAgICAgIGZvciB0aGlzIHBhcmFtZXRlciBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBgYE5vbmVgYC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIG1ldGhvZDo6IHJlcXVlc3RfcmF0ZSh1c2VyYWdlbnQpCisKKyAgICAgIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgYFJlcXVlc3QtcmF0ZWBgIHBhcmFtZXRlciBmcm9tCisgICAgICBgYHJvYm90cy50eHRgYCBpbiB0aGUgZm9ybSBvZiBhIDpmdW5jOmB+Y29sbGVjdGlvbnMubmFtZWR0dXBsZWAKKyAgICAgIGBgKHJlcXVlc3RzLCBzZWNvbmRzKWBgLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJhbWV0ZXIgb3IgaXQgZG9lc24ndAorICAgICAgYXBwbHkgdG8gdGhlICp1c2VyYWdlbnQqIHNwZWNpZmllZCBvciB0aGUgYGByb2JvdHMudHh0YGAgZW50cnkgZm9yIHRoaXMKKyAgICAgIHBhcmFtZXRlciBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBgYE5vbmVgYC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB1c2Ugb2YgdGhlIDpjbGFzczpgUm9ib3RGaWxlUGFyc2VyYAorY2xhc3M6OgogCiAgICA+Pj4gaW1wb3J0IHVybGxpYi5yb2JvdHBhcnNlcgogICAgPj4+IHJwID0gdXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCiAgICA+Pj4gcnAuc2V0X3VybCgiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vcm9ib3RzLnR4dCIpCiAgICA+Pj4gcnAucmVhZCgpCisgICA+Pj4gcnJhdGUgPSBycC5yZXF1ZXN0X3JhdGUoIioiKQorICAgPj4+IHJyYXRlLnJlcXVlc3RzCisgICAzCisgICA+Pj4gcnJhdGUuc2Vjb25kcworICAgMjAKKyAgID4+PiBycC5jcmF3bF9kZWxheSgiKiIpCisgICA2CiAgICA+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tL2NnaS1iaW4vc2VhcmNoP2NpdHk9U2FuK0ZyYW5jaXNjbyIpCiAgICBGYWxzZQogICAgPj4+IHJwLmNhbl9mZXRjaCgiKiIsICJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS8iKQogICAgVHJ1ZQotCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS92ZW52LnJzdCBiL0RvYy9saWJyYXJ5L3ZlbnYucnN0CmluZGV4IGFmNGE2ZDEuLjZiZjI2ZmYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3ZlbnYucnN0CisrKyBiL0RvYy9saWJyYXJ5L3ZlbnYucnN0CkBAIC0zMSw0NCArMzEsNTAgQEAKIAogLi4gX3ZlbnYtZGVmOgogCi0uLiBub3RlOjogQSB2aXJ0dWFsIGVudmlyb25tZW50IChhbHNvIGNhbGxlZCBhIGBgdmVudmBgKSBpcyBhIFB5dGhvbgotICAgZW52aXJvbm1lbnQgc3VjaCB0aGF0IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGxpYnJhcmllcyBhbmQgc2NyaXB0cwotICAgaW5zdGFsbGVkIGludG8gaXQgYXJlIGlzb2xhdGVkIGZyb20gdGhvc2UgaW5zdGFsbGVkIGluIG90aGVyIHZpcnR1YWwKLSAgIGVudmlyb25tZW50cywgYW5kIChieSBkZWZhdWx0KSBhbnkgbGlicmFyaWVzIGluc3RhbGxlZCBpbiBhICJzeXN0ZW0iIFB5dGhvbiwKLSAgIGkuZS4gb25lIHdoaWNoIGlzIGluc3RhbGxlZCBhcyBwYXJ0IG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KKy4uIG5vdGU6OiBBIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgYSBQeXRob24gZW52aXJvbm1lbnQgc3VjaCB0aGF0IHRoZSBQeXRob24KKyAgIGludGVycHJldGVyLCBsaWJyYXJpZXMgYW5kIHNjcmlwdHMgaW5zdGFsbGVkIGludG8gaXQgYXJlIGlzb2xhdGVkIGZyb20gdGhvc2UKKyAgIGluc3RhbGxlZCBpbiBvdGhlciB2aXJ0dWFsIGVudmlyb25tZW50cywgYW5kIChieSBkZWZhdWx0KSBhbnkgbGlicmFyaWVzCisgICBpbnN0YWxsZWQgaW4gYSAic3lzdGVtIiBQeXRob24sIGkuZS4sIG9uZSB3aGljaCBpcyBpbnN0YWxsZWQgYXMgcGFydCBvZiB5b3VyCisgICBvcGVyYXRpbmcgc3lzdGVtLgogCi0gICBBIHZlbnYgaXMgYSBkaXJlY3RvcnkgdHJlZSB3aGljaCBjb250YWlucyBQeXRob24gZXhlY3V0YWJsZSBmaWxlcyBhbmQKLSAgIG90aGVyIGZpbGVzIHdoaWNoIGluZGljYXRlIHRoYXQgaXQgaXMgYSB2ZW52LgorICAgQSB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGEgZGlyZWN0b3J5IHRyZWUgd2hpY2ggY29udGFpbnMgUHl0aG9uIGV4ZWN1dGFibGUKKyAgIGZpbGVzIGFuZCBvdGhlciBmaWxlcyB3aGljaCBpbmRpY2F0ZSB0aGF0IGl0IGlzIGEgdmlydHVhbCBlbnZpcm9ubWVudC4KIAogICAgQ29tbW9uIGluc3RhbGxhdGlvbiB0b29scyBzdWNoIGFzIGBgU2V0dXB0b29sc2BgIGFuZCBgYHBpcGBgIHdvcmsgYXMKLSAgIGV4cGVjdGVkIHdpdGggdmVudnMgLSBpLmUuIHdoZW4gYSB2ZW52IGlzIGFjdGl2ZSwgdGhleSBpbnN0YWxsIFB5dGhvbgotICAgcGFja2FnZXMgaW50byB0aGUgdmVudiB3aXRob3V0IG5lZWRpbmcgdG8gYmUgdG9sZCB0byBkbyBzbyBleHBsaWNpdGx5LgorICAgZXhwZWN0ZWQgd2l0aCB2aXJ0dWFsIGVudmlyb25tZW50cy4gSW4gb3RoZXIgd29yZHMsIHdoZW4gYSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCBpcyBhY3RpdmUsIHRoZXkgaW5zdGFsbCBQeXRob24gcGFja2FnZXMgaW50byB0aGUgdmlydHVhbAorICAgZW52aXJvbm1lbnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIHRvbGQgdG8gZG8gc28gZXhwbGljaXRseS4KIAotICAgV2hlbiBhIHZlbnYgaXMgYWN0aXZlIChpLmUuIHRoZSB2ZW52J3MgUHl0aG9uIGludGVycHJldGVyIGlzIHJ1bm5pbmcpLCB0aGUKLSAgIGF0dHJpYnV0ZXMgOmF0dHI6YHN5cy5wcmVmaXhgIGFuZCA6YXR0cjpgc3lzLmV4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgYmFzZQotICAgZGlyZWN0b3J5IG9mIHRoZSB2ZW52LCB3aGVyZWFzIDphdHRyOmBzeXMuYmFzZV9wcmVmaXhgIGFuZAotICAgOmF0dHI6YHN5cy5iYXNlX2V4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgbm9uLXZlbnYgUHl0aG9uIGluc3RhbGxhdGlvbgotICAgd2hpY2ggd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSB2ZW52LiBJZiBhIHZlbnYgaXMgbm90IGFjdGl2ZSwgdGhlbgotICAgOmF0dHI6YHN5cy5wcmVmaXhgIGlzIHRoZSBzYW1lIGFzIDphdHRyOmBzeXMuYmFzZV9wcmVmaXhgIGFuZAotICAgOmF0dHI6YHN5cy5leGVjX3ByZWZpeGAgaXMgdGhlIHNhbWUgYXMgOmF0dHI6YHN5cy5iYXNlX2V4ZWNfcHJlZml4YCAodGhleQotICAgYWxsIHBvaW50IHRvIGEgbm9uLXZlbnYgUHl0aG9uIGluc3RhbGxhdGlvbikuCisgICBXaGVuIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhY3RpdmUgKGkuZS4sIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgUHl0aG9uCisgICBpbnRlcnByZXRlciBpcyBydW5uaW5nKSwgdGhlIGF0dHJpYnV0ZXMgOmF0dHI6YHN5cy5wcmVmaXhgIGFuZAorICAgOmF0dHI6YHN5cy5leGVjX3ByZWZpeGAgcG9pbnQgdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCwgd2hlcmVhcyA6YXR0cjpgc3lzLmJhc2VfcHJlZml4YCBhbmQKKyAgIDphdHRyOmBzeXMuYmFzZV9leGVjX3ByZWZpeGAgcG9pbnQgdG8gdGhlIG5vbi12aXJ0dWFsIGVudmlyb25tZW50IFB5dGhvbgorICAgaW5zdGFsbGF0aW9uIHdoaWNoIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudC4gSWYgYSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCBpcyBub3QgYWN0aXZlLCB0aGVuIDphdHRyOmBzeXMucHJlZml4YCBpcyB0aGUgc2FtZSBhcworICAgOmF0dHI6YHN5cy5iYXNlX3ByZWZpeGAgYW5kIDphdHRyOmBzeXMuZXhlY19wcmVmaXhgIGlzIHRoZSBzYW1lIGFzCisgICA6YXR0cjpgc3lzLmJhc2VfZXhlY19wcmVmaXhgICh0aGV5IGFsbCBwb2ludCB0byBhIG5vbi12aXJ0dWFsIGVudmlyb25tZW50CisgICBQeXRob24gaW5zdGFsbGF0aW9uKS4KIAotICAgV2hlbiBhIHZlbnYgaXMgYWN0aXZlLCBhbnkgb3B0aW9ucyB0aGF0IGNoYW5nZSB0aGUgaW5zdGFsbGF0aW9uIHBhdGggd2lsbCBiZQotICAgaWdub3JlZCBmcm9tIGFsbCBkaXN0dXRpbHMgY29uZmlndXJhdGlvbiBmaWxlcyB0byBwcmV2ZW50IHByb2plY3RzIGJlaW5nCi0gICBpbmFkdmVydGVudGx5IGluc3RhbGxlZCBvdXRzaWRlIG9mIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LgorICAgV2hlbiBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgYWN0aXZlLCBhbnkgb3B0aW9ucyB0aGF0IGNoYW5nZSB0aGUKKyAgIGluc3RhbGxhdGlvbiBwYXRoIHdpbGwgYmUgaWdub3JlZCBmcm9tIGFsbCBkaXN0dXRpbHMgY29uZmlndXJhdGlvbiBmaWxlcyB0bworICAgcHJldmVudCBwcm9qZWN0cyBiZWluZyBpbmFkdmVydGVudGx5IGluc3RhbGxlZCBvdXRzaWRlIG9mIHRoZSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudC4KIAotICAgV2hlbiB3b3JraW5nIGluIGEgY29tbWFuZCBzaGVsbCwgdXNlcnMgY2FuIG1ha2UgYSB2ZW52IGFjdGl2ZSBieSBydW5uaW5nIGFuCi0gICBgYGFjdGl2YXRlYGAgc2NyaXB0IGluIHRoZSB2ZW52J3MgZXhlY3V0YWJsZXMgZGlyZWN0b3J5ICh0aGUgcHJlY2lzZSBmaWxlbmFtZQotICAgaXMgc2hlbGwtZGVwZW5kZW50KSwgd2hpY2ggcHJlcGVuZHMgdGhlIHZlbnYncyBkaXJlY3RvcnkgZm9yIGV4ZWN1dGFibGVzIHRvCi0gICB0aGUgYGBQQVRIYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIHRoZSBydW5uaW5nIHNoZWxsLiBUaGVyZSBzaG91bGQgYmUgbm8KLSAgIG5lZWQgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcyB0byBhY3RpdmF0ZSBhIHZlbnYgLS0gc2NyaXB0cyBpbnN0YWxsZWQgaW50bwotICAgdmVudnMgaGF2ZSBhIHNoZWJhbmcgbGluZSB3aGljaCBwb2ludHMgdG8gdGhlIHZlbnYncyBQeXRob24gaW50ZXJwcmV0ZXIuIFRoaXMKLSAgIG1lYW5zIHRoYXQgdGhlIHNjcmlwdCB3aWxsIHJ1biB3aXRoIHRoYXQgaW50ZXJwcmV0ZXIgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUKLSAgIG9mIGBgUEFUSGBgLiBPbiBXaW5kb3dzLCBzaGViYW5nIGxpbmUgcHJvY2Vzc2luZyBpcyBzdXBwb3J0ZWQgaWYgeW91IGhhdmUgdGhlCi0gICBQeXRob24gTGF1bmNoZXIgZm9yIFdpbmRvd3MgaW5zdGFsbGVkICh0aGlzIHdhcyBhZGRlZCB0byBQeXRob24gaW4gMy4zIC0gc2VlCi0gICA6cGVwOmAzOTdgIGZvciBtb3JlIGRldGFpbHMpLiBUaHVzLCBkb3VibGUtY2xpY2tpbmcgYW4gaW5zdGFsbGVkIHNjcmlwdCBpbgotICAgYSBXaW5kb3dzIEV4cGxvcmVyIHdpbmRvdyBzaG91bGQgcnVuIHRoZSBzY3JpcHQgd2l0aCB0aGUgY29ycmVjdCBpbnRlcnByZXRlcgotICAgd2l0aG91dCB0aGVyZSBuZWVkaW5nIHRvIGJlIGFueSByZWZlcmVuY2UgdG8gaXRzIHZlbnYgaW4gYGBQQVRIYGAuCisgICBXaGVuIHdvcmtpbmcgaW4gYSBjb21tYW5kIHNoZWxsLCB1c2VycyBjYW4gbWFrZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgYWN0aXZlCisgICBieSBydW5uaW5nIGFuIGBgYWN0aXZhdGVgYCBzY3JpcHQgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBleGVjdXRhYmxlcworICAgZGlyZWN0b3J5ICh0aGUgcHJlY2lzZSBmaWxlbmFtZSBpcyBzaGVsbC1kZXBlbmRlbnQpLCB3aGljaCBwcmVwZW5kcyB0aGUKKyAgIHZpcnR1YWwgZW52aXJvbm1lbnQncyBkaXJlY3RvcnkgZm9yIGV4ZWN1dGFibGVzIHRvIHRoZSBgYFBBVEhgYCBlbnZpcm9ubWVudAorICAgdmFyaWFibGUgZm9yIHRoZSBydW5uaW5nIHNoZWxsLiBUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCBpbiBvdGhlcgorICAgY2lyY3Vtc3RhbmNlcyB0byBhY3RpdmF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnTigJRzY3JpcHRzIGluc3RhbGxlZCBpbnRvCisgICB2aXJ0dWFsIGVudmlyb25tZW50cyBoYXZlIGEgInNoZWJhbmciIGxpbmUgd2hpY2ggcG9pbnRzIHRvIHRoZSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCdzIFB5dGhvbiBpbnRlcnByZXRlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBzY3JpcHQgd2lsbCBydW4gd2l0aAorICAgdGhhdCBpbnRlcnByZXRlciByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBgYFBBVEhgYC4gT24gV2luZG93cywgInNoZWJhbmciCisgICBsaW5lIHByb2Nlc3NpbmcgaXMgc3VwcG9ydGVkIGlmIHlvdSBoYXZlIHRoZSBQeXRob24gTGF1bmNoZXIgZm9yIFdpbmRvd3MKKyAgIGluc3RhbGxlZCAodGhpcyB3YXMgYWRkZWQgdG8gUHl0aG9uIGluIDMuMyAtIHNlZSA6cGVwOmAzOTdgIGZvciBtb3JlCisgICBkZXRhaWxzKS4gVGh1cywgZG91YmxlLWNsaWNraW5nIGFuIGluc3RhbGxlZCBzY3JpcHQgaW4gYSBXaW5kb3dzIEV4cGxvcmVyCisgICB3aW5kb3cgc2hvdWxkIHJ1biB0aGUgc2NyaXB0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJwcmV0ZXIgd2l0aG91dCB0aGVyZQorICAgbmVlZGluZyB0byBiZSBhbnkgcmVmZXJlbmNlIHRvIGl0cyB2aXJ0dWFsIGVudmlyb25tZW50IGluIGBgUEFUSGBgLgogCiAKIC4uIF92ZW52LWFwaToKQEAgLTgzLDcgKzg5LDggQEAKIGNyZWF0aW9uIGFjY29yZGluZyB0byB0aGVpciBuZWVkcywgdGhlIDpjbGFzczpgRW52QnVpbGRlcmAgY2xhc3MuCiAKIC4uIGNsYXNzOjogRW52QnVpbGRlcihzeXN0ZW1fc2l0ZV9wYWNrYWdlcz1GYWxzZSwgY2xlYXI9RmFsc2UsIFwKLSAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgdXBncmFkZT1GYWxzZSwgd2l0aF9waXA9RmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgc3ltbGlua3M9RmFsc2UsIHVwZ3JhZGU9RmFsc2UsIHdpdGhfcGlwPUZhbHNlLCBcCisgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0PU5vbmUpCiAKICAgICBUaGUgOmNsYXNzOmBFbnZCdWlsZGVyYCBjbGFzcyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcga2V5d29yZCBhcmd1bWVudHMgb24KICAgICBpbnN0YW50aWF0aW9uOgpAQCAtMTA3LDkgKzExNCwxNiBAQAogICAgICAgaW5zdGFsbGVkIGluIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LiBUaGlzIHVzZXMgOm1vZDpgZW5zdXJlcGlwYCB3aXRoCiAgICAgICB0aGUgYGAtLWRlZmF1bHQtcGlwYGAgb3B0aW9uLgogCisgICAgKiBgYHByb21wdGBgIC0tIGEgU3RyaW5nIHRvIGJlIHVzZWQgYWZ0ZXIgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhY3RpdmF0ZWQKKyAgICAgIChkZWZhdWx0cyB0byBgYE5vbmVgYCB3aGljaCBtZWFucyBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgd291bGQKKyAgICAgIGJlIHVzZWQpLgorCiAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgICAgICBBZGRlZCB0aGUgYGB3aXRoX3BpcGBgIHBhcmFtZXRlcgogCisgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICAgQWRkZWQgdGhlIGBgcHJvbXB0YGAgcGFyYW1ldGVyCisKIAogICAgIENyZWF0b3JzIG9mIHRoaXJkLXBhcnR5IHZpcnR1YWwgZW52aXJvbm1lbnQgdG9vbHMgd2lsbCBiZSBmcmVlIHRvIHVzZSB0aGUKICAgICBwcm92aWRlZCBgYEVudkJ1aWxkZXJgYCBjbGFzcyBhcyBhIGJhc2UgY2xhc3MuCkBAIC0yMTksNyArMjMzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBmb2xsb3dpbmcgc2NyaXB0IHNob3dzIGhvdyB0byBleHRlbmQgOmNsYXNzOmBFbnZCdWlsZGVyYCBieSBpbXBsZW1lbnRpbmcgYQotc3ViY2xhc3Mgd2hpY2ggaW5zdGFsbHMgc2V0dXB0b29scyBhbmQgcGlwIGludG8gYSBjcmVhdGVkIHZlbnY6Ogorc3ViY2xhc3Mgd2hpY2ggaW5zdGFsbHMgc2V0dXB0b29scyBhbmQgcGlwIGludG8gYSBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnQ6OgogCiAgICAgaW1wb3J0IG9zCiAgICAgaW1wb3J0IG9zLnBhdGgKQEAgLTIzMywxMiArMjQ3LDEyIEBACiAgICAgY2xhc3MgRXh0ZW5kZWRFbnZCdWlsZGVyKHZlbnYuRW52QnVpbGRlcik6CiAgICAgICAgICIiIgogICAgICAgICBUaGlzIGJ1aWxkZXIgaW5zdGFsbHMgc2V0dXB0b29scyBhbmQgcGlwIHNvIHRoYXQgeW91IGNhbiBwaXAgb3IKLSAgICAgICAgZWFzeV9pbnN0YWxsIG90aGVyIHBhY2thZ2VzIGludG8gdGhlIGNyZWF0ZWQgZW52aXJvbm1lbnQuCisgICAgICAgIGVhc3lfaW5zdGFsbCBvdGhlciBwYWNrYWdlcyBpbnRvIHRoZSBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKICAgICAgICAgOnBhcmFtIG5vZGlzdDogSWYgVHJ1ZSwgc2V0dXB0b29scyBhbmQgcGlwIGFyZSBub3QgaW5zdGFsbGVkIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgdmlydHVhbCBlbnZpcm9ubWVudC4KICAgICAgICAgOnBhcmFtIG5vcGlwOiBJZiBUcnVlLCBwaXAgaXMgbm90IGluc3RhbGxlZCBpbnRvIHRoZSBjcmVhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBlbnZpcm9ubWVudC4KICAgICAgICAgOnBhcmFtIHByb2dyZXNzOiBJZiBzZXR1cHRvb2xzIG9yIHBpcCBhcmUgaW5zdGFsbGVkLCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uIGNhbiBiZSBtb25pdG9yZWQgYnkgcGFzc2luZyBhIHByb2dyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFibGUuIElmIHNwZWNpZmllZCwgaXQgaXMgY2FsbGVkIHdpdGggdHdvCkBAIC0yNjQsMTAgKzI3OCwxMCBAQAogICAgICAgICBkZWYgcG9zdF9zZXR1cChzZWxmLCBjb250ZXh0KToKICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgU2V0IHVwIGFueSBwYWNrYWdlcyB3aGljaCBuZWVkIHRvIGJlIHByZS1pbnN0YWxsZWQgaW50byB0aGUKLSAgICAgICAgICAgIGVudmlyb25tZW50IGJlaW5nIGNyZWF0ZWQuCisgICAgICAgICAgICB2aXJ0dWFsIGVudmlyb25tZW50IGJlaW5nIGNyZWF0ZWQuCiAKLSAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnZpcm9ubWVudCBjcmVhdGlvbiByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgb3MuZW52aXJvblsnVklSVFVBTF9FTlYnXSA9IGNvbnRleHQuZW52X2RpcgogICAgICAgICAgICAgaWYgbm90IHNlbGYubm9kaXN0OgpAQCAtMzAxLDcgKzMxNSw3IEBACiAgICAgICAgICAgICBmbiA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCiAgICAgICAgICAgICBiaW5wYXRoID0gY29udGV4dC5iaW5fcGF0aAogICAgICAgICAgICAgZGlzdHBhdGggPSBvcy5wYXRoLmpvaW4oYmlucGF0aCwgZm4pCi0gICAgICAgICAgICAjIERvd25sb2FkIHNjcmlwdCBpbnRvIHRoZSBlbnYncyBiaW5hcmllcyBmb2xkZXIKKyAgICAgICAgICAgICMgRG93bmxvYWQgc2NyaXB0IGludG8gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBiaW5hcmllcyBmb2xkZXIKICAgICAgICAgICAgIHVybHJldHJpZXZlKHVybCwgZGlzdHBhdGgpCiAgICAgICAgICAgICBwcm9ncmVzcyA9IHNlbGYucHJvZ3Jlc3MKICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKQEAgLTMxMyw3ICszMjcsNyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdJbnN0YWxsaW5nICVzIC4uLiVzJyAlIChuYW1lLCB0ZXJtKSkKICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgICAgICMgSW5zdGFsbCBpbiB0aGUgZW52CisgICAgICAgICAgICAjIEluc3RhbGwgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQKICAgICAgICAgICAgIGFyZ3MgPSBbY29udGV4dC5lbnZfZXhlLCBmbl0KICAgICAgICAgICAgIHAgPSBQb3BlbihhcmdzLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsIGN3ZD1iaW5wYXRoKQogICAgICAgICAgICAgdDEgPSBUaHJlYWQodGFyZ2V0PXNlbGYucmVhZGVyLCBhcmdzPShwLnN0ZG91dCwgJ3N0ZG91dCcpKQpAQCAtMzMyLDEwICszNDYsMTAgQEAKIAogICAgICAgICBkZWYgaW5zdGFsbF9zZXR1cHRvb2xzKHNlbGYsIGNvbnRleHQpOgogICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICBJbnN0YWxsIHNldHVwdG9vbHMgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgSW5zdGFsbCBzZXR1cHRvb2xzIGluIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LgogCi0gICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZW52aXJvbm1lbnQgY3JlYXRpb24gcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIHVybCA9ICdodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9zZXR1cHRvb2xzL2Rvd25sb2Fkcy9lel9zZXR1cC5weScKICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoY29udGV4dCwgJ3NldHVwdG9vbHMnLCB1cmwpCkBAIC0zNDgsMTAgKzM2MiwxMCBAQAogCiAgICAgICAgIGRlZiBpbnN0YWxsX3BpcChzZWxmLCBjb250ZXh0KToKICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgSW5zdGFsbCBwaXAgaW4gdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgSW5zdGFsbCBwaXAgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKLSAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnZpcm9ubWVudCBjcmVhdGlvbiByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZC4KICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vcmF3LmdpdGh1Yi5jb20vcHlwYS9waXAvbWFzdGVyL2NvbnRyaWIvZ2V0LXBpcC5weScKICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoY29udGV4dCwgJ3BpcCcsIHVybCkKQEAgLTM3NCw3ICszODgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGFyZ2V0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3Rvcmllcy4nKQogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZGlycycsIG1ldGF2YXI9J0VOVl9ESVInLCBuYXJncz0nKycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0EgZGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgZW52aXJvbm1lbnQgaW4uJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXJ0dWFsIGVudmlyb25tZW50LicpCiAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW5vLXNldHVwdG9vbHMnLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdub2Rpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEb24ndCBpbnN0YWxsIHNldHVwdG9vbHMgb3IgcGlwIGluIHRoZSAiCkBAIC0zOTgsMTQgKzQxMywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgcGxhdGZvcm0uJykKICAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tY2xlYXInLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdjbGVhcicsIGhlbHA9J0RlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYgaXQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscmVhZHkgZXhpc3RzLCBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpcnR1YWwgZW52aXJvbm1lbnQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcmVjdG9yeSBpZiBpdCBhbHJlYWR5ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGlzdHMsIGJlZm9yZSB2aXJ0dWFsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbnZpcm9ubWVudCBjcmVhdGlvbi4nKQogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS11cGdyYWRlJywgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndXBncmFkZScsIGhlbHA9J1VwZ3JhZGUgdGhlIGVudmlyb25tZW50ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RvcnkgdG8gdXNlIHRoaXMgdmVyc2lvbiAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgUHl0aG9uLCBhc3N1bWluZyBQeXRob24gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBiZWVuIHVwZ3JhZGVkIGluLXBsYWNlLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGUnLCBoZWxwPSdVcGdyYWRlIHRoZSB2aXJ0dWFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50IGRpcmVjdG9yeSB0byAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgdGhpcyB2ZXJzaW9uIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiwgYXNzdW1pbmcgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBiZWVuIHVwZ3JhZGVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luLXBsYWNlLicpCiAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd2ZXJib3NlJywgaGVscD0nRGlzcGxheSB0aGUgb3V0cHV0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIHRoZSBzY3JpcHRzIHdoaWNoICcKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdCBiL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdAppbmRleCAzN2Y2ODc0Li41YTQyY2M2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CkBAIC0zMDEsNyArMzAxLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi0uLiBmdW5jdGlvbjo6IHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xKQorLi4gZnVuY3Rpb246OiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSwgc291cmNlPU5vbmUpCiAKICAgIElzc3VlIGEgd2FybmluZywgb3IgbWF5YmUgaWdub3JlIGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoZSAqY2F0ZWdvcnkqCiAgICBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYSB3YXJuaW5nIGNhdGVnb3J5IGNsYXNzIChzZWUgYWJvdmUpOyBpdCBkZWZhdWx0cyB0bwpAQCAtMzE5LDggKzMxOSwxNCBAQAogICAgc291cmNlIG9mIDpmdW5jOmBkZXByZWNhdGlvbmAgaXRzZWxmIChzaW5jZSB0aGUgbGF0dGVyIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZQogICAgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZSkuCiAKKyAgICpzb3VyY2UqLCBpZiBzdXBwbGllZCwgaXMgdGhlIGRlc3Ryb3llZCBvYmplY3Qgd2hpY2ggZW1pdHRlZCBhCisgICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgLgogCi0uLiBmdW5jdGlvbjo6IHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKQorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkICpzb3VyY2UqIHBhcmFtZXRlci4KKworCisuLiBmdW5jdGlvbjo6IHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lLCBzb3VyY2U9Tm9uZSkKIAogICAgVGhpcyBpcyBhIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgOmZ1bmM6YHdhcm5gLCBwYXNzaW5nIGluCiAgICBleHBsaWNpdGx5IHRoZSBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgb3B0aW9uYWxseSB0aGUKQEAgLTMzNiw2ICszNDIsMTIgQEAKICAgIHNvdXJjZSBmb3IgbW9kdWxlcyBmb3VuZCBpbiB6aXBmaWxlcyBvciBvdGhlciBub24tZmlsZXN5c3RlbSBpbXBvcnQKICAgIHNvdXJjZXMpLgogCisgICAqc291cmNlKiwgaWYgc3VwcGxpZWQsIGlzIHRoZSBkZXN0cm95ZWQgb2JqZWN0IHdoaWNoIGVtaXR0ZWQgYQorICAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZCB0aGUgKnNvdXJjZSogcGFyYW1ldGVyLgorCiAKIC4uIGZ1bmN0aW9uOjogc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93aW5yZWcucnN0IGIvRG9jL2xpYnJhcnkvd2lucmVnLnJzdAppbmRleCA1MmQ1OTFhLi40OGJkZjE0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS93aW5yZWcucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QKQEAgLTYzNSw3ICs2MzUsNyBAQAogCiAuLiBkYXRhOjogUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4KIAotICAgQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAgQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIDpjb25zdDpgUkVHX0RXT1JEYC4KIAogLi4gZGF0YTo6IFJFR19EV09SRF9CSUdfRU5ESUFOCiAKQEAgLTY1OSw2ICs2NTksMTggQEAKIAogICAgTm8gZGVmaW5lZCB2YWx1ZSB0eXBlLgogCisuLiBkYXRhOjogUkVHX1FXT1JECisKKyAgIEEgNjQtYml0IG51bWJlci4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIGRhdGE6OiBSRUdfUVdPUkRfTElUVExFX0VORElBTgorCisgICBBIDY0LWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBSRUdfUVdPUkRgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gZGF0YTo6IFJFR19SRVNPVVJDRV9MSVNUCiAKICAgIEEgZGV2aWNlLWRyaXZlciByZXNvdXJjZSBsaXN0LgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd2luc291bmQucnN0IGIvRG9jL2xpYnJhcnkvd2luc291bmQucnN0CmluZGV4IGQyYzQyMTAuLjM3MmY3OTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dpbnNvdW5kLnJzdAorKysgYi9Eb2MvbGlicmFyeS93aW5zb3VuZC5yc3QKQEAgLTI1LDcgKzI1LDggQEAKIC4uIGZ1bmN0aW9uOjogUGxheVNvdW5kKHNvdW5kLCBmbGFncykKIAogICAgQ2FsbCB0aGUgdW5kZXJseWluZyA6YzpmdW5jOmBQbGF5U291bmRgIGZ1bmN0aW9uIGZyb20gdGhlIFBsYXRmb3JtIEFQSS4gIFRoZQotICAgKnNvdW5kKiBwYXJhbWV0ZXIgbWF5IGJlIGEgZmlsZW5hbWUsIGF1ZGlvIGRhdGEgYXMgYSBzdHJpbmcsIG9yIGBgTm9uZWBgLiAgSXRzCisgICAqc291bmQqIHBhcmFtZXRlciBtYXkgYmUgYSBmaWxlbmFtZSwgYSBzeXN0ZW0gc291bmQgYWxpYXMsIGF1ZGlvIGRhdGEgYXMgYQorICAgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCwgb3IgYGBOb25lYGAuICBJdHMKICAgIGludGVycHJldGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mICpmbGFncyosIHdoaWNoIGNhbiBiZSBhIGJpdHdpc2UgT1JlZAogICAgY29tYmluYXRpb24gb2YgdGhlIGNvbnN0YW50cyBkZXNjcmliZWQgYmVsb3cuIElmIHRoZSAqc291bmQqIHBhcmFtZXRlciBpcwogICAgYGBOb25lYGAsIGFueSBjdXJyZW50bHkgcGxheWluZyB3YXZlZm9ybSBzb3VuZCBpcyBzdG9wcGVkLiBJZiB0aGUgc3lzdGVtCkBAIC0zOSw3ICs0MCw4IEBACiAgICBzb3VuZCB0byBwbGF5OyBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgLTFgYCwgYGBNQl9JQ09OQVNURVJJU0tgYCwKICAgIGBgTUJfSUNPTkVYQ0xBTUFUSU9OYGAsIGBgTUJfSUNPTkhBTkRgYCwgYGBNQl9JQ09OUVVFU1RJT05gYCwgYW5kIGBgTUJfT0tgYCwgYWxsCiAgICBkZXNjcmliZWQgYmVsb3cuICBUaGUgdmFsdWUgYGAtMWBgIHByb2R1Y2VzIGEgInNpbXBsZSBiZWVwIjsgdGhpcyBpcyB0aGUgZmluYWwKLSAgIGZhbGxiYWNrIGlmIGEgc291bmQgY2Fubm90IGJlIHBsYXllZCBvdGhlcndpc2UuCisgICBmYWxsYmFjayBpZiBhIHNvdW5kIGNhbm5vdCBiZSBwbGF5ZWQgb3RoZXJ3aXNlLiAgSWYgdGhlIHN5c3RlbSBpbmRpY2F0ZXMgYW4KKyAgIGVycm9yLCA6ZXhjOmBSdW50aW1lRXJyb3JgIGlzIHJhaXNlZC4KIAogCiAuLiBkYXRhOjogU05EX0ZJTEVOQU1FCkBAIC05Miw3ICs5NCw3IEBACiAuLiBkYXRhOjogU05EX01FTU9SWQogCiAgICBUaGUgKnNvdW5kKiBwYXJhbWV0ZXIgdG8gOmZ1bmM6YFBsYXlTb3VuZGAgaXMgYSBtZW1vcnkgaW1hZ2Ugb2YgYSBXQVYgZmlsZSwgYXMgYQotICAgc3RyaW5nLgorICAgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YC4KIAogICAgLi4gbm90ZTo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0IGIvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKaW5kZXggYWFkMjdhOC4uYTFkNDQ2OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKQEAgLTEzMyw5ICsxMzMsOSBAQAogICAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBlbnZpcm9uLml0ZW1zKCldCiAgICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBzaW1wbGVfYXBwKQotICAgICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKLSAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgc2ltcGxlX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKKyAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKIAogCiBJbiBhZGRpdGlvbiB0byB0aGUgZW52aXJvbm1lbnQgZnVuY3Rpb25zIGFib3ZlLCB0aGUgOm1vZDpgd3NnaXJlZi51dGlsYCBtb2R1bGUKQEAgLTI4NSwxNCArMjg1LDE0IEBACiAKICAgICAgIGZyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBtYWtlX3NlcnZlciwgZGVtb19hcHAKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCi0gICAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIHBvcnQgODAwMC4uLiIpCisgICAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiBwb3J0IDgwMDAuLi4iKQogCi0gICAgICAjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKLSAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICAgICMgUmVzcG9uZCB0byByZXF1ZXN0cyB1bnRpbCBwcm9jZXNzIGlzIGtpbGxlZAorICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCi0gICAgICAjIEFsdGVybmF0aXZlOiBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0Ci0gICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICAgIyBBbHRlcm5hdGl2ZTogc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAorICAgICAgICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKIAogCiAuLiBmdW5jdGlvbjo6IGRlbW9fYXBwKGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlKQpAQCAtNDMyLDkgKzQzMiw5IEBACiAgICAgICAjIFRoaXMgaXMgdGhlIGFwcGxpY2F0aW9uIHdyYXBwZWQgaW4gYSB2YWxpZGF0b3IKICAgICAgIHZhbGlkYXRvcl9hcHAgPSB2YWxpZGF0b3Ioc2ltcGxlX2FwcCkKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgdmFsaWRhdG9yX2FwcCkKLSAgICAgIHByaW50KCJMaXN0ZW5pbmcgb24gcG9ydCA4MDAwLi4uLiIpCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHZhbGlkYXRvcl9hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJMaXN0ZW5pbmcgb24gcG9ydCA4MDAwLi4uLiIpCisgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIAogOm1vZDpgd3NnaXJlZi5oYW5kbGVyc2AgLS0gc2VydmVyL2dhdGV3YXkgYmFzZSBjbGFzc2VzCkBAIC03NzQsOCArNzc0LDggQEAKICAgICAgICAjIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgZ29pbmcgdG8gYmUgcHJpbnRlZAogICAgICAgIHJldHVybiBbYiJIZWxsbyBXb3JsZCJdCiAKLSAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGhlbGxvX3dvcmxkX2FwcCkKLSAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCisgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBoZWxsb193b3JsZF9hcHApIGFzIGh0dHBkOgorICAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCiAKLSAgICMgU2VydmUgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKLSAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICMgU2VydmUgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKKyAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKaW5kZXggMWM3N2U4NC4uMDUxMWRkZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKQEAgLTE0OCwyOSArMTQ4LDI5IEBACiAgICAgICAgcnBjX3BhdGhzID0gKCcvUlBDMicsKQogCiAgICAjIENyZWF0ZSBzZXJ2ZXIKLSAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyPVJlcXVlc3RIYW5kbGVyKQotICAgc2VydmVyLnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKKyAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1SZXF1ZXN0SGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCiAKLSAgICMgUmVnaXN0ZXIgcG93KCkgZnVuY3Rpb247IHRoaXMgd2lsbCB1c2UgdGhlIHZhbHVlIG9mCi0gICAjIHBvdy5fX25hbWVfXyBhcyB0aGUgbmFtZSwgd2hpY2ggaXMganVzdCAncG93Jy4KLSAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIyBSZWdpc3RlciBwb3coKSBmdW5jdGlvbjsgdGhpcyB3aWxsIHVzZSB0aGUgdmFsdWUgb2YKKyAgICAgICAjIHBvdy5fX25hbWVfXyBhcyB0aGUgbmFtZSwgd2hpY2ggaXMganVzdCAncG93Jy4KKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQogCi0gICAjIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdW5kZXIgYSBkaWZmZXJlbnQgbmFtZQotICAgZGVmIGFkZGVyX2Z1bmN0aW9uKHgseSk6Ci0gICAgICAgcmV0dXJuIHggKyB5Ci0gICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oYWRkZXJfZnVuY3Rpb24sICdhZGQnKQorICAgICAgICMgUmVnaXN0ZXIgYSBmdW5jdGlvbiB1bmRlciBhIGRpZmZlcmVudCBuYW1lCisgICAgICAgZGVmIGFkZGVyX2Z1bmN0aW9uKHgseSk6CisgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihhZGRlcl9mdW5jdGlvbiwgJ2FkZCcpCiAKLSAgICMgUmVnaXN0ZXIgYW4gaW5zdGFuY2U7IGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgaW5zdGFuY2UgYXJlCi0gICAjIHB1Ymxpc2hlZCBhcyBYTUwtUlBDIG1ldGhvZHMgKGluIHRoaXMgY2FzZSwganVzdCAnbXVsJykuCi0gICBjbGFzcyBNeUZ1bmNzOgotICAgICAgIGRlZiBtdWwoc2VsZiwgeCwgeSk6Ci0gICAgICAgICAgIHJldHVybiB4ICogeQorICAgICAgICMgUmVnaXN0ZXIgYW4gaW5zdGFuY2U7IGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgaW5zdGFuY2UgYXJlCisgICAgICAgIyBwdWJsaXNoZWQgYXMgWE1MLVJQQyBtZXRob2RzIChpbiB0aGlzIGNhc2UsIGp1c3QgJ211bCcpLgorICAgICAgIGNsYXNzIE15RnVuY3M6CisgICAgICAgICAgIGRlZiBtdWwoc2VsZiwgeCwgeSk6CisgICAgICAgICAgICAgICByZXR1cm4geCAqIHkKIAotICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKE15RnVuY3MoKSkKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoTXlGdW5jcygpKQogCi0gICAjIFJ1biB0aGUgc2VydmVyJ3MgbWFpbiBsb29wCi0gICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgIyBSdW4gdGhlIHNlcnZlcidzIG1haW4gbG9vcAorICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKIAogVGhlIGZvbGxvd2luZyBjbGllbnQgY29kZSB3aWxsIGNhbGwgdGhlIG1ldGhvZHMgbWFkZSBhdmFpbGFibGUgYnkgdGhlIHByZWNlZGluZwogc2VydmVyOjoKQEAgLTIwNywxOCArMjA3LDE3IEBACiAgICAgICAgICAgICBkZWYgZ2V0Q3VycmVudFRpbWUoKToKICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKIAotICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQotICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKLSAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQotICAgIHRyeToKLSAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCi0gICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpIGFzIHNlcnZlcjoKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQorICAgICAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKIAogVGhpcyBFeGFtcGxlU2VydmljZSBkZW1vIGNhbiBiZSBpbnZva2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZTo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0IGIvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKaW5kZXggYWJlMzhjNC4uNmM5ZDIwNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKQEAgLTIwNSwxOCArMjA1LDEzIEBACiAgICBSZXR1cm4gYSBsaXN0IG9mIGFyY2hpdmUgbWVtYmVycyBieSBuYW1lLgogCiAKLS4uIGluZGV4OjoKLSAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyB6aXBmaWxlLlppcEZpbGUub3BlbiBtZXRob2QKKy4uIG1ldGhvZDo6IFppcEZpbGUub3BlbihuYW1lLCBtb2RlPSdyJywgcHdkPU5vbmUsICosIGZvcmNlX3ppcDY0PUZhbHNlKQogCi0uLiBtZXRob2Q6OiBaaXBGaWxlLm9wZW4obmFtZSwgbW9kZT0ncicsIHB3ZD1Ob25lKQotCi0gICBFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgYXMgYSBmaWxlLWxpa2Ugb2JqZWN0IChaaXBFeHRGaWxlKS4gKm5hbWUqCi0gICBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZSwgb3IgYSA6Y2xhc3M6YFppcEluZm9gIG9iamVjdC4gVGhlCi0gICAqbW9kZSogcGFyYW1ldGVyLCBpZiBpbmNsdWRlZCwgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGAncidgYCAodGhlCi0gICBkZWZhdWx0KSwgYGAnVSdgYCwgb3IgYGAnclUnYGAuIENob29zaW5nIGBgJ1UnYGAgb3IgIGBgJ3JVJ2BgIHdpbGwgZW5hYmxlCi0gICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBzdXBwb3J0IGluIHRoZSByZWFkLW9ubHkgb2JqZWN0LiAgKnB3ZCogaXMgdGhlCi0gICBwYXNzd29yZCB1c2VkIGZvciBlbmNyeXB0ZWQgZmlsZXMuICBDYWxsaW5nICA6bWV0aDpgLm9wZW5gIG9uIGEgY2xvc2VkCi0gICBaaXBGaWxlIHdpbGwgcmFpc2UgYSAgOmV4YzpgUnVudGltZUVycm9yYC4KKyAgIEFjY2VzcyBhIG1lbWJlciBvZiB0aGUgYXJjaGl2ZSBhcyBhIGJpbmFyeSBmaWxlLWxpa2Ugb2JqZWN0LiAgKm5hbWUqCisgICBjYW4gYmUgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSB3aXRoaW4gdGhlIGFyY2hpdmUgb3IgYSA6Y2xhc3M6YFppcEluZm9gCisgICBvYmplY3QuICBUaGUgKm1vZGUqIHBhcmFtZXRlciwgaWYgaW5jbHVkZWQsIG11c3QgYmUgYGAncidgYCAodGhlIGRlZmF1bHQpCisgICBvciBgYCd3J2BgLiAgKnB3ZCogaXMgdGhlIHBhc3N3b3JkIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgWklQIGZpbGVzLgorICAgQ2FsbGluZyA6bWV0aDpgLm9wZW5gIG9uIGEgY2xvc2VkIFppcEZpbGUgd2lsbCByYWlzZSBhIDpleGM6YFJ1bnRpbWVFcnJvcmAuCiAKICAgIDptZXRoOmB+WmlwRmlsZS5vcGVuYCBpcyBhbHNvIGEgY29udGV4dCBtYW5hZ2VyIGFuZCB0aGVyZWZvcmUgc3VwcG9ydHMgdGhlCiAgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50OjoKQEAgLTIyNSwxNyArMjIwLDIzIEBACiAgICAgICAgICAgd2l0aCBteXppcC5vcGVuKCdlZ2dzLnR4dCcpIGFzIG15ZmlsZToKICAgICAgICAgICAgICAgcHJpbnQobXlmaWxlLnJlYWQoKSkKIAotICAgLi4gbm90ZTo6CisgICBXaXRoICptb2RlKiBgYCdyJ2BgIHRoZSBmaWxlLWxpa2Ugb2JqZWN0CisgICAoYGBaaXBFeHRGaWxlYGApIGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS5yZWFkYCwgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVgLAorICAgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVzYCwgOm1ldGg6YF9faXRlcl9fYCwKKyAgIDptZXRoOmB+aXRlcmF0b3IuX19uZXh0X19gLiAgVGhlc2Ugb2JqZWN0cyBjYW4gb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mCisgICB0aGUgWmlwRmlsZS4KIAotICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gICAgICA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRgLCA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZWAsCi0gICAgICA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZXNgLCA6bWV0aDpgX19pdGVyX19gLAotICAgICAgOm1ldGg6YH5pdGVyYXRvci5fX25leHRfX2AuCisgICBXaXRoIGBgbW9kZT0ndydgYCwgYSB3cml0YWJsZSBmaWxlIGhhbmRsZSBpcyByZXR1cm5lZCwgd2hpY2ggc3VwcG9ydHMgdGhlCisgICA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLndyaXRlYCBtZXRob2QuICBXaGlsZSBhIHdyaXRhYmxlIGZpbGUgaGFuZGxlIGlzIG9wZW4sCisgICBhdHRlbXB0aW5nIHRvIHJlYWQgb3Igd3JpdGUgb3RoZXIgZmlsZXMgaW4gdGhlIFpJUCBmaWxlIHdpbGwgcmFpc2UgYQorICAgOmV4YzpgUnVudGltZUVycm9yYC4KIAotICAgLi4gbm90ZTo6Ci0KLSAgICAgIE9iamVjdHMgcmV0dXJuZWQgYnkgOm1ldGg6YC5vcGVuYCBjYW4gb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZQotICAgICAgWmlwRmlsZS4KKyAgIFdoZW4gd3JpdGluZyBhIGZpbGUsIGlmIHRoZSBmaWxlIHNpemUgaXMgbm90IGtub3duIGluIGFkdmFuY2UgYnV0IG1heSBleGNlZWQKKyAgIDIgR2lCLCBwYXNzIGBgZm9yY2VfemlwNjQ9VHJ1ZWBgIHRvIGVuc3VyZSB0aGF0IHRoZSBoZWFkZXIgZm9ybWF0IGlzCisgICBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgbGFyZ2UgZmlsZXMuICBJZiB0aGUgZmlsZSBzaXplIGlzIGtub3duIGluIGFkdmFuY2UsCisgICBjb25zdHJ1Y3QgYSA6Y2xhc3M6YFppcEluZm9gIG9iamVjdCB3aXRoIDphdHRyOmB+WmlwSW5mby5maWxlX3NpemVgIHNldCwgYW5kCisgICB1c2UgdGhhdCBhcyB0aGUgKm5hbWUqIHBhcmFtZXRlci4KIAogICAgLi4gbm90ZTo6CiAKQEAgLTI0MywxMCArMjQ0LDE0IEBACiAgICAgICBvciBhIDpjbGFzczpgWmlwSW5mb2Agb2JqZWN0LiAgWW91IHdpbGwgYXBwcmVjaWF0ZSB0aGlzIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYQogICAgICAgWklQIGZpbGUgdGhhdCBjb250YWlucyBtZW1iZXJzIHdpdGggZHVwbGljYXRlIG5hbWVzLgogCi0gICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjQgMy42Ci0gICAgICBUaGUgYGAnVSdgYCBvciAgYGAnclUnYGAgbW9kZS4gIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUmVtb3ZlZCBzdXBwb3J0IG9mIGBgbW9kZT0nVSdgYC4gIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nCiAgICAgICBjb21wcmVzc2VkIHRleHQgZmlsZXMgaW4gOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2AgbW9kZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDptZXRoOmBvcGVuYCBjYW4gbm93IGJlIHVzZWQgdG8gd3JpdGUgZmlsZXMgaW50byB0aGUgYXJjaGl2ZSB3aXRoIHRoZQorICAgICAgYGBtb2RlPSd3J2BgIG9wdGlvbi4KKwogLi4gbWV0aG9kOjogWmlwRmlsZS5leHRyYWN0KG1lbWJlciwgcGF0aD1Ob25lLCBwd2Q9Tm9uZSkKIAogICAgRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OyAqbWVtYmVyKgpAQCAtNDY1LDcgKzQ3MCwzMSBAQAogOm1ldGg6YC5pbmZvbGlzdGAgbWV0aG9kcyBvZiA6Y2xhc3M6YFppcEZpbGVgIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdG9yZXMKIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1lbWJlciBvZiB0aGUgWklQIGFyY2hpdmUuCiAKLUluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKK1RoZXJlIGlzIG9uZSBjbGFzc21ldGhvZCB0byBtYWtlIGEgOmNsYXNzOmBaaXBJbmZvYCBpbnN0YW5jZSBmb3IgYSBmaWxlc3lzdGVtCitmaWxlOgorCisuLiBjbGFzc21ldGhvZDo6IFppcEluZm8uZnJvbV9maWxlKGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUpCisKKyAgIENvbnN0cnVjdCBhIDpjbGFzczpgWmlwSW5mb2AgaW5zdGFuY2UgZm9yIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbSwgaW4KKyAgIHByZXBhcmF0aW9uIGZvciBhZGRpbmcgaXQgdG8gYSB6aXAgZmlsZS4KKworICAgKmZpbGVuYW1lKiBzaG91bGQgYmUgdGhlIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgSWYgKmFyY25hbWUqIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgbmFtZSB3aXRoaW4gdGhlIGFyY2hpdmUuCisgICBJZiAqYXJjbmFtZSogaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgd2lsbCBiZSB0aGUgc2FtZSBhcyAqZmlsZW5hbWUqLCBidXQKKyAgIHdpdGggYW55IGRyaXZlIGxldHRlciBhbmQgbGVhZGluZyBwYXRoIHNlcGFyYXRvcnMgcmVtb3ZlZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK0luc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbmQgYXR0cmlidXRlczoKKworLi4gbWV0aG9kOjogWmlwSW5mby5pc19kaXIoKQorCisgICBSZXR1cm4gVHJ1ZSBpZiB0aGlzIGFyY2hpdmUgbWVtYmVyIGlzIGEgZGlyZWN0b3J5LgorCisgICBUaGlzIHVzZXMgdGhlIGVudHJ5J3MgbmFtZTogZGlyZWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBlbmQgd2l0aCBgYC9gYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CiAKIAogLi4gYXR0cmlidXRlOjogWmlwSW5mby5maWxlbmFtZQpAQCAtNTc0LDQgKzYwMyw1IEBACiAKICAgIFNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlLgogCisKIC4uIF9QS1pJUCBBcHBsaWNhdGlvbiBOb3RlOiBodHRwczovL3Brd2FyZS5jYWNoZWZseS5uZXQvd2ViZG9jcy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvemxpYi5yc3QgYi9Eb2MvbGlicmFyeS96bGliLnJzdAppbmRleCAxZGU3YmFlLi4zZDc0MmFiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS96bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS96bGliLnJzdApAQCAtNDcsMTQgKzQ3LDE5IEBACiAgICAgICBwbGF0Zm9ybXMsIHVzZSBgYGFkbGVyMzIoZGF0YSkgJiAweGZmZmZmZmZmYGAuCiAKIAotLi4gZnVuY3Rpb246OiBjb21wcmVzcyhkYXRhWywgbGV2ZWxdKQorLi4gZnVuY3Rpb246OiBjb21wcmVzcyhkYXRhLCBsZXZlbD0tMSkKIAogICAgQ29tcHJlc3NlcyB0aGUgYnl0ZXMgaW4gKmRhdGEqLCByZXR1cm5pbmcgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyBjb21wcmVzc2VkIGRhdGEuCi0gICAqbGV2ZWwqIGlzIGFuIGludGVnZXIgZnJvbSBgYDBgYCB0byBgYDlgYCBjb250cm9sbGluZyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb247CisgICAqbGV2ZWwqIGlzIGFuIGludGVnZXIgZnJvbSBgYDBgYCB0byBgYDlgYCBvciBgYC0xYGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOwogICAgYGAxYGAgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLCBgYDlgYCBpcyBzbG93ZXN0IGFuZAotICAgcHJvZHVjZXMgdGhlIG1vc3QuICBgYDBgYCBpcyBubyBjb21wcmVzc2lvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgNmBgLgorICAgcHJvZHVjZXMgdGhlIG1vc3QuICBgYDBgYCBpcyBubyBjb21wcmVzc2lvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgLTFgYAorICAgKFpfREVGQVVMVF9DT01QUkVTU0lPTikuICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVwcmVzZW50cyBhIGRlZmF1bHQKKyAgIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgogICAgUmFpc2VzIHRoZSA6ZXhjOmBlcnJvcmAgZXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAqbGV2ZWwqIGNhbiBub3cgYmUgdXNlZCBhcyBhIGtleXdvcmQgcGFyYW1ldGVyLgorCiAKIC4uIGZ1bmN0aW9uOjogY29tcHJlc3NvYmoobGV2ZWw9LTEsIG1ldGhvZD1ERUZMQVRFRCwgd2JpdHM9MTUsIG1lbUxldmVsPTgsIHN0cmF0ZWd5PVpfREVGQVVMVF9TVFJBVEVHWVssIHpkaWN0XSkKIApAQCAtMTI0LDcgKzEyOSw3IEBACiAgICAgICBwbGF0Zm9ybXMsIHVzZSBgYGNyYzMyKGRhdGEpICYgMHhmZmZmZmZmZmBgLgogCiAKLS4uIGZ1bmN0aW9uOjogZGVjb21wcmVzcyhkYXRhWywgd2JpdHNbLCBidWZzaXplXV0pCisuLiBmdW5jdGlvbjo6IGRlY29tcHJlc3MoZGF0YSwgd2JpdHM9TUFYX1dCSVRTLCBidWZzaXplPURFRl9CVUZfU0laRSkKIAogICAgRGVjb21wcmVzc2VzIHRoZSBieXRlcyBpbiAqZGF0YSosIHJldHVybmluZyBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIHRoZQogICAgdW5jb21wcmVzc2VkIGRhdGEuICBUaGUgKndiaXRzKiBwYXJhbWV0ZXIgZGVwZW5kcyBvbgpAQCAtMTU5LDE0ICsxNjQsMTYgQEAKICAgIFdoZW4gZGVjb21wcmVzc2luZyBhIHN0cmVhbSwgdGhlIHdpbmRvdyBzaXplIG11c3Qgbm90IGJlIHNtYWxsZXIKICAgIHRoYW4gdGhlIHNpemUgb3JpZ2luYWxseSB1c2VkIHRvIGNvbXByZXNzIHRoZSBzdHJlYW07IHVzaW5nIGEgdG9vLXNtYWxsCiAgICB2YWx1ZSBtYXkgcmVzdWx0IGluIGFuIDpleGM6YGVycm9yYCBleGNlcHRpb24uIFRoZSBkZWZhdWx0ICp3Yml0cyogdmFsdWUKLSAgIGlzIDE1LCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgbGFyZ2VzdCB3aW5kb3cgc2l6ZSBhbmQgcmVxdWlyZXMgYSB6bGliCi0gICBoZWFkZXIgYW5kIHRyYWlsZXIgdG8gYmUgaW5jbHVkZWQuCisgICBjb3JyZXNwb25kcyB0byB0aGUgbGFyZ2VzdCB3aW5kb3cgc2l6ZSBhbmQgcmVxdWlyZXMgYSB6bGliIGhlYWRlciBhbmQKKyAgIHRyYWlsZXIgdG8gYmUgaW5jbHVkZWQuCiAKICAgICpidWZzaXplKiBpcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCB0byBob2xkIGRlY29tcHJlc3NlZCBkYXRhLiAgSWYKICAgIG1vcmUgc3BhY2UgaXMgcmVxdWlyZWQsIHRoZSBidWZmZXIgc2l6ZSB3aWxsIGJlIGluY3JlYXNlZCBhcyBuZWVkZWQsIHNvIHlvdQogICAgZG9uJ3QgaGF2ZSB0byBnZXQgdGhpcyB2YWx1ZSBleGFjdGx5IHJpZ2h0OyB0dW5pbmcgaXQgd2lsbCBvbmx5IHNhdmUgYSBmZXcgY2FsbHMKLSAgIHRvIDpjOmZ1bmM6YG1hbGxvY2AuICBUaGUgZGVmYXVsdCBzaXplIGlzIDE2Mzg0LgorICAgdG8gOmM6ZnVuYzpgbWFsbG9jYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICp3Yml0cyogYW5kICpidWZzaXplKiBjYW4gYmUgdXNlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cy4KIAogLi4gZnVuY3Rpb246OiBkZWNvbXByZXNzb2JqKHdiaXRzPTE1WywgemRpY3RdKQogCkBAIC0yNTIsNyArMjU5LDcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCiAKLS4uIG1ldGhvZDo6IERlY29tcHJlc3MuZGVjb21wcmVzcyhkYXRhWywgbWF4X2xlbmd0aF0pCisuLiBtZXRob2Q6OiBEZWNvbXByZXNzLmRlY29tcHJlc3MoZGF0YSwgbWF4X2xlbmd0aD0wKQogCiAgICBEZWNvbXByZXNzICpkYXRhKiwgcmV0dXJuaW5nIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVuY29tcHJlc3NlZCBkYXRhCiAgICBjb3JyZXNwb25kaW5nIHRvIGF0IGxlYXN0IHBhcnQgb2YgdGhlIGRhdGEgaW4gKnN0cmluZyouICBUaGlzIGRhdGEgc2hvdWxkIGJlCkBAIC0yNjQsOSArMjcxLDExIEBACiAgICBubyBsb25nZXIgdGhhbiAqbWF4X2xlbmd0aCouIFRoaXMgbWF5IG1lYW4gdGhhdCBub3QgYWxsIG9mIHRoZSBjb21wcmVzc2VkIGlucHV0CiAgICBjYW4gYmUgcHJvY2Vzc2VkOyBhbmQgdW5jb25zdW1lZCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBhdHRyaWJ1dGUKICAgIDphdHRyOmB1bmNvbnN1bWVkX3RhaWxgLiBUaGlzIGJ5dGVzdHJpbmcgbXVzdCBiZSBwYXNzZWQgdG8gYSBzdWJzZXF1ZW50IGNhbGwgdG8KLSAgIDptZXRoOmBkZWNvbXByZXNzYCBpZiBkZWNvbXByZXNzaW9uIGlzIHRvIGNvbnRpbnVlLiAgSWYgKm1heF9sZW5ndGgqIGlzIG5vdAotICAgc3VwcGxpZWQgdGhlbiB0aGUgd2hvbGUgaW5wdXQgaXMgZGVjb21wcmVzc2VkLCBhbmQgOmF0dHI6YHVuY29uc3VtZWRfdGFpbGAgaXMKLSAgIGVtcHR5LgorICAgOm1ldGg6YGRlY29tcHJlc3NgIGlmIGRlY29tcHJlc3Npb24gaXMgdG8gY29udGludWUuICBJZiAqbWF4X2xlbmd0aCogaXMgemVybworICAgdGhlbiB0aGUgd2hvbGUgaW5wdXQgaXMgZGVjb21wcmVzc2VkLCBhbmQgOmF0dHI6YHVuY29uc3VtZWRfdGFpbGAgaXMgZW1wdHkuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAqbWF4X2xlbmd0aCogY2FuIGJlIHVzZWQgYXMgYSBrZXl3b3JkIGFyZ3VtZW50LgogCiAKIC4uIG1ldGhvZDo6IERlY29tcHJlc3MuZmx1c2goW2xlbmd0aF0pCmRpZmYgLS1naXQgYS9Eb2MvbWFrZS5iYXQgYi9Eb2MvbWFrZS5iYXQKaW5kZXggNWFiODA4NS4uZGExZjg3NiAxMDA2NDQKLS0tIGEvRG9jL21ha2UuYmF0CisrKyBiL0RvYy9tYWtlLmJhdApAQCAtNDAsNyArNDAsNyBAQAogICAgIGdvdG8gZW5kDQogKQ0KIA0KLSVTUEhJTlhCVUlMRCUgMj4gbnVsDQorJVNQSElOWEJVSUxEJSA+bnVsIDI+IG51bA0KIGlmIGVycm9ybGV2ZWwgOTAwOSAoDQogICAgIGVjaG8uDQogICAgIGVjaG8uVGhlICdzcGhpbngtYnVpbGQnIGNvbW1hbmQgd2FzIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHlvdSBoYXZlIFNwaGlueA0KZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0IGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKaW5kZXggODhiOTRlYS4uMmVhYjI5YSAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKQEAgLTQ3MSwxMCArNDcxLDEwIEBACiAgICBkZWNvcmF0b3JzOiBgZGVjb3JhdG9yYCsKICAgIGRlY29yYXRvcjogIkAiIGBkb3R0ZWRfbmFtZWAgWyIoIiBbYGFyZ3VtZW50X2xpc3RgIFsiLCJdXSAiKSJdIE5FV0xJTkUKICAgIGRvdHRlZF9uYW1lOiBgaWRlbnRpZmllcmAgKCIuIiBgaWRlbnRpZmllcmApKgotICAgcGFyYW1ldGVyX2xpc3Q6IChgZGVmcGFyYW1ldGVyYCAiLCIpKgotICAgICAgICAgICAgICAgICA6IHwgIioiIFtgcGFyYW1ldGVyYF0gKCIsIiBgZGVmcGFyYW1ldGVyYCkqIFsiLCIgIioqIiBgcGFyYW1ldGVyYF0KLSAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAKLSAgICAgICAgICAgICAgICAgOiB8IGBkZWZwYXJhbWV0ZXJgIFsiLCJdICkKKyAgIHBhcmFtZXRlcl9saXN0OiBgZGVmcGFyYW1ldGVyYCAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbYHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzYF1dCisgICAgICAgICAgICAgICAgIDogfCBgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgCisgICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnczogIioiIFtgcGFyYW1ldGVyYF0gKCIsIiBgZGVmcGFyYW1ldGVyYCkqIFsiLCIgWyIqKiIgYHBhcmFtZXRlcmAgWyIsIl1dXQorICAgICAgICAgICAgICAgICAgICAgICAgIDogfCAiKioiIGBwYXJhbWV0ZXJgIFsiLCJdCiAgICBwYXJhbWV0ZXI6IGBpZGVudGlmaWVyYCBbIjoiIGBleHByZXNzaW9uYF0KICAgIGRlZnBhcmFtZXRlcjogYHBhcmFtZXRlcmAgWyI9IiBgZXhwcmVzc2lvbmBdCiAgICBmdW5jbmFtZTogYGlkZW50aWZpZXJgCkBAIC02MzIsNiArNjMyLDE3IEBACiBkaWN0aW9uYXJ5LiAgVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsCiBuYW1lc3BhY2UuCiAKK1RoZSBvcmRlciBpbiB3aGljaCBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBib2R5IGlzIHByZXNlcnZlZAoraW4gdGhlIGBgX19kZWZpbml0aW9uX29yZGVyX19gYCBhdHRyaWJ1dGUgb24gdGhlIG5ldyBjbGFzcy4gIElmIHRoYXQgb3JkZXIKK2lzIG5vdCBrbm93biB0aGVuIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHRvIDpjb25zdDpgTm9uZWAuICBUaGUgY2xhc3MgYm9keQorbWF5IGluY2x1ZGUgYSBgYF9fZGVmaW5pdGlvbl9vcmRlcl9fYGAgYXR0cmlidXRlLiAgSW4gdGhhdCBjYXNlIGl0IGlzIHVzZWQKK2RpcmVjdGx5LiAgVGhlIHZhbHVlIG11c3QgYmUgYSB0dXBsZSBvZiBpZGVudGlmaWVycyBvciBgYE5vbmVgYCwgb3RoZXJ3aXNlCis6ZXhjOmBUeXBlRXJyb3JgIHdpbGwgYmUgcmFpc2VkIHdoZW4gdGhlIGNsYXNzIHN0YXRlbWVudCBpcyBleGVjdXRlZC4KKworLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgQWRkIGBgX19kZWZpbml0aW9uX29yZGVyX19gYCB0byBjbGFzc2VzLgorCiBDbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nIDpyZWY6YG1ldGFjbGFzc2VzIDxtZXRhY2xhc3Nlcz5gLgogCiBDbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsIDo6CmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QgYi9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKaW5kZXggNjg5NGM3Yy4uMDA3ODVlZCAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdApAQCAtMTA2Myw2ICsxMDYzLDEyIEBACiBvcGVyYXRpb24gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseQogOmV4YzpgQXR0cmlidXRlRXJyb3JgIG9yIDpleGM6YFR5cGVFcnJvcmApLgogCitTZXR0aW5nIGEgc3BlY2lhbCBtZXRob2QgdG8gYGBOb25lYGAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKK29wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIGlmIGEgY2xhc3Mgc2V0cworOm1ldGg6YF9faXRlcl9fYCB0byBgYE5vbmVgYCwgdGhlIGNsYXNzIGlzIG5vdCBpdGVyYWJsZSwgc28gY2FsbGluZworOmZ1bmM6YGl0ZXJgIG9uIGl0cyBpbnN0YW5jZXMgd2lsbCByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAgKHdpdGhvdXQKK2ZhbGxpbmcgYmFjayB0byA6bWV0aDpgX19nZXRpdGVtX19gKS4gWyNdXworCiBXaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzIGltcG9ydGFudCB0aGF0CiB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0IG1ha2VzIHNlbnNlIGZvciB0aGUKIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lIHNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsCkBAIC0xMjMzLDggKzEyMzksOSBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKIAotICAgQ2FsbGVkIGJ5IHRoZSA6ZnVuYzpgZm9ybWF0YCBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlCi0gICA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIG9mIGNsYXNzIDpjbGFzczpgc3RyYCkgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiCisgICBDYWxsZWQgYnkgdGhlIDpmdW5jOmBmb3JtYXRgIGJ1aWx0LWluIGZ1bmN0aW9uLAorICAgYW5kIGJ5IGV4dGVuc2lvbiwgZXZhbHVhdGlvbiBvZiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCisgICA8Zi1zdHJpbmdzPmAgYW5kIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIKICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSBgYGZvcm1hdF9zcGVjYGAgYXJndW1lbnQgaXMKICAgIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuCiAgICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGBgZm9ybWF0X3NwZWNgYCBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZQpAQCAtMTQ5MSw2ICsxNDk4LDE0IEBACiAgICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXIgY2xhc3MuCiAKIAorLi4gbWV0aG9kOjogb2JqZWN0Ll9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSkKKworICAgQ2FsbGVkIGF0IHRoZSB0aW1lIHRoZSBvd25pbmcgY2xhc3MgKm93bmVyKiBpcyBjcmVhdGVkLiBUaGUKKyAgIGRlc2NyaXB0b3IgaGFzIGJlZW4gYXNzaWduZWQgdG8gKm5hbWUqLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBUaGUgYXR0cmlidXRlIDphdHRyOmBfX29iamNsYXNzX19gIGlzIGludGVycHJldGVkIGJ5IHRoZSA6bW9kOmBpbnNwZWN0YCBtb2R1bGUKIGFzIHNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXMKIGFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzcyBhdHRyaWJ1dGVzKS4KQEAgLTE2MjgsMTEgKzE2NDMsNTYgQEAKICogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lICpfX3Nsb3RzX18qLgogCiAKLS4uIF9tZXRhY2xhc3NlczoKKy4uIF9jbGFzcy1jdXN0b21pemF0aW9uOgogCiBDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorV2hlbmV2ZXIgYSBjbGFzcyBpbmhlcml0cyBmcm9tIGFub3RoZXIgY2xhc3MsICpfX2luaXRfc3ViY2xhc3NfXyogaXMKK2NhbGxlZCBvbiB0aGF0IGNsYXNzLiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgY2xhc3NlcyB3aGljaAorY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBzdWJjbGFzc2VzLiBUaGlzIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBjbGFzcworZGVjb3JhdG9ycywgYnV0IHdoZXJlIGNsYXNzIGRlY29yYXRvcnMgb25seSBhZmZlY3QgdGhlIHNwZWNpZmljIGNsYXNzIHRoZXkncmUKK2FwcGxpZWQgdG8sIGBgX19pbml0X3N1YmNsYXNzX19gYCBzb2xlbHkgYXBwbGllcyB0byBmdXR1cmUgc3ViY2xhc3NlcyBvZiB0aGUKK2NsYXNzIGRlZmluaW5nIHRoZSBtZXRob2QuCisKKy4uIGNsYXNzbWV0aG9kOjogb2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fKGNscykKKworICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb250YWluaW5nIGNsYXNzIGlzIHN1YmNsYXNzZWQuCisgICAqY2xzKiBpcyB0aGVuIHRoZSBuZXcgc3ViY2xhc3MuIElmIGRlZmluZWQgYXMgYSBub3JtYWwgaW5zdGFuY2UgbWV0aG9kLAorICAgdGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBjbGFzcyBtZXRob2QuCisKKyAgIEtleXdvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBnaXZlbiB0byBhIG5ldyBjbGFzcyBhcmUgcGFzc2VkIHRvCisgICB0aGUgcGFyZW50J3MgY2xhc3MgYGBfX2luaXRfc3ViY2xhc3NfX2BgLiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICBvdGhlciBjbGFzc2VzIHVzaW5nIGBgX19pbml0X3N1YmNsYXNzX19gYCwgb25lIHNob3VsZCB0YWtlIG91dCB0aGUKKyAgIG5lZWRlZCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgcGFzcyB0aGUgb3RoZXJzIG92ZXIgdG8gdGhlIGJhc2UKKyAgIGNsYXNzLCBhcyBpbjo6CisKKyAgICAgICBjbGFzcyBQaGlsb3NvcGhlcjoKKyAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgZGVmYXVsdF9uYW1lLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgY2xzLmRlZmF1bHRfbmFtZSA9IGRlZmF1bHRfbmFtZQorCisgICAgICAgY2xhc3MgQXVzdHJhbGlhblBoaWxvc29waGVyKFBoaWxvc29waGVyLCBkZWZhdWx0X25hbWU9IkJydWNlIik6CisgICAgICAgICAgIHBhc3MKKworICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYGBvYmplY3QuX19pbml0X3N1YmNsYXNzX19gYCBkb2VzCisgICBub3RoaW5nLCBidXQgcmFpc2VzIGFuIGVycm9yIGlmIGl0IGlzIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBUaGUgbWV0YWNsYXNzIGhpbnQgYGBtZXRhY2xhc3NgYCBpcyBjb25zdW1lZCBieSB0aGUgcmVzdCBvZiB0aGUgdHlwZQorICAgICAgbWFjaGluZXJ5LCBhbmQgaXMgbmV2ZXIgcGFzc2VkIHRvIGBgX19pbml0X3N1YmNsYXNzX19gYCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICBUaGUgYWN0dWFsIG1ldGFjbGFzcyAocmF0aGVyIHRoYW4gdGhlIGV4cGxpY2l0IGhpbnQpIGNhbiBiZSBhY2Nlc3NlZCBhcworICAgICAgYGB0eXBlKGNscylgYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gX21ldGFjbGFzc2VzOgorCitNZXRhY2xhc3NlcworXl5eXl5eXl5eXl4KKwogQnkgZGVmYXVsdCwgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgOmZ1bmM6YHR5cGVgLiBUaGUgY2xhc3MgYm9keSBpcwogZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZQogcmVzdWx0IG9mIGBgdHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKWBgLgpAQCAtMTY5MCw3ICsxNzUwLDE0IEBACiBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLCBpZiBhbnksIGNvbWUgZnJvbSB0aGUgY2xhc3MgZGVmaW5pdGlvbikuCiAKIElmIHRoZSBtZXRhY2xhc3MgaGFzIG5vIGBgX19wcmVwYXJlX19gYCBhdHRyaWJ1dGUsIHRoZW4gdGhlIGNsYXNzIG5hbWVzcGFjZQotaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgOmZ1bmM6YGRpY3RgIGluc3RhbmNlLgoraXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgb3JkZXJlZCBtYXBwaW5nLgorCisuLiBpbXBsLWRldGFpbDo6CisKKyAgIEluIENQeXRob24gdGhlIGRlZmF1bHQgaXMgOmNsYXNzOmBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdGAuCisKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICBEZWZhdWx0cyB0byA6Y2xhc3M6YGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0YCBpbnN0ZWFkIG9mIDpmdW5jOmBkaWN0YC4KIAogLi4gc2VlYWxzbzo6CiAKQEAgLTIwNTksNyArMjEyNiw3IEBACiAgICAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGBAYGAsIGBgL2BgLCBgYC8vYGAsIGBgJWBgLCA6ZnVuYzpgZGl2bW9kYCwKICAgIDpmdW5jOmBwb3dgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKSB3aXRoIHJlZmxlY3RlZAogICAgKHN3YXBwZWQpIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXMKLSAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQKKyAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBbI11fIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudAogICAgdHlwZXMuIFsjXV8gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcwogICAgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiA6bWV0aDpgX19yc3ViX19gIG1ldGhvZCwgYGB5Ll9fcnN1Yl9fKHgpYGAKICAgIGlzIGNhbGxlZCBpZiBgYHguX19zdWJfXyh5KWBgIHJldHVybnMgKk5vdEltcGxlbWVudGVkKi4KQEAgLTI0NzUsNiArMjU0MiwxNyBAQAogICAgY29udHJvbGxlZCBjb25kaXRpb25zLiBJdCBnZW5lcmFsbHkgaXNuJ3QgYSBnb29kIGlkZWEgdGhvdWdoLCBzaW5jZSBpdCBjYW4KICAgIGxlYWQgdG8gc29tZSB2ZXJ5IHN0cmFuZ2UgYmVoYXZpb3VyIGlmIGl0IGlzIGhhbmRsZWQgaW5jb3JyZWN0bHkuCiAKKy4uIFsjXSBUaGUgOm1ldGg6YF9faGFzaF9fYCwgOm1ldGg6YF9faXRlcl9fYCwgOm1ldGg6YF9fcmV2ZXJzZWRfX2AsIGFuZAorICAgOm1ldGg6YF9fY29udGFpbnNfX2AgbWV0aG9kcyBoYXZlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoaXM7IG90aGVycworICAgd2lsbCBzdGlsbCByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAsIGJ1dCBtYXkgZG8gc28gYnkgcmVseWluZyBvbgorICAgdGhlIGJlaGF2aW9yIHRoYXQgYGBOb25lYGAgaXMgbm90IGNhbGxhYmxlLgorCisuLiBbI10gIkRvZXMgbm90IHN1cHBvcnQiIGhlcmUgbWVhbnMgdGhhdCB0aGUgY2xhc3MgaGFzIG5vIHN1Y2ggbWV0aG9kLCBvcgorICAgdGhlIG1ldGhvZCByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYC4gIERvIG5vdCBzZXQgdGhlIG1ldGhvZCB0bworICAgYGBOb25lYGAgaWYgeW91IHdhbnQgdG8gZm9yY2UgZmFsbGJhY2sgdG8gdGhlIHJpZ2h0IG9wZXJhbmQncyByZWZsZWN0ZWQKKyAgIG1ldGhvZC0tdGhhdCB3aWxsIGluc3RlYWQgaGF2ZSB0aGUgb3Bwb3NpdGUgZWZmZWN0IG9mIGV4cGxpY2l0bHkKKyAgICpibG9ja2luZyogc3VjaCBmYWxsYmFjay4KKwogLi4gWyNdIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlIG5vbi1yZWZsZWN0ZWQgbWV0aG9kCiAgICAoc3VjaCBhcyA6bWV0aDpgX19hZGRfX2ApIGZhaWxzIHRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5IHRoZQogICAgcmVmbGVjdGVkIG1ldGhvZCBpcyBub3QgY2FsbGVkLgpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0IGIvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0CmluZGV4IDY0MzAyYjguLmZjYzcwN2IgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QKQEAgLTU1NCwxOSArNTU0LDMwIEBACiAgICBkZXRhaWxzLgogCiAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQgb2YgYGBfX25hbWVfX2BgIHRvIGNhbGN1bGF0ZSBleHBsaWNpdAotICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLCBhcyBkZWZpbmVkIGluIDpwZXA6YDM2NmAuCisgICByZWxhdGl2ZSBpbXBvcnRzIGZvciBtYWluIG1vZHVsZXMsIGFzIGRlZmluZWQgaW4gOnBlcDpgMzY2YC4gSXQgaXMKKyAgIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYGBfX3NwZWNfXy5wYXJlbnRgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSB2YWx1ZSBvZiBgYF9fcGFja2FnZV9fYGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAgICAgIGBgX19zcGVjX18ucGFyZW50YGAuCiAKIC4uIGF0dHJpYnV0ZTo6IF9fc3BlY19fCiAKICAgIFRoZSBgYF9fc3BlY19fYGAgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgc3BlYyB0aGF0IHdhcwotICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBmb3IKLSAgIGludHJvc3BlY3Rpb24gYW5kIGR1cmluZyByZWxvYWRpbmcuICBTZXR0aW5nIGBgX19zcGVjX19gYAorICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiBTZXR0aW5nIGBgX19zcGVjX19gYAogICAgYXBwcm9wcmlhdGVseSBhcHBsaWVzIGVxdWFsbHkgdG8gOnJlZjpgbW9kdWxlcyBpbml0aWFsaXplZCBkdXJpbmcKICAgIGludGVycHJldGVyIHN0YXJ0dXAgPHByb2dyYW1zPmAuICBUaGUgb25lIGV4Y2VwdGlvbiBpcyBgYF9fbWFpbl9fYGAsCiAgICB3aGVyZSBgYF9fc3BlY19fYGAgaXMgOnJlZjpgc2V0IHRvIE5vbmUgaW4gc29tZSBjYXNlcyA8bWFpbl9zcGVjPmAuCiAKKyAgIFdoZW4gYGBfX3BhY2thZ2VfX2BgIGlzIG5vdCBkZWZpbmVkLCBgYF9fc3BlY19fLnBhcmVudGBgIGlzIHVzZWQgYXMKKyAgIGEgZmFsbGJhY2suCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBfX3NwZWNfXy5wYXJlbnRgYCBpcyB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBgYF9fcGFja2FnZV9fYGAgaXMKKyAgICAgIG5vdCBkZWZpbmVkLgorCiAuLiBhdHRyaWJ1dGU6OiBfX3BhdGhfXwogCiAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSAoZWl0aGVyIHJlZ3VsYXIgb3IgbmFtZXNwYWNlKSwgdGhlIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdCBiL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKaW5kZXggMzdmMjVmMS4uYjNiNzFhZiAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CkBAIC00MDUsNyArNDA1LDggQEAKIAogLi4gcHJvZHVjdGlvbmxpc3Q6OgogICAgc3RyaW5nbGl0ZXJhbDogW2BzdHJpbmdwcmVmaXhgXShgc2hvcnRzdHJpbmdgIHwgYGxvbmdzdHJpbmdgKQotICAgc3RyaW5ncHJlZml4OiAiciIgfCAidSIgfCAiUiIgfCAiVSIKKyAgIHN0cmluZ3ByZWZpeDogInIiIHwgInUiIHwgIlIiIHwgIlUiIHwgImYiIHwgIkYiCisgICAgICAgICAgICAgICA6IHwgImZyIiB8ICJGciIgfCAiZlIiIHwgIkZSIiB8ICJyZiIgfCAickYiIHwgIlJmIiB8ICJSRiIKICAgIHNob3J0c3RyaW5nOiAiJyIgYHNob3J0c3RyaW5naXRlbWAqICInIiB8ICciJyBgc2hvcnRzdHJpbmdpdGVtYCogJyInCiAgICBsb25nc3RyaW5nOiAiJycnIiBgbG9uZ3N0cmluZ2l0ZW1gKiAiJycnIiB8ICciIiInIGBsb25nc3RyaW5naXRlbWAqICciIiInCiAgICBzaG9ydHN0cmluZ2l0ZW06IGBzaG9ydHN0cmluZ2NoYXJgIHwgYHN0cmluZ2VzY2FwZXNlcWAKQEAgLTQ2NCw2ICs0NjUsMTEgQEAKICAgIHRvIHNpbXBsaWZ5IHRoZSBtYWludGVuYW5jZSBvZiBkdWFsIFB5dGhvbiAyLnggYW5kIDMueCBjb2RlYmFzZXMuCiAgICBTZWUgOnBlcDpgNDE0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorQSBzdHJpbmcgbGl0ZXJhbCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYCBpbiBpdHMgcHJlZml4IGlzIGEKKzpkZm46YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbGA7IHNlZSA6cmVmOmBmLXN0cmluZ3NgLiAgVGhlIGBgJ2YnYGAgbWF5IGJlCitjb21iaW5lZCB3aXRoIGBgJ3InYGAsIGJ1dCBub3Qgd2l0aCBgYCdiJ2BgIG9yIGBgJ3UnYGAsIHRoZXJlZm9yZSByYXcKK2Zvcm1hdHRlZCBzdHJpbmdzIGFyZSBwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgbm90LgorCiBJbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZCAoYW5kIGFyZQogcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93IHRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBCiAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZSBsaXRlcmFsLCBpLmUuIGVpdGhlciBgYCdgYCBvciBgYCJgYC4pCkBAIC01ODMsNyArNTg5LDEwNiBAQAogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBkZWZpbmVkIGF0IHRoZSBzeW50YWN0aWNhbCBsZXZlbCwgYnV0IGltcGxlbWVudGVkIGF0CiBjb21waWxlIHRpbWUuICBUaGUgJysnIG9wZXJhdG9yIG11c3QgYmUgdXNlZCB0byBjb25jYXRlbmF0ZSBzdHJpbmcgZXhwcmVzc2lvbnMKIGF0IHJ1biB0aW1lLiAgQWxzbyBub3RlIHRoYXQgbGl0ZXJhbCBjb25jYXRlbmF0aW9uIGNhbiB1c2UgZGlmZmVyZW50IHF1b3RpbmcKLXN0eWxlcyBmb3IgZWFjaCBjb21wb25lbnQgKGV2ZW4gbWl4aW5nIHJhdyBzdHJpbmdzIGFuZCB0cmlwbGUgcXVvdGVkIHN0cmluZ3MpLgorc3R5bGVzIGZvciBlYWNoIGNvbXBvbmVudCAoZXZlbiBtaXhpbmcgcmF3IHN0cmluZ3MgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5ncyksCithbmQgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBtYXkgYmUgY29uY2F0ZW5hdGVkIHdpdGggcGxhaW4gc3RyaW5nIGxpdGVyYWxzLgorCisKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsCisgICBzaW5nbGU6IGludGVycG9sYXRlZCBzdHJpbmcgbGl0ZXJhbAorICAgc2luZ2xlOiBzdHJpbmc7IGZvcm1hdHRlZCBsaXRlcmFsCisgICBzaW5nbGU6IHN0cmluZzsgaW50ZXJwb2xhdGVkIGxpdGVyYWwKKyAgIHNpbmdsZTogZi1zdHJpbmcKKy4uIF9mLXN0cmluZ3M6CisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK0EgOmRmbjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsYCBvciA6ZGZuOmBmLXN0cmluZ2AgaXMgYSBzdHJpbmcgbGl0ZXJhbAordGhhdCBpcyBwcmVmaXhlZCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYC4gIFRoZXNlIHN0cmluZ3MgbWF5IGNvbnRhaW4KK3JlcGxhY2VtZW50IGZpZWxkcywgd2hpY2ggYXJlIGV4cHJlc3Npb25zIGRlbGltaXRlZCBieSBjdXJseSBicmFjZXMgYGB7fWBgLgorV2hpbGUgb3RoZXIgc3RyaW5nIGxpdGVyYWxzIGFsd2F5cyBoYXZlIGEgY29uc3RhbnQgdmFsdWUsIGZvcm1hdHRlZCBzdHJpbmdzCithcmUgcmVhbGx5IGV4cHJlc3Npb25zIGV2YWx1YXRlZCBhdCBydW4gdGltZS4KKworRXNjYXBlIHNlcXVlbmNlcyBhcmUgZGVjb2RlZCBsaWtlIGluIG9yZGluYXJ5IHN0cmluZyBsaXRlcmFscyAoZXhjZXB0IHdoZW4KK2EgbGl0ZXJhbCBpcyBhbHNvIG1hcmtlZCBhcyBhIHJhdyBzdHJpbmcpLiAgQWZ0ZXIgZGVjb2RpbmcsIHRoZSBncmFtbWFyCitmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgaXM6CisKKy4uIHByb2R1Y3Rpb25saXN0OjoKKyAgIGZfc3RyaW5nOiAoYGxpdGVyYWxfY2hhcmAgfCAie3siIHwgIn19IiB8IGByZXBsYWNlbWVudF9maWVsZGApKgorICAgcmVwbGFjZW1lbnRfZmllbGQ6ICJ7IiBgZl9leHByZXNzaW9uYCBbIiEiIGBjb252ZXJzaW9uYF0gWyI6IiBgZm9ybWF0X3NwZWNgXSAifSIKKyAgIGZfZXhwcmVzc2lvbjogKGBjb25kaXRpb25hbF9leHByZXNzaW9uYCB8ICIqIiBgb3JfZXhwcmApCisgICAgICAgICAgICAgICA6ICAgKCIsIiBgY29uZGl0aW9uYWxfZXhwcmVzc2lvbmAgfCAiLCIgIioiIGBvcl9leHByYCkqIFsiLCJdCisgICAgICAgICAgICAgICA6IHwgYHlpZWxkX2V4cHJlc3Npb25gCisgICBjb252ZXJzaW9uOiAicyIgfCAiciIgfCAiYSIKKyAgIGZvcm1hdF9zcGVjOiAoYGxpdGVyYWxfY2hhcmAgfCBOVUxMIHwgYHJlcGxhY2VtZW50X2ZpZWxkYCkqCisgICBsaXRlcmFsX2NoYXI6IDxhbnkgY29kZSBwb2ludCBleGNlcHQgInsiLCAifSIgb3IgTlVMTD4KKworVGhlIHBhcnRzIG9mIHRoZSBzdHJpbmcgb3V0c2lkZSBjdXJseSBicmFjZXMgYXJlIHRyZWF0ZWQgbGl0ZXJhbGx5LAorZXhjZXB0IHRoYXQgYW55IGRvdWJsZWQgY3VybHkgYnJhY2VzIGBgJ3t7J2BgIG9yIGBgJ319J2BgIGFyZSByZXBsYWNlZAord2l0aCB0aGUgY29ycmVzcG9uZGluZyBzaW5nbGUgY3VybHkgYnJhY2UuICBBIHNpbmdsZSBvcGVuaW5nIGN1cmx5CiticmFja2V0IGBgJ3snYGAgbWFya3MgYSByZXBsYWNlbWVudCBmaWVsZCwgd2hpY2ggc3RhcnRzIHdpdGggYQorUHl0aG9uIGV4cHJlc3Npb24uICBBZnRlciB0aGUgZXhwcmVzc2lvbiwgdGhlcmUgbWF5IGJlIGEgY29udmVyc2lvbiBmaWVsZCwKK2ludHJvZHVjZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgYGAnISdgYC4gIEEgZm9ybWF0IHNwZWNpZmllciBtYXkgYWxzbworYmUgYXBwZW5kZWQsIGludHJvZHVjZWQgYnkgYSBjb2xvbiBgYCc6J2BgLiAgQSByZXBsYWNlbWVudCBmaWVsZCBlbmRzCit3aXRoIGEgY2xvc2luZyBjdXJseSBicmFja2V0IGBgJ30nYGAuCisKK0V4cHJlc3Npb25zIGluIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgbGlrZSByZWd1bGFyCitQeXRob24gZXhwcmVzc2lvbnMgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNlcywgd2l0aCBhIGZldyBleGNlcHRpb25zLgorQW4gZW1wdHkgZXhwcmVzc2lvbiBpcyBub3QgYWxsb3dlZCwgYW5kIGEgOmtleXdvcmQ6YGxhbWJkYWAgZXhwcmVzc2lvbgorbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IGV4cGxpY2l0IHBhcmVudGhlc2VzLiAgUmVwbGFjZW1lbnQgZXhwcmVzc2lvbnMKK2NhbiBjb250YWluIGxpbmUgYnJlYWtzIChlLmcuIGluIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyksIGJ1dCB0aGV5CitjYW5ub3QgY29udGFpbiBjb21tZW50cy4gIEVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQKK3doZXJlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwgYXBwZWFycywgaW4gb3JkZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorCitJZiBhIGNvbnZlcnNpb24gaXMgc3BlY2lmaWVkLCB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KK2lzIGNvbnZlcnRlZCBiZWZvcmUgZm9ybWF0dGluZy4gIENvbnZlcnNpb24gYGAnIXMnYGAgY2FsbHMgOmZ1bmM6YHN0cmAgb24KK3RoZSByZXN1bHQsIGBgJyFyJ2BgIGNhbGxzIDpmdW5jOmByZXByYCwgYW5kIGBgJyFhJ2BgIGNhbGxzIDpmdW5jOmBhc2NpaWAuCisKK1RoZSByZXN1bHQgaXMgdGhlbiBmb3JtYXR0ZWQgdXNpbmcgdGhlIDpmdW5jOmBmb3JtYXRgIHByb3RvY29sLiAgVGhlCitmb3JtYXQgc3BlY2lmaWVyIGlzIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fZm9ybWF0X19gIG1ldGhvZCBvZiB0aGUKK2V4cHJlc3Npb24gb3IgY29udmVyc2lvbiByZXN1bHQuICBBbiBlbXB0eSBzdHJpbmcgaXMgcGFzc2VkIHdoZW4gdGhlCitmb3JtYXQgc3BlY2lmaWVyIGlzIG9taXR0ZWQuICBUaGUgZm9ybWF0dGVkIHJlc3VsdCBpcyB0aGVuIGluY2x1ZGVkIGluCit0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHdob2xlIHN0cmluZy4KKworVG9wLWxldmVsIGZvcm1hdCBzcGVjaWZpZXJzIG1heSBpbmNsdWRlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMuCitUaGVzZSBuZXN0ZWQgZmllbGRzIG1heSBpbmNsdWRlIHRoZWlyIG93biBjb252ZXJzaW9uIGZpZWxkcyBhbmQKK2Zvcm1hdCBzcGVjaWZpZXJzLCBidXQgbWF5IG5vdCBpbmNsdWRlIG1vcmUgZGVlcGx5LW5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMuCisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgbWF5IGJlIGNvbmNhdGVuYXRlZCwgYnV0IHJlcGxhY2VtZW50IGZpZWxkcworY2Fubm90IGJlIHNwbGl0IGFjcm9zcyBsaXRlcmFscy4KKworU29tZSBleGFtcGxlcyBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzOjoKKworICAgPj4+IG5hbWUgPSAiRnJlZCIKKyAgID4+PiBmIkhlIHNhaWQgaGlzIG5hbWUgaXMge25hbWUhcn0uIgorICAgIkhlIHNhaWQgaGlzIG5hbWUgaXMgJ0ZyZWQnLiIKKyAgID4+PiBmIkhlIHNhaWQgaGlzIG5hbWUgaXMge3JlcHIobmFtZSl9LiIgICMgcmVwcigpIGlzIGVxdWl2YWxlbnQgdG8gIXIKKyAgICJIZSBzYWlkIGhpcyBuYW1lIGlzICdGcmVkJy4iCisgICA+Pj4gd2lkdGggPSAxMAorICAgPj4+IHByZWNpc2lvbiA9IDQKKyAgID4+PiB2YWx1ZSA9IGRlY2ltYWwuRGVjaW1hbCgiMTIuMzQ1NjciKQorICAgPj4+IGYicmVzdWx0OiB7dmFsdWU6e3dpZHRofS57cHJlY2lzaW9ufX0iICAjIG5lc3RlZCBmaWVsZHMKKyAgICdyZXN1bHQ6ICAgICAgMTIuMzUnCisKK0EgY29uc2VxdWVuY2Ugb2Ygc2hhcmluZyB0aGUgc2FtZSBzeW50YXggYXMgcmVndWxhciBzdHJpbmcgbGl0ZXJhbHMgaXMKK3RoYXQgY2hhcmFjdGVycyBpbiB0aGUgcmVwbGFjZW1lbnQgZmllbGRzIG11c3Qgbm90IGNvbmZsaWN0IHdpdGggdGhlCitxdW90aW5nIHVzZWQgaW4gdGhlIG91dGVyIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbC4gIEFsc28sIGVzY2FwZQorc2VxdWVuY2VzIG5vcm1hbGx5IGFwcGx5IHRvIHRoZSBvdXRlciBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwsCityYXRoZXIgdGhhbiBpbm5lciBzdHJpbmcgbGl0ZXJhbHM6OgorCisgICBmImFiYyB7YVsieCJdfSBkZWYiICAgICMgZXJyb3I6IG91dGVyIHN0cmluZyBsaXRlcmFsIGVuZGVkIHByZW1hdHVyZWx5CisgICBmImFiYyB7YVtcInhcIl19IGRlZiIgICMgd29ya2Fyb3VuZDogZXNjYXBlIHRoZSBpbm5lciBxdW90ZXMKKyAgIGYiYWJjIHthWyd4J119IGRlZiIgICAgIyB3b3JrYXJvdW5kOiB1c2UgZGlmZmVyZW50IHF1b3RpbmcKKworICAgZiJuZXdsaW5lOiB7b3JkKCdcbicpfSIgICAjIGVycm9yOiBsaXRlcmFsIGxpbmUgYnJlYWsgaW4gaW5uZXIgc3RyaW5nCisgICBmIm5ld2xpbmU6IHtvcmQoJ1xcbicpfSIgICMgd29ya2Fyb3VuZDogZG91YmxlIGVzY2FwaW5nCisgICBmciJuZXdsaW5lOiB7b3JkKCdcbicpfSIgICMgd29ya2Fyb3VuZDogcmF3IG91dGVyIHN0cmluZworCitTZWUgYWxzbyA6cGVwOmA0OThgIGZvciB0aGUgcHJvcG9zYWwgdGhhdCBhZGRlZCBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzLAorYW5kIDptZXRoOmBzdHIuZm9ybWF0YCwgd2hpY2ggdXNlcyBhIHJlbGF0ZWQgZm9ybWF0IHN0cmluZyBtZWNoYW5pc20uCiAKIAogLi4gX251bWJlcnM6CmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QgYi9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QKaW5kZXggZDQwM2M0ZC4uZWVlM2Y0MyAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdApAQCAtODQsNyArODQsNyBAQAogICAgYXNzaWdubWVudF9zdG10OiAoYHRhcmdldF9saXN0YCAiPSIpKyAoYHN0YXJyZWRfZXhwcmVzc2lvbmAgfCBgeWllbGRfZXhwcmVzc2lvbmApCiAgICB0YXJnZXRfbGlzdDogYHRhcmdldGAgKCIsIiBgdGFyZ2V0YCkqIFsiLCJdCiAgICB0YXJnZXQ6IGBpZGVudGlmaWVyYAotICAgICAgICAgOiB8ICIoIiBgdGFyZ2V0X2xpc3RgICIpIgorICAgICAgICAgOiB8ICIoIiBbYHRhcmdldF9saXN0YF0gIikiCiAgICAgICAgICA6IHwgIlsiIFtgdGFyZ2V0X2xpc3RgXSAiXSIKICAgICAgICAgIDogfCBgYXR0cmlidXRlcmVmYAogICAgICAgICAgOiB8IGBzdWJzY3JpcHRpb25gCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5IGIvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQppbmRleCA2MzExMjgzLi43OTg2MDE3IDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CisrKyBiL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKQEAgLTM0LDcgKzM0LDcgQEAKIAogCiBJU1NVRV9VUkkgPSAnaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUlcycKLVNPVVJDRV9VUkkgPSAnaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS8zLjUvJXMnCitTT1VSQ0VfVVJJID0gJ2h0dHBzOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvZGVmYXVsdC8lcycKIAogIyBtb25rZXktcGF0Y2ggcmVTVCBwYXJzZXIgdG8gZGlzYWJsZSBhbHBoYWJldGljIGFuZCByb21hbiBlbnVtZXJhdGVkIGxpc3RzCiBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0LnN0YXRlcyBpbXBvcnQgQm9keQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgppbmRleCBkYmE5M2JmLi45NGZjNzFiIDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgorKysgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgpAQCAtMTA2LDYgKzEwNiwxMCBAQAogbGlicmFyeS9mdW5jdGlvbnMsLDpzdGVwLGFbc3RhcnQ6c3RvcDpzdGVwXQogbGlicmFyeS9mdW5jdGlvbnMsLDpzdG9wLCJhW3N0YXJ0OnN0b3AsIGldIgogbGlicmFyeS9mdW5jdGlvbnMsLDpzdG9wLGFbc3RhcnQ6c3RvcDpzdGVwXQorbGlicmFyeS9oYXNobGliLWJsYWtlMiwsOnZhdHJvZ2FzYWMsPj4+IGNvb2tpZSA9IGIndXNlcjp2YXRyb2dhc2FjJworbGlicmFyeS9oYXNobGliLWJsYWtlMiwsOnZhdHJvZ2FzYWMsInVzZXI6dmF0cm9nYXNhYywzNDljZjkwNDUzMzc2N2VkMmQ3NTUyNzlhOGRmODRkMCIKK2xpYnJhcnkvaGFzaGxpYi1ibGFrZTIsLDpwb2xpY2FqYWMsIj4+PiBjb21wYXJlX2RpZ2VzdChiJ3VzZXI6cG9saWNhamFjJywgc2lnKSIKK2xpYnJhcnkvaGFzaGxpYi1ibGFrZTIsLDpMRUFGLCJoMDAgPSBibGFrZTJiKGJ1ZlswOkxFQUZfU0laRV0sIGZhbm91dD1GQU5PVVQsIGRlcHRoPURFUFRILCIKIGxpYnJhcnkvaHR0cC5jbGllbnQsLDpwb3J0LGhvc3Q6cG9ydAogbGlicmFyeS9odHRwLmNvb2tpZXMsLGAsISMkJSYnKistLl5fYHx+OgogbGlicmFyeS9pbWFwbGliLCw6TU0sIiIiREQtTW1tLVlZWVkgSEg6TU06U1MiCkBAIC0yMDUsNyArMjA5LDcgQEAKIGxpYnJhcnkvdmVudiwsOnBhcmFtLCI6cGFyYW0gbm9kaXN0OiBJZiBUcnVlLCBzZXR1cHRvb2xzIGFuZCBwaXAgYXJlIG5vdCBpbnN0YWxsZWQgaW50byB0aGUiCiBsaWJyYXJ5L3ZlbnYsLDpwYXJhbSwiOnBhcmFtIHByb2dyZXNzOiBJZiBzZXR1cHRvb2xzIG9yIHBpcCBhcmUgaW5zdGFsbGVkLCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIgogbGlicmFyeS92ZW52LCw6cGFyYW0sIjpwYXJhbSBub3BpcDogSWYgVHJ1ZSwgcGlwIGlzIG5vdCBpbnN0YWxsZWQgaW50byB0aGUgY3JlYXRlZCIKLWxpYnJhcnkvdmVudiwsOnBhcmFtLDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnZpcm9ubWVudCBjcmVhdGlvbiByZXF1ZXN0CitsaWJyYXJ5L3ZlbnYsLDpwYXJhbSw6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAogbGlicmFyeS94bWxycGMuY2xpZW50LCw6cGFzcyxodHRwOi8vdXNlcjpwYXNzQGhvc3Q6cG9ydC9wYXRoCiBsaWJyYXJ5L3htbHJwYy5jbGllbnQsLDpwYXNzLHVzZXI6cGFzcwogbGlicmFyeS94bWxycGMuY2xpZW50LCw6cG9ydCxodHRwOi8vdXNlcjpwYXNzQGhvc3Q6cG9ydC9wYXRoCkBAIC0yNzIsNiArMjc2LDcgQEAKIHdoYXRzbmV3LzMuMiwsOmd6LCI+Pj4gd2l0aCB0YXJmaWxlLm9wZW4obmFtZT0nbXlhcmNoaXZlLnRhci5neicsIG1vZGU9J3c6Z3onKSBhcyB0ZjoiCiB3aGF0c25ldy8zLjIsLDpsb2NhdGlvbix6b3BlOS1sb2NhdGlvbiA9ICR7em9wZTk6bG9jYXRpb259CiB3aGF0c25ldy8zLjIsLDpwcmVmaXgsem9wZS1jb25mID0gJHtjdXN0b206cHJlZml4fS9ldGMvem9wZS5jb25mCit3aGF0c25ldy9jaGFuZ2Vsb2csLDp2ZXJzaW9uLGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldCiB3aGF0c25ldy9jaGFuZ2Vsb2csLDpneiwiOiBUYXJGaWxlIG9wZW5lZCB3aXRoIGV4dGVybmFsIGZpbGVvYmogYW5kICIidzpneiIiIG1vZGUgZGlkbid0Igogd2hhdHNuZXcvY2hhbmdlbG9nLCw6OiwiOiBVc2UgIiIxMjcuMC4wLjEiIiBvciAiIjo6MSIiIGluc3RlYWQgb2YgIiJsb2NhbGhvc3QiIiBhcyBtdWNoIGFzIgogbGlicmFyeS90YXJmaWxlLDE0OSw6eHosJ3g6eHonCkBAIC0yOTAsNyArMjk1LDYgQEAKIGxpYnJhcnkvemlwYXBwLDE1NSw6Y2FsbGFibGUsIiIicGtnLm1vZHVsZTpjYWxsYWJsZSIiIGFuZCB0aGUgYXJjaGl2ZSB3aWxsIGJlIHJ1biBieSBpbXBvcnRpbmciCiBsaWJyYXJ5L3N0ZHR5cGVzLCw6Oiw+Pj4gbVs6OjJdLnRvbGlzdCgpCiBsaWJyYXJ5L3N5cywsYCwjIGBgd3JhcHBlcmBgIGNyZWF0ZXMgYSBgYHdyYXAoY29ybylgYCBjb3JvdXRpbmU6Ci10dXRvcmlhbC92ZW52LDc3LDpjN2I5NjQ1YTZmMzUsIlB5dGhvbiAzLjQuMysgKDMuNDpjN2I5NjQ1YTZmMzUrLCBNYXkgMjIgMjAxNSwgMDk6MzE6MjUpIgogd2hhdHNuZXcvMy41LCw6cm9vdCwnV0FSTklORzpyb290Ondhcm5pbmdcbicKIHdoYXRzbmV3LzMuNSwsOndhcm5pbmcsJ1dBUk5JTkc6cm9vdDp3YXJuaW5nXG4nCiB3aGF0c25ldy8zLjUsLDo6LD4+PiBhZGRyNiA9IGlwYWRkcmVzcy5JUHY2QWRkcmVzcygnOjoxJykKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QgYi9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CmluZGV4IDEyOTg5YjIuLmQ0MzQ2MTggMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdApAQCAtNzgsNiArNzgsOSBAQAogICAgPj4+IHdvcmRzCiAgICBbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCiAKK1dpdGggYGBmb3IgdyBpbiB3b3JkczpgYCwgdGhlIGV4YW1wbGUgd291bGQgYXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5maW5pdGUgbGlzdCwKK2luc2VydGluZyBgYGRlZmVuZXN0cmF0ZWBgIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisKIAogLi4gX3R1dC1yYW5nZToKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdCBiL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKaW5kZXggZGQ5YzdjZC4uYmVlYWFjMyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CkBAIC0yNSw3ICsyNSw4IEBACiBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMgeW91IGNhbiBjcmVhdGUgYW55IGxheW91dCB5b3UgY2FuIGltYWdpbmUuICBUaGUKIHN0cmluZyB0eXBlIGhhcyBzb21lIG1ldGhvZHMgdGhhdCBwZXJmb3JtIHVzZWZ1bCBvcGVyYXRpb25zIGZvciBwYWRkaW5nCiBzdHJpbmdzIHRvIGEgZ2l2ZW4gY29sdW1uIHdpZHRoOyB0aGVzZSB3aWxsIGJlIGRpc2N1c3NlZCBzaG9ydGx5LiAgVGhlIHNlY29uZAotd2F5IGlzIHRvIHVzZSB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KK3dheSBpcyB0byB1c2UgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIG9yIHRoZQorOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KIAogVGhlIDptb2Q6YHN0cmluZ2AgbW9kdWxlIGNvbnRhaW5zIGEgOmNsYXNzOmB+c3RyaW5nLlRlbXBsYXRlYCBjbGFzcyB3aGljaCBvZmZlcnMKIHlldCBhbm90aGVyIHdheSB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbnRvIHN0cmluZ3MuCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0IGIvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAppbmRleCBlOGQ4ZTJiLi5mYWY1N2EzIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKQEAgLTEwLDEzICsxMCwxMyBAQAogSW52b2tpbmcgdGhlIEludGVycHJldGVyCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy41YAorVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy42YAogb24gdGhvc2UgbWFjaGluZXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlOyBwdXR0aW5nIDpmaWxlOmAvdXNyL2xvY2FsL2JpbmAgaW4geW91cgogVW5peCBzaGVsbCdzIHNlYXJjaCBwYXRoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZDoKIAogLi4gY29kZS1ibG9jazo6IHRleHQKIAotICAgcHl0aG9uMy41CisgICBweXRob24zLjYKIAogdG8gdGhlIHNoZWxsLiBbI11fIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgbGl2ZXMKIGlzIGFuIGluc3RhbGxhdGlvbiBvcHRpb24sIG90aGVyIHBsYWNlcyBhcmUgcG9zc2libGU7IGNoZWNrIHdpdGggeW91ciBsb2NhbApAQCAtMjQsMTEgKzI0LDExIEBACiBwb3B1bGFyIGFsdGVybmF0aXZlIGxvY2F0aW9uLikKIAogT24gV2luZG93cyBtYWNoaW5lcywgdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gaXMgdXN1YWxseSBwbGFjZWQgaW4KLTpmaWxlOmBDOlxcUHl0aG9uMzVgLCB0aG91Z2ggeW91IGNhbiBjaGFuZ2UgdGhpcyB3aGVuIHlvdSdyZSBydW5uaW5nIHRoZQorOmZpbGU6YEM6XFxQeXRob24zNmAsIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlCiBpbnN0YWxsZXIuICBUbyBhZGQgdGhpcyBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCAgeW91IGNhbiB0eXBlIHRoZSBmb2xsb3dpbmcKIGNvbW1hbmQgaW50byB0aGUgY29tbWFuZCBwcm9tcHQgaW4gYSBET1MgYm94OjoKIAotICAgc2V0IHBhdGg9JXBhdGglO0M6XHB5dGhvbjM1CisgICBzZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzYKIAogVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoOmtiZDpgQ29udHJvbC1EYCBvbiBVbml4LCA6a2JkOmBDb250cm9sLVpgIG9uCiBXaW5kb3dzKSBhdCB0aGUgcHJpbWFyeSBwcm9tcHQgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQKQEAgLTk4LDggKzk4LDggQEAKIAogLi4gY29kZS1ibG9jazo6IHNoZWxsLXNlc3Npb24KIAotICAgJCBweXRob24zLjUKLSAgIFB5dGhvbiAzLjUgKGRlZmF1bHQsIFNlcCAxNiAyMDE1LCAwOToyNTowNCkKKyAgICQgcHl0aG9uMy42CisgICBQeXRob24gMy42IChkZWZhdWx0LCBTZXAgMTYgMjAxNSwgMDk6MjU6MDQpCiAgICBbR0NDIDQuOC4yXSBvbiBsaW51eAogICAgVHlwZSAiaGVscCIsICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgPj4+CmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdCBiL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CmluZGV4IDIxNDAzMjkuLjdlOGVlM2UgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0CkBAIC0zNTIsNiArMzUyLDkgQEAKICAgICAgIFN0cmluZ3Mgc3VwcG9ydCBhIGxhcmdlIG51bWJlciBvZiBtZXRob2RzIGZvcgogICAgICAgYmFzaWMgdHJhbnNmb3JtYXRpb25zIGFuZCBzZWFyY2hpbmcuCiAKKyAgIDpyZWY6YGYtc3RyaW5nc2AKKyAgICAgIFN0cmluZyBsaXRlcmFscyB0aGF0IGhhdmUgZW1iZWRkZWQgZXhwcmVzc2lvbnMuCisKICAgIDpyZWY6YGZvcm1hdHN0cmluZ3NgCiAgICAgICBJbmZvcm1hdGlvbiBhYm91dCBzdHJpbmcgZm9ybWF0dGluZyB3aXRoIDptZXRoOmBzdHIuZm9ybWF0YC4KIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QgYi9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdAppbmRleCA1MmZmZGJlLi4xZGQwNmMyIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdApAQCAtMTUsNyArMTUsNyBAQAogCiAgICA+Pj4gaW1wb3J0IG9zCiAgICA+Pj4gb3MuZ2V0Y3dkKCkgICAgICAjIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotICAgJ0M6XFxQeXRob24zNScKKyAgICdDOlxcUHl0aG9uMzYnCiAgICA+Pj4gb3MuY2hkaXIoJy9zZXJ2ZXIvYWNjZXNzbG9ncycpICAgIyBDaGFuZ2UgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogICAgPj4+IG9zLnN5c3RlbSgnbWtkaXIgdG9kYXknKSAgICMgUnVuIHRoZSBjb21tYW5kIG1rZGlyIGluIHRoZSBzeXN0ZW0gc2hlbGwKICAgIDAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdCBiL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdAppbmRleCAzNzE0Mzg0Li5iZjRjZjg3IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CkBAIC0yNzgsNyArMjc4LDcgQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgICAgICBkWydwcmltYXJ5J10gICAgICAgICAgICAgICAgIyBlbnRyeSB3YXMgYXV0b21hdGljYWxseSByZW1vdmVkCi0gICAgIEZpbGUgIkM6L3B5dGhvbjM1L2xpYi93ZWFrcmVmLnB5IiwgbGluZSA0NiwgaW4gX19nZXRpdGVtX18KKyAgICAgRmlsZSAiQzovcHl0aG9uMzYvbGliL3dlYWtyZWYucHkiLCBsaW5lIDQ2LCBpbiBfX2dldGl0ZW1fXwogICAgICAgIG8gPSBzZWxmLmRhdGFba2V5XSgpCiAgICBLZXlFcnJvcjogJ3ByaW1hcnknCiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC92ZW52LnJzdCBiL0RvYy90dXRvcmlhbC92ZW52LnJzdAppbmRleCAzYjJlZTJlLi5lMmRkNTdkIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvdmVudi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3ZlbnYucnN0CkBAIC0yMCwxNSArMjAsMTQgQEAKIHRoZSByZXF1aXJlbWVudHMgYXJlIGluIGNvbmZsaWN0IGFuZCBpbnN0YWxsaW5nIGVpdGhlciB2ZXJzaW9uIDEuMCBvciAyLjAKIHdpbGwgbGVhdmUgb25lIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBydW4uCiAKLVRoZSBzb2x1dGlvbiBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIGNyZWF0ZSBhIDp0ZXJtOmB2aXJ0dWFsCi1lbnZpcm9ubWVudGAgKG9mdGVuIHNob3J0ZW5lZCB0byAidmlydHVhbGVudiIpLCBhIHNlbGYtY29udGFpbmVkCi1kaXJlY3RvcnkgdHJlZSB0aGF0IGNvbnRhaW5zIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyCi12ZXJzaW9uIG9mIFB5dGhvbiwgcGx1cyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhY2thZ2VzLgorVGhlIHNvbHV0aW9uIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gY3JlYXRlIGEgOnRlcm06YHZpcnR1YWwgZW52aXJvbm1lbnRgLCBhCitzZWxmLWNvbnRhaW5lZCBkaXJlY3RvcnkgdHJlZSB0aGF0IGNvbnRhaW5zIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBmb3IgYQorcGFydGljdWxhciB2ZXJzaW9uIG9mIFB5dGhvbiwgcGx1cyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhY2thZ2VzLgogCiBEaWZmZXJlbnQgYXBwbGljYXRpb25zIGNhbiB0aGVuIHVzZSBkaWZmZXJlbnQgdmlydHVhbCBlbnZpcm9ubWVudHMuCiBUbyByZXNvbHZlIHRoZSBlYXJsaWVyIGV4YW1wbGUgb2YgY29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzLAogYXBwbGljYXRpb24gQSBjYW4gaGF2ZSBpdHMgb3duIHZpcnR1YWwgZW52aXJvbm1lbnQgd2l0aCB2ZXJzaW9uIDEuMAotaW5zdGFsbGVkIHdoaWxlIGFwcGxpY2F0aW9uIEIgaGFzIGFub3RoZXIgdmlydHVhbGVudiB3aXRoIHZlcnNpb24gMi4wLgoraW5zdGFsbGVkIHdoaWxlIGFwcGxpY2F0aW9uIEIgaGFzIGFub3RoZXIgdmlydHVhbCBlbnZpcm9ubWVudCB3aXRoIHZlcnNpb24gMi4wLgogSWYgYXBwbGljYXRpb24gQiByZXF1aXJlcyBhIGxpYnJhcnkgYmUgdXBncmFkZWQgdG8gdmVyc2lvbiAzLjAsIHRoaXMgd2lsbAogbm90IGFmZmVjdCBhcHBsaWNhdGlvbiBBJ3MgZW52aXJvbm1lbnQuCiAKQEAgLTM2LDI5ICszNSwyNiBAQAogQ3JlYXRpbmcgVmlydHVhbCBFbnZpcm9ubWVudHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBzY3JpcHQgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZSB2aXJ0dWFsIGVudmlyb25tZW50cyBpcyBjYWxsZWQKLTpwcm9ncmFtOmBweXZlbnZgLiAgOnByb2dyYW06YHB5dmVudmAgd2lsbCB1c3VhbGx5IGluc3RhbGwgdGhlIG1vc3QKLXJlY2VudCB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0IHlvdSBoYXZlIGF2YWlsYWJsZTsgdGhlIHNjcmlwdCBpcyBhbHNvCi1pbnN0YWxsZWQgd2l0aCBhIHZlcnNpb24gbnVtYmVyLCBzbyBpZiB5b3UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZgotUHl0aG9uIG9uIHlvdXIgc3lzdGVtIHlvdSBjYW4gc2VsZWN0IGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gYnkKLXJ1bm5pbmcgYGBweXZlbnYtMy40YGAgb3Igd2hpY2hldmVyIHZlcnNpb24geW91IHdhbnQuCitUaGUgbW9kdWxlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgdmlydHVhbCBlbnZpcm9ubWVudHMgaXMgY2FsbGVkCis6bW9kOmB2ZW52YC4gIDptb2Q6YHZlbnZgIHdpbGwgdXN1YWxseSBpbnN0YWxsIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mCitQeXRob24gdGhhdCB5b3UgaGF2ZSBhdmFpbGFibGUuIElmIHlvdSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbiBvbiB5b3VyCitzeXN0ZW0sIHlvdSBjYW4gc2VsZWN0IGEgc3BlY2lmaWMgUHl0aG9uIHZlcnNpb24gYnkgcnVubmluZyBgYHB5dGhvbjNgYCBvcgord2hpY2hldmVyIHZlcnNpb24geW91IHdhbnQuCiAKLVRvIGNyZWF0ZSBhIHZpcnR1YWxlbnYsIGRlY2lkZSB1cG9uIGEgZGlyZWN0b3J5Ci13aGVyZSB5b3Ugd2FudCB0byBwbGFjZSBpdCBhbmQgcnVuIDpwcm9ncmFtOmBweXZlbnZgIHdpdGggdGhlCi1kaXJlY3RvcnkgcGF0aDo6CitUbyBjcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50LCBkZWNpZGUgdXBvbiBhIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0bworcGxhY2UgaXQsIGFuZCBydW4gdGhlIDptb2Q6YHZlbnZgIG1vZHVsZSBhcyBhIHNjcmlwdCB3aXRoIHRoZSBkaXJlY3RvcnkgcGF0aDo6CiAKLSAgIHB5dmVudiB0dXRvcmlhbC1lbnYKKyAgIHB5dGhvbjMgLW0gdmVudiB0dXRvcmlhbC1lbnYKIAogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYGB0dXRvcmlhbC1lbnZgYCBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCwKIGFuZCBhbHNvIGNyZWF0ZSBkaXJlY3RvcmllcyBpbnNpZGUgaXQgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIFB5dGhvbgogaW50ZXJwcmV0ZXIsIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBhbmQgdmFyaW91cyBzdXBwb3J0aW5nIGZpbGVzLgogCi1PbmNlIHlvdSd2ZSBjcmVhdGVkIGEgdmlydHVhbCBlbnZpcm9ubWVudCwgeW91IG5lZWQgdG8KLWFjdGl2YXRlIGl0LgorT25jZSB5b3UndmUgY3JlYXRlZCBhIHZpcnR1YWwgZW52aXJvbm1lbnQsIHlvdSBtYXkgYWN0aXZhdGUgaXQuCiAKIE9uIFdpbmRvd3MsIHJ1bjo6CiAKLSAgdHV0b3JpYWwtZW52L1NjcmlwdHMvYWN0aXZhdGUKKyAgdHV0b3JpYWwtZW52XFNjcmlwdHNcYWN0aXZhdGUuYmF0CiAKIE9uIFVuaXggb3IgTWFjT1MsIHJ1bjo6CiAKQEAgLTY5LDMzICs2NSwzNiBAQAogYGBhY3RpdmF0ZS5jc2hgYCBhbmQgYGBhY3RpdmF0ZS5maXNoYGAgc2NyaXB0cyB5b3Ugc2hvdWxkIHVzZQogaW5zdGVhZC4pCiAKLUFjdGl2YXRpbmcgdGhlIHZpcnR1YWxlbnYgd2lsbCBjaGFuZ2UgeW91ciBzaGVsbCdzIHByb21wdCB0byBzaG93IHdoYXQKLXZpcnR1YWxlbnYgeW91J3JlIHVzaW5nLCBhbmQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzbyB0aGF0IHJ1bm5pbmcKLWBgcHl0aG9uYGAgd2lsbCBnZXQgeW91IHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gb2YKLVB5dGhvbi4gIEZvciBleGFtcGxlOjoKK0FjdGl2YXRpbmcgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgd2lsbCBjaGFuZ2UgeW91ciBzaGVsbCdzIHByb21wdCB0byBzaG93IHdoYXQKK3ZpcnR1YWwgZW52aXJvbm1lbnQgeW91J3JlIHVzaW5nLCBhbmQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBzbyB0aGF0IHJ1bm5pbmcKK2BgcHl0aG9uYGAgd2lsbCBnZXQgeW91IHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgUHl0aG9uLgorRm9yIGV4YW1wbGU6CiAKLSAgLT4gc291cmNlIH4vZW52cy90dXRvcmlhbC1lbnYvYmluL2FjdGl2YXRlCi0gICh0dXRvcmlhbC1lbnYpIC0+IHB5dGhvbgotICBQeXRob24gMy40LjMrICgzLjQ6YzdiOTY0NWE2ZjM1KywgTWF5IDIyIDIwMTUsIDA5OjMxOjI1KQorLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAkIHNvdXJjZSB+L2VudnMvdHV0b3JpYWwtZW52L2Jpbi9hY3RpdmF0ZQorICAodHV0b3JpYWwtZW52KSAkIHB5dGhvbgorICBQeXRob24gMy41LjEgKGRlZmF1bHQsIE1heSAgNiAyMDE2LCAxMDo1OTozNikKICAgICAuLi4KICAgPj4+IGltcG9ydCBzeXMKICAgPj4+IHN5cy5wYXRoCi0gIFsnJywgJy91c3IvbG9jYWwvbGliL3B5dGhvbjM0LnppcCcsIC4uLiwKLSAgJ34vZW52cy90dXRvcmlhbC1lbnYvbGliL3B5dGhvbjMuNC9zaXRlLXBhY2thZ2VzJ10KKyAgWycnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMzUuemlwJywgLi4uLAorICAnfi9lbnZzL3R1dG9yaWFsLWVudi9saWIvcHl0aG9uMy41L3NpdGUtcGFja2FnZXMnXQogICA+Pj4KIAogCiBNYW5hZ2luZyBQYWNrYWdlcyB3aXRoIHBpcAogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotT25jZSB5b3UndmUgYWN0aXZhdGVkIGEgdmlydHVhbCBlbnZpcm9ubWVudCwgeW91IGNhbiBpbnN0YWxsLCB1cGdyYWRlLAotYW5kIHJlbW92ZSBwYWNrYWdlcyB1c2luZyBhIHByb2dyYW0gY2FsbGVkIDpwcm9ncmFtOmBwaXBgLiAgQnkgZGVmYXVsdAotYGBwaXBgYCB3aWxsIGluc3RhbGwgcGFja2FnZXMgZnJvbSB0aGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgsCi08aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT4uICBZb3UgY2FuIGJyb3dzZSB0aGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgKLWJ5IGdvaW5nIHRvIGl0IGluIHlvdXIgd2ViIGJyb3dzZXIsIG9yIHlvdSBjYW4gdXNlIGBgcGlwYGAncwotbGltaXRlZCBzZWFyY2ggZmVhdHVyZTo6CitZb3UgY2FuIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCByZW1vdmUgcGFja2FnZXMgdXNpbmcgYSBwcm9ncmFtIGNhbGxlZAorOnByb2dyYW06YHBpcGAuICBCeSBkZWZhdWx0IGBgcGlwYGAgd2lsbCBpbnN0YWxsIHBhY2thZ2VzIGZyb20gdGhlIFB5dGhvbgorUGFja2FnZSBJbmRleCwgPGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGk+LiAgWW91IGNhbiBicm93c2UgdGhlIFB5dGhvbgorUGFja2FnZSBJbmRleCBieSBnb2luZyB0byBpdCBpbiB5b3VyIHdlYiBicm93c2VyLCBvciB5b3UgY2FuIHVzZSBgYHBpcGBgJ3MKK2xpbWl0ZWQgc2VhcmNoIGZlYXR1cmU6CiAKLSAgKHR1dG9yaWFsLWVudikgLT4gcGlwIHNlYXJjaCBhc3Ryb25vbXkKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgc2VhcmNoIGFzdHJvbm9teQogICBza3lmaWVsZCAgICAgICAgICAgICAgIC0gRWxlZ2FudCBhc3Ryb25vbXkgZm9yIFB5dGhvbgogICBnYXJ5ICAgICAgICAgICAgICAgICAgIC0gR2FsYWN0aWMgYXN0cm9ub215IGFuZCBncmF2aXRhdGlvbmFsIGR5bmFtaWNzLgogICBub3ZhcyAgICAgICAgICAgICAgICAgIC0gVGhlIFVuaXRlZCBTdGF0ZXMgTmF2YWwgT2JzZXJ2YXRvcnkgTk9WQVMgYXN0cm9ub215IGxpYnJhcnkKQEAgLTEwNyw5ICsxMDYsMTEgQEAKICJmcmVlemUiLCBldGMuICAoQ29uc3VsdCB0aGUgOnJlZjpgaW5zdGFsbGluZy1pbmRleGAgZ3VpZGUgZm9yCiBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGZvciBgYHBpcGBgLikKIAotWW91IGNhbiBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHBhY2thZ2UgYnkgc3BlY2lmeWluZyBhIHBhY2thZ2UncyBuYW1lOjoKK1lvdSBjYW4gaW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBwYWNrYWdlIGJ5IHNwZWNpZnlpbmcgYSBwYWNrYWdlJ3MgbmFtZToKIAotICAtPiBwaXAgaW5zdGFsbCBub3ZhcworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBpbnN0YWxsIG5vdmFzCiAgIENvbGxlY3Rpbmcgbm92YXMKICAgICBEb3dubG9hZGluZyBub3Zhcy0zLjEuMS4zLnRhci5neiAoMTM2a0IpCiAgIEluc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiBub3ZhcwpAQCAtMTE3LDkgKzExOCwxMSBAQAogICBTdWNjZXNzZnVsbHkgaW5zdGFsbGVkIG5vdmFzLTMuMS4xLjMKIAogWW91IGNhbiBhbHNvIGluc3RhbGwgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGEgcGFja2FnZSBieSBnaXZpbmcgdGhlCi1wYWNrYWdlIG5hbWUgIGZvbGxvd2VkIGJ5IGBgPT1gYCBhbmQgdGhlIHZlcnNpb24gbnVtYmVyOjoKK3BhY2thZ2UgbmFtZSAgZm9sbG93ZWQgYnkgYGA9PWBgIGFuZCB0aGUgdmVyc2lvbiBudW1iZXI6CiAKLSAgLT4gcGlwIGluc3RhbGwgcmVxdWVzdHM9PTIuNi4wCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGluc3RhbGwgcmVxdWVzdHM9PTIuNi4wCiAgIENvbGxlY3RpbmcgcmVxdWVzdHM9PTIuNi4wCiAgICAgVXNpbmcgY2FjaGVkIHJlcXVlc3RzLTIuNi4wLXB5Mi5weTMtbm9uZS1hbnkud2hsCiAgIEluc3RhbGxpbmcgY29sbGVjdGVkIHBhY2thZ2VzOiByZXF1ZXN0cwpAQCAtMTI4LDkgKzEzMSwxMSBAQAogSWYgeW91IHJlLXJ1biB0aGlzIGNvbW1hbmQsIGBgcGlwYGAgd2lsbCBub3RpY2UgdGhhdCB0aGUgcmVxdWVzdGVkCiB2ZXJzaW9uIGlzIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBkbyBub3RoaW5nLiAgWW91IGNhbiBzdXBwbHkgYQogZGlmZmVyZW50IHZlcnNpb24gbnVtYmVyIHRvIGdldCB0aGF0IHZlcnNpb24sIG9yIHlvdSBjYW4gcnVuIGBgcGlwCi1pbnN0YWxsIC0tdXBncmFkZWBgIHRvIHVwZ3JhZGUgdGhlIHBhY2thZ2UgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uOjoKK2luc3RhbGwgLS11cGdyYWRlYGAgdG8gdXBncmFkZSB0aGUgcGFja2FnZSB0byB0aGUgbGF0ZXN0IHZlcnNpb246CiAKLSAgLT4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHJlcXVlc3RzCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGluc3RhbGwgLS11cGdyYWRlIHJlcXVlc3RzCiAgIENvbGxlY3RpbmcgcmVxdWVzdHMKICAgSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6IHJlcXVlc3RzCiAgICAgRm91bmQgZXhpc3RpbmcgaW5zdGFsbGF0aW9uOiByZXF1ZXN0cyAyLjYuMApAQCAtMTQxLDkgKzE0NiwxMSBAQAogYGBwaXAgdW5pbnN0YWxsYGAgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFja2FnZSBuYW1lcyB3aWxsIHJlbW92ZSB0aGUKIHBhY2thZ2VzIGZyb20gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKLWBgcGlwIHNob3dgYCB3aWxsIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIHBhY2thZ2U6OgorYGBwaXAgc2hvd2BgIHdpbGwgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgcGFja2FnZToKIAotICAodHV0b3JpYWwtZW52KSAtPiBwaXAgc2hvdyByZXF1ZXN0cworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBzaG93IHJlcXVlc3RzCiAgIC0tLQogICBNZXRhZGF0YS1WZXJzaW9uOiAyLjAKICAgTmFtZTogcmVxdWVzdHMKQEAgLTE1Nyw5ICsxNjQsMTEgQEAKICAgUmVxdWlyZXM6CiAKIGBgcGlwIGxpc3RgYCB3aWxsIGRpc3BsYXkgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwKLWVudmlyb25tZW50OjoKK2Vudmlyb25tZW50OgogCi0gICh0dXRvcmlhbC1lbnYpIC0+IHBpcCBsaXN0CisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGxpc3QKICAgbm92YXMgKDMuMS4xLjMpCiAgIG51bXB5ICgxLjkuMikKICAgcGlwICg3LjAuMykKQEAgLTE2OCwxOSArMTc3LDIzIEBACiAKIGBgcGlwIGZyZWV6ZWBgIHdpbGwgcHJvZHVjZSBhIHNpbWlsYXIgbGlzdCBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLAogYnV0IHRoZSBvdXRwdXQgdXNlcyB0aGUgZm9ybWF0IHRoYXQgYGBwaXAgaW5zdGFsbGBgIGV4cGVjdHMuCi1BIGNvbW1vbiBjb252ZW50aW9uIGlzIHRvIHB1dCB0aGlzIGxpc3QgaW4gYSBgYHJlcXVpcmVtZW50cy50eHRgYCBmaWxlOjoKK0EgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcHV0IHRoaXMgbGlzdCBpbiBhIGBgcmVxdWlyZW1lbnRzLnR4dGBgIGZpbGU6CiAKLSAgKHR1dG9yaWFsLWVudikgLT4gcGlwIGZyZWV6ZSA+IHJlcXVpcmVtZW50cy50eHQKLSAgKHR1dG9yaWFsLWVudikgLT4gY2F0IHJlcXVpcmVtZW50cy50eHQKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgZnJlZXplID4gcmVxdWlyZW1lbnRzLnR4dAorICAodHV0b3JpYWwtZW52KSAkIGNhdCByZXF1aXJlbWVudHMudHh0CiAgIG5vdmFzPT0zLjEuMS4zCiAgIG51bXB5PT0xLjkuMgogICByZXF1ZXN0cz09Mi43LjAKIAogVGhlIGBgcmVxdWlyZW1lbnRzLnR4dGBgIGNhbiB0aGVuIGJlIGNvbW1pdHRlZCB0byB2ZXJzaW9uIGNvbnRyb2wgYW5kCiBzaGlwcGVkIGFzIHBhcnQgb2YgYW4gYXBwbGljYXRpb24uICBVc2VycyBjYW4gdGhlbiBpbnN0YWxsIGFsbCB0aGUKLW5lY2Vzc2FyeSBwYWNrYWdlcyB3aXRoIGBgaW5zdGFsbCAtcmBgOjoKK25lY2Vzc2FyeSBwYWNrYWdlcyB3aXRoIGBgaW5zdGFsbCAtcmBgOgogCi0gIC0+IHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0CiAgIENvbGxlY3Rpbmcgbm92YXM9PTMuMS4xLjMgKGZyb20gLXIgcmVxdWlyZW1lbnRzLnR4dCAobGluZSAxKSkKICAgICAuLi4KICAgQ29sbGVjdGluZyBudW1weT09MS45LjIgKGZyb20gLXIgcmVxdWlyZW1lbnRzLnR4dCAobGluZSAyKSkKZGlmZiAtLWdpdCBhL0RvYy91c2luZy9jbWRsaW5lLnJzdCBiL0RvYy91c2luZy9jbWRsaW5lLnJzdAppbmRleCA1N2ZhZjg5Li4zN2E5ZTE0IDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvY21kbGluZS5yc3QKKysrIGIvRG9jL3VzaW5nL2NtZGxpbmUucnN0CkBAIC0zOTUsNiArMzk1LDggQEAKICAgICAgc3RvcmVkIGluIGEgdHJhY2ViYWNrIG9mIGEgdHJhY2UuIFVzZSBgYC1YIHRyYWNlbWFsbG9jPU5GUkFNRWBgIHRvIHN0YXJ0CiAgICAgIHRyYWNpbmcgd2l0aCBhIHRyYWNlYmFjayBsaW1pdCBvZiAqTkZSQU1FKiBmcmFtZXMuIFNlZSB0aGUKICAgICAgOmZ1bmM6YHRyYWNlbWFsbG9jLnN0YXJ0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICogYGAtWCBzaG93YWxsb2Njb3VudGBgIHRvIGVuYWJsZSB0aGUgb3V0cHV0IG9mIHRoZSB0b3RhbCBjb3VudCBvZiBhbGxvY2F0ZWQKKyAgICAgb2JqZWN0cyBmb3IgZWFjaCB0eXBlIChvbmx5IHdvcmtzIHdoZW4gYnVpbHQgd2l0aCBgYENPVU5UX0FMTE9DU2BgIGRlZmluZWQpOwogCiAgICBJdCBhbHNvIGFsbG93cyBwYXNzaW5nIGFyYml0cmFyeSB2YWx1ZXMgYW5kIHJldHJpZXZpbmcgdGhlbSB0aHJvdWdoIHRoZQogICAgOmRhdGE6YHN5cy5feG9wdGlvbnNgIGRpY3Rpb25hcnkuCkBAIC00MDgsNiArNDEwLDkgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogICAgICAgVGhlIGBgLVggc2hvd3JlZmNvdW50YGAgYW5kIGBgLVggdHJhY2VtYWxsb2NgYCBvcHRpb25zLgogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIFRoZSBgYC1YIHNob3dhbGxvY2NvdW50YGAgb3B0aW9uLgorCiAKIE9wdGlvbnMgeW91IHNob3VsZG4ndCB1c2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KQEAgLTYxOSw2ICs2MjQsNTQgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAKKy4uIGVudnZhcjo6IFBZVEhPTk1BTExPQworCisgICBTZXQgdGhlIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rcy4KKworICAgU2V0IHRoZSBmYW1pbHkgb2YgbWVtb3J5IGFsbG9jYXRvcnMgdXNlZCBieSBQeXRob246CisKKyAgICogYGBtYWxsb2NgYDogdXNlIHRoZSA6YzpmdW5jOmBtYWxsb2NgIGZ1bmN0aW9uIG9mIHRoZSBDIGxpYnJhcnkKKyAgICAgZm9yIGFsbCBkb21haW5zICg6YzpkYXRhOmBQWU1FTV9ET01BSU5fUkFXYCwgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAsCisgICAgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgKS4KKyAgICogYGBweW1hbGxvY2BgOiB1c2UgdGhlIDpyZWY6YHB5bWFsbG9jIGFsbG9jYXRvciA8cHltYWxsb2M+YCBmb3IKKyAgICAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgYW5kIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIGRvbWFpbnMgYW5kIHVzZQorICAgICB0aGUgOmM6ZnVuYzpgbWFsbG9jYCBmdW5jdGlvbiBmb3IgdGhlIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9SQVdgIGRvbWFpbi4KKworICAgSW5zdGFsbCBkZWJ1ZyBob29rczoKKworICAgKiBgYGRlYnVnYGA6IGluc3RhbGwgZGVidWcgaG9va3Mgb24gdG9wIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3IKKyAgICogYGBtYWxsb2NfZGVidWdgYDogc2FtZSBhcyBgYG1hbGxvY2BgIGJ1dCBhbHNvIGluc3RhbGwgZGVidWcgaG9va3MKKyAgICogYGBweW1hbGxvY19kZWJ1Z2BgOiBzYW1lIGFzIGBgcHltYWxsb2NgYCBidXQgYWxzbyBpbnN0YWxsIGRlYnVnIGhvb2tzCisKKyAgIFdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIGluIHJlbGVhc2UgbW9kZSwgdGhlIGRlZmF1bHQgaXMgYGBweW1hbGxvY2BgLiBXaGVuCisgICBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLCB0aGUgZGVmYXVsdCBpcyBgYHB5bWFsbG9jX2RlYnVnYGAgYW5kIHRoZSBkZWJ1ZyBob29rcworICAgYXJlIHVzZWQgYXV0b21hdGljYWxseS4KKworICAgSWYgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBgYHB5bWFsbG9jYGAgc3VwcG9ydCwgYGBweW1hbGxvY2BgIGFuZAorICAgYGBweW1hbGxvY19kZWJ1Z2BgIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCBpcyBgYG1hbGxvY2BgIGluIHJlbGVhc2UKKyAgIG1vZGUgYW5kIGBgbWFsbG9jX2RlYnVnYGAgaW4gZGVidWcgbW9kZS4KKworICAgU2VlIHRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGZvciBkZWJ1ZyBob29rcyBvbiBQeXRob24KKyAgIG1lbW9yeSBhbGxvY2F0b3JzLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0NTVEFUUworCisgICBJZiBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nLCBQeXRob24gd2lsbCBwcmludCBzdGF0aXN0aWNzIG9mIHRoZQorICAgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YCBldmVyeSB0aW1lIGEgbmV3IHB5bWFsbG9jIG9iamVjdAorICAgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgorCisgICBUaGlzIHZhcmlhYmxlIGlzIGlnbm9yZWQgaWYgdGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgIGlzIHVzZWQgdG8gZm9yY2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgYWxsb2NhdG9yIG9mIHRoZSBDIGxpYnJhcnksIG9yIGlmCisgICBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IGBgcHltYWxsb2NgYCBzdXBwb3J0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhpcyB2YXJpYWJsZSBjYW4gbm93IGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorICAgICAgSXQgbm93IGhhcyBubyBlZmZlY3QgaWYgc2V0IHRvIGFuIGVtcHR5IHN0cmluZy4KKworCiBEZWJ1Zy1tb2RlIHZhcmlhYmxlcwogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtNjM0LDkgKzY4NywzIEBACiAKICAgIElmIHNldCwgUHl0aG9uIHdpbGwgZHVtcCBvYmplY3RzIGFuZCByZWZlcmVuY2UgY291bnRzIHN0aWxsIGFsaXZlIGFmdGVyCiAgICBzaHV0dGluZyBkb3duIHRoZSBpbnRlcnByZXRlci4KLQotCi0uLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0NTVEFUUwotCi0gICBJZiBzZXQsIFB5dGhvbiB3aWxsIHByaW50IG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgZXZlcnkgdGltZSBhIG5ldwotICAgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy9pbmRleC5yc3QgYi9Eb2MvdXNpbmcvaW5kZXgucnN0CmluZGV4IDUwMmFmYTkuLmE1ZGY3MTMgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9pbmRleC5yc3QKKysrIGIvRG9jL3VzaW5nL2luZGV4LnJzdApAQCAtMTcsNCArMTcsMyBAQAogICAgdW5peC5yc3QKICAgIHdpbmRvd3MucnN0CiAgICBtYWMucnN0Ci0gICBzY3JpcHRzLnJzdApkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL21hYy5yc3QgYi9Eb2MvdXNpbmcvbWFjLnJzdAppbmRleCAwNWM5MWJiLi44ZjFhYzNmIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvbWFjLnJzdAorKysgYi9Eb2MvdXNpbmcvbWFjLnJzdApAQCAtMjUsNyArMjUsNyBAQAogCiBXaGF0IHlvdSBnZXQgYWZ0ZXIgaW5zdGFsbGluZyBpcyBhIG51bWJlciBvZiB0aGluZ3M6CiAKLSogQSA6ZmlsZTpgTWFjUHl0aG9uIDMuNWAgZm9sZGVyIGluIHlvdXIgOmZpbGU6YEFwcGxpY2F0aW9uc2AgZm9sZGVyLiBJbiBoZXJlCisqIEEgOmZpbGU6YE1hY1B5dGhvbiAzLjZgIGZvbGRlciBpbiB5b3VyIDpmaWxlOmBBcHBsaWNhdGlvbnNgIGZvbGRlci4gSW4gaGVyZQogICB5b3UgZmluZCBJRExFLCB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCBpcyBhIHN0YW5kYXJkIHBhcnQgb2Ygb2ZmaWNpYWwKICAgUHl0aG9uIGRpc3RyaWJ1dGlvbnM7IFB5dGhvbkxhdW5jaGVyLCB3aGljaCBoYW5kbGVzIGRvdWJsZS1jbGlja2luZyBQeXRob24KICAgc2NyaXB0cyBmcm9tIHRoZSBGaW5kZXI7IGFuZCB0aGUgIkJ1aWxkIEFwcGxldCIgdG9vbCwgd2hpY2ggYWxsb3dzIHlvdSB0bwpAQCAtOTMsNyArOTMsNyBAQAogYW55dGhpbmcgdGhhdCBoYXMgYSBHVUkpIG5lZWQgdG8gYmUgcnVuIGluIGEgc3BlY2lhbCB3YXkuIFVzZSA6cHJvZ3JhbTpgcHl0aG9ud2AKIGluc3RlYWQgb2YgOnByb2dyYW06YHB5dGhvbmAgdG8gc3RhcnQgc3VjaCBzY3JpcHRzLgogCi1XaXRoIFB5dGhvbiAzLjUsIHlvdSBjYW4gdXNlIGVpdGhlciA6cHJvZ3JhbTpgcHl0aG9uYCBvciA6cHJvZ3JhbTpgcHl0aG9ud2AuCitXaXRoIFB5dGhvbiAzLjYsIHlvdSBjYW4gdXNlIGVpdGhlciA6cHJvZ3JhbTpgcHl0aG9uYCBvciA6cHJvZ3JhbTpgcHl0aG9ud2AuCiAKIAogQ29uZmlndXJhdGlvbgpAQCAtMTU5LDcgKzE1OSw3IEBACiBEaXN0cmlidXRpbmcgUHl0aG9uIEFwcGxpY2F0aW9ucyBvbiB0aGUgTWFjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSAiQnVpbGQgQXBwbGV0IiB0b29sIHRoYXQgaXMgcGxhY2VkIGluIHRoZSBNYWNQeXRob24gMy41IGZvbGRlciBpcyBmaW5lIGZvcgorVGhlICJCdWlsZCBBcHBsZXQiIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAzLjYgZm9sZGVyIGlzIGZpbmUgZm9yCiBwYWNrYWdpbmcgc21hbGwgUHl0aG9uIHNjcmlwdHMgb24geW91ciBvd24gbWFjaGluZSB0byBydW4gYXMgYSBzdGFuZGFyZCBNYWMKIGFwcGxpY2F0aW9uLiBUaGlzIHRvb2wsIGhvd2V2ZXIsIGlzIG5vdCByb2J1c3QgZW5vdWdoIHRvIGRpc3RyaWJ1dGUgUHl0aG9uCiBhcHBsaWNhdGlvbnMgdG8gb3RoZXIgdXNlcnMuCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvc2NyaXB0cy5yc3QgYi9Eb2MvdXNpbmcvc2NyaXB0cy5yc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODc0MTYuLjAwMDAwMDAKLS0tIGEvRG9jL3VzaW5nL3NjcmlwdHMucnN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLi4gX3Rvb2xzLWFuZC1zY3JpcHRzOgotCi1BZGRpdGlvbmFsIFRvb2xzIGFuZCBTY3JpcHRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS4uIF9zY3JpcHRzLXB5dmVudjoKLQotcHl2ZW52IC0gQ3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS4uIGluY2x1ZGU6OiB2ZW52LWNyZWF0ZS5pbmMKLQpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL3ZlbnYtY3JlYXRlLmluYyBiL0RvYy91c2luZy92ZW52LWNyZWF0ZS5pbmMKaW5kZXggN2FkMzAwOC4uNTNmNDMxYiAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL3ZlbnYtY3JlYXRlLmluYworKysgYi9Eb2MvdXNpbmcvdmVudi1jcmVhdGUuaW5jCkBAIC0xLDMxICsxLDM5IEBACiBDcmVhdGlvbiBvZiA6cmVmOmB2aXJ0dWFsIGVudmlyb25tZW50cyA8dmVudi1kZWY+YCBpcyBkb25lIGJ5IGV4ZWN1dGluZyB0aGUKLWBgcHl2ZW52YGAgc2NyaXB0OjoKK2NvbW1hbmQgYGB2ZW52YGA6OgogCi0gICAgcHl2ZW52IC9wYXRoL3RvL25ldy92aXJ0dWFsL2Vudmlyb25tZW50CisgICAgcHl0aG9uMyAtbSB2ZW52IC9wYXRoL3RvL25ldy92aXJ0dWFsL2Vudmlyb25tZW50CiAKIFJ1bm5pbmcgdGhpcyBjb21tYW5kIGNyZWF0ZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgKGNyZWF0aW5nIGFueSBwYXJlbnQKIGRpcmVjdG9yaWVzIHRoYXQgZG9uJ3QgZXhpc3QgYWxyZWFkeSkgYW5kIHBsYWNlcyBhIGBgcHl2ZW52LmNmZ2BgIGZpbGUgaW4gaXQKLXdpdGggYSBgYGhvbWVgYCBrZXkgcG9pbnRpbmcgdG8gdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gdGhlIGNvbW1hbmQgd2FzIHJ1bgotZnJvbS4gIEl0IGFsc28gY3JlYXRlcyBhIGBgYmluYGAgKG9yIGBgU2NyaXB0c2BgIG9uIFdpbmRvd3MpIHN1YmRpcmVjdG9yeQord2l0aCBhIGBgaG9tZWBgIGtleSBwb2ludGluZyB0byB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb21tYW5kCit3YXMgcnVuLiAgSXQgYWxzbyBjcmVhdGVzIGEgYGBiaW5gYCAob3IgYGBTY3JpcHRzYGAgb24gV2luZG93cykgc3ViZGlyZWN0b3J5CiBjb250YWluaW5nIGEgY29weSBvZiB0aGUgYGBweXRob25gYCBiaW5hcnkgKG9yIGJpbmFyaWVzLCBpbiB0aGUgY2FzZSBvZgogV2luZG93cykuICBJdCBhbHNvIGNyZWF0ZXMgYW4gKGluaXRpYWxseSBlbXB0eSkgYGBsaWIvcHl0aG9uWC5ZL3NpdGUtcGFja2FnZXNgYAogc3ViZGlyZWN0b3J5IChvbiBXaW5kb3dzLCB0aGlzIGlzIGBgTGliXHNpdGUtcGFja2FnZXNgYCkuCiAKKy4uIGRlcHJlY2F0ZWQ6OiAzLjYKKyAgIGBgcHl2ZW52YGAgd2FzIHRoZSByZWNvbW1lbmRlZCB0b29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cyBmb3IKKyAgIFB5dGhvbiAzLjMgYW5kIDMuNCwgYW5kIGlzIGBkZXByZWNhdGVkIGluIFB5dGhvbiAzLjYKKyAgIDxodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXYvd2hhdHNuZXcvMy42Lmh0bWwjZGVwcmVjYXRlZC1mZWF0dXJlcz5gXy4KKworLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKKyAgIFRoZSB1c2Ugb2YgYGB2ZW52YGAgaXMgbm93IHJlY29tbWVuZGVkIGZvciBjcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cy4KKwogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IENyZWF0aW5nIGFuZCB1c2luZyB2aXJ0dWFsIGVudmlyb25tZW50cwotICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvI2NyZWF0aW5nLXZpcnR1YWwtZW52aXJvbm1lbnRzPmBfXworICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8jY3JlYXRpbmctdmlydHVhbC1lbnZpcm9ubWVudHM+YF9fCiAKIC4uIGhpZ2hsaWdodDo6IG5vbmUKIAotT24gV2luZG93cywgeW91IG1heSBoYXZlIHRvIGludm9rZSB0aGUgYGBweXZlbnZgYCBzY3JpcHQgYXMgZm9sbG93cywgaWYgeW91Ci1kb24ndCBoYXZlIHRoZSByZWxldmFudCBQQVRIIGFuZCBQQVRIRVhUIHNldHRpbmdzOjoKK09uIFdpbmRvd3MsIGludm9rZSB0aGUgYGB2ZW52YGAgY29tbWFuZCBhcyBmb2xsb3dzOjoKIAotICAgIGM6XFRlbXA+YzpcUHl0aG9uMzVccHl0aG9uIGM6XFB5dGhvbjM1XFRvb2xzXFNjcmlwdHNccHl2ZW52LnB5IG15ZW52CisgICAgYzpcPmM6XFB5dGhvbjM1XHB5dGhvbiAtbSB2ZW52IGM6XHBhdGhcdG9cbXllbnYKIAotb3IgZXF1aXZhbGVudGx5OjoKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBjb25maWd1cmVkIHRoZSBgYFBBVEhgYCBhbmQgYGBQQVRIRVhUYGAgdmFyaWFibGVzIGZvcgoreW91ciA6cmVmOmBQeXRob24gaW5zdGFsbGF0aW9uIDx1c2luZy1vbi13aW5kb3dzPmA6OgogCi0gICAgYzpcVGVtcD5jOlxQeXRob24zNVxweXRob24gLW0gdmVudiBteWVudgorICAgIGM6XD5weXRob24gLW0gdmVudiBteWVudiBjOlxwYXRoXHRvXG15ZW52CiAKIFRoZSBjb21tYW5kLCBpZiBydW4gd2l0aCBgYC1oYGAsIHdpbGwgc2hvdyB0aGUgYXZhaWxhYmxlIG9wdGlvbnM6OgogCkBAIC0zNiwyNSArNDQsMjYgQEAKICAgICBDcmVhdGVzIHZpcnR1YWwgUHl0aG9uIGVudmlyb25tZW50cyBpbiBvbmUgb3IgbW9yZSB0YXJnZXQgZGlyZWN0b3JpZXMuCiAKICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKLSAgICAgIEVOVl9ESVIgICAgICAgICAgICAgQSBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBlbnZpcm9ubWVudCBpbi4KKyAgICAgIEVOVl9ESVIgICAgICAgICAgICAgICBBIGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IGluLgogCiAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgotICAgICAgLWgsIC0taGVscCAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzIEdpdmUgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgYWNjZXNzIHRvIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZS1wYWNrYWdlcyBkaXIuCi0gICAgICAtLXN5bWxpbmtzICAgICAgICAgICAgIFRyeSB0byB1c2Ugc3ltbGlua3MgcmF0aGVyIHRoYW4gY29waWVzLCB3aGVuIHN5bWxpbmtzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KLSAgICAgIC0tY29waWVzICAgICAgICAgICAgICAgVHJ5IHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MsIGV2ZW4gd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBhcmUgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KLSAgICAgIC0tY2xlYXIgICAgICAgICAgICAgICAgRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCi0gICAgICAtLXVwZ3JhZGUgICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFB5dGhvbiwgYXNzdW1pbmcgUHl0aG9uIGhhcyBiZWVuIHVwZ3JhZGVkIGluLXBsYWNlLgotICAgICAgLS13aXRob3V0LXBpcCAgICAgICAgICBTa2lwcyBpbnN0YWxsaW5nIG9yIHVwZ3JhZGluZyBwaXAgaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKKyAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2l2ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBhY2Nlc3MgdG8gdGhlIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGUtcGFja2FnZXMgZGlyLgorICAgICAgLS1zeW1saW5rcyAgICAgICAgICAgIFRyeSB0byB1c2Ugc3ltbGlua3MgcmF0aGVyIHRoYW4gY29waWVzLCB3aGVuIHN5bWxpbmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB0aGUgZGVmYXVsdCBmb3IgdGhlIHBsYXRmb3JtLgorICAgICAgLS1jb3BpZXMgICAgICAgICAgICAgIFRyeSB0byB1c2UgY29waWVzIHJhdGhlciB0aGFuIHN5bWxpbmtzLCBldmVuIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBhcmUgdGhlIGRlZmF1bHQgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgICAgIC0tY2xlYXIgICAgICAgICAgICAgICBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgorICAgICAgLS11cGdyYWRlICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgUHl0aG9uLCBhc3N1bWluZyBQeXRob24gaGFzIGJlZW4gdXBncmFkZWQgaW4tcGxhY2UuCisgICAgICAtLXdpdGhvdXQtcGlwICAgICAgICAgU2tpcHMgaW5zdGFsbGluZyBvciB1cGdyYWRpbmcgcGlwIGluIHRoZSB2aXJ0dWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKIAotRGVwZW5kaW5nIG9uIGhvdyB0aGUgYGB2ZW52YGAgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBpbnZva2VkLCB0aGUgdXNhZ2UgbWVzc2FnZQotbWF5IHZhcnkgc2xpZ2h0bHksIGUuZy4gcmVmZXJlbmNpbmcgYGBweXZlbnZgYCByYXRoZXIgdGhhbiBgYHZlbnZgYC4KKyAgICBPbmNlIGFuIGVudmlyb25tZW50IGhhcyBiZWVuIGNyZWF0ZWQsIHlvdSBtYXkgd2lzaCB0byBhY3RpdmF0ZSBpdCwgZS5nLiBieQorICAgIHNvdXJjaW5nIGFuIGFjdGl2YXRlIHNjcmlwdCBpbiBpdHMgYmluIGRpcmVjdG9yeS4KIAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjQKICAgIEluc3RhbGxzIHBpcCBieSBkZWZhdWx0LCBhZGRlZCB0aGUgYGAtLXdpdGhvdXQtcGlwYGAgIGFuZCBgYC0tY29waWVzYGAKQEAgLTczLDEyICs4MiwxMyBAQAogVW5sZXNzIHRoZSBgYC0td2l0aG91dC1waXBgYCBvcHRpb24gaXMgZ2l2ZW4sIDptb2Q6YGVuc3VyZXBpcGAgd2lsbCBiZQogaW52b2tlZCB0byBib290c3RyYXAgYGBwaXBgYCBpbnRvIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LgogCi1NdWx0aXBsZSBwYXRocyBjYW4gYmUgZ2l2ZW4gdG8gYGBweXZlbnZgYCwgaW4gd2hpY2ggY2FzZSBhbiBpZGVudGljYWwKLXZpcnR1YWxlbnYgd2lsbCBiZSBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMsIGF0IGVhY2gKLXByb3ZpZGVkIHBhdGguCitNdWx0aXBsZSBwYXRocyBjYW4gYmUgZ2l2ZW4gdG8gYGB2ZW52YGAsIGluIHdoaWNoIGNhc2UgYW4gaWRlbnRpY2FsIHZpcnR1YWwKK2Vudmlyb25tZW50IHdpbGwgYmUgY3JlYXRlZCwgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvcHRpb25zLCBhdCBlYWNoIHByb3ZpZGVkCitwYXRoLgogCi1PbmNlIGEgdmVudiBoYXMgYmVlbiBjcmVhdGVkLCBpdCBjYW4gYmUgImFjdGl2YXRlZCIgdXNpbmcgYSBzY3JpcHQgaW4gdGhlCi12ZW52J3MgYmluYXJ5IGRpcmVjdG9yeS4gVGhlIGludm9jYXRpb24gb2YgdGhlIHNjcmlwdCBpcyBwbGF0Zm9ybS1zcGVjaWZpYzoKK09uY2UgYSB2aXJ0dWFsIGVudmlyb25tZW50IGhhcyBiZWVuIGNyZWF0ZWQsIGl0IGNhbiBiZSAiYWN0aXZhdGVkIiB1c2luZyBhCitzY3JpcHQgaW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBiaW5hcnkgZGlyZWN0b3J5LiBUaGUgaW52b2NhdGlvbiBvZiB0aGUKK3NjcmlwdCBpcyBwbGF0Zm9ybS1zcGVjaWZpYzoKIAogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiB8IFBsYXRmb3JtICAgIHwgU2hlbGwgICAgICAgICAgIHwgQ29tbWFuZCB0byBhY3RpdmF0ZSB2aXJ0dWFsIGVudmlyb25tZW50IHwKQEAgLTk1LDE2ICsxMDUsMTcgQEAKICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCiBZb3UgZG9uJ3Qgc3BlY2lmaWNhbGx5ICpuZWVkKiB0byBhY3RpdmF0ZSBhbiBlbnZpcm9ubWVudDsgYWN0aXZhdGlvbiBqdXN0Ci1wcmVwZW5kcyB0aGUgdmVudidzIGJpbmFyeSBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCBzbyB0aGF0ICJweXRob24iIGludm9rZXMgdGhlCi12ZW52J3MgUHl0aG9uIGludGVycHJldGVyIGFuZCB5b3UgY2FuIHJ1biBpbnN0YWxsZWQgc2NyaXB0cyB3aXRob3V0IGhhdmluZyB0bwotdXNlIHRoZWlyIGZ1bGwgcGF0aC4gSG93ZXZlciwgYWxsIHNjcmlwdHMgaW5zdGFsbGVkIGluIGEgdmVudiBzaG91bGQgYmUKLXJ1bm5hYmxlIHdpdGhvdXQgYWN0aXZhdGluZyBpdCwgYW5kIHJ1biB3aXRoIHRoZSB2ZW52J3MgUHl0aG9uIGF1dG9tYXRpY2FsbHkuCitwcmVwZW5kcyB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGJpbmFyeSBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCBzbyB0aGF0CisicHl0aG9uIiBpbnZva2VzIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgUHl0aG9uIGludGVycHJldGVyIGFuZCB5b3UgY2FuIHJ1bgoraW5zdGFsbGVkIHNjcmlwdHMgd2l0aG91dCBoYXZpbmcgdG8gdXNlIHRoZWlyIGZ1bGwgcGF0aC4gSG93ZXZlciwgYWxsIHNjcmlwdHMKK2luc3RhbGxlZCBpbiBhIHZpcnR1YWwgZW52aXJvbm1lbnQgc2hvdWxkIGJlIHJ1bm5hYmxlIHdpdGhvdXQgYWN0aXZhdGluZyBpdCwKK2FuZCBydW4gd2l0aCB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIFB5dGhvbiBhdXRvbWF0aWNhbGx5LgogCi1Zb3UgY2FuIGRlYWN0aXZhdGUgYSB2ZW52IGJ5IHR5cGluZyAiZGVhY3RpdmF0ZSIgaW4geW91ciBzaGVsbC4gVGhlIGV4YWN0Ci1tZWNoYW5pc20gaXMgcGxhdGZvcm0tc3BlY2lmaWM6IGZvciBleGFtcGxlLCB0aGUgQmFzaCBhY3RpdmF0aW9uIHNjcmlwdCBkZWZpbmVzCi1hICJkZWFjdGl2YXRlIiBmdW5jdGlvbiwgd2hlcmVhcyBvbiBXaW5kb3dzIHRoZXJlIGFyZSBzZXBhcmF0ZSBzY3JpcHRzIGNhbGxlZAotYGBkZWFjdGl2YXRlLmJhdGBgIGFuZCBgYERlYWN0aXZhdGUucHMxYGAgd2hpY2ggYXJlIGluc3RhbGxlZCB3aGVuIHRoZSB2ZW52IGlzCi1jcmVhdGVkLgorWW91IGNhbiBkZWFjdGl2YXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBieSB0eXBpbmcgImRlYWN0aXZhdGUiIGluIHlvdXIgc2hlbGwuCitUaGUgZXhhY3QgbWVjaGFuaXNtIGlzIHBsYXRmb3JtLXNwZWNpZmljOiBmb3IgZXhhbXBsZSwgdGhlIEJhc2ggYWN0aXZhdGlvbgorc2NyaXB0IGRlZmluZXMgYSAiZGVhY3RpdmF0ZSIgZnVuY3Rpb24sIHdoZXJlYXMgb24gV2luZG93cyB0aGVyZSBhcmUgc2VwYXJhdGUKK3NjcmlwdHMgY2FsbGVkIGBgZGVhY3RpdmF0ZS5iYXRgYCBhbmQgYGBEZWFjdGl2YXRlLnBzMWBgIHdoaWNoIGFyZSBpbnN0YWxsZWQKK3doZW4gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgY3JlYXRlZC4KIAogLi4gdmVyc2lvbmFkZGVkOjogMy40CiAgICBgYGZpc2hgYCBhbmQgYGBjc2hgYCBhY3RpdmF0aW9uIHNjcmlwdHMuCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QgYi9Eb2MvdXNpbmcvd2luZG93cy5yc3QKaW5kZXggYTRhNmEzMC4uM2Y2YjY4ZCAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL3dpbmRvd3MucnN0CisrKyBiL0RvYy91c2luZy93aW5kb3dzLnJzdApAQCAtNDE4LDYgKzQxOCw4IEBACiBGcm9tIHRoZSBjb21tYW5kLWxpbmUKIF5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorCiBTeXN0ZW0td2lkZSBpbnN0YWxsYXRpb25zIG9mIFB5dGhvbiAzLjMgYW5kIGxhdGVyIHdpbGwgcHV0IHRoZSBsYXVuY2hlciBvbiB5b3VyCiA6ZW52dmFyOmBQQVRIYC4gVGhlIGxhdW5jaGVyIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgYXZhaWxhYmxlIHZlcnNpb25zIG9mCiBQeXRob24sIHNvIGl0IGRvZXMgbm90IG1hdHRlciB3aGljaCB2ZXJzaW9uIGlzIGluc3RhbGxlZC4gVG8gY2hlY2sgdGhhdCB0aGUKQEAgLTQyNywyNSArNDI5LDI2IEBACiAKICAgcHkKIAotWW91IHNob3VsZCBmaW5kIHRoYXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggeW91IGhhdmUgaW5zdGFsbGVkIGlzCitZb3Ugc2hvdWxkIGZpbmQgdGhhdCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIHlvdSBoYXZlIGluc3RhbGxlZCBpcwogc3RhcnRlZCAtIGl0IGNhbiBiZSBleGl0ZWQgYXMgbm9ybWFsLCBhbmQgYW55IGFkZGl0aW9uYWwgY29tbWFuZC1saW5lCiBhcmd1bWVudHMgc3BlY2lmaWVkIHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byBQeXRob24uCiAKLUlmIHlvdSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbiAyLnggaW5zdGFsbGVkIChlLmcuLCAyLjYgYW5kIDIuNykgeW91Ci13aWxsIGhhdmUgbm90aWNlZCB0aGF0IFB5dGhvbiAyLjcgd2FzIHN0YXJ0ZWQgLSB0byBsYXVuY2ggUHl0aG9uIDIuNiwgdHJ5IHRoZQorSWYgeW91IGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIGluc3RhbGxlZCAoZS5nLiwgMi43IGFuZCAzLjYpIHlvdQord2lsbCBoYXZlIG5vdGljZWQgdGhhdCBQeXRob24gMy42IHdhcyBzdGFydGVkIC0gdG8gbGF1bmNoIFB5dGhvbiAyLjcsIHRyeSB0aGUKIGNvbW1hbmQ6CiAKIDo6CiAKLSAgcHkgLTIuNgorICBweSAtMi43CiAKLUlmIHlvdSBoYXZlIGEgUHl0aG9uIDMueCBpbnN0YWxsZWQsIHRyeSB0aGUgY29tbWFuZDoKK0lmIHlvdSB3YW50IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBQeXRob24gMi54IHlvdSBoYXZlIGluc3RhbGxlZCwgdHJ5IHRoZQorY29tbWFuZDoKIAogOjoKIAotICBweSAtMworICBweSAtMgogCi1Zb3Ugc2hvdWxkIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAzLnggc3RhcnRzLgorWW91IHNob3VsZCBmaW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBQeXRob24gMi54IHN0YXJ0cy4KIAogSWYgeW91IHNlZSB0aGUgZm9sbG93aW5nIGVycm9yLCB5b3UgZG8gbm90IGhhdmUgdGhlIGxhdW5jaGVyIGluc3RhbGxlZDoKIApAQCAtNTAwLDYgKzUwMywxMSBAQAogZmlyc3QgbGluZSB0byBgYCMhIHB5dGhvbjIuNmBgIGFuZCB5b3Ugc2hvdWxkIGZpbmQgdGhlIDIuNiB2ZXJzaW9uCiBpbmZvcm1hdGlvbiBwcmludGVkLgogCitOb3RlIHRoYXQgdW5saWtlIGludGVyYWN0aXZlIHVzZSwgYSBiYXJlICJweXRob24iIHdpbGwgdXNlIHRoZSBsYXRlc3QKK3ZlcnNpb24gb2YgUHl0aG9uIDIueCB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZC4gIFRoaXMgaXMgZm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5IGFuZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFVuaXgsIHdoZXJlIHRoZSBjb21tYW5kIGBgcHl0aG9uYGAKK3R5cGljYWxseSByZWZlcnMgdG8gUHl0aG9uIDIuCisKIEZyb20gZmlsZSBhc3NvY2lhdGlvbnMKIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzIuMS5yc3QgYi9Eb2Mvd2hhdHNuZXcvMi4xLnJzdAppbmRleCAwNjM2NmI4Li42YWFlNzI2IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMi4xLnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMi4xLnJzdApAQCAtMzY3LDcgKzM2Nyw3IEBACiAKIFRoaXMgdmVyc2lvbiB3b3JrcyBmb3Igc2ltcGxlIHRoaW5ncyBzdWNoIGFzIGludGVnZXJzLCBidXQgaXQgaGFzIGEgc2lkZSBlZmZlY3Q7CiB0aGUgYGBfY2FjaGVgYCBkaWN0aW9uYXJ5IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVzLCBzbyB0aGV5J2xsCi1uZXZlciBiZSBkZWFsbG9jYXRlZCB1bnRpbCB0aGUgUHl0aG9uIHByb2Nlc3MgZXhpdHMgYW5kIGNsZWFucyB1cCBUaGlzIGlzbid0CituZXZlciBiZSBkZWFsbG9jYXRlZCB1bnRpbCB0aGUgUHl0aG9uIHByb2Nlc3MgZXhpdHMgYW5kIGNsZWFucyB1cC4gVGhpcyBpc24ndAogdmVyeSBub3RpY2VhYmxlIGZvciBpbnRlZ2VycywgYnV0IGlmIDpmdW5jOmBmYCByZXR1cm5zIGFuIG9iamVjdCwgb3IgYSBkYXRhCiBzdHJ1Y3R1cmUgdGhhdCB0YWtlcyB1cCBhIGxvdCBvZiBtZW1vcnksIHRoaXMgY2FuIGJlIGEgcHJvYmxlbS4KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuMi5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy4yLnJzdAppbmRleCA5ZjM1ODRkLi4zZDIzN2VhIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMy4yLnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMy4yLnJzdApAQCAtMTI1Myw5ICsxMjUzLDkgQEAKIAogICAgIEBjb250ZXh0bWFuYWdlcgogICAgIGRlZiB0cmFja19lbnRyeV9hbmRfZXhpdChuYW1lKToKLSAgICAgICAgbG9nZ2luZy5pbmZvKCdFbnRlcmluZzoge30nLmZvcm1hdChuYW1lKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCdFbnRlcmluZzogJXMnLCBuYW1lKQogICAgICAgICB5aWVsZAotICAgICAgICBsb2dnaW5nLmluZm8oJ0V4aXRpbmc6IHt9Jy5mb3JtYXQobmFtZSkpCisgICAgICAgIGxvZ2dpbmcuaW5mbygnRXhpdGluZzogJXMnLCBuYW1lKQogCiBGb3JtZXJseSwgdGhpcyB3b3VsZCBoYXZlIG9ubHkgYmVlbiB1c2FibGUgYXMgYSBjb250ZXh0IG1hbmFnZXI6OgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMy4zLnJzdCBiL0RvYy93aGF0c25ldy8zLjMucnN0CmluZGV4IDNlNDhjODIuLjQ4YjhhM2IgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8zLjMucnN0CisrKyBiL0RvYy93aGF0c25ldy8zLjMucnN0CkBAIC0xMDgsNyArMTA4LDcgQEAKIHdpdGggdGhlIGludGVycHJldGVyIGNvcmUuCiAKIFRoaXMgUEVQIGFkZHMgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZSBmb3IgcHJvZ3JhbW1hdGljIGFjY2VzcywgYW5kIHRoZQotOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIHNjcmlwdCBmb3IgY29tbWFuZC1saW5lIGFjY2VzcyBhbmQKK2BgcHl2ZW52YGAgc2NyaXB0IGZvciBjb21tYW5kLWxpbmUgYWNjZXNzIGFuZAogYWRtaW5pc3RyYXRpb24uICBUaGUgUHl0aG9uIGludGVycHJldGVyIGNoZWNrcyBmb3IgYSBgYHB5dmVudi5jZmdgYCwKIGZpbGUgd2hvc2UgZXhpc3RlbmNlIHNpZ25hbHMgdGhlIGJhc2Ugb2YgYSB2aXJ0dWFsIGVudmlyb25tZW50J3MgZGlyZWN0b3J5CiB0cmVlLgpAQCAtMTk1NCw3ICsxOTU0LDcgQEAKICAgOmF0dHI6YH5zc2wuT1BfTk9fQ09NUFJFU1NJT05gIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgY29tcHJlc3Npb24uCiAgIChDb250cmlidXRlZCBieSBBbnRvaW5lIFBpdHJvdSBpbiA6aXNzdWU6YDEzNjM0YC4pCiAKLSogU3VwcG9ydCBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIE5leHQgUHJvY290b2wgTmVnb3RpYXRpb24gZXh0ZW5zaW9uIHVzaW5nCisqIFN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgZm9yIHRoZSBOZXh0IFByb3RvY29sIE5lZ290aWF0aW9uIGV4dGVuc2lvbiB1c2luZwogICB0aGUgOm1ldGg6YHNzbC5TU0xDb250ZXh0LnNldF9ucG5fcHJvdG9jb2xzYCBtZXRob2QuCiAgIChDb250cmlidXRlZCBieSBDb2xpbiBNYXJjIGluIDppc3N1ZTpgMTQyMDRgLikKIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuNC5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdAppbmRleCAxZTVjOWQxLi4yYTIzY2JjIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMy40LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdApAQCAtMTk3LDcgKzE5Nyw3IEBACiBgYHBpcGBgIGNvbW1hbmQgdHlwaWNhbGx5IHJlZmVycyB0byB0aGUgc2VwYXJhdGVseSBpbnN0YWxsZWQgUHl0aG9uIDIKIHZlcnNpb24uCiAKLVRoZSA6cmVmOmBweXZlbnYgPHNjcmlwdHMtcHl2ZW52PmAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAorVGhlIGBgcHl2ZW52YGAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAogbW9kdWxlIG1ha2UgdXNlIG9mIHRoZSA6bW9kOmBlbnN1cmVwaXBgIG1vZHVsZSB0byBtYWtlIGBgcGlwYGAgcmVhZGlseQogYXZhaWxhYmxlIGluIHZpcnR1YWwgZW52aXJvbm1lbnRzLiBXaGVuIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgdXRpbGl0eSwKIGBgcGlwYGAgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIHdoaWxlIHdoZW4gdXNpbmcgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZQpAQCAtMTk4OSwxMSArMTk4OSwxMSBAQAogICBTdGlubmVyIHVzaW5nIGhpcyA6cGVwOmA0NDVgLWJhc2VkIGBgcHlmYWlsbWFsbG9jYGAgdG9vbCAoOmlzc3VlOmAxODQwOGAsCiAgIDppc3N1ZTpgMTg1MjBgKS4KIAotKiBUaGUgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCiAgIHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIHN5bWxpbmtzIGFyZSB0aGUKICAgZGVmYXVsdC4gIChDb250cmlidXRlZCBieSBWaW5heSBTYWppcCBpbiA6aXNzdWU6YDE4ODA3YC4pCiAKLSogVGhlIDpyZWY6YHB5dmVudiA8c2NyaXB0cy1weXZlbnY+YCBjb21tYW5kIGFsc28gYWNjZXB0cyBhIGBgLS13aXRob3V0LXBpcGBgCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgYWxzbyBhY2NlcHRzIGEgYGAtLXdpdGhvdXQtcGlwYGAKICAgb3B0aW9uIHRvIHN1cHByZXNzIHRoZSBvdGhlcndpc2UtYXV0b21hdGljIGJvb3RzdHJhcHBpbmcgb2YgcGlwIGludG8KICAgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuICAoQ29udHJpYnV0ZWQgYnkgTmljayBDb2dobGFuIGluIDppc3N1ZTpgMTk1NTJgCiAgIGFzIHBhcnQgb2YgdGhlIDpwZXA6YDQ1M2AgaW1wbGVtZW50YXRpb24uKQpAQCAtMjQ1OSw3ICsyNDU5LDcgQEAKICAgc3RyZWFtIGluIDptb2Q6YH5pby5UZXh0SU9XcmFwcGVyYCB0byB1c2UgaXRzICpuZXdsaW5lKiBhcmd1bWVudAogICAoOmlzc3VlOmAxNTIwNGApLgogCi0qIElmIHlvdSB1c2UgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKKyogSWYgeW91IHVzZSBgYHB5dmVudmBgIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKICAgKm5vdCogYmUgaW5zdGFsbGVkLCB5b3UgbXVzdCBhZGQgYGAtLXdpdGhvdXQtcGlwYGAgdG8geW91ciBjb21tYW5kCiAgIGludm9jYXRpb24uCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8zLjYucnN0IGIvRG9jL3doYXRzbmV3LzMuNi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwYTNjMAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy93aGF0c25ldy8zLjYucnN0CkBAIC0wLDAgKzEsMTA0MyBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXaGF0J3MgTmV3IEluIFB5dGhvbiAzLjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOlJlbGVhc2U6IHxyZWxlYXNlfAorOkRhdGU6IHx0b2RheXwKKworLi4gUnVsZXMgZm9yIG1haW50ZW5hbmNlOgorCisgICAqIEFueW9uZSBjYW4gYWRkIHRleHQgdG8gdGhpcyBkb2N1bWVudC4gIERvIG5vdCBzcGVuZCB2ZXJ5IG11Y2ggdGltZQorICAgb24gdGhlIHdvcmRpbmcgb2YgeW91ciBjaGFuZ2VzLCBiZWNhdXNlIHlvdXIgdGV4dCB3aWxsIHByb2JhYmx5CisgICBnZXQgcmV3cml0dGVuIHRvIHNvbWUgZGVncmVlLgorCisgICAqIFRoZSBtYWludGFpbmVyIHdpbGwgZ28gdGhyb3VnaCBNaXNjL05FV1MgcGVyaW9kaWNhbGx5IGFuZCBhZGQKKyAgIGNoYW5nZXM7IGl0J3MgdGhlcmVmb3JlIG1vcmUgaW1wb3J0YW50IHRvIGFkZCB5b3VyIGNoYW5nZXMgdG8KKyAgIE1pc2MvTkVXUyB0aGFuIHRvIHRoaXMgZmlsZS4KKworICAgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgZXZlcnkgc2luZ2xlIGNoYW5nZTsgY29tcGxldGVuZXNzCisgICBpcyB0aGUgcHVycG9zZSBvZiBNaXNjL05FV1MuICBTb21lIGNoYW5nZXMgSSBjb25zaWRlciB0b28gc21hbGwKKyAgIG9yIGVzb3RlcmljIHRvIGluY2x1ZGUuICBJZiBzdWNoIGEgY2hhbmdlIGlzIGFkZGVkIHRvIHRoZSB0ZXh0LAorICAgSSdsbCBqdXN0IHJlbW92ZSBpdC4gIChUaGlzIGlzIGFub3RoZXIgcmVhc29uIHlvdSBzaG91bGRuJ3Qgc3BlbmQKKyAgIHRvbyBtdWNoIHRpbWUgb24gd3JpdGluZyB5b3VyIGFkZGl0aW9uLikKKworICAgKiBJZiB5b3Ugd2FudCB0byBkcmF3IHlvdXIgbmV3IHRleHQgdG8gdGhlIGF0dGVudGlvbiBvZiB0aGUKKyAgIG1haW50YWluZXIsIGFkZCAnWFhYJyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGggb3IKKyAgIHNlY3Rpb24uCisKKyAgICogSXQncyBPSyB0byBqdXN0IGFkZCBhIGZyYWdtZW50YXJ5IG5vdGUgYWJvdXQgYSBjaGFuZ2UuICBGb3IKKyAgIGV4YW1wbGU6ICJYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZQorICAgc29ja2V0IG1vZHVsZS4iICBUaGUgbWFpbnRhaW5lciB3aWxsIHJlc2VhcmNoIHRoZSBjaGFuZ2UgYW5kCisgICB3cml0ZSB0aGUgbmVjZXNzYXJ5IHRleHQuCisKKyAgICogWW91IGNhbiBjb21tZW50IG91dCB5b3VyIGFkZGl0aW9ucyBpZiB5b3UgbGlrZSwgYnV0IGl0J3Mgbm90CisgICBuZWNlc3NhcnkgKGVzcGVjaWFsbHkgd2hlbiBhIGZpbmFsIHJlbGVhc2UgaXMgc29tZSBtb250aHMgYXdheSkuCisKKyAgICogQ3JlZGl0IHRoZSBhdXRob3Igb2YgYSBwYXRjaCBvciBidWdmaXguICAgSnVzdCB0aGUgbmFtZSBpcworICAgc3VmZmljaWVudDsgdGhlIGUtbWFpbCBhZGRyZXNzIGlzbid0IG5lY2Vzc2FyeS4KKworICAgKiBJdCdzIGhlbHBmdWwgdG8gYWRkIHRoZSBidWcvcGF0Y2ggbnVtYmVyIGFzIGEgY29tbWVudDoKKworICAgWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUgc29ja2V0CisgICBtb2R1bGUuCisgICAoQ29udHJpYnV0ZWQgYnkgUC5ZLiBEZXZlbG9wZXIgaW4gOmlzc3VlOmAxMjM0NWAuKQorCisgICBUaGlzIHNhdmVzIHRoZSBtYWludGFpbmVyIHRoZSBlZmZvcnQgb2YgZ29pbmcgdGhyb3VnaCB0aGUgTWVyY3VyaWFsIGxvZworICAgd2hlbiByZXNlYXJjaGluZyBhIGNoYW5nZS4KKworVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDMuNiwgY29tcGFyZWQgdG8gMy41LgorCitGb3IgZnVsbCBkZXRhaWxzLCBzZWUgdGhlIDpzb3VyY2U6YE1pc2MvTkVXU2AgZmlsZS4KKworLi4gbm90ZTo6CisKKyAgIFByZXJlbGVhc2UgdXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhpcyBkb2N1bWVudCBpcyBjdXJyZW50bHkgaW4gZHJhZnQKKyAgIGZvcm0uIEl0IHdpbGwgYmUgdXBkYXRlZCBzdWJzdGFudGlhbGx5IGFzIFB5dGhvbiAzLjYgbW92ZXMgdG93YXJkcyByZWxlYXNlLAorICAgc28gaXQncyB3b3J0aCBjaGVja2luZyBiYWNrIGV2ZW4gYWZ0ZXIgcmVhZGluZyBlYXJsaWVyIHZlcnNpb25zLgorCisKK1N1bW1hcnkgLS0gUmVsZWFzZSBoaWdobGlnaHRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBUaGlzIHNlY3Rpb24gc2luZ2xlcyBvdXQgdGhlIG1vc3QgaW1wb3J0YW50IGNoYW5nZXMgaW4gUHl0aG9uIDMuNi4KKyAgIEJyZXZpdHkgaXMga2V5LgorCitOZXcgc3ludGF4IGZlYXR1cmVzOgorCisqIFBFUCA0OTg6IDpyZWY6YEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPHdoYXRzbmV3LWZzdHJpbmdzPmAKKworU3RhbmRhcmQgbGlicmFyeSBpbXByb3ZlbWVudHM6CisKKyogUEVQIDUxOTogOnJlZjpgQWRkaW5nIGEgZmlsZSBzeXN0ZW0gcGF0aCBwcm90b2NvbCA8cGVwLTUxOT5gCisKK1NlY3VyaXR5IGltcHJvdmVtZW50czoKKworKiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBibG9ja3MgdW50aWwgdGhlIHN5c3RlbSB1cmFuZG9tIGVudHJvcHkgcG9vbAorICBpcyBpbml0aWFsaXplZCB0byBpbmNyZWFzZSB0aGUgc2VjdXJpdHkuIFNlZSB0aGUgOnBlcDpgNTI0YCBmb3IgdGhlCisgIHJhdGlvbmFsZS4KKworV2luZG93cyBpbXByb3ZlbWVudHM6CisKKyogVGhlIGBgcHkuZXhlYGAgbGF1bmNoZXIsIHdoZW4gdXNlZCBpbnRlcmFjdGl2ZWx5LCBubyBsb25nZXIgcHJlZmVycworICBQeXRob24gMiBvdmVyIFB5dGhvbiAzIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBzcGVjaWZ5IGEgdmVyc2lvbiAodmlhCisgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb3IgYSBjb25maWcgZmlsZSkuICBIYW5kbGluZyBvZiBzaGViYW5nIGxpbmVzCisgIHJlbWFpbnMgdW5jaGFuZ2VkIC0gInB5dGhvbiIgcmVmZXJzIHRvIFB5dGhvbiAyIGluIHRoYXQgY2FzZS4KKworLi4gUEVQLXNpemVkIGl0ZW1zIG5leHQuCisKKy4uIF9wZXAtNFhYOgorCisuLiBQRVAgNFhYOiBWaXJ0dWFsIEVudmlyb25tZW50cworLi4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisuLiAoSW1wbGVtZW50ZWQgYnkgRm9vIEJhci4pCisKKy4uIC4uIHNlZWFsc286OgorCisgICAgOnBlcDpgNFhYYCAtIFB5dGhvbiBWaXJ0dWFsIEVudmlyb25tZW50cworICAgICAgIFBFUCB3cml0dGVuIGJ5IENhcmwgTWV5ZXIKKworLi4gWFhYIFBFUCA1MjA6IDpyZWY6YFByZXNlcnZpbmcgQ2xhc3MgQXR0cmlidXRlIERlZmluaXRpb24gT3JkZXI8d2hhdHNuZXctZGVmb3JkZXI+YAorCitOZXcgRmVhdHVyZXMKKz09PT09PT09PT09PQorCisuLiBfcGVwLTUyMzoKKworUEVQIDUyMzogQWRkaW5nIGEgZnJhbWUgZXZhbHVhdGlvbiBBUEkgdG8gQ1B5dGhvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGlsZSBQeXRob24gcHJvdmlkZXMgZXh0ZW5zaXZlIHN1cHBvcnQgdG8gY3VzdG9taXplIGhvdyBjb2RlCitleGVjdXRlcywgb25lIHBsYWNlIGl0IGhhcyBub3QgZG9uZSBzbyBpcyBpbiB0aGUgZXZhbHVhdGlvbiBvZiBmcmFtZQorb2JqZWN0cy4gSWYgeW91IHdhbnRlZCBzb21lIHdheSB0byBpbnRlcmNlcHQgZnJhbWUgZXZhbHVhdGlvbiBpbgorUHl0aG9uIHRoZXJlIHJlYWxseSB3YXNuJ3QgYW55IHdheSB3aXRob3V0IGRpcmVjdGx5IG1hbmlwdWxhdGluZworZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGRlZmluZWQgZnVuY3Rpb25zLgorCis6cGVwOmA1MjNgIGNoYW5nZXMgdGhpcyBieSBwcm92aWRpbmcgYW4gQVBJIHRvIG1ha2UgZnJhbWUKK2V2YWx1YXRpb24gcGx1Z2dhYmxlIGF0IHRoZSBDIGxldmVsLiBUaGlzIHdpbGwgYWxsb3cgZm9yIHRvb2xzIHN1Y2gKK2FzIGRlYnVnZ2VycyBhbmQgSklUcyB0byBpbnRlcmNlcHQgZnJhbWUgZXZhbHVhdGlvbiBiZWZvcmUgdGhlCitleGVjdXRpb24gb2YgUHl0aG9uIGNvZGUgYmVnaW5zLiBUaGlzIGVuYWJsZXMgdGhlIHVzZSBvZiBhbHRlcm5hdGl2ZQorZXZhbHVhdGlvbiBpbXBsZW1lbnRhdGlvbnMgZm9yIFB5dGhvbiBjb2RlLCB0cmFja2luZyBmcmFtZQorZXZhbHVhdGlvbiwgZXRjLgorCitUaGlzIEFQSSBpcyBub3QgcGFydCBvZiB0aGUgbGltaXRlZCBDIEFQSSBhbmQgaXMgbWFya2VkIGFzIHByaXZhdGUgdG8KK3NpZ25hbCB0aGF0IHVzYWdlIG9mIHRoaXMgQVBJIGlzIGV4cGVjdGVkIHRvIGJlIGxpbWl0ZWQgYW5kIG9ubHkKK2FwcGxpY2FibGUgdG8gdmVyeSBzZWxlY3QsIGxvdy1sZXZlbCB1c2UtY2FzZXMuCisKKy4uIHNlZWFsc286OgorCisgICAgOnBlcDpgNTIzYCAtIEFkZGluZyBhIGZyYW1lIGV2YWx1YXRpb24gQVBJIHRvIENQeXRob24KKyAgICAgICBQRVAgd3JpdHRlbiBieSBCcmV0dCBDYW5ub24gYW5kIERpbm8gVmllaGxhbmQuCisKKworLi4gX3BlcC01MTk6CisKK1BFUCA1MTk6IEFkZGluZyBhIGZpbGUgc3lzdGVtIHBhdGggcHJvdG9jb2wKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRmlsZSBzeXN0ZW0gcGF0aHMgaGF2ZSBoaXN0b3JpY2FsbHkgYmVlbiByZXByZXNlbnRlZCBhcyA6Y2xhc3M6YHN0cmAKK29yIDpjbGFzczpgYnl0ZXNgIG9iamVjdHMuIFRoaXMgaGFzIGxlZCB0byBwZW9wbGUgd2hvIHdyaXRlIGNvZGUgd2hpY2gKK29wZXJhdGUgb24gZmlsZSBzeXN0ZW0gcGF0aHMgdG8gYXNzdW1lIHRoYXQgc3VjaCBvYmplY3RzIGFyZSBvbmx5IG9uZQorb2YgdGhvc2UgdHdvIHR5cGVzIChhbiA6Y2xhc3M6YGludGAgcmVwcmVzZW50aW5nIGEgZmlsZSBkZXNjcmlwdG9yCitkb2VzIG5vdCBjb3VudCBhcyB0aGF0IGlzIG5vdCBhIGZpbGUgcGF0aCkuIFVuZm9ydHVuYXRlbHkgdGhhdAorYXNzdW1wdGlvbiBwcmV2ZW50cyBhbHRlcm5hdGl2ZSBvYmplY3QgcmVwcmVzZW50YXRpb25zIG9mIGZpbGUgc3lzdGVtCitwYXRocyBsaWtlIDptb2Q6YHBhdGhsaWJgIGZyb20gd29ya2luZyB3aXRoIHByZS1leGlzdGluZyBjb2RlLAoraW5jbHVkaW5nIFB5dGhvbidzIHN0YW5kYXJkIGxpYnJhcnkuCisKK1RvIGZpeCB0aGlzIHNpdHVhdGlvbiwgYSBuZXcgaW50ZXJmYWNlIHJlcHJlc2VudGVkIGJ5Cis6Y2xhc3M6YG9zLlBhdGhMaWtlYCBoYXMgYmVlbiBkZWZpbmVkLiBCeSBpbXBsZW1lbnRpbmcgdGhlCis6bWV0aDpgfm9zLlBhdGhMaWtlLl9fZnNwYXRoX19gIG1ldGhvZCwgYW4gb2JqZWN0IHNpZ25hbHMgdGhhdCBpdAorcmVwcmVzZW50cyBhIHBhdGguIEFuIG9iamVjdCBjYW4gdGhlbiBwcm92aWRlIGEgbG93LWxldmVsCityZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgc3lzdGVtIHBhdGggYXMgYSA6Y2xhc3M6YHN0cmAgb3IKKzpjbGFzczpgYnl0ZXNgIG9iamVjdC4gVGhpcyBtZWFucyBhbiBvYmplY3QgaXMgY29uc2lkZXJlZAorOnRlcm06YHBhdGgtbGlrZSA8cGF0aC1saWtlIG9iamVjdD5gIGlmIGl0IGltcGxlbWVudHMKKzpjbGFzczpgb3MuUGF0aExpa2VgIG9yIGlzIGEgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdAord2hpY2ggcmVwcmVzZW50cyBhIGZpbGUgc3lzdGVtIHBhdGguIENvZGUgY2FuIHVzZSA6ZnVuYzpgb3MuZnNwYXRoYCwKKzpmdW5jOmBvcy5mc2RlY29kZWAsIG9yIDpmdW5jOmBvcy5mc2VuY29kZWAgdG8gZXhwbGljaXRseSBnZXQgYQorOmNsYXNzOmBzdHJgIGFuZC9vciA6Y2xhc3M6YGJ5dGVzYCByZXByZXNlbnRhdGlvbiBvZiBhIHBhdGgtbGlrZQorb2JqZWN0LgorCitUaGUgYnVpbHQtaW4gOmZ1bmM6YG9wZW5gIGZ1bmN0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gYWNjZXB0Cis6Y2xhc3M6YG9zLlBhdGhMaWtlYCBvYmplY3RzIGFzIGhhdmUgYWxsIHJlbGV2YW50IGZ1bmN0aW9ucyBpbiB0aGUKKzptb2Q6YG9zYCBhbmQgOm1vZDpgb3MucGF0aGAgbW9kdWxlcy4gVGhlIDpjbGFzczpgb3MuRGlyRW50cnlgIGNsYXNzCithbmQgcmVsZXZhbnQgY2xhc3NlcyBpbiA6bW9kOmBwYXRobGliYCBoYXZlIGFsc28gYmVlbiB1cGRhdGVkIHRvCitpbXBsZW1lbnQgOmNsYXNzOmBvcy5QYXRoTGlrZWAuIFRoZSBob3BlIGlzIHRoYXQgdXBkYXRpbmcgdGhlCitmdW5kYW1lbnRhbCBmdW5jdGlvbnMgZm9yIG9wZXJhdGluZyBvbiBmaWxlIHN5c3RlbSBwYXRocyB3aWxsIGxlYWQKK3RvIHRoaXJkLXBhcnR5IGNvZGUgdG8gaW1wbGljaXRseSBzdXBwb3J0IGFsbAorOnRlcm06YHBhdGgtbGlrZSBvYmplY3RzIDxwYXRoLWxpa2Ugb2JqZWN0PmAgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2VzCitvciBhdCBsZWFzdCB2ZXJ5IG1pbmltYWwgb25lcyAoZS5nLiBjYWxsaW5nIDpmdW5jOmBvcy5mc3BhdGhgIGF0IHRoZQorYmVnaW5uaW5nIG9mIGNvZGUgYmVmb3JlIG9wZXJhdGluZyBvbiBhIHBhdGgtbGlrZSBvYmplY3QpLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0aGUgbmV3IGludGVyZmFjZSBhbGxvd3MgZm9yCis6Y2xhc3M6YHBhdGhsaWIuUGF0aGAgdG8gYmUgdXNlZCBtb3JlIGVhc2lseSBhbmQgdHJhbnNwYXJlbnRseSB3aXRoCitwcmUtZXhpc3RpbmcgY29kZTo6CisKKyAgPj4+IGltcG9ydCBwYXRobGliCisgID4+PiB3aXRoIG9wZW4ocGF0aGxpYi5QYXRoKCJSRUFETUUiKSkgYXMgZjoKKyAgLi4uICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgIC4uLgorICA+Pj4gaW1wb3J0IG9zLnBhdGgKKyAgPj4+IG9zLnBhdGguc3BsaXRleHQocGF0aGxpYi5QYXRoKCJzb21lX2ZpbGUudHh0IikpCisgICgnc29tZV9maWxlJywgJy50eHQnKQorICA+Pj4gb3MucGF0aC5qb2luKCIvYS9iIiwgcGF0aGxpYi5QYXRoKCJjIikpCisgICcvYS9iL2MnCisgID4+PiBpbXBvcnQgb3MKKyAgPj4+IG9zLmZzcGF0aChwYXRobGliLlBhdGgoInNvbWVfZmlsZS50eHQiKSkKKyAgJ3NvbWVfZmlsZS50eHQnCisKKyhJbXBsZW1lbnRlZCBieSBCcmV0dCBDYW5ub24sIEV0aGFuIEZ1cm1hbiwgRHVzdHkgUGhpbGxpcHMsIGFuZCBKZWxsZSBaaWpsc3RyYS4pCisKKy4uIHNlZWFsc286OgorCisgICAgOnBlcDpgNTE5YCAtIEFkZGluZyBhIGZpbGUgc3lzdGVtIHBhdGggcHJvdG9jb2wKKyAgICAgICBQRVAgd3JpdHRlbiBieSBCcmV0dCBDYW5ub24gYW5kIEtvb3MgWmV2ZW5ob3Zlbi4KKworCisuLiBfd2hhdHNuZXctZnN0cmluZ3M6CisKK1BFUCA0OTg6IEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhcmUgYSBuZXcga2luZCBvZiBzdHJpbmcgbGl0ZXJhbCwgcHJlZml4ZWQKK3dpdGggYGAnZidgYC4gIFRoZXkgYXJlIHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmdzIGFjY2VwdGVkIGJ5Cis6bWV0aDpgc3RyLmZvcm1hdGAuICBUaGV5IGNvbnRhaW4gcmVwbGFjZW1lbnQgZmllbGRzIHN1cnJvdW5kZWQgYnkKK2N1cmx5IGJyYWNlcy4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgYXJlIGV4cHJlc3Npb25zLCB3aGljaCBhcmUKK2V2YWx1YXRlZCBhdCBydW4gdGltZSwgYW5kIHRoZW4gZm9ybWF0dGVkIHVzaW5nIHRoZSA6ZnVuYzpgZm9ybWF0YCBwcm90b2NvbC4KKworICAgID4+PiBuYW1lID0gIkZyZWQiCisgICAgPj4+IGYiSGUgc2FpZCBoaXMgbmFtZSBpcyB7bmFtZX0uIgorICAgICdIZSBzYWlkIGhpcyBuYW1lIGlzIEZyZWQuJworCitTZWUgOnBlcDpgNDk4YCBhbmQgdGhlIG1haW4gZG9jdW1lbnRhdGlvbiBhdCA6cmVmOmBmLXN0cmluZ3NgLgorCisKK1BFUCA0ODc6IFNpbXBsZXIgY3VzdG9taXphdGlvbiBvZiBjbGFzcyBjcmVhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Vwb24gc3ViY2xhc3NpbmcgYSBjbGFzcywgdGhlIGBgX19pbml0X3N1YmNsYXNzX19gYCBjbGFzc21ldGhvZCAoaWYgZGVmaW5lZCkgaXMKK2NhbGxlZCBvbiB0aGUgYmFzZSBjbGFzcy4gVGhpcyBtYWtlcyBpdCBzdHJhaWdodGZvcndhcmQgdG8gd3JpdGUgY2xhc3NlcyB0aGF0CitjdXN0b21pemUgaW5pdGlhbGl6YXRpb24gb2YgZnV0dXJlIHN1YmNsYXNzZXMgd2l0aG91dCBpbnRyb2R1Y2luZyB0aGUKK2NvbXBsZXhpdHkgb2YgYSBmdWxsIGN1c3RvbSBtZXRhY2xhc3MuCisKK1RoZSBkZXNjcmlwdG9yIHByb3RvY29sIGhhcyBhbHNvIGJlZW4gZXhwYW5kZWQgdG8gaW5jbHVkZSBhIG5ldyBvcHRpb25hbCBtZXRob2QsCitgYF9fc2V0X25hbWVfX2BgLiBXaGVuZXZlciBhIG5ldyBjbGFzcyBpcyBkZWZpbmVkLCB0aGUgbmV3IG1ldGhvZCB3aWxsIGJlIGNhbGxlZAorb24gYWxsIGRlc2NyaXB0b3JzIGluY2x1ZGVkIGluIHRoZSBkZWZpbml0aW9uLCBwcm92aWRpbmcgdGhlbSB3aXRoIGEgcmVmZXJlbmNlCit0byB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZCBhbmQgdGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIGRlc2NyaXB0b3Igd2l0aGluIHRoZQorY2xhc3MgbmFtZXNwYWNlLgorCitBbHNvIHNlZSA6cGVwOmA0ODdgIGFuZCB0aGUgdXBkYXRlZCBjbGFzcyBjdXN0b21pemF0aW9uIGRvY3VtZW50YXRpb24gYXQKKzpyZWY6YGNsYXNzLWN1c3RvbWl6YXRpb25gIGFuZCA6cmVmOmBkZXNjcmlwdG9yc2AuCisKKyhDb250cmlidXRlZCBieSBNYXJ0aW4gVGVpY2htYW5uIGluIDppc3N1ZTpgMjczNjZgKQorCisKK1BZVEhPTk1BTExPQyBlbnZpcm9ubWVudCB2YXJpYWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBuZXcgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbGxvd3Mgc2V0dGluZyB0aGUgUHl0aG9uCittZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rcy4KKworSXQgaXMgbm93IHBvc3NpYmxlIHRvIGluc3RhbGwgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIG9uIFB5dGhvbgorY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlIHVzaW5nIGBgUFlUSE9OTUFMTE9DPWRlYnVnYGAuIEVmZmVjdHMgb2YgZGVidWcgaG9va3M6CisKKyogTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYAorKiBGcmVlZCBtZW1vcnkgaXMgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweERCYGAKKyogRGV0ZWN0IHZpb2xhdGlvbnMgb2YgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgQVBJLiBGb3IgZXhhbXBsZSwKKyAgOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieQorICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLgorKiBEZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQorKiBEZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisqIENoZWNrIHRoYXQgdGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgaXMgaGVsZCB3aGVuIGFsbG9jYXRvcgorICBmdW5jdGlvbnMgb2YgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgKGV4OiA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBhbmQKKyAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgKSBkb21haW5zIGFyZSBjYWxsZWQuCisKK0NoZWNraW5nIGlmIHRoZSBHSUwgaXMgaGVsZCBpcyBhbHNvIGEgbmV3IGZlYXR1cmUgb2YgUHl0aG9uIDMuNi4KKworU2VlIHRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGZvciBkZWJ1ZyBob29rcyBvbiBQeXRob24KK21lbW9yeSBhbGxvY2F0b3JzLgorCitJdCBpcyBub3cgYWxzbyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgYWxsb2NhdG9yIG9mCit0aGUgQyBsaWJyYXJ5IGZvciBhbGwgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyB1c2luZyBgYFBZVEhPTk1BTExPQz1tYWxsb2NgYC4KK0l0IGhlbHBzIHRvIHVzZSBleHRlcm5hbCBtZW1vcnkgZGVidWdnZXJzIGxpa2UgVmFsZ3JpbmQgb24gYSBQeXRob24gY29tcGlsZWQgaW4KK3JlbGVhc2UgbW9kZS4KKworT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZSB0aGUKKzptb2Q6YHRyYWNlbWFsbG9jYCBtb2R1bGUgdG8gZ2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzCithbGxvY2F0ZWQuCisKK0V4YW1wbGUgb2YgZmF0YWwgZXJyb3Igb24gYnVmZmVyIG92ZXJmbG93IHVzaW5nCitgYHB5dGhvbjMuNiAtWCB0cmFjZW1hbGxvYz01YGAgKHN0b3JlIDUgZnJhbWVzIGluIHRyYWNlcyk6OgorCisgICAgRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD0weDdmYmNkNDE2NjZmODogQVBJICdvJworICAgICAgICA0IGJ5dGVzIG9yaWdpbmFsbHkgcmVxdWVzdGVkCisgICAgICAgIFRoZSA3IHBhZCBieXRlcyBhdCBwLTcgYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLgorICAgICAgICBUaGUgOCBwYWQgYnl0ZXMgYXQgdGFpbD0weDdmYmNkNDE2NjZmYyBhcmUgbm90IGFsbCBGT1JCSURERU5CWVRFICgweGZiKToKKyAgICAgICAgICAgIGF0IHRhaWwrMDogMHgwMiAqKiogT1VDSAorICAgICAgICAgICAgYXQgdGFpbCsxOiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzI6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrMzogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs0OiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzU6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNjogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs3OiAweGZiCisgICAgICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMxMjMzMzI5IHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLgorICAgICAgICBEYXRhIGF0IHA6IDFhIDJiIDMwIDAwCisKKyAgICBNZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAKKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDY0OAorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDEyMgorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDg0CisKKyAgICBGYXRhbCBQeXRob24gZXJyb3I6IGJhZCB0cmFpbGluZyBwYWQgYnl0ZQorCisgICAgQ3VycmVudCB0aHJlYWQgMHgwMDAwN2ZiY2RiZDMyNzAwIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzIGluIHRlc3RfaGV4CisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2NDggaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIC4uLgorCisoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjUxNmAgYW5kIDppc3N1ZTpgMjY1NjRgLikKKworCisuLiBfd2hhdHNuZXctZGVmb3JkZXI6CisKK1BFUCA1MjA6IFByZXNlcnZpbmcgQ2xhc3MgQXR0cmlidXRlIERlZmluaXRpb24gT3JkZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXR0cmlidXRlcyBpbiBhIGNsYXNzIGRlZmluaXRpb24gYm9keSBoYXZlIGEgbmF0dXJhbCBvcmRlcmluZzogdGhlIHNhbWUKK29yZGVyIGluIHdoaWNoIHRoZSBuYW1lcyBhcHBlYXIgaW4gdGhlIHNvdXJjZS4gIFRoaXMgb3JkZXIgaXMgbm93CitwcmVzZXJ2ZWQgaW4gdGhlIG5ldyBjbGFzcydzIGBgX19kZWZpbml0aW9uX29yZGVyX19gYCBhdHRyaWJ1dGUuICBJdCBpcworYSB0dXBsZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4KK3RoZSBjbGFzcyBkZWZpbml0aW9uIGJvZHkuCisKK0ZvciB0eXBlcyB0aGF0IGRvbid0IGhhdmUgYSBkZWZpbml0aW9uIChlLmcuIGJ1aWx0aW5zKSwgb3IgdGhlIGF0dHJpYnV0ZQorb3JkZXIgY291bGQgbm90IGJlIGRldGVybWluZWQsIGBgX19kZWZpbml0aW9uX29yZGVyX19gYCBpcyBgYE5vbmVgYC4KKworQWxzbywgdGhlIGVmZmVjdGl2ZSBkZWZhdWx0IGNsYXNzICpleGVjdXRpb24qIG5hbWVzcGFjZSAocmV0dXJuZWQgZnJvbQorYGB0eXBlLl9fcHJlcGFyZV9fKClgYCkgaXMgbm93IGFuIGluc2VydGlvbi1vcmRlci1wcmVzZXJ2aW5nIG1hcHBpbmcuCitGb3IgQ1B5dGhvbiwgaXQgaXMgbm93IGBgY29sbGVjdGlvbnMuT3JkZXJlZERpY3RgYC4gIE5vdGUgdGhhdCB0aGUKK2NsYXNzIG5hbWVzcGFjZSwgYGBjbHMuX19kaWN0X19gYCwgaXMgdW5jaGFuZ2VkLgorCisuLiBzZWVhbHNvOjoKKworICAgOnBlcDpgNTIwYCAtIFByZXNlcnZpbmcgQ2xhc3MgQXR0cmlidXRlIERlZmluaXRpb24gT3JkZXIKKyAgICAgIFBFUCB3cml0dGVuIGFuZCBpbXBsZW1lbnRlZCBieSBFcmljIFNub3cuCisKKworT3RoZXIgTGFuZ3VhZ2UgQ2hhbmdlcworPT09PT09PT09PT09PT09PT09PT09PQorCitTb21lIHNtYWxsZXIgY2hhbmdlcyBtYWRlIHRvIHRoZSBjb3JlIFB5dGhvbiBsYW5ndWFnZSBhcmU6CisKKyogTG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgdHJhY2ViYWNrIGxpbmVzIGFyZSBub3cgYWJicmV2aWF0ZWQgYXMKKyAgYGAiW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQge2NvdW50fSBtb3JlIHRpbWVzXSJgYCAoc2VlCisgIDpyZWY6YHB5MzYtdHJhY2ViYWNrYCBmb3IgYW4gZXhhbXBsZSkuCisgIChDb250cmlidXRlZCBieSBFbWFudWVsIEJhcnJ5IGluIDppc3N1ZTpgMjY4MjNgLikKKworCitOZXcgTW9kdWxlcworPT09PT09PT09PT0KKworKiBOb25lIHlldC4KKworCitJbXByb3ZlZCBNb2R1bGVzCis9PT09PT09PT09PT09PT09CisKK09uIExpbnV4LCA6ZnVuYzpgb3MudXJhbmRvbWAgbm93IGJsb2NrcyB1bnRpbCB0aGUgc3lzdGVtIHVyYW5kb20gZW50cm9weSBwb29sCitpcyBpbml0aWFsaXplZCB0byBpbmNyZWFzZSB0aGUgc2VjdXJpdHkuIFNlZSB0aGUgOnBlcDpgNTI0YCBmb3IgdGhlIHJhdGlvbmFsZS4KKworCithc3luY2lvCistLS0tLS0tCisKK1NpbmNlIHRoZSA6bW9kOmBhc3luY2lvYCBtb2R1bGUgaXMgOnRlcm06YHByb3Zpc2lvbmFsIDxwcm92aXNpb25hbCBhcGk+YCwKK2FsbCBjaGFuZ2VzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuNiBoYXZlIGFsc28gYmVlbiBiYWNrcG9ydGVkIHRvIFB5dGhvbgorMy41LnguCisKK05vdGFibGUgY2hhbmdlcyBpbiB0aGUgOm1vZDpgYXN5bmNpb2AgbW9kdWxlIHNpbmNlIFB5dGhvbiAzLjUuMDoKKworKiBUaGUgOmZ1bmM6YH5hc3luY2lvLmVuc3VyZV9mdXR1cmVgIGZ1bmN0aW9uIGFuZCBhbGwgZnVuY3Rpb25zIHRoYXQKKyAgdXNlIGl0LCBzdWNoIGFzIDptZXRoOmBsb29wLnJ1bl91bnRpbF9jb21wbGV0ZSgpIDxhc3luY2lvLkJhc2VFdmVudExvb3AucnVuX3VudGlsX2NvbXBsZXRlPmAsCisgIG5vdyBhY2NlcHQgYWxsIGtpbmRzIG9mIDp0ZXJtOmBhd2FpdGFibGUgb2JqZWN0cyA8YXdhaXRhYmxlPmAuCisgIChDb250cmlidXRlZCBieSBZdXJ5IFNlbGl2YW5vdi4pCisKKyogTmV3IDpmdW5jOmB+YXN5bmNpby5ydW5fY29yb3V0aW5lX3RocmVhZHNhZmVgIGZ1bmN0aW9uIHRvIHN1Ym1pdAorICBjb3JvdXRpbmVzIHRvIGV2ZW50IGxvb3BzIGZyb20gb3RoZXIgdGhyZWFkcy4KKyAgKENvbnRyaWJ1dGVkIGJ5IFZpbmNlbnQgTWljaGVsLikKKworKiBOZXcgOm1ldGg6YFRyYW5zcG9ydC5pc19jbG9zaW5nKCkgPGFzeW5jaW8uQmFzZVRyYW5zcG9ydC5pc19jbG9zaW5nPmAKKyAgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSB0cmFuc3BvcnQgaXMgY2xvc2luZyBvciBjbG9zZWQuCisgIChDb250cmlidXRlZCBieSBZdXJ5IFNlbGl2YW5vdi4pCisKKyogVGhlIDptZXRoOmBsb29wLmNyZWF0ZV9zZXJ2ZXIoKSA8YXN5bmNpby5CYXNlRXZlbnRMb29wLmNyZWF0ZV9zZXJ2ZXI+YAorICBtZXRob2QgY2FuIG5vdyBhY2NlcHQgYSBsaXN0IG9mIGhvc3RzLgorICAoQ29udHJpYnV0ZWQgYnkgWWFubiBTaW9ubmVhdS4pCisKKyogTmV3IDptZXRoOmBsb29wLmNyZWF0ZV9mdXR1cmUoKSA8YXN5bmNpby5CYXNlRXZlbnRMb29wLmNyZWF0ZV9mdXR1cmU+YAorICBtZXRob2QgdG8gY3JlYXRlIEZ1dHVyZSBvYmplY3RzLiAgVGhpcyBhbGxvd3MgYWx0ZXJuYXRpdmUgZXZlbnQKKyAgbG9vcCBpbXBsZW1lbnRhdGlvbnMsIHN1Y2ggYXMKKyAgYHV2bG9vcCA8aHR0cHM6Ly9naXRodWIuY29tL01hZ2ljU3RhY2svdXZsb29wPmBfLCB0byBwcm92aWRlIGEgZmFzdGVyCisgIDpjbGFzczpgYXN5bmNpby5GdXR1cmVgIGltcGxlbWVudGF0aW9uLgorICAoQ29udHJpYnV0ZWQgYnkgWXVyeSBTZWxpdmFub3YuKQorCisqIE5ldyA6bWV0aDpgbG9vcC5nZXRfZXhjZXB0aW9uX2hhbmRsZXIoKSA8YXN5bmNpby5CYXNlRXZlbnRMb29wLmdldF9leGNlcHRpb25faGFuZGxlcj5gCisgIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIGhhbmRsZXIuCisgIChDb250cmlidXRlZCBieSBZdXJ5IFNlbGl2YW5vdi4pCisKKyogTmV3IDpmdW5jOmB+YXN5bmNpby50aW1lb3V0YCBjb250ZXh0IG1hbmFnZXIgdG8gc2ltcGxpZnkgdGltZW91dHMKKyAgaGFuZGxpbmcgY29kZS4KKyAgKENvbnRyaWJ1dGVkIGJ5IEFuZHJldyBTdmV0bG92LikKKworKiBOZXcgOm1ldGg6YFN0cmVhbVJlYWRlci5yZWFkdW50aWwoKSA8YXN5bmNpby5TdHJlYW1SZWFkZXIucmVhZHVudGlsPmAKKyAgbWV0aG9kIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0gdW50aWwgYSBzZXBhcmF0b3IgYnl0ZXMKKyAgc2VxdWVuY2UgYXBwZWFycy4KKyAgKENvbnRyaWJ1dGVkIGJ5IE1hcmsgS29yZW5iZXJnLikKKworKiBUaGUgOm1ldGg6YGxvb3AuZ2V0YWRkcmluZm8oKSA8YXN5bmNpby5CYXNlRXZlbnRMb29wLmdldGFkZHJpbmZvPmAKKyAgbWV0aG9kIGlzIG9wdGltaXplZCB0byBhdm9pZCBjYWxsaW5nIHRoZSBzeXN0ZW0gYGBnZXRhZGRyaW5mb2BgCisgIGZ1bmN0aW9uIGlmIHRoZSBhZGRyZXNzIGlzIGFscmVhZHkgcmVzb2x2ZWQuCisgIChDb250cmlidXRlZCBieSBBLiBKZXNzZSBKaXJ5dSBEYXZpcy4pCisKKworY29udGV4dGxpYgorLS0tLS0tLS0tLQorCitUaGUgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgIGNsYXNzIGhhcyBiZWVuIGFkZGVkIHRvCitwcm92aWRlIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbnRleHQgbWFuYWdlcnMuIEl0IHByb3ZpZGVzIGEKK3NlbnNpYmxlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGBfX2VudGVyX18oKWAgd2hpY2ggcmV0dXJucworYGBzZWxmYGAgYW5kIGxlYXZlcyBgX19leGl0X18oKWAgYW4gYWJzdHJhY3QgbWV0aG9kLiBBIG1hdGNoaW5nCitjbGFzcyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgOm1vZDpgdHlwaW5nYCBtb2R1bGUgYXMKKzpjbGFzczpgdHlwaW5nLkNvbnRleHRNYW5hZ2VyYC4KKyhDb250cmlidXRlZCBieSBCcmV0dCBDYW5ub24gaW4gOmlzc3VlOmAyNTYwOWAuKQorCisKK3ZlbnYKKy0tLS0KKworOm1vZDpgdmVudmAgYWNjZXB0cyBhIG5ldyBwYXJhbWV0ZXIgYGAtLXByb21wdGBgLiBUaGlzIHBhcmFtZXRlciBwcm92aWRlcyBhbgorYWx0ZXJuYXRpdmUgcHJlZml4IGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudC4gKFByb3Bvc2VkIGJ5IMWBdWthc3ouQmFsY2VyemFrCithbmQgcG9ydGVkIHRvIDMuNiBieSBTdMOpcGhhbmUgV2lydGVsIGluIDppc3N1ZTpgMjI4MjlgLikKKworCitkYXRldGltZQorLS0tLS0tLS0KKworVGhlIDptZXRoOmBkYXRldGltZS5zdHJmdGltZSgpIDxkYXRldGltZS5kYXRldGltZS5zdHJmdGltZT5gIGFuZAorOm1ldGg6YGRhdGUuc3RyZnRpbWUoKSA8ZGF0ZXRpbWUuZGF0ZS5zdHJmdGltZT5gIG1ldGhvZHMgbm93IHN1cHBvcnQgSVNPIDg2MDEgZGF0ZQorZGlyZWN0aXZlcyBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgLgorKENvbnRyaWJ1dGVkIGJ5IEFzaGxleSBBbmRlcnNvbiBpbiA6aXNzdWU6YDEyMDA2YC4pCisKKworZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBgYGRlZmF1bHRfZm9ybWF0YGAgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbQorOmNsYXNzOmBkaXN0dXRpbHMuY29tbWFuZC5zZGlzdC5zZGlzdGAgYW5kIHRoZSBgYGZvcm1hdHNgYAorYXR0cmlidXRlIGRlZmF1bHRzIHRvIGBgWydnenRhciddYGAuIEFsdGhvdWdoIG5vdCBhbnRpY2lwYXRlZCwKK0FueSBjb2RlIHJlbHlpbmcgb24gdGhlIHByZXNlbmNlIG9mIGBgZGVmYXVsdF9mb3JtYXRgYCBtYXkKK25lZWQgdG8gYmUgYWRhcHRlZC4gU2VlIDppc3N1ZTpgMjc4MTlgIGZvciBtb3JlIGRldGFpbHMuCisKKworZmF1bHRoYW5kbGVyCistLS0tLS0tLS0tLS0KKworT24gV2luZG93cywgdGhlIDptb2Q6YGZhdWx0aGFuZGxlcmAgbW9kdWxlIG5vdyBpbnN0YWxscyBhIGhhbmRsZXIgZm9yIFdpbmRvd3MKK2V4Y2VwdGlvbnM6IHNlZSA6ZnVuYzpgZmF1bHRoYW5kbGVyLmVuYWJsZWAuIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyMzg0OGAuKQorCisKK2h0dHAuY2xpZW50CistLS0tLS0tLS0tLQorCis6bWV0aDpgSFRUUENvbm5lY3Rpb24ucmVxdWVzdCgpIDxodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbi5yZXF1ZXN0PmAgYW5kCis6bWV0aDpgfmh0dHAuY2xpZW50LkhUVFBDb25uZWN0aW9uLmVuZGhlYWRlcnNgIGJvdGggbm93IHN1cHBvcnQKK2NodW5rZWQgZW5jb2RpbmcgcmVxdWVzdCBib2RpZXMuCisoQ29udHJpYnV0ZWQgYnkgRGVtaWFuIEJyZWNodCBhbmQgUm9sZiBLcmFobCBpbiA6aXNzdWU6YDEyMzE5YC4pCisKKworaWRsZWxpYiBhbmQgSURMRQorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaWRsZWxpYiBwYWNrYWdlIGlzIGJlaW5nIG1vZGVybml6ZWQgYW5kIHJlZmFjdG9yZWQgdG8gbWFrZSBJRExFIGxvb2sgYW5kIHdvcmsgYmV0dGVyIGFuZCB0byBtYWtlIHRoZSBjb2RlIGVhc2llciB0byB1bmRlcnN0YW5kLCB0ZXN0LCBhbmQgaW1wcm92ZS4gUGFydCBvZiBtYWtpbmcgSURMRSBsb29rIGJldHRlciwgZXNwZWNpYWxseSBvbiBMaW51eCBhbmQgTWFjLCBpcyB1c2luZyB0dGsgd2lkZ2V0cywgbW9zdGx5IGluIHRoZSBkaWFsb2dzLiAgQXMgYSByZXN1bHQsIElETEUgbm8gbG9uZ2VyIHJ1bnMgd2l0aCB0Y2wvdGsgOC40LiAgSXQgbm93IHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgOC42LiAgV2UgcmVjb21tZW5kIHJ1bm5pbmcgdGhlIGxhdGVzdCByZWxlYXNlIG9mIGVpdGhlci4KKworJ01vZGVybml6aW5nJyBpbmNsdWRlcyByZW5hbWluZyBhbmQgY29uc29saWRhdGlvbiBvZiBpZGxlbGliIG1vZHVsZXMuIFRoZSByZW5hbWluZyBvZiBmaWxlcyB3aXRoIHBhcnRpYWwgdXBwZXJjYXNlIG5hbWVzIGlzIHNpbWlsYXIgdG8gdGhlIHJlbmFtaW5nIG9mLCBmb3IgaW5zdGFuY2UsIFRraW50ZXIgYW5kIFRrRm9udCB0byB0a2ludGVyIGFuZCB0a2ludGVyLmZvbnQgaW4gMy4wLiAgQXMgYSByZXN1bHQsIGltcG9ydHMgb2YgaWRsZWxpYiBmaWxlcyB0aGF0IHdvcmtlZCBpbiAzLjUgd2lsbCB1c3VhbGx5IG5vdCB3b3JrIGluIDMuNi4gIEF0IGxlYXN0IGEgbW9kdWxlIG5hbWUgY2hhbmdlIHdpbGwgYmUgbmVlZGVkIChzZWUgaWRsZWxpYi9SRUFETUUudHh0KSwgc29tZXRpbWVzIG1vcmUuICAoTmFtZSBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IEFsIFN3aWVnYXJ0IGFuZCBUZXJyeSBSZWVkeSBpbiA6aXNzdWU6YDI0MjI1YC4gIE1vc3QgaWRsZWxpYiBwYXRjaGVzIHNpbmNlIGhhdmUgYmVlbiBhbmQgd2lsbCBiZSBwYXJ0IG9mIHRoZSBwcm9jZXNzLikKKworSW4gY29tcGVuc2F0aW9uLCB0aGUgZXZlbnR1YWwgcmVzdWx0IHdpdGggYmUgdGhhdCBzb21lIGlkbGVsaWIgY2xhc3NlcyB3aWxsIGJlIGVhc2llciB0byB1c2UsIHdpdGggYmV0dGVyIEFQSXMgYW5kIGRvY3N0cmluZ3MgZXhwbGFpbmluZyB0aGVtLiAgQWRkaXRpb25hbCB1c2VmdWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0byBpZGxlbGliIHdoZW4gYXZhaWxhYmxlLgorCisKK2ltcG9ydGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlcmAgbm93IGNhbGxzCis6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG9uIHRoZSB3cmFwcGVkIGxvYWRlciwgcmVtb3ZpbmcgdGhlCityZXN0cmljdGlvbiB0aGF0IDpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5CdWlsdGluSW1wb3J0ZXJgIGFuZAorOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkV4dGVuc2lvbkZpbGVMb2FkZXJgIGNvdWxkbid0IGJlIHVzZWQgd2l0aAorOmNsYXNzOmBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyYC4KKworCitvcworLS0KKworQSBuZXcgOm1ldGg6YH5vcy5zY2FuZGlyLmNsb3NlYCBtZXRob2QgYWxsb3dzIGV4cGxpY2l0bHkgY2xvc2luZyBhCis6ZnVuYzpgfm9zLnNjYW5kaXJgIGl0ZXJhdG9yLiAgVGhlIDpmdW5jOmB+b3Muc2NhbmRpcmAgaXRlcmF0b3Igbm93CitzdXBwb3J0cyB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wuICBJZiBhIDpmdW5jOmBzY2FuZGlyYAoraXRlcmF0b3IgaXMgbmVpdGhlciBleGhhdXN0ZWQgbm9yIGV4cGxpY2l0bHkgY2xvc2VkIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYAord2lsbCBiZSBlbWl0dGVkIGluIGl0cyBkZXN0cnVjdG9yLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNTk5NGAuKQorCitUaGUgTGludXggYGBnZXRyYW5kb20oKWBgIHN5c2NhbGwgKGdldCByYW5kb20gYnl0ZXMpIGlzIG5vdyBleHBvc2VkIGFzIHRoZSBuZXcKKzpmdW5jOmBvcy5nZXRyYW5kb21gIGZ1bmN0aW9uLgorKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyLCBwYXJ0IG9mIHRoZSA6cGVwOmA1MjRgKQorCisKK3BpY2tsZQorLS0tLS0tCisKK09iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gbm93IGJlIHBpY2tsZWQKK3VzaW5nIDpyZWY6YHBpY2tsZSBwcm90b2NvbHMgPHBpY2tsZS1wcm90b2NvbHM+YCBvbGRlciB0aGFuIHByb3RvY29sIHZlcnNpb24gNC4KK1Byb3RvY29sIHZlcnNpb24gNCBhbHJlYWR5IHN1cHBvcnRzIHRoaXMgY2FzZS4gIChDb250cmlidXRlZCBieSBTZXJoaXkKK1N0b3JjaGFrYSBpbiA6aXNzdWU6YDI0MTY0YC4pCisKKworcmVhZGxpbmUKKy0tLS0tLS0tCisKK0FkZGVkIDpmdW5jOmB+cmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeWAgdG8gZW5hYmxlIG9yIGRpc2FibGUKK2F1dG9tYXRpYyBhZGRpdGlvbiBvZiBpbnB1dCB0byB0aGUgaGlzdG9yeSBsaXN0LiAgKENvbnRyaWJ1dGVkIGJ5CitUeWxlciBDcm9tcHRvbiBpbiA6aXNzdWU6YDI2ODcwYC4pCisKKworcmxjb21wbGV0ZXIKKy0tLS0tLS0tLS0tCisKK1ByaXZhdGUgYW5kIHNwZWNpYWwgYXR0cmlidXRlIG5hbWVzIG5vdyBhcmUgb21pdHRlZCB1bmxlc3MgdGhlIHByZWZpeCBzdGFydHMKK3dpdGggdW5kZXJzY29yZXMuICBBIHNwYWNlIG9yIGEgY29sb24gaXMgYWRkZWQgYWZ0ZXIgc29tZSBjb21wbGV0ZWQga2V5d29yZHMuCisoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI1MDExYCBhbmQgOmlzc3VlOmAyNTIwOWAuKQorCitOYW1lcyBvZiBtb3N0IGF0dHJpYnV0ZXMgbGlzdGVkIGJ5IDpmdW5jOmBkaXJgIGFyZSBub3cgY29tcGxldGVkLgorUHJldmlvdXNseSwgbmFtZXMgb2YgcHJvcGVydGllcyBhbmQgc2xvdHMgd2hpY2ggd2VyZSBub3QgeWV0IGNyZWF0ZWQgb24KK2FuIGluc3RhbmNlIHdlcmUgZXhjbHVkZWQuICAoQ29udHJpYnV0ZWQgYnkgTWFydGluIFBhbnRlciBpbiA6aXNzdWU6YDI1NTkwYC4pCisKKworc2l0ZQorLS0tLQorCitXaGVuIHNwZWNpZnlpbmcgcGF0aHMgdG8gYWRkIHRvIDphdHRyOmBzeXMucGF0aGAgaW4gYSBgLnB0aGAgZmlsZSwKK3lvdSBtYXkgbm93IHNwZWNpZnkgZmlsZSBwYXRocyBvbiB0b3Agb2YgZGlyZWN0b3JpZXMgKGUuZy4gemlwIGZpbGVzKS4KKyhDb250cmlidXRlZCBieSBXb2xmZ2FuZyBMYW5nbmVyIGluIDppc3N1ZTpgMjY1ODdgKS4KKworCitzcWxpdGUzCistLS0tLS0tCisKKzphdHRyOmBzcWxpdGUzLkN1cnNvci5sYXN0cm93aWRgIG5vdyBzdXBwb3J0cyB0aGUgYGBSRVBMQUNFYGAgc3RhdGVtZW50LgorKENvbnRyaWJ1dGVkIGJ5IEFsZXggTG9yZFRob3JzZW4gaW4gOmlzc3VlOmAxNjg2NGAuKQorCisKK3NvY2tldAorLS0tLS0tCisKK1RoZSA6ZnVuYzpgfnNvY2tldC5zb2NrZXQuaW9jdGxgIGZ1bmN0aW9uIG5vdyBzdXBwb3J0cyB0aGUgOmRhdGE6YH5zb2NrZXQuU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGAKK2NvbnRyb2wgY29kZS4KKyhDb250cmlidXRlZCBieSBEYW5pZWwgU3Rva2VzIGluIDppc3N1ZTpgMjY1MzZgLikKKworVGhlIDptZXRoOmB+c29ja2V0LnNvY2tldC5nZXRzb2Nrb3B0YCBjb25zdGFudHMgYGBTT19ET01BSU5gYCwKK2BgU09fUFJPVE9DT0xgYCwgYGBTT19QRUVSU0VDYGAsIGFuZCBgYFNPX1BBU1NTRUNgYCBhcmUgbm93IHN1cHBvcnRlZC4KKyhDb250cmlidXRlZCBieSBDaHJpc3RpYW4gSGVpbWVzIGluIDppc3N1ZTpgMjY5MDdgLikKKworCitzb2NrZXRzZXJ2ZXIKKy0tLS0tLS0tLS0tLQorCitTZXJ2ZXJzIGJhc2VkIG9uIHRoZSA6bW9kOmBzb2NrZXRzZXJ2ZXJgIG1vZHVsZSwgaW5jbHVkaW5nIHRob3NlCitkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCis6bW9kOmB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJgLCBub3cgc3VwcG9ydCB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAKK3Byb3RvY29sLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjQwNGAuKQorCitUaGUgOmF0dHI6YH5zb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIGF0dHJpYnV0ZSBvZgorOmNsYXNzOmB+c29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyYCBjbGFzc2VzIG5vdyBpbXBsZW1lbnRzCit0aGUgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLiAgSW4gcGFydGljdWxhciwKK2NhbGxpbmcgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS53cml0ZWAgaXMgbm93IGd1YXJhbnRlZWQgdG8gc2VuZCB0aGUKK2RhdGEgaW4gZnVsbC4gIChDb250cmlidXRlZCBieSBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjY3MjFgLikKKworCitzdWJwcm9jZXNzCistLS0tLS0tLS0tCisKKzpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAgZGVzdHJ1Y3RvciBub3cgZW1pdHMgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIHdhcm5pbmcKK2lmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuIFVzZSB0aGUgY29udGV4dCBtYW5hZ2VyIHByb3RvY29sIChgYHdpdGgKK3Byb2M6IC4uLmBgKSBvciBjYWxsIGV4cGxpY2l0bHkgdGhlIDptZXRoOmB+c3VicHJvY2Vzcy5Qb3Blbi53YWl0YCBtZXRob2QgdG8KK3JlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjc0MWApLgorCisKK3RlbG5ldGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgfnRlbG5ldGxpYi5UZWxuZXRgIGlzIG5vdyBhIGNvbnRleHQgbWFuYWdlciAoY29udHJpYnV0ZWQgYnkKK1N0w6lwaGFuZSBXaXJ0ZWwgaW4gOmlzc3VlOmAyNTQ4NWApLgorCisKK3RraW50ZXIKKy0tLS0tLS0KKworQWRkZWQgbWV0aG9kcyA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfYWRkYCwKKzptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV9yZW1vdmVgIGFuZCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfaW5mb2AKK2luIHRoZSA6Y2xhc3M6YHRraW50ZXIuVmFyaWFibGVgIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzCis6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfdmFyaWFibGVgLCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VgLAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZkZWxldGVgIGFuZAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZpbmZvYCB0aGF0IHVzZSBvYnNvbGV0ZSBUY2wgY29tbWFuZHMgYW5kIG1pZ2h0Citub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyMjExNWApLgorCisKKy4uIF9weTM2LXRyYWNlYmFjazoKKwordHJhY2ViYWNrCistLS0tLS0tLS0KKworQm90aCB0aGUgdHJhY2ViYWNrIG1vZHVsZSBhbmQgdGhlIGludGVycHJldGVyJ3MgYnVpbHRpbiBleGNlcHRpb24gZGlzcGxheSBub3cKK2FiYnJldmlhdGUgbG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgbGluZXMgaW4gdHJhY2ViYWNrcyBhcyBzaG93biBpbiB0aGUKK2ZvbGxvd2luZyBleGFtcGxlOjoKKworICAgID4+PiBkZWYgZigpOiBmKCkKKyAgICAuLi4KKyAgICA+Pj4gZigpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIGYKKyAgICAgIFtQcmV2aW91cyBsaW5lIHJlcGVhdGVkIDk5NSBtb3JlIHRpbWVzXQorICAgIFJlY3Vyc2lvbkVycm9yOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBleGNlZWRlZAorCisoQ29udHJpYnV0ZWQgYnkgRW1hbnVlbCBCYXJyeSBpbiA6aXNzdWU6YDI2ODIzYC4pCisKKwordHlwaW5nCistLS0tLS0KKworVGhlIDpjbGFzczpgdHlwaW5nLkNvbnRleHRNYW5hZ2VyYCBjbGFzcyBoYXMgYmVlbiBhZGRlZCBmb3IKK3JlcHJlc2VudGluZyA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAuCisoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjU2MDlgLikKKworCit1bml0dGVzdC5tb2NrCistLS0tLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YH51bml0dGVzdC5tb2NrLk1vY2tgIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGltcHJvdmVtZW50czoKKworKiBUd28gbmV3IG1ldGhvZHMsIDptZXRoOmBNb2NrLmFzc2VydF9jYWxsZWQoKQorICA8dW5pdHRlc3QubW9jay5Nb2NrLmFzc2VydF9jYWxsZWQ+YCBhbmQgOm1ldGg6YE1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgPHVuaXR0ZXN0Lm1vY2suTW9jay5hc3NlcnRfY2FsbGVkX29uY2U+YCB0byBjaGVjayBpZiB0aGUgbW9jayBvYmplY3QKKyAgd2FzIGNhbGxlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEFtaXQgU2FoYSBpbiA6aXNzdWU6YDI2MzIzYC4pCisKKwordXJsbGliLnJlcXVlc3QKKy0tLS0tLS0tLS0tLS0tCisKK0lmIGEgSFRUUCByZXF1ZXN0IGhhcyBhIGZpbGUgb3IgaXRlcmFibGUgYm9keSAob3RoZXIgdGhhbiBhCitieXRlcyBvYmplY3QpIGJ1dCBubyBDb250ZW50LUxlbmd0aCBoZWFkZXIsIHJhdGhlciB0aGFuCit0aHJvd2luZyBhbiBlcnJvciwgOmNsYXNzOmB+dXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcmAgbm93CitmYWxscyBiYWNrIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLgorKENvbnRyaWJ1dGVkIGJ5IERlbWlhbiBCcmVjaHQgYW5kIFJvbGYgS3JhaGwgaW4gOmlzc3VlOmAxMjMxOWAuKQorCisKK3VybGxpYi5yb2JvdHBhcnNlcgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKzpjbGFzczpgfnVybGxpYi5yb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXJgIG5vdyBzdXBwb3J0cyB0aGUgYGBDcmF3bC1kZWxheWBgIGFuZAorYGBSZXF1ZXN0LXJhdGVgYCBleHRlbnNpb25zLgorKENvbnRyaWJ1dGVkIGJ5IE5pa29sYXkgQm9nb3ljaGV2IGluIDppc3N1ZTpgMTYwOTlgLikKKworCit3YXJuaW5ncworLS0tLS0tLS0KKworQSBuZXcgb3B0aW9uYWwgKnNvdXJjZSogcGFyYW1ldGVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorOmZ1bmM6YHdhcm5pbmdzLndhcm5fZXhwbGljaXRgIGZ1bmN0aW9uOiB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKzpleGM6YFJlc291cmNlV2FybmluZ2AuIEEgKnNvdXJjZSogYXR0cmlidXRlIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8KKzpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgIChjb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjU2OGAgYW5kIDppc3N1ZTpgMjY1NjdgKS4KKworV2hlbiBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZyBpcyBsb2dnZWQsIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgbm93Cit1c2VkIHRvIHRyeSB0byByZXRyaWV2ZSB0aGUgdHJhY2ViYWNrIHdoZXJlIHRoZSBkZXRyb3llZCBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKworRXhhbXBsZSB3aXRoIHRoZSBzY3JpcHQgYGBleGFtcGxlLnB5YGA6OgorCisgICAgaW1wb3J0IHdhcm5pbmdzCisKKyAgICBkZWYgZnVuYygpOgorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKworICAgIGYgPSBmdW5jKCkKKyAgICBmID0gTm9uZQorCitPdXRwdXQgb2YgdGhlIGNvbW1hbmQgYGBweXRob24zLjYgLVdkIC1YIHRyYWNlbWFsbG9jPTUgZXhhbXBsZS5weWBgOjoKKworICAgIGV4YW1wbGUucHk6NzogUmVzb3VyY2VXYXJuaW5nOiB1bmNsb3NlZCBmaWxlIDxfaW8uVGV4dElPV3JhcHBlciBuYW1lPSdleGFtcGxlLnB5JyBtb2RlPSdyJyBlbmNvZGluZz0nVVRGLTgnPgorICAgICAgZiA9IE5vbmUKKyAgICBPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNAorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNgorICAgICAgICBmID0gZnVuYygpCisKK1RoZSAiT2JqZWN0IGFsbG9jYXRlZCBhdCIgdHJhY2ViYWNrIGlzIG5ldyBhbmQgb25seSBkaXNwbGF5ZWQgaWYKKzptb2Q6YHRyYWNlbWFsbG9jYCBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGlmIHRoZQorOm1vZDpgd2FybmluZ3NgIHdhcyBhbHJlYWR5IGltcG9ydGVkLgorCisKK3dpbnJlZworLS0tLS0tCisKK0FkZGVkIHRoZSA2NC1iaXQgaW50ZWdlciB0eXBlIDpkYXRhOmBSRUdfUVdPUkQgPHdpbnJlZy5SRUdfUVdPUkQ+YC4KKyhDb250cmlidXRlZCBieSBDbGVtZW50IFJvdWF1bHQgaW4gOmlzc3VlOmAyMzAyNmAuKQorCisKK3dpbnNvdW5kCistLS0tLS0tLQorCitBbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byA6ZnVuYzpgQmVlcCA8d2luc291bmQuQmVlcD5gLAorOmZ1bmM6YE1lc3NhZ2VCZWVwIDx3aW5zb3VuZC5NZXNzYWdlQmVlcD5gLCBhbmQgOmZ1bmM6YFBsYXlTb3VuZAorPHdpbnNvdW5kLlBsYXlTb3VuZD5gICg6aXNzdWU6YDI3OTgyYCkuCisKKworemlwZmlsZQorLS0tLS0tLQorCitBIG5ldyA6bWV0aDpgWmlwSW5mby5mcm9tX2ZpbGUoKSA8emlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZT5gIGNsYXNzIG1ldGhvZAorYWxsb3dzIG1ha2luZyBhIDpjbGFzczpgfnppcGZpbGUuWmlwSW5mb2AgaW5zdGFuY2UgZnJvbSBhIGZpbGVzeXN0ZW0gZmlsZS4KK0EgbmV3IDptZXRoOmBaaXBJbmZvLmlzX2RpcigpIDx6aXBmaWxlLlppcEluZm8uaXNfZGlyPmAgbWV0aG9kIGNhbiBiZSB1c2VkCit0byBjaGVjayBpZiB0aGUgOmNsYXNzOmB+emlwZmlsZS5aaXBJbmZvYCBpbnN0YW5jZSByZXByZXNlbnRzIGEgZGlyZWN0b3J5LgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworVGhlIDptZXRoOmBaaXBGaWxlLm9wZW4oKSA8emlwZmlsZS5aaXBGaWxlLm9wZW4+YCBtZXRob2QgY2FuIG5vdyBiZSB1c2VkIHRvCit3cml0ZSBkYXRhIGludG8gYSBaSVAgZmlsZSwgYXMgd2VsbCBhcyBmb3IgZXh0cmFjdGluZyBkYXRhLgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworCit6bGliCistLS0tCisKK1RoZSA6ZnVuYzpgfnpsaWIuY29tcHJlc3NgIGZ1bmN0aW9uIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjI0M2AuKQorCisKK2ZpbGVpbnB1dAorLS0tLS0tLS0tCisKKzpmdW5jOmB+ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZGAgbm93IHN1cHBvcnRzIHRoZSAqZXJyb3JzKiBhcmd1bWVudC4KKyhDb250cmlidXRlZCBieSBKb3NlcGggSGFja21hbiBpbiA6aXNzdWU6YDI1Nzg4YC4pCisKKworT3B0aW1pemF0aW9ucworPT09PT09PT09PT09PQorCisqIFRoZSBBU0NJSSBkZWNvZGVyIGlzIG5vdyB1cCB0byA2MCB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYGlnbm9yZWBgIGFuZCBgYHJlcGxhY2VgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNDg3MGApLgorCisqIFRoZSBBU0NJSSBhbmQgdGhlIExhdGluMSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdCBmb3IgdGhlCisgIGVycm9yIGhhbmRsZXIgYGBzdXJyb2dhdGVlc2NhcGVgYCAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTIyN2ApLgorCisqIFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUyNjdgKS4KKworKiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUzMDFgKS4KKworKiBgYGJ5dGVzICUgYXJnc2BgIGlzIG5vdyB1cCB0byAyIHRpbWVzIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyCisgIGluIDppc3N1ZTpgMjUzNDlgKS4KKworKiBgYGJ5dGVhcnJheSAlIGFyZ3NgYCBpcyBub3cgYmV0d2VlbiAyLjUgYW5kIDUgdGltZXMgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkKKyAgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTM5OWApLgorCisqIE9wdGltaXplIDptZXRoOmBieXRlcy5mcm9taGV4YCBhbmQgOm1ldGg6YGJ5dGVhcnJheS5mcm9taGV4YDogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTQwMWApLgorCisqIE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgOgorICB1cCB0byA4MCUgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgSm9zaCBTbmlkZXIgaW4gOmlzc3VlOmAyNjU3NGApLgorCisqIEFsbG9jYXRvciBmdW5jdGlvbnMgb2YgdGhlIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgZG9tYWluCisgICg6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCkgbm93IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvcgorICA8cHltYWxsb2M+YCBpbnN0ZWFkIG9mIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeS4gVGhlCisgIHB5bWFsbG9jIGFsbG9jYXRvciBpcyBvcHRpbWl6ZWQgZm9yIG9iamVjdHMgc21hbGxlciBvciBlcXVhbCB0byA1MTIgYnl0ZXMKKyAgd2l0aCBhIHNob3J0IGxpZmV0aW1lLCBhbmQgdXNlIDpjOmZ1bmM6YG1hbGxvY2AgZm9yIGxhcmdlciBtZW1vcnkgYmxvY2tzLgorICAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjI0OWApLgorCisqIDpmdW5jOmBwaWNrbGUubG9hZGAgYW5kIDpmdW5jOmBwaWNrbGUubG9hZHNgIGFyZSBub3cgdXAgdG8gMTAlIGZhc3RlciB3aGVuCisgIGRlc2VyaWFsaXppbmcgbWFueSBzbWFsbCBvYmplY3RzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorICA6aXNzdWU6YDI3MDU2YCkuCisKKy0gUGFzc2luZyA6dGVybTpga2V5d29yZCBhcmd1bWVudHMgPGtleXdvcmQgYXJndW1lbnQ+YCB0byBhIGZ1bmN0aW9uIGhhcyBhbgorICBvdmVyaGVhZCBpbiBjb21wYXJpc29uIHdpdGggcGFzc2luZyA6dGVybTpgcG9zaXRpb25hbCBhcmd1bWVudHMKKyAgPHBvc2l0aW9uYWwgYXJndW1lbnQ+YC4gIE5vdyBpbiBleHRlbnNpb24gZnVuY3Rpb25zIGltcGxlbWVudGVkIHdpdGggdXNpbmcKKyAgQXJndW1lbnQgQ2xpbmljIHRoaXMgb3ZlcmhlYWQgaXMgc2lnbmlmaWNhbnRseSBkZWNyZWFzZWQuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjc1NzRgKS4KKworKiBPcHRpbWl6ZWQgOmZ1bmM6YH5nbG9iLmdsb2JgIGFuZCA6ZnVuYzpgfmdsb2IuaWdsb2JgIGZ1bmN0aW9ucyBpbiB0aGUKKyAgOm1vZDpgZ2xvYmAgbW9kdWxlOyB0aGV5IGFyZSBub3cgYWJvdXQgMy0tNiB0aW1lcyBmYXN0ZXIuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjU1OTZgKS4KKworCitCdWlsZCBhbmQgQyBBUEkgQ2hhbmdlcworPT09PT09PT09PT09PT09PT09PT09PT0KKworKiBOZXcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgQVBJIHdoaWNoIGluZGljYXRlcyBpZiBmbHVzaGluZyBidWZmZXJlZCBkYXRhCisgIGZhaWxlZCAoOmlzc3VlOmA1MzE5YCkuCisKKyogOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCBub3cgc3VwcG9ydHMgOnJlZjpgcG9zaXRpb25hbC1vbmx5CisgIHBhcmFtZXRlcnMgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4gIFBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzIGFyZQorICBkZWZpbmVkIGJ5IGVtcHR5IG5hbWVzLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI2MjgyYCkuCisKKyogYGBQeVRyYWNlYmFja19QcmludGBgIG1ldGhvZCBub3cgYWJicmV2aWF0ZXMgbG9uZyBzZXF1ZW5jZXMgb2YgcmVwZWF0ZWQgbGluZXMKKyAgYXMgYGAiW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQge2NvdW50fSBtb3JlIHRpbWVzXSJgYC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEVtYW51ZWwgQmFycnkgaW4gOmlzc3VlOmAyNjgyM2AuKQorCisKK0RlcHJlY2F0ZWQKKz09PT09PT09PT0KKworTmV3IEtleXdvcmRzCistLS0tLS0tLS0tLS0KKworYGBhc3luY2BgIGFuZCBgYGF3YWl0YGAgYXJlIG5vdCByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGFzIHZhcmlhYmxlLCBjbGFzcywKK2Z1bmN0aW9uIG9yIG1vZHVsZSBuYW1lcy4gIEludHJvZHVjZWQgYnkgOnBlcDpgNDkyYCBpbiBQeXRob24gMy41LCB0aGV5IHdpbGwKK2JlY29tZSBwcm9wZXIga2V5d29yZHMgaW4gUHl0aG9uIDMuNy4KKworCitEZXByZWNhdGVkIFB5dGhvbiBtb2R1bGVzLCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIDptZXRoOmBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIubG9hZF9tb2R1bGVgIGFuZAorICA6bWV0aDpgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VsZXNzRmlsZUxvYWRlci5sb2FkX21vZHVsZWAgYXJlIG5vdworICBkZXByZWNhdGVkLiBUaGV5IHdlcmUgdGhlIG9ubHkgcmVtYWluaW5nIGltcGxlbWVudGF0aW9ucyBvZgorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIGluIDptb2Q6YGltcG9ydGxpYmAgdGhhdCBoYWQgbm90CisgIGJlZW4gZGVwcmVjYXRlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24gaW4gZmF2b3VyIG9mCisgIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAuCisKKworRGVwcmVjYXRlZCBmdW5jdGlvbnMgYW5kIHR5cGVzIG9mIHRoZSBDIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIE5vbmUgeWV0LgorCisKK0RlcHJlY2F0ZWQgZmVhdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgYGBweXZlbnZgYCBzY3JpcHQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYGBweXRob24zIC1tIHZlbnZgYC4KKyAgVGhpcyBwcmV2ZW50cyBjb25mdXNpb24gYXMgdG8gd2hhdCBQeXRob24gaW50ZXJwcmV0ZXIgYGBweXZlbnZgYCBpcworICBjb25uZWN0ZWQgdG8gYW5kIHRodXMgd2hhdCBQeXRob24gaW50ZXJwcmV0ZXIgd2lsbCBiZSB1c2VkIGJ5IHRoZSB2aXJ0dWFsCisgIGVudmlyb25tZW50LiAoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjUxNTRgLikKKworKiBXaGVuIHBlcmZvcm1pbmcgYSByZWxhdGl2ZSBpbXBvcnQsIGZhbGxpbmcgYmFjayBvbiBgYF9fbmFtZV9fYGAgYW5kCisgIGBgX19wYXRoX19gYCBmcm9tIHRoZSBjYWxsaW5nIG1vZHVsZSB3aGVuIGBgX19zcGVjX19gYCBvcgorICBgYF9fcGFja2FnZV9fYGAgYXJlIG5vdCBkZWZpbmVkIG5vdyByYWlzZXMgYW4gOmV4YzpgSW1wb3J0V2FybmluZ2AuCisgIChDb250cmlidXRlZCBieSBSb3NlIEFtZXMgaW4gOmlzc3VlOmAyNTc5MWAuKQorCisqIFVubGlrZSB0byBvdGhlciA6bW9kOmBkYm1gIGltcGxlbWVudGF0aW9ucywgdGhlIDptb2Q6YGRibS5kdW1iYCBtb2R1bGUKKyAgY3JlYXRlcyBkYXRhYmFzZSBpbiBgYCdyJ2BgIGFuZCBgYCd3J2BgIG1vZGVzIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kCisgIGFsbG93cyBtb2RpZnlpbmcgZGF0YWJhc2UgaW4gYGAncidgYCBtb2RlLiAgVGhpcyBiZWhhdmlvciBpcyBub3cgZGVwcmVjYXRlZAorICBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuOC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyMTcwOGAuKQorCisqIFVuZG9jdW1lbnRlZCBzdXBwb3J0IG9mIGdlbmVyYWwgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0cyA8Ynl0ZXMtbGlrZSBvYmplY3Q+YAorICBhcyBwYXRocyBpbiA6bW9kOmBvc2AgZnVuY3Rpb25zLCA6ZnVuYzpgY29tcGlsZWAgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGlzCisgIG5vdyBkZXByZWNhdGVkLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI1NzkxYCBhbmQgOmlzc3VlOmAyNjc1NGAuKQorCisqIFRoZSB1bmRvY3VtZW50ZWQgYGBleHRyYV9wYXRoYGAgYXJndW1lbnQgdG8gYSBkaXN0dXRpbHMgRGlzdHJpYnV0aW9uCisgIGlzIG5vdyBjb25zaWRlcmVkCisgIGRlcHJlY2F0ZWQsIHdpbGwgcmFpc2UgYSB3YXJuaW5nIGR1cmluZyBpbnN0YWxsIGlmIHNldC4gU3VwcG9ydCBmb3IgdGhpcworICBwYXJhbWV0ZXIgd2lsbCBiZSBkcm9wcGVkIGluIGEgZnV0dXJlIFB5dGhvbiByZWxlYXNlIGFuZCBsaWtlbHkgZWFybGllcgorICB0aHJvdWdoIHRoaXJkIHBhcnR5IHRvb2xzLiBTZWUgOmlzc3VlOmAyNzkxOWAgZm9yIGRldGFpbHMuCisKKworRGVwcmVjYXRlZCBQeXRob24gYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogUmFpc2luZyB0aGUgOmV4YzpgU3RvcEl0ZXJhdGlvbmAgZXhjZXB0aW9uIGluc2lkZSBhIGdlbmVyYXRvciB3aWxsIG5vdyBnZW5lcmF0ZSBhCisgIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AsIGFuZCB3aWxsIHRyaWdnZXIgYSA6ZXhjOmBSdW50aW1lRXJyb3JgIGluIFB5dGhvbiAzLjcuCisgIFNlZSA6cmVmOmB3aGF0c25ldy1wZXAtNDc5YCBmb3IgZGV0YWlscy4KKworCitSZW1vdmVkCis9PT09PT09CisKK0FQSSBhbmQgRmVhdHVyZSBSZW1vdmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYGBpbnNwZWN0LmdldG1vZHVsZWluZm8oKWBgIHdhcyByZW1vdmVkICh3YXMgZGVwcmVjYXRlZCBzaW5jZSBDUHl0aG9uIDMuMykuCisgIDpmdW5jOmBpbnNwZWN0LmdldG1vZHVsZW5hbWVgIHNob3VsZCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIG1vZHVsZQorICBuYW1lIGZvciBhIGdpdmVuIHBhdGguCisKKyogYGB0cmFjZWJhY2suSWdub3JlYGAgY2xhc3MgYW5kIGBgdHJhY2ViYWNrLnVzYWdlYGAsIGBgdHJhY2ViYWNrLm1vZG5hbWVgYCwKKyAgYGB0cmFjZWJhY2suZnVsbG1vZG5hbWVgYCwgYGB0cmFjZWJhY2suZmluZF9saW5lc19mcm9tX2NvZGVgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9saW5lc2BgLCBgYHRyYWNlYmFjay5maW5kX3N0cmluZ3NgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9leGVjdXRhYmxlX2xpbmVzYGAgbWV0aG9kcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgOm1vZDpgdHJhY2ViYWNrYCBtb2R1bGUuIFRoZXkgd2VyZSB1bmRvY3VtZW50ZWQgbWV0aG9kcyBkZXByZWNhdGVkIHNpbmNlCisgIFB5dGhvbiAzLjIgYW5kIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgZnJvbSBwcml2YXRlIG1ldGhvZHMuCisKKyogVGhlIGBgdGtfbWVudUJhcigpYGAgYW5kIGBgdGtfYmluZEZvclRyYXZlcnNhbCgpYGAgZHVtbXkgbWV0aG9kcyBpbgorICA6bW9kOmB0a2ludGVyYCB3aWRnZXQgY2xhc3NlcyB3ZXJlIHJlbW92ZWQgKGNvcnJlc3BvbmRpbmcgVGsgY29tbWFuZHMKKyAgd2VyZSBvYnNvbGV0ZSBzaW5jZSBUayA0LjApLgorCisqIFRoZSA6bWV0aDpgfnppcGZpbGUuWmlwRmlsZS5vcGVuYCBtZXRob2Qgb2YgdGhlIDpjbGFzczpgemlwZmlsZS5aaXBGaWxlYAorICBjbGFzcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGBgJ1UnYGAgbW9kZSAod2FzIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDMuNCkuCisgIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nIGNvbXByZXNzZWQgdGV4dCBmaWxlcyBpbgorICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiAncHl0aG9uJyBDb21tYW5kIEJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIGBgQ09VTlRfQUxMT0NTYGAsCisgIGBgU0hPV19BTExPQ19DT1VOVGBgIG9yIGBgU0hPV19UUkFDS19DT1VOVGBgIG1hY3JvcyBpcyBub3cgb2ZmIGJ5CisgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZyB0aGUgYGAtWCBzaG93YWxsb2Njb3VudGBgIG9wdGlvbi4KKyAgSXQgbm93IG91dHB1dHMgdG8gYGBzdGRlcnJgYCBpbnN0ZWFkIG9mIGBgc3Rkb3V0YGAuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjMwMzRgLikKKworCitDaGFuZ2VzIGluIHRoZSBQeXRob24gQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogT24gTGludXgsIDpmdW5jOmBvcy51cmFuZG9tYCBub3cgYmxvY2tzIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wKKyAgaXMgaW5pdGlhbGl6ZWQgdG8gaW5jcmVhc2UgdGhlIHNlY3VyaXR5LgorCisqIFdoZW4gOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpcyBkZWZpbmVkLAorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBhbHNvIGJlIGRlZmluZWQuCisKKyogVGhlIGZvcm1hdCBvZiB0aGUgYGBjb19sbm90YWJgYCBhdHRyaWJ1dGUgb2YgY29kZSBvYmplY3RzIGNoYW5nZWQgdG8gc3VwcG9ydAorICBuZWdhdGl2ZSBsaW5lIG51bWJlciBkZWx0YS4gQnkgZGVmYXVsdCwgUHl0aG9uIGRvZXMgbm90IGVtaXQgYnl0ZWNvZGUgd2l0aAorICBuZWdhdGl2ZSBsaW5lIG51bWJlciBkZWx0YS4gRnVuY3Rpb25zIHVzaW5nIGBgZnJhbWUuZl9saW5lbm9gYCwKKyAgYGBQeUZyYW1lX0dldExpbmVOdW1iZXIoKWBgIG9yIGBgUHlDb2RlX0FkZHIyTGluZSgpYGAgYXJlIG5vdCBhZmZlY3RlZC4KKyAgRnVuY3Rpb25zIGRlY29kaW5nIGRpcmVjdGx5IGBgY29fbG5vdGFiYGAgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gdXNlIGEgc2lnbmVkCisgIDgtYml0IGludGVnZXIgdHlwZSBmb3IgdGhlIGxpbmUgbnVtYmVyIGRlbHRhLCBidXQgaXQncyBvbmx5IHJlcXVpcmVkIHRvCisgIHN1cHBvcnQgYXBwbGljYXRpb25zIHVzaW5nIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLiBTZWUKKyAgYGBPYmplY3RzL2xub3RhYl9ub3Rlcy50eHRgYCBmb3IgdGhlIGBgY29fbG5vdGFiYGAgZm9ybWF0IGFuZCBob3cgdG8gZGVjb2RlCisgIGl0LCBhbmQgc2VlIHRoZSA6cGVwOmA1MTFgIGZvciB0aGUgcmF0aW9uYWxlLgorCisqIFRoZSBmdW5jdGlvbnMgaW4gdGhlIDptb2Q6YGNvbXBpbGVhbGxgIG1vZHVsZSBub3cgcmV0dXJuIGJvb2xlYW5zIGluc3RlYWQKKyAgb2YgYGAxYGAgb3IgYGAwYGAgdG8gcmVwcmVzZW50IHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgcmVzcGVjdGl2ZWx5LiBUaGFua3MgdG8KKyAgYm9vbGVhbnMgYmVpbmcgYSBzdWJjbGFzcyBvZiBpbnRlZ2VycywgdGhpcyBzaG91bGQgb25seSBiZSBhbiBpc3N1ZSBpZiB5b3UKKyAgd2VyZSBkb2luZyBpZGVudGl0eSBjaGVja3MgZm9yIGBgMWBgIG9yIGBgMGBgLiBTZWUgOmlzc3VlOmAyNTc2OGAuCisKKyogUmVhZGluZyB0aGUgOmF0dHI6YH51cmxsaWIucGFyc2UuU3BsaXRSZXN1bHQucG9ydGAgYXR0cmlidXRlIG9mCisgIDpmdW5jOmB1cmxsaWIucGFyc2UudXJsc3BsaXRgIGFuZCA6ZnVuYzpgfnVybGxpYi5wYXJzZS51cmxwYXJzZWAgcmVzdWx0cworICBub3cgcmFpc2VzIDpleGM6YFZhbHVlRXJyb3JgIGZvciBvdXQtb2YtcmFuZ2UgdmFsdWVzLCByYXRoZXIgdGhhbgorICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4gIFNlZSA6aXNzdWU6YDIwMDU5YC4KKworKiBUaGUgOm1vZDpgaW1wYCBtb2R1bGUgbm93IHJhaXNlcyBhIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AgaW5zdGVhZCBvZgorICA6ZXhjOmBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nYC4KKworKiBUaGUgZm9sbG93aW5nIG1vZHVsZXMgaGF2ZSBoYWQgbWlzc2luZyBBUElzIGFkZGVkIHRvIHRoZWlyIDphdHRyOmBfX2FsbF9fYAorICBhdHRyaWJ1dGVzIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXM6CisgIDptb2Q6YGNhbGVuZGFyYCwgOm1vZDpgY2dpYCwgOm1vZDpgY3N2YCwKKyAgOm1vZDpgfnhtbC5ldHJlZS5FbGVtZW50VHJlZWAsIDptb2Q6YGVudW1gLAorICA6bW9kOmBmaWxlaW5wdXRgLCA6bW9kOmBmdHBsaWJgLCA6bW9kOmBsb2dnaW5nYCwgOm1vZDpgbWFpbGJveGAsCisgIDptb2Q6YG1pbWV0eXBlc2AsIDptb2Q6YG9wdHBhcnNlYCwgOm1vZDpgcGxpc3RsaWJgLCA6bW9kOmBzbXRwZGAsCisgIDptb2Q6YHN1YnByb2Nlc3NgLCA6bW9kOmB0YXJmaWxlYCwgOm1vZDpgdGhyZWFkaW5nYCBhbmQKKyAgOm1vZDpgd2F2ZWAuICBUaGlzIG1lYW5zIHRoZXkgd2lsbCBleHBvcnQgbmV3IHN5bWJvbHMgd2hlbiBgYGltcG9ydCAqYGAKKyAgaXMgdXNlZC4gIFNlZSA6aXNzdWU6YDIzODgzYC4KKworKiBXaGVuIHBlcmZvcm1pbmcgYSByZWxhdGl2ZSBpbXBvcnQsIGlmIGBgX19wYWNrYWdlX19gYCBkb2VzIG5vdCBjb21wYXJlIGVxdWFsCisgIHRvIGBgX19zcGVjX18ucGFyZW50YGAgdGhlbiA6ZXhjOmBJbXBvcnRXYXJuaW5nYCBpcyByYWlzZWQuCisgIChDb250cmlidXRlZCBieSBCcmV0dCBDYW5ub24gaW4gOmlzc3VlOmAyNTc5MWAuKQorCisqIFdoZW4gYSByZWxhdGl2ZSBpbXBvcnQgaXMgcGVyZm9ybWVkIGFuZCBubyBwYXJlbnQgcGFja2FnZSBpcyBrbm93biwgdGhlbgorICA6ZXhjOmBJbXBvcnRFcnJvcmAgd2lsbCBiZSByYWlzZWQuIFByZXZpb3VzbHksIDpleGM6YFN5c3RlbUVycm9yYCBjb3VsZCBiZQorICByYWlzZWQuIChDb250cmlidXRlZCBieSBCcmV0dCBDYW5ub24gaW4gOmlzc3VlOmAxODAxOGAuKQorCisqIFNlcnZlcnMgYmFzZWQgb24gdGhlIDptb2Q6YHNvY2tldHNlcnZlcmAgbW9kdWxlLCBpbmNsdWRpbmcgdGhvc2UKKyAgZGVmaW5lZCBpbiA6bW9kOmBodHRwLnNlcnZlcmAsIDptb2Q6YHhtbHJwYy5zZXJ2ZXJgIGFuZAorICA6bW9kOmB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJgLCBub3cgb25seSBjYXRjaCBleGNlcHRpb25zIGRlcml2ZWQKKyAgZnJvbSA6ZXhjOmBFeGNlcHRpb25gLiBUaGVyZWZvcmUgaWYgYSByZXF1ZXN0IGhhbmRsZXIgcmFpc2VzCisgIGFuIGV4Y2VwdGlvbiBsaWtlIDpleGM6YFN5c3RlbUV4aXRgIG9yIDpleGM6YEtleWJvYXJkSW50ZXJydXB0YCwKKyAgOm1ldGg6YH5zb2NrZXRzZXJ2ZXIuQmFzZVNlcnZlci5oYW5kbGVfZXJyb3JgIGlzIG5vIGxvbmdlciBjYWxsZWQsIGFuZAorICB0aGUgZXhjZXB0aW9uIHdpbGwgc3RvcCBhIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIuIChDb250cmlidXRlZCBieQorICBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjM0MzBgLikKKworKiA6ZnVuYzpgc3B3ZC5nZXRzcG5hbWAgbm93IHJhaXNlcyBhIDpleGM6YFBlcm1pc3Npb25FcnJvcmAgaW5zdGVhZCBvZgorICA6ZXhjOmBLZXlFcnJvcmAgaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHByaXZpbGVnZXMuCisKKyogVGhlIDptZXRoOmBzb2NrZXQuc29ja2V0LmNsb3NlYCBtZXRob2Qgbm93IHJhaXNlcyBhbiBleGNlcHRpb24gaWYKKyAgYW4gZXJyb3IgKGUuZy4gRUJBREYpIHdhcyByZXBvcnRlZCBieSB0aGUgdW5kZXJseWluZyBzeXN0ZW0gY2FsbC4KKyAgU2VlIDppc3N1ZTpgMjY2ODVgLgorCisqIFRoZSAqZGVjb2RlX2RhdGEqIGFyZ3VtZW50IGZvciA6Y2xhc3M6YHNtdHBkLlNNVFBDaGFubmVsYCBhbmQKKyAgOmNsYXNzOmBzbXRwZC5TTVRQU2VydmVyYCBjb25zdHJ1Y3RvcnMgaXMgbm93IGBgRmFsc2VgYCBieSBkZWZhdWx0LgorICBUaGlzIG1lYW5zIHRoYXQgdGhlIGFyZ3VtZW50IHBhc3NlZCB0bworICA6bWV0aDpgfnNtdHBkLlNNVFBTZXJ2ZXIucHJvY2Vzc19tZXNzYWdlYCBpcyBub3cgYSBieXRlcyBvYmplY3QgYnkKKyAgZGVmYXVsdCwgYW5kIGBgcHJvY2Vzc19tZXNzYWdlKClgYCB3aWxsIGJlIHBhc3NlZCBrZXl3b3JkIGFyZ3VtZW50cy4KKyAgQ29kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGRlcHJlY2F0aW9uCisgIHdhcm5pbmcgZ2VuZXJhdGVkIGJ5IDMuNSB3aWxsIG5vdCBiZSBhZmZlY3RlZC4KKworKiBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBvZiB0aGUgOmZ1bmM6YH5qc29uLmR1bXBgLCA6ZnVuYzpgfmpzb24uZHVtcHNgLAorICA6ZnVuYzpgfmpzb24ubG9hZGAgYW5kIDpmdW5jOmB+anNvbi5sb2Fkc2AgZnVuY3Rpb25zIGFuZAorICA6Y2xhc3M6YH5qc29uLkpTT05FbmNvZGVyYCBhbmQgOmNsYXNzOmB+anNvbi5KU09ORGVjb2RlcmAgY2xhc3MKKyAgY29uc3RydWN0b3JzIGluIHRoZSA6bW9kOmBqc29uYCBtb2R1bGUgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkKKyAgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAxODcyNmAuKQorCisqIEFzIHBhcnQgb2YgOnBlcDpgNDg3YCwgdGhlIGhhbmRsaW5nIG9mIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCB0bworICA6Y2xhc3M6YHR5cGVgIChvdGhlciB0aGFuIHRoZSBtZXRhY2xhc3MgaGludCwgYGBtZXRhY2xhc3NgYCkgaXMgbm93CisgIGNvbnNpc3RlbnRseSBkZWxlZ2F0ZWQgdG8gOm1ldGg6YG9iamVjdC5fX2luaXRfc3ViY2xhc3NfX2AuIFRoaXMgbWVhbnMgdGhhdAorICA6bWV0aDpgdHlwZS5fX25ld19fYCBhbmQgOm1ldGg6YHR5cGUuX19pbml0X19gIGJvdGggbm93IGFjY2VwdCBhcmJpdHJhcnkKKyAga2V5d29yZCBhcmd1bWVudHMsIGJ1dCA6bWV0aDpgb2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fYCAod2hpY2ggaXMgY2FsbGVkIGZyb20KKyAgOm1ldGg6YHR5cGUuX19uZXdfX2ApIHdpbGwgcmVqZWN0IHRoZW0gYnkgZGVmYXVsdC4gQ3VzdG9tIG1ldGFjbGFzc2VzCisgIGFjY2VwdGluZyBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHdpbGwgbmVlZCB0byBhZGp1c3QgdGhlaXIgY2FsbHMgdG8KKyAgOm1ldGg6YHR5cGUuX19uZXdfX2AgKHdoZXRoZXIgZGlyZWN0IG9yIHZpYSA6Y2xhc3M6YHN1cGVyYCkgYWNjb3JkaW5nbHkuCisKKyogSW4gOmNsYXNzOmBkaXN0dXRpbHMuY29tbWFuZC5zZGlzdC5zZGlzdGAsIHRoZSBgYGRlZmF1bHRfZm9ybWF0YGAKKyAgYXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBob25vcmVkLiBJbnN0ZWFkLCB0aGUKKyAgZ3ppcHBlZCB0YXJmaWxlIGZvcm1hdCBpcyB0aGUgZGVmYXVsdCBvbiBhbGwgcGxhdGZvcm1zIGFuZCBubworICBwbGF0Zm9ybS1zcGVjaWZpYyBzZWxlY3Rpb24gaXMgbWFkZS4KKyAgSW4gZW52aXJvbm1lbnRzIHdoZXJlIGRpc3RyaWJ1dGlvbnMgYXJlCisgIGJ1aWx0IG9uIFdpbmRvd3MgYW5kIHppcCBkaXN0cmlidXRpb25zIGFyZSByZXF1aXJlZCwgY29uZmlndXJlCisgIHRoZSBwcm9qZWN0IHdpdGggYSBgYHNldHVwLmNmZ2BgIGZpbGUgY29udGFpbmluZyB0aGUgZm9sbG93aW5nOjoKKworICAgIFtzZGlzdF0KKyAgICBmb3JtYXRzPXppcAorCisgIFRoaXMgYmVoYXZpb3IgaGFzIGFsc28gYmVlbiBiYWNrcG9ydGVkIHRvIGVhcmxpZXIgUHl0aG9uIHZlcnNpb25zCisgIGJ5IFNldHVwdG9vbHMgMjYuMC4wLgorCisqIEluIHRoZSA6bW9kOmB1cmxsaWIucmVxdWVzdGAgbW9kdWxlIGFuZCB0aGUKKyAgOm1ldGg6YGh0dHAuY2xpZW50LkhUVFBDb25uZWN0aW9uLnJlcXVlc3RgIG1ldGhvZCwgaWYgbm8gQ29udGVudC1MZW5ndGgKKyAgaGVhZGVyIGZpZWxkIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgdGhlIHJlcXVlc3QgYm9keSBpcyBhIGZpbGUgb2JqZWN0LAorICBpdCBpcyBub3cgc2VudCB3aXRoIEhUVFAgMS4xIGNodW5rZWQgZW5jb2RpbmcuIElmIGEgZmlsZSBvYmplY3QgaGFzIHRvCisgIGJlIHNlbnQgdG8gYSBIVFRQIDEuMCBzZXJ2ZXIsIHRoZSBDb250ZW50LUxlbmd0aCB2YWx1ZSBub3cgaGFzIHRvIGJlCisgIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyLiBTZWUgOmlzc3VlOmAxMjMxOWAuCisKK0NoYW5nZXMgaW4gdGhlIEMgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgYWxsb2NhdG9yIGZhbWlseSBub3cgdXNlcyB0aGUgOnJlZjpgcHltYWxsb2MgYWxsb2NhdG9yCisgIDxweW1hbGxvYz5gIHJhdGhlciB0aGFuIHN5c3RlbSA6YzpmdW5jOmBtYWxsb2NgLiBBcHBsaWNhdGlvbnMgY2FsbGluZworICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMIGNhbiBub3cgY3Jhc2guIFNldCB0aGUKKyAgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBgYGRlYnVnYGAgdG8gdmFsaWRhdGUgdGhlCisgIHVzYWdlIG9mIG1lbW9yeSBhbGxvY2F0b3JzIGluIHlvdXIgYXBwbGljYXRpb24uIFNlZSA6aXNzdWU6YDI2MjQ5YC4KKworKiA6YzpmdW5jOmBQeV9FeGl0YCAoYW5kIHRoZSBtYWluIGludGVycHJldGVyKSBub3cgb3ZlcnJpZGUgdGhlIGV4aXQgc3RhdHVzCisgIHdpdGggMTIwIGlmIGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEgZmFpbGVkLiAgU2VlIDppc3N1ZTpgNTMxOWAuCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0IGIvRG9jL3doYXRzbmV3L2luZGV4LnJzdAppbmRleCBlZGI1NTAyLi43YzkyNTI0IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CisrKyBiL0RvYy93aGF0c25ldy9pbmRleC5yc3QKQEAgLTExLDYgKzExLDcgQEAKIC4uIHRvY3RyZWU6OgogICAgOm1heGRlcHRoOiAyCiAKKyAgIDMuNi5yc3QKICAgIDMuNS5yc3QKICAgIDMuNC5yc3QKICAgIDMuMy5yc3QKZGlmZiAtLWdpdCBhL0dyYW1tYXIvR3JhbW1hciBiL0dyYW1tYXIvR3JhbW1hcgppbmRleCA0MzA3NTIzLi45ZTQ5NzllIDEwMDY0NAotLS0gYS9HcmFtbWFyL0dyYW1tYXIKKysrIGIvR3JhbW1hci9HcmFtbWFyCkBAIC0yNywxMyArMjcsMTggQEAKIGZ1bmNkZWY6ICdkZWYnIE5BTUUgcGFyYW1ldGVycyBbJy0+JyB0ZXN0XSAnOicgc3VpdGUKIAogcGFyYW1ldGVyczogJygnIFt0eXBlZGFyZ3NsaXN0XSAnKScKLXR5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJwotICAgICAgIFsnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0ZnBkZWZdIHwgJyoqJyB0ZnBkZWZdXQotICAgICB8ICAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0ZnBkZWZdIHwgJyoqJyB0ZnBkZWYpCit0eXBlZGFyZ3NsaXN0OiAodGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgIHwgJyoqJyB0ZnBkZWYgWycsJ11dXQorICB8ICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICB8ICcqKicgdGZwZGVmIFsnLCddKQogdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLXZhcmFyZ3NsaXN0OiAodmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcKLSAgICAgICBbJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdmZwZGVmXSB8ICcqKicgdmZwZGVmXV0KLSAgICAgfCAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdmZwZGVmXSB8ICcqKicgdmZwZGVmKQordmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgfCAnKionIHZmcGRlZiBbJywnXV1dCisgIHwgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgIHwgJyoqJyB2ZnBkZWYgWycsJ10KKykKIHZmcGRlZjogTkFNRQogCiBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKZGlmZiAtLWdpdCBhL0luY2x1ZGUvUHl0aG9uLWFzdC5oIGIvSW5jbHVkZS9QeXRob24tYXN0LmgKaW5kZXggMmQzZWFjYi4uMWFiMzc2YSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9QeXRob24tYXN0LmgKKysrIGIvSW5jbHVkZS9QeXRob24tYXN0LmgKQEAgLTIwMSw5ICsyMDEsMTAgQEAKICAgICAgICAgICAgICAgICAgIFNldENvbXBfa2luZD05LCBEaWN0Q29tcF9raW5kPTEwLCBHZW5lcmF0b3JFeHBfa2luZD0xMSwKICAgICAgICAgICAgICAgICAgIEF3YWl0X2tpbmQ9MTIsIFlpZWxkX2tpbmQ9MTMsIFlpZWxkRnJvbV9raW5kPTE0LAogICAgICAgICAgICAgICAgICAgQ29tcGFyZV9raW5kPTE1LCBDYWxsX2tpbmQ9MTYsIE51bV9raW5kPTE3LCBTdHJfa2luZD0xOCwKLSAgICAgICAgICAgICAgICAgIEJ5dGVzX2tpbmQ9MTksIE5hbWVDb25zdGFudF9raW5kPTIwLCBFbGxpcHNpc19raW5kPTIxLAotICAgICAgICAgICAgICAgICAgQXR0cmlidXRlX2tpbmQ9MjIsIFN1YnNjcmlwdF9raW5kPTIzLCBTdGFycmVkX2tpbmQ9MjQsCi0gICAgICAgICAgICAgICAgICBOYW1lX2tpbmQ9MjUsIExpc3Rfa2luZD0yNiwgVHVwbGVfa2luZD0yN307CisgICAgICAgICAgICAgICAgICBGb3JtYXR0ZWRWYWx1ZV9raW5kPTE5LCBKb2luZWRTdHJfa2luZD0yMCwgQnl0ZXNfa2luZD0yMSwKKyAgICAgICAgICAgICAgICAgIE5hbWVDb25zdGFudF9raW5kPTIyLCBFbGxpcHNpc19raW5kPTIzLCBDb25zdGFudF9raW5kPTI0LAorICAgICAgICAgICAgICAgICAgQXR0cmlidXRlX2tpbmQ9MjUsIFN1YnNjcmlwdF9raW5kPTI2LCBTdGFycmVkX2tpbmQ9MjcsCisgICAgICAgICAgICAgICAgICBOYW1lX2tpbmQ9MjgsIExpc3Rfa2luZD0yOSwgVHVwbGVfa2luZD0zMH07CiBzdHJ1Y3QgX2V4cHIgewogICAgIGVudW0gX2V4cHJfa2luZCBraW5kOwogICAgIHVuaW9uIHsKQEAgLTI5Nyw2ICsyOTgsMTYgQEAKICAgICAgICAgfSBTdHI7CiAgICAgICAgIAogICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgIGludCBjb252ZXJzaW9uOworICAgICAgICAgICAgZXhwcl90eSBmb3JtYXRfc3BlYzsKKyAgICAgICAgfSBGb3JtYXR0ZWRWYWx1ZTsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBhc2RsX3NlcSAqdmFsdWVzOworICAgICAgICB9IEpvaW5lZFN0cjsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBieXRlcyBzOwogICAgICAgICB9IEJ5dGVzOwogICAgICAgICAKQEAgLTMwNSw2ICszMTYsMTAgQEAKICAgICAgICAgfSBOYW1lQ29uc3RhbnQ7CiAgICAgICAgIAogICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgY29uc3RhbnQgdmFsdWU7CisgICAgICAgIH0gQ29uc3RhbnQ7CisgICAgICAgIAorICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKICAgICAgICAgICAgIGlkZW50aWZpZXIgYXR0cjsKICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSBjdHg7CkBAIC01NDMsNiArNTU4LDEyIEBACiBleHByX3R5IF9QeV9OdW0ob2JqZWN0IG4sIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CiAjZGVmaW5lIFN0cihhMCwgYTEsIGEyLCBhMykgX1B5X1N0cihhMCwgYTEsIGEyLCBhMykKIGV4cHJfdHkgX1B5X1N0cihzdHJpbmcgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRm9ybWF0dGVkVmFsdWUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0Zvcm1hdHRlZFZhbHVlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitleHByX3R5IF9QeV9Gb3JtYXR0ZWRWYWx1ZShleHByX3R5IHZhbHVlLCBpbnQgY29udmVyc2lvbiwgZXhwcl90eSBmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEpvaW5lZFN0cihhMCwgYTEsIGEyLCBhMykgX1B5X0pvaW5lZFN0cihhMCwgYTEsIGEyLCBhMykKK2V4cHJfdHkgX1B5X0pvaW5lZFN0cihhc2RsX3NlcSAqIHZhbHVlcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBCeXRlcyhhMCwgYTEsIGEyLCBhMykgX1B5X0J5dGVzKGEwLCBhMSwgYTIsIGEzKQogZXhwcl90eSBfUHlfQnl0ZXMoYnl0ZXMgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgTmFtZUNvbnN0YW50KGEwLCBhMSwgYTIsIGEzKSBfUHlfTmFtZUNvbnN0YW50KGEwLCBhMSwgYTIsIGEzKQpAQCAtNTUwLDYgKzU3MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZW5hKTsKICNkZWZpbmUgRWxsaXBzaXMoYTAsIGExLCBhMikgX1B5X0VsbGlwc2lzKGEwLCBhMSwgYTIpCiBleHByX3R5IF9QeV9FbGxpcHNpcyhpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBDb25zdGFudChhMCwgYTEsIGEyLCBhMykgX1B5X0NvbnN0YW50KGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfQ29uc3RhbnQoY29uc3RhbnQgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBBdHRyaWJ1dGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0F0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQogZXhwcl90eSBfUHlfQXR0cmlidXRlKGV4cHJfdHkgdmFsdWUsIGlkZW50aWZpZXIgYXR0ciwgZXhwcl9jb250ZXh0X3R5IGN0eCwgaW50CiAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24uaCBiL0luY2x1ZGUvUHl0aG9uLmgKaW5kZXggODU4ZGJkMS4uNGM3YzlhNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9QeXRob24uaAorKysgYi9JbmNsdWRlL1B5dGhvbi5oCkBAIC0xMTYsNiArMTE2LDcgQEAKICNpbmNsdWRlICJweWxpZmVjeWNsZS5oIgogI2luY2x1ZGUgImNldmFsLmgiCiAjaW5jbHVkZSAic3lzbW9kdWxlLmgiCisjaW5jbHVkZSAib3Ntb2R1bGUuaCIKICNpbmNsdWRlICJpbnRyY2hlY2suaCIKICNpbmNsdWRlICJpbXBvcnQuaCIKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9hYnN0cmFjdC5oIGIvSW5jbHVkZS9hYnN0cmFjdC5oCmluZGV4IDRmZjc5ZjIuLmU3MjhiMTIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYWJzdHJhY3QuaAorKysgYi9JbmNsdWRlL2Fic3RyYWN0LmgKQEAgLTI2NCwxOCArMjY0LDQ3IEBACiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpOwogCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCisgICAgUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeVN0YWNrX0FzVHVwbGUoUHlPYmplY3QgKipzdGFjaywKKyAgICAgICAgUHlfc3NpemVfdCBuYXJncyk7CisKKyAgICAgLyogQ2FsbCB0aGUgY2FsbGFibGUgb2JqZWN0IGZ1bmMgd2l0aCB0aGUgImZhc3QgY2FsbCIgY2FsbGluZyBjb252ZW50aW9uOgorICAgICAgICBhcmdzIGlzIGEgQyBhcnJheSBmb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIChuYXJncyBpcyB0aGUgbnVtYmVyIG9mCisgICAgICAgIHBvc2l0aW9uYWwgcGFyYW1hdGVyKSwga3dhcmdzIGlzIGEgZGljdGlvbmFyeSBmb3Iga2V5d29yZCBwYXJhbWV0ZXJzLgorCisgICAgICAgIElmIG5hcmdzIGlzIGVxdWFsIHRvIHplcm8sIGFyZ3MgY2FuIGJlIE5VTEwuIGt3YXJncyBjYW4gYmUgTlVMTC4KKyAgICAgICAgbmFyZ3MgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIHplcm8uCisKKyAgICAgICAgUmV0dXJuIHRoZSByZXN1bHQgb24gc3VjY2Vzcy4gUmFpc2UgYW4gZXhjZXB0aW9uIG9uIHJldHVybiBOVUxMIG9uCisgICAgICAgIGVycm9yLiAqLworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoUHlPYmplY3QgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKmFyZ3MsIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dhcmdzKTsKKworI2RlZmluZSBfUHlPYmplY3RfRmFzdENhbGwoZnVuYywgYXJncywgbmFyZ3MpIFwKKyAgICBfUHlPYmplY3RfRmFzdENhbGxEaWN0KChmdW5jKSwgKGFyZ3MpLCAobmFyZ3MpLCBOVUxMKQorCisjZGVmaW5lIF9QeU9iamVjdF9DYWxsTm9BcmcoZnVuYykgXAorICAgIF9QeU9iamVjdF9GYXN0Q2FsbCgoZnVuYyksIE5VTEwsIDApCisKKyNkZWZpbmUgX1B5T2JqZWN0X0NhbGxBcmcxKGZ1bmMsIGFyZykgXAorICAgIF9QeU9iamVjdF9GYXN0Q2FsbCgoZnVuYyksICYoYXJnKSwgMSkKKworICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxfUHJlcGVuZChQeU9iamVjdCAqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2FyZ3MpOworCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoUHlPYmplY3QgKmZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGVyZSk7Ci0jZW5kaWYKKyNlbmRpZiAgIC8qIFB5X0xJTUlURURfQVBJICovCiAKICAgICAgICAvKgogICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCiAgICAgIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCi0gICAgIE5VTEwsIGJ1dCB0aGUgJ2t3JyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KKyAgICAgTlVMTC4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbE9iamVjdChQeU9iamVjdCAqY2FsbGFibGVfb2JqZWN0LApAQCAtNDU4LDcgKzQ4Nyw3IEBACiAgICAgLyogb2xkIGJ1ZmZlciBBUEkKICAgICAgICBGSVhNRTogIHVzYWdlIG9mIHRoZXNlIHNob3VsZCBhbGwgYmUgcmVwbGFjZWQgaW4gUHl0aG9uIGl0c2VsZgogICAgICAgIGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2Ugd2lsbCBpbXBsZW1lbnQgdGhlbS4KLSAgICAgICBUaGVpciB1c2FnZSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyAidW5sb2NrIiBtZWNoYW5zaW0KKyAgICAgICBUaGVpciB1c2FnZSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyAidW5sb2NrIiBtZWNoYW5pc20KICAgICAgICBtYXkgY3JlYXRlIGlzc3VlcyAoYnV0IHRoZXkgd291bGQgYWxyZWFkeSBiZSB0aGVyZSkuICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihQeU9iamVjdCAqb2JqLApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9hc2RsLmggYi9JbmNsdWRlL2FzZGwuaAppbmRleCA0OTUxNTNjLi4zNWU5ZmExIDEwMDY0NAotLS0gYS9JbmNsdWRlL2FzZGwuaAorKysgYi9JbmNsdWRlL2FzZGwuaApAQCAtNiw2ICs2LDcgQEAKIHR5cGVkZWYgUHlPYmplY3QgKiBieXRlczsKIHR5cGVkZWYgUHlPYmplY3QgKiBvYmplY3Q7CiB0eXBlZGVmIFB5T2JqZWN0ICogc2luZ2xldG9uOwordHlwZWRlZiBQeU9iamVjdCAqIGNvbnN0YW50OwogCiAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBhc2RsX2MucHkgd2FzIGNvbXBsZXRlbHkKICAgIGluZGVwZW5kZW50IG9mIFB5dGhvbiwgYnV0IGl0IGlzIGEgZ29hbCB0aGUgcmVxdWlyZXMgdG9vIG11Y2ggd29yawpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9ieXRlc19tZXRob2RzLmggYi9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaAppbmRleCAxMWQ1ZjQyLi43ZmE3NTQwIDEwMDY0NAotLS0gYS9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaAorKysgYi9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaApAQCAtMTcsOSArMTcsMTggQEAKIC8qIFRoZXNlIHN0b3JlIHRoZWlyIGxlbiBzaXplZCBhbnN3ZXIgaW4gdGhlIGdpdmVuIHByZWFsbG9jYXRlZCAqcmVzdWx0IGFyZy4gKi8KIGV4dGVybiB2b2lkIF9QeV9ieXRlc19sb3dlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKIGV4dGVybiB2b2lkIF9QeV9ieXRlc191cHBlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CisKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX2ZpbmQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfcmZpbmQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfcmluZGV4KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX2NvdW50KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBpbnQgX1B5X2J5dGVzX2NvbnRhaW5zKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmcpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfc3RhcnRzd2l0aChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19lbmRzd2l0aChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CiAKIC8qIFRoZSBtYWtldHJhbnMoKSBzdGF0aWMgbWV0aG9kLiAqLwogZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfbWFrZXRyYW5zKFB5X2J1ZmZlciAqZnJtLCBQeV9idWZmZXIgKnRvKTsKQEAgLTM3LDcgKzQ2LDE5IEBACiBleHRlcm4gY29uc3QgY2hhciBfUHlfdGl0bGVfX2RvY19fW107CiBleHRlcm4gY29uc3QgY2hhciBfUHlfY2FwaXRhbGl6ZV9fZG9jX19bXTsKIGV4dGVybiBjb25zdCBjaGFyIF9QeV9zd2FwY2FzZV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9jb3VudF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9maW5kX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2luZGV4X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3JmaW5kX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3JpbmRleF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9zdGFydHN3aXRoX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2VuZHN3aXRoX19kb2NfX1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X21ha2V0cmFuc19fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9leHBhbmR0YWJzX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2xqdXN0X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3JqdXN0X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2NlbnRlcl9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV96ZmlsbF9fZG9jX19bXTsKIAogLyogdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzb21lIGRvY3MgYXJlIHNoYXJlZCBmcm9tIHRoZSAubywgbm90IHN0YXRpYyAqLwogI2RlZmluZSBQeURvY19TVFJWQVJfc2hhcmVkKG5hbWUsc3RyKSBjb25zdCBjaGFyIG5hbWVbXSA9IFB5RG9jX1NUUihzdHIpCmRpZmYgLS1naXQgYS9JbmNsdWRlL2J5dGVzb2JqZWN0LmggYi9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKaW5kZXggNmMxZTBjMy4uMTFkODIxOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ieXRlc29iamVjdC5oCisrKyBiL0luY2x1ZGUvYnl0ZXNvYmplY3QuaApAQCAtNjIsNyArNjIsMTQgQEAKIFB5QVBJX0ZVTkModm9pZCkgUHlCeXRlc19Db25jYXRBbmREZWwoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhpbnQpIF9QeUJ5dGVzX1Jlc2l6ZShQeU9iamVjdCAqKiwgUHlfc3NpemVfdCk7Ci1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUJ5dGVzX0Zvcm1hdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlCeXRlc19Gb3JtYXRFeCgKKyAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuLAorICAgIFB5T2JqZWN0ICphcmdzLAorICAgIGludCB1c2VfYnl0ZWFycmF5KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlCeXRlc19Gcm9tSGV4KAorICAgIFB5T2JqZWN0ICpzdHJpbmcsCisgICAgaW50IHVzZV9ieXRlYXJyYXkpOwogI2VuZGlmCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKQEAgLTEyMyw2ICsxMzAsODcgQEAKICNkZWZpbmUgRl9BTFQJKDE8PDMpCiAjZGVmaW5lIEZfWkVSTwkoMTw8NCkKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorLyogVGhlIF9QeUJ5dGVzV3JpdGVyIHN0cnVjdHVyZSBpcyBiaWc6IGl0IGNvbnRhaW5zIGFuIGVtYmVkZGVkICJzdGFjayBidWZmZXIiLgorICAgQSBfUHlCeXRlc1dyaXRlciB2YXJpYWJsZSBtdXN0IGJlIGRlY2xhcmVkIGF0IHRoZSBlbmQgb2YgdmFyaWFibGVzIGluIGEKKyAgIGZ1bmN0aW9uIHRvIG9wdGltaXplIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvbiB0aGUgc3RhY2suICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogYnl0ZXMsIGJ5dGVhcnJheSBvciBOVUxMICh3aGVuIHRoZSBzbWFsbCBidWZmZXIgaXMgdXNlZCkgKi8KKyAgICBQeU9iamVjdCAqYnVmZmVyOworCisgICAgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBzaXplLiAqLworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOworCisgICAgLyogTWluaW11bSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzLAorICAgICAgIGluY3JlbWVudGVkIGJ5IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoKSAqLworICAgIFB5X3NzaXplX3QgbWluX3NpemU7CisKKyAgICAvKiBJZiBub24temVybywgdXNlIGEgYnl0ZWFycmF5IGluc3RlYWQgb2YgYSBieXRlcyBvYmplY3QgZm9yIGJ1ZmZlci4gKi8KKyAgICBpbnQgdXNlX2J5dGVhcnJheTsKKworICAgIC8qIElmIG5vbi16ZXJvLCBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciAoZGVmYXVsdDogMCkuCisgICAgICAgVGhpcyBmbGFnIG11c3QgYmUgemVybyBpZiB1c2VfYnl0ZWFycmF5IGlzIG5vbi16ZXJvLiAqLworICAgIGludCBvdmVyYWxsb2NhdGU7CisKKyAgICAvKiBTdGFjayBidWZmZXIgKi8KKyAgICBpbnQgdXNlX3NtYWxsX2J1ZmZlcjsKKyAgICBjaGFyIHNtYWxsX2J1ZmZlcls1MTJdOworfSBfUHlCeXRlc1dyaXRlcjsKKworLyogSW5pdGlhbGl6ZSBhIGJ5dGVzIHdyaXRlcgorCisgICBCeSBkZWZhdWx0LCB0aGUgb3ZlcmFsbG9jYXRpb24gaXMgZGlzYWJsZWQuIFNldCB0aGUgb3ZlcmFsbG9jYXRlIGF0dHJpYnV0ZQorICAgdG8gY29udHJvbCB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgYnVmZmVyLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlCeXRlc1dyaXRlcl9Jbml0KF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpOworCisvKiBHZXQgdGhlIGJ1ZmZlciBjb250ZW50IGFuZCByZXNldCB0aGUgd3JpdGVyLgorICAgUmV0dXJuIGEgYnl0ZXMgb2JqZWN0LCBvciBhIGJ5dGVhcnJheSBvYmplY3QgaWYgdXNlX2J5dGVhcnJheSBpcyBub24temVyby4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaChfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0cik7CisKKy8qIERlYWxsb2NhdGUgbWVtb3J5IG9mIGEgd3JpdGVyIChjbGVhciBpdHMgaW50ZXJuYWwgYnVmZmVyKS4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyKTsKKworLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciB0byB3cml0ZSBzaXplIGJ5dGVzLgorICAgUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyIGRhdGEuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICBQeV9zc2l6ZV90IHNpemUpOworCisvKiBFbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byB3cml0ZSAqc2l6ZSogYnl0ZXMuCisgICBBZGQgc2l6ZSB0byB0aGUgd3JpdGVyIG1pbmltdW0gc2l6ZSAobWluX3NpemUgYXR0cmlidXRlKS4KKworICAgc3RyIGlzIHRoZSBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSZXR1cm4gdGhlIHVwZGF0ZWQgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogUmVzaXplIHRoZSBidWZmZXIgdG8gbWFrZSBpdCBsYXJnZXIuCisgICBUaGUgbmV3IGJ1ZmZlciBtYXkgYmUgbGFyZ2VyIHRoYW4gc2l6ZSBieXRlcyBiZWNhdXNlIG9mIG92ZXJhbGxvY2F0aW9uLgorICAgUmV0dXJuIHRoZSB1cGRhdGVkIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuCisKKyAgIE5vdGU6IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgYnl0ZXMgaW4gdGhlIHdyaXRlci4KKworICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHVzZSB0aGUgd3JpdGVyIG1pbmltdW0gc2l6ZSAobWluX3NpemUgYXR0cmlidXRlKS4KKworICAgU2VlIGFsc28gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgpLgorICAgKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX1Jlc2l6ZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBQeV9zc2l6ZV90IHNpemUpOworCisvKiBXcml0ZSBieXRlcy4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIGNvbnN0IHZvaWQgKmJ5dGVzLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisjZW5kaWYgICAvKiBQeV9MSU1JVEVEX0FQSSAqLworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jZXZhbC5oIGIvSW5jbHVkZS9jZXZhbC5oCmluZGV4IGI1MzczYTkuLjc2MDdmNzUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvY2V2YWwuaAorKysgYi9JbmNsdWRlL2NldmFsLmgKQEAgLTgsNyArOCw3IEBACiAvKiBJbnRlcmZhY2UgdG8gcmFuZG9tIHBhcnRzIGluIGNldmFsLmMgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcygKLSAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpOwogCiAvKiBJbmxpbmUgdGhpcyAqLwogI2RlZmluZSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLGFyZykgXApAQCAtMTE5LDYgKzExOSw5IEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsRnJhbWUoc3RydWN0IF9mcmFtZSAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0V2YWxGcmFtZUV4KHN0cnVjdCBfZnJhbWUgKmYsIGludCBleGMpOworI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlFdmFsX0V2YWxGcmFtZURlZmF1bHQoc3RydWN0IF9mcmFtZSAqZiwgaW50IGV4Yyk7CisjZW5kaWYKIAogLyogSW50ZXJmYWNlIGZvciB0aHJlYWRzLgogCkBAIC0yMDYsNiArMjA5LDE0IEBACiBQeUFQSV9GVU5DKHZvaWQpIF9QeUV2YWxfU2lnbmFsQXN5bmNFeGModm9pZCk7CiAjZW5kaWYKIAorLyogTWFza3MgYW5kIHZhbHVlcyB1c2VkIGJ5IEZPUk1BVF9WQUxVRSBvcGNvZGUuICovCisjZGVmaW5lIEZWQ19NQVNLICAgICAgMHgzCisjZGVmaW5lIEZWQ19OT05FICAgICAgMHgwCisjZGVmaW5lIEZWQ19TVFIgICAgICAgMHgxCisjZGVmaW5lIEZWQ19SRVBSICAgICAgMHgyCisjZGVmaW5lIEZWQ19BU0NJSSAgICAgMHgzCisjZGVmaW5lIEZWU19NQVNLICAgICAgMHg0CisjZGVmaW5lIEZWU19IQVZFX1NQRUMgMHg0CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jb2RlLmggYi9JbmNsdWRlL2NvZGUuaAppbmRleCA4ZWNmMzhhLi5hMzAwZWFkIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NvZGUuaAorKysgYi9JbmNsdWRlL2NvZGUuaApAQCAtMTI2LDcgKzEyNiw3IEBACiAjZW5kaWYKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqbGluZW5vX29iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcywgUHlPYmplY3QgKmxub3RhYik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kYXRldGltZS5oIGIvSW5jbHVkZS9kYXRldGltZS5oCmluZGV4IDA2Y2JjNGEuLjNiZjM1Y2IgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZGF0ZXRpbWUuaAorKysgYi9JbmNsdWRlL2RhdGV0aW1lLmgKQEAgLTgxLDYgKzgxLDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgX1B5RGF0ZVRpbWVfVElNRUhFQUQKKyAgICB1bnNpZ25lZCBjaGFyIGZvbGQ7CiAgICAgUHlPYmplY3QgKnR6aW5mbzsKIH0gUHlEYXRlVGltZV9UaW1lOyAgICAgICAgICAgICAgLyogaGFzdHppbmZvIHRydWUgKi8KIApAQCAtMTA4LDYgKzEwOSw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRAorICAgIHVuc2lnbmVkIGNoYXIgZm9sZDsKICAgICBQeU9iamVjdCAqdHppbmZvOwogfSBQeURhdGVUaW1lX0RhdGVUaW1lOyAgICAgICAgICAvKiBoYXN0emluZm8gdHJ1ZSAqLwogCkBAIC0xMjUsNiArMTI3LDcgQEAKICAgICAoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwgICAgICAgXAogICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs4XSA8PCA4KSAgfCAgICAgICBcCiAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzldKQorI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX0ZPTEQobykgICAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5mb2xkKQogCiAvKiBBcHBseSBmb3IgdGltZSBpbnN0YW5jZXMuICovCiAjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVswXSkKQEAgLTEzNCw2ICsxMzcsNyBAQAogICAgICgoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzNdIDw8IDE2KSB8ICAgICAgICAgICBcCiAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbNF0gPDwgOCkgIHwgICAgICAgICAgIFwKICAgICAgICgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs1XSkKKyNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9GT0xEKG8pICAgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5mb2xkKQogCiAvKiBBcHBseSBmb3IgdGltZSBkZWx0YSBpbnN0YW5jZXMgKi8KICNkZWZpbmUgUHlEYXRlVGltZV9ERUxUQV9HRVRfREFZUyhvKSAgICAgICAgICgoKFB5RGF0ZVRpbWVfRGVsdGEqKW8pLT5kYXlzKQpAQCAtMTYyLDYgKzE2NiwxMSBAQAogICAgIFB5T2JqZWN0ICooKkRhdGVUaW1lX0Zyb21UaW1lc3RhbXApKFB5T2JqZWN0KiwgUHlPYmplY3QqLCBQeU9iamVjdCopOwogICAgIFB5T2JqZWN0ICooKkRhdGVfRnJvbVRpbWVzdGFtcCkoUHlPYmplY3QqLCBQeU9iamVjdCopOwogCisgICAgLyogUEVQIDQ5NSBjb25zdHJ1Y3RvcnMgKi8KKyAgICBQeU9iamVjdCAqKCpEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWVBbmRGb2xkKShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgIFB5T2JqZWN0KiwgaW50LCBQeVR5cGVPYmplY3QqKTsKKyAgICBQeU9iamVjdCAqKCpUaW1lX0Zyb21UaW1lQW5kRm9sZCkoaW50LCBpbnQsIGludCwgaW50LCBQeU9iamVjdCosIGludCwgUHlUeXBlT2JqZWN0Kik7CisKIH0gUHlEYXRlVGltZV9DQVBJOwogCiAjZGVmaW5lIFB5RGF0ZVRpbWVfQ0FQU1VMRV9OQU1FICJkYXRldGltZS5kYXRldGltZV9DQVBJIgpAQCAtMjE3LDEwICsyMjYsMTggQEAKICAgICBQeURhdGVUaW1lQVBJLT5EYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgXAogICAgICAgICBtaW4sIHNlYywgdXNlYywgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKQogCisjZGVmaW5lIFB5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lQW5kRm9sZCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYywgdXNlYywgZm9sZCkgXAorICAgIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZUFuZEZvbGQoeWVhciwgbW9udGgsIGRheSwgaG91ciwgXAorICAgICAgICBtaW4sIHNlYywgdXNlYywgUHlfTm9uZSwgZm9sZCwgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKQorCiAjZGVmaW5lIFB5VGltZV9Gcm9tVGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgXAogICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIFwKICAgICAgICAgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCiAKKyNkZWZpbmUgUHlUaW1lX0Zyb21UaW1lQW5kRm9sZChob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgZm9sZCkgXAorICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWVBbmRGb2xkKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCisgICAgICAgIFB5X05vbmUsIGZvbGQsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorCiAjZGVmaW5lIFB5RGVsdGFfRnJvbURTVShkYXlzLCBzZWNvbmRzLCB1c2Vjb25kcykgXAogICAgIFB5RGF0ZVRpbWVBUEktPkRlbHRhX0Zyb21EZWx0YShkYXlzLCBzZWNvbmRzLCB1c2Vjb25kcywgMSwgXAogICAgICAgICBQeURhdGVUaW1lQVBJLT5EZWx0YVR5cGUpCmRpZmYgLS1naXQgYS9JbmNsdWRlL2Zsb2F0b2JqZWN0LmggYi9JbmNsdWRlL2Zsb2F0b2JqZWN0LmgKaW5kZXggZTI0MGZkYi4uZjEwNDRkNiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9mbG9hdG9iamVjdC5oCisrKyBiL0luY2x1ZGUvZmxvYXRvYmplY3QuaApAQCAtNzQsOSArNzQsOSBAQAogICogaGFwcGVucyBpbiBzdWNoIGNhc2VzIGlzIHBhcnRseSBhY2NpZGVudGFsIChhbGFzKS4KICAqLwogCi0vKiBUaGUgcGFjayByb3V0aW5lcyB3cml0ZSA0IG9yIDggYnl0ZXMsIHN0YXJ0aW5nIGF0IHAuICBsZSBpcyBhIGJvb2wKKy8qIFRoZSBwYWNrIHJvdXRpbmVzIHdyaXRlIDIsIDQgb3IgOCBieXRlcywgc3RhcnRpbmcgYXQgcC4gIGxlIGlzIGEgYm9vbAogICogYXJndW1lbnQsIHRydWUgaWYgeW91IHdhbnQgdGhlIHN0cmluZyBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKLSAqIGxhc3QsIGF0IHArMyBvciBwKzcpLCBmYWxzZSBpZiB5b3Ugd2FudCBiaWctZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKKyAqIGxhc3QsIGF0IHArMSwgcCszIG9yIHArNyksIGZhbHNlIGlmIHlvdSB3YW50IGJpZy1lbmRpYW4gZm9ybWF0IChleHBvbmVudAogICogZmlyc3QsIGF0IHApLgogICogUmV0dXJuIHZhbHVlOiAgMCBpZiBhbGwgaXMgT0ssIC0xIGlmIGVycm9yIChhbmQgYW4gZXhjZXB0aW9uIGlzCiAgKiBzZXQsIG1vc3QgbGlrZWx5IE92ZXJmbG93RXJyb3IpLgpAQCAtODQsNiArODQsNyBAQAogICogMSk6ICBXaGF0IHRoaXMgZG9lcyBpcyB1bmRlZmluZWQgaWYgeCBpcyBhIE5hTiBvciBpbmZpbml0eS4KICAqIDIpOiAgLTAuMCBhbmQgKzAuMCBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZy4KICAqLworUHlBUElfRlVOQyhpbnQpIF9QeUZsb2F0X1BhY2syKGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOwogUHlBUElfRlVOQyhpbnQpIF9QeUZsb2F0X1BhY2s0KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOwogUHlBUElfRlVOQyhpbnQpIF9QeUZsb2F0X1BhY2s4KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOwogCkBAIC05NiwxNCArOTcsMTUgQEAKIFB5QVBJX0ZVTkMoaW50KSBfUHlGbG9hdF9EaWdpdHMoY2hhciAqYnVmLCBkb3VibGUgdiwgaW50ICpzaWdudW0pOwogUHlBUElfRlVOQyh2b2lkKSBfUHlGbG9hdF9EaWdpdHNJbml0KHZvaWQpOwogCi0vKiBUaGUgdW5wYWNrIHJvdXRpbmVzIHJlYWQgNCBvciA4IGJ5dGVzLCBzdGFydGluZyBhdCBwLiAgbGUgaXMgYSBib29sCisvKiBUaGUgdW5wYWNrIHJvdXRpbmVzIHJlYWQgMiwgNCBvciA4IGJ5dGVzLCBzdGFydGluZyBhdCBwLiAgbGUgaXMgYSBib29sCiAgKiBhcmd1bWVudCwgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IChleHBvbmVudAotICogbGFzdCwgYXQgcCszIG9yIHArNyksIGZhbHNlIGlmIGJpZy1lbmRpYW4gKGV4cG9uZW50IGZpcnN0LCBhdCBwKS4KKyAqIGxhc3QsIGF0IHArMSwgcCszIG9yIHArNyksIGZhbHNlIGlmIGJpZy1lbmRpYW4gKGV4cG9uZW50IGZpcnN0LCBhdCBwKS4KICAqIFJldHVybiB2YWx1ZTogIFRoZSB1bnBhY2tlZCBkb3VibGUuICBPbiBlcnJvciwgdGhpcyBpcyAtMS4wIGFuZAogICogUHlFcnJfT2NjdXJyZWQoKSBpcyB0cnVlIChhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCwgbW9zdCBsaWtlbHkKICAqIE92ZXJmbG93RXJyb3IpLiAgTm90ZSB0aGF0IG9uIGEgbm9uLUlFRUUgcGxhdGZvcm0gdGhpcyB3aWxsIHJlZnVzZQogICogdG8gdW5wYWNrIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIE5hTiBvciBpbmZpbml0eS4KICAqLworUHlBUElfRlVOQyhkb3VibGUpIF9QeUZsb2F0X1VucGFjazIoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKIFB5QVBJX0ZVTkMoZG91YmxlKSBfUHlGbG9hdF9VbnBhY2s0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CiBQeUFQSV9GVU5DKGRvdWJsZSkgX1B5RmxvYXRfVW5wYWNrOChjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2Z1bmNvYmplY3QuaCBiL0luY2x1ZGUvZnVuY29iamVjdC5oCmluZGV4IGNjMTQyNmMuLjZiODljODYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZnVuY29iamVjdC5oCisrKyBiL0luY2x1ZGUvZnVuY29iamVjdC5oCkBAIC01OCw2ICs1OCwxNCBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX0dldEFubm90YXRpb25zKFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhpbnQpIFB5RnVuY3Rpb25fU2V0QW5ub3RhdGlvbnMoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RnVuY3Rpb25fRmFzdENhbGxEaWN0KAorICAgIFB5T2JqZWN0ICpmdW5jLAorICAgIFB5T2JqZWN0ICoqYXJncywKKyAgICBQeV9zc2l6ZV90IG5hcmdzLAorICAgIFB5T2JqZWN0ICprd2FyZ3MpOworI2VuZGlmCisKIC8qIE1hY3JvcyBmb3IgZGlyZWN0IGFjY2VzcyB0byB0aGVzZSB2YWx1ZXMuIFR5cGUgY2hlY2tzIGFyZSAqbm90KgogICAgZG9uZSwgc28gdXNlIHdpdGggY2FyZS4gKi8KICNkZWZpbmUgUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKSBcCmRpZmYgLS1naXQgYS9JbmNsdWRlL2xvbmdpbnRyZXByLmggYi9JbmNsdWRlL2xvbmdpbnRyZXByLmgKaW5kZXggYmJiYTRkOC4uYTNiNzRiNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9sb25naW50cmVwci5oCisrKyBiL0luY2x1ZGUvbG9uZ2ludHJlcHIuaApAQCAtNDIsMTQgKzQyLDEwIEBACiAqLwogCiAjaWYgUFlMT05HX0JJVFNfSU5fRElHSVQgPT0gMzAKLSNpZiAhKGRlZmluZWQgSEFWRV9VSU5UNjRfVCAmJiBkZWZpbmVkIEhBVkVfVUlOVDMyX1QgJiYgICAgICAgICAgXAotICAgICAgZGVmaW5lZCBIQVZFX0lOVDY0X1QgJiYgZGVmaW5lZCBIQVZFX0lOVDMyX1QpCi0jZXJyb3IgIjMwLWJpdCBsb25nIGRpZ2l0cyByZXF1ZXN0ZWQsIGJ1dCB0aGUgbmVjZXNzYXJ5IHR5cGVzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCi0jZW5kaWYKLXR5cGVkZWYgUFlfVUlOVDMyX1QgZGlnaXQ7Ci10eXBlZGVmIFBZX0lOVDMyX1Qgc2RpZ2l0OyAvKiBzaWduZWQgdmFyaWFudCBvZiBkaWdpdCAqLwotdHlwZWRlZiBQWV9VSU5UNjRfVCB0d29kaWdpdHM7Ci10eXBlZGVmIFBZX0lOVDY0X1Qgc3R3b2RpZ2l0czsgLyogc2lnbmVkIHZhcmlhbnQgb2YgdHdvZGlnaXRzICovCit0eXBlZGVmIHVpbnQzMl90IGRpZ2l0OwordHlwZWRlZiBpbnQzMl90IHNkaWdpdDsgLyogc2lnbmVkIHZhcmlhbnQgb2YgZGlnaXQgKi8KK3R5cGVkZWYgdWludDY0X3QgdHdvZGlnaXRzOwordHlwZWRlZiBpbnQ2NF90IHN0d29kaWdpdHM7IC8qIHNpZ25lZCB2YXJpYW50IG9mIHR3b2RpZ2l0cyAqLwogI2RlZmluZSBQeUxvbmdfU0hJRlQJMzAKICNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX1NISUZUCTkgLyogbWF4KGUgc3VjaCB0aGF0IDEwKiplIGZpdHMgaW4gYSBkaWdpdCkgKi8KICNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX0JBU0UJKChkaWdpdCkxMDAwMDAwMDAwKSAvKiAxMCAqKiBERUNJTUFMX1NISUZUICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL2xvbmdvYmplY3QuaCBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCmluZGV4IDJhMmVlY2YuLjI5NTdmMTYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvbG9uZ29iamVjdC5oCisrKyBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCkBAIC02NSw3ICs2NSw4IEBACiAjICBlcnJvciAidm9pZCogZGlmZmVyZW50IGluIHNpemUgZnJvbSBpbnQsIGxvbmcgYW5kIGxvbmcgbG9uZyIKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QICovCiAKLS8qIFVzZWQgYnkgUHl0aG9uL215c3RydG91bC5jLiAqLworLyogVXNlZCBieSBQeXRob24vbXlzdHJ0b3VsLmMsIF9QeUJ5dGVzX0Zyb21IZXgoKSwKKyAgIF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgpLCBldGMuICovCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9EQVRBKHVuc2lnbmVkIGNoYXIpIF9QeUxvbmdfRGlnaXRWYWx1ZVsyNTZdOwogI2VuZGlmCkBAIC04NCwxNCArODUsMTIgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Wb2lkUHRyKHZvaWQgKik7CiBQeUFQSV9GVU5DKHZvaWQgKikgUHlMb25nX0FzVm9pZFB0cihQeU9iamVjdCAqKTsKIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HKTsKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyk7Ci1QeUFQSV9GVU5DKFBZX0xPTkdfTE9ORykgUHlMb25nX0FzTG9uZ0xvbmcoUHlPYmplY3QgKik7Ci1QeUFQSV9GVU5DKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqKTsKLVB5QVBJX0ZVTkModW5zaWduZWQgUFlfTE9OR19MT05HKSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqKTsKLVB5QVBJX0ZVTkMoUFlfTE9OR19MT05HKSBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93KFB5T2JqZWN0ICosIGludCAqKTsKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmdMb25nKGxvbmcgbG9uZyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh1bnNpZ25lZCBsb25nIGxvbmcpOworUHlBUElfRlVOQyhsb25nIGxvbmcpIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nIGxvbmcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcgbG9uZykgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGxvbmcgbG9uZykgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqLCBpbnQgKik7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQpAQCAtMTgyLDYgKzE4MSwxMyBAQAogICAgIGludCBiYXNlLAogICAgIGludCBhbHRlcm5hdGUpOwogCitQeUFQSV9GVU5DKGNoYXIqKSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKAorICAgIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgY2hhciAqc3RyLAorICAgIFB5T2JqZWN0ICpvYmosCisgICAgaW50IGJhc2UsCisgICAgaW50IGFsdGVybmF0ZSk7CisKIC8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQogICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkV3JpdGVyKApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9tZXRob2RvYmplY3QuaCBiL0luY2x1ZGUvbWV0aG9kb2JqZWN0LmgKaW5kZXggZTJhZDgwNC4uODRhMTQ5NyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9tZXRob2RvYmplY3QuaAorKysgYi9JbmNsdWRlL21ldGhvZG9iamVjdC5oCkBAIC0zNyw2ICszNywxMyBAQAogI2VuZGlmCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q0Z1bmN0aW9uX0NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Q0Z1bmN0aW9uX0Zhc3RDYWxsRGljdChQeU9iamVjdCAqZnVuYywKKyAgICBQeU9iamVjdCAqKmFyZ3MsCisgICAgUHlfc3NpemVfdCBuYXJncywKKyAgICBQeU9iamVjdCAqa3dhcmdzKTsKKyNlbmRpZgorCiBzdHJ1Y3QgUHlNZXRob2REZWYgewogICAgIGNvbnN0IGNoYXIgICptbF9uYW1lOyAgIC8qIFRoZSBuYW1lIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbi9tZXRob2QgKi8KICAgICBQeUNGdW5jdGlvbiBtbF9tZXRoOyAgICAvKiBUaGUgQyBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgaXQgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvbW9kc3VwcG9ydC5oIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKaW5kZXggODI5YWFmOC4uNmIwYWNiOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9tb2RzdXBwb3J0LmgKKysrIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKQEAgLTQ0LDYgKzQ0LDI5IEBACiAjZW5kaWYKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK3R5cGVkZWYgc3RydWN0IF9QeUFyZ19QYXJzZXIgeworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXdvcmRzOworICAgIGNvbnN0IGNoYXIgKmZuYW1lOworICAgIGNvbnN0IGNoYXIgKmN1c3RvbV9tc2c7CisgICAgaW50IHBvczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IGFyZ3VtZW50cyAqLworICAgIGludCBtaW47ICAgICAgICAgICAgLyogbWluaW1hbCBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgaW50IG1heDsgICAgICAgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqLworICAgIFB5T2JqZWN0ICprd3R1cGxlOyAgLyogdHVwbGUgb2Yga2V5d29yZCBwYXJhbWV0ZXIgbmFtZXMgKi8KKyAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqbmV4dDsKK30gX1B5QXJnX1BhcnNlcjsKKyNpZmRlZiBQWV9TU0laRV9UX0NMRUFOCisjZGVmaW5lIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0ICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVAorI2RlZmluZSBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0ICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0X1NpemVUCisjZW5kaWYKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7Cit2b2lkIF9QeUFyZ19GaW5pKHZvaWQpOworI2VuZGlmCisKIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGxvbmcpOwogUHlBUElfRlVOQyhpbnQpIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IDUwZDk3NDcuLjg1YmZjZTMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtNDIxLDYgKzQyMSw4IEBACiAKICAgICBkZXN0cnVjdG9yIHRwX2ZpbmFsaXplOwogCisgICAgUHlPYmplY3QgKnRwX2RlZm9yZGVyOworCiAjaWZkZWYgQ09VTlRfQUxMT0NTCiAgICAgLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCiAgICAgUHlfc3NpemVfdCB0cF9hbGxvY3M7CkBAIC03ODUsNyArNzg3LDcgQEAKICAgICAgICAgLS0oX3B5X2RlY3JlZl90bXApLT5vYl9yZWZjbnQgIT0gMCkgICAgICAgICAgICAgXAogICAgICAgICAgICAgX1B5X0NIRUNLX1JFRkNOVChfcHlfZGVjcmVmX3RtcCkgICAgICAgICAgICBcCiAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAogLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vZGljdG9iamVjdC5oIGIvSW5jbHVkZS9vZGljdG9iamVjdC5oCmluZGV4IGMxZDk1OTIuLmNhODY1YzcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2RpY3RvYmplY3QuaAorKysgYi9JbmNsdWRlL29kaWN0b2JqZWN0LmgKQEAgLTI4LDYgKzI4LDEwIEBACiBQeUFQSV9GVU5DKGludCkgUHlPRGljdF9TZXRJdGVtKFB5T2JqZWN0ICpvZCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKml0ZW0pOwogUHlBUElfRlVOQyhpbnQpIFB5T0RpY3RfRGVsSXRlbShQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXkpOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9EaWN0X0tleXNBc1R1cGxlKFB5T2JqZWN0ICpvZCk7CisjZW5kaWYKKwogLyogd3JhcHBlcnMgYXJvdW5kIFB5RGljdCogZnVuY3Rpb25zICovCiAjZGVmaW5lIFB5T0RpY3RfR2V0SXRlbShvZCwga2V5KSBQeURpY3RfR2V0SXRlbSgoUHlPYmplY3QgKilvZCwga2V5KQogI2RlZmluZSBQeU9EaWN0X0dldEl0ZW1XaXRoRXJyb3Iob2QsIGtleSkgXApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vcGNvZGUuaCBiL0luY2x1ZGUvb3Bjb2RlLmgKaW5kZXggM2Y5MTdmYi4uODM2YzYwNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vcGNvZGUuaAorKysgYi9JbmNsdWRlL29wY29kZS5oCkBAIC0xMDIsNyArMTAyLDYgQEAKICNkZWZpbmUgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgMTMxCiAjZGVmaW5lIE1BS0VfRlVOQ1RJT04gICAgICAgICAgIDEzMgogI2RlZmluZSBCVUlMRF9TTElDRSAgICAgICAgICAgICAxMzMKLSNkZWZpbmUgTUFLRV9DTE9TVVJFICAgICAgICAgICAgMTM0CiAjZGVmaW5lIExPQURfQ0xPU1VSRSAgICAgICAgICAgIDEzNQogI2RlZmluZSBMT0FEX0RFUkVGICAgICAgICAgICAgICAxMzYKICNkZWZpbmUgU1RPUkVfREVSRUYgICAgICAgICAgICAgMTM3CkBAIC0xMjIsNiArMTIxLDkgQEAKICNkZWZpbmUgQlVJTERfVFVQTEVfVU5QQUNLICAgICAgMTUyCiAjZGVmaW5lIEJVSUxEX1NFVF9VTlBBQ0sgICAgICAgIDE1MwogI2RlZmluZSBTRVRVUF9BU1lOQ19XSVRIICAgICAgICAxNTQKKyNkZWZpbmUgRk9STUFUX1ZBTFVFICAgICAgICAgICAgMTU1CisjZGVmaW5lIEJVSUxEX0NPTlNUX0tFWV9NQVAgICAgIDE1NgorI2RlZmluZSBCVUlMRF9TVFJJTkcgICAgICAgICAgICAxNTcKIAogLyogRVhDRVBUX0hBTkRMRVIgaXMgYSBzcGVjaWFsLCBpbXBsaWNpdCBibG9jayB0eXBlIHdoaWNoIGlzIGNyZWF0ZWQgd2hlbgogICAgZW50ZXJpbmcgYW4gZXhjZXB0IGhhbmRsZXIuIEl0IGlzIG5vdCBhbiBvcGNvZGUgYnV0IHdlIGRlZmluZSBpdCBoZXJlCmRpZmYgLS1naXQgYS9JbmNsdWRlL29zbW9kdWxlLmggYi9JbmNsdWRlL29zbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0Njc1NwotLS0gL2Rldi9udWxsCisrKyBiL0luY2x1ZGUvb3Ntb2R1bGUuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIG9zIG1vZHVsZSBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9PU01PRFVMRV9ICisjZGVmaW5lIFB5X09TTU9EVUxFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9TX0ZTUGF0aChQeU9iamVjdCAqcGF0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X09TTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcGF0Y2hsZXZlbC5oIGIvSW5jbHVkZS9wYXRjaGxldmVsLmgKaW5kZXggNDVlNTczNi4uZDIyNjNkOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9wYXRjaGxldmVsLmgKKysrIGIvSW5jbHVkZS9wYXRjaGxldmVsLmgKQEAgLTE3LDEzICsxNywxMyBAQAogLyogVmVyc2lvbiBwYXJzZWQgb3V0IGludG8gbnVtZXJpYyB2YWx1ZXMgKi8KIC8qLS1zdGFydCBjb25zdGFudHMtLSovCiAjZGVmaW5lIFBZX01BSk9SX1ZFUlNJT04JMwotI2RlZmluZSBQWV9NSU5PUl9WRVJTSU9OCTUKLSNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgkyCi0jZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAotI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAkwCisjZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNgorI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTAKKyNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0FMUEhBCisjZGVmaW5lIFBZX1JFTEVBU0VfU0VSSUFMCTQKIAogLyogVmVyc2lvbiBhcyBhIHN0cmluZyAqLwotI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIzLjUuMisiCisjZGVmaW5lIFBZX1ZFUlNJT04gICAgICAJIjMuNi4wYTQrIgogLyotLWVuZCBjb25zdGFudHMtLSovCiAKIC8qIFZlcnNpb24gYXMgYSBzaW5nbGUgNC1ieXRlIGhleCBudW1iZXIsIGUuZy4gMHgwMTA1MDJCMiA9PSAxLjUuMmIyLgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weV9jdXJzZXMuaCBiL0luY2x1ZGUvcHlfY3Vyc2VzLmgKaW5kZXggZjJjMDhmNi4uM2MyMTY5NyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weV9jdXJzZXMuaAorKysgYi9JbmNsdWRlL3B5X2N1cnNlcy5oCkBAIC0xMDMsOCArMTAzLDggQEAKICNlbmRpZgogCiAvKiBnZW5lcmFsIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqY2F0Y2hhbGxfRVJSICA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgRVJSIjsKLXN0YXRpYyBjaGFyICpjYXRjaGFsbF9OVUxMID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBOVUxMIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNhdGNoYWxsX0VSUltdICA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgRVJSIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNhdGNoYWxsX05VTExbXSA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgTlVMTCI7CiAKIC8qIEZ1bmN0aW9uIFByb3RvdHlwZSBNYWNyb3MgLSBUaGV5IGFyZSB1Z2x5IGJ1dCB2ZXJ5LCB2ZXJ5IHVzZWZ1bC4gOy0pCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlhdG9taWMuaCBiL0luY2x1ZGUvcHlhdG9taWMuaAppbmRleCA4OTAyOGVmLi44OTNkMzBkIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5YXRvbWljLmgKKysrIGIvSW5jbHVkZS9weWF0b21pYy5oCkBAIC02MSw3ICs2MSw3IEBACiB9IF9QeV9tZW1vcnlfb3JkZXI7CiAKIHR5cGVkZWYgc3RydWN0IF9QeV9hdG9taWNfYWRkcmVzcyB7Ci0gICAgUHlfdWludHB0cl90IF92YWx1ZTsKKyAgICB1aW50cHRyX3QgX3ZhbHVlOwogfSBfUHlfYXRvbWljX2FkZHJlc3M7CiAKIHR5cGVkZWYgc3RydWN0IF9QeV9hdG9taWNfaW50IHsKQEAgLTk4LDcgKzk4LDcgQEAKIH0gX1B5X21lbW9yeV9vcmRlcjsKIAogdHlwZWRlZiBzdHJ1Y3QgX1B5X2F0b21pY19hZGRyZXNzIHsKLSAgICBQeV91aW50cHRyX3QgX3ZhbHVlOworICAgIHVpbnRwdHJfdCBfdmFsdWU7CiB9IF9QeV9hdG9taWNfYWRkcmVzczsKIAogdHlwZWRlZiBzdHJ1Y3QgX1B5X2F0b21pY19pbnQgewpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWhhc2guaCBiL0luY2x1ZGUvcHloYXNoLmgKaW5kZXggYTdjYTkzNy4uYTgxNGFmNiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWhhc2guaAorKysgYi9JbmNsdWRlL3B5aGFzaC5oCkBAIC0zNiwxNCArMzYsMTQgQEAKICAqIG1lbW9yeSBsYXlvdXQgb24gNjQgYml0IHN5c3RlbXMKICAqICAgY2NjY2NjY2MgY2NjY2NjY2MgY2NjY2NjY2MgIHVjIC0tIHVuc2lnbmVkIGNoYXJbMjRdCiAgKiAgIHBwcHBwcHBwIHNzc3Nzc3NzIC4uLi4uLi4uICBmbnYgLS0gdHdvIFB5X2hhc2hfdAotICogICBrMGswazBrMCBrMWsxazFrMSAuLi4uLi4uLiAgc2lwaGFzaCAtLSB0d28gUFlfVUlOVDY0X1QKKyAqICAgazBrMGswazAgazFrMWsxazEgLi4uLi4uLi4gIHNpcGhhc2ggLS0gdHdvIHVpbnQ2NF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIHNzc3Nzc3NzICBkamJ4MzNhIC0tIDE2IGJ5dGVzIHBhZGRpbmcgKyBvbmUgUHlfaGFzaF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIGVlZWVlZWVlICBweWV4cGF0IFhNTCBoYXNoIHNhbHQKICAqCiAgKiBtZW1vcnkgbGF5b3V0IG9uIDMyIGJpdCBzeXN0ZW1zCiAgKiAgIGNjY2NjY2NjIGNjY2NjY2NjIGNjY2NjY2NjICB1YwogICogICBwcHBwc3NzcyAuLi4uLi4uLiAuLi4uLi4uLiAgZm52IC0tIHR3byBQeV9oYXNoX3QKLSAqICAgazBrMGswazAgazFrMWsxazEgLi4uLi4uLi4gIHNpcGhhc2ggLS0gdHdvIFBZX1VJTlQ2NF9UICgqKQorICogICBrMGswazBrMCBrMWsxazFrMSAuLi4uLi4uLiAgc2lwaGFzaCAtLSB0d28gdWludDY0X3QgKCopCiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIHNzc3MuLi4uICBkamJ4MzNhIC0tIDE2IGJ5dGVzIHBhZGRpbmcgKyBvbmUgUHlfaGFzaF90CiAgKiAgIC4uLi4uLi4uIC4uLi4uLi4uIGVlZWUuLi4uICBweWV4cGF0IFhNTCBoYXNoIHNhbHQKICAqCkBAIC01OSwxMyArNTksMTEgQEAKICAgICAgICAgUHlfaGFzaF90IHByZWZpeDsKICAgICAgICAgUHlfaGFzaF90IHN1ZmZpeDsKICAgICB9IGZudjsKLSNpZmRlZiBQWV9VSU5UNjRfVAogICAgIC8qIHR3byB1aW50NjQgZm9yIFNpcEhhc2gyNCAqLwogICAgIHN0cnVjdCB7Ci0gICAgICAgIFBZX1VJTlQ2NF9UIGswOwotICAgICAgICBQWV9VSU5UNjRfVCBrMTsKKyAgICAgICAgdWludDY0X3QgazA7CisgICAgICAgIHVpbnQ2NF90IGsxOwogICAgIH0gc2lwaGFzaDsKLSNlbmRpZgogICAgIC8qIGEgZGlmZmVyZW50ICghKSBQeV9oYXNoX3QgZm9yIHNtYWxsIHN0cmluZyBvcHRpbWl6YXRpb24gKi8KICAgICBzdHJ1Y3QgewogICAgICAgICB1bnNpZ25lZCBjaGFyIHBhZGRpbmdbMTZdOwpAQCAtMTIxLDggKzExOSw3IEBACiAgKiBjb25maWd1cmUgc2NyaXB0LgogICoKICAqIC0gRk5WIGlzIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIGFuZCBhcmNoaXRlY3R1cmVzLgotICogLSBTSVBIQVNIMjQgb25seSB3b3JrcyBvbiBwbGFmb3JtcyB0aGF0IHByb3ZpZGUgUFlfVUlOVDY0X1QgYW5kIGRvZXNuJ3QKLSAqICAgcmVxdWlyZSBhbGlnbmVkIG1lbW9yeSBmb3IgaW50ZWdlcnMuCisgKiAtIFNJUEhBU0gyNCBvbmx5IHdvcmtzIG9uIHBsYWZvcm1zIHRoYXQgZG9uJ3QgcmVxdWlyZSBhbGlnbmVkIG1lbW9yeSBmb3IgaW50ZWdlcnMuCiAgKiAtIFdpdGggRVhURVJOQUwgZW1iZWRkZXJzIGNhbiBwcm92aWRlIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIHdpdGg6OgogICoKICAqICAgICBQeUhhc2hfRnVuY0RlZiBQeUhhc2hfRnVuYyA9IHsuLi59OwpAQCAtMTM0LDggKzEzMSw3IEBACiAjZGVmaW5lIFB5X0hBU0hfRk5WIDIKIAogI2lmbmRlZiBQeV9IQVNIX0FMR09SSVRITQotIyAgaWYgKGRlZmluZWQoUFlfVUlOVDY0X1QpICYmIGRlZmluZWQoUFlfVUlOVDMyX1QpIFwKLSAgICAgICAmJiAhZGVmaW5lZChIQVZFX0FMSUdORURfUkVRVUlSRUQpKQorIyAgaWZuZGVmIEhBVkVfQUxJR05FRF9SRVFVSVJFRAogIyAgICBkZWZpbmUgUHlfSEFTSF9BTEdPUklUSE0gUHlfSEFTSF9TSVBIQVNIMjQKICMgIGVsc2UKICMgICAgZGVmaW5lIFB5X0hBU0hfQUxHT1JJVEhNIFB5X0hBU0hfRk5WCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bGlmZWN5Y2xlLmggYi9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKaW5kZXggY2NkZWJlMi4uY2YxNDliMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weWxpZmVjeWNsZS5oCisrKyBiL0luY2x1ZGUvcHlsaWZlY3ljbGUuaApAQCAtMjcsNiArMjcsNyBAQAogUHlBUElfRlVOQyh2b2lkKSBfUHlfSW5pdGlhbGl6ZUV4X1ByaXZhdGUoaW50LCBpbnQpOwogI2VuZGlmCiBQeUFQSV9GVU5DKHZvaWQpIFB5X0ZpbmFsaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5X0ZpbmFsaXplRXgodm9pZCk7CiBQeUFQSV9GVU5DKGludCkgUHlfSXNJbml0aWFsaXplZCh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeV9OZXdJbnRlcnByZXRlcih2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqKTsKQEAgLTExNiw3ICsxMTcsOCBAQAogUHlBUElfRlVOQyhQeU9TX3NpZ2hhbmRsZXJfdCkgUHlPU19zZXRzaWcoaW50LCBQeU9TX3NpZ2hhbmRsZXJfdCk7CiAKIC8qIFJhbmRvbSAqLwotUHlBUElfRlVOQyhpbnQpIF9QeU9TX1VSYW5kb20gKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlPU19VUmFuZG9tKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlPU19VUmFuZG9tTm9uYmxvY2sodm9pZCAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltYWNyby5oIGIvSW5jbHVkZS9weW1hY3JvLmgKaW5kZXggM2Y2ZjVkYy4uZDEzNDVjNCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hY3JvLmgKKysrIGIvSW5jbHVkZS9weW1hY3JvLmgKQEAgLTM2LDYgKzM2LDEwIEBACiAjZGVmaW5lIFB5X0JVSUxEX0FTU0VSVF9FWFBSKGNvbmQpIFwKICAgICAoc2l6ZW9mKGNoYXIgWzEgLSAyKiEoY29uZCldKSAtIDEpCiAKKyNkZWZpbmUgUHlfQlVJTERfQVNTRVJUKGNvbmQpICBkbyB7ICAgICAgICAgXAorICAgICAgICAodm9pZClQeV9CVUlMRF9BU1NFUlRfRVhQUihjb25kKTsgICBcCisgICAgfSB3aGlsZSgwKQorCiAvKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHZpc2libGUgYXJyYXkKIAogICAgVGhpcyBkb2VzIG5vdCB3b3JrIG9uIHBvaW50ZXJzLCBvciBhcnJheXMgZGVjbGFyZWQgYXMgW10sIG9yIGZ1bmN0aW9uCkBAIC03NSwxMiArNzksMTIgQEAKICNkZWZpbmUgX1B5X1NJWkVfUk9VTkRfVVAobiwgYSkgKCgoc2l6ZV90KShuKSArIFwKICAgICAgICAgKHNpemVfdCkoKGEpIC0gMSkpICYgfihzaXplX3QpKChhKSAtIDEpKQogLyogUm91bmQgcG9pbnRlciAicCIgZG93biB0byB0aGUgY2xvc2VzdCAiYSItYWxpZ25lZCBhZGRyZXNzIDw9ICJwIi4gKi8KLSNkZWZpbmUgX1B5X0FMSUdOX0RPV04ocCwgYSkgKCh2b2lkICopKChQeV91aW50cHRyX3QpKHApICYgfihQeV91aW50cHRyX3QpKChhKSAtIDEpKSkKKyNkZWZpbmUgX1B5X0FMSUdOX0RPV04ocCwgYSkgKCh2b2lkICopKCh1aW50cHRyX3QpKHApICYgfih1aW50cHRyX3QpKChhKSAtIDEpKSkKIC8qIFJvdW5kIHBvaW50ZXIgInAiIHVwIHRvIHRoZSBjbG9zZXN0ICJhIi1hbGlnbmVkIGFkZHJlc3MgPj0gInAiLiAqLwotI2RlZmluZSBfUHlfQUxJR05fVVAocCwgYSkgKCh2b2lkICopKCgoUHlfdWludHB0cl90KShwKSArIFwKLSAgICAgICAgKFB5X3VpbnRwdHJfdCkoKGEpIC0gMSkpICYgfihQeV91aW50cHRyX3QpKChhKSAtIDEpKSkKKyNkZWZpbmUgX1B5X0FMSUdOX1VQKHAsIGEpICgodm9pZCAqKSgoKHVpbnRwdHJfdCkocCkgKyBcCisgICAgICAgICh1aW50cHRyX3QpKChhKSAtIDEpKSAmIH4odWludHB0cl90KSgoYSkgLSAxKSkpCiAvKiBDaGVjayBpZiBwb2ludGVyICJwIiBpcyBhbGlnbmVkIHRvICJhIi1ieXRlcyBib3VuZGFyeS4gKi8KLSNkZWZpbmUgX1B5X0lTX0FMSUdORUQocCwgYSkgKCEoKFB5X3VpbnRwdHJfdCkocCkgJiAoUHlfdWludHB0cl90KSgoYSkgLSAxKSkpCisjZGVmaW5lIF9QeV9JU19BTElHTkVEKHAsIGEpICghKCh1aW50cHRyX3QpKHApICYgKHVpbnRwdHJfdCkoKGEpIC0gMSkpKQogCiAjaWZkZWYgX19HTlVDX18KICNkZWZpbmUgUHlfVU5VU0VEKG5hbWUpIF91bnVzZWRfICMjIG5hbWUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltYXRoLmggYi9JbmNsdWRlL3B5bWF0aC5oCmluZGV4IDFlYTlhYzEuLjcyMTZhMDkgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYXRoLmgKKysrIGIvSW5jbHVkZS9weW1hdGguaApAQCAtMzcsNyArMzcsNyBAQAogI2VuZGlmIC8qIF9fU1REQ19fICovCiAjZW5kaWYgLyogX01TQ19WRVIgKi8KIAotLyogSGlnaCBwcmVjaXNpb24gZGVmaW50aW9uIG9mIHBpIGFuZCBlIChFdWxlcikKKy8qIEhpZ2ggcHJlY2lzaW9uIGRlZmluaXRpb24gb2YgcGkgYW5kIGUgKEV1bGVyKQogICogVGhlIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSBsaWJjNidzIG1hdGguaC4KICAqLwogI2lmbmRlZiBQeV9NQVRIX1BJbApAQCAtNTUsNiArNTUsMTIgQEAKICNkZWZpbmUgUHlfTUFUSF9FIDIuNzE4MjgxODI4NDU5MDQ1MjM1NAogI2VuZGlmCiAKKy8qIFRhdSAoMnBpKSB0byA0MCBkaWdpdHMsIHRha2VuIGZyb20gdGF1ZGF5LmNvbS90YXUtZGlnaXRzLiAqLworI2lmbmRlZiBQeV9NQVRIX1RBVQorI2RlZmluZSBQeV9NQVRIX1RBVSA2LjI4MzE4NTMwNzE3OTU4NjQ3NjkyNTI4Njc2NjU1OTAwNTc2ODM5NDNMCisjZW5kaWYKKworCiAvKiBPbiB4ODYsIFB5X0ZPUkNFX0RPVUJMRSBmb3JjZXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgb3V0IG9mIGFuIHg4NyBGUFUKICAgIHJlZ2lzdGVyIGFuZCBpbnRvIGEgNjQtYml0IG1lbW9yeSBsb2NhdGlvbiwgcm91bmRpbmcgZnJvbSBleHRlbmRlZAogICAgcHJlY2lzaW9uIHRvIGRvdWJsZSBwcmVjaXNpb24gaW4gdGhlIHByb2Nlc3MuICBPbiBvdGhlciBwbGF0Zm9ybXMgaXQgZG9lcwpAQCAtMTY5LDcgKzE3NSw3IEBACiAgICAgICAgICNwcmFnbWEgZmxvYXRfY29udHJvbCAocG9wKQogICAgICAgICAjZGVmaW5lIFB5X05BTiBfX2ljY19uYW4oKQogICAgICNlbHNlIC8qIElDQ19OQU5fUkVMQVhFRCBhcyBkZWZhdWx0IGZvciBJbnRlbCBDb21waWxlciAqLwotICAgICAgICBzdGF0aWMgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OworICAgICAgICBzdGF0aWMgY29uc3QgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OwogICAgICAgICAjZGVmaW5lIFB5X05BTiAoX19uYW5fc3RvcmUuX19pY2NfbmFuKQogICAgICNlbmRpZiAvKiBJQ0NfTkFOX1NUUklDVCAqLwogI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltZW0uaCBiL0luY2x1ZGUvcHltZW0uaAppbmRleCAwNDNkYjY0Li5jZTYzYmY4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bWVtLmgKKysrIGIvSW5jbHVkZS9weW1lbS5oCkBAIC0xNiw4ICsxNiw1MSBAQAogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd0NhbGxvYyhzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd1JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpOwogUHlBUElfRlVOQyh2b2lkKSBQeU1lbV9SYXdGcmVlKHZvaWQgKnB0cik7CisKKy8qIENvbmZpZ3VyZSB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzLiBQYXNzIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAgIGFsbG9jYXRvcnMuICovCitQeUFQSV9GVU5DKGludCkgX1B5TWVtX1NldHVwQWxsb2NhdG9ycyhjb25zdCBjaGFyICpvcHQpOworCisjaWZkZWYgV0lUSF9QWU1BTExPQworUHlBUElfRlVOQyhpbnQpIF9QeU1lbV9QeW1hbGxvY0VuYWJsZWQodm9pZCk7CiAjZW5kaWYKIAorLyogSWRlbnRpZmllciBvZiBhbiBhZGRyZXNzIHNwYWNlIChkb21haW4pIGluIHRyYWNlbWFsbG9jICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBfUHlUcmFjZU1hbGxvY19kb21haW5fdDsKKworLyogVHJhY2sgYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBpbiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmV0dXJuIC0xIG9uIGVycm9yIChmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlCisgICB0aGUgdHJhY2UpLgorCisgICBSZXR1cm4gLTIgaWYgdHJhY2VtYWxsb2MgaXMgZGlzYWJsZWQuCisKKyAgIElmIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5IHRyYWNrZWQsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgdHJhY2UuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVHJhY2soCisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLAorICAgIHVpbnRwdHJfdCBwdHIsCisgICAgc2l6ZV90IHNpemUpOworCisvKiBVbnRyYWNrIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgaW4gdGhlIHRyYWNlbWFsbG9jIG1vZHVsZS4KKyAgIERvIG5vdGhpbmcgaWYgdGhlIGJsb2NrIHdhcyBub3QgdHJhY2tlZC4KKworICAgUmV0dXJuIC0yIGlmIHRyYWNlbWFsbG9jIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVW50cmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgdWludHB0cl90IHB0cik7CisKKy8qIEdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQuCisKKyAgIFJldHVybiBhIHR1cGxlIG9mIChmaWxlbmFtZTogc3RyLCBsaW5lbm86IGludCkgdHVwbGVzLgorCisgICBSZXR1cm4gTm9uZSBpZiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlIGlzIGRpc2FibGVkIG9yIGlmIHRoZSBtZW1vcnkgYmxvY2sKKyAgIGlzIG5vdCB0cmFja2VkIGJ5IHRyYWNlbWFsbG9jLgorCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgdWludHB0cl90IHB0cik7CisjZW5kaWYgICAvKiAhUHlfTElNSVRFRF9BUEkgKi8KKwogCiAvKiBCRVdBUkU6CiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlwb3J0LmggYi9JbmNsdWRlL3B5cG9ydC5oCmluZGV4IGJhNDkyMjEuLjJmNzgwNTIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlwb3J0LmgKKysrIGIvSW5jbHVkZS9weXBvcnQuaApAQCAtMywxNSArMyw3IEBACiAKICNpbmNsdWRlICJweWNvbmZpZy5oIiAvKiBpbmNsdWRlIGZvciBkZWZpbmVzICovCiAKLS8qIFNvbWUgdmVyc2lvbnMgb2YgSFAtVVggJiBTb2xhcmlzIG5lZWQgaW50dHlwZXMuaCBmb3IgaW50MzJfdCwKLSAgIElOVDMyX01BWCwgZXRjLiAqLwotI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFN5bWJvbHMgYW5kIG1hY3JvcyB0byBzdXBwbHkgcGxhdGZvcm0taW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0byBiYXNpYwpAQCAtMzEsMTQgKzIzLDYgQEAKIE1lYW5pbmc6ICBFeHRyYSBjaGVja3MgY29tcGlsZWQgaW4gZm9yIGRlYnVnIG1vZGUuCiBVc2VkIGluOiAgUHlfU0FGRV9ET1dOQ0FTVAogCi1IQVZFX1VJTlRQVFJfVAotTWVhbmluZzogIFRoZSBDOVggdHlwZSB1aW50cHRyX3QgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlcgotVXNlZCBpbjogIFB5X3VpbnRwdHJfdAotCi1IQVZFX0xPTkdfTE9ORwotTWVhbmluZzogIFRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgQyB0eXBlICJsb25nIGxvbmciCi1Vc2VkIGluOiAgUFlfTE9OR19MT05HCi0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0eXBlZGVmcyBmb3Igc29tZSBDOVgtZGVmaW5lZCBzeW5vbnltcyBmb3IgaW50ZWdyYWwgdHlwZXMuCkBAIC01Myw3ICszNyw2IEBACiAgKiBpbnRlZ3JhbCBzeW5vbnltcy4gIE9ubHkgZGVmaW5lIHRoZSBvbmVzIHdlIGFjdHVhbGx5IG5lZWQuCiAgKi8KIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAjaWZuZGVmIFBZX0xPTkdfTE9ORwogI2RlZmluZSBQWV9MT05HX0xPTkcgbG9uZyBsb25nCiAjaWYgZGVmaW5lZChMTE9OR19NQVgpCkBAIC03OCw2NiArNjEsMjAgQEAKICNkZWZpbmUgUFlfVUxMT05HX01BWCAoUFlfTExPTkdfTUFYICogUHlfVUxMKDIpICsgMSkKICNlbmRpZiAvKiBMTE9OR19NQVggKi8KICNlbmRpZgotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCiAKLS8qIGEgYnVpbGQgd2l0aCAzMC1iaXQgZGlnaXRzIGZvciBQeXRob24gaW50ZWdlcnMgbmVlZHMgYW4gZXhhY3Qtd2lkdGgKLSAqIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgdG8gc3RvcmUgdGhvc2UgZGlnaXRzLiAgKFdlIGNvdWxkIGp1c3QgdXNlCi0gKiB0eXBlICd1bnNpZ25lZCBsb25nJywgYnV0IHRoYXQgd291bGQgYmUgd2FzdGVmdWwgb24gYSBzeXN0ZW0gd2hlcmUgbG9uZ3MKLSAqIGFyZSA2NC1iaXRzLikgIE9uIFVuaXggc3lzdGVtcywgdGhlIGF1dG9jb25mIG1hY3JvIEFDX1RZUEVfVUlOVDMyX1QgZGVmaW5lcwotICogdWludDMyX3QgdG8gYmUgc3VjaCBhIHR5cGUgdW5sZXNzIHN0ZGludC5oIG9yIGludHR5cGVzLmggZGVmaW5lcyB1aW50MzJfdC4KLSAqIEhvd2V2ZXIsIGl0IGRvZXNuJ3Qgc2V0IEhBVkVfVUlOVDMyX1QsIHNvIHdlIGRvIHRoYXQgaGVyZS4KLSAqLwotI2lmZGVmIHVpbnQzMl90Ci0jZGVmaW5lIEhBVkVfVUlOVDMyX1QgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VJTlQzMl9UCi0jaWZuZGVmIFBZX1VJTlQzMl9UCiAjZGVmaW5lIFBZX1VJTlQzMl9UIHVpbnQzMl90Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZTsgdXNlZCBmb3IgdHlwZSAndHdvZGlnaXRzJyBpbiB0aGUKLSAqIGludGVnZXIgaW1wbGVtZW50YXRpb24sIHdoZW4gMzAtYml0IGRpZ2l0cyBhcmUgZW5hYmxlZC4KLSAqLwotI2lmZGVmIHVpbnQ2NF90Ci0jZGVmaW5lIEhBVkVfVUlOVDY0X1QgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VJTlQ2NF9UCi0jaWZuZGVmIFBZX1VJTlQ2NF9UCiAjZGVmaW5lIFBZX1VJTlQ2NF9UIHVpbnQ2NF90Ci0jZW5kaWYKLSNlbmRpZgogCiAvKiBTaWduZWQgdmFyaWFudHMgb2YgdGhlIGFib3ZlICovCi0jaWZkZWYgaW50MzJfdAotI2RlZmluZSBIQVZFX0lOVDMyX1QgMQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0lOVDMyX1QKLSNpZm5kZWYgUFlfSU5UMzJfVAogI2RlZmluZSBQWV9JTlQzMl9UIGludDMyX3QKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBpbnQ2NF90Ci0jZGVmaW5lIEhBVkVfSU5UNjRfVCAxCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfSU5UNjRfVAotI2lmbmRlZiBQWV9JTlQ2NF9UCiAjZGVmaW5lIFBZX0lOVDY0X1QgaW50NjRfdAotI2VuZGlmCi0jZW5kaWYKIAogLyogSWYgUFlMT05HX0JJVFNfSU5fRElHSVQgaXMgbm90IGRlZmluZWQgdGhlbiB3ZSdsbCB1c2UgMzAtYml0IGRpZ2l0cyBpZiBhbGwKICAgIHRoZSBuZWNlc3NhcnkgaW50ZWdlciB0eXBlcyBhcmUgYXZhaWxhYmxlLCBhbmQgd2UncmUgb24gYSA2NC1iaXQgcGxhdGZvcm0KICAgIChhcyBkZXRlcm1pbmVkIGJ5IFNJWkVPRl9WT0lEX1ApOyBvdGhlcndpc2Ugd2UgdXNlIDE1LWJpdCBkaWdpdHMuICovCiAKICNpZm5kZWYgUFlMT05HX0JJVFNfSU5fRElHSVQKLSNpZiAoZGVmaW5lZCBIQVZFX1VJTlQ2NF9UICYmIGRlZmluZWQgSEFWRV9JTlQ2NF9UICYmIFwKLSAgICAgZGVmaW5lZCBIQVZFX1VJTlQzMl9UICYmIGRlZmluZWQgSEFWRV9JTlQzMl9UICYmIFNJWkVPRl9WT0lEX1AgPj0gOCkKKyNpZiBTSVpFT0ZfVk9JRF9QID49IDgKICNkZWZpbmUgUFlMT05HX0JJVFNfSU5fRElHSVQgMzAKICNlbHNlCiAjZGVmaW5lIFBZTE9OR19CSVRTX0lOX0RJR0lUIDE1CkBAIC0xNDksMjYgKzg2LDkgQEAKICAqIHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbi4gIFNpbWlsYXJseSBmb3IgaW50cHRyX3QsIHdydCBhIHNpZ25lZAogICogaW50ZWdyYWwgdHlwZS4KICAqLwotI2lmZGVmIEhBVkVfVUlOVFBUUl9UCiB0eXBlZGVmIHVpbnRwdHJfdCAgICAgICBQeV91aW50cHRyX3Q7CiB0eXBlZGVmIGludHB0cl90ICAgICAgICBQeV9pbnRwdHJfdDsKIAotI2VsaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfSU5UCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICBQeV91aW50cHRyX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICBQeV9pbnRwdHJfdDsKLQotI2VsaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgUHlfdWludHB0cl90OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgUHlfaW50cHRyX3Q7Ci0KLSNlbGlmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIChTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HX0xPTkcpCi10eXBlZGVmIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAgIFB5X3VpbnRwdHJfdDsKLXR5cGVkZWYgUFlfTE9OR19MT05HICAgICAgICAgICAgUHlfaW50cHRyX3Q7Ci0KLSNlbHNlCi0jICAgZXJyb3IgIlB5dGhvbiBuZWVkcyBhIHR5cGVkZWYgZm9yIFB5X3VpbnRwdHJfdCBpbiBweXBvcnQuaC4iCi0jZW5kaWYgLyogSEFWRV9VSU5UUFRSX1QgKi8KLQogLyogUHlfc3NpemVfdCBpcyBhIHNpZ25lZCBpbnRlZ3JhbCB0eXBlIHN1Y2ggdGhhdCBzaXplb2YoUHlfc3NpemVfdCkgPT0KICAqIHNpemVvZihzaXplX3QpLiAgQzk5IGRvZXNuJ3QgZGVmaW5lIHN1Y2ggYSB0aGluZyBkaXJlY3RseSAoc2l6ZV90IGlzIGFuCiAgKiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlKS4gIFNlZSBQRVAgMzUzIGZvciBkZXRhaWxzLgpAQCAtMjQ4LDE5ICsxNjgsMTYgQEAKICNlbmRpZgogCiAvKiBQWV9GT1JNQVRfTE9OR19MT05HIGlzIGFuYWxvZ291cyB0byBQWV9GT1JNQVRfU0laRV9UIGFib3ZlLCBidXQgZm9yCi0gKiB0aGUgbG9uZyBsb25nIHR5cGUgaW5zdGVhZCBvZiB0aGUgc2l6ZV90IHR5cGUuICBJdCdzIG9ubHkgYXZhaWxhYmxlCi0gKiB3aGVuIEhBVkVfTE9OR19MT05HIGlzIGRlZmluZWQuIFRoZSAiaGlnaCBsZXZlbCIgUHl0aG9uIGZvcm1hdAorICogdGhlIGxvbmcgbG9uZyB0eXBlIGluc3RlYWQgb2YgdGhlIHNpemVfdCB0eXBlLiBUaGUgImhpZ2ggbGV2ZWwiIFB5dGhvbiBmb3JtYXQKICAqIGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUgd2lsbCBpbnRlcnByZXQgImxsZCIgb3IgImxsdSIgY29ycmVjdGx5IG9uCiAgKiBhbGwgcGxhdGZvcm1zLgogICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSMgICBpZm5kZWYgUFlfRk9STUFUX0xPTkdfTE9ORwotIyAgICAgICBpZmRlZiBNU19XSU5ET1dTCi0jICAgICAgICAgICBkZWZpbmUgUFlfRk9STUFUX0xPTkdfTE9ORyAiSTY0IgotIyAgICAgICBlbHNlCi0jICAgICAgICAgICBlcnJvciAiVGhpcyBwbGF0Zm9ybSdzIHB5Y29uZmlnLmggbmVlZHMgdG8gZGVmaW5lIFBZX0ZPUk1BVF9MT05HX0xPTkciCi0jICAgICAgIGVuZGlmCi0jICAgZW5kaWYKKyNpZm5kZWYgUFlfRk9STUFUX0xPTkdfTE9ORworIyAgICBpZmRlZiBNU19XSU5ET1dTCisjICAgICAgIGRlZmluZSBQWV9GT1JNQVRfTE9OR19MT05HICJJNjQiCisjICAgIGVsc2UKKyMgICAgICAgZXJyb3IgIlRoaXMgcGxhdGZvcm0ncyBweWNvbmZpZy5oIG5lZWRzIHRvIGRlZmluZSBQWV9GT1JNQVRfTE9OR19MT05HIgorIyAgICBlbmRpZgogI2VuZGlmCiAKIC8qIFB5X0xPQ0FMIGNhbiBiZSB1c2VkIGluc3RlYWQgb2Ygc3RhdGljIHRvIGdldCB0aGUgZmFzdGVzdCBwb3NzaWJsZSBjYWxsaW5nCkBAIC05MDYsNCArODIzLDggQEAKICNlbmRpZiAvKiBfTVNDX1ZFUiA+PSAxOTAwICovCiAjZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwogCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorI2VuZGlmCisKICNlbmRpZiAvKiBQeV9QWVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXN0YXRlLmggYi9JbmNsdWRlL3B5c3RhdGUuaAppbmRleCAwNDk5YTc0Li41YTA2NzczIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5c3RhdGUuaAorKysgYi9JbmNsdWRlL3B5c3RhdGUuaApAQCAtMTIsMTAgKzEyLDEzIEBACiAKIHN0cnVjdCBfdHM7IC8qIEZvcndhcmQgKi8KIHN0cnVjdCBfaXM7IC8qIEZvcndhcmQgKi8KK3N0cnVjdCBfZnJhbWU7IC8qIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIFB5RnJhbWVPYmplY3QuICovCiAKICNpZmRlZiBQeV9MSU1JVEVEX0FQSQogdHlwZWRlZiBzdHJ1Y3QgX2lzIFB5SW50ZXJwcmV0ZXJTdGF0ZTsKICNlbHNlCit0eXBlZGVmIFB5T2JqZWN0KiAoKl9QeUZyYW1lRXZhbEZ1bmN0aW9uKShzdHJ1Y3QgX2ZyYW1lICosIGludCk7CisKIHR5cGVkZWYgc3RydWN0IF9pcyB7CiAKICAgICBzdHJ1Y3QgX2lzICpuZXh0OwpAQCAtNDEsMTQgKzQ0LDE1IEBACiAjZW5kaWYKIAogICAgIFB5T2JqZWN0ICpidWlsdGluc19jb3B5OworICAgIFB5T2JqZWN0ICppbXBvcnRfZnVuYzsKKyAgICAvKiBJbml0aWFsaXplZCB0byBQeUV2YWxfRXZhbEZyYW1lRGVmYXVsdCgpLiAqLworICAgIF9QeUZyYW1lRXZhbEZ1bmN0aW9uIGV2YWxfZnJhbWU7CiB9IFB5SW50ZXJwcmV0ZXJTdGF0ZTsKICNlbmRpZgogCiAKIC8qIFN0YXRlIHVuaXF1ZSBwZXIgdGhyZWFkICovCiAKLXN0cnVjdCBfZnJhbWU7IC8qIEF2b2lkIGluY2x1ZGluZyBmcmFtZW9iamVjdC5oICovCi0KICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKIC8qIFB5X3RyYWNlZnVuYyByZXR1cm4gLTEgd2hlbiByYWlzaW5nIGFuIGV4Y2VwdGlvbiwgb3IgMCBmb3Igc3VjY2Vzcy4gKi8KIHR5cGVkZWYgaW50ICgqUHlfdHJhY2VmdW5jKShQeU9iamVjdCAqLCBzdHJ1Y3QgX2ZyYW1lICosIGludCwgUHlPYmplY3QgKik7CkBAIC0yNDEsMTEgKzI0NSwyMyBAQAogKi8KIFB5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSh2b2lkKTsKIAotLyogSGVscGVyL2RpYWdub3N0aWMgZnVuY3Rpb24gLSByZXR1cm4gMSBpZiB0aGUgY3VycmVudCB0aHJlYWQKLSAqIGN1cnJlbnRseSBob2xkcyB0aGUgR0lMLCAwIG90aGVyd2lzZQotICovCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCisvKiBJc3N1ZSAjMjY1NTg6IEZsYWcgdG8gZGlzYWJsZSBQeUdJTFN0YXRlX0NoZWNrKCkuCisgICBJZiBzZXQgdG8gbm9uLXplcm8sIFB5R0lMU3RhdGVfQ2hlY2soKSBhbHdheXMgcmV0dXJuIDEuICovCitQeUFQSV9EQVRBKGludCkgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZDsKKworLyogSGVscGVyL2RpYWdub3N0aWMgZnVuY3Rpb24gLSByZXR1cm4gMSBpZiB0aGUgY3VycmVudCB0aHJlYWQKKyAgIGN1cnJlbnRseSBob2xkcyB0aGUgR0lMLCAwIG90aGVyd2lzZS4KKworICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkIGlzIG5vbi16ZXJvLiAqLwogUHlBUElfRlVOQyhpbnQpIFB5R0lMU3RhdGVfQ2hlY2sodm9pZCk7CisKKy8qIFVuc2FmZSBmdW5jdGlvbiB0byBnZXQgdGhlIHNpbmdsZSBQeUludGVycHJldGVyU3RhdGUgdXNlZCBieSB0aGlzIHByb2Nlc3MnCisgICBHSUxTdGF0ZSBpbXBsZW1lbnRhdGlvbi4KKworICAgUmV0dXJuIE5VTEwgYmVmb3JlIF9QeUdJTFN0YXRlX0luaXQoKSBpcyBjYWxsZWQgYW5kIGFmdGVyIF9QeUdJTFN0YXRlX0ZpbmkoKQorICAgaXMgY2FsbGVkLiAqLworUHlBUElfRlVOQyhQeUludGVycHJldGVyU3RhdGUgKikgX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSh2b2lkKTsKICNlbmRpZgogCiAjZW5kaWYgICAvKiAjaWZkZWYgV0lUSF9USFJFQUQgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aG9ucnVuLmggYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCmluZGV4IDljMmU4MTMuLmNmYTBhOWYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHl0aG9ucnVuLmgKKysrIGIvSW5jbHVkZS9weXRob25ydW4uaApAQCAtNjYsOCArNjYsOCBAQAogICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAgICAgICAvKiBkZWNvZGVkIGZyb20gdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcgKi8KICAgICBjb25zdCBjaGFyKiBlbmMsCiAgICAgaW50IHN0YXJ0LAotICAgIGNoYXIgKnBzMSwKLSAgICBjaGFyICpwczIsCisgICAgY29uc3QgY2hhciAqcHMxLAorICAgIGNvbnN0IGNoYXIgKnBzMiwKICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAogICAgIGludCAqZXJyY29kZSwKICAgICBQeUFyZW5hICphcmVuYSk7CkBAIC03Niw4ICs3Niw4IEBACiAgICAgUHlPYmplY3QgKmZpbGVuYW1lLAogICAgIGNvbnN0IGNoYXIqIGVuYywKICAgICBpbnQgc3RhcnQsCi0gICAgY2hhciAqcHMxLAotICAgIGNoYXIgKnBzMiwKKyAgICBjb25zdCBjaGFyICpwczEsCisgICAgY29uc3QgY2hhciAqcHMyLAogICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCiAgICAgaW50ICplcnJjb2RlLAogICAgIFB5QXJlbmEgKmFyZW5hKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aHJlYWQuaCBiL0luY2x1ZGUvcHl0aHJlYWQuaAppbmRleCA2ZTlmMzAzLi40NTlhNWQ1IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhyZWFkLmgKKysrIGIvSW5jbHVkZS9weXRocmVhZC5oCkBAIC0zNywxMyArMzcsOCBAQAogICAgbW9kdWxlIGV4cG9zZXMgYSBoaWdoZXItbGV2ZWwgQVBJLCB3aXRoIHRpbWVvdXRzIGV4cHJlc3NlZCBpbiBzZWNvbmRzCiAgICBhbmQgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhbGxvd2VkLgogKi8KLSNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotI2RlZmluZSBQWV9USU1FT1VUX1QgUFlfTE9OR19MT05HCisjZGVmaW5lIFBZX1RJTUVPVVRfVCBsb25nIGxvbmcKICNkZWZpbmUgUFlfVElNRU9VVF9NQVggUFlfTExPTkdfTUFYCi0jZWxzZQotI2RlZmluZSBQWV9USU1FT1VUX1QgbG9uZwotI2RlZmluZSBQWV9USU1FT1VUX01BWCBMT05HX01BWAotI2VuZGlmCiAKIC8qIEluIHRoZSBOVCBBUEksIHRoZSB0aW1lb3V0IGlzIGEgRFdPUkQgYW5kIGlzIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMgKi8KICNpZiBkZWZpbmVkIChOVF9USFJFQURTKQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRpbWUuaCBiL0luY2x1ZGUvcHl0aW1lLmgKaW5kZXggNDk0MzIyYy4uNTk1ZmFmYyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRpbWUuaAorKysgYi9JbmNsdWRlL3B5dGltZS5oCkBAIC0xMywxNiArMTMsMTIgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNpZmRlZiBQWV9JTlQ2NF9UCiAvKiBfUHlUaW1lX3Q6IFB5dGhvbiB0aW1lc3RhbXAgd2l0aCBzdWJzZWNvbmQgcHJlY2lzaW9uLiBJdCBjYW4gYmUgdXNlZCB0bwogICAgc3RvcmUgYSBkdXJhdGlvbiwgYW5kIHNvIGluZGlyZWN0bHkgYSBkYXRlIChyZWxhdGVkIHRvIGFub3RoZXIgZGF0ZSwgbGlrZQogICAgVU5JWCBlcG9jaCkuICovCi10eXBlZGVmIFBZX0lOVDY0X1QgX1B5VGltZV90OwordHlwZWRlZiBpbnQ2NF90IF9QeVRpbWVfdDsKICNkZWZpbmUgX1B5VGltZV9NSU4gUFlfTExPTkdfTUlOCiAjZGVmaW5lIF9QeVRpbWVfTUFYIFBZX0xMT05HX01BWAotI2Vsc2UKLSMgIGVycm9yICJfUHlUaW1lX3QgbmVlZCBzaWduZWQgNjQtYml0IGludGVnZXIgdHlwZSIKLSNlbmRpZgogCiB0eXBlZGVmIGVudW0gewogICAgIC8qIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpLgpAQCAtMzAsNyArMjYsMTAgQEAKICAgICBfUHlUaW1lX1JPVU5EX0ZMT09SPTAsCiAgICAgLyogUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikuCiAgICAgICAgRm9yIGV4YW1wbGUsIHVzZWQgZm9yIHRpbWVvdXQgdG8gd2FpdCAiYXQgbGVhc3QiIE4gc2Vjb25kcy4gKi8KLSAgICBfUHlUaW1lX1JPVU5EX0NFSUxJTkcKKyAgICBfUHlUaW1lX1JPVU5EX0NFSUxJTkc9MSwKKyAgICAvKiBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlci4KKyAgICAgICBGb3IgZXhhbXBsZSwgdXNlZCB0byByb3VuZCBmcm9tIGEgUHl0aG9uIGZsb2F0LiAqLworICAgIF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOCiB9IF9QeVRpbWVfcm91bmRfdDsKIAogLyogQ29udmVydCBhIHRpbWVfdCB0byBhIFB5TG9uZy4gKi8KQEAgLTc1LDcgKzc0LDcgQEAKICAgICAgICAgICAgICgoX1B5VGltZV90KShzZWNvbmRzKSAqICgxMDAwICogMTAwMCAqIDEwMDApKQogCiAvKiBDcmVhdGUgYSB0aW1lc3RhbXAgZnJvbSBhIG51bWJlciBvZiBuYW5vc2Vjb25kcy4gKi8KLVB5QVBJX0ZVTkMoX1B5VGltZV90KSBfUHlUaW1lX0Zyb21OYW5vc2Vjb25kcyhQWV9MT05HX0xPTkcgbnMpOworUHlBUElfRlVOQyhfUHlUaW1lX3QpIF9QeVRpbWVfRnJvbU5hbm9zZWNvbmRzKGxvbmcgbG9uZyBucyk7CiAKIC8qIENvbnZlcnQgYSBudW1iZXIgb2Ygc2Vjb25kcyAoUHl0aG9uIGZsb2F0IG9yIGludCkgdG8gYSB0aW1ldGFtcC4KICAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLCByZXR1cm4gMCBvbiBzdWNjZXNzLiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zZXRvYmplY3QuaCBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKaW5kZXggZjE3YmMxYi4uODdlYzFjOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zZXRvYmplY3QuaAorKysgYi9JbmNsdWRlL3NldG9iamVjdC5oCkBAIC0xMCwxMiArMTAsMTMgQEAKIAogLyogVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlOgogCi0xLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTAotMi4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teQotMy4gRHVtbXk6ICAga2V5ID09IGR1bW15CisxLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTCBhbmQgaGFzaCA9PSAwCisyLiBEdW1teTogICBrZXkgPT0gZHVtbXkgYW5kIGhhc2ggPT0gLTEKKzMuIEFjdGl2ZTogIGtleSAhPSBOVUxMIGFuZCBrZXkgIT0gZHVtbXkgYW5kIGhhc2ggIT0gLTEKIAotVGhlIGhhc2ggZmllbGQgb2YgVW51c2VkIHNsb3RzIGhhdmUgbm8gbWVhbmluZy4KLVRoZSBoYXNoIGZpZWxkIG9mIER1bW1ueSBzbG90cyBhcmUgc2V0IHRvIC0xCitUaGUgaGFzaCBmaWVsZCBvZiBVbnVzZWQgc2xvdHMgaXMgYWx3YXlzIHplcm8uCisKK1RoZSBoYXNoIGZpZWxkIG9mIER1bW15IHNsb3RzIGFyZSBzZXQgdG8gLTEKIG1lYW5pbmcgdGhhdCBkdW1teSBlbnRyaWVzIGNhbiBiZSBkZXRlY3RlZCBieQogZWl0aGVyIGVudHJ5LT5rZXk9PWR1bW15IG9yIGJ5IGVudHJ5LT5oYXNoPT0tMS4KICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3N0cnVjdG1lbWJlci5oIGIvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaAppbmRleCA5NDhmNjkwLi41ZGE4YTQ2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3N0cnVjdG1lbWJlci5oCisrKyBiL0luY2x1ZGUvc3RydWN0bWVtYmVyLmgKQEAgLTQ5LDEwICs0OSw4IEBACiAjZGVmaW5lIFRfT0JKRUNUX0VYIDE2ICAvKiBMaWtlIFRfT0JKRUNULCBidXQgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YWx1ZSBpcyBOVUxMLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0aW5nIHRvIE5vbmUuICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICNkZWZpbmUgVF9MT05HTE9ORyAgICAgIDE3CiAjZGVmaW5lIFRfVUxPTkdMT05HICAgICAxOAotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCiAKICNkZWZpbmUgVF9QWVNTSVpFVCAgICAgIDE5ICAgICAgLyogUHlfc3NpemVfdCAqLwogI2RlZmluZSBUX05PTkUgICAgICAgICAgMjAgICAgICAvKiBWYWx1ZSBpcyBhbHdheXMgTm9uZSAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS90cmFjZWJhY2suaCBiL0luY2x1ZGUvdHJhY2ViYWNrLmgKaW5kZXggYzNlY2JlMi4uZGJjNzY5YiAxMDA2NDQKLS0tIGEvSW5jbHVkZS90cmFjZWJhY2suaAorKysgYi9JbmNsdWRlL3RyYWNlYmFjay5oCkBAIC01MywxOSArNTMsNjMgQEAKICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUpOwogCiAvKiBXcml0ZSB0aGUgdHJhY2ViYWNrIG9mIGFsbCB0aHJlYWRzIGludG8gdGhlIGZpbGUgJ2ZkJy4gY3VycmVudF90aHJlYWQgY2FuIGJlCi0gICBOVUxMLiBSZXR1cm4gTlVMTCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciBtZXNzYWdlIG9uIGVycm9yLgorICAgTlVMTC4KKworICAgUmV0dXJuIE5VTEwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvbiBlcnJvci4KIAogICAgVGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHkuIEl0IGNhbGxzCiAgICBfUHlfRHVtcFRyYWNlYmFjaygpIGZvciBlYWNoIHRocmVhZCwgYW5kIHNvIGhhcyB0aGUgc2FtZSBsaW1pdGF0aW9ucy4gSXQKICAgIG9ubHkgd3JpdGUgdGhlIHRyYWNlYmFjayBvZiB0aGUgZmlyc3QgMTAwIHRocmVhZHM6IHdyaXRlICIuLi4iIGlmIHRoZXJlIGFyZQogICAgbW9yZSB0aHJlYWRzLgogCisgICBJZiBjdXJyZW50X3RzdGF0ZSBpcyBOVUxMLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZ2V0IHRoZSBQeXRob24gdGhyZWFkIHN0YXRlCisgICBvZiB0aGUgY3VycmVudCB0aHJlYWQuIEl0IGlzIG5vdCBhbiBlcnJvciBpZiB0aGUgZnVuY3Rpb24gaXMgdW5hYmxlIHRvIGdldAorICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZS4KKworICAgSWYgaW50ZXJwIGlzIE5VTEwsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBnZXQgdGhlIGludGVycHJldGVyIHN0YXRlIGZyb20KKyAgIHRoZSBjdXJyZW50IFB5dGhvbiB0aHJlYWQgc3RhdGUsIG9yIGZyb20KKyAgIF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUoKSBpbiBsYXN0IHJlc29ydC4KKworICAgSXQgaXMgYmV0dGVyIHRvIHBhc3MgTlVMTCB0byBpbnRlcnAgYW5kIGN1cnJlbnRfdHN0YXRlLCB0aGUgZnVuY3Rpb24gdHJpZXMKKyAgIGRpZmZlcmVudCBvcHRpb25zIHRvIHJldHJpZXZlIHRoZXNlIGluZm9ybWF0aW9ucy4KKwogICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KIAogUHlBUElfRlVOQyhjb25zdCBjaGFyKikgX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKAotICAgIGludCBmZCwgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCi0gICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90aHJlYWQpOworICAgIGludCBmZCwKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCwKKyAgICBQeVRocmVhZFN0YXRlICpjdXJyZW50X3RzdGF0ZSk7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKKworLyogV3JpdGUgYSBVbmljb2RlIG9iamVjdCBpbnRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuIEVuY29kZSB0aGUgc3RyaW5nIHRvCisgICBBU0NJSSB1c2luZyB0aGUgYmFja3NsYXNocmVwbGFjZSBlcnJvciBoYW5kbGVyLgorCisgICBEbyBub3RoaW5nIGlmIHRleHQgaXMgbm90IGEgVW5pY29kZSBvYmplY3QuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIFVuaWNvZGUKKyAgIHN0cmluZyB3aGljaCBpcyBub3QgcmVhZHkgKFB5VW5pY29kZV9XQ0hBUl9LSU5EKS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5X0R1bXBBU0NJSShpbnQgZmQsIFB5T2JqZWN0ICp0ZXh0KTsKKworLyogRm9ybWF0IGFuIGludGVnZXIgYXMgZGVjaW1hbCBpbnRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wRGVjaW1hbCgKKyAgICBpbnQgZmQsCisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisKKy8qIEZvcm1hdCBhbiBpbnRlZ2VyIGFzIGhleGFkZWNpbWFsIGludG8gdGhlIGZpbGUgZGVzY3JpcHRvciBmZCB3aXRoIGF0IGxlYXN0CisgICB3aWR0aCBkaWdpdHMuCisKKyAgIFRoZSBtYXhpbXVtIHdpZHRoIGlzIHNpemVvZih1bnNpZ25lZCBsb25nKSoyIGRpZ2l0cy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5X0R1bXBIZXhhZGVjaW1hbCgKKyAgICBpbnQgZmQsCisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKyAgICBQeV9zc2l6ZV90IHdpZHRoKTsKKworI2VuZGlmICAgLyogIVB5X0xJTUlURURfQVBJICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmggYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAppbmRleCAwMTI4ZDdmLi4zZDc0MzFkIDEwMDY0NAotLS0gYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAorKysgYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaApAQCAtOTAwLDcgKzkwMCw3IEBACiAgICAgLyogbWluaW11bSBjaGFyYWN0ZXIgKGRlZmF1bHQ6IDEyNywgQVNDSUkpICovCiAgICAgUHlfVUNTNCBtaW5fY2hhcjsKIAotICAgIC8qIElmIG5vbi16ZXJvLCBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciBieSAyNSUgKGRlZmF1bHQ6IDApLiAqLworICAgIC8qIElmIG5vbi16ZXJvLCBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciAoZGVmYXVsdDogMCkuICovCiAgICAgdW5zaWduZWQgY2hhciBvdmVyYWxsb2NhdGU7CiAKICAgICAvKiBJZiByZWFkb25seSBpcyAxLCBidWZmZXIgaXMgYSBzaGFyZWQgc3RyaW5nIChjYW5ub3QgYmUgbW9kaWZpZWQpCkBAIC05MzQsNiArOTM0LDIzIEBACiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfVUNTNCBtYXhjaGFyKTsKIAorLyogUHJlcGFyZSB0aGUgYnVmZmVyIHRvIGhhdmUgYXQgbGVhc3QgdGhlIGtpbmQgS0lORC4KKyAgIEZvciBleGFtcGxlLCBraW5kPVB5VW5pY29kZV8yQllURV9LSU5EIGVuc3VyZXMgdGhhdCB0aGUgd3JpdGVyIHdpbGwKKyAgIHN1cHBvcnQgY2hhcmFjdGVycyBpbiByYW5nZSBVKzAwMC1VK0ZGRkYuCisKKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLworI2RlZmluZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKFdSSVRFUiwgS0lORCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYXNzZXJ0KChLSU5EKSAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChLSU5EKSA8PSAoV1JJVEVSKS0+a2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA/IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoKFdSSVRFUiksIChLSU5EKSkpCisKKy8qIERvbid0IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgdXNlIHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkKKyAgIG1hY3JvIGluc3RlYWQuICovCitQeUFQSV9GVU5DKGludCkKK19QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kKTsKKwogLyogQXBwZW5kIGEgVW5pY29kZSBjaGFyYWN0ZXIuCiAgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KIFB5QVBJX0ZVTkMoaW50KQpAQCAtMTkzOCw2ICsxOTU1LDE0IEBACiAgICAgUHlPYmplY3QgKnNlcSAgICAgICAgICAgICAgIC8qIFNlcXVlbmNlIG9iamVjdCAqLwogICAgICk7CiAKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VW5pY29kZV9Kb2luQXJyYXkoCisgICAgUHlPYmplY3QgKnNlcGFyYXRvciwKKyAgICBQeU9iamVjdCAqKml0ZW1zLAorICAgIFB5X3NzaXplX3Qgc2VxbGVuCisgICAgKTsKKyNlbmRpZiAvKiBQeV9MSU1JVEVEX0FQSSAqLworCiAvKiBSZXR1cm4gMSBpZiBzdWJzdHIgbWF0Y2hlcyBzdHJbc3RhcnQ6ZW5kXSBhdCB0aGUgZ2l2ZW4gdGFpbCBlbmQsIDAKICAgIG90aGVyd2lzZS4gKi8KIApAQCAtMjI1Myw2ICsyMjc4LDEwIEBACiAvKiBDbGVhciBhbGwgc3RhdGljIHN0cmluZ3MuICovCiBQeUFQSV9GVU5DKHZvaWQpIF9QeVVuaWNvZGVfQ2xlYXJTdGF0aWNTdHJpbmdzKHZvaWQpOwogCisvKiBGYXN0IGVxdWFsaXR5IGNoZWNrIHdoZW4gdGhlIGlucHV0cyBhcmUga25vd24gdG8gYmUgZXhhY3QgdW5pY29kZSB0eXBlcworICAgYW5kIHdoZXJlIHRoZSBoYXNoIHZhbHVlcyBhcmUgZXF1YWwgKGkuZS4gYSB2ZXJ5IHByb2JhYmxlIG1hdGNoKSAqLworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfRVEoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9JbmNsdWRlL3dhcm5pbmdzLmggYi9JbmNsdWRlL3dhcm5pbmdzLmgKaW5kZXggZWZmYjlmYWQuLmMxYzY5OTIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvd2FybmluZ3MuaAorKysgYi9JbmNsdWRlL3dhcm5pbmdzLmgKQEAgLTE3LDYgKzE3LDEzIEBACiAgICAgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKICAgICBjb25zdCBjaGFyICpmb3JtYXQsICAgICAgICAgLyogQVNDSUktZW5jb2RlZCBzdHJpbmcgICovCiAgICAgLi4uKTsKKworLyogRW1pdCBhIFJlc291cmNlV2FybmluZyB3YXJuaW5nICovCitQeUFQSV9GVU5DKGludCkgUHlFcnJfUmVzb3VyY2VXYXJuaW5nKAorICAgIFB5T2JqZWN0ICpzb3VyY2UsCisgICAgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKKyAgICBjb25zdCBjaGFyICpmb3JtYXQsICAgICAgICAgLyogQVNDSUktZW5jb2RlZCBzdHJpbmcgICovCisgICAgLi4uKTsKICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKIFB5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuRXhwbGljaXRPYmplY3QoCiAgICAgUHlPYmplY3QgKmNhdGVnb3J5LApkaWZmIC0tZ2l0IGEvTGliL19jb2xsZWN0aW9uc19hYmMucHkgYi9MaWIvX2NvbGxlY3Rpb25zX2FiYy5weQppbmRleCBmYzljOWYxLi5mMDM1OTcwIDEwMDY0NAotLS0gYS9MaWIvX2NvbGxlY3Rpb25zX2FiYy5weQorKysgYi9MaWIvX2NvbGxlY3Rpb25zX2FiYy5weQpAQCAtMTAsOCArMTAsOCBAQAogaW1wb3J0IHN5cwogCiBfX2FsbF9fID0gWyJBd2FpdGFibGUiLCAiQ29yb3V0aW5lIiwgIkFzeW5jSXRlcmFibGUiLCAiQXN5bmNJdGVyYXRvciIsCi0gICAgICAgICAgICJIYXNoYWJsZSIsICJJdGVyYWJsZSIsICJJdGVyYXRvciIsICJHZW5lcmF0b3IiLAotICAgICAgICAgICAiU2l6ZWQiLCAiQ29udGFpbmVyIiwgIkNhbGxhYmxlIiwKKyAgICAgICAgICAgIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwgIkdlbmVyYXRvciIsICJSZXZlcnNpYmxlIiwKKyAgICAgICAgICAgIlNpemVkIiwgIkNvbnRhaW5lciIsICJDYWxsYWJsZSIsICJDb2xsZWN0aW9uIiwKICAgICAgICAgICAgIlNldCIsICJNdXRhYmxlU2V0IiwKICAgICAgICAgICAgIk1hcHBpbmciLCAiTXV0YWJsZU1hcHBpbmciLAogICAgICAgICAgICAiTWFwcGluZ1ZpZXciLCAiS2V5c1ZpZXciLCAiSXRlbXNWaWV3IiwgIlZhbHVlc1ZpZXciLApAQCAtNjIsNiArNjIsMTggQEAKIAogIyMjIE9ORS1UUklDSyBQT05JRVMgIyMjCiAKK2RlZiBfY2hlY2tfbWV0aG9kcyhDLCAqbWV0aG9kcyk6CisgICAgbXJvID0gQy5fX21yb19fCisgICAgZm9yIG1ldGhvZCBpbiBtZXRob2RzOgorICAgICAgICBmb3IgQiBpbiBtcm86CisgICAgICAgICAgICBpZiBtZXRob2QgaW4gQi5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBpZiBCLl9fZGljdF9fW21ldGhvZF0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgIHJldHVybiBUcnVlCisKIGNsYXNzIEhhc2hhYmxlKG1ldGFjbGFzcz1BQkNNZXRhKToKIAogICAgIF9fc2xvdHNfXyA9ICgpCkBAIC03MywxMSArODUsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBIYXNoYWJsZToKLSAgICAgICAgICAgIGZvciBCIGluIEMuX19tcm9fXzoKLSAgICAgICAgICAgICAgICBpZiAiX19oYXNoX18iIGluIEIuX19kaWN0X186Ci0gICAgICAgICAgICAgICAgICAgIGlmIEIuX19kaWN0X19bIl9faGFzaF9fIl06Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX2hhc2hfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTkyLDExICsxMDAsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBBd2FpdGFibGU6Ci0gICAgICAgICAgICBmb3IgQiBpbiBDLl9fbXJvX186Ci0gICAgICAgICAgICAgICAgaWYgIl9fYXdhaXRfXyIgaW4gQi5fX2RpY3RfXzoKLSAgICAgICAgICAgICAgICAgICAgaWYgQi5fX2RpY3RfX1siX19hd2FpdF9fIl06Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX2F3YWl0X18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCkBAIC0xMzcsMTQgKzE0MSw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKICAgICAgICAgaWYgY2xzIGlzIENvcm91dGluZToKLSAgICAgICAgICAgIG1ybyA9IEMuX19tcm9fXwotICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiAoJ19fYXdhaXRfXycsICdzZW5kJywgJ3Rocm93JywgJ2Nsb3NlJyk6Ci0gICAgICAgICAgICAgICAgZm9yIGJhc2UgaW4gbXJvOgotICAgICAgICAgICAgICAgICAgICBpZiBtZXRob2QgaW4gYmFzZS5fX2RpY3RfXzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCi0gICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICdfX2F3YWl0X18nLCAnc2VuZCcsICd0aHJvdycsICdjbG9zZScpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKQEAgLTE2Miw4ICsxNTksNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBBc3luY0l0ZXJhYmxlOgotICAgICAgICAgICAgaWYgYW55KCJfX2FpdGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKToKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICJfX2FpdGVyX18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCkBAIC0xODIsOSArMTc4LDcgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgogICAgICAgICBpZiBjbHMgaXMgQXN5bmNJdGVyYXRvcjoKLSAgICAgICAgICAgIGlmIChhbnkoIl9fYW5leHRfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pIGFuZAotICAgICAgICAgICAgICAgIGFueSgiX19haXRlcl9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykpOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9fYW5leHRfXyIsICJfX2FpdGVyX18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCkBAIC0yMDAsOCArMTk0LDcgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgogICAgICAgICBpZiBjbHMgaXMgSXRlcmFibGU6Ci0gICAgICAgICAgICBpZiBhbnkoIl9faXRlcl9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19pdGVyX18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCkBAIC0yMjAsOSArMjEzLDcgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgogICAgICAgICBpZiBjbHMgaXMgSXRlcmF0b3I6Ci0gICAgICAgICAgICBpZiAoYW55KCJfX25leHRfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pIGFuZAotICAgICAgICAgICAgICAgIGFueSgiX19pdGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAnX19pdGVyX18nLCAnX19uZXh0X18nKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogSXRlcmF0b3IucmVnaXN0ZXIoYnl0ZXNfaXRlcmF0b3IpCkBAIC0yNDAsNiArMjMxLDIyIEBACiBJdGVyYXRvci5yZWdpc3Rlcih6aXBfaXRlcmF0b3IpCiAKIAorY2xhc3MgUmV2ZXJzaWJsZShJdGVyYWJsZSk6CisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgd2hpbGUgRmFsc2U6CisgICAgICAgICAgICB5aWVsZCBOb25lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgUmV2ZXJzaWJsZToKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19yZXZlcnNlZF9fIiwgIl9faXRlcl9fIikKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKwogY2xhc3MgR2VuZXJhdG9yKEl0ZXJhdG9yKToKIAogICAgIF9fc2xvdHNfXyA9ICgpCkBAIC0yODMsMTcgKzI5MCwxMCBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBHZW5lcmF0b3I6Ci0gICAgICAgICAgICBtcm8gPSBDLl9fbXJvX18KLSAgICAgICAgICAgIGZvciBtZXRob2QgaW4gKCdfX2l0ZXJfXycsICdfX25leHRfXycsICdzZW5kJywgJ3Rocm93JywgJ2Nsb3NlJyk6Ci0gICAgICAgICAgICAgICAgZm9yIGJhc2UgaW4gbXJvOgotICAgICAgICAgICAgICAgICAgICBpZiBtZXRob2QgaW4gYmFzZS5fX2RpY3RfXzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCi0gICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIF9jaGVja19tZXRob2RzKEMsICdfX2l0ZXJfXycsICdfX25leHRfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmQnLCAndGhyb3cnLCAnY2xvc2UnKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAotCiBHZW5lcmF0b3IucmVnaXN0ZXIoZ2VuZXJhdG9yKQogCiAKQEAgLTMwOCw4ICszMDgsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBTaXplZDoKLSAgICAgICAgICAgIGlmIGFueSgiX19sZW5fXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9fbGVuX18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCkBAIC0zMjQsMTAgKzMyMywxOCBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CiAgICAgICAgIGlmIGNscyBpcyBDb250YWluZXI6Ci0gICAgICAgICAgICBpZiBhbnkoIl9fY29udGFpbnNfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gX2NoZWNrX21ldGhvZHMoQywgIl9fY29udGFpbnNfXyIpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCitjbGFzcyBDb2xsZWN0aW9uKFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgQ29sbGVjdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAgIl9fbGVuX18iLCAiX19pdGVyX18iLCAiX19jb250YWluc19fIikKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKIGNsYXNzIENhbGxhYmxlKG1ldGFjbGFzcz1BQkNNZXRhKToKIApAQCAtMzQwLDE1ICszNDcsMTQgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgogICAgICAgICBpZiBjbHMgaXMgQ2FsbGFibGU6Ci0gICAgICAgICAgICBpZiBhbnkoIl9fY2FsbF9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBfY2hlY2tfbWV0aG9kcyhDLCAiX19jYWxsX18iKQogICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCiAjIyMgU0VUUyAjIyMKIAogCi1jbGFzcyBTZXQoU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgorY2xhc3MgU2V0KENvbGxlY3Rpb24pOgogCiAgICAgIiIiQSBzZXQgaXMgYSBmaW5pdGUsIGl0ZXJhYmxlIGNvbnRhaW5lci4KIApAQCAtNTczLDcgKzU3OSw3IEBACiAjIyMgTUFQUElOR1MgIyMjCiAKIAotY2xhc3MgTWFwcGluZyhTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CitjbGFzcyBNYXBwaW5nKENvbGxlY3Rpb24pOgogCiAgICAgX19zbG90c19fID0gKCkKIApAQCAtNjIxLDYgKzYyNyw4IEBACiAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZi5pdGVtcygpKSA9PSBkaWN0KG90aGVyLml0ZW1zKCkpCiAKKyAgICBfX3JldmVyc2VkX18gPSBOb25lCisKIE1hcHBpbmcucmVnaXN0ZXIobWFwcGluZ3Byb3h5KQogCiAKQEAgLTY3MCw3ICs2NzgsNyBAQAogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiB2ID09IHZhbHVlCisgICAgICAgICAgICByZXR1cm4gdiBpcyB2YWx1ZSBvciB2ID09IHZhbHVlCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fbWFwcGluZzoKQEAgLTY4NSw3ICs2OTMsOCBAQAogCiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fbWFwcGluZzoKLSAgICAgICAgICAgIGlmIHZhbHVlID09IHNlbGYuX21hcHBpbmdba2V5XToKKyAgICAgICAgICAgIHYgPSBzZWxmLl9tYXBwaW5nW2tleV0KKyAgICAgICAgICAgIGlmIHYgaXMgdmFsdWUgb3IgdiA9PSB2YWx1ZToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKIApAQCAtNzk0LDcgKzgwMyw3IEBACiAjIyMgU0VRVUVOQ0VTICMjIwogCiAKLWNsYXNzIFNlcXVlbmNlKFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKK2NsYXNzIFNlcXVlbmNlKFJldmVyc2libGUsIENvbGxlY3Rpb24pOgogCiAgICAgIiIiQWxsIHRoZSBvcGVyYXRpb25zIG9uIGEgcmVhZC1vbmx5IHNlcXVlbmNlLgogCkBAIC04MjAsNyArODI5LDcgQEAKIAogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgogICAgICAgICBmb3IgdiBpbiBzZWxmOgotICAgICAgICAgICAgaWYgdiA9PSB2YWx1ZToKKyAgICAgICAgICAgIGlmIHYgaXMgdmFsdWUgb3IgdiA9PSB2YWx1ZToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKIApkaWZmIC0tZ2l0IGEvTGliL19weWRlY2ltYWwucHkgYi9MaWIvX3B5ZGVjaW1hbC5weQppbmRleCA5MDBhMWE3Li4yMWU4NzVjIDEwMDY0NAotLS0gYS9MaWIvX3B5ZGVjaW1hbC5weQorKysgYi9MaWIvX3B5ZGVjaW1hbC5weQpAQCAtMTQ4LDcgKzE0OCw3IEBACiBfX25hbWVfXyA9ICdkZWNpbWFsJyAgICAjIEZvciBwaWNrbGluZwogX192ZXJzaW9uX18gPSAnMS43MCcgICAgIyBIaWdoZXN0IHZlcnNpb24gb2YgdGhlIHNwZWMgdGhpcyBjb21wbGllcyB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAjIFNlZSBodHRwOi8vc3BlbGVvdHJvdmUuY29tL2RlY2ltYWwvCi1fX2xpYm1wZGVjX3ZlcnNpb25fXyA9ICIyLjQuMSIgIyBjb21wYXRpYmxlIGxpYm1wZGVjIHZlcnNpb24KK19fbGlibXBkZWNfdmVyc2lvbl9fID0gIjIuNC4yIiAjIGNvbXBhdGlibGUgbGlibXBkZWMgdmVyc2lvbgogCiBpbXBvcnQgbWF0aCBhcyBfbWF0aAogaW1wb3J0IG51bWJlcnMgYXMgX251bWJlcnMKQEAgLTEwMTAsNiArMTAxMCw1NiBAQAogICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIERlY2ltYWxUdXBsZShzZWxmLl9zaWduLCB0dXBsZShtYXAoaW50LCBzZWxmLl9pbnQpKSwgc2VsZi5fZXhwKQogCisgICAgZGVmIGFzX2ludGVnZXJfcmF0aW8oc2VsZik6CisgICAgICAgICIiIkV4cHJlc3MgYSBmaW5pdGUgRGVjaW1hbCBpbnN0YW5jZSBpbiB0aGUgZm9ybSBuIC8gZC4KKworICAgICAgICBSZXR1cm5zIGEgcGFpciAobiwgZCkgb2YgaW50ZWdlcnMuICBXaGVuIGNhbGxlZCBvbiBhbiBpbmZpbml0eQorICAgICAgICBvciBOYU4sIHJhaXNlcyBPdmVyZmxvd0Vycm9yIG9yIFZhbHVlRXJyb3IgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgID4+PiBEZWNpbWFsKCczLjE0JykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgxNTcsIDUwKQorICAgICAgICA+Pj4gRGVjaW1hbCgnLTEyM2U1JykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgtMTIzMDAwMDAsIDEpCisgICAgICAgID4+PiBEZWNpbWFsKCcwLjAwJykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgwLCAxKQorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5pc19uYW4oKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iKQorCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIDAsIDEKKworICAgICAgICAjIEZpbmQgbiwgZCBpbiBsb3dlc3QgdGVybXMgc3VjaCB0aGF0IGFicyhzZWxmKSA9PSBuIC8gZDsKKyAgICAgICAgIyB3ZSdsbCBkZWFsIHdpdGggdGhlIHNpZ24gbGF0ZXIuCisgICAgICAgIG4gPSBpbnQoc2VsZi5faW50KQorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgICMgc2VsZiBpcyBhbiBpbnRlZ2VyLgorICAgICAgICAgICAgbiwgZCA9IG4gKiAxMCoqc2VsZi5fZXhwLCAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEZpbmQgZDIsIGQ1IHN1Y2ggdGhhdCBhYnMoc2VsZikgPSBuIC8gKDIqKmQyICogNSoqZDUpLgorICAgICAgICAgICAgZDUgPSAtc2VsZi5fZXhwCisgICAgICAgICAgICB3aGlsZSBkNSA+IDAgYW5kIG4gJSA1ID09IDA6CisgICAgICAgICAgICAgICAgbiAvLz0gNQorICAgICAgICAgICAgICAgIGQ1IC09IDEKKworICAgICAgICAgICAgIyAobiAmIC1uKS5iaXRfbGVuZ3RoKCkgLSAxIGNvdW50cyB0cmFpbGluZyB6ZXJvcyBpbiBiaW5hcnkKKyAgICAgICAgICAgICMgcmVwcmVzZW50YXRpb24gb2YgbiAocHJvdmlkZWQgbiBpcyBub256ZXJvKS4KKyAgICAgICAgICAgIGQyID0gLXNlbGYuX2V4cAorICAgICAgICAgICAgc2hpZnQyID0gbWluKChuICYgLW4pLmJpdF9sZW5ndGgoKSAtIDEsIGQyKQorICAgICAgICAgICAgaWYgc2hpZnQyOgorICAgICAgICAgICAgICAgIG4gPj49IHNoaWZ0MgorICAgICAgICAgICAgICAgIGQyIC09IHNoaWZ0MgorCisgICAgICAgICAgICBkID0gNSoqZDUgPDwgZDIKKworICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgbiA9IC1uCisgICAgICAgIHJldHVybiBuLCBkCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICIiIlJlcHJlc2VudHMgdGhlIG51bWJlciBhcyBhbiBpbnN0YW5jZSBvZiBEZWNpbWFsLiIiIgogICAgICAgICAjIEludmFyaWFudDogIGV2YWwocmVwcihkKSkgPT0gZApkaWZmIC0tZ2l0IGEvTGliL19weWlvLnB5IGIvTGliL19weWlvLnB5CmluZGV4IDBkOThiNzQuLmQwOTQ3ZjAgMTAwNjQ0Ci0tLSBhL0xpYi9fcHlpby5weQorKysgYi9MaWIvX3B5aW8ucHkKQEAgLTYsNyArNiw2IEBACiBpbXBvcnQgYWJjCiBpbXBvcnQgY29kZWNzCiBpbXBvcnQgZXJybm8KLWltcG9ydCBhcnJheQogaW1wb3J0IHN0YXQKIGltcG9ydCBzeXMKICMgSW1wb3J0IF90aHJlYWQgaW5zdGVhZCBvZiB0aHJlYWRpbmcgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdApAQCAtMTYxLDYgKzE2MCw4IEBACiAgICAgb3BlbmVkIGluIGEgdGV4dCBtb2RlLCBhbmQgZm9yIGJ5dGVzIGEgQnl0ZXNJTyBjYW4gYmUgdXNlZCBsaWtlIGEgZmlsZQogICAgIG9wZW5lZCBpbiBhIGJpbmFyeSBtb2RlLgogICAgICIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpbGUsIGludCk6CisgICAgICAgIGZpbGUgPSBvcy5mc3BhdGgoZmlsZSkKICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlLCAoc3RyLCBieXRlcywgaW50KSk6CiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBmaWxlOiAlciIgJSBmaWxlKQogICAgIGlmIG5vdCBpc2luc3RhbmNlKG1vZGUsIHN0cik6CkBAIC0xODIsOCArMTgzLDggQEAKICAgICB0ZXh0ID0gInQiIGluIG1vZGVzCiAgICAgYmluYXJ5ID0gImIiIGluIG1vZGVzCiAgICAgaWYgIlUiIGluIG1vZGVzOgotICAgICAgICBpZiBjcmVhdGluZyBvciB3cml0aW5nIG9yIGFwcGVuZGluZzoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbid0IHVzZSBVIGFuZCB3cml0aW5nIG1vZGUgYXQgb25jZSIpCisgICAgICAgIGlmIGNyZWF0aW5nIG9yIHdyaXRpbmcgb3IgYXBwZW5kaW5nIG9yIHVwZGF0aW5nOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBVIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoICd4JywgJ3cnLCAnYScsIG9yICcrJyIpCiAgICAgICAgIGltcG9ydCB3YXJuaW5ncwogICAgICAgICB3YXJuaW5ncy53YXJuKCInVScgbW9kZSBpcyBkZXByZWNhdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCkBAIC0xNTE2LDcgKzE1MTcsNyBAQAogICAgICAgICBpZiBzZWxmLl9mZCA+PSAwIGFuZCBzZWxmLl9jbG9zZWZkIGFuZCBub3Qgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ3VuY2xvc2VkIGZpbGUgJXInICUgKHNlbGYsKSwgUmVzb3VyY2VXYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9Miwgc291cmNlPXNlbGYpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvX3N0cnB0aW1lLnB5IGIvTGliL19zdHJwdGltZS5weQppbmRleCBmODQyMjdiLi5mZTk0MzYxIDEwMDY0NAotLS0gYS9MaWIvX3N0cnB0aW1lLnB5CisrKyBiL0xpYi9fc3RycHRpbWUucHkKQEAgLTE5OSwxMiArMTk5LDE1IEBACiAgICAgICAgICAgICAnZic6IHIiKD9QPGY+WzAtOV17MSw2fSkiLAogICAgICAgICAgICAgJ0gnOiByIig/UDxIPjJbMC0zXXxbMC0xXVxkfFxkKSIsCiAgICAgICAgICAgICAnSSc6IHIiKD9QPEk+MVswLTJdfDBbMS05XXxbMS05XSkiLAorICAgICAgICAgICAgJ0cnOiByIig/UDxHPlxkXGRcZFxkKSIsCiAgICAgICAgICAgICAnaic6IHIiKD9QPGo+MzZbMC02XXwzWzAtNV1cZHxbMS0yXVxkXGR8MFsxLTldXGR8MDBbMS05XXxbMS05XVxkfDBbMS05XXxbMS05XSkiLAogICAgICAgICAgICAgJ20nOiByIig/UDxtPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKICAgICAgICAgICAgICdNJzogciIoP1A8TT5bMC01XVxkfFxkKSIsCiAgICAgICAgICAgICAnUyc6IHIiKD9QPFM+NlswLTFdfFswLTVdXGR8XGQpIiwKICAgICAgICAgICAgICdVJzogciIoP1A8VT41WzAtM118WzAtNF1cZHxcZCkiLAogICAgICAgICAgICAgJ3cnOiByIig/UDx3PlswLTZdKSIsCisgICAgICAgICAgICAndSc6IHIiKD9QPHU+WzEtN10pIiwKKyAgICAgICAgICAgICdWJzogciIoP1A8Vj41WzAtM118MFsxLTldfFsxLTRdXGR8XGQpIiwKICAgICAgICAgICAgICMgVyBpcyBzZXQgYmVsb3cgYnkgdXNpbmcgJ1UnCiAgICAgICAgICAgICAneSc6IHIiKD9QPHk+XGRcZCkiLAogICAgICAgICAgICAgI1hYWDogRG9lcyAnWScgbmVlZCB0byB3b3JyeSBhYm91dCBoYXZpbmcgbGVzcyBvciBtb3JlIHRoYW4KQEAgLTI5OSw2ICszMDIsMjIgQEAKICAgICAgICAgcmV0dXJuIDEgKyBkYXlzX3RvX3dlZWsgKyBkYXlfb2Zfd2VlawogCiAKK2RlZiBfY2FsY19qdWxpYW5fZnJvbV9WKGlzb195ZWFyLCBpc29fd2VlaywgaXNvX3dlZWtkYXkpOgorICAgICIiIkNhbGN1bGF0ZSB0aGUgSnVsaWFuIGRheSBiYXNlZCBvbiB0aGUgSVNPIDg2MDEgeWVhciwgd2VlaywgYW5kIHdlZWtkYXkuCisgICAgSVNPIHdlZWtzIHN0YXJ0IG9uIE1vbmRheXMsIHdpdGggd2VlayAwMSBiZWluZyB0aGUgd2VlayBjb250YWluaW5nIDQgSmFuLgorICAgIElTTyB3ZWVrIGRheXMgcmFuZ2UgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuCisgICAgIiIiCisgICAgY29ycmVjdGlvbiA9IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDQpLmlzb3dlZWtkYXkoKSArIDMKKyAgICBvcmRpbmFsID0gKGlzb193ZWVrICogNykgKyBpc29fd2Vla2RheSAtIGNvcnJlY3Rpb24KKyAgICAjIG9yZGluYWwgbWF5IGJlIG5lZ2F0aXZlIG9yIDAgbm93LCB3aGljaCBtZWFucyB0aGUgZGF0ZSBpcyBpbiB0aGUgcHJldmlvdXMKKyAgICAjIGNhbGVuZGFyIHllYXIKKyAgICBpZiBvcmRpbmFsIDwgMToKKyAgICAgICAgb3JkaW5hbCArPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCAxKS50b29yZGluYWwoKQorICAgICAgICBpc29feWVhciAtPSAxCisgICAgICAgIG9yZGluYWwgLT0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgMSkudG9vcmRpbmFsKCkKKyAgICByZXR1cm4gaXNvX3llYXIsIG9yZGluYWwKKworCiBkZWYgX3N0cnB0aW1lKGRhdGFfc3RyaW5nLCBmb3JtYXQ9IiVhICViICVkICVIOiVNOiVTICVZIik6CiAgICAgIiIiUmV0dXJuIGEgMi10dXBsZSBjb25zaXN0aW5nIG9mIGEgdGltZSBzdHJ1Y3QgYW5kIGFuIGludCBjb250YWluaW5nCiAgICAgdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZyBhbmQgdGhlCkBAIC0zNDUsMTUgKzM2NCwxNSBAQAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmNvbnZlcnRlZCBkYXRhIHJlbWFpbnM6ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc3RyaW5nW2ZvdW5kLmVuZCgpOl0pCiAKLSAgICB5ZWFyID0gTm9uZQorICAgIGlzb195ZWFyID0geWVhciA9IE5vbmUKICAgICBtb250aCA9IGRheSA9IDEKICAgICBob3VyID0gbWludXRlID0gc2Vjb25kID0gZnJhY3Rpb24gPSAwCiAgICAgdHogPSAtMQogICAgIHR6b2Zmc2V0ID0gTm9uZQogICAgICMgRGVmYXVsdCB0byAtMSB0byBzaWduaWZ5IHRoYXQgdmFsdWVzIG5vdCBrbm93bjsgbm90IGNyaXRpY2FsIHRvIGhhdmUsCiAgICAgIyB0aG91Z2gKLSAgICB3ZWVrX29mX3llYXIgPSAtMQotICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IC0xCisgICAgaXNvX3dlZWsgPSB3ZWVrX29mX3llYXIgPSBOb25lCisgICAgd2Vla19vZl95ZWFyX3N0YXJ0ID0gTm9uZQogICAgICMgd2Vla2RheSBhbmQganVsaWFuIGRlZmF1bHRlZCB0byBOb25lIHNvIGFzIHRvIHNpZ25hbCBuZWVkIHRvIGNhbGN1bGF0ZQogICAgICMgdmFsdWVzCiAgICAgd2Vla2RheSA9IGp1bGlhbiA9IE5vbmUKQEAgLTM3NSw2ICszOTQsOCBAQAogICAgICAgICAgICAgICAgIHllYXIgKz0gMTkwMAogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnWSc6CiAgICAgICAgICAgICB5ZWFyID0gaW50KGZvdW5kX2RpY3RbJ1knXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ0cnOgorICAgICAgICAgICAgaXNvX3llYXIgPSBpbnQoZm91bmRfZGljdFsnRyddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnbSc6CiAgICAgICAgICAgICBtb250aCA9IGludChmb3VuZF9kaWN0WydtJ10pCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdCJzoKQEAgLTQyMCw2ICs0NDEsOSBAQAogICAgICAgICAgICAgICAgIHdlZWtkYXkgPSA2CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHdlZWtkYXkgLT0gMQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAndSc6CisgICAgICAgICAgICB3ZWVrZGF5ID0gaW50KGZvdW5kX2RpY3RbJ3UnXSkKKyAgICAgICAgICAgIHdlZWtkYXkgLT0gMQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnaic6CiAgICAgICAgICAgICBqdWxpYW4gPSBpbnQoZm91bmRfZGljdFsnaiddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSBpbiAoJ1UnLCAnVycpOgpAQCAtNDMwLDYgKzQ1NCw4IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgVyBzdGFydHMgd2VlayBvbiBNb25kYXkuCiAgICAgICAgICAgICAgICAgd2Vla19vZl95ZWFyX3N0YXJ0ID0gMAorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnVic6CisgICAgICAgICAgICBpc29fd2VlayA9IGludChmb3VuZF9kaWN0WydWJ10pCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICd6JzoKICAgICAgICAgICAgIHogPSBmb3VuZF9kaWN0Wyd6J10KICAgICAgICAgICAgIHR6b2Zmc2V0ID0gaW50KHpbMTozXSkgKiA2MCArIGludCh6WzM6NV0pCkBAIC00NTAsMzIgKzQ3Niw2MSBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgdHogPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAjIERlYWwgd2l0aCB0aGUgY2FzZXMgd2hlcmUgYW1iaWd1aXRpZXMgYXJpemUKKyAgICAjIGRvbid0IGFzc3VtZSBkZWZhdWx0IHZhbHVlcyBmb3IgSVNPIHdlZWsveWVhcgorICAgIGlmIHllYXIgaXMgTm9uZSBhbmQgaXNvX3llYXIgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGlzb193ZWVrIGlzIE5vbmUgb3Igd2Vla2RheSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHllYXIgZGlyZWN0aXZlICclRycgbXVzdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIElTTyB3ZWVrIGRpcmVjdGl2ZSAnJVYnIGFuZCBhIHdlZWtkYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlICgnJUEnLCAnJWEnLCAnJXcnLCBvciAnJXUnKS4iKQorICAgICAgICBpZiBqdWxpYW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEYXkgb2YgdGhlIHllYXIgZGlyZWN0aXZlICclaicgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhdGlibGUgd2l0aCBJU08geWVhciBkaXJlY3RpdmUgJyVHJy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlICclWScgaW5zdGVhZC4iKQorICAgIGVsaWYgd2Vla19vZl95ZWFyIGlzIE5vbmUgYW5kIGlzb193ZWVrIGlzIG5vdCBOb25lOgorICAgICAgICBpZiB3ZWVrZGF5IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBtdXN0IGJlIHVzZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgSVNPIHllYXIgZGlyZWN0aXZlICclRycgYW5kIGEgd2Vla2RheSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgKCclQScsICclYScsICcldycsIG9yICcldScpLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBpcyBpbmNvbXBhdGlibGUgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgeWVhciBkaXJlY3RpdmUgJyVZJy4gVXNlIHRoZSBJU08geWVhciAnJUcnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQuIikKKwogICAgIGxlYXBfeWVhcl9maXggPSBGYWxzZQogICAgIGlmIHllYXIgaXMgTm9uZSBhbmQgbW9udGggPT0gMiBhbmQgZGF5ID09IDI5OgogICAgICAgICB5ZWFyID0gMTkwNCAgIyAxOTA0IGlzIGZpcnN0IGxlYXAgeWVhciBvZiAyMHRoIGNlbnR1cnkKICAgICAgICAgbGVhcF95ZWFyX2ZpeCA9IFRydWUKICAgICBlbGlmIHllYXIgaXMgTm9uZToKICAgICAgICAgeWVhciA9IDE5MDAKKworCiAgICAgIyBJZiB3ZSBrbm93IHRoZSB3ZWVrIG9mIHRoZSB5ZWFyIGFuZCB3aGF0IGRheSBvZiB0aGF0IHdlZWssIHdlIGNhbiBmaWd1cmUKICAgICAjIG91dCB0aGUgSnVsaWFuIGRheSBvZiB0aGUgeWVhci4KLSAgICBpZiBqdWxpYW4gaXMgTm9uZSBhbmQgd2Vla19vZl95ZWFyICE9IC0xIGFuZCB3ZWVrZGF5IGlzIG5vdCBOb25lOgotICAgICAgICB3ZWVrX3N0YXJ0c19Nb24gPSBUcnVlIGlmIHdlZWtfb2ZfeWVhcl9zdGFydCA9PSAwIGVsc2UgRmFsc2UKLSAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uKQotICAgICAgICBpZiBqdWxpYW4gPD0gMDoKKyAgICBpZiBqdWxpYW4gaXMgTm9uZSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla19vZl95ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCisgICAgICAgICAgICBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9VX29yX1coeWVhciwgd2Vla19vZl95ZWFyLCB3ZWVrZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uKQorICAgICAgICBlbGlmIGlzb195ZWFyIGlzIG5vdCBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHllYXIsIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1YoaXNvX3llYXIsIGlzb193ZWVrLCB3ZWVrZGF5ICsgMSkKKyAgICAgICAgaWYganVsaWFuIGlzIG5vdCBOb25lIGFuZCBqdWxpYW4gPD0gMDoKICAgICAgICAgICAgIHllYXIgLT0gMQogICAgICAgICAgICAgeWRheSA9IDM2NiBpZiBjYWxlbmRhci5pc2xlYXAoeWVhcikgZWxzZSAzNjUKICAgICAgICAgICAgIGp1bGlhbiArPSB5ZGF5Ci0gICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KLSAgICAjIGNhbGN1bGF0aW9uIGFuZCB0aHVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrCi0gICAgIyBjYWxjdWxhdGlvbi4KKwogICAgIGlmIGp1bGlhbiBpcyBOb25lOgorICAgICAgICAjIENhbm5vdCBwcmUtY2FsY3VsYXRlIGRhdGV0aW1lX2RhdGUoKSBzaW5jZSBjYW4gY2hhbmdlIGluIEp1bGlhbgorICAgICAgICAjIGNhbGN1bGF0aW9uIGFuZCB0aHVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgZGF5IG9mCisgICAgICAgICMgdGhlIHdlZWsgY2FsY3VsYXRpb24uCiAgICAgICAgICMgTmVlZCB0byBhZGQgMSB0byByZXN1bHQgc2luY2UgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGlzIDEsIG5vdCAwLgogICAgICAgICBqdWxpYW4gPSBkYXRldGltZV9kYXRlKHllYXIsIG1vbnRoLCBkYXkpLnRvb3JkaW5hbCgpIC0gXAogICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSArIDEKLSAgICBlbHNlOiAgIyBBc3N1bWUgdGhhdCBpZiB0aGV5IGJvdGhlcmVkIHRvIGluY2x1ZGUgSnVsaWFuIGRheSBpdCB3aWxsCi0gICAgICAgICAgICMgYmUgYWNjdXJhdGUuCi0gICAgICAgIGRhdGV0aW1lX3Jlc3VsdCA9IGRhdGV0aW1lX2RhdGUuZnJvbW9yZGluYWwoKGp1bGlhbiAtIDEpICsgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSkKKyAgICBlbHNlOiAgIyBBc3N1bWUgdGhhdCBpZiB0aGV5IGJvdGhlcmVkIHRvIGluY2x1ZGUgSnVsaWFuIGRheSAob3IgaWYgaXQgd2FzCisgICAgICAgICAgICMgY2FsY3VsYXRlZCBhYm92ZSB3aXRoIHllYXIvd2Vlay93ZWVrZGF5KSBpdCB3aWxsIGJlIGFjY3VyYXRlLgorICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqdWxpYW4gLSAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSkKICAgICAgICAgeWVhciA9IGRhdGV0aW1lX3Jlc3VsdC55ZWFyCiAgICAgICAgIG1vbnRoID0gZGF0ZXRpbWVfcmVzdWx0Lm1vbnRoCiAgICAgICAgIGRheSA9IGRhdGV0aW1lX3Jlc3VsdC5kYXkKZGlmZiAtLWdpdCBhL0xpYi9haWZjLnB5IGIvTGliL2FpZmMucHkKaW5kZXggN2ViZGJlYi4uNjkyZDBiZiAxMDA2NDQKLS0tIGEvTGliL2FpZmMucHkKKysrIGIvTGliL2FpZmMucHkKQEAgLTI1Nyw2ICsyNTcsMTUgQEAKIF9haWZjX3BhcmFtcyA9IG5hbWVkdHVwbGUoJ19haWZjX3BhcmFtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICduY2hhbm5lbHMgc2FtcHdpZHRoIGZyYW1lcmF0ZSBuZnJhbWVzIGNvbXB0eXBlIGNvbXBuYW1lJykKIAorX2FpZmNfcGFyYW1zLm5jaGFubmVscy5fX2RvY19fID0gJ051bWJlciBvZiBhdWRpbyBjaGFubmVscyAoMSBmb3IgbW9ubywgMiBmb3Igc3RlcmVvKScKK19haWZjX3BhcmFtcy5zYW1wd2lkdGguX19kb2NfXyA9ICdTYW1wbGUgd2lkdGggaW4gYnl0ZXMnCitfYWlmY19wYXJhbXMuZnJhbWVyYXRlLl9fZG9jX18gPSAnU2FtcGxpbmcgZnJlcXVlbmN5JworX2FpZmNfcGFyYW1zLm5mcmFtZXMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gZnJhbWVzJworX2FpZmNfcGFyYW1zLmNvbXB0eXBlLl9fZG9jX18gPSAnQ29tcHJlc3Npb24gdHlwZSAoIk5PTkUiIGZvciBBSUZGIGZpbGVzKScKK19haWZjX3BhcmFtcy5jb21wbmFtZS5fX2RvY19fID0gKCIiIlwKK0EgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29tcHJlc3Npb24gdHlwZQorKCdub3QgY29tcHJlc3NlZCcgZm9yIEFJRkYgZmlsZXMpIiIiKQorCiAKIGNsYXNzIEFpZmNfcmVhZDoKICAgICAjIFZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY2xhc3M6CmRpZmYgLS1naXQgYS9MaWIvYXJncGFyc2UucHkgYi9MaWIvYXJncGFyc2UucHkKaW5kZXggOWEwNjcxOS4uMjA5YjRlOSAxMDA2NDQKLS0tIGEvTGliL2FyZ3BhcnNlLnB5CisrKyBiL0xpYi9hcmdwYXJzZS5weQpAQCAtMTE4LDEwICsxMTgsMTYgQEAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHR5cGVfbmFtZSA9IHR5cGUoc2VsZikuX19uYW1lX18KICAgICAgICAgYXJnX3N0cmluZ3MgPSBbXQorICAgICAgICBzdGFyX2FyZ3MgPSB7fQogICAgICAgICBmb3IgYXJnIGluIHNlbGYuX2dldF9hcmdzKCk6CiAgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQocmVwcihhcmcpKQogICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2VsZi5fZ2V0X2t3YXJncygpOgotICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgaWYgbmFtZS5pc2lkZW50aWZpZXIoKToKKyAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyVzPSVyJyAlIChuYW1lLCB2YWx1ZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJfYXJnc1tuYW1lXSA9IHZhbHVlCisgICAgICAgIGlmIHN0YXJfYXJnczoKKyAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnKiolcycgJSByZXByKHN0YXJfYXJncykpCiAgICAgICAgIHJldHVybiAnJXMoJXMpJyAlICh0eXBlX25hbWUsICcsICcuam9pbihhcmdfc3RyaW5ncykpCiAKICAgICBkZWYgX2dldF9rd2FyZ3Moc2VsZik6CkBAIC0yMDQsOCArMjEwLDYgQEAKICAgICAgICAgICAgIGlmIHNlbGYucGFyZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLl9pbmRlbnQoKQogICAgICAgICAgICAgam9pbiA9IHNlbGYuZm9ybWF0dGVyLl9qb2luX3BhcnRzCi0gICAgICAgICAgICBmb3IgZnVuYywgYXJncyBpbiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCiAgICAgICAgICAgICBpdGVtX2hlbHAgPSBqb2luKFtmdW5jKCphcmdzKSBmb3IgZnVuYywgYXJncyBpbiBzZWxmLml0ZW1zXSkKICAgICAgICAgICAgIGlmIHNlbGYucGFyZW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLl9kZWRlbnQoKQpkaWZmIC0tZ2l0IGEvTGliL2FzdC5weSBiL0xpYi9hc3QucHkKaW5kZXggMDE3MDQ3Mi4uMTU2YTFmMiAxMDA2NDQKLS0tIGEvTGliL2FzdC5weQorKysgYi9MaWIvYXN0LnB5CkBAIC0zNSw2ICszNSw4IEBACiAgICAgcmV0dXJuIGNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgbW9kZSwgUHlDRl9PTkxZX0FTVCkKIAogCitfTlVNX1RZUEVTID0gKGludCwgZmxvYXQsIGNvbXBsZXgpCisKIGRlZiBsaXRlcmFsX2V2YWwobm9kZV9vcl9zdHJpbmcpOgogICAgICIiIgogICAgIFNhZmVseSBldmFsdWF0ZSBhbiBleHByZXNzaW9uIG5vZGUgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFB5dGhvbgpAQCAtNDcsNyArNDksOSBAQAogICAgIGlmIGlzaW5zdGFuY2Uobm9kZV9vcl9zdHJpbmcsIEV4cHJlc3Npb24pOgogICAgICAgICBub2RlX29yX3N0cmluZyA9IG5vZGVfb3Jfc3RyaW5nLmJvZHkKICAgICBkZWYgX2NvbnZlcnQobm9kZSk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgKFN0ciwgQnl0ZXMpKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBDb25zdGFudCk6CisgICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgKFN0ciwgQnl0ZXMpKToKICAgICAgICAgICAgIHJldHVybiBub2RlLnMKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIE51bSk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS5uCkBAIC02MiwyNCArNjYsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGluIHppcChub2RlLmtleXMsIG5vZGUudmFsdWVzKSkKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIE5hbWVDb25zdGFudCk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgVW5hcnlPcCkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3AsIChVQWRkLCBVU3ViKSkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3BlcmFuZCwgKE51bSwgVW5hcnlPcCwgQmluT3ApKToKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFVuYXJ5T3ApIGFuZCBpc2luc3RhbmNlKG5vZGUub3AsIChVQWRkLCBVU3ViKSk6CiAgICAgICAgICAgICBvcGVyYW5kID0gX2NvbnZlcnQobm9kZS5vcGVyYW5kKQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBVQWRkKToKLSAgICAgICAgICAgICAgICByZXR1cm4gKyBvcGVyYW5kCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiAtIG9wZXJhbmQKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEJpbk9wKSBhbmQgXAotICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucmlnaHQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUubGVmdCwgKE51bSwgVW5hcnlPcCwgQmluT3ApKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlcmFuZCwgX05VTV9UWVBFUyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBVQWRkKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICsgb3BlcmFuZAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtIG9wZXJhbmQKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEJpbk9wKSBhbmQgaXNpbnN0YW5jZShub2RlLm9wLCAoQWRkLCBTdWIpKToKICAgICAgICAgICAgIGxlZnQgPSBfY29udmVydChub2RlLmxlZnQpCiAgICAgICAgICAgICByaWdodCA9IF9jb252ZXJ0KG5vZGUucmlnaHQpCi0gICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUub3AsIEFkZCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyByaWdodAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxlZnQsIF9OVU1fVFlQRVMpIGFuZCBpc2luc3RhbmNlKHJpZ2h0LCBfTlVNX1RZUEVTKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUub3AsIEFkZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hbGZvcm1lZCBub2RlIG9yIHN0cmluZzogJyArIHJlcHIobm9kZSkpCiAgICAgcmV0dXJuIF9jb252ZXJ0KG5vZGVfb3Jfc3RyaW5nKQogCkBAIC0xOTYsMTIgKzE5NywxOSBAQAogICAgICIiIgogICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIChBc3luY0Z1bmN0aW9uRGVmLCBGdW5jdGlvbkRlZiwgQ2xhc3NEZWYsIE1vZHVsZSkpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVyIGNhbid0IGhhdmUgZG9jc3RyaW5ncyIgJSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICBpZiBub2RlLmJvZHkgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBFeHByKSBhbmQgXAotICAgICAgIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLnZhbHVlLCBTdHIpOgotICAgICAgICBpZiBjbGVhbjoKLSAgICAgICAgICAgIGltcG9ydCBpbnNwZWN0Ci0gICAgICAgICAgICByZXR1cm4gaW5zcGVjdC5jbGVhbmRvYyhub2RlLmJvZHlbMF0udmFsdWUucykKLSAgICAgICAgcmV0dXJuIG5vZGUuYm9keVswXS52YWx1ZS5zCisgICAgaWYgbm90KG5vZGUuYm9keSBhbmQgaXNpbnN0YW5jZShub2RlLmJvZHlbMF0sIEV4cHIpKToKKyAgICAgICAgcmV0dXJuCisgICAgbm9kZSA9IG5vZGUuYm9keVswXS52YWx1ZQorICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgU3RyKToKKyAgICAgICAgdGV4dCA9IG5vZGUucworICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBDb25zdGFudCkgYW5kIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgc3RyKToKKyAgICAgICAgdGV4dCA9IG5vZGUudmFsdWUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4KKyAgICBpZiBjbGVhbjoKKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgdGV4dCA9IGluc3BlY3QuY2xlYW5kb2ModGV4dCkKKyAgICByZXR1cm4gdGV4dAogCiAKIGRlZiB3YWxrKG5vZGUpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaGF0LnB5IGIvTGliL2FzeW5jaGF0LnB5CmluZGV4IGY3MjhkMWIuLmZjMTE0NmEgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2hhdC5weQorKysgYi9MaWIvYXN5bmNoYXQucHkKQEAgLTI4NSwzNSArMjg1LDYgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQKIAogCi1jbGFzcyBmaWZvOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaXN0PU5vbmUpOgotICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3Mud2FybignZmlmbyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNicsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICAgIGlmIG5vdCBsaXN0OgotICAgICAgICAgICAgc2VsZi5saXN0ID0gZGVxdWUoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5saXN0ID0gZGVxdWUobGlzdCkKLQotICAgIGRlZiBfX2xlbl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gbGVuKHNlbGYubGlzdCkKLQotICAgIGRlZiBpc19lbXB0eShzZWxmKToKLSAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmxpc3QKLQotICAgIGRlZiBmaXJzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYubGlzdFswXQotCi0gICAgZGVmIHB1c2goc2VsZiwgZGF0YSk6Ci0gICAgICAgIHNlbGYubGlzdC5hcHBlbmQoZGF0YSkKLQotICAgIGRlZiBwb3Aoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYubGlzdDoKLSAgICAgICAgICAgIHJldHVybiAoMSwgc2VsZi5saXN0LnBvcGxlZnQoKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiAoMCwgTm9uZSkKLQotCiAjIEdpdmVuICdoYXlzdGFjaycsIHNlZSBpZiBhbnkgcHJlZml4IG9mICduZWVkbGUnIGlzIGF0IGl0cyBlbmQuICBUaGlzCiAjIGFzc3VtZXMgYW4gZXhhY3QgbWF0Y2ggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YKICMgY2hhcmFjdGVycyBtYXRjaGVkLgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkgYi9MaWIvYXN5bmNpby9iYXNlX2V2ZW50cy5weQppbmRleCAwMTc0Mzc1Li45MThiODY5IDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9iYXNlX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9iYXNlX2V2ZW50cy5weQpAQCAtNDI2LDcgKzQyNiw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY2xvc2VkKCk6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgZXZlbnQgbG9vcCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgZXZlbnQgbG9vcCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19ydW5uaW5nKCk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCkBAIC0xMDY4LDcgKzEwNjksNyBAQAogICAgICAgICB0cmFuc3BvcnQgPSB5aWVsZCBmcm9tIHNlbGYuX21ha2Vfc3VicHJvY2Vzc190cmFuc3BvcnQoCiAgICAgICAgICAgICBwcm90b2NvbCwgY21kLCBUcnVlLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGJ1ZnNpemUsICoqa3dhcmdzKQogICAgICAgICBpZiBzZWxmLl9kZWJ1ZzoKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCclczogJXInICUgKGRlYnVnX2xvZywgdHJhbnNwb3J0KSkKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCclczogJXInLCBkZWJ1Z19sb2csIHRyYW5zcG9ydCkKICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydCwgcHJvdG9jb2wKIAogICAgIEBjb3JvdXRpbmUKQEAgLTEwOTgsNyArMTA5OSw3IEBACiAgICAgICAgICAgICBwcm90b2NvbCwgcG9wZW5fYXJncywgRmFsc2UsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwKICAgICAgICAgICAgIGJ1ZnNpemUsICoqa3dhcmdzKQogICAgICAgICBpZiBzZWxmLl9kZWJ1ZzoKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCclczogJXInICUgKGRlYnVnX2xvZywgdHJhbnNwb3J0KSkKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCclczogJXInLCBkZWJ1Z19sb2csIHRyYW5zcG9ydCkKICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydCwgcHJvdG9jb2wKIAogICAgIGRlZiBnZXRfZXhjZXB0aW9uX2hhbmRsZXIoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKaW5kZXggOGZjMjUzYy4uZmI4YzJiYSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQpAQCAtMTIyLDcgKzEyMiw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Nsb3NlZDoKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBnZXRfcGlkKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5CmluZGV4IDNhYzMxNGMuLjRiNjA2N2EgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9wcm9hY3Rvcl9ldmVudHMucHkKQEAgLTg2LDcgKzg2LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9zb2NrIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIF9mYXRhbF9lcnJvcihzZWxmLCBleGMsIG1lc3NhZ2U9J0ZhdGFsIGVycm9yIG9uIHBpcGUgdHJhbnNwb3J0Jyk6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkgYi9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkKaW5kZXggZWQyYjRkNy4uMzRjY2U2YiAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5CisrKyBiL0xpYi9hc3luY2lvL3NlbGVjdG9yX2V2ZW50cy5weQpAQCAtNTc5LDcgKzU3OSw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fc29jayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiB0cmFuc3BvcnQnKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5IGIvTGliL2FzeW5jaW8vc3NscHJvdG8ucHkKaW5kZXggMzNkNWRlMi4uZjBmNjQyZSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vc3NscHJvdG8ucHkKKysrIGIvTGliL2FzeW5jaW8vc3NscHJvdG8ucHkKQEAgLTMyNSw3ICszMjUsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgcGF1c2VfcmVhZGluZyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3N0cmVhbXMucHkgYi9MaWIvYXN5bmNpby9zdHJlYW1zLnB5CmluZGV4IGM4OGE4N2MuLmI0YWRjN2QgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3N0cmVhbXMucHkKKysrIGIvTGliL2FzeW5jaW8vc3RyZWFtcy5weQpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgIGJ5dGVzLiBJZiB0aGUgRU9GIHdhcyByZWNlaXZlZCBhbmQgdGhlIGludGVybmFsIGJ1ZmZlciBpcyBlbXB0eSwgcmV0dXJuCiAgICAgICAgIGFuIGVtcHR5IGJ5dGVzIG9iamVjdC4KIAotICAgICAgICBJZiBuIGlzIHplcm8sIHJldHVybiBlbXB0eSBieXRlcyBvYmplY3QgaW1tZWRpYXRlbGx5LgorICAgICAgICBJZiBuIGlzIHplcm8sIHJldHVybiBlbXB0eSBieXRlcyBvYmplY3QgaW1tZWRpYXRlbHkuCiAKICAgICAgICAgSWYgbiBpcyBwb3NpdGl2ZSwgdGhpcyBmdW5jdGlvbiB0cnkgdG8gcmVhZCBgbmAgYnl0ZXMsIGFuZCBtYXkgcmV0dXJuCiAgICAgICAgIGxlc3Mgb3IgZXF1YWwgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQsIGJ1dCBhdCBsZWFzdCBvbmUgYnl0ZS4gSWYgRU9GIHdhcwpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vdW5peF9ldmVudHMucHkgYi9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weQppbmRleCAxODUxOWZjLi5kMTgzZjYwIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weQpAQCAtMzg3LDcgKzM4Nyw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fcGlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLl9waXBlLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiBwaXBlIHRyYW5zcG9ydCcpOgpAQCAtNTg0LDcgKzU4NSw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fcGlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLl9waXBlLmNsb3NlKCkKIAogICAgIGRlZiBhYm9ydChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkgYi9MaWIvYXN5bmNpby93aW5kb3dzX3V0aWxzLnB5CmluZGV4IDg3MGNkMTMuLjdjNjNmYjkgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkKKysrIGIvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weQpAQCAtMTU5LDcgKzE1OSw4IEBACiAKICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgaWYgc2VsZi5faGFuZGxlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY29yZS5weSBiL0xpYi9hc3luY29yZS5weQppbmRleCAzYjUxZjBmLi43MDVlNDA2IDEwMDY0NAotLS0gYS9MaWIvYXN5bmNvcmUucHkKKysrIGIvTGliL2FzeW5jb3JlLnB5CkBAIC0zMzMsNyArMzMzLDcgQEAKICAgICAgICAgc2VsZi5jb25uZWN0aW5nID0gVHJ1ZQogICAgICAgICBlcnIgPSBzZWxmLnNvY2tldC5jb25uZWN0X2V4KGFkZHJlc3MpCiAgICAgICAgIGlmIGVyciBpbiAoRUlOUFJPR1JFU1MsIEVBTFJFQURZLCBFV09VTERCTE9DSykgXAotICAgICAgICBvciBlcnIgPT0gRUlOVkFMIGFuZCBvcy5uYW1lIGluICgnbnQnLCAnY2UnKToKKyAgICAgICAgb3IgZXJyID09IEVJTlZBTCBhbmQgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgc2VsZi5hZGRyID0gYWRkcmVzcwogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIGVyciBpbiAoMCwgRUlTQ09OTik6CkBAIC01OTUsNyArNTk1LDggQEAKIAogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIHNlbGYuZmQgPj0gMDoKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCBmaWxlICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCBmaWxlICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICAgICAgZGVmIHJlY3Yoc2VsZiwgKmFyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2Jhc2U2NC5weSBiL0xpYi9iYXNlNjQucHkKaW5kZXggYWRhZWMxZC4uNjdlNTRmMCAxMDA3NTUKLS0tIGEvTGliL2Jhc2U2NC5weQorKysgYi9MaWIvYmFzZTY0LnB5CkBAIC01NSw4ICs1NSw3IEBACiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQgZm9yIHRoZSAnKycgYW5kICcvJyBjaGFyYWN0ZXJzLiAgVGhpcyBhbGxvd3MgYW4KICAgICBhcHBsaWNhdGlvbiB0byBlLmcuIGdlbmVyYXRlIHVybCBvciBmaWxlc3lzdGVtIHNhZmUgQmFzZTY0IHN0cmluZ3MuCiAgICAgIiIiCi0gICAgIyBTdHJpcCBvZmYgdGhlIHRyYWlsaW5nIG5ld2xpbmUKLSAgICBlbmNvZGVkID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzKVs6LTFdCisgICAgZW5jb2RlZCA9IGJpbmFzY2lpLmIyYV9iYXNlNjQocywgbmV3bGluZT1GYWxzZSkKICAgICBpZiBhbHRjaGFycyBpcyBub3QgTm9uZToKICAgICAgICAgYXNzZXJ0IGxlbihhbHRjaGFycykgPT0gMiwgcmVwcihhbHRjaGFycykKICAgICAgICAgcmV0dXJuIGVuY29kZWQudHJhbnNsYXRlKGJ5dGVzLm1ha2V0cmFucyhiJysvJywgYWx0Y2hhcnMpKQpkaWZmIC0tZ2l0IGEvTGliL2NhbGVuZGFyLnB5IGIvTGliL2NhbGVuZGFyLnB5CmluZGV4IDUyNDRiOGQuLjg1YmFmMmUgMTAwNjQ0Ci0tLSBhL0xpYi9jYWxlbmRhci5weQorKysgYi9MaWIvY2FsZW5kYXIucHkKQEAgLTEyLDcgKzEyLDkgQEAKIF9fYWxsX18gPSBbIklsbGVnYWxNb250aEVycm9yIiwgIklsbGVnYWxXZWVrZGF5RXJyb3IiLCAic2V0Zmlyc3R3ZWVrZGF5IiwKICAgICAgICAgICAgImZpcnN0d2Vla2RheSIsICJpc2xlYXAiLCAibGVhcGRheXMiLCAid2Vla2RheSIsICJtb250aHJhbmdlIiwKICAgICAgICAgICAgIm1vbnRoY2FsZW5kYXIiLCAicHJtb250aCIsICJtb250aCIsICJwcmNhbCIsICJjYWxlbmRhciIsCi0gICAgICAgICAgICJ0aW1lZ20iLCAibW9udGhfbmFtZSIsICJtb250aF9hYmJyIiwgImRheV9uYW1lIiwgImRheV9hYmJyIl0KKyAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiLAorICAgICAgICAgICAiQ2FsZW5kYXIiLCAiVGV4dENhbGVuZGFyIiwgIkhUTUxDYWxlbmRhciIsICJMb2NhbGVUZXh0Q2FsZW5kYXIiLAorICAgICAgICAgICAiTG9jYWxlSFRNTENhbGVuZGFyIiwgIndlZWtoZWFkZXIiXQogCiAjIEV4Y2VwdGlvbiByYWlzZWQgZm9yIGJhZCBpbnB1dCAod2l0aCBzdHJpbmcgcGFyYW1ldGVyIGZvciBkZXRhaWxzKQogZXJyb3IgPSBWYWx1ZUVycm9yCkBAIC02MDUsNTEgKzYwNyw2MyBAQAogCiAKIGRlZiBtYWluKGFyZ3MpOgotICAgIGltcG9ydCBvcHRwYXJzZQotICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0idXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbeWVhciBbbW9udGhdXSIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgaW1wb3J0IGFyZ3BhcnNlCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHRleHRncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ3RleHQgb25seSBhcmd1bWVudHMnKQorICAgIGh0bWxncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ2h0bWwgb25seSBhcmd1bWVudHMnKQorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItdyIsICItLXdpZHRoIiwKLSAgICAgICAgZGVzdD0id2lkdGgiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTIsCi0gICAgICAgIGhlbHA9IndpZHRoIG9mIGRhdGUgY29sdW1uIChkZWZhdWx0IDIsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTIsCisgICAgICAgIGhlbHA9IndpZHRoIG9mIGRhdGUgY29sdW1uIChkZWZhdWx0IDIpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWwiLCAiLS1saW5lcyIsCi0gICAgICAgIGRlc3Q9ImxpbmVzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0xLAotICAgICAgICBoZWxwPSJudW1iZXIgb2YgbGluZXMgZm9yIGVhY2ggd2VlayAoZGVmYXVsdCAxLCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD0xLAorICAgICAgICBoZWxwPSJudW1iZXIgb2YgbGluZXMgZm9yIGVhY2ggd2VlayAoZGVmYXVsdCAxKSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1zIiwgIi0tc3BhY2luZyIsCi0gICAgICAgIGRlc3Q9InNwYWNpbmciLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTYsCi0gICAgICAgIGhlbHA9InNwYWNpbmcgYmV0d2VlbiBtb250aHMgKGRlZmF1bHQgNiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9NiwKKyAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2KSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1tIiwgIi0tbW9udGhzIiwKLSAgICAgICAgZGVzdD0ibW9udGhzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0zLAotICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzLCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD0zLAorICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzKSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgaHRtbGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1jIiwgIi0tY3NzIiwKLSAgICAgICAgZGVzdD0iY3NzIiwgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKLSAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSAoaHRtbCBvbmx5KSIKKyAgICAgICAgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKKyAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1MIiwgIi0tbG9jYWxlIiwKLSAgICAgICAgZGVzdD0ibG9jYWxlIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgIGhlbHA9ImxvY2FsZSB0byBiZSB1c2VkIGZyb20gbW9udGggYW5kIHdlZWtkYXkgbmFtZXMiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgICItZSIsICItLWVuY29kaW5nIiwKLSAgICAgICAgZGVzdD0iZW5jb2RpbmciLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgIGhlbHA9IkVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0LiIKKyAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICBoZWxwPSJlbmNvZGluZyB0byB1c2UgZm9yIG91dHB1dCIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi10IiwgIi0tdHlwZSIsCi0gICAgICAgIGRlc3Q9InR5cGUiLCBkZWZhdWx0PSJ0ZXh0IiwKKyAgICAgICAgZGVmYXVsdD0idGV4dCIsCiAgICAgICAgIGNob2ljZXM9KCJ0ZXh0IiwgImh0bWwiKSwKICAgICAgICAgaGVscD0ib3V0cHV0IHR5cGUgKHRleHQgb3IgaHRtbCkiCiAgICAgKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJ5ZWFyIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ieWVhciBudW1iZXIgKDEtOTk5OSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJtb250aCIsCisgICAgICAgIG5hcmdzPSc/JywgdHlwZT1pbnQsCisgICAgICAgIGhlbHA9Im1vbnRoIG51bWJlciAoMS0xMiwgdGV4dCBvbmx5KSIKKyAgICApCiAKLSAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzWzE6XSkKIAogICAgIGlmIG9wdGlvbnMubG9jYWxlIGFuZCBub3Qgb3B0aW9ucy5lbmNvZGluZzoKICAgICAgICAgcGFyc2VyLmVycm9yKCJpZiAtLWxvY2FsZSBpcyBzcGVjaWZpZWQgLS1lbmNvZGluZyBpcyByZXF1aXJlZCIpCkBAIC02NjcsMTAgKzY4MSwxMCBAQAogICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKICAgICAgICAgb3B0ZGljdCA9IGRpY3QoZW5jb2Rpbmc9ZW5jb2RpbmcsIGNzcz1vcHRpb25zLmNzcykKICAgICAgICAgd3JpdGUgPSBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZQotICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWYgb3B0aW9ucy55ZWFyIGlzIE5vbmU6CiAgICAgICAgICAgICB3cml0ZShjYWwuZm9ybWF0eWVhcnBhZ2UoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkpCi0gICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6Ci0gICAgICAgICAgICB3cml0ZShjYWwuZm9ybWF0eWVhcnBhZ2UoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpKQorICAgICAgICBlbGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKKyAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShvcHRpb25zLnllYXIsICoqb3B0ZGljdCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKICAgICAgICAgICAgIHN5cy5leGl0KDEpCkBAIC02ODAsMTggKzY5NCwxNSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY2FsID0gVGV4dENhbGVuZGFyKCkKICAgICAgICAgb3B0ZGljdCA9IGRpY3Qodz1vcHRpb25zLndpZHRoLCBsPW9wdGlvbnMubGluZXMpCi0gICAgICAgIGlmIGxlbihhcmdzKSAhPSAzOgorICAgICAgICBpZiBvcHRpb25zLm1vbnRoIGlzIE5vbmU6CiAgICAgICAgICAgICBvcHRkaWN0WyJjIl0gPSBvcHRpb25zLnNwYWNpbmcKICAgICAgICAgICAgIG9wdGRpY3RbIm0iXSA9IG9wdGlvbnMubW9udGhzCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyLCAqKm9wdGRpY3QpCi0gICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6Ci0gICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0eWVhcihpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMzoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXRtb250aChpbnQoYXJnc1sxXSksIGludChhcmdzWzJdKSwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCi0gICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKG9wdGlvbnMueWVhciwgb3B0aW9ucy5tb250aCwgKipvcHRkaWN0KQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQud3JpdGUKICAgICAgICAgaWYgb3B0aW9ucy5lbmNvZGluZzoKICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5lbmNvZGUob3B0aW9ucy5lbmNvZGluZykKZGlmZiAtLWdpdCBhL0xpYi9jZ2kucHkgYi9MaWIvY2dpLnB5CmluZGV4IDE4OWM2ZDUuLjIzM2E0OTYgMTAwNzU1Ci0tLSBhL0xpYi9jZ2kucHkKKysrIGIvTGliL2NnaS5weQpAQCAtNDUsNyArNDUsNyBAQAogCiBfX2FsbF9fID0gWyJNaW5pRmllbGRTdG9yYWdlIiwgIkZpZWxkU3RvcmFnZSIsCiAgICAgICAgICAgICJwYXJzZSIsICJwYXJzZV9xcyIsICJwYXJzZV9xc2wiLCAicGFyc2VfbXVsdGlwYXJ0IiwKLSAgICAgICAgICAgInBhcnNlX2hlYWRlciIsICJwcmludF9leGNlcHRpb24iLCAicHJpbnRfZW52aXJvbiIsCisgICAgICAgICAgICJwYXJzZV9oZWFkZXIiLCAidGVzdCIsICJwcmludF9leGNlcHRpb24iLCAicHJpbnRfZW52aXJvbiIsCiAgICAgICAgICAgICJwcmludF9mb3JtIiwgInByaW50X2RpcmVjdG9yeSIsICJwcmludF9hcmd1bWVudHMiLAogICAgICAgICAgICAicHJpbnRfZW52aXJvbl91c2FnZSIsICJlc2NhcGUiXQogCmRpZmYgLS1naXQgYS9MaWIvY29kZS5weSBiL0xpYi9jb2RlLnB5CmluZGV4IDUzMjQ0ZTMuLjIzMjk1ZjQgMTAwNjQ0Ci0tLSBhL0xpYi9jb2RlLnB5CisrKyBiL0xpYi9jb2RlLnB5CkBAIC0xODYsNyArMTg2LDcgQEAKICAgICAgICAgIiIiUmVzZXQgdGhlIGlucHV0IGJ1ZmZlci4iIiIKICAgICAgICAgc2VsZi5idWZmZXIgPSBbXQogCi0gICAgZGVmIGludGVyYWN0KHNlbGYsIGJhbm5lcj1Ob25lKToKKyAgICBkZWYgaW50ZXJhY3Qoc2VsZiwgYmFubmVyPU5vbmUsIGV4aXRtc2c9Tm9uZSk6CiAgICAgICAgICIiIkNsb3NlbHkgZW11bGF0ZSB0aGUgaW50ZXJhY3RpdmUgUHl0aG9uIGNvbnNvbGUuCiAKICAgICAgICAgVGhlIG9wdGlvbmFsIGJhbm5lciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGJhbm5lciB0byBwcmludApAQCAtMTk2LDYgKzE5NiwxMSBAQAogICAgICAgICB0byBjb25mdXNlIHRoaXMgd2l0aCB0aGUgcmVhbCBpbnRlcnByZXRlciAtLSBzaW5jZSBpdCdzIHNvCiAgICAgICAgIGNsb3NlISkuCiAKKyAgICAgICAgVGhlIG9wdGlvbmFsIGV4aXRtc2cgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBleGl0IG1lc3NhZ2UKKyAgICAgICAgcHJpbnRlZCB3aGVuIGV4aXRpbmcuIFBhc3MgdGhlIGVtcHR5IHN0cmluZyB0byBzdXBwcmVzcworICAgICAgICBwcmludGluZyBhbiBleGl0IG1lc3NhZ2UuIElmIGV4aXRtc2cgaXMgbm90IGdpdmVuIG9yIE5vbmUsCisgICAgICAgIGEgZGVmYXVsdCBtZXNzYWdlIGlzIHByaW50ZWQuCisKICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5wczEKQEAgLTIzMCw2ICsyMzUsMTAgQEAKICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCJcbktleWJvYXJkSW50ZXJydXB0XG4iKQogICAgICAgICAgICAgICAgIHNlbGYucmVzZXRidWZmZXIoKQogICAgICAgICAgICAgICAgIG1vcmUgPSAwCisgICAgICAgIGlmIGV4aXRtc2cgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJ25vdyBleGl0aW5nICVzLi4uXG4nICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGVsaWYgZXhpdG1zZyAhPSAnJzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyVzXG4nICUgZXhpdG1zZykKIAogICAgIGRlZiBwdXNoKHNlbGYsIGxpbmUpOgogICAgICAgICAiIiJQdXNoIGEgbGluZSB0byB0aGUgaW50ZXJwcmV0ZXIuCkBAIC0yNjcsNyArMjc2LDcgQEAKIAogCiAKLWRlZiBpbnRlcmFjdChiYW5uZXI9Tm9uZSwgcmVhZGZ1bmM9Tm9uZSwgbG9jYWw9Tm9uZSk6CitkZWYgaW50ZXJhY3QoYmFubmVyPU5vbmUsIHJlYWRmdW5jPU5vbmUsIGxvY2FsPU5vbmUsIGV4aXRtc2c9Tm9uZSk6CiAgICAgIiIiQ2xvc2VseSBlbXVsYXRlIHRoZSBpbnRlcmFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIuCiAKICAgICBUaGlzIGlzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgaW50ZXJmYWNlIHRvIHRoZSBJbnRlcmFjdGl2ZUNvbnNvbGUKQEAgLTI3OSw2ICsyODgsNyBAQAogICAgIGJhbm5lciAtLSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVDb25zb2xlLmludGVyYWN0KCkKICAgICByZWFkZnVuYyAtLSBpZiBub3QgTm9uZSwgcmVwbGFjZXMgSW50ZXJhY3RpdmVDb25zb2xlLnJhd19pbnB1dCgpCiAgICAgbG9jYWwgLS0gcGFzc2VkIHRvIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIuX19pbml0X18oKQorICAgIGV4aXRtc2cgLS0gcGFzc2VkIHRvIEludGVyYWN0aXZlQ29uc29sZS5pbnRlcmFjdCgpCiAKICAgICAiIiIKICAgICBjb25zb2xlID0gSW50ZXJhY3RpdmVDb25zb2xlKGxvY2FsKQpAQCAtMjg5LDcgKzI5OSw3IEBACiAgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcGFzcwotICAgIGNvbnNvbGUuaW50ZXJhY3QoYmFubmVyKQorICAgIGNvbnNvbGUuaW50ZXJhY3QoYmFubmVyLCBleGl0bXNnKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkgYi9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKaW5kZXggZWJlOGVlNy4uMDNlY2VhMiAxMDA2NDQKLS0tIGEvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CisrKyBiL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAge25hbWV9ID0gX3Byb3BlcnR5KF9pdGVtZ2V0dGVyKHtpbmRleDpkfSksIGRvYz0nQWxpYXMgZm9yIGZpZWxkIG51bWJlciB7aW5kZXg6ZH0nKQogJycnCiAKLWRlZiBuYW1lZHR1cGxlKHR5cGVuYW1lLCBmaWVsZF9uYW1lcywgdmVyYm9zZT1GYWxzZSwgcmVuYW1lPUZhbHNlKToKK2RlZiBuYW1lZHR1cGxlKHR5cGVuYW1lLCBmaWVsZF9uYW1lcywgKiwgdmVyYm9zZT1GYWxzZSwgcmVuYW1lPUZhbHNlKToKICAgICAiIiJSZXR1cm5zIGEgbmV3IHN1YmNsYXNzIG9mIHR1cGxlIHdpdGggbmFtZWQgZmllbGRzLgogCiAgICAgPj4+IFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCBbJ3gnLCAneSddKQpAQCAtMzkzLDcgKzM5Myw3IEBACiAgICAgICAgICAgICAgICAgZmllbGRfbmFtZXNbaW5kZXhdID0gJ18lZCcgJSBpbmRleAogICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSkKICAgICBmb3IgbmFtZSBpbiBbdHlwZW5hbWVdICsgZmllbGRfbmFtZXM6Ci0gICAgICAgIGlmIHR5cGUobmFtZSkgIT0gc3RyOgorICAgICAgICBpZiB0eXBlKG5hbWUpIGlzIG5vdCBzdHI6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIG11c3QgYmUgc3RyaW5ncycpCiAgICAgICAgIGlmIG5vdCBuYW1lLmlzaWRlbnRpZmllcigpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCAnCkBAIC04NDIsNyArODQyLDcgQEAKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyAgQ2hhaW5NYXAgKGhlbHBlciBmb3IgY29uZmlncGFyc2VyIGFuZCBzdHJpbmcuVGVtcGxhdGUpCisjIyMgIENoYWluTWFwCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2xhc3MgQ2hhaW5NYXAoTXV0YWJsZU1hcHBpbmcpOgpAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICAgICAgICBkaWN0ID0ga3dhcmdzLnBvcCgnZGljdCcpCiAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlBhc3NpbmcgJ2RpY3QnIGFzIGtleXdvcmQgYXJndW1lbnQgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaWN0ID0gTm9uZQogICAgICAgICBzZWxmLmRhdGEgPSB7fQpkaWZmIC0tZ2l0IGEvTGliL2NvbGxlY3Rpb25zL19fbWFpbl9fLnB5IGIvTGliL2NvbGxlY3Rpb25zL19fbWFpbl9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNlMzhlLi4wMDAwMDAwCi0tLSBhL0xpYi9jb2xsZWN0aW9ucy9fX21haW5fXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgU2ltcGxlIHRlc3RzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHZlcmlmeSB0aGF0IGluc3RhbmNlcyBjYW4gYmUgcGlja2xlZAotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQotZnJvbSBwaWNrbGUgaW1wb3J0IGxvYWRzLCBkdW1wcwotUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4LCB5JywgVHJ1ZSkKLXAgPSBQb2ludCh4PTEwLCB5PTIwKQotYXNzZXJ0IHAgPT0gbG9hZHMoZHVtcHMocCkpCi0KLSMgdGVzdCBhbmQgZGVtb25zdHJhdGUgYWJpbGl0eSB0byBvdmVycmlkZSBtZXRob2RzCi1jbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6Ci0gICAgX19zbG90c19fID0gKCkKLSAgICBAcHJvcGVydHkKLSAgICBkZWYgaHlwb3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiAoc2VsZi54ICoqIDIgKyBzZWxmLnkgKiogMikgKiogMC41Ci0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAnUG9pbnQ6IHg9JTYuM2YgIHk9JTYuM2YgIGh5cG90PSU2LjNmJyAlIChzZWxmLngsIHNlbGYueSwgc2VsZi5oeXBvdCkKLQotZm9yIHAgaW4gUG9pbnQoMywgNCksIFBvaW50KDE0LCA1LzcuKToKLSAgICBwcmludCAocCkKLQotY2xhc3MgUG9pbnQobmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykpOgotICAgICdQb2ludCBjbGFzcyB3aXRoIG9wdGltaXplZCBfbWFrZSgpIGFuZCBfcmVwbGFjZSgpIHdpdGhvdXQgZXJyb3ItY2hlY2tpbmcnCi0gICAgX19zbG90c19fID0gKCkKLSAgICBfbWFrZSA9IGNsYXNzbWV0aG9kKHR1cGxlLl9fbmV3X18pCi0gICAgZGVmIF9yZXBsYWNlKHNlbGYsIF9tYXA9bWFwLCAqKmt3ZHMpOgotICAgICAgICByZXR1cm4gc2VsZi5fbWFrZShfbWFwKGt3ZHMuZ2V0LCAoJ3gnLCAneScpLCBzZWxmKSkKLQotcHJpbnQoUG9pbnQoMTEsIDIyKS5fcmVwbGFjZSh4PTEwMCkpCi0KLVBvaW50M0QgPSBuYW1lZHR1cGxlKCdQb2ludDNEJywgUG9pbnQuX2ZpZWxkcyArICgneicsKSkKLXByaW50KFBvaW50M0QuX19kb2NfXykKLQotaW1wb3J0IGRvY3Rlc3QsIGNvbGxlY3Rpb25zCi1UZXN0UmVzdWx0cyA9IG5hbWVkdHVwbGUoJ1Rlc3RSZXN1bHRzJywgJ2ZhaWxlZCBhdHRlbXB0ZWQnKQotcHJpbnQoVGVzdFJlc3VsdHMoKmRvY3Rlc3QudGVzdG1vZChjb2xsZWN0aW9ucykpKQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVhbGwucHkgYi9MaWIvY29tcGlsZWFsbC5weQppbmRleCAwY2MwYzFkLi42N2M1ZjVhIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZWFsbC5weQorKysgYi9MaWIvY29tcGlsZWFsbC5weQpAQCAtNjgsNyArNjgsNyBAQAogICAgICIiIgogICAgIGZpbGVzID0gX3dhbGtfZGlyKGRpciwgcXVpZXQ9cXVpZXQsIG1heGxldmVscz1tYXhsZXZlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgZGRpcj1kZGlyKQotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBpZiB3b3JrZXJzIGlzIG5vdCBOb25lIGFuZCB3b3JrZXJzICE9IDEgYW5kIFByb2Nlc3NQb29sRXhlY3V0b3IgaXMgbm90IE5vbmU6CiAgICAgICAgIGlmIHdvcmtlcnMgPCAwOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd29ya2VycyBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMCcpCkBAIC04MSwxMiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3k9bGVnYWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpCi0gICAgICAgICAgICBzdWNjZXNzID0gbWluKHJlc3VsdHMsIGRlZmF1bHQ9MSkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD1UcnVlKQogICAgIGVsc2U6CiAgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgogICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZmlsZShmaWxlLCBkZGlyLCBmb3JjZSwgcngsIHF1aWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ksIG9wdGltaXplKToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgIHJldHVybiBzdWNjZXNzCiAKIGRlZiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBsZWdhY3k6ICAgIGlmIFRydWUsIHByb2R1Y2UgbGVnYWN5IHB5YyBwYXRocyBpbnN0ZWFkIG9mIFBFUCAzMTQ3IHBhdGhzCiAgICAgb3B0aW1pemU6ICBvcHRpbWl6YXRpb24gbGV2ZWwgb3IgLTEgZm9yIGxldmVsIG9mIHRoZSBpbnRlcnByZXRlcgogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmdWxsbmFtZSkKICAgICBpZiBkZGlyIGlzIG5vdCBOb25lOgogICAgICAgICBkZmlsZSA9IG9zLnBhdGguam9pbihkZGlyLCBuYW1lKQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgICAgICAgICAgb2sgPSBweV9jb21waWxlLmNvbXBpbGUoZnVsbG5hbWUsIGNmaWxlLCBkZmlsZSwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT1vcHRpbWl6ZSkKICAgICAgICAgICAgIGV4Y2VwdCBweV9jb21waWxlLlB5Q29tcGlsZUVycm9yIGFzIGVycjoKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5kZWNvZGUoc3lzLnN0ZG91dC5lbmNvZGluZykKICAgICAgICAgICAgICAgICBwcmludChtc2cpCiAgICAgICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBVbmljb2RlRXJyb3IsIE9TRXJyb3IpIGFzIGU6Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgICBpZiBxdWlldCA+PSAyOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VzcwogICAgICAgICAgICAgICAgIGVsaWYgcXVpZXQ6CkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgICAgICAgICBwcmludChlLl9fY2xhc3NfXy5fX25hbWVfXyArICc6JywgZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgb2sgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj0xLCBtYXhsZXZlbHM9MCwgZm9yY2U9RmFsc2UsIHF1aWV0PTAsCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBsZWdhY3k6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IEZhbHNlKQogICAgIG9wdGltaXplOiBhcyBmb3IgY29tcGlsZV9kaXIoKSAoZGVmYXVsdCAtMSkKICAgICAiIiIKLSAgICBzdWNjZXNzID0gMQorICAgIHN1Y2Nlc3MgPSBUcnVlCiAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKICAgICAgICAgaWYgKG5vdCBkaXIgb3IgZGlyID09IG9zLmN1cmRpcikgYW5kIHNraXBfY3VyZGlyOgogICAgICAgICAgICAgaWYgcXVpZXQgPCAyOgpkaWZmIC0tZ2l0IGEvTGliL2NvbmN1cnJlbnQvZnV0dXJlcy9wcm9jZXNzLnB5IGIvTGliL2NvbmN1cnJlbnQvZnV0dXJlcy9wcm9jZXNzLnB5CmluZGV4IDU5MGVkYmEuLjhmMWQ3MTQgMTAwNjQ0Ci0tLSBhL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvcHJvY2Vzcy5weQorKysgYi9MaWIvY29uY3VycmVudC9mdXR1cmVzL3Byb2Nlc3MucHkKQEAgLTYzLDcgKzYzLDcgQEAKICMgaW50ZXJwcmV0ZXIgdG8gZXhpdCB3aGVuIHRoZXJlIGFyZSBzdGlsbCBpZGxlIHByb2Nlc3NlcyBpbiBhCiAjIFByb2Nlc3NQb29sRXhlY3V0b3IncyBwcm9jZXNzIHBvb2wgKGkuZS4gc2h1dGRvd24oKSB3YXMgbm90IGNhbGxlZCkuIEhvd2V2ZXIsCiAjIGFsbG93aW5nIHdvcmtlcnMgdG8gZGllIHdpdGggdGhlIGludGVycHJldGVyIGhhcyB0d28gdW5kZXNpcmFibGUgcHJvcGVydGllczoKLSMgICAtIFRoZSB3b3JrZXJzIHdvdWxkIHN0aWxsIGJlIHJ1bm5pbmcgZHVyaW5nIGludGVycHJldG9yIHNodXRkb3duLAorIyAgIC0gVGhlIHdvcmtlcnMgd291bGQgc3RpbGwgYmUgcnVubmluZyBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24sCiAjICAgICBtZWFuaW5nIHRoYXQgdGhleSB3b3VsZCBmYWlsIGluIHVucHJlZGljdGFibGUgd2F5cy4KICMgICAtIFRoZSB3b3JrZXJzIGNvdWxkIGJlIGtpbGxlZCB3aGlsZSBldmFsdWF0aW5nIGEgd29yayBpdGVtLCB3aGljaCBjb3VsZAogIyAgICAgYmUgYmFkIGlmIHRoZSBjYWxsYWJsZSBiZWluZyBldmFsdWF0ZWQgaGFzIGV4dGVybmFsIHNpZGUtZWZmZWN0cyBlLmcuCmRpZmYgLS1naXQgYS9MaWIvY29uY3VycmVudC9mdXR1cmVzL3RocmVhZC5weSBiL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CmluZGV4IDNhZTQ0MmQuLjAzZDI3NmIgMTAwNjQ0Ci0tLSBhL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CisrKyBiL0xpYi9jb25jdXJyZW50L2Z1dHVyZXMvdGhyZWFkLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAjIHRvIGV4aXQgd2hlbiB0aGVyZSBhcmUgc3RpbGwgaWRsZSB0aHJlYWRzIGluIGEgVGhyZWFkUG9vbEV4ZWN1dG9yJ3MgdGhyZWFkCiAjIHBvb2wgKGkuZS4gc2h1dGRvd24oKSB3YXMgbm90IGNhbGxlZCkuIEhvd2V2ZXIsIGFsbG93aW5nIHdvcmtlcnMgdG8gZGllIHdpdGgKICMgdGhlIGludGVycHJldGVyIGhhcyB0d28gdW5kZXNpcmFibGUgcHJvcGVydGllczoKLSMgICAtIFRoZSB3b3JrZXJzIHdvdWxkIHN0aWxsIGJlIHJ1bm5pbmcgZHVyaW5nIGludGVycHJldG9yIHNodXRkb3duLAorIyAgIC0gVGhlIHdvcmtlcnMgd291bGQgc3RpbGwgYmUgcnVubmluZyBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24sCiAjICAgICBtZWFuaW5nIHRoYXQgdGhleSB3b3VsZCBmYWlsIGluIHVucHJlZGljdGFibGUgd2F5cy4KICMgICAtIFRoZSB3b3JrZXJzIGNvdWxkIGJlIGtpbGxlZCB3aGlsZSBldmFsdWF0aW5nIGEgd29yayBpdGVtLCB3aGljaCBjb3VsZAogIyAgICAgYmUgYmFkIGlmIHRoZSBjYWxsYWJsZSBiZWluZyBldmFsdWF0ZWQgaGFzIGV4dGVybmFsIHNpZGUtZWZmZWN0cyBlLmcuCkBAIC04MSwxMiArODEsMTMgQEAKICAgICAgICAgX2Jhc2UuTE9HR0VSLmNyaXRpY2FsKCdFeGNlcHRpb24gaW4gd29ya2VyJywgZXhjX2luZm89VHJ1ZSkKIAogY2xhc3MgVGhyZWFkUG9vbEV4ZWN1dG9yKF9iYXNlLkV4ZWN1dG9yKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4X3dvcmtlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heF93b3JrZXJzPU5vbmUsIHRocmVhZF9uYW1lX3ByZWZpeD0nJyk6CiAgICAgICAgICIiIkluaXRpYWxpemVzIGEgbmV3IFRocmVhZFBvb2xFeGVjdXRvciBpbnN0YW5jZS4KIAogICAgICAgICBBcmdzOgogICAgICAgICAgICAgbWF4X3dvcmtlcnM6IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICAgICAgICBleGVjdXRlIHRoZSBnaXZlbiBjYWxscy4KKyAgICAgICAgICAgIHRocmVhZF9uYW1lX3ByZWZpeDogQW4gb3B0aW9uYWwgbmFtZSBwcmVmaXggdG8gZ2l2ZSBvdXIgdGhyZWFkcy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG1heF93b3JrZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICAjIFVzZSB0aGlzIG51bWJlciBiZWNhdXNlIFRocmVhZFBvb2xFeGVjdXRvciBpcyBvZnRlbgpAQCAtMTAwLDYgKzEwMSw3IEBACiAgICAgICAgIHNlbGYuX3RocmVhZHMgPSBzZXQoKQogICAgICAgICBzZWxmLl9zaHV0ZG93biA9IEZhbHNlCiAgICAgICAgIHNlbGYuX3NodXRkb3duX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuX3RocmVhZF9uYW1lX3ByZWZpeCA9IHRocmVhZF9uYW1lX3ByZWZpeAogCiAgICAgZGVmIHN1Ym1pdChzZWxmLCBmbiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgd2l0aCBzZWxmLl9zaHV0ZG93bl9sb2NrOgpAQCAtMTIxLDggKzEyMywxMSBAQAogICAgICAgICAgICAgcS5wdXQoTm9uZSkKICAgICAgICAgIyBUT0RPKGJxdWlubGFuKTogU2hvdWxkIGF2b2lkIGNyZWF0aW5nIG5ldyB0aHJlYWRzIGlmIHRoZXJlIGFyZSBtb3JlCiAgICAgICAgICMgaWRsZSB0aHJlYWRzIHRoYW4gaXRlbXMgaW4gdGhlIHdvcmsgcXVldWUuCi0gICAgICAgIGlmIGxlbihzZWxmLl90aHJlYWRzKSA8IHNlbGYuX21heF93b3JrZXJzOgotICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV93b3JrZXIsCisgICAgICAgIG51bV90aHJlYWRzID0gbGVuKHNlbGYuX3RocmVhZHMpCisgICAgICAgIGlmIG51bV90aHJlYWRzIDwgc2VsZi5fbWF4X3dvcmtlcnM6CisgICAgICAgICAgICB0aHJlYWRfbmFtZSA9ICclc18lZCcgJSAoc2VsZi5fdGhyZWFkX25hbWVfcHJlZml4IG9yIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZChuYW1lPXRocmVhZF9uYW1lLCB0YXJnZXQ9X3dvcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHdlYWtyZWYucmVmKHNlbGYsIHdlYWtyZWZfY2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya19xdWV1ZSkpCiAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKZGlmZiAtLWdpdCBhL0xpYi9jb250ZXh0bGliLnB5IGIvTGliL2NvbnRleHRsaWIucHkKaW5kZXggZDQ0ZWRkNi4uN2Q5NGE1NyAxMDA2NDQKLS0tIGEvTGliL2NvbnRleHRsaWIucHkKKysrIGIvTGliL2NvbnRleHRsaWIucHkKQEAgLTEsMTEgKzEsMzQgQEAKICIiIlV0aWxpdGllcyBmb3Igd2l0aC1zdGF0ZW1lbnQgY29udGV4dHMuICBTZWUgUEVQIDM0My4iIiIKLQoraW1wb3J0IGFiYwogaW1wb3J0IHN5cwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcwogCi1fX2FsbF9fID0gWyJjb250ZXh0bWFuYWdlciIsICJjbG9zaW5nIiwgIkNvbnRleHREZWNvcmF0b3IiLCAiRXhpdFN0YWNrIiwKLSAgICAgICAgICAgInJlZGlyZWN0X3N0ZG91dCIsICJyZWRpcmVjdF9zdGRlcnIiLCAic3VwcHJlc3MiXQorX19hbGxfXyA9IFsiY29udGV4dG1hbmFnZXIiLCAiY2xvc2luZyIsICJBYnN0cmFjdENvbnRleHRNYW5hZ2VyIiwKKyAgICAgICAgICAgIkNvbnRleHREZWNvcmF0b3IiLCAiRXhpdFN0YWNrIiwgInJlZGlyZWN0X3N0ZG91dCIsCisgICAgICAgICAgICJyZWRpcmVjdF9zdGRlcnIiLCAic3VwcHJlc3MiXQorCisKK2NsYXNzIEFic3RyYWN0Q29udGV4dE1hbmFnZXIoYWJjLkFCQyk6CisKKyAgICAiIiJBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250ZXh0IG1hbmFnZXJzLiIiIgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGBzZWxmYCB1cG9uIGVudGVyaW5nIHRoZSBydW50aW1lIGNvbnRleHQuIiIiCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICIiIlJhaXNlIGFueSBleGNlcHRpb24gdHJpZ2dlcmVkIHdpdGhpbiB0aGUgcnVudGltZSBjb250ZXh0LiIiIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKKyAgICAgICAgaWYgY2xzIGlzIEFic3RyYWN0Q29udGV4dE1hbmFnZXI6CisgICAgICAgICAgICBpZiAoYW55KCJfX2VudGVyX18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSBhbmQKKyAgICAgICAgICAgICAgICBhbnkoIl9fZXhpdF9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAKIGNsYXNzIENvbnRleHREZWNvcmF0b3Iob2JqZWN0KToKQEAgLTMxLDcgKzU0LDcgQEAKICAgICAgICAgcmV0dXJuIGlubmVyCiAKIAotY2xhc3MgX0dlbmVyYXRvckNvbnRleHRNYW5hZ2VyKENvbnRleHREZWNvcmF0b3IpOgorY2xhc3MgX0dlbmVyYXRvckNvbnRleHRNYW5hZ2VyKENvbnRleHREZWNvcmF0b3IsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkhlbHBlciBmb3IgQGNvbnRleHRtYW5hZ2VyIGRlY29yYXRvci4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBhcmdzLCBrd2RzKToKQEAgLTEzNyw3ICsxNjAsNyBAQAogICAgIHJldHVybiBoZWxwZXIKIAogCi1jbGFzcyBjbG9zaW5nKG9iamVjdCk6CitjbGFzcyBjbG9zaW5nKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgdG8gYXV0b21hdGljYWxseSBjbG9zZSBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiBhIGJsb2NrLgogCiAgICAgQ29kZSBsaWtlIHRoaXM6CkBAIC0xNjIsNyArMTg1LDcgQEAKICAgICAgICAgc2VsZi50aGluZy5jbG9zZSgpCiAKIAotY2xhc3MgX1JlZGlyZWN0U3RyZWFtOgorY2xhc3MgX1JlZGlyZWN0U3RyZWFtKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogCiAgICAgX3N0cmVhbSA9IE5vbmUKIApAQCAtMjAyLDcgKzIyNSw3IEBACiAgICAgX3N0cmVhbSA9ICJzdGRlcnIiCiAKIAotY2xhc3Mgc3VwcHJlc3M6CitjbGFzcyBzdXBwcmVzcyhBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gc3VwcHJlc3Mgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKIAogICAgIEFmdGVyIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgZXhlY3V0aW9uIHByb2NlZWRzIHdpdGggdGhlIG5leHQKQEAgLTIzMyw3ICsyNTYsNyBAQAogCiAKICMgSW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgb24gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzNTg1Ci1jbGFzcyBFeGl0U3RhY2sob2JqZWN0KToKK2NsYXNzIEV4aXRTdGFjayhBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJDb250ZXh0IG1hbmFnZXIgZm9yIGR5bmFtaWMgbWFuYWdlbWVudCBvZiBhIHN0YWNrIG9mIGV4aXQgY2FsbGJhY2tzCiAKICAgICBGb3IgZXhhbXBsZToKQEAgLTMxMiw5ICszMzUsNiBAQAogICAgICAgICAiIiJJbW1lZGlhdGVseSB1bndpbmQgdGhlIGNvbnRleHQgc3RhY2siIiIKICAgICAgICAgc2VsZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKQogCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2RldGFpbHMpOgogICAgICAgICByZWNlaXZlZF9leGMgPSBleGNfZGV0YWlsc1swXSBpcyBub3QgTm9uZQogCmRpZmYgLS1naXQgYS9MaWIvY29weS5weSBiL0xpYi9jb3B5LnB5CmluZGV4IDk3MmI5NGEuLmY4NjA0MGEgMTAwNjQ0Ci0tLSBhL0xpYi9jb3B5LnB5CisrKyBiL0xpYi9jb3B5LnB5CkBAIC01MSw3ICs1MSw2IEBACiBpbXBvcnQgdHlwZXMKIGltcG9ydCB3ZWFrcmVmCiBmcm9tIGNvcHlyZWcgaW1wb3J0IGRpc3BhdGNoX3RhYmxlCi1pbXBvcnQgYnVpbHRpbnMKIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICBwYXNzCkBAIC0xMDIsMzcgKzEwMSwzMyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigidW4oc2hhbGxvdyljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCiAKLSAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIHJ2LCAwKQorICAgIGlmIGlzaW5zdGFuY2UocnYsIHN0cik6CisgICAgICAgIHJldHVybiB4CisgICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBOb25lLCAqcnYpCiAKIAogX2NvcHlfZGlzcGF0Y2ggPSBkID0ge30KIAogZGVmIF9jb3B5X2ltbXV0YWJsZSh4KToKICAgICByZXR1cm4geAotZm9yIHQgaW4gKHR5cGUoTm9uZSksIGludCwgZmxvYXQsIGJvb2wsIHN0ciwgdHVwbGUsCi0gICAgICAgICAgYnl0ZXMsIGZyb3plbnNldCwgdHlwZSwgcmFuZ2UsCi0gICAgICAgICAgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSwgdHlwZShFbGxpcHNpcyksCitmb3IgdCBpbiAodHlwZShOb25lKSwgaW50LCBmbG9hdCwgYm9vbCwgY29tcGxleCwgc3RyLCB0dXBsZSwKKyAgICAgICAgICBieXRlcywgZnJvemVuc2V0LCB0eXBlLCByYW5nZSwgc2xpY2UsCisgICAgICAgICAgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSwgdHlwZShFbGxpcHNpcyksIHR5cGUoTm90SW1wbGVtZW50ZWQpLAogICAgICAgICAgIHR5cGVzLkZ1bmN0aW9uVHlwZSwgd2Vha3JlZi5yZWYpOgogICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKIHQgPSBnZXRhdHRyKHR5cGVzLCAiQ29kZVR5cGUiLCBOb25lKQogaWYgdCBpcyBub3QgTm9uZToKICAgICBkW3RdID0gX2NvcHlfaW1tdXRhYmxlCi1mb3IgbmFtZSBpbiAoImNvbXBsZXgiLCAidW5pY29kZSIpOgotICAgIHQgPSBnZXRhdHRyKGJ1aWx0aW5zLCBuYW1lLCBOb25lKQotICAgIGlmIHQgaXMgbm90IE5vbmU6Ci0gICAgICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKIAotZGVmIF9jb3B5X3dpdGhfY29uc3RydWN0b3IoeCk6Ci0gICAgcmV0dXJuIHR5cGUoeCkoeCkKLWZvciB0IGluIChsaXN0LCBkaWN0LCBzZXQpOgotICAgIGRbdF0gPSBfY29weV93aXRoX2NvbnN0cnVjdG9yCitkW2xpc3RdID0gbGlzdC5jb3B5CitkW2RpY3RdID0gZGljdC5jb3B5CitkW3NldF0gPSBzZXQuY29weQorZFtieXRlYXJyYXldID0gYnl0ZWFycmF5LmNvcHkKIAotZGVmIF9jb3B5X3dpdGhfY29weV9tZXRob2QoeCk6Ci0gICAgcmV0dXJuIHguY29weSgpCiBpZiBQeVN0cmluZ01hcCBpcyBub3QgTm9uZToKLSAgICBkW1B5U3RyaW5nTWFwXSA9IF9jb3B5X3dpdGhfY29weV9tZXRob2QKKyAgICBkW1B5U3RyaW5nTWFwXSA9IFB5U3RyaW5nTWFwLmNvcHkKIAotZGVsIGQKK2RlbCBkLCB0CiAKIGRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOgogICAgICIiIkRlZXAgY29weSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLgpAQCAtMTc5LDcgKzE3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuKGRlZXApY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXMiICUgY2xzKQotICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgcnYsIDEsIG1lbW8pCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgeSA9IHgKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5ID0gX3JlY29uc3RydWN0KHgsIG1lbW8sICpydikKIAogICAgICMgSWYgaXMgaXRzIG93biBjb3B5LCBkb24ndCBtZW1vaXplLgogICAgIGlmIHkgaXMgbm90IHg6CkBAIC0xOTMsMTMgKzE5MSwxMSBAQAogICAgIHJldHVybiB4CiBkW3R5cGUoTm9uZSldID0gX2RlZXBjb3B5X2F0b21pYwogZFt0eXBlKEVsbGlwc2lzKV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWMKIGRbaW50XSA9IF9kZWVwY29weV9hdG9taWMKIGRbZmxvYXRdID0gX2RlZXBjb3B5X2F0b21pYwogZFtib29sXSA9IF9kZWVwY29weV9hdG9taWMKLXRyeToKLSAgICBkW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pYwotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCitkW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pYwogZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3N0cl0gPSBfZGVlcGNvcHlfYXRvbWljCiB0cnk6CkBAIC0yMTEsMTUgKzIwNywxNiBAQAogZFt0eXBlcy5GdW5jdGlvblR5cGVdID0gX2RlZXBjb3B5X2F0b21pYwogZFt3ZWFrcmVmLnJlZl0gPSBfZGVlcGNvcHlfYXRvbWljCiAKLWRlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfbGlzdCh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IFtdCiAgICAgbWVtb1tpZCh4KV0gPSB5CisgICAgYXBwZW5kID0geS5hcHBlbmQKICAgICBmb3IgYSBpbiB4OgotICAgICAgICB5LmFwcGVuZChkZWVwY29weShhLCBtZW1vKSkKKyAgICAgICAgYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQogICAgIHJldHVybiB5CiBkW2xpc3RdID0gX2RlZXBjb3B5X2xpc3QKIAotZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfdHVwbGUoeCwgbWVtbywgZGVlcGNvcHk9ZGVlcGNvcHkpOgogICAgIHkgPSBbZGVlcGNvcHkoYSwgbWVtbykgZm9yIGEgaW4geF0KICAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2UKICAgICAjIGNoZWNrIGZvciBpdCwgaW4gY2FzZSB0aGUgdHVwbGUgY29udGFpbnMgcmVjdXJzaXZlIG11dGFibGUgc3RydWN0dXJlcy4KQEAgLTIzNiw3ICsyMzMsNyBAQAogICAgIHJldHVybiB5CiBkW3R1cGxlXSA9IF9kZWVwY29weV90dXBsZQogCi1kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6CitkZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbywgZGVlcGNvcHk9ZGVlcGNvcHkpOgogICAgIHkgPSB7fQogICAgIG1lbW9baWQoeCldID0geQogICAgIGZvciBrZXksIHZhbHVlIGluIHguaXRlbXMoKToKQEAgLTI0OCw3ICsyNDUsOSBAQAogCiBkZWYgX2RlZXBjb3B5X21ldGhvZCh4LCBtZW1vKTogIyBDb3B5IGluc3RhbmNlIG1ldGhvZHMKICAgICByZXR1cm4gdHlwZSh4KSh4Ll9fZnVuY19fLCBkZWVwY29weSh4Ll9fc2VsZl9fLCBtZW1vKSkKLV9kZWVwY29weV9kaXNwYXRjaFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9tZXRob2QKK2RbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfbWV0aG9kCisKK2RlbCBkCiAKIGRlZiBfa2VlcF9hbGl2ZSh4LCBtZW1vKToKICAgICAiIiJLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHggaW4gdGhlIG1lbW8uCkBAIC0yNjYsMzEgKzI2NSwxNSBAQAogICAgICAgICAjIGFoYSwgdGhpcyBpcyB0aGUgZmlyc3Qgb25lIDotKQogICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF0KIAotZGVmIF9yZWNvbnN0cnVjdCh4LCBpbmZvLCBkZWVwLCBtZW1vPU5vbmUpOgotICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKToKLSAgICAgICAgcmV0dXJuIHgKLSAgICBhc3NlcnQgaXNpbnN0YW5jZShpbmZvLCB0dXBsZSkKLSAgICBpZiBtZW1vIGlzIE5vbmU6Ci0gICAgICAgIG1lbW8gPSB7fQotICAgIG4gPSBsZW4oaW5mbykKLSAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSkKLSAgICBjYWxsYWJsZSwgYXJncyA9IGluZm9bOjJdCi0gICAgaWYgbiA+IDI6Ci0gICAgICAgIHN0YXRlID0gaW5mb1syXQotICAgIGVsc2U6Ci0gICAgICAgIHN0YXRlID0gTm9uZQotICAgIGlmIG4gPiAzOgotICAgICAgICBsaXN0aXRlciA9IGluZm9bM10KLSAgICBlbHNlOgotICAgICAgICBsaXN0aXRlciA9IE5vbmUKLSAgICBpZiBuID4gNDoKLSAgICAgICAgZGljdGl0ZXIgPSBpbmZvWzRdCi0gICAgZWxzZToKLSAgICAgICAgZGljdGl0ZXIgPSBOb25lCitkZWYgX3JlY29uc3RydWN0KHgsIG1lbW8sIGZ1bmMsIGFyZ3MsCisgICAgICAgICAgICAgICAgIHN0YXRlPU5vbmUsIGxpc3RpdGVyPU5vbmUsIGRpY3RpdGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZXBjb3B5PWRlZXBjb3B5KToKKyAgICBkZWVwID0gbWVtbyBpcyBub3QgTm9uZQorICAgIGlmIGRlZXAgYW5kIGFyZ3M6CisgICAgICAgIGFyZ3MgPSAoZGVlcGNvcHkoYXJnLCBtZW1vKSBmb3IgYXJnIGluIGFyZ3MpCisgICAgeSA9IGZ1bmMoKmFyZ3MpCiAgICAgaWYgZGVlcDoKLSAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pCi0gICAgeSA9IGNhbGxhYmxlKCphcmdzKQotICAgIG1lbW9baWQoeCldID0geQorICAgICAgICBtZW1vW2lkKHgpXSA9IHkKIAogICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOgogICAgICAgICBpZiBkZWVwOgpAQCAtMzA5LDIyICsyOTIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih5LCBrZXksIHZhbHVlKQogCiAgICAgaWYgbGlzdGl0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgotICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgogICAgICAgICAgICAgICAgIGl0ZW0gPSBkZWVwY29weShpdGVtLCBtZW1vKQotICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgICAgICB5LmFwcGVuZChpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6CisgICAgICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKICAgICBpZiBkaWN0aXRlciBpcyBub3QgTm9uZToKLSAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6Ci0gICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6CiAgICAgICAgICAgICAgICAga2V5ID0gZGVlcGNvcHkoa2V5LCBtZW1vKQogICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pCi0gICAgICAgICAgICB5W2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKKyAgICAgICAgICAgICAgICB5W2tleV0gPSB2YWx1ZQogICAgIHJldHVybiB5CiAKLWRlbCBkCi0KLWRlbCB0eXBlcwotCi0jIEhlbHBlciBmb3IgaW5zdGFuY2UgY3JlYXRpb24gd2l0aG91dCBjYWxsaW5nIF9faW5pdF9fCi1jbGFzcyBfRW1wdHlDbGFzczoKLSAgICBwYXNzCitkZWwgdHlwZXMsIHdlYWtyZWYsIFB5U3RyaW5nTWFwCmRpZmYgLS1naXQgYS9MaWIvY3J5cHQucHkgYi9MaWIvY3J5cHQucHkKaW5kZXggNDlhYjk2ZS4uZmJjNWY0YyAxMDA2NDQKLS0tIGEvTGliL2NyeXB0LnB5CisrKyBiL0xpYi9jcnlwdC5weQpAQCAtNTQsOSArNTQsOCBAQAogTUVUSE9EX1NIQTUxMiA9IF9NZXRob2QoJ1NIQTUxMicsICc2JywgMTYsIDEwNikKIAogbWV0aG9kcyA9IFtdCi1mb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSk6Citmb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSwgTUVUSE9EX0NSWVBUKToKICAgICBfcmVzdWx0ID0gY3J5cHQoJycsIF9tZXRob2QpCiAgICAgaWYgX3Jlc3VsdCBhbmQgbGVuKF9yZXN1bHQpID09IF9tZXRob2QudG90YWxfc2l6ZToKICAgICAgICAgbWV0aG9kcy5hcHBlbmQoX21ldGhvZCkKLW1ldGhvZHMuYXBwZW5kKE1FVEhPRF9DUllQVCkKIGRlbCBfcmVzdWx0LCBfbWV0aG9kCmRpZmYgLS1naXQgYS9MaWIvY3N2LnB5IGIvTGliL2Nzdi5weQppbmRleCBjYTQwZTVlLi4yZTIzMDNhIDEwMDY0NAotLS0gYS9MaWIvY3N2LnB5CisrKyBiL0xpYi9jc3YucHkKQEAgLTExLDEzICsxMSwxNSBAQAogICAgICAgICAgICAgICAgICBfX2RvY19fCiBmcm9tIF9jc3YgaW1wb3J0IERpYWxlY3QgYXMgX0RpYWxlY3QKIAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAKLV9fYWxsX18gPSBbICJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAotICAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAotICAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAotICAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiIF0KK19fYWxsX18gPSBbIlFVT1RFX01JTklNQUwiLCAiUVVPVEVfQUxMIiwgIlFVT1RFX05PTk5VTUVSSUMiLCAiUVVPVEVfTk9ORSIsCisgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKKyAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCisgICAgICAgICAgICJyZWdpc3Rlcl9kaWFsZWN0IiwgImdldF9kaWFsZWN0IiwgImxpc3RfZGlhbGVjdHMiLCAiU25pZmZlciIsCisgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiwKKyAgICAgICAgICAgInVuaXhfZGlhbGVjdCJdCiAKIGNsYXNzIERpYWxlY3Q6CiAgICAgIiIiRGVzY3JpYmUgYSBDU1YgZGlhbGVjdC4KQEAgLTExNSw3ICsxMTcsNyBAQAogICAgICAgICAjIHZhbHVlcwogICAgICAgICB3aGlsZSByb3cgPT0gW106CiAgICAgICAgICAgICByb3cgPSBuZXh0KHNlbGYucmVhZGVyKQotICAgICAgICBkID0gZGljdCh6aXAoc2VsZi5maWVsZG5hbWVzLCByb3cpKQorICAgICAgICBkID0gT3JkZXJlZERpY3QoemlwKHNlbGYuZmllbGRuYW1lcywgcm93KSkKICAgICAgICAgbGYgPSBsZW4oc2VsZi5maWVsZG5hbWVzKQogICAgICAgICBsciA9IGxlbihyb3cpCiAgICAgICAgIGlmIGxmIDwgbHI6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCAwZDg2MDc4Li4xYzlkM2E1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTE2LDcgKzE2LDcgQEAKIGlmIF9fdmVyc2lvbl9fICE9IF9jdHlwZXNfdmVyc2lvbjoKICAgICByYWlzZSBFeGNlcHRpb24oIlZlcnNpb24gbnVtYmVyIG1pc21hdGNoIiwgX192ZXJzaW9uX18sIF9jdHlwZXNfdmVyc2lvbikKIAotaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgoraWYgX29zLm5hbWUgPT0gIm50IjoKICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IEZvcm1hdEVycm9yCiAKIERFRkFVTFRfTU9ERSA9IFJUTERfTE9DQUwKQEAgLTEwMywxMiArMTAzLDkgQEAKICAgICAgICAgX2NfZnVuY3R5cGVfY2FjaGVbKHJlc3R5cGUsIGFyZ3R5cGVzLCBmbGFncyldID0gQ0Z1bmN0aW9uVHlwZQogICAgICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnkgYXMgX2Rsb3BlbgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRlVOQ0ZMQUdfU1REQ0FMTCBhcyBfRlVOQ0ZMQUdfU1REQ0FMTAotICAgIGlmIF9vcy5uYW1lID09ICJjZSI6Ci0gICAgICAgICMgJ2NlJyBkb2Vzbid0IGhhdmUgdGhlIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uCi0gICAgICAgIF9GVU5DRkxBR19TVERDQUxMID0gX0ZVTkNGTEFHX0NERUNMCiAKICAgICBfd2luX2Z1bmN0eXBlX2NhY2hlID0ge30KICAgICBkZWYgV0lORlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzLCAqKmt3KToKQEAgLTI2Miw3ICsyNTksNyBAQAogZGVmIF9yZXNldF9jYWNoZSgpOgogICAgIF9wb2ludGVyX3R5cGVfY2FjaGUuY2xlYXIoKQogICAgIF9jX2Z1bmN0eXBlX2NhY2hlLmNsZWFyKCkKLSAgICBpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgaWYgX29zLm5hbWUgPT0gIm50IjoKICAgICAgICAgX3dpbl9mdW5jdHlwZV9jYWNoZS5jbGVhcigpCiAgICAgIyBfU2ltcGxlQ0RhdGEuY193Y2hhcl9wX2Zyb21fcGFyYW0KICAgICBQT0lOVEVSKGNfd2NoYXIpLmZyb21fcGFyYW0gPSBjX3djaGFyX3AuZnJvbV9wYXJhbQpAQCAtMzc0LDcgKzM3MSw3IEBACiAgICAgIiIiCiAgICAgX2Z1bmNfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogCiAgICAgY2xhc3MgV2luRExMKENETEwpOgogICAgICAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBkbGwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUKQEAgLTQyNyw3ICs0MjQsNyBAQAogY2RsbCA9IExpYnJhcnlMb2FkZXIoQ0RMTCkKIHB5ZGxsID0gTGlicmFyeUxvYWRlcihQeURMTCkKIAotaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgoraWYgX29zLm5hbWUgPT0gIm50IjoKICAgICBweXRob25hcGkgPSBQeURMTCgicHl0aG9uIGRsbCIsIE5vbmUsIF9zeXMuZGxsaGFuZGxlKQogZWxpZiBfc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgIHB5dGhvbmFwaSA9IFB5RExMKCJsaWJweXRob24lZC4lZC5kbGwiICUgX3N5cy52ZXJzaW9uX2luZm9bOjJdKQpAQCAtNDM1LDcgKzQzMiw3IEBACiAgICAgcHl0aG9uYXBpID0gUHlETEwoTm9uZSkKIAogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CitpZiBfb3MubmFtZSA9PSAibnQiOgogICAgIHdpbmRsbCA9IExpYnJhcnlMb2FkZXIoV2luRExMKQogICAgIG9sZWRsbCA9IExpYnJhcnlMb2FkZXIoT2xlRExMKQogCkBAIC01MDMsNyArNTAwLDcgQEAKICAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKIAogCi1pZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6ICMgQ09NIHN0dWZmCitpZiBfb3MubmFtZSA9PSAibnQiOiAjIENPTSBzdHVmZgogICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIuaW5wcm9jc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKaW5kZXggYjM5ZDgyYy4uYzcxZDcxZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQpAQCAtMyw3ICszLDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCiAKLWltcG9ydCBjdHlwZXMKIGltcG9ydCBfY3R5cGVzX3Rlc3QKIAogY2xhc3MgQklUUyhTdHJ1Y3R1cmUpOgpAQCAtMTk3LDcgKzE5Niw3IEBACiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCwgNCldCi0gICAgICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCkBAIC0yMjUsNyArMjI0LDcgQEAKICAgICAgICAgIyBNU1ZDIGRvZXMgTk9UIGNvbWJpbmUgY19zaG9ydCBhbmQgY19pbnQgaW50byBvbmUgZmllbGQsIEdDQwogICAgICAgICAjIGRvZXMgKHVubGVzcyBHQ0MgaXMgcnVuIHdpdGggJy1tbXMtYml0ZmllbGRzJyB3aGljaAogICAgICAgICAjIHByb2R1Y2VzIGNvZGUgY29tcGF0aWJsZSB3aXRoIE1TVkMpLgotICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKaW5kZXggMjBjNTMzNy4uYzcyMDVmNSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CkBAIC02OSw2ICs2OSw0OSBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGgubGV4aXN0cyh0ZXN0LnN1cHBvcnQuVEVTVEZOKSkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVzdWx0KQogCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpLAorICAgICAgICAgICAgICAgICAgICAgJ1Rlc3Qgb25seSB2YWxpZCBmb3IgTGludXgnKQorY2xhc3MgTGliUGF0aEZpbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9maW5kX29uX2xpYnBhdGgoc2VsZik6CisgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsnZ2NjJywgJy0tdmVyc2lvbiddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkKKyAgICAgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdnY2MsIG5lZWRlZCBmb3IgdGVzdCwgbm90IGF2YWlsYWJsZScpCisgICAgICAgIHdpdGggdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkgYXMgZDoKKyAgICAgICAgICAgICMgY3JlYXRlIGFuIGVtcHR5IHRlbXBvcmFyeSBmaWxlCisgICAgICAgICAgICBzcmNuYW1lID0gb3MucGF0aC5qb2luKGQsICdkdW1teS5jJykKKyAgICAgICAgICAgIGxpYm5hbWUgPSAncHlfY3R5cGVzX3Rlc3RfZHVtbXknCisgICAgICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5qb2luKGQsICdsaWIlcy5zbycgJSBsaWJuYW1lKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNyY25hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc3JjbmFtZSkpCisgICAgICAgICAgICAjIGNvbXBpbGUgdGhlIGZpbGUgdG8gYSBzaGFyZWQgbGlicmFyeQorICAgICAgICAgICAgY21kID0gWydnY2MnLCAnLW8nLCBkc3RuYW1lLCAnLS1zaGFyZWQnLAorICAgICAgICAgICAgICAgICAgICctV2wsLXNvbmFtZSxsaWIlcy5zbycgJSBsaWJuYW1lLCBzcmNuYW1lXQorICAgICAgICAgICAgb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGRzdG5hbWUpKQorICAgICAgICAgICAgIyBub3cgY2hlY2sgdGhhdCB0aGUgLnNvIGNhbid0IGJlIGZvdW5kIChzaW5jZSBub3QgaW4KKyAgICAgICAgICAgICMgTERfTElCUkFSWV9QQVRIKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZmluZF9saWJyYXJ5KGxpYm5hbWUpKQorICAgICAgICAgICAgIyBub3cgYWRkIHRoZSBsb2NhdGlvbiB0byBMRF9MSUJSQVJZX1BBVEgKKyAgICAgICAgICAgIHdpdGggdGVzdC5zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICAgICAgS0VZID0gJ0xEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgICAgICAgICBpZiBLRVkgbm90IGluIGVudjoKKyAgICAgICAgICAgICAgICAgICAgdiA9IGQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2ID0gJyVzOiVzJyAlIChlbnZbS0VZXSwgZCkKKyAgICAgICAgICAgICAgICBlbnYuc2V0KEtFWSwgdikKKyAgICAgICAgICAgICAgICAjIG5vdyBjaGVjayB0aGF0IHRoZSAuc28gY2FuIGJlIGZvdW5kIChzaW5jZSBpbgorICAgICAgICAgICAgICAgICMgTERfTElCUkFSWV9QQVRIKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWJyYXJ5KGxpYm5hbWUpLCAnbGliJXMuc28nICUgbGlibmFtZSkKKworCiAjIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBzdWZmaXggaXMgJy5zbycsCiAjIGF0IGxlYXN0IHNvbWUgbGlicmFyaWVzIGNhbiBiZSBsb2FkZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgY2RsbAogIyBvYmplY3QsIHNpbmNlIGN0eXBlcyBub3cgdHJpZXMgbG9hZGluZyB0aGUgbGliIGFnYWluCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQppbmRleCBmZjI1YzhmLi5mMzQ3MzRiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCiAKIHRyeToKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgIyBwb3NzaWJsZSwgYXMgaW4gQywgdG8gY2FsbCBjZGVjbCBmdW5jdGlvbnMgd2l0aCBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMsIDEsIDIsIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygxLCAyLCAzLCA0LCA1LCA2KSwgMykKLSAgICAgICAgaWYgbm90IFdJTkZVTkNUWVBFIGlzIENGVU5DVFlQRSBhbmQgb3MubmFtZSAhPSAiY2UiOgorICAgICAgICBpZiBub3QgV0lORlVOQ1RZUEUgaXMgQ0ZVTkNUWVBFOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLCAxLCAyLCAzKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0dXJlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDI4NDY4YzEuLjQ1NTcxZjMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtMTEsOCArMTEsNiBAQAogICAgIGdsb2JhbCBsaWJjX25hbWUKICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgIGxpYmNfbmFtZSA9IGZpbmRfbGlicmFyeSgiYyIpCi0gICAgZWxpZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgICAgIGxpYmNfbmFtZSA9ICJjb3JlZGxsIgogICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgogICAgICAgICBsaWJjX25hbWUgPSAiY3lnd2luMS5kbGwiCiAgICAgZWxzZToKQEAgLTQ5LDggKzQ3LDggQEAKICAgICAgICAgICAgICAgICBjZGxsLkxvYWRMaWJyYXJ5KGxpYikKICAgICAgICAgICAgICAgICBDRExMKGxpYikKIAotICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MnKQogICAgIGRlZiB0ZXN0X2xvYWRfbGlicmFyeShzZWxmKToKICAgICAgICAgIyBDUlQgaXMgbm8gbG9uZ2VyIGRpcmVjdGx5IGxvYWRhYmxlLiBTZWUgaXNzdWUyMzYwNiBmb3IgdGhlCiAgICAgICAgICMgZGlzY3Vzc2lvbiBhYm91dCBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzLgpAQCAtNjQsMTQgKzYyLDkgQEAKICAgICAgICAgICAgIHdpbmRsbFsia2VybmVsMzIiXS5HZXRNb2R1bGVIYW5kbGVXCiAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVwogICAgICAgICAgICAgV2luRExMKCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgICAgICAgICB3aW5kbGwuY29yZWRsbC5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICB3aW5kbGxbImNvcmVkbGwiXS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICBXaW5ETEwoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCiAKLSAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lIGluICgibnQiLCAiY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBzcGVjaWZpYyB0byBXaW5kb3dzIChOVC9DRSknKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBzcGVjaWZpYyB0byBXaW5kb3dzJykKICAgICBkZWYgdGVzdF9sb2FkX29yZGluYWxfZnVuY3Rpb25zKHNlbGYpOgogICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CiAgICAgICAgIGRsbCA9IFdpbkRMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQppbmRleCBlZjdiMjBiLi4xOWUzZGMxIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTU0LDcgKzU0LDcgQEAKIAogJycnCiAKLWltcG9ydCB1bml0dGVzdCwgZG9jdGVzdCwgc3lzCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QKIAogaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCBlNTZiY2NmLi4zNjNmNTg2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgdW5pdHRlc3QsIHN5cworaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICMgWFhYIFJlcGxhY2UgYnkgY19jaGFyX3AgdGVzdHMKICAgICBkZWYgdGVzdF9jc3RyaW5ncyhzZWxmKToKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcl9wLCBieXJlZgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyX3AKIAogICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKICAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdApAQCAtNjgsNyArNjgsNyBAQAogCiAgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQogICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6Ci0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgY193Y2hhcl9wCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKIAogICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSgiMTIzIikKIApAQCAtOTgsNyArOTgsNyBAQAogICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXIoc2VsZik6CiAgICAgICAgICMgVGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIG9mIFBPSU5URVIodHlwKSBjbGFzc2VzIGFjY2VwdHMgd2hhdCBpcwogICAgICAgICAjIHJldHVybmVkIGJ5IGJ5cmVmKG9iaiksIGl0IHR5cGUob2JqKSA9PSB0eXAKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgcG9pbnRlciwgUE9JTlRFUiwgYnlyZWYKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgYnlyZWYKICAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQogCiAgICAgICAgIExQSU5ULmZyb21fcGFyYW0oYnlyZWYoY19pbnQoNDIpKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDMyZjgwMmMuLmQ2ODM5N2UgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKLWltcG9ydCByZSwgc3RydWN0LCBzeXMKK2ltcG9ydCByZSwgc3lzCiAKIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgVEhJU19FTkRJQU4gPSAiPCIKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggOTNlYmE2Yi4uMTk3NGY0MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCi1pbXBvcnQgb3MKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CmluZGV4IGY5YjVlOTcuLjRjZWFjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCBjNGE2NTFjLi44ZjZmZTVmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTMyNiwxMSArMzI2LDggQEAKIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sIGIiU29tZW9uZSIsIChiImEiLCBiImIiLCBiImMiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKLSAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDxjbGFzcyAnVHlwZUVycm9yJz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgVHlwZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPGNsYXNzICdUeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKIAogICAgIGRlZiB0ZXN0X2h1Z2VfZmllbGRfbmFtZShzZWxmKToKICAgICAgICAgIyBpc3N1ZTEyODgxOiBzZWdmYXVsdCB3aXRoIGxhcmdlIHN0cnVjdHVyZSBmaWVsZCBuYW1lcwpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CmluZGV4IDVhM2E0N2YuLmU3MWI0ODAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTc5LDkgKzc5LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLmRlY29kZSgiYXNjaWkiKSwgZW50cnkuc2l6ZSkpCiAKLSAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxNjEpLAotICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18iLCAtMTYxKSwKLSAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fLnNwYW0iLCAxNjEpLAorICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEzOSksCisgICAgICAgICAgICAgICAgICAgICgiX19waGVsbG9fXyIsIC0xMzkpLAorICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18uc3BhbSIsIDEzOSksCiAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQsICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIGV4YW1wbGUgIgogICAgICAgICAgICAgImluIERvYy9saWJyYXJ5L2N0eXBlcy5yc3QgbWF5IGJlIG91dCBvZiBkYXRlIikKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdXRpbC5weSBiL0xpYi9jdHlwZXMvdXRpbC5weQppbmRleCA3Njg0ZWFiLi4zMzlhZThhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3V0aWwucHkKKysrIGIvTGliL2N0eXBlcy91dGlsLnB5CkBAIC02NywxNiArNjcsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBmbmFtZQogICAgICAgICByZXR1cm4gTm9uZQogCi1pZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgIyBzZWFyY2ggcGF0aCBhY2NvcmRpbmcgdG8gTVNETjoKLSAgICAjIC0gYWJzb2x1dGUgcGF0aCBzcGVjaWZpZWQgYnkgZmlsZW5hbWUKLSAgICAjIC0gVGhlIC5leGUgbGF1bmNoIGRpcmVjdG9yeQotICAgICMgLSB0aGUgV2luZG93cyBkaXJlY3RvcnkKLSAgICAjIC0gUk9NIGRsbCBmaWxlcyAod2hlcmUgYXJlIHRoZXk/KQotICAgICMgLSBPRU0gc3BlY2lmaWVkIHNlYXJjaCBwYXRoOiBIS0xNXExvYWRlclxTeXN0ZW1QYXRoCi0gICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKLSAgICAgICAgcmV0dXJuIG5hbWUKLQogaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgZnJvbSBjdHlwZXMubWFjaG9saWIuZHlsZCBpbXBvcnQgZHlsZF9maW5kIGFzIF9keWxkX2ZpbmQKICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUpOgpAQCAtMjcxLDggKzI2MSw4IEBACiAgICAgICAgICAgICBhYmlfdHlwZSA9IG1hY2hfbWFwLmdldChtYWNoaW5lLCAnbGliYzYnKQogCiAgICAgICAgICAgICAjIFhYWCBhc3N1bWluZyBHTElCQydzIGxkY29uZmlnICh3aXRoIG9wdGlvbiAtcCkKLSAgICAgICAgICAgIHJlZ2V4ID0gb3MuZnNlbmNvZGUoCi0gICAgICAgICAgICAgICAgJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQorICAgICAgICAgICAgcmVnZXggPSByJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnCisgICAgICAgICAgICByZWdleCA9IG9zLmZzZW5jb2RlKHJlZ2V4ICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihbJy9zYmluL2xkY29uZmlnJywgJy1wJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuREVWTlVMTCwKQEAgLTI4NSw4ICsyNzUsMzIgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKIAorICAgICAgICBkZWYgX2ZpbmRMaWJfbGQobmFtZSk6CisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjOTk5OCBmb3Igd2h5IHRoaXMgaXMgbmVlZGVkCisgICAgICAgICAgICBleHByID0gcidbXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgcmUuZXNjYXBlKG5hbWUpCisgICAgICAgICAgICBjbWQgPSBbJ2xkJywgJy10J10KKyAgICAgICAgICAgIGxpYnBhdGggPSBvcy5lbnZpcm9uLmdldCgnTERfTElCUkFSWV9QQVRIJykKKyAgICAgICAgICAgIGlmIGxpYnBhdGg6CisgICAgICAgICAgICAgICAgZm9yIGQgaW4gbGlicGF0aC5zcGxpdCgnOicpOgorICAgICAgICAgICAgICAgICAgICBjbWQuZXh0ZW5kKFsnLUwnLCBkXSkKKyAgICAgICAgICAgIGNtZC5leHRlbmQoWyctbycsIG9zLmRldm51bGwsICctbCVzJyAlIG5hbWVdKQorICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorICAgICAgICAgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChleHByLCBvcy5mc2RlY29kZShvdXQpKQorICAgICAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzLmdyb3VwKDApCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgcGFzcyAgIyByZXN1bHQgd2lsbCBiZSBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKICAgICAgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKLSAgICAgICAgICAgIHJldHVybiBfZmluZFNvbmFtZV9sZGNvbmZpZyhuYW1lKSBvciBfZ2V0X3NvbmFtZShfZmluZExpYl9nY2MobmFtZSkpCisgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjOTk5OAorICAgICAgICAgICAgcmV0dXJuIF9maW5kU29uYW1lX2xkY29uZmlnKG5hbWUpIG9yIFwKKyAgICAgICAgICAgICAgICAgICBfZ2V0X3NvbmFtZShfZmluZExpYl9nY2MobmFtZSkgb3IgX2ZpbmRMaWJfbGQobmFtZSkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgdGVzdCBjb2RlCmRpZmYgLS1naXQgYS9MaWIvZGF0ZXRpbWUucHkgYi9MaWIvZGF0ZXRpbWUucHkKaW5kZXggYTIxNzhjNy4uMzYzNzRhYSAxMDA2NDQKLS0tIGEvTGliL2RhdGV0aW1lLnB5CisrKyBiL0xpYi9kYXRldGltZS5weQpAQCAtMTUyLDEyICsxNTIsMjYgQEAKICAgICBkbnVtID0gX2RheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZAogICAgIHJldHVybiBfdGltZS5zdHJ1Y3RfdGltZSgoeSwgbSwgZCwgaGgsIG1tLCBzcywgd2RheSwgZG51bSwgZHN0ZmxhZykpCiAKLWRlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMpOgotICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KLSAgICByZXN1bHQgPSAiJTAyZDolMDJkOiUwMmQiICUgKGhoLCBtbSwgc3MpCi0gICAgaWYgdXM6Ci0gICAgICAgIHJlc3VsdCArPSAiLiUwNmQiICUgdXMKLSAgICByZXR1cm4gcmVzdWx0CitkZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzLCB0aW1lc3BlYz0nYXV0bycpOgorICAgIHNwZWNzID0geworICAgICAgICAnaG91cnMnOiAnezowMmR9JywKKyAgICAgICAgJ21pbnV0ZXMnOiAnezowMmR9Ons6MDJkfScsCisgICAgICAgICdzZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9JywKKyAgICAgICAgJ21pbGxpc2Vjb25kcyc6ICd7OjAyZH06ezowMmR9Ons6MDJkfS57OjAzZH0nLAorICAgICAgICAnbWljcm9zZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9Lns6MDZkfScKKyAgICB9CisKKyAgICBpZiB0aW1lc3BlYyA9PSAnYXV0byc6CisgICAgICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KKyAgICAgICAgdGltZXNwZWMgPSAnbWljcm9zZWNvbmRzJyBpZiB1cyBlbHNlICdzZWNvbmRzJworICAgIGVsaWYgdGltZXNwZWMgPT0gJ21pbGxpc2Vjb25kcyc6CisgICAgICAgIHVzIC8vPSAxMDAwCisgICAgdHJ5OgorICAgICAgICBmbXQgPSBzcGVjc1t0aW1lc3BlY10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gdGltZXNwZWMgdmFsdWUnKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KGhoLCBtbSwgc3MsIHVzKQogCiAjIENvcnJlY3RseSBzdWJzdGl0dXRlIGZvciAleiBhbmQgJVogZXNjYXBlcyBpbiBzdHJmdGltZSBmb3JtYXRzLgogZGVmIF93cmFwX3N0cmZ0aW1lKG9iamVjdCwgZm9ybWF0LCB0aW1ldHVwbGUpOgpAQCAtMjM2LDExICsyNTAsMTEgQEAKICAgICBpZiBub3QgaXNpbnN0YW5jZShvZmZzZXQsIHRpbWVkZWx0YSk6CiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gTm9uZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAib3IgdGltZWRlbHRhLCBub3QgJyVzJyIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSkKLSAgICBpZiBvZmZzZXQgJSB0aW1lZGVsdGEobWludXRlcz0xKSBvciBvZmZzZXQubWljcm9zZWNvbmRzOgorICAgIGlmIG9mZnNldC5taWNyb3NlY29uZHM6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgd2hvbGUgbnVtYmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAib2YgbWludXRlcywgZ290ICVzIiAlIChuYW1lLCBvZmZzZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBzZWNvbmRzLCBnb3QgJXMiICUgKG5hbWUsIG9mZnNldCkpCiAgICAgaWYgbm90IC10aW1lZGVsdGEoMSkgPCBvZmZzZXQgPCB0aW1lZGVsdGEoMSk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzKCk9JXMsIG11c3QgYmUgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMoKT0lcywgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiLXRpbWVkZWx0YShob3Vycz0yNCkgYW5kIHRpbWVkZWx0YShob3Vycz0yNCkiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgb2Zmc2V0KSkKIApAQCAtMjc0LDcgKzI4OCw3IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2RheSBtdXN0IGJlIGluIDEuLiVkJyAlIGRpbSwgZGF5KQogICAgIHJldHVybiB5ZWFyLCBtb250aCwgZGF5CiAKLWRlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKToKK2RlZiBfY2hlY2tfdGltZV9maWVsZHMoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCBmb2xkKToKICAgICBob3VyID0gX2NoZWNrX2ludF9maWVsZChob3VyKQogICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKQogICAgIHNlY29uZCA9IF9jaGVja19pbnRfZmllbGQoc2Vjb25kKQpAQCAtMjg3LDcgKzMwMSw5IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKQogICAgIGlmIG5vdCAwIDw9IG1pY3Jvc2Vjb25kIDw9IDk5OTk5OToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTknLCBtaWNyb3NlY29uZCkKLSAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kCisgICAgaWYgZm9sZCBub3QgaW4gKDAsIDEpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmb2xkIG11c3QgYmUgZWl0aGVyIDAgb3IgMScsIGZvbGQpCisgICAgcmV0dXJuIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZAogCiBkZWYgX2NoZWNrX3R6aW5mb19hcmcodHopOgogICAgIGlmIHR6IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKToKQEAgLTMxNiw2ICszMzIsNyBAQAogCiAgICAgcmV0dXJuIHEKIAorCiBjbGFzcyB0aW1lZGVsdGE6CiAgICAgIiIiUmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGV0aW1lIG9iamVjdHMuCiAKQEAgLTkxNSw3ICs5MzIsNyBAQAogCiAgICAgIyBQaWNrbGUgc3VwcG9ydC4KIAotICAgIGRlZiBfZ2V0c3RhdGUoc2VsZik6CisgICAgZGVmIF9nZXRzdGF0ZShzZWxmLCBwcm90b2NvbD0zKToKICAgICAgICAgeWhpLCB5bG8gPSBkaXZtb2Qoc2VsZi5feWVhciwgMjU2KQogICAgICAgICByZXR1cm4gYnl0ZXMoW3loaSwgeWxvLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5XSksCiAKQEAgLTkyMyw4ICs5NDAsOCBAQAogICAgICAgICB5aGksIHlsbywgc2VsZi5fbW9udGgsIHNlbGYuX2RheSA9IHN0cmluZwogICAgICAgICBzZWxmLl95ZWFyID0geWhpICogMjU2ICsgeWxvCiAKLSAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgc2VsZi5fZ2V0c3RhdGUoKSkKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIHNlbGYuX2dldHN0YXRlKHByb3RvY29sKSkKIAogX2RhdGVfY2xhc3MgPSBkYXRlICAjIHNvIGZ1bmN0aW9ucyB3LyBhcmdzIG5hbWVkICJkYXRlIiBjYW4gZ2V0IGF0IHRoZSBjbGFzcwogCkBAIC05MzIsNiArOTQ5LDcgQEAKIGRhdGUubWF4ID0gZGF0ZSg5OTk5LCAxMiwgMzEpCiBkYXRlLnJlc29sdXRpb24gPSB0aW1lZGVsdGEoZGF5cz0xKQogCisKIGNsYXNzIHR6aW5mbzoKICAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBjbGFzc2VzLgogCkBAIC0xMDIzLDExICsxMDQxLDExIEBACiAgICAgZHN0KCkKIAogICAgIFByb3BlcnRpZXMgKHJlYWRvbmx5KToKLSAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbworICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvLCBmb2xkCiAgICAgIiIiCi0gICAgX19zbG90c19fID0gJ19ob3VyJywgJ19taW51dGUnLCAnX3NlY29uZCcsICdfbWljcm9zZWNvbmQnLCAnX3R6aW5mbycsICdfaGFzaGNvZGUnCisgICAgX19zbG90c19fID0gJ19ob3VyJywgJ19taW51dGUnLCAnX3NlY29uZCcsICdfbWljcm9zZWNvbmQnLCAnX3R6aW5mbycsICdfaGFzaGNvZGUnLCAnX2ZvbGQnCiAKLSAgICBkZWYgX19uZXdfXyhjbHMsIGhvdXI9MCwgbWludXRlPTAsIHNlY29uZD0wLCBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUsICosIGZvbGQ9MCk6CiAgICAgICAgICIiIkNvbnN0cnVjdG9yLgogCiAgICAgICAgIEFyZ3VtZW50czoKQEAgLTEwMzUsMTUgKzEwNTMsMTYgQEAKICAgICAgICAgaG91ciwgbWludXRlIChyZXF1aXJlZCkKICAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKQogICAgICAgICB0emluZm8gKGRlZmF1bHQgdG8gTm9uZSkKKyAgICAgICAgZm9sZCAoa2V5d29yZCBvbmx5LCBkZWZhdWx0IHRvIFRydWUpCiAgICAgICAgICIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGhvdXIsIGJ5dGVzKSBhbmQgbGVuKGhvdXIpID09IDYgYW5kIGhvdXJbMF0gPCAyNDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShob3VyLCBieXRlcykgYW5kIGxlbihob3VyKSA9PSA2IGFuZCBob3VyWzBdJjB4N0YgPCAyNDoKICAgICAgICAgICAgICMgUGlja2xlIHN1cHBvcnQKICAgICAgICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpCiAgICAgICAgICAgICBzZWxmLl9fc2V0c3RhdGUoaG91ciwgbWludXRlIG9yIE5vbmUpCiAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xCiAgICAgICAgICAgICByZXR1cm4gc2VsZgotICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoCi0gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpCisgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCA9IF9jaGVja190aW1lX2ZpZWxkcygKKyAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCkKICAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKQogICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICBzZWxmLl9ob3VyID0gaG91cgpAQCAtMTA1Miw2ICsxMDcxLDcgQEAKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZAogICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm8KICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQorICAgICAgICBzZWxmLl9mb2xkID0gZm9sZAogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzCkBAIC0xMDgwLDYgKzExMDAsMTAgQEAKICAgICAgICAgIiIidGltZXpvbmUgaW5mbyBvYmplY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mbwogCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mb2xkCisKICAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpCiAKICAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLgpAQCAtMTE0NSw5ICsxMTY5LDEzIEBACiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICAiIiJIYXNoLiIiIgogICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMToKLSAgICAgICAgICAgIHR6b2ZmID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICAgICAgaWYgc2VsZi5mb2xkOgorICAgICAgICAgICAgICAgIHQgPSBzZWxmLnJlcGxhY2UoZm9sZD0wKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ID0gc2VsZgorICAgICAgICAgICAgdHpvZmYgPSB0LnV0Y29mZnNldCgpCiAgICAgICAgICAgICBpZiBub3QgdHpvZmY6ICAjIHplcm8gb3IgTm9uZQotICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0Ll9nZXRzdGF0ZSgpWzBdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBoLCBtID0gZGl2bW9kKHRpbWVkZWx0YShob3Vycz1zZWxmLmhvdXIsIG1pbnV0ZXM9c2VsZi5taW51dGUpIC0gdHpvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZGVsdGEoaG91cnM9MSkpCkBAIC0xMTcxLDEwICsxMTk5LDExIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNpZ24gPSAiKyIKICAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIHRpbWVkZWx0YShob3Vycz0xKSkKLSAgICAgICAgICAgIGFzc2VydCBub3QgbW0gJSB0aW1lZGVsdGEobWludXRlcz0xKSwgIndob2xlIG1pbnV0ZSIKLSAgICAgICAgICAgIG1tIC8vPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgbW0sIHNzID0gZGl2bW9kKG1tLCB0aW1lZGVsdGEobWludXRlcz0xKSkKICAgICAgICAgICAgIGFzc2VydCAwIDw9IGhoIDwgMjQKICAgICAgICAgICAgIG9mZiA9ICIlcyUwMmQlcyUwMmQiICUgKHNpZ24sIGhoLCBzZXAsIG1tKQorICAgICAgICAgICAgaWYgc3M6CisgICAgICAgICAgICAgICAgb2ZmICs9ICc6JTAyZCcgJSBzcy5zZWNvbmRzCiAgICAgICAgIHJldHVybiBvZmYKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTExOTEsMTYgKzEyMjAsMjIgQEAKICAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSAiKSIKICAgICAgICAgICAgIHMgPSBzWzotMV0gKyAiLCB0emluZm89JXIiICUgc2VsZi5fdHppbmZvICsgIikiCisgICAgICAgIGlmIHNlbGYuX2ZvbGQ6CisgICAgICAgICAgICBhc3NlcnQgc1stMTpdID09ICIpIgorICAgICAgICAgICAgcyA9IHNbOi0xXSArICIsIGZvbGQ9MSkiCiAgICAgICAgIHJldHVybiBzCiAKLSAgICBkZWYgaXNvZm9ybWF0KHNlbGYpOgorICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgdGltZXNwZWM9J2F1dG8nKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLgogCi0gICAgICAgIFRoaXMgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicsIG9yICdISDpNTTpTUyt6ejp6eicgaWYKLSAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorICAgICAgICBUaGUgZnVsbCBmb3JtYXQgaXMgJ0hIOk1NOlNTLm1tbW1tbSt6ejp6eicuIEJ5IGRlZmF1bHQsIHRoZSBmcmFjdGlvbmFsCisgICAgICAgIHBhcnQgaXMgb21pdHRlZCBpZiBzZWxmLm1pY3Jvc2Vjb25kID09IDAuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgICAgdGVybXMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS4KICAgICAgICAgIiIiCiAgICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kLCB0aW1lc3BlYykKICAgICAgICAgdHogPSBzZWxmLl90enN0cigpCiAgICAgICAgIGlmIHR6OgogICAgICAgICAgICAgcyArPSB0egpAQCAtMTI2Niw3ICsxMzAxLDcgQEAKICAgICAgICAgcmV0dXJuIG9mZnNldAogCiAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgaG91cj1Ob25lLCBtaW51dGU9Tm9uZSwgc2Vjb25kPU5vbmUsIG1pY3Jvc2Vjb25kPU5vbmUsCi0gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOgorICAgICAgICAgICAgICAgIHR6aW5mbz1UcnVlLCAqLCBmb2xkPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gYSBuZXcgdGltZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLiIiIgogICAgICAgICBpZiBob3VyIGlzIE5vbmU6CiAgICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyCkBAIC0xMjc4LDE0ICsxMzEzLDE5IEBACiAgICAgICAgICAgICBtaWNyb3NlY29uZCA9IHNlbGYubWljcm9zZWNvbmQKICAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6CiAgICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mbwotICAgICAgICByZXR1cm4gdGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mbykKKyAgICAgICAgaWYgZm9sZCBpcyBOb25lOgorICAgICAgICAgICAgZm9sZCA9IHNlbGYuX2ZvbGQKKyAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8sIGZvbGQ9Zm9sZCkKIAogICAgICMgUGlja2xlIHN1cHBvcnQuCiAKLSAgICBkZWYgX2dldHN0YXRlKHNlbGYpOgorICAgIGRlZiBfZ2V0c3RhdGUoc2VsZiwgcHJvdG9jb2w9Myk6CiAgICAgICAgIHVzMiwgdXMzID0gZGl2bW9kKHNlbGYuX21pY3Jvc2Vjb25kLCAyNTYpCiAgICAgICAgIHVzMSwgdXMyID0gZGl2bW9kKHVzMiwgMjU2KQotICAgICAgICBiYXNlc3RhdGUgPSBieXRlcyhbc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCisgICAgICAgIGggPSBzZWxmLl9ob3VyCisgICAgICAgIGlmIHNlbGYuX2ZvbGQgYW5kIHByb3RvY29sID4gMzoKKyAgICAgICAgICAgIGggKz0gMTI4CisgICAgICAgIGJhc2VzdGF0ZSA9IGJ5dGVzKFtoLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzMSwgdXMyLCB1czNdKQogICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAoYmFzZXN0YXRlLCkKQEAgLTEyOTUsMTIgKzEzMzUsMTggQEAKICAgICBkZWYgX19zZXRzdGF0ZShzZWxmLCBzdHJpbmcsIHR6aW5mbyk6CiAgICAgICAgIGlmIHR6aW5mbyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHppbmZvLCBfdHppbmZvX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYmFkIHR6aW5mbyBzdGF0ZSBhcmciKQotICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgdXMxLCB1czIsIHVzMyA9IHN0cmluZworICAgICAgICBoLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwgdXMxLCB1czIsIHVzMyA9IHN0cmluZworICAgICAgICBpZiBoID4gMTI3OgorICAgICAgICAgICAgc2VsZi5fZm9sZCA9IDEKKyAgICAgICAgICAgIHNlbGYuX2hvdXIgPSBoIC0gMTI4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMAorICAgICAgICAgICAgc2VsZi5faG91ciA9IGgKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSAoKCh1czEgPDwgOCkgfCB1czIpIDw8IDgpIHwgdXMzCiAgICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mbwogCi0gICAgZGVmIF9fcmVkdWNlX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAodGltZSwgc2VsZi5fZ2V0c3RhdGUoKSkKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHJldHVybiAodGltZSwgc2VsZi5fZ2V0c3RhdGUocHJvdG9jb2wpKQogCiBfdGltZV9jbGFzcyA9IHRpbWUgICMgc28gZnVuY3Rpb25zIHcvIGFyZ3MgbmFtZWQgInRpbWUiIGNhbiBnZXQgYXQgdGhlIGNsYXNzCiAKQEAgLTEzMTcsMTYgKzEzNjMsMTYgQEAKICAgICBfX3Nsb3RzX18gPSBkYXRlLl9fc2xvdHNfXyArIHRpbWUuX19zbG90c19fCiAKICAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwKLSAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoeWVhciwgYnl0ZXMpIGFuZCBsZW4oeWVhcikgPT0gMTAgYW5kIDEgPD0geWVhclsyXSA8PSAxMjoKKyAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0wLCB0emluZm89Tm9uZSwgKiwgZm9sZD0wKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh5ZWFyLCBieXRlcykgYW5kIGxlbih5ZWFyKSA9PSAxMCBhbmQgMSA8PSB5ZWFyWzJdJjB4N0YgPD0gMTI6CiAgICAgICAgICAgICAjIFBpY2tsZSBzdXBwb3J0CiAgICAgICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICAgICAgc2VsZi5fX3NldHN0YXRlKHllYXIsIG1vbnRoKQogICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQogICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KQotICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoCi0gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpCisgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCA9IF9jaGVja190aW1lX2ZpZWxkcygKKyAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgZm9sZCkKICAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKQogICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgICBzZWxmLl95ZWFyID0geWVhcgpAQCAtMTMzOCw2ICsxMzg0LDcgQEAKICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZAogICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm8KICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMQorICAgICAgICBzZWxmLl9mb2xkID0gZm9sZAogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzCkBAIC0xMzY2LDYgKzE0MTMsMTAgQEAKICAgICAgICAgIiIidGltZXpvbmUgaW5mbyBvYmplY3QiIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mbwogCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mb2xkCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX2Zyb210aW1lc3RhbXAoY2xzLCB0LCB1dGMsIHR6KToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuCkBAIC0xMzg0LDcgKzE0MzUsMjMgQEAKICAgICAgICAgY29udmVydGVyID0gX3RpbWUuZ210aW1lIGlmIHV0YyBlbHNlIF90aW1lLmxvY2FsdGltZQogICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBjb252ZXJ0ZXIodCkKICAgICAgICAgc3MgPSBtaW4oc3MsIDU5KSAgICAjIGNsYW1wIG91dCBsZWFwIHNlY29uZHMgaWYgdGhlIHBsYXRmb3JtIGhhcyB0aGVtCi0gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICByZXN1bHQgPSBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICBpZiB0eiBpcyBOb25lOgorICAgICAgICAgICAgIyBBcyBvZiB2ZXJzaW9uIDIwMTVmIG1heCBmb2xkIGluIElBTkEgZGF0YWJhc2UgaXMKKyAgICAgICAgICAgICMgMjMgaG91cnMgYXQgMTk2OS0wOS0zMCAxMzowMDowMCBpbiBLd2FqYWxlaW4uCisgICAgICAgICAgICAjIExldCdzIHByb2JlIDI0IGhvdXJzIGluIHRoZSBwYXN0IHRvIGRldGVjdCBhIHRyYW5zaXRpb246CisgICAgICAgICAgICBtYXhfZm9sZF9zZWNvbmRzID0gMjQgKiAzNjAwCisgICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzID0gY29udmVydGVyKHQgLSBtYXhfZm9sZF9zZWNvbmRzKVs6Nl0KKyAgICAgICAgICAgIHByb2JlMSA9IGNscyh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHopCisgICAgICAgICAgICB0cmFucyA9IHJlc3VsdCAtIHByb2JlMSAtIHRpbWVkZWx0YSgwLCBtYXhfZm9sZF9zZWNvbmRzKQorICAgICAgICAgICAgaWYgdHJhbnMuZGF5cyA8IDA6CisgICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcyA9IGNvbnZlcnRlcih0ICsgdHJhbnMgLy8gdGltZWRlbHRhKDAsIDEpKVs6Nl0KKyAgICAgICAgICAgICAgICBwcm9iZTIgPSBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6KQorICAgICAgICAgICAgICAgIGlmIHByb2JlMiA9PSByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5fZm9sZCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHR6LmZyb211dGMocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZnJvbXRpbWVzdGFtcChjbHMsIHQsIHR6PU5vbmUpOgpAQCAtMTM5NCwxMCArMTQ2MSw3IEBACiAgICAgICAgICIiIgogICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0eikKIAotICAgICAgICByZXN1bHQgPSBjbHMuX2Zyb210aW1lc3RhbXAodCwgdHogaXMgbm90IE5vbmUsIHR6KQotICAgICAgICBpZiB0eiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJlc3VsdCA9IHR6LmZyb211dGMocmVzdWx0KQotICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBjbHMuX2Zyb210aW1lc3RhbXAodCwgdHogaXMgbm90IE5vbmUsIHR6KQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHV0Y2Zyb210aW1lc3RhbXAoY2xzLCB0KToKQEAgLTE0MTcsMTUgKzE0ODEsMTcgQEAKICAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOgorICAgIGRlZiBjb21iaW5lKGNscywgZGF0ZSwgdGltZSwgdHppbmZvPVRydWUpOgogICAgICAgICAiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIGdpdmVuIGRhdGUgYW5kIGEgZ2l2ZW4gdGltZS4iCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGUsIF9kYXRlX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZSIpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRpbWUsIF90aW1lX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGltZSBhcmd1bWVudCBtdXN0IGJlIGEgdGltZSBpbnN0YW5jZSIpCisgICAgICAgIGlmIHR6aW5mbyBpcyBUcnVlOgorICAgICAgICAgICAgdHppbmZvID0gdGltZS50emluZm8KICAgICAgICAgcmV0dXJuIGNscyhkYXRlLnllYXIsIGRhdGUubW9udGgsIGRhdGUuZGF5LAogICAgICAgICAgICAgICAgICAgIHRpbWUuaG91ciwgdGltZS5taW51dGUsIHRpbWUuc2Vjb25kLCB0aW1lLm1pY3Jvc2Vjb25kLAotICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKQorICAgICAgICAgICAgICAgICAgIHR6aW5mbywgZm9sZD10aW1lLmZvbGQpCiAKICAgICBkZWYgdGltZXR1cGxlKHNlbGYpOgogICAgICAgICAiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIgpAQCAtMTQ0MCwxMiArMTUwNiw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCkKIAorICAgIGRlZiBfbWt0aW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW50ZWdlciBQT1NJWCB0aW1lc3RhbXAuIiIiCisgICAgICAgIGVwb2NoID0gZGF0ZXRpbWUoMTk3MCwgMSwgMSkKKyAgICAgICAgbWF4X2ZvbGRfc2Vjb25kcyA9IDI0ICogMzYwMAorICAgICAgICB0ID0gKHNlbGYgLSBlcG9jaCkgLy8gdGltZWRlbHRhKDAsIDEpCisgICAgICAgIGRlZiBsb2NhbCh1KToKKyAgICAgICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MgPSBfdGltZS5sb2NhbHRpbWUodSlbOjZdCisgICAgICAgICAgICByZXR1cm4gKGRhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MpIC0gZXBvY2gpIC8vIHRpbWVkZWx0YSgwLCAxKQorCisgICAgICAgICMgT3VyIGdvYWwgaXMgdG8gc29sdmUgdCA9IGxvY2FsKHUpIGZvciB1LgorICAgICAgICBhID0gbG9jYWwodCkgLSB0CisgICAgICAgIHUxID0gdCAtIGEKKyAgICAgICAgdDEgPSBsb2NhbCh1MSkKKyAgICAgICAgaWYgdDEgPT0gdDoKKyAgICAgICAgICAgICMgV2UgZm91bmQgb25lIHNvbHV0aW9uLCBidXQgaXQgbWF5IG5vdCBiZSB0aGUgb25lIHdlIG5lZWQuCisgICAgICAgICAgICAjIExvb2sgZm9yIGFuIGVhcmxpZXIgc29sdXRpb24gKGlmIGBmb2xkYCBpcyAwKSwgb3IgYQorICAgICAgICAgICAgIyBsYXRlciBvbmUgKGlmIGBmb2xkYCBpcyAxKS4KKyAgICAgICAgICAgIHUyID0gdTEgKyAoLW1heF9mb2xkX3NlY29uZHMsIG1heF9mb2xkX3NlY29uZHMpW3NlbGYuZm9sZF0KKyAgICAgICAgICAgIGIgPSBsb2NhbCh1MikgLSB1MgorICAgICAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgICAgIHJldHVybiB1MQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYiA9IHQxIC0gdTEKKyAgICAgICAgICAgIGFzc2VydCBhICE9IGIKKyAgICAgICAgdTIgPSB0IC0gYgorICAgICAgICB0MiA9IGxvY2FsKHUyKQorICAgICAgICBpZiB0MiA9PSB0OgorICAgICAgICAgICAgcmV0dXJuIHUyCisgICAgICAgIGlmIHQxID09IHQ6CisgICAgICAgICAgICByZXR1cm4gdTEKKyAgICAgICAgIyBXZSBoYXZlIGZvdW5kIGJvdGggb2Zmc2V0cyBhIGFuZCBiLCBidXQgbmVpdGhlciB0IC0gYSBub3IgdCAtIGIgaXMKKyAgICAgICAgIyBhIHNvbHV0aW9uLiAgVGhpcyBtZWFucyB0IGlzIGluIHRoZSBnYXAuCisgICAgICAgIHJldHVybiAobWF4LCBtaW4pW3NlbGYuZm9sZF0odTEsIHUyKQorCisKICAgICBkZWYgdGltZXN0YW1wKHNlbGYpOgogICAgICAgICAiUmV0dXJuIFBPU0lYIHRpbWVzdGFtcCBhcyBmbG9hdCIKICAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gX3RpbWUubWt0aW1lKChzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xKSkgKyBzZWxmLm1pY3Jvc2Vjb25kIC8gMWU2CisgICAgICAgICAgICBzID0gc2VsZi5fbWt0aW1lKCkKKyAgICAgICAgICAgIHJldHVybiBzICsgc2VsZi5taWNyb3NlY29uZCAvIDFlNgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIChzZWxmIC0gX0VQT0NIKS50b3RhbF9zZWNvbmRzKCkKIApAQCAtMTQ2NCwxNSArMTU2NCwxNiBAQAogCiAgICAgZGVmIHRpbWUoc2VsZik6CiAgICAgICAgICJSZXR1cm4gdGhlIHRpbWUgcGFydCwgd2l0aCB0emluZm8gTm9uZS4iCi0gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKQorICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCwgZm9sZD1zZWxmLmZvbGQpCiAKICAgICBkZWYgdGltZXR6KHNlbGYpOgogICAgICAgICAiUmV0dXJuIHRoZSB0aW1lIHBhcnQsIHdpdGggc2FtZSB0emluZm8uIgogICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl90emluZm8sIGZvbGQ9c2VsZi5mb2xkKQogCiAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgeWVhcj1Ob25lLCBtb250aD1Ob25lLCBkYXk9Tm9uZSwgaG91cj1Ob25lLAotICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOgorICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUsCisgICAgICAgICAgICAgICAgKiwgZm9sZD1Ob25lKToKICAgICAgICAgIiIiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuIiIiCiAgICAgICAgIGlmIHllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHllYXIgPSBzZWxmLnllYXIKQEAgLTE0OTAsNDYgKzE1OTEsNDUgQEAKICAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZAogICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZToKICAgICAgICAgICAgIHR6aW5mbyA9IHNlbGYudHppbmZvCi0gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pCisgICAgICAgIGlmIGZvbGQgaXMgTm9uZToKKyAgICAgICAgICAgIGZvbGQgPSBzZWxmLmZvbGQKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZCwgdHppbmZvLCBmb2xkPWZvbGQpCisKKyAgICBkZWYgX2xvY2FsX3RpbWV6b25lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR6aW5mbyBpcyBOb25lOgorICAgICAgICAgICAgdHMgPSBzZWxmLl9ta3RpbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHMgPSAoc2VsZiAtIF9FUE9DSCkgLy8gdGltZWRlbHRhKHNlY29uZHM9MSkKKyAgICAgICAgbG9jYWx0bSA9IF90aW1lLmxvY2FsdGltZSh0cykKKyAgICAgICAgbG9jYWwgPSBkYXRldGltZSgqbG9jYWx0bVs6Nl0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRXh0cmFjdCBUWiBkYXRhIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgZ210b2ZmID0gbG9jYWx0bS50bV9nbXRvZmYKKyAgICAgICAgICAgIHpvbmUgPSBsb2NhbHRtLnRtX3pvbmUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZGVsdGEgPSBsb2NhbCAtIGRhdGV0aW1lKCpfdGltZS5nbXRpbWUodHMpWzo2XSkKKyAgICAgICAgICAgIHpvbmUgPSBfdGltZS5zdHJmdGltZSgnJVonLCBsb2NhbHRtKQorICAgICAgICAgICAgdHogPSB0aW1lem9uZShkZWx0YSwgem9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6ID0gdGltZXpvbmUodGltZWRlbHRhKHNlY29uZHM9Z210b2ZmKSwgem9uZSkKKyAgICAgICAgcmV0dXJuIHR6CiAKICAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0ej1Ob25lKToKICAgICAgICAgaWYgdHogaXMgTm9uZToKLSAgICAgICAgICAgIGlmIHNlbGYudHppbmZvIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXN0aW1lem9uZSgpIHJlcXVpcmVzIGFuIGF3YXJlIGRhdGV0aW1lIikKLSAgICAgICAgICAgIHRzID0gKHNlbGYgLSBfRVBPQ0gpIC8vIHRpbWVkZWx0YShzZWNvbmRzPTEpCi0gICAgICAgICAgICBsb2NhbHRtID0gX3RpbWUubG9jYWx0aW1lKHRzKQotICAgICAgICAgICAgbG9jYWwgPSBkYXRldGltZSgqbG9jYWx0bVs6Nl0pCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgIyBFeHRyYWN0IFRaIGRhdGEgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgZ210b2ZmID0gbG9jYWx0bS50bV9nbXRvZmYKLSAgICAgICAgICAgICAgICB6b25lID0gbG9jYWx0bS50bV96b25lCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBDb21wdXRlIFVUQyBvZmZzZXQgYW5kIGNvbXBhcmUgd2l0aCB0aGUgdmFsdWUgaW1wbGllZAotICAgICAgICAgICAgICAgICMgYnkgdG1faXNkc3QuICBJZiB0aGUgdmFsdWVzIG1hdGNoLCB1c2UgdGhlIHpvbmUgbmFtZQotICAgICAgICAgICAgICAgICMgaW1wbGllZCBieSB0bV9pc2RzdC4KLSAgICAgICAgICAgICAgICBkZWx0YSA9IGxvY2FsIC0gZGF0ZXRpbWUoKl90aW1lLmdtdGltZSh0cylbOjZdKQotICAgICAgICAgICAgICAgIGRzdCA9IF90aW1lLmRheWxpZ2h0IGFuZCBsb2NhbHRtLnRtX2lzZHN0ID4gMAotICAgICAgICAgICAgICAgIGdtdG9mZiA9IC0oX3RpbWUuYWx0em9uZSBpZiBkc3QgZWxzZSBfdGltZS50aW1lem9uZSkKLSAgICAgICAgICAgICAgICBpZiBkZWx0YSA9PSB0aW1lZGVsdGEoc2Vjb25kcz1nbXRvZmYpOgotICAgICAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKGRlbHRhLCBfdGltZS50em5hbWVbZHN0XSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKGRlbHRhKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0eiA9IHRpbWV6b25lKHRpbWVkZWx0YShzZWNvbmRzPWdtdG9mZiksIHpvbmUpCi0KKyAgICAgICAgICAgIHR6ID0gc2VsZi5fbG9jYWxfdGltZXpvbmUoKQogICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0eiBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHR6aW5mbyIpCiAKICAgICAgICAgbXl0eiA9IHNlbGYudHppbmZvCiAgICAgICAgIGlmIG15dHogaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZSIpCisgICAgICAgICAgICBteXR6ID0gc2VsZi5fbG9jYWxfdGltZXpvbmUoKQogCiAgICAgICAgIGlmIHR6IGlzIG15dHo6CiAgICAgICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgICAgICMgQ29udmVydCBzZWxmIHRvIFVUQywgYW5kIGF0dGFjaCB0aGUgbmV3IHRpbWUgem9uZSBvYmplY3QuCi0gICAgICAgIG15b2Zmc2V0ID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICBteW9mZnNldCA9IG15dHoudXRjb2Zmc2V0KHNlbGYpCiAgICAgICAgIGlmIG15b2Zmc2V0IGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJhc3RpbWV6b25lKCkgcmVxdWlyZXMgYW4gYXdhcmUgZGF0ZXRpbWUiKQogICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eikKQEAgLTE1NDksMjEgKzE2NDksMjUgQEAKICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLAogICAgICAgICAgICAgc2VsZi5feWVhcikKIAotICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJyk6CisgICAgZGVmIGlzb2Zvcm1hdChzZWxmLCBzZXA9J1QnLCB0aW1lc3BlYz0nYXV0bycpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uCiAKLSAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWYKLSAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorICAgICAgICBUaGUgZnVsbCBmb3JtYXQgbG9va3MgbGlrZSAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLgorICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG9taXR0ZWQgaWYgc2VsZi5taWNyb3NlY29uZCA9PSAwLgogCiAgICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmcKLSAgICAgICAgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tK0hIOk1NJyBvciAnWVlZWS1NTS1ERCBISDpNTTpTUytISDpNTScuCisgICAgICAgIGdpdmluZyBhIGZ1bGwgZm9ybWF0IG9mICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScuCiAKICAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmQKICAgICAgICAgdGltZSwgZGVmYXVsdCAnVCcuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgICAgdGVybXMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS4KICAgICAgICAgIiIiCiAgICAgICAgIHMgPSAoIiUwNGQtJTAyZC0lMDJkJWMiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlcCkgKwogICAgICAgICAgICAgIF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCwgdGltZXNwZWMpKQorCiAgICAgICAgIG9mZiA9IHNlbGYudXRjb2Zmc2V0KCkKICAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaWYgb2ZmLmRheXMgPCAwOgpAQCAtMTU3Miw5ICsxNjc2LDExIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNpZ24gPSAiKyIKICAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIHRpbWVkZWx0YShob3Vycz0xKSkKLSAgICAgICAgICAgIGFzc2VydCBub3QgbW0gJSB0aW1lZGVsdGEobWludXRlcz0xKSwgIndob2xlIG1pbnV0ZSIKLSAgICAgICAgICAgIG1tIC8vPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgbW0sIHNzID0gZGl2bW9kKG1tLCB0aW1lZGVsdGEobWludXRlcz0xKSkKICAgICAgICAgICAgIHMgKz0gIiVzJTAyZDolMDJkIiAlIChzaWduLCBoaCwgbW0pCisgICAgICAgICAgICBpZiBzczoKKyAgICAgICAgICAgICAgICBhc3NlcnQgbm90IHNzLm1pY3Jvc2Vjb25kcworICAgICAgICAgICAgICAgIHMgKz0gIjolMDJkIiAlIHNzLnNlY29uZHMKICAgICAgICAgcmV0dXJuIHMKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTE1OTEsNiArMTY5Nyw5IEBACiAgICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gIikiCiAgICAgICAgICAgICBzID0gc1s6LTFdICsgIiwgdHppbmZvPSVyIiAlIHNlbGYuX3R6aW5mbyArICIpIgorICAgICAgICBpZiBzZWxmLl9mb2xkOgorICAgICAgICAgICAgYXNzZXJ0IHNbLTE6XSA9PSAiKSIKKyAgICAgICAgICAgIHMgPSBzWzotMV0gKyAiLCBmb2xkPTEpIgogICAgICAgICByZXR1cm4gcwogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CkBAIC0xNjkzLDYgKzE4MDIsMTIgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG15b2ZmID0gc2VsZi51dGNvZmZzZXQoKQogICAgICAgICAgICAgb3RvZmYgPSBvdGhlci51dGNvZmZzZXQoKQorICAgICAgICAgICAgIyBBc3N1bWUgdGhhdCBhbGxvd19taXhlZCBtZWFucyB0aGF0IHdlIGFyZSBjYWxsZWQgZnJvbSBfX2VxX18KKyAgICAgICAgICAgIGlmIGFsbG93X21peGVkOgorICAgICAgICAgICAgICAgIGlmIG15b2ZmICE9IHNlbGYucmVwbGFjZShmb2xkPW5vdCBzZWxmLmZvbGQpLnV0Y29mZnNldCgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgICAgIGlmIG90b2ZmICE9IG90aGVyLnJlcGxhY2UoZm9sZD1ub3Qgb3RoZXIuZm9sZCkudXRjb2Zmc2V0KCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyCiAgICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBteW9mZiA9PSBvdG9mZgogCiAgICAgICAgIGlmIGJhc2VfY29tcGFyZToKQEAgLTE3NjAsOSArMTg3NSwxMyBAQAogCiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMToKLSAgICAgICAgICAgIHR6b2ZmID0gc2VsZi51dGNvZmZzZXQoKQorICAgICAgICAgICAgaWYgc2VsZi5mb2xkOgorICAgICAgICAgICAgICAgIHQgPSBzZWxmLnJlcGxhY2UoZm9sZD0wKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ID0gc2VsZgorICAgICAgICAgICAgdHpvZmYgPSB0LnV0Y29mZnNldCgpCiAgICAgICAgICAgICBpZiB0em9mZiBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaCh0Ll9nZXRzdGF0ZSgpWzBdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBkYXlzID0gX3ltZDJvcmQoc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheSkKICAgICAgICAgICAgICAgICBzZWNvbmRzID0gc2VsZi5ob3VyICogMzYwMCArIHNlbGYubWludXRlICogNjAgKyBzZWxmLnNlY29uZApAQCAtMTc3MSwxMSArMTg5MCwxNCBAQAogCiAgICAgIyBQaWNrbGUgc3VwcG9ydC4KIAotICAgIGRlZiBfZ2V0c3RhdGUoc2VsZik6CisgICAgZGVmIF9nZXRzdGF0ZShzZWxmLCBwcm90b2NvbD0zKToKICAgICAgICAgeWhpLCB5bG8gPSBkaXZtb2Qoc2VsZi5feWVhciwgMjU2KQogICAgICAgICB1czIsIHVzMyA9IGRpdm1vZChzZWxmLl9taWNyb3NlY29uZCwgMjU2KQogICAgICAgICB1czEsIHVzMiA9IGRpdm1vZCh1czIsIDI1NikKLSAgICAgICAgYmFzZXN0YXRlID0gYnl0ZXMoW3loaSwgeWxvLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LAorICAgICAgICBtID0gc2VsZi5fbW9udGgKKyAgICAgICAgaWYgc2VsZi5fZm9sZCBhbmQgcHJvdG9jb2wgPiAzOgorICAgICAgICAgICAgbSArPSAxMjgKKyAgICAgICAgYmFzZXN0YXRlID0gYnl0ZXMoW3loaSwgeWxvLCBtLCBzZWxmLl9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzMSwgdXMyLCB1czNdKQogICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZToKQEAgLTE3ODYsMTQgKzE5MDgsMjAgQEAKICAgICBkZWYgX19zZXRzdGF0ZShzZWxmLCBzdHJpbmcsIHR6aW5mbyk6CiAgICAgICAgIGlmIHR6aW5mbyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UodHppbmZvLCBfdHppbmZvX2NsYXNzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYmFkIHR6aW5mbyBzdGF0ZSBhcmciKQotICAgICAgICAoeWhpLCB5bG8sIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlbGYuX2hvdXIsCisgICAgICAgICh5aGksIHlsbywgbSwgc2VsZi5fZGF5LCBzZWxmLl9ob3VyLAogICAgICAgICAgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHVzMSwgdXMyLCB1czMpID0gc3RyaW5nCisgICAgICAgIGlmIG0gPiAxMjc6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMQorICAgICAgICAgICAgc2VsZi5fbW9udGggPSBtIC0gMTI4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mb2xkID0gMAorICAgICAgICAgICAgc2VsZi5fbW9udGggPSBtCiAgICAgICAgIHNlbGYuX3llYXIgPSB5aGkgKiAyNTYgKyB5bG8KICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSAoKCh1czEgPDwgOCkgfCB1czIpIDw8IDgpIHwgdXMzCiAgICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mbwogCi0gICAgZGVmIF9fcmVkdWNlX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIHNlbGYuX2dldHN0YXRlKCkpCisgICAgZGVmIF9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCBzZWxmLl9nZXRzdGF0ZShwcm90b2NvbCkpCiAKIAogZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSkKQEAgLTE5MTMsNiArMjA0MSw4IEBACiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIF9uYW1lX2Zyb21fb2Zmc2V0KGRlbHRhKToKKyAgICAgICAgaWYgbm90IGRlbHRhOgorICAgICAgICAgICAgcmV0dXJuICdVVEMnCiAgICAgICAgIGlmIGRlbHRhIDwgdGltZWRlbHRhKDApOgogICAgICAgICAgICAgc2lnbiA9ICctJwogICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKZGlmZiAtLWdpdCBhL0xpYi9kYm0vZHVtYi5weSBiL0xpYi9kYm0vZHVtYi5weQppbmRleCA3Nzc3YTdjLi5lN2M2NDQwIDEwMDY0NAotLS0gYS9MaWIvZGJtL2R1bWIucHkKKysrIGIvTGliL2RibS9kdW1iLnB5CkBAIC00Nyw2ICs0Nyw3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZWJhc2VuYW1lLCBtb2RlLCBmbGFnPSdjJyk6CiAgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX3JlYWRvbmx5ID0gKGZsYWcgPT0gJ3InKQogCiAgICAgICAgICMgVGhlIGRpcmVjdG9yeSBmaWxlIGlzIGEgdGV4dCBmaWxlLiAgRWFjaCBsaW5lIGxvb2tzIGxpa2UKICAgICAgICAgIyAgICAiJXIsICglZCwgJWQpXG4iICUgKGtleSwgcG9zLCBzaXopCkBAIC04MCw2ICs4MSwxMSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmID0gX2lvLm9wZW4oc2VsZi5fZGF0ZmlsZSwgJ3InLCBlbmNvZGluZz0iTGF0aW4tMSIpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgaWYgZmxhZyBub3QgaW4gKCdjJywgJ24nKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJUaGUgZGF0YWJhc2UgZmlsZSBpcyBtaXNzaW5nLCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbWFudGljcyBvZiB0aGUgJ2MnIGZsYWcgd2lsbCBiZSB1c2VkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NCkKICAgICAgICAgICAgIHdpdGggX2lvLm9wZW4oc2VsZi5fZGF0ZmlsZSwgJ3cnLCBlbmNvZGluZz0iTGF0aW4tMSIpIGFzIGY6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGF0ZmlsZSkKICAgICAgICAgZWxzZToKQEAgLTE3OCw2ICsxODQsMTAgQEAKICAgICAgICAgICAgIGYud3JpdGUoIiVyLCAlclxuIiAlIChrZXkuZGVjb2RlKCJMYXRpbi0xIiksIHBvc19hbmRfc2l6X3BhaXIpKQogCiAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsKToKKyAgICAgICAgaWYgc2VsZi5fcmVhZG9ubHk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKToKICAgICAgICAgICAgIGtleSA9IGtleS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShrZXksIChieXRlcywgYnl0ZWFycmF5KSk6CkBAIC0yMTIsNiArMjIyLDEwIEBACiAgICAgICAgICAgICAjIChzbyB0aGF0IF9jb21taXQoKSBuZXZlciBnZXRzIGNhbGxlZCkuCiAKICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYgc2VsZi5fcmVhZG9ubHk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKToKICAgICAgICAgICAgIGtleSA9IGtleS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgc2VsZi5fdmVyaWZ5X29wZW4oKQpAQCAtMzAwLDQgKzMxNCw4IEBACiAgICAgZWxzZToKICAgICAgICAgIyBUdXJuIG9mZiBhbnkgYml0cyB0aGF0IGFyZSBzZXQgaW4gdGhlIHVtYXNrCiAgICAgICAgIG1vZGUgPSBtb2RlICYgKH51bSkKKyAgICBpZiBmbGFnIG5vdCBpbiAoJ3InLCAndycsICdjJywgJ24nKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oIkZsYWcgbXVzdCBiZSBvbmUgb2YgJ3InLCAndycsICdjJywgb3IgJ24nIiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICByZXR1cm4gX0RhdGFiYXNlKGZpbGUsIG1vZGUsIGZsYWc9ZmxhZykKZGlmZiAtLWdpdCBhL0xpYi9kaXMucHkgYi9MaWIvZGlzLnB5CmluZGV4IGY3ZTNjN2YuLjU5ODg2ZjEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXMucHkKKysrIGIvTGliL2Rpcy5weQpAQCAtMTYzLDYgKzE2MywxNSBAQAogX0luc3RydWN0aW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgiX0luc3RydWN0aW9uIiwKICAgICAgIm9wbmFtZSBvcGNvZGUgYXJnIGFyZ3ZhbCBhcmdyZXByIG9mZnNldCBzdGFydHNfbGluZSBpc19qdW1wX3RhcmdldCIpCiAKK19JbnN0cnVjdGlvbi5vcG5hbWUuX19kb2NfXyA9ICJIdW1hbiByZWFkYWJsZSBuYW1lIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24ub3Bjb2RlLl9fZG9jX18gPSAiTnVtZXJpYyBjb2RlIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24uYXJnLl9fZG9jX18gPSAiTnVtZXJpYyBhcmd1bWVudCB0byBvcGVyYXRpb24gKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmFyZ3ZhbC5fX2RvY19fID0gIlJlc29sdmVkIGFyZyB2YWx1ZSAoaWYga25vd24pLCBvdGhlcndpc2Ugc2FtZSBhcyBhcmciCitfSW5zdHJ1Y3Rpb24uYXJncmVwci5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIG9wZXJhdGlvbiBhcmd1bWVudCIKK19JbnN0cnVjdGlvbi5vZmZzZXQuX19kb2NfXyA9ICJTdGFydCBpbmRleCBvZiBvcGVyYXRpb24gd2l0aGluIGJ5dGVjb2RlIHNlcXVlbmNlIgorX0luc3RydWN0aW9uLnN0YXJ0c19saW5lLl9fZG9jX18gPSAiTGluZSBzdGFydGVkIGJ5IHRoaXMgb3Bjb2RlIChpZiBhbnkpLCBvdGhlcndpc2UgTm9uZSIKK19JbnN0cnVjdGlvbi5pc19qdW1wX3RhcmdldC5fX2RvY19fID0gIlRydWUgaWYgb3RoZXIgY29kZSBqdW1wcyB0byBoZXJlLCBvdGhlcndpc2UgRmFsc2UiCisKIGNsYXNzIEluc3RydWN0aW9uKF9JbnN0cnVjdGlvbik6CiAgICAgIiIiRGV0YWlscyBmb3IgYSBieXRlY29kZSBvcGVyYXRpb24KIApAQCAtMjc2LDcgKzI4NSw2IEBACiAgICAgIiIiCiAgICAgbGFiZWxzID0gZmluZGxhYmVscyhjb2RlKQogICAgIHN0YXJ0c19saW5lID0gTm9uZQotICAgIGZyZWUgPSBOb25lCiAgICAgZm9yIG9mZnNldCwgb3AsIGFyZyBpbiBfdW5wYWNrX29wYXJncyhjb2RlKToKICAgICAgICAgaWYgbGluZXN0YXJ0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHN0YXJ0c19saW5lID0gbGluZXN0YXJ0cy5nZXQob2Zmc2V0LCBOb25lKQpAQCAtMjk2LDcgKzMwNCw3IEBACiAgICAgICAgICAgICBlbGlmIG9wIGluIGhhc25hbWU6CiAgICAgICAgICAgICAgICAgYXJndmFsLCBhcmdyZXByID0gX2dldF9uYW1lX2luZm8oYXJnLCBuYW1lcykKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzanJlbDoKLSAgICAgICAgICAgICAgICBhcmd2YWwgPSBvZmZzZXQgKyAzICsgYXJnCisgICAgICAgICAgICAgICAgYXJndmFsID0gb2Zmc2V0ICsgMiArIGFyZwogICAgICAgICAgICAgICAgIGFyZ3JlcHIgPSAidG8gIiArIHJlcHIoYXJndmFsKQogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNsb2NhbDoKICAgICAgICAgICAgICAgICBhcmd2YWwsIGFyZ3JlcHIgPSBfZ2V0X25hbWVfaW5mbyhhcmcsIHZhcm5hbWVzKQpAQCAtMzQzLDIzICszNTEsMTUgQEAKIGRpc2NvID0gZGlzYXNzZW1ibGUgICAgICAgICAgICAgICAgICAgICAjIFhYWCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKIAogZGVmIF91bnBhY2tfb3BhcmdzKGNvZGUpOgotICAgICMgZW51bWVyYXRlKCkgaXMgbm90IGFuIG9wdGlvbiwgc2luY2Ugd2Ugc29tZXRpbWVzIHByb2Nlc3MKLSAgICAjIG11bHRpcGxlIGVsZW1lbnRzIG9uIGEgc2luZ2xlIHBhc3MgdGhyb3VnaCB0aGUgbG9vcAogICAgIGV4dGVuZGVkX2FyZyA9IDAKLSAgICBuID0gbGVuKGNvZGUpCi0gICAgaSA9IDAKLSAgICB3aGlsZSBpIDwgbjoKKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oY29kZSksIDIpOgogICAgICAgICBvcCA9IGNvZGVbaV0KLSAgICAgICAgb2Zmc2V0ID0gaQotICAgICAgICBpID0gaSsxCi0gICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgaWYgb3AgPj0gSEFWRV9BUkdVTUVOVDoKLSAgICAgICAgICAgIGFyZyA9IGNvZGVbaV0gKyBjb2RlW2krMV0qMjU2ICsgZXh0ZW5kZWRfYXJnCi0gICAgICAgICAgICBleHRlbmRlZF9hcmcgPSAwCi0gICAgICAgICAgICBpID0gaSsyCi0gICAgICAgICAgICBpZiBvcCA9PSBFWFRFTkRFRF9BUkc6Ci0gICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnKjY1NTM2Ci0gICAgICAgIHlpZWxkIChvZmZzZXQsIG9wLCBhcmcpCisgICAgICAgICAgICBhcmcgPSBjb2RlW2krMV0gfCBleHRlbmRlZF9hcmcKKyAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IChhcmcgPDwgOCkgaWYgb3AgPT0gRVhURU5ERURfQVJHIGVsc2UgMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICB5aWVsZCAoaSwgb3AsIGFyZykKIAogZGVmIGZpbmRsYWJlbHMoY29kZSk6CiAgICAgIiIiRGV0ZWN0IGFsbCBvZmZzZXRzIGluIGEgYnl0ZSBjb2RlIHdoaWNoIGFyZSBqdW1wIHRhcmdldHMuCkBAIC0zNzAsMTQgKzM3MCwxNCBAQAogICAgIGxhYmVscyA9IFtdCiAgICAgZm9yIG9mZnNldCwgb3AsIGFyZyBpbiBfdW5wYWNrX29wYXJncyhjb2RlKToKICAgICAgICAgaWYgYXJnIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgbGFiZWwgPSAtMQogICAgICAgICAgICAgaWYgb3AgaW4gaGFzanJlbDoKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG9mZnNldCArIDMgKyBhcmcKKyAgICAgICAgICAgICAgICBsYWJlbCA9IG9mZnNldCArIDIgKyBhcmcKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzamFiczoKICAgICAgICAgICAgICAgICBsYWJlbCA9IGFyZwotICAgICAgICAgICAgaWYgbGFiZWwgPj0gMDoKLSAgICAgICAgICAgICAgICBpZiBsYWJlbCBub3QgaW4gbGFiZWxzOgotICAgICAgICAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKGxhYmVsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGFiZWwgbm90IGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKGxhYmVsKQogICAgIHJldHVybiBsYWJlbHMKIAogZGVmIGZpbmRsaW5lc3RhcnRzKGNvZGUpOgpAQCAtMzg2LDggKzM4Niw4IEBACiAgICAgR2VuZXJhdGUgcGFpcnMgKG9mZnNldCwgbGluZW5vKSBhcyBkZXNjcmliZWQgaW4gUHl0aG9uL2NvbXBpbGUuYy4KIAogICAgICIiIgotICAgIGJ5dGVfaW5jcmVtZW50cyA9IGxpc3QoY29kZS5jb19sbm90YWJbMDo6Ml0pCi0gICAgbGluZV9pbmNyZW1lbnRzID0gbGlzdChjb2RlLmNvX2xub3RhYlsxOjoyXSkKKyAgICBieXRlX2luY3JlbWVudHMgPSBjb2RlLmNvX2xub3RhYlswOjoyXQorICAgIGxpbmVfaW5jcmVtZW50cyA9IGNvZGUuY29fbG5vdGFiWzE6OjJdCiAKICAgICBsYXN0bGluZW5vID0gTm9uZQogICAgIGxpbmVubyA9IGNvZGUuY29fZmlyc3RsaW5lbm8KQEAgLTM5OCw2ICszOTgsOSBAQAogICAgICAgICAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgbGFzdGxpbmVubyA9IGxpbmVubwogICAgICAgICAgICAgYWRkciArPSBieXRlX2luY3IKKyAgICAgICAgaWYgbGluZV9pbmNyID49IDB4ODA6CisgICAgICAgICAgICAjIGxpbmVfaW5jcmVtZW50cyBpcyBhbiBhcnJheSBvZiA4LWJpdCBzaWduZWQgaW50ZWdlcnMKKyAgICAgICAgICAgIGxpbmVfaW5jciAtPSAweDEwMAogICAgICAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAgICAgaWYgbGluZW5vICE9IGxhc3RsaW5lbm86CiAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5CmluZGV4IGJlZDEzODQuLjc4YWU1NzUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5CkBAIC0xNzEsNyArMTcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQogICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShwYXRoLCBwYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImFkZGluZyAnJXMnIiAlIHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiYWRkaW5nICclcyciLCBwYXRoKQogICAgICAgICAgICAgemlwLmNsb3NlKCkKIAogICAgIHJldHVybiB6aXBfZmlsZW5hbWUKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY21kLnB5IGIvTGliL2Rpc3R1dGlscy9jbWQucHkKaW5kZXggYzg5ZDVlZi4uYjVkOWRjMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jbWQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jbWQucHkKQEAgLTMyOSw4ICszMjksNyBAQAogICAgICMgLS0gRXh0ZXJuYWwgd29ybGQgbWFuaXB1bGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBkZWYgd2FybihzZWxmLCBtc2cpOgotICAgICAgICBsb2cud2Fybigid2FybmluZzogJXM6ICVzXG4iICUKLSAgICAgICAgICAgICAgICAoc2VsZi5nZXRfY29tbWFuZF9uYW1lKCksIG1zZykpCisgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiAlczogJXNcbiIsIHNlbGYuZ2V0X2NvbW1hbmRfbmFtZSgpLCBtc2cpCiAKICAgICBkZWYgZXhlY3V0ZShzZWxmLCBmdW5jLCBhcmdzLCBtc2c9Tm9uZSwgbGV2ZWw9MSk6CiAgICAgICAgIHV0aWwuZXhlY3V0ZShmdW5jLCBhcmdzLCBtc2csIGRyeV9ydW49c2VsZi5kcnlfcnVuKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weQppbmRleCBmMWJmYjI0Li5lOTI3NGQ5IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weQpAQCAtODUsNyArODUsNyBAQAogICAgICAgICBpbnN0YWxsLnNraXBfYnVpbGQgPSBzZWxmLnNraXBfYnVpbGQKICAgICAgICAgaW5zdGFsbC53YXJuX2RpciA9IDAKIAotICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyB0byAlcyIgJSBzZWxmLmJkaXN0X2RpcikKKyAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnaW5zdGFsbCcpCiAKICAgICAgICAgIyBBbmQgbWFrZSBhbiBhcmNoaXZlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKaW5kZXggYjNjZmU5Yy4uZjZjMjFhZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc2VsZi50YXJnZXRfdmVyc2lvbgogICAgICAgICAgICAgaWYgbm90IHRhcmdldF92ZXJzaW9uOgogICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnNraXBfYnVpbGQsICJTaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyIKLSAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzA6M10KKyAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogICAgICAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgdGFyZ2V0X3ZlcnNpb24pCiAgICAgICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgICAgICBidWlsZC5idWlsZF9saWIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuYnVpbGRfYmFzZSwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkKaW5kZXggMGMwZTJjMS4uZDNlMWQzYSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzZWxmLnRhcmdldF92ZXJzaW9uCiAgICAgICAgICAgICBpZiBub3QgdGFyZ2V0X3ZlcnNpb246CiAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2tpcF9idWlsZCwgIlNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGlzIgotICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc3lzLnZlcnNpb25bMDozXQorICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCB0YXJnZXRfdmVyc2lvbikKICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5CmluZGV4IDMzN2RkMGIuLmM2ZjUyZTYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1wbGF0LW5hbWUgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyAodHJ5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgJy4vY29uZmlndXJlIC0taGVscCcgb24geW91ciBwbGF0Zm9ybSkiKQogCi0gICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lZC4lZCIgJSAoc2VsZi5wbGF0X25hbWUsICpzeXMudmVyc2lvbl9pbmZvWzoyXSkKIAogICAgICAgICAjIE1ha2UgaXQgc28gUHl0aG9uIDIueCBhbmQgUHl0aG9uIDIueCB3aXRoIC0td2l0aC1weWRlYnVnIGRvbid0CiAgICAgICAgICMgc2hhcmUgdGhlIHNhbWUgYnVpbGQgZGlyZWN0b3JpZXMuIERvaW5nIHNvIGNvbmZ1c2VzIHRoZSBidWlsZApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlbXAnICsgcGxhdF9zcGVjaWZpZXIpCiAgICAgICAgIGlmIHNlbGYuYnVpbGRfc2NyaXB0cyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5idWlsZF9zY3JpcHRzID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0nICsgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKIAogICAgICAgICBpZiBzZWxmLmV4ZWN1dGFibGUgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQppbmRleCBmMDNhNGUzLi41ZTUxYWU0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKQEAgLTM2Myw5ICszNjMsOSBAQAogCiAgICAgICAgICAgICBleHRfbmFtZSwgYnVpbGRfaW5mbyA9IGV4dAogCi0gICAgICAgICAgICBsb2cud2FybigoIm9sZC1zdHlsZSAoZXh0X25hbWUsIGJ1aWxkX2luZm8pIHR1cGxlIGZvdW5kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAiZXh0X21vZHVsZXMgZm9yIGV4dGVuc2lvbiAnJXMnIgotICAgICAgICAgICAgICAgICAgICAgICItLSBwbGVhc2UgY29udmVydCB0byBFeHRlbnNpb24gaW5zdGFuY2UiICUgZXh0X25hbWUpKQorICAgICAgICAgICAgbG9nLndhcm4oIm9sZC1zdHlsZSAoZXh0X25hbWUsIGJ1aWxkX2luZm8pIHR1cGxlIGZvdW5kIGluICIKKyAgICAgICAgICAgICAgICAgICAgICJleHRfbW9kdWxlcyBmb3IgZXh0ZW5zaW9uICclcyciCisgICAgICAgICAgICAgICAgICAgICAiLS0gcGxlYXNlIGNvbnZlcnQgdG8gRXh0ZW5zaW9uIGluc3RhbmNlIiwgZXh0X25hbWUpCiAKICAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShleHRfbmFtZSwgc3RyKSBhbmQKICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX25hbWVfcmUubWF0Y2goZXh0X25hbWUpKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CmluZGV4IDg0N2U4NTguLjRhZTE1M2QgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQpAQCAtOSw3ICs5LDcgQEAKIHRoaXMgaGVhZGVyIGZpbGUgbGl2ZXMiLgogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCByZQoraW1wb3J0IG9zLCByZQogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgSWYgaGVhZCBpcyBub3QgTm9uZSwgd2lsbCBiZSBkdW1wZWQgYmVmb3JlIHRoZSBmaWxlIGNvbnRlbnQuCiAgICAgIiIiCiAgICAgaWYgaGVhZCBpcyBOb25lOgotICAgICAgICBsb2cuaW5mbygnJXMnICUgZmlsZW5hbWUpCisgICAgICAgIGxvZy5pbmZvKCclcycsIGZpbGVuYW1lKQogICAgIGVsc2U6CiAgICAgICAgIGxvZy5pbmZvKGhlYWQpCiAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CmluZGV4IDY3ZGIwMDcuLjAyNThkM2RlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMTc1LDYgKzE3NSw3IEBACiAgICAgICAgIHNlbGYuY29tcGlsZSA9IE5vbmUKICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IE5vbmUKIAorICAgICAgICAjIERlcHJlY2F0ZWQKICAgICAgICAgIyBUaGVzZSB0d28gYXJlIGZvciBwdXR0aW5nIG5vbi1wYWNrYWdpemVkIGRpc3RyaWJ1dGlvbnMgaW50byB0aGVpcgogICAgICAgICAjIG93biBkaXJlY3RvcnkgYW5kIGNyZWF0aW5nIGEgLnB0aCBmaWxlIGlmIGl0IG1ha2VzIHNlbnNlLgogICAgICAgICAjICdleHRyYV9wYXRoJyBjb21lcyBmcm9tIHRoZSBzZXR1cCBmaWxlOyAnaW5zdGFsbF9wYXRoX2ZpbGUnIGNhbgpAQCAtMjkwLDggKzI5MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6ICclZCVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LApAQCAtMzQ0LDYgKzM0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cycsICdkYXRhJywgJ2hlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJiYXNlJywgJ3VzZXJzaXRlJykKIAorICAgICAgICAjIERlcHJlY2F0ZWQKICAgICAgICAgIyBXZWxsLCB3ZSdyZSBub3QgYWN0dWFsbHkgZnVsbHkgY29tcGxldGVseSBmaW5hbGl6ZWQgeWV0OiB3ZSBzdGlsbAogICAgICAgICAjIGhhdmUgdG8gZGVhbCB3aXRoICdleHRyYV9wYXRoJywgd2hpY2ggaXMgdGhlIGhhY2sgZm9yIGFsbG93aW5nCiAgICAgICAgICMgbm9uLXBhY2thZ2l6ZWQgbW9kdWxlIGRpc3RyaWJ1dGlvbnMgKGhlbGxvLCBOdW1lcmljYWwgUHl0aG9uISkgdG8KQEAgLTM4NSw3ICszODcsNyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBvcHRfbmFtZSA9IG9wdF9uYW1lLnRyYW5zbGF0ZShsb25nb3B0X3hsYXRlKQogICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0X25hbWUpCi0gICAgICAgICAgICBsb2cuZGVidWcoIiAgJXM6ICVzIiAlIChvcHRfbmFtZSwgdmFsKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAlczogJXMiLCBvcHRfbmFtZSwgdmFsKQogCiAgICAgZGVmIGZpbmFsaXplX3VuaXgoc2VsZik6CiAgICAgICAgICIiIkZpbmFsaXplcyBvcHRpb25zIGZvciBwb3NpeCBwbGF0Zm9ybXMuIiIiCkBAIC00OTAsNiArNDkyLDEwIEBACiAgICAgICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBzZWxmLmRpc3RyaWJ1dGlvbi5leHRyYV9wYXRoCiAKICAgICAgICAgaWYgc2VsZi5leHRyYV9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nLndhcm4oCisgICAgICAgICAgICAgICAgIkRpc3RyaWJ1dGlvbiBvcHRpb24gZXh0cmFfcGF0aCBpcyBkZXByZWNhdGVkLiAiCisgICAgICAgICAgICAgICAgIlNlZSBpc3N1ZTI3OTE5IGZvciBkZXRhaWxzLiIKKyAgICAgICAgICAgICkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5leHRyYV9wYXRoLCBzdHIpOgogICAgICAgICAgICAgICAgIHNlbGYuZXh0cmFfcGF0aCA9IHNlbGYuZXh0cmFfcGF0aC5zcGxpdCgnLCcpCiAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKaW5kZXggYzJhN2Q2NC4uMGRkYzczNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKQEAgLTIxLDEwICsyMSwxMCBAQAogCiAgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCi0gICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JXMuZWdnLWluZm8iICUgKAorICAgICAgICBiYXNlbmFtZSA9ICIlcy0lcy1weSVkLiVkLmVnZy1pbmZvIiAlICgKICAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKSksCiAgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX3ZlcnNpb24oc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSkpLAotICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdCisgICAgICAgICAgICAqc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgKQogICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICAgc2VsZi5vdXRwdXRzID0gW3NlbGYudGFyZ2V0XQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CmluZGV4IDg2MzQzYzguLjBmYWM5NGUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKQEAgLTUsNyArNSw3IEBACiAKICMgY3JlYXRlZCAyMDAyLzEwLzIxLCBSaWNoYXJkIEpvbmVzCiAKLWltcG9ydCBvcywgc3RyaW5nLCBnZXRwYXNzCitpbXBvcnQgZ2V0cGFzcwogaW1wb3J0IGlvCiBpbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdAogZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgpAQCAtOTQsNyArOTQsNyBAQAogICAgICAgICAnJycKICAgICAgICAgIyBzZW5kIHRoZSBpbmZvIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydCB0aGUgcmVzdWx0CiAgICAgICAgIChjb2RlLCByZXN1bHQpID0gc2VsZi5wb3N0X3RvX3NlcnZlcihzZWxmLmJ1aWxkX3Bvc3RfZGF0YSgndmVyaWZ5JykpCi0gICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKGNvZGUsIHJlc3VsdCkpCisgICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnLCBjb2RlLCByZXN1bHQpCiAKICAgICBkZWYgc2VuZF9tZXRhZGF0YShzZWxmKToKICAgICAgICAgJycnIFNlbmQgdGhlIG1ldGFkYXRhIHRvIHRoZSBwYWNrYWdlIGluZGV4IHNlcnZlci4KQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgIGRhdGFbJ2VtYWlsJ10gPSBpbnB1dCgnICAgRU1haWw6ICcpCiAgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCiAgICAgICAgICAgICBpZiBjb2RlICE9IDIwMDoKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnLCBjb2RlLCByZXN1bHQpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdZb3Ugd2lsbCByZWNlaXZlIGFuIGVtYWlsIHNob3J0bHkuJykKICAgICAgICAgICAgICAgICBsb2cuaW5mbygoJ0ZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIGl0IHRvICcKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICAgICAgd2hpbGUgbm90IGRhdGFbJ2VtYWlsJ106CiAgICAgICAgICAgICAgICAgZGF0YVsnZW1haWwnXSA9IGlucHV0KCdZb3VyIGVtYWlsIGFkZHJlc3M6ICcpCiAgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCi0gICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorICAgICAgICAgICAgbG9nLmluZm8oJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycsIGNvZGUsIHJlc3VsdCkKIAogICAgIGRlZiBidWlsZF9wb3N0X2RhdGEoc2VsZiwgYWN0aW9uKToKICAgICAgICAgIyBmaWd1cmUgdGhlIGRhdGEgdG8gc2VuZCAtIHRoZSBtZXRhZGF0YSBwbHVzIHNvbWUgYWRkaXRpb25hbApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CmluZGV4IDdlYTNkNWYuLjRmZDFkNDcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkKQEAgLTMsNyArMyw2IEBACiBJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3NkaXN0JyBjb21tYW5kIChjcmVhdGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uKS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiBmcm9tIHR5cGVzIGltcG9ydCAqCiBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKQEAgLTkyLDkgKzkxLDYgQEAKICAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWRlZmF1bHRzJzogJ3VzZS1kZWZhdWx0cycsCiAgICAgICAgICAgICAgICAgICAgICduby1wcnVuZSc6ICdwcnVuZScgfQogCi0gICAgZGVmYXVsdF9mb3JtYXQgPSB7J3Bvc2l4JzogJ2d6dGFyJywKLSAgICAgICAgICAgICAgICAgICAgICAnbnQnOiAnemlwJyB9Ci0KICAgICBzdWJfY29tbWFuZHMgPSBbKCdjaGVjaycsIGNoZWNraW5nX21ldGFkYXRhKV0KIAogICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CkBAIC0xMTEsNyArMTA3LDcgQEAKICAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMAogICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMAogCi0gICAgICAgIHNlbGYuZm9ybWF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JtYXRzID0gWydnenRhciddCiAgICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAogICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogCkBAIC0xMjcsMTMgKzEyMyw2IEBACiAgICAgICAgICAgICBzZWxmLnRlbXBsYXRlID0gIk1BTklGRVNULmluIgogCiAgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdmb3JtYXRzJykKLSAgICAgICAgaWYgc2VsZi5mb3JtYXRzIGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gW3NlbGYuZGVmYXVsdF9mb3JtYXRbb3MubmFtZV1dCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gY3JlYXRlIHNvdXJjZSBkaXN0cmlidXRpb25zICIKLSAgICAgICAgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gJXMiICUgb3MubmFtZSkKIAogICAgICAgICBiYWRfZm9ybWF0ID0gYXJjaGl2ZV91dGlsLmNoZWNrX2FyY2hpdmVfZm9ybWF0cyhzZWxmLmZvcm1hdHMpCiAgICAgICAgIGlmIGJhZF9mb3JtYXQ6CkBAIC00MjMsNyArNDEyLDcgQEAKICAgICAgICAgICAgIGxvZy5pbmZvKG1zZykKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZSk6Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgbm90IGEgcmVndWxhciBmaWxlIC0tIHNraXBwaW5nIiAlIGZpbGUpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgbm90IGEgcmVndWxhciBmaWxlIC0tIHNraXBwaW5nIiwgZmlsZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihiYXNlX2RpciwgZmlsZSkKICAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShmaWxlLCBkZXN0LCBsaW5rPWxpbmspCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKaW5kZXggZjA1YjM0Yi4uZDYwM2Q0YSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29yZS5weQpAQCAtMjA0LDE2ICsyMDQsMTUgQEAKICAgICBnbG9iYWwgX3NldHVwX3N0b3BfYWZ0ZXIsIF9zZXR1cF9kaXN0cmlidXRpb24KICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IHN0b3BfYWZ0ZXIKIAotICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3YuY29weSgpCiAgICAgZyA9IHsnX19maWxlX18nOiBzY3JpcHRfbmFtZX0KLSAgICBsID0ge30KICAgICB0cnk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2NyaXB0X25hbWUKICAgICAgICAgICAgIGlmIHNjcmlwdF9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSA9IHNjcmlwdF9hcmdzCiAgICAgICAgICAgICB3aXRoIG9wZW4oc2NyaXB0X25hbWUsICdyYicpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZywgbCkKKyAgICAgICAgICAgICAgICBleGVjKGYucmVhZCgpLCBnKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLmFyZ3YgPSBzYXZlX2FyZ3YKICAgICAgICAgICAgIF9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9kaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CmluZGV4IGZmYjMzZmY2Li42MmEyNDUxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Rpc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CkBAIC0xMDE4LDggKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIiwgIm1haW50YWluZXJfZW1haWwiLCAidXJsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIsICJkZXNjcmlwdGlvbiIsICJsb25nX2Rlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMiLCAicGxhdGZvcm1zIiwgImZ1bGxuYW1lIiwgImNvbnRhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImxpY2Vuc2UiLCAiY2xhc3NpZmllcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJkb3dubG9hZF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImNsYXNzaWZpZXJzIiwgImRvd25sb2FkX3VybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQRVAgMzE0CiAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3ZpZGVzIiwgInJlcXVpcmVzIiwgIm9ic29sZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQppbmRleCA3ZWZiYjc0Li5jNTA3ZGEzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQorKysgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQpAQCAtNCw3ICs0LDYgQEAKIG1vZHVsZXMgaW4gc2V0dXAgc2NyaXB0cy4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIAogIyBUaGlzIGNsYXNzIGlzIHJlYWxseSBvbmx5IHVzZWQgYnkgdGhlICJidWlsZF9leHQiIGNvbW1hbmQsIHNvIGl0IG1pZ2h0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDU3MzcyNGQuLmY3MmI3ZjUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC03MCw3ICs3MCw3IEBACiAgICAgbGVhdmluZyBvZmYgdGhlIHBhdGNobGV2ZWwuICBTYW1wbGUgcmV0dXJuIHZhbHVlcyBjb3VsZCBiZSAnMS41JwogICAgIG9yICcyLjInLgogICAgICIiIgotICAgIHJldHVybiBzeXMudmVyc2lvbls6M10KKyAgICByZXR1cm4gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAKIAogZGVmIGdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MCwgcHJlZml4PU5vbmUpOgpAQCAtMjQyLDYgKzI0Miw4IEBACiAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oX3N5c19ob21lIG9yIHByb2plY3RfYmFzZSwgIk1ha2VmaWxlIikKICAgICBsaWJfZGlyID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0wLCBzdGFuZGFyZF9saWI9MSkKICAgICBjb25maWdfZmlsZSA9ICdjb25maWcte317fScuZm9ybWF0KGdldF9weXRob25fdmVyc2lvbigpLCBidWlsZF9mbGFncykKKyAgICBpZiBoYXNhdHRyKHN5cy5pbXBsZW1lbnRhdGlvbiwgJ19tdWx0aWFyY2gnKToKKyAgICAgICAgY29uZmlnX2ZpbGUgKz0gJy0lcycgJSBzeXMuaW1wbGVtZW50YXRpb24uX211bHRpYXJjaAogICAgIHJldHVybiBvcy5wYXRoLmpvaW4obGliX2RpciwgY29uZmlnX2ZpbGUsICdNYWtlZmlsZScpCiAKIApAQCAtNDE1LDM4ICs0MTcsMTMgQEAKIAogZGVmIF9pbml0X3Bvc2l4KCk6CiAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgotICAgIGcgPSB7fQotICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIE1ha2VmaWxlOgotICAgIHRyeToKLSAgICAgICAgZmlsZW5hbWUgPSBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKQotICAgICAgICBwYXJzZV9tYWtlZmlsZShmaWxlbmFtZSwgZykKLSAgICBleGNlcHQgT1NFcnJvciBhcyBtc2c6Ci0gICAgICAgIG15X21zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGZpbGVuYW1lCi0gICAgICAgIGlmIGhhc2F0dHIobXNnLCAic3RyZXJyb3IiKToKLSAgICAgICAgICAgIG15X21zZyA9IG15X21zZyArICIgKCVzKSIgJSBtc2cuc3RyZXJyb3IKLQotICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKLQotICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6Ci0gICAgdHJ5OgotICAgICAgICBmaWxlbmFtZSA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCi0gICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZmlsZToKLSAgICAgICAgICAgIHBhcnNlX2NvbmZpZ19oKGZpbGUsIGcpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgbXNnOgotICAgICAgICBteV9tc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBmaWxlbmFtZQotICAgICAgICBpZiBoYXNhdHRyKG1zZywgInN0cmVycm9yIik6Ci0gICAgICAgICAgICBteV9tc2cgPSBteV9tc2cgKyAiICglcykiICUgbXNnLnN0cmVycm9yCi0KLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCi0KLSAgICAjIE9uIEFJWCwgdGhlcmUgYXJlIHdyb25nIHBhdGhzIHRvIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiB0aGUgTWFrZWZpbGUKLSAgICAjIC0tIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgUHl0aG9uIHNvdXJjZSwgYnV0IHdoZW4gaW5zdGFsbGVkCi0gICAgIyB0aGUgc2NyaXB0cyBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnkuCi0gICAgaWYgcHl0aG9uX2J1aWxkOgotICAgICAgICBnWydMRFNIQVJFRCddID0gZ1snQkxEU0hBUkVEJ10KLQorICAgICMgX3N5c2NvbmZpZ2RhdGEgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUsIHNlZSB0aGUgc3lzY29uZmlnIG1vZHVsZQorICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGFfJyArIHN5cy5hYmlmbGFncworICAgIF90ZW1wID0gX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJ2J1aWxkX3RpbWVfdmFycyddLCAwKQorICAgIGJ1aWxkX3RpbWVfdmFycyA9IF90ZW1wLmJ1aWxkX3RpbWVfdmFycwogICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKLSAgICBfY29uZmlnX3ZhcnMgPSBnCisgICAgX2NvbmZpZ192YXJzID0ge30KKyAgICBfY29uZmlnX3ZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKIAogCiBkZWYgX2luaXRfbnQoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CmluZGV4IDI1YzE0YWIuLmMxYTJhMDQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQpAQCAtMywxNiArMywxMiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHNodXRpbAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGltcG9ydCBiZGlzdF9ycG0KIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgc3Bhd24KLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCiAKIFNFVFVQX1BZID0gIiIiXAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQppbmRleCAzMzkxZjM2Li5iMDIwYTViIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CkBAIC0yNyw3ICsyNyw3IEBACiAgICAgICAgICMgYnVpbGRfcGxhdGxpYiBpcyAnYnVpbGQvbGliLnBsYXRmb3JtLXgueFstcHlkZWJ1Z10nCiAgICAgICAgICMgZXhhbXBsZXM6CiAgICAgICAgICMgICBidWlsZC9saWIubWFjb3N4LTEwLjMtaTM4Ni0yLjcKLSAgICAgICAgcGxhdF9zcGVjID0gJy4lcy0lcycgJSAoY21kLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgcGxhdF9zcGVjID0gJy4lcy0lZC4lZCcgJSAoY21kLnBsYXRfbmFtZSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfcGxhdGxpYi5lbmRzd2l0aCgnLXB5ZGVidWcnKSkKICAgICAgICAgICAgIHBsYXRfc3BlYyArPSAnLXB5ZGVidWcnCkBAIC00Miw3ICs0Miw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX3RlbXAsIHdhbnRlZCkKIAogICAgICAgICAjIGJ1aWxkX3NjcmlwdHMgaXMgYnVpbGQvc2NyaXB0cy14LngKLSAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9iYXNlLCAnc2NyaXB0cy0nICsgIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLSVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9zY3JpcHRzLCB3YW50ZWQpCiAKICAgICAgICAgIyBleGVjdXRhYmxlIGlzIG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQppbmRleCA0ZTM5N2VhLi40N2I1ODZjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKQEAgLTE2Niw3ICsxNjYsNiBAQAogICAgICAgICBjbWQgPSBzZWxmLmJ1aWxkX2V4dChkaXN0KQogICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCiAKLSAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihweV9pbmNsdWRlLCBjbWQuaW5jbHVkZV9kaXJzKQogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkKaW5kZXggMTgyODNkYy4uMDcxMmU5MiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQpAQCAtMTY4LDcgKzE2OCw4IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IG9sZF9kb250X3dyaXRlX2J5dGVjb2RlCiAKLSAgICAgICAgc2VsZi5hc3NlcnRJbignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQnLCBzZWxmLmxvZ3NbMF1bMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ3NbMF1bMV0gJSBzZWxmLmxvZ3NbMF1bMl0pCiAKIAogZGVmIHRlc3Rfc3VpdGUoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQppbmRleCBiNjRmMzAwLi5jNjA1YWZkIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CkBAIC0xLDggKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmNsZWFuLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBnZXRwYXNzCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4gaW1wb3J0IGNsZWFuCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKaW5kZXggYTM4NDQ5Ny4uNzdlZjc4OCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CkBAIC0xLDggKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5weXBpcmMucHlwaXJjLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0ZW1wZmlsZQogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBQeVBJUkNDb21tYW5kCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkKaW5kZXggNjU0MjI3Yy4uMjdjZTczMiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkKQEAgLTI5LDYgKzI5LDIxIEBACiBzZXR1cCgpCiAiIiIKIAorc2V0dXBfZG9lc19ub3RoaW5nID0gIiIiXAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK3NldHVwKCkKKyIiIgorCisKK3NldHVwX2RlZmluZXNfc3ViY2xhc3MgPSAiIiJcCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsIGFzIF9pbnN0YWxsCisKK2NsYXNzIGluc3RhbGwoX2luc3RhbGwpOgorICAgIHN1Yl9jb21tYW5kcyA9IF9pbnN0YWxsLnN1Yl9jb21tYW5kcyArIFsnY21kJ10KKworc2V0dXAoY21kY2xhc3M9eydpbnN0YWxsJzogaW5zdGFsbH0pCisiIiIKIAogY2xhc3MgQ29yZVRlc3RDYXNlKHN1cHBvcnQuRW52aXJvbkd1YXJkLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTY3LDYgKzgyLDIxIEBACiAgICAgICAgIGRpc3R1dGlscy5jb3JlLnJ1bl9zZXR1cCgKICAgICAgICAgICAgIHNlbGYud3JpdGVfc2V0dXAoc2V0dXBfdXNpbmdfX19maWxlX18pKQogCisgICAgZGVmIHRlc3RfcnVuX3NldHVwX3ByZXNlcnZlc19zeXNfYXJndihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgcnVuX3NldHVwIGRvZXMgbm90IGNsb2JiZXIgc3lzLmFyZ3YKKyAgICAgICAgYXJndl9jb3B5ID0gc3lzLmFyZ3YuY29weSgpCisgICAgICAgIGRpc3R1dGlscy5jb3JlLnJ1bl9zZXR1cCgKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc2V0dXAoc2V0dXBfZG9lc19ub3RoaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuYXJndiwgYXJndl9jb3B5KQorCisgICAgZGVmIHRlc3RfcnVuX3NldHVwX2RlZmluZXNfc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzY3JpcHQgY2FuIHVzZSBfX2ZpbGVfXzsgaWYgdGhhdCdzIG1pc3NpbmcsIHRoZSB0ZXN0CisgICAgICAgICMgc2V0dXAucHkgc2NyaXB0IHdpbGwgcmFpc2UgTmFtZUVycm9yLgorICAgICAgICBkaXN0ID0gZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF9kZWZpbmVzX3N1YmNsYXNzKSkKKyAgICAgICAgaW5zdGFsbCA9IGRpc3QuZ2V0X2NvbW1hbmRfb2JqKCdpbnN0YWxsJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignY21kJywgaW5zdGFsbC5zdWJfY29tbWFuZHMpCisKICAgICBkZWYgdGVzdF9ydW5fc2V0dXBfdXNlc19jdXJyZW50X2RpcihzZWxmKToKICAgICAgICAgIyBUaGlzIHRlc3RzIHRoYXQgdGhlIHNldHVwIHNjcmlwdCBpcyBydW4gd2l0aCB0aGUgY3VycmVudCBkaXJlY3RvcnkKICAgICAgICAgIyBhcyBpdHMgb3duIGN1cnJlbnQgZGlyZWN0b3J5OyB0aGlzIHdhcyB0ZW1wb3JhcmlseSBicm9rZW4gYnkgYQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2N5Z3dpbmNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkKaW5kZXggODU2OTIxNi4uOWRjODY5ZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2N5Z3dpbmNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY3lnd2luY2NvbXBpbGVyLnB5CkBAIC0zLDExICszLDEwIEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KLWltcG9ydCBzdWJwcm9jZXNzCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBjeWd3aW5jY29tcGlsZXIKLWZyb20gZGlzdHV0aWxzLmN5Z3dpbmNjb21waWxlciBpbXBvcnQgKEN5Z3dpbkNDb21waWxlciwgY2hlY2tfY29uZmlnX2gsCitmcm9tIGRpc3R1dGlscy5jeWd3aW5jY29tcGlsZXIgaW1wb3J0IChjaGVja19jb25maWdfaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IX09LLCBDT05GSUdfSF9OT1RPSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IX1VOQ0VSVEFJTiwgZ2V0X3ZlcnNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21zdmNyKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5CmluZGV4IDNlMWMzNjYuLmM2ZmFlMzkgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKQEAgLTEsNyArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmRlcF91dGlsLiIiIgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKLWltcG9ydCB0aW1lCiAKIGZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlciwgbmV3ZXJfcGFpcndpc2UsIG5ld2VyX2dyb3VwCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ZpbGVFcnJvcgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkKaW5kZXggYTZkMDRmMC4uMDMwNDBhZiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5CkBAIC0xLDcgKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5maWxlX3V0aWwuIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwotaW1wb3J0IHNodXRpbAogaW1wb3J0IGVycm5vCiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCiAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CmluZGV4IDRkOGMwMGEuLjMyYWIyOTYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2RhdGEuIiIiCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGdldHBhc3MKIAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2RhdGEgaW1wb3J0IGluc3RhbGxfZGF0YQogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5CmluZGV4IGQ5NTMxNTcuLjIyMTdiMzIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2hlYWRlcnMuIiIiCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGdldHBhc3MKIAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2hlYWRlcnMgaW1wb3J0IGluc3RhbGxfaGVhZGVycwogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQppbmRleCA1Mzc4YWE4Li5mZGE2MzE1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CkBAIC0xMDQsNyArMTA0LDggQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUKIAotICAgICAgICBzZWxmLmFzc2VydEluKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCcsIHNlbGYubG9nc1swXVsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nc1swXVsxXSAlIHNlbGYubG9nc1swXVsyXSkKIAogCiBkZWYgdGVzdF9zdWl0ZSgpOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weQppbmRleCA1ZTE4YzYxLi43N2EwN2VmIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBSZWcuZ2V0X3ZhbHVlLCAneHh4JywgJ3h4eCcpCiAKICAgICAgICAgIyBsb29raW5nIGZvciB2YWx1ZXMgdGhhdCBzaG91bGQgZXhpc3Qgb24gYWxsCi0gICAgICAgICMgd2luZG93cyByZWdpc3RlcmllcyB2ZXJzaW9ucy4KKyAgICAgICAgIyB3aW5kb3dzIHJlZ2lzdHJ5IHZlcnNpb25zLgogICAgICAgICBwYXRoID0gcidDb250cm9sIFBhbmVsXERlc2t0b3AnCiAgICAgICAgIHYgPSBSZWcuZ2V0X3ZhbHVlKHBhdGgsICdkcmFnZnVsbHdpbmRvd3MnKQogICAgICAgICBzZWxmLmFzc2VydEluKHYsICgnMCcsICcxJywgJzInKSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQppbmRleCA2YzdlYjIwLi41ZWRjMjRhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5CkBAIC0xLDExICsxLDExIEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnNwYXduLiIiIgogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0aW1lCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHVuaXhfc2hlbGwKIAogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IF9udF9xdW90ZV9hcmdzCi1mcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24sIGZpbmRfZXhlY3V0YWJsZQorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIApAQCAtMzAsOSArMzAsOSBAQAogCiAgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIGV4ZWN1dGFibGUKICAgICAgICAgIyB0aHJvdWdoIHRoZSBzaGVsbCB0aGF0IHJldHVybnMgMQotICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgogICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5zaCcpCi0gICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyEvYmluL3NoXG5leGl0IDEnKQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJyMhJXNcbmV4aXQgMScgJSB1bml4X3NoZWxsKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5iYXQnKQogICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJ2V4aXQgMScpCkBAIC00MSw5ICs0MSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc0V4ZWNFcnJvciwgc3Bhd24sIFtleGVdKQogCiAgICAgICAgICMgbm93IHNvbWV0aGluZyB0aGF0IHdvcmtzCi0gICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CiAgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLnNoJykKLSAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShleGUsICcjIS9iaW4vc2hcbmV4aXQgMCcpCisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyElc1xuZXhpdCAwJyAlIHVuaXhfc2hlbGwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLmJhdCcpCiAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnZXhpdCAwJykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKaW5kZXggZTE3MWVlOS4uZWZiYTI3ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKQEAgLTEsNSArMSw0IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIuIiIiCi1pbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IEVudmlyb25tZW50VmFyR3VhcmQsIHJ1bl91bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQppbmRleCA0NzgzMzZmLi45M2FiYWQzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQpAQCAtNCw3ICs0LDcgQEAKIHRoYXQgKG9wdGlvbmFsbHkpIHRha2VzIGNhcmUgb2Ygc3RyaXBwaW5nIGNvbW1lbnRzLCBpZ25vcmluZyBibGFuawogbGluZXMsIGFuZCBqb2luaW5nIGxpbmVzIHdpdGggYmFja3NsYXNoZXMuIiIiCiAKLWltcG9ydCBzeXMsIG9zLCBpbworaW1wb3J0IHN5cywgaW8KIAogCiBjbGFzcyBUZXh0RmlsZToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQppbmRleCBlNDIzMzI1Li5mZGNmNmZhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CkBAIC03LDggKzcsOCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbXBvcnRsaWIudXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgpAQCAtMzUwLDYgKzM1MCwxMSBAQAogICAgIGdlbmVyYXRlZCBpbiBpbmRpcmVjdCBtb2RlOyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGxlYXZlCiAgICAgaXQgc2V0IHRvIE5vbmUuCiAgICAgIiIiCisKKyAgICAjIExhdGUgaW1wb3J0IHRvIGZpeCBhIGJvb3RzdHJhcCBpc3N1ZTogX3Bvc2l4c3VicHJvY2VzcyBpcyBidWlsdCBieQorICAgICMgc2V0dXAucHksIGJ1dCBzZXR1cC5weSB1c2VzIGRpc3R1dGlscy4KKyAgICBpbXBvcnQgc3VicHJvY2VzcworCiAgICAgIyBub3RoaW5nIGlzIGRvbmUgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgaXMgVHJ1ZQogICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICByYWlzZSBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZC4nKQpAQCAtNDEyLDExICs0MTcsOSBAQAogCiAgICAgICAgICAgICBzY3JpcHQuY2xvc2UoKQogCi0gICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgc2NyaXB0X25hbWVdCi0gICAgICAgIGlmIG9wdGltaXplID09IDE6Ci0gICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItTyIpCi0gICAgICAgIGVsaWYgb3B0aW1pemUgPT0gMjoKLSAgICAgICAgICAgIGNtZC5pbnNlcnQoMSwgIi1PTyIpCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZV0KKyAgICAgICAgY21kLmV4dGVuZChzdWJwcm9jZXNzLl9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSkKKyAgICAgICAgY21kLmFwcGVuZChzY3JpcHRfbmFtZSkKICAgICAgICAgc3Bhd24oY21kLCBkcnlfcnVuPWRyeV9ydW4pCiAgICAgICAgIGV4ZWN1dGUob3MucmVtb3ZlLCAoc2NyaXB0X25hbWUsKSwgInJlbW92aW5nICVzIiAlIHNjcmlwdF9uYW1lLAogICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKZGlmZiAtLWdpdCBhL0xpYi9kb2N0ZXN0LnB5IGIvTGliL2RvY3Rlc3QucHkKaW5kZXggMzhmZGQ4MC4uNTYzMDIyMCAxMDA2NDQKLS0tIGEvTGliL2RvY3Rlc3QucHkKKysrIGIvTGliL2RvY3Rlc3QucHkKQEAgLTM4MSwxMiArMzgxLDE1IEBACiAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAogIyBbWFhdIE5vcm1hbGl6ZSB3aXRoIHJlc3BlY3QgdG8gb3MucGF0aC5wYXJkaXI/Ci1kZWYgX21vZHVsZV9yZWxhdGl2ZV9wYXRoKG1vZHVsZSwgcGF0aCk6CitkZWYgX21vZHVsZV9yZWxhdGl2ZV9wYXRoKG1vZHVsZSwgdGVzdF9wYXRoKToKICAgICBpZiBub3QgaW5zcGVjdC5pc21vZHVsZShtb2R1bGUpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbW9kdWxlOiAlcicgJSBtb2R1bGUpCi0gICAgaWYgcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgaWYgdGVzdF9wYXRoLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTW9kdWxlLXJlbGF0aXZlIGZpbGVzIG1heSBub3QgaGF2ZSBhYnNvbHV0ZSBwYXRocycpCiAKKyAgICAjIE5vcm1hbGl6ZSB0aGUgcGF0aC4gT24gV2luZG93cywgcmVwbGFjZSAiLyIgd2l0aCAiXCIuCisgICAgdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKCoodGVzdF9wYXRoLnNwbGl0KCcvJykpKQorCiAgICAgIyBGaW5kIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHBhdGguCiAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgogICAgICAgICAjIEEgbm9ybWFsIG1vZHVsZS9wYWNrYWdlCkBAIC0zOTgsMTMgKzQwMSwxOSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYmFzZWRpciA9IG9zLmN1cmRpcgogICAgIGVsc2U6CisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKKyAgICAgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gbW9kdWxlLl9fcGF0aF9fOgorICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgdGVzdF9wYXRoKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxwYXRoCisKICAgICAgICAgIyBBIG1vZHVsZSB3L28gX19maWxlX18gKHRoaXMgaW5jbHVkZXMgYnVpbHRpbnMpCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbid0IHJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVyIChpdCBoYXMgbm8gX19maWxlX18pIgogICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kdWxlLl9fbmFtZV9fKQogCi0gICAgIyBDb21iaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgdGhlIHBhdGguCi0gICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCAqKHBhdGguc3BsaXQoJy8nKSkpCisgICAgIyBDb21iaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgdGhlIHRlc3QgcGF0aC4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2VkaXIsIHRlc3RfcGF0aCkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgMi4gRXhhbXBsZSAmIERvY1Rlc3QKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9jb250ZW50bWFuYWdlci5weSBiL0xpYi9lbWFpbC9jb250ZW50bWFuYWdlci5weQppbmRleCBkMzYzNjUyLi4wOTljMzE0IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvY29udGVudG1hbmFnZXIucHkKKysrIGIvTGliL2VtYWlsL2NvbnRlbnRtYW5hZ2VyLnB5CkBAIC0xNDEsNyArMTQxLDcgQEAKIGRlZiBfZW5jb2RlX3RleHQoc3RyaW5nLCBjaGFyc2V0LCBjdGUsIHBvbGljeSk6CiAgICAgbGluZXMgPSBzdHJpbmcuZW5jb2RlKGNoYXJzZXQpLnNwbGl0bGluZXMoKQogICAgIGxpbmVzZXAgPSBwb2xpY3kubGluZXNlcC5lbmNvZGUoJ2FzY2lpJykKLSAgICBkZWYgZW1iZWRlZF9ib2R5KGxpbmVzKTogcmV0dXJuIGxpbmVzZXAuam9pbihsaW5lcykgKyBsaW5lc2VwCisgICAgZGVmIGVtYmVkZGVkX2JvZHkobGluZXMpOiByZXR1cm4gbGluZXNlcC5qb2luKGxpbmVzKSArIGxpbmVzZXAKICAgICBkZWYgbm9ybWFsX2JvZHkobGluZXMpOiByZXR1cm4gYidcbicuam9pbihsaW5lcykgKyBiJ1xuJwogICAgIGlmIGN0ZT09Tm9uZToKICAgICAgICAgIyBVc2UgaGV1cmlzdGljcyB0byBkZWNpZGUgb24gdGhlICJiZXN0IiBlbmNvZGluZy4KQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgICAgICBpZiAocG9saWN5LmN0ZV90eXBlID09ICc4Yml0JyBhbmQKICAgICAgICAgICAgICAgICBtYXgobGVuKHgpIGZvciB4IGluIGxpbmVzKSA8PSBwb2xpY3kubWF4X2xpbmVfbGVuZ3RoKToKICAgICAgICAgICAgIHJldHVybiAnOGJpdCcsIG5vcm1hbF9ib2R5KGxpbmVzKS5kZWNvZGUoJ2FzY2lpJywgJ3N1cnJvZ2F0ZWVzY2FwZScpCi0gICAgICAgIHNuaWZmID0gZW1iZWRlZF9ib2R5KGxpbmVzWzoxMF0pCisgICAgICAgIHNuaWZmID0gZW1iZWRkZWRfYm9keShsaW5lc1s6MTBdKQogICAgICAgICBzbmlmZl9xcCA9IHF1b3ByaW1pbWUuYm9keV9lbmNvZGUoc25pZmYuZGVjb2RlKCdsYXRpbi0xJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kubWF4X2xpbmVfbGVuZ3RoKQogICAgICAgICBzbmlmZl9iYXNlNjQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHNuaWZmKQpAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgIGRhdGEgPSBxdW9wcmltaW1lLmJvZHlfZW5jb2RlKG5vcm1hbF9ib2R5KGxpbmVzKS5kZWNvZGUoJ2xhdGluLTEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5Lm1heF9saW5lX2xlbmd0aCkKICAgICBlbGlmIGN0ZSA9PSAnYmFzZTY0JzoKLSAgICAgICAgZGF0YSA9IF9lbmNvZGVfYmFzZTY0KGVtYmVkZWRfYm9keShsaW5lcyksIHBvbGljeS5tYXhfbGluZV9sZW5ndGgpCisgICAgICAgIGRhdGEgPSBfZW5jb2RlX2Jhc2U2NChlbWJlZGRlZF9ib2R5KGxpbmVzKSwgcG9saWN5Lm1heF9saW5lX2xlbmd0aCkKICAgICBlbHNlOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2Rpbmcge30iLmZvcm1hdChjdGUpKQogICAgIHJldHVybiBjdGUsIGRhdGEKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CmluZGV4IDExZmYxNmQuLjdjM2NkYzkgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkKKysrIGIvTGliL2VtYWlsL2dlbmVyYXRvci5weQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICBzZWxmLl9OTCA9IHBvbGljeS5saW5lc2VwCiAgICAgICAgIHNlbGYuX2VuY29kZWRfTkwgPSBzZWxmLl9lbmNvZGUoc2VsZi5fTkwpCiAgICAgICAgIHNlbGYuX0VNUFRZID0gJycKLSAgICAgICAgc2VsZi5fZW5jb2RlZF9FTVRQWSA9IHNlbGYuX2VuY29kZSgnJykKKyAgICAgICAgc2VsZi5fZW5jb2RlZF9FTVBUWSA9IHNlbGYuX2VuY29kZSgnJykKICAgICAgICAgIyBCZWNhdXNlIHdlIHVzZSBjbG9uZSAoYmVsb3cpIHdoZW4gd2UgcmVjdXJzaXZlbHkgcHJvY2VzcyBtZXNzYWdlCiAgICAgICAgICMgc3VicGFydHMsIGFuZCBiZWNhdXNlIGNsb25lIHVzZXMgdGhlIGNvbXB1dGVkIHBvbGljeSAobm90IE5vbmUpLAogICAgICAgICAjIHN1Ym1lc3NhZ2VzIHdpbGwgYXV0b21hdGljYWxseSBnZXQgc2V0IHRvIHRoZSBjb21wdXRlZCBwb2xpY3kgd2hlbgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2hlYWRlci5weSBiL0xpYi9lbWFpbC9oZWFkZXIucHkKaW5kZXggNjgyMGVhMS4uYzdiMmRkOSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2hlYWRlci5weQorKysgYi9MaWIvZW1haWwvaGVhZGVyLnB5CkBAIC00OSw3ICs0OSw3IEBACiAKICMgRmluZCBhIGhlYWRlciBlbWJlZGRlZCBpbiBhIHB1dGF0aXZlIGhlYWRlciB2YWx1ZS4gIFVzZWQgdG8gY2hlY2sgZm9yCiAjIGhlYWRlciBpbmplY3Rpb24gYXR0YWNrLgotX2VtYmVkZWRfaGVhZGVyID0gcmUuY29tcGlsZShyJ1xuW14gXHRdKzonKQorX2VtYmVkZGVkX2hlYWRlciA9IHJlLmNvbXBpbGUocidcblteIFx0XSs6JykKIAogCiAMCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICAgaWYgc2VsZi5fY2h1bmtzOgogICAgICAgICAgICAgZm9ybWF0dGVyLmFkZF90cmFuc2l0aW9uKCkKICAgICAgICAgdmFsdWUgPSBmb3JtYXR0ZXIuX3N0cihsaW5lc2VwKQotICAgICAgICBpZiBfZW1iZWRlZF9oZWFkZXIuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgaWYgX2VtYmVkZGVkX2hlYWRlci5zZWFyY2godmFsdWUpOgogICAgICAgICAgICAgcmFpc2UgSGVhZGVyUGFyc2VFcnJvcigiaGVhZGVyIHZhbHVlIGFwcGVhcnMgdG8gY29udGFpbiAiCiAgICAgICAgICAgICAgICAgImFuIGVtYmVkZGVkIGhlYWRlcjogeyFyfSIuZm9ybWF0KHZhbHVlKSkKICAgICAgICAgcmV0dXJuIHZhbHVlCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWVzc2FnZS5weSBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CmluZGV4IGFlZmFmNTcuLjY1YmIyMzcgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9tZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogICAgICAgICAgICAgeWllbGQgZnJvbSBwYXJ0cwogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICMgT3RoZXJ3aXNlIHdlIG1vcmUgb3IgbGVzcyBpbnZlcnQgdGhlIHJlbWFpbmluZyBsb2dpYyBpbiBnZXRfYm9keS4KLSAgICAgICAgIyBUaGlzIG9ubHkgcmVhbGx5IHdvcmtzIGluIGVkZ2UgY2FzZXMgKGV4OiBub24tdGV4dCByZWxhdGVkcyBvcgorICAgICAgICAjIFRoaXMgb25seSByZWFsbHkgd29ya3MgaW4gZWRnZSBjYXNlcyAoZXg6IG5vbi10ZXh0IHJlbGF0ZWQgb3IKICAgICAgICAgIyBhbHRlcm5hdGl2ZXMpIGlmIHRoZSBzZW5kaW5nIGFnZW50IHNldHMgY29udGVudC1kaXNwb3NpdGlvbi4KICAgICAgICAgc2VlbiA9IFtdICAgIyBPbmx5IHNraXAgdGhlIGZpcnN0IGV4YW1wbGUgb2YgZWFjaCBjYW5kaWRhdGUgdHlwZS4KICAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6CmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5IGIvTGliL2VuY29kaW5ncy9fX2luaXRfXy5weQppbmRleCA4ZGQ3MTMwLi4zMjAwMTFiIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvX19pbml0X18ucHkKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAiIiIKICAgICBpZiBpc2luc3RhbmNlKGVuY29kaW5nLCBieXRlcyk6CiAgICAgICAgIGVuY29kaW5nID0gc3RyKGVuY29kaW5nLCAiYXNjaWkiKQorCiAgICAgY2hhcnMgPSBbXQogICAgIHB1bmN0ID0gRmFsc2UKICAgICBmb3IgYyBpbiBlbmNvZGluZzoKZGlmZiAtLWdpdCBhL0xpYi9lbnVtLnB5IGIvTGliL2VudW0ucHkKaW5kZXggYjg3ODdkMS4uNmExODk5OSAxMDA2NDQKLS0tIGEvTGliL2VudW0ucHkKKysrIGIvTGliL2VudW0ucHkKQEAgLTEsOCArMSwxNiBAQAogaW1wb3J0IHN5cwotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gdHlwZXMgaW1wb3J0IE1hcHBpbmdQcm94eVR5cGUsIER5bmFtaWNDbGFzc0F0dHJpYnV0ZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorZnJvbSBvcGVyYXRvciBpbXBvcnQgb3JfIGFzIF9vcl8KIAotX19hbGxfXyA9IFsnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCisjIHRyeSBfY29sbGVjdGlvbnMgZmlyc3QgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gX2NvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKworX19hbGxfXyA9IFsnRW51bU1ldGEnLCAnRW51bScsICdJbnRFbnVtJywgJ0ZsYWcnLCAnSW50RmxhZycsICd1bmlxdWUnXQogCiAKIGRlZiBfaXNfZGVzY3JpcHRvcihvYmopOgpAQCAtNTgsMTYgKzY2LDIxIEBACiAKICAgICAgICAgIiIiCiAgICAgICAgIGlmIF9pc19zdW5kZXIoa2V5KToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ19uYW1lc18gYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgRW51bSB1c2UnKQorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiAoCisgICAgICAgICAgICAgICAgICAgICdfb3JkZXJfJywgJ19jcmVhdGVfcHNldWRvX21lbWJlcl8nLCAnX2RlY29tcG9zZV8nLAorICAgICAgICAgICAgICAgICAgICAnX2dlbmVyYXRlX25leHRfdmFsdWVfJywgJ19taXNzaW5nXycsCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignX25hbWVzXyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBFbnVtIHVzZScpCiAgICAgICAgIGVsaWYgX2lzX2R1bmRlcihrZXkpOgotICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYga2V5ID09ICdfX29yZGVyX18nOgorICAgICAgICAgICAgICAgIGtleSA9ICdfb3JkZXJfJwogICAgICAgICBlbGlmIGtleSBpbiBzZWxmLl9tZW1iZXJfbmFtZXM6CiAgICAgICAgICAgICAjIGRlc2NyaXB0b3Igb3ZlcndyaXRpbmcgYW4gZW51bT8KICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQXR0ZW1wdGVkIHRvIHJldXNlIGtleTogJXInICUga2V5KQogICAgICAgICBlbGlmIG5vdCBfaXNfZGVzY3JpcHRvcih2YWx1ZSk6CiAgICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgICAjIGVudW0gb3ZlcndyaXRpbmcgYSBkZXNjcmlwdG9yPwotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignS2V5IGFscmVhZHkgZGVmaW5lZCBhczogJXInICUgc2VsZltrZXldKQorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgYWxyZWFkeSBkZWZpbmVkIGFzOiAlcicgJSAoa2V5LCBzZWxmW2tleV0pKQogICAgICAgICAgICAgc2VsZi5fbWVtYmVyX25hbWVzLmFwcGVuZChrZXkpCiAgICAgICAgIHN1cGVyKCkuX19zZXRpdGVtX18oa2V5LCB2YWx1ZSkKIApAQCAtODMsNyArOTYsMTMgQEAKICAgICAiIiJNZXRhY2xhc3MgZm9yIEVudW0iIiIKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX19wcmVwYXJlX18obWV0YWNscywgY2xzLCBiYXNlcyk6Ci0gICAgICAgIHJldHVybiBfRW51bURpY3QoKQorICAgICAgICAjIGNyZWF0ZSB0aGUgbmFtZXNwYWNlIGRpY3QKKyAgICAgICAgZW51bV9kaWN0ID0gX0VudW1EaWN0KCkKKyAgICAgICAgIyBpbmhlcml0IHByZXZpb3VzIGZsYWdzIGFuZCBfZ2VuZXJhdGVfbmV4dF92YWx1ZV8gZnVuY3Rpb24KKyAgICAgICAgbWVtYmVyX3R5cGUsIGZpcnN0X2VudW0gPSBtZXRhY2xzLl9nZXRfbWl4aW5zXyhiYXNlcykKKyAgICAgICAgaWYgZmlyc3RfZW51bSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudW1fZGljdFsnX2dlbmVyYXRlX25leHRfdmFsdWVfJ10gPSBnZXRhdHRyKGZpcnN0X2VudW0sICdfZ2VuZXJhdGVfbmV4dF92YWx1ZV8nLCBOb25lKQorICAgICAgICByZXR1cm4gZW51bV9kaWN0CiAKICAgICBkZWYgX19uZXdfXyhtZXRhY2xzLCBjbHMsIGJhc2VzLCBjbGFzc2RpY3QpOgogICAgICAgICAjIGFuIEVudW0gY2xhc3MgaXMgZmluYWwgb25jZSBlbnVtZXJhdGlvbiBpdGVtcyBoYXZlIGJlZW4gZGVmaW5lZDsgaXQKQEAgLTk2LDEyICsxMTUsMTUgQEAKIAogICAgICAgICAjIHNhdmUgZW51bSBpdGVtcyBpbnRvIHNlcGFyYXRlIG1hcHBpbmcgc28gdGhleSBkb24ndCBnZXQgYmFrZWQgaW50bwogICAgICAgICAjIHRoZSBuZXcgY2xhc3MKLSAgICAgICAgbWVtYmVycyA9IHtrOiBjbGFzc2RpY3Rba10gZm9yIGsgaW4gY2xhc3NkaWN0Ll9tZW1iZXJfbmFtZXN9CisgICAgICAgIGVudW1fbWVtYmVycyA9IHtrOiBjbGFzc2RpY3Rba10gZm9yIGsgaW4gY2xhc3NkaWN0Ll9tZW1iZXJfbmFtZXN9CiAgICAgICAgIGZvciBuYW1lIGluIGNsYXNzZGljdC5fbWVtYmVyX25hbWVzOgogICAgICAgICAgICAgZGVsIGNsYXNzZGljdFtuYW1lXQogCisgICAgICAgICMgYWRqdXN0IHRoZSBzdW5kZXJzCisgICAgICAgIF9vcmRlcl8gPSBjbGFzc2RpY3QucG9wKCdfb3JkZXJfJywgTm9uZSkKKwogICAgICAgICAjIGNoZWNrIGZvciBpbGxlZ2FsIGVudW0gbmFtZXMgKGFueSBvdGhlcnM/KQotICAgICAgICBpbnZhbGlkX25hbWVzID0gc2V0KG1lbWJlcnMpICYgeydtcm8nLCB9CisgICAgICAgIGludmFsaWRfbmFtZXMgPSBzZXQoZW51bV9tZW1iZXJzKSAmIHsnbXJvJywgfQogICAgICAgICBpZiBpbnZhbGlkX25hbWVzOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBlbnVtIG1lbWJlciBuYW1lOiB7MH0nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAnLCcuam9pbihpbnZhbGlkX25hbWVzKSkpCkBAIC0xNDUsNyArMTY3LDcgQEAKICAgICAgICAgIyBhIGN1c3RvbSBfX25ld19fIGlzIGRvaW5nIHNvbWV0aGluZyBmdW5reSB3aXRoIHRoZSB2YWx1ZXMgLS0gc3VjaCBhcwogICAgICAgICAjIGF1dG8tbnVtYmVyaW5nIDspCiAgICAgICAgIGZvciBtZW1iZXJfbmFtZSBpbiBjbGFzc2RpY3QuX21lbWJlcl9uYW1lczoKLSAgICAgICAgICAgIHZhbHVlID0gbWVtYmVyc1ttZW1iZXJfbmFtZV0KKyAgICAgICAgICAgIHZhbHVlID0gZW51bV9tZW1iZXJzW21lbWJlcl9uYW1lXQogICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICAgICBhcmdzID0gKHZhbHVlLCApCiAgICAgICAgICAgICBlbHNlOgpAQCAtMTU5LDcgKzE4MSwxMCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBlbnVtX21lbWJlciA9IF9fbmV3X18oZW51bV9jbGFzcywgKmFyZ3MpCiAgICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZW51bV9tZW1iZXIsICdfdmFsdWVfJyk6Ci0gICAgICAgICAgICAgICAgICAgIGVudW1fbWVtYmVyLl92YWx1ZV8gPSBtZW1iZXJfdHlwZSgqYXJncykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyX3R5cGUgaXMgb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgZW51bV9tZW1iZXIuX3ZhbHVlXyA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtX21lbWJlci5fdmFsdWVfID0gbWVtYmVyX3R5cGUoKmFyZ3MpCiAgICAgICAgICAgICB2YWx1ZSA9IGVudW1fbWVtYmVyLl92YWx1ZV8KICAgICAgICAgICAgIGVudW1fbWVtYmVyLl9uYW1lXyA9IG1lbWJlcl9uYW1lCiAgICAgICAgICAgICBlbnVtX21lbWJlci5fX29iamNsYXNzX18gPSBlbnVtX2NsYXNzCkBAIC0yMDQsNiArMjI5LDE0IEBACiAgICAgICAgICAgICBpZiBzYXZlX25ldzoKICAgICAgICAgICAgICAgICBlbnVtX2NsYXNzLl9fbmV3X21lbWJlcl9fID0gX19uZXdfXwogICAgICAgICAgICAgZW51bV9jbGFzcy5fX25ld19fID0gRW51bS5fX25ld19fCisKKyAgICAgICAgIyBweTMgc3VwcG9ydCBmb3IgZGVmaW5pdGlvbiBvcmRlciAoaGVscHMga2VlcCBweTIvcHkzIGNvZGUgaW4gc3luYykKKyAgICAgICAgaWYgX29yZGVyXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX29yZGVyXywgc3RyKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gX29yZGVyXy5yZXBsYWNlKCcsJywgJyAnKS5zcGxpdCgpCisgICAgICAgICAgICBpZiBfb3JkZXJfICE9IGVudW1fY2xhc3MuX21lbWJlcl9uYW1lc186CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtZW1iZXIgb3JkZXIgZG9lcyBub3QgbWF0Y2ggX29yZGVyXycpCisKICAgICAgICAgcmV0dXJuIGVudW1fY2xhc3MKIAogICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKQEAgLTMyNSwxMyArMzU4LDE4IEBACiAgICAgICAgICIiIgogICAgICAgICBtZXRhY2xzID0gY2xzLl9fY2xhc3NfXwogICAgICAgICBiYXNlcyA9IChjbHMsICkgaWYgdHlwZSBpcyBOb25lIGVsc2UgKHR5cGUsIGNscykKKyAgICAgICAgXywgZmlyc3RfZW51bSA9IGNscy5fZ2V0X21peGluc18oYmFzZXMpCiAgICAgICAgIGNsYXNzZGljdCA9IG1ldGFjbHMuX19wcmVwYXJlX18oY2xhc3NfbmFtZSwgYmFzZXMpCiAKICAgICAgICAgIyBzcGVjaWFsIHByb2Nlc3NpbmcgbmVlZGVkIGZvciBuYW1lcz8KICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lcywgc3RyKToKICAgICAgICAgICAgIG5hbWVzID0gbmFtZXMucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKQogICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVzLCAodHVwbGUsIGxpc3QpKSBhbmQgaXNpbnN0YW5jZShuYW1lc1swXSwgc3RyKToKLSAgICAgICAgICAgIG5hbWVzID0gWyhlLCBpKSBmb3IgKGksIGUpIGluIGVudW1lcmF0ZShuYW1lcywgc3RhcnQpXQorICAgICAgICAgICAgb3JpZ2luYWxfbmFtZXMsIG5hbWVzID0gbmFtZXMsIFtdCisgICAgICAgICAgICBsYXN0X3ZhbHVlID0gTm9uZQorICAgICAgICAgICAgZm9yIGNvdW50LCBuYW1lIGluIGVudW1lcmF0ZShvcmlnaW5hbF9uYW1lcyk6CisgICAgICAgICAgICAgICAgbGFzdF92YWx1ZSA9IGZpcnN0X2VudW0uX2dlbmVyYXRlX25leHRfdmFsdWVfKG5hbWUsIHN0YXJ0LCBjb3VudCwgbGFzdF92YWx1ZSkKKyAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoKG5hbWUsIGxhc3RfdmFsdWUpKQogCiAgICAgICAgICMgSGVyZSwgbmFtZXMgaXMgZWl0aGVyIGFuIGl0ZXJhYmxlIG9mIChuYW1lLCB2YWx1ZSkgb3IgYSBtYXBwaW5nLgogICAgICAgICBmb3IgaXRlbSBpbiBuYW1lczoKQEAgLTQ3Myw2ICs1MTEsMTYgQEAKICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gY2xzLl9tZW1iZXJfbWFwXy52YWx1ZXMoKToKICAgICAgICAgICAgICAgICBpZiBtZW1iZXIuX3ZhbHVlXyA9PSB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcgorICAgICAgICAjIHN0aWxsIG5vdCBmb3VuZCAtLSB0cnkgX21pc3NpbmdfIGhvb2sKKyAgICAgICAgcmV0dXJuIGNscy5fbWlzc2luZ18odmFsdWUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9nZW5lcmF0ZV9uZXh0X3ZhbHVlXyhuYW1lLCBzdGFydCwgY291bnQsIGxhc3RfdmFsdWUpOgorICAgICAgICBpZiBub3QgY291bnQ6CisgICAgICAgICAgICByZXR1cm4gc3RhcnQKKyAgICAgICAgcmV0dXJuIGxhc3RfdmFsdWUgKyAxCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9taXNzaW5nXyhjbHMsIHZhbHVlKToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXIgaXMgbm90IGEgdmFsaWQgJXMiICUgKHZhbHVlLCBjbHMuX19uYW1lX18pKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtNTQ0LDggKzU5MiwxNCBAQAogICAgICAgICAgICAgc291cmNlID0gdmFycyhzb3VyY2UpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzb3VyY2UgPSBtb2R1bGVfZ2xvYmFscwotICAgICAgICBtZW1iZXJzID0ge25hbWU6IHZhbHVlIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3VyY2UuaXRlbXMoKQotICAgICAgICAgICAgICAgIGlmIGZpbHRlcihuYW1lKX0KKyAgICAgICAgIyBXZSB1c2UgYW4gT3JkZXJlZERpY3Qgb2Ygc29ydGVkIHNvdXJjZSBrZXlzIHNvIHRoYXQgdGhlCisgICAgICAgICMgX3ZhbHVlMm1lbWJlcl9tYXAgaXMgcG9wdWxhdGVkIGluIHRoZSBzYW1lIG9yZGVyIGV2ZXJ5IHRpbWUKKyAgICAgICAgIyBmb3IgYSBjb25zaXN0ZW50IHJldmVyc2UgbWFwcGluZyBvZiBudW1iZXIgdG8gbmFtZSB3aGVuIHRoZXJlCisgICAgICAgICMgYXJlIG11bHRpcGxlIG5hbWVzIGZvciB0aGUgc2FtZSBudW1iZXIgcmF0aGVyIHRoYW4gdmFyeWluZworICAgICAgICAjIGJldHdlZW4gcnVucyBkdWUgdG8gaGFzaCByYW5kb21pemF0aW9uIG9mIHRoZSBtb2R1bGUgZGljdGlvbmFyeS4KKyAgICAgICAgbWVtYmVycyA9IE9yZGVyZWREaWN0KChuYW1lLCBzb3VyY2VbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoc291cmNlLmtleXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbHRlcihuYW1lKSkKICAgICAgICAgY2xzID0gY2xzKG5hbWUsIG1lbWJlcnMsIG1vZHVsZT1tb2R1bGUpCiAgICAgICAgIGNscy5fX3JlZHVjZV9leF9fID0gX3JlZHVjZV9leF9ieV9uYW1lCiAgICAgICAgIG1vZHVsZV9nbG9iYWxzLnVwZGF0ZShjbHMuX19tZW1iZXJzX18pCkBAIC01NjAsNiArNjE0LDE3OSBAQAogZGVmIF9yZWR1Y2VfZXhfYnlfbmFtZShzZWxmLCBwcm90byk6CiAgICAgcmV0dXJuIHNlbGYubmFtZQogCitjbGFzcyBGbGFnKEVudW0pOgorICAgICIiIlN1cHBvcnQgZm9yIGZsYWdzIiIiCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZ2VuZXJhdGVfbmV4dF92YWx1ZV8obmFtZSwgc3RhcnQsIGNvdW50LCBsYXN0X3ZhbHVlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIHRoZSBuZXh0IHZhbHVlIHdoZW4gbm90IGdpdmVuLgorCisgICAgICAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIKKyAgICAgICAgc3RhcnQ6IHRoZSBpbml0aXRhbCBzdGFydCB2YWx1ZSBvciBOb25lCisgICAgICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIG1lbWJlcnMKKyAgICAgICAgbGFzdF92YWx1ZTogdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQgb3IgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGNvdW50OgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0IGlmIHN0YXJ0IGlzIG5vdCBOb25lIGVsc2UgMQorICAgICAgICBoaWdoX2JpdCA9IF9oaWdoX2JpdChsYXN0X3ZhbHVlKQorICAgICAgICByZXR1cm4gMiAqKiAoaGlnaF9iaXQrMSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfbWlzc2luZ18oY2xzLCB2YWx1ZSk6CisgICAgICAgIG9yaWdpbmFsX3ZhbHVlID0gdmFsdWUKKyAgICAgICAgaWYgdmFsdWUgPCAwOgorICAgICAgICAgICAgdmFsdWUgPSB+dmFsdWUKKyAgICAgICAgcG9zc2libGVfbWVtYmVyID0gY2xzLl9jcmVhdGVfcHNldWRvX21lbWJlcl8odmFsdWUpCisgICAgICAgIGZvciBtZW1iZXIgaW4gcG9zc2libGVfbWVtYmVyLl9kZWNvbXBvc2VfKCk6CisgICAgICAgICAgICBpZiBtZW1iZXIuX25hbWVfIGlzIE5vbmUgYW5kIG1lbWJlci5fdmFsdWVfICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXIgaXMgbm90IGEgdmFsaWQgJXMnICUgKG9yaWdpbmFsX3ZhbHVlLCBjbHMuX19uYW1lX18pKQorICAgICAgICBpZiBvcmlnaW5hbF92YWx1ZSA8IDA6CisgICAgICAgICAgICBwb3NzaWJsZV9tZW1iZXIgPSB+cG9zc2libGVfbWVtYmVyCisgICAgICAgIHJldHVybiBwb3NzaWJsZV9tZW1iZXIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfY3JlYXRlX3BzZXVkb19tZW1iZXJfKGNscywgdmFsdWUpOgorICAgICAgICBwc2V1ZG9fbWVtYmVyID0gY2xzLl92YWx1ZTJtZW1iZXJfbWFwXy5nZXQodmFsdWUsIE5vbmUpCisgICAgICAgIGlmIHBzZXVkb19tZW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgICMgY29uc3RydWN0IGEgbm9uLXNpbmdsZXRvbiBlbnVtIHBzZXVkby1tZW1iZXIKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIgPSBvYmplY3QuX19uZXdfXyhjbHMpCisgICAgICAgICAgICBwc2V1ZG9fbWVtYmVyLl9uYW1lXyA9IE5vbmUKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIuX3ZhbHVlXyA9IHZhbHVlCisgICAgICAgICAgICBjbHMuX3ZhbHVlMm1lbWJlcl9tYXBfW3ZhbHVlXSA9IHBzZXVkb19tZW1iZXIKKyAgICAgICAgcmV0dXJuIHBzZXVkb19tZW1iZXIKKworICAgIGRlZiBfZGVjb21wb3NlXyhzZWxmKToKKyAgICAgICAgIiIiRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSB2YWx1ZS4iIiIKKyAgICAgICAgdmFsdWUgPSBzZWxmLl92YWx1ZV8KKyAgICAgICAgbWVtYmVycyA9IFtdCisgICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCisgICAgICAgIGZvciBtZW1iZXIgaW4gc29ydGVkKGNscywga2V5PWxhbWJkYSBtOiBtLl92YWx1ZV8sIHJldmVyc2U9VHJ1ZSk6CisgICAgICAgICAgICB3aGlsZSBfaGlnaF9iaXQodmFsdWUpID4gX2hpZ2hfYml0KG1lbWJlci5fdmFsdWVfKToKKyAgICAgICAgICAgICAgICB1bmtub3duID0gc2VsZi5fY3JlYXRlX3BzZXVkb19tZW1iZXJfKDIgKiogX2hpZ2hfYml0KHZhbHVlKSkKKyAgICAgICAgICAgICAgICBtZW1iZXJzLmFwcGVuZCh1bmtub3duKQorICAgICAgICAgICAgICAgIHZhbHVlICY9IH51bmtub3duLl92YWx1ZV8KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgKHZhbHVlICYgbWVtYmVyLl92YWx1ZV8gPT0gbWVtYmVyLl92YWx1ZV8pCisgICAgICAgICAgICAgICAgICAgIGFuZCAobWVtYmVyLl92YWx1ZV8gb3Igbm90IG1lbWJlcnMpCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgdmFsdWUgJj0gfm1lbWJlci5fdmFsdWVfCisgICAgICAgICAgICAgICAgbWVtYmVycy5hcHBlbmQobWVtYmVyKQorICAgICAgICBpZiBub3QgbWVtYmVycyBvciB2YWx1ZToKKyAgICAgICAgICAgIG1lbWJlcnMuYXBwZW5kKHNlbGYuX2NyZWF0ZV9wc2V1ZG9fbWVtYmVyXyh2YWx1ZSkpCisgICAgICAgIG1lbWJlcnMgPSBsaXN0KG1lbWJlcnMpCisgICAgICAgIHJldHVybiBtZW1iZXJzCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gb3RoZXIuX3ZhbHVlXyAmIHNlbGYuX3ZhbHVlXyA9PSBvdGhlci5fdmFsdWVfCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsdWUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fZGVjb21wb3NlXygpKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLl9fY2xhc3NfXworICAgICAgICBpZiBzZWxmLl9uYW1lXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnPCVzLiVzOiAlcj4nICUgKGNscy5fX25hbWVfXywgc2VsZi5fbmFtZV8sIHNlbGYuX3ZhbHVlXykKKyAgICAgICAgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICByZXR1cm4gJzwlcy4lczogJXI+JyAlICgKKyAgICAgICAgICAgICAgICBjbHMuX19uYW1lX18sCisgICAgICAgICAgICAgICAgJ3wnLmpvaW4oW3N0cihtLl9uYW1lXyBvciBtLl92YWx1ZV8pIGZvciBtIGluIG1lbWJlcnNdKSwKKyAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZV8sCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCisgICAgICAgIGlmIHNlbGYuX25hbWVfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuICclcy4lcycgJSAoY2xzLl9fbmFtZV9fLCBzZWxmLl9uYW1lXykKKyAgICAgICAgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICBpZiBsZW4obWVtYmVycykgPT0gMSBhbmQgbWVtYmVyc1swXS5fbmFtZV8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJXMuJXInICUgKGNscy5fX25hbWVfXywgbWVtYmVyc1swXS5fdmFsdWVfKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcy4lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIGNscy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgJ3wnLmpvaW4oW3N0cihtLl9uYW1lXyBvciBtLl92YWx1ZV8pIGZvciBtIGluIG1lbWJlcnNdKSwKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92YWx1ZV8pCisKKyAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIHwgb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfICYgb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIF4gb3RoZXIuX3ZhbHVlXykKKworICAgIGRlZiBfX2ludmVydF9fKHNlbGYpOgorICAgICAgICBtZW1iZXJzID0gc2VsZi5fZGVjb21wb3NlXygpCisgICAgICAgIGludmVydGVkX21lbWJlcnMgPSBbbSBmb3IgbSBpbiBzZWxmLl9fY2xhc3NfXyBpZiBtIG5vdCBpbiBtZW1iZXJzIGFuZCBub3QgbS5fdmFsdWVfICYgc2VsZi5fdmFsdWVfXQorICAgICAgICBpbnZlcnRlZCA9IHJlZHVjZShfb3JfLCBpbnZlcnRlZF9tZW1iZXJzLCBzZWxmLl9fY2xhc3NfXygwKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGludmVydGVkKQorCisKK2NsYXNzIEludEZsYWcoaW50LCBGbGFnKToKKyAgICAiIiJTdXBwb3J0IGZvciBpbnRlZ2VyLWJhc2VkIEZsYWdzIiIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9wc2V1ZG9fbWVtYmVyXyhjbHMsIHZhbHVlKToKKyAgICAgICAgcHNldWRvX21lbWJlciA9IGNscy5fdmFsdWUybWVtYmVyX21hcF8uZ2V0KHZhbHVlLCBOb25lKQorICAgICAgICBpZiBwc2V1ZG9fbWVtYmVyIGlzIE5vbmU6CisgICAgICAgICAgICAjIGNvbnN0cnVjdCBhIG5vbi1zaW5nbGV0b24gZW51bSBwc2V1ZG8tbWVtYmVyCisgICAgICAgICAgICBwc2V1ZG9fbWVtYmVyID0gaW50Ll9fbmV3X18oY2xzLCB2YWx1ZSkKKyAgICAgICAgICAgIHBzZXVkb19tZW1iZXIuX25hbWVfID0gTm9uZQorICAgICAgICAgICAgcHNldWRvX21lbWJlci5fdmFsdWVfID0gdmFsdWUKKyAgICAgICAgICAgIGNscy5fdmFsdWUybWVtYmVyX21hcF9bdmFsdWVdID0gcHNldWRvX21lbWJlcgorICAgICAgICByZXR1cm4gcHNldWRvX21lbWJlcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9taXNzaW5nXyhjbHMsIHZhbHVlKToKKyAgICAgICAgcG9zc2libGVfbWVtYmVyID0gY2xzLl9jcmVhdGVfcHNldWRvX21lbWJlcl8odmFsdWUpCisgICAgICAgIHJldHVybiBwb3NzaWJsZV9tZW1iZXIKKworICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgKHNlbGYuX19jbGFzc19fLCBpbnQpKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fdmFsdWVfIHwgc2VsZi5fX2NsYXNzX18ob3RoZXIpLl92YWx1ZV8pCisKKyAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCAoc2VsZi5fX2NsYXNzX18sIGludCkpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLl92YWx1ZV8gJiBzZWxmLl9fY2xhc3NfXyhvdGhlcikuX3ZhbHVlXykKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIChzZWxmLl9fY2xhc3NfXywgaW50KSk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX3ZhbHVlXyBeIHNlbGYuX19jbGFzc19fKG90aGVyKS5fdmFsdWVfKQorCisgICAgX19yb3JfXyA9IF9fb3JfXworICAgIF9fcmFuZF9fID0gX19hbmRfXworICAgIF9fcnhvcl9fID0gX194b3JfXworCisgICAgZGVmIF9faW52ZXJ0X18oc2VsZik6CisgICAgICAgICMgbWVtYmVycyA9IHNlbGYuX2RlY29tcG9zZV8oKQorICAgICAgICAjIGludmVydGVkX21lbWJlcnMgPSBbbSBmb3IgbSBpbiBzZWxmLl9fY2xhc3NfXyBpZiBtIG5vdCBpbiBtZW1iZXJzIGFuZCBub3QgbS5fdmFsdWVfICYgc2VsZi5fdmFsdWVfXQorICAgICAgICAjIGludmVydGVkID0gcmVkdWNlKF9vcl8sIGludmVydGVkX21lbWJlcnMsIHNlbGYuX19jbGFzc19fKDApKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ofnNlbGYuX3ZhbHVlXykKKworCisKKworZGVmIF9oaWdoX2JpdCh2YWx1ZSk6CisgICAgIiIicmV0dXJucyBpbmRleCBvZiBoaWdoZXN0IGJpdCwgb3IgLTEgaWYgdmFsdWUgaXMgemVybyBvciBuZWdhdGl2ZSIiIgorICAgIHJldHVybiB2YWx1ZS5iaXRfbGVuZ3RoKCkgLSAxIGlmIHZhbHVlID4gMCBlbHNlIC0xCisKIGRlZiB1bmlxdWUoZW51bWVyYXRpb24pOgogICAgICIiIkNsYXNzIGRlY29yYXRvciBmb3IgZW51bWVyYXRpb25zIGVuc3VyaW5nIHVuaXF1ZSBtZW1iZXIgdmFsdWVzLiIiIgogICAgIGR1cGxpY2F0ZXMgPSBbXQpkaWZmIC0tZ2l0IGEvTGliL2ZpbGVpbnB1dC5weSBiL0xpYi9maWxlaW5wdXQucHkKaW5kZXggZDJiNTIwNi4uNzIxZmU5YyAxMDA2NDQKLS0tIGEvTGliL2ZpbGVpbnB1dC5weQorKysgYi9MaWIvZmlsZWlucHV0LnB5CkBAIC03NSwxMyArNzUsMTEgQEAKIGltcG9ydCBzeXMsIG9zCiAKIF9fYWxsX18gPSBbImlucHV0IiwgImNsb3NlIiwgIm5leHRmaWxlIiwgImZpbGVuYW1lIiwgImxpbmVubyIsICJmaWxlbGluZW5vIiwKLSAgICAgICAgICAgImlzZmlyc3RsaW5lIiwgImlzc3RkaW4iLCAiRmlsZUlucHV0Il0KKyAgICAgICAgICAgImZpbGVubyIsICJpc2ZpcnN0bGluZSIsICJpc3N0ZGluIiwgIkZpbGVJbnB1dCIsICJob29rX2NvbXByZXNzZWQiLAorICAgICAgICAgICAiaG9va19lbmNvZGVkIl0KIAogX3N0YXRlID0gTm9uZQogCi0jIE5vIGxvbmdlciB1c2VkCi1ERUZBVUxUX0JVRlNJWkUgPSA4KjEwMjQKLQogZGVmIGlucHV0KGZpbGVzPU5vbmUsIGlucGxhY2U9RmFsc2UsIGJhY2t1cD0iIiwgYnVmc2l6ZT0wLAogICAgICAgICAgIG1vZGU9InIiLCBvcGVuaG9vaz1Ob25lKToKICAgICAiIiJSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIEZpbGVJbnB1dCBjbGFzcywgd2hpY2ggY2FuIGJlIGl0ZXJhdGVkLgpAQCAtMjAxLDYgKzE5OSwxMCBAQAogICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCiAgICAgICAgIHNlbGYuX2lucGxhY2UgPSBpbnBsYWNlCiAgICAgICAgIHNlbGYuX2JhY2t1cCA9IGJhY2t1cAorICAgICAgICBpZiBidWZzaXplOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdidWZzaXplIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IE5vbmUKICAgICAgICAgc2VsZi5fb3V0cHV0ID0gTm9uZQogICAgICAgICBzZWxmLl9maWxlbmFtZSA9IE5vbmUKQEAgLTM5OCw5ICs0MDAsOSBAQAogICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSkKIAogCi1kZWYgaG9va19lbmNvZGVkKGVuY29kaW5nKToKK2RlZiBob29rX2VuY29kZWQoZW5jb2RpbmcsIGVycm9ycz1Ob25lKToKICAgICBkZWYgb3Blbmhvb2soZmlsZW5hbWUsIG1vZGUpOgotICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCBtb2RlLCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVycm9ycykKICAgICByZXR1cm4gb3Blbmhvb2sKIAogCmRpZmYgLS1naXQgYS9MaWIvZnJhY3Rpb25zLnB5IGIvTGliL2ZyYWN0aW9ucy5weQppbmRleCA5YWFiYWIzLi44MzMwMjAyIDEwMDY0NAotLS0gYS9MaWIvZnJhY3Rpb25zLnB5CisrKyBiL0xpYi9mcmFjdGlvbnMucHkKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBfX3Nsb3RzX18gPSAoJ19udW1lcmF0b3InLCAnX2Rlbm9taW5hdG9yJykKIAogICAgICMgV2UncmUgaW1tdXRhYmxlLCBzbyB1c2UgX19uZXdfXyBub3QgX19pbml0X18KLSAgICBkZWYgX19uZXdfXyhjbHMsIG51bWVyYXRvcj0wLCBkZW5vbWluYXRvcj1Ob25lLCBfbm9ybWFsaXplPVRydWUpOgorICAgIGRlZiBfX25ld19fKGNscywgbnVtZXJhdG9yPTAsIGRlbm9taW5hdG9yPU5vbmUsICosIF9ub3JtYWxpemU9VHJ1ZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdHMgYSBSYXRpb25hbC4KIAogICAgICAgICBUYWtlcyBhIHN0cmluZyBsaWtlICczLzInIG9yICcxLjUnLCBhbm90aGVyIFJhdGlvbmFsIGluc3RhbmNlLCBhCkBAIC0xMjUsMTcgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuZGVub21pbmF0b3IKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZmxvYXQobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIERlY2ltYWwpOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9kZWNpbWFsKG51bWVyYXRvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIChmbG9hdCwgRGVjaW1hbCkpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgc3RyKToKQEAgLTIxMCwxMCArMjAyLDYgQEAKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShmLCBmbG9hdCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzLmZyb21fZmxvYXQoKSBvbmx5IHRha2VzIGZsb2F0cywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBmLCB0eXBlKGYpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc25hbihmKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc2luZihmKToKLSAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTIyNiwxOSArMjE0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19pbmZpbml0ZSgpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19uYW4oKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVzIHRvICVzLiIgJSAoZGVjLCBjbHMuX19uYW1lX18pKQotICAgICAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGRlYy5hc190dXBsZSgpCi0gICAgICAgIGRpZ2l0cyA9IGludCgnJy5qb2luKG1hcChzdHIsIGRpZ2l0cykpKQotICAgICAgICBpZiBzaWduOgotICAgICAgICAgICAgZGlnaXRzID0gLWRpZ2l0cwotICAgICAgICBpZiBleHAgPj0gMDoKLSAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzICogMTAgKiogZXhwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMsIDEwICoqIC1leHApCisgICAgICAgIHJldHVybiBjbHMoKmRlYy5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBkZWYgbGltaXRfZGVub21pbmF0b3Ioc2VsZiwgbWF4X2Rlbm9taW5hdG9yPTEwMDAwMDApOgogICAgICAgICAiIiJDbG9zZXN0IEZyYWN0aW9uIHRvIHNlbGYgd2l0aCBkZW5vbWluYXRvciBhdCBtb3N0IG1heF9kZW5vbWluYXRvci4KZGlmZiAtLWdpdCBhL0xpYi9mdHBsaWIucHkgYi9MaWIvZnRwbGliLnB5CmluZGV4IGM0MTZkODUuLjJhYjFkNTYgMTAwNjQ0Ci0tLSBhL0xpYi9mdHBsaWIucHkKKysrIGIvTGliL2Z0cGxpYi5weQpAQCAtMzYsMTMgKzM2LDEyIEBACiAjIE1vZGlmaWVkIGJ5IEdpYW1wYW9sbyBSb2RvbGEnIHRvIGFkZCBUTFMgc3VwcG9ydC4KICMKIAotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgd2FybmluZ3MKIGZyb20gc29ja2V0IGltcG9ydCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAogCi1fX2FsbF9fID0gWyJGVFAiXQorX19hbGxfXyA9IFsiRlRQIiwgImVycm9yX3JlcGx5IiwgImVycm9yX3RlbXAiLCAiZXJyb3JfcGVybSIsICJlcnJvcl9wcm90byIsCisgICAgICAgICAgICJhbGxfZXJyb3JzIl0KIAogIyBNYWdpYyBudW1iZXIgZnJvbSA8c29ja2V0Lmg+CiBNU0dfT09CID0gMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIGRhdGEgb3V0IG9mIGJhbmQKZGlmZiAtLWdpdCBhL0xpYi9nZW5lcmljcGF0aC5weSBiL0xpYi9nZW5lcmljcGF0aC5weQppbmRleCA2NzE0MDYxLi4zMDNiM2IzIDEwMDY0NAotLS0gYS9MaWIvZ2VuZXJpY3BhdGgucHkKKysrIGIvTGliL2dlbmVyaWNwYXRoLnB5CkBAIC02OSw2ICs2OSwxMiBAQAogZGVmIGNvbW1vbnByZWZpeChtKToKICAgICAiR2l2ZW4gYSBsaXN0IG9mIHBhdGhuYW1lcywgcmV0dXJucyB0aGUgbG9uZ2VzdCBjb21tb24gbGVhZGluZyBjb21wb25lbnQiCiAgICAgaWYgbm90IG06IHJldHVybiAnJworICAgICMgU29tZSBwZW9wbGUgcGFzcyBpbiBhIGxpc3Qgb2YgcGF0aG5hbWUgcGFydHMgdG8gb3BlcmF0ZSBpbiBhbiBPUy1hZ25vc3RpYworICAgICMgZmFzaGlvbjsgZG9uJ3QgdHJ5IHRvIHRyYW5zbGF0ZSBpbiB0aGF0IGNhc2UgYXMgdGhhdCdzIGFuIGFidXNlIG9mIHRoZQorICAgICMgQVBJIGFuZCB0aGV5IGFyZSBhbHJlYWR5IGRvaW5nIHdoYXQgdGhleSBuZWVkIHRvIGJlIE9TLWFnbm9zdGljIGFuZCBzbworICAgICMgdGhleSBtb3N0IGxpa2VseSB3b24ndCBiZSB1c2luZyBhbiBvcy5QYXRoTGlrZSBvYmplY3QgaW4gdGhlIHN1Ymxpc3RzLgorICAgIGlmIG5vdCBpc2luc3RhbmNlKG1bMF0sIChsaXN0LCB0dXBsZSkpOgorICAgICAgICBtID0gdHVwbGUobWFwKG9zLmZzcGF0aCwgbSkpCiAgICAgczEgPSBtaW4obSkKICAgICBzMiA9IG1heChtKQogICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShzMSk6CmRpZmYgLS1naXQgYS9MaWIvZ2xvYi5weSBiL0xpYi9nbG9iLnB5CmluZGV4IDE2MzMwZDguLjAwMmNkOTIgMTAwNjQ0Ci0tLSBhL0xpYi9nbG9iLnB5CisrKyBiL0xpYi9nbG9iLnB5CkBAIC0zMCwxNSArMzAsMTYgQEAKICAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgICB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzLgogICAgICIiIgotICAgIGl0ID0gX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpCisgICAgaXQgPSBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSwgRmFsc2UpCiAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUocGF0aG5hbWUpOgogICAgICAgICBzID0gbmV4dChpdCkgICMgc2tpcCBlbXB0eSBzdHJpbmcKICAgICAgICAgYXNzZXJ0IG5vdCBzCiAgICAgcmV0dXJuIGl0CiAKLWRlZiBfaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZSk6CitkZWYgX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUsIGRpcm9ubHkpOgogICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKICAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKKyAgICAgICAgYXNzZXJ0IG5vdCBkaXJvbmx5CiAgICAgICAgIGlmIGJhc2VuYW1lOgogICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKICAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQpAQCAtNDksNDcgKzUwLDM5IEBACiAgICAgICAgIHJldHVybgogICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShiYXNlbmFtZSk6Ci0gICAgICAgICAgICB5aWVsZCBmcm9tIGdsb2IyKGRpcm5hbWUsIGJhc2VuYW1lKQorICAgICAgICAgICAgeWllbGQgZnJvbSBfZ2xvYjIoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB5aWVsZCBmcm9tIGdsb2IxKGRpcm5hbWUsIGJhc2VuYW1lKQorICAgICAgICAgICAgeWllbGQgZnJvbSBfZ2xvYjEoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpCiAgICAgICAgIHJldHVybgogICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCiAgICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKICAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KICAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6Ci0gICAgICAgIGRpcnMgPSBfaWdsb2IoZGlybmFtZSwgcmVjdXJzaXZlKQorICAgICAgICBkaXJzID0gX2lnbG9iKGRpcm5hbWUsIHJlY3Vyc2l2ZSwgVHJ1ZSkKICAgICBlbHNlOgogICAgICAgICBkaXJzID0gW2Rpcm5hbWVdCiAgICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKICAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgotICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMgorICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBfZ2xvYjIKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjEKKyAgICAgICAgICAgIGdsb2JfaW5fZGlyID0gX2dsb2IxCiAgICAgZWxzZToKLSAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMAorICAgICAgICBnbG9iX2luX2RpciA9IF9nbG9iMAogICAgIGZvciBkaXJuYW1lIGluIGRpcnM6Ci0gICAgICAgIGZvciBuYW1lIGluIGdsb2JfaW5fZGlyKGRpcm5hbWUsIGJhc2VuYW1lKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYl9pbl9kaXIoZGlybmFtZSwgYmFzZW5hbWUsIGRpcm9ubHkpOgogICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCiAKICMgVGhlc2UgMiBoZWxwZXIgZnVuY3Rpb25zIG5vbi1yZWN1cnNpdmVseSBnbG9iIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgotIyBUaGV5IHJldHVybiBhIGxpc3Qgb2YgYmFzZW5hbWVzLiBgZ2xvYjFgIGFjY2VwdHMgYSBwYXR0ZXJuIHdoaWxlIGBnbG9iMGAKKyMgVGhleSByZXR1cm4gYSBsaXN0IG9mIGJhc2VuYW1lcy4gIF9nbG9iMSBhY2NlcHRzIGEgcGF0dGVybiB3aGlsZSBfZ2xvYjAKICMgdGFrZXMgYSBsaXRlcmFsIGJhc2VuYW1lIChzbyBpdCBvbmx5IGhhcyB0byBjaGVjayBmb3IgaXRzIGV4aXN0ZW5jZSkuCiAKLWRlZiBnbG9iMShkaXJuYW1lLCBwYXR0ZXJuKToKLSAgICBpZiBub3QgZGlybmFtZToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBieXRlcyk6Ci0gICAgICAgICAgICBkaXJuYW1lID0gYnl0ZXMob3MuY3VyZGlyLCAnQVNDSUknKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgotICAgIHRyeToKLSAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHJldHVybiBbXQorZGVmIF9nbG9iMShkaXJuYW1lLCBwYXR0ZXJuLCBkaXJvbmx5KToKKyAgICBuYW1lcyA9IGxpc3QoX2l0ZXJkaXIoZGlybmFtZSwgZGlyb25seSkpCiAgICAgaWYgbm90IF9pc2hpZGRlbihwYXR0ZXJuKToKLSAgICAgICAgbmFtZXMgPSBbeCBmb3IgeCBpbiBuYW1lcyBpZiBub3QgX2lzaGlkZGVuKHgpXQorICAgICAgICBuYW1lcyA9ICh4IGZvciB4IGluIG5hbWVzIGlmIG5vdCBfaXNoaWRkZW4oeCkpCiAgICAgcmV0dXJuIGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKQogCi1kZWYgZ2xvYjAoZGlybmFtZSwgYmFzZW5hbWUpOgorZGVmIF9nbG9iMChkaXJuYW1lLCBiYXNlbmFtZSwgZGlyb25seSk6CiAgICAgaWYgbm90IGJhc2VuYW1lOgogICAgICAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgYW4gZW1wdHkgYmFzZW5hbWUgZm9yIHBhdGhzIGVuZGluZyB3aXRoIGEKICAgICAgICAgIyBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgJ3EqeC8nIHNob3VsZCBtYXRjaCBvbmx5IGRpcmVjdG9yaWVzLgpAQCAtMTAwLDMwICs5Myw0OSBAQAogICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgICByZXR1cm4gW10KIAorIyBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBub3QgcHVibGljIGJ1dCBjYW4gYmUgdXNlZCBieSB0aGlyZC1wYXJ0eSBjb2RlLgorCitkZWYgZ2xvYjAoZGlybmFtZSwgcGF0dGVybik6CisgICAgcmV0dXJuIF9nbG9iMChkaXJuYW1lLCBwYXR0ZXJuLCBGYWxzZSkKKworZGVmIGdsb2IxKGRpcm5hbWUsIHBhdHRlcm4pOgorICAgIHJldHVybiBfZ2xvYjEoZGlybmFtZSwgcGF0dGVybiwgRmFsc2UpCisKICMgVGhpcyBoZWxwZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsCiAjIGRpcmVjdG9yeS4KIAotZGVmIGdsb2IyKGRpcm5hbWUsIHBhdHRlcm4pOgorZGVmIF9nbG9iMihkaXJuYW1lLCBwYXR0ZXJuLCBkaXJvbmx5KToKICAgICBhc3NlcnQgX2lzcmVjdXJzaXZlKHBhdHRlcm4pCiAgICAgeWllbGQgcGF0dGVybls6MF0KLSAgICB5aWVsZCBmcm9tIF9ybGlzdGRpcihkaXJuYW1lKQorICAgIHlpZWxkIGZyb20gX3JsaXN0ZGlyKGRpcm5hbWUsIGRpcm9ubHkpCiAKLSMgUmVjdXJzaXZlbHkgeWllbGRzIHJlbGF0aXZlIHBhdGhuYW1lcyBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KLWRlZiBfcmxpc3RkaXIoZGlybmFtZSk6CisjIElmIGRpcm9ubHkgaXMgZmFsc2UsIHlpZWxkcyBhbGwgZmlsZSBuYW1lcyBpbnNpZGUgYSBkaXJlY3RvcnkuCisjIElmIGRpcm9ubHkgaXMgdHJ1ZSwgeWllbGRzIG9ubHkgZGlyZWN0b3J5IG5hbWVzLgorZGVmIF9pdGVyZGlyKGRpcm5hbWUsIGRpcm9ubHkpOgogICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgICBpZiBpc2luc3RhbmNlKGRpcm5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgIGRpcm5hbWUgPSBieXRlcyhvcy5jdXJkaXIsICdBU0NJSScpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCiAgICAgdHJ5OgotICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHdpdGggb3Muc2NhbmRpcihkaXJuYW1lKSBhcyBpdDoKKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBpdDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkaXJvbmx5IG9yIGVudHJ5LmlzX2RpcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZW50cnkubmFtZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgIHJldHVybgorCisjIFJlY3Vyc2l2ZWx5IHlpZWxkcyByZWxhdGl2ZSBwYXRobmFtZXMgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCitkZWYgX3JsaXN0ZGlyKGRpcm5hbWUsIGRpcm9ubHkpOgorICAgIG5hbWVzID0gbGlzdChfaXRlcmRpcihkaXJuYW1lLCBkaXJvbmx5KSkKICAgICBmb3IgeCBpbiBuYW1lczoKICAgICAgICAgaWYgbm90IF9pc2hpZGRlbih4KToKICAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgeCkgaWYgZGlybmFtZSBlbHNlIHgKLSAgICAgICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgIGZvciB5IGluIF9ybGlzdGRpcihwYXRoLCBkaXJvbmx5KToKICAgICAgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oeCwgeSkKIAogCmRpZmYgLS1naXQgYS9MaWIvaGFzaGxpYi5weSBiL0xpYi9oYXNobGliLnB5CmluZGV4IDMxNmNlY2UuLjQwY2NkZWMgMTAwNjQ0Ci0tLSBhL0xpYi9oYXNobGliLnB5CisrKyBiL0xpYi9oYXNobGliLnB5CkBAIC00LDE0ICs0LDE0IEBACiAKIF9fZG9jX18gPSAiIiJoYXNobGliIG1vZHVsZSAtIEEgY29tbW9uIGludGVyZmFjZSB0byBtYW55IGhhc2ggZnVuY3Rpb25zLgogCi1uZXcobmFtZSwgZGF0YT1iJycpIC0gcmV0dXJucyBhIG5ldyBoYXNoIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gaGFzaCBmdW5jdGlvbjsgaW5pdGlhbGl6aW5nIHRoZSBoYXNoCi0gICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGdpdmVuIGJpbmFyeSBkYXRhLgorbmV3KG5hbWUsIGRhdGE9YicnLCAqKmt3YXJncykgLSByZXR1cm5zIGEgbmV3IGhhc2ggb2JqZWN0IGltcGxlbWVudGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gaGFzaCBmdW5jdGlvbjsgaW5pdGlhbGl6aW5nIHRoZSBoYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBnaXZlbiBiaW5hcnkgZGF0YS4KIAogTmFtZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBhbHNvIGF2YWlsYWJsZSwgdGhlc2UgYXJlIGZhc3RlcgogdGhhbiB1c2luZyBuZXcobmFtZSk6CiAKLW1kNSgpLCBzaGExKCksIHNoYTIyNCgpLCBzaGEyNTYoKSwgc2hhMzg0KCksIGFuZCBzaGE1MTIoKQorbWQ1KCksIHNoYTEoKSwgc2hhMjI0KCksIHNoYTI1NigpLCBzaGEzODQoKSwgc2hhNTEyKCksIGJsYWtlMmIoKSwgYW5kIGJsYWtlMnMoKQogCiBNb3JlIGFsZ29yaXRobXMgbWF5IGJlIGF2YWlsYWJsZSBvbiB5b3VyIHBsYXRmb3JtIGJ1dCB0aGUgYWJvdmUgYXJlIGd1YXJhbnRlZWQKIHRvIGV4aXN0LiAgU2VlIHRoZSBhbGdvcml0aG1zX2d1YXJhbnRlZWQgYW5kIGFsZ29yaXRobXNfYXZhaWxhYmxlIGF0dHJpYnV0ZXMKQEAgLTU0LDcgKzU0LDggQEAKIAogIyBUaGlzIHR1cGxlIGFuZCBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKCkgbXVzdCBiZSBtb2RpZmllZCBpZiBhIG5ldwogIyBhbHdheXMgYXZhaWxhYmxlIGFsZ29yaXRobSBpcyBhZGRlZC4KLV9fYWx3YXlzX3N1cHBvcnRlZCA9ICgnbWQ1JywgJ3NoYTEnLCAnc2hhMjI0JywgJ3NoYTI1NicsICdzaGEzODQnLCAnc2hhNTEyJykKK19fYWx3YXlzX3N1cHBvcnRlZCA9ICgnbWQ1JywgJ3NoYTEnLCAnc2hhMjI0JywgJ3NoYTI1NicsICdzaGEzODQnLCAnc2hhNTEyJywKKyAgICAgICAgICAgICAgICAgICAgICAnYmxha2UyYicsICdibGFrZTJzJykKIAogYWxnb3JpdGhtc19ndWFyYW50ZWVkID0gc2V0KF9fYWx3YXlzX3N1cHBvcnRlZCkKIGFsZ29yaXRobXNfYXZhaWxhYmxlID0gc2V0KF9fYWx3YXlzX3N1cHBvcnRlZCkKQEAgLTg1LDYgKzg2LDEwIEBACiAgICAgICAgICAgICBpbXBvcnQgX3NoYTUxMgogICAgICAgICAgICAgY2FjaGVbJ1NIQTM4NCddID0gY2FjaGVbJ3NoYTM4NCddID0gX3NoYTUxMi5zaGEzODQKICAgICAgICAgICAgIGNhY2hlWydTSEE1MTInXSA9IGNhY2hlWydzaGE1MTInXSA9IF9zaGE1MTIuc2hhNTEyCisgICAgICAgIGVsaWYgbmFtZSBpbiAoJ2JsYWtlMmInLCAnYmxha2UycycpOgorICAgICAgICAgICAgaW1wb3J0IF9ibGFrZTIKKyAgICAgICAgICAgIGNhY2hlWydibGFrZTJiJ10gPSBfYmxha2UyLmJsYWtlMmIKKyAgICAgICAgICAgIGNhY2hlWydibGFrZTJzJ10gPSBfYmxha2UyLmJsYWtlMnMKICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIHBhc3MgICMgbm8gZXh0ZW5zaW9uIG1vZHVsZSwgdGhpcyBoYXNoIGlzIHVuc3VwcG9ydGVkLgogCkBAIC0xMDcsMTcgKzExMiwyMyBAQAogICAgICAgICByZXR1cm4gX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcihuYW1lKQogCiAKLWRlZiBfX3B5X25ldyhuYW1lLCBkYXRhPWInJyk6CitkZWYgX19weV9uZXcobmFtZSwgZGF0YT1iJycsICoqa3dhcmdzKToKKyAgICAiIiJuZXcobmFtZSwgZGF0YT1iJycsICoqa3dhcmdzKSAtIFJldHVybiBhIG5ldyBoYXNoaW5nIG9iamVjdCB1c2luZyB0aGUKKyAgICBuYW1lZCBhbGdvcml0aG07IG9wdGlvbmFsbHkgaW5pdGlhbGl6ZWQgd2l0aCBkYXRhICh3aGljaCBtdXN0IGJlIGJ5dGVzKS4KKyAgICAiIiIKKyAgICByZXR1cm4gX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcihuYW1lKShkYXRhLCAqKmt3YXJncykKKworCitkZWYgX19oYXNoX25ldyhuYW1lLCBkYXRhPWInJywgKiprd2FyZ3MpOgogICAgICIiIm5ldyhuYW1lLCBkYXRhPWInJykgLSBSZXR1cm4gYSBuZXcgaGFzaGluZyBvYmplY3QgdXNpbmcgdGhlIG5hbWVkIGFsZ29yaXRobTsKICAgICBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggZGF0YSAod2hpY2ggbXVzdCBiZSBieXRlcykuCiAgICAgIiIiCi0gICAgcmV0dXJuIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSkoZGF0YSkKLQotCi1kZWYgX19oYXNoX25ldyhuYW1lLCBkYXRhPWInJyk6Ci0gICAgIiIibmV3KG5hbWUsIGRhdGE9YicnKSAtIFJldHVybiBhIG5ldyBoYXNoaW5nIG9iamVjdCB1c2luZyB0aGUgbmFtZWQgYWxnb3JpdGhtOwotICAgIG9wdGlvbmFsbHkgaW5pdGlhbGl6ZWQgd2l0aCBkYXRhICh3aGljaCBtdXN0IGJlIGJ5dGVzKS4KLSAgICAiIiIKKyAgICBpZiBuYW1lIGluIHsnYmxha2UyYicsICdibGFrZTJzJ306CisgICAgICAgICMgUHJlZmVyIG91ciBibGFrZTIgaW1wbGVtZW50YXRpb24uCisgICAgICAgICMgT3BlblNTTCAxLjEuMCBjb21lcyB3aXRoIGEgbGltaXRlZCBpbXBsZW1lbnRhdGlvbiBvZiBibGFrZTJiL3MuCisgICAgICAgICMgSXQgZG9lcyBuZWl0aGVyIHN1cHBvcnQga2V5ZWQgYmxha2UyIG5vciBhZHZhbmNlZCBmZWF0dXJlcyBsaWtlCisgICAgICAgICMgc2FsdCwgcGVyc29uYWwsIHRyZWUgaGFzaGluZyBvciBTU0UuCisgICAgICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpKGRhdGEsICoqa3dhcmdzKQogICAgIHRyeToKICAgICAgICAgcmV0dXJuIF9oYXNobGliLm5ldyhuYW1lLCBkYXRhKQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgpAQCAtMjAyLDYgKzIxMywxMiBAQAogCiAgICAgICAgIHJldHVybiBka2V5Wzpka2xlbl0KIAordHJ5OgorICAgICMgT3BlblNTTCdzIHNjcnlwdCByZXF1aXJlcyBPcGVuU1NMIDEuMSsKKyAgICBmcm9tIF9oYXNobGliIGltcG9ydCBzY3J5cHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKIAogZm9yIF9fZnVuY19uYW1lIGluIF9fYWx3YXlzX3N1cHBvcnRlZDoKICAgICAjIHRyeSB0aGVtIGFsbCwgc29tZSBtYXkgbm90IHdvcmsgZHVlIHRvIHRoZSBPcGVuU1NMCkBAIC0yMTIsNiArMjI5LDcgQEAKICAgICAgICAgaW1wb3J0IGxvZ2dpbmcKICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oJ2NvZGUgZm9yIGhhc2ggJXMgd2FzIG5vdCBmb3VuZC4nLCBfX2Z1bmNfbmFtZSkKIAorCiAjIENsZWFudXAgbG9jYWxzKCkKIGRlbCBfX2Fsd2F5c19zdXBwb3J0ZWQsIF9fZnVuY19uYW1lLCBfX2dldF9oYXNoCiBkZWwgX19weV9uZXcsIF9faGFzaF9uZXcsIF9fZ2V0X29wZW5zc2xfY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL0xpYi9odHRwL2NsaWVudC5weSBiL0xpYi9odHRwL2NsaWVudC5weQppbmRleCAzNTAzMTNlLi4yMzBiY2NlIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9jbGllbnQucHkKKysrIGIvTGliL2h0dHAvY2xpZW50LnB5CkBAIC0xMzYsNyArMTM2LDcgQEAKICMKICMgVkNIQVIgZGVmaW5lZCBpbiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MjM0I2FwcGVuZGl4LUIuMQogCi0jIHRoZSBwYXR0ZXJucyBmb3IgYm90aCBuYW1lIGFuZCB2YWx1ZSBhcmUgbW9yZSBsZW5pYW50IHRoYW4gUkZDCisjIHRoZSBwYXR0ZXJucyBmb3IgYm90aCBuYW1lIGFuZCB2YWx1ZSBhcmUgbW9yZSBsZW5pZW50IHRoYW4gUkZDCiAjIGRlZmluaXRpb25zIHRvIGFsbG93IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogX2lzX2xlZ2FsX2hlYWRlcl9uYW1lID0gcmUuY29tcGlsZShyYidbXjpcc11bXjpcclxuXSonKS5mdWxsbWF0Y2gKIF9pc19pbGxlZ2FsX2hlYWRlcl92YWx1ZSA9IHJlLmNvbXBpbGUocmInXG4oPyFbIFx0XSl8XHIoPyFbIFx0XG5dKScpLnNlYXJjaApAQCAtNDIwLDYgKzQyMCw3IEBACiAgICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKIAogICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgIiIiQWx3YXlzIHJldHVybnMgVHJ1ZSIiIgogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgIyBFbmQgb2YgInJhdyBzdHJlYW0iIG1ldGhvZHMKQEAgLTQ2Nyw2ICs0NjgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gbGVuKGIpIGJ5dGVzIGludG8gYnl0ZWFycmF5IGIgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICAgIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgICIiIgorCiAgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAwCiAKQEAgLTcwNiw2ICs3MTEsMTcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuZnAuZmlsZW5vKCkKIAogICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBtYXRjaGluZyAqbmFtZSouCisKKyAgICAgICAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoaW5nIGhlYWRlcnMsIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIHNwYWNlcy4KKworICAgICAgICBJZiBubyBtYXRjaGluZyBoZWFkZXIgaXMgZm91bmQsIHJldHVybnMgKmRlZmF1bHQqIG9yIE5vbmUgaWYKKyAgICAgICAgdGhlICpkZWZhdWx0KiBpcyBub3Qgc3BlY2lmaWVkLgorCisgICAgICAgIElmIHRoZSBoZWFkZXJzIGFyZSB1bmtub3duLCByYWlzZXMgaHR0cC5jbGllbnQuUmVzcG9uc2VOb3RSZWFkeS4KKworICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5oZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdFJlYWR5KCkKICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycy5nZXRfYWxsKG5hbWUpIG9yIGRlZmF1bHQKQEAgLTcyOCwxMiArNzQ0LDQ1IEBACiAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZC1zdHlsZSB1cmxsaWIgcmVzcG9uc2VzLgogCiAgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICcnJ1JldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1pbWV0b29scy5NZXNzYWdlIGNvbnRhaW5pbmcKKyAgICAgICAgbWV0YS1pbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVSTC4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgSFRUUCwgdGhlc2UgaGVhZGVycyBhcmUgdGhvc2UgcmV0dXJuZWQgYnkKKyAgICAgICAgdGhlIHNlcnZlciBhdCB0aGUgaGVhZCBvZiB0aGUgcmV0cmlldmVkIEhUTUwgcGFnZSAoaW5jbHVkaW5nCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGFuZCBDb250ZW50LVR5cGUpLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBGVFAsIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpbGwgYmUKKyAgICAgICAgcHJlc2VudCBpZiAoYXMgaXMgbm93IHVzdWFsKSB0aGUgc2VydmVyIHBhc3NlZCBiYWNrIGEgZmlsZQorICAgICAgICBsZW5ndGggaW4gcmVzcG9uc2UgdG8gdGhlIEZUUCByZXRyaWV2YWwgcmVxdWVzdC4gQQorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpZiB0aGUgTUlNRSB0eXBlIGNhbiBiZQorICAgICAgICBndWVzc2VkLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBsb2NhbC1maWxlLCByZXR1cm5lZCBoZWFkZXJzIHdpbGwgaW5jbHVkZQorICAgICAgICBhIERhdGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlJ3MgbGFzdC1tb2RpZmllZCB0aW1lLCBhCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGdpdmluZyBmaWxlIHNpemUsIGFuZCBhIENvbnRlbnQtVHlwZQorICAgICAgICBjb250YWluaW5nIGEgZ3Vlc3MgYXQgdGhlIGZpbGUncyB0eXBlLiBTZWUgYWxzbyB0aGUKKyAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIG1pbWV0b29scyBtb2R1bGUuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKIAogICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgICcnJ1JldHVybiB0aGUgcmVhbCBVUkwgb2YgdGhlIHBhZ2UuCisKKyAgICAgICAgSW4gc29tZSBjYXNlcywgdGhlIEhUVFAgc2VydmVyIHJlZGlyZWN0cyBhIGNsaWVudCB0byBhbm90aGVyCisgICAgICAgIFVSTC4gVGhlIHVybG9wZW4oKSBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgdHJhbnNwYXJlbnRseSwgYnV0IGluCisgICAgICAgIHNvbWUgY2FzZXMgdGhlIGNhbGxlciBuZWVkcyB0byBrbm93IHdoaWNoIFVSTCB0aGUgY2xpZW50IHdhcworICAgICAgICByZWRpcmVjdGVkIHRvLiBUaGUgZ2V0dXJsKCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBhdCB0aGlzCisgICAgICAgIHJlZGlyZWN0ZWQgVVJMLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi51cmwKIAogICAgIGRlZiBnZXRjb2RlKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSByZXNwb25zZSwKKyAgICAgICAgb3IgTm9uZSBpZiB0aGUgVVJMIGlzIG5vdCBhbiBIVFRQIFVSTC4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzCiAKIGNsYXNzIEhUVFBDb25uZWN0aW9uOgpAQCAtNzQ2LDYgKzc5NSw0NCBAQAogICAgIGF1dG9fb3BlbiA9IDEKICAgICBkZWJ1Z2xldmVsID0gMAogCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfdGV4dElPKHN0cmVhbSk6CisgICAgICAgICIiIlRlc3Qgd2hldGhlciBhIGZpbGUtbGlrZSBvYmplY3QgaXMgYSB0ZXh0IG9yIGEgYmluYXJ5IHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHN0cmVhbSwgaW8uVGV4dElPQmFzZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2dldF9jb250ZW50X2xlbmd0aChib2R5LCBtZXRob2QpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGJhc2VkIG9uIHRoZSBib2R5LgorCisgICAgICAgIElmIHRoZSBib2R5IGlzIE5vbmUsIHdlIHNldCBDb250ZW50LUxlbmd0aDogMCBmb3IgbWV0aG9kcyB0aGF0IGV4cGVjdAorICAgICAgICBhIGJvZHkgKFJGQyA3MjMwLCBTZWN0aW9uIDMuMy4yKS4gV2UgYWxzbyBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIGZvcgorICAgICAgICBhbnkgbWV0aG9kIGlmIHRoZSBib2R5IGlzIGEgc3RyIG9yIGJ5dGVzLWxpa2Ugb2JqZWN0IGFuZCBub3QgYSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYm9keSBpcyBOb25lOgorICAgICAgICAgICAgIyBkbyBhbiBleHBsaWNpdCBjaGVjayBmb3Igbm90IE5vbmUgaGVyZSB0byBkaXN0aW5ndWlzaAorICAgICAgICAgICAgIyBiZXR3ZWVuIHVuc2V0IGFuZCBzZXQgYnV0IGVtcHR5CisgICAgICAgICAgICBpZiBtZXRob2QudXBwZXIoKSBpbiBfTUVUSE9EU19FWFBFQ1RJTkdfQk9EWToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIGhhc2F0dHIoYm9keSwgJ3JlYWQnKToKKyAgICAgICAgICAgICMgZmlsZS1saWtlIG9iamVjdC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBkb2VzIGl0IGltcGxlbWVudCB0aGUgYnVmZmVyIHByb3RvY29sIChieXRlcywgYnl0ZWFycmF5LCBhcnJheSk/CisgICAgICAgICAgICBtdiA9IG1lbW9yeXZpZXcoYm9keSkKKyAgICAgICAgICAgIHJldHVybiBtdi5uYnl0ZXMKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBpc2luc3RhbmNlKGJvZHksIHN0cik6CisgICAgICAgICAgICByZXR1cm4gbGVuKGJvZHkpCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lKToKICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dApAQCAtODg0LDE4ICs5NzEsOSBAQAogICAgICAgICBpZiBoYXNhdHRyKGRhdGEsICJyZWFkIikgOgogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKICAgICAgICAgICAgICAgICBwcmludCgic2VuZEluZyBhIHJlYWQoKWFibGUiKQotICAgICAgICAgICAgZW5jb2RlID0gRmFsc2UKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2RlID0gZGF0YS5tb2RlCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBpby5CeXRlc0lPIGFuZCBvdGhlciBmaWxlLWxpa2Ugb2JqZWN0cyBkb24ndCBoYXZlIGEgYG1vZGVgCi0gICAgICAgICAgICAgICAgIyBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiAiYiIgbm90IGluIG1vZGU6Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZSA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJlbmNvZGluZyBmaWxlIHVzaW5nIGlzby04ODU5LTEiKQorICAgICAgICAgICAgZW5jb2RlID0gc2VsZi5faXNfdGV4dElPKGRhdGEpCisgICAgICAgICAgICBpZiBlbmNvZGUgYW5kIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQoImVuY29kaW5nIGZpbGUgdXNpbmcgaXNvLTg4NTktMSIpCiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGRhdGFibG9jayA9IGRhdGEucmVhZChibG9ja3NpemUpCiAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGFibG9jazoKQEAgLTkyMSw3ICs5OTksMjIgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQocykKIAotICAgIGRlZiBfc2VuZF9vdXRwdXQoc2VsZiwgbWVzc2FnZV9ib2R5PU5vbmUpOgorICAgIGRlZiBfcmVhZF9yZWFkYWJsZShzZWxmLCByZWFkYWJsZSk6CisgICAgICAgIGJsb2Nrc2l6ZSA9IDgxOTIKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50KCJzZW5kSW5nIGEgcmVhZCgpYWJsZSIpCisgICAgICAgIGVuY29kZSA9IHNlbGYuX2lzX3RleHRJTyhyZWFkYWJsZSkKKyAgICAgICAgaWYgZW5jb2RlIGFuZCBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQoImVuY29kaW5nIGZpbGUgdXNpbmcgaXNvLTg4NTktMSIpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkYXRhYmxvY2sgPSByZWFkYWJsZS5yZWFkKGJsb2Nrc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhYmxvY2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGVuY29kZToKKyAgICAgICAgICAgICAgICBkYXRhYmxvY2sgPSBkYXRhYmxvY2suZW5jb2RlKCJpc28tODg1OS0xIikKKyAgICAgICAgICAgIHlpZWxkIGRhdGFibG9jaworCisgICAgZGVmIF9zZW5kX291dHB1dChzZWxmLCBtZXNzYWdlX2JvZHk9Tm9uZSwgZW5jb2RlX2NodW5rZWQ9RmFsc2UpOgogICAgICAgICAiIiJTZW5kIHRoZSBjdXJyZW50bHkgYnVmZmVyZWQgcmVxdWVzdCBhbmQgY2xlYXIgdGhlIGJ1ZmZlci4KIAogICAgICAgICBBcHBlbmRzIGFuIGV4dHJhIFxcclxcbiB0byB0aGUgYnVmZmVyLgpAQCAtOTMwLDEwICsxMDIzLDUwIEBACiAgICAgICAgIHNlbGYuX2J1ZmZlci5leHRlbmQoKGIiIiwgYiIiKSkKICAgICAgICAgbXNnID0gYiJcclxuIi5qb2luKHNlbGYuX2J1ZmZlcikKICAgICAgICAgZGVsIHNlbGYuX2J1ZmZlcls6XQotCiAgICAgICAgIHNlbGYuc2VuZChtc2cpCisKICAgICAgICAgaWYgbWVzc2FnZV9ib2R5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5zZW5kKG1lc3NhZ2VfYm9keSkKKworICAgICAgICAgICAgIyBjcmVhdGUgYSBjb25zaXN0ZW50IGludGVyZmFjZSB0byBtZXNzYWdlX2JvZHkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIobWVzc2FnZV9ib2R5LCAncmVhZCcpOgorICAgICAgICAgICAgICAgICMgTGV0IGZpbGUtbGlrZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBieXRlLWxpa2UuICBUaGlzCisgICAgICAgICAgICAgICAgIyBpcyBuZWVkZWQgdG8gYWxsb3cgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgbW1hcCdlZAorICAgICAgICAgICAgICAgICMgZmlsZXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LgorICAgICAgICAgICAgICAgIGNodW5rcyA9IHNlbGYuX3JlYWRfcmVhZGFibGUobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyBzb2xlbHkgdG8gY2hlY2sgdG8gc2VlIGlmIG1lc3NhZ2VfYm9keQorICAgICAgICAgICAgICAgICAgICAjIGltcGxlbWVudHMgdGhlIGJ1ZmZlciBBUEkuICBpdCAvd291bGQvIGJlIGVhc2llcgorICAgICAgICAgICAgICAgICAgICAjIHRvIGNhcHR1cmUgaWYgUHlPYmplY3RfQ2hlY2tCdWZmZXIgd2FzIGV4cG9zZWQKKyAgICAgICAgICAgICAgICAgICAgIyB0byBQeXRob24uCisgICAgICAgICAgICAgICAgICAgIG1lbW9yeXZpZXcobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IGl0ZXIobWVzc2FnZV9ib2R5KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJtZXNzYWdlX2JvZHkgc2hvdWxkIGJlIGEgYnl0ZXMtbGlrZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBvciBhbiBpdGVyYWJsZSwgZ290ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwZShtZXNzYWdlX2JvZHkpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBidWZmZXIgaW50ZXJmYWNlIGFuZAorICAgICAgICAgICAgICAgICAgICAjIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgaW50byBzb2NrZXQgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSAobWVzc2FnZV9ib2R5LCkKKworICAgICAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKKyAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnWmVybyBsZW5ndGggY2h1bmsgaWdub3JlZCcpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGVfY2h1bmtlZCBhbmQgc2VsZi5faHR0cF92c24gPT0gMTE6CisgICAgICAgICAgICAgICAgICAgICMgY2h1bmtlZCBlbmNvZGluZworICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGYne2xlbihjaHVuayk6WH0nJ1xyXG4nLmVuY29kZSgnYXNjaWknKSArIGNodW5rIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYidcclxuJworICAgICAgICAgICAgICAgIHNlbGYuc2VuZChjaHVuaykKKworICAgICAgICAgICAgaWYgZW5jb2RlX2NodW5rZWQgYW5kIHNlbGYuX2h0dHBfdnNuID09IDExOgorICAgICAgICAgICAgICAgICMgZW5kIGNodW5rZWQgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYicwXHJcblxyXG4nKQogCiAgICAgZGVmIHB1dHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIHNraXBfaG9zdD0wLCBza2lwX2FjY2VwdF9lbmNvZGluZz0wKToKICAgICAgICAgIiIiU2VuZCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4KQEAgLTEwODYsNTIgKzEyMTksMjcgQEAKICAgICAgICAgaGVhZGVyID0gaGVhZGVyICsgYic6ICcgKyB2YWx1ZQogICAgICAgICBzZWxmLl9vdXRwdXQoaGVhZGVyKQogCi0gICAgZGVmIGVuZGhlYWRlcnMoc2VsZiwgbWVzc2FnZV9ib2R5PU5vbmUpOgorICAgIGRlZiBlbmRoZWFkZXJzKHNlbGYsIG1lc3NhZ2VfYm9keT1Ob25lLCAqLCBlbmNvZGVfY2h1bmtlZD1GYWxzZSk6CiAgICAgICAgICIiIkluZGljYXRlIHRoYXQgdGhlIGxhc3QgaGVhZGVyIGxpbmUgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmVyLgogCiAgICAgICAgIFRoaXMgbWV0aG9kIHNlbmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuICBUaGUgb3B0aW9uYWwgbWVzc2FnZV9ib2R5CiAgICAgICAgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBtZXNzYWdlIGJvZHkgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAgICByZXF1ZXN0LiAgVGhlIG1lc3NhZ2UgYm9keSB3aWxsIGJlIHNlbnQgaW4gdGhlIHNhbWUgcGFja2V0IGFzIHRoZQotICAgICAgICBtZXNzYWdlIGhlYWRlcnMgaWYgaXQgaXMgYSBzdHJpbmcsIG90aGVyd2lzZSBpdCBpcyBzZW50IGFzIGEgc2VwYXJhdGUKLSAgICAgICAgcGFja2V0LgorICAgICAgICByZXF1ZXN0LgogICAgICAgICAiIiIKICAgICAgICAgaWYgc2VsZi5fX3N0YXRlID09IF9DU19SRVFfU1RBUlRFRDoKICAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19SRVFfU0VOVAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgQ2Fubm90U2VuZEhlYWRlcigpCi0gICAgICAgIHNlbGYuX3NlbmRfb3V0cHV0KG1lc3NhZ2VfYm9keSkKKyAgICAgICAgc2VsZi5fc2VuZF9vdXRwdXQobWVzc2FnZV9ib2R5LCBlbmNvZGVfY2h1bmtlZD1lbmNvZGVfY2h1bmtlZCkKIAotICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9e30pOgorICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9e30sICosCisgICAgICAgICAgICAgICAgZW5jb2RlX2NodW5rZWQ9RmFsc2UpOgogICAgICAgICAiIiJTZW5kIGEgY29tcGxldGUgcmVxdWVzdCB0byB0aGUgc2VydmVyLiIiIgotICAgICAgICBzZWxmLl9zZW5kX3JlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMpCisgICAgICAgIHNlbGYuX3NlbmRfcmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycywgZW5jb2RlX2NodW5rZWQpCiAKLSAgICBkZWYgX3NldF9jb250ZW50X2xlbmd0aChzZWxmLCBib2R5LCBtZXRob2QpOgotICAgICAgICAjIFNldCB0aGUgY29udGVudC1sZW5ndGggYmFzZWQgb24gdGhlIGJvZHkuIElmIHRoZSBib2R5IGlzICJlbXB0eSIsIHdlCi0gICAgICAgICMgc2V0IENvbnRlbnQtTGVuZ3RoOiAwIGZvciBtZXRob2RzIHRoYXQgZXhwZWN0IGEgYm9keSAoUkZDIDcyMzAsCi0gICAgICAgICMgU2VjdGlvbiAzLjMuMikuIElmIHRoZSBib2R5IGlzIHNldCBmb3Igb3RoZXIgbWV0aG9kcywgd2Ugc2V0IHRoZQotICAgICAgICAjIGhlYWRlciBwcm92aWRlZCB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IHRoZSBsZW5ndGggaXMuCi0gICAgICAgIHRoZWxlbiA9IE5vbmUKLSAgICAgICAgbWV0aG9kX2V4cGVjdHNfYm9keSA9IG1ldGhvZC51cHBlcigpIGluIF9NRVRIT0RTX0VYUEVDVElOR19CT0RZCi0gICAgICAgIGlmIGJvZHkgaXMgTm9uZSBhbmQgbWV0aG9kX2V4cGVjdHNfYm9keToKLSAgICAgICAgICAgIHRoZWxlbiA9ICcwJwotICAgICAgICBlbGlmIGJvZHkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGhlbGVuID0gc3RyKGxlbihib2R5KSkKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgZmlsZS1saWtlIG9iamVjdCwgdHJ5IHRvCi0gICAgICAgICAgICAgICAgIyBmc3RhdCBpdHMgZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB0aGVsZW4gPSBzdHIob3MuZnN0YXQoYm9keS5maWxlbm8oKSkuc3Rfc2l6ZSkKLSAgICAgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKLSAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBzZW5kIGEgbGVuZ3RoIGlmIHRoaXMgZmFpbGVkCi0gICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50KCJDYW5ub3Qgc3RhdCEhIikKLQotICAgICAgICBpZiB0aGVsZW4gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCB0aGVsZW4pCi0KLSAgICBkZWYgX3NlbmRfcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycyk6CisgICAgZGVmIF9zZW5kX3JlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMsIGVuY29kZV9jaHVua2VkKToKICAgICAgICAgIyBIb25vciBleHBsaWNpdGx5IHJlcXVlc3RlZCBIb3N0OiBhbmQgQWNjZXB0LUVuY29kaW5nOiBoZWFkZXJzLgotICAgICAgICBoZWFkZXJfbmFtZXMgPSBkaWN0LmZyb21rZXlzKFtrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVyc10pCisgICAgICAgIGhlYWRlcl9uYW1lcyA9IGZyb3plbnNldChrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVycykKICAgICAgICAgc2tpcHMgPSB7fQogICAgICAgICBpZiAnaG9zdCcgaW4gaGVhZGVyX25hbWVzOgogICAgICAgICAgICAgc2tpcHNbJ3NraXBfaG9zdCddID0gMQpAQCAtMTE0MCwxNSArMTI0OCw0MCBAQAogCiAgICAgICAgIHNlbGYucHV0cmVxdWVzdChtZXRob2QsIHVybCwgKipza2lwcykKIAorICAgICAgICAjIGNodW5rZWQgZW5jb2Rpbmcgd2lsbCBoYXBwZW4gaWYgSFRUUC8xLjEgaXMgdXNlZCBhbmQgZWl0aGVyCisgICAgICAgICMgdGhlIGNhbGxlciBwYXNzZXMgZW5jb2RlX2NodW5rZWQ9VHJ1ZSBvciB0aGUgZm9sbG93aW5nCisgICAgICAgICMgY29uZGl0aW9ucyBob2xkOgorICAgICAgICAjIDEuIGNvbnRlbnQtbGVuZ3RoIGhhcyBub3QgYmVlbiBleHBsaWNpdGx5IHNldAorICAgICAgICAjIDIuIHRoZSBib2R5IGlzIGEgZmlsZSBvciBpdGVyYWJsZSwgYnV0IG5vdCBhIHN0ciBvciBieXRlcy1saWtlCisgICAgICAgICMgMy4gVHJhbnNmZXItRW5jb2RpbmcgaGFzIE5PVCBiZWVuIGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIKKwogICAgICAgICBpZiAnY29udGVudC1sZW5ndGgnIG5vdCBpbiBoZWFkZXJfbmFtZXM6Ci0gICAgICAgICAgICBzZWxmLl9zZXRfY29udGVudF9sZW5ndGgoYm9keSwgbWV0aG9kKQorICAgICAgICAgICAgIyBvbmx5IGNodW5rIGJvZHkgaWYgbm90IGV4cGxpY2l0bHkgc2V0IGZvciBiYWNrd2FyZHMKKyAgICAgICAgICAgICMgY29tcGF0aWJpbGl0eSwgYXNzdW1pbmcgdGhlIGNsaWVudCBjb2RlIGlzIGFscmVhZHkgaGFuZGxpbmcgdGhlCisgICAgICAgICAgICAjIGNodW5raW5nCisgICAgICAgICAgICBpZiAndHJhbnNmZXItZW5jb2RpbmcnIG5vdCBpbiBoZWFkZXJfbmFtZXM6CisgICAgICAgICAgICAgICAgIyBpZiBjb250ZW50LWxlbmd0aCBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLCBmYWxsCisgICAgICAgICAgICAgICAgIyBiYWNrIHRvIGNodW5rZWQgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICBlbmNvZGVfY2h1bmtlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGggPSBzZWxmLl9nZXRfY29udGVudF9sZW5ndGgoYm9keSwgbWV0aG9kKQorICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIGJvZHkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdVbmFibGUgdG8gZGV0ZXJtaW5lIHNpemUgb2YgJXInICUgYm9keSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9jaHVua2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJ2NodW5rZWQnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihjb250ZW50X2xlbmd0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVfY2h1bmtlZCA9IEZhbHNlCisKICAgICAgICAgZm9yIGhkciwgdmFsdWUgaW4gaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoaGRyLCB2YWx1ZSkKICAgICAgICAgaWYgaXNpbnN0YW5jZShib2R5LCBzdHIpOgogICAgICAgICAgICAgIyBSRkMgMjYxNiBTZWN0aW9uIDMuNy4xIHNheXMgdGhhdCB0ZXh0IGRlZmF1bHQgaGFzIGEKICAgICAgICAgICAgICMgZGVmYXVsdCBjaGFyc2V0IG9mIGlzby04ODU5LTEuCiAgICAgICAgICAgICBib2R5ID0gX2VuY29kZShib2R5LCAnYm9keScpCi0gICAgICAgIHNlbGYuZW5kaGVhZGVycyhib2R5KQorICAgICAgICBzZWxmLmVuZGhlYWRlcnMoYm9keSwgZW5jb2RlX2NodW5rZWQ9ZW5jb2RlX2NodW5rZWQpCiAKICAgICBkZWYgZ2V0cmVzcG9uc2Uoc2VsZik6CiAgICAgICAgICIiIkdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgpkaWZmIC0tZ2l0IGEvTGliL2h0dHAvc2VydmVyLnB5IGIvTGliL2h0dHAvc2VydmVyLnB5CmluZGV4IDAwNjIwZDEuLmUxMmU0NWIgMTAwNjQ0Ci0tLSBhL0xpYi9odHRwL3NlcnZlci5weQorKysgYi9MaWIvaHR0cC9zZXJ2ZXIucHkKQEAgLTg3LDYgKzg3LDcgQEAKICAgICAiU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyIiwgIkNHSUhUVFBSZXF1ZXN0SGFuZGxlciIsCiBdCiAKK2ltcG9ydCBlbWFpbC51dGlscwogaW1wb3J0IGh0bWwKIGltcG9ydCBodHRwLmNsaWVudAogaW1wb3J0IGlvCkBAIC0xMjYsOSArMTI3LDYgQEAKIAogREVGQVVMVF9FUlJPUl9DT05URU5UX1RZUEUgPSAidGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiCiAKLWRlZiBfcXVvdGVfaHRtbChodG1sKToKLSAgICByZXR1cm4gaHRtbC5yZXBsYWNlKCImIiwgIiZhbXA7IikucmVwbGFjZSgiPCIsICImbHQ7IikucmVwbGFjZSgiPiIsICImZ3Q7IikKLQogY2xhc3MgSFRUUFNlcnZlcihzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKToKIAogICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAxICAgICMgU2VlbXMgdG8gbWFrZSBzZW5zZSBpbiB0ZXN0aW5nIGVudmlyb25tZW50CkBAIC0xMzYsNyArMTM0LDcgQEAKICAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CiAgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKICAgICAgICAgc29ja2V0c2VydmVyLlRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQotICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc2VydmVyX2FkZHJlc3NbOjJdCiAgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBzb2NrZXQuZ2V0ZnFkbihob3N0KQogICAgICAgICBzZWxmLnNlcnZlcl9wb3J0ID0gcG9ydAogCkBAIC0yODIsMTIgKzI4MCw5IEBACiAgICAgICAgIHdvcmRzID0gcmVxdWVzdGxpbmUuc3BsaXQoKQogICAgICAgICBpZiBsZW4od29yZHMpID09IDM6CiAgICAgICAgICAgICBjb21tYW5kLCBwYXRoLCB2ZXJzaW9uID0gd29yZHMKLSAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAotICAgICAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkJBRF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAiQmFkIHJlcXVlc3QgdmVyc2lvbiAoJXIpIiAlIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdmVyc2lvbls6NV0gIT0gJ0hUVFAvJzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICAgICAgIGJhc2VfdmVyc2lvbl9udW1iZXIgPSB2ZXJzaW9uLnNwbGl0KCcvJywgMSlbMV0KICAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlciA9IGJhc2VfdmVyc2lvbl9udW1iZXIuc3BsaXQoIi4iKQogICAgICAgICAgICAgICAgICMgUkZDIDIxNDUgc2VjdGlvbiAzLjEgc2F5cyB0aGVyZSBjYW4gYmUgb25seSBvbmUgIi4iIGFuZApAQCAtMzA5LDcgKzMwNCw3IEBACiAgICAgICAgICAgICBpZiB2ZXJzaW9uX251bWJlciA+PSAoMiwgMCk6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAogICAgICAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIFZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIHZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBlbGlmIGxlbih3b3JkcykgPT0gMjoKICAgICAgICAgICAgIGNvbW1hbmQsIHBhdGggPSB3b3JkcwpAQCAtMzMyLDEwICszMjcsMTEgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gaHR0cC5jbGllbnQucGFyc2VfaGVhZGVycyhzZWxmLnJmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3M9c2VsZi5NZXNzYWdlQ2xhc3MpCi0gICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5MaW5lVG9vTG9uZzoKKyAgICAgICAgZXhjZXB0IGh0dHAuY2xpZW50LkxpbmVUb29Mb25nIGFzIGVycjoKICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKLSAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkJBRF9SRVFVRVNULAotICAgICAgICAgICAgICAgICJMaW5lIHRvbyBsb25nIikKKyAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLlJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UsCisgICAgICAgICAgICAgICAgIkxpbmUgdG9vIGxvbmciLAorICAgICAgICAgICAgICAgIHN0cihlcnIpKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5IVFRQRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKQEAgLTQ2NSw4ICs0NjEsOCBAQAogICAgICAgICAgICAgIyAoc2VlIGJ1ZyAjMTEwMDIwMSkKICAgICAgICAgICAgIGNvbnRlbnQgPSAoc2VsZi5lcnJvcl9tZXNzYWdlX2Zvcm1hdCAlIHsKICAgICAgICAgICAgICAgICAnY29kZSc6IGNvZGUsCi0gICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBfcXVvdGVfaHRtbChtZXNzYWdlKSwKLSAgICAgICAgICAgICAgICAnZXhwbGFpbic6IF9xdW90ZV9odG1sKGV4cGxhaW4pCisgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBodG1sLmVzY2FwZShtZXNzYWdlLCBxdW90ZT1GYWxzZSksCisgICAgICAgICAgICAgICAgJ2V4cGxhaW4nOiBodG1sLmVzY2FwZShleHBsYWluLCBxdW90ZT1GYWxzZSkKICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICBib2R5ID0gY29udGVudC5lbmNvZGUoJ1VURi04JywgJ3JlcGxhY2UnKQogICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgc2VsZi5lcnJvcl9jb250ZW50X3R5cGUpCkBAIC00OTEsMTIgKzQ4NywxMiBAQAogCiAgICAgZGVmIHNlbmRfcmVzcG9uc2Vfb25seShzZWxmLCBjb2RlLCBtZXNzYWdlPU5vbmUpOgogICAgICAgICAiIiJTZW5kIHRoZSByZXNwb25zZSBoZWFkZXIgb25seS4iIiIKLSAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgotICAgICAgICAgICAgaWYgY29kZSBpbiBzZWxmLnJlc3BvbnNlczoKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gc2VsZi5yZXNwb25zZXNbY29kZV1bMF0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICcnCiAgICAgICAgIGlmIHNlbGYucmVxdWVzdF92ZXJzaW9uICE9ICdIVFRQLzAuOSc6CisgICAgICAgICAgICBpZiBtZXNzYWdlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgY29kZSBpbiBzZWxmLnJlc3BvbnNlczoKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNlbGYucmVzcG9uc2VzW2NvZGVdWzBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICcnCiAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX2hlYWRlcnNfYnVmZmVyJyk6CiAgICAgICAgICAgICAgICAgc2VsZi5faGVhZGVyc19idWZmZXIgPSBbXQogICAgICAgICAgICAgc2VsZi5faGVhZGVyc19idWZmZXIuYXBwZW5kKCgiJXMgJWQgJXNcclxuIiAlCkBAIC01ODMsMTIgKzU3OSw3IEBACiAgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGZvcm1hdHRlZCBmb3IgYSBtZXNzYWdlIGhlYWRlci4iIiIKICAgICAgICAgaWYgdGltZXN0YW1wIGlzIE5vbmU6CiAgICAgICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLnRpbWUoKQotICAgICAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB3ZCwgeSwgeiA9IHRpbWUuZ210aW1lKHRpbWVzdGFtcCkKLSAgICAgICAgcyA9ICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCi0gICAgICAgICAgICAgICAgc2VsZi53ZWVrZGF5bmFtZVt3ZF0sCi0gICAgICAgICAgICAgICAgZGF5LCBzZWxmLm1vbnRobmFtZVttb250aF0sIHllYXIsCi0gICAgICAgICAgICAgICAgaGgsIG1tLCBzcykKLSAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgcmV0dXJuIGVtYWlsLnV0aWxzLmZvcm1hdGRhdGUodGltZXN0YW1wLCB1c2VnbXQ9VHJ1ZSkKIAogICAgIGRlZiBsb2dfZGF0ZV90aW1lX3N0cmluZyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgZm9ybWF0dGVkIGZvciBsb2dnaW5nLiIiIgpAQCAtNzI2LDcgKzcxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz0nc3Vycm9nYXRlcGFzcycpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICBkaXNwbGF5cGF0aCA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGgpCi0gICAgICAgIGRpc3BsYXlwYXRoID0gaHRtbC5lc2NhcGUoZGlzcGxheXBhdGgpCisgICAgICAgIGRpc3BsYXlwYXRoID0gaHRtbC5lc2NhcGUoZGlzcGxheXBhdGgsIHF1b3RlPUZhbHNlKQogICAgICAgICBlbmMgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKICAgICAgICAgdGl0bGUgPSAnRGlyZWN0b3J5IGxpc3RpbmcgZm9yICVzJyAlIGRpc3BsYXlwYXRoCiAgICAgICAgIHIuYXBwZW5kKCc8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICcKQEAgLTc1MCw3ICs3NDEsNyBAQAogICAgICAgICAgICAgci5hcHBlbmQoJzxsaT48YSBocmVmPSIlcyI+JXM8L2E+PC9saT4nCiAgICAgICAgICAgICAgICAgICAgICUgKHVybGxpYi5wYXJzZS5xdW90ZShsaW5rbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz0nc3Vycm9nYXRlcGFzcycpLAotICAgICAgICAgICAgICAgICAgICAgICBodG1sLmVzY2FwZShkaXNwbGF5bmFtZSkpKQorICAgICAgICAgICAgICAgICAgICAgICBodG1sLmVzY2FwZShkaXNwbGF5bmFtZSwgcXVvdGU9RmFsc2UpKSkKICAgICAgICAgci5hcHBlbmQoJzwvdWw+XG48aHI+XG48L2JvZHk+XG48L2h0bWw+XG4nKQogICAgICAgICBlbmNvZGVkID0gJ1xuJy5qb2luKHIpLmVuY29kZShlbmMsICdzdXJyb2dhdGVlc2NhcGUnKQogICAgICAgICBmID0gaW8uQnl0ZXNJTygpCkBAIC0xMTkxLDE2ICsxMTgyLDE1IEBACiAgICAgc2VydmVyX2FkZHJlc3MgPSAoYmluZCwgcG9ydCkKIAogICAgIEhhbmRsZXJDbGFzcy5wcm90b2NvbF92ZXJzaW9uID0gcHJvdG9jb2wKLSAgICBodHRwZCA9IFNlcnZlckNsYXNzKHNlcnZlcl9hZGRyZXNzLCBIYW5kbGVyQ2xhc3MpCi0KLSAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCi0gICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKLSAgICB0cnk6Ci0gICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCi0gICAgICAgIGh0dHBkLnNlcnZlcl9jbG9zZSgpCi0gICAgICAgIHN5cy5leGl0KDApCisgICAgd2l0aCBTZXJ2ZXJDbGFzcyhzZXJ2ZXJfYWRkcmVzcywgSGFuZGxlckNsYXNzKSBhcyBodHRwZDoKKyAgICAgICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICBzZXJ2ZV9tZXNzYWdlID0gIlNlcnZpbmcgSFRUUCBvbiB7aG9zdH0gcG9ydCB7cG9ydH0gKGh0dHA6Ly97aG9zdH06e3BvcnR9LykgLi4uIgorICAgICAgICBwcmludChzZXJ2ZV9tZXNzYWdlLmZvcm1hdChob3N0PXNhWzBdLCBwb3J0PXNhWzFdKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weSBiL0xpYi9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJiYTlhLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotZnJvbSB0a2ludGVyIGltcG9ydCAqCi0KLWNsYXNzIE11bHRpU3RhdHVzQmFyKEZyYW1lKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6Ci0gICAgICAgIGlmIG1hc3RlciBpcyBOb25lOgotICAgICAgICAgICAgbWFzdGVyID0gVGsoKQotICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqa3cpCi0gICAgICAgIHNlbGYubGFiZWxzID0ge30KLQotICAgIGRlZiBzZXRfbGFiZWwoc2VsZiwgbmFtZSwgdGV4dD0nJywgc2lkZT1MRUZULCB3aWR0aD0wKToKLSAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5sYWJlbHM6Ci0gICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYsIGJvcmRlcndpZHRoPTAsIGFuY2hvcj1XKQotICAgICAgICAgICAgbGFiZWwucGFjayhzaWRlPXNpZGUsIHBhZHk9MCwgcGFkeD00KQotICAgICAgICAgICAgc2VsZi5sYWJlbHNbbmFtZV0gPSBsYWJlbAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbGFiZWwgPSBzZWxmLmxhYmVsc1tuYW1lXQotICAgICAgICBpZiB3aWR0aCAhPSAwOgotICAgICAgICAgICAgbGFiZWwuY29uZmlnKHdpZHRoPXdpZHRoKQotICAgICAgICBsYWJlbC5jb25maWcodGV4dD10ZXh0KQotCi1kZWYgX211bHRpc3RhdHVzX2JhcihwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIgJSh4LCB5ICsgMTUwKSkKLSAgICByb290LnRpdGxlKCJUZXN0IG11bHRpc3RhdHVzIGJhciIpCi0gICAgZnJhbWUgPSBGcmFtZShyb290KQotICAgIHRleHQgPSBUZXh0KGZyYW1lKQotICAgIHRleHQucGFjaygpCi0gICAgbXNiID0gTXVsdGlTdGF0dXNCYXIoZnJhbWUpCi0gICAgbXNiLnNldF9sYWJlbCgib25lIiwgImhlbGxvIikKLSAgICBtc2Iuc2V0X2xhYmVsKCJ0d28iLCAid29ybGQiKQotICAgIG1zYi5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCi0KLSAgICBkZWYgY2hhbmdlKCk6Ci0gICAgICAgIG1zYi5zZXRfbGFiZWwoIm9uZSIsICJmb28iKQotICAgICAgICBtc2Iuc2V0X2xhYmVsKCJ0d28iLCAiYmFyIikKLQotICAgIGJ1dHRvbiA9IEJ1dHRvbihyb290LCB0ZXh0PSJVcGRhdGUgc3RhdHVzIiwgY29tbWFuZD1jaGFuZ2UpCi0gICAgYnV0dG9uLnBhY2soc2lkZT1CT1RUT00pCi0gICAgZnJhbWUucGFjaygpCi0gICAgZnJhbWUubWFpbmxvb3AoKQotICAgIHJvb3QubWFpbmxvb3AoKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgotICAgIHJ1bihfbXVsdGlzdGF0dXNfYmFyKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCBiN2FiOThmLi45YzczOWM2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSwzNSArMSw4NCBAQAotV2hhdCdzIE5ldyBpbiBJRExFIDMuNS4zPwotPT09PT09PT09PT09PT09PT09PT09PT09PQotKlJlbGVhc2UgZGF0ZTogMjAxNy0wMS0wMT8qCitXaGF0J3MgTmV3IGluIElETEUgMy42LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKypSZWxlYXNlIGRhdGU6IDIwMTYtMDktPz8qCiAKIC0gSXNzdWUgIzI3NzE0OiB0ZXh0X3RleHR2aWV3IGFuZCB0ZXN0X2F1dG9jb21wbGV0ZSBub3cgcGFzcyB3aGVuIHJlLXJ1bgogICBpbiB0aGUgc2FtZSBwcm9jZXNzLiAgVGhpcyBvY2N1cnMgd2hlbiB0ZXN0X2lkbGUgZmFpbHMgd2hlbiBydW4gd2l0aCB0aGUKICAgLXcgb3B0aW9uIGJ1dCB3aXRob3V0IC1qbi4gIEZpeCB3YXJuaW5nIGZyb20gdGVzdF9jb25maWcuCiAKKy0gSXNzdWUgIzI3NjIxOiBQdXQgcXVlcnkgcmVzcG9uc2UgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBpbiB0aGUgcXVlcnkKKyAgYm94IGl0c2VsZiBpbnN0ZWFkIG9mIGluIGEgc2VwYXJhdGUgbWFzc2FnZWJveC4gIFJlZG8gdGVzdHMgdG8gbWF0Y2guCisgIEFkZCBNYWMgT1NYIHJlZmluZW1lbnRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNzYyMDogRXNjYXBlIGtleSBub3cgY2xvc2VzIFF1ZXJ5IGJveCBhcyBjYW5jZWxsZWQuCisKKy0gSXNzdWUgIzI3NjA5OiBJRExFOiB0YWIgYWZ0ZXIgaW5pdGlhbCB3aGl0ZXNwYWNlIHNob3VsZCB0YWIsIG5vdAorICBhdXRvY29tcGxldGUuIFRoaXMgZml4ZXMgcHJvYmxlbSB3aXRoIHdyaXRpbmcgZG9jc3RyaW5ncyBhdCBsZWFzdAorICB0d2ljZSBpbmRlbnRlZC4KKworLSBJc3N1ZSAjMjc2MDk6IEV4cGxpY2l0bHkgcmV0dXJuIE5vbmUgd2hlbiB0aGVyZSBhcmUgYWxzbyBub24tTm9uZQorICByZXR1cm5zLiBJbiBhIGZldyBjYXNlcywgcmV2ZXJzZSBhIGNvbmRpdGlvbiBhbmQgZWxpbWluYXRlIGEgcmV0dXJuLgorCiAtIElzc3VlICMyNTUwNzogSURMRSBubyBsb25nZXIgcnVucyBidWdneSBjb2RlIGJlY2F1c2Ugb2YgaXRzIHRraW50ZXIgaW1wb3J0cy4KICAgVXNlcnMgbXVzdCBpbmNsdWRlIHRoZSBzYW1lIGltcG9ydHMgcmVxdWlyZWQgdG8gcnVuIGRpcmVjdGx5IGluIFB5dGhvbi4KIAorLSBJc3N1ZSAjMjcxNzM6IEFkZCAnSURMRSBNb2Rlcm4gVW5peCcgdG8gdGhlIGJ1aWx0LWluIGtleSBzZXRzLgorICBNYWtlIHRoZSBkZWZhdWx0IGtleSBzZXQgZGVwZW5kIG9uIHRoZSBwbGF0Zm9ybS4KKyAgQWRkIHRlc3RzIGZvciB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlnIG1vZHVsZS4KKwogLSBJc3N1ZSAjMjc0NTI6IGFkZCBsaW5lIGNvdW50ZXIgYW5kIGNyYyB0byBJRExFIGNvbmZpZ0hhbmRsZXIgdGVzdCBkdW1wLgogCistIElzc3VlICMyNzQ3NzogSURMRSBzZWFyY2ggZGlhbG9ncyBub3cgdXNlIHR0ayB3aWRnZXRzLgorCistIElzc3VlICMyNzE3MzogQWRkICdJRExFIE1vZGVybiBVbml4JyB0byB0aGUgYnVpbHQtaW4ga2V5IHNldHMuCisgIE1ha2UgdGhlIGRlZmF1bHQga2V5IHNldCBkZXBlbmQgb24gdGhlIHBsYXRmb3JtLgorICBBZGQgdGVzdHMgZm9yIHRoZSBjaGFuZ2VzIHRvIHRoZSBjb25maWcgbW9kdWxlLgorCistIElzc3VlICMyNzQ1MjogbWFrZSBjb21tYW5kIGxpbmUgImlkbGUtdGVzdD4gcHl0aG9uIHRlc3RfaGVscC5weSIgd29yay4KKyAgX19maWxlX18gaXMgcmVsYXRpdmUgd2hlbiBweXRob24gaXMgc3RhcnRlZCBpbiB0aGUgZmlsZSdzIGRpcmVjdG9yeS4KKworLSBJc3N1ZSAjMjc0NTI6IGFkZCBsaW5lIGNvdW50ZXIgYW5kIGNyYyB0byBJRExFIGNvbmZpZ0hhbmRsZXIgdGVzdCBkdW1wLgorCistIElzc3VlICMyNzM4MDogSURMRTogYWRkIHF1ZXJ5LnB5IHdpdGggYmFzZSBRdWVyeSBkaWFsb2cgYW5kIHR0ayB3aWRnZXRzLgorICBNb2R1bGUgaGFkIHN1YmNsYXNzZXMgU2VjdGlvbk5hbWUsIE1vZHVsZU5hbWUsIGFuZCBIZWxwU291cmNlLCB3aGljaCBhcmUKKyAgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB1c2VycyBieSBjb25maWdkaWFsb2cgYW5kIGZpbGUgPT5Mb2FkIE1vZHVsZS4KKyAgRWFjaCBzdWJjbGFzcyBoYXMgaXR3IG93biB2YWxpZGl0eSBjaGVja3MuICBVc2luZyBNb2R1bGVOYW1lIGFsbG93cyB1c2VycworICB0byBlZGl0IGJhZCBtb2R1bGUgbmFtZXMgaW5zdGVhZCBvZiBzdGFydGluZyBvdmVyLgorICBBZGQgdGVzdHMgYW5kIGRlbGV0ZSB0aGUgdHdvIGZpbGVzIGNvbWJpbmVkIGludG8gdGhlIG5ldyBvbmUuCisKKy0gSXNzdWUgIzI3MzcyOiBUZXN0X2lkbGUgbm8gbG9uZ2VyIGNoYW5nZXMgdGhlIGxvY2FsZS4KKwogLSBJc3N1ZSAjMjczNjU6IEFsbG93IG5vbi1hc2NpaSBjaGFycyBpbiBJRExFIE5FV1MudHh0LCBmb3IgY29udHJpYnV0b3IgbmFtZXMuCiAKIC0gSXNzdWUgIzI3MjQ1OiBJRExFOiBDbGVhbmx5IGRlbGV0ZSBjdXN0b20gdGhlbWVzIGFuZCBrZXkgYmluZGluZ3MuCiAgIFByZXZpb3VzbHksIHdoZW4gSURMRSB3YXMgc3RhcnRlZCBmcm9tIGEgY29uc29sZSBvciBieSBpbXBvcnQsIGEgY2FzY2FkZQogICBvZiB3YXJuaW5ncyB3YXMgZW1pdHRlZC4gIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCiAKKy0gSXNzdWUgIzI0MTM3OiBSdW4gSURMRSwgdGVzdF9pZGxlLCBhbmQgaHRlc3Qgd2l0aCB0a2ludGVyIGRlZmF1bHQgcm9vdCBkaXNhYmxlZC4KKyAgRml4IGNvZGUgYW5kIHRlc3RzIHRoYXQgZmFpbCB3aXRoIHRoaXMgcmVzdHJpY3Rpb24uCisgIEZpeCBodGVzdHMgdG8gbm90IGNyZWF0ZSBhIHNlY29uZCBhbmQgcmVkdW5kYW50IHJvb3QgYW5kIG1haW5sb29wLgogCi1XaGF0J3MgTmV3IGluIElETEUgMy41LjI/Ci09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qUmVsZWFzZSBkYXRlOiAyMDE2LTA2LTI2KgorLSBJc3N1ZSAjMjczMTA6IEZpeCBJRExFLmFwcCBmYWlsdXJlIHRvIGxhdW5jaCBvbiBPUyBYIGR1ZSB0byB2ZXN0aWdpYWwgaW1wb3J0LgogCiAtIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgogICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKICAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KIAorLSBJc3N1ZSAjMjQ3NTA6IFN3aXRjaCBhbGwgc2Nyb2xsYmFycyBpbiBJRExFIHRvIHR0ayB2ZXJzaW9ucy4KKyAgV2hlcmUgbmVlZGVkLCBtaW5pbWFsIHRlc3RzIGFyZSBhZGRlZCB0byBjb3ZlciBjaGFuZ2VzLgorCistIElzc3VlICMyNDc1OTogSURMRSByZXF1aXJlcyB0ayA4LjUgYW5kIGF2YWlsYWJpbGl0eSB0dGsgd2lkZ2V0cy4KKyAgRGVsZXRlIG5vdyB1bm5lZWRlZCB0ayB2ZXJzaW9uIHRlc3RzIGFuZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucy4KKyAgQWRkIHRlc3QgZm9yIElETEUgc3ludGF4IGNvbG9yaXplci4KKworLSBJc3N1ZSAjMjcyMzk6IGlkbGVsaWIubWFjb3N4LmlzWHl6VGsgZnVuY3Rpb25zIGluaXRpYWxpemUgYXMgbmVlZGVkLgorCistIElzc3VlICMyNzI2MjogbW92ZSBBcXVhIHVuYmluZGluZyBjb2RlLCB3aGljaCBlbmFibGUgY29udGV4dCBtZW51cywgdG8gbWF4b3N4LgorCiAtIElzc3VlICMyNDc1OTogTWFrZSBjbGVhciBpbiBpZGxlbGliLmlkbGVfdGVzdC5fX2luaXRfXyB0aGF0IHRoZSBkaXJlY3RvcnkKICAgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRlc3QudGVzdF9pZGxlIGFuZCB0b29sIGZvciBtYWludGFpbmVycy4KIAotLSBJc3N1ZSAjMjcxOTY6IFN0b3AgJ1RoZW1lQ2hhbmdlZicgd2FybmluZ3Mgd2hlbiBydW5uaW5nIElETEUgdGVzdHMuCistIElzc3VlICMyNzE5NjogU3RvcCAnVGhlbWVDaGFuZ2VkJyB3YXJuaW5ncyB3aGVuIHJ1bm5pbmcgSURMRSB0ZXN0cy4KICAgVGhlc2UgcGVyc2lzdGVkIGFmdGVyIG90aGVyIHdhcm5pbmdzIHdlcmUgc3VwcHJlc3NlZCBpbiAjMjA1NjcuCiAgIEFwcGx5IFNlcmhpeSBTdG9yY2hha2EncyB1cGRhdGVfaWRsZXRhc2tzIHNvbHV0aW9uIHRvIGZvdXIgdGVzdCBmaWxlcy4KICAgUmVjb3JkIHRoaXMgYWRkaXRpb25hbCBhZHZpY2UgaW4gaWRsZV90ZXN0L1JFQURNRS50eHQKQEAgLTM3LDkgKzg2LDI2IEBACiAtIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCiAgIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCiAKKy0gSXNzdWUgIyAyNDIyNTogVXBkYXRlIGlkbGVsaWIvUkVBRE1FLnR4dCB3aXRoIG5ldyBmaWxlIG5hbWVzCisgIGFuZCBldmVudCBoYW5kbGVycy4KKworLSBJc3N1ZSAjMjcxNTY6IFJlbW92ZSBvYnNvbGV0ZSBjb2RlIG5vdCB1c2VkIGJ5IElETEUuICBSZXBsYWNlbWVudHM6CisgIDEuIGhlbHAudHh0LCByZXBsYWNlZCBieSBoZWxwLmh0bWwsIGlzIG91dC1vZi1kYXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuCisgIEl0cyBkZWRpY2F0ZWQgdmlld2VyIGhhcyBiZSByZXBsYWNlZCBieSB0aGUgaHRtbCB2aWV3ZXIgaW4gaGVscC5weS4KKyAgMi4gJ2ltcG9ydCBpZGxldmVyOyBJID0gaWRsZXZlci5JRExFX1ZFUlNJT04nIGlzIHRoZSBzYW1lIGFzCisgICdpbXBvcnQgc3lzOyBJID0gdmVyc2lvbls6dmVyc2lvbi5pbmRleCgnICcpXScKKyAgMy4gQWZ0ZXIgJ29iID0gc3RhY2t2aWV3ZXIuVmFyaWFibGVzVHJlZUl0ZW0oKmFyZ3MpJywKKyAgJ29iLmtleXMoKScgPT0gJ2xpc3Qob2Iub2JqZWN0LmtleXMpLgorICA0LiBJbiBtYWNvc2MsIHJ1bm5pbmdBc09TWEFQUCA9PSBpc0FxdWFUazsgaWRDYXJib25BcXVhVGsgPT0gaXNDYXJib25UaworCiAtIElzc3VlICMyNzExNzogTWFrZSBjb2xvcml6ZXIgaHRlc3QgYW5kIHR1cnRsZWRlbW8gd29yayB3aXRoIGRhcmsgdGhlbWVzLgogICBNb3ZlIGNvZGUgZm9yIGNvbmZpZ3VyaW5nIHRleHQgd2lkZ2V0IGNvbG9ycyB0byBhIG5ldyBmdW5jdGlvbi4KIAorLSBJc3N1ZSAjMjQyMjU6IFJlbmFtZSBtYW55IGlkbGVsaWIvKi5weSBhbmQgaWRsZV90ZXN0L3Rlc3RfKi5weSBmaWxlcy4KKyAgRWRpdCBmaWxlcyB0byByZXBsYWNlIG9sZCBuYW1lcyB3aXRoIG5ldyBuYW1lcyB3aGVuIHRoZSBvbGQgbmFtZQorICByZWZlcnJlZCB0byB0aGUgbW9kdWxlIHJhdGhlciB0aGFuIHRoZSBjbGFzcyBpdCBjb250YWluZWQuCisgIFNlZSB0aGUgaXNzdWUgYW5kIElETEUgc2VjdGlvbiBpbiBXaGF0J3MgTmV3IGluIDMuNiBmb3IgbW9yZS4KKwogLSBJc3N1ZSAjMjY2NzM6IFdoZW4gdGsgcmVwb3J0cyBmb250IHNpemUgYXMgMCwgY2hhbmdlIHRvIHNpemUgMTAuCiAgIFN1Y2ggZm9udHMgb24gTGludXggcHJldmVudGVkIHRoZSBjb25maWd1cmF0aW9uIGRpYWxvZyBmcm9tIG9wZW5pbmcuCiAKQEAgLTUyLDggKzExOCw4IEBACiAtIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgogICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KIAotLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciB1bmRvIGRlbGVnYXRvci4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyIC4KKy0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgdW5kbyBkZWxlZ2F0b3IuICBQYXRjaCBtb3N0bHkgYnkKKyAgU2FpbWFkaGF2IEhlYmxpa2FyIC4KIAogLSBJc3N1ZSAjMjcwNDQ6IEFkZCBDb25maWdEaWFsb2cucmVtb3ZlX3Zhcl9jYWxsYmFja3MgdG8gc3RvcCBtZW1vcnkgbGVha3MuCiAKQEAgLTcyLDExICsxMzgsNiBAQAogICBNQVJLIGluIFJFQURNRS50eHQgYW5kIG9wZW4gdGhpcyBhbmQgTkVXUy50eHQgd2l0aCAnYXNjaWknLgogICBSZS1lbmNvZGUgQ1JFRElUUy50eHQgdG8gdXRmLTggYW5kIG9wZW4gaXQgd2l0aCAndXRmLTgnLgogCi0KLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTUtMTItMDYqCi0KIC0gSXNzdWUgMTUzNDg6IFN0b3AgdGhlIGRlYnVnZ2VyIGVuZ2luZSAobm9ybWFsbHkgaW4gYSB1c2VyIHByb2Nlc3MpCiAgIGJlZm9yZSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aW5kb3cgKHJ1bm5pbmcgaW4gdGhlIElETEUgcHJvY2VzcykuCiAgIFRoaXMgcHJldmVudHMgdGhlIFJ1bnRpbWVFcnJvcnMgdGhhdCB3ZXJlIGJlaW5nIGNhdWdodCBhbmQgaWdub3JlZC4KQEAgLTM1NCw2ICs0MTUsMTEgQEAKIC0gVXNlIG9mICdmaWx0ZXInIGluIGtleWJpbmRpbmdEaWFsb2cucHkgd2FzIGNhdXNpbmcgY3VzdG9tIGtleSBhc3NpZ25tZW50IHRvCiAgIGZhaWwuICBQYXRjaCA1NzA3IGFtYXVyeS5mb3JnZW90ZGFyYy4KIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4xYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwNy1NYXItMDkqCisKIC0gSXNzdWUgIzQ4MTU6IE9mZmVyIGNvbnZlcnNpb24gdG8gVVRGLTggaWYgc291cmNlIGZpbGVzIGhhdmUKICAgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gYW5kIGFyZSBub3QgZW5jb2RlZCBpbiBVVEYtOC4KIApAQCAtMzkzLDYgKzQ1OSwxMSBAQAogCiAtIElzc3VlICMzNTQ5OiBPbiBNYWNPUyB0aGUgcHJlZmVyZW5jZXMgbWVudSB3YXMgbm90IHByZXNlbnQKIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4wPworPT09PT09PT09PT09PT09PT09PT09PT0KKypSZWxlYXNlIGRhdGU6IDAzLURlYy0yMDA4KgorCiAtIElETEUgd291bGQgcHJpbnQgYSAiVW5oYW5kbGVkIHNlcnZlciBleGNlcHRpb24hIiBtZXNzYWdlIHdoZW4gaW50ZXJuYWwKICAgZGVidWdnaW5nIGlzIGVuYWJsZWQuCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JFQURNRS50eHQgYi9MaWIvaWRsZWxpYi9SRUFETUUudHh0CmluZGV4IDdiZjc0YzAuLmE4NzljMTcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JFQURNRS50eHQKKysrIGIvTGliL2lkbGVsaWIvUkVBRE1FLnR4dApAQCAtMjksNjEgKzI5LDYxIEBACiAKIEltcGxlbWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tLQotQXV0b0NvbXBsZXRlLnB5ICAgIyBDb21wbGV0ZSBhdHRyaWJ1dGUgbmFtZXMgb3IgZmlsZW5hbWVzLgotQXV0b0NvbXBsZXRlV2luZG93LnB5ICAjIERpc3BsYXkgY29tcGxldGlvbnMuCi1BdXRvRXhwYW5kLnB5ICAgICAjIEV4cGFuZCB3b3JkIHdpdGggcHJldmlvdXMgd29yZCBpbiBmaWxlLgotQmluZGluZ3MucHkgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBJRExFIG1lbnUuCi1DYWxsVGlwV2luZG93LnB5ICAjIERpc3BsYXkgY2FsbHRpcC4KLUNhbGxUaXBzLnB5ICAgICAgICMgQ3JlYXRlIGNhbGx0aXAgdGV4dC4KLUNsYXNzQnJvd3Nlci5weSAgICMgQ3JlYXRlIG1vZHVsZSBicm93c2VyIHdpbmRvdy4KLUNvZGVDb250ZXh0LnB5ICAgICMgU2hvdyBjb21wb3VuZCBzdGF0ZW1lbnQgaGVhZGVycyBvdGhlcndpc2Ugbm90IHZpc2libGUuCi1Db2xvckRlbGVnYXRvci5weSAjIENvbG9yaXplIHRleHQgKG5pbSkuCi1EZWJ1Z2dlci5weSAgICAgICAjIERlYnVnIGNvZGUgcnVuIGZyb20gZWRpdG9yOyBzaG93IHdpbmRvdy4KLURlbGVnYXRvci5weSAgICAgICMgRGVmaW5lIGJhc2UgY2xhc3MgZm9yIGRlbGVnYXRvcnMgKG5pbSkuCi1FZGl0b3JXaW5kb3cucHkgICAjIERlZmluZSBtb3N0IG9mIGVkaXRvciBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCi1GaWxlTGlzdC5weSAgICAgICAjIE9wZW4gZmlsZXMgYW5kIG1hbmFnZSBsaXN0IG9mIG9wZW4gd2luZG93cyAobmltKS4KLUZvcm1hdFBhcmFncmFwaC5weSMgUmUtd3JhcCBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgY29tbWVudHMuCi1HcmVwRGlhbG9nLnB5ICAgICAjIEZpbmQgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gaW4gbXVsdGlwbGUgZmlsZXMuCi1IeXBlclBhcnNlci5weSAgICAjIFBhcnNlIGNvZGUgYXJvdW5kIGEgZ2l2ZW4gaW5kZXguCi1JT0JpbmRpbmcucHkgICAgICAjIE9wZW4sIHJlYWQsIGFuZCB3cml0ZSBmaWxlcwotSWRsZUhpc3RvcnkucHkgICAgIyBHZXQgcHJldmlvdXMgb3IgbmV4dCB1c2VyIGlucHV0IGluIHNoZWxsIChuaW0pCi1NdWx0aUNhbGwucHkgICAgICAjIFdyYXAgdGsgd2lkZ2V0IHRvIGFsbG93IG11bHRpcGxlIGNhbGxzIHBlciBldmVudCAobmltKS4KLU11bHRpU3RhdHVzQmFyLnB5ICMgRGVmaW5lIHN0YXR1cyBiYXIgZm9yIHdpbmRvd3MgKG5pbSkuCi1PYmplY3RCcm93c2VyLnB5ICAjIERlZmluZSBjbGFzcyB1c2VkIGluIFN0YWNrVmlld2VyIChuaW0pLgotT3V0cHV0V2luZG93LnB5ICAgIyBDcmVhdGUgd2luZG93IGZvciBncmVwIG91dHB1dC4KLVBhcmVuTWF0Y2gucHkgICAgICMgTWF0Y2ggZmVuY2Vwb3N0czogKCksIFtdLCBhbmQge30uCi1QYXRoQnJvd3Nlci5weSAgICAjIENyZWF0ZSBwYXRoIGJyb3dzZXIgd2luZG93LgotUGVyY29sYXRvci5weSAgICAgIyBNYW5hZ2UgZGVsZWdhdG9yIHN0YWNrIChuaW0pLgotUHlQYXJzZS5weSAgICAgICAgIyBHaXZlIGluZm9ybWF0aW9uIG9uIGNvZGUgaW5kZW50YXRpb24KLVB5U2hlbGwucHkgICAgICAgICMgU3RhcnQgSURMRSwgbWFuYWdlIHNoZWxsLCBjb21wbGV0ZSBlZGl0b3Igd2luZG93Ci1SZW1vdGVEZWJ1Z2dlci5weSAjIERlYnVnIGNvZGUgcnVuIGluIHJlbW90ZSBwcm9jZXNzLgotUmVtb3RlT2JqZWN0QnJvd3Nlci5weSAjIENvbW11bmljYXRlIG9iamVjdHMgYmV0d2VlbiBwcm9jZXNzZXMgd2l0aCBycGMgKG5pbSkuCi1SZXBsYWNlRGlhbG9nLnB5ICAjIFNlYXJjaCBhbmQgcmVwbGFjZSBwYXR0ZXJuIGluIHRleHQuCi1Sc3RyaXBFeHRlbnNpb24ucHkjIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UKLVNjcmlwdEJpbmRpbmcucHkgICMgQ2hlY2sgYW5kIHJ1biB1c2VyIGNvZGUuCi1TY3JvbGxlZExpc3QucHkgICAjIERlZmluZSBTY3JvbGxlZExpc3Qgd2lkZ2V0IGZvciBJRExFIChuaW0pLgotU2VhcmNoRGlhbG9nLnB5ICAgIyBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gdGV4dC4KLVNlYXJjaERpYWxvZ0Jhc2UucHkgICMgRGVmaW5lIGJhc2UgZm9yIHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXAgZGlhbG9ncy4KLVNlYXJjaEVuZ2luZS5weSAgICMgRGVmaW5lIGVuZ2luZSBmb3IgYWxsIDMgc2VhcmNoIGRpYWxvZ3MuCi1TdGFja1ZpZXdlci5weSAgICAjIFZpZXcgc3RhY2sgYWZ0ZXIgZXhjZXB0aW9uLgotVHJlZVdpZGdldC5weSAgICAgIyBEZWZpbmUgdHJlZSB3aWRnZXIsIHVzZWQgaW4gYnJvd3NlcnMgKG5pbSkuCi1VbmRvRGVsZWdhdG9yLnB5ICAjIE1hbmFnZSB1bmRvIHN0YWNrLgotV2lkZ2V0UmVkaXJlY3Rvci5weSAjIEludGVyY2VwdCB3aWRnZXQgc3ViY29tbWFuZHMgKGZvciBwZXJjb2xhdG9yKSAobmltKS4KLVdpbmRvd0xpc3QucHkgICAgICMgTWFuYWdlIHdpbmRvdyBsaXN0IGFuZCBkZWZpbmUgbGlzdGVkIHRvcCBsZXZlbC4KLVpvb21IZWlnaHQucHkgICAgICMgWm9vbSB3aW5kb3cgdG8gZnVsbCBoZWlnaHQgb2Ygc2NyZWVuLgotYWJvdXREaWFsb2cucHkgICAgIyBEaXNwbGF5IEFib3V0IElETEUgZGlhbG9nLgotY29uZmlnRGlhbG9nLnB5ICAgIyBEaXNwbGF5IHVzZXIgY29uZmlndXJhdGlvbiBkaWFsb2dzLgotY29uZmlnSGFuZGxlci5weSAgIyBMb2FkLCBmZXRjaCwgYW5kIHNhdmUgY29uZmlndXJhdGlvbiAobmltKS4KLWNvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5ICAjIFNwZWNpZnkgaGVscCBzb3VyY2UuCi1jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAgIyBTcGVmaWZ5IHVzZXIgY29uZmlnIHNlY3Rpb24gbmFtZQotZHluT3B0aW9uTWVudVdpZGdldC5weSAgIyBkZWZpbmUgbXV0YWJsZSBPcHRpb25NZW51IHdpZGdldCAobmltKS4KK2F1dG9jb21wbGV0ZS5weSAgICMgQ29tcGxldGUgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGVuYW1lcy4KK2F1dG9jb21wbGV0ZV93LnB5ICMgRGlzcGxheSBjb21wbGV0aW9ucy4KK2F1dG9leHBhbmQucHkgICAgICMgRXhwYW5kIHdvcmQgd2l0aCBwcmV2aW91cyB3b3JkIGluIGZpbGUuCiticm93c2VyLnB5ICAgICAgICAjIENyZWF0ZSBtb2R1bGUgYnJvd3NlciB3aW5kb3cuCitjYWxsdGlwX3cucHkgICAgICAjIERpc3BsYXkgY2FsbHRpcC4KK2NhbGx0aXBzLnB5ICAgICAgICMgQ3JlYXRlIGNhbGx0aXAgdGV4dC4KK2NvZGVjb250ZXh0LnB5ICAgICMgU2hvdyBjb21wb3VuZCBzdGF0ZW1lbnQgaGVhZGVycyBvdGhlcndpc2Ugbm90IHZpc2libGUuCitjb2xvcml6ZXIucHkgICAgICAjIENvbG9yaXplIHRleHQgKG5pbSkKK2NvbmZpZy5weSAgICAgICAgICMgTG9hZCwgZmV0Y2gsIGFuZCBzYXZlIGNvbmZpZ3VyYXRpb24gKG5pbSkuCitjb25maWdkaWFsb2cucHkgICAjIERpc3BsYXkgdXNlciBjb25maWd1cmF0aW9uIGRpYWxvZ3MuCitjb25maWdfaGVscC5weSAgICAjIFNwZWNpZnkgaGVscCBzb3VyY2UgaW4gY29uZmlnZGlhbG9nLgorY29uZmlnX2tleS5weSAgICAgIyBDaGFuZ2Uga2V5YmluZGluZ3MuCitkeW5vcHRpb24ucHkgICAgICAjIERlZmluZSBtdXRhYmxlIE9wdGlvbk1lbnUgd2lkZ2V0IChuaW0pLgorZGVidWdvYmoucHkgICAgICAgIyBEZWZpbmUgY2xhc3MgdXNlZCBpbiBzdGFja3ZpZXdlci4KK2RlYnVnb2JqX3IucHkgICAgICMgQ29tbXVuaWNhdGUgb2JqZWN0cyBiZXR3ZWVuIHByb2Nlc3NlcyB3aXRoIHJwYyAobmltKS4KK2RlYnVnZ2VyLnB5ICAgICAgICMgRGVidWcgY29kZSBydW4gZnJvbSBzaGVsbCBvciBlZGl0b3I7IHNob3cgd2luZG93LgorZGVidWdnZXJfci5weSAgICAgIyBEZWJ1ZyBjb2RlIHJ1biBpbiByZW1vdGUgcHJvY2Vzcy4KK2RlbGVnYXRvci5weSAgICAgICMgRGVmaW5lIGJhc2UgY2xhc3MgZm9yIGRlbGVnYXRvcnMgKG5pbSkuCitlZGl0b3IucHkgICAgICAgICAjIERlZmluZSBtb3N0IG9mIGVkaXRvciBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCitmaWxlbGlzdC5weSAgICAgICAjIE9wZW4gZmlsZXMgYW5kIG1hbmFnZSBsaXN0IG9mIG9wZW4gd2luZG93cyAobmltKS4KK2dyZXAucHkgICAgICAgICAgICMgRmluZCBhbGwgb2NjdXJyZW5jZXMgb2YgcGF0dGVybiBpbiBtdWx0aXBsZSBmaWxlcy4KIGhlbHAucHkgICAgICAgICAgICMgRGlzcGxheSBJRExFJ3MgaHRtbCBkb2MuCi1rZXliaW5kaW5nRGlhbG9nLnB5ICAjIENoYW5nZSBrZXliaW5kaW5ncy4KLW1hY29zeFN1cHBvcnQucHkgICMgSGVscCBJRExFIHJ1biBvbiBNYWNzIChuaW0pLgoraGVscF9hYm91dC5weSAgICAgIyBEaXNwbGF5IEFib3V0IElETEUgZGlhbG9nLgoraGlzdG9yeS5weSAgICAgICAgIyBHZXQgcHJldmlvdXMgb3IgbmV4dCB1c2VyIGlucHV0IGluIHNoZWxsIChuaW0pCitoeXBlcnBhcnNlci5weSAgICAjIFBhcnNlIGNvZGUgYXJvdW5kIGEgZ2l2ZW4gaW5kZXguCitpb21lbnUucHkgICAgICAgICAjIE9wZW4sIHJlYWQsIGFuZCB3cml0ZSBmaWxlcworbWFjb3N4LnB5ICAgICAgICAgIyBIZWxwIElETEUgcnVuIG9uIE1hY3MgKG5pbSkuCittYWlubWVudS5weSAgICAgICAjIERlZmluZSBtb3N0IG9mIElETEUgbWVudS4KK211bHRpY2FsbC5weSAgICAgICMgV3JhcCB0ayB3aWRnZXQgdG8gYWxsb3cgbXVsdGlwbGUgY2FsbHMgcGVyIGV2ZW50IChuaW0pLgorb3V0d2luLnB5ICAgICAgICAgIyBDcmVhdGUgd2luZG93IGZvciBncmVwIG91dHB1dC4KK3BhcmFncmFwaC5weSAgICAgICMgUmUtd3JhcCBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgY29tbWVudHMuCitwYXJlbm1hdGNoLnB5ICAgICAjIE1hdGNoIGZlbmNlcG9zdHM6ICgpLCBbXSwgYW5kIHt9LgorcGF0aGJyb3dzZXIucHkgICAgIyBDcmVhdGUgcGF0aCBicm93c2VyIHdpbmRvdy4KK3BlcmNvbGF0b3IucHkgICAgICMgTWFuYWdlIGRlbGVnYXRvciBzdGFjayAobmltKS4KK3B5cGFyc2UucHkgICAgICAgICMgR2l2ZSBpbmZvcm1hdGlvbiBvbiBjb2RlIGluZGVudGF0aW9uCitweXNoZWxsLnB5ICAgICAgICAjIFN0YXJ0IElETEUsIG1hbmFnZSBzaGVsbCwgY29tcGxldGUgZWRpdG9yIHdpbmRvdworcXVlcnkucHkgICAgICAgICAgIyBRdWVyeSB1c2VyIGZvciBpbmZvcm1hdGlvbgorcmVkaXJlY3Rvci5weSAgICAgIyBJbnRlcmNlcHQgd2lkZ2V0IHN1YmNvbW1hbmRzIChmb3IgcGVyY29sYXRvcikgKG5pbSkuCityZXBsYWNlLnB5ICAgICAgICAjIFNlYXJjaCBhbmQgcmVwbGFjZSBwYXR0ZXJuIGluIHRleHQuCiBycGMucHkgICAgICAgICAgICAjIENvbW11aWNhdGUgYmV0d2VlbiBpZGxlIGFuZCB1c2VyIHByb2Nlc3NlcyAobmltKS4KK3JzdHJpcC5weSAgICAgICAgICMgU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4KIHJ1bi5weSAgICAgICAgICAgICMgTWFuYWdlIHVzZXIgY29kZSBleGVjdXRpb24gc3VicHJvY2Vzcy4KK3J1bnNjcmlwdC5weSAgICAgICMgQ2hlY2sgYW5kIHJ1biB1c2VyIGNvZGUuCitzY3JvbGxlZGxpc3QucHkgICAjIERlZmluZSBzY3JvbGxlZGxpc3Qgd2lkZ2V0IGZvciBJRExFIChuaW0pLgorc2VhcmNoLnB5ICAgICAgICAgIyBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gdGV4dC4KK3NlYXJjaGJhc2UucHkgICAgICMgRGVmaW5lIGJhc2UgZm9yIHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXAgZGlhbG9ncy4KK3NlYXJjaGVuZ2luZS5weSAgICMgRGVmaW5lIGVuZ2luZSBmb3IgYWxsIDMgc2VhcmNoIGRpYWxvZ3MuCitzdGFja3ZpZXdlci5weSAgICAjIFZpZXcgc3RhY2sgYWZ0ZXIgZXhjZXB0aW9uLgorc3RhdHVzYmFyLnB5ICAgICAgIyBEZWZpbmUgc3RhdHVzIGJhciBmb3Igd2luZG93cyAobmltKS4KIHRhYmJlZHBhZ2VzLnB5ICAgICMgRGVmaW5lIHRhYmJlZCBwYWdlcyB3aWRnZXQgKG5pbSkuCi10ZXh0Vmlldy5weSAgICAgICAjIERlZmluZSByZWFkLW9ubHkgdGV4dCB3aWRnZXQgKG5pbSkuCit0ZXh0dmlldy5weSAgICAgICAjIERlZmluZSByZWFkLW9ubHkgdGV4dCB3aWRnZXQgKG5pbSkuCit0cmVlLnB5ICAgICAgICAgICAjIERlZmluZSB0cmVlIHdpZGdlciwgdXNlZCBpbiBicm93c2VycyAobmltKS4KK3VuZG8ucHkgICAgICAgICAgICMgTWFuYWdlIHVuZG8gc3RhY2suCit3aW5kb3dzLnB5ICAgICAgICAjIE1hbmFnZSB3aW5kb3cgbGlzdCBhbmQgZGVmaW5lIGxpc3RlZCB0b3AgbGV2ZWwuCit6b29taGVpZ2h0LnB5ICAgICAjIFpvb20gd2luZG93IHRvIGZ1bGwgaGVpZ2h0IG9mIHNjcmVlbi4KIAogQ29uZmlndXJhdGlvbgogLS0tLS0tLS0tLS0tLQpAQCAtMTA0LDEyNiArMTA0LDE0NyBAQAogCiBTdWJkaXJlY3RvcmllcwogLS0tLS0tLS0tLS0tLS0KLUljb25zICAjIHNtYWxsIGltYWdlIGZpbGVzCi1pZGxlX3Rlc3QgICMgZmlsZXMgZm9yIGh1bWFuIHRlc3QgYW5kIGF1dG9tYXRlZCB1bml0IHRlc3RzCitJY29ucyAgICAgICAgIyBzbWFsbCBpbWFnZSBmaWxlcworaWRsZV90ZXN0ICAgICMgZmlsZXMgZm9yIGh1bWFuIHRlc3QgYW5kIGF1dG9tYXRlZCB1bml0IHRlc3RzCiAKIFVudXNlZCBhbmQgRGVwcmVjYXRlZCBmaWxlcyBhbmQgb2JqZWN0cyAobmltKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FZGl0b3JXaW5kb3cucHk6IEhlbHBkaWFsb2cgYW5kIGhlbHBEaWFsb2cKLVRvb2xUaXAucHk6IHVudXNlZC4KLWhlbHAudHh0Ci1pZGxldmVyLnB5Cit0b29sdGlwLnB5ICMgdW51c2VkCisKIAogCiBJRExFIE1FTlVTCi1Ub3AgbGV2ZWwgaXRlbXMgYW5kIG1vc3Qgc3VibWVudSBpdGVtcyBhcmUgZGVmaW5lZCBpbiBCaW5kaW5ncy4KK1RvcCBsZXZlbCBpdGVtcyBhbmQgbW9zdCBzdWJtZW51IGl0ZW1zIGFyZSBkZWZpbmVkIGluIG1haW5tZW51LgogRXh0ZW5zdGlvbnMgYWRkIHN1Ym1lbnUgaXRlbXMgd2hlbiBhY3RpdmUuICBUaGUgbmFtZXMgZ2l2ZW4gYXJlCiBmb3VuZCwgcXVvdGVkLCBpbiBvbmUgb2YgdGhlc2UgbW9kdWxlcywgcGFpcmVkIHdpdGggYSAnPDxwc2V1ZG9ldmVudD4+Jy4KIEVhY2ggcHNldWRvZXZlbnQgaXMgYm91bmQgdG8gYW4gZXZlbnQgaGFuZGxlci4gIFNvbWUgZXZlbnQgaGFuZGxlcnMKIGNhbGwgYW5vdGhlciBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3b3JrLiAgVGhlIGFubm90YXRpb25zIGJlbG93CiBhcmUgaW50ZW5kZWQgdG8gYXQgbGVhc3QgZ2l2ZSB0aGUgbW9kdWxlIHdoZXJlIHRoZSBhY3R1YWwgd29yayBpcyBkb25lLgorJ2VFVycgPSBlZGl0b3IuRWRpdG9yV2luZG93CiAKLUZpbGUgICMgSU9CaW5kaWcgZXhjZXB0IGFzIG5vdGVkCi0gIE5ldyBGaWxlCi0gIE9wZW4uLi4gICMgSU9CaW5kaW5nLm9wZW4KLSAgT3BlbiBNb2R1bGUKK0ZpbGUKKyAgTmV3IEZpbGUgICAgICAgICAjIGVFVy5uZXdfY2FsbGJhY2sKKyAgT3Blbi4uLiAgICAgICAgICAjIGlvbWVudS5vcGVuCisgIE9wZW4gTW9kdWxlICAgICAgIyBlRXcub3Blbl9tb2R1bGUKICAgUmVjZW50IEZpbGVzCi0gIENsYXNzIEJyb3dzZXIgICMgQ2xhc3MgQnJvd3NlcgotICBQYXRoIEJyb3dzZXIgICMgUGF0aCBCcm93c2VyCisgIENsYXNzIEJyb3dzZXIgICAgIyBlRVcub3Blbl9jbGFzc19icm93c2VyLCBicm93c2VyLkNsYXNzQnJvd3NlcgorICBQYXRoIEJyb3dzZXIgICAgICMgZUVXLm9wZW5fcGF0aF9icm93c2VyLCBwYXRoYnJvd3NlcgogICAtLS0KLSAgU2F2ZSAgIyBJREJpbmRpbmcuc2F2ZQotICBTYXZlIEFzLi4uICAjIElPQmluZGluZy5zYXZlX2FzCi0gIFNhdmUgQ29weSBBcy4uLiAgIyBJT0JpbmRsaW5nLnNhdmVfYV9jb3B5CisgIFNhdmUgICAgICAgICAgICAgIyBpb21lbnUuc2F2ZQorICBTYXZlIEFzLi4uICAgICAgICMgaW9tZW51LnNhdmVfYXMKKyAgU2F2ZSBDb3B5IEFzLi4uICAjIGlvbWVudS5zYXZlX2FfY29weQogICAtLS0KLSAgUHJpbnQgV2luZG93ICAjIElPQmluZGluZy5wcmludF93aW5kb3cKKyAgUHJpbnQgV2luZG93ICAgICAjIGlvbWVudS5wcmludF93aW5kb3cKICAgLS0tCi0gIENsb3NlCi0gIEV4aXQKKyAgQ2xvc2UgICAgICAgICAgICAjIGVFVy5jbG9zZV9ldmVudAorICBFeGl0ICAgICAgICAgICAgICMgZmxpc3QuY2xvc2VfYWxsX2NhbGxiYWNrIChib3VuZCBpbiBlRVcpCiAKIEVkaXQKLSAgVW5kbyAgIyB1bmRvRGVsZWdhdG9yCi0gIFJlZG8gICMgdW5kb0RlbGVnYXRvcgotICAtLS0KLSAgQ3V0Ci0gIENvcHkKLSAgUGFzdGUKLSAgU2VsZWN0IEFsbAotICAtLS0gICMgTmV4dCA1IGl0ZW1zIHVzZSBTZWFyY2hFbmdpbmU7IGRpYWxvZ3MgdXNlIFNlYXJjaERpYWxvZ0Jhc2UKLSAgRmluZCAgIyBTZWFyY2ggRGlhbG9nCi0gIEZpbmQgQWdhaW4KLSAgRmluZCBTZWxlY3Rpb24KLSAgRmluZCBpbiBGaWxlcy4uLiAgIyBHcmVwRGlhbG9nCi0gIFJlcGxhY2UuLi4gICMgUmVwbGFjZURpYWxvZwotICBHbyB0byBMaW5lCi0gIFNob3cgQ29tcGxldGlvbnMgICMgQXV0b0NvbXBsZXRlIGV4dGVuc2lvbiBhbmQgQXV0b0NvbXBsZXRlV2lkb3cgKCZIUCkKLSAgRXhwYW5kIFdvcmQgICMgQXV0b0V4cGFuZCBleHRlbnNpb24KLSAgU2hvdyBjYWxsIHRpcCAgIyBDYWxsdGlwcyBleHRlbnNpb24gYW5kIENhbGx0aXBXaW5kb3cgKCYgSHlwZXJwYXJzZXIpCi0gIFNob3cgc3Vycm91bmRpbmcgcGFyZW5zICAjIFBhcmVuTWF0Y2ggKCYgSHlwZXJwYXJzZXIpCisgIFVuZG8gICAgICAgICAgICAgIyB1bmRvZGVsZWdhdG9yCisgIFJlZG8gICAgICAgICAgICAgIyB1bmRvZGVsZWdhdG9yCisgIC0tLSAgICAgICAgICAgICAgIyBlRVcucmlnaHRfbWVudV9ldmVudAorICBDdXQgICAgICAgICAgICAgICMgZUVXLmN1dAorICBDb3B5ICAgICAgICAgICAgICMgZUVXLmNvcHkKKyAgUGFzdGUgICAgICAgICAgICAjIGVFVy5wYXN0CisgIFNlbGVjdCBBbGwgICAgICAgIyBlRVcuc2VsZWN0X2FsbCAoKyBzZWUgZUVXLnJlbW92ZV9zZWxlY3Rpb24pCisgIC0tLSAgICAgICAgICAgICAgIyBOZXh0IDUgaXRlbXMgdXNlIHNlYXJjaGVuZ2luZTsgZGlhbG9ncyB1c2Ugc2VhcmNoYmFzZQorICBGaW5kICAgICAgICAgICAgICMgZUVXLmZpbmRfZXZlbnQsIHNlYXJjaC5TZWFyY2hEaWFsb2cuZmluZAorICBGaW5kIEFnYWluICAgICAgICMgZUVXLmZpbmRfYWdhaW5fZXZlbnQsIHNTRC5maW5kX2FnYWluCisgIEZpbmQgU2VsZWN0aW9uICAgIyBlRVcuZmluZF9zZWxlY3Rpb25fZXZlbnQsIHNTRC5maW5kX3NlbGVjdGlvbgorICBGaW5kIGluIEZpbGVzLi4uICMgZUVXLmZpbmRfaW5fZmlsZXNfZXZlbnQsIGdyZXAKKyAgUmVwbGFjZS4uLiAgICAgICAjIGVFVy5yZXBsYWNlX2V2ZW50LCByZXBsYWNlLlJlcGxhY2VEaWFsb2cucmVwbGFjZQorICBHbyB0byBMaW5lICAgICAgICMgZUVXLmdvdG9fbGluZV9ldmVudAorICBTaG93IENvbXBsZXRpb25zICMgYXV0b2NvbXBsZXRlIGV4dGVuc2lvbiBhbmQgYXV0b2NvbXBsZXRlV2lkb3cgKCZIUCkKKyAgRXhwYW5kIFdvcmQgICAgICAjIGF1dG9leHBhbmQgZXh0ZW5zaW9uCisgIFNob3cgY2FsbCB0aXAgICAgIyBDYWxsdGlwcyBleHRlbnNpb24gYW5kIENhbGx0aXBXaW5kb3cgKCYgSHlwZXJwYXJzZXIpCisgIFNob3cgc3Vycm91bmRpbmcgcGFyZW5zICAjIHBhcmVubWF0Y2ggKCYgSHlwZXJwYXJzZXIpCiAKLVNoZWxsICAjIFB5U2hlbGwKLSAgVmlldyBMYXN0IFJlc3RhcnQgICMgUHlTaGVsbC4/Ci0gIFJlc3RhcnQgU2hlbGwgICMgUHlTaGVsbC4/CitTaGVsbCAgIyBweXNoZWxsCisgIFZpZXcgTGFzdCBSZXN0YXJ0IyBweXNoZWxsLj8KKyAgUmVzdGFydCBTaGVsbCAgICAjIHB5c2hlbGwuPwogCiBEZWJ1ZyAoU2hlbGwgb25seSkKICAgR28gdG8gRmlsZS9MaW5lCi0gIERlYnVnZ2VyICAjIERlYnVnZ2VyLCBSZW1vdGVEZWJ1Z2dlcgotICBTdGFjayBWaWV3ZXIgICMgU3RhY2tWaWV3ZXIKLSAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAgIyBTdGFja1ZpZXdlcgorICBkZWJ1Z2dlciAgICAgICAgICMgZGVidWdnZXIsIGRlYnVnZ2VyX3IKKyAgU3RhY2sgVmlld2VyICAgICAjIHN0YWNrdmlld2VyCisgIEF1dG8tb3BlbiBTdGFjayBWaWV3ZXIgICMgc3RhY2t2aWV3ZXIKIAogRm9ybWF0IChFZGl0b3Igb25seSkKLSAgSW5kZW50IFJlZ2lvbgotICBEZWRlbnQgUmVnaW9uCi0gIENvbW1lbnQgT3V0IFJlZ2lvbgotICBVbmNvbW1lbnQgUmVnaW9uCi0gIFRhYmlmeSBSZWdpb24KLSAgVW50YWJpZnkgUmVnaW9uCi0gIFRvZ2dsZSBUYWJzCi0gIE5ldyBJbmRlbnQgV2lkdGgKLSAgRm9ybWF0IFBhcmFncmFwaCAgIyBGb3JtYXRQYXJhZ3JhcGggZXh0ZW5zaW9uCisgIEluZGVudCBSZWdpb24gICAgIyBlRVcuaW5kZW50X3JlZ2lvbl9ldmVudAorICBEZWRlbnQgUmVnaW9uICAgICMgZUVXLmRlZGVudF9yZWdpb25fZXZlbnQKKyAgQ29tbWVudCBPdXQgUmVnLiAjIGVFVy5jb21tZW50X3JlZ2lvbl9ldmVudAorICBVbmNvbW1lbnQgUmVnaW9uICMgZUVXLnVuY29tbWVudF9yZWdpb25fZXZlbnQKKyAgVGFiaWZ5IFJlZ2lvbiAgICAjIGVFVy50YWJpZnlfcmVnaW9uX2V2ZW50CisgIFVudGFiaWZ5IFJlZ2lvbiAgIyBlRVcudW50YWJpZnlfcmVnaW9uX2V2ZW50CisgIFRvZ2dsZSBUYWJzICAgICAgIyBlRVcudG9nZ2xlX3RhYnNfZXZlbnQKKyAgTmV3IEluZGVudCBXaWR0aCAjIGVFVy5jaGFuZ2VfaW5kZW50d2lkdGhfZXZlbnQKKyAgRm9ybWF0IFBhcmFncmFwaCAjIHBhcmFncmFwaCBleHRlbnNpb24KICAgLS0tCi0gIFN0cmlwIHRhaWxpbmcgd2hpdGVzcGFjZSAgIyBSc3RyaXBFeHRlbnNpb24gZXh0ZW5zaW9uCisgIFN0cmlwIHRhaWxpbmcgd2hpdGVzcGFjZSAgIyByc3RyaXAgZXh0ZW5zaW9uCiAKIFJ1biAoRWRpdG9yIG9ubHkpCi0gIFB5dGhvbiBTaGVsbCAgIyBQeVNoZWxsCisgIFB5dGhvbiBTaGVsbCAgICAgIyBweXNoZWxsCiAgIC0tLQotICBDaGVjayBNb2R1bGUgICMgU2NyaXB0QmluZGluZwotICBSdW4gTW9kdWxlICAjIFNjcmlwdEJpbmRpbmcKKyAgQ2hlY2sgTW9kdWxlICAgICAjIHJ1bnNjcmlwdAorICBSdW4gTW9kdWxlICAgICAgICMgcnVuc2NyaXB0CiAKIE9wdGlvbnMKLSAgQ29uZmlndXJlIElETEUgICMgY29uZmlnRGlhbG9nCisgIENvbmZpZ3VyZSBJRExFICAgIyBlRVcuY29uZmlnX2RpYWxvZywgY29uZmlnZGlhbG9nCiAgICAgKHRhYnMgaW4gdGhlIGRpYWxvZykKLSAgICBGb250IHRhYiAgIyBvbmZpZy1tYWluLmRlZgotICAgIEhpZ2hsaWdodCB0YWIgICMgY29uZmlnU2VjdGlvbk5hbWVEaWFsb2csIGNvbmZpZy1oaWdobGlnaHQuZGVmCi0gICAgS2V5cyB0YWIgICMga2V5YmluZGluZ0RpYWxvZywgY29uZmlnU2VjdGlvbk5hbWVEaWFsb2csIG9uZmlnLWtldXMuZGVmCi0gICAgR2VuZXJhbCB0YWIgICMgY29uZmlnSGVscFNvdXJjZUVkaXQsIGNvbmZpZy1tYWluLmRlZgotICBDb25maWd1cmUgRXh0ZW5zaW9ucyAgIyBjb25maWdEaWFsb2cKLSAgICBYeXogdGFiICAjIHh5ei5weSwgY29uZmlnLWV4dGVuc2lvbnMuZGVmCisgICAgRm9udCB0YWIgICAgICAgIyBjb25maWctbWFpbi5kZWYKKyAgICBIaWdobGlnaHQgdGFiICAjIHF1ZXJ5LCBjb25maWctaGlnaGxpZ2h0LmRlZgorICAgIEtleXMgdGFiICAgICAgICMgcXVlcnksIGNvbmZpZ19rZXksIGNvbmZpZ19rZXlzLmRlZgorICAgIEdlbmVyYWwgdGFiICAgICMgY29uZmlnX2hlbHAsIGNvbmZpZy1tYWluLmRlZgorICAgIEV4dGVuc2lvbnMgdGFiICMgY29uZmlnLWV4dGVuc2lvbnMuZGVmLCBjb3JyZXNwb25kaW5nIC5weQogICAtLS0KLSAgQ29kZSBDb250ZXh0IChlZGl0b3Igb25seSkgICMgQ29kZUNvbnRleHQgZXh0ZW5zaW9uCisgIENvZGUgQ29udGV4dCAoZWQpIyBjb2RlY29udGV4dCBleHRlbnNpb24KIAogV2luZG93Ci0gIFpvb21oZWlnaHQgICMgWm9vbUhlaWdodCBleHRlbnNpb24KKyAgWm9vbWhlaWdodCAgICAgICAjIHpvb21oZWlnaHQgZXh0ZW5zaW9uCiAgIC0tLQotICA8b3BlbiB3aW5kb3dzPiAgIyBXaW5kb3dMaXN0CisgIDxvcGVuIHdpbmRvd3M+ICAgIyB3aW5kb3dzCiAKIEhlbHAKLSAgQWJvdXQgSURMRSAgIyBhYm91dERpYWxvZworICBBYm91dCBJRExFICAgICAgICMgZUVXLmFib3V0X2RpYWxvZywgaGVscF9hYm91dC5BYm91dERpYWxvZyAKICAgLS0tCi0gIElETEUgSGVscCAgIyBoZWxwCi0gIFB5dGhvbiBEb2MKLSAgVHVydGxlIERlbW8KKyAgSURMRSBIZWxwICAgICAgICAjIGVFVy5oZWxwX2RpYWxvZywgaGVscHNob3dfaWRsZWhlbHAKKyAgUHl0aG9uIERvYyAgICAgICAjIGVFVy5weXRob25fZG9jcworICBUdXJ0bGUgRGVtbyAgICAgICMgZUVXLm9wZW5fdHVydGxlX2RlbW8KICAgLS0tCiAgIDxvdGhlciBoZWxwIHNvdXJjZXM+CiAKIDxDb250ZXh0IE1lbnU+IChyaWdodCBjbGljaykKLURlZmluZWQgaW4gRWRpdG9yV2luZG93LCBQeVNoZWxsLCBPdXRwdXQKLSAgIEN1dAotICAgQ29weQotICAgUGFzdGUKLSAgIC0tLQotICAgR28gdG8gZmlsZS9saW5lIChzaGVsbCBhbmQgb3V0cHV0IG9ubHkpCi0gICBTZXQgQnJlYWtwb2ludCAoZWRpdG9yIG9ubHkpCi0gICBDbGVhciBCcmVha3BvaW50IChlZGl0b3Igb25seSkKLSBEZWZpbmVkIGluIERlYnVnZ2VyCi0gICBHbyB0byBzb3VyY2UgbGluZQotICAgU2hvdyBzdGFjayBmcmFtZQorICBEZWZpbmVkIGluIGVkaXRvciwgUHlTaGVscHlzaGVsbHV0CisgICAgQ3V0CisgICAgQ29weQorICAgIFBhc3RlCisgICAgLS0tCisgICAgR28gdG8gZmlsZS9saW5lIChzaGVsbCBhbmQgb3V0cHV0IG9ubHkpCisgICAgU2V0IEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQorICAgIENsZWFyIEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQorICBEZWZpbmVkIGluIGRlYnVnZ2VyCisgICAgR28gdG8gc291cmNlIGxpbmUKKyAgICBTaG93IHN0YWNrIGZyYW1lCisKKzxObyBtZW51PgorQ2VudGVyIEluc2VydCAgICAgICMgZUVXLmNlbnRlcl9pbnNlcnRfZXZlbnQKKworICAKK0NPREUgU1RZTEUgLS0gR2VuZXJhbGx5IFBFUCA4LgorCitpbXBvcnQKKy0tLS0tLQorUHV0IGltcG9ydCBhdCB0aGUgdG9wLCB1bmxlc3MgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiBvdGhlcndpc2UuCitQRVAgOCBzYXlzIHRvIGdyb3VwIHN0ZGxpYiwgM3JkLXBhcnR5IGRlcGVuZGVuY2llcywgYW5kIHBhY2thZ2UgaW1wb3J0cy4KK0ZvciBpZGxlbGliLCB0aGUgZ3JvdXBzIGFyZSBnZW5lcmFsIHN0ZGxpYiwgdGtpbnRlciwgYW5kIGlkbGVsaWIuCitTb3J0IG1vZHVsZXMgd2l0aGluIGVhY2ggZ3JvdXAsIGV4Y2VwdCB0aGF0IHRraW50ZXIudHRrIGZvbGxvd3MgdGtpbnRlci4KK1NvcnQgJ2Zyb20gaWRsZWxpYiBpbXBvcnQgbW9kMScgYW5kICdmcm9tIGlkbGVsaWIubW9kMiBpbXBvcnQgb2JqZWN0JwordG9nZXRoZXIgYnkgbW9kdWxlLCBpZ25vcmluZyB3aXRoaW4gbW9kdWxlIG9iamVjdHMuCitQdXQgJ2ltcG9ydCBfX21haW5fXycgYWZ0ZXIgb3RoZXIgaWRsZWxpYiBpbXBvcnRzLgorCitJbXBvcnRzIG9ubHkgbmVlZGVkIGZvciB0ZXN0aW5nIGFyZSBwdXQgbm90IGF0IHRoZSB0b3AgYnV0IGluIGFuCitodGVzdCBmdW5jdGlvbiBkZWYgb3IgImlmIF9fbmFtZV9fID09ICdfX21haW5fXyciIGNsYXVzZS4KKworV2l0aGluIG1vZHVsZSBpbXBvcnRzIGxpa2UgImZyb20gaWRsZWxpYi5tb2QgaW1wb3J0IGNsYXNzIiBtYXkgY2F1c2UKK2NpcmN1bGFyIGltcG9ydHMgdG8gZGVhZGxvY2suICBFdmVuIHdpdGhvdXQgdGhpcywgY2lyY3VsYXIgaW1wb3J0cyBtYXkKK3JlcXVpcmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbXBvcnRzIHRvIGJlIGRlbGF5ZWQgdW50aWwgYSBmdW5jdGlvbiBjYWxsLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvX19pbml0X18ucHkgYi9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQppbmRleCA3MTFmNjFiLi43OTFkZGVhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQpAQCAtMSw4ICsxLDEwIEBACiAiIiJUaGUgaWRsZWxpYiBwYWNrYWdlIGltcGxlbWVudHMgdGhlIElkbGUgYXBwbGljYXRpb24uCiAKIElkbGUgaW5jbHVkZXMgYW4gaW50ZXJhY3RpdmUgc2hlbGwgYW5kIGVkaXRvci4KK1N0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNiwgSURMRSByZXF1aXJlcyB0Y2wvdGsgOC41IG9yIGxhdGVyLgogVXNlIHRoZSBmaWxlcyBuYW1lZCBpZGxlLiogdG8gc3RhcnQgSWRsZS4KIAogVGhlIG90aGVyIGZpbGVzIGFyZSBwcml2YXRlIGltcGxlbWVudGF0aW9ucy4gIFRoZWlyIGRldGFpbHMgYXJlIHN1YmplY3QgdG8KIGNoYW5nZS4gIFNlZSBQRVAgNDM0IGZvciBtb3JlLiAgSW1wb3J0IHRoZW0gYXQgeW91ciBvd24gcmlzay4KICIiIgordGVzdGluZyA9IEZhbHNlICAjIFNldCBUcnVlIGJ5IHRlc3QudGVzdF9pZGxlLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvX19tYWluX18ucHkgYi9MaWIvaWRsZWxpYi9fX21haW5fXy5weQppbmRleCAyZWRmNWY3Li42MzQ5ZWM3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9fX21haW5fXy5weQorKysgYi9MaWIvaWRsZWxpYi9fX21haW5fXy5weQpAQCAtMyw2ICszLDYgQEAKIAogUnVuIElETEUgYXMgcHl0aG9uIC1tIGlkbGVsaWIKICIiIgotaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAotaWRsZWxpYi5QeVNoZWxsLm1haW4oKQoraW1wb3J0IGlkbGVsaWIucHlzaGVsbAoraWRsZWxpYi5weXNoZWxsLm1haW4oKQogIyBUaGlzIGZpbGUgZG9lcyBub3Qgd29yayBmb3IgMi43OyBTZWUgaXNzdWUgMjQyMTIuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGUucHkKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9hdXRvY29tcGxldGUucHkKaW5kZXggZmYwODVkNS4uMWU0NGZhNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CisrKyBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZS5weQpAQCAtMSwyOSArMSwzMCBAQAotIiIiQXV0b0NvbXBsZXRlLnB5IC0gQW4gSURMRSBleHRlbnNpb24gZm9yIGF1dG9tYXRpY2FsbHkgY29tcGxldGluZyBuYW1lcy4KKyIiImF1dG9jb21wbGV0ZS5weSAtIEFuIElETEUgZXh0ZW5zaW9uIGZvciBhdXRvbWF0aWNhbGx5IGNvbXBsZXRpbmcgbmFtZXMuCiAKIFRoaXMgZXh0ZW5zaW9uIGNhbiBjb21wbGV0ZSBlaXRoZXIgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGUgbmFtZXMuIEl0IGNhbiBwb3AKIGEgd2luZG93IHdpdGggYWxsIGF2YWlsYWJsZSBuYW1lcywgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCBmcm9tLgogIiIiCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCi0KLSMgVGhpcyBzdHJpbmcgaW5jbHVkZXMgYWxsIGNoYXJzIHRoYXQgbWF5IGJlIGluIGFuIGlkZW50aWZpZXIKLUlEX0NIQVJTID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCi0KLSMgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb21wbGV0aW9ucworIyBUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBsZXRpb25zLgorIyBUaGV5IG11c3QgYmUgZGVmaW5lZCBoZXJlIHNvIGF1dG9jb21wbGVfdyBjYW4gaW1wb3J0IHRoZW0uCiBDT01QTEVURV9BVFRSSUJVVEVTLCBDT01QTEVURV9GSUxFUyA9IHJhbmdlKDEsIDIrMSkKIAotZnJvbSBpZGxlbGliIGltcG9ydCBBdXRvQ29tcGxldGVXaW5kb3cKLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKLQorZnJvbSBpZGxlbGliIGltcG9ydCBhdXRvY29tcGxldGVfdworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKIGltcG9ydCBfX21haW5fXwogCisjIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyLgorIyBUT0RPIFVwZGF0ZSB0aGlzIGhlcmUgYW5kIGVsc2V3aGVyZS4KK0lEX0NIQVJTID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCisKIFNFUFMgPSBvcy5zZXAKIGlmIG9zLmFsdHNlcDogICMgZS5nLiAnLycgb24gV2luZG93cy4uLgogICAgIFNFUFMgKz0gb3MuYWx0c2VwCiAKKwogY2xhc3MgQXV0b0NvbXBsZXRlOgogCiAgICAgbWVudWRlZnMgPSBbCkBAIC0zNywxOSArMzgsMTcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luPU5vbmUpOgogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCi0gICAgICAgIGlmIGVkaXR3aW4gaXMgTm9uZTogICMgc3VicHJvY2VzcyBhbmQgdGVzdAotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAotICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IE5vbmUKLQotICAgICAgICAjIGlkIG9mIGRlbGF5ZWQgY2FsbCwgYW5kIHRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbnNlcnQgd2hlbiB0aGUgZGVsYXllZAotICAgICAgICAjIGNhbGwgd2FzIGlzc3VlZC4gSWYgX2RlbGF5ZWRfY29tcGxldGlvbl9pZCBpcyBOb25lLCB0aGVyZSBpcyBubwotICAgICAgICAjIGRlbGF5ZWQgY2FsbC4KLSAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQotICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXggPSBOb25lCisgICAgICAgIGlmIGVkaXR3aW4gaXMgbm90IE5vbmU6ICAjIG5vdCBpbiBzdWJwcm9jZXNzIG9yIHRlc3QKKyAgICAgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBOb25lCisgICAgICAgICAgICAjIGlkIG9mIGRlbGF5ZWQgY2FsbCwgYW5kIHRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbnNlcnQgd2hlbgorICAgICAgICAgICAgIyB0aGUgZGVsYXllZCBjYWxsIHdhcyBpc3N1ZWQuIElmIF9kZWxheWVkX2NvbXBsZXRpb25faWQgaXMKKyAgICAgICAgICAgICMgTm9uZSwgdGhlcmUgaXMgbm8gZGVsYXllZCBjYWxsLgorICAgICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gTm9uZQogCiAgICAgZGVmIF9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coc2VsZik6Ci0gICAgICAgIHJldHVybiBBdXRvQ29tcGxldGVXaW5kb3cuQXV0b0NvbXBsZXRlV2luZG93KHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuIGF1dG9jb21wbGV0ZV93LkF1dG9Db21wbGV0ZVdpbmRvdyhzZWxmLnRleHQpCiAKICAgICBkZWYgX3JlbW92ZV9hdXRvY29tcGxldGVfd2luZG93KHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBpZiBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdzoKQEAgLTgwLDE2ICs3OSwxNyBAQAogICAgICAgICBvcGVuIGEgY29tcGxldGlvbiBsaXN0IGFmdGVyIHRoYXQgKGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKICAgICAgICAgY29tcGxldGlvbikKICAgICAgICAgIiIiCi0gICAgICAgIGlmIGhhc2F0dHIoZXZlbnQsICJtY19zdGF0ZSIpIGFuZCBldmVudC5tY19zdGF0ZToKLSAgICAgICAgICAgICMgQSBtb2RpZmllciB3YXMgcHJlc3NlZCBhbG9uZyB3aXRoIHRoZSB0YWIsIGNvbnRpbnVlIGFzIHVzdWFsLgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGhhc2F0dHIoZXZlbnQsICJtY19zdGF0ZSIpIGFuZCBldmVudC5tY19zdGF0ZSBvclwKKyAgICAgICAgICAgICAgICBub3Qgc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKS5zdHJpcCgpOgorICAgICAgICAgICAgIyBBIG1vZGlmaWVyIHdhcyBwcmVzc2VkIGFsb25nIHdpdGggdGhlIHRhYiBvcgorICAgICAgICAgICAgIyB0aGVyZSBpcyBvbmx5IHByZXZpb3VzIHdoaXRlc3BhY2Ugb24gdGhpcyBsaW5lLCBzbyB0YWIuCisgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICBpZiBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyBhbmQgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuaXNfYWN0aXZlKCk6CiAgICAgICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy5jb21wbGV0ZSgpCiAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3BlbmVkID0gc2VsZi5vcGVuX2NvbXBsZXRpb25zKEZhbHNlLCBUcnVlLCBUcnVlKQotICAgICAgICAgICAgaWYgb3BlbmVkOgotICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIiBpZiBvcGVuZWQgZWxzZSBOb25lCiAKICAgICBkZWYgX29wZW5fY29tcGxldGlvbnNfbGF0ZXIoc2VsZiwgKmFyZ3MpOgogICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXggPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpCkBAIC0xMDEsOSArMTAxLDggQEAKIAogICAgIGRlZiBfZGVsYXllZF9vcGVuX2NvbXBsZXRpb25zKHNlbGYsICphcmdzKToKICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQotICAgICAgICBpZiBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpICE9IHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pbmRleDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm9wZW5fY29tcGxldGlvbnMoKmFyZ3MpCisgICAgICAgIGlmIHNlbGYudGV4dC5pbmRleCgiaW5zZXJ0IikgPT0gc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4OgorICAgICAgICAgICAgc2VsZi5vcGVuX2NvbXBsZXRpb25zKCphcmdzKQogCiAgICAgZGVmIG9wZW5fY29tcGxldGlvbnMoc2VsZiwgZXZhbGZ1bmNzLCBjb21wbGV0ZSwgdXNlcldhbnRzV2luLCBtb2RlPU5vbmUpOgogICAgICAgICAiIiJGaW5kIHRoZSBjb21wbGV0aW9ucyBhbmQgY3JlYXRlIHRoZSBBdXRvQ29tcGxldGVXaW5kb3cuCkBAIC0xNDgsMTcgKzE0NywxNyBAQAogICAgICAgICAgICAgICAgIGNvbXBfd2hhdCA9IGhwLmdldF9leHByZXNzaW9uKCkKICAgICAgICAgICAgICAgICBpZiBub3QgY29tcF93aGF0IG9yIFwKICAgICAgICAgICAgICAgICAgICAobm90IGV2YWxmdW5jcyBhbmQgY29tcF93aGF0LmZpbmQoJygnKSAhPSAtMSk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBjb21wX3doYXQgPSAiIgogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgICAgIGlmIGNvbXBsZXRlIGFuZCBub3QgY29tcF93aGF0IGFuZCBub3QgY29tcF9zdGFydDoKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgY29tcF9saXN0cyA9IHNlbGYuZmV0Y2hfY29tcGxldGlvbnMoY29tcF93aGF0LCBtb2RlKQogICAgICAgICBpZiBub3QgY29tcF9saXN0c1swXToKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBzZWxmLl9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coKQogICAgICAgICByZXR1cm4gbm90IHNlbGYuYXV0b2NvbXBsZXRld2luZG93LnNob3dfd2luZG93KAogICAgICAgICAgICAgICAgIGNvbXBfbGlzdHMsICJpbnNlcnQtJWRjIiAlIGxlbihjb21wX3N0YXJ0KSwKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYXV0b2NvbXBsZXRlX3cucHkKaW5kZXggMmVlNjg3OC4uMzM3NGM2ZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CkBAIC0xLDkgKzEsMTEgQEAKICIiIgotQW4gYXV0by1jb21wbGV0aW9uIHdpbmRvdyBmb3IgSURMRSwgdXNlZCBieSB0aGUgQXV0b0NvbXBsZXRlIGV4dGVuc2lvbgorQW4gYXV0by1jb21wbGV0aW9uIHdpbmRvdyBmb3IgSURMRSwgdXNlZCBieSB0aGUgYXV0b2NvbXBsZXRlIGV4dGVuc2lvbgogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE1DX1NISUZUCi1mcm9tIGlkbGVsaWIuQXV0b0NvbXBsZXRlIGltcG9ydCBDT01QTEVURV9GSUxFUywgQ09NUExFVEVfQVRUUklCVVRFUworZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCisKK2Zyb20gaWRsZWxpYi5hdXRvY29tcGxldGUgaW1wb3J0IENPTVBMRVRFX0ZJTEVTLCBDT01QTEVURV9BVFRSSUJVVEVTCitmcm9tIGlkbGVsaWIubXVsdGljYWxsIGltcG9ydCBNQ19TSElGVAogCiBISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSA9ICI8PGF1dG9jb21wbGV0ZXdpbmRvdy1oaWRlPj4iCiBISURFX1NFUVVFTkNFUyA9ICgiPEZvY3VzT3V0PiIsICI8QnV0dG9uUHJlc3M+IikKQEAgLTM0LDggKzM2LDggQEAKICAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IE5vbmUKICAgICAgICAgIyBBIGxpc3Qgd2l0aCBtb3JlIGNvbXBsZXRpb25zLCBvciBOb25lCiAgICAgICAgIHNlbGYubW9yZWNvbXBsZXRpb25zID0gTm9uZQotICAgICAgICAjIFRoZSBjb21wbGV0aW9uIG1vZGUuIEVpdGhlciBBdXRvQ29tcGxldGUuQ09NUExFVEVfQVRUUklCVVRFUyBvcgotICAgICAgICAjIEF1dG9Db21wbGV0ZS5DT01QTEVURV9GSUxFUworICAgICAgICAjIFRoZSBjb21wbGV0aW9uIG1vZGUuIEVpdGhlciBhdXRvY29tcGxldGUuQ09NUExFVEVfQVRUUklCVVRFUyBvcgorICAgICAgICAjIGF1dG9jb21wbGV0ZS5DT01QTEVURV9GSUxFUwogICAgICAgICBzZWxmLm1vZGUgPSBOb25lCiAgICAgICAgICMgVGhlIGN1cnJlbnQgY29tcGxldGlvbiBzdGFydCwgb24gdGhlIHRleHQgYm94IChhIHN0cmluZykKICAgICAgICAgc2VsZi5zdGFydCA9IE5vbmUKQEAgLTIxNSw2ICsyMTcsNyBAQAogICAgICAgICBzZWxmLndpbmNvbmZpZ2lkID0gYWN3LmJpbmQoV0lOQ09ORklHX1NFUVVFTkNFLCBzZWxmLndpbmNvbmZpZ19ldmVudCkKICAgICAgICAgc2VsZi5kb3VibGVjbGlja2lkID0gbGlzdGJveC5iaW5kKERPVUJMRUNMSUNLX1NFUVVFTkNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb3VibGVjbGlja19ldmVudCkKKyAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGRlZiB3aW5jb25maWdfZXZlbnQoc2VsZiwgZXZlbnQpOgogICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKQEAgLTIzOCwxNiArMjQxLDE0IEBACiAgICAgICAgIGFjdy53bV9nZW9tZXRyeSgiKyVkKyVkIiAlIChuZXdfeCwgbmV3X3kpKQogCiAgICAgZGVmIGhpZGVfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgaWYgc2VsZi5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQogCiAgICAgZGVmIGxpc3RzZWxlY3RfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnVzZXJ3YW50c3dpbmRvdyA9IFRydWUKLSAgICAgICAgY3Vyc2VsID0gaW50KHNlbGYubGlzdGJveC5jdXJzZWxlY3Rpb24oKVswXSkKLSAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXSkKKyAgICAgICAgaWYgc2VsZi5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHNlbGYudXNlcndhbnRzd2luZG93ID0gVHJ1ZQorICAgICAgICAgICAgY3Vyc2VsID0gaW50KHNlbGYubGlzdGJveC5jdXJzZWxlY3Rpb24oKVswXSkKKyAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCiAKICAgICBkZWYgZG91YmxlY2xpY2tfZXZlbnQoc2VsZiwgZXZlbnQpOgogICAgICAgICAjIFB1dCB0aGUgc2VsZWN0ZWQgY29tcGxldGlvbiBpbiB0aGUgdGV4dCwgYW5kIGNsb3NlIHRoZSBsaXN0CkBAIC0yNTcsNyArMjU4LDcgQEAKIAogICAgIGRlZiBrZXlwcmVzc19ldmVudChzZWxmLCBldmVudCk6CiAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgotICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICBrZXlzeW0gPSBldmVudC5rZXlzeW0KICAgICAgICAgaWYgaGFzYXR0cihldmVudCwgIm1jX3N0YXRlIik6CiAgICAgICAgICAgICBzdGF0ZSA9IGV2ZW50Lm1jX3N0YXRlCkBAIC0yODIsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICAjIGtleXN5bSA9PSAiQmFja1NwYWNlIgogICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnN0YXJ0KSA9PSAwOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuc3RhcnRbOi0xXSkKICAgICAgICAgICAgIHNlbGYubGFzdHR5cGVkc3RhcnQgPSBzZWxmLnN0YXJ0CiAgICAgICAgICAgICBzZWxmLmxpc3Rib3guc2VsZWN0X2NsZWFyKDAsIGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pKQpAQCAtMjkyLDcgKzI5Myw3IEBACiAKICAgICAgICAgZWxpZiBrZXlzeW0gPT0gIlJldHVybiI6CiAgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgICAgICBlbGlmIChzZWxmLm1vZGUgPT0gQ09NUExFVEVfQVRUUklCVVRFUyBhbmQga2V5c3ltIGluCiAgICAgICAgICAgICAgICgicGVyaW9kIiwgInNwYWNlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImJyYWNrZXRsZWZ0IiwKQEAgLTMwOCw3ICszMDksNyBAQAogICAgICAgICAgICAgICAgYW5kIChzZWxmLm1vZGUgPT0gQ09NUExFVEVfQVRUUklCVVRFUyBvciBzZWxmLnN0YXJ0KToKICAgICAgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5jb21wbGV0aW9uc1tjdXJzZWxdKQogICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZWxpZiBrZXlzeW0gaW4gKCJIb21lIiwgIkVuZCIsICJQcmlvciIsICJOZXh0IiwgIlVwIiwgIkRvd24iKSBhbmQgXAogICAgICAgICAgICAgIG5vdCBzdGF0ZToKQEAgLTM0OSwxMiArMzUwLDEyIEBACiAgICAgICAgICAgICAgICAgIyBmaXJzdCB0YWI7IGxldCBBdXRvQ29tcGxldGUgaGFuZGxlIHRoZSBjb21wbGV0aW9uCiAgICAgICAgICAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBUcnVlCiAgICAgICAgICAgICAgICAgc2VsZi5sYXN0a2V5X3dhc190YWIgPSBUcnVlCi0gICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgICAgICBlbGlmIGFueShzIGluIGtleXN5bSBmb3IgcyBpbiAoIlNoaWZ0IiwgIkNvbnRyb2wiLCAiQWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhIiwgIkNvbW1hbmQiLCAiT3B0aW9uIikpOgogICAgICAgICAgICAgIyBBIG1vZGlmaWVyIGtleSwgc28gaWdub3JlCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZWxpZiBldmVudC5jaGFyIGFuZCBldmVudC5jaGFyID49ICcgJzoKICAgICAgICAgICAgICMgUmVndWxhciBjaGFyYWN0ZXIgd2l0aCBhIG5vbi1sZW5ndGgtMSBrZXljb2RlCkBAIC0zNjgsNyArMzY5LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgVW5rbm93biBldmVudCwgY2xvc2UgdGhlIHdpbmRvdyBhbmQgbGV0IGl0IHRocm91Z2guCiAgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKLSAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGRlZiBrZXlyZWxlYXNlX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvRXhwYW5kLnB5IGIvTGliL2lkbGVsaWIvYXV0b2V4cGFuZC5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9BdXRvRXhwYW5kLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9hdXRvZXhwYW5kLnB5CmluZGV4IDcwNTkwNTQuLjZiNDZiZWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0F1dG9FeHBhbmQucHkKKysrIGIvTGliL2lkbGVsaWIvYXV0b2V4cGFuZC5weQpAQCAtMTIsOCArMTIsOCBAQAogCiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBmaWxlIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBBdXRvRXhwYW5kLgogJycnCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKIAogIyMjJCBldmVudCA8PGV4cGFuZC13b3JkPj4KICMjIyQgd2luIDxBbHQtc2xhc2g+CkBAIC0zMSw2ICszMSw3IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CiAgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICBzZWxmLmJlbGwgPSBzZWxmLnRleHQuYmVsbAogICAgICAgICBzZWxmLnN0YXRlID0gTm9uZQogCiAgICAgZGVmIGV4cGFuZF93b3JkX2V2ZW50KHNlbGYsIGV2ZW50KToKQEAgLTQ2LDE0ICs0NywxNCBAQAogICAgICAgICAgICAgICAgIHdvcmRzID0gc2VsZi5nZXR3b3JkcygpCiAgICAgICAgICAgICAgICAgaW5kZXggPSAwCiAgICAgICAgIGlmIG5vdCB3b3JkczoKLSAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgogICAgICAgICB3b3JkID0gc2VsZi5nZXRwcmV2d29yZCgpCiAgICAgICAgIHNlbGYudGV4dC5kZWxldGUoImluc2VydCAtICVkIGNoYXJzIiAlIGxlbih3b3JkKSwgImluc2VydCIpCiAgICAgICAgIG5ld3dvcmQgPSB3b3Jkc1tpbmRleF0KICAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAlIGxlbih3b3JkcykKICAgICAgICAgaWYgaW5kZXggPT0gMDoKLSAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkgICAgICAgICAgICAjIFdhcm4gd2UgY3ljbGVkIGFyb3VuZAorICAgICAgICAgICAgc2VsZi5iZWxsKCkgICAgICAgICAgICAjIFdhcm4gd2UgY3ljbGVkIGFyb3VuZAogICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCJpbnNlcnQiLCBuZXd3b3JkKQogICAgICAgICBjdXJpbnNlcnQgPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpCiAgICAgICAgIGN1cmxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2Jyb3dzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9icm93c2VyLnB5CmluZGV4IGQwOWM1MmYuLmVhMDU2MzggMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9icm93c2VyLnB5CkBAIC0xMSwxNiArMTEsMTYgQEAKICIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBweWNsYnIKK2ltcG9ydCBzeXMKIAotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCi1mcm9tIGlkbGVsaWIuV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IHB5c2hlbGwKK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCitmcm9tIGlkbGVsaWIud2luZG93cyBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKIAogZmlsZV9vcGVuID0gTm9uZSAgIyBNZXRob2QuLi5JdGVtIGFuZCBDbGFzcy4uLkl0ZW0gdXNlIHRoaXMuCi0jIE5vcm1hbGx5IFB5U2hlbGwuZmxpc3Qub3BlbiwgYnV0IHRoZXJlIGlzIG5vIFB5U2hlbGwuZmxpc3QgZm9yIGh0ZXN0LgorIyBOb3JtYWxseSBweXNoZWxsLmZsaXN0Lm9wZW4sIGJ1dCB0aGVyZSBpcyBubyBweXNoZWxsLmZsaXN0IGZvciBodGVzdC4KIAogY2xhc3MgQ2xhc3NCcm93c2VyOgogCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgICIiIgogICAgICAgICBnbG9iYWwgZmlsZV9vcGVuCiAgICAgICAgIGlmIG5vdCBfaHRlc3Q6Ci0gICAgICAgICAgICBmaWxlX29wZW4gPSBQeVNoZWxsLmZsaXN0Lm9wZW4KKyAgICAgICAgICAgIGZpbGVfb3BlbiA9IHB5c2hlbGwuZmxpc3Qub3BlbgogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIHNlbGYuZmlsZSA9IG9zLnBhdGguam9pbihwYXRoWzBdLCBzZWxmLm5hbWUgKyAiLnB5IikKICAgICAgICAgc2VsZi5faHRlc3QgPSBfaHRlc3QKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlKToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBQeVNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQorICAgICAgICBweXNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQogCiAgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKICAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uoc2VsZi5maWxlWy0zOl0pID09ICIucHkiCkBAIC0yMjYsNyArMjI2LDcgQEAKICAgICAgICAgICAgIGZpbGUgPSBzeXMuYXJndlswXQogICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZmlsZSkKICAgICBuYW1lID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKVswXQotICAgIGZsaXN0ID0gUHlTaGVsbC5QeVNoZWxsRmlsZUxpc3QocGFyZW50KQorICAgIGZsaXN0ID0gcHlzaGVsbC5QeVNoZWxsRmlsZUxpc3QocGFyZW50KQogICAgIGdsb2JhbCBmaWxlX29wZW4KICAgICBmaWxlX29wZW4gPSBmbGlzdC5vcGVuCiAgICAgQ2xhc3NCcm93c2VyKGZsaXN0LCBuYW1lLCBbZGlyXSwgX2h0ZXN0PVRydWUpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5IGIvTGliL2lkbGVsaWIvY2FsbHRpcF93LnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NhbGx0aXBfdy5weQppbmRleCA5ZWVjMTc1Li5jNzM2MWQxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL2NhbGx0aXBfdy5weQpAQCAtMSw3ICsxLDcgQEAKICIiIkEgQ2FsbFRpcCB3aW5kb3cgY2xhc3MgZm9yIFRraW50ZXIvSURMRS4KIAotQWZ0ZXIgVG9vbFRpcC5weSwgd2hpY2ggdXNlcyBpZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKLVVzZWQgYnkgdGhlIENhbGxUaXBzIElETEUgZXh0ZW5zaW9uLgorQWZ0ZXIgdG9vbHRpcC5weSwgd2hpY2ggdXNlcyBpZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKK1VzZWQgYnkgdGhlIGNhbGx0aXBzIElETEUgZXh0ZW5zaW9uLgogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBMYWJlbCwgTEVGVCwgU09MSUQsIFRjbEVycm9yCiAKQEAgLTEzOCw4ICsxMzgsOCBAQAogCiAgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQogICAgIHRvcC50aXRsZSgiVGVzdCBjYWxsdGlwcyIpCi0gICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSArIDIwMCwKLSAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlICh4ICsgMjUwLCB5ICsgMTc1KSkKICAgICB0ZXh0ID0gVGV4dCh0b3ApCiAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgInN0cmluZy5zcGxpdCIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weSBiL0xpYi9pZGxlbGliL2NhbGx0aXBzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NhbGxUaXBzLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jYWxsdGlwcy5weQppbmRleCA4MWJkNWYxLi5hYmNjMTQyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weQorKysgYi9MaWIvaWRsZWxpYi9jYWxsdGlwcy5weQpAQCAtMSwxOSArMSwxOSBAQAotIiIiQ2FsbFRpcHMucHkgLSBBbiBJRExFIEV4dGVuc2lvbiB0byBKb2cgWW91ciBNZW1vcnkKKyIiImNhbGx0aXBzLnB5IC0gQW4gSURMRSBFeHRlbnNpb24gdG8gSm9nIFlvdXIgTWVtb3J5CiAKIENhbGwgVGlwcyBhcmUgZmxvYXRpbmcgd2luZG93cyB3aGljaCBkaXNwbGF5IGZ1bmN0aW9uLCBjbGFzcywgYW5kIG1ldGhvZAogcGFyYW1ldGVyIGFuZCBkb2NzdHJpbmcgaW5mb3JtYXRpb24gd2hlbiB5b3UgdHlwZSBhbiBvcGVuaW5nIHBhcmVudGhlc2lzLCBhbmQKIHdoaWNoIGRpc2FwcGVhciB3aGVuIHlvdSB0eXBlIGEgY2xvc2luZyBwYXJlbnRoZXNpcy4KIAogIiIiCi1pbXBvcnQgX19tYWluX18KIGltcG9ydCBpbnNwZWN0CiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHR5cGVzCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgQ2FsbFRpcFdpbmRvdwotZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliIGltcG9ydCBjYWxsdGlwX3cKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2ltcG9ydCBfX21haW5fXwogCiBjbGFzcyBDYWxsVGlwczoKIApAQCAtMzcsNyArMzcsNyBAQAogCiAgICAgZGVmIF9tYWtlX3RrX2NhbGx0aXBfd2luZG93KHNlbGYpOgogICAgICAgICAjIFNlZSBfX2luaXRfXyBmb3IgdXNhZ2UKLSAgICAgICAgcmV0dXJuIENhbGxUaXBXaW5kb3cuQ2FsbFRpcChzZWxmLnRleHQpCisgICAgICAgIHJldHVybiBjYWxsdGlwX3cuQ2FsbFRpcChzZWxmLnRleHQpCiAKICAgICBkZWYgX3JlbW92ZV9jYWxsdGlwX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2FsbHRpcDoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvTGliL2lkbGVsaWIvY29kZWNvbnRleHQucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CmluZGV4IDdkMjVhZGEuLmYyNWUxYjMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CkBAIC0xLDE5ICsxLDIxIEBACi0iIiJDb2RlQ29udGV4dCAtIEV4dGVuc2lvbiB0byBkaXNwbGF5IHRoZSBibG9jayBjb250ZXh0IGFib3ZlIHRoZSBlZGl0IHdpbmRvdworIiIiY29kZWNvbnRleHQgLSBFeHRlbnNpb24gdG8gZGlzcGxheSB0aGUgYmxvY2sgY29udGV4dCBhYm92ZSB0aGUgZWRpdCB3aW5kb3cKIAogT25jZSBjb2RlIGhhcyBzY3JvbGxlZCBvZmYgdGhlIHRvcCBvZiBhIHdpbmRvdywgaXQgY2FuIGJlIGRpZmZpY3VsdCB0bwogZGV0ZXJtaW5lIHdoaWNoIGJsb2NrIHlvdSBhcmUgaW4uICBUaGlzIGV4dGVuc2lvbiBpbXBsZW1lbnRzIGEgcGFuZSBhdCB0aGUgdG9wCiBvZiBlYWNoIElETEUgZWRpdCB3aW5kb3cgd2hpY2ggcHJvdmlkZXMgYmxvY2sgc3RydWN0dXJlIGhpbnRzLiAgVGhlc2UgaGludHMgYXJlCiB0aGUgbGluZXMgd2hpY2ggY29udGFpbiB0aGUgYmxvY2sgb3BlbmluZyBrZXl3b3JkcywgZS5nLiAnaWYnLCBmb3IgdGhlCiBlbmNsb3NpbmcgYmxvY2suICBUaGUgbnVtYmVyIG9mIGhpbnQgbGluZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtbGluZXMKLXZhcmlhYmxlIGluIHRoZSBDb2RlQ29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KK3ZhcmlhYmxlIGluIHRoZSBjb2RlY29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KIG5vdCBvcGVuIGJsb2NrcyBhcmUgbm90IHNob3duIGluIHRoZSBjb250ZXh0IGhpbnRzIHBhbmUuCiAKICIiIgotaW1wb3J0IHRraW50ZXIKLWZyb20gdGtpbnRlci5jb25zdGFudHMgaW1wb3J0IFRPUCwgTEVGVCwgWCwgVywgU1VOS0VOCiBpbXBvcnQgcmUKIGZyb20gc3lzIGltcG9ydCBtYXhzaXplIGFzIElORklOSVRZCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworaW1wb3J0IHRraW50ZXIKK2Zyb20gdGtpbnRlci5jb25zdGFudHMgaW1wb3J0IFRPUCwgTEVGVCwgWCwgVywgU1VOS0VOCisKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIEJMT0NLT1BFTkVSUyA9IHsiY2xhc3MiLCAiZGVmIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZmluYWxseSIsICJmb3IiLAogICAgICAgICAgICAgICAgICAgICAiaWYiLCAidHJ5IiwgIndoaWxlIiwgIndpdGgifQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9jb2xvcml6ZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbG9yaXplci5weQppbmRleCAwMmVhYzQ3Li43MzEwYmIyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9jb2xvcml6ZXIucHkKQEAgLTEsMTAgKzEsMTAgQEAKLWltcG9ydCB0aW1lCi1pbXBvcnQgcmUKLWltcG9ydCBrZXl3b3JkCiBpbXBvcnQgYnVpbHRpbnMKLWZyb20gdGtpbnRlciBpbXBvcnQgVGtWZXJzaW9uCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgoraW1wb3J0IGtleXdvcmQKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKKworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgogCiBERUJVRyA9IEZhbHNlCiAKQEAgLTQ5LDExICs0OSw4IEBACiAgICAgICAgIGluc2VydGJhY2tncm91bmQ9Y3Vyc29yX2NvbG9yLAogICAgICAgICBzZWxlY3Rmb3JlZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2ZvcmVncm91bmQnXSwKICAgICAgICAgc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10sCi0gICAgICAgICkKLSAgICBpZiBUa1ZlcnNpb24gPj0gOC41OgotICAgICAgICB0ZXh0LmNvbmZpZygKLSAgICAgICAgICAgIGluYWN0aXZlc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10pCi0KKyAgICAgICAgaW5hY3RpdmVzZWxlY3RiYWNrZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2JhY2tncm91bmQnXSwgICMgbmV3IGluIDguNQorICAgICkKIAogY2xhc3MgQ29sb3JEZWxlZ2F0b3IoRGVsZWdhdG9yKToKIApAQCAtMjU5LDEyICsyNTYsMTIgQEAKIAogZGVmIF9jb2xvcl9kZWxlZ2F0b3IocGFyZW50KTogICMgaHRlc3QgIwogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQKLSAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAKICAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXN0IENvbG9yRGVsZWdhdG9yIikKLSAgICB0b3AuZ2VvbWV0cnkoIjIwMHgxMDArJWQrJWQiICUgKHBhcmVudC53aW5mb19yb290eCgpICsgMjAwLAotICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIjIwMHgxMDArJWQrJWQiICUgKHggKyAyNTAsIHkgKyAxNzUpKQogICAgIHNvdXJjZSA9ICJpZiBzb21lbmFtZTogeCA9ICdhYmMnICMgY29tbWVudFxucHJpbnRcbiIKICAgICB0ZXh0ID0gVGV4dCh0b3AsIGJhY2tncm91bmQ9IndoaXRlIikKICAgICB0ZXh0LnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQpAQCAtMjc3LDUgKzI3NCw5IEBACiAgICAgcC5pbnNlcnRmaWx0ZXIoZCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2NvbG9yaXplcicsCisgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfY29sb3JfZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCmluZGV4IDNiZmNiNjkuLjY0Nzg4ZjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgorKysgYi9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKQEAgLTEwOSw2ICsxMDksNTcgQEAKIGRlbC13b3JkLWxlZnQ9PEFsdC1LZXktQmFja1NwYWNlPgogZGVsLXdvcmQtcmlnaHQ9PEFsdC1LZXktZD4KIAorW0lETEUgTW9kZXJuIFVuaXhdCitjb3B5ID0gPENvbnRyb2wtU2hpZnQtS2V5LUM+IDxDb250cm9sLUtleS1JbnNlcnQ+CitjdXQgPSA8Q29udHJvbC1LZXkteD4gPFNoaWZ0LUtleS1EZWxldGU+CitwYXN0ZSA9IDxDb250cm9sLUtleS12PiA8U2hpZnQtS2V5LUluc2VydD4KK2JlZ2lubmluZy1vZi1saW5lID0gPEtleS1Ib21lPgorY2VudGVyLWluc2VydCA9IDxDb250cm9sLUtleS1sPgorY2xvc2UtYWxsLXdpbmRvd3MgPSA8Q29udHJvbC1LZXktcT4KK2Nsb3NlLXdpbmRvdyA9IDxDb250cm9sLUtleS13PiA8Q29udHJvbC1TaGlmdC1LZXktVz4KK2RvLW5vdGhpbmcgPSA8Q29udHJvbC1LZXktRjEyPgorZW5kLW9mLWZpbGUgPSA8Q29udHJvbC1LZXktZD4KK2hpc3RvcnktbmV4dCA9IDxBbHQtS2V5LW4+IDxNZXRhLUtleS1uPgoraGlzdG9yeS1wcmV2aW91cyA9IDxBbHQtS2V5LXA+IDxNZXRhLUtleS1wPgoraW50ZXJydXB0LWV4ZWN1dGlvbiA9IDxDb250cm9sLUtleS1jPgordmlldy1yZXN0YXJ0ID0gPEtleS1GNj4KK3Jlc3RhcnQtc2hlbGwgPSA8Q29udHJvbC1LZXktRjY+CitvcGVuLWNsYXNzLWJyb3dzZXIgPSA8Q29udHJvbC1LZXktYj4KK29wZW4tbW9kdWxlID0gPENvbnRyb2wtS2V5LW0+CitvcGVuLW5ldy13aW5kb3cgPSA8Q29udHJvbC1LZXktbj4KK29wZW4td2luZG93LWZyb20tZmlsZSA9IDxDb250cm9sLUtleS1vPgorcGxhaW4tbmV3bGluZS1hbmQtaW5kZW50ID0gPENvbnRyb2wtS2V5LWo+CitwcmludC13aW5kb3cgPSA8Q29udHJvbC1LZXktcD4KK3B5dGhvbi1jb250ZXh0LWhlbHAgPSA8U2hpZnQtS2V5LUYxPgorcHl0aG9uLWRvY3MgPSA8S2V5LUYxPgorcmVkbyA9IDxDb250cm9sLVNoaWZ0LUtleS1aPgorcmVtb3ZlLXNlbGVjdGlvbiA9IDxLZXktRXNjYXBlPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlID0gPEFsdC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93LWFzLWZpbGUgPSA8Q29udHJvbC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93ID0gPENvbnRyb2wtS2V5LXM+CitzZWxlY3QtYWxsID0gPENvbnRyb2wtS2V5LWE+Cit0b2dnbGUtYXV0by1jb2xvcmluZyA9IDxDb250cm9sLUtleS1zbGFzaD4KK3VuZG8gPSA8Q29udHJvbC1LZXktej4KK2ZpbmQgPSA8Q29udHJvbC1LZXktZj4KK2ZpbmQtYWdhaW4gPSA8S2V5LUYzPgorZmluZC1pbi1maWxlcyA9IDxDb250cm9sLVNoaWZ0LUtleS1mPgorZmluZC1zZWxlY3Rpb24gPSA8Q29udHJvbC1LZXktaD4KK3JlcGxhY2UgPSA8Q29udHJvbC1LZXktcj4KK2dvdG8tbGluZSA9IDxDb250cm9sLUtleS1nPgorc21hcnQtYmFja3NwYWNlID0gPEtleS1CYWNrU3BhY2U+CituZXdsaW5lLWFuZC1pbmRlbnQgPSA8S2V5LVJldHVybj4gPEtleS1LUF9FbnRlcj4KK3NtYXJ0LWluZGVudCA9IDxLZXktVGFiPgoraW5kZW50LXJlZ2lvbiA9IDxDb250cm9sLUtleS1icmFja2V0cmlnaHQ+CitkZWRlbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LWJyYWNrZXRsZWZ0PgorY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktZD4KK3VuY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1TaGlmdC1LZXktRD4KK3RhYmlmeS1yZWdpb24gPSA8QWx0LUtleS01PgordW50YWJpZnktcmVnaW9uID0gPEFsdC1LZXktNj4KK3RvZ2dsZS10YWJzID0gPENvbnRyb2wtS2V5LVQ+CitjaGFuZ2UtaW5kZW50d2lkdGggPSA8QWx0LUtleS11PgorZGVsLXdvcmQtbGVmdCA9IDxDb250cm9sLUtleS1CYWNrU3BhY2U+CitkZWwtd29yZC1yaWdodCA9IDxDb250cm9sLUtleS1EZWxldGU+CisKIFtJRExFIENsYXNzaWMgTWFjXQogY29weT08Q29tbWFuZC1LZXktYz4KIGN1dD08Q29tbWFuZC1LZXkteD4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZiBiL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgppbmRleCA4ZWJiYzFiLi5hNjFiYmE3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCkBAIC03MCw3ICs3MCw5IEBACiAKIFtLZXlzXQogZGVmYXVsdD0gMQotbmFtZT0gSURMRSBDbGFzc2ljIFdpbmRvd3MKK25hbWU9CituYW1lMj0KKyMgbmFtZTIgc2V0IGluIHVzZXIgY29uZmlnLW1haW4uY2ZnIGZvciBrZXlzIGFkZGVkIGFmdGVyIDIwMTYgSnVseSAxCiAKIFtIaXN0b3J5XQogY3ljbGljPTEKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkgYi9MaWIvaWRsZWxpYi9jb25maWcucHkKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29uZmlnLnB5CmluZGV4IDg5NTQ0ODguLjEwZmUzYmEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLnB5CkBAIC03LDcgKzcsNyBAQAogYW5kIGlmIGEgZmlsZSBiZWNvbWVzIGVtcHR5LCBpdCB3aWxsIGJlIGRlbGV0ZWQuCiAKIFRoZSBjb250ZW50cyBvZiB0aGUgdXNlciBmaWxlcyBtYXkgYmUgYWx0ZXJlZCB1c2luZyB0aGUgT3B0aW9ucy9Db25maWd1cmUgSURMRQotbWVudSB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gR1VJIChjb25maWdEaWFsb2cucHkpLCBvciBtYW51YWxseS4KK21lbnUgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIEdVSSAoY29uZmlnZGlhbG9nLnB5KSwgb3IgbWFudWFsbHkuCiAKIFRocm91Z2hvdXQgdGhpcyBtb2R1bGUgdGhlcmUgaXMgYW4gZW1waGFzaXMgb24gcmV0dXJuaW5nIHVzZWFibGUgZGVmYXVsdHMKIHdoZW4gYSBwcm9ibGVtIG9jY3VycyBpbiByZXR1cm5pbmcgYSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiB2YWx1ZSBiYWNrIHRvCkBAIC0xOCwxMSArMTgsMTAgQEAKICIiIgogIyBUT0RPcyBhZGRlZCBPY3QgMjAxNCwgdGpyCiAKK2Zyb20gY29uZmlncGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCi1mcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrVmVyc2lvbgogZnJvbSB0a2ludGVyLmZvbnQgaW1wb3J0IEZvbnQsIG5hbWV0b2ZvbnQKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjMwLDE1ICsyMjksMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlLCByYXc9cmF3KQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBpbnZhbGlkICVyIHZhbHVlIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbiAlclxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20gc2VjdGlvbiAlcjogJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUsIG9wdGlvbiwgc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1yYXcpKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldCgKQEAgLTI0NywxNSArMjQzLDEyIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICNyZXR1cm5pbmcgZGVmYXVsdCwgcHJpbnQgd2FybmluZwogICAgICAgICBpZiB3YXJuX29uX2RlZmF1bHQ6Ci0gICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9uICVyXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyLlxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlcicgJQogICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uLCBzZWN0aW9uLCBkZWZhdWx0KSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHJldHVybiBkZWZhdWx0CiAKICAgICBkZWYgU2V0T3B0aW9uKHNlbGYsIGNvbmZpZ1R5cGUsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpOgpAQCAtMzU4LDUyICszNTEsNzMgQEAKICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWU6CiAgICAgICAgICAgICBpZiBub3QgY2ZnUGFyc2VyLmhhc19vcHRpb24odGhlbWVOYW1lLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAjIFByaW50IHdhcm5pbmcgdGhhdCB3aWxsIHJldHVybiBhIGRlZmF1bHQgY29sb3IKLSAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLklkbGVDb25mLkdldFRoZW1lRGljdCcKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWcuSWRsZUNvbmYuR2V0VGhlbWVEaWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIHRoZW1lIGVsZW1lbnQgJXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSB0aGVtZSAlci5cbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgY29sb3I6ICVyJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudCwgdGhlbWVOYW1lLCB0aGVtZVtlbGVtZW50XSkpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCAnaGlnaGxpZ2h0JywgdGhlbWVOYW1lLCBlbGVtZW50KQogICAgICAgICAgICAgdGhlbWVbZWxlbWVudF0gPSBjZmdQYXJzZXIuR2V0KAogICAgICAgICAgICAgICAgICAgICB0aGVtZU5hbWUsIGVsZW1lbnQsIGRlZmF1bHQ9dGhlbWVbZWxlbWVudF0pCiAgICAgICAgIHJldHVybiB0aGVtZQogCiAgICAgZGVmIEN1cnJlbnRUaGVtZShzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRleHQgY29sb3IgdGhlbWUuCisgICAgICAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGV4dCBjb2xvciB0aGVtZS4iCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKCdUaGVtZScpCiAKLSAgICAgICAgaWRsZWxpYi5jb25maWctbWFpbi5kZWYgaW5jbHVkZXMgdGhpcyBzZWN0aW9uCisgICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5IHNldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jb2xvcnNfYW5kX2tleXMoJ0tleXMnKQorCisgICAgZGVmIGN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgbmFtZSBmb3IgVGhlbWUgb3IgS2V5cyBzZWN0aW9uLgorCisgICAgICAgIGlkbGVsaWIuY29uZmlnLW1haW4uZGVmICgnZGVmYXVsdCcpIGluY2x1ZGVzIHRoZXNlIHNlY3Rpb25zCisKICAgICAgICAgW1RoZW1lXQogICAgICAgICBkZWZhdWx0PSAxCiAgICAgICAgIG5hbWU9IElETEUgQ2xhc3NpYwogICAgICAgICBuYW1lMj0KLSAgICAgICAgIyBuYW1lMiBzZXQgaW4gdXNlciBjb25maWctbWFpbi5jZmcgZm9yIHRoZW1lcyBhZGRlZCBhZnRlciAyMDE1IE9jdCAxCiAKLSAgICAgICAgSXRlbSBuYW1lMiBpcyBuZWVkZWQgYmVjYXVzZSBzZXR0aW5nIG5hbWUgdG8gYSBuZXcgYnVpbHRpbgotICAgICAgICBjYXVzZXMgb2xkZXIgSURMRXMgdG8gZGlzcGxheSBtdWx0aXBsZSBlcnJvciBtZXNzYWdlcyBvciBxdWl0LgorICAgICAgICBbS2V5c10KKyAgICAgICAgZGVmYXVsdD0gMQorICAgICAgICBuYW1lPQorICAgICAgICBuYW1lMj0KKworICAgICAgICBJdGVtICduYW1lMicsIGlzIHVzZWQgZm9yIGJ1aWx0LWluICgnZGVmYXVsdCcpIHRoZW1lcyBhbmQga2V5cworICAgICAgICBhZGRlZCBhZnRlciAyMDE1IE9jdCAxIGFuZCAyMDE2IEp1bHkgMS4gIFRoaXMga2x1ZGdlIGlzIG5lZWRlZAorICAgICAgICBiZWNhdXNlIHNldHRpbmcgJ25hbWUnIHRvIGEgYnVpbHRpbiBub3QgZGVmaW5lZCBpbiBvbGRlciBJRExFcworICAgICAgICB0byBkaXNwbGF5IG11bHRpcGxlIGVycm9yIG1lc3NhZ2VzIG9yIHF1aXQuCiAgICAgICAgIFNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI1MzEzLgotICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCBuYW1lMiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmFtZSwKLSAgICAgICAgd2hpbGUgb2xkZXIgSURMRXMgd2lsbCBqdXN0IHVzZSBuYW1lLgorICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCAnbmFtZTInIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAnbmFtZScsCisgICAgICAgIHdoaWxlIG9sZGVyIElETEVzIHdpbGwganVzdCB1c2UgbmFtZS4gIFdoZW4gZGVmYXVsdCA9IEZhbHNlLAorICAgICAgICAnbmFtZTInIG1heSBzdGlsbCBiZSBzZXQsIGJ1dCBpdCBpcyBpZ25vcmVkLgogICAgICAgICAiIiIKLSAgICAgICAgZGVmYXVsdCA9IHNlbGYuR2V0T3B0aW9uKCdtYWluJywgJ1RoZW1lJywgJ2RlZmF1bHQnLAorICAgICAgICBjZmduYW1lID0gJ2hpZ2hsaWdodCcgaWYgc2VjdGlvbiA9PSAnVGhlbWUnIGVsc2UgJ2tleXMnCisgICAgICAgIGRlZmF1bHQgPSBzZWxmLkdldE9wdGlvbignbWFpbicsIHNlY3Rpb24sICdkZWZhdWx0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2Jvb2wnLCBkZWZhdWx0PVRydWUpCisgICAgICAgIG5hbWUgPSAnJwogICAgICAgICBpZiBkZWZhdWx0OgotICAgICAgICAgICAgdGhlbWUgPSBzZWxmLkdldE9wdGlvbignbWFpbicsICdUaGVtZScsICduYW1lMicsIGRlZmF1bHQ9JycpCi0gICAgICAgIGlmIGRlZmF1bHQgYW5kIG5vdCB0aGVtZSBvciBub3QgZGVmYXVsdDoKLSAgICAgICAgICAgIHRoZW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScsIGRlZmF1bHQ9JycpCi0gICAgICAgIHNvdXJjZSA9IHNlbGYuZGVmYXVsdENmZyBpZiBkZWZhdWx0IGVsc2Ugc2VsZi51c2VyQ2ZnCi0gICAgICAgIGlmIHNvdXJjZVsnaGlnaGxpZ2h0J10uaGFzX3NlY3Rpb24odGhlbWUpOgotICAgICAgICAgICAgcmV0dXJuIHRoZW1lCisgICAgICAgICAgICBuYW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCBzZWN0aW9uLCAnbmFtZTInLCBkZWZhdWx0PScnKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLkdldE9wdGlvbignbWFpbicsIHNlY3Rpb24sICduYW1lJywgZGVmYXVsdD0nJykKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuZGVmYXVsdENmZyBpZiBkZWZhdWx0IGVsc2Ugc2VsZi51c2VyQ2ZnCisgICAgICAgICAgICBpZiBzb3VyY2VbY2ZnbmFtZV0uaGFzX3NlY3Rpb24obmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICAgICAgcmV0dXJuICJJRExFIENsYXNzaWMiIGlmIHNlY3Rpb24gPT0gJ1RoZW1lJyBlbHNlIHNlbGYuZGVmYXVsdF9rZXlzKCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZGVmYXVsdF9rZXlzKCk6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICByZXR1cm4gJ0lETEUgQ2xhc3NpYyBXaW5kb3dzJworICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHJldHVybiAnSURMRSBDbGFzc2ljIE9TWCcKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiAiSURMRSBDbGFzc2ljIgorICAgICAgICAgICAgcmV0dXJuICdJRExFIE1vZGVybiBVbml4JwogCi0gICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgotICAgICAgICAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleSBzZXQuIgotICAgICAgICByZXR1cm4gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnS2V5cycsICduYW1lJywgZGVmYXVsdD0nJykKLQotICAgIGRlZiBHZXRFeHRlbnNpb25zKHNlbGYsIGFjdGl2ZV9vbmx5PVRydWUsIGVkaXRvcl9vbmx5PUZhbHNlLCBzaGVsbF9vbmx5PUZhbHNlKToKKyAgICBkZWYgR2V0RXh0ZW5zaW9ucyhzZWxmLCBhY3RpdmVfb25seT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIGVkaXRvcl9vbmx5PUZhbHNlLCBzaGVsbF9vbmx5PUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGV4dGVuc2lvbnMgaW4gZGVmYXVsdCBhbmQgdXNlciBjb25maWctZXh0ZW5zaW9ucyBmaWxlcy4KIAogICAgICAgICBJZiBhY3RpdmVfb25seSBUcnVlLCBvbmx5IHJldHVybiBhY3RpdmUgKGVuYWJsZWQpIGV4dGVuc2lvbnMKQEAgLTQyMyw3ICs0MzcsNyBAQAogICAgICAgICAgICAgICAgIGlmIHNlbGYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywgZXh0biwgJ2VuYWJsZScsIGRlZmF1bHQ9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdib29sJyk6CiAgICAgICAgICAgICAgICAgICAgICN0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgZWRpdG9yX29ubHkgb3Igc2hlbGxfb25seTogICMgVE9ETyBpZiBib3RoLCBjb250cmFkaWN0b3J5CisgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5IG9yIHNoZWxsX29ubHk6ICAjIFRPRE8gYm90aCBUcnVlIGNvbnRyYWRpY3QKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJlbmFibGVfZWRpdG9yIgogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTUyOCw3ICs1NDIsOCBAQAogICAgICAgICBldmVudFN0ciAtIHZpcnR1YWwgZXZlbnQsIGluY2x1ZGluZyBicmFja2V0cywgYXMgaW4gJzw8ZXZlbnQ+PicuCiAgICAgICAgICIiIgogICAgICAgICBldmVudE5hbWUgPSBldmVudFN0clsyOi0yXSAjdHJpbSBvZmYgdGhlIGFuZ2xlIGJyYWNrZXRzCi0gICAgICAgIGJpbmRpbmcgPSBzZWxmLkdldE9wdGlvbigna2V5cycsIGtleVNldE5hbWUsIGV2ZW50TmFtZSwgZGVmYXVsdD0nJykuc3BsaXQoKQorICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRPcHRpb24oJ2tleXMnLCBrZXlTZXROYW1lLCBldmVudE5hbWUsIGRlZmF1bHQ9JycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuX29uX2RlZmF1bHQ9RmFsc2UpLnNwbGl0KCkKICAgICAgICAgcmV0dXJuIGJpbmRpbmcKIAogICAgIGRlZiBHZXRDdXJyZW50S2V5U2V0KHNlbGYpOgpAQCAtNjM5LDIwICs2NTQsMjggQEAKICAgICAgICAgICAgICc8PGRlbC13b3JkLXJpZ2h0Pj4nOiBbJzxDb250cm9sLUtleS1EZWxldGU+J10KICAgICAgICAgICAgIH0KICAgICAgICAgaWYga2V5U2V0TmFtZToKLSAgICAgICAgICAgIGZvciBldmVudCBpbiBrZXlCaW5kaW5nczoKLSAgICAgICAgICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRLZXlCaW5kaW5nKGtleVNldE5hbWUsIGV2ZW50KQotICAgICAgICAgICAgICAgIGlmIGJpbmRpbmc6Ci0gICAgICAgICAgICAgICAgICAgIGtleUJpbmRpbmdzW2V2ZW50XSA9IGJpbmRpbmcKLSAgICAgICAgICAgICAgICBlbHNlOiAjd2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgd2FybmluZz0oJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRDb3JlS2V5cycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1cbiBwcm9ibGVtIHJldHJpZXZpbmcga2V5IGJpbmRpbmcgZm9yIGV2ZW50ICVyJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbiBmcm9tIGtleSBzZXQgJXIuXG4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXInICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQsIGtleVNldE5hbWUsIGtleUJpbmRpbmdzW2V2ZW50XSkpCi0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHdhcm5pbmcsIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlckNmZ1sna2V5cyddLmhhc19zZWN0aW9uKGtleVNldE5hbWUpIG9yCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdENmZ1sna2V5cyddLmhhc19zZWN0aW9uKGtleVNldE5hbWUpKToKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKAorICAgICAgICAgICAgICAgICAgICAnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMgLVxuJworICAgICAgICAgICAgICAgICAgICAnIGtleSBzZXQgJXIgaXMgbm90IGRlZmluZWQsIHVzaW5nIGRlZmF1bHQgYmluZGluZ3MuJyAlCisgICAgICAgICAgICAgICAgICAgIChrZXlTZXROYW1lLCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgX3dhcm4od2FybmluZywgJ2tleXMnLCBrZXlTZXROYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5QmluZGluZ3M6CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBzZWxmLkdldEtleUJpbmRpbmcoa2V5U2V0TmFtZSwgZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIGlmIGJpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlCaW5kaW5nc1tldmVudF0gPSBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6ICN3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuIGEgZGVmYXVsdCwgcHJpbnQgd2FybmluZworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMgLVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGtleSBiaW5kaW5nIGZvciBldmVudCAlclxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBrZXkgc2V0ICVyLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LCBrZXlTZXROYW1lLCBrZXlCaW5kaW5nc1tldmVudF0pCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCAna2V5cycsIGtleVNldE5hbWUsIGV2ZW50KQogICAgICAgICByZXR1cm4ga2V5QmluZGluZ3MKIAogICAgIGRlZiBHZXRFeHRyYUhlbHBTb3VyY2VMaXN0KHNlbGYsIGNvbmZpZ1NldCk6CkBAIC03MTMsMTYgKzczNiwxMyBAQAogICAgICAgICBib2xkID0gc2VsZi5HZXRPcHRpb24oY29uZmlnVHlwZSwgc2VjdGlvbiwgJ2ZvbnQtYm9sZCcsIGRlZmF1bHQ9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2Jvb2wnKQogICAgICAgICBpZiAoZmFtaWx5ID09ICdUa0ZpeGVkRm9udCcpOgotICAgICAgICAgICAgaWYgVGtWZXJzaW9uIDwgOC41OgotICAgICAgICAgICAgICAgIGZhbWlseSA9ICdDb3VyaWVyJwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmID0gRm9udChuYW1lPSdUa0ZpeGVkRm9udCcsIGV4aXN0cz1UcnVlLCByb290PXJvb3QpCi0gICAgICAgICAgICAgICAgYWN0dWFsRm9udCA9IEZvbnQuYWN0dWFsKGYpCi0gICAgICAgICAgICAgICAgZmFtaWx5ID0gYWN0dWFsRm9udFsnZmFtaWx5J10KLSAgICAgICAgICAgICAgICBzaXplID0gYWN0dWFsRm9udFsnc2l6ZSddCi0gICAgICAgICAgICAgICAgaWYgc2l6ZSA8PSAwOgotICAgICAgICAgICAgICAgICAgICBzaXplID0gMTAgICMgaWYgZm9udCBpbiBwaXhlbHMsIGlnbm9yZSBhY3R1YWwgc2l6ZQotICAgICAgICAgICAgICAgIGJvbGQgPSBhY3R1YWxGb250Wyd3ZWlnaHQnXT09J2JvbGQnCisgICAgICAgICAgICBmID0gRm9udChuYW1lPSdUa0ZpeGVkRm9udCcsIGV4aXN0cz1UcnVlLCByb290PXJvb3QpCisgICAgICAgICAgICBhY3R1YWxGb250ID0gRm9udC5hY3R1YWwoZikKKyAgICAgICAgICAgIGZhbWlseSA9IGFjdHVhbEZvbnRbJ2ZhbWlseSddCisgICAgICAgICAgICBzaXplID0gYWN0dWFsRm9udFsnc2l6ZSddCisgICAgICAgICAgICBpZiBzaXplIDw9IDA6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDEwICAjIGlmIGZvbnQgaW4gcGl4ZWxzLCBpZ25vcmUgYWN0dWFsIHNpemUKKyAgICAgICAgICAgIGJvbGQgPSBhY3R1YWxGb250Wyd3ZWlnaHQnXSA9PSAnYm9sZCcKICAgICAgICAgcmV0dXJuIChmYW1pbHksIHNpemUsICdib2xkJyBpZiBib2xkIGVsc2UgJ25vcm1hbCcpCiAKICAgICBkZWYgTG9hZENmZ0ZpbGVzKHNlbGYpOgpAQCAtNzM5LDYgKzc1OSwxOCBAQAogCiBpZGxlQ29uZiA9IElkbGVDb25mKCkKIAorCitfd2FybmVkID0gc2V0KCkKK2RlZiBfd2Fybihtc2csICprZXkpOgorICAgIGtleSA9IChtc2csKSArIGtleQorICAgIGlmIGtleSBub3QgaW4gX3dhcm5lZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBfd2FybmVkLmFkZChrZXkpCisKKwogIyBUT0RPIFJldmlzZSB0ZXN0IG91dHB1dCwgd3JpdGUgZXhwYW5kZWQgdW5pdHRlc3QKICMKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4MTE4Li4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSJEaWFsb2cgdG8gc3BlY2lmeSBvciBlZGl0IHRoZSBwYXJhbWV0ZXJzIGZvciBhIHVzZXIgY29uZmlndXJlZCBoZWxwIHNvdXJjZS4iCi0KLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1pbXBvcnQgdGtpbnRlci5maWxlZGlhbG9nIGFzIHRrRmlsZURpYWxvZwotCi1jbGFzcyBHZXRIZWxwU291cmNlRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVudUl0ZW09JycsIGZpbGVQYXRoPScnLCBfaHRlc3Q9RmFsc2UpOgotICAgICAgICAiIiJHZXQgbWVudSBlbnRyeSBhbmQgdXJsLyBsb2NhbCBmaWxlIGxvY2F0aW9uIGZvciBBZGRpdGlvbmFsIEhlbHAKLQotICAgICAgICBVc2VyIHNlbGVjdHMgYSBuYW1lIGZvciB0aGUgSGVscCByZXNvdXJjZSBhbmQgcHJvdmlkZXMgYSB3ZWIgdXJsCi0gICAgICAgIG9yIGEgbG9jYWwgZmlsZSBhcyBpdHMgc291cmNlLiAgVGhlIHVzZXIgY2FuIGVudGVyIGEgdXJsIG9yIGJyb3dzZQotICAgICAgICBmb3IgdGhlIGZpbGUuCi0KLSAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKLSAgICAgICAgIiIiCi0gICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKLSAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLCB3aWR0aD1GQUxTRSkKLSAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKLSAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQotICAgICAgICBzZWxmLmdyYWJfc2V0KCkKLSAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2FuY2VsKQotICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKLSAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCi0gICAgICAgIHNlbGYubWVudS5zZXQobWVudUl0ZW0pCi0gICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZVBhdGgpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5Ci0gICAgICAgICNuZWVkcyB0byBiZSBkb25lIGhlcmUgc28gdGhhdCB0aGUgd2luZm9fcmVxd2lkdGggaXMgdmFsaWQKLSAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKLSAgICAgICAgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQuIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0LgotICAgICAgICBzZWxmLmdlb21ldHJ5KAotICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCi0gICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApKSkKLSAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKLSAgICAgICAgc2VsZi5iaW5kKCc8UmV0dXJuPicsIHNlbGYub2spCi0gICAgICAgIHNlbGYud2FpdF93aW5kb3coKQotCi0gICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgotICAgICAgICBzZWxmLm1lbnUgPSBTdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5wYXRoID0gU3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuZm9udFNpemUgPSBTdHJpbmdWYXIoc2VsZikKLSAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9R1JPT1ZFKQotICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBsYWJlbE1lbnUgPSBMYWJlbChzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nTWVudSBJdGVtOicpCi0gICAgICAgIHNlbGYuZW50cnlNZW51ID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLm1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MzApCi0gICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgIGxhYmVsUGF0aCA9IExhYmVsKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdIZWxwIEZpbGUgUGF0aDogRW50ZXIgVVJMIG9yIGJyb3dzZSBmb3IgZmlsZScpCi0gICAgICAgIHNlbGYuZW50cnlQYXRoID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9NDApCi0gICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgIGxhYmVsTWVudS5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKLSAgICAgICAgc2VsZi5lbnRyeU1lbnUucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIGxhYmVsUGF0aC5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKLSAgICAgICAgc2VsZi5lbnRyeVBhdGgucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IEJ1dHRvbihzZWxmLmZyYW1lTWFpbiwgdGV4dD0nQnJvd3NlJywgd2lkdGg9OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5icm93c2VfZmlsZSkKLSAgICAgICAgYnJvd3NlQnV0dG9uLnBhY2socGFkeT0zKQotICAgICAgICBmcmFtZUJ1dHRvbnMgPSBGcmFtZShzZWxmKQotICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQotICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nT0snLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTgsIGRlZmF1bHQ9QUNUSVZFLCAgY29tbWFuZD1zZWxmLm9rKQotICAgICAgICBzZWxmLmJ1dHRvbk9rLmdyaWQocm93PTAsIGNvbHVtbj0wLCBwYWR4PTUscGFkeT01KQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0NhbmNlbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCi0gICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLmdyaWQocm93PTAsIGNvbHVtbj0xLCBwYWR4PTUsIHBhZHk9NSkKLQotICAgIGRlZiBicm93c2VfZmlsZShzZWxmKToKLSAgICAgICAgZmlsZXR5cGVzID0gWwotICAgICAgICAgICAgKCJIVE1MIEZpbGVzIiwgIiouaHRtICouaHRtbCIsICJURVhUIiksCi0gICAgICAgICAgICAoIlBERiBGaWxlcyIsICIqLnBkZiIsICJURVhUIiksCi0gICAgICAgICAgICAoIldpbmRvd3MgSGVscCBGaWxlcyIsICIqLmNobSIpLAotICAgICAgICAgICAgKCJUZXh0IEZpbGVzIiwgIioudHh0IiwgIlRFWFQiKSwKLSAgICAgICAgICAgICgiQWxsIEZpbGVzIiwgIioiKV0KLSAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQotICAgICAgICBpZiBwYXRoOgotICAgICAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYmFzZSA9IE5vbmUKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6Ci0gICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuZXhlY3V0YWJsZSksICdEb2MnKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgIG9wZW5kaWFsb2cgPSB0a0ZpbGVEaWFsb2cuT3BlbihwYXJlbnQ9c2VsZiwgZmlsZXR5cGVzPWZpbGV0eXBlcykKLSAgICAgICAgZmlsZSA9IG9wZW5kaWFsb2cuc2hvdyhpbml0aWFsZGlyPWRpciwgaW5pdGlhbGZpbGU9YmFzZSkKLSAgICAgICAgaWYgZmlsZToKLSAgICAgICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZSkKLQotICAgIGRlZiBtZW51X29rKHNlbGYpOgotICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBhIHNlbnNpYmxlIG1lbnUgaXRlbSBuYW1lIgotICAgICAgICBtZW51X29rID0gVHJ1ZQotICAgICAgICBtZW51ID0gc2VsZi5tZW51LmdldCgpCi0gICAgICAgIG1lbnUuc3RyaXAoKQotICAgICAgICBpZiBub3QgbWVudToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J01lbnUgSXRlbSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG1lbnUgaXRlbSBzcGVjaWZpZWQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgICAgICBtZW51X29rID0gRmFsc2UKLSAgICAgICAgZWxpZiBsZW4obWVudSkgPiAzMDoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J01lbnUgSXRlbSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J01lbnUgaXRlbSB0b28gbG9uZzonCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuTGltaXQgMzAgY2hhcmFjdGVycy4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCi0gICAgICAgICAgICBtZW51X29rID0gRmFsc2UKLSAgICAgICAgcmV0dXJuIG1lbnVfb2sKLQotICAgIGRlZiBwYXRoX29rKHNlbGYpOgotICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBtZW51IGZpbGUgcGF0aCIKLSAgICAgICAgcGF0aF9vayA9IFRydWUKLSAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQotICAgICAgICBwYXRoLnN0cmlwKCkKLSAgICAgICAgaWYgbm90IHBhdGg6ICNubyBwYXRoIHNwZWNpZmllZAotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBQYXRoIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gaGVscCBmaWxlIHBhdGggc3BlY2lmaWVkLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKLSAgICAgICAgICAgIHBhdGhfb2sgPSBGYWxzZQotICAgICAgICBlbGlmIHBhdGguc3RhcnRzd2l0aCgoJ3d3dy4nLCAnaHR0cCcpKToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIHBhdGhbOjVdID09ICdmaWxlOic6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbNTpdCi0gICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBQYXRoIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0hlbHAgZmlsZSBwYXRoIGRvZXMgbm90IGV4aXN0LicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgICAgICBzZWxmLmVudHJ5UGF0aC5mb2N1c19zZXQoKQotICAgICAgICAgICAgICAgIHBhdGhfb2sgPSBGYWxzZQotICAgICAgICByZXR1cm4gcGF0aF9vawotCi0gICAgZGVmIG9rKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBpZiBzZWxmLm1lbnVfb2soKSBhbmQgc2VsZi5wYXRoX29rKCk6Ci0gICAgICAgICAgICBzZWxmLnJlc3VsdCA9IChzZWxmLm1lbnUuZ2V0KCkuc3RyaXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aC5nZXQoKS5zdHJpcCgpKQotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnJlc3VsdFsxXQotICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgoJ3d3dycsICdmaWxlOicsICdodHRwOicsICdodHRwczonKSk6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIE1hYyBTYWZhcmkgaW5zaXN0cyBvbiB1c2luZyB0aGUgVVJJIGZvcm0gZm9yIGxvY2FsIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gbGlzdChzZWxmLnJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRbMV0gPSAiZmlsZTovLyIgKyBwYXRoCi0gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi0gICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCi0gICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb25maWdfaGVscCcsCi0gICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCi0KLSAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KLSAgICBydW4oR2V0SGVscFNvdXJjZURpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzc4MzYuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0iIiIKLURpYWxvZyB0aGF0IGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBuZXcgY29uZmlnIGZpbGUgc2VjdGlvbiBuYW1lLgotVXNlZCB0byBnZXQgbmV3IGhpZ2hsaWdodCB0aGVtZSBhbmQga2V5YmluZGluZyBzZXQgbmFtZXMuCi1UaGUgJ3JldHVybiB2YWx1ZScgZm9yIHRoZSBkaWFsb2csIHVzZWQgdHdvIHBsYWNlZCBpbiBjb25maWdEaWFsb2cucHksCi1pcyB0aGUgLnJlc3VsdCBhdHRyaWJ1dGUgc2V0IGluIHRoZSBPayBhbmQgQ2FuY2VsIG1ldGhvZHMuCi0iIiIKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLQotY2xhc3MgR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB1c2VkX25hbWVzLCBfaHRlc3Q9RmFsc2UpOgotICAgICAgICAiIiIKLSAgICAgICAgbWVzc2FnZSAtIHN0cmluZywgaW5mb3JtYXRpb25hbCBtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgICAgdXNlZF9uYW1lcyAtIHN0cmluZyBjb2xsZWN0aW9uLCBuYW1lcyBhbHJlYWR5IGluIHVzZSBmb3IgdmFsaWRpdHkgY2hlY2sKLSAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKLSAgICAgICAgIiIiCi0gICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKLSAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLCB3aWR0aD1GQUxTRSkKLSAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKLSAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQotICAgICAgICBzZWxmLmdyYWJfc2V0KCkKLSAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuQ2FuY2VsKQotICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCi0gICAgICAgIHNlbGYudXNlZF9uYW1lcyA9IHVzZWRfbmFtZXMKLSAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQotICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQotICAgICAgICAjbmVlZHMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgdGhlIHdpbmZvX3JlcXdpZHRoIGlzIHZhbGlkCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8uY29uZmlnKHdpZHRoPXNlbGYuZnJhbWVNYWluLndpbmZvX3JlcXdpZHRoKCkpCi0gICAgICAgIHNlbGYuZ2VvbWV0cnkoCi0gICAgICAgICAgICAgICAgIislZCslZCIgJSAoCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eCgpICsKLSAgICAgICAgICAgICAgICAgICAgKHBhcmVudC53aW5mb193aWR0aCgpLzIgLSBzZWxmLndpbmZvX3JlcXdpZHRoKCkvMiksCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsKLSAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMiAtIHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9odGVzdCBlbHNlIDEwMCkKLSAgICAgICAgICAgICAgICApICkgICNjZW50cmUgZGlhbG9nIG92ZXIgcGFyZW50IChvciBiZWxvdyBodGVzdCBib3gpCi0gICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgICNnZW9tZXRyeSBzZXQsIHVuaGlkZQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKLQotICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKLSAgICAgICAgc2VsZi5uYW1lID0gU3RyaW5nVmFyKHNlbGYucGFyZW50KQotICAgICAgICBzZWxmLmZvbnRTaXplID0gU3RyaW5nVmFyKHNlbGYucGFyZW50KQotICAgICAgICBzZWxmLmZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsIGJvcmRlcndpZHRoPTIsIHJlbGllZj1TVU5LRU4pCi0gICAgICAgIHNlbGYuZnJhbWVNYWluLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8gPSBNZXNzYWdlKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAotICAgICAgICAgICAgICAgICAgICBwYWR4PTUsIHBhZHk9NSwgdGV4dD1zZWxmLm1lc3NhZ2UpICMsYXNwZWN0PTIwMCkKLSAgICAgICAgZW50cnlOYW1lID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLm5hbWUsIHdpZHRoPTMwKQotICAgICAgICBlbnRyeU5hbWUuZm9jdXNfc2V0KCkKLSAgICAgICAgc2VsZi5tZXNzYWdlSW5mby5wYWNrKHBhZHg9NSwgcGFkeT01KSAjLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBlbnRyeU5hbWUucGFjayhwYWR4PTUsIHBhZHk9NSkKLQotICAgICAgICBmcmFtZUJ1dHRvbnMgPSBGcmFtZShzZWxmLCBwYWR5PTIpCi0gICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NKQotICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nT2snLAotICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5PaykKLSAgICAgICAgc2VsZi5idXR0b25Pay5wYWNrKHNpZGU9TEVGVCwgcGFkeD01KQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0NhbmNlbCcsCi0gICAgICAgICAgICAgICAgd2lkdGg9OCwgY29tbWFuZD1zZWxmLkNhbmNlbCkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwucGFjayhzaWRlPVJJR0hULCBwYWR4PTUpCi0KLSAgICBkZWYgbmFtZV9vayhzZWxmKToKLSAgICAgICAgJycnIEFmdGVyIHN0cmlwcGluZyBlbnRlcmVkIG5hbWUsIGNoZWNrIHRoYXQgaXQgaXMgYSAgc2Vuc2libGUKLSAgICAgICAgQ29uZmlnUGFyc2VyIGZpbGUgc2VjdGlvbiBuYW1lLiBSZXR1cm4gaXQgaWYgaXQgaXMsICcnIGlmIG5vdC4KLSAgICAgICAgJycnCi0gICAgICAgIG5hbWUgPSBzZWxmLm5hbWUuZ2V0KCkuc3RyaXAoKQotICAgICAgICBpZiBub3QgbmFtZTogI25vIG5hbWUgc3BlY2lmaWVkCi0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbmFtZSBzcGVjaWZpZWQuJywgcGFyZW50PXNlbGYpCi0gICAgICAgIGVsaWYgbGVuKG5hbWUpPjMwOiAjbmFtZSB0b28gbG9uZwotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gJysKLSAgICAgICAgICAgICAgICAgICAgJzMwIGNoYXJhY3RlcnMuJywgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUaGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuJywgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgcmV0dXJuIG5hbWUKLQotICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgbmFtZSA9IHNlbGYubmFtZV9vaygpCi0gICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICBzZWxmLnJlc3VsdCA9IG5hbWUKLSAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLSAgICBkZWYgQ2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgotICAgICAgICBzZWxmLnJlc3VsdCA9ICcnCi0gICAgICAgIHNlbGYuZGVzdHJveSgpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb25maWdfbmFtZScsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQotCi0gICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCi0gICAgcnVuKEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29uZmlnX2tleS5weQppbmRleCBlNjQzOGJmLi4yNjAyMjkzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKQEAgLTIsMzEgKzIsMzUgQEAKIERpYWxvZyBmb3IgYnVpbGRpbmcgVGtpbnRlciBhY2NlbGVyYXRvciBrZXkgYmluZGluZ3MKICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiAKIGNsYXNzIEdldEtleXNEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxhY3Rpb24sY3VycmVudEtleVNlcXVlbmNlcyxfaHRlc3Q9RmFsc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBhY3Rpb24sIGN1cnJlbnRLZXlTZXF1ZW5jZXMsCisgICAgICAgICAgICAgICAgIF9odGVzdD1GYWxzZSwgX3V0ZXN0PUZhbHNlKToKICAgICAgICAgIiIiCiAgICAgICAgIGFjdGlvbiAtIHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgZXZlbnQgdGhlc2Uga2V5cyB3aWxsIGJlCiAgICAgICAgICAgICAgICAgIG1hcHBlZCB0bwogICAgICAgICBjdXJyZW50S2V5cyAtIGxpc3QsIGEgbGlzdCBvZiBhbGwga2V5IHNlcXVlbmNlIGxpc3RzIGN1cnJlbnRseSBtYXBwZWQKICAgICAgICAgICAgICAgICAgdG8gdmlydHVhbCBldmVudHMsIGZvciBvdmVybGFwIGNoZWNraW5nCisgICAgICAgIF91dGVzdCAtIGJvb2wsIGRvIG5vdCB3YWl0IHdoZW4gcnVubmluZyB1bml0dGVzdAogICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAogICAgICAgICAiIiIKICAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQogICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQotICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCiAgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCiAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKICAgICAgICAgc2VsZi5ncmFiX3NldCgpCiAgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi5hY3Rpb249YWN0aW9uCi0gICAgICAgIHNlbGYuY3VycmVudEtleVNlcXVlbmNlcz1jdXJyZW50S2V5U2VxdWVuY2VzCi0gICAgICAgIHNlbGYucmVzdWx0PScnCi0gICAgICAgIHNlbGYua2V5U3RyaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnRLZXlTZXF1ZW5jZXMgPSBjdXJyZW50S2V5U2VxdWVuY2VzCisgICAgICAgIHNlbGYucmVzdWx0ID0gJycKKyAgICAgICAgc2VsZi5rZXlTdHJpbmcgPSBTdHJpbmdWYXIoc2VsZikKICAgICAgICAgc2VsZi5rZXlTdHJpbmcuc2V0KCcnKQogICAgICAgICBzZWxmLlNldE1vZGlmaWVyc0ZvclBsYXRmb3JtKCkgIyBzZXQgc2VsZi5tb2RpZmllcnMsIHNlbGYubW9kaWZpZXJfbGFiZWwKICAgICAgICAgc2VsZi5tb2RpZmllcl92YXJzID0gW10KQEAgLTM3LDcgKzQxLDYgQEAKICAgICAgICAgc2VsZi5hZHZhbmNlZCA9IEZhbHNlCiAgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCiAgICAgICAgIHNlbGYuTG9hZEZpbmFsS2V5TGlzdCgpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CiAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCiAgICAgICAgIHNlbGYuZ2VvbWV0cnkoCiAgICAgICAgICAgICAgICAgIislZCslZCIgJSAoCkBAIC00Nyw4ICs1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApCiAgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKIAogICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgogICAgICAgICBmcmFtZU1haW4gPSBGcmFtZShzZWxmLGJvcmRlcndpZHRoPTIscmVsaWVmPVNVTktFTikKQEAgLTI2MSw2ICsyNjUsNyBAQAogICAgICAgICAgICAga2V5c09LID0gVHJ1ZQogICAgICAgICByZXR1cm4ga2V5c09LCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oR2V0S2V5c0RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQppbmRleCA1ZjViZDM2Li5mYTQ3YWFhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnZGlhbG9nLnB5CkBAIC0xMCwxOCArMTAsMTggQEAKIAogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLmNvbG9yY2hvb3NlciBhcyB0a0NvbG9yQ2hvb3NlcgogaW1wb3J0IHRraW50ZXIuZm9udCBhcyB0a0ZvbnQKK2ltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliLmR5bk9wdGlvbk1lbnVXaWRnZXQgaW1wb3J0IER5bk9wdGlvbk1lbnUKLWZyb20gaWRsZWxpYi5rZXliaW5kaW5nRGlhbG9nIGltcG9ydCBHZXRLZXlzRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cgaW1wb3J0IEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQgaW1wb3J0IEdldEhlbHBTb3VyY2VEaWFsb2cKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnX2tleSBpbXBvcnQgR2V0S2V5c0RpYWxvZworZnJvbSBpZGxlbGliLmR5bm9wdGlvbiBpbXBvcnQgRHluT3B0aW9uTWVudQorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYi5xdWVyeSBpbXBvcnQgU2VjdGlvbk5hbWUsIEhlbHBTb3VyY2UKIGZyb20gaWRsZWxpYi50YWJiZWRwYWdlcyBpbXBvcnQgVGFiYmVkUGFnZVNldAotZnJvbSBpZGxlbGliLnRleHRWaWV3IGltcG9ydCB2aWV3X3RleHQKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliLnRleHR2aWV3IGltcG9ydCB2aWV3X3RleHQKIAogY2xhc3MgQ29uZmlnRGlhbG9nKFRvcGxldmVsKToKIApAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICBzZWxmLmNyZWF0ZV9hY3Rpb25fYnV0dG9ucygpLnBhY2soc2lkZT1CT1RUT00pCiAKICAgICBkZWYgY3JlYXRlX2FjdGlvbl9idXR0b25zKHNlbGYpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDaGFuZ2luZyB0aGUgZGVmYXVsdCBwYWRkaW5nIG9uIE9TWCByZXN1bHRzIGluIHVucmVhZGFibGUKICAgICAgICAgICAgICMgdGV4dCBpbiB0aGUgYnV0dG9ucwogICAgICAgICAgICAgcGFkZGluZ0FyZ3MgPSB7fQpAQCAtMzQxLDYgKzM0MSw3IEBACiAgICAgICAgIGJ1dHRvblNhdmVDdXN0b21LZXlzID0gQnV0dG9uKAogICAgICAgICAgICAgICAgIGZyYW1lc1sxXSwgdGV4dD0nU2F2ZSBhcyBOZXcgQ3VzdG9tIEtleSBTZXQnLAogICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TYXZlQXNOZXdLZXlTZXQpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzID0gTGFiZWwoZnJhbWVzWzBdLCBiZD0yKQogCiAgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKICAgICAgICAgI2JvZHkKQEAgLTM2MSw2ICszNjIsNyBAQAogICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PVcrTlMpCiAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9TlNFVykKICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgc3RpY2t5PU5TRVcpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9TlNFVywgcGFkeD01LCBwYWR5PTUpCiAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBmcmFtZXNbMF0ucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKQEAgLTQ2NCwyNCArNDY2LDI0IEBACiAgICAgICAgIHJldHVybiBmcmFtZQogCiAgICAgZGVmIEF0dGFjaFZhckNhbGxiYWNrcyhzZWxmKToKLSAgICAgICAgc2VsZi5mb250U2l6ZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQotICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCi0gICAgICAgIHNlbGYuZm9udEJvbGQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKLSAgICAgICAgc2VsZi5zcGFjZU51bS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKLSAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY29sb3VyKQotICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUpCi0gICAgICAgIHNlbGYuY3VzdG9tVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCi0gICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4pCi0gICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldCkKLSAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCi0gICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMpCi0gICAgICAgIHNlbGYuY3VzdG9tS2V5cy50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21LZXlzKQotICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQotICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX3dpbldpZHRoKQotICAgICAgICBzZWxmLndpbkhlaWdodC50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF93aW5IZWlnaHQpCi0gICAgICAgIHNlbGYuc3RhcnR1cEVkaXQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCi0gICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYXV0b1NhdmUpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZW5jb2RpbmcpCisgICAgICAgIHNlbGYuZm9udFNpemUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQorICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKKyAgICAgICAgc2VsZi5mb250Qm9sZC50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCisgICAgICAgIHNlbGYuc3BhY2VOdW0udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKKyAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9jb2xvdXIpCisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpblRoZW1lKQorICAgICAgICBzZWxmLmN1c3RvbVRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF90aGVtZUlzQnVpbHRpbikKKyAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9oaWdobGlnaHRUYXJnZXQpCisgICAgICAgIHNlbGYua2V5QmluZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCisgICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluS2V5cykKKyAgICAgICAgc2VsZi5jdXN0b21LZXlzLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tS2V5cykKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQorICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luV2lkdGgpCisgICAgICAgIHNlbGYud2luSGVpZ2h0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luSGVpZ2h0KQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCisgICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9hdXRvU2F2ZSkKKyAgICAgICAgc2VsZi5lbmNvZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2VuY29kaW5nKQogCiAgICAgZGVmIHJlbW92ZV92YXJfY2FsbGJhY2tzKHNlbGYpOgogICAgICAgICAiUmVtb3ZlIGNhbGxiYWNrcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4iCkBAIC00OTIsNyArNDk0LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmtleUJpbmRpbmcsIHNlbGYuYnVpbHRpbktleXMsIHNlbGYuY3VzdG9tS2V5cywKICAgICAgICAgICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLCBzZWxmLndpbldpZHRoLCBzZWxmLndpbkhlaWdodCwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LCBzZWxmLmF1dG9TYXZlLCBzZWxmLmVuY29kaW5nLCk6Ci0gICAgICAgICAgICB2YXIudHJhY2VfdmRlbGV0ZSgndycsIHZhci50cmFjZV92aW5mbygpWzBdWzFdKQorICAgICAgICAgICAgdmFyLnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB2YXIudHJhY2VfaW5mbygpWzBdWzFdKQogCiAgICAgZGVmIFZhckNoYW5nZWRfZm9udChzZWxmLCAqcGFyYW1zKToKICAgICAgICAgJycnV2hlbiBvbmUgZm9udCBhdHRyaWJ1dGUgY2hhbmdlcywgc2F2ZSB0aGVtIGFsbCwgYXMgdGhleSBhcmUKQEAgLTUxNCwxMCArNTE2LDExIEBACiAgICAgICAgIHNlbGYuT25OZXdDb2xvdXJTZXQoKQogCiAgICAgZGVmIFZhckNoYW5nZWRfYnVpbHRpblRoZW1lKHNlbGYsICpwYXJhbXMpOgorICAgICAgICBvbGR0aGVtZXMgPSAoJ0lETEUgQ2xhc3NpYycsICdJRExFIE5ldycpCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKLSAgICAgICAgaWYgdmFsdWUgPT0gJ0lETEUgRGFyayc6Ci0gICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpICE9ICdJRExFIE5ldyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgJ0lETEUgQ2xhc3NpYycpCisgICAgICAgIGlmIHZhbHVlIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgb2xkdGhlbWVzWzBdKQogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lMicsIHZhbHVlKQogICAgICAgICAgICAgc2VsZi5uZXdfY3VzdG9tX3RoZW1lLmNvbmZpZyh0ZXh0PSdOZXcgdGhlbWUsIHNlZSBIZWxwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9JyM1MDAwMDAnKQpAQCAtNTU3LDggKzU2MCwyMyBAQAogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnZXh0ZW5zaW9ucycsIGV4dEtleWJpbmRTZWN0aW9uLCBldmVudCwgdmFsdWUpCiAKICAgICBkZWYgVmFyQ2hhbmdlZF9idWlsdGluS2V5cyhzZWxmLCAqcGFyYW1zKToKKyAgICAgICAgb2xka2V5cyA9ICgKKyAgICAgICAgICAgICdJRExFIENsYXNzaWMgV2luZG93cycsCisgICAgICAgICAgICAnSURMRSBDbGFzc2ljIFVuaXgnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBNYWMnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBPU1gnLAorICAgICAgICApCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluS2V5cy5nZXQoKQotICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIHZhbHVlKQorICAgICAgICBpZiB2YWx1ZSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgIGlmIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdLZXlzJywgJ25hbWUnKSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIG9sZGtleXNbMF0pCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCB2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PSdOZXcga2V5IHNldCwgc2VlIEhlbHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPScjNTAwMDAwJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCAnS2V5cycsICduYW1lJywgdmFsdWUpCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCAnJykKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PScnLCBmZz0nYmxhY2snKQogICAgICAgICBzZWxmLkxvYWRLZXlzTGlzdCh2YWx1ZSkKIAogICAgIGRlZiBWYXJDaGFuZ2VkX2N1c3RvbUtleXMoc2VsZiwgKnBhcmFtcyk6CkBAIC02ODMsNyArNzAxLDcgQEAKICAgICBkZWYgR2V0TmV3S2V5c05hbWUoc2VsZiwgbWVzc2FnZSk6CiAgICAgICAgIHVzZWROYW1lcyA9IChpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsICdrZXlzJykgKwogICAgICAgICAgICAgICAgIGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0JywgJ2tleXMnKSkKLSAgICAgICAgbmV3S2V5U2V0ID0gR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coCisgICAgICAgIG5ld0tleVNldCA9IFNlY3Rpb25OYW1lKAogICAgICAgICAgICAgICAgIHNlbGYsICdOZXcgQ3VzdG9tIEtleSBTZXQnLCBtZXNzYWdlLCB1c2VkTmFtZXMpLnJlc3VsdAogICAgICAgICByZXR1cm4gbmV3S2V5U2V0CiAKQEAgLTc2Nyw4ICs3ODUsMTAgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwgaXRlbUxpc3RbMF0pCiAgICAgICAgICNyZXZlcnQgdG8gZGVmYXVsdCBrZXkgc2V0Ci0gICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4uc2V0KGlkbGVDb25mLmRlZmF1bHRDZmdbJ21haW4nXS5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQotICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKSkKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKSkKICAgICAgICAgI3VzZXIgY2FuJ3QgYmFjayBvdXQgb2YgdGhlc2UgY2hhbmdlcywgdGhleSBtdXN0IGJlIGFwcGxpZWQgbm93CiAgICAgICAgIHNlbGYuU2F2ZUFsbENoYW5nZWRDb25maWdzKCkKICAgICAgICAgc2VsZi5BY3RpdmF0ZUNvbmZpZ0NoYW5nZXMoKQpAQCAtODM2LDcgKzg1Niw3IEBACiAgICAgZGVmIEdldE5ld1RoZW1lTmFtZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgdXNlZE5hbWVzID0gKGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywgJ2hpZ2hsaWdodCcpICsKICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsICdoaWdobGlnaHQnKSkKLSAgICAgICAgbmV3VGhlbWUgPSBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZygKKyAgICAgICAgbmV3VGhlbWUgPSBTZWN0aW9uTmFtZSgKICAgICAgICAgICAgICAgICBzZWxmLCAnTmV3IEN1c3RvbSBUaGVtZScsIG1lc3NhZ2UsIHVzZWROYW1lcykucmVzdWx0CiAgICAgICAgIHJldHVybiBuZXdUaGVtZQogCkBAIC05MzksNyArOTU5LDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKIAogICAgIGRlZiBIZWxwTGlzdEl0ZW1BZGQoc2VsZik6Ci0gICAgICAgIGhlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKHNlbGYsICdOZXcgSGVscCBTb3VyY2UnKS5yZXN1bHQKKyAgICAgICAgaGVscFNvdXJjZSA9IEhlbHBTb3VyY2Uoc2VsZiwgJ05ldyBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkucmVzdWx0CiAgICAgICAgIGlmIGhlbHBTb3VyY2U6CiAgICAgICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdC5hcHBlbmQoKGhlbHBTb3VyY2VbMF0sIGhlbHBTb3VyY2VbMV0pKQogICAgICAgICAgICAgc2VsZi5saXN0SGVscC5pbnNlcnQoRU5ELCBoZWxwU291cmNlWzBdKQpAQCAtOTQ5LDE2ICs5NzAsMTcgQEAKICAgICBkZWYgSGVscExpc3RJdGVtRWRpdChzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCiAgICAgICAgIGhlbHBTb3VyY2UgPSBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdCi0gICAgICAgIG5ld0hlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKAotICAgICAgICAgICAgICAgIHNlbGYsICdFZGl0IEhlbHAgU291cmNlJywgbWVudUl0ZW09aGVscFNvdXJjZVswXSwKLSAgICAgICAgICAgICAgICBmaWxlUGF0aD1oZWxwU291cmNlWzFdKS5yZXN1bHQKLSAgICAgICAgaWYgKG5vdCBuZXdIZWxwU291cmNlKSBvciAobmV3SGVscFNvdXJjZSA9PSBoZWxwU291cmNlKToKLSAgICAgICAgICAgIHJldHVybiAjbm8gY2hhbmdlcwotICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdID0gbmV3SGVscFNvdXJjZQotICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCi0gICAgICAgIHNlbGYubGlzdEhlbHAuaW5zZXJ0KGl0ZW1JbmRleCwgbmV3SGVscFNvdXJjZVswXSkKLSAgICAgICAgc2VsZi5VcGRhdGVVc2VySGVscENoYW5nZWRJdGVtcygpCi0gICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorICAgICAgICBuZXdIZWxwU291cmNlID0gSGVscFNvdXJjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCAnRWRpdCBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgbWVudWl0ZW09aGVscFNvdXJjZVswXSwKKyAgICAgICAgICAgICAgICBmaWxlcGF0aD1oZWxwU291cmNlWzFdLAorICAgICAgICAgICAgICAgICkucmVzdWx0CisgICAgICAgIGlmIG5ld0hlbHBTb3VyY2UgYW5kIG5ld0hlbHBTb3VyY2UgIT0gaGVscFNvdXJjZToKKyAgICAgICAgICAgIHNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF0gPSBuZXdIZWxwU291cmNlCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmluc2VydChpdGVtSW5kZXgsIG5ld0hlbHBTb3VyY2VbMF0pCisgICAgICAgICAgICBzZWxmLlVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKCkKKyAgICAgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQogCiAgICAgZGVmIEhlbHBMaXN0SXRlbVJlbW92ZShzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCkBAIC05OTYsNyArMTAxOCw4IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMjZm9udCBzaXplIGRyb3Bkb3duCiAgICAgICAgIHNlbGYub3B0TWVudUZvbnRTaXplLlNldE1lbnUoKCc3JywgJzgnLCAnOScsICcxMCcsICcxMScsICcxMicsICcxMycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNCcsICcxNicsICcxOCcsICcyMCcsICcyMicpLCBmb250U2l6ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNCcsICcxNicsICcxOCcsICcyMCcsICcyMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyNScsICcyOScsICczNCcsICc0MCcpLCBmb250U2l6ZSApCiAgICAgICAgICMjZm9udFdlaWdodAogICAgICAgICBzZWxmLmZvbnRCb2xkLnNldChmb250Qm9sZCkKICAgICAgICAgIyNmb250IHNhbXBsZQpAQCAtMTA2NSw3ICsxMDg4LDcgQEAKICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwgY3VycmVudE9wdGlvbikKICAgICAgICAgICAgIGl0ZW1MaXN0ID0gaWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCAna2V5cycpCiAgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKLSAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsIGl0ZW1MaXN0WzBdKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW4uU2V0TWVudShpdGVtTGlzdCwgaWRsZUNvbmYuZGVmYXVsdF9rZXlzKCkpCiAgICAgICAgIHNlbGYuU2V0S2V5c1R5cGUoKQogICAgICAgICAjI2xvYWQga2V5c2V0IGVsZW1lbnQgbGlzdAogICAgICAgICBrZXlTZXROYW1lID0gaWRsZUNvbmYuQ3VycmVudEtleXMoKQpAQCAtMTM2NywxMiArMTM5MCwxOCBAQAogW0NhbmNlbF0gb25seSBjYW5jZWxzIGNoYW5nZXMgbWFkZSBzaW5jZSB0aGUgbGFzdCBzYXZlLgogJycnCiBoZWxwX3BhZ2VzID0gewotICAgICdIaWdobGlnaHRpbmcnOicnJworICAgICdIaWdobGlnaHRpbmcnOiAnJycKIEhpZ2hsaWdodGluZzoKIFRoZSBJRExFIERhcmsgY29sb3IgdGhlbWUgaXMgbmV3IGluIE9jdG9iZXIgMjAxNS4gIEl0IGNhbiBvbmx5CiBiZSB1c2VkIHdpdGggb2xkZXIgSURMRSByZWxlYXNlcyBpZiBpdCBpcyBzYXZlZCBhcyBhIGN1c3RvbQogdGhlbWUsIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4KLScnJworJycnLAorICAgICdLZXlzJzogJycnCitLZXlzOgorVGhlIElETEUgTW9kZXJuIFVuaXgga2V5IHNldCBpcyBuZXcgaW4gSnVuZSAyMDE2LiAgSXQgY2FuIG9ubHkKK2JlIHVzZWQgd2l0aCBvbGRlciBJRExFIHJlbGVhc2VzIGlmIGl0IGlzIHNhdmVkIGFzIGEgY3VzdG9tCitrZXkgc2V0LCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuCisnJycsCiB9CiAKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVidWdnZXIucHkKaW5kZXggZDVlMjE3ZC4uMTE0ZDBkMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdnZXIucHkKQEAgLTEsOSArMSwxMiBAQAotaW1wb3J0IG9zCiBpbXBvcnQgYmRiCitpbXBvcnQgb3MKKwogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKLWZyb20gaWRsZWxpYi5TY3JvbGxlZExpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKKworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYi5zY3JvbGxlZGxpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAorZnJvbSBpZGxlbGliLndpbmRvd3MgaW1wb3J0IExpc3RlZFRvcGxldmVsCiAKIAogY2xhc3MgSWRiKGJkYi5CZGIpOgpAQCAtMzQsOCArMzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcmV2X2ZyYW1lID0gZnJhbWUuZl9iYWNrCi0gICAgICAgICAgICBpZiBwcmV2X2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZS5jb3VudCgnRGVidWdnZXIucHknKToKLSAgICAgICAgICAgICAgICAjICh0aGF0IHRlc3Qgd2lsbCBjYXRjaCBib3RoIERlYnVnZ2VyLnB5IGFuZCBSZW1vdGVEZWJ1Z2dlci5weSkKKyAgICAgICAgICAgIHByZXZfbmFtZSA9IHByZXZfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBpZiAnaWRsZWxpYicgaW4gcHJldl9uYW1lIGFuZCAnZGVidWdnZXInIGluIHByZXZfbmFtZToKKyAgICAgICAgICAgICAgICAjIGNhdGNoIGJvdGggaWRsZWxpYi9kZWJ1Z2dlci5weSBhbmQgaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CisgICAgICAgICAgICAgICAgIyBvbiBib3RoIHBvc2l4IGFuZCB3aW5kb3dzCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbl9ycGNfY29kZShwcmV2X2ZyYW1lKQogCkBAIC0zNzAsNyArMzc1LDcgQEAKIGNsYXNzIFN0YWNrVmlld2VyKFNjcm9sbGVkTGlzdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBmbGlzdCwgZ3VpKToKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgICAgICMgQXQgbGVhc3Qgb24gd2l0aCB0aGUgc3RvY2sgQXF1YVRrIHZlcnNpb24gb24gT1NYIDEwLjQgeW91J2xsCiAgICAgICAgICAgICAjIGdldCBhIHNoYWtpbmcgR1VJIHRoYXQgZXZlbnR1YWxseSBraWxscyBJRExFIGlmIHRoZSB3aWR0aAogICAgICAgICAgICAgIyBhcmd1bWVudCBpcyBzcGVjaWZpZWQuCkBAIC01MDIsNyArNTA3LDcgQEAKICAgICAgICAgICAgICMKICAgICAgICAgICAgICMgVGhlcmUgaXMgYWxzbyBhbiBvYnNjdXJlIGJ1ZyBpbiBzb3J0ZWQoZGljdCkgd2hlcmUgdGhlCiAgICAgICAgICAgICAjIGludGVycHJldGVyIGdldHMgaW50byBhIGxvb3AgcmVxdWVzdGluZyBub24tZXhpc3RpbmcgZGljdFswXSwKLSAgICAgICAgICAgICMgZGljdFsxXSwgZGljdFsyXSwgZXRjIGZyb20gdGhlIFJlbW90ZURlYnVnZ2VyLkRpY3RQcm94eS4KKyAgICAgICAgICAgICMgZGljdFsxXSwgZGljdFsyXSwgZXRjIGZyb20gdGhlIGRlYnVnZ2VyX3IuRGljdFByb3h5LgogICAgICAgICAgICAgIyMjCiAgICAgICAgICAgICBrZXlzX2xpc3QgPSBkaWN0LmtleXMoKQogICAgICAgICAgICAgbmFtZXMgPSBzb3J0ZWQoa2V5c19saXN0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z2dlcl9yLnB5CmluZGV4IGJlMjI2MmYuLmJjOTcxMjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKQEAgLTIxLDcgKzIxLDcgQEAKICIiIgogCiBpbXBvcnQgdHlwZXMKLWZyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXIKIAogZGVidWdnaW5nID0gMAogCkBAIC0xODcsNyArMTg3LDcgQEAKIAogICAgICIiIgogICAgIGd1aV9wcm94eSA9IEdVSVByb3h5KHJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKLSAgICBpZGIgPSBEZWJ1Z2dlci5JZGIoZ3VpX3Byb3h5KQorICAgIGlkYiA9IGRlYnVnZ2VyLklkYihndWlfcHJveHkpCiAgICAgaWRiX2FkYXAgPSBJZGJBZGFwdGVyKGlkYikKICAgICBycGNoYW5kbGVyLnJlZ2lzdGVyKGlkYl9hZGFwX29pZCwgaWRiX2FkYXApCiAgICAgcmV0dXJuIGlkYl9hZGFwX29pZApAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgaWRiX2FkYXBfb2lkID0gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAic3RhcnRfdGhlX2RlYnVnZ2VyIixcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWlfYWRhcF9vaWQsKSwge30pCiAgICAgaWRiX3Byb3h5ID0gSWRiUHJveHkocnBjY2x0LCBweXNoZWxsLCBpZGJfYWRhcF9vaWQpCi0gICAgZ3VpID0gRGVidWdnZXIuRGVidWdnZXIocHlzaGVsbCwgaWRiX3Byb3h5KQorICAgIGd1aSA9IGRlYnVnZ2VyLkRlYnVnZ2VyKHB5c2hlbGwsIGlkYl9wcm94eSkKICAgICBndWlfYWRhcCA9IEdVSUFkYXB0ZXIocnBjY2x0LCBndWkpCiAgICAgcnBjY2x0LnJlZ2lzdGVyKGd1aV9hZGFwX29pZCwgZ3VpX2FkYXApCiAgICAgcmV0dXJuIGd1aQpAQCAtMzczLDcgKzM3Myw3IEBACiAgICAgUmVxdWVzdCB0aGF0IHRoZSBSUENTZXJ2ZXIgc2h1dCBkb3duIHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyIGFuZCBsaW5rLgogICAgIFVucmVnaXN0ZXIgdGhlIEdVSUFkYXB0ZXIsIHdoaWNoIHdpbGwgY2F1c2UgYSBHQyBvbiB0aGUgSWRsZSBwcm9jZXNzCiAgICAgZGVidWdnZXIgYW5kIFJQQyBsaW5rIG9iamVjdHMuICAoVGhlIHNlY29uZCByZWZlcmVuY2UgdG8gdGhlIGRlYnVnZ2VyIEdVSQotICAgIGlzIGRlbGV0ZWQgaW4gUHlTaGVsbC5jbG9zZV9yZW1vdGVfZGVidWdnZXIoKS4pCisgICAgaXMgZGVsZXRlZCBpbiBweXNoZWxsLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcigpLikKIAogICAgICIiIgogICAgIGNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIocnBjY2x0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnb2JqLnB5CnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlYnVnb2JqLnB5CmluZGV4IDdiNTdhYTQuLmI3MGIxM2MgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdvYmoucHkKQEAgLTgsMTMgKzgsMTAgQEAKIAogIyBYWFggVE8gRE86CiAjIC0gZm9yIGNsYXNzZXMvbW9kdWxlcywgYWRkICJvcGVuIHNvdXJjZSIgdG8gb2JqZWN0IGJyb3dzZXIKLQotaW1wb3J0IHJlCi0KLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbSwgVHJlZU5vZGUsIFNjcm9sbGVkQ2FudmFzCi0KIGZyb20gcmVwcmxpYiBpbXBvcnQgUmVwcgogCitmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZUl0ZW0sIFRyZWVOb2RlLCBTY3JvbGxlZENhbnZhcworCiBteXJlcHIgPSBSZXByKCkKIG15cmVwci5tYXhzdHJpbmcgPSAxMDAKIG15cmVwci5tYXhvdGhlciA9IDEwMApAQCAtMTIyLDIxICsxMTksMjAgQEAKICAgICByZXR1cm4gYyhsYWJlbHRleHQsIG9iamVjdCwgc2V0ZnVuY3Rpb24pCiAKIAotZGVmIF9vYmplY3RfYnJvd3NlcihwYXJlbnQpOgorZGVmIF9vYmplY3RfYnJvd3NlcihwYXJlbnQpOiAgIyBodGVzdCAjCiAgICAgaW1wb3J0IHN5cwotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgT2JqZWN0QnJvd3NlciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHJvb3QuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQotICAgIHJvb3QuZm9jdXNfc2V0KCkKLSAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBkZWJ1ZyBvYmplY3QgYnJvd3NlciIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4ICsgMTAwLCB5ICsgMTc1KSkKKyAgICB0b3AuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQorICAgIHRvcC5mb2N1c19zZXQoKQorICAgIHNjID0gU2Nyb2xsZWRDYW52YXModG9wLCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCiAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCiAgICAgaXRlbSA9IG1ha2Vfb2JqZWN0dHJlZWl0ZW0oInN5cyIsIHN5cykKICAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQogICAgIG5vZGUudXBkYXRlKCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9kZWJ1Z29ial9yLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z29ial9yLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9EZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9kZWxlZ2F0b3IucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0RlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVsZWdhdG9yLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5IGIvTGliL2lkbGVsaWIvZHlub3B0aW9uLnB5CnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2R5bm9wdGlvbi5weQppbmRleCA1MTViNGJhLi45YzZmZmE0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL2R5bm9wdGlvbi5weQpAQCAtMyw2ICszLDcgQEAKIGFuZCBzZXR0aW5nIG9mIGhpZ2hsaWdodHRoaWNrbmVzcwogIiIiCiBpbXBvcnQgY29weQorCiBmcm9tIHRraW50ZXIgaW1wb3J0IE9wdGlvbk1lbnUsIF9zZXRpdCwgU3RyaW5nVmFyLCBCdXR0b24KIAogY2xhc3MgRHluT3B0aW9uTWVudShPcHRpb25NZW51KToKQEAgLTM0LDEyICszNSwxMiBAQAogICAgICAgICAgICAgc2VsZi52YXJpYWJsZS5zZXQodmFsdWUpCiAKIGRlZiBfZHluX29wdGlvbl9tZW51KHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCAjICsgU3RyaW5nVmFyLCBCdXR0b24KIAotICAgIHRvcCA9IFRvcGxldmVsKCkKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXRzIGR5bmFtaWMgb3B0aW9uIG1lbnUiKQotICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkgKyAyMDAsCi0gICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAoeCArIDI1MCwgeSArIDE3NSkpCiAgICAgdG9wLmZvY3VzX3NldCgpCiAKICAgICB2YXIgPSBTdHJpbmdWYXIodG9wKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5IGIvTGliL2lkbGVsaWIvZWRpdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZWRpdG9yLnB5CmluZGV4IDk5NDRkYTMuLmFlNDc1Y2IgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9lZGl0b3IucHkKQEAgLTYsMjggKzYsMzQgQEAKIGltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IHN5cwotZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5zaW1wbGVkaWFsb2cgYXMgdGtTaW1wbGVEaWFsb2cKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CitpbXBvcnQgdG9rZW5pemUKIGltcG9ydCB0cmFjZWJhY2sKIGltcG9ydCB3ZWJicm93c2VyCiAKLWZyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKLWZyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hEaWFsb2cKLWZyb20gaWRsZWxpYiBpbXBvcnQgR3JlcERpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBSZXBsYWNlRGlhbG9nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5UGFyc2UKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZywgdGV4dFZpZXcsIGNvbmZpZ0RpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgoraW1wb3J0IHRraW50ZXIuc2ltcGxlZGlhbG9nIGFzIHRrU2ltcGxlRGlhbG9nCitpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdkaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZ3JlcAogZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCitmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4Citmcm9tIGlkbGVsaWIubXVsdGljYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCitmcm9tIGlkbGVsaWIgaW1wb3J0IHB5cGFyc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcmVwbGFjZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2gKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgd2luZG93cwogCiAjIFRoZSBkZWZhdWx0IHRhYiBzZXR0aW5nIGZvciBhIFRleHQgd2lkZ2V0LCBpbiBhdmVyYWdlLXdpZHRoIGNoYXJhY3RlcnMuCiBUS19UQUJXSURUSF9ERUZBVUxUID0gOAotCiBfcHlfdmVyc2lvbiA9ICcgKCVzKScgJSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAKKwogZGVmIF9zcGhpbnhfdmVyc2lvbigpOgogICAgICJGb3JtYXQgc3lzLnZlcnNpb25faW5mbyB0byBwcm9kdWNlIHRoZSBTcGhpbnggdmVyc2lvbiBzdHJpbmcgdXNlZCB0byBpbnN0YWxsIHRoZSBjaG0gZG9jcyIKICAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gc3lzLnZlcnNpb25faW5mbwpAQCAtNDAsNjMgKzQ2LDE2IEBACiAgICAgcmV0dXJuIHJlbGVhc2UKIAogCi1jbGFzcyBIZWxwRGlhbG9nKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gTm9uZSAgICAgICMgcGFyZW50IG9mIGhlbHAgd2luZG93Ci0gICAgICAgIHNlbGYuZGxnID0gTm9uZSAgICAgICAgICMgdGhlIGhlbHAgd2luZG93IGl0ZXNlbGYKLQotICAgIGRlZiBkaXNwbGF5KHNlbGYsIHBhcmVudCwgbmVhcj1Ob25lKToKLSAgICAgICAgIiIiIERpc3BsYXkgdGhlIGhlbHAgZGlhbG9nLgotCi0gICAgICAgICAgICBwYXJlbnQgLSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgaGVscCB3aW5kb3cKLQotICAgICAgICAgICAgbmVhciAtIGEgVG9wbGV2ZWwgd2lkZ2V0IChlLmcuIEVkaXRvcldpbmRvdyBvciBQeVNoZWxsKQotICAgICAgICAgICAgICAgICAgIHRvIHVzZSBhcyBhIHJlZmVyZW5jZSBmb3IgcGxhY2luZyB0aGUgaGVscCB3aW5kb3cKLSAgICAgICAgIiIiCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncyBhcyB3Ci0gICAgICAgIHcud2FybigiRWRpdG9yV2luZG93LkhlbHBEaWFsb2cgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS5cbiIKLSAgICAgICAgICAgICAgICJJdCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42IG9yIGxhdGVyLlxuIgotICAgICAgICAgICAgICAgIkl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHByaXZhdGUgaGVscC5IZWxwV2luZG93XG4iLAotICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICAgIGlmIHNlbGYuZGxnIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNob3dfZGlhbG9nKHBhcmVudCkKLSAgICAgICAgaWYgbmVhcjoKLSAgICAgICAgICAgIHNlbGYubmVhcndpbmRvdyhuZWFyKQotCi0gICAgZGVmIHNob3dfZGlhbG9nKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50Ci0gICAgICAgIGZuPW9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksJ2hlbHAudHh0JykKLSAgICAgICAgc2VsZi5kbGcgPSBkbGcgPSB0ZXh0Vmlldy52aWV3X2ZpbGUocGFyZW50LCdIZWxwJyxmbiwgbW9kYWw9RmFsc2UpCi0gICAgICAgIGRsZy5iaW5kKCc8RGVzdHJveT4nLCBzZWxmLmRlc3Ryb3ksICcrJykKLQotICAgIGRlZiBuZWFyd2luZG93KHNlbGYsIG5lYXIpOgotICAgICAgICAjIFBsYWNlIHRoZSBoZWxwIGRpYWxvZyBuZWFyIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGJ5IHBhcmVudC4KLSAgICAgICAgIyBOb3RlIC0gdGhpcyBtYXkgbm90IHJlcG9zaXRpb24gdGhlIHdpbmRvdyBpbiBNZXRhY2l0eQotICAgICAgICAjICBpZiAiL2FwcHMvbWV0YWNpdHkvZ2VuZXJhbC9kaXNhYmxlX3dvcmthcm91bmRzIiBpcyBlbmFibGVkCi0gICAgICAgIGRsZyA9IHNlbGYuZGxnCi0gICAgICAgIGdlb20gPSAobmVhci53aW5mb19yb290eCgpICsgMTAsIG5lYXIud2luZm9fcm9vdHkoKSArIDEwKQotICAgICAgICBkbGcud2l0aGRyYXcoKQotICAgICAgICBkbGcuZ2VvbWV0cnkoIj0rJWQrJWQiICUgZ2VvbSkKLSAgICAgICAgZGxnLmRlaWNvbmlmeSgpCi0gICAgICAgIGRsZy5saWZ0KCkKLQotICAgIGRlZiBkZXN0cm95KHNlbGYsIGV2PU5vbmUpOgotICAgICAgICBzZWxmLmRsZyA9IE5vbmUKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCi0KLWhlbHBEaWFsb2cgPSBIZWxwRGlhbG9nKCkgICMgc2luZ2xldG9uIGluc3RhbmNlLCBubyBsb25nZXIgdXNlZAotCi0KIGNsYXNzIEVkaXRvcldpbmRvdyhvYmplY3QpOgotICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi0gICAgZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCi0gICAgZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKLSAgICBmcm9tIGlkbGVsaWIuSU9CaW5kaW5nIGltcG9ydCBJT0JpbmRpbmcsIGZpbGVzeXN0ZW1lbmNvZGluZywgZW5jb2RpbmcKLSAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IEJpbmRpbmdzCisgICAgZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICBmcm9tIGlkbGVsaWIuY29sb3JpemVyIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCisgICAgZnJvbSBpZGxlbGliLnVuZG8gaW1wb3J0IFVuZG9EZWxlZ2F0b3IKKyAgICBmcm9tIGlkbGVsaWIuaW9tZW51IGltcG9ydCBJT0JpbmRpbmcsIGVuY29kaW5nCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBtYWlubWVudQogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKLSAgICBmcm9tIGlkbGVsaWIuTXVsdGlTdGF0dXNCYXIgaW1wb3J0IE11bHRpU3RhdHVzQmFyCisgICAgZnJvbSBpZGxlbGliLnN0YXR1c2JhciBpbXBvcnQgTXVsdGlTdGF0dXNCYXIKIAorICAgIGZpbGVzeXN0ZW1lbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSAgIyBmb3IgZmlsZSBuYW1lcwogICAgIGhlbHBfdXJsID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgpAQCAtMTM2LDExICs5NSwxMSBAQAogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICBzeXMucHMxID0gJz4+PiAnCiAgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnUocm9vdCkKLSAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBXaW5kb3dMaXN0Lkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQorICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IHdpbmRvd3MuTGlzdGVkVG9wbGV2ZWwocm9vdCwgbWVudT1zZWxmLm1lbnViYXIpCiAgICAgICAgIGlmIGZsaXN0OgogICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBmbGlzdC52YXJzCiAgICAgICAgICAgICAjc2VsZi50b3AuaW5zdGFuY2VfZGljdCBtYWtlcyBmbGlzdC5pbnZlcnNlZGljdCBhdmFpbGFibGUgdG8KLSAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhbmNlcworICAgICAgICAgICAgI2NvbmZpZ2RpYWxvZy5weSBzbyBpdCBjYW4gYWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFuY2VzCiAgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcwpAQCAtMTU4LDEzICsxMTcsMTAgQEAKICAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKICAgICAgICAgICAgICAgICAnaGlnaGxpZ2h0dGhpY2tuZXNzJzogMCwKICAgICAgICAgICAgICAgICAnd2lkdGgnOiBzZWxmLndpZHRoLAotICAgICAgICAgICAgICAgICdoZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnLCB0eXBlPSdpbnQnKX0KLSAgICAgICAgaWYgVGtWZXJzaW9uID49IDguNToKLSAgICAgICAgICAgICMgU3RhcnRpbmcgd2l0aCB0ayA4LjUgd2UgaGF2ZSB0byBzZXQgdGhlIG5ldyB0YWJzdHlsZSBvcHRpb24KLSAgICAgICAgICAgICMgdG8gJ3dvcmRwcm9jZXNzb3InIHRvIGFjaGlldmUgdGhlIHNhbWUgZGlzcGxheSBvZiB0YWJzIGFzIGluCi0gICAgICAgICAgICAjIG9sZGVyIHRrIHZlcnNpb25zLgotICAgICAgICAgICAgdGV4dF9vcHRpb25zWyd0YWJzdHlsZSddID0gJ3dvcmRwcm9jZXNzb3InCisgICAgICAgICAgICAgICAgJ3RhYnN0eWxlJzogJ3dvcmRwcm9jZXNzb3InLCAgIyBuZXcgaW4gOC41CisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGlkbGVDb25mLkdldE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICdtYWluJywgJ0VkaXRvcldpbmRvdycsICdoZWlnaHQnLCB0eXBlPSdpbnQnKSwKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKFRleHQpKHRleHRfZnJhbWUsICoqdGV4dF9vcHRpb25zKQogICAgICAgICBzZWxmLnRvcC5mb2N1c2VkX3dpZGdldCA9IHNlbGYudGV4dAogCkBAIC0xNzMsNyArMTI5LDcgQEAKIAogICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCiAgICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Utd2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDb21tYW5kLVcgb24gZWRpdG9yd2luZG93cyBkb2Vzbid0IHdvcmsgd2l0aG91dCB0aGlzLgogICAgICAgICAgICAgdGV4dC5iaW5kKCc8PGNsb3NlLXdpbmRvdz4+Jywgc2VsZi5jbG9zZV9ldmVudCkKICAgICAgICAgICAgICMgU29tZSBPUyBYIHN5c3RlbXMgaGF2ZSBvbmx5IG9uZSBtb3VzZSBidXR0b24sIHNvIHVzZQpAQCAtMzA5LDcgKzI2NSw3IEBACiAgICAgICAgICAgICAgICAgbWVudS5hZGRfc2VwYXJhdG9yKCkKICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxCiAgICAgICAgICAgICBzZWxmLndtZW51X2VuZCA9IGVuZAotICAgICAgICAgICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLnBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgICAgIHdpbmRvd3MucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAKICAgICAgICAgIyBTb21lIGFic3RyYWN0aW9ucyBzbyBJRExFIGV4dGVuc2lvbnMgYXJlIGNyb3NzLUlERQogICAgICAgICBzZWxmLmFza3llc25vID0gdGtNZXNzYWdlQm94LmFza3llc25vCkBAIC00MTgsNyArMzc0LDcgQEAKICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQogICAgICAgICAgICAgbWVudWRpY3RbbmFtZV0gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPW5hbWUsIHRlYXJvZmY9MCkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NhcmJvblRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NhcmJvblRrKCk6CiAgICAgICAgICAgICAjIEluc2VydCB0aGUgYXBwbGljYXRpb24gbWVudQogICAgICAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPSdhcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJvZmY9MCkKQEAgLTQzOSw3ICszOTUsNyBAQAogICAgICAgICAgICAgZW5kID0gLTEKICAgICAgICAgaWYgZW5kID4gc2VsZi53bWVudV9lbmQ6CiAgICAgICAgICAgICBtZW51LmRlbGV0ZShzZWxmLndtZW51X2VuZCsxLCBlbmQpCi0gICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgICAgICB3aW5kb3dzLmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKIAogICAgIHJtZW51ID0gTm9uZQogCkBAIC01MDcsMTcgKzQ2MywxNyBAQAogCiAgICAgZGVmIGFib3V0X2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBIZWxwICdBYm91dCBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuYWJvdXRfZGlhbG9nLgotICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhzZWxmLnRvcCwnQWJvdXQgSURMRScpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5hYm91dF9kaWFsb2cuCisgICAgICAgIGhlbHBfYWJvdXQuQWJvdXREaWFsb2coc2VsZi50b3AsJ0Fib3V0IElETEUnKQogCiAgICAgZGVmIGNvbmZpZ19kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgT3B0aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIG1hY29zeFN1cHBvcnQub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgotICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgorICAgICAgICBjb25maWdkaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCiAKICAgICBkZWYgaGVscF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnSURMRSBIZWxwJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuaGVscF9kaWFsb2cuCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5oZWxwX2RpYWxvZy4KICAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5yb290CiAgICAgICAgIGVsc2U6CkBAIC01OTAsMjMgKzU0NiwyMyBAQAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZChzZWxmLnRleHQpCisgICAgICAgIHNlYXJjaC5maW5kKHNlbGYudGV4dCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBmaW5kX2FnYWluX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9hZ2FpbihzZWxmLnRleHQpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKICAgICBkZWYgZmluZF9zZWxlY3Rpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfaW5fZmlsZXNfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBHcmVwRGlhbG9nLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQorICAgICAgICBncmVwLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIHJlcGxhY2VfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBSZXBsYWNlRGlhbG9nLnJlcGxhY2Uoc2VsZi50ZXh0KQorICAgICAgICByZXBsYWNlLnJlcGxhY2Uoc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGdvdG9fbGluZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC02MjIsNDYgKzU3OCwyNyBAQAogICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKIAogICAgIGRlZiBvcGVuX21vZHVsZShzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgIyBYWFggU2hvdWxkbid0IHRoaXMgYmUgaW4gSU9CaW5kaW5nPworICAgICAgICAiIiJHZXQgbW9kdWxlIG5hbWUgZnJvbSB1c2VyIGFuZCBvcGVuIGl0LgorCisgICAgICAgIFJldHVybiBtb2R1bGUgcGF0aCBvciBOb25lIGZvciBjYWxscyBieSBvcGVuX2NsYXNzX2Jyb3dzZXIKKyAgICAgICAgd2hlbiBsYXR0ZXIgaXMgbm90IGludm9rZWQgaW4gbmFtZWQgZWRpdG9yIHdpbmRvdy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIFRoaXMsIG9wZW5fY2xhc3NfYnJvd3NlciwgYW5kIG9wZW5fcGF0aF9icm93c2VyCisgICAgICAgICMgd291bGQgZml0IGJldHRlciBpbiBpb21lbnUuSU9CaW5kaW5nLgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuYW1lID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKS5zdHJpcCgpCiAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKLSAgICAgICAgICAgIG5hbWUgPSAiIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQotICAgICAgICBuYW1lID0gdGtTaW1wbGVEaWFsb2cuYXNrc3RyaW5nKCJNb2R1bGUiLAotICAgICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iCi0gICAgICAgICAgICAgICAgICJ0byBzZWFyY2ggb24gc3lzLnBhdGggYW5kIG9wZW46IiwKLSAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCwgaW5pdGlhbHZhbHVlPW5hbWUpCi0gICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCi0gICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW1wb3J0RXJyb3IpIGFzIG1zZzoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsIHN0cihtc2cpLCBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNwZWMgaXMgTm9uZToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsICJtb2R1bGUgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgaW1wb3J0bGliLmFiYy5Tb3VyY2VMb2FkZXIpOgotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwgIm5vdCBhIHNvdXJjZS1iYXNlZCBtb2R1bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGVfcGF0aCA9IHNwZWMubG9hZGVyLmdldF9maWxlbmFtZShuYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJbXBvcnQgZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2V0X2ZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmZsaXN0OgotICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuaW8ubG9hZGZpbGUoZmlsZV9wYXRoKQorICAgICAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZpbGVfcGF0aCA9IHF1ZXJ5Lk1vZHVsZU5hbWUoCisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LCAiT3BlbiBNb2R1bGUiLAorICAgICAgICAgICAgICAgICJFbnRlciB0aGUgbmFtZSBvZiBhIFB5dGhvbiBtb2R1bGVcbiIKKyAgICAgICAgICAgICAgICAidG8gc2VhcmNoIG9uIHN5cy5wYXRoIGFuZCBvcGVuOiIsCisgICAgICAgICAgICAgICAgbmFtZSkucmVzdWx0CisgICAgICAgIGlmIGZpbGVfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pby5sb2FkZmlsZShmaWxlX3BhdGgpCiAgICAgICAgIHJldHVybiBmaWxlX3BhdGgKIAogICAgIGRlZiBvcGVuX2NsYXNzX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CkBAIC02NzMsMTIgKzYxMCwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCh0YWlsKQotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IENsYXNzQnJvd3NlcgotICAgICAgICBDbGFzc0Jyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBicm93c2VyCisgICAgICAgIGJyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKIAogICAgIGRlZiBvcGVuX3BhdGhfYnJvd3NlcihzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgotICAgICAgICBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlcihzZWxmLmZsaXN0KQorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHBhdGhicm93c2VyCisgICAgICAgIHBhdGhicm93c2VyLlBhdGhCcm93c2VyKHNlbGYuZmxpc3QpCiAKICAgICBkZWYgb3Blbl90dXJ0bGVfZGVtbyhzZWxmLCBldmVudCA9IE5vbmUpOgogICAgICAgICBpbXBvcnQgc3VicHJvY2VzcwpAQCAtNzM5LDcgKzY3Niw3IEBACiAKICAgICBkZWYgUmVzZXRDb2xvcml6ZXIoc2VsZik6CiAgICAgICAgICJVcGRhdGUgdGhlIGNvbG9yIHRoZW1lIgotICAgICAgICAjIENhbGxlZCBmcm9tIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgYW5kIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgICMgQ2FsbGVkIGZyb20gc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vayBhbmQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgc2VsZi5fcm1jb2xvcml6ZXIoKQogICAgICAgICBzZWxmLl9hZGRjb2xvcml6ZXIoKQogICAgICAgICBFZGl0b3JXaW5kb3cuY29sb3JfY29uZmlnKHNlbGYudGV4dCkKQEAgLTc1OSwxNCArNjk2LDE0IEBACiAKICAgICBkZWYgUmVzZXRGb250KHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSB0ZXh0IHdpZGdldHMnIGZvbnQgaWYgaXQgaXMgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKIAogICAgICAgICBzZWxmLnRleHRbJ2ZvbnQnXSA9IGlkbGVDb25mLkdldEZvbnQoc2VsZi5yb290LCAnbWFpbicsJ0VkaXRvcldpbmRvdycpCiAKICAgICBkZWYgUmVtb3ZlS2V5YmluZGluZ3Moc2VsZik6CiAgICAgICAgICJSZW1vdmUgdGhlIGtleWJpbmRpbmdzIGJlZm9yZSB0aGV5IGFyZSBjaGFuZ2VkLiIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgogICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwgKmtleWxpc3QpCiAgICAgICAgIGZvciBleHRlbnNpb25OYW1lIGluIHNlbGYuZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcygpOgpAQCAtNzc3LDggKzcxNCw4IEBACiAKICAgICBkZWYgQXBwbHlLZXliaW5kaW5ncyhzZWxmKToKICAgICAgICAgIlVwZGF0ZSB0aGUga2V5YmluZGluZ3MgYWZ0ZXIgdGhleSBhcmUgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKCkKICAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CiAgICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpCkBAIC03ODYsNyArNzIzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKHhrZXlkZWZzKQogICAgICAgICAjdXBkYXRlIG1lbnUgYWNjZWxlcmF0b3JzCiAgICAgICAgIG1lbnVFdmVudERpY3QgPSB7fQotICAgICAgICBmb3IgbWVudSBpbiBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzOgorICAgICAgICBmb3IgbWVudSBpbiBzZWxmLm1haW5tZW51Lm1lbnVkZWZzOgogICAgICAgICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXSA9IHt9CiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBtZW51WzFdOgogICAgICAgICAgICAgICAgIGlmIGl0ZW06CkBAIC04MTMsNyArNzUwLDcgQEAKIAogICAgIGRlZiBzZXRfbm90YWJzX2luZGVudHdpZHRoKHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSBpbmRlbnR3aWR0aCBpZiBjaGFuZ2VkIGFuZCBub3QgdXNpbmcgdGFicyBpbiB0aGlzIHdpbmRvdyIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgaWYgbm90IHNlbGYudXNldGFiczoKICAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnSW5kZW50JywnbnVtLXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpCkBAIC05OTMsNyArOTMwLDcgQEAKICAgICBkZWYgX2Nsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOgogICAgICAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QobmV3X2ZpbGU9c2VsZi5pby5maWxlbmFtZSkKLSAgICAgICAgV2luZG93TGlzdC51bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQorICAgICAgICB3aW5kb3dzLnVucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAgICAgICAgIHNlbGYudW5sb2FkX2V4dGVuc2lvbnMoKQogICAgICAgICBzZWxmLmlvLmNsb3NlKCkKICAgICAgICAgc2VsZi5pbyA9IE5vbmUKQEAgLTEwMzEsMTIgKzk2OCwyNSBAQAogICAgIGRlZiBnZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKHNlbGYpOgogICAgICAgICByZXR1cm4gaWRsZUNvbmYuR2V0RXh0ZW5zaW9ucyhlZGl0b3Jfb25seT1UcnVlKQogCisgICAgZXh0ZmlsZXMgPSB7ICAjIG1hcCBjb25maWctZXh0ZW5zaW9uIHNlY3Rpb24gbmFtZXMgdG8gbmV3IGZpbGUgbmFtZXMKKyAgICAgICAgJ0F1dG9Db21wbGV0ZSc6ICdhdXRvY29tcGxldGUnLAorICAgICAgICAnQXV0b0V4cGFuZCc6ICdhdXRvZXhwYW5kJywKKyAgICAgICAgJ0NhbGxUaXBzJzogJ2NhbGx0aXBzJywKKyAgICAgICAgJ0NvZGVDb250ZXh0JzogJ2NvZGVjb250ZXh0JywKKyAgICAgICAgJ0Zvcm1hdFBhcmFncmFwaCc6ICdwYXJhZ3JhcGgnLAorICAgICAgICAnUGFyZW5NYXRjaCc6ICdwYXJlbm1hdGNoJywKKyAgICAgICAgJ1JzdHJpcEV4dGVuc2lvbic6ICdyc3RyaXAnLAorICAgICAgICAnU2NyaXB0QmluZGluZyc6ICdydW5zY3JpcHQnLAorICAgICAgICAnWm9vbUhlaWdodCc6ICd6b29taGVpZ2h0JywKKyAgICAgICAgfQorCiAgICAgZGVmIGxvYWRfZXh0ZW5zaW9uKHNlbGYsIG5hbWUpOgorICAgICAgICBmbmFtZSA9IHNlbGYuZXh0ZmlsZXMuZ2V0KG5hbWUsIG5hbWUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLicgKyBuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCcuJyArIGZuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQogICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShuYW1lKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGZuYW1lKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwcmludCgiXG5GYWlsZWQgdG8gaW1wb3J0IGV4dGVuc2lvbjogIiwgbmFtZSkKICAgICAgICAgICAgIHJhaXNlCkBAIC0xMDYwLDcgKzEwMTAsNyBAQAogCiAgICAgZGVmIGFwcGx5X2JpbmRpbmdzKHNlbGYsIGtleWRlZnM9Tm9uZSk6CiAgICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToKLSAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLkJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcworICAgICAgICAgICAga2V5ZGVmcyA9IHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgdGV4dC5rZXlkZWZzID0ga2V5ZGVmcwogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgpAQCAtMTA3Myw5ICsxMDIzLDkgQEAKICAgICAgICAgTWVudXMgdGhhdCBhcmUgYWJzZW50IG9yIE5vbmUgaW4gc2VsZi5tZW51ZGljdCBhcmUgaWdub3JlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG1lbnVkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBtZW51ZGVmcyA9IHNlbGYuQmluZGluZ3MubWVudWRlZnMKKyAgICAgICAgICAgIG1lbnVkZWZzID0gc2VsZi5tYWlubWVudS5tZW51ZGVmcwogICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcwogICAgICAgICBtZW51ZGljdCA9IHNlbGYubWVudWRpY3QKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAogICAgICAgICBmb3IgbW5hbWUsIGVudHJ5bGlzdCBpbiBtZW51ZGVmczoKQEAgLTEzMDIsNyArMTI1Miw3IEBACiAgICAgICAgICAgICAjIGFkanVzdCBpbmRlbnRhdGlvbiBmb3IgY29udGludWF0aW9ucyBhbmQgYmxvY2sKICAgICAgICAgICAgICMgb3Blbi9jbG9zZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIGxhc3Qgc3RtdAogICAgICAgICAgICAgbG5vID0gaW5kZXgybGluZSh0ZXh0LmluZGV4KCdpbnNlcnQnKSkKLSAgICAgICAgICAgIHkgPSBQeVBhcnNlLlBhcnNlcihzZWxmLmluZGVudHdpZHRoLCBzZWxmLnRhYndpZHRoKQorICAgICAgICAgICAgeSA9IHB5cGFyc2UuUGFyc2VyKHNlbGYuaW5kZW50d2lkdGgsIHNlbGYudGFid2lkdGgpCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb250ZXh0X3VzZV9wczE6CiAgICAgICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gc2VsZi5udW1fY29udGV4dF9saW5lczoKICAgICAgICAgICAgICAgICAgICAgc3RhcnRhdCA9IG1heChsbm8gLSBjb250ZXh0LCAxKQpAQCAtMTMyNiwyMiArMTI3NiwyMiBAQAogICAgICAgICAgICAgICAgIHkuc2V0X2xvKDApCiAKICAgICAgICAgICAgIGMgPSB5LmdldF9jb250aW51YXRpb25fdHlwZSgpCi0gICAgICAgICAgICBpZiBjICE9IFB5UGFyc2UuQ19OT05FOgorICAgICAgICAgICAgaWYgYyAhPSBweXBhcnNlLkNfTk9ORToKICAgICAgICAgICAgICAgICAjIFRoZSBjdXJyZW50IHN0bXQgaGFzbid0IGVuZGVkIHlldC4KLSAgICAgICAgICAgICAgICBpZiBjID09IFB5UGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKKyAgICAgICAgICAgICAgICBpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKICAgICAgICAgICAgICAgICAgICAgIyBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiBhIHN0cmluZzsgZG8gbm90IGluZGVudCBhdCBhbGwKICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfU1RSSU5HX05FWFRfTElORVM6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfTkVYVF9MSU5FUzoKICAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcgd2hpY2ggc3RhcnRlZCBiZWZvcmUgdGhpcyBsaW5lOwogICAgICAgICAgICAgICAgICAgICAjIGp1c3QgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50CiAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBpbmRlbnQpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CUkFDS0VUOgorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBweXBhcnNlLkNfQlJBQ0tFVDoKICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIHVwIHdpdGggdGhlIGZpcnN0IChpZiBhbnkpIGVsZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICMgbGFzdCBvcGVuIGJyYWNrZXQgc3RydWN0dXJlOyBlbHNlIGluZGVudCBvbmUKICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCBiZXlvbmQgdGhlIGluZGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAjIGxhc3Qgb3BlbiBicmFja2V0CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVpbmRlbnRfdG8oeS5jb21wdXRlX2JyYWNrZXRfaW5kZW50KCkpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CQUNLU0xBU0g6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19CQUNLU0xBU0g6CiAgICAgICAgICAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBsaW5lIGluIHRoaXMgc3RtdCBhbHJlYWR5LCBqdXN0CiAgICAgICAgICAgICAgICAgICAgICMgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50OyBlbHNlIGlmIGluaXRpYWwgbGluZQogICAgICAgICAgICAgICAgICAgICAjIGhhcyBhIHN0YXJ0IG9uIGFuIGFzc2lnbm1lbnQgc3RtdCwgaW5kZW50IHRvCkBAIC0xNTY5LDkgKzE1MTksNiBAQAogICAgICAgICAgICAgYnJlYWsKICAgICByZXR1cm4gcmF3LCBlZmZlY3RpdmUKIAotaW1wb3J0IHRva2VuaXplCi1fdG9rZW5pemUgPSB0b2tlbml6ZQotZGVsIHRva2VuaXplCiAKIGNsYXNzIEluZGVudFNlYXJjaGVyKG9iamVjdCk6CiAKQEAgLTE1OTYsOCArMTU0Myw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLnRleHQuZ2V0KG1hcmssIG1hcmsgKyAiIGxpbmVlbmQrMWMiKQogCiAgICAgZGVmIHRva2VuZWF0ZXIoc2VsZiwgdHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgSU5ERU5UPV90b2tlbml6ZS5JTkRFTlQsCi0gICAgICAgICAgICAgICAgICAgTkFNRT1fdG9rZW5pemUuTkFNRSwKKyAgICAgICAgICAgICAgICAgICBJTkRFTlQ9dG9rZW5pemUuSU5ERU5ULAorICAgICAgICAgICAgICAgICAgIE5BTUU9dG9rZW5pemUuTkFNRSwKICAgICAgICAgICAgICAgICAgICBPUEVORVJTPSgnY2xhc3MnLCAnZGVmJywgJ2ZvcicsICdpZicsICd0cnknLCAnd2hpbGUnKSk6CiAgICAgICAgIGlmIHNlbGYuZmluaXNoZWQ6CiAgICAgICAgICAgICBwYXNzCkBAIC0xNjA4LDE5ICsxNTU1LDE5IEBACiAgICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gMQogCiAgICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2F2ZV90YWJzaXplID0gX3Rva2VuaXplLnRhYnNpemUKLSAgICAgICAgX3Rva2VuaXplLnRhYnNpemUgPSBzZWxmLnRhYndpZHRoCisgICAgICAgIHNhdmVfdGFic2l6ZSA9IHRva2VuaXplLnRhYnNpemUKKyAgICAgICAgdG9rZW5pemUudGFic2l6ZSA9IHNlbGYudGFid2lkdGgKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRva2VucyA9IF90b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc2VsZi5yZWFkbGluZSkKKyAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc2VsZi5yZWFkbGluZSkKICAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuZWF0ZXIoKnRva2VuKQotICAgICAgICAgICAgZXhjZXB0IChfdG9rZW5pemUuVG9rZW5FcnJvciwgU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgZXhjZXB0ICh0b2tlbml6ZS5Ub2tlbkVycm9yLCBTeW50YXhFcnJvcik6CiAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBjdXQgb2ZmIHRoZSB0b2tlbml6ZXIgZWFybHksIHdlIGNhbiB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgIyBzcHVyaW91cyBlcnJvcnMKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBfdG9rZW5pemUudGFic2l6ZSA9IHNhdmVfdGFic2l6ZQorICAgICAgICAgICAgdG9rZW5pemUudGFic2l6ZSA9IHNhdmVfdGFic2l6ZQogICAgICAgICByZXR1cm4gc2VsZi5ibGtvcGVubGluZSwgc2VsZi5pbmRlbnRlZGxpbmUKIAogIyMjIGVuZCBhdXRvaW5kZW50IGNvZGUgIyMjCkBAIC0xNjQ0LDcgKzE1OTEsNyBAQAogICAgIGtleWxpc3QgPSBrZXlkZWZzLmdldChldmVudG5hbWUpCiAgICAgIyBpc3N1ZTEwOTQwOiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBwcmV2ZW50IGhhbmcgd2l0aCBPUyBYIENvY29hIFRrIDguNQogICAgICMgaWYgbm90IGtleWxpc3Q6Ci0gICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKSBhbmQgZXZlbnRuYW1lIGluIHsKKyAgICBpZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3guaXNDb2NvYVRrKCkgYW5kIGV2ZW50bmFtZSBpbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8b3Blbi1tb2R1bGU+PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8Z290by1saW5lPj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGNoYW5nZS1pbmRlbnR3aWR0aD4+In0pOgpAQCAtMTY3OSwxMiArMTYyNiwxNSBAQAogICAgICAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCiAgICAgZWxzZToKICAgICAgICAgZmlsZW5hbWUgPSBOb25lCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBOb25lKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBOb25lKQogICAgIGVkaXQgPSBFZGl0b3JXaW5kb3cocm9vdD1yb290LCBmaWxlbmFtZT1maWxlbmFtZSkKICAgICBlZGl0LnRleHQuYmluZCgiPDxjbG9zZS1hbGwtd2luZG93cz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKICAgICAjIERvZXMgbm90IHN0b3AgZXJyb3IsIG5laXRoZXIgZG9lcyBmb2xsb3dpbmcKICAgICAjIGVkaXQudGV4dC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2VkaXRvcicsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF9lZGl0b3Jfd2luZG93KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRmlsZUxpc3QucHkgYi9MaWIvaWRsZWxpYi9maWxlbGlzdC5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9GaWxlTGlzdC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKaW5kZXggYTk5ODlhOC4uZjQ2YWQ3YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRmlsZUxpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKQEAgLTEsNCArMSw1IEBACiBpbXBvcnQgb3MKKwogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogCkBAIC02LDcgKzcsNyBAQAogY2xhc3MgRmlsZUxpc3Q6CiAKICAgICAjIE4uQi4gdGhpcyBpbXBvcnQgb3ZlcnJpZGRlbiBpbiBQeVNoZWxsRmlsZUxpc3QuCi0gICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93CisgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKQEAgLTExMSw3ICsxMTIsNyBAQAogCiAKIGRlZiBfdGVzdCgpOgotICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IGZpeHdvcmRicmVha3MKKyAgICBmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBmaXh3b3JkYnJlYWtzCiAgICAgaW1wb3J0IHN5cwogICAgIHJvb3QgPSBUaygpCiAgICAgZml4d29yZGJyZWFrcyhyb290KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weSBiL0xpYi9pZGxlbGliL2dyZXAucHkKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZ3JlcC5weQppbmRleCA3MjFiMjMxLi42NGJhMjhkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9HcmVwRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2dyZXAucHkKQEAgLTEsMTcgKzEsMTkgQEAKLWltcG9ydCBvcwogaW1wb3J0IGZubWF0Y2gKLWltcG9ydCByZSAgIyBmb3IgaHRlc3QKK2ltcG9ydCBvcwogaW1wb3J0IHN5cwotZnJvbSB0a2ludGVyIGltcG9ydCBTdHJpbmdWYXIsIEJvb2xlYW5WYXIsIENoZWNrYnV0dG9uICAjIGZvciBHcmVwRGlhbG9nCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0LCBCdXR0b24sIFNFTCwgRU5EICAjIGZvciBodGVzdAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKLWZyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCi0jIEltcG9ydGluZyBPdXRwdXRXaW5kb3cgZmFpbHMgZHVlIHRvIGltcG9ydCBsb29wCisKK2Zyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBCb29sZWFuVmFyCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBDaGVja2J1dHRvbgorCitmcm9tIGlkbGVsaWIuc2VhcmNoYmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKKworIyBJbXBvcnRpbmcgT3V0cHV0V2luZG93IGhlcmUgZmFpbHMgZHVlIHRvIGltcG9ydCBsb29wCiAjIEVkaXRvcldpbmRvdyAtPiBHcmVwRGlhbG9wIC0+IE91dHB1dFdpbmRvdyAtPiBFZGl0b3JXaW5kb3cKIAogZGVmIGdyZXAodGV4dCwgaW89Tm9uZSwgZmxpc3Q9Tm9uZSk6CiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQotICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBlbmdpbmUgPSBzZWFyY2hlbmdpbmUuZ2V0KHJvb3QpCiAgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX2dyZXBkaWFsb2ciKToKICAgICAgICAgZW5naW5lLl9ncmVwZGlhbG9nID0gR3JlcERpYWxvZyhyb290LCBlbmdpbmUsIGZsaXN0KQogICAgIGRpYWxvZyA9IGVuZ2luZS5fZ3JlcGRpYWxvZwpAQCAtNDcsMTMgKzQ5LDEwIEBACiAgICAgICAgIHNlbGYuZ2xvYmVudCA9IHNlbGYubWFrZV9lbnRyeSgiSW4gZmlsZXM6Iiwgc2VsZi5nbG9idmFyKVswXQogCiAgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgotICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKClbMF0KLQotICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAotICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYucmVjdmFyLAorICAgICAgICBidG4gPSBDaGVja2J1dHRvbigKKyAgICAgICAgICAgICAgICBzZWxmLm1ha2VfZnJhbWUoKVswXSwgdmFyaWFibGU9c2VsZi5yZWN2YXIsCiAgICAgICAgICAgICAgICAgdGV4dD0iUmVjdXJzZSBkb3duIHN1YmRpcmVjdG9yaWVzIikKICAgICAgICAgYnRuLnBhY2soc2lkZT0idG9wIiwgZmlsbD0iYm90aCIpCi0gICAgICAgIGJ0bi5zZWxlY3QoKQogCiAgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CiAgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKQpAQCAtNjcsNyArNjYsNyBAQAogICAgICAgICBpZiBub3QgcGF0aDoKICAgICAgICAgICAgIHNlbGYudG9wLmJlbGwoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdyAgIyBsZWF2ZSBoZXJlIQorICAgICAgICBmcm9tIGlkbGVsaWIub3V0d2luIGltcG9ydCBPdXRwdXRXaW5kb3cgICMgbGVhdmUgaGVyZSEKICAgICAgICAgc2F2ZSA9IHN5cy5zdGRvdXQKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IE91dHB1dFdpbmRvdyhzZWxmLmZsaXN0KQpAQCAtMTMxLDE0ICsxMzAsMTYgQEAKIAogCiBkZWYgX2dyZXBfZGlhbG9nKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0Ci0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IEdyZXBEaWFsb2ciKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0LCBTRUwsIEVORAorICAgIGZyb20gdGtpbnRlci50dGsgaW1wb3J0IEJ1dHRvbgorICAgIGZyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IEdyZXBEaWFsb2ciKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCiAKLSAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQotICAgIHRleHQgPSBUZXh0KHJvb3QsIGhlaWdodD01KQorICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHRvcCkKKyAgICB0ZXh0ID0gVGV4dCh0b3AsIGhlaWdodD01KQogICAgIHRleHQucGFjaygpCiAKICAgICBkZWYgc2hvd19ncmVwX2RpYWxvZygpOgpAQCAtMTQ2LDkgKzE0Nyw4IEBACiAgICAgICAgIGdyZXAodGV4dCwgZmxpc3Q9Zmxpc3QpCiAgICAgICAgIHRleHQudGFnX3JlbW92ZShTRUwsICIxLjAiLCBFTkQpCiAKLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iU2hvdyBHcmVwRGlhbG9nIiwgY29tbWFuZD1zaG93X2dyZXBfZGlhbG9nKQorICAgIGJ1dHRvbiA9IEJ1dHRvbih0b3AsIHRleHQ9IlNob3cgR3JlcERpYWxvZyIsIGNvbW1hbmQ9c2hvd19ncmVwX2RpYWxvZykKICAgICBidXR0b24ucGFjaygpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnB5IGIvTGliL2lkbGVsaWIvaGVscC5weQppbmRleCBhNzAwOGU5Li43N2UwMWEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9oZWxwLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHAucHkKQEAgLTQsNyArNCw3IEBACiAKIEhlbHAgPT4gQWJvdXQgSURMRTogZGlwbGF5IEFib3V0IElkbGUgZGlhbG9nCiAKLTx0byBiZSBtb3ZlZCBoZXJlIGZyb20gYWJvdXREaWFsb2cucHk+Cis8dG8gYmUgbW92ZWQgaGVyZSBmcm9tIGhlbHBfYWJvdXQucHk+CiAKIAogSGVscCA9PiBJRExFIEhlbHA6IERpc3BsYXkgaGVscC5odG1sIHdpdGggcHJvcGVyIGZvcm1hdHRpbmcuCkBAIC0yNSwxNSArMjUsMTQgQEAKIHNob3dfaWRsZWhlbHAgLSBDcmVhdGUgSGVscFdpbmRvdy4gIENhbGxlZCBpbiBFZGl0b3JXaW5kb3cuaGVscF9kaWFsb2cuCiAiIiIKIGZyb20gaHRtbC5wYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKLWZyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgaXNkaXIsIGlzZmlsZSwgam9pbgorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBpc2ZpbGUsIGpvaW4KIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUb3BsZXZlbCwgRnJhbWUsIFRleHQsIFNjcm9sbGJhciwgTWVudSwgTWVudWJ1dHRvbgotZnJvbSB0a2ludGVyIGltcG9ydCBmb250IGFzIHRrZm9udAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCiAKLXVzZV90dGsgPSBGYWxzZSAjIHVudGlsIGF2YWlsYWJsZSB0byBpbXBvcnQKLWlmIHVzZV90dGs6Ci0gICAgZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgTWVudWJ1dHRvbgorZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgRnJhbWUsIFRleHQsIE1lbnUKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IE1lbnVidXR0b24sIFNjcm9sbGJhcgorZnJvbSB0a2ludGVyIGltcG9ydCBmb250IGFzIHRrZm9udAorCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiAjIyBBYm91dCBJRExFICMjCiAKQEAgLTE5NywxNSArMTk2LDE4IEBACiAgICAgIkRpc3BsYXkgaHRtbCB0ZXh0LCBzY3JvbGxiYXIsIGFuZCB0b2MuIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIGZpbGVuYW1lKToKICAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgcGFyZW50KQotICAgICAgICB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCisgICAgICAgICMga2VlcCByZWZlcmVuY2VzIHRvIHdpZGdldHMgZm9yIHRlc3QgYWNjZXNzLgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCiAgICAgICAgIHNlbGZbJ2JhY2tncm91bmQnXSA9IHRleHRbJ2JhY2tncm91bmQnXQotICAgICAgICBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQorICAgICAgICBzZWxmLnRvYyA9IHRvYyA9IHNlbGYudG9jX21lbnUodGV4dCkKKyAgICAgICAgc2VsZi5zY3JvbGwgPSBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQogICAgICAgICB0ZXh0Wyd5c2Nyb2xsY29tbWFuZCddID0gc2Nyb2xsLnNldAorCiAgICAgICAgIHNlbGYucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQogICAgICAgICBzZWxmLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MSkgICMgdGV4dAotICAgICAgICBzZWxmLnRvY19tZW51KHRleHQpLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBzdGlja3k9J253JykKLSAgICAgICAgdGV4dC5ncmlkKGNvbHVtbj0xLCByb3c9MCwgc3RpY2t5PSduc2V3JykKLSAgICAgICAgc2Nyb2xsLmdyaWQoY29sdW1uPTIsIHJvdz0wLCBzdGlja3k9J25zJykKKyAgICAgICAgdG9jLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9J253JykKKyAgICAgICAgdGV4dC5ncmlkKHJvdz0wLCBjb2x1bW49MSwgc3RpY2t5PSduc2V3JykKKyAgICAgICAgc2Nyb2xsLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9J25zJykKIAogICAgIGRlZiB0b2NfbWVudShzZWxmLCB0ZXh0KToKICAgICAgICAgIkNyZWF0ZSB0YWJsZSBvZiBjb250ZW50cyBhcyBkcm9wLWRvd24gbWVudS4iCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnR4dCBiL0xpYi9pZGxlbGliL2hlbHAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWZiZTBiLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2hlbHAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLVRoaXMgZmlsZSwgaWRsZWxpYi9oZWxwLnR4dCBpcyBvdXQtb2YtZGF0ZSBhbmQgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS4KLUl0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwb3NzaWJseSBpbiAzLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotW1NlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgKiogVElQUyAqKiBvbiB1c2luZyBJRExFICEhXQotCi1JRExFIGlzIHRoZSBQeXRob24gSURFIGJ1aWx0IHdpdGggdGhlIHRraW50ZXIgR1VJIHRvb2xraXQuCi0KLUlETEUgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Ci0tY29kZWQgaW4gMTAwJSBwdXJlIFB5dGhvbiwgdXNpbmcgdGhlIHRraW50ZXIgR1VJIHRvb2xraXQKLS1jcm9zcy1wbGF0Zm9ybTogd29ya3Mgb24gV2luZG93cywgVW5peCwgYW5kIE9TIFgKLS1tdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZywgc21hcnQgaW5kZW50LAotY2FsbCB0aXBzLCBhbmQgbWFueSBvdGhlciBmZWF0dXJlcwotLVB5dGhvbiBzaGVsbCB3aW5kb3cgKGEuay5hIGludGVyYWN0aXZlIGludGVycHJldGVyKQotLWRlYnVnZ2VyIChub3QgY29tcGxldGUsIGJ1dCB5b3UgY2FuIHNldCBicmVha3BvaW50cywgdmlldyBhbmQgc3RlcCkKLQotTWVudXM6Ci0KLUlETEUgaGFzIHR3byB3aW5kb3cgdHlwZXMgdGhlIFNoZWxsIHdpbmRvdyBhbmQgdGhlIEVkaXRvciB3aW5kb3cuIEl0IGlzCi1wb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGVkaXRvciB3aW5kb3dzIHNpbXVsdGFuZW91c2x5LiBJRExFJ3MKLW1lbnVzIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiB3aGljaCB3aW5kb3cgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBFYWNoIG1lbnUKLWRvY3VtZW50ZWQgYmVsb3cgaW5kaWNhdGVzIHdoaWNoIHdpbmRvdyB0eXBlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gCi0KLUZpbGUgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgTmV3IEZpbGUgICAgICAgICAtLSBDcmVhdGUgYSBuZXcgZmlsZSBlZGl0aW5nIHdpbmRvdwotICAgICAgICBPcGVuLi4uICAgICAgICAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgZmlsZQotICAgICAgICBPcGVuIE1vZHVsZS4uLiAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgbW9kdWxlIChzZWFyY2hlcyBzeXMucGF0aCkKLSAgICAgICAgUmVjZW50IEZpbGVzLi4uICAtLSBPcGVuIGEgbGlzdCBvZiByZWNlbnQgZmlsZXMKLSAgICAgICAgQ2xhc3MgQnJvd3NlciAgICAtLSBTaG93IGNsYXNzZXMgYW5kIG1ldGhvZHMgaW4gY3VycmVudCBmaWxlCi0gICAgICAgIFBhdGggQnJvd3NlciAgICAgLS0gU2hvdyBzeXMucGF0aCBkaXJlY3RvcmllcywgbW9kdWxlcywgY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWV0aG9kcwotICAgICAgICAtLS0KLSAgICAgICAgU2F2ZSAgICAgICAgICAgICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIHRoZSBhc3NvY2lhdGVkIGZpbGUgKHVuc2F2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIGhhdmUgYSAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdpbmRvdyB0aXRsZSkKLQotICAgICAgICBTYXZlIEFzLi4uICAgICAgIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gbmV3IGZpbGUsIHdoaWNoIGJlY29tZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBmaWxlCi0gICAgICAgIFNhdmUgQ29weSBBcy4uLiAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byBkaWZmZXJlbnQgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFzc29jaWF0ZWQgZmlsZQotICAgICAgICAtLS0KLSAgICAgICAgUHJpbnQgV2luZG93ICAgICAtLSBQcmludCB0aGUgY3VycmVudCB3aW5kb3cKLSAgICAgICAgLS0tCi0gICAgICAgIENsb3NlICAgICAgICAgICAgLS0gQ2xvc2UgY3VycmVudCB3aW5kb3cgKGFza3MgdG8gc2F2ZSBpZiB1bnNhdmVkKQotICAgICAgICBFeGl0ICAgICAgICAgICAgIC0tIENsb3NlIGFsbCB3aW5kb3dzLCBxdWl0IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKLQotRWRpdCBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBVbmRvICAgICAgICAgICAgIC0tIFVuZG8gbGFzdCBjaGFuZ2UgdG8gY3VycmVudCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSBtYXhpbXVtIG9mIDEwMDAgY2hhbmdlcyBtYXkgYmUgdW5kb25lKQotICAgICAgICBSZWRvICAgICAgICAgICAgIC0tIFJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93Ci0gICAgICAgIC0tLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZWxlY3QgQWxsICAgICAgIC0tIFNlbGVjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJ1ZmZlcgotICAgICAgICAtLS0KLSAgICAgICAgRmluZC4uLiAgICAgICAgICAtLSBPcGVuIGEgc2VhcmNoIGRpYWxvZyBib3ggd2l0aCBtYW55IG9wdGlvbnMKLSAgICAgICAgRmluZCBBZ2FpbiAgICAgICAtLSBSZXBlYXQgbGFzdCBzZWFyY2gKLSAgICAgICAgRmluZCBTZWxlY3Rpb24gICAtLSBTZWFyY2ggZm9yIHRoZSBzdHJpbmcgaW4gdGhlIHNlbGVjdGlvbgotICAgICAgICBGaW5kIGluIEZpbGVzLi4uIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCBmb3Igc2VhcmNoaW5nIGZpbGVzCi0gICAgICAgIFJlcGxhY2UuLi4gICAgICAgLS0gT3BlbiBhIHNlYXJjaC1hbmQtcmVwbGFjZSBkaWFsb2cgYm94Ci0gICAgICAgIEdvIHRvIExpbmUgICAgICAgLS0gQXNrIGZvciBhIGxpbmUgbnVtYmVyIGFuZCBzaG93IHRoYXQgbGluZQotICAgICAgICBFeHBhbmQgV29yZCAgICAgIC0tIEV4cGFuZCB0aGUgd29yZCB5b3UgaGF2ZSB0eXBlZCB0byBtYXRjaCBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCBpbiB0aGUgc2FtZSBidWZmZXI7IHJlcGVhdCB0byBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBleHBhbnNpb24KLSAgICAgICAgU2hvdyBDYWxsdGlwICAgICAtLSBBZnRlciBhbiB1bmNsb3NlZCBwYXJlbnRoZXNpcyBmb3IgYSBmdW5jdGlvbiwgb3BlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc21hbGwgd2luZG93IHdpdGggZnVuY3Rpb24gcGFyYW1ldGVyIGhpbnRzCi0gICAgICAgIFNob3cgUGFyZW5zICAgICAgLS0gSGlnaGxpZ2h0IHRoZSBzdXJyb3VuZGluZyBwYXJlbnRoZXNpcwotICAgICAgICBTaG93IENvbXBsZXRpb25zIC0tIE9wZW4gYSBzY3JvbGwgd2luZG93IGFsbG93aW5nIHNlbGVjdGlvbiBrZXl3b3JkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdHRyaWJ1dGVzLiAoc2VlICcqVElQUyonLCBiZWxvdykKLQotRm9ybWF0IE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgSW5kZW50IFJlZ2lvbiAgICAgICAtLSBTaGlmdCBzZWxlY3RlZCBsaW5lcyByaWdodCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIERlZGVudCBSZWdpb24gICAgICAgLS0gU2hpZnQgc2VsZWN0ZWQgbGluZXMgbGVmdCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIENvbW1lbnQgT3V0IFJlZ2lvbiAgLS0gSW5zZXJ0ICMjIGluIGZyb250IG9mIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFVuY29tbWVudCBSZWdpb24gICAgLS0gUmVtb3ZlIGxlYWRpbmcgIyBvciAjIyBmcm9tIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFRhYmlmeSBSZWdpb24gICAgICAgLS0gVHVybnMgKmxlYWRpbmcqIHN0cmV0Y2hlcyBvZiBzcGFjZXMgaW50byB0YWJzLgotICAgICAgICAgICAgICAgIChOb3RlOiBXZSByZWNvbW1lbmQgdXNpbmcgNCBzcGFjZSBibG9ja3MgdG8gaW5kZW50IFB5dGhvbiBjb2RlLikKLSAgICAgICAgVW50YWJpZnkgUmVnaW9uICAgICAtLSBUdXJuICphbGwqIHRhYnMgaW50byB0aGUgY29ycmVudCBudW1iZXIgb2Ygc3BhY2VzCi0gICAgICAgIFRvZ2dsZSB0YWJzICAgICAgICAgLS0gT3BlbiBhIGRpYWxvZyB0byBzd2l0Y2ggYmV0d2VlbiBpbmRlbnRpbmcgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyBhbmQgdGFicy4KLSAgICAgICAgTmV3IEluZGVudCBXaWR0aC4uLiAtLSBPcGVuIGEgZGlhbG9nIHRvIGNoYW5nZSBpbmRlbnQgd2lkdGguICBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCBkZWZhdWx0IGJ5IHRoZSBQeXRob24gY29tbXVuaXR5IGlzIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuCi0gICAgICAgIEZvcm1hdCBQYXJhZ3JhcGggICAgLS0gUmVmb3JtYXQgdGhlIGN1cnJlbnQgYmxhbmstbGluZS1zZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguIEFsbCBsaW5lcyBpbiB0aGUgcGFyYWdyYXBoIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgdG8gbGVzcyB0aGFuIDgwIGNvbHVtbnMuCi0gICAgICAgIC0tLQotICAgICAgICBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0tIFJlbW92ZWQgYW55IHNwYWNlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5vbi1zcGFjZSBjaGFyYWN0ZXIKLQotUnVuIE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgUHl0aG9uIFNoZWxsIC0tIE9wZW4gb3Igd2FrZSB1cCB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgQ2hlY2sgTW9kdWxlIC0tIENoZWNrIHRoZSBzeW50YXggb2YgdGhlIG1vZHVsZSBjdXJyZW50bHkgb3BlbiBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvciB3aW5kb3cuICBJZiB0aGUgbW9kdWxlIGhhcyBub3QgYmVlbiBzYXZlZCBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlIHRoZSBjb2RlLgotICAgICAgICBSdW4gTW9kdWxlICAgLS0gUmVzdGFydCB0aGUgc2hlbGwgdG8gY2xlYW4gdGhlIGVudmlyb25tZW50LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIHRoZSBjdXJyZW50bHkgb3BlbiBtb2R1bGUuIElmIHRoZSBtb2R1bGUgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgYmVlbiBzYXZlZCBJRExFIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLgotCi1TaGVsbCBNZW51IChTaGVsbCB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgVmlldyBMYXN0IFJlc3RhcnQgLS0gU2Nyb2xsIHRoZSBzaGVsbCB3aW5kb3cgdG8gdGhlIGxhc3QgU2hlbGwgcmVzdGFydAotICAgICAgICBSZXN0YXJ0IFNoZWxsICAgICAtLSBSZXN0YXJ0IHRoZSBzaGVsbCB0byBjbGVhbiB0aGUgZW52aXJvbm1lbnQKLQotRGVidWcgTWVudSAoU2hlbGwgd2luZG93IG9ubHkpOgotCi0gICAgICAgIEdvIHRvIEZpbGUvTGluZSAgIC0tIExvb2sgYXJvdW5kIHRoZSBpbnNlcnQgcG9pbnQgZm9yIGEgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyLCBvcGVuIHRoZSBmaWxlLCBhbmQgc2hvdyB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHRvIHZpZXcgdGhlIHNvdXJjZSBsaW5lcyByZWZlcmVuY2VkIGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiB0cmFjZWJhY2suICBBdmFpbGFibGUgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudSBvZiB0aGUgU2hlbGwgd2luZG93LgotICAgICAgICBEZWJ1Z2dlciAodG9nZ2xlKSAtLSBUaGlzIGZlYXR1cmUgaXMgbm90IGNvbXBsZXRlIGFuZCBjb25zaWRlcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbC4gUnVuIGNvbW1hbmRzIGluIHRoZSBzaGVsbCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXIuCi0gICAgICAgIFN0YWNrIFZpZXdlciAgICAgIC0tIFNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KLSAgICAgICAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAodG9nZ2xlKSAtLSBUb2dnbGUgYXV0b21hdGljYWxseSBvcGVuaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIHZpZXdlciBvbiB1bmhhbmRsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24KLQotT3B0aW9ucyBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBDb25maWd1cmUgSURMRSAtLSBPcGVuIGEgY29uZmlndXJhdGlvbiBkaWFsb2cuICBGb250cywgaW5kZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleWJpbmRpbmdzLCBhbmQgY29sb3IgdGhlbWVzIG1heSBiZSBhbHRlcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydHVwIFByZWZlcmVuY2VzIG1heSBiZSBzZXQsIGFuZCBhZGRpdGlvbmFsIEhlbHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyBjYW4gYmUgc3BlY2lmaWVkLiAgT24gT1MgWCwgb3BlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaWFsb2cgYnkgc2VsZWN0aW5nIFByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgotCi0gICAgICAgIC0tLQotICAgICAgICBDb2RlIENvbnRleHQgKHRvZ2dsZSkgLS0gT3BlbiBhIHBhbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHNob3dzIHRoZSBibG9jayBjb250ZXh0IG9mIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb2RlIHdoaWNoIGlzIHNjcm9sbGluZyBvZmYgdGhlIHRvcCBvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy4gVGhpcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgU2hlbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBvbmx5IHRoZSBFZGl0b3Igd2luZG93LgotCi1XaW5kb3cgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgWm9vbSBIZWlnaHQgLS0gVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbm9ybWFsIHNpemUgKDQweDgwIGluaXRpYWwKLSAgICAgICAgc2V0dGluZykgYW5kIG1heGltdW0gaGVpZ2h0LiAgVGhlIGluaXRpYWwgc2l6ZSBpcyBpbiB0aGUgQ29uZmlndXJlCi0gICAgICAgIElETEUgZGlhbG9nIHVuZGVyIHRoZSBnZW5lcmFsIHRhYi4KLSAgICAgICAgLS0tCi0gICAgICAgIFRoZSByZXN0IG9mIHRoaXMgbWVudSBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIG9wZW4gd2luZG93czsKLSAgICAgICAgc2VsZWN0IG9uZSB0byBicmluZyBpdCB0byB0aGUgZm9yZWdyb3VuZCAoZGVpY29uaWZ5aW5nIGl0IGlmCi0gICAgICAgIG5lY2Vzc2FyeSkuCi0KLUhlbHAgTWVudToKLQotICAgICAgICBBYm91dCBJRExFICAtLSBWZXJzaW9uLCBjb3B5cmlnaHQsIGxpY2Vuc2UsIGNyZWRpdHMKLSAgICAgICAgLS0tCi0gICAgICAgIElETEUgSGVscCAgIC0tIERpc3BsYXkgdGhpcyBmaWxlIHdoaWNoIGlzIGEgaGVscCBmaWxlIGZvciBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGluZyB0aGUgbWVudSBvcHRpb25zLCBiYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3RoZXIgdGlwcy4KLSAgICAgICAgUHl0aG9uIERvY3MgLS0gQWNjZXNzIGxvY2FsIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpZgotICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuICBPciB3aWxsIHN0YXJ0IGEgd2ViIGJyb3dzZXIgYW5kIG9wZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZG9jcy5weXRob24ub3JnIHNob3dpbmcgdGhlIGxhdGVzdCBQeXRob24gZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgLS0tCi0gICAgICAgIEFkZGl0aW9uYWwgaGVscCBzb3VyY2VzIG1heSBiZSBhZGRlZCBoZXJlIHdpdGggdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUgR2VuZXJhbCB0YWIuCi0KLUVkaXRvciBjb250ZXh0IG1lbnUgKFJpZ2h0LWNsaWNrIC8gQ29udHJvbC1jbGljayBvbiBPUyBYIGluIEVkaXQgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZXQgQnJlYWtwb2ludCAgIC0tIFNldHMgYSBicmVha3BvaW50LiBCcmVha3BvaW50cyBhcmUgb25seSBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZGVidWdnZXIgaXMgb3Blbi4KLSAgICAgICAgQ2xlYXIgQnJlYWtwb2ludCAtLSBDbGVhcnMgdGhlIGJyZWFrcG9pbnQgb24gdGhhdCBsaW5lCi0KLVNoZWxsIGNvbnRleHQgbWVudSAoUmlnaHQtY2xpY2sgLyBDb250cm9sLWNsaWNrIG9uIE9TIFggaW4gU2hlbGwgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgR28gdG8gZmlsZS9saW5lICAtLSBTYW1lIGFzIGluIERlYnVnIG1lbnUKLQotCi0qKiBUSVBTICoqCi09PT09PT09PT09Ci0KLUFkZGl0aW9uYWwgSGVscCBTb3VyY2VzOgotCi0gICAgICAgIFdpbmRvd3MgdXNlcnMgY2FuIEdvb2dsZSBvbiB6b3Blc2hlbGYuY2htIHRvIGFjY2VzcyBab3BlIGhlbHAgZmlsZXMgaW4KLSAgICAgICAgdGhlIFdpbmRvd3MgaGVscCBmb3JtYXQuICBUaGUgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgZmVhdHVyZSBvZiB0aGUKLSAgICAgICAgY29uZmlndXJhdGlvbiBHVUkgc3VwcG9ydHMgLmNobSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXR5cGVzCi0gICAgICAgIHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuICBTdXBwbHkgYSBNZW51IEl0ZW0gdGl0bGUsIGFuZCBlbnRlciB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIEhlbHAgRmlsZSBQYXRoIHNsb3Qgb2YgdGhlIE5ldyBIZWxwIFNvdXJjZSBkaWFsb2cuICBVc2UKLSAgICAgICAgaHR0cDovLyBhbmQvb3Igd3d3LiB0byBpZGVudGlmeSBleHRlcm5hbCBVUkxzLCBvciBkb3dubG9hZCB0aGUgZmlsZSBhbmQKLSAgICAgICAgYnJvd3NlIGZvciBpdHMgcGF0aCBvbiB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIEJyb3dzZSBidXR0b24uCi0KLSAgICAgICAgQWxsIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGV4dGVuc2l2ZSBzb3VyY2VzIG9mIGhlbHAsIGluY2x1ZGluZwotICAgICAgICB0dXRvcmlhbHMsIGF2YWlsYWJsZSBhdCBkb2NzLnB5dGhvbi5vcmcuICBTZWxlY3RlZCBVUkxzIGNhbiBiZSBhZGRlZAotICAgICAgICBvciByZW1vdmVkIGZyb20gdGhlIEhlbHAgbWVudSBhdCBhbnkgdGltZSB1c2luZyBDb25maWd1cmUgSURMRS4KLQotQmFzaWMgZWRpdGluZyBhbmQgbmF2aWdhdGlvbjoKLQotICAgICAgICBCYWNrc3BhY2UgZGVsZXRlcyBjaGFyIHRvIHRoZSBsZWZ0OyBERUwgZGVsZXRlcyBjaGFyIHRvIHRoZSByaWdodC4KLSAgICAgICAgQ29udHJvbC1iYWNrc3BhY2UgZGVsZXRlcyB3b3JkIGxlZnQsIENvbnRyb2wtREVMIGRlbGV0ZXMgd29yZCByaWdodC4KLSAgICAgICAgQXJyb3cga2V5cyBhbmQgUGFnZSBVcC9Eb3duIG1vdmUgYXJvdW5kLgotICAgICAgICBDb250cm9sLWxlZnQvcmlnaHQgQXJyb3cgbW92ZXMgYnkgd29yZHMgaW4gYSBzdHJhbmdlIGJ1dCB1c2VmdWwgd2F5LgotICAgICAgICBIb21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgbGluZS4KLSAgICAgICAgQ29udHJvbC1Ib21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgZmlsZS4KLSAgICAgICAgU29tZSB1c2VmdWwgRW1hY3MgYmluZGluZ3MgYXJlIGluaGVyaXRlZCBmcm9tIFRjbC9UazoKLSAgICAgICAgICAgICAgICBDb250cm9sLWEgICAgIGJlZ2lubmluZyBvZiBsaW5lCi0gICAgICAgICAgICAgICAgQ29udHJvbC1lICAgICBlbmQgb2YgbGluZQotICAgICAgICAgICAgICAgIENvbnRyb2wtayAgICAga2lsbCBsaW5lIChidXQgZG9lc24ndCBwdXQgaXQgaW4gY2xpcGJvYXJkKQotICAgICAgICAgICAgICAgIENvbnRyb2wtbCAgICAgY2VudGVyIHdpbmRvdyBhcm91bmQgdGhlIGluc2VydGlvbiBwb2ludAotICAgICAgICBTdGFuZGFyZCBrZXliaW5kaW5ncyAobGlrZSBDb250cm9sLWMgdG8gY29weSBhbmQgQ29udHJvbC12IHRvCi0gICAgICAgIHBhc3RlKSBtYXkgd29yay4gIEtleWJpbmRpbmdzIGFyZSBzZWxlY3RlZCBpbiB0aGUgQ29uZmlndXJlIElETEUKLSAgICAgICAgZGlhbG9nLgotCi1BdXRvbWF0aWMgaW5kZW50YXRpb246Ci0KLSAgICAgICAgQWZ0ZXIgYSBibG9jay1vcGVuaW5nIHN0YXRlbWVudCwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBieSA0IHNwYWNlcwotICAgICAgICAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgYnkgb25lIHRhYikuICBBZnRlciBjZXJ0YWluIGtleXdvcmRzCi0gICAgICAgIChicmVhaywgcmV0dXJuIGV0Yy4pIHRoZSBuZXh0IGxpbmUgaXMgZGVkZW50ZWQuICBJbiBsZWFkaW5nCi0gICAgICAgIGluZGVudGF0aW9uLCBCYWNrc3BhY2UgZGVsZXRlcyB1cCB0byA0IHNwYWNlcyBpZiB0aGV5IGFyZSB0aGVyZS4gIFRhYgotICAgICAgICBpbnNlcnRzIHNwYWNlcyAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgb25lIHRhYiksIG51bWJlciBkZXBlbmRzIG9uCi0gICAgICAgIEluZGVudCBXaWR0aC4gQ3VycmVudGx5IHRhYnMgYXJlIHJlc3RyaWN0ZWQgdG8gZm91ciBzcGFjZXMgZHVlCi0gICAgICAgIHRvIFRjbC9UayBsaW1pdGF0aW9ucy4KLQotICAgICAgICBTZWUgYWxzbyB0aGUgaW5kZW50L2RlZGVudCByZWdpb24gY29tbWFuZHMgaW4gdGhlIGVkaXQgbWVudS4KLQotQ29tcGxldGlvbnM6Ci0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIHN1cHBsaWVkIGZvciBmdW5jdGlvbnMsIGNsYXNzZXMsIGFuZCBhdHRyaWJ1dGVzIG9mCi0gICAgICAgIGNsYXNzZXMsIGJvdGggYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZC4gIENvbXBsZXRpb25zIGFyZSBhbHNvIHByb3ZpZGVkCi0gICAgICAgIGZvciBmaWxlbmFtZXMuCi0KLSAgICAgICAgVGhlIEF1dG9Db21wbGV0ZVdpbmRvdyAoQUNXKSB3aWxsIG9wZW4gYWZ0ZXIgYSBwcmVkZWZpbmVkIGRlbGF5Ci0gICAgICAgIChkZWZhdWx0IGlzIHR3byBzZWNvbmRzKSBhZnRlciBhICcuJyBvciAoaW4gYSBzdHJpbmcpIGFuIG9zLnNlcCBpcwotICAgICAgICB0eXBlZC4gIElmIGFmdGVyIG9uZSBvZiB0aG9zZSBjaGFyYWN0ZXJzIChwbHVzIHplcm8gb3IgbW9yZSBvdGhlcgotICAgICAgICBjaGFyYWN0ZXJzKSBhIHRhYiBpcyB0eXBlZCB0aGUgQUNXIHdpbGwgb3BlbiBpbW1lZGlhdGVseSBpZiBhIHBvc3NpYmxlCi0gICAgICAgIGNvbnRpbnVhdGlvbiBpcyBmb3VuZC4KLQotICAgICAgICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBlbnRlcmVkLCBhCi0gICAgICAgIHRhYiB3aWxsIHN1cHBseSB0aGF0IGNvbXBsZXRpb24gd2l0aG91dCBvcGVuaW5nIHRoZSBBQ1cuCi0KLSAgICAgICAgJ1Nob3cgQ29tcGxldGlvbnMnIHdpbGwgZm9yY2Ugb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdywgYnkgZGVmYXVsdCB0aGUKLSAgICAgICAgQ29udHJvbC1zcGFjZSBrZXlzIHdpbGwgb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdy4gIEluIGFuIGVtcHR5Ci0gICAgICAgIHN0cmluZywgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE9uIGEKLSAgICAgICAgYmxhbmsgbGluZSwgaXQgd2lsbCBjb250YWluIHRoZSBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQKLSAgICAgICAgY2xhc3NlcyBpbiB0aGUgY3VycmVudCBuYW1lIHNwYWNlcywgcGx1cyBhbnkgbW9kdWxlcyBpbXBvcnRlZC4gIElmIHNvbWUKLSAgICAgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gZW50ZXJlZCwgdGhlIEFDVyB3aWxsIGF0dGVtcHQgdG8gYmUgbW9yZSBzcGVjaWZpYy4KLQotICAgICAgICBJZiBzdHJpbmcgb2YgY2hhcmFjdGVycyBpcyB0eXBlZCwgdGhlIEFDVyBzZWxlY3Rpb24gd2lsbCBqdW1wIHRvIHRoZQotICAgICAgICBlbnRyeSBtb3N0IGNsb3NlbHkgbWF0Y2hpbmcgdGhvc2UgY2hhcmFjdGVycy4gRW50ZXJpbmcgYSB0YWIgd2lsbCBjYXVzZQotICAgICAgICB0aGUgbG9uZ2VzdCBub24tYW1iaWd1b3VzIG1hdGNoIHRvIGJlIGVudGVyZWQgaW4gdGhlIEVkaXQgd2luZG93IG9yCi0gICAgICAgIFNoZWxsLiAgVHdvIHRhYnMgaW4gYSByb3cgd2lsbCBzdXBwbHkgdGhlIGN1cnJlbnQgQUNXIHNlbGVjdGlvbiwgYXMKLSAgICAgICAgd2lsbCByZXR1cm4gb3IgYSBkb3VibGUgY2xpY2suICBDdXJzb3Iga2V5cywgUGFnZSBVcC9Eb3duLCBtb3VzZQotICAgICAgICBzZWxlY3Rpb24sIGFuZCB0aGUgc2Nyb2xsIHdoZWVsIGFsbCBvcGVyYXRlIG9uIHRoZSBBQ1cuCi0KLSAgICAgICAgIkhpZGRlbiIgYXR0cmlidXRlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdHlwaW5nIHRoZSBiZWdpbm5pbmcgb2YgaGlkZGVuCi0gICAgICAgIG5hbWUgYWZ0ZXIgYSAnLicsICBlLmcuICdfJy4gIFRoaXMgYWxsb3dzIGFjY2VzcyB0byBtb2R1bGVzIHdpdGgKLSAgICAgICAgJ19fYWxsX18nIHNldCwgb3IgdG8gY2xhc3MtcHJpdmF0ZSBhdHRyaWJ1dGVzLgotCi0gICAgICAgIENvbXBsZXRpb25zIGFuZCB0aGUgJ0V4cGFuZCBXb3JkJyBmYWNpbGl0eSBjYW4gc2F2ZSBhIGxvdCBvZiB0eXBpbmchCi0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIGN1cnJlbnRseSBsaW1pdGVkIHRvIHRob3NlIGluIHRoZSBuYW1lc3BhY2VzLiAgTmFtZXMgaW4KLSAgICAgICAgYW4gRWRpdG9yIHdpbmRvdyB3aGljaCBhcmUgbm90IHZpYSBfX21haW5fXyBvciBzeXMubW9kdWxlcyB3aWxsIG5vdCBiZQotICAgICAgICBmb3VuZC4gIFJ1biB0aGUgbW9kdWxlIG9uY2Ugd2l0aCB5b3VyIGltcG9ydHMgdG8gY29ycmVjdCB0aGlzCi0gICAgICAgIHNpdHVhdGlvbi4gIE5vdGUgdGhhdCBJRExFIGl0c2VsZiBwbGFjZXMgcXVpdGUgYSBmZXcgbW9kdWxlcyBpbgotICAgICAgICBzeXMubW9kdWxlcywgc28gbXVjaCBjYW4gYmUgZm91bmQgYnkgZGVmYXVsdCwgZS5nLiB0aGUgcmUgbW9kdWxlLgotCi0gICAgICAgIElmIHlvdSBkb24ndCBsaWtlIHRoZSBBQ1cgcG9wcGluZyB1cCB1bmJpZGRlbiwgc2ltcGx5IG1ha2UgdGhlIGRlbGF5Ci0gICAgICAgIGxvbmdlciBvciBkaXNhYmxlIHRoZSBleHRlbnNpb24uICBPciBhbm90aGVyIG9wdGlvbiBpcyB0aGUgZGVsYXkgY291bGQKLSAgICAgICAgYmUgc2V0IHRvIHplcm8uIEFub3RoZXIgYWx0ZXJuYXRpdmUgdG8gcHJldmVudGluZyBBQ1cgcG9wdXBzIGlzIHRvCi0gICAgICAgIGRpc2FibGUgdGhlIGNhbGwgdGlwcyBleHRlbnNpb24uCi0KLVB5dGhvbiBTaGVsbCB3aW5kb3c6Ci0KLSAgICAgICAgQ29udHJvbC1jIGludGVycnVwdHMgZXhlY3V0aW5nIGNvbW1hbmQuCi0gICAgICAgIENvbnRyb2wtZCBzZW5kcyBlbmQtb2YtZmlsZTsgY2xvc2VzIHdpbmRvdyBpZiB0eXBlZCBhdCA+Pj4gcHJvbXB0LgotICAgICAgICBBbHQtLyBleHBhbmQgd29yZCBpcyBhbHNvIHVzZWZ1bCB0byByZWR1Y2UgdHlwaW5nLgotCi0gICAgQ29tbWFuZCBoaXN0b3J5OgotCi0gICAgICAgIEFsdC1wIHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQuIE9uIE9TIFgKLSAgICAgICAgdXNlIENvbnRyb2wtcC4KLSAgICAgICAgQWx0LW4gcmV0cmlldmVzIG5leHQuIE9uIE9TIFggdXNlIENvbnRyb2wtbi4KLSAgICAgICAgUmV0dXJuIHdoaWxlIGN1cnNvciBpcyBvbiBhIHByZXZpb3VzIGNvbW1hbmQgcmV0cmlldmVzIHRoYXQgY29tbWFuZC4KLQotICAgIFN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgVGhlIGNvbG9yaW5nIGlzIGFwcGxpZWQgaW4gYSBiYWNrZ3JvdW5kICJ0aHJlYWQiLCBzbyB5b3UgbWF5Ci0gICAgICAgIG9jY2FzaW9uYWxseSBzZWUgdW5jb2xvcml6ZWQgdGV4dC4gIFRvIGNoYW5nZSB0aGUgY29sb3IKLSAgICAgICAgc2NoZW1lLCB1c2UgdGhlIENvbmZpZ3VyZSBJRExFIC8gSGlnaGxpZ2h0aW5nIGRpYWxvZy4KLQotICAgIFB5dGhvbiBkZWZhdWx0IHN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgS2V5d29yZHMgICAgICAgIG9yYW5nZQotICAgICAgICBCdWlsdGlucyAgICAgICAgcm95YWwgcHVycGxlCi0gICAgICAgIFN0cmluZ3MgICAgICAgICBncmVlbgotICAgICAgICBDb21tZW50cyAgICAgICAgcmVkCi0gICAgICAgIERlZmluaXRpb25zICAgICBibHVlCi0KLSAgICBTaGVsbCBkZWZhdWx0IGNvbG9yczoKLQotICAgICAgICBDb25zb2xlIG91dHB1dCAgYnJvd24KLSAgICAgICAgc3Rkb3V0ICAgICAgICAgIGJsdWUKLSAgICAgICAgc3RkZXJyICAgICAgICAgIHJlZAotICAgICAgICBzdGRpbiAgICAgICAgICAgYmxhY2sKLQotT3RoZXIgcHJlZmVyZW5jZXM6Ci0KLSAgICAgICAgVGhlIGZvbnQgcHJlZmVyZW5jZXMsIGhpZ2hsaWdodGluZywga2V5cywgYW5kIGdlbmVyYWwgcHJlZmVyZW5jZXMgY2FuCi0gICAgICAgIGJlIGNoYW5nZWQgdmlhIHRoZSBDb25maWd1cmUgSURMRSBtZW51IG9wdGlvbi4gIEJlIHN1cmUgdG8gbm90ZSB0aGF0Ci0gICAgICAgIGtleXMgY2FuIGJlIHVzZXIgZGVmaW5lZCwgSURMRSBzaGlwcyB3aXRoIGZvdXIgYnVpbHQgaW4ga2V5IHNldHMuIEluCi0gICAgICAgIGFkZGl0aW9uIGEgdXNlciBjYW4gY3JlYXRlIGEgY3VzdG9tIGtleSBzZXQgaW4gdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUga2V5cyB0YWIuCi0KLUNvbW1hbmQgbGluZSB1c2FnZToKLQotICAgICAgICBFbnRlciBpZGxlIC1oIGF0IHRoZSBjb21tYW5kIHByb21wdCB0byBnZXQgYSB1c2FnZSBtZXNzYWdlLgotCi0gICAgICAgIGlkbGUucHkgWy1jIGNvbW1hbmRdIFstZF0gWy1lXSBbLXNdIFstdCB0aXRsZV0gW2FyZ10gLi4uCi0KLSAgICAgICAgLWMgY29tbWFuZCAgcnVuIHRoaXMgY29tbWFuZAotICAgICAgICAtZCAgICAgICAgICBlbmFibGUgZGVidWdnZXIKLSAgICAgICAgLWUgICAgICAgICAgZWRpdCBtb2RlOyBhcmd1bWVudHMgYXJlIGZpbGVzIHRvIGJlIGVkaXRlZAotICAgICAgICAtcyAgICAgICAgICBydW4gJElETEVTVEFSVFVQIG9yICRQWVRIT05TVEFSVFVQIGZpcnN0Ci0gICAgICAgIC10IHRpdGxlICAgIHNldCB0aXRsZSBvZiBzaGVsbCB3aW5kb3cKLQotICAgICAgICBJZiB0aGVyZSBhcmUgYXJndW1lbnRzOgotICAgICAgICAxLiBJZiAtZSBpcyB1c2VkLCBhcmd1bWVudHMgYXJlIGZpbGVzIG9wZW5lZCBmb3IgZWRpdGluZyBhbmQgc3lzLmFyZ3YKLSAgICAgICAgICAgcmVmbGVjdHMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gSURMRSBpdHNlbGYuCi0gICAgICAgIDIuIE90aGVyd2lzZSwgaWYgLWMgaXMgdXNlZCwgYWxsIGFyZ3VtZW50cyBhcmUgcGxhY2VkIGluCi0gICAgICAgICAgIHN5cy5hcmd2WzE6Li4uXSwgd2l0aCBzeXMuYXJndlswXSBzZXQgdG8gLWMuCi0gICAgICAgIDMuIE90aGVyd2lzZSwgaWYgbmVpdGhlciAtZSBub3IgLWMgaXMgdXNlZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgICAgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgaW4KLSAgICAgICAgICAgc3lzLmFyZ3ZbMTouLi5dICBhbmQgc3lzLmFyZ3ZbMF0gc2V0IHRvIHRoZSBzY3JpcHQgbmFtZS4gIElmIHRoZQotICAgICAgICAgICBzY3JpcHQgbmFtZSBpcyAtLCBubyBzY3JpcHQgaXMgZXhlY3V0ZWQgYnV0IGFuIGludGVyYWN0aXZlIFB5dGhvbgotICAgICAgICAgICBzZXNzaW9uIGlzIHN0YXJ0ZWQ7IHRoZSBhcmd1bWVudHMgYXJlIHN0aWxsIGF2YWlsYWJsZSBpbiBzeXMuYXJndi4KLQotUnVubmluZyB3aXRob3V0IGEgc3VicHJvY2VzczogKERFUFJFQ0FURUQgaW4gUHl0aG9uIDMuNCBzZWUgSXNzdWUgMTYxMjMpCi0KLSAgICAgICAgSWYgSURMRSBpcyBzdGFydGVkIHdpdGggdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggaXQgd2lsbCBydW4gaW4gYQotICAgICAgICBzaW5nbGUgcHJvY2VzcyBhbmQgd2lsbCBub3QgY3JlYXRlIHRoZSBzdWJwcm9jZXNzIHdoaWNoIHJ1bnMgdGhlIFJQQwotICAgICAgICBQeXRob24gZXhlY3V0aW9uIHNlcnZlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBQeXRob24gY2Fubm90IGNyZWF0ZQotICAgICAgICB0aGUgc3VicHJvY2VzcyBvciB0aGUgUlBDIHNvY2tldCBpbnRlcmZhY2Ugb24geW91ciBwbGF0Zm9ybS4gIEhvd2V2ZXIsCi0gICAgICAgIGluIHRoaXMgbW9kZSB1c2VyIGNvZGUgaXMgbm90IGlzb2xhdGVkIGZyb20gSURMRSBpdHNlbGYuICBBbHNvLCB0aGUKLSAgICAgICAgZW52aXJvbm1lbnQgaXMgbm90IHJlc3RhcnRlZCB3aGVuIFJ1bi9SdW4gTW9kdWxlIChGNSkgaXMgc2VsZWN0ZWQuICBJZgotICAgICAgICB5b3VyIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQsIHlvdSBtdXN0IHJlbG9hZCgpIHRoZSBhZmZlY3RlZCBtb2R1bGVzIGFuZAotICAgICAgICByZS1pbXBvcnQgYW55IHNwZWNpZmljIGl0ZW1zIChlLmcuIGZyb20gZm9vIGltcG9ydCBiYXopIGlmIHRoZSBjaGFuZ2VzCi0gICAgICAgIGFyZSB0byB0YWtlIGVmZmVjdC4gIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyBwcmVmZXJhYmxlIHRvIHJ1biBJRExFCi0gICAgICAgIHdpdGggdGhlIGRlZmF1bHQgc3VicHJvY2VzcyBpZiBhdCBhbGwgcG9zc2libGUuCi0KLUV4dGVuc2lvbnM6Ci0KLSAgICAgICAgSURMRSBjb250YWlucyBhbiBleHRlbnNpb24gZmFjaWxpdHkuICBTZWUgdGhlIGJlZ2lubmluZyBvZgotICAgICAgICBjb25maWctZXh0ZW5zaW9ucy5kZWYgaW4gdGhlIGlkbGVsaWIgZGlyZWN0b3J5IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICAgICAgICBUaGUgZGVmYXVsdCBleHRlbnNpb25zIGFyZSBjdXJyZW50bHk6Ci0KLSAgICAgICAgICAgICAgICBGb3JtYXRQYXJhZ3JhcGgKLSAgICAgICAgICAgICAgICBBdXRvRXhwYW5kCi0gICAgICAgICAgICAgICAgWm9vbUhlaWdodAotICAgICAgICAgICAgICAgIFNjcmlwdEJpbmRpbmcKLSAgICAgICAgICAgICAgICBDYWxsVGlwcwotICAgICAgICAgICAgICAgIFBhcmVuTWF0Y2gKLSAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGUKLSAgICAgICAgICAgICAgICBDb2RlQ29udGV4dApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CmluZGV4IGE4Zjc1ZDIuLjA3MWJkM2UgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHBfYWJvdXQucHkKQEAgLTEsMTEgKzEsMTMgQEAKICIiIkFib3V0IERpYWxvZyBmb3IgSURMRQogCiAiIiIKLQogaW1wb3J0IG9zCiBmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbgorCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcKKworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldworCiAKIGNsYXNzIEFib3V0RGlhbG9nKFRvcGxldmVsKToKICAgICAiIiJNb2RhbCBhYm91dCBkaWFsb2cgZm9yIGlkbGUKQEAgLTEzNSwxNyArMTM3LDE4IEBACiAgICAgZGVmIGRpc3BsYXlfcHJpbnRlcl90ZXh0KHNlbGYsIHRpdGxlLCBwcmludGVyKToKICAgICAgICAgcHJpbnRlci5fUHJpbnRlcl9fc2V0dXAoKQogICAgICAgICB0ZXh0ID0gJ1xuJy5qb2luKHByaW50ZXIuX1ByaW50ZXJfX2xpbmVzKQotICAgICAgICB0ZXh0Vmlldy52aWV3X3RleHQoc2VsZiwgdGl0bGUsIHRleHQpCisgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dChzZWxmLCB0aXRsZSwgdGV4dCkKIAogICAgIGRlZiBkaXNwbGF5X2ZpbGVfdGV4dChzZWxmLCB0aXRsZSwgZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgogICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksIGZpbGVuYW1lKQotICAgICAgICB0ZXh0Vmlldy52aWV3X2ZpbGUoc2VsZiwgdGl0bGUsIGZuLCBlbmNvZGluZykKKyAgICAgICAgdGV4dHZpZXcudmlld19maWxlKHNlbGYsIHRpdGxlLCBmbiwgZW5jb2RpbmcpCiAKICAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgIHNlbGYuZGVzdHJveSgpCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2hlbHBhYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaGVscF9hYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihBYm91dERpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaGlzdG9yeS5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaGlzdG9yeS5weQppbmRleCAwNzhhZjI5Li41NmY1M2EwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQorKysgYi9MaWIvaWRsZWxpYi9oaXN0b3J5LnB5CkBAIC0xLDExICsxLDEyIEBACiAiSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20gd2l0aCBIaXN0b3J5IGNsYXNzIgogCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCisKIAogY2xhc3MgSGlzdG9yeToKICAgICAnJycgSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20uCiAKLSAgICBzdG9yZSAtIFN0b3JlIHNvdXJjZSBzdGF0ZW1lbnQgKGNhbGxlZCBmcm9tIFB5U2hlbGwucmVzZXRvdXRwdXQpLgorICAgIHN0b3JlIC0gU3RvcmUgc291cmNlIHN0YXRlbWVudCAoY2FsbGVkIGZyb20gcHlzaGVsbC5yZXNldG91dHB1dCkuCiAgICAgZmV0Y2ggLSBGZXRjaCBzdG9yZWQgc3RhdGVtZW50IG1hdGNoaW5nIHByZWZpeCBhbHJlYWR5IGVudGVyZWQuCiAgICAgaGlzdG9yeV9uZXh0IC0gQm91bmQgdG8gPDxoaXN0b3J5LW5leHQ+PiBldmVudCAoZGVmYXVsdCBBbHQtTikuCiAgICAgaGlzdG9yeV9wcmV2IC0gQm91bmQgdG8gPDxoaXN0b3J5LXByZXY+PiBldmVudCAoZGVmYXVsdCBBbHQtUCkuCkBAIC05OSw2ICsxMDAsNyBAQAogICAgICAgICBzZWxmLnBvaW50ZXIgPSBOb25lCiAgICAgICAgIHNlbGYucHJlZml4ID0gTm9uZQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgZnJvbSB1bml0dGVzdCBpbXBvcnQgbWFpbgotICAgIG1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaWRsZWhpc3RvcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2hpc3RvcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5IGIvTGliL2lkbGVsaWIvaHlwZXJwYXJzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2h5cGVycGFyc2VyLnB5CmluZGV4IDc3Y2IwNTcuLjQ1MGE3MDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2h5cGVycGFyc2VyLnB5CkBAIC00LDExICs0LDEwIEBACiBwcm9wZXIgaW5kZW50YXRpb24gb2YgY29kZS4gIEh5cGVyUGFyc2VyIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24KIHRoZSBzdHJ1Y3R1cmUgb2YgY29kZS4KICIiIgotCi1pbXBvcnQgc3RyaW5nCiBmcm9tIGtleXdvcmQgaW1wb3J0IGlza2V5d29yZAotZnJvbSBpZGxlbGliIGltcG9ydCBQeVBhcnNlCitpbXBvcnQgc3RyaW5nCiAKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlwYXJzZQogCiAjIGFsbCBBU0NJSSBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyCiBfQVNDSUlfSURfQ0hBUlMgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iKQpAQCAtMzAsNyArMjksNyBAQAogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBlZGl0d2luLnRleHQKIAotICAgICAgICBwYXJzZXIgPSBQeVBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQorICAgICAgICBwYXJzZXIgPSBweXBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQogCiAgICAgICAgIGRlZiBpbmRleDJsaW5lKGluZGV4KToKICAgICAgICAgICAgIHJldHVybiBpbnQoZmxvYXQoaW5kZXgpKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZS5weSBiL0xpYi9pZGxlbGliL2lkbGUucHkKaW5kZXggYTI0OTU1Ny4uYzAxY2Y5OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlLnB5CkBAIC03LDUgKzcsNSBAQAogaWRsZWxpYl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKQogc3lzLnBhdGguaW5zZXJ0KDAsIGlkbGVsaWJfZGlyKQogCi1pbXBvcnQgaWRsZWxpYi5QeVNoZWxsCi1pZGxlbGliLlB5U2hlbGwubWFpbigpCitpbXBvcnQgaWRsZWxpYi5weXNoZWxsCitpZGxlbGliLnB5c2hlbGwubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlLnB5dyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CmluZGV4IDE0MmNiMzIuLmU3M2MwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGUucHl3CisrKyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CkBAIC0xLDEwICsxLDEwIEBACiB0cnk6Ci0gICAgaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAorICAgIGltcG9ydCBpZGxlbGliLnB5c2hlbGwKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAjIElETEUgaXMgbm90IGluc3RhbGxlZCwgYnV0IG1heWJlIFB5U2hlbGwgaXMgb24gc3lzLnBhdGg6Ci0gICAgZnJvbSAuIGltcG9ydCBQeVNoZWxsCisgICAgIyBJRExFIGlzIG5vdCBpbnN0YWxsZWQsIGJ1dCBtYXliZSBweXNoZWxsIGlzIG9uIHN5cy5wYXRoOgorICAgIGZyb20gLiBpbXBvcnQgcHlzaGVsbAogICAgIGltcG9ydCBvcwotICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKFB5U2hlbGwuX19maWxlX18pKQorICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHB5c2hlbGwuX19maWxlX18pKQogICAgIGlmIGlkbGVkaXIgIT0gb3MuZ2V0Y3dkKCk6CiAgICAgICAgICMgV2UncmUgbm90IGluIHRoZSBJRExFIGRpcmVjdG9yeSwgaGVscCB0aGUgc3VicHJvY2VzcyBmaW5kIHJ1bi5weQogICAgICAgICBweXBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQpAQCAtMTIsNiArMTIsNiBAQAogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gcHlwYXRoICsgJzonICsgaWRsZWRpcgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gaWRsZWRpcgotICAgIFB5U2hlbGwubWFpbigpCisgICAgcHlzaGVsbC5tYWluKCkKIGVsc2U6Ci0gICAgaWRsZWxpYi5QeVNoZWxsLm1haW4oKQorICAgIGlkbGVsaWIucHlzaGVsbC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weQppbmRleCA4NDVjOTJkLi5hZDA2N2I0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5CkBAIC0xLDYgKzEsOCBAQAogJycnaWRsZWxpYi5pZGxlX3Rlc3QgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRlc3QudGVzdF9pZGxlLAogd2hpY2ggdGVzdHMgdGhlIElETEUgYXBwbGljYXRpb24gYXMgcGFydCBvZiB0aGUgc3RkbGliIHRlc3Qgc3VpdGUuCiBSdW4gSURMRSB0ZXN0cyBhbG9uZSB3aXRoICJweXRob24gLW0gdGVzdC50ZXN0X2lkbGUiLgorU3RhcnRpbmcgd2l0aCBQeXRob24gMy42LCBJRExFIHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgbGF0ZXIuCisKIFRoaXMgcGFja2FnZSBhbmQgaXRzIGNvbnRhaW5lZCBtb2R1bGVzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBhbmQKIGFueSBkaXJlY3QgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCiAnJycKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weQppbmRleCA1OGU2MmNiLi42ZjY3NmFlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvaHRlc3QucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5CkBAIC01OSwxOSArNTksMjAgQEAKIAogCiBNb2R1bGVzIGFuZCBjbGFzc2VzIG5vdCBiZWluZyB0ZXN0ZWQgYXQgdGhlIG1vbWVudDoKLVB5U2hlbGwuUHlTaGVsbEVkaXRvcldpbmRvdwotRGVidWdnZXIuRGVidWdnZXIKLUF1dG9Db21wbGV0ZVdpbmRvdy5BdXRvQ29tcGxldGVXaW5kb3cKLU91dHB1dFdpbmRvdy5PdXRwdXRXaW5kb3cgKGluZGlyZWN0bHkgYmVpbmcgdGVzdGVkIHdpdGggZ3JlcCB0ZXN0KQorcHlzaGVsbC5QeVNoZWxsRWRpdG9yV2luZG93CitkZWJ1Z2dlci5EZWJ1Z2dlcgorYXV0b2NvbXBsZXRlX3cuQXV0b0NvbXBsZXRlV2luZG93CitvdXR3aW4uT3V0cHV0V2luZG93IChpbmRpcmVjdGx5IGJlaW5nIHRlc3RlZCB3aXRoIGdyZXAgdGVzdCkKICcnJwogCiBmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQotZnJvbSBpZGxlbGliLm1hY29zeFN1cHBvcnQgaW1wb3J0IF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMKIGltcG9ydCB0a2ludGVyIGFzIHRrCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKK3RrLk5vRGVmYXVsdFJvb3QoKQogCiBBYm91dERpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2Fib3V0RGlhbG9nJywKLSAgICAna3dkcyc6IHsndGl0bGUnOiAnYWJvdXREaWFsb2cgdGVzdCcsCisgICAgJ2ZpbGUnOiAnaGVscF9hYm91dCcsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ2hlbHBfYWJvdXQgdGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsCiAgICAgICAgICAgICAgfSwKICAgICAnbXNnJzogIlRlc3QgZXZlcnkgYnV0dG9uLiBFbnN1cmUgUHl0aG9uLCBUSyBhbmQgSURMRSB2ZXJzaW9ucyAiCkBAIC03OSwxNCArODAsMTQgQEAKICAgICB9CiAKIF9jYWxsdGlwX3dpbmRvd19zcGVjID0gewotICAgICdmaWxlJzogJ0NhbGxUaXBXaW5kb3cnLAorICAgICdmaWxlJzogJ2NhbGx0aXBfdycsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlR5cGluZyAnKCcgc2hvdWxkIGRpc3BsYXkgYSBjYWxsdGlwLlxuIgogICAgICAgICAgICAiVHlwaW5nICcpIHNob3VsZCBoaWRlIHRoZSBjYWxsdGlwLlxuIgogICAgIH0KIAogX2NsYXNzX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdDbGFzc0Jyb3dzZXInLAorICAgICdmaWxlJzogJ2Jyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJJbnNwZWN0IG5hbWVzIG9mIG1vZHVsZSwgY2xhc3Mod2l0aCBzdXBlcmNsYXNzIGlmICIKICAgICAgICAgICAgImFwcGxpY2FibGUpLCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuXG5Ub2dnbGUgbmVzdGVkIGl0ZW1zLlxuIgpAQCAtOTUsNyArOTYsNyBAQAogICAgIH0KIAogX2NvbG9yX2RlbGVnYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ0NvbG9yRGVsZWdhdG9yJywKKyAgICAnZmlsZSc6ICdjb2xvcml6ZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgdGV4dCBpcyBzYW1wbGUgUHl0aG9uIGNvZGUuXG4iCiAgICAgICAgICAgICJFbnN1cmUgY29tcG9uZW50cyBsaWtlIGNvbW1lbnRzLCBrZXl3b3JkcywgYnVpbHRpbnMsXG4iCkBAIC0xMDQsNyArMTA1LDcgQEAKICAgICB9CiAKIENvbmZpZ0RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2NvbmZpZ0RpYWxvZycsCisgICAgJ2ZpbGUnOiAnY29uZmlnZGlhbG9nJywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnQ29uZmlnRGlhbG9nVGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsfSwKICAgICAnbXNnJzogIklETEUgcHJlZmVyZW5jZXMgZGlhbG9nLlxuIgpAQCAtMTIxLDcgKzEyMiw3IEBACiAKICMgVE9ETyBJbXByb3ZlIG1lc3NhZ2UKIF9keW5fb3B0aW9uX21lbnVfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdkeW5PcHRpb25NZW51V2lkZ2V0JywKKyAgICAnZmlsZSc6ICdkeW5vcHRpb24nLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJTZWxlY3Qgb25lIG9mIHRoZSBtYW55IG9wdGlvbnMgaW4gdGhlICdvbGQgb3B0aW9uIHNldCcuXG4iCiAgICAgICAgICAgICJDbGljayB0aGUgYnV0dG9uIHRvIGNoYW5nZSB0aGUgb3B0aW9uIHNldC5cbiIKQEAgLTEzMCwzOSArMTMxLDE1IEBACiAKICMgVE9ETyBlZGl0IHdyYXBwZXIKIF9lZGl0b3Jfd2luZG93X3NwZWMgPSB7Ci0gICAnZmlsZSc6ICdFZGl0b3JXaW5kb3cnLAorICAgJ2ZpbGUnOiAnZWRpdG9yJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGVzdCBlZGl0b3IgZnVuY3Rpb25zIG9mIGludGVyZXN0LlxuIgogICAgICAgICAgICAiQmVzdCB0byBjbG9zZSBlZGl0b3IgZmlyc3QuIgogICAgIH0KIAotR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdTZWN0aW9uTmFtZURpYWxvZycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzonR2V0IE5hbWUnLAotICAgICAgICAgICAgICdtZXNzYWdlJzonRW50ZXIgc29tZXRoaW5nJywKLSAgICAgICAgICAgICAndXNlZF9uYW1lcyc6IHsnYWJjJ30sCi0gICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAotICAgICdtc2cnOiAiQWZ0ZXIgdGhlIHRleHQgZW50ZXJlZCB3aXRoIFtPa10gaXMgc3RyaXBwZWQsIDxub3RoaW5nPiwgIgotICAgICAgICAgICAiJ2FiYycsIG9yIG1vcmUgdGhhdCAzMCBjaGFycyBhcmUgZXJyb3JzLlxuIgotICAgICAgICAgICAiQ2xvc2UgJ0dldCBOYW1lJyB3aXRoIGEgdmFsaWQgZW50cnkgKHByaW50ZWQgdG8gU2hlbGwpLCAiCi0gICAgICAgICAgICJbQ2FuY2VsXSwgb3IgW1hdIiwKLSAgICB9Ci0KLUdldEhlbHBTb3VyY2VEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdIZWxwU291cmNlRWRpdCcsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ0dldCBoZWxwc291cmNlJywKLSAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCi0gICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiAiCi0gICAgICAgICAgICI8bm90aGluZz4gYW5kIG1vcmUgdGhhbiAzMCBjaGFycyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCi0gICAgICAgICAgICI8bm90aGluZz4sIGZpbGUgZG9lcyBub3QgZXhpc3QgYXJlIGludmFsaWQgcGF0aCBpdGVtcy5cbiIKLSAgICAgICAgICAgIlRlc3QgZm9yIGluY29tcGxldGUgd2ViIGFkZHJlc3MgZm9yIGhlbHAgZmlsZSBwYXRoLlxuIgotICAgICAgICAgICAiQSB2YWxpZCBlbnRyeSB3aWxsIGJlIHByaW50ZWQgdG8gc2hlbGwgd2l0aCBbMGtdLlxuIgotICAgICAgICAgICAiW0NhbmNlbF0gd2lsbCBwcmludCBOb25lIHRvIHNoZWxsIiwKLSAgICB9Ci0KICMgVXBkYXRlIG9uY2UgaXNzdWUyMTUxOSBpcyByZXNvbHZlZC4KIEdldEtleXNEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdrZXliaW5kaW5nRGlhbG9nJywKKyAgICAnZmlsZSc6ICdjb25maWdfa2V5JywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCBrZXliaW5kaW5ncycsCiAgICAgICAgICAgICAgJ2FjdGlvbic6ICdmaW5kLWFnYWluJywKICAgICAgICAgICAgICAnY3VycmVudEtleVNlcXVlbmNlcyc6IFsnJ10gLApAQCAtMTc3LDcgKzE1NCw3IEBACiAgICAgfQogCiBfZ3JlcF9kaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdHcmVwRGlhbG9nJywKKyAgICAnZmlsZSc6ICdncmVwJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTaG93IEdyZXBEaWFsb2cnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdGhlIHZhcmlvdXMgJ0ZpbmQtaW4tZmlsZXMnIGZ1bmN0aW9ucy5cbiIKQEAgLTE4Niw4ICsxNjMsMjQgQEAKICAgICAgICAgICAgInNob3VsZCBvcGVuIHRoYXQgZmlsZSBcbmluIGEgbmV3IEVkaXRvcldpbmRvdy4iCiAgICAgfQogCitIZWxwU291cmNlX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdIZWxwIG5hbWUgYW5kIHNvdXJjZScsCisgICAgICAgICAgICAgJ21lbnVpdGVtJzogJ3Rlc3QnLAorICAgICAgICAgICAgICdmaWxlcGF0aCc6IF9fZmlsZV9fLAorICAgICAgICAgICAgICd1c2VkX25hbWVzJzogeydhYmMnfSwKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCisgICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiIKKyAgICAgICAgICAgIicnLCA+IHRoYW4gMzAgY2hhcnMsIGFuZCAnYWJjJyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCisgICAgICAgICAgICInJyBhbmQgZmlsZSBkb2VzIG5vdCBleGlzdCBhcmUgaW52YWxpZCBwYXRoIGl0ZW1zLlxuIgorICAgICAgICAgICAiQW55IHVybCAoJ3d3dy4uLicsICdodHRwLi4uJykgaXMgYWNjZXB0ZWQuXG4iCisgICAgICAgICAgICJUZXN0IEJyb3dzZSB3aXRoIGFuZCB3aXRob3V0IHBhdGgsIGFzIGNhbm5vdCB1bml0dGVzdC5cbiIKKyAgICAgICAgICAgIltPa10gb3IgPFJldHVybj4gcHJpbnRzIHZhbGlkIGVudHJ5IHRvIHNoZWxsXG4iCisgICAgICAgICAgICJbQ2FuY2VsXSBvciA8RXNjYXBlPiBwcmludHMgTm9uZSB0byBzaGVsbCIKKyAgICB9CisKIF9pb19iaW5kaW5nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnSU9CaW5kaW5nJywKKyAgICAnZmlsZSc6ICdpb21lbnUnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IHRoZSBmb2xsb3dpbmcgYmluZGluZ3MuXG4iCiAgICAgICAgICAgICI8Q29udHJvbC1vPiB0byBvcGVuIGZpbGUgZnJvbSBkaWFsb2cuXG4iCkBAIC0yMDAsNyArMTkzLDcgQEAKICAgICB9CiAKIF9tdWx0aV9jYWxsX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlDYWxsJywKKyAgICAnZmlsZSc6ICdtdWx0aWNhbGwnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIHRyaWdnZXIgYSBwcmludCB0byBjb25zb2xlIG9yIElETEUiCiAgICAgICAgICAgICIgU2hlbGwuXG5FbnRlcmluZyBhbmQgbGVhdmluZyB0aGUgdGV4dCBhcmVhLCBrZXkgZW50cnksICIKQEAgLTIxMCwxNCArMjAzLDE0IEBACiAgICAgfQogCiBfbXVsdGlzdGF0dXNfYmFyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlTdGF0dXNCYXInLAorICAgICdmaWxlJzogJ3N0YXR1c2JhcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkVuc3VyZSBwcmVzZW5jZSBvZiBtdWx0aS1zdGF0dXMgYmFyIGJlbG93IHRleHQgYXJlYS5cbiIKICAgICAgICAgICAgIkNsaWNrICdVcGRhdGUgU3RhdHVzJyB0byBjaGFuZ2UgdGhlIG11bHRpLXN0YXR1cyB0ZXh0IgogICAgIH0KIAogX29iamVjdF9icm93c2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnT2JqZWN0QnJvd3NlcicsCisgICAgJ2ZpbGUnOiAnZGVidWdvYmonLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJEb3VibGUgY2xpY2sgb24gaXRlbXMgdXB0byB0aGUgbG93ZXN0IGxldmVsLlxuIgogICAgICAgICAgICAiQXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0cyBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbiAiCkBAIC0yMjUsNyArMjE4LDcgQEAKICAgICB9CiAKIF9wYXRoX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdQYXRoQnJvd3NlcicsCisgICAgJ2ZpbGUnOiAncGF0aGJyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IGZvciBjb3JyZWN0IGRpc3BsYXkgb2YgYWxsIHBhdGhzIGluIHN5cy5wYXRoLlxuIgogICAgICAgICAgICAiVG9nZ2xlIG5lc3RlZCBpdGVtcyB1cHRvIHRoZSBsb3dlc3QgbGV2ZWwuXG4iCkBAIC0yMzQsNyArMjI3LDcgQEAKICAgICB9CiAKIF9wZXJjb2xhdG9yX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUGVyY29sYXRvcicsCisgICAgJ2ZpbGUnOiAncGVyY29sYXRvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRoZXJlIGFyZSB0d28gdHJhY2VycyB3aGljaCBjYW4gYmUgdG9nZ2xlZCB1c2luZyBhIGNoZWNrYm94LlxuIgogICAgICAgICAgICAiVG9nZ2xpbmcgYSB0cmFjZXIgJ29uJyBieSBjaGVja2luZyBpdCBzaG91bGQgcHJpbnQgdHJhY2VyIgpAQCAtMjQ0LDggKzIzNywyMCBAQAogICAgICAgICAgICAiVGVzdCBmb3IgYWN0aW9ucyBsaWtlIHRleHQgZW50cnksIGFuZCByZW1vdmFsLiIKICAgICB9CiAKK1F1ZXJ5X3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdRdWVyeScsCisgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnRW50ZXIgc29tZXRoaW5nJywKKyAgICAgICAgICAgICAndGV4dDAnOiAnR28nLAorICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKKyAgICAnbXNnJzogIkVudGVyIHdpdGggPFJldHVybj4gb3IgW09rXS4gIFByaW50IHZhbGlkIGVudHJ5IHRvIFNoZWxsXG4iCisgICAgICAgICAgICJCbGFuayBsaW5lLCBhZnRlciBzdHJpcHBpbmcsIGlzIGlnbm9yZWRcbiIKKyAgICAgICAgICAgIkNsb3NlIGRpYWxvZyB3aXRoIHZhbGlkIGVudHJ5LCA8RXNjYXBlPiwgW0NhbmNlbF0sIFtYXSIKKyAgICB9CisKKwogX3JlcGxhY2VfZGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUmVwbGFjZURpYWxvZycsCisgICAgJ2ZpbGUnOiAncmVwbGFjZScsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkNsaWNrIHRoZSAnUmVwbGFjZScgYnV0dG9uLlxuIgogICAgICAgICAgICAiVGVzdCB2YXJpb3VzIHJlcGxhY2Ugb3B0aW9ucyBpbiB0aGUgJ1JlcGxhY2UgZGlhbG9nJy5cbiIKQEAgLTI1MywxNSArMjU4LDIyIEBACiAgICAgfQogCiBfc2VhcmNoX2RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ1NlYXJjaERpYWxvZycsCisgICAgJ2ZpbGUnOiAnc2VhcmNoJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTZWFyY2gnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdmFyaW91cyBzZWFyY2ggb3B0aW9ucyBpbiB0aGUgJ1NlYXJjaCBkaWFsb2cnLlxuIgogICAgICAgICAgICAiQ2xpY2sgW0Nsb3NlXSBvciBbWF0gdG8gY2xvc2UgdGhlICdTZWFyY2ggRGlhbG9nJy4iCiAgICAgfQogCitfc2VhcmNoYmFzZV9zcGVjID0geworICAgICdmaWxlJzogJ3NlYXJjaGJhc2UnLAorICAgICdrd2RzJzoge30sCisgICAgJ21zZyc6ICJDaGVjayB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYmFzZSBzZWFyY2ggZGlhbG9nXG4iCisgICAgICAgICAgICJJdHMgb25seSBhY3Rpb24gaXMgdG8gY2xvc2UuIgorICAgIH0KKwogX3Njcm9sbGVkX2xpc3Rfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdTY3JvbGxlZExpc3QnLAorICAgICdmaWxlJzogJ3Njcm9sbGVkbGlzdCcsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIllvdSBzaG91bGQgc2VlIGEgc2Nyb2xsYWJsZSBsaXN0IG9mIGl0ZW1zXG4iCiAgICAgICAgICAgICJTZWxlY3RpbmcgKGNsaWNraW5nKSBvciBkb3VibGUgY2xpY2tpbmcgYW4gaXRlbSAiCkBAIC0yNzcsNyArMjg5LDcgQEAKICAgICB9CiAKIF9zdGFja192aWV3ZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdTdGFja1ZpZXdlcicsCisgICAgJ2ZpbGUnOiAnc3RhY2t2aWV3ZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJBIHN0YWNrdHJhY2UgZm9yIGEgTmFtZUVycm9yIGV4Y2VwdGlvbi5cbiIKICAgICAgICAgICAgIkV4cGFuZCAnaWRsZWxpYiAuLi4nIGFuZCAnPGxvY2Fscz4nLlxuIgpAQCAtMjk1LDggKzMwNyw4IEBACiAgICAgfQogCiBUZXh0Vmlld2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAndGV4dFZpZXcnLAotICAgICdrd2RzJzogeyd0aXRsZSc6ICdUZXN0IHRleHRWaWV3JywKKyAgICAnZmlsZSc6ICd0ZXh0dmlldycsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3QgdGV4dHZpZXcnLAogICAgICAgICAgICAgICd0ZXh0JzonVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy5cbicqMzUsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAogICAgICdtc2cnOiAiVGVzdCBmb3IgcmVhZC1vbmx5IHByb3BlcnR5IG9mIHRleHQuXG4iCkBAIC0zMDQsMjEgKzMxNiwyMSBAQAogICAgICB9CiAKIF90b29sdGlwX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnVG9vbFRpcCcsCisgICAgJ2ZpbGUnOiAndG9vbHRpcCcsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlBsYWNlIG1vdXNlIGN1cnNvciBvdmVyIGJvdGggdGhlIGJ1dHRvbnNcbiIKICAgICAgICAgICAgIkEgdG9vbHRpcCBzaG91bGQgYXBwZWFyIHdpdGggc29tZSB0ZXh0LiIKICAgICB9CiAKIF90cmVlX3dpZGdldF9zcGVjID0gewotICAgICdmaWxlJzogJ1RyZWVXaWRnZXQnLAorICAgICdmaWxlJzogJ3RyZWUnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgY2FudmFzIGlzIHNjcm9sbGFibGUuXG4iCiAgICAgICAgICAgICJDbGljayBvbiBmb2xkZXJzIHVwdG8gdG8gdGhlIGxvd2VzdCBsZXZlbC4iCiAgICAgfQogCiBfdW5kb19kZWxlZ2F0b3Jfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdVbmRvRGVsZWdhdG9yJywKKyAgICAnZmlsZSc6ICd1bmRvJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgW1VuZG9dIHRvIHVuZG8gYW55IGFjdGlvbi5cbiIKICAgICAgICAgICAgIkNsaWNrIFtSZWRvXSB0byByZWRvIGFueSBhY3Rpb24uXG4iCkBAIC0zMjcsNyArMzM5LDcgQEAKICAgICB9CiAKIF93aWRnZXRfcmVkaXJlY3Rvcl9zcGVjID0gewotICAgICdmaWxlJzogJ1dpZGdldFJlZGlyZWN0b3InLAorICAgICdmaWxlJzogJ3JlZGlyZWN0b3InLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJFdmVyeSB0ZXh0IGluc2VydCBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS4iCiAgICAgICAgICAgICJvciB0aGUgSURMRSBzaGVsbC4iCkBAIC0zMzcsMTQgKzM0OSwxMyBAQAogICAgIHJvb3QgPSB0ay5UaygpCiAgICAgcm9vdC50aXRsZSgnSURMRSBodGVzdCcpCiAgICAgcm9vdC5yZXNpemFibGUoMCwgMCkKLSAgICBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpCiAKICAgICAjIGEgc2Nyb2xsYWJsZSBMYWJlbCBsaWtlIGNvbnN0YW50IHdpZHRoIHRleHQgd2lkZ2V0LgogICAgIGZyYW1lTGFiZWwgPSB0ay5GcmFtZShyb290LCBwYWR4PTEwKQogICAgIGZyYW1lTGFiZWwucGFjaygpCiAgICAgdGV4dCA9IHRrLlRleHQoZnJhbWVMYWJlbCwgd3JhcD0nd29yZCcpCiAgICAgdGV4dC5jb25maWd1cmUoYmc9cm9vdC5jZ2V0KCdiZycpLCByZWxpZWY9J2ZsYXQnLCBoZWlnaHQ9NCwgd2lkdGg9NzApCi0gICAgc2Nyb2xsYmFyID0gdGsuU2Nyb2xsYmFyKGZyYW1lTGFiZWwsIGNvbW1hbmQ9dGV4dC55dmlldykKKyAgICBzY3JvbGxiYXIgPSBTY3JvbGxiYXIoZnJhbWVMYWJlbCwgY29tbWFuZD10ZXh0Lnl2aWV3KQogICAgIHRleHQuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNjcm9sbGJhci5zZXQpCiAgICAgc2Nyb2xsYmFyLnBhY2soc2lkZT0ncmlnaHQnLCBmaWxsPSd5JywgZXhwYW5kPUZhbHNlKQogICAgIHRleHQucGFjayhzaWRlPSdsZWZ0JywgZmlsbD0nYm90aCcsIGV4cGFuZD1UcnVlKQpAQCAtMzY1LDExICszNzYsMTEgQEAKICAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihtb2QsIHRlc3RfbmFtZSkKICAgICAgICAgICAgICAgICB0ZXN0X2xpc3QuYXBwZW5kKCh0ZXN0X3NwZWMsIHRlc3QpKQogCi0gICAgdGVzdF9uYW1lID0gdGsuU3RyaW5nVmFyKCcnKQorICAgIHRlc3RfbmFtZSA9IHRrLlN0cmluZ1Zhcihyb290KQogICAgIGNhbGxhYmxlX29iamVjdCA9IE5vbmUKICAgICB0ZXN0X2t3ZHMgPSBOb25lCiAKLSAgICBkZWYgbmV4dCgpOgorICAgIGRlZiBuZXh0X3Rlc3QoKToKIAogICAgICAgICBub25sb2NhbCB0ZXN0X25hbWUsIGNhbGxhYmxlX29iamVjdCwgdGVzdF9rd2RzCiAgICAgICAgIGlmIGxlbih0ZXN0X2xpc3QpID09IDE6CkBAIC0zODQsMjAgKzM5NSwyNiBAQAogICAgICAgICB0ZXh0Lmluc2VydCgiMS4wIix0ZXN0X3NwZWNbJ21zZyddKQogICAgICAgICB0ZXh0LmNvbmZpZ3VyZShzdGF0ZT0nZGlzYWJsZWQnKSAjIHByZXNlcnZlIHJlYWQtb25seSBwcm9wZXJ0eQogCi0gICAgZGVmIHJ1bl90ZXN0KCk6CisgICAgZGVmIHJ1bl90ZXN0KF89Tm9uZSk6CiAgICAgICAgIHdpZGdldCA9IGNhbGxhYmxlX29iamVjdCgqKnRlc3Rfa3dkcykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcHJpbnQod2lkZ2V0LnJlc3VsdCkKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgcGFzcwogCi0gICAgYnV0dG9uID0gdGsuQnV0dG9uKHJvb3QsIHRleHR2YXJpYWJsZT10ZXN0X25hbWUsIGNvbW1hbmQ9cnVuX3Rlc3QpCisgICAgZGVmIGNsb3NlKF89Tm9uZSk6CisgICAgICAgIHJvb3QuZGVzdHJveSgpCisKKyAgICBidXR0b24gPSB0ay5CdXR0b24ocm9vdCwgdGV4dHZhcmlhYmxlPXRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nYWN0aXZlJywgY29tbWFuZD1ydW5fdGVzdCkKKyAgICBuZXh0X2J1dHRvbiA9IHRrLkJ1dHRvbihyb290LCB0ZXh0PSJOZXh0IiwgY29tbWFuZD1uZXh0X3Rlc3QpCiAgICAgYnV0dG9uLnBhY2soKQotICAgIG5leHRfYnV0dG9uID0gdGsuQnV0dG9uKHJvb3QsIHRleHQ9Ik5leHQiLCBjb21tYW5kPW5leHQpCiAgICAgbmV4dF9idXR0b24ucGFjaygpCisgICAgbmV4dF9idXR0b24uZm9jdXNfc2V0KCkKKyAgICByb290LmJpbmQoJzxLZXktUmV0dXJuPicsIHJ1bl90ZXN0KQorICAgIHJvb3QuYmluZCgnPEtleS1Fc2NhcGU+JywgY2xvc2UpCiAKLSAgICBuZXh0KCkKLQorICAgIG5leHRfdGVzdCgpCiAgICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfaWRsZS5weQppbmRleCAxNjcyYTM0Li5jN2I0OWVmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIAogCiBjbGFzcyBFZGl0b3I6Ci0gICAgJycnTWluaW1hbGx5IGltaXRhdGUgRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdyBjbGFzcy4KKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBlZGl0b3IuRWRpdG9yV2luZG93IGNsYXNzLgogICAgICcnJwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToKICAgICAgICAgc2VsZi50ZXh0ID0gVGV4dCgpCkBAIC00Niw3ICs0Niw3IEBACiAKIAogY2xhc3MgVW5kb0RlbGVnYXRvcjoKLSAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBVbmRvRGVsZWdhdG9yLFVuZG9EZWxlZ2F0b3IgY2xhc3MuCisgICAgJycnTWluaW1hbGx5IGltaXRhdGUgdW5kby5VbmRvRGVsZWdhdG9yIGNsYXNzLgogICAgICcnJwogICAgICMgQSByZWFsIHVuZG8gYmxvY2sgaXMgb25seSBuZWVkZWQgZm9yIHVzZXIgaW50ZXJhY3Rpb24uCiAgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoKmFyZ3MpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5CmluZGV4IDVmYzg5OWQuLmYzZjJkZWEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9jb21wbGV0ZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkKQEAgLTEsOSArMSwxMyBAQAorJycnIFRlc3QgYXV0b2NvbXBsZXRlIGFuZCBhdXRvY29tcGxlX3cKKworQ292ZXJhZ2Ugb2YgYXV0b2NvbXBsZTogNTYlCisnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiAKLWltcG9ydCBpZGxlbGliLkF1dG9Db21wbGV0ZSBhcyBhYwotaW1wb3J0IGlkbGVsaWIuQXV0b0NvbXBsZXRlV2luZG93IGFzIGFjdworaW1wb3J0IGlkbGVsaWIuYXV0b2NvbXBsZXRlIGFzIGFjCitpbXBvcnQgaWRsZWxpYi5hdXRvY29tcGxldGVfdyBhcyBhY3cKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IEV2ZW50CiAKQEAgLTkxLDYgKzk1LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGF1dG9jb21wbGV0ZS5hdXRvY29tcGxldGVfZXZlbnQoZXYpKQogICAgICAgICBkZWwgZXYubWNfc3RhdGUKIAorICAgICAgICAjIFRlc3QgdGhhdCB0YWIgYWZ0ZXIgd2hpdGVzcGFjZSBpcyBpZ25vcmVkLgorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCcxLjAnLCAnICAgICAgICAiIiJEb2NzdHJpbmcuXG4gICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0ZV9ldmVudChldikpCisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQorCiAgICAgICAgICMgSWYgYXV0b2NvbXBsZXRlIHdpbmRvdyBpcyBvcGVuLCBjb21wbGV0ZSgpIG1ldGhvZCBpcyBjYWxsZWQKICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgJ3JlLicpCiAgICAgICAgICMgVGhpcyBtdXN0IGNhbGwgYXV0b2NvbXBsZXRlLl9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKaW5kZXggZDJhMzE1Ni4uYWU4MTg2YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvZXhwYW5kLnB5CkBAIC0xLDkgKzEsOSBAQAotIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5BdXRvRXhwYW5kIiIiCisiIiJVbml0IHRlc3RzIGZvciBpZGxlbGliLmF1dG9leHBhbmQiIiIKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrCiAjZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBUZXh0Ci1mcm9tIGlkbGVsaWIuQXV0b0V4cGFuZCBpbXBvcnQgQXV0b0V4cGFuZAorZnJvbSBpZGxlbGliLmF1dG9leHBhbmQgaW1wb3J0IEF1dG9FeHBhbmQKIAogCiBjbGFzcyBEdW1teV9FZGl0d2luOgpAQCAtMjIsNiArMjIsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY2xzLnRleHQgPSBUZXh0KCkKICAgICAgICAgY2xzLmF1dG9fZXhwYW5kID0gQXV0b0V4cGFuZChEdW1teV9FZGl0d2luKGNscy50ZXh0KSkKKyAgICAgICAgY2xzLmF1dG9fZXhwYW5kLmJlbGwgPSBsYW1iZGE6IE5vbmUKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CkBAIC0xMzcsNSArMTM4LDYgQEAKICAgICAgICAgbmV3X3N0YXRlID0gc2VsZi5hdXRvX2V4cGFuZC5zdGF0ZQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGluaXRpYWxfc3RhdGUsIG5ld19zdGF0ZSkKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jYWxsdGlwcy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CmluZGV4IGIyYTczM2MuLjBiMTE2MDIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5CkBAIC0xLDUgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgaWRsZWxpYi5DYWxsVGlwcyBhcyBjdAoraW1wb3J0IGlkbGVsaWIuY2FsbHRpcHMgYXMgY3QKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHR5cGVzCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbG9yaXplci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbG9yaXplci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhiYzNlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5CkBAIC0wLDAgKzEsNTYgQEAKKycnJ1Rlc3QgaWRsZWxpYi9jb2xvcml6ZXIucHkKKworUGVyZm9ybSBtaW5pbWFsIHNhbml0eSBjaGVja3MgdGhhdCBtb2R1bGUgaW1wb3J0cyBhbmQgc29tZSB0aGluZ3MgcnVuLgorCitDb3ZlcmFnZSAyMiUuCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29sb3JpemVyICAjIGFsd2F5cyB0ZXN0IGltcG9ydAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGdW5jdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYW55KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sb3JpemVyLmFueSgndGVzdCcsICgnYScsICdiJykpKQorCisgICAgZGVmIHRlc3RfbWFrZV9wYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xvcml6ZXIubWFrZV9wYXQoKSkKKworCitjbGFzcyBDb2xvckNvbmZpZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMudGV4dCA9IFRleHQoY2xzLnJvb3QpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLnRleHQKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfY29sb3JpemVyKHNlbGYpOgorICAgICAgICBjb2xvcml6ZXIuY29sb3JfY29uZmlnKHNlbGYudGV4dCkKKworY2xhc3MgQ29sb3JEZWxlZ2F0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2NvbG9yaXplcihzZWxmKToKKyAgICAgICAgY29sb3JpemVyLkNvbG9yRGVsZWdhdG9yKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWcucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYTFhMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZy5weQpAQCAtMCwwICsxLDE2MCBAQAorJycnVGVzdCBpZGxlbGliLmNvbmZpZy4KKworTXVjaCBpcyB0ZXN0ZWQgYnkgb3BlbmluZyBjb25maWcgZGlhbG9nIGxpdmUgb3IgaW4gdGVzdF9jb25maWdkaWFsb2cuCitDb3ZlcmFnZTogMjclCisnJycKK2Zyb20gc3lzIGltcG9ydCBtb2R1bGVzCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3RkZXJyCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnCisKKyMgVGVzdHMgc2hvdWxkIG5vdCBkZXBlbmQgb24gZm9ydHVpdG91cyB1c2VyIGNvbmZpZ3VyYXRpb25zLgorIyBUaGV5IG11c3Qgbm90IGFmZmVjdCBhY3R1YWwgdXNlciAuY2ZnIGZpbGVzLgorIyBSZXBsYWNlIHVzZXIgcGFyc2VycyB3aXRoIGVtcHR5IHBhcnNlcnMgdGhhdCBjYW5ub3QgYmUgc2F2ZWQuCisKK2lkbGVDb25mID0gY29uZmlnLmlkbGVDb25mCit1c2VyY2ZnID0gaWRsZUNvbmYudXNlckNmZwordGVzdGNmZyA9IHt9Cit1c2VybWFpbiA9IHRlc3RjZmdbJ21haW4nXSA9IGNvbmZpZy5JZGxlVXNlckNvbmZQYXJzZXIoJycpICAjIGZpbGVuYW1lCit1c2VyaGlnaCA9IHRlc3RjZmdbJ2hpZ2hsaWdodCddID0gY29uZmlnLklkbGVVc2VyQ29uZlBhcnNlcignJykKK3VzZXJrZXlzID0gdGVzdGNmZ1sna2V5cyddID0gY29uZmlnLklkbGVVc2VyQ29uZlBhcnNlcignJykKKworZGVmIHNldFVwTW9kdWxlKCk6CisgICAgaWRsZUNvbmYudXNlckNmZyA9IHRlc3RjZmcKKworZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgaWRsZUNvbmYudXNlckNmZyA9IHVzZXJjZmcKKworCitjbGFzcyBDdXJyZW50Q29sb3JLZXlzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiIFRlc3QgY29sb3JrZXlzIGZ1bmN0aW9uIHdpdGggdXNlciBjb25maWcgW1RoZW1lXSBhbmQgW0tleXNdIHBhdHRlcm5zLgorCisgICAgICAgIGNvbG9ya2V5cyA9IGNvbmZpZy5JZGxlQ29uZi5jdXJyZW50X2NvbG9yc19hbmRfa2V5cworICAgICAgICBUZXN0IGFsbCBwYXR0ZXJucyB3cml0dGVuIGJ5IElETEUgYW5kIHNvbWUgZXJyb3JzCisgICAgICAgIEl0ZW0gJ2RlZmF1bHQnIHNob3VsZCByZWFsbHkgYmUgJ2J1aWx0aW4nICh2ZXJzdXMgJ2N1c3RvbSkuCisgICAgIiIiCisgICAgY29sb3JrZXlzID0gaWRsZUNvbmYuY3VycmVudF9jb2xvcnNfYW5kX2tleXMKKyAgICBkZWZhdWx0X3RoZW1lID0gJ0lETEUgQ2xhc3NpYycKKyAgICBkZWZhdWx0X2tleXMgPSBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKQorCisgICAgZGVmIHRlc3Rfb2xkX2J1aWx0aW5fdGhlbWUoc2VsZik6CisgICAgICAgICMgT24gaW5pdGlhbCBpbnN0YWxsYXRpb24sIHVzZXIgbWFpbiBpcyBibGFuay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgc2VsZi5kZWZhdWx0X3RoZW1lKQorICAgICAgICAjIEZvciBvbGQgZGVmYXVsdCwgbmFtZTIgbXVzdCBiZSBibGFuay4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbVGhlbWVdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgJycnKQorICAgICAgICAjIElETEUgb21pdHMgJ25hbWUnIGZvciBkZWZhdWx0IG9sZCBidWlsdGluIHRoZW1lLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCBzZWxmLmRlZmF1bHRfdGhlbWUpCisgICAgICAgICMgSURMRSBhZGRzICduYW1lJyBmb3Igbm9uLWRlZmF1bHQgb2xkIGJ1aWx0aW4gdGhlbWUuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lJ10gPSAnSURMRSBOZXcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIE5ldycpCisgICAgICAgICMgRXJyb25lb3VzIG5vbi1kZWZhdWx0IG9sZCBidWlsdGluIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW5bJ1RoZW1lJ11bJ25hbWUnXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksIHNlbGYuZGVmYXVsdF90aGVtZSkKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ1RoZW1lJykKKworICAgIGRlZiB0ZXN0X25ld19idWlsdGluX3RoZW1lKHNlbGYpOgorICAgICAgICAjIElETEUgd3JpdGVzIG5hbWUyIGZvciBuZXcgYnVpbHRpbnMuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW1RoZW1lXQorICAgICAgICAgICAgZGVmYXVsdCA9IFRydWUKKyAgICAgICAgICAgIG5hbWUyID0gSURMRSBEYXJrCisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIERhcmsnKQorICAgICAgICAjIExlZnRvdmVyICduYW1lJywgbm90IHJlbW92ZWQsIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lJ10gPSAnSURMRSBOZXcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIERhcmsnKQorICAgICAgICAjIEVycm9uZW91cyBub24tZGVmYXVsdCBuZXcgYnVpbHRpbiByZXZlcnRzIHRvIGRlZmF1bHQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lMiddID0gJ25vbi1leGlzdGVudCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgc2VsZi5kZWZhdWx0X3RoZW1lKQorICAgICAgICB1c2VybWFpbi5yZW1vdmVfc2VjdGlvbignVGhlbWUnKQorCisgICAgZGVmIHRlc3RfdXNlcl9vdmVycmlkZV90aGVtZShzZWxmKToKKyAgICAgICAgIyBFcnJvbmVvdXMgY3VzdG9tIG5hbWUgKG5vIGRlZmluaXRpb24pIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbVGhlbWVdCisgICAgICAgICAgICBkZWZhdWx0ID0gRmFsc2UKKyAgICAgICAgICAgIG5hbWUgPSBDdXN0b20gRGFyaworICAgICAgICAgICAgJycnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCBzZWxmLmRlZmF1bHRfdGhlbWUpCisgICAgICAgICMgQ3VzdG9tIG5hbWUgaXMgdmFsaWQgd2l0aCBtYXRjaGluZyBTZWN0aW9uIG5hbWUuCisgICAgICAgIHVzZXJoaWdoLnJlYWRfc3RyaW5nKCdbQ3VzdG9tIERhcmtdXG5hPWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCAnQ3VzdG9tIERhcmsnKQorICAgICAgICAjIE5hbWUyIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lMiddID0gJ25vbi1leGlzdGVudCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0N1c3RvbSBEYXJrJykKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ1RoZW1lJykKKyAgICAgICAgdXNlcmhpZ2gucmVtb3ZlX3NlY3Rpb24oJ0N1c3RvbSBEYXJrJykKKworICAgIGRlZiB0ZXN0X29sZF9idWlsdGluX2tleXMoc2VsZik6CisgICAgICAgICMgT24gaW5pdGlhbCBpbnN0YWxsYXRpb24sIHVzZXIgbWFpbiBpcyBibGFuay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnS2V5cycpLCBzZWxmLmRlZmF1bHRfa2V5cykKKyAgICAgICAgIyBGb3Igb2xkIGRlZmF1bHQsIG5hbWUyIG11c3QgYmUgYmxhbmssIG5hbWUgaXMgYWx3YXlzIHVzZWQuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW0tleXNdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgbmFtZSA9IElETEUgQ2xhc3NpYyBVbml4CisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0lETEUgQ2xhc3NpYyBVbml4JykKKyAgICAgICAgIyBFcnJvbmVvdXMgbm9uLWRlZmF1bHQgb2xkIGJ1aWx0aW4gcmV2ZXJ0cyB0byBkZWZhdWx0LgorICAgICAgICB1c2VybWFpblsnS2V5cyddWyduYW1lJ10gPSAnbm9uLWV4aXN0ZW50JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdLZXlzJyksIHNlbGYuZGVmYXVsdF9rZXlzKQorICAgICAgICB1c2VybWFpbi5yZW1vdmVfc2VjdGlvbignS2V5cycpCisKKyAgICBkZWYgdGVzdF9uZXdfYnVpbHRpbl9rZXlzKHNlbGYpOgorICAgICAgICAjIElETEUgd3JpdGVzIG5hbWUyIGZvciBuZXcgYnVpbHRpbnMuCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW0tleXNdCisgICAgICAgICAgICBkZWZhdWx0ID0gVHJ1ZQorICAgICAgICAgICAgbmFtZTIgPSBJRExFIE1vZGVybiBVbml4CisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0lETEUgTW9kZXJuIFVuaXgnKQorICAgICAgICAjIExlZnRvdmVyICduYW1lJywgbm90IHJlbW92ZWQsIGlzIGlnbm9yZWQuCisgICAgICAgIHVzZXJtYWluWydLZXlzJ11bJ25hbWUnXSA9ICdJRExFIENsYXNzaWMgVW5peCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnS2V5cycpLCAnSURMRSBNb2Rlcm4gVW5peCcpCisgICAgICAgICMgRXJyb25lb3VzIG5vbi1kZWZhdWx0IG5ldyBidWlsdGluIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW5bJ0tleXMnXVsnbmFtZTInXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgc2VsZi5kZWZhdWx0X2tleXMpCisgICAgICAgIHVzZXJtYWluLnJlbW92ZV9zZWN0aW9uKCdLZXlzJykKKworICAgIGRlZiB0ZXN0X3VzZXJfb3ZlcnJpZGVfa2V5cyhzZWxmKToKKyAgICAgICAgIyBFcnJvbmVvdXMgY3VzdG9tIG5hbWUgKG5vIGRlZmluaXRpb24pIHJldmVydHMgdG8gZGVmYXVsdC4KKyAgICAgICAgdXNlcm1haW4ucmVhZF9zdHJpbmcoJycnCisgICAgICAgICAgICBbS2V5c10KKyAgICAgICAgICAgIGRlZmF1bHQgPSBGYWxzZQorICAgICAgICAgICAgbmFtZSA9IEN1c3RvbSBLZXlzCisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgc2VsZi5kZWZhdWx0X2tleXMpCisgICAgICAgICMgQ3VzdG9tIG5hbWUgaXMgdmFsaWQgd2l0aCBtYXRjaGluZyBTZWN0aW9uIG5hbWUuCisgICAgICAgIHVzZXJrZXlzLnJlYWRfc3RyaW5nKCdbQ3VzdG9tIEtleXNdXG5hPWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdLZXlzJyksICdDdXN0b20gS2V5cycpCisgICAgICAgICMgTmFtZTIgaXMgaWdub3JlZC4KKyAgICAgICAgdXNlcm1haW5bJ0tleXMnXVsnbmFtZTInXSA9ICdub24tZXhpc3RlbnQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ0tleXMnKSwgJ0N1c3RvbSBLZXlzJykKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ0tleXMnKQorICAgICAgICB1c2Vya2V5cy5yZW1vdmVfc2VjdGlvbignQ3VzdG9tIEtleXMnKQorCisKK2NsYXNzIFdhcm5pbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3dhcm4oc2VsZik6CisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBjb25maWcuX3dhcm5lZCA9IHNldCgpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgc3RkZXJyOgorICAgICAgICAgICAgY29uZmlnLl93YXJuKCd3YXJuaW5nJywgJ2tleScpCisgICAgICAgIEVxdWFsKGNvbmZpZy5fd2FybmVkLCB7KCd3YXJuaW5nJywna2V5Jyl9KQorICAgICAgICBFcXVhbChzdGRlcnIuZ2V0dmFsdWUoKSwgJ3dhcm5pbmcnKydcbicpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgc3RkZXJyOgorICAgICAgICAgICAgY29uZmlnLl93YXJuKCd3YXJuaW5nJywgJ2tleScpCisgICAgICAgIEVxdWFsKHN0ZGVyci5nZXR2YWx1ZSgpLCAnJykKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRlcnIoKSBhcyBzdGRlcnI6CisgICAgICAgICAgICBjb25maWcuX3dhcm4oJ3dhcm4yJywgJ3llaycpCisgICAgICAgIEVxdWFsKGNvbmZpZy5fd2FybmVkLCB7KCd3YXJuaW5nJywna2V5JyksICgnd2FybjInLCd5ZWsnKX0pCisgICAgICAgIEVxdWFsKHN0ZGVyci5nZXR2YWx1ZSgpLCAnd2FybjInKydcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfaGVscC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZjhlZC4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfaGVscC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0iIiJVbml0dGVzdHMgZm9yIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQiIiIKLWltcG9ydCB1bml0dGVzdAotZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIsIE1ib3gsIEVudHJ5Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ0hlbHBTb3VyY2VFZGl0IGFzIGhlbHBfZGlhbG9nX21vZHVsZQotCi1oZWxwX2RpYWxvZyA9IGhlbHBfZGlhbG9nX21vZHVsZS5HZXRIZWxwU291cmNlRGlhbG9nCi0KLQotY2xhc3MgRHVtbXlfaGVscF9kaWFsb2c6Ci0gICAgIyBNb2NrIGZvciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiBoZWxwX2RpYWxvZwotICAgIG1lbnVfb2sgPSBoZWxwX2RpYWxvZy5tZW51X29rCi0gICAgcGF0aF9vayA9IGhlbHBfZGlhbG9nLnBhdGhfb2sKLSAgICBvayA9IGhlbHBfZGlhbG9nLm9rCi0gICAgY2FuY2VsID0gaGVscF9kaWFsb2cuY2FuY2VsCi0gICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cwotICAgIG1lbnUgPSBWYXIoKQotICAgIGVudHJ5TWVudSA9IEVudHJ5KCkKLSAgICBwYXRoID0gVmFyKCkKLSAgICBlbnRyeVBhdGggPSBFbnRyeSgpCi0gICAgcmVzdWx0ID0gTm9uZQotICAgIGRlc3Ryb3llZCA9IEZhbHNlCi0KLSAgICBkZWYgZGVzdHJveShzZWxmKToKLSAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSBUcnVlCi0KLQotIyBtZW51X29rIGFuZCBwYXRoX29rIGNhbGwgTWJveC5zaG93ZXJyb3IgaWYgbWVudSBhbmQgcGF0aCBhcmUgbm90IG9rLgotb3JpZ19tYm94ID0gaGVscF9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveAotc2hvd2Vycm9yID0gTWJveC5zaG93ZXJyb3IKLQotCi1jbGFzcyBDb25maWdIZWxwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGlhbG9nID0gRHVtbXlfaGVscF9kaWFsb2coKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgaGVscF9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIGhlbHBfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKLQotICAgIGRlZiB0ZXN0X2JsYW5rX21lbnUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm1lbnUuc2V0KCcnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLm1lbnVfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdNZW51IEl0ZW0gRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfbG9uZ19tZW51KHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5tZW51LnNldCgnaGVsbG8nICogMTApCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cubWVudV9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ01lbnUgSXRlbSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2xvbmcnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2dvb2RfbWVudShzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cubWVudS5zZXQoJ2hlbHAnKQotICAgICAgICBzaG93ZXJyb3IudGl0bGUgPSAnTm8gRXJyb3InICAjIHNob3VsZCBub3QgYmUgY2FsbGVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5tZW51X29rKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTm8gRXJyb3InKQotCi0gICAgZGVmIHRlc3RfYmxhbmtfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0ZpbGUgUGF0aCBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ05vJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9pbnZhbGlkX2ZpbGVfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ2Zvb2JhcicgKiAxMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0ZpbGUgUGF0aCBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBleGlzdCcsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfaW52YWxpZF91cmxfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ3d3LmZvb2Jhci5jb20nKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgICAgICBzZWxmLmRpYWxvZy5wYXRoLnNldCgnaHR0LmZvb2Jhci5jb20nKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2dvb2RfcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ2h0dHBzOi8vZG9jcy5weXRob24ub3JnJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cucGF0aF9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X29rKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5tZW51LnNldCgnaGVscCcpCi0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCdodHRwczovL2RvY3MucHl0aG9uLm9yZycpCi0gICAgICAgIHNlbGYuZGlhbG9nLm9rKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICgnaGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBzOi8vZG9jcy5weXRob24ub3JnJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5kZXN0cm95ZWQpCi0KLSAgICBkZWYgdGVzdF9jYW5jZWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLmRlc3Ryb3llZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuZGlhbG9nLmNhbmNlbCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cucmVzdWx0LCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfa2V5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2tleS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTNmMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2tleS5weQpAQCAtMCwwICsxLDMzIEBACisnJycgVGVzdCBpZGxlbGliLmNvbmZpZ19rZXkuCisKK0NvdmVyYWdlOiA1NiUgZnJvbSBjcmVhdGluZyBhbmQgY2xvc2luZyBkaWFsb2cuCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnX2tleQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAorCisKK2NsYXNzIEdldEtleXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC51cGRhdGUoKSAgIyBTdG9wICJjYW4ndCBydW4gZXZlbnQgY29tbWFuZCIgd2FybmluZy4KKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBkaWEgPSBjb25maWdfa2V5LkdldEtleXNEaWFsb2coCisgICAgICAgICAgICBzZWxmLnJvb3QsICd0ZXN0JywgJzw8VGVzdD4+JywgWyc8S2V5LUYxMj4nXSwgX3V0ZXN0PVRydWUpCisgICAgICAgIGRpYS5DYW5jZWwoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19uYW1lLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTcyYjkuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0iIiJVbml0IHRlc3RzIGZvciBpZGxlbGliLmNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIiIiCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIGFzIG5hbWVfZGlhbG9nX21vZHVsZQotCi1uYW1lX2RpYWxvZyA9IG5hbWVfZGlhbG9nX21vZHVsZS5HZXRDZmdTZWN0aW9uTmFtZURpYWxvZwotCi1jbGFzcyBEdW1teV9uYW1lX2RpYWxvZzoKLSAgICAjIE1vY2sgZm9yIHRlc3RpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIG5hbWVfZGlhbG9nCi0gICAgbmFtZV9vayA9IG5hbWVfZGlhbG9nLm5hbWVfb2sKLSAgICBPayA9IG5hbWVfZGlhbG9nLk9rCi0gICAgQ2FuY2VsID0gbmFtZV9kaWFsb2cuQ2FuY2VsCi0gICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cwotICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQotICAgIG5hbWUgPSBWYXIoKQotICAgIHJlc3VsdCA9IE5vbmUKLSAgICBkZXN0cm95ZWQgPSBGYWxzZQotICAgIGRlZiBkZXN0cm95KHNlbGYpOgotICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IFRydWUKLQotIyBuYW1lX29rIGNhbGxzIE1ib3guc2hvd2Vycm9yIGlmIG5hbWUgaXMgbm90IG9rCi1vcmlnX21ib3ggPSBuYW1lX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94Ci1zaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgotCi1jbGFzcyBDb25maWdOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGlhbG9nID0gRHVtbXlfbmFtZV9kaWFsb2coKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgbmFtZV9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIG5hbWVfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKLQotICAgIGRlZiB0ZXN0X2JsYW5rX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICcnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfdXNlZF9uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgndXNlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cubmFtZV9vaygpLCAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9sb25nX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCdnb29kJyo4KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RvbyBsb25nJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9nb29kX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgIGdvb2QgJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJ2dvb2QnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X29rKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnZ29vZCcpCi0gICAgICAgIHNlbGYuZGlhbG9nLk9rKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICdnb29kJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKLQotICAgIGRlZiB0ZXN0X2NhbmNlbChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5kaWFsb2cuQ2FuY2VsKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICcnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weQppbmRleCA1YzA5NzkwLi43MGJkMTRlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnZGlhbG9nLnB5CkBAIC0xLDE0ICsxLDEzIEBACi0nJydUZXN0IGlkbGVsaWIuY29uZmlnRGlhbG9nLgorJycnVGVzdCBpZGxlbGliLmNvbmZpZ2RpYWxvZy4KIAogQ292ZXJhZ2U6IDQ2JSBqdXN0IGJ5IGNyZWF0aW5nIGRpYWxvZy4KIFRoZSBvdGhlciBoYWxmIGlzIGNvZGUgZm9yIHdvcmtpbmcgd2l0aCB1c2VyIGN1c3RvbWl6YXRpb25zLgogJycnCi1mcm9tIGlkbGVsaWIuY29uZmlnRGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0Citmcm9tIGlkbGVsaWIuY29uZmlnZGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogZnJvbSB0a2ludGVyIGltcG9ydCBUawogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQgYXMgbWFjb3N4CiAKIGNsYXNzIENvbmZpZ0RpYWxvZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0xNiw3ICsxNSw2IEBACiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnJvb3QgPSBUaygpCiAgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKLSAgICAgICAgbWFjb3N4Ll9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMoY2xzLnJvb3QpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgpAQCAtMjQsNyArMjIsNyBAQAogICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKICAgICAgICAgZGVsIGNscy5yb290CiAKLSAgICBkZWYgdGVzdF9kaWFsb2coc2VsZik6CisgICAgZGVmIHRlc3RfY29uZmlnZGlhbG9nKHNlbGYpOgogICAgICAgICBkID0gQ29uZmlnRGlhbG9nKHNlbGYucm9vdCwgJ1Rlc3QnLCBfdXRlc3Q9VHJ1ZSkKICAgICAgICAgZC5yZW1vdmVfdmFyX2NhbGxiYWNrcygpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVidWdnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiYTlhNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5CkBAIC0wLDAgKzEsMjkgQEAKKycnJyBUZXN0IGlkbGVsaWIuZGVidWdnZXIuCisKK0NvdmVyYWdlOiAxOSUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaworCisKK2NsYXNzIE5hbWVTcGFjZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIGRlYnVnZ2VyLk5hbWVzcGFjZVZpZXdlcihzZWxmLnJvb3QsICdUZXN0JykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkKaW5kZXggMWYwYmFhOS4uODU2MjRmYiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAotZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKIAogY2xhc3MgRGVsZWdhdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKaW5kZXggYTI1OGUyOS4uMTdlYjI1YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG1lbnUucHkKQEAgLTUsOCArNSw5IEBACiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogaW1wb3J0IHRraW50ZXIgYXMgdGsKK2Zyb20gdGtpbnRlciBpbXBvcnQgdHRrCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCiAKIGNsYXNzIFBhc3RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgJycnVGVzdCBwYXN0aW5nIGludG8gd2lkZ2V0cyB0aGF0IGFsbG93IHBhc3RpbmcuCkBAIC0xNiwxNyArMTcsMTggQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSB0ay5UaygpCi0gICAgICAgIHJvb3Qud2l0aGRyYXcoKQotICAgICAgICBQeVNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorICAgICAgICBweXNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKICAgICAgICAgY2xzLnRleHQgPSB0ay5UZXh0KHJvb3QpCiAgICAgICAgIGNscy5lbnRyeSA9IHRrLkVudHJ5KHJvb3QpCisgICAgICAgIGNscy50ZW50cnkgPSB0dGsuRW50cnkocm9vdCkKICAgICAgICAgY2xzLnNwaW4gPSB0ay5TcGluYm94KHJvb3QpCiAgICAgICAgIHJvb3QuY2xpcGJvYXJkX2NsZWFyKCkKICAgICAgICAgcm9vdC5jbGlwYm9hcmRfYXBwZW5kKCd0d28nKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKLSAgICAgICAgZGVsIGNscy50ZXh0LCBjbHMuZW50cnksIGNscy5zcGluCisgICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLmVudHJ5LCBjbHMudGVudHJ5CiAgICAgICAgIGNscy5yb290LmNsaXBib2FyZF9jbGVhcigpCiAgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQogICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKQEAgLTQ0LDE2ICs0NiwxNiBAQAogCiAgICAgZGVmIHRlc3RfcGFzdGVfZW50cnkoc2VsZik6CiAgICAgICAgICJUZXN0IHBhc3RpbmcgaW50byBhbiBlbnRyeSB3aXRoIGFuZCB3aXRob3V0IGEgc2VsZWN0aW9uLiIKLSAgICAgICAgIyBPbiAzLjYsIGdlbmVyYXRlZCA8PFBhc3RlPj4gZmFpbHMgd2l0aG91dCBlbXB0eSBzZWxlY3QgcmFuZ2UKLSAgICAgICAgIyBmb3IgJ25vIHNlbGVjdGlvbicuICBMaXZlIHdpZGdldCB3b3JrcyBmaW5lLgotICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnkKLSAgICAgICAgZm9yIGVuZCwgYW5zIGluICgwLCAnb25ldHdvJyksICgnZW5kJywgJ3R3bycpOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZW50cnk9ZW50cnksIGVuZD1lbmQsIGFucz1hbnMpOgotICAgICAgICAgICAgICAgIGVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKLSAgICAgICAgICAgICAgICBlbnRyeS5pbnNlcnQoMCwgJ29uZScpCi0gICAgICAgICAgICAgICAgZW50cnkuc2VsZWN0X3JhbmdlKDAsIGVuZCkgICMgc2VlIG5vdGUKLSAgICAgICAgICAgICAgICBlbnRyeS5ldmVudF9nZW5lcmF0ZSgnPDxQYXN0ZT4+JykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmdldCgpLCBhbnMpCisgICAgICAgICMgR2VuZXJhdGVkIDw8UGFzdGU+PiBmYWlscyBmb3IgdGsgZW50cnkgd2l0aG91dCBlbXB0eSBzZWxlY3QKKyAgICAgICAgIyByYW5nZSBmb3IgJ25vIHNlbGVjdGlvbicuICBMaXZlIHdpZGdldCB3b3JrcyBmaW5lLgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyeSwgc2VsZi50ZW50cnk6CisgICAgICAgICAgICBmb3IgZW5kLCBhbnMgaW4gKDAsICdvbmV0d28nKSwgKCdlbmQnLCAndHdvJyk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZW50cnk9ZW50cnksIGVuZD1lbmQsIGFucz1hbnMpOgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZWxldGUoMCwgJ2VuZCcpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5Lmluc2VydCgwLCAnb25lJykKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuc2VsZWN0X3JhbmdlKDAsIGVuZCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZXZlbnRfZ2VuZXJhdGUoJzw8UGFzdGU+PicpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuZ2V0KCksIGFucykKIAogICAgIGRlZiB0ZXN0X3Bhc3RlX3NwaW4oc2VsZik6CiAgICAgICAgICJUZXN0IHBhc3RpbmcgaW50byBhIHNwaW5ib3ggd2l0aCBhbmQgd2l0aG91dCBhIHNlbGVjdGlvbi4iCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkKaW5kZXggYTMxZDI2ZC4uZTlkMjlkNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRvci5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogCiBjbGFzcyBFZGl0b3JfZnVuY190ZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5CmluZGV4IDBkOGZmMGQuLjZiNTRjMTMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZ3JlcC5weQpAQCAtMSw1ICsxLDUgQEAKICIiIiAhQ2hhbmdpbmcgdGhpcyBsaW5lIHdpbGwgYnJlYWsgVGVzdF9maW5kZmlsZS50ZXN0X2ZvdW5kIQotTm9uLWd1aSB1bml0IHRlc3RzIGZvciBpZGxlbGliLkdyZXBEaWFsb2cgbWV0aG9kcy4KK05vbi1ndWkgdW5pdCB0ZXN0cyBmb3IgZ3JlcC5HcmVwRGlhbG9nIG1ldGhvZHMuCiBkdW1teV9jb21tYW5kIGNhbGxzIGdyZXBfaXQgY2FsbHMgZmluZGZpbGVzLgogQW4gZXhjZXB0aW9uIHJhaXNlZCBpbiBvbmUgbWV0aG9kIHdpbGwgZmFpbCBjYWxsZXJzLgogT3RoZXJ3aXNlLCB0ZXN0cyBhcmUgbW9zdGx5IGluZGVwZW5kZW50LgpAQCAtOCw3ICs4LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIKLWZyb20gaWRsZWxpYi5HcmVwRGlhbG9nIGltcG9ydCBHcmVwRGlhbG9nCitmcm9tIGlkbGVsaWIuZ3JlcCBpbXBvcnQgR3JlcERpYWxvZwogaW1wb3J0IHJlCiAKIGNsYXNzIER1bW15X3NlYXJjaGVuZ2luZToKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzRdLnN0YXJ0c3dpdGgoJyhIaW50OicpKQogCiBjbGFzcyBEZWZhdWx0X2NvbW1hbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAjIFRvIHdyaXRlIHRoaXMsIG1vZGUgT3V0cHV0V2luZG93IGltcG9ydCB0byB0b3Agb2YgR3JlcERpYWxvZworICAgICMgVG8gd3JpdGUgdGhpcywgbW92ZSBvdXR3aW4gaW1wb3J0IHRvIHRvcCBvZiBHcmVwRGlhbG9nCiAgICAgIyBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgY2FwdHVyZWRfc3Rkb3V0IGluIGNsYXNzIHNldHVwL3RlYXJkb3duLgogICAgIHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2OGUyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkKQEAgLTAsMCArMSwzNCBAQAorJycnVGVzdCBpZGxlbGliLmhlbHAuCisKK0NvdmVyYWdlOiA4NyUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBqb2luCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgSGVscEZyYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAiQnkgaXRzZWxmLCB0aGlzIHRlc3RzIHRoYXQgZmlsZSBwYXJzZWQgd2l0aG91dCBleGNlcHRpb24uIgorICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSBUaygpCisgICAgICAgIHJvb3Qud2l0aGRyYXcoKQorICAgICAgICBoZWxwZmlsZSA9IGpvaW4oZGlybmFtZShkaXJuYW1lKGFic3BhdGgoX19maWxlX18pKSksICdoZWxwLmh0bWwnKQorICAgICAgICBjbHMuZnJhbWUgPSBoZWxwLkhlbHBGcmFtZShyb290LCBoZWxwZmlsZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGRlbCBjbHMuZnJhbWUKKyAgICAgICAgY2xzLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2xpbmUxKHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi5mcmFtZS50ZXh0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5nZXQoJzEuMCcsICcxLmVuZCcpLCAnIElETEUgJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkKaW5kZXggZDBhMDEyNy4uODQzZWZiOSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwX2Fib3V0LnB5CkBAIC0yLDEwICsyLDEwIEBACiAKIENvdmVyYWdlOgogJycnCi1mcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nIGFzIGhlbHBfYWJvdXQKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcgYXMgdGV4dHZpZXcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaGVscF9hYm91dAorZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldwogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94X2Z1bmMKIGltcG9ydCB1bml0dGVzdAogCiBBYm91dCA9IGhlbHBfYWJvdXQuQWJvdXREaWFsb2cKQEAgLTE5LDMzICsxOSwzMyBAQAogCiAKIGNsYXNzIERpc3BsYXlGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIlRlc3QgdGhhdCAudHh0IGZpbGVzIGFyZSBmb3VuZCBhbmQgcHJvcGVybHkgZGVjb2RlZC4iCiAgICAgZGlhbG9nID0gRHVtbXlfYWJvdXRfZGlhbG9nKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5vcmlnX21ib3ggPSB0ZXh0dmlldy50a01lc3NhZ2VCb3gKKyAgICAgICAgY2xzLm9yaWdfZXJyb3IgPSB0ZXh0dmlldy5zaG93ZXJyb3IKICAgICAgICAgY2xzLm9yaWdfdmlldyA9IHRleHR2aWV3LnZpZXdfdGV4dAotICAgICAgICBjbHMubWJveCA9IE1ib3goKQorICAgICAgICBjbHMuZXJyb3IgPSBNYm94X2Z1bmMoKQogICAgICAgICBjbHMudmlldyA9IEZ1bmMoKQotICAgICAgICB0ZXh0dmlldy50a01lc3NhZ2VCb3ggPSBjbHMubWJveAorICAgICAgICB0ZXh0dmlldy5zaG93ZXJyb3IgPSBjbHMuZXJyb3IKICAgICAgICAgdGV4dHZpZXcudmlld190ZXh0ID0gY2xzLnZpZXcKICAgICAgICAgY2xzLkFib3V0ID0gRHVtbXlfYWJvdXRfZGlhbG9nKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIHRleHR2aWV3LnRrTWVzc2FnZUJveCA9IGNscy5vcmlnX21ib3gKKyAgICAgICAgdGV4dHZpZXcuc2hvd2Vycm9yID0gY2xzLm9yaWdfZXJyb3IKICAgICAgICAgdGV4dHZpZXcudmlld190ZXh0ID0gY2xzLm9yaWdfdmlldwogCiAgICAgZGVmIHRlc3RfZmlsZV9pc3BsYXkoc2VsZik6CiAgICAgICAgIGZvciBoYW5kbGVyIGluIChzZWxmLmRpYWxvZy5pZGxlX2NyZWRpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5pZGxlX3JlYWRtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlhbG9nLmlkbGVfbmV3cyk6Ci0gICAgICAgICAgICBzZWxmLm1ib3guc2hvd2Vycm9yLm1lc3NhZ2UgPSAnJworICAgICAgICAgICAgc2VsZi5lcnJvci5tZXNzYWdlID0gJycKICAgICAgICAgICAgIHNlbGYudmlldy5jYWxsZWQgPSBGYWxzZQotICAgICAgICAgICAgaGFuZGxlcigpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWJveC5zaG93ZXJyb3IubWVzc2FnZSwgJycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudmlldy5jYWxsZWQsIFRydWUpCisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChoYW5kbGVyPWhhbmRsZXIpOgorICAgICAgICAgICAgICAgIGhhbmRsZXIoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lcnJvci5tZXNzYWdlLCAnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudmlldy5jYWxsZWQsIFRydWUpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lkbGVoaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQppbmRleCA2ZTdjNmMzLi5iMjc4MDEwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oaXN0b3J5LnB5CkBAIC00LDggKzQsOCBAQAogaW1wb3J0IHRraW50ZXIgYXMgdGsKIGZyb20gdGtpbnRlciBpbXBvcnQgVGV4dCBhcyB0a1RleHQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dCBhcyBta1RleHQKLWZyb20gaWRsZWxpYi5JZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuaGlzdG9yeSBpbXBvcnQgSGlzdG9yeQorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogbGluZTEgPSAnYSA9IDcnCiBsaW5lMiA9ICdiID0gYScKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKaW5kZXggOWNlM2YyYy4uNzNjODI4MSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaHlwZXJwYXJzZXIucHkKQEAgLTEsOSArMSw5IEBACi0iIiJVbml0dGVzdCBmb3IgaWRsZWxpYi5IeXBlclBhcnNlciIiIgorIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIuaHlwZXJwYXJzZXIucHkuIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Ci1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKIAogY2xhc3MgRHVtbXlFZGl0d2luOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pb21lbnUucHkKaW5kZXggZTBlM2I5OC4uNjViZjU5MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW8ucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW8KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQc2V1ZG9JbnB1dEZpbGUsIFBzZXVkb091dHB1dEZpbGUKKworZnJvbSBpZGxlbGliLnJ1biBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCiAKIAogY2xhc3MgUyhzdHIpOgpAQCAtMjMwLDQgKzIzMSw0IEBACiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKCkKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTc1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9tYWNvc3gucHkKQEAgLTAsMCArMSwxMDMgQEAKKycnJ1Rlc3QgaWRsZWxpYi5tYWNvc3gucHkuCisKK0NvdmVyYWdlOiA3MSUgb24gV2luZG93cy4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHN5cworaW1wb3J0IHRraW50ZXIgYXMgdGsKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0Lm1vY2sgYXMgbW9jaworZnJvbSBpZGxlbGliLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorCittYWN0eXBlcyA9IHsnY2FyYm9uJywgJ2NvY29hJywgJ3hxdWFydHonfQorbm9udHlwZXMgPSB7J290aGVyJ30KK2FsbHR5cGVzID0gbWFjdHlwZXMgfCBub250eXBlcworCisKK2NsYXNzIEluaXRUa3R5cGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBfaW5pdF90a190eXBlLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorICAgICAgICBjbHMub3JpZ19wbGF0Zm9ybSA9IG1hY29zeC5wbGF0Zm9ybQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKyAgICAgICAgbWFjb3N4LnBsYXRmb3JtID0gY2xzLm9yaWdfcGxhdGZvcm0KKworICAgIGRlZiB0ZXN0X2luaXRfc2V0c190a3R5cGUoc2VsZik6CisgICAgICAgICJUZXN0IHRoYXQgX2luaXRfdGtfdHlwZSBzZXRzIF90a190eXBlIGFjY29yZGluZyB0byBwbGF0Zm9ybS4iCisgICAgICAgIGZvciBwbGF0Zm9ybSwgdHlwZXMgaW4gKCdkYXJ3aW4nLCBhbGx0eXBlcyksICgnb3RoZXInLCBub250eXBlcyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChwbGF0Zm9ybT1wbGF0Zm9ybSk6CisgICAgICAgICAgICAgICAgbWFjb3N4LnBsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPT0gTm9uZQorICAgICAgICAgICAgICAgIG1hY29zeC5faW5pdF90a190eXBlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1hY29zeC5fdGtfdHlwZSwgdHlwZXMpCisKKworY2xhc3MgSXNUeXBlVGtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBlYWNoIG9mIHRoZSBmb3VyIGlzVHlwZVRrIHByZWRlY2F0ZXMuIgorICAgIGlzZnVuY3MgPSAoKG1hY29zeC5pc0FxdWFUaywgKCdjYXJib24nLCAnY29jb2EnKSksCisgICAgICAgICAgICAgICAobWFjb3N4LmlzQ2FyYm9uVGssICgnY2FyYm9uJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc0NvY29hVGssICgnY29jb2EnKSksCisgICAgICAgICAgICAgICAobWFjb3N4LmlzWFF1YXJ0eiwgKCd4cXVhcnR6JykpLAorICAgICAgICAgICAgICAgKQorCisgICAgQG1vY2sucGF0Y2goJ2lkbGVsaWIubWFjb3N4Ll9pbml0X3RrX3R5cGUnKQorICAgIGRlZiB0ZXN0X2lzX2NhbGxzX2luaXQoc2VsZiwgbW9ja2luaXQpOgorICAgICAgICAiVGVzdCB0aGF0IGVhY2ggaXNUeXBlVGsgY2FsbHMgX2luaXRfdGtfdHlwZSB3aGVuIF90a190eXBlIGlzIE5vbmUuIgorICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSBOb25lCisgICAgICAgIGZvciBmdW5jLCB3aGVudHJ1ZSBpbiBzZWxmLmlzZnVuY3M6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChmdW5jPWZ1bmMpOgorICAgICAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NraW5pdC5jYWxsZWQpCisgICAgICAgICAgICAgICAgbW9ja2luaXQucmVzZXRfbW9jaygpCisKKyAgICBkZWYgdGVzdF9pc2Z1bmNzKHNlbGYpOgorICAgICAgICAiVGVzdCB0aGF0IGVhY2ggaXNUeXBlVGsgcmV0dXJuIGNvcnJlY3QgYm9vbC4iCisgICAgICAgIGZvciBmdW5jLCB3aGVudHJ1ZSBpbiBzZWxmLmlzZnVuY3M6CisgICAgICAgICAgICBmb3IgdGt0eXBlIGluIGFsbHR5cGVzOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGZ1bmM9ZnVuYywgd2hlbnRydWU9d2hlbnRydWUsIHRrdHlwZT10a3R5cGUpOgorICAgICAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSB0a3R5cGUKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuYXNzZXJ0VHJ1ZSBpZiB0a3R5cGUgaW4gd2hlbnRydWUgZWxzZSBzZWxmLmFzc2VydEZhbHNlKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuYygpKQorCisKK2NsYXNzIFNldHVwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3Qgc2V0dXBBcHAuIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gdGsuVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgQG1vY2sucGF0Y2goJ2lkbGVsaWIubWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUnKSAgIzI3MzEyCisgICAgZGVmIHRlc3Rfc2V0dXBhcHAoc2VsZiwgb3ZlcnJpZGVSb290TWVudSk6CisgICAgICAgICJDYWxsIHNldHVwQXBwIHdpdGggZWFjaCBwb3NzaWJsZSBncmFwaGljcyB0eXBlLiIKKyAgICAgICAgcm9vdCA9IHNlbGYucm9vdAorICAgICAgICBmbGlzdCA9IEZpbGVMaXN0KHJvb3QpCisgICAgICAgIGZvciB0a3R5cGUgaW4gYWxsdHlwZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0a3R5cGU9dGt0eXBlKToKKyAgICAgICAgICAgICAgICBtYWNvc3guX3RrX3R5cGUgPSB0a3R5cGUKKyAgICAgICAgICAgICAgICBtYWNvc3guc2V0dXBBcHAocm9vdCwgZmxpc3QpCisgICAgICAgICAgICAgICAgaWYgdGt0eXBlIGluICgnY2FyYm9uJywgJ2NvY29hJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdmVycmlkZVJvb3RNZW51LmNhbGxlZCkKKyAgICAgICAgICAgICAgICBvdmVycmlkZVJvb3RNZW51LnJlc2V0X21vY2soKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmFncmFwaC5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9mb3JtYXRwYXJhZ3JhcGgucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmFncmFwaC5weQppbmRleCBlNTU2MWQ4Li5iYTM1MGM5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9mb3JtYXRwYXJhZ3JhcGgucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CkBAIC0xLDcgKzEsNyBAQAotIyBUZXN0IHRoZSBmdW5jdGlvbnMgYW5kIG1haW4gY2xhc3MgbWV0aG9kIG9mIEZvcm1hdFBhcmFncmFwaC5weQorIyBUZXN0IHRoZSBmdW5jdGlvbnMgYW5kIG1haW4gY2xhc3MgbWV0aG9kIG9mIHBhcmFncmFwaC5weQogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IEZvcm1hdFBhcmFncmFwaCBhcyBmcAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIgaW1wb3J0IHBhcmFncmFwaCBhcyBmcAorZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIApAQCAtMzgsNyArMzgsNyBAQAogCiAKIGNsYXNzIEZpbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAiIiJUZXN0IHRoZSBmaW5kX3BhcmFncmFwaCBmdW5jdGlvbiBpbiBGb3JtYXRQYXJhZ3JhcGguCisgICAgIiIiVGVzdCB0aGUgZmluZF9wYXJhZ3JhcGggZnVuY3Rpb24gaW4gcGFyYWdyYXBoIG1vZHVsZS4KIAogICAgIFVzaW5nIHRoZSBydW5jYXNlKCkgZnVuY3Rpb24sIGZpbmRfcGFyYWdyYXBoKCkgaXMgY2FsbGVkIHdpdGggJ21hcmsnIHNldCBhdAogICAgIG11bHRpcGxlIGluZGV4ZXMgYmVmb3JlIGFuZCBpbnNpZGUgdGhlIHRlc3QgcGFyYWdyYXBoLgpAQCAtMTU5LDcgKzE1OSw3IEBACiBjbGFzcyBSZWZvcm1hdEZ1bmN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCB0aGUgcmVmb3JtYXRfcGFyYWdyYXBoIGZ1bmN0aW9uIHdpdGhvdXQgdGhlIGVkaXRvciB3aW5kb3cuIiIiCiAKLSAgICBkZWYgdGVzdF9yZWZvcm1hdF9wYXJhZ3JhaChzZWxmKToKKyAgICBkZWYgdGVzdF9yZWZvcm1hdF9wYXJhZ3JhcGgoc2VsZik6CiAgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICByZWZvcm0gPSBmcC5yZWZvcm1hdF9wYXJhZ3JhcGgKICAgICAgICAgaHcgPSAiTyBoZWxsbyB3b3JsZCIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmVubWF0Y2gucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5CmluZGV4IDk1Y2MyMmMuLjA1MWY3ZWEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmVubWF0Y2gucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3QgaWRsZWxpYi5QYXJlbk1hdGNoLgorJycnVGVzdCBpZGxlbGliLnBhcmVubWF0Y2guCiAKIFRoaXMgbXVzdCBjdXJyZW50bHkgYmUgYSBndWkgdGVzdCBiZWNhdXNlIFBhcmVuTWF0Y2ggbWV0aG9kcyB1c2UKIHNldmVyYWwgdGV4dCBtZXRob2RzIG5vdCBkZWZpbmVkIG9uIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsuVGV4dC4KQEAgLTksNyArOSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgTW9jawogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAotZnJvbSBpZGxlbGliLlBhcmVuTWF0Y2ggaW1wb3J0IFBhcmVuTWF0Y2gKK2Zyb20gaWRsZWxpYi5wYXJlbm1hdGNoIGltcG9ydCBQYXJlbk1hdGNoCiAKIGNsYXNzIER1bW15RWRpdHdpbjoKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CkBAIC0zOCwxMiArMzgsMTcgQEAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYudGV4dC5kZWxldGUoJzEuMCcsICdlbmQnKQogCisgICAgZGVmIGdldF9wYXJlbm1hdGNoKHNlbGYpOgorICAgICAgICBwbSA9IFBhcmVuTWF0Y2goc2VsZi5lZGl0d2luKQorICAgICAgICBwbS5iZWxsID0gbGFtYmRhOiBOb25lCisgICAgICAgIHJldHVybiBwbQorCiAgICAgZGVmIHRlc3RfcGFyZW5fZXhwcmVzc2lvbihzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgUGFyZW5NYXRjaCB3aXRoICdleHByZXNzaW9uJyBzdHlsZS4KICAgICAgICAgIiIiCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKLSAgICAgICAgcG0gPSBQYXJlbk1hdGNoKHNlbGYuZWRpdHdpbikKKyAgICAgICAgcG0gPSBzZWxmLmdldF9wYXJlbm1hdGNoKCkKICAgICAgICAgcG0uc2V0X3N0eWxlKCdleHByZXNzaW9uJykKIAogICAgICAgICB0ZXh0Lmluc2VydCgnaW5zZXJ0JywgJ2RlZiBmb29iYXIoYSwgYicpCkBAIC02Niw3ICs3MSw3IEBACiAgICAgICAgIFRlc3QgUGFyZW5NYXRjaCB3aXRoICdkZWZhdWx0JyBzdHlsZS4KICAgICAgICAgIiIiCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKLSAgICAgICAgcG0gPSBQYXJlbk1hdGNoKHNlbGYuZWRpdHdpbikKKyAgICAgICAgcG0gPSBzZWxmLmdldF9wYXJlbm1hdGNoKCkKICAgICAgICAgcG0uc2V0X3N0eWxlKCdkZWZhdWx0JykKIAogICAgICAgICB0ZXh0Lmluc2VydCgnaW5zZXJ0JywgJ2RlZiBmb29iYXIoYSwgYicpCkBAIC04Niw3ICs5MSw3IEBACiAgICAgICAgIFRoZXNlIGNhc2VzIGZvcmNlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYW5kIGFsdGVybmF0ZSBwYXRocy4KICAgICAgICAgIiIiCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKLSAgICAgICAgcG0gPSBQYXJlbk1hdGNoKHNlbGYuZWRpdHdpbikKKyAgICAgICAgcG0gPSBzZWxmLmdldF9wYXJlbm1hdGNoKCkKIAogICAgICAgICB0ZXh0Lmluc2VydCgnaW5zZXJ0JywgJyMgdGhpcyBpcyBhIGNvbW1lbiknKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwbS5wYXJlbl9jbG9zZWRfZXZlbnQoJ2V2ZW50JykpCkBAIC05OSw3ICsxMDQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwbS5wYXJlbl9jbG9zZWRfZXZlbnQoJ2V2ZW50JykpCiAKICAgICBkZWYgdGVzdF9oYW5kbGVfcmVzdG9yZV90aW1lcihzZWxmKToKLSAgICAgICAgcG0gPSBQYXJlbk1hdGNoKHNlbGYuZWRpdHdpbikKKyAgICAgICAgcG0gPSBzZWxmLmdldF9wYXJlbm1hdGNoKCkKICAgICAgICAgcG0ucmVzdG9yZV9ldmVudCA9IE1vY2soKQogICAgICAgICBwbS5oYW5kbGVfcmVzdG9yZV90aW1lcigwKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocG0ucmVzdG9yZV9ldmVudC5jYWxsZWQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5CmluZGV4IGFmYjg4NmYuLjgxM2NiY2MgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhdGhicm93c2VyLnB5CkBAIC0yLDEzICsyLDEzIEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBpZGxlbGliCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFBhdGhCcm93c2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IHBhdGhicm93c2VyCiAKIGNsYXNzIFBhdGhCcm93c2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9EaXJCcm93c2VyVHJlZUl0ZW0oc2VsZik6CiAgICAgICAgICMgSXNzdWUxNjIyNiAtIG1ha2Ugc3VyZSB0aGF0IGdldHRpbmcgYSBzdWJsaXN0IHdvcmtzCi0gICAgICAgIGQgPSBQYXRoQnJvd3Nlci5EaXJCcm93c2VyVHJlZUl0ZW0oJycpCisgICAgICAgIGQgPSBwYXRoYnJvd3Nlci5EaXJCcm93c2VyVHJlZUl0ZW0oJycpCiAgICAgICAgIGQuR2V0U3ViTGlzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGQuR2V0VGV4dCgpKQogCkBAIC0xNywxMSArMTcsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzcGFja2FnZWRpcihkaXIgKyAnL0ljb25zJyksIEZhbHNlKQogCiAgICAgZGVmIHRlc3RfUGF0aEJyb3dzZXJUcmVlSXRlbShzZWxmKToKLSAgICAgICAgcCA9IFBhdGhCcm93c2VyLlBhdGhCcm93c2VyVHJlZUl0ZW0oKQorICAgICAgICBwID0gcGF0aGJyb3dzZXIuUGF0aEJyb3dzZXJUcmVlSXRlbSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5HZXRUZXh0KCksICdzeXMucGF0aCcpCiAgICAgICAgIHN1YiA9IHAuR2V0U3ViTGlzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN1YiksIGxlbihzeXMucGF0aCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzdWJbMF0pLCBQYXRoQnJvd3Nlci5EaXJCcm93c2VyVHJlZUl0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzdWJbMF0pLCBwYXRoYnJvd3Nlci5EaXJCcm93c2VyVHJlZUl0ZW0pCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BlcmNvbGF0b3IucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5CmluZGV4IDRjMGE3YWQuLjU3M2I5YTEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BlcmNvbGF0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGVyY29sYXRvci5weQpAQCAtMSwxMCArMSwxMCBAQAotJycnVGVzdCBQZXJjb2xhdG9yJycnCisnJydUZXN0IHBlcmNvbGF0b3IucHkuJycnCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGtpbnRlciBpbXBvcnQgVGV4dCwgVGssIEVORAotZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IsIERlbGVnYXRvcgorZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IsIERlbGVnYXRvcgogCiAKIGNsYXNzIE15RmlsdGVyKERlbGVnYXRvcik6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9xdWVyeS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3F1ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWY4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9xdWVyeS5weQpAQCAtMCwwICsxLDM1MyBAQAorIiIiVGVzdCBpZGxlbGliLnF1ZXJ5LgorCitOb24tZ3VpIHRlc3RzIGZvciBRdWVyeSwgU2VjdGlvbk5hbWUsIE1vZHVsZU5hbWUsIGFuZCBIZWxwU291cmNlIHVzZQorZHVtbXkgdmVyc2lvbnMgdGhhdCBleHRyYWN0IHRoZSBub24tZ3VpIG1ldGhvZHMgYW5kIGFkZCBvdGhlciBuZWVkZWQKK2F0dHJpYnV0ZXMuICBHVUkgdGVzdHMgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGVhY2ggY2xhc3MgYW5kIHNpbXVsYXRlCitlbnRyaWVzIGFuZCBidXR0b24gY2xpY2tzLiAgU3ViY2xhc3MgdGVzdHMgb25seSB0YXJnZXQgdGhlIG5ldyBjb2RlIGluCit0aGUgc3ViY2xhc3MgZGVmaW5pdGlvbi4KKworVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHdpZGdldHMgaXMgY2hlY2tlZCBieSB0aGUgUXVlcnkgYW5kCitIZWxwU291cmNlIGh0ZXN0cy4gIFRoZXNlIGFyZSBydW4gYnkgcnVubmluZyBxdWVyeS5weS4KKworQ292ZXJhZ2U6IDk0JSAoMTAwJSBmb3IgUXVlcnkgYW5kIFNlY3Rpb25OYW1lKS4KKzYgb2YgOCBtaXNzaW5nIGFyZSBNb2R1bGVOYW1lIGV4Y2VwdGlvbnMgSSBkb24ndCBrbm93IGhvdyB0byB0cmlnZ2VyLgorIiIiCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK2ltcG9ydCBzeXMKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkKKworCisjIE5PTi1HVUkgVEVTVFMKKworY2xhc3MgUXVlcnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBRdWVyeSBiYXNlIGNsYXNzLiIKKworICAgIGNsYXNzIER1bW15X1F1ZXJ5OgorICAgICAgICAjIFRlc3QgdGhlIGZvbGxvd2luZyBRdWVyeSBtZXRob2RzLgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5LlF1ZXJ5LmVudHJ5X29rCisgICAgICAgIG9rID0gcXVlcnkuUXVlcnkub2sKKyAgICAgICAgY2FuY2VsID0gcXVlcnkuUXVlcnkuY2FuY2VsCisgICAgICAgICMgQWRkIGF0dHJpYnV0ZXMgYW5kIGluaXRpYWxpemF0aW9uIG5lZWRlZCBmb3IgdGVzdHMuCisgICAgICAgIGVudHJ5ID0gVmFyKCkKKyAgICAgICAgZW50cnlfZXJyb3IgPSB7fQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZHVtbXlfZW50cnkpOgorICAgICAgICAgICAgc2VsZi5lbnRyeS5zZXQoZHVtbXlfZW50cnkpCisgICAgICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisgICAgICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IEZhbHNlCisgICAgICAgIGRlZiBzaG93ZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSBtZXNzYWdlCisgICAgICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSBUcnVlCisKKyAgICBkZWYgdGVzdF9lbnRyeV9va19ibGFuayhzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9RdWVyeSgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdibGFuayBsaW5lJywgZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9lbnRyeV9va19nb29kKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1F1ZXJ5KCcgIGdvb2QgJykKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCAnZ29vZCcpCisgICAgICAgIEVxdWFsKChkaWFsb2cucmVzdWx0LCBkaWFsb2cuZGVzdHJveWVkKSwgKE5vbmUsIEZhbHNlKSkKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10sICcnKQorCisgICAgZGVmIHRlc3Rfb2tfYmxhbmsoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfUXVlcnkoJycpCisgICAgICAgIGRpYWxvZy5lbnRyeS5mb2N1c19zZXQgPSBtb2NrLk1vY2soKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5vaygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlhbG9nLmVudHJ5LmZvY3VzX3NldC5jYWxsZWQpCisgICAgICAgIGRlbCBkaWFsb2cuZW50cnkuZm9jdXNfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgRmFsc2UpKQorCisgICAgZGVmIHRlc3Rfb2tfZ29vZChzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9RdWVyeSgnZ29vZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLm9rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoJ2dvb2QnLCBUcnVlKSkKKworICAgIGRlZiB0ZXN0X2NhbmNlbChzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9RdWVyeSgnZG9lcyBub3QgbWF0dGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuY2FuY2VsKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgVHJ1ZSkpCisKKworY2xhc3MgU2VjdGlvbk5hbWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBTZWN0aW9uTmFtZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9TZWN0aW9uTmFtZToKKyAgICAgICAgZW50cnlfb2sgPSBxdWVyeS5TZWN0aW9uTmFtZS5lbnRyeV9vayAgIyBGdW5jdGlvbiBiZWluZyB0ZXN0ZWQuCisgICAgICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQorICAgICAgICBlbnRyeSA9IFZhcigpCisgICAgICAgIGVudHJ5X2Vycm9yID0ge30KKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGR1bW15X2VudHJ5KToKKyAgICAgICAgICAgIHNlbGYuZW50cnkuc2V0KGR1bW15X2VudHJ5KQorICAgICAgICAgICAgc2VsZi5lbnRyeV9lcnJvclsndGV4dCddID0gJycKKyAgICAgICAgZGVmIHNob3dlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9IG1lc3NhZ2UKKworICAgIGRlZiB0ZXN0X2JsYW5rX3NlY3Rpb25fbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9TZWN0aW9uTmFtZSgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vIG5hbWUnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X3VzZWRfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1NlY3Rpb25OYW1lKCd1c2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9sb25nX3NlY3Rpb25fbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9TZWN0aW9uTmFtZSgnZ29vZCcqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbG9uZ2VyIHRoYW4gMzAnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X2dvb2Rfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X1NlY3Rpb25OYW1lKCcgIGdvb2QgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgJ2dvb2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddLCAnJykKKworCitjbGFzcyBNb2R1bGVOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgTW9kdWxlTmFtZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9Nb2R1bGVOYW1lOgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5Lk1vZHVsZU5hbWUuZW50cnlfb2sgICMgRnVuY3Rpb24gYmVpbmcgdGVzdGVkLgorICAgICAgICB0ZXh0MCA9ICcnCisgICAgICAgIGVudHJ5ID0gVmFyKCkKKyAgICAgICAgZW50cnlfZXJyb3IgPSB7fQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZHVtbXlfZW50cnkpOgorICAgICAgICAgICAgc2VsZi5lbnRyeS5zZXQoZHVtbXlfZW50cnkpCisgICAgICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBkZWYgc2hvd2Vycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5lbnRyeV9lcnJvclsndGV4dCddID0gbWVzc2FnZQorCisgICAgZGVmIHRlc3RfYmxhbmtfbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfTW9kdWxlTmFtZSgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vIG5hbWUnLCBkaWFsb2cuZW50cnlfZXJyb3JbJ3RleHQnXSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X01vZHVsZU5hbWUoJ19fbmFtZV94eXoxMjNfc2hvdWxkX25vdF9leGlzdF9fJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IGZvdW5kJywgZGlhbG9nLmVudHJ5X2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9jX3NvdXJjZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X01vZHVsZU5hbWUoJ2l0ZXJ0b29scycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NvdXJjZS1iYXNlZCcsIGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddKQorCisgICAgZGVmIHRlc3RfZ29vZF9tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9Nb2R1bGVOYW1lKCdpZGxlbGliJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5lbnRyeV9vaygpLmVuZHN3aXRoKCdfX2luaXRfXy5weScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeV9lcnJvclsndGV4dCddLCAnJykKKworCisjIDMgSGVscFNvdXJjZSB0ZXN0IGNsYXNzZXMgZWFjaCB0ZXN0IG9uZSBmdW5jdGlvbi4KKworb3JpZ19wbGF0Zm9ybSA9IHF1ZXJ5LnBsYXRmb3JtCisKK2NsYXNzIEhlbHBzb3VyY2VCcm93c2VmaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgYnJvd3NlX2ZpbGUgbWV0aG9kIG9mIE1vZHVsZU5hbWUgc3ViY2xhc3Mgb2YgUXVlcnkuIgorCisgICAgY2xhc3MgRHVtbXlfSGVscFNvdXJjZToKKyAgICAgICAgYnJvd3NlX2ZpbGUgPSBxdWVyeS5IZWxwU291cmNlLmJyb3dzZV9maWxlCisgICAgICAgIHBhdGh2YXIgPSBWYXIoKQorCisgICAgZGVmIHRlc3RfZmlsZV9yZXBsYWNlc19wYXRoKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X0hlbHBTb3VyY2UoKQorICAgICAgICAjIFBhdGggaXMgd2lkZ2V0IGVudHJ5LCBlaXRoZXIgJycgb3Igc29tZXRoaW5nLgorICAgICAgICAjIEZ1bmMgcmV0dXJuIGlzIGZpbGUgZGlhbG9nIHJldHVybiwgZWl0aGVyICcnIG9yIHNvbWV0aGluZy4KKyAgICAgICAgIyBGdW5jIHJldHVybiBzaG91bGQgb3ZlcnJpZGUgd2lkZ2V0IGVudHJ5LgorICAgICAgICAjIFdlIG5lZWQgYWxsIDQgY29tYmluYXRpb24gdG8gdGVzdCBhbGwgKG1vc3QpIGNvZGUgcGF0aHMuCisgICAgICAgIGZvciBwYXRoLCBmdW5jLCByZXN1bHQgaW4gKAorICAgICAgICAgICAgICAgICgnJywgbGFtYmRhIGEsYixjOicnLCAnJyksCisgICAgICAgICAgICAgICAgKCcnLCBsYW1iZGEgYSxiLGM6IF9fZmlsZV9fLCBfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgKCdodGVzdCcsIGxhbWJkYSBhLGIsYzonJywgJ2h0ZXN0JyksCisgICAgICAgICAgICAgICAgKCdodGVzdCcsIGxhbWJkYSBhLGIsYzogX19maWxlX18sIF9fZmlsZV9fKSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCgpOgorICAgICAgICAgICAgICAgIGRpYWxvZy5wYXRodmFyLnNldChwYXRoKQorICAgICAgICAgICAgICAgIGRpYWxvZy5hc2tmaWxlbmFtZSA9IGZ1bmMKKyAgICAgICAgICAgICAgICBkaWFsb2cuYnJvd3NlX2ZpbGUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnBhdGh2YXIuZ2V0KCksIHJlc3VsdCkKKworCitjbGFzcyBIZWxwc291cmNlUGF0aG9rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgcGF0aF9vayBtZXRob2Qgb2YgSGVscFNvdXJjZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9IZWxwU291cmNlOgorICAgICAgICBwYXRoX29rID0gcXVlcnkuSGVscFNvdXJjZS5wYXRoX29rCisgICAgICAgIHBhdGggPSBWYXIoKQorICAgICAgICBwYXRoX2Vycm9yID0ge30KKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGR1bW15X3BhdGgpOgorICAgICAgICAgICAgc2VsZi5wYXRoLnNldChkdW1teV9wYXRoKQorICAgICAgICAgICAgc2VsZi5wYXRoX2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBkZWYgc2hvd2Vycm9yKHNlbGYsIG1lc3NhZ2UsIHdpZGdldD1Ob25lKToKKyAgICAgICAgICAgIHNlbGYucGF0aF9lcnJvclsndGV4dCddID0gbWVzc2FnZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgcXVlcnkucGxhdGZvcm0gPSBvcmlnX3BsYXRmb3JtCisKKyAgICBkZWYgdGVzdF9wYXRoX29rX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLkR1bW15X0hlbHBTb3VyY2UoJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vIGhlbHAgZmlsZScsIGRpYWxvZy5wYXRoX2Vycm9yWyd0ZXh0J10pCisKKyAgICBkZWYgdGVzdF9wYXRoX29rX2JhZChzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9IZWxwU291cmNlKF9fZmlsZV9fICsgJ2JhZC1iYWQtYmFkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucGF0aF9vaygpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBkaWFsb2cucGF0aF9lcnJvclsndGV4dCddKQorCisgICAgZGVmIHRlc3RfcGF0aF9va193ZWIoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfSGVscFNvdXJjZSgnJykKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZvciB1cmwgaW4gJ3d3dy5weS5vcmcnLCAnaHR0cDovL3B5Lm9yZyc6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCgpOgorICAgICAgICAgICAgICAgIGRpYWxvZy5wYXRoLnNldCh1cmwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucGF0aF9vaygpLCB1cmwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucGF0aF9lcnJvclsndGV4dCddLCAnJykKKworICAgIGRlZiB0ZXN0X3BhdGhfb2tfZmlsZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5EdW1teV9IZWxwU291cmNlKCcnKQorICAgICAgICBmb3IgcGxhdGZvcm0sIHByZWZpeCBpbiAoJ2RhcndpbicsICdmaWxlOi8vJyksICgnb3RoZXInLCAnJyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCgpOgorICAgICAgICAgICAgICAgIHF1ZXJ5LnBsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgICAgICAgICBkaWFsb2cucGF0aC5zZXQoX19maWxlX18pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucGF0aF9vaygpLCBwcmVmaXggKyBfX2ZpbGVfXykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRoX2Vycm9yWyd0ZXh0J10sICcnKQorCisKK2NsYXNzIEhlbHBzb3VyY2VFbnRyeW9rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgZW50cnlfb2sgbWV0aG9kIG9mIEhlbHBTb3VyY2Ugc3ViY2xhc3Mgb2YgUXVlcnkuIgorCisgICAgY2xhc3MgRHVtbXlfSGVscFNvdXJjZToKKyAgICAgICAgZW50cnlfb2sgPSBxdWVyeS5IZWxwU291cmNlLmVudHJ5X29rCisgICAgICAgIGVudHJ5X2Vycm9yID0ge30KKyAgICAgICAgcGF0aF9lcnJvciA9IHt9CisgICAgICAgIGRlZiBpdGVtX29rKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgICAgICBkZWYgcGF0aF9vayhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgIGRlZiB0ZXN0X2VudHJ5X29rX2hlbHBzb3VyY2Uoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuRHVtbXlfSGVscFNvdXJjZSgpCisgICAgICAgIGZvciBuYW1lLCBwYXRoLCByZXN1bHQgaW4gKChOb25lLCBOb25lLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICdkb2MudHh0JywgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZG9jJywgTm9uZSwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZG9jJywgJ2RvYy50eHQnLCAoJ2RvYycsICdkb2MudHh0JykpKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KCk6CisgICAgICAgICAgICAgICAgZGlhbG9nLm5hbWUsIGRpYWxvZy5wYXRoID0gbmFtZSwgcGF0aAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIHJlc3VsdCkKKworCisjIEdVSSBURVNUUworCitjbGFzcyBRdWVyeUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gcm9vdCA9IFRrKCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorICAgICAgICBjbHMuZGlhbG9nID0gcXVlcnkuUXVlcnkocm9vdCwgJ1RFU1QnLCAndGVzdCcsIF91dGVzdD1UcnVlKQorICAgICAgICBjbHMuZGlhbG9nLmRlc3Ryb3kgPSBtb2NrLk1vY2soKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgZGVsIGNscy5kaWFsb2cKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy5lbnRyeS5kZWxldGUoMCwgJ2VuZCcpCisgICAgICAgIHNlbGYuZGlhbG9nLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveS5yZXNldF9tb2NrKCkKKworICAgIGRlZiB0ZXN0X2NsaWNrX29rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBkaWFsb2cuZW50cnkuaW5zZXJ0KDAsICdhYmMnKQorICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsb2cuZGVzdHJveS5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9jbGlja19ibGFuayhzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgZGlhbG9nLmJ1dHRvbl9vay5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5yZXN1bHQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbG9nLmRlc3Ryb3kuY2FsbGVkKQorCisgICAgZGVmIHRlc3RfY2xpY2tfY2FuY2VsKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBkaWFsb2cuZW50cnkuaW5zZXJ0KDAsICdhYmMnKQorICAgICAgICBkaWFsb2cuYnV0dG9uX2NhbmNlbC5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5yZXN1bHQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsb2cuZGVzdHJveS5jYWxsZWQpCisKKworY2xhc3MgU2VjdGlvbm5hbWVHdWlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorCisgICAgZGVmIHRlc3RfY2xpY2tfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICByb290LndpdGhkcmF3KCkKKyAgICAgICAgZGlhbG9nID0gIHF1ZXJ5LlNlY3Rpb25OYW1lKHJvb3QsICdUJywgJ3QnLCB7J2FiYyd9LCBfdXRlc3Q9VHJ1ZSkKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnVzZWRfbmFtZXMsIHsnYWJjJ30pCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ29rYXknKQorICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgJ29rYXknKQorICAgICAgICBkZWwgZGlhbG9nCisgICAgICAgIHJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCByb290CisKKworY2xhc3MgTW9kdWxlbmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgcm9vdCA9IFRrKCkKKyAgICAgICAgcm9vdC53aXRoZHJhdygpCisgICAgICAgIGRpYWxvZyA9ICBxdWVyeS5Nb2R1bGVOYW1lKHJvb3QsICdUJywgJ3QnLCAnaWRsZWxpYicsIF91dGVzdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy50ZXh0MCwgJ2lkbGVsaWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5lbnRyeS5nZXQoKSwgJ2lkbGVsaWInKQorICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsb2cucmVzdWx0LmVuZHN3aXRoKCdfX2luaXRfXy5weScpKQorICAgICAgICBkZWwgZGlhbG9nCisgICAgICAgIHJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCByb290CisKKworY2xhc3MgSGVscHNvdXJjZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19oZWxwX3NvdXJjZShzZWxmKToKKyAgICAgICAgcm9vdCA9IFRrKCkKKyAgICAgICAgcm9vdC53aXRoZHJhdygpCisgICAgICAgIGRpYWxvZyA9ICBxdWVyeS5IZWxwU291cmNlKHJvb3QsICdUJywgbWVudWl0ZW09J19fdGVzdF9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGg9X19maWxlX18sIF91dGVzdD1UcnVlKQorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5LmdldCgpLCAnX190ZXN0X18nKQorICAgICAgICBFcXVhbChkaWFsb2cucGF0aC5nZXQoKSwgX19maWxlX18pCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgcHJlZml4ID0gImZpbGU6Ly8iIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBlbHNlICcnCisgICAgICAgIEVxdWFsKGRpYWxvZy5yZXN1bHQsICgnX190ZXN0X18nLCBwcmVmaXggKyBfX2ZpbGVfXykpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKaW5kZXggYmFhOTc1ZC4uYjAzODVmYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVkaXJlY3Rvci5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3QgaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yLgorJycnVGVzdCBpZGxlbGliLnJlZGlyZWN0b3IuCiAKIDEwMCUgY292ZXJhZ2UKICcnJwpAQCAtNiw3ICs2LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQsIFRjbEVycm9yCi1mcm9tIGlkbGVsaWIuV2lkZ2V0UmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgorZnJvbSBpZGxlbGliLnJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKIAogCiBjbGFzcyBJbml0Q2xvc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTEyMCw2ICsxMjAsNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5jYWxsKHNlbGYudGV4dC5fdywgJ2luc2VydCcsICdib28nKSwgJycpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlLnB5CmluZGV4IGZmNDQ4MjAuLjdhZmQ0ZDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2VkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLlJlcGxhY2VEaWFsb2ciIiIKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLnJlcGxhY2UucHkiIiIKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogcmVxdWlyZXMoJ2d1aScpCiAKQEAgLTYsOCArNiw4IEBACiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRW5naW5lIGFzIHNlCi1pbXBvcnQgaWRsZWxpYi5SZXBsYWNlRGlhbG9nIGFzIHJkCitpbXBvcnQgaWRsZWxpYi5zZWFyY2hlbmdpbmUgYXMgc2UKK2Zyb20gaWRsZWxpYi5yZXBsYWNlIGltcG9ydCBSZXBsYWNlRGlhbG9nCiAKIG9yaWdfbWJveCA9IHNlLnRrTWVzc2FnZUJveAogc2hvd2Vycm9yID0gTWJveC5zaG93ZXJyb3IKQEAgLTIxLDcgKzIxLDggQEAKICAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQogICAgICAgICBzZS50a01lc3NhZ2VCb3ggPSBNYm94CiAgICAgICAgIGNscy5lbmdpbmUgPSBzZS5TZWFyY2hFbmdpbmUoY2xzLnJvb3QpCi0gICAgICAgIGNscy5kaWFsb2cgPSByZC5SZXBsYWNlRGlhbG9nKGNscy5yb290LCBjbHMuZW5naW5lKQorICAgICAgICBjbHMuZGlhbG9nID0gUmVwbGFjZURpYWxvZyhjbHMucm9vdCwgY2xzLmVuZ2luZSkKKyAgICAgICAgY2xzLmRpYWxvZy5iZWxsID0gbGFtYmRhOiBOb25lCiAgICAgICAgIGNscy5kaWFsb2cub2sgPSBNb2NrKCkKICAgICAgICAgY2xzLnRleHQgPSBUZXh0KGNscy5yb290KQogICAgICAgICBjbHMudGV4dC51bmRvX2Jsb2NrX3N0YXJ0ID0gTW9jaygpCkBAIC03MCw3ICs3MSw2IEBACiAgICAgICAgICMgdGV4dCBmb3VuZCBhbmQgcmVwbGFjZWQKICAgICAgICAgcHYuc2V0KCdhJykKICAgICAgICAgcnYuc2V0KCdhc2RmJykKLSAgICAgICAgc2VsZi5kaWFsb2cub3BlbihzZWxmLnRleHQpCiAgICAgICAgIHJlcGxhY2UoKQogICAgICAgICBlcXVhbCh0ZXh0LmdldCgnMS44JywgJzEuMTInKSwgJ2FzZGYnKQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkKaW5kZXggMWM5MGI5My4uMTMwZTZiZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JzdHJpcC5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGlkbGVsaWIuUnN0cmlwRXh0ZW5zaW9uIGFzIHJzCitpbXBvcnQgaWRsZWxpYi5yc3RyaXAgYXMgcnMKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBFZGl0b3IKIAogY2xhc3MgcnN0cmlwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0yMSw3ICsyMSw3IEBACiAgICAgZGVmIHRlc3RfcnN0cmlwX211bHRpcGxlKHNlbGYpOgogICAgICAgICBlZGl0b3IgPSBFZGl0b3IoKQogICAgICAgICAjICBVbmNvbW1lbnQgZm9sbG93aW5nIHRvIHZlcmlmeSB0aGF0IHRlc3QgcGFzc2VzIHdpdGggcmVhbCB3aWRnZXRzLgotIyMgICAgICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdyBhcyBFZGl0b3IKKyMjICAgICAgICBmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cgYXMgRWRpdG9yCiAjIyAgICAgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUawogIyMgICAgICAgIGVkaXRvciA9IEVkaXRvcihyb290PVRrKCkpCiAgICAgICAgIHRleHQgPSBlZGl0b3IudGV4dApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2Nyb2xsZWRsaXN0LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2Nyb2xsZWRsaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWFiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zY3JvbGxlZGxpc3QucHkKQEAgLTAsMCArMSwyOSBAQAorJycnIFRlc3QgaWRsZWxpYi5zY3JvbGxlZGxpc3QuCisKK0NvdmVyYWdlOiAzOSUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBzY3JvbGxlZGxpc3QKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworcmVxdWlyZXMoJ2d1aScpCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKKworCitjbGFzcyBTY3JvbGxlZExpc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBzY3JvbGxlZGxpc3QuU2Nyb2xsZWRMaXN0KHNlbGYucm9vdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2gucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2gucHkKaW5kZXggMTkwYzg2Ni4uODBmYTkzYSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaC5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlRlc3QgU2VhcmNoRGlhbG9nIGNsYXNzIGluIFNlYXJjaERpYWxvZ3VlLnB5IiIiCisiIiJUZXN0IFNlYXJjaERpYWxvZyBjbGFzcyBpbiBpZGxlbGliLnNlYXJjaC5weSIiIgogCiAjIERvZXMgbm90IGN1cnJlbnRseSB0ZXN0IHRoZSBldmVudCBoYW5kbGVyIHdyYXBwZXJzLgogIyBBIHVzYWdlIHRlc3Qgc2hvdWxkIHNpbXVsYXRlIGNsaWNrcyBhbmQgY2hlY2sgaGlsaWdodGluZy4KQEAgLTExLDggKzExLDggQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRraW50ZXIgYXMgdGsKIGZyb20gdGtpbnRlciBpbXBvcnQgQm9vbGVhblZhcgotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRW5naW5lIGFzIHNlCi1pbXBvcnQgaWRsZWxpYi5TZWFyY2hEaWFsb2cgYXMgc2QKK2ltcG9ydCBpZGxlbGliLnNlYXJjaGVuZ2luZSBhcyBzZQoraW1wb3J0IGlkbGVsaWIuc2VhcmNoIGFzIHNkCiAKIAogY2xhc3MgU2VhcmNoRGlhbG9nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0yOSw2ICsyOSw3IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmVuZ2luZSA9IHNlLlNlYXJjaEVuZ2luZShzZWxmLnJvb3QpCiAgICAgICAgIHNlbGYuZGlhbG9nID0gc2QuU2VhcmNoRGlhbG9nKHNlbGYucm9vdCwgc2VsZi5lbmdpbmUpCisgICAgICAgIHNlbGYuZGlhbG9nLmJlbGwgPSBsYW1iZGE6IE5vbmUKICAgICAgICAgc2VsZi50ZXh0ID0gdGsuVGV4dChzZWxmLnJvb3QpCiAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJzEuMCcsICdIZWxsbyBXb3JsZCEnKQogCkBAIC0zOCw2ICszOSw3IEBACiAKICAgICAgICAgc2VsZi5lbmdpbmUuc2V0cGF0KCcnKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLmZpbmRfYWdhaW4odGV4dCkpCisgICAgICAgIHNlbGYuZGlhbG9nLmJlbGwgPSBsYW1iZGE6IE5vbmUKIAogICAgICAgICBzZWxmLmVuZ2luZS5zZXRwYXQoJ0hlbGxvJykKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmZpbmRfYWdhaW4odGV4dCkpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2diYXNlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoYmFzZS5weQpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2diYXNlLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hiYXNlLnB5CmluZGV4IDgwMzZiOTEuLmQ3NjlmYTIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZ2Jhc2UucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoYmFzZS5weQpAQCAtMSwxNCArMSwxMyBAQAotJycnVW5pdHRlc3RzIGZvciBpZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKKycnJ3Rlc3RzIGlkbGVsaWIuc2VhcmNoYmFzZS4KIAogQ292ZXJhZ2U6IDk5JS4gVGhlIG9ubHkgdGhpbmcgbm90IGNvdmVyZWQgaXMgaW5jb25zZXF1ZW50aWFsIC0tCiB0ZXN0aW5nIHNraXBwaW5nIG9mIHN1aXRlIHdoZW4gc2VsZi5uZWVkd3JhcGJ1dHRvbiBpcyBmYWxzZS4KLQogJycnCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVG9wbGV2ZWwsIEZyYW1lICMjLCBCb29sZWFuVmFyLCBTdHJpbmdWYXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lIGFzIHNlCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UgYXMgc2RiCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZSBhcyBzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hiYXNlIGFzIHNkYgogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKICMjIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyCiAKQEAgLTc0LDcgKzczLDcgQEAKICAgICBkZWYgdGVzdF9tYWtlX2VudHJ5KHNlbGYpOgogICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBlbnRyeSwgbGFiZWwgPSBzZWxmLmRpYWxvZy5tYWtlX2VudHJ5KCJUZXN0OiIsICdoZWxsbycpCiAgICAgICAgIGVxdWFsKGxhYmVsWyd0ZXh0J10sICdUZXN0OicpCiAKQEAgLTg3LDYgKzg2LDcgQEAKICAgICAgICAgZXF1YWwoc2VsZi5kaWFsb2cucm93LCAxKQogCiAgICAgZGVmIHRlc3RfY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCiAgICAgICAgIHNlbGYuZW5naW5lLnNldHBhdCgnaGVsbG8nKQogICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfZW50cmllcygpCkBAIC05NCw3ICs5NCw3IEBACiAKICAgICBkZWYgdGVzdF9tYWtlX2ZyYW1lKHNlbGYpOgogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCi0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIGZyYW1lLCBsYWJlbCA9IHNlbGYuZGlhbG9nLm1ha2VfZnJhbWUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhYmVsLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZyYW1lLCBGcmFtZSkKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZnJhbWUsIEZyYW1lKQogCiAgICAgZGVmIGJ0bl90ZXN0X3NldHVwKHNlbGYsIG1ldGgpOgotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCiAgICAgICAgIHJldHVybiBtZXRoKCkKIApAQCAtMTE5LDExICsxMTksNiBAQAogICAgICAgICAgICAgICAgIHZhciwgbGFiZWwgPSBzcGVjCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidXR0b25bJ3RleHQnXSwgbGFiZWwpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQotICAgICAgICAgICAgICAgIGlmIHN0YXRlID09IDE6Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5kZXNlbGVjdCgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNlbGVjdCgpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIDEgLSBzdGF0ZSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgogICAgICAgICBmb3Igc3RhdGUgaW4gKEZhbHNlLCBUcnVlKToKQEAgLTEzOSwxOCArMTM0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICMgaGl0IG90aGVyIGJ1dHRvbiwgdGhlbiB0aGlzIG9uZQogICAgICAgICAgICAgICAgICAgICAjIGluZGV4ZXMgZGVwZW5kIG9uIGJ1dHRvbiBvcmRlcgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhci5nZXQoKSwgc3RhdGUpCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNbdmFsXS5zZWxlY3QoKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhci5nZXQoKSwgMSAtIHN0YXRlKQotICAgICAgICAgICAgICAgICAgICBidXR0b25zWzEtdmFsXS5zZWxlY3QoKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhci5nZXQoKSwgc3RhdGUpCiAKICAgICBkZWYgdGVzdF9tYWtlX2J1dHRvbihzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gVG9wbGV2ZWwoc2VsZi5yb290KQorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgc2VsZi5kaWFsb2cuYnV0dG9uZnJhbWUgPSBGcmFtZShzZWxmLmRpYWxvZy50b3ApCiAgICAgICAgIGJ0biA9IHNlbGYuZGlhbG9nLm1ha2VfYnV0dG9uKCdUZXN0Jywgc2VsZi5kaWFsb2cuY2xvc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnRuWyd0ZXh0J10sICdUZXN0JykKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfY29tbWFuZF9idXR0b25zKCkKICAgICAgICAgIyBMb29rIGZvciBjbG9zZSBidXR0b24gY29tbWFuZCBpbiBidXR0b25mcmFtZQogICAgICAgICBjbG9zZWJ1dHRvbmNvbW1hbmQgPSAnJwpAQCAtMTYwLDYgKzE1Miw1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2Nsb3NlJywgY2xvc2VidXR0b25jb21tYW5kKQogCiAKLQogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hlbmdpbmUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hlbmdpbmUucHkKaW5kZXggZWRiZDU1OC4uN2U2ZjhiNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3QgZnVuY3Rpb25zIGFuZCBTZWFyY2hFbmdpbmUgY2xhc3MgaW4gU2VhcmNoRW5naW5lLnB5LicnJworJycnVGVzdCBmdW5jdGlvbnMgYW5kIFNlYXJjaEVuZ2luZSBjbGFzcyBpbiBpZGxlbGliLnNlYXJjaGVuZ2luZS5weS4nJycKIAogIyBXaXRoIG1vY2sgcmVwbGFjZW1lbnRzLCB0aGUgbW9kdWxlIGRvZXMgbm90IHVzZSBhbnkgZ3VpIHdpZGdldHMuCiAjIFRoZSB1c2Ugb2YgdGsuVGV4dCBpcyBhdm9pZGVkIChmb3Igbm93LCB1bnRpbCBtb2NrIFRleHQgaXMgaW1wcm92ZWQpCkBAIC0xMCw3ICsxMCw3IEBACiAjIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCAgQm9vbGVhblZhciwgU3RyaW5nVmFyLCBUY2xFcnJvciAgIyAsVGssIFRleHQKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZSBhcyBzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUgYXMgc2UKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQgYXMgbW9ja1RleHQKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKaW5kZXggN2U4MjNkZi4uYTViYTdiYiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5CkBAIC0xLDE3ICsxLDE5IEBACi0jIFRlc3QgbW9ja190ay5UZXh0IGNsYXNzIGFnYWluc3QgdGtpbnRlci5UZXh0IGNsYXNzIGJ5IHJ1bm5pbmcgc2FtZSB0ZXN0cyB3aXRoIGJvdGguCisnJycgVGVzdCBtb2NrX3RrLlRleHQgY2xhc3MgYWdhaW5zdCB0a2ludGVyLlRleHQgY2xhc3MKKworUnVuIHNhbWUgdGVzdHMgd2l0aCBib3RoIGJ5IGNyZWF0aW5nIGEgbWl4aW4gY2xhc3MuCisnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCi0KIGZyb20gX3RraW50ZXIgaW1wb3J0IFRjbEVycm9yCiAKIGNsYXNzIFRleHRUZXN0KG9iamVjdCk6CisgICAgIkRlZmluZSBpdGVtcyBjb21tb24gdG8gYm90aCBzZXRzIG9mIHRlc3RzLiIKIAotICAgIGh3ID0gJ2hlbGxvXG53b3JsZCcgICMgdXN1YWwgaW5pdGlhbCBpbnNlcnQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICBodyA9ICdoZWxsb1xud29ybGQnICAjIFNldmVyYWwgdGVzdHMgaW5zZXJ0IHRoaXMgYWZ0ZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCiAgICAgaHduID0gaHcrJ1xuJyAgIyBcbiBwcmVzZW50IGF0IGluaXRpYWxpemF0aW9uLCBiZWZvcmUgaW5zZXJ0CiAKLSAgICBUZXh0ID0gTm9uZQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5UZXh0KCkKKyAgICAjIHNldFVwQ2xhc3MgZGVmaW5lcyBjbHMuVGV4dCBhbmQgbWF5YmUgY2xzLnJvb3QuCisgICAgIyBzZXRVcCBkZWZpbmVzIHNlbGYudGV4dCBmcm9tIFRleHQgYW5kIG1heWJlIHJvb3QuCiAKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5nZXQoJzEuMCcpLCAnXG4nKQpAQCAtMTk2LDYgKzE5OCwxMCBAQAogICAgICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQKICAgICAgICAgY2xzLlRleHQgPSBUZXh0CiAKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGV4dCA9IHNlbGYuVGV4dCgpCisKKwogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKICAgICAgICAgIyB0ZXN0IGVuZGZsYWdzICgtMSwgMCkgbm90IHRlc3RlZCBieSB0ZXN0X2luZGV4ICh3aGljaCB1c2VzICsxKQogICAgICAgICBkZWNvZGUgPSBzZWxmLnRleHQuX2RlY29kZQpAQCAtMjIyLDYgKzIyOCw5IEBACiAgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQogICAgICAgICBkZWwgY2xzLnJvb3QKIAorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5UZXh0KHNlbGYucm9vdCkKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0dmlldy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5CmluZGV4IDVkMmU2MDAuLmYwMThmNWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5CkBAIC0xLDIxICsxLDIxIEBACi0nJydUZXN0IGlkbGVsaWIudGV4dFZpZXcuCisnJydUZXN0IGlkbGVsaWIudGV4dHZpZXcuCiAKIFNpbmNlIGFsbCBtZXRob2RzIGFuZCBmdW5jdGlvbnMgY3JlYXRlIChvciBkZXN0cm95KSBhIFRleHRWaWV3ZXIsIHdoaWNoCiBpcyBhIHdpZGdldCBjb250YWluaW5nIG11bHRpcGxlIHdpZGdldHMsIGFsbCB0ZXN0cyBtdXN0IGJlIGd1aSB0ZXN0cy4KIFVzaW5nIG1vY2sgVGV4dCB3b3VsZCBub3QgY2hhbmdlIHRoaXMuICBPdGhlciBtb2NrcyBhcmUgdXNlZCB0byByZXRyaWV2ZQogaW5mb3JtYXRpb24gYWJvdXQgY2FsbHMuCiAKLVRoZSBjb3ZlcmFnZSBpcyBlc3NlbnRpYWxseSAxMDAlLgorQ292ZXJhZ2U6IDk0JS4KICcnJworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldyBhcyB0dgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcgYXMgdHYKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCi1mcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IE1ib3gKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveF9mdW5jCiAKIGRlZiBzZXRVcE1vZHVsZSgpOgogICAgIGdsb2JhbCByb290CkBAIC02NCwxNyArNjQsMTcgQEAKICAgICAgICAgdmlldy5kZXN0cm95KCkKIAogCi1jbGFzcyB0ZXh0dmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgVmlld0Z1bmN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgotICAgICAgICBjbHMub3JpZ19tYm94ID0gdHYudGtNZXNzYWdlQm94Ci0gICAgICAgIHR2LnRrTWVzc2FnZUJveCA9IE1ib3gKKyAgICAgICAgY2xzLm9yaWdfZXJyb3IgPSB0di5zaG93ZXJyb3IKKyAgICAgICAgdHYuc2hvd2Vycm9yID0gTWJveF9mdW5jKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIHR2LnRrTWVzc2FnZUJveCA9IGNscy5vcmlnX21ib3gKLSAgICAgICAgZGVsIGNscy5vcmlnX21ib3gKKyAgICAgICAgdHYuc2hvd2Vycm9yID0gY2xzLm9yaWdfZXJyb3IKKyAgICAgICAgZGVsIGNscy5vcmlnX2Vycm9yCiAKICAgICBkZWYgdGVzdF92aWV3X3RleHQoc2VsZik6CiAgICAgICAgICMgSWYgbW9kYWwgVHJ1ZSwgZ2V0IHRrIGVycm9yICdjYW4ndCBpbnZva2UgImV2ZW50IiBjb21tYW5kJy4KQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignVGVzdCcsIHZpZXcudGV4dFZpZXcuZ2V0KCcxLjAnLCAnMS5lbmQnKSkKICAgICAgICAgdmlldy5PaygpCiAKLSAgICAgICAgIyBNb2NrIG1lc3NhZ2Vib3ggd2lsbCBiZSB1c2VkIGFuZCB2aWV3X2ZpbGUgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nCisgICAgICAgICMgTW9jayBzaG93ZXJyb3Igd2lsbCBiZSB1c2VkOyB2aWV3X2ZpbGUgd2lsbCByZXR1cm4gTm9uZS4KICAgICAgICAgdGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICcuLi9ub3R0aGVyZS5weScpCiAgICAgICAgIHZpZXcgPSB0di52aWV3X2ZpbGUocm9vdCwgJ1RpdGxlJywgdGVzdGZpbGUsIG1vZGFsPUZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh2aWV3KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RyZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYTk2NAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RyZWUucHkKQEAgLTAsMCArMSwzNiBAQAorJycnIFRlc3QgaWRsZWxpYi50cmVlLgorCitDb3ZlcmFnZTogNTYlCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdHJlZQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRraW50ZXIgaW1wb3J0IFRrCisKKworY2xhc3MgVHJlZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgICMgU3RhcnQgd2l0aCBjb2RlIHNsaWdodGx5IGFkYXB0ZWQgZnJvbSBodGVzdC4KKyAgICAgICAgc2MgPSB0cmVlLlNjcm9sbGVkQ2FudmFzKAorICAgICAgICAgICAgc2VsZi5yb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgICAgIHNjLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiLCBzaWRlPSdsZWZ0JykKKyAgICAgICAgaXRlbSA9IHRyZWUuRmlsZVRyZWVJdGVtKHRyZWUuSUNPTkRJUikKKyAgICAgICAgbm9kZSA9IHRyZWUuVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQorICAgICAgICBub2RlLmV4cGFuZCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kb2RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG8ucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kb2RlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQppbmRleCAyYjgzYzk5Li5lODcyOTI3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG8ucHkKQEAgLTEsNCArMSw0IEBACi0iIiJVbml0dGVzdCBmb3IgVW5kb0RlbGVnYXRvciBpbiBpZGxlbGliLlVuZG9EZWxlZ2F0b3IuCisiIiJVbml0dGVzdCBmb3IgVW5kb0RlbGVnYXRvciBpbiBpZGxlbGliLnVuZG8ucHkuCiAKIENvdmVyYWdlIGFib3V0IDgwJSAocmV0ZXN0KS4KICIiIgpAQCAtOCw4ICs4LDggQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrCi1mcm9tIGlkbGVsaWIuVW5kb0RlbGVnYXRvciBpbXBvcnQgVW5kb0RlbGVnYXRvcgotZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKK2Zyb20gaWRsZWxpYi51bmRvIGltcG9ydCBVbmRvRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgogCiAKIGNsYXNzIFVuZG9EZWxlZ2F0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI5LDggKzI5LDggQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5kZWxlZ2F0b3IgPSBVbmRvRGVsZWdhdG9yKCkKKyAgICAgICAgc2VsZi5kZWxlZ2F0b3IuYmVsbCA9IE1vY2soKQogICAgICAgICBzZWxmLnBlcmNvbGF0b3IuaW5zZXJ0ZmlsdGVyKHNlbGYuZGVsZWdhdG9yKQotICAgICAgICBzZWxmLmRlbGVnYXRvci5iZWxsID0gTW9jayh3cmFwcz1zZWxmLmRlbGVnYXRvci5iZWxsKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnBlcmNvbGF0b3IucmVtb3ZlZmlsdGVyKHNlbGYuZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dhcm5pbmcucHkKaW5kZXggMTg2MjdkZC4uZjMyNjlmMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCB3YXJuaW5ncyByZXBsYWNlbWVudCBpbiBQeVNoZWxsLnB5IGFuZCBydW4ucHkuCisnJydUZXN0IHdhcm5pbmdzIHJlcGxhY2VtZW50IGluIHB5c2hlbGwucHkgYW5kIHJ1bi5weS4KIAogVGhpcyBmaWxlIGNvdWxkIGJlIGV4cGFuZGVkIHRvIGluY2x1ZGUgdHJhY2ViYWNrIG92ZXJyaWRlcwogKGluIHNhbWUgdHdvIG1vZHVsZXMpLiBJZiBzbywgY2hhbmdlIG5hbWUuCkBAIC0xNyw5ICsxNyw5IEBACiBydW5uaW5nX2luX2lkbGUgPSAnaWRsZScgaW4gc2hvd3dhcm5pbmcuX19uYW1lX18KIAogZnJvbSBpZGxlbGliIGltcG9ydCBydW4KLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbCBhcyBzaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsIGFzIHNoZWxsCiAKLSMgVGhlIGZvbGxvd2luZyB3YXMgZ2VuZXJhdGVkIGZyb20gUHlTaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcKKyMgVGhlIGZvbGxvd2luZyB3YXMgZ2VuZXJhdGVkIGZyb20gcHlzaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcKICMgYW5kIGNoZWNrZWQgYXMgbWF0Y2hpbmcgZXhwZWN0YXRpb24uCiBpZGxlbXNnID0gJycnCiBXYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5ZjY5YS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIiIiCi1UaGUgc2VwYXJhdGUgSWRsZSB2ZXJzaW9uIHdhcyBlbGltaW5hdGVkIHllYXJzIGFnbzsKLWlkbGVsaWIuaWRsZXZlciBpcyBubyBsb25nZXIgdXNlZCBieSBJZGxlCi1hbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuNiBvciBsYXRlci4gIFVzZQotICAgIGZyb20gc3lzIGltcG9ydCB2ZXJzaW9uCi0gICAgSURMRV9WRVJTSU9OID0gdmVyc2lvbls6dmVyc2lvbi5pbmRleCgnICcpXQotIiIiCi0jIEtlcHQgZm9yIG5vdyBvbmx5IGZvciBwb3NzaWJsZSBleGlzdGluZyBleHRlbnNpb24gdXNlCi1pbXBvcnQgd2FybmluZ3MgYXMgdwotdy53YXJuKF9fZG9jX18sIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotZnJvbSBzeXMgaW1wb3J0IHZlcnNpb24KLUlETEVfVkVSU0lPTiA9IHZlcnNpb25bOnZlcnNpb24uaW5kZXgoJyAnKV0KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lPQmluZGluZy5weSBiL0xpYi9pZGxlbGliL2lvbWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lvbWVudS5weQppbmRleCA4NGYzOWEyLi4zNDE0YzdiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvaW9tZW51LnB5CkBAIC0xMCw1NyArMTAsNjAgQEAKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBmcm9tIHRraW50ZXIuc2ltcGxlZGlhbG9nIGltcG9ydCBhc2tzdHJpbmcKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitpbXBvcnQgaWRsZWxpYgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAotCi0jIFRyeSBzZXR0aW5nIHRoZSBsb2NhbGUsIHNvIHRoYXQgd2UgY2FuIGZpbmQgb3V0Ci0jIHdoYXQgZW5jb2RpbmcgdG8gdXNlCi10cnk6Ci0gICAgaW1wb3J0IGxvY2FsZQotICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAiIikKLWV4Y2VwdCAoSW1wb3J0RXJyb3IsIGxvY2FsZS5FcnJvcik6Ci0gICAgcGFzcwotCi0jIEVuY29kaW5nIGZvciBmaWxlIG5hbWVzCi1maWxlc3lzdGVtZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgICMjIyBjdXJyZW50bHkgdW51c2VkCi0KLWxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKLWlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgotICAgICMgT24gV2luZG93cywgd2UgY291bGQgdXNlICJtYmNzIi4gSG93ZXZlciwgdG8gZ2l2ZSB0aGUgdXNlcgotICAgICMgYSBwb3J0YWJsZSBlbmNvZGluZyBuYW1lLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNvZGUgcGFnZQotICAgIHRyeToKLSAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKVsxXQotICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKLSAgICBleGNlcHQgTG9va3VwRXJyb3I6Ci0gICAgICAgIHBhc3MKK2lmIGlkbGVsaWIudGVzdGluZzogICMgU2V0IFRydWUgYnkgdGVzdC50ZXN0X2lkbGUgdG8gYXZvaWQgc2V0bG9jYWxlLgorICAgIGVuY29kaW5nID0gJ3V0Zi04JwogZWxzZToKKyAgICAjIFRyeSBzZXR0aW5nIHRoZSBsb2NhbGUsIHNvIHRoYXQgd2UgY2FuIGZpbmQgb3V0CisgICAgIyB3aGF0IGVuY29kaW5nIHRvIHVzZQogICAgIHRyeToKLSAgICAgICAgIyBEaWZmZXJlbnQgdGhpbmdzIGNhbiBmYWlsIGhlcmU6IHRoZSBsb2NhbGUgbW9kdWxlIG1heSBub3QgYmUKLSAgICAgICAgIyBsb2FkZWQsIGl0IG1heSBub3Qgb2ZmZXIgbmxfbGFuZ2luZm8sIG9yIENPREVTRVQsIG9yIHRoZQotICAgICAgICAjIHJlc3VsdGluZyBjb2Rlc2V0IG1heSBiZSB1bmtub3duIHRvIFB5dGhvbi4gV2UgaWdub3JlIGFsbAotICAgICAgICAjIHRoZXNlIHByb2JsZW1zLCBmYWxsaW5nIGJhY2sgdG8gQVNDSUkKLSAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLm5sX2xhbmdpbmZvKGxvY2FsZS5DT0RFU0VUKQotICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6Ci0gICAgICAgICAgICAjIHNpdHVhdGlvbiBvY2N1cnMgb24gTWFjIE9TIFgKLSAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKLSAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCi0gICAgZXhjZXB0IChOYW1lRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBMb29rdXBFcnJvcik6Ci0gICAgICAgICMgVHJ5IGdldGRlZmF1bHRsb2NhbGU6IGl0IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCi0gICAgICAgICMgd2hpY2ggbWF5IGdpdmUgYSBjbHVlLiBVbmZvcnR1bmF0ZWx5LCBnZXRkZWZhdWx0bG9jYWxlIGhhcwotICAgICAgICAjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgVmFsdWVFcnJvci4KKyAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgIiIpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgbG9jYWxlLkVycm9yKToKKyAgICAgICAgcGFzcworCisgICAgbG9jYWxlX2RlY29kZSA9ICdhc2NpaScKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgIyBPbiBXaW5kb3dzLCB3ZSBjb3VsZCB1c2UgIm1iY3MiLiBIb3dldmVyLCB0byBnaXZlIHRoZSB1c2VyCisgICAgICAgICMgYSBwb3J0YWJsZSBlbmNvZGluZyBuYW1lLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNvZGUgcGFnZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRGlmZmVyZW50IHRoaW5ncyBjYW4gZmFpbCBoZXJlOiB0aGUgbG9jYWxlIG1vZHVsZSBtYXkgbm90IGJlCisgICAgICAgICAgICAjIGxvYWRlZCwgaXQgbWF5IG5vdCBvZmZlciBubF9sYW5naW5mbywgb3IgQ09ERVNFVCwgb3IgdGhlCisgICAgICAgICAgICAjIHJlc3VsdGluZyBjb2Rlc2V0IG1heSBiZSB1bmtub3duIHRvIFB5dGhvbi4gV2UgaWdub3JlIGFsbAorICAgICAgICAgICAgIyB0aGVzZSBwcm9ibGVtcywgZmFsbGluZyBiYWNrIHRvIEFTQ0lJCisgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUubmxfbGFuZ2luZm8obG9jYWxlLkNPREVTRVQpCiAgICAgICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6CiAgICAgICAgICAgICAgICAgIyBzaXR1YXRpb24gb2NjdXJzIG9uIE1hYyBPUyBYCiAgICAgICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gJ2FzY2lpJwogICAgICAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgTG9va3VwRXJyb3IpOgotICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgKE5hbWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIExvb2t1cEVycm9yKToKKyAgICAgICAgICAgICMgVHJ5IGdldGRlZmF1bHRsb2NhbGU6IGl0IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCisgICAgICAgICAgICAjIHdoaWNoIG1heSBnaXZlIGEgY2x1ZS4gVW5mb3J0dW5hdGVseSwgZ2V0ZGVmYXVsdGxvY2FsZSBoYXMKKyAgICAgICAgICAgICMgYnVncyB0aGF0IGNhbiBjYXVzZSBWYWx1ZUVycm9yLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6CisgICAgICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAorICAgICAgICAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSAnYXNjaWknCisgICAgICAgICAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIExvb2t1cEVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCiAKLWxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZy5sb3dlcigpCisgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nLmxvd2VyKCkKIAotZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmcgICMjIyBLQksgMDdTZXAwNyAgVGhpcyBpcyB1c2VkIGFsbCBvdmVyIElETEUsIGNoZWNrIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyAnZW5jb2RpbmcnIGlzIHVzZWQgYmVsb3cgaW4gZW5jb2RlKCksIGNoZWNrIQorICAgIGVuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nCisgICAgIyBFbmNvZGluZyBpcyB1c2VkIGluIG11bHRpcGxlIGZpbGVzOyBsb2NhbGVfZW5jb2Rpbmcgbm93aGVyZS4KKyAgICAjIFRoZSBvbmx5IHVzZSBvZiAnZW5jb2RpbmcnIGJlbG93IGlzIGluIF9kZWNvZGUgYXMgaW5pdGlhbCB2YWx1ZQorICAgICMgb2YgZGVwcmVjYXRlZCBibG9jayBhc2tpbmcgdXNlciBmb3IgZW5jb2RpbmcuCisgICAgIyBQZXJoYXBzIHVzZSBlbHNld2hlcmUgc2hvdWxkIGJlIHJldmlld2VkLgogCiBjb2RpbmdfcmUgPSByZS5jb21waWxlKHInXlsgXHRcZl0qIy4qP2NvZGluZ1s6PV1bIFx0XSooWy1cdy5dKyknLCByZS5BU0NJSSkKIGJsYW5rX3JlID0gcmUuY29tcGlsZShyJ15bIFx0XGZdKig/OlsjXHJcbl18JCknLCByZS5BU0NJSSkKQEAgLTEwNyw2ICsxMTAsOSBAQAogCiAKIGNsYXNzIElPQmluZGluZzoKKyMgT25lIGluc3RhbmNlIHBlciBlZGl0b3IgV2luZG93IHNvIG1ldGhvZHMga25vdyB3aGljaCB0byBzYXZlLCBjbG9zZS4KKyMgT3BlbiByZXR1cm5zIGZvY3VzIHRvIHNlbGYuZWRpdHdpbiBpZiBhYm9ydGVkLgorIyBFZGl0b3JXaW5kb3cub3Blbl9tb2R1bGUsIG90aGVycywgYmVsb25nIGhlcmUuCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CiAgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAgICAgICAgICAgICJUaGUgZmlsZSdzIGVuY29kaW5nIGlzIGludmFsaWQgZm9yIFB5dGhvbiAzLnguXG4iCiAgICAgICAgICAgICAgICAgIklETEUgd2lsbCBjb252ZXJ0IGl0IHRvIFVURi04LlxuIgogICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSBjdXJyZW50IGVuY29kaW5nIG9mIHRoZSBmaWxlPyIsCi0gICAgICAgICAgICAgICAgaW5pdGlhbHZhbHVlID0gbG9jYWxlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgIGluaXRpYWx2YWx1ZSA9IGVuY29kaW5nLAogICAgICAgICAgICAgICAgIHBhcmVudCA9IHNlbGYuZWRpdHdpbi50ZXh0KQogCiAgICAgICAgICAgICBpZiBlbmM6CkBAIC01MjksOCArNTM1LDggQEAKIAogICAgIHJvb3QgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgcm9vdC50aXRsZSgiVGVzdCBJT0JpbmRpbmciKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKICAgICBjbGFzcyBNeUVkaXRXaW46CiAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKICAgICAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKQEAgLTU2MSw1ICs1NjcsOCBAQAogICAgIElPQmluZGluZyhlZGl0d2luKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaW9tZW51JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX2lvX2JpbmRpbmcpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5IGIvTGliL2lkbGVsaWIvbWFjb3N4LnB5CnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL21hY29zeC5weQppbmRleCBiOTZiYWUxLi5jMjI1ZGQ5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5CisrKyBiL0xpYi9pZGxlbGliL21hY29zeC5weQpAQCAtMSwzMCArMSwyNSBAQAogIiIiCiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBlbmhhbmNlIElETEUgb24gTWFjIE9TWC4KICIiIgotaW1wb3J0IHN5cwotaW1wb3J0IHRraW50ZXIKLWZyb20gb3MgaW1wb3J0IHBhdGgKK2Zyb20gc3lzIGltcG9ydCBwbGF0Zm9ybSAgIyBVc2VkIGluIF9pbml0X3RrX3R5cGUsIGNoYW5nZWQgYnkgdGVzdC4KIGltcG9ydCB3YXJuaW5ncwogCi1kZWYgcnVubmluZ0FzT1NYQXBwKCk6Ci0gICAgd2FybmluZ3Mud2FybigicnVubmluZ0FzT1NYQXBwKCkgaXMgZGVwcmVjYXRlZCwgdXNlIGlzQXF1YVRrKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuIGlzQXF1YVRrKCkKK2ltcG9ydCB0a2ludGVyCiAKLWRlZiBpc0NhcmJvbkFxdWFUayhyb290KToKLSAgICB3YXJuaW5ncy53YXJuKCJpc0NhcmJvbkFxdWFUayhyb290KSBpcyBkZXByZWNhdGVkLCB1c2UgaXNDYXJib25UaygpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgIHJldHVybiBpc0NhcmJvblRrKCkKKworIyMgRGVmaW5lIGZ1bmN0aW9ucyB0aGF0IHF1ZXJ5IHRoZSBNYWMgZ3JhcGhpY3MgdHlwZS4KKyMjIF90a190eXBlIGFuZCBpdHMgaW5pdGlhbGl6ZXIgYXJlIHByaXZhdGUgdG8gdGhpcyBzZWN0aW9uLgogCiBfdGtfdHlwZSA9IE5vbmUKIAotZGVmIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCk6CitkZWYgX2luaXRfdGtfdHlwZSgpOgogICAgICIiIgogICAgIEluaXRpYWxpemVzIE9TIFggVGsgdmFyaWFudCB2YWx1ZXMgZm9yCiAgICAgaXNBcXVhVGsoKSwgaXNDYXJib25UaygpLCBpc0NvY29hVGsoKSwgYW5kIGlzWFF1YXJ0eigpLgogICAgICIiIgogICAgIGdsb2JhbCBfdGtfdHlwZQotICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgcm9vdCA9IHRraW50ZXIuVGsoKQogICAgICAgICB3cyA9IHJvb3QudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykKICAgICAgICAgaWYgJ3gxMScgaW4gd3M6CiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJ4cXVhcnR6IgpAQCAtMzQsNiArMjksNyBAQAogICAgICAgICAgICAgX3RrX3R5cGUgPSAiY29jb2EiCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJjYXJib24iCisgICAgICAgIHJvb3QuZGVzdHJveSgpCiAgICAgZWxzZToKICAgICAgICAgX3RrX3R5cGUgPSAib3RoZXIiCiAKQEAgLTQxLDcgKzM3LDggQEAKICAgICAiIiIKICAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhIG5hdGl2ZSBPUyBYIFRrIChDb2NvYSBvciBDYXJib24pLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJjb2NvYSIgb3IgX3RrX3R5cGUgPT0gImNhcmJvbiIKIAogZGVmIGlzQ2FyYm9uVGsoKToKQEAgLTQ5LDIzICs0NiwyNyBAQAogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ2FyYm9uIEFxdWEgVGsgKGluc3RlYWQgb2YgdGhlCiAgICAgbmV3ZXIgQ29jb2EgQXF1YSBUaykuCiAgICAgIiIiCi0gICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgaWYgbm90IF90a190eXBlOgorICAgICAgICBfaW5pdF90a190eXBlKCkKICAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNhcmJvbiIKIAogZGVmIGlzQ29jb2FUaygpOgogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ29jb2EgQXF1YSBUay4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAiY29jb2EiCiAKIGRlZiBpc1hRdWFydHooKToKICAgICAiIiIKICAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhbiBPUyBYIFgxMSBUay4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAieHF1YXJ0eiIKIAorCiBkZWYgdGtWZXJzaW9uV2FybmluZyhyb290KToKICAgICAiIiIKICAgICBSZXR1cm5zIGEgc3RyaW5nIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgVGsgdmVyc2lvbiBpbiB1c2UgYXBwZWFycyB0bwpAQCAtODYsNiArODcsOSBAQAogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiBGYWxzZQogCisKKyMjIEZpeCB0aGUgbWVudSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisKIGRlZiBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KToKICAgICAiIiIKICAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCByZXNwb25kIHRvIG9wZW4gQXBwbGVFdmVudHMsIHdoaWNoCkBAIC0xMjQsMjMgKzEyOCwyMyBAQAogICAgICMgRHVlIHRvIGEgKG1pcy0pZmVhdHVyZSBvZiBUa0FxdWEgdGhlIHVzZXIgd2lsbCBhbHNvIHNlZSBhbiBlbXB0eSBIZWxwCiAgICAgIyBtZW51LgogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgTWVudQotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgQmluZGluZ3MKLSAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFdpbmRvd0xpc3QKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IG1haW5tZW51CisgICAgZnJvbSBpZGxlbGliIGltcG9ydCB3aW5kb3dzCiAKLSAgICBjbG9zZUl0ZW0gPSBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXVstMl0KKyAgICBjbG9zZUl0ZW0gPSBtYWlubWVudS5tZW51ZGVmc1swXVsxXVstMl0KIAogICAgICMgUmVtb3ZlIHRoZSBsYXN0IDMgaXRlbXMgb2YgdGhlIGZpbGUgbWVudTogYSBzZXBhcmF0b3IsIGNsb3NlIHdpbmRvdyBhbmQKICAgICAjIHF1aXQuIENsb3NlIHdpbmRvdyB3aWxsIGJlIHJlaW5zZXJ0ZWQganVzdCBhYm92ZSB0aGUgc2F2ZSBpdGVtLCB3aGVyZQogICAgICMgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgSElHLiBRdWl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXVstMzpdCi0gICAgQmluZGluZ3MubWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKKyAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbMF1bMV1bLTM6XQorICAgIG1haW5tZW51Lm1lbnVkZWZzWzBdWzFdLmluc2VydCg2LCBjbG9zZUl0ZW0pCiAKICAgICAjIFJlbW92ZSB0aGUgJ0Fib3V0JyBlbnRyeSBmcm9tIHRoZSBoZWxwIG1lbnUsIGl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbgogICAgICMgbWVudQotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMV1bMV1bMDoyXQorICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1stMV1bMV1bMDoyXQogICAgICMgUmVtb3ZlIHRoZSAnQ29uZmlndXJlIElkbGUnIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMgbWVudSwgaXQgaXMgaW4gdGhlCiAgICAgIyBhcHBsaWNhdGlvbiBtZW51IGFzICdQcmVmZXJlbmNlcycKLSAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTJdWzFdWzBdCisgICAgZGVsIG1haW5tZW51Lm1lbnVkZWZzWy0yXVsxXVswXQogICAgIG1lbnViYXIgPSBNZW51KHJvb3QpCiAgICAgcm9vdC5jb25maWd1cmUobWVudT1tZW51YmFyKQogICAgIG1lbnVkaWN0ID0ge30KQEAgLTE1NSwzMCArMTU5LDMwIEBACiAKICAgICAgICAgaWYgZW5kID4gMDoKICAgICAgICAgICAgIG1lbnUuZGVsZXRlKDAsIGVuZCkKLSAgICAgICAgV2luZG93TGlzdC5hZGRfd2luZG93c190b19tZW51KG1lbnUpCi0gICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCisgICAgICAgIHdpbmRvd3MuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgIHdpbmRvd3MucmVnaXN0ZXJfY2FsbGJhY2socG9zdHdpbmRvd3NtZW51KQogCiAgICAgZGVmIGFib3V0X2RpYWxvZyhldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBIZWxwICdBYm91dCBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93LmFib3V0X2RpYWxvZy4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZwotICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBlZGl0b3IuRWRpdG9yV2luZG93LmFib3V0X2RpYWxvZy4KKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwX2Fib3V0CisgICAgICAgIGhlbHBfYWJvdXQuQWJvdXREaWFsb2cocm9vdCwgJ0Fib3V0IElETEUnKQogCiAgICAgZGVmIGNvbmZpZ19kaWFsb2coZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgT3B0aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIEVkaXRvcldpbmRvdy5FZGl0b3JXaW5kb3cuY29uZmlnX2RpYWxvZy4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdEaWFsb2cKKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuY29uZmlnX2RpYWxvZy4KKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdkaWFsb2cKIAogICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSByb290IG9iamVjdCBoYXMgYW4gaW5zdGFuY2VfZGljdCBhdHRyaWJ1dGUsCiAgICAgICAgICMgbWlycm9ycyBjb2RlIGluIEVkaXRvcldpbmRvdyAoYWx0aG91Z2ggdGhhdCBzZXRzIHRoZSBhdHRyaWJ1dGUKICAgICAgICAgIyBvbiBhbiBFZGl0b3JXaW5kb3cgaW5zdGFuY2UgdGhhdCBpcyB0aGVuIHBhc3NlZCBhcyB0aGUgZmlyc3QKICAgICAgICAgIyBhcmd1bWVudCB0byBDb25maWdEaWFsb2cpCiAgICAgICAgIHJvb3QuaW5zdGFuY2VfZGljdCA9IGZsaXN0LmludmVyc2VkaWN0Ci0gICAgICAgIGNvbmZpZ0RpYWxvZy5Db25maWdEaWFsb2cocm9vdCwgJ1NldHRpbmdzJykKKyAgICAgICAgY29uZmlnZGlhbG9nLkNvbmZpZ0RpYWxvZyhyb290LCAnU2V0dGluZ3MnKQogCiAgICAgZGVmIGhlbHBfZGlhbG9nKGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIEhlbHAgJ0lETEUgSGVscCcgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdy5oZWxwX2RpYWxvZy4KKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuaGVscF9kaWFsb2cuCiAgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgaGVscAogICAgICAgICBoZWxwLnNob3dfaWRsZWhlbHAocm9vdCkKIApAQCAtMTk4LDI5ICsyMDIsMzMgQEAKICAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSdhcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhcm9mZj0wKQogICAgICAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQotICAgICAgICBCaW5kaW5ncy5tZW51ZGVmcy5pbnNlcnQoMCwKKyAgICAgICAgbWFpbm1lbnUubWVudWRlZnMuaW5zZXJ0KDAsCiAgICAgICAgICAgICAoJ2FwcGxpY2F0aW9uJywgWwogICAgICAgICAgICAgICAgICgnQWJvdXQgSURMRScsICc8PGFib3V0LWlkbGU+PicpLAogICAgICAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICAgICAgIF0pKQotICAgICAgICB0a3ZlcnNpb24gPSByb290LnRrLmV2YWwoJ2luZm8gcGF0Y2hsZXZlbCcpCi0gICAgICAgIGlmIHR1cGxlKG1hcChpbnQsIHRrdmVyc2lvbi5zcGxpdCgnLicpKSkgPCAoOCwgNCwgMTQpOgotICAgICAgICAgICAgIyBmb3IgZWFybGllciBBcXVhVGsgdmVyc2lvbnMsIHN1cHBseSBhIFByZWZlcmVuY2VzIG1lbnUgaXRlbQotICAgICAgICAgICAgQmluZGluZ3MubWVudWRlZnNbMF1bMV0uYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICAoJ19QcmVmZXJlbmNlcy4uLi4nLCAnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicpLAotICAgICAgICAgICAgICAgICkKICAgICBpZiBpc0NvY29hVGsoKToKICAgICAgICAgIyByZXBsYWNlIGRlZmF1bHQgQWJvdXQgZGlhbG9nIHdpdGggQWJvdXQgSURMRSBvbmUKICAgICAgICAgcm9vdC5jcmVhdGVjb21tYW5kKCd0a0Fib3V0RGlhbG9nJywgYWJvdXRfZGlhbG9nKQogICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCAiSGVscCIgaXRlbSBpbiBIZWxwIG1lbnUKICAgICAgICAgcm9vdC5jcmVhdGVjb21tYW5kKCc6OnRrOjptYWM6OlNob3dIZWxwJywgaGVscF9kaWFsb2cpCiAgICAgICAgICMgcmVtb3ZlIHJlZHVuZGFudCAiSURMRSBIZWxwIiBmcm9tIG1lbnUKLSAgICAgICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWy0xXVsxXVswXQorICAgICAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbLTFdWzFdWzBdCisKK2RlZiBmaXhiMmNvbnRleHQocm9vdCk6CisgICAgJycnUmVtb3ZlZCBiYWQgQXF1YVRrIEJ1dHRvbi0yIChyaWdodCkgYW5kIFBhc3RlIGJpbmRpbmdzLgorCisgICAgVGhleSBwcmV2ZW50IGNvbnRleHQgbWVudSBhY2Nlc3MgYW5kIHNlZW0gdG8gYmUgZ29uZSBpbiBBcXVhVGs4LjYuCisgICAgU2VlIGlzc3VlICMyNDgwMS4KKyAgICAnJycKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjI+JykKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjItTW90aW9uPicpCisgICAgcm9vdC51bmJpbmRfY2xhc3MoJ1RleHQnLCAnPDxQYXN0ZVNlbGVjdGlvbj4+JykKIAogZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKICAgICAiIiIKICAgICBQZXJmb3JtIGluaXRpYWwgT1MgWCBjdXN0b21pemF0aW9ucyBpZiBuZWVkZWQuCi0gICAgQ2FsbGVkIGZyb20gUHlTaGVsbC5tYWluKCkgYWZ0ZXIgaW5pdGlhbCBjYWxscyB0byBUaygpCisgICAgQ2FsbGVkIGZyb20gcHlzaGVsbC5tYWluKCkgYWZ0ZXIgaW5pdGlhbCBjYWxscyB0byBUaygpCiAKICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIG1ham9yIHZlcnNpb25zIG9mIFRrIGluIHVzZSBvbiBPUyBYOgogICAgICAgICAxLiBBcXVhIENvY29hIFRrIChuYXRpdmUgZGVmYXVsdCBzaW5jZSBPUyBYIDEwLjYpCkBAIC0yMzMsOCArMjQxLDEzIEBACiAgICAgaXNBcXVhVGsoKSwgaXNDYXJib25UaygpLCBpc0NvY29hVGsoKSwgaXNYUXVhcnR6KCkgZnVuY3Rpb25zIHdoaWNoCiAgICAgYXJlIGluaXRpYWxpemVkIGhlcmUgYXMgd2VsbC4KICAgICAiIiIKLSAgICBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpCiAgICAgaWYgaXNBcXVhVGsoKToKICAgICAgICAgaGlkZVRrQ29uc29sZShyb290KQogICAgICAgICBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KQogICAgICAgICBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KQorICAgICAgICBmaXhiMmNvbnRleHQocm9vdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1haW4KKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X21hY29zeCcsIHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkgYi9MaWIvaWRsZWxpYi9tYWlubWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9CaW5kaW5ncy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbWFpbm1lbnUucHkKaW5kZXggYWIyNWZmMS4uOTY1YWRhMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkKKysrIGIvTGliL2lkbGVsaWIvbWFpbm1lbnUucHkKQEAgLTEwLDkgKzEwLDkgQEAKICIiIgogZnJvbSBpbXBvcnRsaWIudXRpbCBpbXBvcnQgZmluZF9zcGVjCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAotIyAgIFdhcm5pbmc6IG1lbnVkZWZzIGlzIGFsdGVyZWQgaW4gbWFjb3N4U3VwcG9ydC5vdmVycmlkZVJvb3RNZW51KCkKKyMgICBXYXJuaW5nOiBtZW51ZGVmcyBpcyBhbHRlcmVkIGluIG1hY29zeC5vdmVycmlkZVJvb3RNZW51KCkKICMgICBhZnRlciBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgYW4gT1MgWCBBcXVhIFRrIGlzIGluIHVzZSwKICMgICB3aGljaCBjYW5ub3QgYmUgZG9uZSB1bnRpbCBhZnRlciBUaygpIGlzIGZpcnN0IGNhbGxlZC4KICMgICBEbyBub3QgYWx0ZXIgdGhlICdmaWxlJywgJ29wdGlvbnMnLCBvciAnaGVscCcgY2FzY2FkZXMgaGVyZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5IGIvTGliL2lkbGVsaWIvbXVsdGljYWxsLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL011bHRpQ2FsbC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbXVsdGljYWxsLnB5CmluZGV4IDg0NjI4NTQuLmI3NGZlZDQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL011bHRpQ2FsbC5weQorKysgYi9MaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKQEAgLTI4LDkgKzI4LDkgQEAKICAgIHVubGVzcyB0aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBmaXJzdCBydWxlLgogRWFjaCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgZm9yIGVhY2ggZXZlbnQuCiAiIiIKLQotaW1wb3J0IHN5cwogaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKIGltcG9ydCB0a2ludGVyCiAKICMgdGhlIGV2ZW50IHR5cGUgY29uc3RhbnRzLCB3aGljaCBkZWZpbmUgdGhlIG1lYW5pbmcgb2YgbWNfdHlwZQpAQCAtNDE0LDEyICs0MTQsMTIgQEAKICAgICByZXR1cm4gTXVsdGlDYWxsCiAKIAotZGVmIF9tdWx0aV9jYWxsKHBhcmVudCk6Ci0gICAgcm9vdCA9IHRraW50ZXIuVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgTXVsdGlDYWxsIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgdGV4dCA9IE11bHRpQ2FsbENyZWF0b3IodGtpbnRlci5UZXh0KShyb290KQorZGVmIF9tdWx0aV9jYWxsKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSB0a2ludGVyLlRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgTXVsdGlDYWxsIikKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQorICAgIHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKHRraW50ZXIuVGV4dCkodG9wKQogICAgIHRleHQucGFjaygpCiAgICAgZGVmIGJpbmRzZXEoc2VxLCBuPVswXSk6CiAgICAgICAgIGRlZiBoYW5kbGVyKGV2ZW50KToKQEAgLTQzOSw3ICs0MzksNiBAQAogICAgIGJpbmRzZXEoIjxGb2N1c091dD4iKQogICAgIGJpbmRzZXEoIjxFbnRlcj4iKQogICAgIGJpbmRzZXEoIjxMZWF2ZT4iKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvT3V0cHV0V2luZG93LnB5IGIvTGliL2lkbGVsaWIvb3V0d2luLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvb3V0d2luLnB5CmluZGV4IGU2MTRmOWIuLmY2ZDI5MTUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9vdXR3aW4ucHkKQEAgLTEsOCArMSwxMSBAQAotZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKIGltcG9ydCByZQorCitmcm9tIHRraW50ZXIgaW1wb3J0ICoKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51CisKIAogY2xhc3MgT3V0cHV0V2luZG93KEVkaXRvcldpbmRvdyk6CiAKQEAgLTM2LDcgKzM5LDcgQEAKIAogICAgIGRlZiB3cml0ZShzZWxmLCBzLCB0YWdzPSgpLCBtYXJrPSJpbnNlcnQiKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIGJ5dGVzKSk6Ci0gICAgICAgICAgICBzID0gcy5kZWNvZGUoSU9CaW5kaW5nLmVuY29kaW5nLCAicmVwbGFjZSIpCisgICAgICAgICAgICBzID0gcy5kZWNvZGUoaW9tZW51LmVuY29kaW5nLCAicmVwbGFjZSIpCiAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQobWFyaywgcywgdGFncykKICAgICAgICAgc2VsZi50ZXh0LnNlZShtYXJrKQogICAgICAgICBzZWxmLnRleHQudXBkYXRlKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weSBiL0xpYi9pZGxlbGliL3BhcmFncmFwaC5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BhcmFncmFwaC5weQppbmRleCA3YTlkMTg1Li41ZDM1OGVlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkKKysrIGIvTGliL2lkbGVsaWIvcGFyYWdyYXBoLnB5CkBAIC0xNCw5ICsxNCwxMCBAQAogICBzcGFjZXMsIHRoZXkgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzYW1lIGJsb2NrLgogKiBGYW5jeSBjb21tZW50cywgbGlrZSB0aGlzIGJ1bGxldGVkIGxpc3QsIGFyZW4ndCBoYW5kbGVkIDotKQogIiIiCi0KIGltcG9ydCByZQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCisKIAogY2xhc3MgRm9ybWF0UGFyYWdyYXBoOgogCkBAIC0xODksNyArMTkwLDggQEAKICAgICBpZiBtIGlzIE5vbmU6IHJldHVybiAiIgogICAgIHJldHVybiBtLmdyb3VwKDEpCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2Zvcm1hdHBhcmFncmFwaCcsCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9wYXJhZ3JhcGgnLAogICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5IGIvTGliL2lkbGVsaWIvcGFyZW5tYXRjaC5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9wYXJlbm1hdGNoLnB5CmluZGV4IDQ3ZTEwZjMuLmNjZWM3MDggMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKKysrIGIvTGliL2lkbGVsaWIvcGFyZW5tYXRjaC5weQpAQCAtNCw5ICs0LDggQEAKIHBhcmVuLiAgUGFyZW4gaGVyZSBpcyB1c2VkIGdlbmVyaWNhbGx5OyB0aGUgbWF0Y2hpbmcgYXBwbGllcyB0bwogcGFyZW50aGVzZXMsIHNxdWFyZSBicmFja2V0cywgYW5kIGN1cmx5IGJyYWNlcy4KICIiIgotCi1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIF9vcGVuZXJzID0geycpJzonKCcsJ10nOidbJywnfSc6J3snfQogQ0hFQ0tfREVMQVkgPSAxMDAgIyBtaWxsaXNlY29uZHMKQEAgLTY0LDYgKzYzLDcgQEAKICAgICAgICAgIyBhbmQgZGVhY3RpdmF0ZV9yZXN0b3JlICh3aGljaCBjYWxscyBldmVudF9kZWxldGUpLgogICAgICAgICBlZGl0d2luLnRleHQuYmluZChzZWxmLlJFU1RPUkVfVklSVFVBTF9FVkVOVF9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3RvcmVfZXZlbnQpCisgICAgICAgIHNlbGYuYmVsbCA9IHNlbGYudGV4dC5iZWxsIGlmIHNlbGYuQkVMTCBlbHNlIGxhbWJkYTogTm9uZQogICAgICAgICBzZWxmLmNvdW50ZXIgPSAwCiAgICAgICAgIHNlbGYuaXNfcmVzdG9yZV9hY3RpdmUgPSAwCiAgICAgICAgIHNlbGYuc2V0X3N0eWxlKHNlbGYuU1RZTEUpCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgIGluZGljZXMgPSAoSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0IikKICAgICAgICAgICAgICAgICAgICAuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKCkpCiAgICAgICAgIGlmIGluZGljZXMgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYud2Fybl9taXNtYXRjaGVkKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5hY3RpdmF0ZV9yZXN0b3JlKCkKICAgICAgICAgc2VsZi5jcmVhdGVfdGFnKGluZGljZXMpCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpbmRpY2VzID0gaHAuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKF9vcGVuZXJzW2Nsb3Nlcl0sIFRydWUpCiAgICAgICAgIGlmIGluZGljZXMgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYud2Fybl9taXNtYXRjaGVkKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VsZi5hY3RpdmF0ZV9yZXN0b3JlKCkKICAgICAgICAgc2VsZi5jcmVhdGVfdGFnKGluZGljZXMpCkBAIC0xMjQsMTAgKzEyNCw2IEBACiAgICAgICAgIGlmIHRpbWVyX2NvdW50ID09IHNlbGYuY291bnRlcjoKICAgICAgICAgICAgIHNlbGYucmVzdG9yZV9ldmVudCgpCiAKLSAgICBkZWYgd2Fybl9taXNtYXRjaGVkKHNlbGYpOgotICAgICAgICBpZiBzZWxmLkJFTEw6Ci0gICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCi0KICAgICAjIGFueSBvbmUgb2YgdGhlIGNyZWF0ZV90YWdfWFhYIG1ldGhvZHMgY2FuIGJlIHVzZWQgZGVwZW5kaW5nIG9uCiAgICAgIyB0aGUgc3R5bGUKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGF0aEJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcGF0aGJyb3dzZXIucHkKaW5kZXggOWFiNzYzMi4uNmMxOTUwOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGF0aEJyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvcGF0aGJyb3dzZXIucHkKQEAgLTEsMTAgKzEsMTAgQEAKK2ltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKLWltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CiAKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbQotZnJvbSBpZGxlbGliLkNsYXNzQnJvd3NlciBpbXBvcnQgQ2xhc3NCcm93c2VyLCBNb2R1bGVCcm93c2VyVHJlZUl0ZW0KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi5icm93c2VyIGltcG9ydCBDbGFzc0Jyb3dzZXIsIE1vZHVsZUJyb3dzZXJUcmVlSXRlbQorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAorZnJvbSBpZGxlbGliLnRyZWUgaW1wb3J0IFRyZWVJdGVtCiAKIAogY2xhc3MgUGF0aEJyb3dzZXIoQ2xhc3NCcm93c2VyKToKQEAgLTI0LDYgKzI0LDcgQEAKICAgICBkZWYgcm9vdG5vZGUoc2VsZik6CiAgICAgICAgIHJldHVybiBQYXRoQnJvd3NlclRyZWVJdGVtKCkKIAorCiBjbGFzcyBQYXRoQnJvd3NlclRyZWVJdGVtKFRyZWVJdGVtKToKIAogICAgIGRlZiBHZXRUZXh0KHNlbGYpOgpAQCAtMzYsNiArMzcsNyBAQAogICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgcmV0dXJuIHN1Ymxpc3QKIAorCiBjbGFzcyBEaXJCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpciwgcGFja2FnZXM9W10pOgpAQCAtOTUsNiArOTcsNyBAQAogICAgICAgICBzb3J0ZWQuc29ydCgpCiAgICAgICAgIHJldHVybiBzb3J0ZWQKIAorCiBkZWYgX3BhdGhfYnJvd3NlcihwYXJlbnQpOiAgIyBodGVzdCAjCiAgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3QocGFyZW50KQogICAgIFBhdGhCcm93c2VyKGZsaXN0LCBfaHRlc3Q9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkgYi9MaWIvaWRsZWxpYi9wZXJjb2xhdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BlcmNvbGF0b3IucHkKaW5kZXggYjhiZTJhYS4uZDE4ZGFmMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGVyY29sYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9wZXJjb2xhdG9yLnB5CkBAIC0xLDUgKzEsNSBAQAotZnJvbSBpZGxlbGliLldpZGdldFJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKLWZyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLmRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIucmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgogCiAKIGNsYXNzIFBlcmNvbGF0b3I6CkBAIC01Nyw3ICs1Nyw2IEBACiAKIGRlZiBfcGVyY29sYXRvcihwYXJlbnQpOiAgIyBodGVzdCAjCiAgICAgaW1wb3J0IHRraW50ZXIgYXMgdGsKLSAgICBpbXBvcnQgcmUKIAogICAgIGNsYXNzIFRyYWNlcihEZWxlZ2F0b3IpOgogICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CkBAIC03NCw4ICs3Myw4IEBACiAKICAgICBib3ggPSB0ay5Ub3BsZXZlbChwYXJlbnQpCiAgICAgYm94LnRpdGxlKCJUZXN0IFBlcmNvbGF0b3IiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICBib3guZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKICAgICB0ZXh0ID0gdGsuVGV4dChib3gpCiAgICAgcCA9IFBlcmNvbGF0b3IodGV4dCkKICAgICBwaW4gPSBwLmluc2VydGZpbHRlcgpAQCAtODksMTAgKzg4LDEwIEBACiAgICAgICAgIChwaW4gaWYgdmFyMi5nZXQoKSBlbHNlIHBvdXQpKHQyKQogCiAgICAgdGV4dC5wYWNrKCkKLSAgICB2YXIxID0gdGsuSW50VmFyKCkKKyAgICB2YXIxID0gdGsuSW50VmFyKHBhcmVudCkKICAgICBjYjEgPSB0ay5DaGVja2J1dHRvbihib3gsIHRleHQ9IlRyYWNlcjEiLCBjb21tYW5kPXRvZ2dsZTEsIHZhcmlhYmxlPXZhcjEpCiAgICAgY2IxLnBhY2soKQotICAgIHZhcjIgPSB0ay5JbnRWYXIoKQorICAgIHZhcjIgPSB0ay5JbnRWYXIocGFyZW50KQogICAgIGNiMiA9IHRrLkNoZWNrYnV0dG9uKGJveCwgdGV4dD0iVHJhY2VyMiIsIGNvbW1hbmQ9dG9nZ2xlMiwgdmFyaWFibGU9dmFyMikKICAgICBjYjIucGFjaygpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1B5UGFyc2UucHkgYi9MaWIvaWRsZWxpYi9weXBhcnNlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1B5UGFyc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3B5cGFyc2UucHkKaW5kZXggOWNjYmIyNS4uNjczOWRmZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUHlQYXJzZS5weQorKysgYi9MaWIvaWRsZWxpYi9weXBhcnNlLnB5CkBAIC0xLDYgKzEsNiBAQAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTWFwcGluZwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCi1mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCiAKICMgUmVhc29uIGxhc3Qgc3RtdCBpcyBjb250aW51ZWQgKG9yIENfTk9ORSBpZiBpdCdzIG5vdCkuCiAoQ19OT05FLCBDX0JBQ0tTTEFTSCwgQ19TVFJJTkdfRklSU1RfTElORSwKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1B5U2hlbGwucHkgYi9MaWIvaWRsZWxpYi9weXNoZWxsLnB5CnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1B5U2hlbGwucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3B5c2hlbGwucHkKaW5kZXggNWRlYzY4ZS4uZTFlYWRlMSAxMDA3NTUKLS0tIGEvTGliL2lkbGVsaWIvUHlTaGVsbC5weQorKysgYi9MaWIvaWRsZWxpYi9weXNoZWxsLnB5CkBAIC0xLDIxICsxLDUgQEAKICMhIC91c3IvYmluL2VudiBweXRob24zCiAKLWltcG9ydCBnZXRvcHQKLWltcG9ydCBvcwotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCByZQotaW1wb3J0IHNvY2tldAotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLWltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCB0aW1lCi1pbXBvcnQgdG9rZW5pemUKLWltcG9ydCBpbwotCi1pbXBvcnQgbGluZWNhY2hlCi1mcm9tIGNvZGUgaW1wb3J0IEludGVyYWN0aXZlSW50ZXJwcmV0ZXIKLWZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uLCBzeXN0ZW0KLQogdHJ5OgogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgKgogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtMjMsMTcgKzcsNDIgQEAKICAgICAgICAgICAiWW91ciBQeXRob24gbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciBUay4gKioiLCBmaWxlPXN5cy5fX3N0ZGVycl9fKQogICAgIHN5cy5leGl0KDEpCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAoraWYgVGtWZXJzaW9uIDwgOC41OgorICAgIHJvb3QgPSBUaygpICAjIG90aGVyd2lzZSBjcmVhdGUgcm9vdCBpbiBtYWluCisgICAgcm9vdC53aXRoZHJhdygpCisgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSWRsZSBDYW5ub3QgU3RhcnQiLAorICAgICAgICAgICAgIklkbGUgcmVxdWlyZXMgdGNsL3RrIDguNSssIG5vdCAkcy4iICUgVGtWZXJzaW9uLAorICAgICAgICAgICAgcGFyZW50PXJvb3QpCisgICAgc3lzLmV4aXQoMSkKIAotZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93LCBmaXh3b3JkYnJlYWtzCi1mcm9tIGlkbGVsaWIuRmlsZUxpc3QgaW1wb3J0IEZpbGVMaXN0Ci1mcm9tIGlkbGVsaWIuQ29sb3JEZWxlZ2F0b3IgaW1wb3J0IENvbG9yRGVsZWdhdG9yCi1mcm9tIGlkbGVsaWIuVW5kb0RlbGVnYXRvciBpbXBvcnQgVW5kb0RlbGVnYXRvcgotZnJvbSBpZGxlbGliLk91dHB1dFdpbmRvdyBpbXBvcnQgT3V0cHV0V2luZG93Ci1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gY29kZSBpbXBvcnQgSW50ZXJhY3RpdmVJbnRlcnByZXRlcgoraW1wb3J0IGdldG9wdAoraW1wb3J0IGlvCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitmcm9tIHBsYXRmb3JtIGltcG9ydCBweXRob25fdmVyc2lvbiwgc3lzdGVtCitpbXBvcnQgcmUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdGltZQoraW1wb3J0IHRva2VuaXplCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXN0aW5nICAjIGJvb2wgdmFsdWUKK2Zyb20gaWRsZWxpYi5jb2xvcml6ZXIgaW1wb3J0IENvbG9yRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcl9yCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3csIGZpeHdvcmRicmVha3MKK2Zyb20gaWRsZWxpYi5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4Citmcm9tIGlkbGVsaWIub3V0d2luIGltcG9ydCBPdXRwdXRXaW5kb3cKIGZyb20gaWRsZWxpYiBpbXBvcnQgcnBjCi1mcm9tIGlkbGVsaWIgaW1wb3J0IERlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZURlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYi5ydW4gaW1wb3J0IGlkbGVfZm9ybWF0d2FybmluZywgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCitmcm9tIGlkbGVsaWIudW5kbyBpbXBvcnQgVW5kb0RlbGVnYXRvcgogCiBIT1NUID0gJzEyNy4wLjAuMScgIyBweXRob24gZXhlY3V0aW9uIHNlcnZlciBvbiBsb2NhbGhvc3QgbG9vcGJhY2sKIFBPUlQgPSAwICAjIHNvbWVkYXkgcGFzcyBpbiBob3N0LCBwb3J0IGZvciByZW1vdGUgZGVidWcgY2FwYWJpbGl0eQpAQCAtNDMsMjAgKzUyLDYgQEAKICMgdGVtcG9yYXJpbHkgcmVkaXJlY3QgdGhlIHN0cmVhbSB0byB0aGUgc2hlbGwgd2luZG93IHRvIGRpc3BsYXkgd2FybmluZ3Mgd2hlbgogIyBjaGVja2luZyB1c2VyJ3MgY29kZS4KIHdhcm5pbmdfc3RyZWFtID0gc3lzLl9fc3RkZXJyX18gICMgTm9uZSwgYXQgbGVhc3Qgb24gV2luZG93cywgaWYgbm8gY29uc29sZS4KLWltcG9ydCB3YXJuaW5ncwotCi1kZWYgaWRsZV9mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPU5vbmUpOgotICAgICIiIkZvcm1hdCB3YXJuaW5ncyB0aGUgSURMRSB3YXkuIiIiCi0KLSAgICBzID0gIlxuV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOlxuIgotICAgIHMgKz0gJyAgRmlsZSBcIiVzXCIsIGxpbmUgJXNcbicgJSAoZmlsZW5hbWUsIGxpbmVubykKLSAgICBpZiBsaW5lIGlzIE5vbmU6Ci0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQotICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKLSAgICBpZiBsaW5lOgotICAgICAgICBzICs9ICIgICAgJXNcbiIgJSBsaW5lCi0gICAgcyArPSAiJXM6ICVzXG4iICUgKGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQotICAgIHJldHVybiBzCiAKIGRlZiBpZGxlX3Nob3d3YXJuaW5nKAogICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgpAQCAtNDEwLDcgKzQwNSw3IEBACiAgICAgICAgICMgcnVuIGZyb20gdGhlIElETEUgc291cmNlIGRpcmVjdG9yeS4KICAgICAgICAgZGVsX2V4aXRmID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLCAnZGVsZXRlLWV4aXRmdW5jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsIHR5cGU9J2Jvb2wnKQotICAgICAgICBpZiBfX25hbWVfXyA9PSAnaWRsZWxpYi5QeVNoZWxsJzoKKyAgICAgICAgaWYgX19uYW1lX18gPT0gJ2lkbGVsaWIucHlzaGVsbCc6CiAgICAgICAgICAgICBjb21tYW5kID0gIl9faW1wb3J0X18oJ2lkbGVsaWIucnVuJykucnVuLm1haW4oJXIpIiAlIChkZWxfZXhpdGYsKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY29tbWFuZCA9ICJfX2ltcG9ydF9fKCdydW4nKS5tYWluKCVyKSIgJSAoZGVsX2V4aXRmLCkKQEAgLTQ2OCw3ICs0NjMsNyBAQAogICAgICAgICBpZiBkZWJ1ZzoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAjIE9ubHkgY2xvc2Ugc3VicHJvY2VzcyBkZWJ1Z2dlciwgZG9uJ3QgdW5yZWdpc3RlciBndWlfYWRhcCEKLSAgICAgICAgICAgICAgICBSZW1vdGVEZWJ1Z2dlci5jbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQorICAgICAgICAgICAgICAgIGRlYnVnZ2VyX3IuY2xvc2Vfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgS2lsbCBzdWJwcm9jZXNzLCBzcGF3biBhIG5ldyBvbmUsIGFjY2VwdCBjb25uZWN0aW9uLgpAQCAtNDk3LDcgKzQ5Miw3IEBACiAgICAgICAgICMgcmVzdGFydCBzdWJwcm9jZXNzIGRlYnVnZ2VyCiAgICAgICAgIGlmIGRlYnVnOgogICAgICAgICAgICAgIyBSZXN0YXJ0ZWQgZGVidWdnZXIgY29ubmVjdHMgdG8gY3VycmVudCBpbnN0YW5jZSBvZiBkZWJ1ZyBHVUkKLSAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLnJlc3RhcnRfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKKyAgICAgICAgICAgIGRlYnVnZ2VyX3IucmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQogICAgICAgICAgICAgIyByZWxvYWQgcmVtb3RlIGRlYnVnZ2VyIGJyZWFrcG9pbnRzIGZvciBhbGwgUHlTaGVsbEVkaXRXaW5kb3dzCiAgICAgICAgICAgICBkZWJ1Zy5sb2FkX2JyZWFrcG9pbnRzKCkKICAgICAgICAgc2VsZi5jb21waWxlLmNvbXBpbGVyLmZsYWdzID0gc2VsZi5vcmlnaW5hbF9jb21waWxlcl9mbGFncwpAQCAtNTc4LDcgKzU3Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgc2VsZi50a2NvbnNvbGUuZ2V0dmFyKCI8PHRvZ2dsZS1qaXQtc3RhY2stdmlld2VyPj4iKToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdGVfc3RhY2tfdmlld2VyKCkKICAgICAgICAgICAgIGVsaWYgaG93ID09ICJFUlJPUiI6Ci0gICAgICAgICAgICAgICAgZXJybXNnID0gIlB5U2hlbGwuTW9kaWZpZWRJbnRlcnByZXRlcjogU3VicHJvY2VzcyBFUlJPUjpcbiIKKyAgICAgICAgICAgICAgICBlcnJtc2cgPSAicHlzaGVsbC5Nb2RpZmllZEludGVycHJldGVyOiBTdWJwcm9jZXNzIEVSUk9SOlxuIgogICAgICAgICAgICAgICAgIHByaW50KGVycm1zZywgd2hhdCwgZmlsZT1zeXMuX19zdGRlcnJfXykKICAgICAgICAgICAgICAgICBwcmludChlcnJtc2csIHdoYXQsIGZpbGU9Y29uc29sZSkKICAgICAgICAgICAgICMgd2UgcmVjZWl2ZWQgYSByZXNwb25zZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBzZXEgbnVtYmVyOgpAQCAtNjEzLDEzICs2MDgsMTMgQEAKICAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgcmVtb3RlX3N0YWNrX3ZpZXdlcihzZWxmKToKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdvYmpfcgogICAgICAgICBvaWQgPSBzZWxmLnJwY2NsdC5yZW1vdGVxdWV1ZSgiZXhlYyIsICJzdGFja3ZpZXdlciIsICgiZmxpc3QiLCksIHt9KQogICAgICAgICBpZiBvaWQgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJvb3QuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaXRlbSA9IFJlbW90ZU9iamVjdEJyb3dzZXIuU3R1Yk9iamVjdFRyZWVJdGVtKHNlbGYucnBjY2x0LCBvaWQpCi0gICAgICAgIGZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBTY3JvbGxlZENhbnZhcywgVHJlZU5vZGUKKyAgICAgICAgaXRlbSA9IGRlYnVnb2JqX3IuU3R1Yk9iamVjdFRyZWVJdGVtKHNlbGYucnBjY2x0LCBvaWQpCisgICAgICAgIGZyb20gaWRsZWxpYi50cmVlIGltcG9ydCBTY3JvbGxlZENhbnZhcywgVHJlZU5vZGUKICAgICAgICAgdG9wID0gVG9wbGV2ZWwoc2VsZi50a2NvbnNvbGUucm9vdCkKICAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5DdXJyZW50VGhlbWUoKQogICAgICAgICBiYWNrZ3JvdW5kID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnbm9ybWFsJylbJ2JhY2tncm91bmQnXQpAQCAtNjYyLDkgKzY1Nyw5IEBACiAgICAgICAgICMgYXQgdGhlIG1vbWVudCwgSW50ZXJhY3RpdmVJbnRlcnByZXRlciBleHBlY3RzIHN0cgogICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzb3VyY2UsIHN0cikKICAgICAgICAgI2lmIGlzaW5zdGFuY2Uoc291cmNlLCBzdHIpOgotICAgICAgICAjICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisgICAgICAgICMgICAgZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKICAgICAgICAgIyAgICB0cnk6Ci0gICAgICAgICMgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICAjICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZW5jb2RlKGlvbWVudS5lbmNvZGluZykKICAgICAgICAgIyAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAjICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCiAgICAgICAgICMgICAgICAgIHNlbGYud3JpdGUoIlVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgaW4gaW5wdXRcbiIpCkBAIC04NTAsNyArODQ1LDcgQEAKIAogCiAgICAgIyBOZXcgY2xhc3NlcwotICAgIGZyb20gaWRsZWxpYi5JZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQorICAgIGZyb20gaWRsZWxpYi5oaXN0b3J5IGltcG9ydCBIaXN0b3J5CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3Q9Tm9uZSk6CiAgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgpAQCAtODg4LDExICs4ODMsMTEgQEAKICAgICAgICAgc2VsZi5zYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKICAgICAgICAgc2VsZi5zYXZlX3N0ZGVyciA9IHN5cy5zdGRlcnIKICAgICAgICAgc2VsZi5zYXZlX3N0ZGluID0gc3lzLnN0ZGluCi0gICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCi0gICAgICAgIHNlbGYuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZiwgInN0ZGluIiwgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzZWxmLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZG91dCIsIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc2VsZi5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRlcnIiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuY29uc29sZSA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgImNvbnNvbGUiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51CisgICAgICAgIHNlbGYuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZiwgInN0ZGluIiwgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZG91dCIsIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRlcnIiLCBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuY29uc29sZSA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgImNvbnNvbGUiLCBpb21lbnUuZW5jb2RpbmcpCiAgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLnN0ZG91dAogICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuc3RkZXJyCkBAIC05MDAsNyArODk1LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBwYWdlIGhlbHAoKSB0ZXh0IHRvIHNoZWxsLgogICAgICAgICAgICAgaW1wb3J0IHB5ZG9jICMgaW1wb3J0IG11c3QgYmUgZG9uZSBoZXJlIHRvIGNhcHR1cmUgaS9vIHJlYmluZGluZy4KLSAgICAgICAgICAgICMgWFhYIEtCSyAyN0RlYzA3IHVzZSBhIHRleHRWaWV3IHNvbWVkYXksIGJ1dCBtdXN0IHdvcmsgdy9vIHN1YnByb2MKKyAgICAgICAgICAgICMgWFhYIEtCSyAyN0RlYzA3IHVzZSBUZXh0Vmlld2VyIHNvbWVkYXksIGJ1dCBtdXN0IHdvcmsgdy9vIHN1YnByb2MKICAgICAgICAgICAgIHB5ZG9jLnBhZ2VyID0gcHlkb2MucGxhaW5wYWdlcgogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KQEAgLTk1NCw3ICs5NDksNyBAQAogICAgICAgICAgICAgc2VsZi5pbnRlcnAuc2V0ZGVidWdnZXIoTm9uZSkKICAgICAgICAgICAgIGRiLmNsb3NlKCkKICAgICAgICAgICAgIGlmIHNlbGYuaW50ZXJwLnJwY2NsdDoKLSAgICAgICAgICAgICAgICBSZW1vdGVEZWJ1Z2dlci5jbG9zZV9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0KQorICAgICAgICAgICAgICAgIGRlYnVnZ2VyX3IuY2xvc2VfcmVtb3RlX2RlYnVnZ2VyKHNlbGYuaW50ZXJwLnJwY2NsdCkKICAgICAgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQogICAgICAgICAgICAgc2VsZi5jb25zb2xlLndyaXRlKCJbREVCVUcgT0ZGXVxuIikKICAgICAgICAgICAgIHN5cy5wczEgPSAiPj4+ICIKQEAgLTk2MywxMCArOTU4LDEwIEBACiAKICAgICBkZWYgb3Blbl9kZWJ1Z2dlcihzZWxmKToKICAgICAgICAgaWYgc2VsZi5pbnRlcnAucnBjY2x0OgotICAgICAgICAgICAgZGJnX2d1aSA9IFJlbW90ZURlYnVnZ2VyLnN0YXJ0X3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQsCisgICAgICAgICAgICBkYmdfZ3VpID0gZGVidWdnZXJfci5zdGFydF9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGJnX2d1aSA9IERlYnVnZ2VyLkRlYnVnZ2VyKHNlbGYpCisgICAgICAgICAgICBkYmdfZ3VpID0gZGVidWdnZXIuRGVidWdnZXIoc2VsZikKICAgICAgICAgc2VsZi5pbnRlcnAuc2V0ZGVidWdnZXIoZGJnX2d1aSkKICAgICAgICAgZGJnX2d1aS5sb2FkX2JyZWFrcG9pbnRzKCkKICAgICAgICAgc3lzLnBzMSA9ICJbREVCVUcgT05dXG4+Pj4gIgpAQCAtMTI0MSw3ICsxMjM2LDcgQEAKICAgICAgICAgICAgICAgICAiKHN5cy5sYXN0X3RyYWNlYmFjayBpcyBub3QgZGVmaW5lZCkiLAogICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZnJvbSBpZGxlbGliLlN0YWNrVmlld2VyIGltcG9ydCBTdGFja0Jyb3dzZXIKKyAgICAgICAgZnJvbSBpZGxlbGliLnN0YWNrdmlld2VyIGltcG9ydCBTdGFja0Jyb3dzZXIKICAgICAgICAgU3RhY2tCcm93c2VyKHNlbGYucm9vdCwgc2VsZi5mbGlzdCkKIAogICAgIGRlZiB2aWV3X3Jlc3RhcnRfbWFyayhzZWxmLCBldmVudD1Ob25lKToKQEAgLTEzMDksOTIgKzEzMDQsNiBAQAogICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKICAgICAgICAgcmV0dXJuIHN1cGVyKCkucm1lbnVfY2hlY2tfcGFzdGUoKQogCi1jbGFzcyBQc2V1ZG9GaWxlKGlvLlRleHRJT0Jhc2UpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZz1Ob25lKToKLSAgICAgICAgc2VsZi5zaGVsbCA9IHNoZWxsCi0gICAgICAgIHNlbGYudGFncyA9IHRhZ3MKLSAgICAgICAgc2VsZi5fZW5jb2RpbmcgPSBlbmNvZGluZwotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGVuY29kaW5nKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fZW5jb2RpbmcKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiBuYW1lKHNlbGYpOgotICAgICAgICByZXR1cm4gJzwlcz4nICUgc2VsZi50YWdzCi0KLSAgICBkZWYgaXNhdHR5KHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0KLWNsYXNzIFBzZXVkb091dHB1dEZpbGUoUHNldWRvRmlsZSk6Ci0KLSAgICBkZWYgd3JpdGFibGUoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgd3JpdGUoc2VsZiwgcyk6Ci0gICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigid3JpdGUgdG8gY2xvc2VkIGZpbGUiKQotICAgICAgICBpZiB0eXBlKHMpIGlzIG5vdCBzdHI6Ci0gICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCBzdHIpOgotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBzdHIsIG5vdCAnICsgdHlwZShzKS5fX25hbWVfXykKLSAgICAgICAgICAgICMgU2VlIGlzc3VlICMxOTQ4MQotICAgICAgICAgICAgcyA9IHN0ci5fX3N0cl9fKHMpCi0gICAgICAgIHJldHVybiBzZWxmLnNoZWxsLndyaXRlKHMsIHNlbGYudGFncykKLQotCi1jbGFzcyBQc2V1ZG9JbnB1dEZpbGUoUHNldWRvRmlsZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgotICAgICAgICBQc2V1ZG9GaWxlLl9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZykKLSAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSAnJwotCi0gICAgZGVmIHJlYWRhYmxlKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6Ci0gICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKLSAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgotICAgICAgICAgICAgc2l6ZSA9IC0xCi0gICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGluZV9idWZmZXIKLSAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSAnJwotICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2hlbGwucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHNpemU6Ci0gICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2hlbGwucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lCi0gICAgICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9IHJlc3VsdFtzaXplOl0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFs6c2l6ZV0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgotICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlYWQgZnJvbSBjbG9zZWQgZmlsZSIpCi0gICAgICAgIGlmIHNpemUgaXMgTm9uZToKLSAgICAgICAgICAgIHNpemUgPSAtMQotICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNpemUsIGludCk6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgaW50LCBub3QgJyArIHR5cGUoc2l6ZSkuX19uYW1lX18pCi0gICAgICAgIGxpbmUgPSBzZWxmLl9saW5lX2J1ZmZlciBvciBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgc2l6ZSA8IDA6Ci0gICAgICAgICAgICBzaXplID0gbGVuKGxpbmUpCi0gICAgICAgIGVvbCA9IGxpbmUuZmluZCgnXG4nLCAwLCBzaXplKQotICAgICAgICBpZiBlb2wgPj0gMDoKLSAgICAgICAgICAgIHNpemUgPSBlb2wgKyAxCi0gICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gbGluZVtzaXplOl0KLSAgICAgICAgcmV0dXJuIGxpbmVbOnNpemVdCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuc2hlbGwuY2xvc2UoKQotCiAKIGRlZiBmaXhfeDExX3Bhc3RlKHJvb3QpOgogICAgICJNYWtlIHBhc3RlIHJlcGxhY2Ugc2VsZWN0aW9uIG9uIHgxMS4gIFNlZSBpc3N1ZSAjNTEyNC4iCkBAIC0xNTQwLDcgKzE0NDksMTAgQEAKICAgICBlbmFibGVfZWRpdCA9IGVuYWJsZV9lZGl0IG9yIGVkaXRfc3RhcnQKICAgICBlbmFibGVfc2hlbGwgPSBlbmFibGVfc2hlbGwgb3Igbm90IGVuYWJsZV9lZGl0CiAKLSAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKKyAgICAjIFNldHVwIHJvb3QuICBEb24ndCBicmVhayB1c2VyIGNvZGUgcnVuIGluIElETEUgcHJvY2Vzcy4KKyAgICAjIERvbid0IGNoYW5nZSBlbnZpcm9ubWVudCB3aGVuIHRlc3RpbmcuCisgICAgaWYgdXNlX3N1YnByb2Nlc3MgYW5kIG5vdCB0ZXN0aW5nOgorICAgICAgICBOb0RlZmF1bHRSb290KCkKICAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKICAgICByb290LndpdGhkcmF3KCkKIApAQCAtMTU0OSwyNSArMTQ2MSwxOSBAQAogICAgIGlmIHN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgICAgICAgaWNvbmZpbGUgPSBvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGUuaWNvJykKICAgICAgICAgcm9vdC53bV9pY29uYml0bWFwKGRlZmF1bHQ9aWNvbmZpbGUpCi0gICAgZWxpZiBUa1ZlcnNpb24gPj0gOC41OgorICAgIGVsc2U6CiAgICAgICAgIGV4dCA9ICcucG5nJyBpZiBUa1ZlcnNpb24gPj0gOC42IGVsc2UgJy5naWYnCiAgICAgICAgIGljb25maWxlcyA9IFtvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGVfJWQlcycgJSAoc2l6ZSwgZXh0KSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBzaXplIGluICgxNiwgMzIsIDQ4KV0KLSAgICAgICAgaWNvbnMgPSBbUGhvdG9JbWFnZShmaWxlPWljb25maWxlKSBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQorICAgICAgICBpY29ucyA9IFtQaG90b0ltYWdlKG1hc3Rlcj1yb290LCBmaWxlPWljb25maWxlKQorICAgICAgICAgICAgICAgICBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQogICAgICAgICByb290LndtX2ljb25waG90byhUcnVlLCAqaWNvbnMpCiAKKyAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKICAgICBmaXh3b3JkYnJlYWtzKHJvb3QpCiAgICAgZml4X3gxMV9wYXN0ZShyb290KQogICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBmbGlzdCkKLQotICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKToKLSAgICAgICAgIyBUaGVyZSBhcmUgc29tZSBzY3Jld2VkIHVwIDwyPiBjbGFzcyBiaW5kaW5ncyBmb3IgdGV4dAotICAgICAgICAjIHdpZGdldHMgZGVmaW5lZCBpbiBUayB3aGljaCB3ZSBuZWVkIHRvIGRvIGF3YXkgd2l0aC4KLSAgICAgICAgIyBTZWUgaXNzdWUgIzI0ODAxLgotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjI+JykKLSAgICAgICAgcm9vdC51bmJpbmRfY2xhc3MoJ1RleHQnLCAnPEIyLU1vdGlvbj4nKQotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8PFBhc3RlU2VsZWN0aW9uPj4nKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBmbGlzdCkKIAogICAgIGlmIGVuYWJsZV9lZGl0OgogICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgpAQCAtMTU4Miw3ICsxNDg4LDcgQEAKICAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKICAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpIGFuZCBmbGlzdC5kaWN0OgogICAgICAgICAgICAgIyBPbiBPU1g6IHdoZW4gdGhlIHVzZXIgaGFzIGRvdWJsZS1jbGlja2VkIG9uIGEgZmlsZSB0aGF0IGNhdXNlcwogICAgICAgICAgICAgIyBJRExFIHRvIGJlIGxhdW5jaGVkIHRoZSBzaGVsbCB3aW5kb3cgd2lsbCBvcGVuIGp1c3QgaW4gZnJvbnQgb2YKICAgICAgICAgICAgICMgdGhlIGZpbGUgc2hlIHdhbnRzIHRvIHNlZS4gTG93ZXIgdGhlIGludGVycHJldGVyIHdpbmRvdyB3aGVuCkBAIC0xNjE2LDcgKzE1MjIsNyBAQAogICAgICAgICAjIGNoZWNrIGZvciBwcm9ibGVtYXRpYyBPUyBYIFRrIHZlcnNpb25zIGFuZCBwcmludCBhIHdhcm5pbmcKICAgICAgICAgIyBtZXNzYWdlIGluIHRoZSBJRExFIHNoZWxsIHdpbmRvdzsgdGhpcyBpcyBsZXNzIGludHJ1c2l2ZQogICAgICAgICAjIHRoYW4gYWx3YXlzIG9wZW5pbmcgYSBzZXBhcmF0ZSB3aW5kb3cuCi0gICAgICAgIHRrdmVyc2lvbndhcm5pbmcgPSBtYWNvc3hTdXBwb3J0LnRrVmVyc2lvbldhcm5pbmcocm9vdCkKKyAgICAgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeC50a1ZlcnNpb25XYXJuaW5nKHJvb3QpCiAgICAgICAgIGlmIHRrdmVyc2lvbndhcm5pbmc6CiAgICAgICAgICAgICBzaGVsbC5pbnRlcnAucnVuY29tbWFuZCgicHJpbnQoJyVzJykiICUgdGt2ZXJzaW9ud2FybmluZykKIApAQCAtMTYyNiw3ICsxNTMyLDcgQEAKICAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHN5cy5tb2R1bGVzWydQeVNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIHN5cy5tb2R1bGVzWydweXNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQogICAgIG1haW4oKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9xdWVyeS5weSBiL0xpYi9pZGxlbGliL3F1ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWYxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9xdWVyeS5weQpAQCAtMCwwICsxLDMwOCBAQAorIiIiCitEaWFsb2dzIHRoYXQgcXVlcnkgdXNlcnMgYW5kIHZlcmlmeSB0aGUgYW5zd2VyIGJlZm9yZSBhY2NlcHRpbmcuCitVc2UgdHRrIHdpZGdldHMsIGxpbWl0aW5nIHVzZSB0byB0Y2wvdGsgOC41KywgYXMgaW4gSURMRSAzLjYrLgorCitRdWVyeSBpcyB0aGUgZ2VuZXJpYyBiYXNlIGNsYXNzIGZvciBhIHBvcHVwIGRpYWxvZy4KK1RoZSB1c2VyIG11c3QgZWl0aGVyIGVudGVyIGEgdmFsaWQgYW5zd2VyIG9yIGNsb3NlIHRoZSBkaWFsb2cuCitFbnRyaWVzIGFyZSB2YWxpZGF0ZWQgd2hlbiA8UmV0dXJuPiBpcyBlbnRlcmVkIG9yIFtPa10gaXMgY2xpY2tlZC4KK0VudHJpZXMgYXJlIGlnbm9yZWQgd2hlbiBbQ2FuY2VsXSBvciBbWF0gYXJlIGNsaWNrZWQuCitUaGUgJ3JldHVybiB2YWx1ZScgaXMgLnJlc3VsdCBzZXQgdG8gZWl0aGVyIGEgdmFsaWQgYW5zd2VyIG9yIE5vbmUuCisKK1N1YmNsYXNzIFNlY3Rpb25OYW1lIGdldHMgYSBuYW1lIGZvciBhIG5ldyBjb25maWcgZmlsZSBzZWN0aW9uLgorQ29uZmlnZGlhbG9nIHVzZXMgaXQgZm9yIG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgorU3ViY2xhc3MgTW9kdWxlTmFtZSBnZXRzIGEgbmFtZSBmb3IgRmlsZSA9PiBPcGVuIE1vZHVsZS4KK1N1YmNsYXNzIEhlbHBTb3VyY2UgZ2V0cyBtZW51IGl0ZW0gYW5kIHBhdGggZm9yIGFkZGl0aW9ucyB0byBIZWxwIG1lbnUuCisiIiIKKyMgUXVlcnkgYW5kIFNlY3Rpb24gbmFtZSByZXN1bHQgZnJvbSBzcGxpdHRpbmcgR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cKKyMgb2YgY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkgKHRlbXBvcmFyaWx5IGNvbmZpZ19zZWMucHkpIGludG8KKyMgZ2VuZXJpYyBhbmQgc3BlY2lmaWMgcGFydHMuICAzLjYgb25seSwgSnVseSAyMDE2LgorIyBNb2R1bGVOYW1lLmVudHJ5X29rIGNhbWUgZnJvbSBlZGl0b3IuRWRpdG9yV2luZG93LmxvYWRfbW9kdWxlLgorIyBIZWxwU291cmNlIHdhcyBleHRyYWN0ZWQgZnJvbSBjb25maWdIZWxwU291cmNlRWRpdC5weSAodGVtcG9yYXJpbHkKKyMgY29uZmlnX2hlbHAucHkpLCB3aXRoIGRhcndpbiBjb2RlIG1vdmVkIGZyb20gb2sgdG8gcGF0aF9vay4KKworaW1wb3J0IGltcG9ydGxpYgoraW1wb3J0IG9zCitmcm9tIHN5cyBpbXBvcnQgZXhlY3V0YWJsZSwgcGxhdGZvcm0gICMgUGxhdGZvcm0gaXMgc2V0IGZvciBvbmUgdGVzdC4KKworZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgU3RyaW5nVmFyLCBXLCBFLCBOLCBTCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBGcmFtZSwgQnV0dG9uLCBFbnRyeSwgTGFiZWwKK2Zyb20gdGtpbnRlciBpbXBvcnQgZmlsZWRpYWxvZworZnJvbSB0a2ludGVyLmZvbnQgaW1wb3J0IEZvbnQKKworY2xhc3MgUXVlcnkoVG9wbGV2ZWwpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGdldHRpbmcgdmVyaWZpZWQgYW5zd2VyIGZyb20gYSB1c2VyLgorCisgICAgRm9yIHRoaXMgYmFzZSBjbGFzcywgYWNjZXB0IGFueSBub24tYmxhbmsgc3RyaW5nLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCAqLCB0ZXh0MD0nJywgdXNlZF9uYW1lcz17fSwKKyAgICAgICAgICAgICAgICAgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICAiIiJDcmVhdGUgcG9wdXAsIGRvIG5vdCByZXR1cm4gdW50aWwgdGsgd2lkZ2V0IGRlc3Ryb3llZC4KKworICAgICAgICBBZGRpdGlvbmFsIHN1YmNsYXNzIGluaXQgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAgICAgICAgdW5sZXNzICBfdXRlc3Q9VHJ1ZSBpcyBwYXNzZWQgdG8gc3VwcHJlc3Mgd2FpdF93aW5kb3coKS4KKworICAgICAgICB0aXRsZSAtIHN0cmluZywgdGl0bGUgb2YgcG9wdXAgZGlhbG9nCisgICAgICAgIG1lc3NhZ2UgLSBzdHJpbmcsIGluZm9ybWF0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5CisgICAgICAgIHRleHQwIC0gaW5pdGlhbCB2YWx1ZSBmb3IgZW50cnkKKyAgICAgICAgdXNlZF9uYW1lcyAtIG5hbWVzIGFscmVhZHkgaW4gdXNlCisgICAgICAgIF9odGVzdCAtIGJvb2wsIGNoYW5nZSBib3ggbG9jYXRpb24gd2hlbiBydW5uaW5nIGh0ZXN0CisgICAgICAgIF91dGVzdCAtIGJvb2wsIGxlYXZlIHdpbmRvdyBoaWRkZW4gYW5kIG5vdCBtb2RhbAorICAgICAgICAiIiIKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLndpdGhkcmF3KCkgICMgSGlkZSB3aGlsZSBjb25maWd1cmluZywgZXNwZWNpYWxseSBnZW9tZXRyeS4KKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBzZWxmLnRleHQwID0gdGV4dDAKKyAgICAgICAgc2VsZi51c2VkX25hbWVzID0gdXNlZF9uYW1lcworICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICB3aW5kb3dpbmdzeXN0ZW0gPSBzZWxmLnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpCisgICAgICAgIGlmIHdpbmRvd2luZ3N5c3RlbSA9PSAnYXF1YSc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKCc6OnRrOjp1bnN1cHBvcnRlZDo6TWFjV2luZG93U3R5bGUnLCAnc3R5bGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93LCAnbW92ZWFibGVNb2RhbCcsICcnKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYmluZCgiPENvbW1hbmQtLj4iLCBzZWxmLmNhbmNlbCkKKyAgICAgICAgc2VsZi5iaW5kKCc8S2V5LUVzY2FwZT4nLCBzZWxmLmNhbmNlbCkKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2FuY2VsKQorICAgICAgICBzZWxmLmJpbmQoJzxLZXktUmV0dXJuPicsIHNlbGYub2spCisgICAgICAgIHNlbGYuYmluZCgiPEtQX0VudGVyPiIsIHNlbGYub2spCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GYWxzZSwgd2lkdGg9RmFsc2UpCisgICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKSAgIyBOZWVkZWQgaGVyZSBmb3Igd2luZm9fcmVxd2lkdGggYmVsb3cuCisgICAgICAgIHNlbGYuZ2VvbWV0cnkoICAjIENlbnRlciBkaWFsb2cgb3ZlciBwYXJlbnQgKG9yIGJlbG93IGh0ZXN0IGJveCkuCisgICAgICAgICAgICAgICAgIislZCslZCIgJSAoCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eCgpICsKKyAgICAgICAgICAgICAgICAgICAgKHBhcmVudC53aW5mb193aWR0aCgpLzIgLSBzZWxmLndpbmZvX3JlcXdpZHRoKCkvMiksCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsKKyAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMiAtIHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9odGVzdCBlbHNlIDE1MCkKKyAgICAgICAgICAgICAgICApICkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgICMgVW5oaWRlIG5vdyB0aGF0IGdlb21ldHJ5IHNldC4KKyAgICAgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOiAgIyBDYWxsIGZyb20gb3ZlcnJpZGUsIGlmIGFueS4KKyAgICAgICAgIyBCaW5kIHRvIHNlbGYgd2lkZ2V0cyBuZWVkZWQgZm9yIGVudHJ5X29rIG9yIHVuaXR0ZXN0LgorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUgPSBGcmFtZShzZWxmLCBwYWRkaW5nPTEwKQorICAgICAgICBmcmFtZS5ncmlkKGNvbHVtbj0wLCByb3c9MCwgc3RpY2t5PSduZXdzJykKKyAgICAgICAgZnJhbWUuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisKKyAgICAgICAgZW50cnlsYWJlbCA9IExhYmVsKGZyYW1lLCBhbmNob3I9J3cnLCBqdXN0aWZ5PSdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9c2VsZi5tZXNzYWdlKQorICAgICAgICBzZWxmLmVudHJ5dmFyID0gU3RyaW5nVmFyKHNlbGYsIHNlbGYudGV4dDApCisgICAgICAgIHNlbGYuZW50cnkgPSBFbnRyeShmcmFtZSwgd2lkdGg9MzAsIHRleHR2YXJpYWJsZT1zZWxmLmVudHJ5dmFyKQorICAgICAgICBzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisgICAgICAgIHNlbGYuZXJyb3JfZm9udCA9IEZvbnQobmFtZT0nVGtDYXB0aW9uRm9udCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzPVRydWUsIHJvb3Q9c2VsZi5wYXJlbnQpCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3IgPSBMYWJlbChmcmFtZSwgdGV4dD0nICcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250PXNlbGYuZXJyb3JfZm9udCkKKyAgICAgICAgc2VsZi5idXR0b25fb2sgPSBCdXR0b24oCisgICAgICAgICAgICAgICAgZnJhbWUsIHRleHQ9J09LJywgZGVmYXVsdD0nYWN0aXZlJywgY29tbWFuZD1zZWxmLm9rKQorICAgICAgICBzZWxmLmJ1dHRvbl9jYW5jZWwgPSBCdXR0b24oCisgICAgICAgICAgICAgICAgZnJhbWUsIHRleHQ9J0NhbmNlbCcsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCisKKyAgICAgICAgZW50cnlsYWJlbC5ncmlkKGNvbHVtbj0wLCByb3c9MCwgY29sdW1uc3Bhbj0zLCBwYWR4PTUsIHN0aWNreT1XKQorICAgICAgICBzZWxmLmVudHJ5LmdyaWQoY29sdW1uPTAsIHJvdz0xLCBjb2x1bW5zcGFuPTMsIHBhZHg9NSwgc3RpY2t5PVcrRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZHk9WzEwLDBdKQorICAgICAgICBzZWxmLmVudHJ5X2Vycm9yLmdyaWQoY29sdW1uPTAsIHJvdz0yLCBjb2x1bW5zcGFuPTMsIHBhZHg9NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreT1XK0UpCisgICAgICAgIHNlbGYuYnV0dG9uX29rLmdyaWQoY29sdW1uPTEsIHJvdz05OSwgcGFkeD01KQorICAgICAgICBzZWxmLmJ1dHRvbl9jYW5jZWwuZ3JpZChjb2x1bW49Miwgcm93PTk5LCBwYWR4PTUpCisKKyAgICBkZWYgc2hvd2Vycm9yKHNlbGYsIG1lc3NhZ2UsIHdpZGdldD1Ob25lKToKKyAgICAgICAgI3NlbGYuYmVsbChkaXNwbGF5b2Y9c2VsZikKKyAgICAgICAgKHdpZGdldCBvciBzZWxmLmVudHJ5X2Vycm9yKVsndGV4dCddID0gJ0VSUk9SOiAnICsgbWVzc2FnZQorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOiAgIyBFeGFtcGxlOiB1c3VhbGx5IHJlcGxhY2UuCisgICAgICAgICJSZXR1cm4gbm9uLWJsYW5rIGVudHJ5IG9yIE5vbmUuIgorICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnkuZ2V0KCkuc3RyaXAoKQorICAgICAgICBpZiBub3QgZW50cnk6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignYmxhbmsgbGluZS4nKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgb2soc2VsZiwgZXZlbnQ9Tm9uZSk6ICAjIERvIG5vdCByZXBsYWNlLgorICAgICAgICAnJydJZiBlbnRyeSBpcyB2YWxpZCwgYmluZCBpdCB0byAncmVzdWx0JyBhbmQgZGVzdHJveSB0ayB3aWRnZXQuCisKKyAgICAgICAgT3RoZXJ3aXNlIGxlYXZlIGRpYWxvZyBvcGVuIGZvciB1c2VyIHRvIGNvcnJlY3QgZW50cnkgb3IgY2FuY2VsLgorICAgICAgICAnJycKKyAgICAgICAgZW50cnkgPSBzZWxmLmVudHJ5X29rKCkKKyAgICAgICAgaWYgZW50cnkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IGVudHJ5CisgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBbT2tdIG1vdmVzIGZvY3VzLiAgKDxSZXR1cm4+IGRvZXMgbm90LikgIE1vdmUgaXQgYmFjay4KKyAgICAgICAgICAgIHNlbGYuZW50cnkuZm9jdXNfc2V0KCkKKworICAgIGRlZiBjYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6ICAjIERvIG5vdCByZXBsYWNlLgorICAgICAgICAiU2V0IGRpYWxvZyByZXN1bHQgdG8gTm9uZSBhbmQgZGVzdHJveSB0ayB3aWRnZXQuIgorICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworCitjbGFzcyBTZWN0aW9uTmFtZShRdWVyeSk6CisgICAgIkdldCBhIG5hbWUgZm9yIGEgY29uZmlnIGZpbGUgc2VjdGlvbiBuYW1lLiIKKyAgICAjIFVzZWQgaW4gQ29uZmlnRGlhbG9nLkdldE5ld0tleXNOYW1lLCAuR2V0TmV3VGhlbWVOYW1lICg4MzcpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcywKKyAgICAgICAgICAgICAgICAgKiwgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHVzZWRfbmFtZXM9dXNlZF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHNlbnNpYmxlIENvbmZpZ1BhcnNlciBzZWN0aW9uIG5hbWUgb3IgTm9uZS4iCisgICAgICAgIHNlbGYuZW50cnlfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIG5hbWUgPSBzZWxmLmVudHJ5LmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignbm8gbmFtZSBzcGVjaWZpZWQuJykKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsaWYgbGVuKG5hbWUpPjMwOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoJ25hbWUgaXMgbG9uZ2VyIHRoYW4gMzAgY2hhcmFjdGVycy4nKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCduYW1lIGlzIGFscmVhZHkgaW4gdXNlLicpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gbmFtZQorCisKK2NsYXNzIE1vZHVsZU5hbWUoUXVlcnkpOgorICAgICJHZXQgYSBtb2R1bGUgbmFtZSBmb3IgT3BlbiBNb2R1bGUgbWVudSBlbnRyeS4iCisgICAgIyBVc2VkIGluIG9wZW5fbW9kdWxlIChlZGl0b3IuRWRpdG9yV2luZG93IHVudGlsIG1vdmUgdG8gaW9iaW5kaW5nKS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB0ZXh0MCwKKyAgICAgICAgICAgICAgICAgKiwgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwPXRleHQwLAorICAgICAgICAgICAgICAgICAgICAgICBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOgorICAgICAgICAiUmV0dXJuIGVudGVyZWQgbW9kdWxlIG5hbWUgYXMgZmlsZSBwYXRoIG9yIE5vbmUuIgorICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBuYW1lID0gc2VsZi5lbnRyeS5nZXQoKS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoJ25vIG5hbWUgc3BlY2lmaWVkLicpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFhYWCBPdWdodCB0byBpbnNlcnQgY3VycmVudCBmaWxlJ3MgZGlyZWN0b3J5IGluIGZyb250IG9mIHBhdGguCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbXBvcnRFcnJvcikgYXMgbXNnOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3Ioc3RyKG1zZykpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBzcGVjIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcigibW9kdWxlIG5vdCBmb3VuZCIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgaW1wb3J0bGliLmFiYy5Tb3VyY2VMb2FkZXIpOgorICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoIm5vdCBhIHNvdXJjZS1iYXNlZCBtb2R1bGUiKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZV9wYXRoID0gc3BlYy5sb2FkZXIuZ2V0X2ZpbGVuYW1lKG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2hvd2Vycm9yKCJsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnZXRfZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGZpbGVfcGF0aAorCisKK2NsYXNzIEhlbHBTb3VyY2UoUXVlcnkpOgorICAgICJHZXQgbWVudSBuYW1lIGFuZCBoZWxwIHNvdXJjZSBmb3IgSGVscCBtZW51LiIKKyAgICAjIFVzZWQgaW4gQ29uZmlnRGlhbG9nLkhlbHBMaXN0SXRlbUFkZC9FZGl0LCAoOTQxLzkpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgKiwgbWVudWl0ZW09JycsIGZpbGVwYXRoPScnLAorICAgICAgICAgICAgICAgICB1c2VkX25hbWVzPXt9LCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgICIiIkdldCBtZW51IGVudHJ5IGFuZCB1cmwvbG9jYWwgZmlsZSBmb3IgQWRkaXRpb25hbCBIZWxwLgorCisgICAgICAgIFVzZXIgZW50ZXJzIGEgbmFtZSBmb3IgdGhlIEhlbHAgcmVzb3VyY2UgYW5kIGEgd2ViIHVybCBvciBmaWxlCisgICAgICAgIG5hbWUuIFRoZSB1c2VyIGNhbiBicm93c2UgZm9yIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlcGF0aCA9IGZpbGVwYXRoCisgICAgICAgIG1lc3NhZ2UgPSAnTmFtZSBmb3IgaXRlbSBvbiBIZWxwIG1lbnU6JworICAgICAgICBzdXBlcigpLl9faW5pdF9fKAorICAgICAgICAgICAgICAgIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwPW1lbnVpdGVtLAorICAgICAgICAgICAgICAgIHVzZWRfbmFtZXM9dXNlZF9uYW1lcywgX2h0ZXN0PV9odGVzdCwgX3V0ZXN0PV91dGVzdCkKKworICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5jcmVhdGVfd2lkZ2V0cygpCisgICAgICAgIGZyYW1lID0gc2VsZi5mcmFtZQorICAgICAgICBwYXRobGFiZWwgPSBMYWJlbChmcmFtZSwgYW5jaG9yPSd3JywganVzdGlmeT0nbGVmdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J0hlbHAgRmlsZSBQYXRoOiBFbnRlciBVUkwgb3IgYnJvd3NlIGZvciBmaWxlJykKKyAgICAgICAgc2VsZi5wYXRodmFyID0gU3RyaW5nVmFyKHNlbGYsIHNlbGYuZmlsZXBhdGgpCisgICAgICAgIHNlbGYucGF0aCA9IEVudHJ5KGZyYW1lLCB0ZXh0dmFyaWFibGU9c2VsZi5wYXRodmFyLCB3aWR0aD00MCkKKyAgICAgICAgYnJvd3NlID0gQnV0dG9uKGZyYW1lLCB0ZXh0PSdCcm93c2UnLCB3aWR0aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmJyb3dzZV9maWxlKQorICAgICAgICBzZWxmLnBhdGhfZXJyb3IgPSBMYWJlbChmcmFtZSwgdGV4dD0nICcsIGZvcmVncm91bmQ9J3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9c2VsZi5lcnJvcl9mb250KQorCisgICAgICAgIHBhdGhsYWJlbC5ncmlkKGNvbHVtbj0wLCByb3c9MTAsIGNvbHVtbnNwYW49MywgcGFkeD01LCBwYWR5PVsxMCwwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5PVcpCisgICAgICAgIHNlbGYucGF0aC5ncmlkKGNvbHVtbj0wLCByb3c9MTEsIGNvbHVtbnNwYW49MiwgcGFkeD01LCBzdGlja3k9VytFLAorICAgICAgICAgICAgICAgICAgICAgICBwYWR5PVsxMCwwXSkKKyAgICAgICAgYnJvd3NlLmdyaWQoY29sdW1uPTIsIHJvdz0xMSwgcGFkeD01LCBzdGlja3k9VytTKQorICAgICAgICBzZWxmLnBhdGhfZXJyb3IuZ3JpZChjb2x1bW49MCwgcm93PTEyLCBjb2x1bW5zcGFuPTMsIHBhZHg9NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5PVcrRSkKKworICAgIGRlZiBhc2tmaWxlbmFtZShzZWxmLCBmaWxldHlwZXMsIGluaXRkaXIsIGluaXRmaWxlKTogICMgaHRlc3QgIworICAgICAgICAjIEV4dHJhY3RlZCBmcm9tIGJyb3dzZV9maWxlIHNvIGNhbiBtb2NrIGZvciB1bml0dGVzdHMuCisgICAgICAgICMgQ2Fubm90IHVuaXR0ZXN0IGFzIGNhbm5vdCBzaW11bGF0ZSBidXR0b24gY2xpY2tzLgorICAgICAgICAjIFRlc3QgYnkgcnVubmluZyBodGVzdCwgc3VjaCBhcyBieSBydW5uaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgcmV0dXJuIGZpbGVkaWFsb2cuT3BlbihwYXJlbnQ9c2VsZiwgZmlsZXR5cGVzPWZpbGV0eXBlcylcCisgICAgICAgICAgICAgICAuc2hvdyhpbml0aWFsZGlyPWluaXRkaXIsIGluaXRpYWxmaWxlPWluaXRmaWxlKQorCisgICAgZGVmIGJyb3dzZV9maWxlKHNlbGYpOgorICAgICAgICBmaWxldHlwZXMgPSBbCisgICAgICAgICAgICAoIkhUTUwgRmlsZXMiLCAiKi5odG0gKi5odG1sIiwgIlRFWFQiKSwKKyAgICAgICAgICAgICgiUERGIEZpbGVzIiwgIioucGRmIiwgIlRFWFQiKSwKKyAgICAgICAgICAgICgiV2luZG93cyBIZWxwIEZpbGVzIiwgIiouY2htIiksCisgICAgICAgICAgICAoIlRleHQgRmlsZXMiLCAiKi50eHQiLCAiVEVYVCIpLAorICAgICAgICAgICAgKCJBbGwgRmlsZXMiLCAiKiIpXQorICAgICAgICBwYXRoID0gc2VsZi5wYXRodmFyLmdldCgpCisgICAgICAgIGlmIHBhdGg6CisgICAgICAgICAgICBkaXIsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlID0gTm9uZQorICAgICAgICAgICAgaWYgcGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZXhlY3V0YWJsZSksICdEb2MnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIGZpbGUgPSBzZWxmLmFza2ZpbGVuYW1lKGZpbGV0eXBlcywgZGlyLCBiYXNlKQorICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgc2VsZi5wYXRodmFyLnNldChmaWxlKQorCisgICAgaXRlbV9vayA9IFNlY3Rpb25OYW1lLmVudHJ5X29rICAjIGxvY2FsaXplIGZvciB0ZXN0IG92ZXJyaWRlCisKKyAgICBkZWYgcGF0aF9vayhzZWxmKToKKyAgICAgICAgIlNpbXBsZSB2YWxpZGl0eSBjaGVjayBmb3IgbWVudSBmaWxlIHBhdGgiCisgICAgICAgIHBhdGggPSBzZWxmLnBhdGguZ2V0KCkuc3RyaXAoKQorICAgICAgICBpZiBub3QgcGF0aDogI25vIHBhdGggc3BlY2lmaWVkCisgICAgICAgICAgICBzZWxmLnNob3dlcnJvcignbm8gaGVscCBmaWxlIHBhdGggc3BlY2lmaWVkLicsIHNlbGYucGF0aF9lcnJvcikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsaWYgbm90IHBhdGguc3RhcnRzd2l0aCgoJ3d3dy4nLCAnaHR0cCcpKToKKyAgICAgICAgICAgIGlmIHBhdGhbOjVdID09ICdmaWxlOic6CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbNTpdCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgc2VsZi5zaG93ZXJyb3IoJ2hlbHAgZmlsZSBwYXRoIGRvZXMgbm90IGV4aXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoX2Vycm9yKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzogICMgZm9yIE1hYyBTYWZhcmkKKyAgICAgICAgICAgICAgICBwYXRoID0gICJmaWxlOi8vIiArIHBhdGgKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBlbnRyeV9vayhzZWxmKToKKyAgICAgICAgIlJldHVybiBhcHBhcmVudGx5IHZhbGlkIChuYW1lLCBwYXRoKSBvciBOb25lIgorICAgICAgICBzZWxmLmVudHJ5X2Vycm9yWyd0ZXh0J10gPSAnJworICAgICAgICBzZWxmLnBhdGhfZXJyb3JbJ3RleHQnXSA9ICcnCisgICAgICAgIG5hbWUgPSBzZWxmLml0ZW1fb2soKQorICAgICAgICBwYXRoID0gc2VsZi5wYXRoX29rKCkKKyAgICAgICAgcmV0dXJuIE5vbmUgaWYgbmFtZSBpcyBOb25lIG9yIHBhdGggaXMgTm9uZSBlbHNlIChuYW1lLCBwYXRoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9xdWVyeScsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCisgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCisgICAgcnVuKFF1ZXJ5LCBIZWxwU291cmNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weSBiL0xpYi9pZGxlbGliL3JlZGlyZWN0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcmVkaXJlY3Rvci5weQppbmRleCBiNjZiZTllLi5lYzY4MWRlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL3JlZGlyZWN0b3IucHkKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAgICAgICAgIE5vdGUgdGhhdCBpZiBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgb3BlcmF0aW9uIGlzIG5vdAogICAgICAgICBwYXNzZWQgdGhyb3VnaCB0byBUay4gIEFwcGx5IHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzZWxmLnJlZ2lzdGVyKCkKLSAgICAgICAgdG8gKmFyZ3MgdG8gYWNjb21wbGlzaCB0aGF0LiAgRm9yIGFuIGV4YW1wbGUsIHNlZSBDb2xvckRlbGVnYXRvci5weS4KKyAgICAgICAgdG8gKmFyZ3MgdG8gYWNjb21wbGlzaCB0aGF0LiAgRm9yIGFuIGV4YW1wbGUsIHNlZSBjb2xvcml6ZXIucHkuCiAKICAgICAgICAgJycnCiAgICAgICAgIG0gPSBzZWxmLl9vcGVyYXRpb25zLmdldChvcGVyYXRpb24pCkBAIC0xNTEsMTQgKzE1MSwxMyBAQAogCiAKIGRlZiBfd2lkZ2V0X3JlZGlyZWN0b3IocGFyZW50KTogICMgaHRlc3QgIwotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLSAgICBpbXBvcnQgcmUKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0CiAKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgV2lkZ2V0UmVkaXJlY3RvciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHRleHQgPSBUZXh0KHJvb3QpCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBXaWRnZXRSZWRpcmVjdG9yIikKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQorICAgIHRleHQgPSBUZXh0KHRvcCkKICAgICB0ZXh0LnBhY2soKQogICAgIHRleHQuZm9jdXNfc2V0KCkKICAgICByZWRpciA9IFdpZGdldFJlZGlyZWN0b3IodGV4dCkKQEAgLTE2NiwxMSArMTY1LDExIEBACiAgICAgICAgIHByaW50KCJpbnNlcnQiLCBhcmdzKQogICAgICAgICBvcmlnaW5hbF9pbnNlcnQoKmFyZ3MpCiAgICAgb3JpZ2luYWxfaW5zZXJ0ID0gcmVkaXIucmVnaXN0ZXIoImluc2VydCIsIG15X2luc2VydCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3dpZGdldHJlZGlyJywKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3JlZGlyZWN0b3InLAogICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3dpZGdldF9yZWRpcmVjdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weSBiL0xpYi9pZGxlbGliL3JlcGxhY2UucHkKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcmVwbGFjZS5weQppbmRleCBmMmVhMjJlLi5hYmQ5ZTU5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL3JlcGxhY2UucHkKQEAgLTMsMTggKzMsMTggQEAKIERlZmluZXMgdmFyaW91cyByZXBsYWNlIHJlbGF0ZWQgZnVuY3Rpb25zIGxpa2UgcmVwbGFjZSwgcmVwbGFjZSBhbGwsCiByZXBsYWNlK2ZpbmQuCiAiIiIKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZQotZnJvbSBpZGxlbGliLlNlYXJjaERpYWxvZ0Jhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKIGltcG9ydCByZQogCitmcm9tIHRraW50ZXIgaW1wb3J0IFN0cmluZ1ZhciwgVGNsRXJyb3IKKworZnJvbSBpZGxlbGliLnNlYXJjaGJhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lCiAKIGRlZiByZXBsYWNlKHRleHQpOgogICAgICIiIlJldHVybnMgYSBzaW5nbGV0b24gUmVwbGFjZURpYWxvZyBpbnN0YW5jZS5UaGUgc2luZ2xlIGRpYWxvZwogICAgICBzYXZlcyB1c2VyIGVudHJpZXMgYW5kIHByZWZlcmVuY2VzIGFjcm9zcyBpbnN0YW5jZXMuIiIiCiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQotICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBlbmdpbmUgPSBzZWFyY2hlbmdpbmUuZ2V0KHJvb3QpCiAgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX3JlcGxhY2VkaWFsb2ciKToKICAgICAgICAgZW5naW5lLl9yZXBsYWNlZGlhbG9nID0gUmVwbGFjZURpYWxvZyhyb290LCBlbmdpbmUpCiAgICAgZGlhbG9nID0gZW5naW5lLl9yZXBsYWNlZGlhbG9nCkBAIC05NSw3ICs5NSw3IEBACiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgcmVzID0gc2VsZi5lbmdpbmUuc2VhcmNoX3RleHQodGV4dCwgcHJvZykKICAgICAgICAgaWYgbm90IHJlczoKLSAgICAgICAgICAgIHRleHQuYmVsbCgpCisgICAgICAgICAgICBzZWxmLmJlbGwoKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQogICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoImhpdCIsICIxLjAiLCAiZW5kIikKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CiAgICAgICAgIHJlcyA9IHNlbGYuZW5naW5lLnNlYXJjaF90ZXh0KHRleHQsIE5vbmUsIG9rKQogICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgbGluZSwgbSA9IHJlcwogICAgICAgICBpLCBqID0gbS5zcGFuKCkKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgcG9zID0gTm9uZQogICAgICAgICBpZiBub3QgcG9zOgogICAgICAgICAgICAgZmlyc3QgPSBsYXN0ID0gcG9zID0gdGV4dC5pbmRleCgiaW5zZXJ0IikKLSAgICAgICAgbGluZSwgY29sID0gU2VhcmNoRW5naW5lLmdldF9saW5lX2NvbChwb3MpCisgICAgICAgIGxpbmUsIGNvbCA9IHNlYXJjaGVuZ2luZS5nZXRfbGluZV9jb2wocG9zKQogICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQogICAgICAgICBtID0gcHJvZy5tYXRjaChjaGFycywgY29sKQogICAgICAgICBpZiBub3QgcHJvZzoKQEAgLTIwNCwxMSArMjA0LDEzIEBACiAKIAogZGVmIF9yZXBsYWNlX2RpYWxvZyhwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgIiIiaHRlc3Qgd3JhcHBlciBmdW5jdGlvbiIiIgorICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQsIEVORCwgU0VMCisgICAgZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgQnV0dG9uCisKICAgICBib3ggPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgYm94LnRpdGxlKCJUZXN0IFJlcGxhY2VEaWFsb2ciKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICBib3guZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICBib3guZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCiAKICAgICAjIG1vY2sgdW5kbyBkZWxlZ2F0b3IgbWV0aG9kcwogICAgIGRlZiB1bmRvX2Jsb2NrX3N0YXJ0KCk6CkBAIC0yMzQsNyArMjM2LDcgQEAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3JlcGxhY2VkaWFsb2cnLAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcmVwbGFjZScsCiAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCiAKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3JwYy5weSBiL0xpYi9pZGxlbGliL3JwYy5weQppbmRleCA0ODEwNWYyLi44ZjU3ZWRiOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvcnBjLnB5CisrKyBiL0xpYi9pZGxlbGliL3JwYy5weQpAQCAtMjYsMjMgKzI2LDIxIEBACiBhY2NvbXBsaXNoZWQgaW4gSWRsZS4KIAogIiIiCi0KLWltcG9ydCBzeXMKLWltcG9ydCBvcworaW1wb3J0IGJ1aWx0aW5zCitpbXBvcnQgY29weXJlZwogaW1wb3J0IGlvCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgcGlja2xlCitpbXBvcnQgcXVldWUKIGltcG9ydCBzZWxlY3QKK2ltcG9ydCBzb2NrZXQKIGltcG9ydCBzb2NrZXRzZXJ2ZXIKIGltcG9ydCBzdHJ1Y3QKLWltcG9ydCBwaWNrbGUKK2ltcG9ydCBzeXMKIGltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBxdWV1ZQogaW1wb3J0IHRyYWNlYmFjawotaW1wb3J0IGNvcHlyZWcKIGltcG9ydCB0eXBlcwotaW1wb3J0IG1hcnNoYWwKLWltcG9ydCBidWlsdGlucwotCiAKIGRlZiB1bnBpY2tsZV9jb2RlKG1zKToKICAgICBjbyA9IG1hcnNoYWwubG9hZHMobXMpCkBAIC02MCwxMCArNTgsMTIgQEAKICAgICBwLmR1bXAob2JqKQogICAgIHJldHVybiBmLmdldHZhbHVlKCkKIAorCiBjbGFzcyBDb2RlUGlja2xlcihwaWNrbGUuUGlja2xlcik6CiAgICAgZGlzcGF0Y2hfdGFibGUgPSB7dHlwZXMuQ29kZVR5cGU6IHBpY2tsZV9jb2RlfQogICAgIGRpc3BhdGNoX3RhYmxlLnVwZGF0ZShjb3B5cmVnLmRpc3BhdGNoX3RhYmxlKQogCisKIEJVRlNJWkUgPSA4KjEwMjQKIExPQ0FMSE9TVCA9ICcxMjcuMC4wLjEnCiAKQEAgLTQ4NywxNiArNDg3LDE5IEBACiAgICAgIyBUb2tlbiBtaXgtaW4gY2xhc3MKICAgICBwYXNzCiAKKwogZGVmIHJlbW90ZXJlZihvYmopOgogICAgIG9pZCA9IGlkKG9iaikKICAgICBvYmplY3R0YWJsZVtvaWRdID0gb2JqCiAgICAgcmV0dXJuIFJlbW90ZVByb3h5KG9pZCkKIAorCiBjbGFzcyBSZW1vdGVQcm94eShvYmplY3QpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9pZCk6CiAgICAgICAgIHNlbGYub2lkID0gb2lkCiAKKwogY2xhc3MgUlBDSGFuZGxlcihzb2NrZXRzZXJ2ZXIuQmFzZVJlcXVlc3RIYW5kbGVyLCBTb2NrZXRJTyk6CiAKICAgICBkZWJ1Z2dpbmcgPSBGYWxzZQpAQCAtNTE0LDYgKzUxNyw3IEBACiAgICAgZGVmIGdldF9yZW1vdGVfcHJveHkoc2VsZiwgb2lkKToKICAgICAgICAgcmV0dXJuIFJQQ1Byb3h5KHNlbGYsIG9pZCkKIAorCiBjbGFzcyBSUENDbGllbnQoU29ja2V0SU8pOgogCiAgICAgZGVidWdnaW5nID0gRmFsc2UKQEAgLTUzOSw2ICs1NDMsNyBAQAogICAgIGRlZiBnZXRfcmVtb3RlX3Byb3h5KHNlbGYsIG9pZCk6CiAgICAgICAgIHJldHVybiBSUENQcm94eShzZWxmLCBvaWQpCiAKKwogY2xhc3MgUlBDUHJveHkob2JqZWN0KToKIAogICAgIF9fbWV0aG9kcyA9IE5vbmUKQEAgLTU4Nyw2ICs1OTIsNyBAQAogICAgICAgICBpZiBub3QgY2FsbGFibGUoYXR0cik6CiAgICAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdID0gMQogCisKIGNsYXNzIE1ldGhvZFByb3h5KG9iamVjdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc29ja2lvLCBvaWQsIG5hbWUpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5IGIvTGliL2lkbGVsaWIvcnN0cmlwLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3JzdHJpcC5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvcnVuLnB5IGIvTGliL2lkbGVsaWIvcnVuLnB5CmluZGV4IDI4Y2U0MjAuLmFmYTk3NDQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL3J1bi5weQorKysgYi9MaWIvaWRsZWxpYi9ydW4ucHkKQEAgLTEsMzMgKzEsNDUgQEAKLWltcG9ydCBzeXMKK2ltcG9ydCBpbwogaW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IHF1ZXVlCitpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHRyYWNlYmFjawogaW1wb3J0IF90aHJlYWQgYXMgdGhyZWFkCiBpbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgcXVldWUKLWltcG9ydCB0a2ludGVyCitpbXBvcnQgd2FybmluZ3MKIAotZnJvbSBpZGxlbGliIGltcG9ydCBDYWxsVGlwcwotZnJvbSBpZGxlbGliIGltcG9ydCBBdXRvQ29tcGxldGUKK2ltcG9ydCB0a2ludGVyICAjIFRjbCwgZGVsZXRpb25zLCBtZXNzYWdlYm94IGlmIHN0YXJ0dXAgZmFpbHMKIAotZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVEZWJ1Z2dlcgotZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFN0YWNrVmlld2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IHJwYwotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCi1mcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZwotCitmcm9tIGlkbGVsaWIgaW1wb3J0IGF1dG9jb21wbGV0ZSAgIyBBdXRvQ29tcGxldGUsIGZldGNoX2VuY29kaW5ncworZnJvbSBpZGxlbGliIGltcG9ydCBjYWxsdGlwcyAgIyBDYWxsVGlwcworZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcl9yICAjIHN0YXJ0X2RlYnVnZ2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IGRlYnVnb2JqX3IgICMgcmVtb3RlX29iamVjdF90cmVlX2l0ZW0KK2Zyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51ICAjIGVuY29kaW5nCitmcm9tIGlkbGVsaWIgaW1wb3J0IHJwYyAgIyBtdWx0aXBsZSBvYmplY3RzCitmcm9tIGlkbGVsaWIgaW1wb3J0IHN0YWNrdmlld2VyICAjIFN0YWNrVHJlZUl0ZW0KIGltcG9ydCBfX21haW5fXwogCiBmb3IgbW9kIGluICgnc2ltcGxlZGlhbG9nJywgJ21lc3NhZ2Vib3gnLCAnZm9udCcsCiAgICAgICAgICAgICAnZGlhbG9nJywgJ2ZpbGVkaWFsb2cnLCAnY29tbW9uZGlhbG9nJywKLSAgICAgICAgICAgICdjb2xvcmNob29zZXInKToKKyAgICAgICAgICAgICd0dGsnKToKICAgICBkZWxhdHRyKHRraW50ZXIsIG1vZCkKICAgICBkZWwgc3lzLm1vZHVsZXNbJ3RraW50ZXIuJyArIG1vZF0KIAogTE9DQUxIT1NUID0gJzEyNy4wLjAuMScKIAotaW1wb3J0IHdhcm5pbmdzCisKK2RlZiBpZGxlX2Zvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CisgICAgIiIiRm9ybWF0IHdhcm5pbmdzIHRoZSBJRExFIHdheS4iIiIKKworICAgIHMgPSAiXG5XYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6XG4iCisgICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQorICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgIGlmIGxpbmU6CisgICAgICAgIHMgKz0gIiAgICAlc1xuIiAlIGxpbmUKKyAgICBzICs9ICIlczogJXNcbiIgJSAoY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCisgICAgcmV0dXJuIHMKIAogZGVmIGlkbGVfc2hvd3dhcm5pbmdfc3VicHJvYygKICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKQEAgLTM4LDcgKzUwLDcgQEAKICAgICBpZiBmaWxlIGlzIE5vbmU6CiAgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCiAgICAgdHJ5OgotICAgICAgICBmaWxlLndyaXRlKFB5U2hlbGwuaWRsZV9mb3JtYXR3YXJuaW5nKAorICAgICAgICBmaWxlLndyaXRlKGlkbGVfZm9ybWF0d2FybmluZygKICAgICAgICAgICAgICAgICBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZSkpCiAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgIHBhc3MgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KQEAgLTg4LDcgKzEwMCw3IEBACiAgICAgTXlIYW5kbGVyIG9iamVjdC4gIFRoYXQgcmVmZXJlbmNlIGlzIHNhdmVkIGFzIGF0dHJpYnV0ZSBycGNoYW5kbGVyIG9mIHRoZQogICAgIEV4ZWN1dGl2ZSBpbnN0YW5jZS4gIFRoZSBFeGVjdXRpdmUgbWV0aG9kcyBoYXZlIGFjY2VzcyB0byB0aGUgcmVmZXJlbmNlIGFuZAogICAgIGNhbiBwYXNzIGl0IG9uIHRvIGVudGl0aWVzIHRoYXQgdGhleSBjb21tYW5kCi0gICAgKGUuZy4gUmVtb3RlRGVidWdnZXIuRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoKSkuICBUaGUgbGF0dGVyLCBpbiB0dXJuLCBjYW4KKyAgICAoZS5nLiBkZWJ1Z2dlcl9yLkRlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKCkpLiAgVGhlIGxhdHRlciwgaW4gdHVybiwgY2FuCiAgICAgY2FsbCBNeUhhbmRsZXIoU29ja2V0SU8pIHJlZ2lzdGVyL3VucmVnaXN0ZXIgbWV0aG9kcyB2aWEgdGhlIHJlZmVyZW5jZSB0bwogICAgIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIHRoZW1zZWx2ZXMuCiAKQEAgLTIxMCw3ICsyMjIsNyBAQAogICAgICAgICAgICAgdGJlID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCiAgICAgICAgICAgICBwcmludCgnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOicsIGZpbGU9ZWZpbGUpCiAgICAgICAgICAgICBleGNsdWRlID0gKCJydW4ucHkiLCAicnBjLnB5IiwgInRocmVhZGluZy5weSIsICJxdWV1ZS5weSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJSZW1vdGVEZWJ1Z2dlci5weSIsICJiZGIucHkiKQorICAgICAgICAgICAgICAgICAgICAgICAiZGVidWdnZXJfci5weSIsICJiZGIucHkiKQogICAgICAgICAgICAgY2xlYW51cF90cmFjZWJhY2sodGJlLCBleGNsdWRlKQogICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2xpc3QodGJlLCBmaWxlPWVmaWxlKQogICAgICAgICBsaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwLCBleGMpCkBAIC0yNjcsNiArMjc5LDcgQEAKICAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogICAgIHN5cy5leGl0KDApCiAKKwogY2xhc3MgTXlSUENTZXJ2ZXIocnBjLlJQQ1NlcnZlcik6CiAKICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKQEAgLTI5Nyw2ICszMTAsOTYgQEAKICAgICAgICAgICAgIHF1aXR0aW5nID0gVHJ1ZQogICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKIAorCisjIFBzZXVkb2ZpbGVzIGZvciBzaGVsbC1yZW1vdGUgY29tbXVuaWNhdGlvbiAoYWxzbyB1c2VkIGluIHB5c2hlbGwpCisKK2NsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKKyAgICAgICAgc2VsZi50YWdzID0gdGFncworICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzPicgJSBzZWxmLnRhZ3MKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgUHNldWRvT3V0cHV0RmlsZShQc2V1ZG9GaWxlKToKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHR5cGUocykgaXMgbm90IHN0cjoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIHN0ciwgbm90ICcgKyB0eXBlKHMpLl9fbmFtZV9fKQorICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE5NDgxCisgICAgICAgICAgICBzID0gc3RyLl9fc3RyX18ocykKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGwud3JpdGUocywgc2VsZi50YWdzKQorCisKK2NsYXNzIFBzZXVkb0lucHV0RmlsZShQc2V1ZG9GaWxlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIFBzZXVkb0ZpbGUuX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nKQorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQorICAgICAgICByZXN1bHQgPSBzZWxmLl9saW5lX2J1ZmZlcgorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgc2l6ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gcmVzdWx0W3NpemU6XQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzpzaXplXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKKyAgICAgICAgbGluZSA9IHNlbGYuX2xpbmVfYnVmZmVyIG9yIHNlbGYuc2hlbGwucmVhZGxpbmUoKQorICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHNpemUgPSBsZW4obGluZSkKKyAgICAgICAgZW9sID0gbGluZS5maW5kKCdcbicsIDAsIHNpemUpCisgICAgICAgIGlmIGVvbCA+PSAwOgorICAgICAgICAgICAgc2l6ZSA9IGVvbCArIDEKKyAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSBsaW5lW3NpemU6XQorICAgICAgICByZXR1cm4gbGluZVs6c2l6ZV0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zaGVsbC5jbG9zZSgpCisKKwogY2xhc3MgTXlIYW5kbGVyKHJwYy5SUENIYW5kbGVyKToKIAogICAgIGRlZiBoYW5kbGUoc2VsZik6CkBAIC0zMDQsMTIgKzQwNywxMiBAQAogICAgICAgICBleGVjdXRpdmUgPSBFeGVjdXRpdmUoc2VsZikKICAgICAgICAgc2VsZi5yZWdpc3RlcigiZXhlYyIsIGV4ZWN1dGl2ZSkKICAgICAgICAgc2VsZi5jb25zb2xlID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJjb25zb2xlIikKLSAgICAgICAgc3lzLnN0ZGluID0gUHlTaGVsbC5Qc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZG91dCA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRvdXQiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZGVyciA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZGluID0gUHNldWRvSW5wdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGluIiwKKyAgICAgICAgICAgICAgICBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHN5cy5zdGRvdXQgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZG91dCIsCisgICAgICAgICAgICAgICAgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzeXMuc3RkZXJyID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKIAogICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBycGMuZGlzcGxheWhvb2sKICAgICAgICAgIyBwYWdlIGhlbHAoKSB0ZXh0IHRvIHNoZWxsLgpAQCAtMzQ1LDggKzQ0OCw4IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJwY2hhbmRsZXIpOgogICAgICAgICBzZWxmLnJwY2hhbmRsZXIgPSBycGNoYW5kbGVyCiAgICAgICAgIHNlbGYubG9jYWxzID0gX19tYWluX18uX19kaWN0X18KLSAgICAgICAgc2VsZi5jYWxsdGlwID0gQ2FsbFRpcHMuQ2FsbFRpcHMoKQotICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZSA9IEF1dG9Db21wbGV0ZS5BdXRvQ29tcGxldGUoKQorICAgICAgICBzZWxmLmNhbGx0aXAgPSBjYWxsdGlwcy5DYWxsVGlwcygpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gYXV0b2NvbXBsZXRlLkF1dG9Db21wbGV0ZSgpCiAKICAgICBkZWYgcnVuY29kZShzZWxmLCBjb2RlKToKICAgICAgICAgZ2xvYmFsIGludGVycnVwdGFibGUKQEAgLTM3OCw3ICs0ODEsNyBAQAogICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKIAogICAgIGRlZiBzdGFydF90aGVfZGVidWdnZXIoc2VsZiwgZ3VpX2FkYXBfb2lkKToKLSAgICAgICAgcmV0dXJuIFJlbW90ZURlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKHNlbGYucnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQorICAgICAgICByZXR1cm4gZGVidWdnZXJfci5zdGFydF9kZWJ1Z2dlcihzZWxmLnJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKIAogICAgIGRlZiBzdG9wX3RoZV9kZWJ1Z2dlcihzZWxmLCBpZGJfYWRhcF9vaWQpOgogICAgICAgICAiVW5yZWdpc3RlciB0aGUgSWRiIEFkYXB0ZXIuICBMaW5rIG9iamVjdHMgYW5kIElkYiB0aGVuIHN1YmplY3QgdG8gR0MiCkBAIC00MDIsNyArNTA1LDcgQEAKICAgICAgICAgICAgIHRiID0gdGIudGJfbmV4dAogICAgICAgICBzeXMubGFzdF90eXBlID0gdHlwCiAgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsCi0gICAgICAgIGl0ZW0gPSBTdGFja1ZpZXdlci5TdGFja1RyZWVJdGVtKGZsaXN0LCB0YikKLSAgICAgICAgcmV0dXJuIFJlbW90ZU9iamVjdEJyb3dzZXIucmVtb3RlX29iamVjdF90cmVlX2l0ZW0oaXRlbSkKKyAgICAgICAgaXRlbSA9IHN0YWNrdmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQorICAgICAgICByZXR1cm4gZGVidWdvYmpfci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5IGIvTGliL2lkbGVsaWIvcnVuc2NyaXB0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3J1bnNjcmlwdC5weQppbmRleCA1Y2I4MThkLi43OWQ4NmFkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL3J1bnNjcmlwdC5weQpAQCAtMjAsMTEgKzIwLDEyIEBACiBpbXBvcnQgb3MKIGltcG9ydCB0YWJuYW5ueQogaW1wb3J0IHRva2VuaXplCi1pbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CitpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlzaGVsbAogCiBpbmRlbnRfbWVzc2FnZSA9ICIiIkVycm9yOiBJbmNvbnNpc3RlbnQgaW5kZW50YXRpb24gZGV0ZWN0ZWQhCiAKQEAgLTQ2LDEyICs0NywxMiBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCi0gICAgICAgICMgUHJvdmlkZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBEZWJ1Z2dlcgorICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgZGVidWdnZXIKICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgYmUgZG9uZSBkaWZmZXJlbnRseQogICAgICAgICBzZWxmLmZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0CiAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZWRpdHdpbi5yb290CiAKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKToKKyAgICAgICAgaWYgbWFjb3N4LmlzQ29jb2FUaygpOgogICAgICAgICAgICAgc2VsZi5lZGl0d2luLnRleHRfZnJhbWUuYmluZCgnPDxydW4tbW9kdWxlLWV2ZW50LTI+PicsIHNlbGYuX3J1bl9tb2R1bGVfZXZlbnQpCiAKICAgICBkZWYgY2hlY2tfbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKQEAgLTExMiw3ICsxMTMsNyBAQAogICAgICAgICAgICAgc2hlbGwuc2V0X3dhcm5pbmdfc3RyZWFtKHNhdmVkX3N0cmVhbSkKIAogICAgIGRlZiBydW5fbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKToKKyAgICAgICAgaWYgbWFjb3N4LmlzQ29jb2FUaygpOgogICAgICAgICAgICAgIyBUay1Db2NvYSBpbiBNYWNPU1ggaXMgYnJva2VuIHVudGlsIGF0IGxlYXN0CiAgICAgICAgICAgICAjIFRrIDguNS45LCBhbmQgd2l0aG91dCB0aGlzIHJhdGhlcgogICAgICAgICAgICAgIyBjcnVkZSB3b3JrYXJvdW5kIElETEUgd291bGQgaGFuZyB3aGVuIGEgdXNlcgpAQCAtMTQyLDcgKzE0Myw3IEBACiAgICAgICAgIGlmIG5vdCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToKICAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCiAgICAgICAgIGludGVycCA9IHNlbGYuc2hlbGwuaW50ZXJwCi0gICAgICAgIGlmIFB5U2hlbGwudXNlX3N1YnByb2Nlc3M6CisgICAgICAgIGlmIHB5c2hlbGwudXNlX3N1YnByb2Nlc3M6CiAgICAgICAgICAgICBpbnRlcnAucmVzdGFydF9zdWJwcm9jZXNzKHdpdGhfY3dkPUZhbHNlLCBmaWxlbmFtZT0KICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5fZmlsZW5hbWVfdG9fdW5pY29kZShmaWxlbmFtZSkpCiAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpCkBAIC0xNjEsNyArMTYyLDcgQEAKICAgICAgICAgaW50ZXJwLnByZXBlbmRfc3lzcGF0aChmaWxlbmFtZSkKICAgICAgICAgIyBYWFggS0JLIDAzSnVsMDQgV2hlbiBydW4gdy9vIHN1YnByb2Nlc3MsIHJ1bnRpbWUgd2FybmluZ3Mgc3RpbGwKICAgICAgICAgIyAgICAgICAgIGdvIHRvIF9fc3RkZXJyX18uICBXaXRoIHN1YnByb2Nlc3MsIHRoZXkgZ28gdG8gdGhlIHNoZWxsLgotICAgICAgICAjICAgICAgICAgTmVlZCB0byBjaGFuZ2Ugc3RyZWFtcyBpbiBQeVNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXIuCisgICAgICAgICMgICAgICAgICBOZWVkIHRvIGNoYW5nZSBzdHJlYW1zIGluIHB5c2hlbGwuTW9kaWZpZWRJbnRlcnByZXRlci4KICAgICAgICAgaW50ZXJwLnJ1bmNvZGUoY29kZSkKICAgICAgICAgcmV0dXJuICdicmVhaycKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5IGIvTGliL2lkbGVsaWIvc2Nyb2xsZWRsaXN0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvc2Nyb2xsZWRsaXN0LnB5CmluZGV4IDUzNTc2YjUuLmNjMDhjMjYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weQorKysgYi9MaWIvaWRsZWxpYi9zY3JvbGxlZGxpc3QucHkKQEAgLTEsNSArMSw4IEBACiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4CisKIAogY2xhc3MgU2Nyb2xsZWRMaXN0OgogCkBAIC0yMyw3ICsyNiw3IEBACiAgICAgICAgICMgQmluZCBldmVudHMgdG8gdGhlIGxpc3QgYm94CiAgICAgICAgIGxpc3Rib3guYmluZCgiPEJ1dHRvblJlbGVhc2UtMT4iLCBzZWxmLmNsaWNrX2V2ZW50KQogICAgICAgICBsaXN0Ym94LmJpbmQoIjxEb3VibGUtQnV0dG9uUmVsZWFzZS0xPiIsIHNlbGYuZG91YmxlX2NsaWNrX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUHJlc3MtMj4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8Q29udHJvbC1CdXR0b24tMT4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICBlbHNlOgpAQCAtMTI0LDIyICsxMjcsMjAgQEAKICAgICAgICAgcGFzcwogCiAKLWRlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBTY3JvbGxlZExpc3QiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKK2RlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCsyMDAsIHkgKyAxNzUpKQogICAgIGNsYXNzIE15U2Nyb2xsZWRMaXN0KFNjcm9sbGVkTGlzdCk6CiAgICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icmlnaHQgY2xpY2siKQogICAgICAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KTogcHJpbnQoInNlbGVjdCIsIHNlbGYuZ2V0KGluZGV4KSkKICAgICAgICAgZGVmIG9uX2RvdWJsZShzZWxmLCBpbmRleCk6IHByaW50KCJkb3VibGUiLCBzZWxmLmdldChpbmRleCkpCiAKLSAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3Qocm9vdCkKKyAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3QodG9wKQogICAgIGZvciBpIGluIHJhbmdlKDMwKToKICAgICAgICAgc2Nyb2xsZWRfbGlzdC5hcHBlbmQoIkl0ZW0gJTAyZCIgJSBpKQogCi0gICAgcm9vdC5tYWlubG9vcCgpCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBBdCB0aGUgbW9tZW50LCB0ZXN0X3Njcm9sbGVkbGlzdCBtZXJlbHkgY3JlYXRlcyBpbnN0YW5jZSwgbGlrZSBodGVzdC4KICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3Njcm9sbGVkX2xpc3QpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2gucHkKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zZWFyY2gucHkKaW5kZXggNzY1ZDUzZi4uNGI5MDY1OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaC5weQpAQCAtMSwxMiArMSwxMiBAQAotZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIgaW1wb3J0IFRjbEVycm9yCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKK2Zyb20gaWRsZWxpYi5zZWFyY2hiYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCiAKIGRlZiBfc2V0dXAodGV4dCk6CiAgICAgIkNyZWF0ZSBvciBmaW5kIHRoZSBzaW5nbGV0b24gU2VhcmNoRGlhbG9nIGluc3RhbmNlLiIKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfc2VhcmNoZGlhbG9nIik6CiAgICAgICAgIGVuZ2luZS5fc2VhcmNoZGlhbG9nID0gU2VhcmNoRGlhbG9nKHJvb3QsIGVuZ2luZSkKICAgICByZXR1cm4gZW5naW5lLl9zZWFyY2hkaWFsb2cKQEAgLTI0LDYgKzI0LDcgQEAKICAgICAiSGFuZGxlIHRoZSBlZGl0b3IgZWRpdCBtZW51IGl0ZW0gYW5kIGNvcnJlc3BvbmRpbmcgZXZlbnQuIgogICAgIHJldHVybiBfc2V0dXAodGV4dCkuZmluZF9zZWxlY3Rpb24odGV4dCkKIAorCiBjbGFzcyBTZWFyY2hEaWFsb2coU2VhcmNoRGlhbG9nQmFzZSk6CiAKICAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6CkBAIC01MSw3ICs1Miw3IEBACiAgICAgICAgICAgICAgICAgc2VsZmlyc3QgPSB0ZXh0LmluZGV4KCJzZWwuZmlyc3QiKQogICAgICAgICAgICAgICAgIHNlbGxhc3QgPSB0ZXh0LmluZGV4KCJzZWwubGFzdCIpCiAgICAgICAgICAgICAgICAgaWYgc2VsZmlyc3QgPT0gZmlyc3QgYW5kIHNlbGxhc3QgPT0gbGFzdDoKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5iZWxsKCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwpAQCAtNjEsNyArNjIsNyBAQAogICAgICAgICAgICAgdGV4dC5zZWUoImluc2VydCIpCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgIGRlZiBmaW5kX3NlbGVjdGlvbihzZWxmLCB0ZXh0KToKQEAgLTcyLDI2ICs3MywzMCBAQAogCiAKIGRlZiBfc2VhcmNoX2RpYWxvZyhwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgJycnRGlzcGxheSBzZWFyY2ggdGVzdCBib3guJycnCisgICAgIkRpc3BsYXkgc2VhcmNoIHRlc3QgYm94LiIKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0CisgICAgZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgQnV0dG9uCisKICAgICBib3ggPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgYm94LnRpdGxlKCJUZXN0IFNlYXJjaERpYWxvZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKICAgICB0ZXh0ID0gVGV4dChib3gsIGluYWN0aXZlc2VsZWN0YmFja2dyb3VuZD0nZ3JheScpCiAgICAgdGV4dC5wYWNrKCkKICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwiVGhpcyBpcyBhIHNhbXBsZSBzdHJpbmcuXG4iKjUpCiAKICAgICBkZWYgc2hvd19maW5kKCk6Ci0gICAgICAgIHRleHQudGFnX2FkZChTRUwsICIxLjAiLCBFTkQpCisgICAgICAgIHRleHQudGFnX2FkZCgnc2VsJywgJzEuMCcsICdlbmQnKQogICAgICAgICBfc2V0dXAodGV4dCkub3Blbih0ZXh0KQotICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoU0VMLCAiMS4wIiwgRU5EKQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoJ3NlbCcsICcxLjAnLCAnZW5kJykKIAogICAgIGJ1dHRvbiA9IEJ1dHRvbihib3gsIHRleHQ9IlNlYXJjaCAoc2VsZWN0aW9uIGlnbm9yZWQpIiwgY29tbWFuZD1zaG93X2ZpbmQpCiAgICAgYnV0dG9uLnBhY2soKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfc2VhcmNoZGlhbG9nJywKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3NlYXJjaCcsCiAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfc2VhcmNoX2RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaGJhc2UucHkKaW5kZXggNWZhODRlMi4uNWY4MTc4NSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQorKysgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CkBAIC0xLDcgKzEsOCBAQAogJycnRGVmaW5lIFNlYXJjaERpYWxvZ0Jhc2UgdXNlZCBieSBTZWFyY2gsIFJlcGxhY2UsIGFuZCBHcmVwIGRpYWxvZ3MuJycnCiAKLWZyb20gdGtpbnRlciBpbXBvcnQgKFRvcGxldmVsLCBGcmFtZSwgRW50cnksIExhYmVsLCBCdXR0b24sCi0gICAgICAgICAgICAgICAgICAgICBDaGVja2J1dHRvbiwgUmFkaW9idXR0b24pCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZQorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgRW50cnksIExhYmVsLCBCdXR0b24sIENoZWNrYnV0dG9uLCBSYWRpb2J1dHRvbgorCiAKIGNsYXNzIFNlYXJjaERpYWxvZ0Jhc2U6CiAgICAgJycnQ3JlYXRlIG1vc3Qgb2YgYSAzIG9yIDQgcm93LCAzIGNvbHVtbiBzZWFyY2ggZGlhbG9nLgpAQCAtNzksNiArODAsNyBAQAogICAgICAgICB0b3Aud21fdGl0bGUoc2VsZi50aXRsZSkKICAgICAgICAgdG9wLndtX2ljb25uYW1lKHNlbGYuaWNvbikKICAgICAgICAgc2VsZi50b3AgPSB0b3AKKyAgICAgICAgc2VsZi5iZWxsID0gdG9wLmJlbGwKIAogICAgICAgICBzZWxmLnJvdyA9IDAKICAgICAgICAgc2VsZi50b3AuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgcGFkPTIsIHdlaWdodD0wKQpAQCAtMTI1LDcgKzEyNyw3IEBACiAgICAgZGVmIGNyZWF0ZV9vcHRpb25fYnV0dG9ucyhzZWxmKToKICAgICAgICAgJycnUmV0dXJuIChmaWxsZWQgZnJhbWUsIG9wdGlvbnMpIGZvciB0ZXN0aW5nLgogCi0gICAgICAgIE9wdGlvbnMgaXMgYSBsaXN0IG9mIFNlYXJjaEVuZ2luZSBib29sZWFudmFyLCBsYWJlbCBwYWlycy4KKyAgICAgICAgT3B0aW9ucyBpcyBhIGxpc3Qgb2Ygc2VhcmNoZW5naW5lIGJvb2xlYW52YXIsIGxhYmVsIHBhaXJzLgogICAgICAgICBBIGdyaWRkZWQgZnJhbWUgZnJvbSBtYWtlX2ZyYW1lIGlzIGZpbGxlZCB3aXRoIGEgQ2hlY2tidXR0b24KICAgICAgICAgZm9yIGVhY2ggcGFpciwgYm91bmQgdG8gdGhlIHZhciwgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBsYWJlbC4KICAgICAgICAgJycnCkBAIC0xMzcsMTAgKzEzOSw4IEBACiAgICAgICAgIGlmIHNlbGYubmVlZHdyYXBidXR0b246CiAgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgoZW5naW5lLndyYXB2YXIsICJXcmFwIGFyb3VuZCIpKQogICAgICAgICBmb3IgdmFyLCBsYWJlbCBpbiBvcHRpb25zOgotICAgICAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZnJhbWUsIGFuY2hvcj0idyIsIHZhcmlhYmxlPXZhciwgdGV4dD1sYWJlbCkKKyAgICAgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGZyYW1lLCB2YXJpYWJsZT12YXIsIHRleHQ9bGFiZWwpCiAgICAgICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCi0gICAgICAgICAgICBpZiB2YXIuZ2V0KCk6Ci0gICAgICAgICAgICAgICAgYnRuLnNlbGVjdCgpCiAgICAgICAgIHJldHVybiBmcmFtZSwgb3B0aW9ucwogCiAgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgpAQCAtMTUzLDExICsxNTMsOCBAQAogICAgICAgICB2YXIgPSBzZWxmLmVuZ2luZS5iYWNrdmFyCiAgICAgICAgIG90aGVycyA9IFsoMSwgJ1VwJyksICgwLCAnRG93bicpXQogICAgICAgICBmb3IgdmFsLCBsYWJlbCBpbiBvdGhlcnM6Ci0gICAgICAgICAgICBidG4gPSBSYWRpb2J1dHRvbihmcmFtZSwgYW5jaG9yPSJ3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXZhciwgdmFsdWU9dmFsLCB0ZXh0PWxhYmVsKQorICAgICAgICAgICAgYnRuID0gUmFkaW9idXR0b24oZnJhbWUsIHZhcmlhYmxlPXZhciwgdmFsdWU9dmFsLCB0ZXh0PWxhYmVsKQogICAgICAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICAgICAgaWYgdmFyLmdldCgpID09IHZhbDoKLSAgICAgICAgICAgICAgICBidG4uc2VsZWN0KCkKICAgICAgICAgcmV0dXJuIGZyYW1lLCBvdGhlcnMKIAogICAgIGRlZiBtYWtlX2J1dHRvbihzZWxmLCBsYWJlbCwgY29tbWFuZCwgaXNkZWY9MCk6CkBAIC0xNzgsNyArMTc1LDI2IEBACiAgICAgICAgIGIgPSBzZWxmLm1ha2VfYnV0dG9uKCJjbG9zZSIsIHNlbGYuY2xvc2UpCiAgICAgICAgIGIubG93ZXIoKQogCisKK2NsYXNzIF9zZWFyY2hiYXNlKFNlYXJjaERpYWxvZ0Jhc2UpOiAgIyBodGVzdCAjCisgICAgIkNyZWF0ZSBhdXRvLW9wZW5pbmcgZGlhbG9nIHdpdGggbm8gdGV4dCBjb25uZWN0aW9uLiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKKworICAgICAgICBzZWxmLnJvb3QgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5lbmdpbmUgPSBzZWFyY2hlbmdpbmUuZ2V0KHBhcmVudCkKKyAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCisgICAgICAgIHByaW50KHBhcmVudC5nZW9tZXRyeSgpKQorICAgICAgICB3aWR0aCxoZWlnaHQsIHgseSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQorICAgICAgICBzZWxmLnRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4ICsgNDAsIHkgKyAxNzUpKQorCisgICAgZGVmIGRlZmF1bHRfY29tbWFuZChzZWxmLCBkdW1teSk6IHBhc3MKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKAotICAgICAgICAnaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9zZWFyY2hkaWFsb2diYXNlJywgdmVyYm9zaXR5PTIpCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9zZWFyY2hiYXNlJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3NlYXJjaGJhc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2hlbmdpbmUucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zZWFyY2hlbmdpbmUucHkKaW5kZXggMzc4ODNiZi4uMjUzZjFiMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQpAQCAtMSw1ICsxLDYgQEAKICcnJ0RlZmluZSBTZWFyY2hFbmdpbmUgZm9yIHNlYXJjaCBkaWFsb2dzLicnJwogaW1wb3J0IHJlCisKIGZyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBCb29sZWFuVmFyLCBUY2xFcnJvcgogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKIApAQCAtMTQsNiArMTUsNyBAQAogICAgICAgICAjIFRoaXMgY3JlYXRlcyBhIGN5Y2xlIHRoYXQgcGVyc2lzdHMgdW50aWwgcm9vdCBpcyBkZWxldGVkLgogICAgIHJldHVybiByb290Ll9zZWFyY2hlbmdpbmUKIAorCiBjbGFzcyBTZWFyY2hFbmdpbmU6CiAgICAgIiIiSGFuZGxlcyBzZWFyY2hpbmcgYSB0ZXh0IHdpZGdldCBmb3IgRmluZCwgUmVwbGFjZSwgYW5kIEdyZXAuIiIiCiAKQEAgLTU3LDcgKzU5LDcgQEAKIAogICAgIGRlZiBzZXRjb29rZWRwYXQoc2VsZiwgcGF0KToKICAgICAgICAgIlNldCBwYXR0ZXJuIGFmdGVyIGVzY2FwaW5nIGlmIHJlLiIKLSAgICAgICAgIyBjYWxsZWQgb25seSBpbiBTZWFyY2hEaWFsb2cucHk6IDY2CisgICAgICAgICMgY2FsbGVkIG9ubHkgaW4gc2VhcmNoLnB5OiA2NgogICAgICAgICBpZiBzZWxmLmlzcmUoKToKICAgICAgICAgICAgIHBhdCA9IHJlLmVzY2FwZShwYXQpCiAgICAgICAgIHNlbGYuc2V0cGF0KHBhdCkKQEAgLTE4Niw2ICsxODgsNyBAQAogICAgICAgICAgICAgY29sID0gbGVuKGNoYXJzKSAtIDEKICAgICAgICAgcmV0dXJuIE5vbmUKIAorCiBkZWYgc2VhcmNoX3JldmVyc2UocHJvZywgY2hhcnMsIGNvbCk6CiAgICAgJycnU2VhcmNoIGJhY2t3YXJkcyBhbmQgcmV0dXJuIGFuIHJlIG1hdGNoIG9iamVjdCBvciBOb25lLgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weSBiL0xpYi9pZGxlbGliL3N0YWNrdmlld2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zdGFja3ZpZXdlci5weQppbmRleCBjY2M3NTVjLi4wNjk4ZGVmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weQorKysgYi9MaWIvaWRsZWxpYi9zdGFja3ZpZXdlci5weQpAQCAtMSwxMiArMSwxMiBAQAotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgb3MKIGltcG9ydCByZQoraW1wb3J0IHN5cworCiBpbXBvcnQgdGtpbnRlciBhcyB0awogCi1mcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcwotZnJvbSBpZGxlbGliLk9iamVjdEJyb3dzZXIgaW1wb3J0IE9iamVjdFRyZWVJdGVtLCBtYWtlX29iamVjdHRyZWVpdGVtCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0Citmcm9tIGlkbGVsaWIuZGVidWdvYmogaW1wb3J0IE9iamVjdFRyZWVJdGVtLCBtYWtlX29iamVjdHRyZWVpdGVtCitmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcwogCiBkZWYgU3RhY2tCcm93c2VyKHJvb3QsIGZsaXN0PU5vbmUsIHRiPU5vbmUsIHRvcD1Ob25lKToKICAgICBpZiB0b3AgaXMgTm9uZToKQEAgLTE3LDYgKzE3LDcgQEAKICAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQogICAgIG5vZGUuZXhwYW5kKCkKIAorCiBjbGFzcyBTdGFja1RyZWVJdGVtKFRyZWVJdGVtKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCB0Yj1Ob25lKToKQEAgLTU1LDYgKzU2LDcgQEAKICAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgIHJldHVybiBzdWJsaXN0CiAKKwogY2xhc3MgRnJhbWVUcmVlSXRlbShUcmVlSXRlbSk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5mbywgZmxpc3QpOgpAQCAtOTYsNiArOTgsNyBAQAogICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgICAgICAgICAgIHNlbGYuZmxpc3QuZ290b2ZpbGVsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCiAKKwogY2xhc3MgVmFyaWFibGVzVHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgogCiAgICAgZGVmIEdldFRleHQoc2VsZik6CkBAIC0xMjAsMTUgKzEyMywxNCBAQAogICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgcmV0dXJuIHN1Ymxpc3QKIAotICAgIGRlZiBrZXlzKHNlbGYpOiAgIyB1bnVzZWQsIGxlZnQgZm9yIHBvc3NpYmxlIDNyZCBwYXJ0eSB1c2UKLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5vYmplY3Qua2V5cygpKQogCi1kZWYgX3N0YWNrX3ZpZXdlcihwYXJlbnQpOgotICAgIHJvb3QgPSB0ay5UaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBTdGFja1ZpZXdlciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCitkZWYgX3N0YWNrX3ZpZXdlcihwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAorICAgIHRvcCA9IHRrLlRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgU3RhY2tWaWV3ZXIiKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCArIDUwLCB5ICsgMTc1KSkKKyAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdCh0b3ApCiAgICAgdHJ5OiAjIHRvIG9idGFpbiBhIHRyYWNlYmFjayBvYmplY3QKICAgICAgICAgaW50ZW50aW9uYWxfbmFtZV9lcnJvcgogICAgIGV4Y2VwdCBOYW1lRXJyb3I6CkBAIC0xMzksNyArMTQxLDcgQEAKICAgICBzeXMubGFzdF92YWx1ZSA9IGV4Y192YWx1ZQogICAgIHN5cy5sYXN0X3RyYWNlYmFjayA9IGV4Y190YgogCi0gICAgU3RhY2tCcm93c2VyKHJvb3QsIGZsaXN0PWZsaXN0LCB0b3A9cm9vdCwgdGI9ZXhjX3RiKQorICAgIFN0YWNrQnJvd3Nlcih0b3AsIGZsaXN0PWZsaXN0LCB0b3A9dG9wLCB0Yj1leGNfdGIpCiAKICAgICAjIHJlc3RvcmUgc3lzIHRvIG9yaWdpbmFsIHN0YXRlCiAgICAgZGVsIHN5cy5sYXN0X3R5cGUKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3N0YXR1c2Jhci5weSBiL0xpYi9pZGxlbGliL3N0YXR1c2Jhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE4NTI4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvc3RhdHVzYmFyLnB5CkBAIC0wLDAgKzEsNDYgQEAKK2Zyb20gdGtpbnRlciBpbXBvcnQgRnJhbWUsIExhYmVsCisKKworY2xhc3MgTXVsdGlTdGF0dXNCYXIoRnJhbWUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdyk6CisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdykKKyAgICAgICAgc2VsZi5sYWJlbHMgPSB7fQorCisgICAgZGVmIHNldF9sYWJlbChzZWxmLCBuYW1lLCB0ZXh0PScnLCBzaWRlPSdsZWZ0Jywgd2lkdGg9MCk6CisgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYubGFiZWxzOgorICAgICAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLCBib3JkZXJ3aWR0aD0wLCBhbmNob3I9J3cnKQorICAgICAgICAgICAgbGFiZWwucGFjayhzaWRlPXNpZGUsIHBhZHk9MCwgcGFkeD00KQorICAgICAgICAgICAgc2VsZi5sYWJlbHNbbmFtZV0gPSBsYWJlbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFiZWwgPSBzZWxmLmxhYmVsc1tuYW1lXQorICAgICAgICBpZiB3aWR0aCAhPSAwOgorICAgICAgICAgICAgbGFiZWwuY29uZmlnKHdpZHRoPXdpZHRoKQorICAgICAgICBsYWJlbC5jb25maWcodGV4dD10ZXh0KQorCisKK2RlZiBfbXVsdGlzdGF0dXNfYmFyKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZSwgVGV4dCwgQnV0dG9uCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSh4LCB5ICsgMTc1KSkKKyAgICB0b3AudGl0bGUoIlRlc3QgbXVsdGlzdGF0dXMgYmFyIikKKyAgICBmcmFtZSA9IEZyYW1lKHRvcCkKKyAgICB0ZXh0ID0gVGV4dChmcmFtZSwgaGVpZ2h0PTUsIHdpZHRoPTQwKQorICAgIHRleHQucGFjaygpCisgICAgbXNiID0gTXVsdGlTdGF0dXNCYXIoZnJhbWUpCisgICAgbXNiLnNldF9sYWJlbCgib25lIiwgImhlbGxvIikKKyAgICBtc2Iuc2V0X2xhYmVsKCJ0d28iLCAid29ybGQiKQorICAgIG1zYi5wYWNrKHNpZGU9J2JvdHRvbScsIGZpbGw9J3gnKQorCisgICAgZGVmIGNoYW5nZSgpOgorICAgICAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiZm9vIikKKyAgICAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgImJhciIpCisKKyAgICBidXR0b24gPSBCdXR0b24odG9wLCB0ZXh0PSJVcGRhdGUgc3RhdHVzIiwgY29tbWFuZD1jaGFuZ2UpCisgICAgYnV0dG9uLnBhY2soc2lkZT0nYm90dG9tJykKKyAgICBmcmFtZS5wYWNrKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX211bHRpc3RhdHVzX2JhcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5IGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKaW5kZXggOTY1ZjlmOC4uNDE4NmZhMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKKysrIGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKQEAgLTI4NSw2ICsyODUsNyBAQAogICAgICAgICAgICAgIyBwbGFjZWQgaGlkZSBpdAogICAgICAgICAgICAgc2VsZi50YWJfc2V0Lmxvd2VyKCkKIAorCiBjbGFzcyBUYWJiZWRQYWdlU2V0KEZyYW1lKToKICAgICAiIiJBIFRraW50ZXIgdGFiYmVkLXBhbmUgd2lkZ2V0LgogCkBAIC0zMDIsNiArMzAzLDcgQEAKICAgICByZW1vdmVfcGFnZSgpIG1ldGhvZHMuCiAKICAgICAiIiIKKwogICAgIGNsYXNzIFBhZ2Uob2JqZWN0KToKICAgICAgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgVGFiYmVkUGFnZVNldCdzIHBhZ2VzLgogCkBAIC00NjcsMzEgKzQ2OSwyOSBAQAogCiAgICAgICAgIHNlbGYuX3RhYl9zZXQuc2V0X3NlbGVjdGVkX3RhYihwYWdlX25hbWUpCiAKLWRlZiBfdGFiYmVkX3BhZ2VzKHBhcmVudCk6Ci0gICAgIyB0ZXN0IGRpYWxvZwotICAgIHJvb3Q9VGsoKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTc1KSkKLSAgICByb290LnRpdGxlKCJUZXN0IHRhYmJlZCBwYWdlcyIpCi0gICAgdGFiUGFnZT1UYWJiZWRQYWdlU2V0KHJvb3QsIHBhZ2VfbmFtZXM9WydGb29iYXInLCdCYXonXSwgbl9yb3dzPTAsCisKK2RlZiBfdGFiYmVkX3BhZ2VzKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3A9VG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCisgICAgdG9wLnRpdGxlKCJUZXN0IHRhYmJlZCBwYWdlcyIpCisgICAgdGFiUGFnZT1UYWJiZWRQYWdlU2V0KHRvcCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICB0YWJQYWdlLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCiAgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0ZvbycsIHBhZHk9MjApLnBhY2soKQogICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0Zvb2JhciddLmZyYW1lLCB0ZXh0PSdCYXInLCBwYWR5PTIwKS5wYWNrKCkKICAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydCYXonXS5mcmFtZSwgdGV4dD0nQmF6JykucGFjaygpCi0gICAgZW50cnlQZ05hbWU9RW50cnkocm9vdCkKLSAgICBidXR0b25BZGQ9QnV0dG9uKHJvb3QsIHRleHQ9J0FkZCBQYWdlJywKKyAgICBlbnRyeVBnTmFtZT1FbnRyeSh0b3ApCisgICAgYnV0dG9uQWRkPUJ1dHRvbih0b3AsIHRleHQ9J0FkZCBQYWdlJywKICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnRhYlBhZ2UuYWRkX3BhZ2UoZW50cnlQZ05hbWUuZ2V0KCkpKQotICAgIGJ1dHRvblJlbW92ZT1CdXR0b24ocm9vdCwgdGV4dD0nUmVtb3ZlIFBhZ2UnLAorICAgIGJ1dHRvblJlbW92ZT1CdXR0b24odG9wLCB0ZXh0PSdSZW1vdmUgUGFnZScsCiAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp0YWJQYWdlLnJlbW92ZV9wYWdlKGVudHJ5UGdOYW1lLmdldCgpKSkKLSAgICBsYWJlbFBnTmFtZT1MYWJlbChyb290LCB0ZXh0PSduYW1lIG9mIHBhZ2UgdG8gYWRkL3JlbW92ZTonKQorICAgIGxhYmVsUGdOYW1lPUxhYmVsKHRvcCwgdGV4dD0nbmFtZSBvZiBwYWdlIHRvIGFkZC9yZW1vdmU6JykKICAgICBidXR0b25BZGQucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBidXR0b25SZW1vdmUucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBsYWJlbFBnTmFtZS5wYWNrKHBhZHg9NSkKICAgICBlbnRyeVBnTmFtZS5wYWNrKHBhZHg9NSkKLSAgICByb290Lm1haW5sb29wKCkKLQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkgYi9MaWIvaWRsZWxpYi90ZXh0dmlldy5weQpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi90ZXh0Vmlldy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKaW5kZXggMTJhYzMxOS4uYWRlZTMyNiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkKKysrIGIvTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKQEAgLTEsMTQgKzEsMTQgQEAKICIiIlNpbXBsZSB0ZXh0IGJyb3dzZXIgZm9yIElETEUKIAogIiIiCi0KIGZyb20gdGtpbnRlciBpbXBvcnQgKgotaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgorZnJvbSB0a2ludGVyLm1lc3NhZ2Vib3ggaW1wb3J0IHNob3dlcnJvcgorCiAKIGNsYXNzIFRleHRWaWV3ZXIoVG9wbGV2ZWwpOgotICAgICIiIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRQorICAgICJBIHNpbXBsZSB0ZXh0IHZpZXdlciBkaWFsb2cgZm9yIElETEUuIgogCi0gICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIHRleHQsIG1vZGFsPVRydWUsIF9odGVzdD1GYWxzZSk6CiAgICAgICAgICIiIlNob3cgdGhlIGdpdmVuIHRleHQgaW4gYSBzY3JvbGxhYmxlIHdpbmRvdyB3aXRoIGEgJ2Nsb3NlJyBidXR0b24KIApAQCAtMjAsMTEgKzIwLDExIEBACiAgICAgICAgICIiIgogICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCiAgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCi0gICAgICAgICMgcGxhY2UgZGlhbG9nIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0CisgICAgICAgICMgUGxhY2UgZGlhbG9nIGJlbG93IHBhcmVudCBpZiBydW5uaW5nIGh0ZXN0LgogICAgICAgICBzZWxmLmdlb21ldHJ5KCI9JWR4JWQrJWQrJWQiICUgKDc1MCwgNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R4KCkgKyAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgKDEwIGlmIG5vdCBfaHRlc3QgZWxzZSAxMDApKSkKLSAgICAgICAgI2VsZ3VhdmFzIC0gY29uZmlnIHBsYWNlaG9sZGVycyB0aWwgY29uZmlnIHN0dWZmIGNvbXBsZXRlZAorICAgICAgICAjIFRPRE86IGdldCBmZy9iZyBmcm9tIHRoZW1lLgogICAgICAgICBzZWxmLmJnID0gJyNmZmZmZmYnCiAgICAgICAgIHNlbGYuZmcgPSAnIzAwMDAwMCcKIApAQCAtMzMsOSArMzMsOSBAQAogICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5PaykKICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi50ZXh0Vmlldy5mb2N1c19zZXQoKQotICAgICAgICAja2V5IGJpbmRpbmdzIGZvciB0aGlzIGRpYWxvZwotICAgICAgICBzZWxmLmJpbmQoJzxSZXR1cm4+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKLSAgICAgICAgc2VsZi5iaW5kKCc8RXNjYXBlPicsc2VsZi5PaykgI2Rpc21pc3MgZGlhbG9nCisgICAgICAgICMgQmluZCBrZXlzIGZvciBjbG9zaW5nIHRoaXMgZGlhbG9nLgorICAgICAgICBzZWxmLmJpbmQoJzxSZXR1cm4+JyxzZWxmLk9rKQorICAgICAgICBzZWxmLmJpbmQoJzxFc2NhcGU+JyxzZWxmLk9rKQogICAgICAgICBzZWxmLnRleHRWaWV3Lmluc2VydCgwLjAsIHRleHQpCiAgICAgICAgIHNlbGYudGV4dFZpZXcuY29uZmlnKHN0YXRlPURJU0FCTEVEKQogCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDbG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLk9rLCB0YWtlZm9jdXM9RkFMU0UpCiAgICAgICAgIHNlbGYuc2Nyb2xsYmFyVmlldyA9IFNjcm9sbGJhcihmcmFtZVRleHQsIG9yaWVudD1WRVJUSUNBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vmb2N1cz1GQUxTRSwgaGlnaGxpZ2h0dGhpY2tuZXNzPTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlZm9jdXM9RkFMU0UpCiAgICAgICAgIHNlbGYudGV4dFZpZXcgPSBUZXh0KGZyYW1lVGV4dCwgd3JhcD1XT1JELCBoaWdobGlnaHR0aGlja25lc3M9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKICAgICAgICAgc2VsZi5zY3JvbGxiYXJWaWV3LmNvbmZpZyhjb21tYW5kPXNlbGYudGV4dFZpZXcueXZpZXcpCkBAIC03MiwxNCArNzIsMTQgQEAKICAgICB0cnk6CiAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3InLCBlbmNvZGluZz1lbmNvZGluZykgYXMgZmlsZToKICAgICAgICAgICAgIGNvbnRlbnRzID0gZmlsZS5yZWFkKCkKLSAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBMb2FkIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdVbmFibGUgdG8gbG9hZCBmaWxlICVyIC4nICUgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudCkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgc2hvd2Vycm9yKHRpdGxlPSdGaWxlIExvYWQgRXJyb3InLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIGxvYWQgZmlsZSAlciAuJyAlIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudCkKICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yIGFzIGVycjoKLSAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nVW5pY29kZSBEZWNvZGUgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKGVyciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudCkKKyAgICAgICAgc2hvd2Vycm9yKHRpdGxlPSdVbmljb2RlIERlY29kZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cihlcnIpLAorICAgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudCkKICAgICBlbHNlOgogICAgICAgICByZXR1cm4gdmlld190ZXh0KHBhcmVudCwgdGl0bGUsIGNvbnRlbnRzLCBtb2RhbCkKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvVG9vbFRpcC5weSBiL0xpYi9pZGxlbGliL3Rvb2x0aXAucHkKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvVG9vbFRpcC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdG9vbHRpcC5weQppbmRleCA5NjQxMDdlLi44NDNmYjRhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Ub29sVGlwLnB5CisrKyBiL0xpYi9pZGxlbGliL3Rvb2x0aXAucHkKQEAgLTEsNCArMSw0IEBACi0jIGdlbmVyYWwgcHVycG9zZSAndG9vbHRpcCcgcm91dGluZXMgLSBjdXJyZW50bHkgdW51c2VkIGluIGlkbGVmb3JrCisjIGdlbmVyYWwgcHVycG9zZSAndG9vbHRpcCcgcm91dGluZXMgLSBjdXJyZW50bHkgdW51c2VkIGluIGlkbGVsaWIKICMgKGFsdGhvdWdoIHRoZSAnY2FsbHRpcHMnIGV4dGVuc2lvbiBpcyBwYXJ0bHkgYmFzZWQgb24gdGhpcyBjb2RlKQogIyBtYXkgYmUgdXNlZnVsIGZvciBzb21lIHB1cnBvc2VzIGluIChvciBhbG1vc3QgaW4gOykgdGhlIGN1cnJlbnQgcHJvamVjdCBzY29wZQogIyBJZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKQEAgLTc2LDIxICs3NiwyMCBAQAogICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zOgogICAgICAgICAgICAgbGlzdGJveC5pbnNlcnQoRU5ELCBpdGVtKQogCi1kZWYgX3Rvb2x0aXAocGFyZW50KToKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgdG9vbHRpcCIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIGxhYmVsID0gTGFiZWwocm9vdCwgdGV4dD0iUGxhY2UgeW91ciBtb3VzZSBvdmVyIGJ1dHRvbnMiKQorZGVmIF90b29sdGlwKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IHRvb2x0aXAiKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE1MCkpCisgICAgbGFiZWwgPSBMYWJlbCh0b3AsIHRleHQ9IlBsYWNlIHlvdXIgbW91c2Ugb3ZlciBidXR0b25zIikKICAgICBsYWJlbC5wYWNrKCkKLSAgICBidXR0b24xID0gQnV0dG9uKHJvb3QsIHRleHQ9IkJ1dHRvbiAxIikKLSAgICBidXR0b24yID0gQnV0dG9uKHJvb3QsIHRleHQ9IkJ1dHRvbiAyIikKKyAgICBidXR0b24xID0gQnV0dG9uKHRvcCwgdGV4dD0iQnV0dG9uIDEiKQorICAgIGJ1dHRvbjIgPSBCdXR0b24odG9wLCB0ZXh0PSJCdXR0b24gMiIpCiAgICAgYnV0dG9uMS5wYWNrKCkKICAgICBidXR0b24yLnBhY2soKQogICAgIFRvb2xUaXAoYnV0dG9uMSwgIlRoaXMgaXMgdG9vbHRpcCB0ZXh0IGZvciBidXR0b24xLiIpCiAgICAgTGlzdGJveFRvb2xUaXAoYnV0dG9uMiwgWyJUaGlzIGlzIiwibXVsdGlwbGUgbGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvb2x0aXAgdGV4dCIsImZvciBidXR0b24yIl0pCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5IGIvTGliL2lkbGVsaWIvdHJlZS5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi90cmVlLnB5CmluZGV4IGExOTU3OGYuLjI5MmNlMzYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1RyZWVXaWRnZXQucHkKKysrIGIvTGliL2lkbGVsaWIvdHJlZS5weQpAQCAtMTUsMTAgKzE1LDEyIEBACiAjIC0gb3B0aW1pemUgdHJlZSByZWRyYXcgYWZ0ZXIgZXhwYW5kIG9mIHN1Ym5vZGUKIAogaW1wb3J0IG9zCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKIAotZnJvbSBpZGxlbGliIGltcG9ydCBab29tSGVpZ2h0Ci1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gdGtpbnRlciBpbXBvcnQgKgorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCisKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IHpvb21oZWlnaHQKIAogSUNPTkRJUiA9ICJJY29ucyIKIApAQCAtNDQ1LDIyICs0NDcsMjEgQEAKICAgICAgICAgc2VsZi5jYW52YXMueXZpZXdfc2Nyb2xsKDEsICJ1bml0IikKICAgICAgICAgcmV0dXJuICJicmVhayIKICAgICBkZWYgem9vbV9oZWlnaHQoc2VsZiwgZXZlbnQpOgotICAgICAgICBab29tSGVpZ2h0Lnpvb21faGVpZ2h0KHNlbGYubWFzdGVyKQorICAgICAgICB6b29taGVpZ2h0Lnpvb21faGVpZ2h0KHNlbGYubWFzdGVyKQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAKLWRlZiBfdHJlZV93aWRnZXQocGFyZW50KToKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgVHJlZVdpZGdldCIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHNjID0gU2Nyb2xsZWRDYW52YXMocm9vdCwgYmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsIHRha2Vmb2N1cz0xKQorZGVmIF90cmVlX3dpZGdldChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCs1MCwgeSsxNzUpKQorICAgIHNjID0gU2Nyb2xsZWRDYW52YXModG9wLCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCiAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIsIHNpZGU9TEVGVCkKLSAgICBpdGVtID0gRmlsZVRyZWVJdGVtKG9zLmdldGN3ZCgpKQorICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0oSUNPTkRJUikKICAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQogICAgIG5vZGUuZXhwYW5kKCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIHRlc3RfdHJlZSBpcyBjdXJyZW50bHkgYSBjb3B5IG9mIHRoaXMKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3RyZWVfd2lkZ2V0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL3VuZG8ucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdW5kby5weQppbmRleCAxYzI1MDJkLi40MzMyZjEwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL3VuZG8ucHkKQEAgLTEsNyArMSw5IEBACiBpbXBvcnQgc3RyaW5nCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKIAotZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKKworIyB0a2ludHRlciBpbXBvcnQgbm90IG5lZWRlZCBiZWNhdXNlIG1vZHVsZSBkb2VzIG5vdCBjcmVhdGUgd2lkZ2V0cywKKyMgYWx0aG91Z2ggbWFueSBtZXRob2RzIG9wZXJhdGUgb24gdGV4dCB3aWRnZXQgYXJndW1lbnRzLgogCiAjJCBldmVudCA8PHJlZG8+PgogIyQgd2luIDxDb250cm9sLXk+CkBAIC0xNTgsNyArMTYwLDYgQEAKIAogCiBjbGFzcyBDb21tYW5kOgotCiAgICAgIyBCYXNlIGNsYXNzIGZvciBVbmRvYWJsZSBjb21tYW5kcwogCiAgICAgdGFncyA9IE5vbmUKQEAgLTIwNCw3ICsyMDUsNiBAQAogCiAKIGNsYXNzIEluc2VydENvbW1hbmQoQ29tbWFuZCk6Ci0KICAgICAjIFVuZG9hYmxlIGluc2VydCBjb21tYW5kCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgxLCBjaGFycywgdGFncz1Ob25lKToKQEAgLTI2Miw3ICsyNjIsNiBAQAogCiAKIGNsYXNzIERlbGV0ZUNvbW1hbmQoQ29tbWFuZCk6Ci0KICAgICAjIFVuZG9hYmxlIGRlbGV0ZSBjb21tYW5kCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CkBAIC0yOTcsOCArMjk2LDggQEAKICAgICAgICAgdGV4dC5zZWUoJ2luc2VydCcpCiAgICAgICAgICMjc3lzLl9fc3RkZXJyX18ud3JpdGUoInVuZG86ICVzXG4iICUgc2VsZikKIAotY2xhc3MgQ29tbWFuZFNlcXVlbmNlKENvbW1hbmQpOgogCitjbGFzcyBDb21tYW5kU2VxdWVuY2UoQ29tbWFuZCk6CiAgICAgIyBXcmFwcGVyIGZvciBhIHNlcXVlbmNlIG9mIHVuZG9hYmxlIGNtZHMgdG8gYmUgdW5kb25lL3JlZG9uZQogICAgICMgYXMgYSB1bml0CiAKQEAgLTMzOCwxMyArMzM3LDEyIEBACiAKIAogZGVmIF91bmRvX2RlbGVnYXRvcihwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgaW1wb3J0IHJlCi0gICAgaW1wb3J0IHRraW50ZXIgYXMgdGsKLSAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgotICAgIHVuZG93aW4gPSB0ay5Ub3BsZXZlbCgpCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgVGV4dCwgQnV0dG9uCisgICAgZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICB1bmRvd2luID0gVG9wbGV2ZWwocGFyZW50KQogICAgIHVuZG93aW4udGl0bGUoIlRlc3QgVW5kb0RlbGVnYXRvciIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHVuZG93aW4uZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB1bmRvd2luLmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNzUpKQogCiAgICAgdGV4dCA9IFRleHQodW5kb3dpbiwgaGVpZ2h0PTEwKQogICAgIHRleHQucGFjaygpCkBAIC0zNjIsNyArMzYwLDcgQEAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3VuZG9kZWxlZ2F0b3InLCB2ZXJib3NpdHk9MiwKLSAgICAgICAgICAgICAgICAgIGV4aXQ9RmFsc2UpCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF91bmRvJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3VuZG9fZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvV2luZG93TGlzdC5weSBiL0xpYi9pZGxlbGliL3dpbmRvd3MucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvV2luZG93TGlzdC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvd2luZG93cy5weQppbmRleCBiYzc0MzQ4Li5hM2Y4NThhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9XaW5kb3dMaXN0LnB5CisrKyBiL0xpYi9pZGxlbGliL3dpbmRvd3MucHkKQEAgLTEsNSArMSw2IEBACiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKIAorCiBjbGFzcyBXaW5kb3dMaXN0OgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgpAQCAtNDgsNiArNDksNyBAQAogICAgICAgICAgICAgICAgIHQsIHYsIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICBwcmludCgid2FybmluZzogY2FsbGJhY2sgZmFpbGVkIGluIFdpbmRvd0xpc3QiLCB0LCAiOiIsIHYpCiAKKwogcmVnaXN0cnkgPSBXaW5kb3dMaXN0KCkKIAogYWRkX3dpbmRvd3NfdG9fbWVudSA9IHJlZ2lzdHJ5LmFkZF93aW5kb3dzX3RvX21lbnUKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkgYi9MaWIvaWRsZWxpYi96b29taGVpZ2h0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3pvb21oZWlnaHQucHkKaW5kZXggYTVkNjc5ZS4uYWE0YTQyNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQorKysgYi9MaWIvaWRsZWxpYi96b29taGVpZ2h0LnB5CkBAIC0zLDcgKzMsOCBAQAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKKwogCiBjbGFzcyBab29tSGVpZ2h0OgogCkBAIC0yMCw2ICsyMSw3IEBACiAgICAgICAgIHRvcCA9IHNlbGYuZWRpdHdpbi50b3AKICAgICAgICAgem9vbV9oZWlnaHQodG9wKQogCisKIGRlZiB6b29tX2hlaWdodCh0b3ApOgogICAgIGdlb20gPSB0b3Aud21fZ2VvbWV0cnkoKQogICAgIG0gPSByZS5tYXRjaChyIihcZCspeChcZCspXCsoLT9cZCspXCsoLT9cZCspIiwgZ2VvbSkKQEAgLTMyLDcgKzM0LDcgQEAKICAgICAgICAgbmV3eSA9IDAKICAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gNzIKIAotICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgIGVsaWYgbWFjb3N4LmlzQXF1YVRrKCk6CiAgICAgICAgICMgVGhlICc4OCcgYmVsb3cgaXMgYSBtYWdpYyBudW1iZXIgdGhhdCBhdm9pZHMgcGxhY2luZyB0aGUgYm90dG9tCiAgICAgICAgICMgb2YgdGhlIHdpbmRvdyBiZWxvdyB0aGUgcGFuZWwgb24gbXkgbWFjaGluZS4gSSBkb24ndCBrbm93IGhvdwogICAgICAgICAjIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhpcyB3aXRoIHRraW50ZXIuCmRpZmYgLS1naXQgYS9MaWIvaW1hcGxpYi5weSBiL0xpYi9pbWFwbGliLnB5CmluZGV4IDRlOGE0YmIuLmE2M2JhOGQgMTAwNjQ0Ci0tLSBhL0xpYi9pbWFwbGliLnB5CisrKyBiL0xpYi9pbWFwbGliLnB5CkBAIC0xMTEsNyArMTExLDE1IEBACiAjIExpdGVyYWwgaXMgbm8gbG9uZ2VyIHVzZWQ7IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiBMaXRlcmFsID0gcmUuY29tcGlsZShicicuKnsoP1A8c2l6ZT5cZCspfSQnLCByZS5BU0NJSSkKIE1hcENSTEYgPSByZS5jb21waWxlKGJyJ1xyXG58XHJ8XG4nKQotUmVzcG9uc2VfY29kZSA9IHJlLmNvbXBpbGUoYnInXFsoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGE+W15cXV0qKSk/XF0nKQorIyBXZSBubyBsb25nZXIgZXhjbHVkZSB0aGUgJ10nIGNoYXJhY3RlciBmcm9tIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIHJlc3BvbnNlCisjIGNvZGUsIGV2ZW4gdGhvdWdoIGl0IHZpb2xhdGVzIHRoZSBSRkMuICBQb3B1bGFyIElNQVAgc2VydmVycyBzdWNoIGFzIEdtYWlsCisjIGFsbG93IGZsYWdzIHdpdGggJ10nLCBhbmQgdGhlcmUgYXJlIHByb2dyYW1zIChpbmNsdWRpbmcgaW1hcGxpYiEpIHRoYXQgY2FuCisjIHByb2R1Y2UgdGhlbS4gIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyBpZiB0aGUgJ3RleHQnIHBvcnRpb24gb2YgdGhlIHJlc3BvbnNlCisjIGluY2x1ZGVzIGEgJ10nIHdlJ2xsIHBhcnNlIHRoZSByZXNwb25zZSB3cm9uZyAod2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSBSRkMKKyMgcmVzdHJpY3Rpb24pLiAgSG93ZXZlciwgdGhhdCBzZWVtcyBsZXNzIGxpa2VseSB0byBiZSBhIHByb2JsZW0gaW4gcHJhY3RpY2UKKyMgdGhhbiBiZWluZyB1bmFibGUgdG8gY29ycmVjdGx5IHBhcnNlIGZsYWdzIHRoYXQgaW5jbHVkZSAnXScgY2hhcnMsIHdoaWNoCisjIHdhcyByZXBvcnRlZCBhcyBhIHJlYWwtd29ybGQgcHJvYmxlbSBpbiBpc3N1ZSAjMjE4MTUuCitSZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShicidcWyg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpP1xdJykKIFVudGFnZ2VkX3Jlc3BvbnNlID0gcmUuY29tcGlsZShicidcKiAoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGE+LiopKT8nKQogIyBVbnRhZ2dlZF9zdGF0dXMgaXMgbm8gbG9uZ2VyIHVzZWQ7IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKIFVudGFnZ2VkX3N0YXR1cyA9IHJlLmNvbXBpbGUoCmRpZmYgLS1naXQgYS9MaWIvaW1wLnB5IGIvTGliL2ltcC5weQppbmRleCBlMjY0MzkxLi43ODFmZjIzIDEwMDY0NAotLS0gYS9MaWIvaW1wLnB5CisrKyBiL0xpYi9pbXAucHkKQEAgLTMwLDcgKzMwLDcgQEAKIAogd2FybmluZ3Mud2FybigidGhlIGltcCBtb2R1bGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaW1wb3J0bGliOyAiCiAgICAgICAgICAgICAgICJzZWUgdGhlIG1vZHVsZSdzIGRvY3VtZW50YXRpb24gZm9yIGFsdGVybmF0aXZlIHVzZXMiLAotICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogCiAjIERFUFJFQ0FURUQKIFNFQVJDSF9FUlJPUiA9IDAKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weSBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weQppbmRleCA5ZWVjYmZlLi4yZWVhZmUxIDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkKKysrIGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5CkBAIC0zNiwyMyArMzYsNiBAQAogICAgIHJldHVybiB0eXBlKHN5cykobmFtZSkKIAogCi1jbGFzcyBfTWFuYWdlUmVsb2FkOgotCi0gICAgIiIiTWFuYWdlcyB0aGUgcG9zc2libGUgY2xlYW4tdXAgb2Ygc3lzLm1vZHVsZXMgZm9yIGxvYWRfbW9kdWxlKCkuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCi0KLSAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgotICAgICAgICBzZWxmLl9pc19yZWxvYWQgPSBzZWxmLl9uYW1lIGluIHN5cy5tb2R1bGVzCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgotICAgICAgICBpZiBhbnkoYXJnIGlzIG5vdCBOb25lIGZvciBhcmcgaW4gYXJncykgYW5kIG5vdCBzZWxmLl9pc19yZWxvYWQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW3NlbGYuX25hbWVdCi0gICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotCiAjIE1vZHVsZS1sZXZlbCBsb2NraW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgQSBkaWN0IG1hcHBpbmcgbW9kdWxlIG5hbWVzIHRvIHdlYWtyZWZzIG9mIF9Nb2R1bGVMb2NrIGluc3RhbmNlcwpAQCAtMjcwLDcgKzI1Myw3IEBACiAjIE1vZHVsZSBzcGVjaWZpY2F0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGRlZiBfbW9kdWxlX3JlcHIobW9kdWxlKToKLSAgICAjIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNb2R1bGVUeXBlX19yZXByX18oKS4KKyAgICAjIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBNb2R1bGVUeXBlLl9fcmVwcl9fKCkuCiAgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICBpZiBoYXNhdHRyKGxvYWRlciwgJ21vZHVsZV9yZXByJyk6CiAgICAgICAgICMgQXMgc29vbiBhcyBCdWlsdGluSW1wb3J0ZXIsIEZyb3plbkltcG9ydGVyLCBhbmQgTmFtZXNwYWNlTG9hZGVyCkBAIC02MDMsNyArNTg2LDcgQEAKIAogIyBVc2VkIGJ5IGltcG9ydGxpYi5yZWxvYWQoKSBhbmQgX2xvYWRfbW9kdWxlX3NoaW0oKS4KIGRlZiBfZXhlYyhzcGVjLCBtb2R1bGUpOgotICAgICIiIkV4ZWN1dGUgdGhlIHNwZWMgaW4gYW4gZXhpc3RpbmcgbW9kdWxlJ3MgbmFtZXNwYWNlLiIiIgorICAgICIiIkV4ZWN1dGUgdGhlIHNwZWMncyBzcGVjaWZpZWQgbW9kdWxlIGluIGFuIGV4aXN0aW5nIG1vZHVsZSdzIG5hbWVzcGFjZS4iIiIKICAgICBuYW1lID0gc3BlYy5uYW1lCiAgICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgIHdpdGggX01vZHVsZUxvY2tNYW5hZ2VyKG5hbWUpOgpAQCAtODc3LDE0ICs4NjAsMjEgQEAKIAogCiBkZWYgX2ZpbmRfc3BlYyhuYW1lLCBwYXRoLCB0YXJnZXQ9Tm9uZSk6Ci0gICAgIiIiRmluZCBhIG1vZHVsZSdzIGxvYWRlci4iIiIKLSAgICBpZiBzeXMubWV0YV9wYXRoIGlzIG5vdCBOb25lIGFuZCBub3Qgc3lzLm1ldGFfcGF0aDoKKyAgICAiIiJGaW5kIGEgbW9kdWxlJ3Mgc3BlYy4iIiIKKyAgICBtZXRhX3BhdGggPSBzeXMubWV0YV9wYXRoCisgICAgaWYgbWV0YV9wYXRoIGlzIE5vbmU6CisgICAgICAgICMgUHlJbXBvcnRfQ2xlYW51cCgpIGlzIHJ1bm5pbmcgb3IgaGFzIGJlZW4gY2FsbGVkLgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigic3lzLm1ldGFfcGF0aCBpcyBOb25lLCBQeXRob24gaXMgbGlrZWx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInNodXR0aW5nIGRvd24iKQorCisgICAgaWYgbm90IG1ldGFfcGF0aDoKICAgICAgICAgX3dhcm5pbmdzLndhcm4oJ3N5cy5tZXRhX3BhdGggaXMgZW1wdHknLCBJbXBvcnRXYXJuaW5nKQorCiAgICAgIyBXZSBjaGVjayBzeXMubW9kdWxlcyBoZXJlIGZvciB0aGUgcmVsb2FkIGNhc2UuICBXaGlsZSBhIHBhc3NlZC1pbgogICAgICMgdGFyZ2V0IHdpbGwgdXN1YWxseSBpbmRpY2F0ZSBhIHJlbG9hZCB0aGVyZSBpcyBubyBndWFyYW50ZWUsIHdoZXJlYXMKICAgICAjIHN5cy5tb2R1bGVzIHByb3ZpZGVzIG9uZS4KICAgICBpc19yZWxvYWQgPSBuYW1lIGluIHN5cy5tb2R1bGVzCi0gICAgZm9yIGZpbmRlciBpbiBzeXMubWV0YV9wYXRoOgorICAgIGZvciBmaW5kZXIgaW4gbWV0YV9wYXRoOgogICAgICAgICB3aXRoIF9JbXBvcnRMb2NrQ29udGV4dCgpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZpbmRfc3BlYyA9IGZpbmRlci5maW5kX3NwZWMKQEAgLTkyNSw2ICs5MTUsOSBAQAogICAgIGlmIGxldmVsID4gMDoKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZSwgc3RyKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignX19wYWNrYWdlX18gbm90IHNldCB0byBhIHN0cmluZycpCisgICAgICAgIGVsaWYgbm90IHBhY2thZ2U6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcignYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCB3aXRoIG5vIGtub3duIHBhcmVudCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFja2FnZScpCiAgICAgICAgIGVsaWYgcGFja2FnZSBub3QgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICBtc2cgPSAoJ1BhcmVudCBtb2R1bGUgeyFyfSBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAnCiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCcpCkBAIC0xMDMzLDcgKzEwMjYsMTkgQEAKIAogICAgICIiIgogICAgIHBhY2thZ2UgPSBnbG9iYWxzLmdldCgnX19wYWNrYWdlX18nKQotICAgIGlmIHBhY2thZ2UgaXMgTm9uZToKKyAgICBzcGVjID0gZ2xvYmFscy5nZXQoJ19fc3BlY19fJykKKyAgICBpZiBwYWNrYWdlIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lIGFuZCBwYWNrYWdlICE9IHNwZWMucGFyZW50OgorICAgICAgICAgICAgX3dhcm5pbmdzLndhcm4oIl9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmIih7cGFja2FnZSFyfSAhPSB7c3BlYy5wYXJlbnQhcn0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFdhcm5pbmcsIHN0YWNrbGV2ZWw9MykKKyAgICAgICAgcmV0dXJuIHBhY2thZ2UKKyAgICBlbGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBzcGVjLnBhcmVudAorICAgIGVsc2U6CisgICAgICAgIF93YXJuaW5ncy53YXJuKCJjYW4ndCByZXNvbHZlIHBhY2thZ2UgZnJvbSBfX3NwZWNfXyBvciBfX3BhY2thZ2VfXywgIgorICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGluZyBiYWNrIG9uIF9fbmFtZV9fIGFuZCBfX3BhdGhfXyIsCisgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFdhcm5pbmcsIHN0YWNrbGV2ZWw9MykKICAgICAgICAgcGFja2FnZSA9IGdsb2JhbHNbJ19fbmFtZV9fJ10KICAgICAgICAgaWYgJ19fcGF0aF9fJyBub3QgaW4gZ2xvYmFsczoKICAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnJwYXJ0aXRpb24oJy4nKVswXQpkaWZmIC0tZ2l0IGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5IGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CmluZGV4IGU1NGQ2OTEuLmQzNmU0YWMgMTAwNjQ0Ci0tLSBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQorKysgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKQEAgLTEzNywxMCArMTM3LDYgQEAKICMgYSAucHljIGZpbGUgaW4gdGV4dCBtb2RlIHRoZSBtYWdpYyBudW1iZXIgd2lsbCBiZSB3cm9uZzsgYWxzbywgdGhlCiAjIEFwcGxlIE1QVyBjb21waWxlciBzd2FwcyB0aGVpciB2YWx1ZXMsIGJvdGNoaW5nIHN0cmluZyBjb25zdGFudHMuCiAjCi0jIFRoZSBtYWdpYyBudW1iZXJzIG11c3QgYmUgc3BhY2VkIGFwYXJ0IGF0IGxlYXN0IDIgdmFsdWVzLCBhcyB0aGUKLSMgLVUgaW50ZXJwZXRlciBmbGFnIHdpbGwgY2F1c2UgTUFHSUMrMSBiZWluZyB1c2VkLiBUaGV5IGhhdmUgYmVlbgotIyBvZGQgbnVtYmVycyBmb3Igc29tZSB0aW1lIG5vdy4KLSMKICMgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2Ygb2xkIHNjaGVtZXMgZm9yIHNldHRpbmcgdGhlIG1hZ2ljIG51bWJlci4KICMgVGhlIGN1cnJlbnQgd29ya2luZyBzY2hlbWUgaXMgdG8gaW5jcmVtZW50IHRoZSBwcmV2aW91cyB2YWx1ZSBieQogIyAxMC4KQEAgLTIzMSw2ICsyMjcsMTMgQEAKICMgICAgIFB5dGhvbiAzLjViMiAgMzM0MCAoZml4IGRpY3Rpb25hcnkgZGlzcGxheSBldmFsdWF0aW9uIG9yZGVyICMxMTIwNSkKICMgICAgIFB5dGhvbiAzLjViMiAgMzM1MCAoYWRkIEdFVF9ZSUVMRF9GUk9NX0lURVIgb3Bjb2RlICMyNDQwMCkKICMgICAgIFB5dGhvbiAzLjUuMiAgMzM1MSAoZml4IEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMIG9wY29kZSAjMjcyODYpCisjICAgICBQeXRob24gMy42YTAgIDMzNjAgKGFkZCBGT1JNQVRfVkFMVUUgb3Bjb2RlICMyNTQ4MworIyAgICAgUHl0aG9uIDMuNmEwICAzMzYxIChsaW5lbm8gZGVsdGEgb2YgY29kZS5jb19sbm90YWIgYmVjb21lcyBzaWduZWQpCisjICAgICBQeXRob24gMy42YTEgIDMzNzAgKDE2IGJpdCB3b3JkY29kZSkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MSAoYWRkIEJVSUxEX0NPTlNUX0tFWV9NQVAgb3Bjb2RlICMyNzE0MCkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MiAoTUFLRV9GVU5DVElPTiBzaW1wbGlmaWNhdGlvbiwgcmVtb3ZlIE1BS0VfQ0xPU1VSRQorIyAgICAgICAgICAgICAgICAgICAgICAgICAjMjcwOTUpCisjICAgICBQeXRob24gMy42YjEgIDMzNzMgKGFkZCBCVUlMRF9TVFJJTkcgb3Bjb2RlICMyNzA3OCkKICMKICMgTUFHSUMgbXVzdCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGJ5dGVjb2RlIGVtaXR0ZWQgYnkgdGhlIGNvbXBpbGVyIG1heSBubwogIyBsb25nZXIgYmUgdW5kZXJzdG9vZCBieSBvbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGV2YWwgbG9vcCAodXN1YWxseQpAQCAtMjM5LDcgKzI0Miw3IEBACiAjIFdoZW5ldmVyIE1BR0lDX05VTUJFUiBpcyBjaGFuZ2VkLCB0aGUgcmFuZ2VzIGluIHRoZSBtYWdpY192YWx1ZXMgYXJyYXkKICMgaW4gUEMvbGF1bmNoZXIuYyBtdXN0IGFsc28gYmUgdXBkYXRlZC4KIAotTUFHSUNfTlVNQkVSID0gKDMzNTEpLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKK01BR0lDX05VTUJFUiA9ICgzMzczKS50b19ieXRlcygyLCAnbGl0dGxlJykgKyBiJ1xyXG4nCiBfUkFXX01BR0lDX05VTUJFUiA9IGludC5mcm9tX2J5dGVzKE1BR0lDX05VTUJFUiwgJ2xpdHRsZScpICAjIEZvciBpbXBvcnQuYwogCiBfUFlDQUNIRSA9ICdfX3B5Y2FjaGVfXycKQEAgLTM3MSwxNCArMzc0LDYgQEAKICAgICByZXR1cm4gbW9kZQogCiAKLWRlZiBfdmVyYm9zZV9tZXNzYWdlKG1lc3NhZ2UsICphcmdzLCB2ZXJib3NpdHk9MSk6Ci0gICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2UgdG8gc3RkZXJyIGlmIC12L1BZVEhPTlZFUkJPU0UgaXMgdHVybmVkIG9uLiIiIgotICAgIGlmIHN5cy5mbGFncy52ZXJib3NlID49IHZlcmJvc2l0eToKLSAgICAgICAgaWYgbm90IG1lc3NhZ2Uuc3RhcnRzd2l0aCgoJyMnLCAnaW1wb3J0ICcpKToKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAnIyAnICsgbWVzc2FnZQotICAgICAgICBwcmludChtZXNzYWdlLmZvcm1hdCgqYXJncyksIGZpbGU9c3lzLnN0ZGVycikKLQotCiBkZWYgX2NoZWNrX25hbWUobWV0aG9kKToKICAgICAiIiJEZWNvcmF0b3IgdG8gdmVyaWZ5IHRoYXQgdGhlIG1vZHVsZSBiZWluZyByZXF1ZXN0ZWQgbWF0Y2hlcyB0aGUgb25lIHRoZQogICAgIGxvYWRlciBjYW4gaGFuZGxlLgpAQCAtNDQ4LDE1ICs0NDMsMTUgQEAKICAgICByYXdfc2l6ZSA9IGRhdGFbODoxMl0KICAgICBpZiBtYWdpYyAhPSBNQUdJQ19OVU1CRVI6CiAgICAgICAgIG1lc3NhZ2UgPSAnYmFkIG1hZ2ljIG51bWJlciBpbiB7IXJ9OiB7IXJ9Jy5mb3JtYXQobmFtZSwgbWFnaWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1lc3NhZ2UsICoqZXhjX2RldGFpbHMpCiAgICAgZWxpZiBsZW4ocmF3X3RpbWVzdGFtcCkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHRpbWVzdGFtcCBpbiB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgRU9GRXJyb3IobWVzc2FnZSkKICAgICBlbGlmIGxlbihyYXdfc2l6ZSkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHNpemUgb2Ygc291cmNlIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGlmIHNvdXJjZV9zdGF0cyBpcyBub3QgTm9uZToKICAgICAgICAgdHJ5OgpAQCAtNDY2LDcgKzQ2MSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBfcl9sb25nKHJhd190aW1lc3RhbXApICE9IHNvdXJjZV9tdGltZToKICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ2J5dGVjb2RlIGlzIHN0YWxlIGZvciB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc291cmNlX3NpemUgPSBzb3VyY2Vfc3RhdHNbJ3NpemUnXSAmIDB4RkZGRkZGRkYKQEAgLTQ4Myw3ICs0NzgsNyBAQAogICAgICIiIkNvbXBpbGUgYnl0ZWNvZGUgYXMgcmV0dXJuZWQgYnkgX3ZhbGlkYXRlX2J5dGVjb2RlX2hlYWRlcigpLiIiIgogICAgIGNvZGUgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCiAgICAgaWYgaXNpbnN0YW5jZShjb2RlLCBfY29kZV90eXBlKToKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQogICAgICAgICBpZiBzb3VyY2VfcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIF9pbXAuX2ZpeF9jb19maWxlbmFtZShjb2RlLCBzb3VyY2VfcGF0aCkKICAgICAgICAgcmV0dXJuIGNvZGUKQEAgLTYxMCw3ICs2MDUsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmVnaXN0cnlfa2V5ID0gY2xzLlJFR0lTVFJZX0tFWQogICAgICAgICBrZXkgPSByZWdpc3RyeV9rZXkuZm9ybWF0KGZ1bGxuYW1lPWZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPXN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj0nJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggY2xzLl9vcGVuX3JlZ2lzdHJ5KGtleSkgYXMgaGtleToKICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IF93aW5yZWcuUXVlcnlWYWx1ZShoa2V5LCAnJykKQEAgLTY3Myw2ICs2NjgsNyBAQAogICAgICAgICBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoZXhlYywgY29kZSwgbW9kdWxlLl9fZGljdF9fKQogCiAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgIiIiVGhpcyBtb2R1bGUgaXMgZGVwcmVjYXRlZC4iIiIKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtNzY2LDIxICs3NjIsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRU9GRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30gbWF0Y2hlcyB7fScsIGJ5dGVjb2RlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9IG1hdGNoZXMge30nLCBieXRlY29kZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlX2J5dGVjb2RlKGJ5dGVzX2RhdGEsIG5hbWU9ZnVsbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVfcGF0aD1ieXRlY29kZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoPXNvdXJjZV9wYXRoKQogICAgICAgICBzb3VyY2VfYnl0ZXMgPSBzZWxmLmdldF9kYXRhKHNvdXJjZV9wYXRoKQogICAgICAgICBjb2RlX29iamVjdCA9IHNlbGYuc291cmNlX3RvX2NvZGUoc291cmNlX2J5dGVzLCBzb3VyY2VfcGF0aCkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7fScsIHNvdXJjZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20ge30nLCBzb3VyY2VfcGF0aCkKICAgICAgICAgaWYgKG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSBhbmQgYnl0ZWNvZGVfcGF0aCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBzb3VyY2VfbXRpbWUgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgZGF0YSA9IF9jb2RlX3RvX2J5dGVjb2RlKGNvZGVfb2JqZWN0LCBzb3VyY2VfbXRpbWUsCiAgICAgICAgICAgICAgICAgICAgIGxlbihzb3VyY2VfYnl0ZXMpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2J5dGVjb2RlKHNvdXJjZV9wYXRoLCBieXRlY29kZV9wYXRoLCBkYXRhKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3dyb3RlIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnd3JvdGUgeyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHJldHVybiBjb2RlX29iamVjdApAQCAtODYwLDE0ICs4NTYsMTYgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGVybWlzc2lvbiBlcnJvciwgcmVhZC1vbmx5IGZpbGVzeXN0ZW06IGp1c3QgZm9yZ2V0CiAgICAgICAgICAgICAgICAgIyBhYm91dCB3cml0aW5nIHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhcmVudCwgZXhjKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBleGMpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF93cml0ZV9hdG9taWMocGF0aCwgZGF0YSwgX21vZGUpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAjIFNhbWUgYXMgYWJvdmU6IGp1c3QgZG9uJ3Qgd3JpdGUgdGhlIGJ5dGVjb2RlLgotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGF0aCwgZXhjKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YykKIAogCiBjbGFzcyBTb3VyY2VsZXNzRmlsZUxvYWRlcihGaWxlTG9hZGVyLCBfTG9hZGVyQmFzaWNzKToKQEAgLTkxMiwxNCArOTEwLDE0IEBACiAgICAgICAgICIiIkNyZWF0ZSBhbiB1bml0aWFsaXplZCBleHRlbnNpb24gbW9kdWxlIiIiCiAgICAgICAgIG1vZHVsZSA9IF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZCgKICAgICAgICAgICAgIF9pbXAuY3JlYXRlX2R5bmFtaWMsIHNwZWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBsb2FkZWQgZnJvbSB7IXJ9JywKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gbG9hZGVkIGZyb20geyFyfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5uYW1lLCBzZWxmLnBhdGgpCiAgICAgICAgIHJldHVybiBtb2R1bGUKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuIGV4dGVuc2lvbiBtb2R1bGUiIiIKICAgICAgICAgX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKF9pbXAuZXhlY19keW5hbWljLCBtb2R1bGUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5wYXRoKQogCiAgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgpAQCAtOTg1LDYgKzk4Myw5IEBACiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBwYXRoKToKKyAgICAgICAgc2VsZi5fcGF0aFtpbmRleF0gPSBwYXRoCisKICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCkBAIC0xMDM0LDcgKzEwMzUsOCBAQAogCiAgICAgICAgICIiIgogICAgICAgICAjIFRoZSBpbXBvcnQgc3lzdGVtIG5ldmVyIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCduYW1lc3BhY2UgbW9kdWxlIGxvYWRlZCB3aXRoIHBhdGggeyFyfScsIHNlbGYuX3BhdGgpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnbmFtZXNwYWNlIG1vZHVsZSBsb2FkZWQgd2l0aCBwYXRoIHshcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGF0aCkKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtMTA1NCwxMSArMTA1Niw3IEBACiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX3BhdGhfaG9va3MoY2xzLCBwYXRoKToKLSAgICAgICAgIiIiU2VhcmNoIHNlcXVlbmNlIG9mIGhvb2tzIGZvciBhIGZpbmRlciBmb3IgJ3BhdGgnLgotCi0gICAgICAgIElmICdob29rcycgaXMgZmFsc2UgdGhlbiB1c2Ugc3lzLnBhdGhfaG9va3MuCi0KLSAgICAgICAgIiIiCisgICAgICAgICIiIlNlYXJjaCBzeXMucGF0aF9ob29rcyBmb3IgYSBmaW5kZXIgZm9yICdwYXRoJy4iIiIKICAgICAgICAgaWYgc3lzLnBhdGhfaG9va3MgaXMgbm90IE5vbmUgYW5kIG5vdCBzeXMucGF0aF9ob29rczoKICAgICAgICAgICAgIF93YXJuaW5ncy53YXJuKCdzeXMucGF0aF9ob29rcyBpcyBlbXB0eScsIEltcG9ydFdhcm5pbmcpCiAgICAgICAgIGZvciBob29rIGluIHN5cy5wYXRoX2hvb2tzOgpAQCAtMTE0MCw4ICsxMTM4LDEwIEBACiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZmluZF9zcGVjKGNscywgZnVsbG5hbWUsIHBhdGg9Tm9uZSwgdGFyZ2V0PU5vbmUpOgotICAgICAgICAiIiJmaW5kIHRoZSBtb2R1bGUgb24gc3lzLnBhdGggb3IgJ3BhdGgnIGJhc2VkIG9uIHN5cy5wYXRoX2hvb2tzIGFuZAotICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS4iIiIKKyAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBzcGVjIGZvciAnZnVsbG5hbWUnIG9uIHN5cy5wYXRoIG9yICdwYXRoJy4KKworICAgICAgICBUaGUgc2VhcmNoIGlzIGJhc2VkIG9uIHN5cy5wYXRoX2hvb2tzIGFuZCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS4KKyAgICAgICAgIiIiCiAgICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgICBzcGVjID0gY2xzLl9nZXRfc3BlYyhmdWxsbmFtZSwgcGF0aCwgdGFyZ2V0KQpAQCAtMTIyMSw4ICsxMjIxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucz1zbXNsKQogCiAgICAgZGVmIGZpbmRfc3BlYyhzZWxmLCBmdWxsbmFtZSwgdGFyZ2V0PU5vbmUpOgotICAgICAgICAiIiJUcnkgdG8gZmluZCBhIHNwZWMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiAgUmV0dXJucyB0aGUKLSAgICAgICAgbWF0Y2hpbmcgc3BlYywgb3IgTm9uZSBpZiBub3QgZm91bmQuIiIiCisgICAgICAgICIiIlRyeSB0byBmaW5kIGEgc3BlYyBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuCisKKyAgICAgICAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgc3BlYywgb3IgTm9uZSBpZiBub3QgZm91bmQuCisgICAgICAgICIiIgogICAgICAgICBpc19uYW1lc3BhY2UgPSBGYWxzZQogICAgICAgICB0YWlsX21vZHVsZSA9IGZ1bGxuYW1lLnJwYXJ0aXRpb24oJy4nKVsyXQogICAgICAgICB0cnk6CkBAIC0xMjU0LDEyICsxMjU2LDEzIEBACiAgICAgICAgICMgQ2hlY2sgZm9yIGEgZmlsZSB3LyBhIHByb3BlciBzdWZmaXggZXhpc3RzLgogICAgICAgICBmb3Igc3VmZml4LCBsb2FkZXJfY2xhc3MgaW4gc2VsZi5fbG9hZGVyczoKICAgICAgICAgICAgIGZ1bGxfcGF0aCA9IF9wYXRoX2pvaW4oc2VsZi5wYXRoLCB0YWlsX21vZHVsZSArIHN1ZmZpeCkKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3RyeWluZyB7fScuZm9ybWF0KGZ1bGxfcGF0aCksIHZlcmJvc2l0eT0yKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd0cnlpbmcge30nLCBmdWxsX3BhdGgsIHZlcmJvc2l0eT0yKQogICAgICAgICAgICAgaWYgY2FjaGVfbW9kdWxlICsgc3VmZml4IGluIGNhY2hlOgogICAgICAgICAgICAgICAgIGlmIF9wYXRoX2lzZmlsZShmdWxsX3BhdGgpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3NwZWMobG9hZGVyX2NsYXNzLCBmdWxsbmFtZSwgZnVsbF9wYXRoLCBOb25lLCB0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3BlYyhsb2FkZXJfY2xhc3MsIGZ1bGxuYW1lLCBmdWxsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCB0YXJnZXQpCiAgICAgICAgIGlmIGlzX25hbWVzcGFjZToKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3Bvc3NpYmxlIG5hbWVzcGFjZSBmb3Ige30nLmZvcm1hdChiYXNlX3BhdGgpKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdwb3NzaWJsZSBuYW1lc3BhY2UgZm9yIHt9JywgYmFzZV9wYXRoKQogICAgICAgICAgICAgc3BlYyA9IF9ib290c3RyYXAuTW9kdWxlU3BlYyhmdWxsbmFtZSwgTm9uZSkKICAgICAgICAgICAgIHNwZWMuc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbYmFzZV9wYXRoXQogICAgICAgICAgICAgcmV0dXJuIHNwZWMKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvdXRpbC5weSBiL0xpYi9pbXBvcnRsaWIvdXRpbC5weQppbmRleCBlMWZhMDdhLi42YmRmMGQ0IDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL3V0aWwucHkKKysrIGIvTGliL2ltcG9ydGxpYi91dGlsLnB5CkBAIC0yMiw4ICsyMiw4IEBACiAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnLicpOgogICAgICAgICByZXR1cm4gbmFtZQogICAgIGVsaWYgbm90IHBhY2thZ2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3shcn0gaXMgbm90IGEgcmVsYXRpdmUgbmFtZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyhubyBsZWFkaW5nIGRvdCknLmZvcm1hdChuYW1lKSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmJ25vIHBhY2thZ2Ugc3BlY2lmaWVkIGZvciB7cmVwcihuYW1lKX0gJworICAgICAgICAgICAgICAgICAgICAgICAgICcocmVxdWlyZWQgZm9yIHJlbGF0aXZlIG1vZHVsZSBuYW1lcyknKQogICAgIGxldmVsID0gMAogICAgIGZvciBjaGFyYWN0ZXIgaW4gbmFtZToKICAgICAgICAgaWYgY2hhcmFjdGVyICE9ICcuJzoKQEAgLTIwNCwxMSArMjA0LDYgQEAKICAgICByZXR1cm4gbW9kdWxlX2Zvcl9sb2FkZXJfd3JhcHBlcgogCiAKLWNsYXNzIF9Nb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6Ci0KLSAgICAiIiJBIHN1YmNsYXNzIG9mIHRoZSBtb2R1bGUgdHlwZSB0byBhbGxvdyBfX2NsYXNzX18gbWFuaXB1bGF0aW9uLiIiIgotCi0KIGNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgogCiAgICAgIiIiQSBzdWJjbGFzcyBvZiB0aGUgbW9kdWxlIHR5cGUgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyB1cG9uIGF0dHJpYnV0ZSBhY2Nlc3MuIiIiCkBAIC0yMTgsMTMgKzIxMywxNCBAQAogICAgICAgICAjIEFsbCBtb2R1bGUgbWV0YWRhdGEgbXVzdCBiZSBnYXJuZXJlZCBmcm9tIF9fc3BlY19fIGluIG9yZGVyIHRvIGF2b2lkCiAgICAgICAgICMgdXNpbmcgbXV0YXRlZCB2YWx1ZXMuCiAgICAgICAgICMgU3RvcCB0cmlnZ2VyaW5nIHRoaXMgbWV0aG9kLgotICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Nb2R1bGUKKyAgICAgICAgc2VsZi5fX2NsYXNzX18gPSB0eXBlcy5Nb2R1bGVUeXBlCiAgICAgICAgICMgR2V0IHRoZSBvcmlnaW5hbCBuYW1lIHRvIG1ha2Ugc3VyZSBubyBvYmplY3Qgc3Vic3RpdHV0aW9uIG9jY3VycmVkCiAgICAgICAgICMgaW4gc3lzLm1vZHVsZXMuCiAgICAgICAgIG9yaWdpbmFsX25hbWUgPSBzZWxmLl9fc3BlY19fLm5hbWUKICAgICAgICAgIyBGaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCBhdHRyaWJ1dGVzIHdlcmUgbXV0YXRlZCBiZXR3ZWVuIHRoZSBjcmVhdGlvbgogICAgICAgICAjIG9mIHRoZSBtb2R1bGUgYW5kIG5vdy4KLSAgICAgICAgYXR0cnNfdGhlbiA9IHNlbGYuX19zcGVjX18ubG9hZGVyX3N0YXRlCisgICAgICAgIGF0dHJzX3RoZW4gPSBzZWxmLl9fc3BlY19fLmxvYWRlcl9zdGF0ZVsnX19kaWN0X18nXQorICAgICAgICBvcmlnaW5hbF90eXBlID0gc2VsZi5fX3NwZWNfXy5sb2FkZXJfc3RhdGVbJ19fY2xhc3NfXyddCiAgICAgICAgIGF0dHJzX25vdyA9IHNlbGYuX19kaWN0X18KICAgICAgICAgYXR0cnNfdXBkYXRlZCA9IHt9CiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJzX25vdy5pdGVtcygpOgpAQCAtMjM5LDkgKzIzNSw5IEBACiAgICAgICAgICMgb2JqZWN0IHdhcyBwdXQgaW50byBzeXMubW9kdWxlcy4KICAgICAgICAgaWYgb3JpZ2luYWxfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIGlmIGlkKHNlbGYpICE9IGlkKHN5cy5tb2R1bGVzW29yaWdpbmFsX25hbWVdKToKLSAgICAgICAgICAgICAgICBtc2cgPSAoJ21vZHVsZSBvYmplY3QgZm9yIHshcn0gc3Vic3RpdHV0ZWQgaW4gc3lzLm1vZHVsZXMgJwotICAgICAgICAgICAgICAgICAgICAgICAnZHVyaW5nIGEgbGF6eSBsb2FkJykKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZy5mb3JtYXQob3JpZ2luYWxfbmFtZSkpCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIm1vZHVsZSBvYmplY3QgZm9yIHtvcmlnaW5hbF9uYW1lIXJ9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Vic3RpdHV0ZWQgaW4gc3lzLm1vZHVsZXMgZHVyaW5nIGEgbGF6eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWQiKQogICAgICAgICAjIFVwZGF0ZSBhZnRlciBsb2FkaW5nIHNpbmNlIHRoYXQncyB3aGF0IHdvdWxkIGhhcHBlbiBpbiBhbiBlYWdlcgogICAgICAgICAjIGxvYWRpbmcgc2l0dWF0aW9uLgogICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShhdHRyc191cGRhdGVkKQpAQCAtMjc1LDggKzI3MSw3IEBACiAgICAgICAgIHNlbGYubG9hZGVyID0gbG9hZGVyCiAKICAgICBkZWYgY3JlYXRlX21vZHVsZShzZWxmLCBzcGVjKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgbW9kdWxlIHdoaWNoIGNhbiBoYXZlIGl0cyBfX2NsYXNzX18gbWFuaXB1bGF0ZWQuIiIiCi0gICAgICAgIHJldHVybiBfTW9kdWxlKHNwZWMubmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmNyZWF0ZV9tb2R1bGUoc3BlYykKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJNYWtlIHRoZSBtb2R1bGUgbG9hZCBsYXppbHkuIiIiCkBAIC0yODYsNSArMjgxLDggQEAKICAgICAgICAgIyBvbiBhbiBvYmplY3Qgd291bGQgaGF2ZSB0cmlnZ2VyZWQgdGhlIGxvYWQsCiAgICAgICAgICMgZS5nLiBgYG1vZHVsZS5fX3NwZWNfXy5sb2FkZXIgPSBOb25lYGAgd291bGQgdHJpZ2dlciBhIGxvYWQgZnJvbQogICAgICAgICAjIHRyeWluZyB0byBhY2Nlc3MgbW9kdWxlLl9fc3BlY19fLgotICAgICAgICBtb2R1bGUuX19zcGVjX18ubG9hZGVyX3N0YXRlID0gbW9kdWxlLl9fZGljdF9fLmNvcHkoKQorICAgICAgICBsb2FkZXJfc3RhdGUgPSB7fQorICAgICAgICBsb2FkZXJfc3RhdGVbJ19fZGljdF9fJ10gPSBtb2R1bGUuX19kaWN0X18uY29weSgpCisgICAgICAgIGxvYWRlcl9zdGF0ZVsnX19jbGFzc19fJ10gPSBtb2R1bGUuX19jbGFzc19fCisgICAgICAgIG1vZHVsZS5fX3NwZWNfXy5sb2FkZXJfc3RhdGUgPSBsb2FkZXJfc3RhdGUKICAgICAgICAgbW9kdWxlLl9fY2xhc3NfXyA9IF9MYXp5TW9kdWxlCmRpZmYgLS1naXQgYS9MaWIvaW5zcGVjdC5weSBiL0xpYi9pbnNwZWN0LnB5CmluZGV4IGU4MzBlYjYuLjQ1ZDIxMTAgMTAwNjQ0Ci0tLSBhL0xpYi9pbnNwZWN0LnB5CisrKyBiL0xpYi9pbnNwZWN0LnB5CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgZ2V0bW9kdWxlKCkgLSBkZXRlcm1pbmUgdGhlIG1vZHVsZSB0aGF0IGFuIG9iamVjdCBjYW1lIGZyb20KICAgICBnZXRjbGFzc3RyZWUoKSAtIGFycmFuZ2UgY2xhc3NlcyBzbyBhcyB0byByZXByZXNlbnQgdGhlaXIgaGllcmFyY2h5CiAKLSAgICBnZXRhcmdzcGVjKCksIGdldGFyZ3ZhbHVlcygpLCBnZXRjYWxsYXJncygpIC0gZ2V0IGluZm8gYWJvdXQgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgZ2V0YXJndmFsdWVzKCksIGdldGNhbGxhcmdzKCkgLSBnZXQgaW5mbyBhYm91dCBmdW5jdGlvbiBhcmd1bWVudHMKICAgICBnZXRmdWxsYXJnc3BlYygpIC0gc2FtZSwgd2l0aCBzdXBwb3J0IGZvciBQeXRob24gMyBmZWF0dXJlcwogICAgIGZvcm1hdGFyZ3NwZWMoKSwgZm9ybWF0YXJndmFsdWVzKCkgLSBmb3JtYXQgYW4gYXJndW1lbnQgc3BlYwogICAgIGdldG91dGVyZnJhbWVzKCksIGdldGlubmVyZnJhbWVzKCkgLSBnZXQgaW5mbyBhYm91dCBmcmFtZXMKQEAgLTYyNCwyMyArNjI0LDYgQEAKICAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgbm90IGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCAnCiAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwgb3IgY29kZSBvYmplY3QnLmZvcm1hdChvYmplY3QpKQogCi1Nb2R1bGVJbmZvID0gbmFtZWR0dXBsZSgnTW9kdWxlSW5mbycsICduYW1lIHN1ZmZpeCBtb2RlIG1vZHVsZV90eXBlJykKLQotZGVmIGdldG1vZHVsZWluZm8ocGF0aCk6Ci0gICAgIiIiR2V0IHRoZSBtb2R1bGUgbmFtZSwgc3VmZml4LCBtb2RlLCBhbmQgbW9kdWxlIHR5cGUgZm9yIGEgZ2l2ZW4gZmlsZS4iIiIKLSAgICB3YXJuaW5ncy53YXJuKCdpbnNwZWN0LmdldG1vZHVsZWluZm8oKSBpcyBkZXByZWNhdGVkJywgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgMikKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgaW1wb3J0IGltcAotICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQotICAgIHN1ZmZpeGVzID0gWygtbGVuKHN1ZmZpeCksIHN1ZmZpeCwgbW9kZSwgbXR5cGUpCi0gICAgICAgICAgICAgICAgICAgIGZvciBzdWZmaXgsIG1vZGUsIG10eXBlIGluIGltcC5nZXRfc3VmZml4ZXMoKV0KLSAgICBzdWZmaXhlcy5zb3J0KCkgIyB0cnkgbG9uZ2VzdCBzdWZmaXhlcyBmaXJzdCwgaW4gY2FzZSB0aGV5IG92ZXJsYXAKLSAgICBmb3IgbmVnbGVuLCBzdWZmaXgsIG1vZGUsIG10eXBlIGluIHN1ZmZpeGVzOgotICAgICAgICBpZiBmaWxlbmFtZVtuZWdsZW46XSA9PSBzdWZmaXg6Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlSW5mbyhmaWxlbmFtZVs6bmVnbGVuXSwgc3VmZml4LCBtb2RlLCBtdHlwZSkKLQogZGVmIGdldG1vZHVsZW5hbWUocGF0aCk6CiAgICAgIiIiUmV0dXJuIHRoZSBtb2R1bGUgbmFtZSBmb3IgYSBnaXZlbiBmaWxlLCBvciBOb25lLiIiIgogICAgIGZuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQpAQCAtMTA2MSw4ICsxMDQ0LDYgQEAKICAgICAna3dvbmx5ZGVmYXVsdHMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIGZyb20ga3dvbmx5YXJncyB0byBkZWZhdWx0cy4KICAgICAnYW5ub3RhdGlvbnMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50IG5hbWVzIHRvIGFubm90YXRpb25zLgogCi0gICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gZ2V0YXJnc3BlYygpLgotCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgaW5zcGVjdC5zaWduYXR1cmUoKSBpbnN0ZWFkLgogICAgICIiIgogCkBAIC0xMTczLDggKzExNTQsNyBAQAogICAgICAgICAgICAgICAgICAgZm9ybWF0dmFsdWU9bGFtYmRhIHZhbHVlOiAnPScgKyByZXByKHZhbHVlKSwKICAgICAgICAgICAgICAgICAgIGZvcm1hdHJldHVybnM9bGFtYmRhIHRleHQ6ICcgLT4gJyArIHRleHQsCiAgICAgICAgICAgICAgICAgICBmb3JtYXRhbm5vdGF0aW9uPWZvcm1hdGFubm90YXRpb24pOgotICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXRhcmdzcGVjCi0gICAgb3IgZ2V0ZnVsbGFyZ3NwZWMuCisgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldGZ1bGxhcmdzcGVjLgogCiAgICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywKICAgICBrd29ubHlhcmdzLCBrd29ubHlkZWZhdWx0cywgYW5ub3RhdGlvbnMpLiAgVGhlIG90aGVyIGZpdmUgYXJndW1lbnRzCkBAIC0yNDE2LDYgKzIzOTYsMjAgQEAKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigibmFtZSBtdXN0IGJlIGEgc3RyLCBub3QgYSB7IXJ9Ii5mb3JtYXQobmFtZSkpCiAKKyAgICAgICAgaWYgbmFtZVswXSA9PSAnLicgYW5kIG5hbWVbMTpdLmlzZGlnaXQoKToKKyAgICAgICAgICAgICMgVGhlc2UgYXJlIGltcGxpY2l0IGFyZ3VtZW50cyBnZW5lcmF0ZWQgYnkgY29tcHJlaGVuc2lvbnMuIEluCisgICAgICAgICAgICAjIG9yZGVyIHRvIHByb3ZpZGUgYSBmcmllbmRsaWVyIGludGVyZmFjZSB0byB1c2Vycywgd2UgcmVjYXN0CisgICAgICAgICAgICAjIHRoZWlyIG5hbWUgYXMgImltcGxpY2l0TiIgYW5kIHRyZWF0IHRoZW0gYXMgcG9zaXRpb25hbC1vbmx5LgorICAgICAgICAgICAgIyBTZWUgaXNzdWUgMTk2MTEuCisgICAgICAgICAgICBpZiBraW5kICE9IF9QT1NJVElPTkFMX09SX0tFWVdPUkQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0IGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCBpbiBhcyB7fScuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgX1BPU0lUSU9OQUxfT1JfS0VZV09SRAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5fa2luZCA9IF9QT1NJVElPTkFMX09OTFkKKyAgICAgICAgICAgIG5hbWUgPSAnaW1wbGljaXR7fScuZm9ybWF0KG5hbWVbMTpdKQorCiAgICAgICAgIGlmIG5vdCBuYW1lLmlzaWRlbnRpZmllcigpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneyFyfSBpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIgbmFtZScuZm9ybWF0KG5hbWUpKQogCmRpZmYgLS1naXQgYS9MaWIvaXBhZGRyZXNzLnB5IGIvTGliL2lwYWRkcmVzcy5weQppbmRleCAxZjkwMDU4Li4yMGYzM2NiIDEwMDY0NAotLS0gYS9MaWIvaXBhZGRyZXNzLnB5CisrKyBiL0xpYi9pcGFkZHJlc3MucHkKQEAgLTYzNiwxMiArNjM2LDEyIEBACiAgICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgICBpZiBuID49IDA6CiAgICAgICAgICAgICBpZiBuZXR3b3JrICsgbiA+IGJyb2FkY2FzdDoKLSAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MobmV0d29yayArIG4pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuICs9IDEKICAgICAgICAgICAgIGlmIGJyb2FkY2FzdCArIG4gPCBuZXR3b3JrOgotICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkcmVzc19jbGFzcyhicm9hZGNhc3QgKyBuKQogCiAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CmRpZmYgLS1naXQgYS9MaWIvanNvbi9fX2luaXRfXy5weSBiL0xpYi9qc29uL19faW5pdF9fLnB5CmluZGV4IGY3MmIwNTguLmYyYzBkMjMgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL19faW5pdF9fLnB5CisrKyBiL0xpYi9qc29uL19faW5pdF9fLnB5CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBkZWZhdWx0PU5vbmUsCiApCiAKLWRlZiBkdW1wKG9iaiwgZnAsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKK2RlZiBkdW1wKG9iaiwgZnAsICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKICAgICAgICAgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLAogICAgICAgICBkZWZhdWx0PU5vbmUsIHNvcnRfa2V5cz1GYWxzZSwgKiprdyk6CiAgICAgIiIiU2VyaWFsaXplIGBgb2JqYGAgYXMgYSBKU09OIGZvcm1hdHRlZCBzdHJlYW0gdG8gYGBmcGBgIChhCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgZnAud3JpdGUoY2h1bmspCiAKIAotZGVmIGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAorZGVmIGR1bXBzKG9iaiwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAogICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCiAgICAgICAgIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKICAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCB0byBhIEpTT04gZm9ybWF0dGVkIGBgc3RyYGAuCkBAIC0yNDAsNyArMjQwLDcgQEAKIF9kZWZhdWx0X2RlY29kZXIgPSBKU09ORGVjb2RlcihvYmplY3RfaG9vaz1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQogCiAKLWRlZiBsb2FkKGZwLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKK2RlZiBsb2FkKGZwLCAqLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpOgogICAgICIiIkRlc2VyaWFsaXplIGBgZnBgYCAoYSBgYC5yZWFkKClgYC1zdXBwb3J0aW5nIGZpbGUtbGlrZSBvYmplY3QgY29udGFpbmluZwogICAgIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0LgpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgICAgIHBhcnNlX2NvbnN0YW50PXBhcnNlX2NvbnN0YW50LCBvYmplY3RfcGFpcnNfaG9vaz1vYmplY3RfcGFpcnNfaG9vaywgKiprdykKIAogCi1kZWYgbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCitkZWYgbG9hZHMocywgKiwgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCiAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KToKICAgICAiIiJEZXNlcmlhbGl6ZSBgYHNgYCAoYSBgYHN0cmBgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OCiAgICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KZGlmZiAtLWdpdCBhL0xpYi9qc29uL2RlY29kZXIucHkgYi9MaWIvanNvbi9kZWNvZGVyLnB5CmluZGV4IDBmMDNmMjAuLjI0MjJjNmEgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2RlY29kZXIucHkKKysrIGIvTGliL2pzb24vZGVjb2Rlci5weQpAQCAtMjgwLDcgKzI4MCw3IEBACiAKICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAogICAgICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLAogICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSk6CiAgICAgICAgICIiImBgb2JqZWN0X2hvb2tgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQKZGlmZiAtLWdpdCBhL0xpYi9qc29uL2VuY29kZXIucHkgYi9MaWIvanNvbi9lbmNvZGVyLnB5CmluZGV4IGQ1OTY0ODkuLjQxYTQ5N2MgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2VuY29kZXIucHkKKysrIGIvTGliL2pzb24vZW5jb2Rlci5weQpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgIiIiCiAgICAgaXRlbV9zZXBhcmF0b3IgPSAnLCAnCiAgICAga2V5X3NlcGFyYXRvciA9ICc6ICcKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsCiAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLAogICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0b3IgZm9yIEpTT05FbmNvZGVyLCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzLgpAQCAtMTc2LDcgKzE3Niw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT05FbmNvZGVyLmRlZmF1bHQoc2VsZiwgbykKIAogICAgICAgICAiIiIKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKHJlcHIobykgKyAiIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZSIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiT2JqZWN0IG9mIHR5cGUgJyVzJyBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIG8uX19jbGFzc19fLl9fbmFtZV9fKQogCiAgICAgZGVmIGVuY29kZShzZWxmLCBvKToKICAgICAgICAgIiIiUmV0dXJuIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQppbmRleCA0NDUwMmJmLi5iYWJlNmNiIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKQEAgLTEsOCArMSw2IEBACiAiIiJVdGlsaXR5IGZ1bmN0aW9ucywgbm9kZSBjb25zdHJ1Y3Rpb24gbWFjcm9zLCBldGMuIiIiCiAjIEF1dGhvcjogQ29sbGluIFdpbnRlcgogCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCi0KICMgTG9jYWwgaW1wb3J0cwogZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC5weXRyZWUgaW1wb3J0IExlYWYsIE5vZGUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKaW5kZXggOTYzZjk1Mi4uZDM2NTVjOSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKQEAgLTMwLDkgKzMwLDggQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgcHl0cmVlCiBmcm9tIC4uIGltcG9ydCBwYXRjb21wCi1mcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgTFBhcmVuLCBSUGFyZW4sIEFyZ0xpc3QsIERvdAorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIERvdAogZnJvbSAuLiBpbXBvcnQgZml4ZXJfdXRpbAogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKaW5kZXggMmM5YjcyZC4uYWI5MjFlZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKQEAgLTEwLDcgKzEwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi4gaW1wb3J0IHB5dHJlZQogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IENvbW1hLCBOYW1lLCBDYWxsCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5CmluZGV4IDM5MTg4OWYuLmJiNjcxOGMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQpAQCAtMTQsNyArMTQsNiBAQAogIiIiCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExpc3RDb21wLCBpbl9zcGVjaWFsX2NvbnRleHQKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQppbmRleCAxOGM1NjBmLi40Mzk3MDhjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQpAQCAtMzEsNyArMzEsNiBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IHB5dHJlZQotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIHBhcmVudGhlc2l6ZQogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQppbmRleCA0NmM3YWFmLi44ZTM0NDYzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKQEAgLTIwLDcgKzIwLDcgQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLnB5Z3JhbSBpbXBvcnQgdG9rZW4KLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zLCBOb2RlLCBMZWFmCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgc3ltcywgTm9kZSwgTGVhZgogCiAKIGRlZiBoYXNfbWV0YWNsYXNzKHBhcmVudCk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CmluZGV4IGFkOTFhMjkuLmMyMjk1OTYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CkBAIC0zLDcgKzMsNyBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQogCiBjbGFzcyBGaXhOb256ZXJvKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQppbmRleCBhMWZlMmY1Li44NzgwMzIyIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CkBAIC0xOCw3ICsxOCw3IEBACiBmcm9tIC4uIGltcG9ydCBweXRyZWUKIGZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBDb21tYSwgU3RyaW5nLCBpc190dXBsZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIENvbW1hLCBTdHJpbmcKIAogCiBwYXJlbmRfZXhwciA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CmluZGV4IGRiMzQxMDQuLjY3YmY1MWYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKQEAgLTIwLDcgKzIwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCiAKQEAgLTQyLDcgKzQxLDcgQEAKICAgICAgICAgJ05vdEltcGxlbWVudGVkVHlwZScgOiAndHlwZShOb3RJbXBsZW1lbnRlZCknLAogICAgICAgICAnU2xpY2VUeXBlJyA6ICdzbGljZScsCiAgICAgICAgICdTdHJpbmdUeXBlJzogJ2J5dGVzJywgIyBYWFggPwotICAgICAgICAnU3RyaW5nVHlwZXMnIDogJ3N0cicsICMgWFhYID8KKyAgICAgICAgJ1N0cmluZ1R5cGVzJyA6ICcoc3RyLCknLCAjIFhYWCA/CiAgICAgICAgICdUdXBsZVR5cGUnOiAndHVwbGUnLAogICAgICAgICAnVHlwZVR5cGUnIDogJ3R5cGUnLAogICAgICAgICAnVW5pY29kZVR5cGUnOiAnc3RyJywKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CmluZGV4IDE0ODFjZDkuLjVhMzYwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpAQCAtNiw3ICs2LDYgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMuZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IGFsdGVybmF0ZXMsIEZpeEltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IChOYW1lLCBDb21tYSwgRnJvbUltcG9ydCwgTmV3bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9pbmRlbnRhdGlvbiwgTm9kZSwgc3ltcykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQppbmRleCAwNzI4MDgzLi5iNjBiOWRlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQpAQCAtMjYsNyArMjYsNiBAQAogZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlciwgdG9rZW5pemUsIHRva2VuCiBmcm9tIC5maXhlcl91dGlsIGltcG9ydCBmaW5kX3Jvb3QKIGZyb20gLiBpbXBvcnQgcHl0cmVlLCBweWdyYW0KLWZyb20gLiBpbXBvcnQgYnRtX3V0aWxzIGFzIGJ1CiBmcm9tIC4gaW1wb3J0IGJ0bV9tYXRjaGVyIGFzIGJtCiAKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CmluZGV4IGMwYmY3ZjIuLmNmMzFhNTQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKQEAgLTMxOSw3ICszMTksNyBAQAogICAgICAgICBkZWYgZih4KSAtPiBsaXN0OiBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3JldHVybic6IGxpc3R9KQogCi0gICAgICAgICMgdGVzdCBNQUtFX0NMT1NVUkUgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncworICAgICAgICAjIHRlc3QgY2xvc3VyZXMgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncwogICAgICAgICBjbG9zdXJlID0gMQogICAgICAgICBkZWYgZigpOiByZXR1cm4gY2xvc3VyZQogICAgICAgICBkZWYgZih4PTEpOiByZXR1cm4gY2xvc3VyZQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKaW5kZXggNmYyZDIxNC4uNzE1M2JiNiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0zLDEwICszLDggQEAKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCi1pbXBvcnQgcmUKIGZyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAogCiAjIExvY2FsIGltcG9ydHMKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQppbmRleCAxNTA3OWZlLi5jMDUwN2NmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CkBAIC0xMCw3ICsxMCw2IEBACiBpbXBvcnQgdGVzdC5zdXBwb3J0CiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSBsaWIydG8zIGltcG9ydCByZWZhY3RvcgogZnJvbSAuIGltcG9ydCBzdXBwb3J0CiAKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQppbmRleCAwNmIwMDMzLi5iOTdiNzNhIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMiwxMiArMiwxMSBAQAogCiAjIFB5dGhvbiBpbXBvcnRzCiBpbXBvcnQgb3MKLWltcG9ydCB1bml0dGVzdAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSBsaWIydG8zIGltcG9ydCBweWdyYW0sIHB5dHJlZSwgcmVmYWN0b3IsIGZpeGVyX3V0aWwKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHlncmFtLCBmaXhlcl91dGlsCiBmcm9tIGxpYjJ0bzMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIAogCkBAIC0zMzIyLDYgKzMzMjEsMTAgQEAKICAgICAgICAgYSA9ICIiInR5cGUoTm9uZSkiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCisgICAgICAgIGIgPSAidHlwZXMuU3RyaW5nVHlwZXMiCisgICAgICAgIGEgPSAiKHN0ciwpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKIGNsYXNzIFRlc3RfaWRpb21zKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gImlkaW9tcyIKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQppbmRleCBiNTMzYzAxLi4zNmViMTc2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQpAQCAtMTAsMTIgKzEwLDExIEBACiAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKLWZyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlciwgdGVzdF9kaXIKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlcgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHN1YnByb2Nlc3MKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKaW5kZXggNGQ1ODVhOC4uYTYxMWQxNyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKQEAgLTExLDkgKzExLDYgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAogCi1pbXBvcnQgc3lzCi1pbXBvcnQgd2FybmluZ3MKLQogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQppbmRleCA4NTYzMDAxLi45NGRjMTM1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKQEAgLTcsMTkgKzcsMTUgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IGNvZGVjcwotaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgaW8KIGltcG9ydCByZQogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IHJlZmFjdG9yLCBweWdyYW0sIGZpeGVyX2Jhc2UKIGZyb20gbGliMnRvMy5wZ2VuMiBpbXBvcnQgdG9rZW4KIAotZnJvbSAuIGltcG9ydCBzdXBwb3J0Ci0KIAogVEVTVF9EQVRBX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YSIpCiBGSVhFUl9ESVIgPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImZpeGVycyIpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKaW5kZXggZDJiZTgyYy4uYzZjNjEzOSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMyw5ICszLDYgQEAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKIAotIyBQeXRob24gaW1wb3J0cwotaW1wb3J0IG9zLnBhdGgKLQogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMucHl0cmVlIGltcG9ydCBOb2RlLCBMZWFmCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX3V0aWwKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IDZkNTljZDguLjRkZTAwOTAgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtMzAyLDEyICszMDIsMTYgQEAKIAogZGVmIGRlbG9jYWxpemUoc3RyaW5nKToKICAgICAiUGFyc2VzIGEgc3RyaW5nIGFzIGEgbm9ybWFsaXplZCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorCisgICAgY29udiA9IGxvY2FsZWNvbnYoKQorCiAgICAgI0ZpcnN0LCBnZXQgcmlkIG9mIHRoZSBncm91cGluZwotICAgIHRzID0gbG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKyAgICB0cyA9IGNvbnZbJ3Rob3VzYW5kc19zZXAnXQogICAgIGlmIHRzOgogICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSh0cywgJycpCisKICAgICAjbmV4dCwgcmVwbGFjZSB0aGUgZGVjaW1hbCBwb2ludCB3aXRoIGEgZG90Ci0gICAgZGQgPSBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGRkID0gY29udlsnZGVjaW1hbF9wb2ludCddCiAgICAgaWYgZGQ6CiAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGRkLCAnLicpCiAgICAgcmV0dXJuIHN0cmluZwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQppbmRleCAyMjc0NGUxLi4yNTkwZDY1IDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQorKysgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQpAQCAtMzMsOCArMzMsOSBAQAogICAgICAgICAgICAnU3RyZWFtSGFuZGxlcicsICdXQVJOJywgJ1dBUk5JTkcnLCAnYWRkTGV2ZWxOYW1lJywgJ2Jhc2ljQ29uZmlnJywKICAgICAgICAgICAgJ2NhcHR1cmVXYXJuaW5ncycsICdjcml0aWNhbCcsICdkZWJ1ZycsICdkaXNhYmxlJywgJ2Vycm9yJywKICAgICAgICAgICAgJ2V4Y2VwdGlvbicsICdmYXRhbCcsICdnZXRMZXZlbE5hbWUnLCAnZ2V0TG9nZ2VyJywgJ2dldExvZ2dlckNsYXNzJywKLSAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnd2FybicsICd3YXJuaW5nJywKLSAgICAgICAgICAgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsICdsYXN0UmVzb3J0J10KKyAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnc2h1dGRvd24nLAorICAgICAgICAgICAnd2FybicsICd3YXJuaW5nJywgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsCisgICAgICAgICAgICdsYXN0UmVzb3J0JywgJ3JhaXNlRXhjZXB0aW9ucyddCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCkBAIC0xMDcsNiArMTA4LDcgQEAKIH0KIF9uYW1lVG9MZXZlbCA9IHsKICAgICAnQ1JJVElDQUwnOiBDUklUSUNBTCwKKyAgICAnRkFUQUwnOiBGQVRBTCwKICAgICAnRVJST1InOiBFUlJPUiwKICAgICAnV0FSTic6IFdBUk5JTkcsCiAgICAgJ1dBUk5JTkcnOiBXQVJOSU5HLApAQCAtOTM1LDYgKzkzNywxMCBAQAogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBkZWwgdCwgdiwgdGIKIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgbGV2ZWwgPSBnZXRMZXZlbE5hbWUoc2VsZi5sZXZlbCkKKyAgICAgICAgcmV0dXJuICc8JXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBsZXZlbCkKKwogY2xhc3MgU3RyZWFtSGFuZGxlcihIYW5kbGVyKToKICAgICAiIiIKICAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIGxvZ2dpbmcgcmVjb3JkcywgYXBwcm9wcmlhdGVseSBmb3JtYXR0ZWQsCkBAIC05ODYsNiArOTkyLDE0IEBACiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgbGV2ZWwgPSBnZXRMZXZlbE5hbWUoc2VsZi5sZXZlbCkKKyAgICAgICAgbmFtZSA9IGdldGF0dHIoc2VsZi5zdHJlYW0sICduYW1lJywgJycpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBuYW1lICs9ICcgJworICAgICAgICByZXR1cm4gJzwlcyAlcyglcyk+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbmFtZSwgbGV2ZWwpCisKKwogY2xhc3MgRmlsZUhhbmRsZXIoU3RyZWFtSGFuZGxlcik6CiAgICAgIiIiCiAgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHdyaXRlcyBmb3JtYXR0ZWQgbG9nZ2luZyByZWNvcmRzIHRvIGRpc2sgZmlsZXMuCkBAIC05OTQsNiArMTAwOCw4IEBACiAgICAgICAgICIiIgogICAgICAgICBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgdXNlIGl0IGFzIHRoZSBzdHJlYW0gZm9yIGxvZ2dpbmcuCiAgICAgICAgICIiIgorICAgICAgICAjIElzc3VlICMyNzQ5MzogYWRkIHN1cHBvcnQgZm9yIFBhdGggb2JqZWN0cyB0byBiZSBwYXNzZWQgaW4KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5mc3BhdGgoZmlsZW5hbWUpCiAgICAgICAgICNrZWVwIHRoZSBhYnNvbHV0ZSBwYXRoLCBvdGhlcndpc2UgZGVyaXZlZCBjbGFzc2VzIHdoaWNoIHVzZSB0aGlzCiAgICAgICAgICNtYXkgY29tZSBhIGNyb3BwZXIgd2hlbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgY2hhbmdlcwogICAgICAgICBzZWxmLmJhc2VGaWxlbmFtZSA9IG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkKQEAgLTEwNDgsNiArMTA2NCwxMSBAQAogICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKICAgICAgICAgU3RyZWFtSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgbGV2ZWwgPSBnZXRMZXZlbE5hbWUoc2VsZi5sZXZlbCkKKyAgICAgICAgcmV0dXJuICc8JXMgJXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLmJhc2VGaWxlbmFtZSwgbGV2ZWwpCisKKwogY2xhc3MgX1N0ZGVyckhhbmRsZXIoU3RyZWFtSGFuZGxlcik6CiAgICAgIiIiCiAgICAgVGhpcyBjbGFzcyBpcyBsaWtlIGEgU3RyZWFtSGFuZGxlciB1c2luZyBzeXMuc3RkZXJyLCBidXQgYWx3YXlzIHVzZXMKQEAgLTE1NDAsNiArMTU2MSwxMSBAQAogICAgICAgICAgICAgc3VmZml4ID0gJy4nLmpvaW4oKHNlbGYubmFtZSwgc3VmZml4KSkKICAgICAgICAgcmV0dXJuIHNlbGYubWFuYWdlci5nZXRMb2dnZXIoc3VmZml4KQogCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBsZXZlbCA9IGdldExldmVsTmFtZShzZWxmLmdldEVmZmVjdGl2ZUxldmVsKCkpCisgICAgICAgIHJldHVybiAnPCVzICVzICglcyk+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lLCBsZXZlbCkKKworCiBjbGFzcyBSb290TG9nZ2VyKExvZ2dlcik6CiAgICAgIiIiCiAgICAgQSByb290IGxvZ2dlciBpcyBub3QgdGhhdCBkaWZmZXJlbnQgdG8gYW55IG90aGVyIGxvZ2dlciwgZXhjZXB0IHRoYXQKQEAgLTE2NjYsNiArMTY5MiwxMSBAQAogICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIHNlbGYubG9nZ2VyLmhhc0hhbmRsZXJzKCkKIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgbG9nZ2VyID0gc2VsZi5sb2dnZXIKKyAgICAgICAgbGV2ZWwgPSBnZXRMZXZlbE5hbWUobG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkpCisgICAgICAgIHJldHVybiAnPCVzICVzICglcyk+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbG9nZ2VyLm5hbWUsIGxldmVsKQorCiByb290ID0gUm9vdExvZ2dlcihXQVJOSU5HKQogTG9nZ2VyLnJvb3QgPSByb290CiBMb2dnZXIubWFuYWdlciA9IE1hbmFnZXIoTG9nZ2VyLnJvb3QpCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weSBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CmluZGV4IGM5ZjgyMTcuLmJhMDBhNjkgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CisrKyBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAwMS0yMDE2IGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApAQCAtMTgsNyArMTgsNyBAQAogQWRkaXRpb25hbCBoYW5kbGVycyBmb3IgdGhlIGxvZ2dpbmcgcGFja2FnZSBmb3IgUHl0aG9uLiBUaGUgY29yZSBwYWNrYWdlIGlzCiBiYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluIGNvbXAubGFuZy5weXRob24uCiAKLUNvcHlyaWdodCAoQykgMjAwMS0yMDE1IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIFRvIHVzZSwgc2ltcGx5ICdpbXBvcnQgbG9nZ2luZy5oYW5kbGVycycgYW5kIGxvZyBhd2F5IQogIiIiCkBAIC0yNDYsNiArMjQ2LDkgQEAKIAogICAgICAgICBzZWxmLmV4dE1hdGNoID0gcmUuY29tcGlsZShzZWxmLmV4dE1hdGNoLCByZS5BU0NJSSkKICAgICAgICAgc2VsZi5pbnRlcnZhbCA9IHNlbGYuaW50ZXJ2YWwgKiBpbnRlcnZhbCAjIG11bHRpcGx5IGJ5IHVuaXRzIHJlcXVlc3RlZAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgbGluZSBhZGRlZCBiZWNhdXNlIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4gY291bGQgYmUgYQorICAgICAgICAjIHBhdGggb2JqZWN0IChzZWUgSXNzdWUgIzI3NDkzKSwgYnV0IHNlbGYuYmFzZUZpbGVuYW1lIHdpbGwgYmUgYSBzdHJpbmcKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmJhc2VGaWxlbmFtZQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgICB0ID0gb3Muc3RhdChmaWxlbmFtZSlbU1RfTVRJTUVdCiAgICAgICAgIGVsc2U6CkBAIC00NDAsMTEgKzQ0MywxMSBAQAogICAgICAgICAgICAgc3JlcyA9IG9zLmZzdGF0KHNlbGYuc3RyZWFtLmZpbGVubygpKQogICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3Jlc1tTVF9ERVZdLCBzcmVzW1NUX0lOT10KIAotICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgZGVmIHJlb3BlbklmTmVlZGVkKHNlbGYpOgogICAgICAgICAiIiIKLSAgICAgICAgRW1pdCBhIHJlY29yZC4KKyAgICAgICAgUmVvcGVuIGxvZyBmaWxlIGlmIG5lZWRlZC4KIAotICAgICAgICBGaXJzdCBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKKyAgICAgICAgQ2hlY2tzIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAogICAgICAgICBoYXMsIGNsb3NlIHRoZSBvbGQgc3RyZWFtIGFuZCByZW9wZW4gdGhlIGZpbGUgdG8gZ2V0IHRoZQogICAgICAgICBjdXJyZW50IHN0cmVhbS4KICAgICAgICAgIiIiCkBAIC00NjcsNiArNDcwLDE1IEBACiAgICAgICAgICAgICAgICAgIyBvcGVuIGEgbmV3IGZpbGUgaGFuZGxlIGFuZCBnZXQgbmV3IHN0YXQgaW5mbyBmcm9tIHRoYXQgZmQKICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCByZW9wZW4gdGhlIGZpbGUgYmVmb3JlIGVtaXR0aW5nIHRoZQorICAgICAgICByZWNvcmQgdG8gaXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlb3BlbklmTmVlZGVkKCkKICAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKIAogCkBAIC0xMjI5LDE3ICsxMjQxLDI1IEBACiAgICAgZmx1c2hpbmcgdGhlbSB0byBhIHRhcmdldCBoYW5kbGVyLiBGbHVzaGluZyBvY2N1cnMgd2hlbmV2ZXIgdGhlIGJ1ZmZlcgogICAgIGlzIGZ1bGwsIG9yIHdoZW4gYW4gZXZlbnQgb2YgYSBjZXJ0YWluIHNldmVyaXR5IG9yIGdyZWF0ZXIgaXMgc2Vlbi4KICAgICAiIiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgY2FwYWNpdHksIGZsdXNoTGV2ZWw9bG9nZ2luZy5FUlJPUiwgdGFyZ2V0PU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXBhY2l0eSwgZmx1c2hMZXZlbD1sb2dnaW5nLkVSUk9SLCB0YXJnZXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmx1c2hPbkNsb3NlPVRydWUpOgogICAgICAgICAiIiIKICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgaGFuZGxlciB3aXRoIHRoZSBidWZmZXIgc2l6ZSwgdGhlIGxldmVsIGF0IHdoaWNoCiAgICAgICAgIGZsdXNoaW5nIHNob3VsZCBvY2N1ciBhbmQgYW4gb3B0aW9uYWwgdGFyZ2V0LgogCiAgICAgICAgIE5vdGUgdGhhdCB3aXRob3V0IGEgdGFyZ2V0IGJlaW5nIHNldCBlaXRoZXIgaGVyZSBvciB2aWEgc2V0VGFyZ2V0KCksCiAgICAgICAgIGEgTWVtb3J5SGFuZGxlciBpcyBubyB1c2UgdG8gYW55b25lIQorCisgICAgICAgIFRoZSBgYGZsdXNoT25DbG9zZWBgIGFyZ3VtZW50IGlzIGBgVHJ1ZWBgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIHJlYXNvbnMgLSB0aGUgb2xkIGJlaGF2aW91ciBpcyB0aGF0IHdoZW4gdGhlIGhhbmRsZXIgaXMgY2xvc2VkLCB0aGUKKyAgICAgICAgYnVmZmVyIGlzIGZsdXNoZWQsIGV2ZW4gaWYgdGhlIGZsdXNoIGxldmVsIGhhc24ndCBiZWVuIGV4Y2VlZGVkIG5vciB0aGUKKyAgICAgICAgY2FwYWNpdHkgZXhjZWVkZWQuIFRvIHByZXZlbnQgdGhpcywgc2V0IGBgZmx1c2hPbkNsb3NlYGAgdG8gYGBGYWxzZWBgLgogICAgICAgICAiIiIKICAgICAgICAgQnVmZmVyaW5nSGFuZGxlci5fX2luaXRfXyhzZWxmLCBjYXBhY2l0eSkKICAgICAgICAgc2VsZi5mbHVzaExldmVsID0gZmx1c2hMZXZlbAogICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorICAgICAgICAjIFNlZSBJc3N1ZSAjMjY1NTkgZm9yIHdoeSB0aGlzIGhhcyBiZWVuIGFkZGVkCisgICAgICAgIHNlbGYuZmx1c2hPbkNsb3NlID0gZmx1c2hPbkNsb3NlCiAKICAgICBkZWYgc2hvdWxkRmx1c2goc2VsZiwgcmVjb3JkKToKICAgICAgICAgIiIiCkBAIC0xMjczLDEwICsxMjkzLDEyIEBACiAKICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICIiIgotICAgICAgICBGbHVzaCwgc2V0IHRoZSB0YXJnZXQgdG8gTm9uZSBhbmQgbG9zZSB0aGUgYnVmZmVyLgorICAgICAgICBGbHVzaCwgaWYgYXBwcm9wcmlhdGVseSBjb25maWd1cmVkLCBzZXQgdGhlIHRhcmdldCB0byBOb25lIGFuZCBsb3NlIHRoZQorICAgICAgICBidWZmZXIuCiAgICAgICAgICIiIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgICAgIGlmIHNlbGYuZmx1c2hPbkNsb3NlOgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5hY3F1aXJlKCkKICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9tYWlsYm94LnB5IGIvTGliL21haWxib3gucHkKaW5kZXggMDI3MGUyNS4uMGUyMzk4NyAxMDA2NDQKLS0tIGEvTGliL21haWxib3gucHkKKysrIGIvTGliL21haWxib3gucHkKQEAgLTIzLDkgKzIzLDEwIEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgZmNudGwgPSBOb25lCiAKLV9fYWxsX18gPSBbICdNYWlsYm94JywgJ01haWxkaXInLCAnbWJveCcsICdNSCcsICdCYWJ5bCcsICdNTURGJywKLSAgICAgICAgICAgICdNZXNzYWdlJywgJ01haWxkaXJNZXNzYWdlJywgJ21ib3hNZXNzYWdlJywgJ01ITWVzc2FnZScsCi0gICAgICAgICAgICAnQmFieWxNZXNzYWdlJywgJ01NREZNZXNzYWdlJ10KK19fYWxsX18gPSBbJ01haWxib3gnLCAnTWFpbGRpcicsICdtYm94JywgJ01IJywgJ0JhYnlsJywgJ01NREYnLAorICAgICAgICAgICAnTWVzc2FnZScsICdNYWlsZGlyTWVzc2FnZScsICdtYm94TWVzc2FnZScsICdNSE1lc3NhZ2UnLAorICAgICAgICAgICAnQmFieWxNZXNzYWdlJywgJ01NREZNZXNzYWdlJywgJ0Vycm9yJywgJ05vU3VjaE1haWxib3hFcnJvcicsCisgICAgICAgICAgICdOb3RFbXB0eUVycm9yJywgJ0V4dGVybmFsQ2xhc2hFcnJvcicsICdGb3JtYXRFcnJvciddCiAKIGxpbmVzZXAgPSBvcy5saW5lc2VwLmVuY29kZSgnYXNjaWknKQogCmRpZmYgLS1naXQgYS9MaWIvbWltZXR5cGVzLnB5IGIvTGliL21pbWV0eXBlcy5weQppbmRleCAwYmU3NmFkLi45YTg4NjgwIDEwMDY0NAotLS0gYS9MaWIvbWltZXR5cGVzLnB5CisrKyBiL0xpYi9taW1ldHlwZXMucHkKQEAgLTMzLDggKzMzLDEwIEBACiAgICAgX3dpbnJlZyA9IE5vbmUKIAogX19hbGxfXyA9IFsKLSAgICAiZ3Vlc3NfdHlwZSIsImd1ZXNzX2V4dGVuc2lvbiIsImd1ZXNzX2FsbF9leHRlbnNpb25zIiwKLSAgICAiYWRkX3R5cGUiLCJyZWFkX21pbWVfdHlwZXMiLCJpbml0IgorICAgICJrbm93bmZpbGVzIiwgImluaXRlZCIsICJNaW1lVHlwZXMiLAorICAgICJndWVzc190eXBlIiwgImd1ZXNzX2FsbF9leHRlbnNpb25zIiwgImd1ZXNzX2V4dGVuc2lvbiIsCisgICAgImFkZF90eXBlIiwgImluaXQiLCAicmVhZF9taW1lX3R5cGVzIiwKKyAgICAic3VmZml4X21hcCIsICJlbmNvZGluZ3NfbWFwIiwgInR5cGVzX21hcCIsICJjb21tb25fdHlwZXMiCiBdCiAKIGtub3duZmlsZXMgPSBbCmRpZmYgLS1naXQgYS9MaWIvbW9kdWxlZmluZGVyLnB5IGIvTGliL21vZHVsZWZpbmRlci5weQppbmRleCA4MTAzNTAyLi5lMjIwMzE1IDEwMDY0NAotLS0gYS9MaWIvbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi9tb2R1bGVmaW5kZXIucHkKQEAgLTEwLDcgKzEwLDcgQEAKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB3YXJuaW5ncwogd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICBpbXBvcnQgaW1wCiAKIExPQURfQ09OU1QgPSBkaXMub3BtYXBbJ0xPQURfQ09OU1QnXQpAQCAtMzM2LDggKzMzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG5hbWUgKyAiLiIgKyBzdWIKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FkZF9iYWRtb2R1bGUoZnVsbG5hbWUsIGNhbGxlcikKIAotICAgIGRlZiBzY2FuX29wY29kZXNfMjUoc2VsZiwgY28sCi0gICAgICAgICAgICAgICAgICAgICB1bnBhY2sgPSBzdHJ1Y3QudW5wYWNrKToKKyAgICBkZWYgc2Nhbl9vcGNvZGVzKHNlbGYsIGNvKToKICAgICAgICAgIyBTY2FuIHRoZSBjb2RlLCBhbmQgeWllbGQgJ2ludGVyZXN0aW5nJyBvcGNvZGUgY29tYmluYXRpb25zCiAgICAgICAgIGNvZGUgPSBjby5jb19jb2RlCiAgICAgICAgIG5hbWVzID0gY28uY29fbmFtZXMKQEAgLTM2MCw3ICszNTksNyBAQAogCiAgICAgZGVmIHNjYW5fY29kZShzZWxmLCBjbywgbSk6CiAgICAgICAgIGNvZGUgPSBjby5jb19jb2RlCi0gICAgICAgIHNjYW5uZXIgPSBzZWxmLnNjYW5fb3Bjb2Rlc18yNQorICAgICAgICBzY2FubmVyID0gc2VsZi5zY2FuX29wY29kZXMKICAgICAgICAgZm9yIHdoYXQsIGFyZ3MgaW4gc2Nhbm5lcihjbyk6CiAgICAgICAgICAgICBpZiB3aGF0ID09ICJzdG9yZSI6CiAgICAgICAgICAgICAgICAgbmFtZSwgPSBhcmdzCmRpZmYgLS1naXQgYS9MaWIvbXNpbGliL19faW5pdF9fLnB5IGIvTGliL21zaWxpYi9fX2luaXRfXy5weQppbmRleCA2ZDBhMjhmLi44MjM2NDRhIDEwMDY0NAotLS0gYS9MaWIvbXNpbGliL19faW5pdF9fLnB5CisrKyBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKQEAgLTEsNyArMSw3IEBACiAjIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gdi4gTMO2d2lzCiAjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KIGZyb20gX21zaSBpbXBvcnQgKgotaW1wb3J0IGdsb2IKK2ltcG9ydCBmbm1hdGNoCiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHN0cmluZwpAQCAtMzc5LDcgKzM3OSwxMyBAQAogICAgIGRlZiBnbG9iKHNlbGYsIHBhdHRlcm4sIGV4Y2x1ZGUgPSBOb25lKToKICAgICAgICAgIiIiQWRkIGEgbGlzdCBvZiBmaWxlcyB0byB0aGUgY3VycmVudCBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIHRoZQogICAgICAgICBnbG9iIHBhdHRlcm4uIEluZGl2aWR1YWwgZmlsZXMgY2FuIGJlIGV4Y2x1ZGVkIGluIHRoZSBleGNsdWRlIGxpc3QuIiIiCi0gICAgICAgIGZpbGVzID0gZ2xvYi5nbG9iMShzZWxmLmFic29sdXRlLCBwYXR0ZXJuKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoc2VsZi5hYnNvbHV0ZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaWYgcGF0dGVybls6MV0gIT0gJy4nOgorICAgICAgICAgICAgZmlsZXMgPSAoZiBmb3IgZiBpbiBmaWxlcyBpZiBmWzBdICE9ICcuJykKKyAgICAgICAgZmlsZXMgPSBmbm1hdGNoLmZpbHRlcihmaWxlcywgcGF0dGVybikKICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBleGNsdWRlIGFuZCBmIGluIGV4Y2x1ZGU6IGNvbnRpbnVlCiAgICAgICAgICAgICBzZWxmLmFkZF9maWxlKGYpCmRpZmYgLS1naXQgYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKaW5kZXggNmQyNTQ2OS4uZmZkZjQyNiAxMDA2NDQKLS0tIGEvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CisrKyBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQpAQCAtNjM4LDIyICs2MzgsMjYgQEAKICAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0ID0gbGVuZ3RoLy9jaHVua3NpemUgKyBib29sKGxlbmd0aCAlIGNodW5rc2l6ZSkKIAogICAgIGRlZiBfc2V0KHNlbGYsIGksIHN1Y2Nlc3NfcmVzdWx0KToKKyAgICAgICAgc2VsZi5fbnVtYmVyX2xlZnQgLT0gMQogICAgICAgICBzdWNjZXNzLCByZXN1bHQgPSBzdWNjZXNzX3Jlc3VsdAotICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICBpZiBzdWNjZXNzIGFuZCBzZWxmLl9zdWNjZXNzOgogICAgICAgICAgICAgc2VsZi5fdmFsdWVbaSpzZWxmLl9jaHVua3NpemU6KGkrMSkqc2VsZi5fY2h1bmtzaXplXSA9IHJlc3VsdAotICAgICAgICAgICAgc2VsZi5fbnVtYmVyX2xlZnQgLT0gMQogICAgICAgICAgICAgaWYgc2VsZi5fbnVtYmVyX2xlZnQgPT0gMDoKICAgICAgICAgICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FsbGJhY2soc2VsZi5fdmFsdWUpCiAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KICAgICAgICAgICAgICAgICBzZWxmLl9ldmVudC5zZXQoKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5fc3VjY2VzcyA9IEZhbHNlCi0gICAgICAgICAgICBzZWxmLl92YWx1ZSA9IHJlc3VsdAotICAgICAgICAgICAgaWYgc2VsZi5fZXJyb3JfY2FsbGJhY2s6Ci0gICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JfY2FsbGJhY2soc2VsZi5fdmFsdWUpCi0gICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQotICAgICAgICAgICAgc2VsZi5fZXZlbnQuc2V0KCkKKyAgICAgICAgICAgIGlmIG5vdCBzdWNjZXNzIGFuZCBzZWxmLl9zdWNjZXNzOgorICAgICAgICAgICAgICAgICMgb25seSBzdG9yZSBmaXJzdCBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBzZWxmLl9zdWNjZXNzID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IHJlc3VsdAorICAgICAgICAgICAgaWYgc2VsZi5fbnVtYmVyX2xlZnQgPT0gMDoKKyAgICAgICAgICAgICAgICAjIG9ubHkgY29uc2lkZXIgdGhlIHJlc3VsdCByZWFkeSBvbmNlIGFsbCBqb2JzIGFyZSBkb25lCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZXJyb3JfY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisgICAgICAgICAgICAgICAgc2VsZi5fZXZlbnQuc2V0KCkKIAogIwogIyBDbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGJ5IGBQb29sLmltYXAoKWAKZGlmZiAtLWdpdCBhL0xpYi9udHBhdGgucHkgYi9MaWIvbnRwYXRoLnB5CmluZGV4IGFmNmE3MDkuLmE4ZjRiMzcgMTAwNjQ0Ci0tLSBhL0xpYi9udHBhdGgucHkKKysrIGIvTGliL250cGF0aC5weQpAQCAtMjgsOCArMjgsNiBAQAogcGF0aHNlcCA9ICc7JwogYWx0c2VwID0gJy8nCiBkZWZwYXRoID0gJy47QzpcXGJpbicKLWlmICdjZScgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotICAgIGRlZnBhdGggPSAnXFxXaW5kb3dzJwogZGV2bnVsbCA9ICdudWwnCiAKIGRlZiBfZ2V0X2JvdGhzZXBzKHBhdGgpOgpAQCAtNDYsNiArNDQsNyBAQAogICAgICIiIk5vcm1hbGl6ZSBjYXNlIG9mIHBhdGhuYW1lLgogCiAgICAgTWFrZXMgYWxsIGNoYXJhY3RlcnMgbG93ZXJjYXNlIGFuZCBhbGwgc2xhc2hlcyBpbnRvIGJhY2tzbGFzaGVzLiIiIgorICAgIHMgPSBvcy5mc3BhdGgocykKICAgICB0cnk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UocywgYnl0ZXMpOgogICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZShiJy8nLCBiJ1xcJykubG93ZXIoKQpAQCAtNjYsMTIgKzY1LDE0IEBACiAKIGRlZiBpc2FicyhzKToKICAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGFic29sdXRlIiIiCisgICAgcyA9IG9zLmZzcGF0aChzKQogICAgIHMgPSBzcGxpdGRyaXZlKHMpWzFdCiAgICAgcmV0dXJuIGxlbihzKSA+IDAgYW5kIHNbMF0gaW4gX2dldF9ib3Roc2VwcyhzKQogCiAKICMgSm9pbiB0d28gKG9yIG1vcmUpIHBhdGhzLgogZGVmIGpvaW4ocGF0aCwgKnBhdGhzKToKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIHNlcCA9IGInXFwnCiAgICAgICAgIHNlcHMgPSBiJ1xcLycKQEAgLTg0LDcgKzg1LDcgQEAKICAgICAgICAgaWYgbm90IHBhdGhzOgogICAgICAgICAgICAgcGF0aFs6MF0gKyBzZXAgICMyMzc4MDogRW5zdXJlIGNvbXBhdGlibGUgZGF0YSB0eXBlIGV2ZW4gaWYgcCBpcyBudWxsLgogICAgICAgICByZXN1bHRfZHJpdmUsIHJlc3VsdF9wYXRoID0gc3BsaXRkcml2ZShwYXRoKQotICAgICAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgZm9yIHAgaW4gbWFwKG9zLmZzcGF0aCwgcGF0aHMpOgogICAgICAgICAgICAgcF9kcml2ZSwgcF9wYXRoID0gc3BsaXRkcml2ZShwKQogICAgICAgICAgICAgaWYgcF9wYXRoIGFuZCBwX3BhdGhbMF0gaW4gc2VwczoKICAgICAgICAgICAgICAgICAjIFNlY29uZCBwYXRoIGlzIGFic29sdXRlCkBAIC0xMzYsNiArMTM3LDcgQEAKICAgICBQYXRocyBjYW5ub3QgY29udGFpbiBib3RoIGEgZHJpdmUgbGV0dGVyIGFuZCBhIFVOQyBwYXRoLgogCiAgICAgIiIiCisgICAgcCA9IG9zLmZzcGF0aChwKQogICAgIGlmIGxlbihwKSA+PSAyOgogICAgICAgICBpZiBpc2luc3RhbmNlKHAsIGJ5dGVzKToKICAgICAgICAgICAgIHNlcCA9IGInXFwnCkBAIC0xOTksNyArMjAxLDcgQEAKIAogICAgIFJldHVybiB0dXBsZSAoaGVhZCwgdGFpbCkgd2hlcmUgdGFpbCBpcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaW5hbCBzbGFzaC4KICAgICBFaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCi0KKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgc2VwcyA9IF9nZXRfYm90aHNlcHMocCkKICAgICBkLCBwID0gc3BsaXRkcml2ZShwKQogICAgICMgc2V0IGkgdG8gaW5kZXggYmV5b25kIHAncyBsYXN0IHNsYXNoCkBAIC0yMTgsNiArMjIwLDcgQEAKICMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCiAKIGRlZiBzcGxpdGV4dChwKToKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgaWYgaXNpbnN0YW5jZShwLCBieXRlcyk6CiAgICAgICAgIHJldHVybiBnZW5lcmljcGF0aC5fc3BsaXRleHQocCwgYidcXCcsIGInLycsIGInLicpCiAgICAgZWxzZToKQEAgLTI3OCw2ICsyODEsNyBAQAogZGVmIGlzbW91bnQocGF0aCk6CiAgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIG1vdW50IHBvaW50IChhIGRyaXZlIHJvb3QsIHRoZSByb290IG9mIGEKICAgICBzaGFyZSwgb3IgYSBtb3VudGVkIHZvbHVtZSkiIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgc2VwcyA9IF9nZXRfYm90aHNlcHMocGF0aCkKICAgICBwYXRoID0gYWJzcGF0aChwYXRoKQogICAgIHJvb3QsIHJlc3QgPSBzcGxpdGRyaXZlKHBhdGgpCkBAIC0zMDUsNiArMzA5LDcgQEAKICAgICAiIiJFeHBhbmQgfiBhbmQgfnVzZXIgY29uc3RydWN0cy4KIAogICAgIElmIHVzZXIgb3IgJEhPTUUgaXMgdW5rbm93biwgZG8gbm90aGluZy4iIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIHRpbGRlID0gYid+JwogICAgIGVsc2U6CkBAIC0zNTQsNiArMzU5LDcgQEAKICAgICAiIiJFeHBhbmQgc2hlbGwgdmFyaWFibGVzIG9mIHRoZSBmb3JtcyAkdmFyLCAke3Zhcn0gYW5kICV2YXIlLgogCiAgICAgVW5rbm93biB2YXJpYWJsZXMgYXJlIGxlZnQgdW5jaGFuZ2VkLiIiIgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgaWYgYickJyBub3QgaW4gcGF0aCBhbmQgYiclJyBub3QgaW4gcGF0aDoKICAgICAgICAgICAgIHJldHVybiBwYXRoCkBAIC00NjQsNiArNDcwLDcgQEAKIAogZGVmIG5vcm1wYXRoKHBhdGgpOgogICAgICIiIk5vcm1hbGl6ZSBwYXRoLCBlbGltaW5hdGluZyBkb3VibGUgc2xhc2hlcywgZXRjLiIiIgorICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgc2VwID0gYidcXCcKICAgICAgICAgYWx0c2VwID0gYicvJwpAQCAtNTE4LDYgKzUyNSw3IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6ICMgbm90IHJ1bm5pbmcgb24gV2luZG93cyAtIG1vY2sgdXAgc29tZXRoaW5nIHNlbnNpYmxlCiAgICAgZGVmIGFic3BhdGgocGF0aCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgdmVyc2lvbiBvZiBhIHBhdGguIiIiCisgICAgICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkYigpCkBAIC01MzEsNiArNTM5LDcgQEAKICAgICAgICAgIiIiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2ZXJzaW9uIG9mIGEgcGF0aC4iIiIKIAogICAgICAgICBpZiBwYXRoOiAjIEVtcHR5IHBhdGggbXVzdCByZXR1cm4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHBhdGggPSBvcy5mc3BhdGgocGF0aCkKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBwYXRoID0gX2dldGZ1bGxwYXRobmFtZShwYXRoKQogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CkBAIC01NDksNiArNTU4LDcgQEAKIAogZGVmIHJlbHBhdGgocGF0aCwgc3RhcnQ9Tm9uZSk6CiAgICAgIiIiUmV0dXJuIGEgcmVsYXRpdmUgdmVyc2lvbiBvZiBhIHBhdGgiIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIHNlcCA9IGInXFwnCiAgICAgICAgIGN1cmRpciA9IGInLicKQEAgLTU2NCw2ICs1NzQsNyBAQAogICAgIGlmIG5vdCBwYXRoOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBwYXRoIHNwZWNpZmllZCIpCiAKKyAgICBzdGFydCA9IG9zLmZzcGF0aChzdGFydCkKICAgICB0cnk6CiAgICAgICAgIHN0YXJ0X2FicyA9IGFic3BhdGgobm9ybXBhdGgoc3RhcnQpKQogICAgICAgICBwYXRoX2FicyA9IGFic3BhdGgobm9ybXBhdGgocGF0aCkpCkBAIC02MDcsNiArNjE4LDcgQEAKICAgICBpZiBub3QgcGF0aHM6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NvbW1vbnBhdGgoKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2UnKQogCisgICAgcGF0aHMgPSB0dXBsZShtYXAob3MuZnNwYXRoLCBwYXRocykpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoc1swXSwgYnl0ZXMpOgogICAgICAgICBzZXAgPSBiJ1xcJwogICAgICAgICBhbHRzZXAgPSBiJy8nCmRpZmYgLS1naXQgYS9MaWIvb3Bjb2RlLnB5IGIvTGliL29wY29kZS5weQppbmRleCA0YzgyNmE3Li5kOTIwMmU4IDEwMDY0NAotLS0gYS9MaWIvb3Bjb2RlLnB5CisrKyBiL0xpYi9vcGNvZGUucHkKQEAgLTM0LDkgKzM0LDcgQEAKIGhhc25hcmdzID0gW10KIAogb3BtYXAgPSB7fQotb3BuYW1lID0gWycnXSAqIDI1NgotZm9yIG9wIGluIHJhbmdlKDI1Nik6IG9wbmFtZVtvcF0gPSAnPCVyPicgJSAob3AsKQotZGVsIG9wCitvcG5hbWUgPSBbJzwlcj4nICUgKG9wLCkgZm9yIG9wIGluIHJhbmdlKDI1NildCiAKIGRlZiBkZWZfb3AobmFtZSwgb3ApOgogICAgIG9wbmFtZVtvcF0gPSBuYW1lCkBAIC0xNzUsOSArMTczLDggQEAKIGRlZl9vcCgnUkFJU0VfVkFSQVJHUycsIDEzMCkgICAgIyBOdW1iZXIgb2YgcmFpc2UgYXJndW1lbnRzICgxLCAyLCBvciAzKQogZGVmX29wKCdDQUxMX0ZVTkNUSU9OJywgMTMxKSAgICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKIGhhc25hcmdzLmFwcGVuZCgxMzEpCi1kZWZfb3AoJ01BS0VfRlVOQ1RJT04nLCAxMzIpICAgICMgTnVtYmVyIG9mIGFyZ3Mgd2l0aCBkZWZhdWx0IHZhbHVlcworZGVmX29wKCdNQUtFX0ZVTkNUSU9OJywgMTMyKSAgICAjIEZsYWdzCiBkZWZfb3AoJ0JVSUxEX1NMSUNFJywgMTMzKSAgICAgICMgTnVtYmVyIG9mIGl0ZW1zCi1kZWZfb3AoJ01BS0VfQ0xPU1VSRScsIDEzNCkKIGRlZl9vcCgnTE9BRF9DTE9TVVJFJywgMTM1KQogaGFzZnJlZS5hcHBlbmQoMTM1KQogZGVmX29wKCdMT0FEX0RFUkVGJywgMTM2KQpAQCAtMjE0LDQgKzIxMSw4IEBACiBkZWZfb3AoJ0JVSUxEX1RVUExFX1VOUEFDSycsIDE1MikKIGRlZl9vcCgnQlVJTERfU0VUX1VOUEFDSycsIDE1MykKIAorZGVmX29wKCdGT1JNQVRfVkFMVUUnLCAxNTUpCitkZWZfb3AoJ0JVSUxEX0NPTlNUX0tFWV9NQVAnLCAxNTYpCitkZWZfb3AoJ0JVSUxEX1NUUklORycsIDE1NykKKwogZGVsIGRlZl9vcCwgbmFtZV9vcCwganJlbF9vcCwgamFic19vcApkaWZmIC0tZ2l0IGEvTGliL29wdHBhcnNlLnB5IGIvTGliL29wdHBhcnNlLnB5CmluZGV4IDc0YjNiMzYuLmU4YWMxZTEgMTAwNjQ0Ci0tLSBhL0xpYi9vcHRwYXJzZS5weQorKysgYi9MaWIvb3B0cGFyc2UucHkKQEAgLTM4LDcgKzM4LDggQEAKICAgICAgICAgICAgJ09wdGlvbkVycm9yJywKICAgICAgICAgICAgJ09wdGlvbkNvbmZsaWN0RXJyb3InLAogICAgICAgICAgICAnT3B0aW9uVmFsdWVFcnJvcicsCi0gICAgICAgICAgICdCYWRPcHRpb25FcnJvciddCisgICAgICAgICAgICdCYWRPcHRpb25FcnJvcicsCisgICAgICAgICAgICdjaGVja19jaG9pY2UnXQogCiBfX2NvcHlyaWdodF9fID0gIiIiCiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiBHcmVnb3J5IFAuIFdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvTGliL29zLnB5IGIvTGliL29zLnB5CmluZGV4IGI0YzY1MWQuLjEwZDcwYWQgMTAwNjQ0Ci0tLSBhL0xpYi9vcy5weQorKysgYi9MaWIvb3MucHkKQEAgLTEsOSArMSw5IEBACiByIiIiT1Mgcm91dGluZXMgZm9yIE5UIG9yIFBvc2l4IGRlcGVuZGluZyBvbiB3aGF0IHN5c3RlbSB3ZSdyZSBvbi4KIAogVGhpcyBleHBvcnRzOgotICAtIGFsbCBmdW5jdGlvbnMgZnJvbSBwb3NpeCwgbnQgb3IgY2UsIGUuZy4gdW5saW5rLCBzdGF0LCBldGMuCisgIC0gYWxsIGZ1bmN0aW9ucyBmcm9tIHBvc2l4IG9yIG50LCBlLmcuIHVubGluaywgc3RhdCwgZXRjLgogICAtIG9zLnBhdGggaXMgZWl0aGVyIHBvc2l4cGF0aCBvciBudHBhdGgKLSAgLSBvcy5uYW1lIGlzIGVpdGhlciAncG9zaXgnLCAnbnQnIG9yICdjZScuCisgIC0gb3MubmFtZSBpcyBlaXRoZXIgJ3Bvc2l4JyBvciAnbnQnCiAgIC0gb3MuY3VyZGlyIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgKCcuJyBvciAnOicpCiAgIC0gb3MucGFyZGlyIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFyZW50IGRpcmVjdG9yeSAoJy4uJyBvciAnOjonKQogICAtIG9zLnNlcCBpcyB0aGUgKG9yIGEgbW9zdCBjb21tb24pIHBhdGhuYW1lIHNlcGFyYXRvciAoJy8nIG9yICc6JyBvciAnXFwnKQpAQCAtMjIsNyArMjIsNyBAQAogIiIiCiAKICMnCi0KK2ltcG9ydCBhYmMKIGltcG9ydCBzeXMsIGVycm5vCiBpbXBvcnQgc3RhdCBhcyBzdAogCkBAIC04NSwyNyArODUsNiBAQAogICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgcGFzcwogCi1lbGlmICdjZScgaW4gX25hbWVzOgotICAgIG5hbWUgPSAnY2UnCi0gICAgbGluZXNlcCA9ICdcclxuJwotICAgIGZyb20gY2UgaW1wb3J0ICoKLSAgICB0cnk6Ci0gICAgICAgIGZyb20gY2UgaW1wb3J0IF9leGl0Ci0gICAgICAgIF9fYWxsX18uYXBwZW5kKCdfZXhpdCcpCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCi0gICAgIyBXZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCBXaW5kb3dzIHBhdGguCi0gICAgaW1wb3J0IG50cGF0aCBhcyBwYXRoCi0KLSAgICBpbXBvcnQgY2UKLSAgICBfX2FsbF9fLmV4dGVuZChfZ2V0X2V4cG9ydHNfbGlzdChjZSkpCi0gICAgZGVsIGNlCi0KLSAgICB0cnk6Ci0gICAgICAgIGZyb20gY2UgaW1wb3J0IF9oYXZlX2Z1bmN0aW9ucwotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotCiBlbHNlOgogICAgIHJhaXNlIEltcG9ydEVycm9yKCdubyBvcyBzcGVjaWZpYyBtb2R1bGUgZm91bmQnKQogCkBAIC0zNTMsOSArMzMyLDEwIEBACiAgICAgICAgICAgICBkaXJzLnJlbW92ZSgnQ1ZTJykgICMgZG9uJ3QgdmlzaXQgQ1ZTIGRpcmVjdG9yaWVzCiAKICAgICAiIiIKLQorICAgIHRvcCA9IGZzcGF0aCh0b3ApCiAgICAgZGlycyA9IFtdCiAgICAgbm9uZGlycyA9IFtdCisgICAgd2Fsa19kaXJzID0gW10KIAogICAgICMgV2UgbWF5IG5vdCBoYXZlIHJlYWQgcGVybWlzc2lvbiBmb3IgdG9wLCBpbiB3aGljaCBjYXNlIHdlIGNhbid0CiAgICAgIyBnZXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zLiAgb3Mud2FsawpAQCAtMzY5LDQyICszNDksNTIgQEAKICAgICAgICAgICAgICMgTm90ZSB0aGF0IHNjYW5kaXIgaXMgZ2xvYmFsIGluIHRoaXMgbW9kdWxlIGR1ZQogICAgICAgICAgICAgIyB0byBlYXJsaWVyIGltcG9ydC0qLgogICAgICAgICAgICAgc2NhbmRpcl9pdCA9IHNjYW5kaXIodG9wKQotICAgICAgICBlbnRyaWVzID0gbGlzdChzY2FuZGlyX2l0KQogICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgogICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgb25lcnJvcihlcnJvcikKICAgICAgICAgcmV0dXJuCiAKLSAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAjIElmIGlzX2RpcigpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZSBlbnRyeSBpcyBub3QKLSAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgotICAgICAgICAgICAgaXNfZGlyID0gRmFsc2UKLQotICAgICAgICBpZiBpc19kaXI6Ci0gICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbm9uZGlycy5hcHBlbmQoZW50cnkubmFtZSkKLQotICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgotICAgICAgICAgICAgIyBCb3R0b20tdXA6IHJlY3Vyc2UgaW50byBzdWItZGlyZWN0b3J5LCBidXQgZXhjbHVkZSBzeW1saW5rcyB0bwotICAgICAgICAgICAgIyBkaXJlY3RvcmllcyBpZiBmb2xsb3dsaW5rcyBpcyBGYWxzZQotICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6Ci0gICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gVHJ1ZQotICAgICAgICAgICAgZWxzZToKKyAgICB3aXRoIHNjYW5kaXJfaXQ6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgSWYgaXNfc3ltbGluaygpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgIyBvcy5wYXRoLmlzbGluaygpLgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gRmFsc2UKLSAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQoc2NhbmRpcl9pdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoZXJyb3IpCisgICAgICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgICAgIGlmIHdhbGtfaW50bzoKLSAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsoZW50cnkucGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgSWYgaXNfZGlyKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlIGVudHJ5IGlzIG5vdAorICAgICAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgorICAgICAgICAgICAgICAgIGlzX2RpciA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIGlzX2RpcjoKKyAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub25kaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorCisgICAgICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgorICAgICAgICAgICAgICAgICMgQm90dG9tLXVwOiByZWN1cnNlIGludG8gc3ViLWRpcmVjdG9yeSwgYnV0IGV4Y2x1ZGUgc3ltbGlua3MgdG8KKyAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzIGlmIGZvbGxvd2xpbmtzIGlzIEZhbHNlCisgICAgICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6CisgICAgICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBpc19zeW1saW5rKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgb3MucGF0aC5pc2xpbmsoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworCisgICAgICAgICAgICAgICAgaWYgd2Fsa19pbnRvOgorICAgICAgICAgICAgICAgICAgICB3YWxrX2RpcnMuYXBwZW5kKGVudHJ5LnBhdGgpCiAKICAgICAjIFlpZWxkIGJlZm9yZSByZWN1cnNpb24gaWYgZ29pbmcgdG9wIGRvd24KICAgICBpZiB0b3Bkb3duOgpAQCAtNDIxLDYgKzQxMSw5IEBACiAgICAgICAgICAgICBpZiBmb2xsb3dsaW5rcyBvciBub3QgaXNsaW5rKG5ld19wYXRoKToKICAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsobmV3X3BhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQogICAgIGVsc2U6CisgICAgICAgICMgUmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcmllcworICAgICAgICBmb3IgbmV3X3BhdGggaW4gd2Fsa19kaXJzOgorICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrKG5ld19wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKICAgICAgICAgIyBZaWVsZCBhZnRlciByZWN1cnNpb24gaWYgZ29pbmcgYm90dG9tIHVwCiAgICAgICAgIHlpZWxkIHRvcCwgZGlycywgbm9uZGlycwogCkBAIC00NjcsMTAgKzQ2MCwyMyBAQAogICAgICAgICBzdGF0ID0gc2VsZi5zdGF0KGZvbGxvd19zeW1saW5rcz1GYWxzZSkKICAgICAgICAgcmV0dXJuIHN0LlNfSVNMTksoc3RhdC5zdF9tb2RlKQogCi1kZWYgX2R1bW15X3NjYW5kaXIoZGlyKToKK2NsYXNzIF9kdW1teV9zY2FuZGlyOgogICAgICMgbGlzdGRpci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnl0ZXMgcGF0Y2hlcyBvbiBXaW5kb3dzCi0gICAgZm9yIG5hbWUgaW4gbGlzdGRpcihkaXIpOgotICAgICAgICB5aWVsZCBfRHVtbXlEaXJFbnRyeShkaXIsIG5hbWUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcik6CisgICAgICAgIHNlbGYuZGlyID0gZGlyCisgICAgICAgIHNlbGYuaXQgPSBpdGVyKGxpc3RkaXIoZGlyKSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIF9EdW1teURpckVudHJ5KHNlbGYuZGlyLCBuZXh0KHNlbGYuaXQpKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuaXQgPSBpdGVyKCgpKQogCiBfX2FsbF9fLmFwcGVuZCgid2FsayIpCiAKQEAgLTUwOSw2ICs1MTUsOCBAQAogICAgICAgICAgICAgaWYgJ0NWUycgaW4gZGlyczoKICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZSgnQ1ZTJykgICMgZG9uJ3QgdmlzaXQgQ1ZTIGRpcmVjdG9yaWVzCiAgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0b3AsIGludCkgb3Igbm90IGhhc2F0dHIodG9wLCAnX19pbmRleF9fJyk6CisgICAgICAgICAgICB0b3AgPSBmc3BhdGgodG9wKQogICAgICAgICAjIE5vdGU6IFRvIGd1YXJkIGFnYWluc3Qgc3ltbGluayByYWNlcywgd2UgdXNlIHRoZSBzdGFuZGFyZAogICAgICAgICAjIGxzdGF0KCkvb3BlbigpL2ZzdGF0KCkgdHJpY2suCiAgICAgICAgIG9yaWdfc3QgPSBzdGF0KHRvcCwgZm9sbG93X3N5bWxpbmtzPUZhbHNlLCBkaXJfZmQ9ZGlyX2ZkKQpAQCAtODQ5LDMwICs4NTcsMjggQEAKICAgICAgICAgZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScKIAogICAgIGRlZiBmc2VuY29kZShmaWxlbmFtZSk6CisgICAgICAgICIiIkVuY29kZSBmaWxlbmFtZSAoYW4gb3MuUGF0aExpa2UsIGJ5dGVzLCBvciBzdHIpIHRvIHRoZSBmaWxlc3lzdGVtCisgICAgICAgIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlciwgcmV0dXJuIGJ5dGVzIHVuY2hhbmdlZC4KKyAgICAgICAgT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzCisgICAgICAgICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgogICAgICAgICAiIiIKLSAgICAgICAgRW5jb2RlIGZpbGVuYW1lIHRvIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IKLSAgICAgICAgaGFuZGxlciwgcmV0dXJuIGJ5dGVzIHVuY2hhbmdlZC4gT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYKLSAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKKyAgICAgICAgZmlsZW5hbWUgPSBmc3BhdGgoZmlsZW5hbWUpICAjIERvZXMgdHlwZS1jaGVja2luZyBvZiBgZmlsZW5hbWVgLgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgogICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmVuY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogICAgIGRlZiBmc2RlY29kZShmaWxlbmFtZSk6CisgICAgICAgICIiIkRlY29kZSBmaWxlbmFtZSAoYW4gb3MuUGF0aExpa2UsIGJ5dGVzLCBvciBzdHIpIGZyb20gdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVyLCByZXR1cm4gc3RyIHVuY2hhbmdlZC4gT24KKyAgICAgICAgV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzCisgICAgICAgICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgogICAgICAgICAiIiIKLSAgICAgICAgRGVjb2RlIGZpbGVuYW1lIGZyb20gdGhlIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvcgotICAgICAgICBoYW5kbGVyLCByZXR1cm4gc3RyIHVuY2hhbmdlZC4gT24gV2luZG93cywgdXNlICdzdHJpY3QnIGVycm9yIGhhbmRsZXIgaWYKLSAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzICdtYmNzJyAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKKyAgICAgICAgZmlsZW5hbWUgPSBmc3BhdGgoZmlsZW5hbWUpICAjIERvZXMgdHlwZS1jaGVja2luZyBvZiBgZmlsZW5hbWVgLgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZGVjb2RlKGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJSB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgcmV0dXJuIGZzZW5jb2RlLCBmc2RlY29kZQogCkBAIC0xMDcwLDMgKzEwNzYsNTUgQEAKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGZkIHR5cGUgKCVzLCBleHBlY3RlZCBpbnRlZ2VyKSIgJSB0eXBlKGZkKSkKICAgICBpbXBvcnQgaW8KICAgICByZXR1cm4gaW8ub3BlbihmZCwgKmFyZ3MsICoqa3dhcmdzKQorCisKKyMgRm9yIHRlc3RpbmcgcHVycG9zZXMsIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHdoZW4gdGhlIEMKKyMgaW1wbGVtZW50YXRpb24gZXhpc3RzLgorZGVmIF9mc3BhdGgocGF0aCk6CisgICAgIiIiUmV0dXJuIHRoZSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIGEgcGF0aC1saWtlIG9iamVjdC4KKworICAgIElmIHN0ciBvciBieXRlcyBpcyBwYXNzZWQgaW4sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4gT3RoZXJ3aXNlIHRoZQorICAgIG9zLlBhdGhMaWtlIGludGVyZmFjZSBpcyB1c2VkIHRvIGdldCB0aGUgcGF0aCByZXByZXNlbnRhdGlvbi4gSWYgdGhlCisgICAgcGF0aCByZXByZXNlbnRhdGlvbiBpcyBub3Qgc3RyIG9yIGJ5dGVzLCBUeXBlRXJyb3IgaXMgcmFpc2VkLiBJZiB0aGUKKyAgICBwcm92aWRlZCBwYXRoIGlzIG5vdCBzdHIsIGJ5dGVzLCBvciBvcy5QYXRoTGlrZSwgVHlwZUVycm9yIGlzIHJhaXNlZC4KKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKHBhdGgsIChzdHIsIGJ5dGVzKSk6CisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICAjIFdvcmsgZnJvbSB0aGUgb2JqZWN0J3MgdHlwZSB0byBtYXRjaCBtZXRob2QgcmVzb2x1dGlvbiBvZiBvdGhlciBtYWdpYworICAgICMgbWV0aG9kcy4KKyAgICBwYXRoX3R5cGUgPSB0eXBlKHBhdGgpCisgICAgdHJ5OgorICAgICAgICBwYXRoX3JlcHIgPSBwYXRoX3R5cGUuX19mc3BhdGhfXyhwYXRoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgaWYgaGFzYXR0cihwYXRoX3R5cGUsICdfX2ZzcGF0aF9fJyk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3RlZCBzdHIsIGJ5dGVzIG9yIG9zLlBhdGhMaWtlIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgIiArIHBhdGhfdHlwZS5fX25hbWVfXykKKyAgICBpZiBpc2luc3RhbmNlKHBhdGhfcmVwciwgKHN0ciwgYnl0ZXMpKToKKyAgICAgICAgcmV0dXJuIHBhdGhfcmVwcgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0ZWQge30uX19mc3BhdGhfXygpIHRvIHJldHVybiBzdHIgb3IgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3Qge30iLmZvcm1hdChwYXRoX3R5cGUuX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShwYXRoX3JlcHIpLl9fbmFtZV9fKSkKKworIyBJZiB0aGVyZSBpcyBubyBDIGltcGxlbWVudGF0aW9uLCBtYWtlIHRoZSBwdXJlIFB5dGhvbiB2ZXJzaW9uIHRoZQorIyBpbXBsZW1lbnRhdGlvbiBhcyB0cmFuc3BhcmVudGx5IGFzIHBvc3NpYmxlLgoraWYgbm90IF9leGlzdHMoJ2ZzcGF0aCcpOgorICAgIGZzcGF0aCA9IF9mc3BhdGgKKyAgICBmc3BhdGguX19uYW1lX18gPSAiZnNwYXRoIgorCisKK2NsYXNzIFBhdGhMaWtlKGFiYy5BQkMpOgorCisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHByb3RvY29sLiIiIgorCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBzdWJjbGFzcyk6CisgICAgICAgIHJldHVybiBoYXNhdHRyKHN1YmNsYXNzLCAnX19mc3BhdGhfXycpCmRpZmYgLS1naXQgYS9MaWIvcGF0aGxpYi5weSBiL0xpYi9wYXRobGliLnB5CmluZGV4IDE0ODBlMmYuLmEwNjY3NmYgMTAwNjQ0Ci0tLSBhL0xpYi9wYXRobGliLnB5CisrKyBiL0xpYi9wYXRobGliLnB5CkBAIC02MzQsMTMgKzYzNCwxNiBAQAogICAgICAgICBmb3IgYSBpbiBhcmdzOgogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBQdXJlUGF0aCk6CiAgICAgICAgICAgICAgICAgcGFydHMgKz0gYS5fcGFydHMKLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhLCBzdHIpOgotICAgICAgICAgICAgICAgICMgRm9yY2UtY2FzdCBzdHIgc3ViY2xhc3NlcyB0byBzdHIgKGlzc3VlICMyMTEyNykKLSAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKGEpKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgYSBwYXRoIG9yIHN0ciBvYmplY3QsIG5vdCAlciIKLSAgICAgICAgICAgICAgICAgICAgJSB0eXBlKGEpKQorICAgICAgICAgICAgICAgIGEgPSBvcy5mc3BhdGgoYSkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIHN0cik6CisgICAgICAgICAgICAgICAgICAgICMgRm9yY2UtY2FzdCBzdHIgc3ViY2xhc3NlcyB0byBzdHIgKGlzc3VlICMyMTEyNykKKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihhKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyIG9iamVjdCBvciBhbiBvcy5QYXRoTGlrZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmluZyBzdHIsIG5vdCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgdHlwZShhKSkKICAgICAgICAgcmV0dXJuIGNscy5fZmxhdm91ci5wYXJzZV9wYXJ0cyhwYXJ0cykKIAogICAgIEBjbGFzc21ldGhvZApAQCAtNjkzLDYgKzY5Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnRzKSBvciAnLicKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9zdHIKIAorICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisKICAgICBkZWYgYXNfcG9zaXgoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoIHdpdGggZm9yd2FyZCAoLykKICAgICAgICAgc2xhc2hlcy4iIiIKQEAgLTk0Myw2ICs5NDksMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKIAorIyBDYW4ndCBzdWJjbGFzcyBvcy5QYXRoTGlrZSBmcm9tIFB1cmVQYXRoIGFuZCBrZWVwIHRoZSBjb25zdHJ1Y3RvcgorIyBvcHRpbWl6YXRpb25zIGluIFB1cmVQYXRoLl9wYXJzZV9hcmdzKCkuCitvcy5QYXRoTGlrZS5yZWdpc3RlcihQdXJlUGF0aCkKKwogCiBjbGFzcyBQdXJlUG9zaXhQYXRoKFB1cmVQYXRoKToKICAgICBfZmxhdm91ciA9IF9wb3NpeF9mbGF2b3VyCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCAwNDBlY2IyLi5jODM3MGM5IDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTI3LDYgKzI3LDcgQEAKIGZyb20gY29weXJlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKIGZyb20gY29weXJlZyBpbXBvcnQgX2V4dGVuc2lvbl9yZWdpc3RyeSwgX2ludmVydGVkX3JlZ2lzdHJ5LCBfZXh0ZW5zaW9uX2NhY2hlCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbAogaW1wb3J0IHN5cwogZnJvbSBzeXMgaW1wb3J0IG1heHNpemUKIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKQEAgLTU0OCw3ICs1NDksNyBAQAogICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKIAogICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICJfX25hbWVfXyIsICIiKQotICAgICAgICBpZiBzZWxmLnByb3RvID49IDQgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfZXhfXyI6CisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMiBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9leF9fIjoKICAgICAgICAgICAgIGNscywgYXJncywga3dhcmdzID0gYXJncwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAiX19uZXdfXyIpOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyBubyBfX25ld19fIgpAQCAtNTU2LDEwICs1NTcsMTYgQEAKICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgY2xzIGlzIG5vdCBvYmouX19jbGFzc19fOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZ1bmNfbmFtZSkpCi0gICAgICAgICAgICBzYXZlKGNscykKLSAgICAgICAgICAgIHNhdmUoYXJncykKLSAgICAgICAgICAgIHNhdmUoa3dhcmdzKQotICAgICAgICAgICAgd3JpdGUoTkVXT0JKX0VYKQorICAgICAgICAgICAgaWYgc2VsZi5wcm90byA+PSA0OgorICAgICAgICAgICAgICAgIHNhdmUoY2xzKQorICAgICAgICAgICAgICAgIHNhdmUoYXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGt3YXJncykKKyAgICAgICAgICAgICAgICB3cml0ZShORVdPQkpfRVgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBwYXJ0aWFsKGNscy5fX25ld19fLCBjbHMsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGZ1bmMpCisgICAgICAgICAgICAgICAgc2F2ZSgoKSkKKyAgICAgICAgICAgICAgICB3cml0ZShSRURVQ0UpCiAgICAgICAgIGVsaWYgc2VsZi5wcm90byA+PSAyIGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX18iOgogICAgICAgICAgICAgIyBBIF9fcmVkdWNlX18gaW1wbGVtZW50YXRpb24gY2FuIGRpcmVjdCBwcm90b2NvbCAyIG9yIG5ld2VyIHRvCiAgICAgICAgICAgICAjIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgTkVXT0JKIG9wY29kZSwgd2hpbGUgc3RpbGwKQEAgLTEwMjgsNyArMTAzNSw3IEBACiAgICAgICAgIHNlbGYuX3VuZnJhbWVyID0gX1VuZnJhbWVyKHNlbGYuX2ZpbGVfcmVhZCwgc2VsZi5fZmlsZV9yZWFkbGluZSkKICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fdW5mcmFtZXIucmVhZAogICAgICAgICBzZWxmLnJlYWRsaW5lID0gc2VsZi5fdW5mcmFtZXIucmVhZGxpbmUKLSAgICAgICAgc2VsZi5tYXJrID0gb2JqZWN0KCkgIyBhbnkgbmV3IHVuaXF1ZSBvYmplY3QKKyAgICAgICAgc2VsZi5tZXRhc3RhY2sgPSBbXQogICAgICAgICBzZWxmLnN0YWNrID0gW10KICAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAogICAgICAgICBzZWxmLnByb3RvID0gMApAQCAtMTA0NCwyMCArMTA1MSwxMiBAQAogICAgICAgICBleGNlcHQgX1N0b3AgYXMgc3RvcGluc3Q6CiAgICAgICAgICAgICByZXR1cm4gc3RvcGluc3QudmFsdWUKIAotICAgICMgUmV0dXJuIGxhcmdlc3QgaW5kZXggayBzdWNoIHRoYXQgc2VsZi5zdGFja1trXSBpcyBzZWxmLm1hcmsuCi0gICAgIyBJZiB0aGUgc3RhY2sgZG9lc24ndCBjb250YWluIGEgbWFyaywgZXZlbnR1YWxseSByYWlzZXMgSW5kZXhFcnJvci4KLSAgICAjIFRoaXMgY291bGQgYmUgc3BlZCBieSBtYWludGFpbmluZyBhbm90aGVyIHN0YWNrLCBvZiBpbmRpY2VzIGF0IHdoaWNoCi0gICAgIyB0aGUgbWFyayBhcHBlYXJzLiAgRm9yIHRoYXQgbWF0dGVyLCB0aGUgbGF0dGVyIHN0YWNrIHdvdWxkIHN1ZmZpY2UsCi0gICAgIyBhbmQgd2Ugd291bGRuJ3QgbmVlZCB0byBwdXNoIG1hcmsgb2JqZWN0cyBvbiBzZWxmLnN0YWNrIGF0IGFsbC4KLSAgICAjIERvaW5nIHNvIGlzIHByb2JhYmx5IGEgZ29vZCB0aGluZywgdGhvdWdoLCBzaW5jZSBpZiB0aGUgcGlja2xlIGlzCi0gICAgIyBjb3JydXB0IChvciBob3N0aWxlKSB3ZSBtYXkgZ2V0IGEgY2x1ZSBmcm9tIGZpbmRpbmcgc2VsZi5tYXJrIGVtYmVkZGVkCi0gICAgIyBpbiB1bnBpY2tsZWQgb2JqZWN0cy4KLSAgICBkZWYgbWFya2VyKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFyawotICAgICAgICBrID0gbGVuKHN0YWNrKS0xCi0gICAgICAgIHdoaWxlIHN0YWNrW2tdIGlzIG5vdCBtYXJrOiBrID0gay0xCi0gICAgICAgIHJldHVybiBrCisgICAgIyBSZXR1cm4gYSBsaXN0IG9mIGl0ZW1zIHB1c2hlZCBpbiB0aGUgc3RhY2sgYWZ0ZXIgbGFzdCBNQVJLIGluc3RydWN0aW9uLgorICAgIGRlZiBwb3BfbWFyayhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBzZWxmLnN0YWNrCisgICAgICAgIHNlbGYuc3RhY2sgPSBzZWxmLm1ldGFzdGFjay5wb3AoKQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCisgICAgICAgIHJldHVybiBpdGVtcwogCiAgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzZWxmLCBwaWQpOgogICAgICAgICByYWlzZSBVbnBpY2tsaW5nRXJyb3IoInVuc3VwcG9ydGVkIHBlcnNpc3RlbnQgaWQgZW5jb3VudGVyZWQiKQpAQCAtMTIzOCw4ICsxMjM3LDggQEAKICAgICBkaXNwYXRjaFtTSE9SVF9CSU5VTklDT0RFWzBdXSA9IGxvYWRfc2hvcnRfYmludW5pY29kZQogCiAgICAgZGVmIGxvYWRfdHVwbGUoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3R1cGxlKHNlbGYuc3RhY2tbaysxOl0pXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZCh0dXBsZShpdGVtcykpCiAgICAgZGlzcGF0Y2hbVFVQTEVbMF1dID0gbG9hZF90dXBsZQogCiAgICAgZGVmIGxvYWRfZW1wdHlfdHVwbGUoc2VsZik6CkBAIC0xMjcxLDIxICsxMjcwLDIwIEBACiAgICAgZGlzcGF0Y2hbRU1QVFlfU0VUWzBdXSA9IGxvYWRfZW1wdHlfc2V0CiAKICAgICBkZWYgbG9hZF9mcm96ZW5zZXQoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW2Zyb3plbnNldChzZWxmLnN0YWNrW2srMTpdKV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoZnJvemVuc2V0KGl0ZW1zKSkKICAgICBkaXNwYXRjaFtGUk9aRU5TRVRbMF1dID0gbG9hZF9mcm96ZW5zZXQKIAogICAgIGRlZiBsb2FkX2xpc3Qoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3NlbGYuc3RhY2tbaysxOl1dCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKGl0ZW1zKQogICAgIGRpc3BhdGNoW0xJU1RbMF1dID0gbG9hZF9saXN0CiAKICAgICBkZWYgbG9hZF9kaWN0KHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2tbaysxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKICAgICAgICAgZCA9IHtpdGVtc1tpXTogaXRlbXNbaSsxXQogICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpfQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtkXQorICAgICAgICBzZWxmLmFwcGVuZChkKQogICAgIGRpc3BhdGNoW0RJQ1RbMF1dID0gbG9hZF9kaWN0CiAKICAgICAjIElOU1QgYW5kIE9CSiBkaWZmZXIgb25seSBpbiBob3cgdGhleSBnZXQgYSBjbGFzcyBvYmplY3QuICBJdCdzIG5vdApAQCAtMTI5Myw5ICsxMjkxLDcgQEAKICAgICAjIHByZXZpb3VzbHkgZGl2ZXJnZWQgYW5kIGdyZXcgZGlmZmVyZW50IGJ1Z3MuCiAgICAgIyBrbGFzcyBpcyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUsIGFuZCBrIHBvaW50cyB0byB0aGUgdG9wbW9zdCBtYXJrCiAgICAgIyBvYmplY3QsIGZvbGxvd2luZyB3aGljaCBhcmUgdGhlIGFyZ3VtZW50cyBmb3Iga2xhc3MuX19pbml0X18uCi0gICAgZGVmIF9pbnN0YW50aWF0ZShzZWxmLCBrbGFzcywgayk6Ci0gICAgICAgIGFyZ3MgPSB0dXBsZShzZWxmLnN0YWNrW2srMTpdKQotICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBhcmdzKToKICAgICAgICAgaWYgKGFyZ3Mgb3Igbm90IGlzaW5zdGFuY2Uoa2xhc3MsIHR5cGUpIG9yCiAgICAgICAgICAgICBoYXNhdHRyKGtsYXNzLCAiX19nZXRpbml0YXJnc19fIikpOgogICAgICAgICAgICAgdHJ5OgpAQCAtMTMxMSwxNCArMTMwNywxNCBAQAogICAgICAgICBtb2R1bGUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXS5kZWNvZGUoImFzY2lpIikKICAgICAgICAgbmFtZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdLmRlY29kZSgiYXNjaWkiKQogICAgICAgICBrbGFzcyA9IHNlbGYuZmluZF9jbGFzcyhtb2R1bGUsIG5hbWUpCi0gICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLm1hcmtlcigpKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgc2VsZi5wb3BfbWFyaygpKQogICAgIGRpc3BhdGNoW0lOU1RbMF1dID0gbG9hZF9pbnN0CiAKICAgICBkZWYgbG9hZF9vYmooc2VsZik6CiAgICAgICAgICMgU3RhY2sgaXMgLi4uIG1hcmtvYmplY3QgY2xhc3NvYmplY3QgYXJnMSBhcmcyIC4uLgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBrbGFzcyA9IHNlbGYuc3RhY2sucG9wKGsrMSkKLSAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIGspCisgICAgICAgIGFyZ3MgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgY2xzID0gYXJncy5wb3AoMCkKKyAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoY2xzLCBhcmdzKQogICAgIGRpc3BhdGNoW09CSlswXV0gPSBsb2FkX29iagogCiAgICAgZGVmIGxvYWRfbmV3b2JqKHNlbGYpOgpAQCAtMTQwMywxMiArMTM5OSwxNCBAQAogICAgIGRpc3BhdGNoW1JFRFVDRVswXV0gPSBsb2FkX3JlZHVjZQogCiAgICAgZGVmIGxvYWRfcG9wKHNlbGYpOgotICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKyAgICAgICAgaWYgc2VsZi5zdGFjazoKKyAgICAgICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wb3BfbWFyaygpCiAgICAgZGlzcGF0Y2hbUE9QWzBdXSA9IGxvYWRfcG9wCiAKICAgICBkZWYgbG9hZF9wb3BfbWFyayhzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgZGVsIHNlbGYuc3RhY2tbazpdCisgICAgICAgIHNlbGYucG9wX21hcmsoKQogICAgIGRpc3BhdGNoW1BPUF9NQVJLWzBdXSA9IGxvYWRfcG9wX21hcmsKIAogICAgIGRlZiBsb2FkX2R1cChzZWxmKToKQEAgLTE0NjQsMTcgKzE0NjIsMTQgQEAKICAgICBkaXNwYXRjaFtBUFBFTkRbMF1dID0gbG9hZF9hcHBlbmQKIAogICAgIGRlZiBsb2FkX2FwcGVuZHMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBsaXN0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgbGlzdF9vYmogPSBzZWxmLnN0YWNrWy0xXQogICAgICAgICBpZiBpc2luc3RhbmNlKGxpc3Rfb2JqLCBsaXN0KToKICAgICAgICAgICAgIGxpc3Rfb2JqLmV4dGVuZChpdGVtcykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFwcGVuZCA9IGxpc3Rfb2JqLmFwcGVuZAogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgYXBwZW5kKGl0ZW0pCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KICAgICBkaXNwYXRjaFtBUFBFTkRTWzBdXSA9IGxvYWRfYXBwZW5kcwogCiAgICAgZGVmIGxvYWRfc2V0aXRlbShzZWxmKToKQEAgLTE0ODYsMjcgKzE0ODEsMjEgQEAKICAgICBkaXNwYXRjaFtTRVRJVEVNWzBdXSA9IGxvYWRfc2V0aXRlbQogCiAgICAgZGVmIGxvYWRfc2V0aXRlbXMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBkaWN0ID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGZvciBpIGluIHJhbmdlKG1hcmsgKyAxLCBsZW4oc3RhY2spLCAyKToKLSAgICAgICAgICAgIGRpY3Rbc3RhY2tbaV1dID0gc3RhY2tbaSArIDFdCi0KLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBkaWN0ID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMik6CisgICAgICAgICAgICBkaWN0W2l0ZW1zW2ldXSA9IGl0ZW1zW2kgKyAxXQogICAgIGRpc3BhdGNoW1NFVElURU1TWzBdXSA9IGxvYWRfc2V0aXRlbXMKIAogICAgIGRlZiBsb2FkX2FkZGl0ZW1zKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2V0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2V0X29iaiA9IHNlbGYuc3RhY2tbLTFdCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0X29iaiwgc2V0KToKICAgICAgICAgICAgIHNldF9vYmoudXBkYXRlKGl0ZW1zKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYWRkID0gc2V0X29iai5hZGQKICAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICAgICAgIGFkZChpdGVtKQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCiAgICAgZGlzcGF0Y2hbQURESVRFTVNbMF1dID0gbG9hZF9hZGRpdGVtcwogCiAgICAgZGVmIGxvYWRfYnVpbGQoc2VsZik6CkBAIC0xNTM0LDcgKzE1MjMsOSBAQAogICAgIGRpc3BhdGNoW0JVSUxEWzBdXSA9IGxvYWRfYnVpbGQKIAogICAgIGRlZiBsb2FkX21hcmsoc2VsZik6Ci0gICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWFyaykKKyAgICAgICAgc2VsZi5tZXRhc3RhY2suYXBwZW5kKHNlbGYuc3RhY2spCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCiAgICAgZGlzcGF0Y2hbTUFSS1swXV0gPSBsb2FkX21hcmsKIAogICAgIGRlZiBsb2FkX3N0b3Aoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvcGlja2xldG9vbHMucHkgYi9MaWIvcGlja2xldG9vbHMucHkKaW5kZXggMTZhZTdkNS4uNGVlZmMxOSAxMDA2NDQKLS0tIGEvTGliL3BpY2tsZXRvb2xzLnB5CisrKyBiL0xpYi9waWNrbGV0b29scy5weQpAQCAtMjQ0MCw2ICsyNDQwLDcgQEAKICAgICAgICAgaWYgb3Bjb2RlLm5hbWUgaW4gKCJQVVQiLCAiQklOUFVUIiwgIkxPTkdfQklOUFVUIiwgIk1FTU9JWkUiKToKICAgICAgICAgICAgIGlmIG9wY29kZS5uYW1lID09ICJNRU1PSVpFIjoKICAgICAgICAgICAgICAgICBtZW1vX2lkeCA9IGxlbihtZW1vKQorICAgICAgICAgICAgICAgIG1hcmttc2cgPSAiKGFzICVkKSIgJSBtZW1vX2lkeAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBhc3NlcnQgYXJnIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgbWVtb19pZHggPSBhcmcKZGlmZiAtLWdpdCBhL0xpYi9wa2d1dGlsLnB5IGIvTGliL3BrZ3V0aWwucHkKaW5kZXggMDY4NTM3OC4uN2ZjMzU2YyAxMDA2NDQKLS0tIGEvTGliL3BrZ3V0aWwucHkKKysrIGIvTGliL3BrZ3V0aWwucHkKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogCiBkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKLSAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9maW5kZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKICAgICBvbiBwYXRoLCBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgYWNjZXNzaWJsZSBtb2R1bGVzLgogCiAgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAKIGRlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgotICAgICIiIllpZWxkcyAobW9kdWxlX2xvYWRlciwgbmFtZSwgaXNwa2cpIGZvciBhbGwgc3VibW9kdWxlcyBvbiBwYXRoLAorICAgICIiIllpZWxkcyAobW9kdWxlX2ZpbmRlciwgbmFtZSwgaXNwa2cpIGZvciBhbGwgc3VibW9kdWxlcyBvbiBwYXRoLAogICAgIG9yLCBpZiBwYXRoIGlzIE5vbmUsIGFsbCB0b3AtbGV2ZWwgbW9kdWxlcyBvbiBzeXMucGF0aC4KIAogICAgICdwYXRoJyBzaG91bGQgYmUgZWl0aGVyIE5vbmUgb3IgYSBsaXN0IG9mIHBhdGhzIHRvIGxvb2sgZm9yCkBAIC0xODAsMTQgKzE4MCwxNCBAQAogZGVmIF9pbXBvcnRfaW1wKCk6CiAgICAgZ2xvYmFsIGltcAogICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICAgaW1wID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ2ltcCcpCiAKIGNsYXNzIEltcEltcG9ydGVyOgotICAgICIiIlBFUCAzMDIgSW1wb3J0ZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorICAgICIiIlBFUCAzMDIgRmluZGVyIHRoYXQgd3JhcHMgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBhbGdvcml0aG0KIAotICAgIEltcEltcG9ydGVyKGRpcm5hbWUpIHByb2R1Y2VzIGEgUEVQIDMwMiBpbXBvcnRlciB0aGF0IHNlYXJjaGVzIHRoYXQKLSAgICBkaXJlY3RvcnkuICBJbXBJbXBvcnRlcihOb25lKSBwcm9kdWNlcyBhIFBFUCAzMDIgaW1wb3J0ZXIgdGhhdCBzZWFyY2hlcworICAgIEltcEltcG9ydGVyKGRpcm5hbWUpIHByb2R1Y2VzIGEgUEVQIDMwMiBmaW5kZXIgdGhhdCBzZWFyY2hlcyB0aGF0CisgICAgZGlyZWN0b3J5LiAgSW1wSW1wb3J0ZXIoTm9uZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGZpbmRlciB0aGF0IHNlYXJjaGVzCiAgICAgdGhlIGN1cnJlbnQgc3lzLnBhdGgsIHBsdXMgYW55IG1vZHVsZXMgdGhhdCBhcmUgZnJvemVuIG9yIGJ1aWx0LWluLgogCiAgICAgTm90ZSB0aGF0IEltcEltcG9ydGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGJlaW5nIHVzZWQgYnkgcGxhY2VtZW50CkBAIC0zOTcsNyArMzk3LDcgQEAKIGRlZiBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKToKICAgICAiIiJSZXRyaWV2ZSBhIGZpbmRlciBmb3IgdGhlIGdpdmVuIHBhdGggaXRlbQogCi0gICAgVGhlIHJldHVybmVkIGltcG9ydGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQorICAgIFRoZSByZXR1cm5lZCBmaW5kZXIgaXMgY2FjaGVkIGluIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlCiAgICAgaWYgaXQgd2FzIG5ld2x5IGNyZWF0ZWQgYnkgYSBwYXRoIGhvb2suCiAKICAgICBUaGUgY2FjaGUgKG9yIHBhcnQgb2YgaXQpIGNhbiBiZSBjbGVhcmVkIG1hbnVhbGx5IGlmIGEKQEAgLTQyMSwxNCArNDIxLDE0IEBACiBkZWYgaXRlcl9pbXBvcnRlcnMoZnVsbG5hbWU9IiIpOgogICAgICIiIllpZWxkIGZpbmRlcnMgZm9yIHRoZSBnaXZlbiBtb2R1bGUgbmFtZQogCi0gICAgSWYgZnVsbG5hbWUgY29udGFpbnMgYSAnLicsIHRoZSBpbXBvcnRlcnMgd2lsbCBiZSBmb3IgdGhlIHBhY2thZ2UKKyAgICBJZiBmdWxsbmFtZSBjb250YWlucyBhICcuJywgdGhlIGZpbmRlcnMgd2lsbCBiZSBmb3IgdGhlIHBhY2thZ2UKICAgICBjb250YWluaW5nIGZ1bGxuYW1lLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGFsbCByZWdpc3RlcmVkIHRvcCBsZXZlbAotICAgIGltcG9ydGVycyAoaS5lLiB0aG9zZSBvbiBib3RoIHN5cy5tZXRhX3BhdGggYW5kIHN5cy5wYXRoX2hvb2tzKS4KKyAgICBmaW5kZXJzIChpLmUuIHRob3NlIG9uIGJvdGggc3lzLm1ldGFfcGF0aCBhbmQgc3lzLnBhdGhfaG9va3MpLgogCiAgICAgSWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBpbiBhIHBhY2thZ2UsIHRoYXQgcGFja2FnZSBpcyBpbXBvcnRlZCBhcyBhIHNpZGUKICAgICBlZmZlY3Qgb2YgaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KIAotICAgIElmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCwgYWxsIHRvcCBsZXZlbCBpbXBvcnRlcnMgYXJlIHByb2R1Y2VkLgorICAgIElmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCwgYWxsIHRvcCBsZXZlbCBmaW5kZXJzIGFyZSBwcm9kdWNlZC4KICAgICAiIiIKICAgICBpZiBmdWxsbmFtZS5zdGFydHN3aXRoKCcuJyk6CiAgICAgICAgIG1zZyA9ICJSZWxhdGl2ZSBtb2R1bGUgbmFtZSB7IXJ9IG5vdCBzdXBwb3J0ZWQiLmZvcm1hdChmdWxsbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LWxpbnV4L3JlZ2VuIGIvTGliL3BsYXQtbGludXgvcmVnZW4KaW5kZXggYzc2OTUwZS4uMTA2MzNjYiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtbGludXgvcmVnZW4KKysrIGIvTGliL3BsYXQtbGludXgvcmVnZW4KQEAgLTEsOCArMSwzMyBAQAogIyEgL2Jpbi9zaAogY2FzZSBgdW5hbWVgIGluCi1MaW51eCopCTs7CitMaW51eCp8R05VKikJOzsKICopCWVjaG8gUHJvYmFibHkgbm90IG9uIGEgTGludXggc3lzdGVtIDE+JjIKIAlleGl0IDE7OwogZXNhYwotc2V0IC12Ci1oMnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIC91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggL3Vzci9pbmNsdWRlL2RsZmNuLmgKK2lmIFsgLXogIiRDQyIgXTsgdGhlbgorICAgIGVjaG8gPiYyICIkKGJhc2VuYW1lICQwKTogQ0MgaXMgbm90IHNldCIKKyAgICBleGl0IDEKK2ZpCitoZWFkZXJzPSJzeXMvdHlwZXMuaCBuZXRpbmV0L2luLmggZGxmY24uaCIKK2luY2RpcnM9IiQoZWNobyAkKCRDQyAtdiAtRSAtIDwgL2Rldi9udWxsIDI+JjF8YXdrICcvXiNpbmNsdWRlLywgL15FbmQgb2Ygc2VhcmNoLycgfCBncmVwICdeICcpKSIKK2lmIFsgLXogIiRpbmNkaXJzIiBdOyB0aGVuCisgICAgaW5jZGlycz0iL3Vzci9pbmNsdWRlIgorZmkKK2ZvciBoIGluICRoZWFkZXJzOyBkbworICAgIGFic2g9CisgICAgZm9yIGQgaW4gJGluY2RpcnM7IGRvCisJaWYgWyAtZiAiJGQvJGgiIF07IHRoZW4KKwkgICAgYWJzaD0iJGQvJGgiCisJICAgIGJyZWFrCisJZmkKKyAgICBkb25lCisgICAgaWYgWyAtbiAiJGFic2giIF07IHRoZW4KKwlhYnNoZWFkZXJzPSIkYWJzaGVhZGVycyAkYWJzaCIKKyAgICBlbHNlCisJZWNobyA+JjIgIiQoYmFzZW5hbWUgJDApOiBoZWFkZXIgJGggbm90IGZvdW5kIgorCWV4aXQgMQorICAgIGZpCitkb25lCisKK3NldCAteAorJHtIMlBZOi1oMnB5fSAtaSAnKHVfbG9uZyknICRhYnNoZWFkZXJzCmRpZmYgLS1naXQgYS9MaWIvcGxhdGZvcm0ucHkgYi9MaWIvcGxhdGZvcm0ucHkKaW5kZXggYjhmM2ViYy4uYTVkZDc2MyAxMDA3NTUKLS0tIGEvTGliL3BsYXRmb3JtLnB5CisrKyBiL0xpYi9wbGF0Zm9ybS5weQpAQCAtMTMsNyArMTMsNiBAQAogIyAgICBQeXRob24gYnVnIHRyYWNrZXIgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcpIGFuZCBhc3NpZ24gdGhlbSB0byAibGVtYnVyZyIuCiAjCiAjICAgIFN0aWxsIG5lZWRlZDoKLSMgICAgKiBtb3JlIHN1cHBvcnQgZm9yIFdpbkNFCiAjICAgICogc3VwcG9ydCBmb3IgTVMtRE9TIChQeXRob25EWCA/KQogIyAgICAqIHN1cHBvcnQgZm9yIEFtaWdhIGFuZCBvdGhlciBzdGlsbCB1bnN1cHBvcnRlZCBwbGF0Zm9ybXMgcnVubmluZyBQeXRob24KICMgICAgKiBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIExpbnV4IGRpc3RyaWJ1dGlvbnMKZGlmZiAtLWdpdCBhL0xpYi9wbGlzdGxpYi5weSBiL0xpYi9wbGlzdGxpYi5weQppbmRleCBiNjY2MzljLi40ZjM2MGYzIDEwMDY0NAotLS0gYS9MaWIvcGxpc3RsaWIucHkKKysrIGIvTGliL3BsaXN0bGliLnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAiIiIKIF9fYWxsX18gPSBbCiAgICAgInJlYWRQbGlzdCIsICJ3cml0ZVBsaXN0IiwgInJlYWRQbGlzdEZyb21CeXRlcyIsICJ3cml0ZVBsaXN0VG9CeXRlcyIsCi0gICAgIlBsaXN0IiwgIkRhdGEiLCAiRGljdCIsICJGTVRfWE1MIiwgIkZNVF9CSU5BUlkiLAorICAgICJQbGlzdCIsICJEYXRhIiwgIkRpY3QiLCAiSW52YWxpZEZpbGVFeGNlcHRpb24iLCAiRk1UX1hNTCIsICJGTVRfQklOQVJZIiwKICAgICAibG9hZCIsICJkdW1wIiwgImxvYWRzIiwgImR1bXBzIgogXQogCmRpZmYgLS1naXQgYS9MaWIvcG9zaXhwYXRoLnB5IGIvTGliL3Bvc2l4cGF0aC5weQppbmRleCBkOWYzZjk5Li42ZGJkYWIyIDEwMDY0NAotLS0gYS9MaWIvcG9zaXhwYXRoLnB5CisrKyBiL0xpYi9wb3NpeHBhdGgucHkKQEAgLTQ5LDYgKzQ5LDcgQEAKIAogZGVmIG5vcm1jYXNlKHMpOgogICAgICIiIk5vcm1hbGl6ZSBjYXNlIG9mIHBhdGhuYW1lLiAgSGFzIG5vIGVmZmVjdCB1bmRlciBQb3NpeCIiIgorICAgIHMgPSBvcy5mc3BhdGgocykKICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIHN0cikpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoIm5vcm1jYXNlKCkgYXJndW1lbnQgbXVzdCBiZSBzdHIgb3IgYnl0ZXMsICIKICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJ3t9JyIuZm9ybWF0KHMuX19jbGFzc19fLl9fbmFtZV9fKSkKQEAgLTYwLDYgKzYxLDcgQEAKIAogZGVmIGlzYWJzKHMpOgogICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUiIiIKKyAgICBzID0gb3MuZnNwYXRoKHMpCiAgICAgc2VwID0gX2dldF9zZXAocykKICAgICByZXR1cm4gcy5zdGFydHN3aXRoKHNlcCkKIApAQCAtNzMsMTIgKzc1LDEzIEBACiAgICAgSWYgYW55IGNvbXBvbmVudCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBhbGwgcHJldmlvdXMgcGF0aCBjb21wb25lbnRzCiAgICAgd2lsbCBiZSBkaXNjYXJkZWQuICBBbiBlbXB0eSBsYXN0IHBhcnQgd2lsbCByZXN1bHQgaW4gYSBwYXRoIHRoYXQKICAgICBlbmRzIHdpdGggYSBzZXBhcmF0b3IuIiIiCisgICAgYSA9IG9zLmZzcGF0aChhKQogICAgIHNlcCA9IF9nZXRfc2VwKGEpCiAgICAgcGF0aCA9IGEKICAgICB0cnk6CiAgICAgICAgIGlmIG5vdCBwOgogICAgICAgICAgICAgcGF0aFs6MF0gKyBzZXAgICMyMzc4MDogRW5zdXJlIGNvbXBhdGlibGUgZGF0YSB0eXBlIGV2ZW4gaWYgcCBpcyBudWxsLgotICAgICAgICBmb3IgYiBpbiBwOgorICAgICAgICBmb3IgYiBpbiBtYXAob3MuZnNwYXRoLCBwKToKICAgICAgICAgICAgIGlmIGIuc3RhcnRzd2l0aChzZXApOgogICAgICAgICAgICAgICAgIHBhdGggPSBiCiAgICAgICAgICAgICBlbGlmIG5vdCBwYXRoIG9yIHBhdGguZW5kc3dpdGgoc2VwKToKQEAgLTk5LDYgKzEwMiw3IEBACiBkZWYgc3BsaXQocCk6CiAgICAgIiIiU3BsaXQgYSBwYXRobmFtZS4gIFJldHVybnMgdHVwbGUgIihoZWFkLCB0YWlsKSIgd2hlcmUgInRhaWwiIGlzCiAgICAgZXZlcnl0aGluZyBhZnRlciB0aGUgZmluYWwgc2xhc2guICBFaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCisgICAgcCA9IG9zLmZzcGF0aChwKQogICAgIHNlcCA9IF9nZXRfc2VwKHApCiAgICAgaSA9IHAucmZpbmQoc2VwKSArIDEKICAgICBoZWFkLCB0YWlsID0gcFs6aV0sIHBbaTpdCkBAIC0xMTMsNiArMTE3LDcgQEAKICMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCiAKIGRlZiBzcGxpdGV4dChwKToKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgaWYgaXNpbnN0YW5jZShwLCBieXRlcyk6CiAgICAgICAgIHNlcCA9IGInLycKICAgICAgICAgZXh0c2VwID0gYicuJwpAQCAtMTI4LDYgKzEzMyw3IEBACiBkZWYgc3BsaXRkcml2ZShwKToKICAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gZHJpdmUgYW5kIHBhdGguIE9uIFBvc2l4LCBkcml2ZSBpcyBhbHdheXMKICAgICBlbXB0eS4iIiIKKyAgICBwID0gb3MuZnNwYXRoKHApCiAgICAgcmV0dXJuIHBbOjBdLCBwCiAKIApAQCAtMTM1LDYgKzE0MSw3IEBACiAKIGRlZiBiYXNlbmFtZShwKToKICAgICAiIiJSZXR1cm5zIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIHAgPSBvcy5mc3BhdGgocCkKICAgICBzZXAgPSBfZ2V0X3NlcChwKQogICAgIGkgPSBwLnJmaW5kKHNlcCkgKyAxCiAgICAgcmV0dXJuIHBbaTpdCkBAIC0xNDQsNiArMTUxLDcgQEAKIAogZGVmIGRpcm5hbWUocCk6CiAgICAgIiIiUmV0dXJucyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgcCA9IG9zLmZzcGF0aChwKQogICAgIHNlcCA9IF9nZXRfc2VwKHApCiAgICAgaSA9IHAucmZpbmQoc2VwKSArIDEKICAgICBoZWFkID0gcFs6aV0KQEAgLTIyMiw2ICsyMzAsNyBAQAogZGVmIGV4cGFuZHVzZXIocGF0aCk6CiAgICAgIiIiRXhwYW5kIH4gYW5kIH51c2VyIGNvbnN0cnVjdGlvbnMuICBJZiB1c2VyIG9yICRIT01FIGlzIHVua25vd24sCiAgICAgZG8gbm90aGluZy4iIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIHRpbGRlID0gYid+JwogICAgIGVsc2U6CkBAIC0yNjcsNiArMjc2LDcgQEAKIGRlZiBleHBhbmR2YXJzKHBhdGgpOgogICAgICIiIkV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgb2YgZm9ybSAkdmFyIGFuZCAke3Zhcn0uICBVbmtub3duIHZhcmlhYmxlcwogICAgIGFyZSBsZWZ0IHVuY2hhbmdlZC4iIiIKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgZ2xvYmFsIF92YXJwcm9nLCBfdmFycHJvZ2IKICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIGJ5dGVzKToKICAgICAgICAgaWYgYickJyBub3QgaW4gcGF0aDoKQEAgLTMxOCw2ICszMjgsNyBAQAogCiBkZWYgbm9ybXBhdGgocGF0aCk6CiAgICAgIiIiTm9ybWFsaXplIHBhdGgsIGVsaW1pbmF0aW5nIGRvdWJsZSBzbGFzaGVzLCBldGMuIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgYnl0ZXMpOgogICAgICAgICBzZXAgPSBiJy8nCiAgICAgICAgIGVtcHR5ID0gYicnCkBAIC0zNTUsNiArMzY2LDcgQEAKIAogZGVmIGFic3BhdGgocGF0aCk6CiAgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgcGF0aCA9IG9zLmZzcGF0aChwYXRoKQogICAgIGlmIG5vdCBpc2FicyhwYXRoKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2RiKCkKQEAgLTM3MCw2ICszODIsNyBAQAogZGVmIHJlYWxwYXRoKGZpbGVuYW1lKToKICAgICAiIiJSZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGVsaW1pbmF0aW5nIGFueQogc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgaW4gdGhlIHBhdGguIiIiCisgICAgZmlsZW5hbWUgPSBvcy5mc3BhdGgoZmlsZW5hbWUpCiAgICAgcGF0aCwgb2sgPSBfam9pbnJlYWxwYXRoKGZpbGVuYW1lWzowXSwgZmlsZW5hbWUsIHt9KQogICAgIHJldHVybiBhYnNwYXRoKHBhdGgpCiAKQEAgLTQzNCw2ICs0NDcsNyBAQAogICAgIGlmIG5vdCBwYXRoOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBwYXRoIHNwZWNpZmllZCIpCiAKKyAgICBwYXRoID0gb3MuZnNwYXRoKHBhdGgpCiAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBieXRlcyk6CiAgICAgICAgIGN1cmRpciA9IGInLicKICAgICAgICAgc2VwID0gYicvJwpAQCAtNDQ1LDYgKzQ1OSw4IEBACiAKICAgICBpZiBzdGFydCBpcyBOb25lOgogICAgICAgICBzdGFydCA9IGN1cmRpcgorICAgIGVsc2U6CisgICAgICAgIHN0YXJ0ID0gb3MuZnNwYXRoKHN0YXJ0KQogCiAgICAgdHJ5OgogICAgICAgICBzdGFydF9saXN0ID0gW3ggZm9yIHggaW4gYWJzcGF0aChzdGFydCkuc3BsaXQoc2VwKSBpZiB4XQpAQCAtNDcyLDYgKzQ4OCw3IEBACiAgICAgaWYgbm90IHBhdGhzOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjb21tb25wYXRoKCkgYXJnIGlzIGFuIGVtcHR5IHNlcXVlbmNlJykKIAorICAgIHBhdGhzID0gdHVwbGUobWFwKG9zLmZzcGF0aCwgcGF0aHMpKQogICAgIGlmIGlzaW5zdGFuY2UocGF0aHNbMF0sIGJ5dGVzKToKICAgICAgICAgc2VwID0gYicvJwogICAgICAgICBjdXJkaXIgPSBiJy4nCmRpZmYgLS1naXQgYS9MaWIvcHljbGJyLnB5IGIvTGliL3B5Y2xici5weQppbmRleCA0ZDQwYjg3Li5kN2RiYTk3IDEwMDY0NAotLS0gYS9MaWIvcHljbGJyLnB5CisrKyBiL0xpYi9weWNsYnIucHkKQEAgLTQwLDEyICs0MCwxMCBAQAogIiIiCiAKIGltcG9ydCBpbwotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCB0b2tlbml6ZQogZnJvbSB0b2tlbiBpbXBvcnQgTkFNRSwgREVERU5ULCBPUAotZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogCiBfX2FsbF9fID0gWyJyZWFkbW9kdWxlIiwgInJlYWRtb2R1bGVfZXgiLCAiQ2xhc3MiLCAiRnVuY3Rpb24iXQogCkBAIC0zMjgsNiArMzI2LDcgQEAKIGRlZiBfbWFpbigpOgogICAgICMgTWFpbiBwcm9ncmFtIGZvciB0ZXN0aW5nLgogICAgIGltcG9ydCBvcworICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKICAgICBtb2QgPSBzeXMuYXJndlsxXQogICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZCk6CiAgICAgICAgIHBhdGggPSBbb3MucGF0aC5kaXJuYW1lKG1vZCldCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwZDBkMGFiLi5kN2ExNzdmCi0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTIwOSw2ICsyMDksMTggQEAKICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKG5hbWUsIGtpbmQsIGNscywgdmFsdWUpKQogICAgIHJldHVybiByZXN1bHRzCiAKK2RlZiBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCk6CisgICAgJ1NvcnQgdGhlIGF0dHJzIGxpc3QgaW4tcGxhY2UgYnkgX2ZpZWxkcyBhbmQgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lJworICAgICMgVGhpcyBhbGxvd3MgZGF0YSBkZXNjcmlwdG9ycyB0byBiZSBvcmRlcmVkIGFjY29yZGluZworICAgICMgdG8gYSBfZmllbGRzIGF0dHJpYnV0ZSBpZiBwcmVzZW50LgorICAgIGZpZWxkcyA9IGdldGF0dHIob2JqZWN0LCAnX2ZpZWxkcycsIFtdKQorICAgIHRyeToKKyAgICAgICAgZmllbGRfb3JkZXIgPSB7bmFtZSA6IGktbGVuKGZpZWxkcykgZm9yIChpLCBuYW1lKSBpbiBlbnVtZXJhdGUoZmllbGRzKX0KKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBmaWVsZF9vcmRlciA9IHt9CisgICAga2V5ZnVuYyA9IGxhbWJkYSBhdHRyOiAoZmllbGRfb3JkZXIuZ2V0KGF0dHJbMF0sIDApLCBhdHRyWzBdKQorICAgIGF0dHJzLnNvcnQoa2V5PWtleWZ1bmMpCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIG1hbmlwdWxhdGlvbgogCiBkZWYgaXNwYWNrYWdlKHBhdGgpOgpAQCAtODY4LDggKzg4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQogICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJwogCi0gICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCdNZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCkBAIC0xMjg3LDggKzEyOTgsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB0YWcgPSAiaW5oZXJpdGVkIGZyb20gJXMiICUgY2xhc3NuYW1lKHRoaXNjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQotICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCi0gICAgICAgICAgICBhdHRycy5zb3J0KCkKKworICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCJNZXRob2RzICVzOlxuIiAlIHRhZywgYXR0cnMsCkBAIC0xNDE4LDEzICsxNDI5LDE0IEBACiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCiAgICAgaWYgbm90IHN5cy5zdGRpbi5pc2F0dHkoKSBvciBub3Qgc3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKLSAgICBpZiAnUEFHRVInIGluIG9zLmVudmlyb246CisgICAgdXNlX3BhZ2VyID0gb3MuZW52aXJvbi5nZXQoJ01BTlBBR0VSJykgb3Igb3MuZW52aXJvbi5nZXQoJ1BBR0VSJykKKyAgICBpZiB1c2VfcGFnZXI6CiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOiAjIHBpcGVzIGNvbXBsZXRlbHkgYnJva2VuIGluIFdpbmRvd3MKLSAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgdXNlX3BhZ2VyKQogICAgICAgICBlbGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6Ci0gICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHBsYWluKHRleHQpLCB1c2VfcGFnZXIpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcih0ZXh0LCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIodGV4dCwgdXNlX3BhZ2VyKQogICAgIGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6CiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CkBAIC0xOTAxLDEwICsxOTEzLDEwIEBACiAKICAgICBkZWYgaW50cm8oc2VsZik6CiAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJwotV2VsY29tZSB0byBQeXRob24gJXMncyBoZWxwIHV0aWxpdHkhCitXZWxjb21lIHRvIFB5dGhvbiB7MH0ncyBoZWxwIHV0aWxpdHkhCiAKIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIFB5dGhvbiwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGNoZWNrIG91dAotdGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnLyVzL3R1dG9yaWFsLy4KK3RoZSB0dXRvcmlhbCBvbiB0aGUgSW50ZXJuZXQgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy97MH0vdHV0b3JpYWwvLgogCiBFbnRlciB0aGUgbmFtZSBvZiBhbnkgbW9kdWxlLCBrZXl3b3JkLCBvciB0b3BpYyB0byBnZXQgaGVscCBvbiB3cml0aW5nCiBQeXRob24gcHJvZ3JhbXMgYW5kIHVzaW5nIFB5dGhvbiBtb2R1bGVzLiAgVG8gcXVpdCB0aGlzIGhlbHAgdXRpbGl0eSBhbmQKQEAgLTE5MTQsNyArMTkyNiw3IEBACiAibW9kdWxlcyIsICJrZXl3b3JkcyIsICJzeW1ib2xzIiwgb3IgInRvcGljcyIuICBFYWNoIG1vZHVsZSBhbHNvIGNvbWVzCiB3aXRoIGEgb25lLWxpbmUgc3VtbWFyeSBvZiB3aGF0IGl0IGRvZXM7IHRvIGxpc3QgdGhlIG1vZHVsZXMgd2hvc2UgbmFtZQogb3Igc3VtbWFyeSBjb250YWluIGEgZ2l2ZW4gc3RyaW5nIHN1Y2ggYXMgInNwYW0iLCB0eXBlICJtb2R1bGVzIHNwYW0iLgotJycnICUgdHVwbGUoW3N5cy52ZXJzaW9uWzozXV0qMikpCisnJycuZm9ybWF0KCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkpCiAKICAgICBkZWYgbGlzdChzZWxmLCBpdGVtcywgY29sdW1ucz00LCB3aWR0aD04MCk6CiAgICAgICAgIGl0ZW1zID0gbGlzdChzb3J0ZWQoaXRlbXMpKQpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CmluZGV4IGQ2ZjEzNjYuLjU5MGY2MTMgMTAwNjQ0Ci0tLSBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQorKysgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTEsNzkgKzEsMTI4MTAgQEAKICMgLSotIGNvZGluZzogdXRmLTggLSotCi0jIEF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54IG9uIFNhdCBKdW4gMjUgMTQ6MDg6NDQgMjAxNgotdG9waWNzID0geydhc3NlcnQnOiB1J1xuVGhlICJhc3NlcnQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nIGFzc2VydGlvbnNcbmludG8gYSBwcm9ncmFtOlxuXG4gICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG5cblRoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICAgaWYgbm90IGV4cHJlc3Npb246IHJhaXNlIEFzc2VydGlvbkVycm9yXG5cblRoZSBleHRlbmRlZCBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMiIsIGlzIGVxdWl2YWxlbnQgdG9cblxuICAgaWYgX19kZWJ1Z19fOlxuICAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCAiX19kZWJ1Z19fIiBhbmQgIkFzc2VydGlvbkVycm9yIiByZWZlclxudG8gdGhlIGJ1aWx0LWluIHZhcmlhYmxlcyB3aXRoIHRob3NlIG5hbWVzLiAgSW4gdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgIkZhbHNlIiB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgKGNvbW1hbmRcbmxpbmUgb3B0aW9uIC1PKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuXG5hc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlIHRpbWUuICBOb3RlXG50aGF0IGl0IGlzIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvblxudGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlXG5zdGFjayB0cmFjZS5cblxuQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAotICdhc3NpZ25tZW50JzogdSdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChzdGFycmVkX2V4cHJlc3Npb24gfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiBbdGFyZ2V0X2xpc3RdICJdIlxuICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXJlZlxuICAgICAgICAgICAgICB8IHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICB8IHNsaWNpbmdcbiAgICAgICAgICAgICAgfCAiKiIgdGFyZ2V0XG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3JcbiphdHRyaWJ1dGVyZWYqLCAqc3Vic2NyaXB0aW9uKiwgYW5kICpzbGljaW5nKi4pXG5cbkFuIGFzc2lnbm1lbnQgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0IChyZW1lbWJlciB0aGF0XG50aGlzIGNhbiBiZSBhIHNpbmdsZSBleHByZXNzaW9uIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHRoZSBsYXR0ZXJcbnlpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byBlYWNoIG9mXG50aGUgdGFyZ2V0IGxpc3RzLCBmcm9tIGxlZnQgdG8gcmlnaHQuXG5cbkFzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlIHRhcmdldFxuKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gYXR0cmlidXRlXG5yZWZlcmVuY2UsIHN1YnNjcmlwdGlvbiBvciBzbGljaW5nKSwgdGhlIG11dGFibGUgb2JqZWN0IG11c3RcbnVsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyB2YWxpZGl0eSwgYW5kXG5tYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NpZ25tZW50IGlzIHVuYWNjZXB0YWJsZS4gIFRoZSBydWxlc1xub2JzZXJ2ZWQgYnkgdmFyaW91cyB0eXBlcyBhbmQgdGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBnaXZlbiB3aXRoIHRoZVxuZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGVcbmhpZXJhcmNoeSopLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0LCBvcHRpb25hbGx5IGVuY2xvc2VkIGluXG5wYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMsIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMgZm9sbG93cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgZW1wdHk6IFRoZSBvYmplY3QgbXVzdCBhbHNvIGJlIGFuIGVtcHR5XG4gIGl0ZXJhYmxlLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQgaW4gcGFyZW50aGVzZXM6IFRoZSBvYmplY3RcbiAgaXMgYXNzaWduZWQgdG8gdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cywgb3IgYVxuICBzaW5nbGUgdGFyZ2V0IGluIHNxdWFyZSBicmFja2V0czogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlXG4gIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXRcbiAgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlXG4gIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW5cbiAgICBhc3RlcmlzaywgY2FsbGVkIGEgInN0YXJyZWQiIHRhcmdldDogVGhlIG9iamVjdCBtdXN0IGJlIGFuXG4gICAgaXRlcmFibGUgd2l0aCBhdCBsZWFzdCBhcyBtYW55IGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZVxuICAgIHRhcmdldCBsaXN0LCBtaW51cyBvbmUuICBUaGUgZmlyc3QgaXRlbXMgb2YgdGhlIGl0ZXJhYmxlIGFyZVxuICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSB0YXJnZXRzIGJlZm9yZSB0aGUgc3RhcnJlZFxuICAgIHRhcmdldC4gIFRoZSBmaW5hbCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkIHRvIHRoZVxuICAgIHRhcmdldHMgYWZ0ZXIgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgQSBsaXN0IG9mIHRoZSByZW1haW5pbmcgaXRlbXNcbiAgICBpbiB0aGUgaXRlcmFibGUgaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgc3RhcnJlZCB0YXJnZXQgKHRoZSBsaXN0XG4gICAgY2FuIGJlIGVtcHR5KS5cblxuICAqIEVsc2U6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZlxuICAgIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmVcbiAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhc1xuZm9sbG93cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGlkZW50aWZpZXIgKG5hbWUpOlxuXG4gICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSAiZ2xvYmFsIiBvciAibm9ubG9jYWwiIHN0YXRlbWVudFxuICAgIGluIHRoZSBjdXJyZW50IGNvZGUgYmxvY2s6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlXG4gICAgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UuXG5cbiAgKiBPdGhlcndpc2U6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGdsb2JhbFxuICAgIG5hbWVzcGFjZSBvciB0aGUgb3V0ZXIgbmFtZXNwYWNlIGRldGVybWluZWQgYnkgIm5vbmxvY2FsIixcbiAgICByZXNwZWN0aXZlbHkuXG5cbiAgVGhlIG5hbWUgaXMgcmVib3VuZCBpZiBpdCB3YXMgYWxyZWFkeSBib3VuZC4gIFRoaXMgbWF5IGNhdXNlIHRoZVxuICByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBvYmplY3QgcHJldmlvdXNseSBib3VuZCB0byB0aGUgbmFtZSB0byByZWFjaFxuICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyBkZXN0cnVjdG9yIChpZiBpdFxuICBoYXMgb25lKSB0byBiZSBjYWxsZWQuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluXG4gIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4gIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsICJUeXBlRXJyb3IiIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAiQXR0cmlidXRlRXJyb3IiKS5cblxuICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlXG4gIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTIGV4cHJlc3Npb24sXG4gICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2VcbiAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCAiYS54IiBpcyBhbHdheXNcbiAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgVGh1cywgdGhlXG4gIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlIHNhbWVcbiAgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLCB0aGVcbiAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4gIGFzc2lnbm1lbnQ6XG5cbiAgICAgY2xhc3MgQ2xzOlxuICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuICAgICBpbnN0ID0gQ2xzKClcbiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgM1xuXG4gIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlXG4gIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWRcbiAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgSWYgdGhlXG4gIGluZGV4IGlzIG91dCBvZiByYW5nZSwgIkluZGV4RXJyb3IiIGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byBhXG4gIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4gIEZvciB1c2VyLWRlZmluZWQgb2JqZWN0cywgdGhlICJfX3NldGl0ZW1fXygpIiBtZXRob2QgaXMgY2FsbGVkIHdpdGhcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3RcbiAgKHN1Y2ggYXMgYSBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0XG4gIG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZVxuICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuICBzZXF1ZW5jZVwncyBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gSWZcbiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlXG4gIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCwgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlXG4gIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgbGVuZ3RoIG9mXG4gIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UsXG4gIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgdGFyZ2V0XG4gIHNlcXVlbmNlIGFsbG93cyBpdC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlXG5zeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCBhbmRcbmludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCBjYXVzaW5nXG5sZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuXG5BbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyBiZXR3ZWVuXG50aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlIFwnc2ltdWx0YW5lb3VzXCcgKGZvclxuZXhhbXBsZSAiYSwgYiA9IGIsIGEiIHN3YXBzIHR3byB2YXJpYWJsZXMpLCBvdmVybGFwcyAqd2l0aGluKiB0aGVcbmNvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIG9jY3VyIGxlZnQtdG8tcmlnaHQsIHNvbWV0aW1lc1xucmVzdWx0aW5nIGluIGNvbmZ1c2lvbi4gIEZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHByaW50c1xuIlswLCAyXSI6XG5cbiAgIHggPSBbMCwgMV1cbiAgIGkgPSAwXG4gICBpLCB4W2ldID0gMSwgMiAgICAgICAgICMgaSBpcyB1cGRhdGVkLCB0aGVuIHhbaV0gaXMgdXBkYXRlZFxuICAgcHJpbnQoeClcblxuU2VlIGFsc286ICoqUEVQIDMxMzIqKiAtIEV4dGVuZGVkIEl0ZXJhYmxlIFVucGFja2luZ1xuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIip0YXJnZXQiIGZlYXR1cmUuXG5cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4gICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSByZXdyaXR0ZW4gYXNcbiJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGVcbmF1Z21lbnRlZCB2ZXJzaW9uLCAieCIgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlbiBwb3NzaWJsZSxcbnRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgcmF0aGVyIHRoYW5cbmNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCBvYmplY3RcbmlzIG1vZGlmaWVkIGluc3RlYWQuXG5cblVubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgbGVmdC1cbmhhbmQgc2lkZSAqYmVmb3JlKiBldmFsdWF0aW5nIHRoZSByaWdodC1oYW5kIHNpZGUuICBGb3IgZXhhbXBsZSwgImFbaV1cbis9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCBwZXJmb3Jtc1xudGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCi0gJ2F0b20taWRlbnRpZmllcnMnOiB1J1xuSWRlbnRpZmllcnMgKE5hbWVzKVxuKioqKioqKioqKioqKioqKioqKlxuXG5BbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSBzZWN0aW9uXG4qSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzKiBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uICpOYW1pbmdcbmFuZCBiaW5kaW5nKiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuXG5cbldoZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW4gb2JqZWN0LCBldmFsdWF0aW9uIG9mIHRoZSBhdG9tIHlpZWxkc1xudGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdFxucmFpc2VzIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uLlxuXG4qKlByaXZhdGUgbmFtZSBtYW5nbGluZzoqKiBXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCB0ZXh0dWFsbHkgb2NjdXJzIGluXG5hIGNsYXNzIGRlZmluaXRpb24gYmVnaW5zIHdpdGggdHdvIG9yIG1vcmUgdW5kZXJzY29yZSBjaGFyYWN0ZXJzIGFuZFxuZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyBjb25zaWRlcmVkIGEgKnByaXZhdGVcbm5hbWUqIG9mIHRoYXQgY2xhc3MuIFByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgbG9uZ2VyIGZvcm1cbmJlZm9yZSBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdGhlbS4gIFRoZSB0cmFuc2Zvcm1hdGlvbiBpbnNlcnRzIHRoZVxuY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgc2luZ2xlIHVuZGVyc2NvcmVcbmluc2VydGVkLCBpbiBmcm9udCBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpZmllciAiX19zcGFtIlxub2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgIkhhbSIgd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byAiX0hhbV9fc3BhbSIuXG5UaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCBjb250ZXh0IGluIHdoaWNoXG50aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMgZXh0cmVtZWx5IGxvbmdcbihsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyksIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHJ1bmNhdGlvbiBtYXlcbmhhcHBlbi4gSWYgdGhlIGNsYXNzIG5hbWUgY29uc2lzdHMgb25seSBvZiB1bmRlcnNjb3Jlcywgbm9cbnRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuXG4nLAotICdhdG9tLWxpdGVyYWxzJzogdSJcbkxpdGVyYWxzXG4qKioqKioqKlxuXG5QeXRob24gc3VwcG9ydHMgc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljXG5saXRlcmFsczpcblxuICAgbGl0ZXJhbCA6Oj0gc3RyaW5nbGl0ZXJhbCB8IGJ5dGVzbGl0ZXJhbFxuICAgICAgICAgICAgICAgfCBpbnRlZ2VyIHwgZmxvYXRudW1iZXIgfCBpbWFnbnVtYmVyXG5cbkV2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgKHN0cmluZyxcbmJ5dGVzLCBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCBudW1iZXIsIGNvbXBsZXggbnVtYmVyKSB3aXRoIHRoZSBnaXZlblxudmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiBmbG9hdGluZyBwb2ludFxuYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiAqTGl0ZXJhbHMqIGZvciBkZXRhaWxzLlxuXG5BbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZVxub2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZVxuZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSBzYW1lXG5vY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpblxudGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuIiwKLSAnYXR0cmlidXRlLWFjY2Vzcyc6IHUnXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgIngubmFtZSIpIGZvclxuY2xhc3MgaW5zdGFuY2VzLlxuXG5vYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlXG4gICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmRcbiAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4gVGhpc1xuICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cblxuICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSxcbiAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyBkb25lIGJvdGggZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlXG4gICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSB0aGF0IGF0XG4gICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieSBub3RcbiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cblxub2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvclxuICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAiX19nZXRhdHRyX18oKSIsXG4gICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4gICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzIG1ldGhvZFxuICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW5cbiAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzXG4gICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yXG4gICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWxcbiAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheFxuICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwKi5cblxub2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlXG4gICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXRcbiAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLFxuICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXNcbiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG5cbm9iamVjdC5fX2Rpcl9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgc2VxdWVuY2UgbXVzdCBiZVxuICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgbGlzdCBhbmRcbiAgIHNvcnRzIGl0LlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuPT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG5cbm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcblxuICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlXG4gICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZVxuICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAqaW5zdGFuY2UqIGlzIHRoZVxuICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAiTm9uZSIgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciJcbiAgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZSBhc1xuc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgdGhpc1xuYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljIGNsYXNzXG5hdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlXG5naXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgZmlyc3RcbnBvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyBhdHRyaWJ1dGUgZm9yXG51bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG5cblxuSW52b2tpbmcgRGVzY3JpcHRvcnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmdcbmJlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzXG5pbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kXG4iX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwgaXRcbmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlXG50aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0XCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgImEueCIgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbiJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZlxuInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuXG5cblRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgImEueCIuIEhvd1xudGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cblxuSW5zdGFuY2UgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlXG4gICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDpcbiAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cblxuU3VwZXIgQmluZGluZ1xuICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgInN1cGVyKEIsXG4gICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSBiYXNlIGNsYXNzICJBIlxuICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlXG4gICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pIi5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAiX19kZWxldGVfXygpIi4gIElmIGl0XG5kb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbnRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlIG9iamVjdFwnc1xuaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgYW5kL29yXG4iX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgbmVpdGhlciwgaXQgaXNcbmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoXG4iX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGVcbiJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgIl9fZ2V0X18oKSJcbmRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJblxuY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy5cblxuUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAiY2xhc3NtZXRob2QoKSIpIGFyZVxuaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuXG5BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS5cblxuXG5fX3Nsb3RzX19cbj09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlXG5zdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlXG52YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuIGNyZWF0aW5nIGxhcmdlXG5udW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBjbGFzc1xuZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbnZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byBob2xkIGFcbnZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzIG5vdFxuY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxub2JqZWN0Ll9fc2xvdHNfX1xuXG4gICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4gICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAqX19zbG90c19fKlxuICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZVxuICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2hcbiAgIGluc3RhbmNlLlxuXG5cbk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzXG4gIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHNcbiAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbiAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGVcbiAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZVxuICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuXG4gIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgImJ5dGVzIiBhbmQgInR1cGxlIi5cblxuKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4gIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyBtYXkgYmVcbiAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuXG4qICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZVxuICAqX19zbG90c19fKi5cbicsCi0gJ2F0dHJpYnV0ZS1yZWZlcmVuY2VzJzogdSdcbkF0dHJpYnV0ZSByZWZlcmVuY2VzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgcHJpbWFyeSBmb2xsb3dlZCBieSBhIHBlcmlvZCBhbmQgYSBuYW1lOlxuXG4gICBhdHRyaWJ1dGVyZWYgOjo9IHByaW1hcnkgIi4iIGlkZW50aWZpZXJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHNcbmF0dHJpYnV0ZSByZWZlcmVuY2VzLCB3aGljaCBtb3N0IG9iamVjdHMgZG8uICBUaGlzIG9iamVjdCBpcyB0aGVuXG5hc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGUgaWRlbnRpZmllci4gIFRoaXNcbnByb2R1Y3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUgIl9fZ2V0YXR0cl9fKCkiIG1ldGhvZC5cbklmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBleGNlcHRpb24gIkF0dHJpYnV0ZUVycm9yIiBpc1xucmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgdHlwZSBhbmQgdmFsdWUgb2YgdGhlIG9iamVjdCBwcm9kdWNlZCBpc1xuZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2YgdGhlIHNhbWUgYXR0cmlidXRlXG5yZWZlcmVuY2UgbWF5IHlpZWxkIGRpZmZlcmVudCBvYmplY3RzLlxuJywKLSAnYXVnYXNzaWduJzogdSdcbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWxcbmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uXG5saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50XG5vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuXG5UaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzXG4ieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW4gdGhlXG5hdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsXG50aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuXG5jcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgb2JqZWN0XG5pcyBtb2RpZmllZCBpbnN0ZWFkLlxuXG5Vbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlIGxlZnQtXG5oYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldXG4rPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXNcbnRoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAiYVtpXSIuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAotICdiaW5hcnknOiB1J1xuQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHlcbmxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluIG5vbi1cbm51bWVyaWMgdHlwZXMuICBBcGFydCBmcm9tIHRoZSBwb3dlciBvcGVyYXRvciwgdGhlcmUgYXJlIG9ubHkgdHdvXG5sZXZlbHMsIG9uZSBmb3IgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzIGFuZCBvbmUgZm9yIGFkZGl0aXZlXG5vcGVyYXRvcnM6XG5cbiAgIG1fZXhwciA6Oj0gdV9leHByIHwgbV9leHByICIqIiB1X2V4cHIgfCBtX2V4cHIgIkAiIG1fZXhwciB8XG4gICAgICAgICAgICAgIG1fZXhwciAiLy8iIHVfZXhwcnwgbV9leHByICIvIiB1X2V4cHIgfFxuICAgICAgICAgICAgICBtX2V4cHIgIiUiIHVfZXhwclxuICAgYV9leHByIDo6PSBtX2V4cHIgfCBhX2V4cHIgIisiIG1fZXhwciB8IGFfZXhwciAiLSIgbV9leHByXG5cblRoZSAiKiIgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzIGFyZ3VtZW50cy5cblRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnQgbXVzdCBiZSBhblxuaW50ZWdlciBhbmQgdGhlIG90aGVyIG11c3QgYmUgYSBzZXF1ZW5jZS4gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGVcbm51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZCB0aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuXG5JbiB0aGUgbGF0dGVyIGNhc2UsIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgcGVyZm9ybWVkOyBhIG5lZ2F0aXZlXG5yZXBldGl0aW9uIGZhY3RvciB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UuXG5cblRoZSAiQCIgKGF0KSBvcGVyYXRvciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXRyaXhcbm11bHRpcGxpY2F0aW9uLiAgTm8gYnVpbHRpbiBQeXRob24gdHlwZXMgaW1wbGVtZW50IHRoaXMgb3BlcmF0b3IuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNS5cblxuVGhlICIvIiAoZGl2aXNpb24pIGFuZCAiLy8iIChmbG9vciBkaXZpc2lvbikgb3BlcmF0b3JzIHlpZWxkIHRoZVxucXVvdGllbnQgb2YgdGhlaXIgYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuIERpdmlzaW9uIG9mIGludGVnZXJzIHlpZWxkcyBhIGZsb2F0LCB3aGlsZVxuZmxvb3IgZGl2aXNpb24gb2YgaW50ZWdlcnMgcmVzdWx0cyBpbiBhbiBpbnRlZ2VyOyB0aGUgcmVzdWx0IGlzIHRoYXRcbm9mIG1hdGhlbWF0aWNhbCBkaXZpc2lvbiB3aXRoIHRoZSBcJ2Zsb29yXCcgZnVuY3Rpb24gYXBwbGllZCB0byB0aGVcbnJlc3VsdC4gIERpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHRoZSAiWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi5cblxuVGhlICIlIiAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZlxudGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlXG4iWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBlLmcuLCAiMy4xNCUwLjciIGVxdWFscyAiMC4zNCIgKHNpbmNlICIzLjE0IiBlcXVhbHMgIjQqMC43ICtcbjAuMzQiLikgIFRoZSBtb2R1bG8gb3BlcmF0b3IgYWx3YXlzIHlpZWxkcyBhIHJlc3VsdCB3aXRoIHRoZSBzYW1lIHNpZ25cbmFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0IGlzXG5zdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBbMV0uXG5cblRoZSBmbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmdcbmlkZW50aXR5OiAieCA9PSAoeC8veSkqeSArICh4JXkpIi4gIEZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gYXJlIGFsc29cbmNvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAiZGl2bW9kKCkiOiAiZGl2bW9kKHgsIHkpID09XG4oeC8veSwgeCV5KSIuIFsyXS5cblxuSW4gYWRkaXRpb24gdG8gcGVyZm9ybWluZyB0aGUgbW9kdWxvIG9wZXJhdGlvbiBvbiBudW1iZXJzLCB0aGUgIiUiXG5vcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIG9iamVjdHMgdG8gcGVyZm9ybSBvbGQtc3R5bGVcbnN0cmluZyBmb3JtYXR0aW5nIChhbHNvIGtub3duIGFzIGludGVycG9sYXRpb24pLiAgVGhlIHN5bnRheCBmb3JcbnN0cmluZyBmb3JtYXR0aW5nIGlzIGRlc2NyaWJlZCBpbiB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlLFxuc2VjdGlvbiAqcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKi5cblxuVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvIG9wZXJhdG9yLCBhbmQgdGhlICJkaXZtb2QoKSJcbmZ1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byBhXG5mbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcgdGhlICJhYnMoKSIgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG5cblRoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlXG5hcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggYmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lXG50eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGVcbmFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlXG5jb25jYXRlbmF0ZWQuXG5cblRoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzIGFyZ3VtZW50cy5cblRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG4nLAotICdiaXR3aXNlJzogdSdcbkJpbmFyeSBiaXR3aXNlIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuRWFjaCBvZiB0aGUgdGhyZWUgYml0d2lzZSBvcGVyYXRpb25zIGhhcyBhIGRpZmZlcmVudCBwcmlvcml0eSBsZXZlbDpcblxuICAgYW5kX2V4cHIgOjo9IHNoaWZ0X2V4cHIgfCBhbmRfZXhwciAiJiIgc2hpZnRfZXhwclxuICAgeG9yX2V4cHIgOjo9IGFuZF9leHByIHwgeG9yX2V4cHIgIl4iIGFuZF9leHByXG4gICBvcl9leHByICA6Oj0geG9yX2V4cHIgfCBvcl9leHByICJ8IiB4b3JfZXhwclxuXG5UaGUgIiYiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBBTkQgb2YgaXRzIGFyZ3VtZW50cywgd2hpY2ggbXVzdFxuYmUgaW50ZWdlcnMuXG5cblRoZSAiXiIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIFhPUiAoZXhjbHVzaXZlIE9SKSBvZiBpdHNcbmFyZ3VtZW50cywgd2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cblxuVGhlICJ8IiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cyxcbndoaWNoIG11c3QgYmUgaW50ZWdlcnMuXG4nLAotICdibHRpbi1jb2RlLW9iamVjdHMnOiB1J1xuQ29kZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQgInBzZXVkby1cbmNvbXBpbGVkIiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiBib2R5LiBUaGV5IGRpZmZlclxuZnJvbSBmdW5jdGlvbiBvYmplY3RzIGJlY2F1c2UgdGhleSBkb25cJ3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpclxuZ2xvYmFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gIENvZGUgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgdGhlIGJ1aWx0LVxuaW4gImNvbXBpbGUoKSIgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzXG50aHJvdWdoIHRoZWlyICJfX2NvZGVfXyIgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgImNvZGUiIG1vZHVsZS5cblxuQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgaXQgKGluc3RlYWQgb2YgYVxuc291cmNlIHN0cmluZykgdG8gdGhlICJleGVjKCkiIG9yICJldmFsKCkiICBidWlsdC1pbiBmdW5jdGlvbnMuXG5cblNlZSAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCi0gJ2JsdGluLWVsbGlwc2lzLW9iamVjdCc6IHUnXG5UaGUgRWxsaXBzaXMgT2JqZWN0XG4qKioqKioqKioqKioqKioqKioqXG5cblRoaXMgb2JqZWN0IGlzIGNvbW1vbmx5IHVzZWQgYnkgc2xpY2luZyAoc2VlICpTbGljaW5ncyopLiAgSXQgc3VwcG9ydHNcbm5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIGVsbGlwc2lzIG9iamVjdCwgbmFtZWRcbiJFbGxpcHNpcyIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShFbGxpcHNpcykoKSIgcHJvZHVjZXMgdGhlXG4iRWxsaXBzaXMiIHNpbmdsZXRvbi5cblxuSXQgaXMgd3JpdHRlbiBhcyAiRWxsaXBzaXMiIG9yICIuLi4iLlxuJywKLSAnYmx0aW4tbnVsbC1vYmplY3QnOiB1J1xuVGhlIE51bGwgT2JqZWN0XG4qKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuIGFcbnZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgbnVsbFxub2JqZWN0LCBuYW1lZCAiTm9uZSIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShOb25lKSgpIiBwcm9kdWNlcyB0aGVcbnNhbWUgc2luZ2xldG9uLlxuXG5JdCBpcyB3cml0dGVuIGFzICJOb25lIi5cbicsCi0gJ2JsdGluLXR5cGUtb2JqZWN0cyc6IHUnXG5UeXBlIE9iamVjdHNcbioqKioqKioqKioqKlxuXG5UeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuIG9iamVjdFwncyB0eXBlIGlzXG5hY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInR5cGUoKSIuICBUaGVyZSBhcmUgbm8gc3BlY2lhbFxub3BlcmF0aW9ucyBvbiB0eXBlcy4gIFRoZSBzdGFuZGFyZCBtb2R1bGUgInR5cGVzIiBkZWZpbmVzIG5hbWVzIGZvclxuYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLlxuXG5UeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICI8Y2xhc3MgXCdpbnRcJz4iLlxuJywKLSAnYm9vbGVhbnMnOiB1J1xuQm9vbGVhbiBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKipcblxuICAgb3JfdGVzdCAgOjo9IGFuZF90ZXN0IHwgb3JfdGVzdCAib3IiIGFuZF90ZXN0XG4gICBhbmRfdGVzdCA6Oj0gbm90X3Rlc3QgfCBhbmRfdGVzdCAiYW5kIiBub3RfdGVzdFxuICAgbm90X3Rlc3QgOjo9IGNvbXBhcmlzb24gfCAibm90IiBub3RfdGVzdFxuXG5JbiB0aGUgY29udGV4dCBvZiBCb29sZWFuIG9wZXJhdGlvbnMsIGFuZCBhbHNvIHdoZW4gZXhwcmVzc2lvbnMgYXJlXG51c2VkIGJ5IGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIGZhbHNlOiAiRmFsc2UiLCAiTm9uZSIsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG5kaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIHRydWUuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gY3VzdG9taXplIHRoZWlyIHRydXRoIHZhbHVlIGJ5XG5wcm92aWRpbmcgYSAiX19ib29sX18oKSIgbWV0aG9kLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCIgeWllbGRzICJUcnVlIiBpZiBpdHMgYXJndW1lbnQgaXMgZmFsc2UsICJGYWxzZSJcbm90aGVyd2lzZS5cblxuVGhlIGV4cHJlc3Npb24gInggYW5kIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuVGhlIGV4cHJlc3Npb24gInggb3IgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIHRydWUsIGl0cyB2YWx1ZVxuaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpc1xucmV0dXJuZWQuXG5cbihOb3RlIHRoYXQgbmVpdGhlciAiYW5kIiBub3IgIm9yIiByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleVxucmV0dXJuIHRvICJGYWxzZSIgYW5kICJUcnVlIiwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgZXZhbHVhdGVkXG5hcmd1bWVudC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgInMiIGlzIGEgc3RyaW5nIHRoYXRcbnNob3VsZCBiZSByZXBsYWNlZCBieSBhIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMgZW1wdHksIHRoZSBleHByZXNzaW9uXG4icyBvciBcJ2Zvb1wnIiB5aWVsZHMgdGhlIGRlc2lyZWQgdmFsdWUuICBCZWNhdXNlICJub3QiIGhhcyB0byBjcmVhdGUgYVxubmV3IHZhbHVlLCBpdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGl0c1xuYXJndW1lbnQgKGZvciBleGFtcGxlLCAibm90IFwnZm9vXCciIHByb2R1Y2VzICJGYWxzZSIgcmF0aGVyIHRoYW4gIlwnXCciLilcbicsCi0gJ2JyZWFrJzogdSdcblRoZSAiYnJlYWsiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGJyZWFrX3N0bXQgOjo9ICJicmVhayJcblxuImJyZWFrIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSJcbmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdFxubG9vcC5cblxuSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsICJlbHNlIlxuY2xhdXNlIGlmIHRoZSBsb29wIGhhcyBvbmUuXG5cbklmIGEgImZvciIgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0XG5rZWVwcyBpdHMgY3VycmVudCB2YWx1ZS5cblxuV2hlbiAiYnJlYWsiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgImZpbmFsbHkiXG5jbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlXG5sb29wLlxuJywKLSAnY2FsbGFibGUtdHlwZXMnOiB1J1xuRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZFxuICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cbicsCi0gJ2NhbGxzJzogdSdcbkNhbGxzXG4qKioqKlxuXG5BIGNhbGwgY2FsbHMgYSBjYWxsYWJsZSBvYmplY3QgKGUuZy4sIGEgKmZ1bmN0aW9uKikgd2l0aCBhIHBvc3NpYmx5XG5lbXB0eSBzZXJpZXMgb2YgKmFyZ3VtZW50cyo6XG5cbiAgIGNhbGwgICAgICAgICAgICAgICAgIDo6PSBwcmltYXJ5ICIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXSB8IGNvbXByZWhlbnNpb25dICIpIlxuICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIgc3RhcnJlZF9hbmRfa2V5d29yZHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXVxuICAgICAgICAgICAgICAgICAgICAgfCBzdGFycmVkX2FuZF9rZXl3b3JkcyBbIiwiIGtleXdvcmRzX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZHNfYXJndW1lbnRzXG4gICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gWyIqIl0gZXhwcmVzc2lvbiAoIiwiIFsiKiJdIGV4cHJlc3Npb24pKlxuICAgc3RhcnJlZF9hbmRfa2V5d29yZHMgOjo9ICgiKiIgZXhwcmVzc2lvbiB8IGtleXdvcmRfaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiICIqIiBleHByZXNzaW9uIHwgIiwiIGtleXdvcmRfaXRlbSkqXG4gICBrZXl3b3Jkc19hcmd1bWVudHMgICA6Oj0gKGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pKlxuICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb25cblxuQW4gb3B0aW9uYWwgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kXG5rZXl3b3JkIGFyZ3VtZW50cyBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzZW1hbnRpY3MuXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYSBjYWxsYWJsZSBvYmplY3QgKHVzZXItZGVmaW5lZFxuZnVuY3Rpb25zLCBidWlsdC1pbiBmdW5jdGlvbnMsIG1ldGhvZHMgb2YgYnVpbHQtaW4gb2JqZWN0cywgY2xhc3Ncbm9iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MgaW5zdGFuY2VzLCBhbmQgYWxsIG9iamVjdHMgaGF2aW5nIGFcbiJfX2NhbGxfXygpIiBtZXRob2QgYXJlIGNhbGxhYmxlKS4gIEFsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmVcbmV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGwgaXMgYXR0ZW1wdGVkLiAgUGxlYXNlIHJlZmVyIHRvIHNlY3Rpb25cbipGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgZm9ybWFsICpwYXJhbWV0ZXIqIGxpc3RzLlxuXG5JZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgZmlyc3QgY29udmVydGVkIHRvXG5wb3NpdGlvbmFsIGFyZ3VtZW50cywgYXMgZm9sbG93cy4gIEZpcnN0LCBhIGxpc3Qgb2YgdW5maWxsZWQgc2xvdHMgaXNcbmNyZWF0ZWQgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycy4gIElmIHRoZXJlIGFyZSBOIHBvc2l0aW9uYWxcbmFyZ3VtZW50cywgdGhleSBhcmUgcGxhY2VkIGluIHRoZSBmaXJzdCBOIHNsb3RzLiAgTmV4dCwgZm9yIGVhY2hcbmtleXdvcmQgYXJndW1lbnQsIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZVxuY29ycmVzcG9uZGluZyBzbG90IChpZiB0aGUgaWRlbnRpZmllciBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgZm9ybWFsXG5wYXJhbWV0ZXIgbmFtZSwgdGhlIGZpcnN0IHNsb3QgaXMgdXNlZCwgYW5kIHNvIG9uKS4gIElmIHRoZSBzbG90IGlzXG5hbHJlYWR5IGZpbGxlZCwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZVxudmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiB0aGVcbmV4cHJlc3Npb24gaXMgIk5vbmUiLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlXG5jb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0XG52YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbm11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGxcbmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb25cJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55XG51bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGEgIlR5cGVFcnJvciJcbmV4Y2VwdGlvbiBpcyByYWlzZWQuICBPdGhlcndpc2UsIHRoZSBsaXN0IG9mIGZpbGxlZCBzbG90cyBpcyB1c2VkIGFzXG50aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGNhbGwuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGVcbmJ1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgbmFtZXMsIGV2ZW5cbmlmIHRoZXkgYXJlIFwnbmFtZWRcJyBmb3IgdGhlIHB1cnBvc2Ugb2YgZG9jdW1lbnRhdGlvbiwgYW5kIHdoaWNoXG50aGVyZWZvcmUgY2Fubm90IGJlIHN1cHBsaWVkIGJ5IGtleXdvcmQuICBJbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSBjYXNlXG5mb3IgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIEMgdGhhdCB1c2UgIlB5QXJnX1BhcnNlVHVwbGUoKSIgdG8gcGFyc2VcbnRoZWlyIGFyZ3VtZW50cy5cblxuSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsIHBhcmFtZXRlclxuc2xvdHMsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWxcbnBhcmFtZXRlciByZWNlaXZlcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuKG9yIGFuIGVtcHR5IHR1cGxlIGlmIHRoZXJlIHdlcmUgbm8gZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzKS5cblxuSWYgYW55IGtleXdvcmQgYXJndW1lbnQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZvcm1hbCBwYXJhbWV0ZXJcbm5hbWUsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCAiKippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsXG5wYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG5hcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG5jb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vXG5leGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG5cbklmIHRoZSBzeW50YXggIipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLCAiZXhwcmVzc2lvbiJcbm11c3QgZXZhbHVhdGUgdG8gYW4gKml0ZXJhYmxlKi4gIEVsZW1lbnRzIGZyb20gdGhlc2UgaXRlcmFibGVzIGFyZVxudHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZvciB0aGUgY2FsbFxuImYoeDEsIHgyLCAqeSwgeDMsIHg0KSIsIGlmICp5KiBldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCAuLi4sXG4qeU0qLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsIHdpdGggTSs0IHBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosXG4qeDIqLCAqeTEqLCAuLi4sICp5TSosICp4MyosICp4NCouXG5cbkEgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheCBtYXlcbmFwcGVhciAqYWZ0ZXIqIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSpcbnRoZSBrZXl3b3JkIGFyZ3VtZW50cyAoYW5kIGFueSAiKipleHByZXNzaW9uIiBhcmd1bWVudHMgLS0gc2VlIGJlbG93KS5cblNvOlxuXG4gICA+Pj4gZGVmIGYoYSwgYik6XG4gICAuLi4gICAgIHByaW50KGEsIGIpXG4gICAuLi5cbiAgID4+PiBmKGI9MSwgKigyLCkpXG4gICAyIDFcbiAgID4+PiBmKGE9MSwgKigyLCkpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgXCdhXCdcbiAgID4+PiBmKDEsICooMiwpKVxuICAgMSAyXG5cbkl0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheFxudG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZSB0aGlzIGNvbmZ1c2lvbiBkb2VzIG5vdFxuYXJpc2UuXG5cbklmIHRoZSBzeW50YXggIioqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCxcbiJleHByZXNzaW9uIiBtdXN0IGV2YWx1YXRlIHRvIGEgKm1hcHBpbmcqLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlXG50cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBJZiBhIGtleXdvcmQgaXMgYWxyZWFkeVxucHJlc2VudCAoYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwgb3IgZnJvbSBhbm90aGVyIHVucGFja2luZyksXG5hICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5cbkZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIlxuY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvciBhcyBrZXl3b3JkIGFyZ3VtZW50XG5uYW1lcy5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNTogRnVuY3Rpb24gY2FsbHMgYWNjZXB0IGFueSBudW1iZXIgb2YgIioiIGFuZFxuIioqIiB1bnBhY2tpbmdzLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXkgZm9sbG93IGl0ZXJhYmxlIHVucGFja2luZ3NcbigiKiIpLCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyBkaWN0aW9uYXJ5IHVucGFja2luZ3MgKCIqKiIpLlxuT3JpZ2luYWxseSBwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cblxuQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5ICJOb25lIiwgdW5sZXNzIGl0IHJhaXNlcyBhblxuZXhjZXB0aW9uLiAgSG93IHRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGVcbmNhbGxhYmxlIG9iamVjdC5cblxuSWYgaXQgaXMtLS1cblxuYSB1c2VyLWRlZmluZWQgZnVuY3Rpb246XG4gICBUaGUgY29kZSBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBwYXNzaW5nIGl0IHRoZVxuICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgdGhlXG4gICBmb3JtYWwgcGFyYW1ldGVycyB0byB0aGUgYXJndW1lbnRzOyB0aGlzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4gICAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhICJyZXR1cm4iXG4gICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG5cbmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOlxuICAgVGhlIHJlc3VsdCBpcyB1cCB0byB0aGUgaW50ZXJwcmV0ZXI7IHNlZSAqQnVpbHQtaW4gRnVuY3Rpb25zKiBmb3JcbiAgIHRoZSBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuXG5hIGNsYXNzIG9iamVjdDpcbiAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG5cbmEgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOlxuICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiBhcmd1bWVudFxuICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlXG4gICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cblxuYSBjbGFzcyBpbnN0YW5jZTpcbiAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhICJfX2NhbGxfXygpIiBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlbiB0aGVcbiAgIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC5cbicsCi0gJ2NsYXNzJzogdSdcbkNsYXNzIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgbGlzdFxudXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgKkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uKlxuZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYVxuY2xhc3Mgb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZVxubGlzdCBpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcblxuICAgY2xhc3MgRm9vOlxuICAgICAgIHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb28ob2JqZWN0KTpcbiAgICAgICBwYXNzXG5cblRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlXG4qTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZVxub3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzXG5leGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gQVxuY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2VcbmNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS5cblRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxubmFtZXNwYWNlLlxuXG5DbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nICptZXRhY2xhc3NlcyouXG5cbkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucyxcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgY2xhc3MgRm9vOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vOiBwYXNzXG4gICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG5cblRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3JcbmZ1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcyBvYmplY3QsIHdoaWNoIGlzIHRoZW5cbmJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSBhdHRyaWJ1dGVzXG5jYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG5pbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICIic2VsZi5uYW1lIiIsXG5hbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZVxud2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdHNcbmZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgdG9cbnVuZXhwZWN0ZWQgcmVzdWx0cy4gICpEZXNjcmlwdG9ycyogY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4gIENsYXNzIERlY29yYXRvcnNcbicsCi0gJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblxuVmFsdWUgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lIHR5cGUuXG5cbkNoYXB0ZXIgKk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMqIHN0YXRlcyB0aGF0IG9iamVjdHMgaGF2ZSBhIHZhbHVlXG4oaW4gYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhXG5yYXRoZXIgYWJzdHJhY3Qgbm90aW9uIGluIFB5dGhvbjogRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbFxuYWNjZXNzIG1ldGhvZCBmb3IgYW4gb2JqZWN0XCdzIHZhbHVlLiAgQWxzbywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnRcbnRoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBzaG91bGQgYmUgY29uc3RydWN0ZWQgaW4gYSBwYXJ0aWN1bGFyIHdheSxcbmUuZy4gY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9yc1xuaW1wbGVtZW50IGEgcGFydGljdWxhciBub3Rpb24gb2Ygd2hhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzLiAgT25lXG5jYW4gdGhpbmsgb2YgdGhlbSBhcyBkZWZpbmluZyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGluZGlyZWN0bHksIGJ5XG5tZWFucyBvZiB0aGVpciBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLlxuXG5CZWNhdXNlIGFsbCB0eXBlcyBhcmUgKGRpcmVjdCBvciBpbmRpcmVjdCkgc3VidHlwZXMgb2YgIm9iamVjdCIsIHRoZXlcbmluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciBmcm9tICJvYmplY3QiLiAgVHlwZXMgY2FuXG5jdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggY29tcGFyaXNvblxubWV0aG9kcyogbGlrZSAiX19sdF9fKCkiLCBkZXNjcmliZWQgaW4gKkJhc2ljIGN1c3RvbWl6YXRpb24qLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgaXMgYmFzZWRcbm9uIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4gIEhlbmNlLCBlcXVhbGl0eSBjb21wYXJpc29uIG9mXG5pbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBpZGVudGl0eSByZXN1bHRzIGluIGVxdWFsaXR5LCBhbmQgZXF1YWxpdHlcbmNvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpblxuaW5lcXVhbGl0eS4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBkZXNpcmUgdGhhdFxuYWxsIG9iamVjdHMgc2hvdWxkIGJlIHJlZmxleGl2ZSAoaS5lLiAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiKS5cblxuQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90IHByb3ZpZGVkO1xuYW4gYXR0ZW1wdCByYWlzZXMgIlR5cGVFcnJvciIuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCBiZWhhdmlvclxuaXMgdGhlIGxhY2sgb2YgYSBzaW1pbGFyIGludmFyaWFudCBhcyBmb3IgZXF1YWxpdHkuXG5cblRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBlcXVhbGl0eSBjb21wYXJpc29uLCB0aGF0IGluc3RhbmNlcyB3aXRoXG5kaWZmZXJlbnQgaWRlbnRpdGllcyBhcmUgYWx3YXlzIHVuZXF1YWwsIG1heSBiZSBpbiBjb250cmFzdCB0byB3aGF0XG50eXBlcyB3aWxsIG5lZWQgdGhhdCBoYXZlIGEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiBvYmplY3QgdmFsdWUgYW5kXG52YWx1ZS1iYXNlZCBlcXVhbGl0eS4gIFN1Y2ggdHlwZXMgd2lsbCBuZWVkIHRvIGN1c3RvbWl6ZSB0aGVpclxuY29tcGFyaXNvbiBiZWhhdmlvciwgYW5kIGluIGZhY3QsIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIGhhdmUgZG9uZVxudGhhdC5cblxuVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgbW9zdFxuaW1wb3J0YW50IGJ1aWx0LWluIHR5cGVzLlxuXG4qIE51bWJlcnMgb2YgYnVpbHQtaW4gbnVtZXJpYyB0eXBlcyAoKk51bWVyaWMgVHlwZXMgLS0tIGludCwgZmxvYXQsXG4gIGNvbXBsZXgqKSBhbmQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kXG4gICJkZWNpbWFsLkRlY2ltYWwiIGNhbiBiZSBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcyxcbiAgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBjb21wbGV4IG51bWJlcnMgZG8gbm90IHN1cHBvcnQgb3JkZXJcbiAgY29tcGFyaXNvbi4gIFdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSB0eXBlcyBpbnZvbHZlZCwgdGhleSBjb21wYXJlXG4gIG1hdGhlbWF0aWNhbGx5IChhbGdvcml0aG1pY2FsbHkpIGNvcnJlY3Qgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi5cblxuICBUaGUgbm90LWEtbnVtYmVyIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlXG4gIHNwZWNpYWwuICBUaGV5IGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcyAoInggaXMgeCIgaXMgdHJ1ZSkgYnV0XG4gIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcyAoInggPT0geCIgaXMgZmFsc2UpLiAgQWRkaXRpb25hbGx5LFxuICBjb21wYXJpbmcgYW55IG51bWJlciB0byBhIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAiRmFsc2UiLlxuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8IGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbFxuICByZXR1cm4gIkZhbHNlIi5cblxuKiBCaW5hcnkgc2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgImJ5dGVzIiBvciAiYnl0ZWFycmF5IikgY2FuIGJlXG4gIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlXG4gIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVpciBlbGVtZW50cy5cblxuKiBTdHJpbmdzIChpbnN0YW5jZXMgb2YgInN0ciIpIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlXG4gIG51bWVyaWNhbCBVbmljb2RlIGNvZGUgcG9pbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAib3JkKCkiKSBvZiB0aGVpciBjaGFyYWN0ZXJzLiBbM11cblxuICBTdHJpbmdzIGFuZCBiaW5hcnkgc2VxdWVuY2VzIGNhbm5vdCBiZSBkaXJlY3RseSBjb21wYXJlZC5cblxuKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiBiZVxuICBjb21wYXJlZCBvbmx5IHdpdGhpbiBlYWNoIG9mIHRoZWlyIHR5cGVzLCB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0XG4gIHJhbmdlcyBkbyBub3Qgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uLiAgRXF1YWxpdHkgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmVzdWx0cyBpbiB1bmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmFpc2VzICJUeXBlRXJyb3IiLlxuXG4gIFNlcXVlbmNlcyBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cywgd2hlcmVieSByZWZsZXhpdml0eSBvZiB0aGUgZWxlbWVudHMgaXNcbiAgZW5mb3JjZWQuXG5cbiAgSW4gZW5mb3JjaW5nIHJlZmxleGl2aXR5IG9mIGVsZW1lbnRzLCB0aGUgY29tcGFyaXNvbiBvZiBjb2xsZWN0aW9uc1xuICBhc3N1bWVzIHRoYXQgZm9yIGEgY29sbGVjdGlvbiBlbGVtZW50ICJ4IiwgInggPT0geCIgaXMgYWx3YXlzIHRydWUuXG4gIEJhc2VkIG9uIHRoYXQgYXNzdW1wdGlvbiwgZWxlbWVudCBpZGVudGl0eSBpcyBjb21wYXJlZCBmaXJzdCwgYW5kXG4gIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgb25seSBmb3IgZGlzdGluY3QgZWxlbWVudHMuICBUaGlzXG4gIGFwcHJvYWNoIHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgYSBzdHJpY3QgZWxlbWVudCBjb21wYXJpc29uXG4gIHdvdWxkLCBpZiB0aGUgY29tcGFyZWQgZWxlbWVudHMgYXJlIHJlZmxleGl2ZS4gIEZvciBub24tcmVmbGV4aXZlXG4gIGVsZW1lbnRzLCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIGZvciBzdHJpY3QgZWxlbWVudFxuICBjb21wYXJpc29uLCBhbmQgbWF5IGJlIHN1cnByaXNpbmc6ICBUaGUgbm9uLXJlZmxleGl2ZSBub3QtYS1udW1iZXJcbiAgdmFsdWVzIGZvciBleGFtcGxlIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gYmVoYXZpb3Igd2hlblxuICB1c2VkIGluIGEgbGlzdDpcblxuICAgICA+Pj4gbmFuID0gZmxvYXQoXCdOYU5cJylcbiAgICAgPj4+IG5hbiBpcyBuYW5cbiAgICAgVHJ1ZVxuICAgICA+Pj4gbmFuID09IG5hblxuICAgICBGYWxzZSAgICAgICAgICAgICAgICAgPC0tIHRoZSBkZWZpbmVkIG5vbi1yZWZsZXhpdmUgYmVoYXZpb3Igb2YgTmFOXG4gICAgID4+PiBbbmFuXSA9PSBbbmFuXVxuICAgICBUcnVlICAgICAgICAgICAgICAgICAgPC0tIGxpc3QgZW5mb3JjZXMgcmVmbGV4aXZpdHkgYW5kIHRlc3RzIGlkZW50aXR5IGZpcnN0XG5cbiAgTGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBidWlsdC1pbiBjb2xsZWN0aW9ucyB3b3JrcyBhc1xuICBmb2xsb3dzOlxuXG4gICogRm9yIHR3byBjb2xsZWN0aW9ucyB0byBjb21wYXJlIGVxdWFsLCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgICB0eXBlLCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIGVhY2ggcGFpciBvZiBjb3JyZXNwb25kaW5nXG4gICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICgxLDIpIiBpc1xuICAgIGZhbHNlIGJlY2F1c2UgdGhlIHR5cGUgaXMgbm90IHRoZSBzYW1lKS5cblxuICAqIENvbGxlY3Rpb25zIHRoYXQgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIHRoZSBzYW1lXG4gICAgYXMgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9IFsxLDIseV0iXG4gICAgaGFzIHRoZSBzYW1lIHZhbHVlIGFzICJ4IDw9IHkiKS4gIElmIGEgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXNcbiAgICBub3QgZXhpc3QsIHRoZSBzaG9ydGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsXG4gICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuXG5cbiogTWFwcGluZ3MgKGluc3RhbmNlcyBvZiAiZGljdCIpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleVxuICBoYXZlIGVxdWFsICooa2V5LCB2YWx1ZSkqIHBhaXJzLiBFcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSBrZXlzIGFuZFxuICBlbGVtZW50cyBlbmZvcmNlcyByZWZsZXhpdml0eS5cblxuICBPcmRlciBjb21wYXJpc29ucyAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIChpbnN0YW5jZXMgb2YgInNldCIgb3IgImZyb3plbnNldCIpIGNhbiBiZSBjb21wYXJlZCB3aXRoaW5cbiAgYW5kIGFjcm9zcyB0aGVpciB0eXBlcy5cblxuICBUaGV5IGRlZmluZSBvcmRlciBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmQgc3VwZXJzZXRcbiAgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKGZvciBleGFtcGxlLFxuICB0aGUgdHdvIHNldHMgInsxLDJ9IiBhbmQgInsyLDN9IiBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZ1xuICAoZm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzKS5cblxuICBDb21wYXJpc29uIG9mIHNldHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkgb2YgaXRzIGVsZW1lbnRzLlxuXG4qIE1vc3Qgb3RoZXIgYnVpbHQtaW4gdHlwZXMgaGF2ZSBubyBjb21wYXJpc29uIG1ldGhvZHMgaW1wbGVtZW50ZWQsXG4gIHNvIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLlxuXG5Vc2VyLWRlZmluZWQgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIHNob3VsZFxuZm9sbG93IHNvbWUgY29uc2lzdGVuY3kgcnVsZXMsIGlmIHBvc3NpYmxlOlxuXG4qIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsIGlkZW50aWNhbFxuICBvYmplY3RzIHNob3VsZCBjb21wYXJlIGVxdWFsOlxuXG4gICAgICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSJcblxuKiBDb21wYXJpc29uIHNob3VsZCBiZSBzeW1tZXRyaWMuIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nXG4gIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgInkgPT0geCJcblxuICAgICAieCAhPSB5IiBhbmQgInkgIT0geCJcblxuICAgICAieCA8IHkiIGFuZCAieSA+IHgiXG5cbiAgICAgInggPD0geSIgYW5kICJ5ID49IHgiXG5cbiogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAobm9uLWV4aGF1c3RpdmUpXG4gIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhhdDpcblxuICAgICAieCA+IHkgYW5kIHkgPiB6IiBpbXBsaWVzICJ4ID4geiJcblxuICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiXG5cbiogSW52ZXJzZSBjb21wYXJpc29uIHNob3VsZCByZXN1bHQgaW4gdGhlIGJvb2xlYW4gbmVnYXRpb24uIEluIG90aGVyXG4gIHdvcmRzLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgIm5vdCB4ICE9IHkiXG5cbiAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgICAgInggPiB5IiBhbmQgIm5vdCB4IDw9IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgVGhlIGxhc3QgdHdvIGV4cHJlc3Npb25zIGFwcGx5IHRvIHRvdGFsbHkgb3JkZXJlZCBjb2xsZWN0aW9ucyAoZS5nLlxuICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZVxuICAidG90YWxfb3JkZXJpbmcoKSIgZGVjb3JhdG9yLlxuXG5QeXRob24gZG9lcyBub3QgZW5mb3JjZSB0aGVzZSBjb25zaXN0ZW5jeSBydWxlcy4gSW4gZmFjdCwgdGhlXG5ub3QtYS1udW1iZXIgdmFsdWVzIGFyZSBhbiBleGFtcGxlIGZvciBub3QgZm9sbG93aW5nIHRoZXNlIHJ1bGVzLlxuXG5cbk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG5cblxuSWRlbnRpdHkgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCBpcyB5IiBpc1xudHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgbm90IHkiXG55aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKLSAnY29tcG91bmQnOiB1J1xuQ29tcG91bmQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3Rcbm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW5cbmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlXG5pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS5cblxuVGhlICJpZiIsICJ3aGlsZSIgYW5kICJmb3IiIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsIGNvbnRyb2xcbmZsb3cgY29uc3RydWN0cy4gICJ0cnkiIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXBcbmNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cywgd2hpbGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgYWxsb3dzIHRoZVxuZXhlY3V0aW9uIG9mIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gY29kZSBhcm91bmQgYSBibG9jayBvZlxuY29kZS4gIEZ1bmN0aW9uIGFuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kXG5zdGF0ZW1lbnRzLlxuXG5BIGNvbXBvdW5kIHN0YXRlbWVudCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBcJ2NsYXVzZXMuXCcgIEEgY2xhdXNlXG5jb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBcJ3N1aXRlLlwnICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxucGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC5cbkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHNcbndpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlclwnc1xuY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnRcbmxpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2YgYSBzdWl0ZSBjYW4gY29udGFpbiBuZXN0ZWQgY29tcG91bmRcbnN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRuXCd0IGJlXG5jbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkIGJlbG9uZzpcblxuICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCh4KVxuXG5BbHNvIG5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIGJpbmRzIHRpZ2h0ZXIgdGhhbiB0aGUgY29sb24gaW4gdGhpc1xuY29udGV4dCwgc28gdGhhdCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGVcbiJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6XG5cbiAgIGlmIHggPCB5IDwgejogcHJpbnQoeCk7IHByaW50KHkpOyBwcmludCh6KVxuXG5TdW1tYXJpemluZzpcblxuICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX3dpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mdW5jZGVmXG4gICBzdWl0ZSAgICAgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IE5FV0xJTkUgSU5ERU5UIHN0YXRlbWVudCsgREVERU5UXG4gICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXRcbiAgIHN0bXRfbGlzdCAgICAgOjo9IHNpbXBsZV9zdG10ICgiOyIgc2ltcGxlX3N0bXQpKiBbIjsiXVxuXG5Ob3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFcbiJERURFTlQiLiAgQWxzbyBub3RlIHRoYXQgb3B0aW9uYWwgY29udGludWF0aW9uIGNsYXVzZXMgYWx3YXlzIGJlZ2luXG53aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhIHN0YXRlbWVudCwgdGh1cyB0aGVyZSBhcmUgbm9cbmFtYmlndWl0aWVzICh0aGUgXCdkYW5nbGluZyAiZWxzZSJcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnlcbnJlcXVpcmluZyBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cblxuVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwbGFjZXNcbmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cblxuXG5UaGUgImlmIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PVxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG5cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT1cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWRcbmFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFja1xudG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cblxuXG5UaGUgImZvciIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2VcbihzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbnByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMgKHNlZSAqQXNzaWdubWVudCBzdGF0ZW1lbnRzKiksIGFuZCB0aGVuIHRoZSBzdWl0ZSBpc1xuZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZVxuc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiksXG50aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgY29udGludWVzXG53aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dFxuaXRlbS5cblxuVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCBsaXN0LlxuVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nXG50aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG5cbiAgIGZvciBpIGluIHJhbmdlKDEwKTpcbiAgICAgICBwcmludChpKVxuICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcblxuTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLFxuYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXRcbmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyBhblxuaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbFwncyAiZm9yIGlcbjo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsIDJdIi5cblxuTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgQW5cbiAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsXG4gIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzXG4gIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnNcbiAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZVxuICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mXG4gIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG5cblxuVGhlICJ0cnkiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PVxuXG5UaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5UaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vXG5leGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuXG5leGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCBjbGF1c2VzXG5pbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuIGV4cHJlc3Npb24tXG5sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbmV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG5pcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG53aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb25cbm9iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgcmFpc2VkXG50aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZlxucHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzXG5yZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC5cbihUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLFxuYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbm91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICBmb29cblxud2FzIHRyYW5zbGF0ZWQgdG9cblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIGZvb1xuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIGRlbCBOXG5cblRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG5iZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbmN5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxudW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgdmlhXG4ic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlXG5leGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG5wcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbnJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxubm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuXG5JZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAidHJ5IlxuY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuXG5leGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmXG50aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICJmaW5hbGx5IlxuY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbmlzIGRpc2NhcmRlZDpcblxuICAgPj4+IGRlZiBmKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIDEvMFxuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4gICAuLi5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cblxuV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzXG5hbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsIGluXG50aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cblRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbiJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSB0aGVcbmxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG5cblRoZSAid2l0aCIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbm1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gKldpdGggU3RhdGVtZW50XG5Db250ZXh0IE1hbmFnZXJzKikuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG51c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbmZvbGxvd3M6XG5cbjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG5cbjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSJcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgYmVcbiAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWVcbiAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZVxuICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgcmVyYWlzZWQuXG4gICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbiAgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHNcbiAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG5cbldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG5tdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cbkZ1bmN0aW9uIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PT09PVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGZ1bmNkZWYgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBkb3R0ZWRfbmFtZSAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuICAgcGFyYW1ldGVyX2xpc3QgOjo9IChkZWZwYXJhbWV0ZXIgIiwiKSpcbiAgICAgICAgICAgICAgICAgICAgICB8ICIqIiBbcGFyYW1ldGVyXSAoIiwiIGRlZnBhcmFtZXRlcikqIFsiLCIgIioqIiBwYXJhbWV0ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKioiIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIHwgZGVmcGFyYW1ldGVyIFsiLCJdIClcbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbiAgIGRlZnBhcmFtZXRlciAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuICAgZnVuY25hbWUgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kc1xudGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0XG4oYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2VcbmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuXG5UaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHNcbmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG5leHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlXG5yZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdFxuYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZVxuaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpblxubmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGRlZiBmdW5jKCk6IHBhc3NcbiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuXG5XaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuIlxuRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAqYXJndW1lbnQqIG1heVxuYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzIGRlZmF1bHQgdmFsdWUgaXNcbnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xucGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzXG5pcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuXG5cbioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gdGhlXG5mdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpc1xuZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtXG5jb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudFxudG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhXG5saXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnlcbmFwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC5cblRoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzIGlzIHRvIHVzZVxuIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGVcbmZ1bmN0aW9uLCBlLmcuOlxuXG4gICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4gICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuICAgICAgICAgICBwZW5ndWluID0gW11cbiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4gICAgICAgcmV0dXJuIHBlbmd1aW5cblxuRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uXG4qQ2FsbHMqLiBBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzXG5tZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb21cbmtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm1cbiIiKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnlcbmV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYgdGhlXG5mb3JtICIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZVxua2V5d29yZC1vbmx5IHBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuXG5QYXJhbWV0ZXJzIG1heSBoYXZlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtICIiOiBleHByZXNzaW9uIiIgZm9sbG93aW5nXG50aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiB0aG9zZVxub2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgaGF2ZVxuInJldHVybiIgYW5ub3RhdGlvbiBvZiB0aGUgZm9ybSAiIi0+IGV4cHJlc3Npb24iIiBhZnRlciB0aGUgcGFyYW1ldGVyXG5saXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgYXJlXG5ldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zIG1heVxuYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLlxuVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbmZ1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGFcbmRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnNcJyBuYW1lcyBpbiB0aGUgIl9fYW5ub3RhdGlvbnNfXyJcbmF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuXG5JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kXG50byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqTGFtYmRhcyouICBOb3RlIHRoYXQgdGhlIGxhbWJkYVxuZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uO1xuYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIiJkZWYiIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3JcbmFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhXG5leHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0XG5hbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiImRlZiIiXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbmZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyB1c2VkXG5pbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb25cbmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqIGZvciBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnNcblxuICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuXG5cblxuQ2xhc3MgZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09XG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0XG51c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSAqQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24qXG5mb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhXG5jbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlXG5saXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuXG4gICBjbGFzcyBGb286XG4gICAgICAgcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbyhvYmplY3QpOlxuICAgICAgIHBhc3NcblxuVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbipOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG5vcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHNcbmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSBBXG5jbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZVxuY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LlxuVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG5uYW1lc3BhY2UuXG5cbkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgKm1ldGFjbGFzc2VzKi5cblxuQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLFxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBjbGFzcyBGb286IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb286IHBhc3NcbiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcblxuVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvclxuZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggaXMgdGhlblxuYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXNcbmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbmluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gIiJzZWxmLm5hbWUiIixcbmFuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lXG53aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0c1xuZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0b1xudW5leHBlY3RlZCByZXN1bHRzLiAgKkRlc2NyaXB0b3JzKiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbiAgQ2xhc3MgRGVjb3JhdG9yc1xuXG5cbkNvcm91dGluZXNcbj09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMy41LlxuXG5cbkNvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mdW5jZGVmIDo6PSBbZGVjb3JhdG9yc10gImFzeW5jIiAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG5cbkV4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0IG1hbnlcbnBvaW50cyAoc2VlICpjb3JvdXRpbmUqKS4gIEluIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLCBhbnkgImF3YWl0IiBhbmRcbiJhc3luYyIgaWRlbnRpZmllcnMgYmVjb21lIHJlc2VydmVkIGtleXdvcmRzOyAiYXdhaXQiIGV4cHJlc3Npb25zLFxuImFzeW5jIGZvciIgYW5kICJhc3luYyB3aXRoIiBjYW4gb25seSBiZSB1c2VkIGluIGNvcm91dGluZSBib2RpZXMuXG5cbkZ1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lXG5mdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiAiYXN5bmMgZGVmIlxuY29yb3V0aW5lcy5cblxuQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjpcblxuICAgYXN5bmMgZGVmIGZ1bmMocGFyYW0xLCBwYXJhbTIpOlxuICAgICAgIGRvX3N0dWZmKClcbiAgICAgICBhd2FpdCBzb21lX2Nvcm91dGluZSgpXG5cblxuVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzXG4qaXRlciogaW1wbGVtZW50YXRpb24sIGFuZCAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiBjYW4gY2FsbFxuYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG5cblRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXJcbmFzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG5cblRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOlxuICAgICAgIEJMT0NLXG4gICBlbHNlOlxuICAgICAgIEJMT0NLMlxuXG5JcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcblxuICAgaXRlciA9IChJVEVSKVxuICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4gICBydW5uaW5nID0gVHJ1ZVxuICAgd2hpbGUgcnVubmluZzpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpXG4gICAgICAgZXhjZXB0IFN0b3BBc3luY0l0ZXJhdGlvbjpcbiAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4gICAgICAgZWxzZTpcbiAgICAgICAgICAgQkxPQ0tcbiAgIGVsc2U6XG4gICAgICAgQkxPQ0syXG5cblNlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIGZvciIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5cblRoZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY193aXRoX3N0bXQgOjo9ICJhc3luYyIgd2l0aF9zdG10XG5cbkFuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgYWJsZVxudG8gc3VzcGVuZCBleGVjdXRpb24gaW4gaXRzICplbnRlciogYW5kICpleGl0KiBtZXRob2RzLlxuXG5UaGUgZm9sbG93aW5nIGNvZGU6XG5cbiAgIGFzeW5jIHdpdGggRVhQUiBhcyBWQVI6XG4gICAgICAgQkxPQ0tcblxuSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG5cbiAgIG1nciA9IChFWFBSKVxuICAgYWV4aXQgPSB0eXBlKG1ncikuX19hZXhpdF9fXG4gICBhZW50ZXIgPSB0eXBlKG1ncikuX19hZW50ZXJfXyhtZ3IpXG4gICBleGMgPSBUcnVlXG5cbiAgIFZBUiA9IGF3YWl0IGFlbnRlclxuICAgdHJ5OlxuICAgICAgIEJMT0NLXG4gICBleGNlcHQ6XG4gICAgICAgaWYgbm90IGF3YWl0IGFleGl0KG1nciwgKnN5cy5leGNfaW5mbygpKTpcbiAgICAgICAgICAgcmFpc2VcbiAgIGVsc2U6XG4gICAgICAgYXdhaXQgYWV4aXQobWdyLCBOb25lLCBOb25lLCBOb25lKVxuXG5TZWUgYWxzbyAiX19hZW50ZXJfXygpIiBhbmQgIl9fYWV4aXRfXygpIiBmb3IgZGV0YWlscy5cblxuSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5TZWUgYWxzbzogKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheFxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3NcbiAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4gICAgZXhjZXB0aW9uLiBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2ZcbiAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuICAgICJicmVhayIgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbiAgICBmdW5jdGlvbiBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzICJfX2RvY19fIlxuICAgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgIl9fZG9jX18iIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCi0gJ2NvbnRleHQtbWFuYWdlcnMnOiB1J1xuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSAid2l0aCIgc3RhdGVtZW50LiBUaGUgY29udGV4dCBtYW5hZ2VyXG5oYW5kbGVzIHRoZSBlbnRyeSBpbnRvLCBhbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgcnVudGltZSBjb250ZXh0XG5mb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5XG5pbnZva2VkIHVzaW5nIHRoZSAid2l0aCIgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbiAqVGhlIHdpdGhcbnN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciBtZXRob2RzLlxuXG5UeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXNcbmtpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgY2xvc2luZyBvcGVuZWRcbmZpbGVzLCBldGMuXG5cbkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSAqQ29udGV4dCBNYW5hZ2VyIFR5cGVzKi5cblxub2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuXG4gICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAid2l0aCJcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSAiTm9uZSIuXG5cbiAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZVxuICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZFxuICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkXG4gICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cblxuICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286ICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLAotICdjb250aW51ZSc6IHUnXG5UaGUgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBjb250aW51ZV9zdG10IDo6PSAiY29udGludWUiXG5cbiJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiXG5sb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3IgImZpbmFsbHkiXG5jbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlIG9mIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiAiY29udGludWUiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGFcbiJmaW5hbGx5IiBjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5zdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLlxuJywKLSAnY29udmVyc2lvbnMnOiB1J1xuQXJpdGhtZXRpYyBjb252ZXJzaW9uc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5XaGVuIGEgZGVzY3JpcHRpb24gb2YgYW4gYXJpdGhtZXRpYyBvcGVyYXRvciBiZWxvdyB1c2VzIHRoZSBwaHJhc2VcbiJ0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCIgdGhpcyBtZWFuc1xudGhhdCB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzIHdvcmtzIGFzIGZvbGxvd3M6XG5cbiogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG9cbiAgY29tcGxleDtcblxuKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgdGhlXG4gIG90aGVyIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDtcblxuKiBvdGhlcndpc2UsIGJvdGggbXVzdCBiZSBpbnRlZ2VycyBhbmQgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkuXG5cblNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGFzIGFcbmxlZnQgYXJndW1lbnQgdG8gdGhlIFwnJVwnIG9wZXJhdG9yKS4gIEV4dGVuc2lvbnMgbXVzdCBkZWZpbmUgdGhlaXIgb3duXG5jb252ZXJzaW9uIGJlaGF2aW9yLlxuJywKLSAnY3VzdG9taXphdGlvbic6IHUnXG5CYXNpYyBjdXN0b21pemF0aW9uXG4qKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlXG4gICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZFxuICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciBleGFtcGxlLCB0aGVcbiAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvIGF1dG9tYXRpY2FsbHlcbiAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlXG4gICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuXG4gICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXJcJ3NcbiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgcmVmbGVjdGlvbixcbiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlXG4gICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGFcbiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kXCdzIHR5cGUsIHRoZVxuICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGVcbiAgIGxlZnQgb3BlcmFuZFwncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3RcbiAgIGNvbnNpZGVyZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3RcbiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSJcbiAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBhcyBpdGVtcyBpblxuICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZFxuICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnRcbiAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlIGNvbGxlY3Rpb25zXG4gICByZXF1aXJlcyB0aGF0IGEga2V5XCdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cblxuICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgbWV0aG9kcyBieVxuICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoXG4gICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSBoYXNoKHkpIi5cblxuICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiXG4gICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICBXaGVuIHRoZVxuICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzc1xuICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0b1xuICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgaW50ZXJwcmV0ZXJcbiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzc1xuICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3NcbiAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiB0aGF0XG4gICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiBjYWxsLlxuXG4gICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzIGFuZFxuICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLlxuICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob25cbiAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2ZcbiAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwtXG4gICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGVcbiAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgY29tcGxleGl0eS5cbiAgICAgU2VlIGh0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3JcbiAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gb3JkZXIgb2ZcbiAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXNcbiAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kXG4gICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cbm9iamVjdC5fX2Jvb2xfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3RcbiAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG4nLAotICdkZWJ1Z2dlcic6IHUnXG4icGRiIiAtLS0gVGhlIFB5dGhvbiBEZWJ1Z2dlclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKipTb3VyY2UgY29kZToqKiBMaWIvcGRiLnB5XG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG1vZHVsZSAicGRiIiBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyIGZvclxuUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzIGFuZFxuc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayBmcmFtZXMsXG5zb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gdGhlXG5jb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gZGVidWdnaW5nXG5hbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG5cblRoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlIGNsYXNzXG4iUGRiIi4gVGhpcyBpcyBjdXJyZW50bHkgdW5kb2N1bWVudGVkIGJ1dCBlYXNpbHkgdW5kZXJzdG9vZCBieSByZWFkaW5nXG50aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyAiYmRiIiBhbmQgImNtZCIuXG5cblRoZSBkZWJ1Z2dlclwncyBwcm9tcHQgaXMgIihQZGIpIi4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSBwcm9ncmFtIHVuZGVyXG5jb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBwZGIucnVuKFwnbXltb2R1bGUudGVzdCgpXCcpXG4gICA+IDxzdHJpbmc+KDApPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgIE5hbWVFcnJvcjogXCdzcGFtXCdcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFRhYi1jb21wbGV0aW9uIHZpYSB0aGUgInJlYWRsaW5lIiBtb2R1bGUgaXNcbmF2YWlsYWJsZSBmb3IgY29tbWFuZHMgYW5kIGNvbW1hbmQgYXJndW1lbnRzLCBlLmcuIHRoZSBjdXJyZW50IGdsb2JhbFxuYW5kIGxvY2FsIG5hbWVzIGFyZSBvZmZlcmVkIGFzIGFyZ3VtZW50cyBvZiB0aGUgInAiIGNvbW1hbmQuXG5cbiJwZGIucHkiIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgc2NyaXB0cy4gIEZvclxuZXhhbXBsZTpcblxuICAgcHl0aG9uMyAtbSBwZGIgbXlzY3JpcHQucHlcblxuV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtXG5kZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gIEFmdGVyIHBvc3QtXG5tb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiB3aWxsXG5yZXN0YXJ0IHRoZSBwcm9ncmFtLiAgQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYlwncyBzdGF0ZSAoc3VjaFxuYXMgYnJlYWtwb2ludHMpIGFuZCBpbiBtb3N0IGNhc2VzIGlzIG1vcmUgdXNlZnVsIHRoYW4gcXVpdHRpbmcgdGhlXG5kZWJ1Z2dlciB1cG9uIHByb2dyYW1cJ3MgZXhpdC5cblxuTmV3IGluIHZlcnNpb24gMy4yOiAicGRiLnB5IiBub3cgYWNjZXB0cyBhICItYyIgb3B0aW9uIHRoYXQgZXhlY3V0ZXNcbmNvbW1hbmRzIGFzIGlmIGdpdmVuIGluIGEgIi5wZGJyYyIgZmlsZSwgc2VlICpEZWJ1Z2dlciBDb21tYW5kcyouXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nIHByb2dyYW0gaXNcbnRvIGluc2VydFxuXG4gICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKClcblxuYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiB0aGVuXG5zdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LCBhbmQgY29udGludWUgcnVubmluZ1xud2l0aG91dCB0aGUgZGVidWdnZXIgdXNpbmcgdGhlICJjb250aW51ZSIgY29tbWFuZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBteW1vZHVsZS50ZXN0KClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSA0LCBpbiB0ZXN0XG4gICAgICAgdGVzdDIoKVxuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuICAgICAgIHByaW50KHNwYW0pXG4gICBOYW1lRXJyb3I6IHNwYW1cbiAgID4+PiBwZGIucG0oKVxuICAgPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKVxuICAgLT4gcHJpbnQoc3BhbSlcbiAgIChQZGIpXG5cblRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczsgZWFjaCBlbnRlcnMgdGhlIGRlYnVnZ2VyXG5pbiBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXk6XG5cbnBkYi5ydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuXG4gICBFeGVjdXRlIHRoZSAqc3RhdGVtZW50KiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdCkgdW5kZXJcbiAgIGRlYnVnZ2VyIGNvbnRyb2wuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnMgYmVmb3JlIGFueSBjb2RlIGlzXG4gICBleGVjdXRlZDsgeW91IGNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgImNvbnRpbnVlIiwgb3IgeW91IGNhblxuICAgc3RlcCB0aHJvdWdoIHRoZSBzdGF0ZW1lbnQgdXNpbmcgInN0ZXAiIG9yICJuZXh0IiAoYWxsIHRoZXNlXG4gICBjb21tYW5kcyBhcmUgZXhwbGFpbmVkIGJlbG93KS4gIFRoZSBvcHRpb25hbCAqZ2xvYmFscyogYW5kICpsb2NhbHMqXG4gICBhcmd1bWVudHMgc3BlY2lmeSB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGNvZGUgaXMgZXhlY3V0ZWQ7IGJ5XG4gICBkZWZhdWx0IHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBtb2R1bGUgIl9fbWFpbl9fIiBpcyB1c2VkLiAgKFNlZSB0aGVcbiAgIGV4cGxhbmF0aW9uIG9mIHRoZSBidWlsdC1pbiAiZXhlYygpIiBvciAiZXZhbCgpIiBmdW5jdGlvbnMuKVxuXG5wZGIucnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuXG4gICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KVxuICAgdW5kZXIgZGVidWdnZXIgY29udHJvbC4gIFdoZW4gInJ1bmV2YWwoKSIgcmV0dXJucywgaXQgcmV0dXJucyB0aGVcbiAgIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0b1xuICAgInJ1bigpIi5cblxucGRiLnJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG5cbiAgIENhbGwgdGhlICpmdW5jdGlvbiogKGEgZnVuY3Rpb24gb3IgbWV0aG9kIG9iamVjdCwgbm90IGEgc3RyaW5nKVxuICAgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgV2hlbiAicnVuY2FsbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zXG4gICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFyc1xuICAgYXMgc29vbiBhcyB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC5cblxucGRiLnNldF90cmFjZSgpXG5cbiAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvXG4gICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZVxuICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uXG4gICBmYWlscykuXG5cbnBkYi5wb3N0X21vcnRlbSh0cmFjZWJhY2s9Tm9uZSlcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICBJZiBub1xuICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaXNcbiAgIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIChhbiBleGNlcHRpb24gbXVzdCBiZSBiZWluZyBoYW5kbGVkIGlmIHRoZVxuICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cblxucGRiLnBtKClcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW5cbiAgICJzeXMubGFzdF90cmFjZWJhY2siLlxuXG5UaGUgInJ1bioiIGZ1bmN0aW9ucyBhbmQgInNldF90cmFjZSgpIiBhcmUgYWxpYXNlcyBmb3IgaW5zdGFudGlhdGluZ1xudGhlICJQZGIiIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS4gIElmIHlvdSB3YW50XG50byBhY2Nlc3MgZnVydGhlciBmZWF0dXJlcywgeW91IGhhdmUgdG8gZG8gdGhpcyB5b3Vyc2VsZjpcblxuY2xhc3MgY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT1cJ3RhYlwnLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lLCBub3NpZ2ludD1GYWxzZSlcblxuICAgIlBkYiIgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLlxuXG4gICBUaGUgKmNvbXBsZXRla2V5KiwgKnN0ZGluKiBhbmQgKnN0ZG91dCogYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlXG4gICB1bmRlcmx5aW5nICJjbWQuQ21kIiBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS5cblxuICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZVxuICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyB0aGF0XG4gICBvcmlnaW5hdGUgaW4gYSBtb2R1bGUgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGVzZSBwYXR0ZXJucy4gWzFdXG5cbiAgIEJ5IGRlZmF1bHQsIFBkYiBzZXRzIGEgaGFuZGxlciBmb3IgdGhlIFNJR0lOVCBzaWduYWwgKHdoaWNoIGlzIHNlbnRcbiAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAiQ3RybC1DIiBvbiB0aGUgY29uc29sZSkgd2hlbiB5b3UgZ2l2ZSBhXG4gICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlclxuICAgYWdhaW4gYnkgcHJlc3NpbmcgIkN0cmwtQyIuICBJZiB5b3Ugd2FudCBQZGIgbm90IHRvIHRvdWNoIHRoZVxuICAgU0lHSU5UIGhhbmRsZXIsIHNldCAqbm9zaWdpbnQqIHRvdCB0cnVlLlxuXG4gICBFeGFtcGxlIGNhbGwgdG8gZW5hYmxlIHRyYWNpbmcgd2l0aCAqc2tpcCo6XG5cbiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bXCdkamFuZ28uKlwnXSkuc2V0X3RyYWNlKClcblxuICAgTmV3IGluIHZlcnNpb24gMy4xOiBUaGUgKnNraXAqIGFyZ3VtZW50LlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAqbm9zaWdpbnQqIGFyZ3VtZW50LiAgUHJldmlvdXNseSwgYSBTSUdJTlRcbiAgIGhhbmRsZXIgd2FzIG5ldmVyIHNldCBieSBQZGIuXG5cbiAgIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4gICBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4gICBydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKVxuICAgc2V0X3RyYWNlKClcblxuICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS5cblxuXG5EZWJ1Z2dlciBDb21tYW5kc1xuPT09PT09PT09PT09PT09PT1cblxuVGhlIGNvbW1hbmRzIHJlY29nbml6ZWQgYnkgdGhlIGRlYnVnZ2VyIGFyZSBsaXN0ZWQgYmVsb3cuICBNb3N0XG5jb21tYW5kcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gb25lIG9yIHR3byBsZXR0ZXJzIGFzIGluZGljYXRlZDsgZS5nLlxuImgoZWxwKSIgbWVhbnMgdGhhdCBlaXRoZXIgImgiIG9yICJoZWxwIiBjYW4gYmUgdXNlZCB0byBlbnRlciB0aGUgaGVscFxuY29tbWFuZCAoYnV0IG5vdCAiaGUiIG9yICJoZWwiLCBub3IgIkgiIG9yICJIZWxwIiBvciAiSEVMUCIpLlxuQXJndW1lbnRzIHRvIGNvbW1hbmRzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgKHNwYWNlcyBvclxudGFicykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAoIltdIikgaW5cbnRoZSBjb21tYW5kIHN5bnRheDsgdGhlIHNxdWFyZSBicmFja2V0cyBtdXN0IG5vdCBiZSB0eXBlZC5cbkFsdGVybmF0aXZlcyBpbiB0aGUgY29tbWFuZCBzeW50YXggYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIGJhclxuKCJ8IikuXG5cbkVudGVyaW5nIGEgYmxhbmsgbGluZSByZXBlYXRzIHRoZSBsYXN0IGNvbW1hbmQgZW50ZXJlZC4gIEV4Y2VwdGlvbjogaWZcbnRoZSBsYXN0IGNvbW1hbmQgd2FzIGEgImxpc3QiIGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZSBsaXN0ZWQuXG5cbkNvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNuXCd0IHJlY29nbml6ZSBhcmUgYXNzdW1lZCB0byBiZSBQeXRob25cbnN0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZ1xuZGVidWdnZWQuICBQeXRob24gc3RhdGVtZW50cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uXG5wb2ludCAoIiEiKS4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB3YXkgdG8gaW5zcGVjdCB0aGUgcHJvZ3JhbSBiZWluZ1xuZGVidWdnZWQ7IGl0IGlzIGV2ZW4gcG9zc2libGUgdG8gY2hhbmdlIGEgdmFyaWFibGUgb3IgY2FsbCBhIGZ1bmN0aW9uLlxuV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHN1Y2ggYSBzdGF0ZW1lbnQsIHRoZSBleGNlcHRpb24gbmFtZSBpc1xucHJpbnRlZCBidXQgdGhlIGRlYnVnZ2VyXCdzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLlxuXG5UaGUgZGVidWdnZXIgc3VwcG9ydHMgKmFsaWFzZXMqLiAgQWxpYXNlcyBjYW4gaGF2ZSBwYXJhbWV0ZXJzIHdoaWNoXG5hbGxvd3Mgb25lIGEgY2VydGFpbiBsZXZlbCBvZiBhZGFwdGFiaWxpdHkgdG8gdGhlIGNvbnRleHQgdW5kZXJcbmV4YW1pbmF0aW9uLlxuXG5NdWx0aXBsZSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkgIjs7Ii5cbihBIHNpbmdsZSAiOyIgaXMgbm90IHVzZWQgYXMgaXQgaXMgdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgY29tbWFuZHNcbmluIGEgbGluZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgUHl0aG9uIHBhcnNlci4pICBObyBpbnRlbGxpZ2VuY2UgaXNcbmFwcGxpZWQgdG8gc2VwYXJhdGluZyB0aGUgY29tbWFuZHM7IHRoZSBpbnB1dCBpcyBzcGxpdCBhdCB0aGUgZmlyc3RcbiI7OyIgcGFpciwgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcXVvdGVkIHN0cmluZy5cblxuSWYgYSBmaWxlICIucGRicmMiIGV4aXN0cyBpbiB0aGUgdXNlclwncyBob21lIGRpcmVjdG9yeSBvciBpbiB0aGVcbmN1cnJlbnQgZGlyZWN0b3J5LCBpdCBpcyByZWFkIGluIGFuZCBleGVjdXRlZCBhcyBpZiBpdCBoYWQgYmVlbiB0eXBlZFxuYXQgdGhlIGRlYnVnZ2VyIHByb21wdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYWxpYXNlcy4gIElmXG5ib3RoIGZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZSBob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0IGFuZFxuYWxpYXNlcyBkZWZpbmVkIHRoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBsb2NhbCBmaWxlLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdFxuY29udGludWUgZGVidWdnaW5nLCBzdWNoIGFzICJjb250aW51ZSIgb3IgIm5leHQiLiAgUHJldmlvdXNseSwgdGhlc2VcbmNvbW1hbmRzIGhhZCBubyBlZmZlY3QuXG5cbmgoZWxwKSBbY29tbWFuZF1cblxuICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCBhXG4gICAqY29tbWFuZCogYXMgYXJndW1lbnQsIHByaW50IGhlbHAgYWJvdXQgdGhhdCBjb21tYW5kLiAgImhlbHAgcGRiIlxuICAgZGlzcGxheXMgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiAodGhlIGRvY3N0cmluZyBvZiB0aGUgInBkYiJcbiAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgImhlbHBcbiAgIGV4ZWMiIG11c3QgYmUgZW50ZXJlZCB0byBnZXQgaGVscCBvbiB0aGUgIiEiIGNvbW1hbmQuXG5cbncoaGVyZSlcblxuICAgUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlIGJvdHRvbS4gIEFuXG4gICBhcnJvdyBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGRldGVybWluZXMgdGhlIGNvbnRleHQgb2ZcbiAgIG1vc3QgY29tbWFuZHMuXG5cbmQob3duKSBbY291bnRdXG5cbiAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyBkb3duIGluIHRoZVxuICAgc3RhY2sgdHJhY2UgKHRvIGEgbmV3ZXIgZnJhbWUpLlxuXG51KHApIFtjb3VudF1cblxuICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIHVwIGluIHRoZSBzdGFja1xuICAgdHJhY2UgKHRvIGFuIG9sZGVyIGZyYW1lKS5cblxuYihyZWFrKSBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG5cbiAgIFdpdGggYSAqbGluZW5vKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQgZmlsZS5cbiAgIFdpdGggYSAqZnVuY3Rpb24qIGFyZ3VtZW50LCBzZXQgYSBicmVhayBhdCB0aGUgZmlyc3QgZXhlY3V0YWJsZVxuICAgc3RhdGVtZW50IHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIG1heSBiZSBwcmVmaXhlZFxuICAgd2l0aCBhIGZpbGVuYW1lIGFuZCBhIGNvbG9uLCB0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiBhbm90aGVyXG4gICBmaWxlIChwcm9iYWJseSBvbmUgdGhhdCBoYXNuXCd0IGJlZW4gbG9hZGVkIHlldCkuICBUaGUgZmlsZSBpc1xuICAgc2VhcmNoZWQgb24gInN5cy5wYXRoIi4gIE5vdGUgdGhhdCBlYWNoIGJyZWFrcG9pbnQgaXMgYXNzaWduZWQgYVxuICAgbnVtYmVyIHRvIHdoaWNoIGFsbCB0aGUgb3RoZXIgYnJlYWtwb2ludCBjb21tYW5kcyByZWZlci5cblxuICAgSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudCwgaXQgaXMgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0XG4gICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLlxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MsIGluY2x1ZGluZyBmb3IgZWFjaCBicmVha3BvaW50LFxuICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJyZWFrcG9pbnQgaGFzIGJlZW4gaGl0LCB0aGUgY3VycmVudFxuICAgaWdub3JlIGNvdW50LCBhbmQgdGhlIGFzc29jaWF0ZWQgY29uZGl0aW9uIGlmIGFueS5cblxudGJyZWFrIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cblxuICAgVGVtcG9yYXJ5IGJyZWFrcG9pbnQsIHdoaWNoIGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzXG4gICBmaXJzdCBoaXQuIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciAiYnJlYWsiLlxuXG5jbChlYXIpIFtmaWxlbmFtZTpsaW5lbm8gfCBicG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgV2l0aCBhICpmaWxlbmFtZTpsaW5lbm8qIGFyZ3VtZW50LCBjbGVhciBhbGwgdGhlIGJyZWFrcG9pbnRzIGF0XG4gICB0aGlzIGxpbmUuIFdpdGggYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBicmVha3BvaW50IG51bWJlcnMsIGNsZWFyXG4gICB0aG9zZSBicmVha3BvaW50cy4gV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0IGZpcnN0XG4gICBhc2sgY29uZmlybWF0aW9uKS5cblxuZGlzYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIERpc2FibGUgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2ZcbiAgIGJyZWFrcG9pbnQgbnVtYmVycy4gIERpc2FibGluZyBhIGJyZWFrcG9pbnQgbWVhbnMgaXQgY2Fubm90IGNhdXNlXG4gICB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbiwgYnV0IHVubGlrZSBjbGVhcmluZyBhIGJyZWFrcG9pbnQsIGl0XG4gICByZW1haW5zIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzIGFuZCBjYW4gYmUgKHJlLSllbmFibGVkLlxuXG5lbmFibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBFbmFibGUgdGhlIGJyZWFrcG9pbnRzIHNwZWNpZmllZC5cblxuaWdub3JlIGJwbnVtYmVyIFtjb3VudF1cblxuICAgU2V0IHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmIGNvdW50IGlzXG4gICBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50IGJlY29tZXMgYWN0aXZlXG4gICB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZSBjb3VudCBpc1xuICAgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZSBicmVha3BvaW50XG4gICBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS5cblxuY29uZGl0aW9uIGJwbnVtYmVyIFtjb25kaXRpb25dXG5cbiAgIFNldCBhIG5ldyAqY29uZGl0aW9uKiBmb3IgdGhlIGJyZWFrcG9pbnQsIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdFxuICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmICpjb25kaXRpb24qXG4gICBpcyBhYnNlbnQsIGFueSBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlIGJyZWFrcG9pbnRcbiAgIGlzIG1hZGUgdW5jb25kaXRpb25hbC5cblxuY29tbWFuZHMgW2JwbnVtYmVyXVxuXG4gICBTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgKmJwbnVtYmVyKi4gIFRoZVxuICAgY29tbWFuZHMgdGhlbXNlbHZlcyBhcHBlYXIgb24gdGhlIGZvbGxvd2luZyBsaW5lcy4gIFR5cGUgYSBsaW5lXG4gICBjb250YWluaW5nIGp1c3QgImVuZCIgdG8gdGVybWluYXRlIHRoZSBjb21tYW5kcy4gQW4gZXhhbXBsZTpcblxuICAgICAgKFBkYikgY29tbWFuZHMgMVxuICAgICAgKGNvbSkgcCBzb21lX3ZhcmlhYmxlXG4gICAgICAoY29tKSBlbmRcbiAgICAgIChQZGIpXG5cbiAgIFRvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kIGZvbGxvd1xuICAgaXQgaW1tZWRpYXRlbHkgd2l0aCAiZW5kIjsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy5cblxuICAgV2l0aCBubyAqYnBudW1iZXIqIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QgYnJlYWtwb2ludFxuICAgc2V0LlxuXG4gICBZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi5cbiAgIFNpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlciBjb21tYW5kIHRoYXRcbiAgIHJlc3VtZXMgZXhlY3V0aW9uLlxuXG4gICBTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLFxuICAgc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzXG4gICB0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5XG4gICBlbmQpLiBUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24gKGV2ZW4gd2l0aCBhXG4gICBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIgYW5vdGhlciBicmVha3BvaW50LS13aGljaFxuICAgY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0byBhbWJpZ3VpdGllcyBhYm91dCB3aGljaFxuICAgbGlzdCB0byBleGVjdXRlLlxuXG4gICBJZiB5b3UgdXNlIHRoZSBcJ3NpbGVudFwnIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbGlzdCwgdGhlIHVzdWFsXG4gICBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgbWF5IGJlXG4gICBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgbWVzc2FnZSBhbmRcbiAgIHRoZW4gY29udGludWUuICBJZiBub25lIG9mIHRoZSBvdGhlciBjb21tYW5kcyBwcmludCBhbnl0aGluZywgeW91XG4gICBzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLlxuXG5zKHRlcClcblxuICAgRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvblxuICAgKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIG9uIHRoZSBuZXh0IGxpbmUgaW4gdGhlXG4gICBjdXJyZW50IGZ1bmN0aW9uKS5cblxubihleHQpXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzXG4gICByZWFjaGVkIG9yIGl0IHJldHVybnMuICAoVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAibmV4dCIgYW5kICJzdGVwIlxuICAgaXMgdGhhdCAic3RlcCIgc3RvcHMgaW5zaWRlIGEgY2FsbGVkIGZ1bmN0aW9uLCB3aGlsZSAibmV4dCJcbiAgIGV4ZWN1dGVzIGNhbGxlZCBmdW5jdGlvbnMgYXQgKG5lYXJseSkgZnVsbCBzcGVlZCwgb25seSBzdG9wcGluZyBhdFxuICAgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4pXG5cbnVudChpbCkgW2xpbmVub11cblxuICAgV2l0aG91dCBhcmd1bWVudCwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBsaW5lIHdpdGggYSBudW1iZXJcbiAgIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMgcmVhY2hlZC5cblxuICAgV2l0aCBhIGxpbmUgbnVtYmVyLCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgYSBsaW5lIHdpdGggYSBudW1iZXJcbiAgIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhhdCBpcyByZWFjaGVkLiAgSW4gYm90aCBjYXNlcywgYWxzbyBzdG9wIHdoZW5cbiAgIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFsbG93IGdpdmluZyBhbiBleHBsaWNpdCBsaW5lIG51bWJlci5cblxucihldHVybilcblxuICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuXG5cbmMob250KGludWUpKVxuXG4gICBDb250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyBlbmNvdW50ZXJlZC5cblxuaih1bXApIGxpbmVub1xuXG4gICBTZXQgdGhlIG5leHQgbGluZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuICBPbmx5IGF2YWlsYWJsZSBpbiB0aGVcbiAgIGJvdHRvbS1tb3N0IGZyYW1lLiAgVGhpcyBsZXRzIHlvdSBqdW1wIGJhY2sgYW5kIGV4ZWN1dGUgY29kZSBhZ2FpbixcbiAgIG9yIGp1bXAgZm9yd2FyZCB0byBza2lwIGNvZGUgdGhhdCB5b3UgZG9uXCd0IHdhbnQgdG8gcnVuLlxuXG4gICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBub3QgYWxsIGp1bXBzIGFyZSBhbGxvd2VkIC0tIGZvciBpbnN0YW5jZVxuICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgImZvciIgbG9vcCBvciBvdXRcbiAgIG9mIGEgImZpbmFsbHkiIGNsYXVzZS5cblxubChpc3QpIFtmaXJzdFssIGxhc3RdXVxuXG4gICBMaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLiAgV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTFcbiAgIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lIG9yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0aW5nLlxuICAgV2l0aCAiLiIgYXMgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUuICBXaXRoXG4gICBvbmUgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIGF0IHRoYXQgbGluZS4gIFdpdGggdHdvXG4gICBhcmd1bWVudHMsIGxpc3QgdGhlIGdpdmVuIHJhbmdlOyBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGxlc3NcbiAgIHRoYW4gdGhlIGZpcnN0LCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNvdW50LlxuXG4gICBUaGUgY3VycmVudCBsaW5lIGluIHRoZSBjdXJyZW50IGZyYW1lIGlzIGluZGljYXRlZCBieSAiLT4iLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBpcyBiZWluZyBkZWJ1Z2dlZCwgdGhlIGxpbmUgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXNcbiAgIG9yaWdpbmFsbHkgcmFpc2VkIG9yIHByb3BhZ2F0ZWQgaXMgaW5kaWNhdGVkIGJ5ICI+PiIsIGlmIGl0IGRpZmZlcnNcbiAgIGZyb20gdGhlIGN1cnJlbnQgbGluZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgIj4+IiBtYXJrZXIuXG5cbmxsIHwgbG9uZ2xpc3RcblxuICAgTGlzdCBhbGwgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9yIGZyYW1lLlxuICAgSW50ZXJlc3RpbmcgbGluZXMgYXJlIG1hcmtlZCBhcyBmb3IgImxpc3QiLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmEocmdzKVxuXG4gICBQcmludCB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi5cblxucCBleHByZXNzaW9uXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHJpbnQgaXRzXG4gICB2YWx1ZS5cblxuICAgTm90ZTogInByaW50KCkiIGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCBpcyBub3QgYSBkZWJ1Z2dlciBjb21tYW5kXG4gICAgIC0tLSB0aGlzIGV4ZWN1dGVzIHRoZSBQeXRob24gInByaW50KCkiIGZ1bmN0aW9uLlxuXG5wcCBleHByZXNzaW9uXG5cbiAgIExpa2UgdGhlICJwIiBjb21tYW5kLCBleGNlcHQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHByZXR0eS1cbiAgIHByaW50ZWQgdXNpbmcgdGhlICJwcHJpbnQiIG1vZHVsZS5cblxud2hhdGlzIGV4cHJlc3Npb25cblxuICAgUHJpbnQgdGhlIHR5cGUgb2YgdGhlICpleHByZXNzaW9uKi5cblxuc291cmNlIGV4cHJlc3Npb25cblxuICAgVHJ5IHRvIGdldCBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgZGlzcGxheSBpdC5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5kaXNwbGF5IFtleHByZXNzaW9uXVxuXG4gICBEaXNwbGF5IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpZiBpdCBjaGFuZ2VkLCBlYWNoIHRpbWVcbiAgIGV4ZWN1dGlvbiBzdG9wcyBpbiB0aGUgY3VycmVudCBmcmFtZS5cblxuICAgV2l0aG91dCBleHByZXNzaW9uLCBsaXN0IGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgY3VycmVudFxuICAgZnJhbWUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxudW5kaXNwbGF5IFtleHByZXNzaW9uXVxuXG4gICBEbyBub3QgZGlzcGxheSB0aGUgZXhwcmVzc2lvbiBhbnkgbW9yZSBpbiB0aGUgY3VycmVudCBmcmFtZS5cbiAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgY2xlYXIgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50XG4gICBmcmFtZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5pbnRlcmFjdFxuXG4gICBTdGFydCBhbiBpbnRlcmF0aXZlIGludGVycHJldGVyICh1c2luZyB0aGUgImNvZGUiIG1vZHVsZSkgd2hvc2VcbiAgIGdsb2JhbCBuYW1lc3BhY2UgY29udGFpbnMgYWxsIHRoZSAoZ2xvYmFsIGFuZCBsb2NhbCkgbmFtZXMgZm91bmQgaW5cbiAgIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmFsaWFzIFtuYW1lIFtjb21tYW5kXV1cblxuICAgQ3JlYXRlIGFuIGFsaWFzIGNhbGxlZCAqbmFtZSogdGhhdCBleGVjdXRlcyAqY29tbWFuZCouICBUaGUgY29tbWFuZFxuICAgbXVzdCAqbm90KiBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBSZXBsYWNlYWJsZSBwYXJhbWV0ZXJzIGNhbiBiZVxuICAgaW5kaWNhdGVkIGJ5ICIlMSIsICIlMiIsIGFuZCBzbyBvbiwgd2hpbGUgIiUqIiBpcyByZXBsYWNlZCBieSBhbGxcbiAgIHRoZSBwYXJhbWV0ZXJzLiBJZiBubyBjb21tYW5kIGlzIGdpdmVuLCB0aGUgY3VycmVudCBhbGlhcyBmb3JcbiAgICpuYW1lKiBpcyBzaG93bi4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlIGxpc3RlZC5cblxuICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZSBsZWdhbGx5XG4gICB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUgdGhhdCBpbnRlcm5hbCBwZGIgY29tbWFuZHMgKmNhbiogYmVcbiAgIG92ZXJyaWRkZW4gYnkgYWxpYXNlcy4gIFN1Y2ggYSBjb21tYW5kIGlzIHRoZW4gaGlkZGVuIHVudGlsIHRoZVxuICAgYWxpYXMgaXMgcmVtb3ZlZC4gIEFsaWFzaW5nIGlzIHJlY3Vyc2l2ZWx5IGFwcGxpZWQgdG8gdGhlIGZpcnN0XG4gICB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgbGVmdFxuICAgYWxvbmUuXG5cbiAgIEFzIGFuIGV4YW1wbGUsIGhlcmUgYXJlIHR3byB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuIHBsYWNlZFxuICAgaW4gdGhlICIucGRicmMiIGZpbGUpOlxuXG4gICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyAodXNhZ2UgInBpIGNsYXNzSW5zdCIpXG4gICAgICBhbGlhcyBwaSBmb3IgayBpbiAlMS5fX2RpY3RfXy5rZXlzKCk6IHByaW50KCIlMS4iLGssIj0iLCUxLl9fZGljdF9fW2tdKVxuICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gc2VsZlxuICAgICAgYWxpYXMgcHMgcGkgc2VsZlxuXG51bmFsaWFzIG5hbWVcblxuICAgRGVsZXRlIHRoZSBzcGVjaWZpZWQgYWxpYXMuXG5cbiEgc3RhdGVtZW50XG5cbiAgIEV4ZWN1dGUgdGhlIChvbmUtbGluZSkgKnN0YXRlbWVudCogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRcbiAgIHN0YWNrIGZyYW1lLiBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBmaXJzdFxuICAgd29yZCBvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuICBUbyBzZXQgYVxuICAgZ2xvYmFsIHZhcmlhYmxlLCB5b3UgY2FuIHByZWZpeCB0aGUgYXNzaWdubWVudCBjb21tYW5kIHdpdGggYVxuICAgImdsb2JhbCIgc3RhdGVtZW50IG9uIHRoZSBzYW1lIGxpbmUsIGUuZy46XG5cbiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFtcJy1sXCddXG4gICAgICAoUGRiKVxuXG5ydW4gW2FyZ3MgLi4uXVxucmVzdGFydCBbYXJncyAuLi5dXG5cbiAgIFJlc3RhcnQgdGhlIGRlYnVnZ2VkIFB5dGhvbiBwcm9ncmFtLiAgSWYgYW4gYXJndW1lbnQgaXMgc3VwcGxpZWQsXG4gICBpdCBpcyBzcGxpdCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3XG4gICAic3lzLmFyZ3YiLiBIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmVcbiAgIHByZXNlcnZlZC4gInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi5cblxucSh1aXQpXG5cbiAgIFF1aXQgZnJvbSB0aGUgZGVidWdnZXIuICBUaGUgcHJvZ3JhbSBiZWluZyBleGVjdXRlZCBpcyBhYm9ydGVkLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gbW9kdWxlXG4gICAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgIl9fbmFtZV9fIiBpbiB0aGUgZnJhbWUgZ2xvYmFscy5cbicsCi0gJ2RlbCc6IHUnXG5UaGUgImRlbCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqXG5cbiAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdFxuXG5EZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgaXNcbmRlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWVcbmhpbnRzLlxuXG5EZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdFxudG8gcmlnaHQuXG5cbkRlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBmcm9tIHRoZSBsb2NhbCBvclxuZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCJcbnN0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlIG5hbWUgaXMgdW5ib3VuZCwgYVxuIk5hbWVFcnJvciIgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuXG5EZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgcGFzc2VkXG50byB0aGUgcHJpbWFyeSBvYmplY3QgaW52b2x2ZWQ7IGRlbGV0aW9uIG9mIGEgc2xpY2luZyBpcyBpbiBnZW5lcmFsXG5lcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCBldmVuXG50aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBQcmV2aW91c2x5IGl0IHdhcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWVcbmZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMgYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkXG5ibG9jay5cbicsCi0gJ2RpY3QnOiB1J1xuRGljdGlvbmFyeSBkaXNwbGF5c1xuKioqKioqKioqKioqKioqKioqKlxuXG5BIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBrZXkvZGF0dW0gcGFpcnNcbmVuY2xvc2VkIGluIGN1cmx5IGJyYWNlczpcblxuICAgZGljdF9kaXNwbGF5ICAgICAgIDo6PSAieyIgW2tleV9kYXR1bV9saXN0IHwgZGljdF9jb21wcmVoZW5zaW9uXSAifSJcbiAgIGtleV9kYXR1bV9saXN0ICAgICA6Oj0ga2V5X2RhdHVtICgiLCIga2V5X2RhdHVtKSogWyIsIl1cbiAgIGtleV9kYXR1bSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiB8ICIqKiIgb3JfZXhwclxuICAgZGljdF9jb21wcmVoZW5zaW9uIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIGNvbXBfZm9yXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC5cblxuSWYgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Yga2V5L2RhdHVtIHBhaXJzIGlzIGdpdmVuLCB0aGV5IGFyZVxuZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlIGRpY3Rpb25hcnk6XG5lYWNoIGtleSBvYmplY3QgaXMgdXNlZCBhcyBhIGtleSBpbnRvIHRoZSBkaWN0aW9uYXJ5IHRvIHN0b3JlIHRoZVxuY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5XG5tdWx0aXBsZSB0aW1lcyBpbiB0aGUga2V5L2RhdHVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeVwncyB2YWx1ZVxuZm9yIHRoYXQga2V5IHdpbGwgYmUgdGhlIGxhc3Qgb25lIGdpdmVuLlxuXG5BIGRvdWJsZSBhc3RlcmlzayAiKioiIGRlbm90ZXMgKmRpY3Rpb25hcnkgdW5wYWNraW5nKi4gSXRzIG9wZXJhbmRcbm11c3QgYmUgYSAqbWFwcGluZyouICBFYWNoIG1hcHBpbmcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbmV3XG5kaWN0aW9uYXJ5LiAgTGF0ZXIgdmFsdWVzIHJlcGxhY2UgdmFsdWVzIGFscmVhZHkgc2V0IGJ5IGVhcmxpZXJcbmtleS9kYXR1bSBwYWlycyBhbmQgZWFybGllciBkaWN0aW9uYXJ5IHVucGFja2luZ3MuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseVxucHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG5cbkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG5uZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nXG5rZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlIG9yZGVyXG50aGV5IGFyZSBwcm9kdWNlZC5cblxuUmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlcyBvZiB0aGUga2V5IHZhbHVlcyBhcmUgbGlzdGVkIGVhcmxpZXIgaW5cbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSouICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXNcbmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxucmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKLSAnZHluYW1pYy1mZWF0dXJlcyc6IHUnXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCi0gJ2Vsc2UnOiB1J1xuVGhlICJpZiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKipcblxuVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKLSAnZXhjZXB0aW9ucyc6IHUnXG5FeGNlcHRpb25zXG4qKioqKioqKioqXG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gIFRoZVxuImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG4iU3lzdGVtRXhpdCIuXG5cbkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiIGNsYXVzZSBpc1xuc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlIHRoZVxuY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhbiBiZVxucmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5Ob3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieVxuICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzXG4gICAgY29tcGlsZWQuXG4nLAotICdleGVjbW9kZWwnOiB1J1xuRXhlY3V0aW9uIG1vZGVsXG4qKioqKioqKioqKioqKipcblxuXG5TdHJ1Y3R1cmUgb2YgYSBwcm9ncmFtXG49PT09PT09PT09PT09PT09PT09PT09XG5cbkEgUHl0aG9uIHByb2dyYW0gaXMgY29uc3RydWN0ZWQgZnJvbSBjb2RlIGJsb2Nrcy4gQSAqYmxvY2sqIGlzIGEgcGllY2Vcbm9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhIHVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlXG5ibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uIEVhY2hcbmNvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHQgZmlsZSAoYSBmaWxlIGdpdmVuXG5hcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkIGFzIGEgY29tbWFuZCBsaW5lXG5hcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgKGFcbmNvbW1hbmQgc3BlY2lmaWVkIG9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgd2l0aCB0aGUgXCcqKi1jKipcJ1xub3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgYnVpbHQtaW5cbmZ1bmN0aW9ucyAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2tcJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cblxuQmluZGluZyBvZiBuYW1lc1xuLS0tLS0tLS0tLS0tLS0tLVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZVxubW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGVcbmNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZVxuYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgKmJpbmRpbmcqXG5vZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG5cblxuUmVzb2x1dGlvbiBvZiBuYW1lc1xuLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmXG50aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWxcbnZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSB0aGVcbm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCBmaXJzdC4gIElmXG50aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICBUaGVcbiJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbiJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdFxuZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlXG5zcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuXG5leGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgcmVmZXJlbmNlc1xuZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0XG51bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBUaGVcbm5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSBvZlxudGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG9cbnRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tXG50aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSBhcmVcbmltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZ1xud2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuXG5CdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cblxuXG5FeGNlcHRpb25zXG49PT09PT09PT09XG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gIFRoZVxuImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG4iU3lzdGVtRXhpdCIuXG5cbkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiIGNsYXVzZSBpc1xuc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlIHRoZVxuY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhbiBiZVxucmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5Ob3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieVxuICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzXG4gICAgY29tcGlsZWQuXG4nLAotICdleHBybGlzdHMnOiB1J1xuRXhwcmVzc2lvbiBsaXN0c1xuKioqKioqKioqKioqKioqKlxuXG4gICBleHByZXNzaW9uX2xpc3QgICAgOjo9IGV4cHJlc3Npb24gKCAiLCIgZXhwcmVzc2lvbiApKiBbIiwiXVxuICAgc3RhcnJlZF9saXN0ICAgICAgIDo6PSBzdGFycmVkX2l0ZW0gKCAiLCIgc3RhcnJlZF9pdGVtICkqIFsiLCJdXG4gICBzdGFycmVkX2V4cHJlc3Npb24gOjo9IGV4cHJlc3Npb24gfCAoIHN0YXJyZWRfaXRlbSAiLCIgKSogW3N0YXJyZWRfaXRlbV1cbiAgIHN0YXJyZWRfaXRlbSAgICAgICA6Oj0gZXhwcmVzc2lvbiB8ICIqIiBvcl9leHByXG5cbkV4Y2VwdCB3aGVuIHBhcnQgb2YgYSBsaXN0IG9yIHNldCBkaXNwbGF5LCBhbiBleHByZXNzaW9uIGxpc3RcbmNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNvbW1hIHlpZWxkcyBhIHR1cGxlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGVcbmlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGUgZXhwcmVzc2lvbnMgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5BbiBhc3RlcmlzayAiKiIgZGVub3RlcyAqaXRlcmFibGUgdW5wYWNraW5nKi4gIEl0cyBvcGVyYW5kIG11c3QgYmUgYW5cbippdGVyYWJsZSouICBUaGUgaXRlcmFibGUgaXMgZXhwYW5kZWQgaW50byBhIHNlcXVlbmNlIG9mIGl0ZW1zLCB3aGljaFxuYXJlIGluY2x1ZGVkIGluIHRoZSBuZXcgdHVwbGUsIGxpc3QsIG9yIHNldCwgYXQgdGhlIHNpdGUgb2YgdGhlXG51bnBhY2tpbmcuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNTogSXRlcmFibGUgdW5wYWNraW5nIGluIGV4cHJlc3Npb24gbGlzdHMsIG9yaWdpbmFsbHlcbnByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuXG5UaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhXG4qc2luZ2xldG9uKik7IGl0IGlzIG9wdGlvbmFsIGluIGFsbCBvdGhlciBjYXNlcy4gIEEgc2luZ2xlIGV4cHJlc3Npb25cbndpdGhvdXQgYSB0cmFpbGluZyBjb21tYSBkb2VzblwndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciB5aWVsZHMgdGhlXG52YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiBlbXB0eSBwYWlyXG5vZiBwYXJlbnRoZXNlczogIigpIi4pXG4nLAotICdmbG9hdGluZyc6IHUnXG5GbG9hdGluZyBwb2ludCBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWxcbmRlZmluaXRpb25zOlxuXG4gICBmbG9hdG51bWJlciAgIDo6PSBwb2ludGZsb2F0IHwgZXhwb25lbnRmbG9hdFxuICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiJcbiAgIGV4cG9uZW50ZmxvYXQgOjo9IChpbnRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnRcbiAgIGludHBhcnQgICAgICAgOjo9IGRpZ2l0K1xuICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0K1xuICAgZXhwb25lbnQgICAgICA6Oj0gKCJlIiB8ICJFIikgWyIrIiB8ICItIl0gZGlnaXQrXG5cbk5vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgYXJlIGFsd2F5cyBpbnRlcnByZXRlZCB1c2luZ1xucmFkaXggMTAuIEZvciBleGFtcGxlLCAiMDc3ZTAxMCIgaXMgbGVnYWwsIGFuZCBkZW5vdGVzIHRoZSBzYW1lIG51bWJlclxuYXMgIjc3ZTEwIi4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbmltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gU29tZSBleGFtcGxlcyBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFsczpcblxuICAgMy4xNCAgICAxMC4gICAgLjAwMSAgICAxZTEwMCAgICAzLjE0ZS0xMCAgICAwZTBcblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICItMSJcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICItIiBhbmQgdGhlXG5saXRlcmFsICIxIi5cbicsCi0gJ2Zvcic6IHUnXG5UaGUgImZvciIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2VcbihzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbnByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMgKHNlZSAqQXNzaWdubWVudCBzdGF0ZW1lbnRzKiksIGFuZCB0aGVuIHRoZSBzdWl0ZSBpc1xuZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZVxuc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiksXG50aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgY29udGludWVzXG53aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dFxuaXRlbS5cblxuVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCBsaXN0LlxuVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nXG50aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG5cbiAgIGZvciBpIGluIHJhbmdlKDEwKTpcbiAgICAgICBwcmludChpKVxuICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcblxuTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLFxuYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXRcbmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyBhblxuaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbFwncyAiZm9yIGlcbjo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsIDJdIi5cblxuTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgQW5cbiAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsXG4gIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzXG4gIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnNcbiAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZVxuICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mXG4gIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nLAotICdmb3JtYXRzdHJpbmdzJzogdSdcbkZvcm1hdCBTdHJpbmcgU3ludGF4XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgInN0ci5mb3JtYXQoKSIgbWV0aG9kIGFuZCB0aGUgIkZvcm1hdHRlciIgY2xhc3Mgc2hhcmUgdGhlIHNhbWVcbnN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mICJGb3JtYXR0ZXIiLFxuc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuXG5cbkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXNcbiJ7fSIuIEFueXRoaW5nIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBicmFjZXMgaXMgY29uc2lkZXJlZCBsaXRlcmFsXG50ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCB0byBpbmNsdWRlXG5hIGJyYWNlIGNoYXJhY3RlciBpbiB0aGUgbGl0ZXJhbCB0ZXh0LCBpdCBjYW4gYmUgZXNjYXBlZCBieSBkb3VibGluZzpcbiJ7eyIgYW5kICJ9fSIuXG5cblRoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG5cbiAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4gICAgICBmaWVsZF9uYW1lICAgICAgICA6Oj0gYXJnX25hbWUgKCIuIiBhdHRyaWJ1dGVfbmFtZSB8ICJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4gICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuICAgICAgYXR0cmlidXRlX25hbWUgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4gICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXSI+ICtcbiAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyIgfCAiYSJcbiAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24+XG5cbkluIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggYVxuKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkXG5hbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgdGhlIHJlcGxhY2VtZW50IGZpZWxkLiBUaGVcbipmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiBmaWVsZCwgd2hpY2ggaXNcbnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50ICJcJyFcJyIsIGFuZCBhICpmb3JtYXRfc3BlYyosIHdoaWNoIGlzXG5wcmVjZWRlZCBieSBhIGNvbG9uICJcJzpcJyIuICBUaGVzZSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgZm9ybWF0IGZvciB0aGVcbnJlcGxhY2VtZW50IHZhbHVlLlxuXG5TZWUgYWxzbyB0aGUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIHNlY3Rpb24uXG5cblRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYVxubnVtYmVyIG9yIGEga2V5d29yZC4gIElmIGl0XCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSBwb3NpdGlvbmFsXG5hcmd1bWVudCwgYW5kIGlmIGl0XCdzIGEga2V5d29yZCwgaXQgcmVmZXJzIHRvIGEgbmFtZWQga2V5d29yZFxuYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgYXJlIDAsIDEsIDIsXG4uLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlXG5udW1iZXJzIDAsIDEsIDIsIC4uLiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhhdCBvcmRlci5cbkJlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG9cbnNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgIlwnMTBcJyIgb3JcbiJcJzotXVwnIikgd2l0aGluIGEgZm9ybWF0IHN0cmluZy4gVGhlICphcmdfbmFtZSogY2FuIGJlIGZvbGxvd2VkIGJ5IGFueVxubnVtYmVyIG9mIGluZGV4IG9yIGF0dHJpYnV0ZSBleHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybVxuIlwnLm5hbWVcJyIgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nICJnZXRhdHRyKCkiLCB3aGlsZSBhblxuZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAiXCdbaW5kZXhdXCciIGRvZXMgYW4gaW5kZXggbG9va3VwIHVzaW5nXG4iX19nZXRpdGVtX18oKSIuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlXG5vbWl0dGVkLCBzbyAiXCd7fSB7fVwnIiBpcyBlcXVpdmFsZW50IHRvICJcJ3swfSB7MX1cJyIuXG5cblNvbWUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgZXhhbXBsZXM6XG5cbiAgICJGaXJzdCwgdGhvdSBzaGFsdCBjb3VudCB0byB7MH0iICAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgIkJyaW5nIG1lIGEge30iICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXRseSByZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4gICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzICJGcm9tIHswfSB0byB7MX0iXG4gICAiTXkgcXVlc3QgaXMge25hbWV9IiAgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgXCduYW1lXCdcbiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4gICAiVW5pdHMgZGVzdHJveWVkOiB7cGxheWVyc1swXX0iICAgIyBGaXJzdCBlbGVtZW50IG9mIGtleXdvcmQgYXJndW1lbnQgXCdwbGF5ZXJzXCcuXG5cblRoZSAqY29udmVyc2lvbiogZmllbGQgY2F1c2VzIGEgdHlwZSBjb2VyY2lvbiBiZWZvcmUgZm9ybWF0dGluZy5cbk5vcm1hbGx5LCB0aGUgam9iIG9mIGZvcm1hdHRpbmcgYSB2YWx1ZSBpcyBkb25lIGJ5IHRoZSAiX19mb3JtYXRfXygpIlxubWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzIGl0IGlzIGRlc2lyYWJsZSB0b1xuZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZywgb3ZlcnJpZGluZyBpdHMgb3duXG5kZWZpbml0aW9uIG9mIGZvcm1hdHRpbmcuICBCeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbmNhbGxpbmcgIl9fZm9ybWF0X18oKSIsIHRoZSBub3JtYWwgZm9ybWF0dGluZyBsb2dpYyBpcyBieXBhc3NlZC5cblxuVGhyZWUgY29udmVyc2lvbiBmbGFncyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogIlwnIXNcJyIgd2hpY2ggY2FsbHNcbiJzdHIoKSIgb24gdGhlIHZhbHVlLCAiXCchclwnIiB3aGljaCBjYWxscyAicmVwcigpIiBhbmQgIlwnIWFcJyIgd2hpY2hcbmNhbGxzICJhc2NpaSgpIi5cblxuU29tZSBleGFtcGxlczpcblxuICAgIkhhcm9sZFwncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG4gICAiQnJpbmcgb3V0IHRoZSBob2x5IHtuYW1lIXJ9IiAgICAjIENhbGxzIHJlcHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcbiAgICJNb3JlIHshYX0iICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbHMgYXNjaWkoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcblxuVGhlICpmb3JtYXRfc3BlYyogZmllbGQgY29udGFpbnMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGUgdmFsdWVcbnNob3VsZCBiZSBwcmVzZW50ZWQsIGluY2x1ZGluZyBzdWNoIGRldGFpbHMgYXMgZmllbGQgd2lkdGgsIGFsaWdubWVudCxcbnBhZGRpbmcsIGRlY2ltYWwgcHJlY2lzaW9uIGFuZCBzbyBvbi4gIEVhY2ggdmFsdWUgdHlwZSBjYW4gZGVmaW5lIGl0c1xub3duICJmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UiIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAqZm9ybWF0X3NwZWMqLlxuXG5Nb3N0IGJ1aWx0LWluIHR5cGVzIHN1cHBvcnQgYSBjb21tb24gZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlLCB3aGljaFxuaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uXG5cbkEgKmZvcm1hdF9zcGVjKiBmaWVsZCBjYW4gYWxzbyBpbmNsdWRlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHNcbndpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgY29udGFpbiBhIGZpZWxkIG5hbWUsXG5jb252ZXJzaW9uIGZsYWcgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCBidXQgZGVlcGVyIG5lc3RpbmcgaXMgbm90XG5hbGxvd2VkLiAgVGhlIHJlcGxhY2VtZW50IGZpZWxkcyB3aXRoaW4gdGhlIGZvcm1hdF9zcGVjIGFyZVxuc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZSAqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gVGhpc1xuYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGEgdmFsdWUgdG8gYmUgZHluYW1pY2FsbHkgc3BlY2lmaWVkLlxuXG5TZWUgdGhlICpGb3JtYXQgZXhhbXBsZXMqIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuXG5cblxuRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzIGNvbnRhaW5lZFxud2l0aGluIGEgZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSBwcmVzZW50ZWRcbihzZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KikuICBUaGV5IGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGVcbmJ1aWx0LWluICJmb3JtYXQoKSIgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3dcbnRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZvciBmb3JtYXRcbnNwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIG9ubHlcbnN1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cblxuQSBnZW5lcmFsIGNvbnZlbnRpb24gaXMgdGhhdCBhbiBlbXB0eSBmb3JtYXQgc3RyaW5nICgiIiIiKSBwcm9kdWNlc1xudGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkICJzdHIoKSIgb24gdGhlIHZhbHVlLiBBIG5vbi1lbXB0eVxuZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cblxuVGhlIGdlbmVyYWwgZm9ybSBvZiBhICpzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyKiBpczpcblxuICAgZm9ybWF0X3NwZWMgOjo9IFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdXG4gICBmaWxsICAgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXI+XG4gICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4gICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiXG4gICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcblxuSWYgYSB2YWxpZCAqYWxpZ24qIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEgKmZpbGwqXG5jaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSBpZlxub21pdHRlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgKCIieyIiIG9yXG4iIn0iIikgYXMgdGhlICpmaWxsKiBjaGFyYWN0ZXIgd2hlbiB1c2luZyB0aGUgInN0ci5mb3JtYXQoKSIgbWV0aG9kLlxuSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IGEgY3VybHkgYnJhY2Ugd2l0aCBhIG5lc3RlZFxucmVwbGFjZW1lbnQgZmllbGQuICBUaGlzIGxpbWl0YXRpb24gZG9lc25cJ3QgYWZmZWN0IHRoZSAiZm9ybWF0KCkiXG5mdW5jdGlvbi5cblxuVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgZm9sbG93czpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCc8XCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgbGVmdC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCBvYmplY3RzKS4gICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJz5cJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSByaWdodC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBudW1iZXJzKS4gICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnPVwnIiAgICAgfCBGb3JjZXMgdGhlIHBhZGRpbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBzaWduIChpZiBhbnkpICAgIHxcbiAgIHwgICAgICAgICAgIHwgYnV0IGJlZm9yZSB0aGUgZGlnaXRzLiAgVGhpcyBpcyB1c2VkIGZvciBwcmludGluZyBmaWVsZHMgICB8XG4gICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtIFwnKzAwMDAwMDEyMFwnLiBUaGlzIGFsaWdubWVudCBvcHRpb24gaXMgb25seSAgICB8XG4gICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgSXQgYmVjb21lcyB0aGUgZGVmYXVsdCB3aGVuIFwnMFwnICB8XG4gICB8ICAgICAgICAgICB8IGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBmaWVsZCB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnXlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGNlbnRlcmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgZmllbGQgd2lkdGhcbndpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGRhdGEgdG8gZmlsbCBpdCwgc28gdGhhdCB0aGVcbmFsaWdubWVudCBvcHRpb24gaGFzIG5vIG1lYW5pbmcgaW4gdGhpcyBjYXNlLlxuXG5UaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gYmUgb25lIG9mXG50aGUgZm9sbG93aW5nOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJytcJyIgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIGZvciBib3RoIHBvc2l0aXZlIGFzICB8XG4gICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnLVwnIiAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgbmVnYXRpdmUgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBzcGFjZSAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIGxlYWRpbmcgc3BhY2Ugc2hvdWxkIGJlIHVzZWQgb24gcG9zaXRpdmUgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgIlwnI1wnIiBvcHRpb24gY2F1c2VzIHRoZSAiYWx0ZXJuYXRlIGZvcm0iIHRvIGJlIHVzZWQgZm9yIHRoZVxuY29udmVyc2lvbi4gIFRoZSBhbHRlcm5hdGUgZm9ybSBpcyBkZWZpbmVkIGRpZmZlcmVudGx5IGZvciBkaWZmZXJlbnRcbnR5cGVzLiAgVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlciwgZmxvYXQsIGNvbXBsZXggYW5kXG5EZWNpbWFsIHR5cGVzLiBGb3IgaW50ZWdlcnMsIHdoZW4gYmluYXJ5LCBvY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0XG5pcyB1c2VkLCB0aGlzIG9wdGlvbiBhZGRzIHRoZSBwcmVmaXggcmVzcGVjdGl2ZSAiXCcwYlwnIiwgIlwnMG9cJyIsIG9yXG4iXCcweFwnIiB0byB0aGUgb3V0cHV0IHZhbHVlLiBGb3IgZmxvYXRzLCBjb21wbGV4IGFuZCBEZWNpbWFsIHRoZVxuYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gdG8gYWx3YXlzIGNvbnRhaW4gYVxuZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIsIGV2ZW4gaWYgbm8gZGlnaXRzIGZvbGxvdyBpdC4gTm9ybWFsbHksIGFcbmRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHJlc3VsdCBvZiB0aGVzZSBjb252ZXJzaW9uc1xub25seSBpZiBhIGRpZ2l0IGZvbGxvd3MgaXQuIEluIGFkZGl0aW9uLCBmb3IgIlwnZ1wnIiBhbmQgIlwnR1wnIlxuY29udmVyc2lvbnMsIHRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHQuXG5cblRoZSAiXCcsXCciIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHMgc2VwYXJhdG9yLlxuRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSAiXCduXCciIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVcbmluc3RlYWQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IEFkZGVkIHRoZSAiXCcsXCciIG9wdGlvbiAoc2VlIGFsc28gKipQRVAgMzc4KiopLlxuXG4qd2lkdGgqIGlzIGEgZGVjaW1hbCBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoLiAgSWYgbm90XG5zcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudC5cblxuV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSBhXG56ZXJvICgiXCcwXCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyBmb3IgbnVtZXJpY1xudHlwZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAqZmlsbCogY2hhcmFjdGVyIG9mICJcJzBcJyIgd2l0aCBhblxuKmFsaWdubWVudCogdHlwZSBvZiAiXCc9XCciLlxuXG5UaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IGRpZ2l0cyBzaG91bGRcbmJlIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZVxuZm9ybWF0dGVkIHdpdGggIlwnZlwnIiBhbmQgIlwnRlwnIiwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludFxuZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggIlwnZ1wnIiBvciAiXCdHXCciLiAgRm9yIG5vbi1cbm51bWJlciB0eXBlcyB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGZpZWxkIHNpemUgLSBpbiBvdGhlclxud29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkIGZyb20gdGhlIGZpZWxkIGNvbnRlbnQuIFRoZVxuKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIgdmFsdWVzLlxuXG5GaW5hbGx5LCB0aGUgKnR5cGUqIGRldGVybWluZXMgaG93IHRoZSBkYXRhIHNob3VsZCBiZSBwcmVzZW50ZWQuXG5cblRoZSBhdmFpbGFibGUgc3RyaW5nIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnc1wnIiAgICAgfCBTdHJpbmcgZm9ybWF0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHN0cmluZ3MgYW5kICAgIHxcbiAgIHwgICAgICAgICAgIHwgbWF5IGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiXCdzXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnYlwnIiAgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAyLiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2NcJyIgICAgIHwgQ2hhcmFjdGVyLiBDb252ZXJ0cyB0aGUgaW50ZWdlciB0byB0aGUgY29ycmVzcG9uZGluZyAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSBwcmludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnZFwnIiAgICAgfCBEZWNpbWFsIEludGVnZXIuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDEwLiAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ29cJyIgICAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSA4LiAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCd4XCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyBsb3dlci0gICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ1hcJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIHVwcGVyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZFwnIiwgZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgfFxuICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiXCdkXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHByZXNlbnRhdGlvbiB0eXBlcywgaW50ZWdlcnMgY2FuIGJlIGZvcm1hdHRlZFxud2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAoZXhjZXB0ICJcJ25cJyJcbmFuZCBOb25lKS4gV2hlbiBkb2luZyBzbywgImZsb2F0KCkiIGlzIHVzZWQgdG8gY29udmVydCB0aGUgaW50ZWdlciB0b1xuYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmVmb3JlIGZvcm1hdHRpbmcuXG5cblRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgZGVjaW1hbCB2YWx1ZXNcbmFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCdlXCciICAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiBzY2llbnRpZmljICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyIFwnZVwnIHRvIGluZGljYXRlIHRoZSBleHBvbmVudC4gICAgfFxuICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ0VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFNhbWUgYXMgIlwnZVwnIiBleGNlcHQgaXQgdXNlcyBhbiB1cHBlciAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBcJ0VcJyBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIERpc3BsYXlzIHRoZSBudW1iZXIgYXMgYSBmaXhlZC1wb2ludCBudW1iZXIuICB8XG4gICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAiNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnRlwnIiAgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyAiXCdmXCciLCBidXQgY29udmVydHMgIm5hbiIgdG8gIk5BTiIgICAgfFxuICAgfCAgICAgICAgICAgfCBhbmQgImluZiIgdG8gIklORiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gInAgPj0gMSIsIHRoaXMgICAgICB8XG4gICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvICJwIiBzaWduaWZpY2FudCBkaWdpdHMgYW5kIHRoZW4gICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyBtYWduaXR1ZGUuICBUaGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCB0aGUgcmVzdWx0ICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAiXCdlXCciIGFuZCBwcmVjaXNpb24gInAtMSIgfFxuICAgfCAgICAgICAgICAgfCB3b3VsZCBoYXZlIGV4cG9uZW50ICJleHAiLiAgVGhlbiBpZiAiLTQgPD0gZXhwIDwgcCIsIHRoZSAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2ZcJyIgYW5kICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcHJlY2lzaW9uICJwLTEtZXhwIi4gIE90aGVyd2lzZSwgdGhlIG51bWJlciBpcyBmb3JtYXR0ZWQgICB8XG4gICB8ICAgICAgICAgICB8IHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiBhbmQgcHJlY2lzaW9uICJwLTEiLiBJbiBib3RoICB8XG4gICB8ICAgICAgICAgICB8IGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgICAgfFxuICAgfCAgICAgICAgICAgfCBzaWduaWZpY2FuZCwgYW5kIHRoZSBkZWNpbWFsIHBvaW50IGlzIGFsc28gcmVtb3ZlZCBpZiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nIGl0LiAgUG9zaXRpdmUgYW5kICB8XG4gICB8ICAgICAgICAgICB8IG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVybywgYW5kIG5hbnMsICAgfFxuICAgfCAgICAgICAgICAgfCBhcmUgZm9ybWF0dGVkIGFzICJpbmYiLCAiLWluZiIsICIwIiwgIi0wIiBhbmQgIm5hbiIgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSBwcmVjaXNpb24uICBBIHByZWNpc2lvbiBvZiB8XG4gICB8ICAgICAgICAgICB8ICIwIiBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYSBwcmVjaXNpb24gb2YgIjEiLiBUaGUgICAgfFxuICAgfCAgICAgICAgICAgfCBkZWZhdWx0IHByZWNpc2lvbiBpcyAiNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ0dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgIlwnZ1wnIiBleGNlcHQgc3dpdGNoZXMgdG8gIlwnRVwnIiBpZiAgfFxuICAgfCAgICAgICAgICAgfCB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IHxcbiAgIHwgICAgICAgICAgIHwgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgdG9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCduXCciICAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyAiXCdnXCciLCBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4gICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgICAgfFxuICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJyVcJyIgICAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCBhbmQgZGlzcGxheXMgaW4gICB8XG4gICB8ICAgICAgICAgICB8IGZpeGVkICgiXCdmXCciKSBmb3JtYXQsIGZvbGxvd2VkIGJ5IGEgcGVyY2VudCBzaWduLiAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBTaW1pbGFyIHRvICJcJ2dcJyIsIGV4Y2VwdCB0aGF0IGZpeGVkLXBvaW50IG5vdGF0aW9uLCB3aGVuICAgfFxuICAgfCAgICAgICAgICAgfCB1c2VkLCBoYXMgYXQgbGVhc3Qgb25lIGRpZ2l0IHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQuIFRoZSAgIHxcbiAgIHwgICAgICAgICAgIHwgZGVmYXVsdCBwcmVjaXNpb24gaXMgYXMgaGlnaCBhcyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSAgICB8XG4gICB8ICAgICAgICAgICB8IHBhcnRpY3VsYXIgdmFsdWUuIFRoZSBvdmVyYWxsIGVmZmVjdCBpcyB0byBtYXRjaCB0aGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBvdXRwdXQgb2YgInN0cigpIiBhcyBhbHRlcmVkIGJ5IHRoZSBvdGhlciBmb3JtYXQgICAgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbW9kaWZpZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5cbkZvcm1hdCBleGFtcGxlc1xuPT09PT09PT09PT09PT09XG5cblRoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgInN0ci5mb3JtYXQoKSIgc3ludGF4IGFuZFxuY29tcGFyaXNvbiB3aXRoIHRoZSBvbGQgIiUiLWZvcm1hdHRpbmcuXG5cbkluIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLFxud2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlICJ7fSIgYW5kIHdpdGggIjoiIHVzZWQgaW5zdGVhZCBvZiAiJSIuIEZvclxuZXhhbXBsZSwgIlwnJTAzLjJmXCciIGNhbiBiZSB0cmFuc2xhdGVkIHRvICJcJ3s6MDMuMmZ9XCciLlxuXG5UaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCBvcHRpb25zLCBzaG93blxuaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBwb3NpdGlvbjpcblxuICAgPj4+IFwnezB9LCB7MX0sIHsyfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3t9LCB7fSwge31cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJykgICMgMy4xKyBvbmx5XG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoKlwnYWJjXCcpICAgICAgIyB1bnBhY2tpbmcgYXJndW1lbnQgc2VxdWVuY2VcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7MH17MX17MH1cJy5mb3JtYXQoXCdhYnJhXCcsIFwnY2FkXCcpICAgIyBhcmd1bWVudHNcJyBpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuICAgXCdhYnJhY2FkYWJyYVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgbmFtZTpcblxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KGxhdGl0dWRlPVwnMzcuMjROXCcsIGxvbmdpdHVkZT1cJy0xMTUuODFXXCcpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcbiAgID4+PiBjb29yZCA9IHtcJ2xhdGl0dWRlXCc6IFwnMzcuMjROXCcsIFwnbG9uZ2l0dWRlXCc6IFwnLTExNS44MVdcJ31cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdCgqKmNvb3JkKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBhdHRyaWJ1dGVzOlxuXG4gICA+Pj4gYyA9IDMtNWpcbiAgID4+PiAoXCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgezAucmVhbH0gXCdcbiAgIC4uLiAgXCdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LlwnKS5mb3JtYXQoYylcbiAgIFwnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IDMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuXCdcbiAgID4+PiBjbGFzcyBQb2ludDpcbiAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOlxuICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5XG4gICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnUG9pbnQoe3NlbGYueH0sIHtzZWxmLnl9KVwnLmZvcm1hdChzZWxmPXNlbGYpXG4gICAuLi5cbiAgID4+PiBzdHIoUG9pbnQoNCwgMikpXG4gICBcJ1BvaW50KDQsIDIpXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50c1wnIGl0ZW1zOlxuXG4gICA+Pj4gY29vcmQgPSAoMywgNSlcbiAgID4+PiBcJ1g6IHswWzBdfTsgIFk6IHswWzFdfVwnLmZvcm1hdChjb29yZClcbiAgIFwnWDogMzsgIFk6IDVcJ1xuXG5SZXBsYWNpbmcgIiVzIiBhbmQgIiVyIjpcblxuICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogeyFzfSIuZm9ybWF0KFwndGVzdDFcJywgXCd0ZXN0MlwnKVxuICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuXG5BbGlnbmluZyB0aGUgdGV4dCBhbmQgc3BlY2lmeWluZyBhIHdpZHRoOlxuXG4gICA+Pj4gXCd7OjwzMH1cJy5mb3JtYXQoXCdsZWZ0IGFsaWduZWRcJylcbiAgIFwnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6PjMwfVwnLmZvcm1hdChcJ3JpZ2h0IGFsaWduZWRcJylcbiAgIFwnICAgICAgICAgICAgICAgICByaWdodCBhbGlnbmVkXCdcbiAgID4+PiBcJ3s6XjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpXG4gICBcJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7OipeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJykgICMgdXNlIFwnKlwnIGFzIGEgZmlsbCBjaGFyXG4gICBcJyoqKioqKioqKioqY2VudGVyZWQqKioqKioqKioqKlwnXG5cblJlcGxhY2luZyAiJStmIiwgIiUtZiIsIGFuZCAiJSBmIiBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG5cbiAgID4+PiBcJ3s6K2Z9OyB7OitmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXNcbiAgIFwnKzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezogZn07IHs6IGZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnNcbiAgIFwnIDMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezotZn07IHs6LWZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgXCd7OmZ9OyB7OmZ9XCdcbiAgIFwnMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG5cblJlcGxhY2luZyAiJXgiIGFuZCAiJW8iIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBkaWZmZXJlbnQgYmFzZXM6XG5cbiAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzXG4gICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOnh9OyAgb2N0OiB7MDpvfTsgIGJpbjogezA6Yn0iLmZvcm1hdCg0MilcbiAgIFwnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTBcJ1xuICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDpcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46IHswOiNifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAweDJhOyAgb2N0OiAwbzUyOyAgYmluOiAwYjEwMTAxMFwnXG5cblVzaW5nIHRoZSBjb21tYSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3I6XG5cbiAgID4+PiBcJ3s6LH1cJy5mb3JtYXQoMTIzNDU2Nzg5MClcbiAgIFwnMSwyMzQsNTY3LDg5MFwnXG5cbkV4cHJlc3NpbmcgYSBwZXJjZW50YWdlOlxuXG4gICA+Pj4gcG9pbnRzID0gMTlcbiAgID4+PiB0b3RhbCA9IDIyXG4gICA+Pj4gXCdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfVwnLmZvcm1hdChwb2ludHMvdG90YWwpXG4gICBcJ0NvcnJlY3QgYW5zd2VyczogODYuMzYlXCdcblxuVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOlxuXG4gICA+Pj4gaW1wb3J0IGRhdGV0aW1lXG4gICA+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDcsIDQsIDEyLCAxNSwgNTgpXG4gICA+Pj4gXCd7OiVZLSVtLSVkICVIOiVNOiVTfVwnLmZvcm1hdChkKVxuICAgXCcyMDEwLTA3LTA0IDEyOjE1OjU4XCdcblxuTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczpcblxuICAgPj4+IGZvciBhbGlnbiwgdGV4dCBpbiB6aXAoXCc8Xj5cJywgW1wnbGVmdFwnLCBcJ2NlbnRlclwnLCBcJ3JpZ2h0XCddKTpcbiAgIC4uLiAgICAgXCd7MDp7ZmlsbH17YWxpZ259MTZ9XCcuZm9ybWF0KHRleHQsIGZpbGw9YWxpZ24sIGFsaWduPWFsaWduKVxuICAgLi4uXG4gICBcJ2xlZnQ8PDw8PDw8PDw8PDxcJ1xuICAgXCdeXl5eXmNlbnRlcl5eXl5eXCdcbiAgIFwnPj4+Pj4+Pj4+Pj5yaWdodFwnXG4gICA+Pj5cbiAgID4+PiBvY3RldHMgPSBbMTkyLCAxNjgsIDAsIDFdXG4gICA+Pj4gXCd7OjAyWH17OjAyWH17OjAyWH17OjAyWH1cJy5mb3JtYXQoKm9jdGV0cylcbiAgIFwnQzBBODAwMDFcJ1xuICAgPj4+IGludChfLCAxNilcbiAgIDMyMzIyMzU1MjFcbiAgID4+PlxuICAgPj4+IHdpZHRoID0gNVxuICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6ICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0VcbiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gXCdkWG9iXCc6XG4gICAuLi4gICAgICAgICBwcmludChcJ3swOnt3aWR0aH17YmFzZX19XCcuZm9ybWF0KG51bSwgYmFzZT1iYXNlLCB3aWR0aD13aWR0aCksIGVuZD1cJyBcJylcbiAgIC4uLiAgICAgcHJpbnQoKVxuICAgLi4uXG4gICAgICAgNSAgICAgNSAgICAgNSAgIDEwMVxuICAgICAgIDYgICAgIDYgICAgIDYgICAxMTBcbiAgICAgICA3ICAgICA3ICAgICA3ICAgMTExXG4gICAgICAgOCAgICAgOCAgICAxMCAgMTAwMFxuICAgICAgIDkgICAgIDkgICAgMTEgIDEwMDFcbiAgICAgIDEwICAgICBBICAgIDEyICAxMDEwXG4gICAgICAxMSAgICAgQiAgICAxMyAgMTAxMVxuJywKLSAnZnVuY3Rpb24nOiB1J1xuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZnVuY2RlZiAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4gICBkZWNvcmF0b3JzICAgICA6Oj0gZGVjb3JhdG9yK1xuICAgZGVjb3JhdG9yICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiIFthcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgIHwgIioiIFtwYXJhbWV0ZXJdICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiAiKioiIHBhcmFtZXRlcl1cbiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgZGVmIGZ1bmMoKTogcGFzc1xuICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG5cbldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICphcmd1bWVudCogbWF5XG5iZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3MgZGVmYXVsdCB2YWx1ZSBpc1xuc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG5wYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXNcbmlzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiB0aGVcbmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzXG5ldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgInByZS1cbmNvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50XG50byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGFcbmxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieVxuYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLlxuVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgdG8gdXNlXG4iTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZVxuZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuIiIqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueVxuZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGVcbmZvcm0gIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlXG5rZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG5cblBhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiBmb2xsb3dpbmdcbnRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuIHRob3NlXG5vZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSBoYXZlXG4icmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSBwYXJhbWV0ZXJcbmxpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCBhcmVcbmV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgbWF5XG5iZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuXG5UaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc1wnIG5hbWVzIGluIHRoZSAiX19hbm5vdGF0aW9uc19fIlxuYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhXG5leHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247XG5hIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvclxuYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGFcbmV4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXRcbmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIiZGVmIiJcbnN0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWRcbmluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuXG4gICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cbicsCi0gJ2dsb2JhbCc6IHUnXG5UaGUgImdsb2JhbCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGdsb2JhbF9zdG10IDo6PSAiZ2xvYmFsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaXMgYSBkZWNsYXJhdGlvbiB3aGljaCBob2xkcyBmb3IgdGhlIGVudGlyZVxuY3VycmVudCBjb2RlIGJsb2NrLiAgSXQgbWVhbnMgdGhhdCB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIGFyZSB0byBiZVxuaW50ZXJwcmV0ZWQgYXMgZ2xvYmFscy4gIEl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gYXNzaWduIHRvIGEgZ2xvYmFsXG52YXJpYWJsZSB3aXRob3V0ICJnbG9iYWwiLCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIgdG9cbmdsb2JhbHMgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBnbG9iYWwuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvZGVcbmJsb2NrIHRleHR1YWxseSBwcmVjZWRpbmcgdGhhdCAiZ2xvYmFsIiBzdGF0ZW1lbnQuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbFxucGFyYW1ldGVycyBvciBpbiBhICJmb3IiIGxvb3AgY29udHJvbCB0YXJnZXQsICJjbGFzcyIgZGVmaW5pdGlvbixcbmZ1bmN0aW9uIGRlZmluaXRpb24sIG9yICJpbXBvcnQiIHN0YXRlbWVudC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdFxuZW5mb3JjZSB0aGUgdHdvIHJlc3RyaWN0aW9ucywgYnV0IHByb2dyYW1zIHNob3VsZCBub3QgYWJ1c2UgdGhpc1xuZnJlZWRvbSwgYXMgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBtYXkgZW5mb3JjZSB0aGVtIG9yIHNpbGVudGx5IGNoYW5nZVxudGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIHRoZSAiZ2xvYmFsIiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgcGFyc2VyLiAgSXRcbmFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSAiZ2xvYmFsIlxuc3RhdGVtZW50LiBJbiBwYXJ0aWN1bGFyLCBhICJnbG9iYWwiIHN0YXRlbWVudCBjb250YWluZWQgaW4gYSBzdHJpbmdcbm9yIGNvZGUgb2JqZWN0IHN1cHBsaWVkIHRvIHRoZSBidWlsdC1pbiAiZXhlYygpIiBmdW5jdGlvbiBkb2VzIG5vdFxuYWZmZWN0IHRoZSBjb2RlIGJsb2NrICpjb250YWluaW5nKiB0aGUgZnVuY3Rpb24gY2FsbCwgYW5kIGNvZGVcbmNvbnRhaW5lZCBpbiBzdWNoIGEgc3RyaW5nIGlzIHVuYWZmZWN0ZWQgYnkgImdsb2JhbCIgc3RhdGVtZW50cyBpbiB0aGVcbmNvZGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gY2FsbC4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlICJldmFsKCkiXG5hbmQgImNvbXBpbGUoKSIgZnVuY3Rpb25zLlxuJywKLSAnaWQtY2xhc3Nlcyc6IHUnXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbiJfKiJcbiAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllciAiXyJcbiAgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlXG4gICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICBXaGVuIG5vdFxuICAgaW4gaW50ZXJhY3RpdmUgbW9kZSwgIl8iIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCBkZWZpbmVkLlxuICAgU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgIl8iIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICAiZ2V0dGV4dCIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi5cblxuIl9fKl9fIlxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lcyBub3RcbiAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlIHdpdGhvdXRcbiAgIHdhcm5pbmcuXG5cbiJfXyoiXG4gICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkIHdpdGhpbiB0aGVcbiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm1cbiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmRcbiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gKklkZW50aWZpZXJzIChOYW1lcykqLlxuJywKLSAnaWRlbnRpZmllcnMnOiB1J1xuSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuSWRlbnRpZmllcnMgKGFsc28gcmVmZXJyZWQgdG8gYXMgKm5hbWVzKikgYXJlIGRlc2NyaWJlZCBieSB0aGVcbmZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zLlxuXG5UaGUgc3ludGF4IG9mIGlkZW50aWZpZXJzIGluIFB5dGhvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSBzdGFuZGFyZFxuYW5uZXggVUFYLTMxLCB3aXRoIGVsYWJvcmF0aW9uIGFuZCBjaGFuZ2VzIGFzIGRlZmluZWQgYmVsb3c7IHNlZSBhbHNvXG4qKlBFUCAzMTMxKiogZm9yIGZ1cnRoZXIgZGV0YWlscy5cblxuV2l0aGluIHRoZSBBU0NJSSByYW5nZSAoVSswMDAxLi5VKzAwN0YpLCB0aGUgdmFsaWQgY2hhcmFjdGVycyBmb3JcbmlkZW50aWZpZXJzIGFyZSB0aGUgc2FtZSBhcyBpbiBQeXRob24gMi54OiB0aGUgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2VcbmxldHRlcnMgIkEiIHRocm91Z2ggIloiLCB0aGUgdW5kZXJzY29yZSAiXyIgYW5kLCBleGNlcHQgZm9yIHRoZSBmaXJzdFxuY2hhcmFjdGVyLCB0aGUgZGlnaXRzICIwIiB0aHJvdWdoICI5Ii5cblxuUHl0aG9uIDMuMCBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBmcm9tIG91dHNpZGUgdGhlIEFTQ0lJXG5yYW5nZSAoc2VlICoqUEVQIDMxMzEqKikuICBGb3IgdGhlc2UgY2hhcmFjdGVycywgdGhlIGNsYXNzaWZpY2F0aW9uXG51c2VzIHRoZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBhcyBpbmNsdWRlZCBpbiB0aGVcbiJ1bmljb2RlZGF0YSIgbW9kdWxlLlxuXG5JZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuXG5cbiAgIGlkZW50aWZpZXIgICA6Oj0geGlkX3N0YXJ0IHhpZF9jb250aW51ZSpcbiAgIGlkX3N0YXJ0ICAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGdlbmVyYWwgY2F0ZWdvcmllcyBMdSwgTGwsIEx0LCBMbSwgTG8sIE5sLCB0aGUgdW5kZXJzY29yZSwgYW5kIGNoYXJhY3RlcnMgd2l0aCB0aGUgT3RoZXJfSURfU3RhcnQgcHJvcGVydHk+XG4gICBpZF9jb250aW51ZSAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCwgcGx1cyBjaGFyYWN0ZXJzIGluIHRoZSBjYXRlZ29yaWVzIE1uLCBNYywgTmQsIFBjIGFuZCBvdGhlcnMgd2l0aCB0aGUgT3RoZXJfSURfQ29udGludWUgcHJvcGVydHk+XG4gICB4aWRfc3RhcnQgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCB3aG9zZSBORktDIG5vcm1hbGl6YXRpb24gaXMgaW4gImlkX3N0YXJ0IHhpZF9jb250aW51ZSoiPlxuICAgeGlkX2NvbnRpbnVlIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfY29udGludWUgd2hvc2UgTkZLQyBub3JtYWxpemF0aW9uIGlzIGluICJpZF9jb250aW51ZSoiPlxuXG5UaGUgVW5pY29kZSBjYXRlZ29yeSBjb2RlcyBtZW50aW9uZWQgYWJvdmUgc3RhbmQgZm9yOlxuXG4qICpMdSogLSB1cHBlcmNhc2UgbGV0dGVyc1xuXG4qICpMbCogLSBsb3dlcmNhc2UgbGV0dGVyc1xuXG4qICpMdCogLSB0aXRsZWNhc2UgbGV0dGVyc1xuXG4qICpMbSogLSBtb2RpZmllciBsZXR0ZXJzXG5cbiogKkxvKiAtIG90aGVyIGxldHRlcnNcblxuKiAqTmwqIC0gbGV0dGVyIG51bWJlcnNcblxuKiAqTW4qIC0gbm9uc3BhY2luZyBtYXJrc1xuXG4qICpNYyogLSBzcGFjaW5nIGNvbWJpbmluZyBtYXJrc1xuXG4qICpOZCogLSBkZWNpbWFsIG51bWJlcnNcblxuKiAqUGMqIC0gY29ubmVjdG9yIHB1bmN0dWF0aW9uc1xuXG4qICpPdGhlcl9JRF9TdGFydCogLSBleHBsaWNpdCBsaXN0IG9mIGNoYXJhY3RlcnMgaW4gUHJvcExpc3QudHh0IHRvXG4gIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuKiAqT3RoZXJfSURfQ29udGludWUqIC0gbGlrZXdpc2VcblxuQWxsIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGUgbm9ybWFsIGZvcm0gTkZLQyB3aGlsZSBwYXJzaW5nO1xuY29tcGFyaXNvbiBvZiBpZGVudGlmaWVycyBpcyBiYXNlZCBvbiBORktDLlxuXG5BIG5vbi1ub3JtYXRpdmUgSFRNTCBmaWxlIGxpc3RpbmcgYWxsIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycyBmb3JcblVuaWNvZGUgNC4xIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5kY2wuaHBpLnVuaS1cbnBvdHNkYW0uZGUvaG9tZS9sb2V3aXMvdGFibGUtMzEzMS5odG1sLlxuXG5cbktleXdvcmRzXG49PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIGFyZSB1c2VkIGFzIHJlc2VydmVkIHdvcmRzLCBvciAqa2V5d29yZHMqIG9mXG50aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gIFRoZXkgbXVzdFxuYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcblxuICAgRmFsc2UgICAgICBjbGFzcyAgICAgIGZpbmFsbHkgICAgaXMgICAgICAgICByZXR1cm5cbiAgIE5vbmUgICAgICAgY29udGludWUgICBmb3IgICAgICAgIGxhbWJkYSAgICAgdHJ5XG4gICBUcnVlICAgICAgIGRlZiAgICAgICAgZnJvbSAgICAgICBub25sb2NhbCAgIHdoaWxlXG4gICBhbmQgICAgICAgIGRlbCAgICAgICAgZ2xvYmFsICAgICBub3QgICAgICAgIHdpdGhcbiAgIGFzICAgICAgICAgZWxpZiAgICAgICBpZiAgICAgICAgIG9yICAgICAgICAgeWllbGRcbiAgIGFzc2VydCAgICAgZWxzZSAgICAgICBpbXBvcnQgICAgIHBhc3NcbiAgIGJyZWFrICAgICAgZXhjZXB0ICAgICBpbiAgICAgICAgIHJhaXNlXG5cblxuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG4iXyoiXG4gICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXIgIl8iXG4gICBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZVxuICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgV2hlbiBub3RcbiAgIGluIGludGVyYWN0aXZlIG1vZGUsICJfIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpcyBub3QgZGVmaW5lZC5cbiAgIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVcbiAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbiJfXypfXyJcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMgbm90XG4gICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSB3aXRob3V0XG4gICB3YXJuaW5nLlxuXG4iX18qIlxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCi0gJ2lmJzogdSdcblRoZSAiaWYiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqXG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCi0gJ2ltYWdpbmFyeSc6IHUnXG5JbWFnaW5hcnkgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKlxuXG5JbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGludHBhcnQpICgiaiIgfCAiSiIpXG5cbkFuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgb2YgMC4wLlxuQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVyc1xuYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgY29tcGxleFxubnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGl0LFxuZS5nLiwgIigzKzRqKSIuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczpcblxuICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwalxuJywKLSAnaW1wb3J0JzogdSdcblRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgaW1wb3J0X3N0bXQgICAgIDo6PSAiaW1wb3J0IiBtb2R1bGUgWyJhcyIgbmFtZV0gKCAiLCIgbW9kdWxlIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiICIoIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKiBbIiwiXSAiKSJcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiBtb2R1bGUgImltcG9ydCIgIioiXG4gICBtb2R1bGUgICAgICAgICAgOjo9IChpZGVudGlmaWVyICIuIikqIGlkZW50aWZpZXJcbiAgIHJlbGF0aXZlX21vZHVsZSA6Oj0gIi4iKiBtb2R1bGUgfCAiLiIrXG4gICBuYW1lICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuVGhlIGJhc2ljIGltcG9ydCBzdGF0ZW1lbnQgKG5vICJmcm9tIiBjbGF1c2UpIGlzIGV4ZWN1dGVkIGluIHR3b1xuc3RlcHM6XG5cbjEuIGZpbmQgYSBtb2R1bGUsIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3NhcnlcblxuMi4gZGVmaW5lIGEgbmFtZSBvciBuYW1lcyBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgc2NvcGVcbiAgIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuXG5XaGVuIHRoZSBzdGF0ZW1lbnQgY29udGFpbnMgbXVsdGlwbGUgY2xhdXNlcyAoc2VwYXJhdGVkIGJ5IGNvbW1hcykgdGhlXG50d28gc3RlcHMgYXJlIGNhcnJpZWQgb3V0IHNlcGFyYXRlbHkgZm9yIGVhY2ggY2xhdXNlLCBqdXN0IGFzIHRob3VnaFxudGhlIGNsYXVzZXMgaGFkIGJlZW4gc2VwYXJhdGVkIG91dCBpbnRvIGluZGl2aWR1YWwgaW1wb3J0IHN0YXRlbWVudHMuXG5cblRoZSBkZXRhaWxzIG9mIHRoZSBmaXJzdCBzdGVwLCBmaW5kaW5nIGFuZCBsb2FkaW5nIG1vZHVsZXMgYXJlXG5kZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdGhlICppbXBvcnQgc3lzdGVtKixcbndoaWNoIGFsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXRcbmNhbiBiZSBpbXBvcnRlZCwgYXMgd2VsbCBhcyBhbGwgdGhlIGhvb2tzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbmN1c3RvbWl6ZSB0aGUgaW1wb3J0IHN5c3RlbS4gTm90ZSB0aGF0IGZhaWx1cmVzIGluIHRoaXMgc3RlcCBtYXlcbmluZGljYXRlIGVpdGhlciB0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhblxuZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIGV4ZWN1dGlvblxub2YgdGhlIG1vZHVsZVwncyBjb2RlLlxuXG5JZiB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBpdCB3aWxsIGJlIG1hZGVcbmF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGluIG9uZSBvZiB0aHJlZSB3YXlzOlxuXG4qIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSAiYXMiLCB0aGVuIHRoZSBuYW1lIGZvbGxvd2luZ1xuICAiYXMiIGlzIGJvdW5kIGRpcmVjdGx5IHRvIHRoZSBpbXBvcnRlZCBtb2R1bGUuXG5cbiogSWYgbm8gb3RoZXIgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIGFcbiAgdG9wIGxldmVsIG1vZHVsZSwgdGhlIG1vZHVsZVwncyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2VcbiAgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGltcG9ydGVkIG1vZHVsZVxuXG4qIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuIHRoZVxuICBuYW1lIG9mIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgaXMgYm91bmQgaW5cbiAgdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIHBhY2thZ2UuIFRoZVxuICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZVxuICByYXRoZXIgdGhhbiBkaXJlY3RseVxuXG5UaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOlxuXG4xLiBmaW5kIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAiZnJvbSIgY2xhdXNlLCBsb2FkaW5nIGFuZFxuICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTtcblxuMi4gZm9yIGVhY2ggb2YgdGhlIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiB0aGUgImltcG9ydCIgY2xhdXNlczpcblxuICAgMS4gY2hlY2sgaWYgdGhlIGltcG9ydGVkIG1vZHVsZSBoYXMgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZVxuXG4gICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCB0aGVuXG4gICAgICBjaGVjayB0aGUgaW1wb3J0ZWQgbW9kdWxlIGFnYWluIGZvciB0aGF0IGF0dHJpYnV0ZVxuXG4gICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuXG5cbiAgIDQuIG90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhhdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsXG4gICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyBwcmVzZW50LFxuICAgICAgb3RoZXJ3aXNlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZVxuXG5FeGFtcGxlczpcblxuICAgaW1wb3J0IGZvbyAgICAgICAgICAgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGJvdW5kIGxvY2FsbHlcbiAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCBsb2NhbGx5XG4gICBpbXBvcnQgZm9vLmJhci5iYXogYXMgZmJiICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyBmYmJcbiAgIGZyb20gZm9vLmJhciBpbXBvcnQgYmF6ICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzIGJhelxuICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzIGF0dHJcblxuSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgcmVwbGFjZWQgYnkgYSBzdGFyICgiXCcqXCciKSwgYWxsIHB1YmxpY1xubmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIGFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGVcbnNjb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuXG5UaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGVcbm1vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgIl9fYWxsX18iOyBpZiBkZWZpbmVkLCBpdCBtdXN0XG5iZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgdGhhdFxubW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluICJfX2FsbF9fIiBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljIGFuZFxuYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgIl9fYWxsX18iIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mIHB1YmxpY1xubmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIHdoaWNoIGRvIG5vdFxuYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIlwnX1wnIikuICAiX19hbGxfXyIgc2hvdWxkIGNvbnRhaW5cbnRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGV4cG9ydGluZ1xuaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcyBsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZVxuaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuXG5UaGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIC0tLSBpcyBvbmx5XG5hbGxvd2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuICBBdHRlbXB0aW5nIHRvIHVzZSBpdCBpbiBjbGFzcyBvclxuZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuXG5cbldoZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgdGhlXG5hYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWRcbndpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCB3aXRoaW5cbnRoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gQnlcbnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiB5b3VcbmNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG53aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxucGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXBcbm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGVcbiJmcm9tIC4gaW1wb3J0IG1vZCIgZnJvbSBhIG1vZHVsZSBpbiB0aGUgInBrZyIgcGFja2FnZSB0aGVuIHlvdSB3aWxsXG5lbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCBtb2QiXG5mcm9tIHdpdGhpbiAicGtnLnN1YnBrZzEiIHlvdSB3aWxsIGltcG9ydCAicGtnLnN1YnBrZzIubW9kIi4gVGhlXG5zcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzIGNvbnRhaW5lZCB3aXRoaW4gKipQRVAgMzI4KiouXG5cbiJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0XG5kZXRlcm1pbmUgZHluYW1pY2FsbHkgdGhlIG1vZHVsZXMgdG8gYmUgbG9hZGVkLlxuXG5cbkZ1dHVyZSBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PVxuXG5BICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXJcbm1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbmF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24gd2hlcmUgdGhlIGZlYXR1cmVcbmJlY29tZXMgc3RhbmRhcmQuXG5cblRoZSBmdXR1cmUgc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSB2ZXJzaW9uc1xub2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0XG5hbGxvd3MgdXNlIG9mIHRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGVcbnJlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cblxuICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbiAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlIG9ubHlcbmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcblxuKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcblxuKiBjb21tZW50cyxcblxuKiBibGFuayBsaW5lcywgYW5kXG5cbiogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG5cblRoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAzLjAgYXJlICJhYnNvbHV0ZV9pbXBvcnQiLFxuImRpdmlzaW9uIiwgImdlbmVyYXRvcnMiLCAidW5pY29kZV9saXRlcmFscyIsICJwcmludF9mdW5jdGlvbiIsXG4ibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwgcmVkdW5kYW50IGJlY2F1c2VcbnRoZXkgYXJlIGFsd2F5cyBlbmFibGVkLCBhbmQgb25seSBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbnRpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG5pbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlIGNhc2VcbnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3XG5yZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG5tb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxucnVudGltZS5cblxuRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyBoYXZlXG5iZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50XG5jb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuXG5UaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6XG50aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSAiX19mdXR1cmVfXyIsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0IHdpbGxcbmJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbmV4ZWN1dGVkLlxuXG5UaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG5lbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuXG5Ob3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG5cbiAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuXG5UaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0XCdzIGFuIG9yZGluYXJ5IGltcG9ydCBzdGF0ZW1lbnQgd2l0aFxubm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy5cblxuQ29kZSBjb21waWxlZCBieSBjYWxscyB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJleGVjKCkiIGFuZFxuImNvbXBpbGUoKSIgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZSAiTSIgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnRcbndpbGwsIGJ5IGRlZmF1bHQsIHVzZSB0aGUgbmV3IHN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZVxuZnV0dXJlIHN0YXRlbWVudC4gIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4iY29tcGlsZSgpIiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCB0eXBlZCBhdCBhbiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBwcm9tcHQgd2lsbFxudGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW5cbmludGVycHJldGVyIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgKi1pKiBvcHRpb24sIGlzIHBhc3NlZCBhIHNjcmlwdCBuYW1lXG50byBleGVjdXRlLCBhbmQgdGhlIHNjcmlwdCBpbmNsdWRlcyBhIGZ1dHVyZSBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgaW5cbmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXNcbmV4ZWN1dGVkLlxuXG5TZWUgYWxzbzogKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG5cbiAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uXG4nLAotICdpbic6IHUnXG5NZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbmV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSBvdGhlcndpc2UuICAieFxubm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiB0ZXN0c1xud2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xubGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG5leHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlIGZvciBlIGluXG55KSIuXG5cbkZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogaXNcbmEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG5zdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLFxuc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgbWV0aG9kLCAieFxuaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgYnV0IGRvXG5kZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbmlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbmR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4iX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4iaW4iLlxuJywKLSAnaW50ZWdlcnMnOiB1J1xuSW50ZWdlciBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5JbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8IGJpbmludGVnZXJcbiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuICAgZGlnaXQgICAgICAgICAgOjo9ICIwIi4uLiI5IlxuICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbiAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4gICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0K1xuICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG5cblRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSB3aGF0XG5jYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cbk5vdGUgdGhhdCBsZWFkaW5nIHplcm9zIGluIGEgbm9uLXplcm8gZGVjaW1hbCBudW1iZXIgYXJlIG5vdCBhbGxvd2VkLlxuVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob25cbnVzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuXG5Tb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6XG5cbiAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4ZGVhZGJlZWZcbicsCi0gJ2xhbWJkYSc6IHUnXG5MYW1iZGFzXG4qKioqKioqXG5cbiAgIGxhbWJkYV9leHByICAgICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuICAgbGFtYmRhX2V4cHJfbm9jb25kIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uX25vY29uZFxuXG5MYW1iZGEgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgbGFtYmRhIGZvcm1zKSBhcmUgdXNlZCB0byBjcmVhdGVcbmFub255bW91cyBmdW5jdGlvbnMuIFRoZSBleHByZXNzaW9uICJsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uIlxueWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uXG5vYmplY3QgZGVmaW5lZCB3aXRoXG5cbiAgIGRlZiA8bGFtYmRhPihhcmd1bWVudHMpOlxuICAgICAgIHJldHVybiBleHByZXNzaW9uXG5cblNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyIGxpc3RzLlxuTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluXG5zdGF0ZW1lbnRzIG9yIGFubm90YXRpb25zLlxuJywKLSAnbGlzdHMnOiB1J1xuTGlzdCBkaXNwbGF5c1xuKioqKioqKioqKioqKlxuXG5BIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCBpblxuc3F1YXJlIGJyYWNrZXRzOlxuXG4gICBsaXN0X2Rpc3BsYXkgOjo9ICJbIiBbc3RhcnJlZF9saXN0IHwgY29tcHJlaGVuc2lvbl0gIl0iXG5cbkEgbGlzdCBkaXNwbGF5IHlpZWxkcyBhIG5ldyBsaXN0IG9iamVjdCwgdGhlIGNvbnRlbnRzIGJlaW5nIHNwZWNpZmllZFxuYnkgZWl0aGVyIGEgbGlzdCBvZiBleHByZXNzaW9ucyBvciBhIGNvbXByZWhlbnNpb24uICBXaGVuIGEgY29tbWEtXG5zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWRcbmZyb20gbGVmdCB0byByaWdodCBhbmQgcGxhY2VkIGludG8gdGhlIGxpc3Qgb2JqZWN0IGluIHRoYXQgb3JkZXIuXG5XaGVuIGEgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGVcbmVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLlxuJywKLSAnbmFtaW5nJzogdSdcbk5hbWluZyBhbmQgYmluZGluZ1xuKioqKioqKioqKioqKioqKioqXG5cblxuQmluZGluZyBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZVxubW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGVcbmNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZVxuYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgKmJpbmRpbmcqXG5vZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG5cblxuUmVzb2x1dGlvbiBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PT09PVxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmXG50aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWxcbnZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSB0aGVcbm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCBmaXJzdC4gIElmXG50aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICBUaGVcbiJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbiJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdFxuZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlXG5zcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuXG5leGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgcmVmZXJlbmNlc1xuZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0XG51bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBUaGVcbm5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSBvZlxudGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG9cbnRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tXG50aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSBhcmVcbmltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZ1xud2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuXG5CdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCi0gJ25vbmxvY2FsJzogdSdcblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIG5vbmxvY2FsX3N0bXQgOjo9ICJub25sb2NhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBleGNsdWRpbmdcbmdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGJpbmRpbmcgaXNcbnRvIHNlYXJjaCB0aGUgbG9jYWwgbmFtZXNwYWNlIGZpcnN0LiAgVGhlIHN0YXRlbWVudCBhbGxvd3NcbmVuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgbG9jYWwgc2NvcGVcbmJlc2lkZXMgdGhlIGdsb2JhbCAobW9kdWxlKSBzY29wZS5cblxuTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQsIHVubGlrZSB0aG9zZSBsaXN0ZWQgaW4gYVxuImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhblxuZW5jbG9zaW5nIHNjb3BlICh0aGUgc2NvcGUgaW4gd2hpY2ggYSBuZXcgYmluZGluZyBzaG91bGQgYmUgY3JlYXRlZFxuY2Fubm90IGJlIGRldGVybWluZWQgdW5hbWJpZ3VvdXNseSkuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50IG11c3Qgbm90IGNvbGxpZGUgd2l0aCBwcmUtXG5leGlzdGluZyBiaW5kaW5ncyBpbiB0aGUgbG9jYWwgc2NvcGUuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA0KiogLSBBY2Nlc3MgdG8gTmFtZXMgaW4gT3V0ZXIgU2NvcGVzXG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC5cbicsCi0gJ251bWJlcnMnOiB1J1xuTnVtZXJpYyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8gY29tcGxleCBsaXRlcmFsc1xuKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhblxuaW1hZ2luYXJ5IG51bWJlcikuXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBcJyItIlwnIGFuZCB0aGVcbmxpdGVyYWwgIjEiLlxuJywKLSAnbnVtZXJpYy10eXBlcyc6IHUnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJywKLSAnb2JqZWN0cyc6IHUnXG5PYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbipPYmplY3RzKiBhcmUgUHl0aG9uXCdzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSBQeXRob25cbnByb2dyYW0gaXMgcmVwcmVzZW50ZWQgYnkgb2JqZWN0cyBvciBieSByZWxhdGlvbnMgYmV0d2VlbiBvYmplY3RzLiAoSW5cbmEgc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFublwncyBtb2RlbCBvZiBhICJzdG9yZWRcbnByb2dyYW0gY29tcHV0ZXIsIiBjb2RlIGlzIGFsc28gcmVwcmVzZW50ZWQgYnkgb2JqZWN0cy4pXG5cbkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdFwnc1xuKmlkZW50aXR5KiBuZXZlciBjaGFuZ2VzIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZDsgeW91IG1heSB0aGluayBvZiBpdFxuYXMgdGhlIG9iamVjdFwncyBhZGRyZXNzIGluIG1lbW9yeS4gIFRoZSBcJyJpcyJcJyBvcGVyYXRvciBjb21wYXJlcyB0aGVcbmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxucmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgbWVtb3J5XG5hZGRyZXNzIHdoZXJlICJ4IiBpcyBzdG9yZWQuXG5cbkFuIG9iamVjdFwncyB0eXBlIGRldGVybWluZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0IHN1cHBvcnRzXG4oZS5nLiwgImRvZXMgaXQgaGF2ZSBhIGxlbmd0aD8iKSBhbmQgYWxzbyBkZWZpbmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXNcbmZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdFwnc1xudHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gb2JqZWN0XCdzXG4qdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXVxuXG5UaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHMgd2hvc2UgdmFsdWUgY2FuXG5jaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzIHVuY2hhbmdlYWJsZVxub25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGUgdmFsdWUgb2YgYW5cbmltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlXG5vYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXJcJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlciB0aGVcbmNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZlxub2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG5zdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlIHN1YnRsZS4pXG5BbiBvYmplY3RcJ3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG5udW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZFxubGlzdHMgYXJlIG11dGFibGUuXG5cbk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG5hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzXG5hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbmltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxucmVhY2hhYmxlLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSByZWZlcmVuY2UtXG5jb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkXG5nYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImdjIiBtb2R1bGUgZm9yXG5pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXJcbmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZFxub24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgKHNvXG55b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS5cblxuTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uXCdzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG5mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS5cbkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCcidHJ5Ii4uLiJleGNlcHQiXCdcbnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgb3BlblxuZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkXG53aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG9cbnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgImNsb3NlKCkiIG1ldGhvZC4gUHJvZ3JhbXNcbmFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuXCcidHJ5Ii4uLiJmaW5hbGx5IlwnIHN0YXRlbWVudCBhbmQgdGhlIFwnIndpdGgiXCcgc3RhdGVtZW50IHByb3ZpZGVcbmNvbnZlbmllbnQgd2F5cyB0byBkbyB0aGlzLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSBjYWxsZWRcbipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyXCdzIHZhbHVlLiAgSW5cbm1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZVxudmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlXG50YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZVxuaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG5jb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzXG52YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cblxuVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZVxudHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG5yZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZVxuZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgImEgPSAxOyBiID0gMSIsXG4iYSIgYW5kICJiIiBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUgdmFsdWVcbm9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyICJjID0gW107IGQgPSBbXSIsICJjIlxuYW5kICJkIiBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5XG5jcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0ICJjID0gZCA9IFtdIiBhc3NpZ25zIHRoZSBzYW1lIG9iamVjdFxudG8gYm90aCAiYyIgYW5kICJkIi4pXG4nLAotICdvcGVyYXRvci1zdW1tYXJ5JzogdSdcbk9wZXJhdG9yIHByZWNlZGVuY2VcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIGluIFB5dGhvbiwgZnJvbVxubG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdFxuYmluZGluZykuICBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzc1xudGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpblxudGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgZXhwb25lbnRpYXRpb24sIHdoaWNoXG5ncm91cHMgZnJvbSByaWdodCB0byBsZWZ0KS5cblxuTm90ZSB0aGF0IGNvbXBhcmlzb25zLCBtZW1iZXJzaGlwIHRlc3RzLCBhbmQgaWRlbnRpdHkgdGVzdHMsIGFsbCBoYXZlXG50aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyBmZWF0dXJlIGFzXG5kZXNjcmliZWQgaW4gdGhlICpDb21wYXJpc29ucyogc2VjdGlvbi5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xufCAibGFtYmRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhbWJkYSBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaWYiIC0tICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAibm90IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaW4iLCAibm90IGluIiwgImlzIiwgImlzIG5vdCIsICI8IiwgIjw9IiwgIj4iLCB8IENvbXBhcmlzb25zLCBpbmNsdWRpbmcgbWVtYmVyc2hpcCAgICAgfFxufCAiPj0iLCAiIT0iLCAiPT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiXiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiJiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiPDwiLCAiPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKyIsICItIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIgICAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBtYXRyaXggbXVsdGlwbGljYXRpb24gfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpdmlzaW9uLCByZW1haW5kZXIgWzVdICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiK3giLCAiLXgiLCAifngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKioiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4cG9uZW50aWF0aW9uIFs2XSAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYXdhaXQiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEF3YWl0IGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAieFtpbmRleF0iLCAieFtpbmRleDppbmRleF0iLCAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfFxufCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKGV4cHJlc3Npb25zLi4uKSIsICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6ICB8IEJpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgbGlzdCAgICAgICAgfFxufCB2YWx1ZS4uLn0iLCAie2V4cHJlc3Npb25zLi4ufSIgICAgICAgICAgICAgICAgICB8IGRpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0ICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFdoaWxlICJhYnMoeCV5KSA8IGFicyh5KSIgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0c1xuICAgIGl0IG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCAiLTFlLTEwMCAlIDFlMTAwIiBoYXZlIHRoZSBzYW1lXG4gICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgMWUxMDAiLCB3aGljaFxuICAgIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gIjFlMTAwIi4gIFRoZSBmdW5jdGlvblxuICAgICJtYXRoLmZtb2QoKSIgcmV0dXJucyBhIHJlc3VsdCB3aG9zZSBzaWduIG1hdGNoZXMgdGhlIHNpZ24gb2YgdGhlXG4gICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluIHRoaXMgY2FzZS5cbiAgICBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlIGFwcGxpY2F0aW9uLlxuXG5bMl0gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgeSwgaXRcJ3NcbiAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAiKHgteCV5KS8veSIgZHVlIHRvXG4gICAgcm91bmRpbmcuICBJbiBzdWNoIGNhc2VzLCBQeXRob24gcmV0dXJucyB0aGUgbGF0dGVyIHJlc3VsdCwgaW5cbiAgICBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0ICJkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeSIgYmUgdmVyeSBjbG9zZVxuICAgIHRvICJ4Ii5cblxuWzNdIFRoZSBVbmljb2RlIHN0YW5kYXJkIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAqY29kZSBwb2ludHMqIChlLmcuXG4gICAgVSswMDQxKSBhbmQgKmFic3RyYWN0IGNoYXJhY3RlcnMqIChlLmcuICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIikuXG4gICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgcmVwcmVzZW50ZWRcbiAgICB1c2luZyBvbmUgY29kZSBwb2ludCwgdGhlcmUgaXMgYSBudW1iZXIgb2YgYWJzdHJhY3QgY2hhcmFjdGVyc1xuICAgIHRoYXQgY2FuIGluIGFkZGl0aW9uIGJlIHJlcHJlc2VudGVkIHVzaW5nIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuXG4gICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciAiTEFUSU5cbiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSIgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlXG4gICAgKnByZWNvbXBvc2VkIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwQzcsIG9yIGFzIGEgc2VxdWVuY2VcbiAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOIENBUElUQUxcbiAgICBMRVRURVIgQyksIGZvbGxvd2VkIGJ5IGEgKmNvbWJpbmluZyBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb25cbiAgICBVKzAzMjcgKENPTUJJTklORyBDRURJTExBKS5cblxuICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlIGxldmVsIG9mXG4gICAgVW5pY29kZSBjb2RlIHBvaW50cy4gVGhpcyBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gaHVtYW5zLiAgRm9yXG4gICAgZXhhbXBsZSwgIiJcXHUwMEM3IiA9PSAiXFx1MDA0M1xcdTAzMjciIiBpcyAiRmFsc2UiLCBldmVuIHRob3VnaCBib3RoXG4gICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTiBDQVBJVEFMXG4gICAgTEVUVEVSIEMgV0lUSCBDRURJTExBIi5cblxuICAgIFRvIGNvbXBhcmUgc3RyaW5ncyBhdCB0aGUgbGV2ZWwgb2YgYWJzdHJhY3QgY2hhcmFjdGVycyAodGhhdCBpcyxcbiAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICJ1bmljb2RlZGF0YS5ub3JtYWxpemUoKSIuXG5cbls0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZVxuICAgIGR5bmFtaWMgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbFxuICAgIGJlaGF2aW91ciBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlICJpcyIgb3BlcmF0b3IsIGxpa2UgdGhvc2VcbiAgICBpbnZvbHZpbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciBjb25zdGFudHMuXG4gICAgQ2hlY2sgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bNV0gVGhlICIlIiBvcGVyYXRvciBpcyBhbHNvIHVzZWQgZm9yIHN0cmluZyBmb3JtYXR0aW5nOyB0aGUgc2FtZVxuICAgIHByZWNlZGVuY2UgYXBwbGllcy5cblxuWzZdIFRoZSBwb3dlciBvcGVyYXRvciAiKioiIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuIGFyaXRobWV0aWNcbiAgICBvciBiaXR3aXNlIHVuYXJ5IG9wZXJhdG9yIG9uIGl0cyByaWdodCwgdGhhdCBpcywgIjIqKi0xIiBpcyAiMC41Ii5cbicsCi0gJ3Bhc3MnOiB1J1xuVGhlICJwYXNzIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHBhc3Nfc3RtdCA6Oj0gInBhc3MiXG5cbiJwYXNzIiBpcyBhIG51bGwgb3BlcmF0aW9uIC0tLSB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nIGhhcHBlbnMuXG5JdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG5zeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6XG5cbiAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG5cbiAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KVxuJywKLSAncG93ZXInOiB1J1xuVGhlIHBvd2VyIG9wZXJhdG9yXG4qKioqKioqKioqKioqKioqKipcblxuVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHNcbmxlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICBUaGVcbnN5bnRheCBpczpcblxuICAgcG93ZXIgOjo9ICggYXdhaXRfZXhwciB8IHByaW1hcnkgKSBbIioqIiB1X2V4cHJdXG5cblRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGVcbm9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW5cbnRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiAiLTEqKjIiIHJlc3VsdHMgaW4gIi0xIi5cblxuVGhlIHBvd2VyIG9wZXJhdG9yIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGJ1aWx0LWluICJwb3coKSJcbmZ1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCBhcmd1bWVudFxucmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlXG5maXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwgYW5kIHRoZSByZXN1bHQgaXMgb2YgdGhhdCB0eXBlLlxuXG5Gb3IgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyB1bmxlc3NcbnRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmVcbmNvbnZlcnRlZCB0byBmbG9hdCBhbmQgYSBmbG9hdCByZXN1bHQgaXMgZGVsaXZlcmVkLiBGb3IgZXhhbXBsZSxcbiIxMCoqMiIgcmV0dXJucyAiMTAwIiwgYnV0ICIxMCoqLTIiIHJldHVybnMgIjAuMDEiLlxuXG5SYWlzaW5nICIwLjAiIHRvIGEgbmVnYXRpdmUgcG93ZXIgcmVzdWx0cyBpbiBhICJaZXJvRGl2aXNpb25FcnJvciIuXG5SYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZnJhY3Rpb25hbCBwb3dlciByZXN1bHRzIGluIGEgImNvbXBsZXgiXG5udW1iZXIuIChJbiBlYXJsaWVyIHZlcnNpb25zIGl0IHJhaXNlZCBhICJWYWx1ZUVycm9yIi4pXG4nLAotICdyYWlzZSc6IHUnXG5UaGUgInJhaXNlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG4gICByYWlzZV9zdG10IDo6PSAicmFpc2UiIFtleHByZXNzaW9uIFsiZnJvbSIgZXhwcmVzc2lvbl1dXG5cbklmIG5vIGV4cHJlc3Npb25zIGFyZSBwcmVzZW50LCAicmFpc2UiIHJlLXJhaXNlcyB0aGUgbGFzdCBleGNlcHRpb25cbnRoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgaW5cbnRoZSBjdXJyZW50IHNjb3BlLCBhICJSdW50aW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5kaWNhdGluZ1xudGhhdCB0aGlzIGlzIGFuIGVycm9yLlxuXG5PdGhlcndpc2UsICJyYWlzZSIgZXZhbHVhdGVzIHRoZSBmaXJzdCBleHByZXNzaW9uIGFzIHRoZSBleGNlcHRpb25cbm9iamVjdC4gIEl0IG11c3QgYmUgZWl0aGVyIGEgc3ViY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2ZcbiJCYXNlRXhjZXB0aW9uIi4gSWYgaXQgaXMgYSBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB3aWxsIGJlXG5vYnRhaW5lZCB3aGVuIG5lZWRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyB3aXRoIG5vIGFyZ3VtZW50cy5cblxuVGhlICp0eXBlKiBvZiB0aGUgZXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gaW5zdGFuY2VcJ3MgY2xhc3MsIHRoZVxuKnZhbHVlKiBpcyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuXG5BIHRyYWNlYmFjayBvYmplY3QgaXMgbm9ybWFsbHkgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZXhjZXB0aW9uXG5pcyByYWlzZWQgYW5kIGF0dGFjaGVkIHRvIGl0IGFzIHRoZSAiX190cmFjZWJhY2tfXyIgYXR0cmlidXRlLCB3aGljaFxuaXMgd3JpdGFibGUuIFlvdSBjYW4gY3JlYXRlIGFuIGV4Y2VwdGlvbiBhbmQgc2V0IHlvdXIgb3duIHRyYWNlYmFjayBpblxub25lIHN0ZXAgdXNpbmcgdGhlICJ3aXRoX3RyYWNlYmFjaygpIiBleGNlcHRpb24gbWV0aG9kICh3aGljaCByZXR1cm5zXG50aGUgc2FtZSBleGNlcHRpb24gaW5zdGFuY2UsIHdpdGggaXRzIHRyYWNlYmFjayBzZXQgdG8gaXRzIGFyZ3VtZW50KSxcbmxpa2Ugc286XG5cbiAgIHJhaXNlIEV4Y2VwdGlvbigiZm9vIG9jY3VycmVkIikud2l0aF90cmFjZWJhY2sodHJhY2ViYWNrb2JqKVxuXG5UaGUgImZyb20iIGNsYXVzZSBpcyB1c2VkIGZvciBleGNlcHRpb24gY2hhaW5pbmc6IGlmIGdpdmVuLCB0aGUgc2Vjb25kXG4qZXhwcmVzc2lvbiogbXVzdCBiZSBhbm90aGVyIGV4Y2VwdGlvbiBjbGFzcyBvciBpbnN0YW5jZSwgd2hpY2ggd2lsbFxudGhlbiBiZSBhdHRhY2hlZCB0byB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBhcyB0aGUgIl9fY2F1c2VfXyIgYXR0cmlidXRlXG4od2hpY2ggaXMgd3JpdGFibGUpLiAgSWYgdGhlIHJhaXNlZCBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQsIGJvdGhcbmV4Y2VwdGlvbnMgd2lsbCBiZSBwcmludGVkOlxuXG4gICA+Pj4gdHJ5OlxuICAgLi4uICAgICBwcmludCgxIC8gMClcbiAgIC4uLiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbiAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIikgZnJvbSBleGNcbiAgIC4uLlxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuXG4gICBUaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4gICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcblxuQSBzaW1pbGFyIG1lY2hhbmlzbSB3b3JrcyBpbXBsaWNpdGx5IGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5zaWRlXG5hbiBleGNlcHRpb24gaGFuZGxlciBvciBhICJmaW5hbGx5IiBjbGF1c2U6IHRoZSBwcmV2aW91cyBleGNlcHRpb24gaXNcbnRoZW4gYXR0YWNoZWQgYXMgdGhlIG5ldyBleGNlcHRpb25cJ3MgIl9fY29udGV4dF9fIiBhdHRyaWJ1dGU6XG5cbiAgID4+PiB0cnk6XG4gICAuLi4gICAgIHByaW50KDEgLyAwKVxuICAgLi4uIGV4Y2VwdDpcbiAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIilcbiAgIC4uLlxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuXG4gICBEdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6XG5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZFxuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhhbmRsaW5nIGV4Y2VwdGlvbnMgaXMgaW4gc2VjdGlvblxuKlRoZSB0cnkgc3RhdGVtZW50Ki5cbicsCi0gJ3JldHVybic6IHUnXG5UaGUgInJldHVybiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJldHVybl9zdG10IDo6PSAicmV0dXJuIiBbZXhwcmVzc2lvbl9saXN0XVxuXG4icmV0dXJuIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sXG5ub3Qgd2l0aGluIGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24uXG5cbklmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgIk5vbmUiIGlzXG5zdWJzdGl0dXRlZC5cblxuInJldHVybiIgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgZXhwcmVzc2lvbiBsaXN0IChvclxuIk5vbmUiKSBhcyByZXR1cm4gdmFsdWUuXG5cbldoZW4gInJldHVybiIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAiZmluYWxseSJcbmNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyB0aGVcbmZ1bmN0aW9uLlxuXG5JbiBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlICJyZXR1cm4iIHN0YXRlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGVcbmdlbmVyYXRvciBpcyBkb25lIGFuZCB3aWxsIGNhdXNlICJTdG9wSXRlcmF0aW9uIiB0byBiZSByYWlzZWQuIFRoZVxucmV0dXJuZWQgdmFsdWUgKGlmIGFueSkgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCB0byBjb25zdHJ1Y3RcbiJTdG9wSXRlcmF0aW9uIiBhbmQgYmVjb21lcyB0aGUgIlN0b3BJdGVyYXRpb24udmFsdWUiIGF0dHJpYnV0ZS5cbicsCi0gJ3NlcXVlbmNlLXR5cGVzJzogdSdcbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayA8IE4iIHdoZXJlXG4qTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhXG5yYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlIHRoZVxubWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAiY2xlYXIoKSIsXG4ic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgInVwZGF0ZSgpIlxuYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uXCdzIHN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy5cblRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgYWJzdHJhY3QgYmFzZVxuY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgIl9fZ2V0aXRlbV9fKCkiLFxuIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSBzZXF1ZW5jZXNcbnNob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICJleHRlbmQoKSIsXG4iaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsIGxpa2UgUHl0aG9uXG5zdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50XG5hZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmdcbnJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAiX19yYWRkX18oKSIsXG4iX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiBkZXNjcmliZWRcbmJlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpc1xucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiBvcGVyYXRvcjtcbmZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0XG5zaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgdGhhdCBib3RoXG5tYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byBhbGxvd1xuZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiXG5zaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlXG50aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gb2JqZWN0IHRoYXRcbiAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICJfX2xlbl9fKCkiIG1ldGhvZFxuICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCByZXR1cm4gYW5cbiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhblxuICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuIFRoaXNcbiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3JcbiAgIGNvcnJlY3RuZXNzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbk5vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcy5cbiAgQSBjYWxsIGxpa2VcblxuICAgICBhWzE6Ml0gPSBiXG5cbiAgaXMgdHJhbnNsYXRlZCB0b1xuXG4gICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuXG4gIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yIHNlcXVlbmNlIHR5cGVzLFxuICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgTm90ZSB0aGF0XG4gICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgY2xhc3Mgd2lzaGVzXG4gICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuIElmXG4gICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSByYWlzZWQ7IGlmIG9mXG4gICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueVxuICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgc2hvdWxkIGJlXG4gICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlXG4gICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiBmb3IgZGljdFxuICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgInJldmVyc2VkKCkiXG4gICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKCJfX2xlbl9fKCkiXG4gICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbFxuICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW5cbiAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5XG4gICAicmV2ZXJzZWQoKSIuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3RcbiAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgc2VxdWVuY2VcbiAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgKnRoaXMgc2VjdGlvbiBpbiB0aGVcbiAgIGxhbmd1YWdlIHJlZmVyZW5jZSouXG4nLAotICdzaGlmdGluZyc6IHUnXG5TaGlmdGluZyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpY1xub3BlcmF0aW9uczpcblxuICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoICI8PCIgfCAiPj4iICkgYV9leHByXG5cblRoZXNlIG9wZXJhdG9ycyBhY2NlcHQgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhleSBzaGlmdCB0aGUgZmlyc3RcbmFyZ3VtZW50IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBieSB0aGVcbnNlY29uZCBhcmd1bWVudC5cblxuQSByaWdodCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIGZsb29yIGRpdmlzaW9uIGJ5ICJwb3coMixuKSIuXG5BIGxlZnQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBtdWx0aXBsaWNhdGlvbiB3aXRoICJwb3coMixuKSIuXG5cbk5vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzXG4gIHJlcXVpcmVkIHRvIGJlIGF0IG1vc3QgInN5cy5tYXhzaXplIi4gIElmIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbiAgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhbiAiT3ZlcmZsb3dFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCi0gJ3NsaWNpbmdzJzogdSdcblNsaWNpbmdzXG4qKioqKioqKlxuXG5BIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhXG5zdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXNcbnRhcmdldHMgaW4gYXNzaWdubWVudCBvciAiZGVsIiBzdGF0ZW1lbnRzLiAgVGhlIHN5bnRheCBmb3IgYSBzbGljaW5nOlxuXG4gICBzbGljaW5nICAgICAgOjo9IHByaW1hcnkgIlsiIHNsaWNlX2xpc3QgIl0iXG4gICBzbGljZV9saXN0ICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbiAgIHNsaWNlX2l0ZW0gICA6Oj0gZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZVxuICAgcHJvcGVyX3NsaWNlIDo6PSBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdIFsgIjoiIFtzdHJpZGVdIF1cbiAgIGxvd2VyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuICAgdXBwZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4gICBzdHJpZGUgICAgICAgOjo9IGV4cHJlc3Npb25cblxuVGhlcmUgaXMgYW1iaWd1aXR5IGluIHRoZSBmb3JtYWwgc3ludGF4IGhlcmU6IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZVxuYW4gZXhwcmVzc2lvbiBsaXN0IGFsc28gbG9va3MgbGlrZSBhIHNsaWNlIGxpc3QsIHNvIGFueSBzdWJzY3JpcHRpb25cbmNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGVcbnN5bnRheCwgdGhpcyBpcyBkaXNhbWJpZ3VhdGVkIGJ5IGRlZmluaW5nIHRoYXQgaW4gdGhpcyBjYXNlIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzdWJzY3JpcHRpb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdFxuY29udGFpbnMgbm8gcHJvcGVyIHNsaWNlKS5cblxuVGhlIHNlbWFudGljcyBmb3IgYSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgaXMgaW5kZXhlZFxuKHVzaW5nIHRoZSBzYW1lICJfX2dldGl0ZW1fXygpIiBtZXRob2QgYXMgbm9ybWFsIHN1YnNjcmlwdGlvbikgd2l0aCBhXG5rZXkgdGhhdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlIHNsaWNlXG5saXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlXG5jb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgbG9uZVxuc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgYW5cbmV4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXIgc2xpY2UgaXMgYVxuc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kikgd2hvc2VcbiJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlXG5leHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSxcbnJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nICJOb25lIiBmb3IgbWlzc2luZyBleHByZXNzaW9ucy5cbicsCi0gJ3NwZWNpYWxhdHRycyc6IHUnXG5TcGVjaWFsIEF0dHJpYnV0ZXNcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWxcbm9iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSBub3QgcmVwb3J0ZWRcbmJ5IHRoZSAiZGlyKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLlxuXG5vYmplY3QuX19kaWN0X19cblxuICAgQSBkaWN0aW9uYXJ5IG9yIG90aGVyIG1hcHBpbmcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gb2JqZWN0XCdzXG4gICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuXG5cbmluc3RhbmNlLl9fY2xhc3NfX1xuXG4gICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLlxuXG5jbGFzcy5fX2Jhc2VzX19cblxuICAgVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC5cblxuY2xhc3MuX19uYW1lX19cblxuICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9yIHR5cGUuXG5cbmNsYXNzLl9fcXVhbG5hbWVfX1xuXG4gICBUaGUgKnF1YWxpZmllZCBuYW1lKiBvZiB0aGUgY2xhc3Mgb3IgdHlwZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4zLlxuXG5jbGFzcy5fX21yb19fXG5cbiAgIFRoaXMgYXR0cmlidXRlIGlzIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IGFyZSBjb25zaWRlcmVkIHdoZW5cbiAgIGxvb2tpbmcgZm9yIGJhc2UgY2xhc3NlcyBkdXJpbmcgbWV0aG9kIHJlc29sdXRpb24uXG5cbmNsYXNzLm1ybygpXG5cbiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSB0aGVcbiAgIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGZvciBpdHMgaW5zdGFuY2VzLiAgSXQgaXMgY2FsbGVkIGF0IGNsYXNzXG4gICBpbnN0YW50aWF0aW9uLCBhbmQgaXRzIHJlc3VsdCBpcyBzdG9yZWQgaW4gIl9fbXJvX18iLlxuXG5jbGFzcy5fX3N1YmNsYXNzZXNfXygpXG5cbiAgIEVhY2ggY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW1tZWRpYXRlXG4gICBzdWJjbGFzc2VzLiAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRob3NlIHJlZmVyZW5jZXNcbiAgIHN0aWxsIGFsaXZlLiBFeGFtcGxlOlxuXG4gICAgICA+Pj4gaW50Ll9fc3ViY2xhc3Nlc19fKClcbiAgICAgIFs8Y2xhc3MgXCdib29sXCc+XVxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSBmb3VuZFxuICAgIGluIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbCAoKkJhc2ljIGN1c3RvbWl6YXRpb24qKS5cblxuWzJdIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBsaXN0ICJbMSwgMl0iIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG9cbiAgICAiWzEuMCwgMi4wXSIsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy5cblxuWzNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuXCd0IHRlbGwgdGhlIHR5cGUgb2YgdGhlXG4gICAgb3BlcmFuZHMuXG5cbls0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHlcbiAgICBiZWluZyBvbmUgb2YgIkx1IiAoTGV0dGVyLCB1cHBlcmNhc2UpLCAiTGwiIChMZXR0ZXIsIGxvd2VyY2FzZSksXG4gICAgb3IgIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuXG5bNV0gVG8gZm9ybWF0IG9ubHkgYSB0dXBsZSB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGFcbiAgICBzaW5nbGV0b24gdHVwbGUgd2hvc2Ugb25seSBlbGVtZW50IGlzIHRoZSB0dXBsZSB0byBiZSBmb3JtYXR0ZWQuXG4nLAotICdzcGVjaWFsbmFtZXMnOiB1J1xuU3BlY2lhbCBtZXRob2QgbmFtZXNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSBzcGVjaWFsXG5zeW50YXggKHN1Y2ggYXMgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9yIHN1YnNjcmlwdGluZyBhbmQgc2xpY2luZykgYnlcbmRlZmluaW5nIG1ldGhvZHMgd2l0aCBzcGVjaWFsIG5hbWVzLiBUaGlzIGlzIFB5dGhvblwncyBhcHByb2FjaCB0b1xuKm9wZXJhdG9yIG92ZXJsb2FkaW5nKiwgYWxsb3dpbmcgY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9yXG53aXRoIHJlc3BlY3QgdG8gbGFuZ3VhZ2Ugb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhIGNsYXNzIGRlZmluZXNcbmEgbWV0aG9kIG5hbWVkICJfX2dldGl0ZW1fXygpIiwgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLFxudGhlbiAieFtpXSIgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvICJ0eXBlKHgpLl9fZ2V0aXRlbV9fKHgsIGkpIi5cbkV4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIHJhaXNlIGFuXG5leGNlcHRpb24gd2hlbiBubyBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZGVmaW5lZCAodHlwaWNhbGx5XG4iQXR0cmlidXRlRXJyb3IiIG9yICJUeXBlRXJyb3IiKS5cblxuV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpc1xuaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdFxubWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgc29tZVxuc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0XG5leHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlXG4iTm9kZUxpc3QiIGludGVyZmFjZSBpbiB0aGUgVzNDXCdzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pXG5cblxuQmFzaWMgY3VzdG9taXphdGlvblxuPT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuXG4gICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgIl9fbmV3X18oKSIgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5IGFuXG4gICBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuICAgInN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgIl9fbmV3X18oKSIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4gICAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIuXG5cbiAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgIl9fbmV3X18oKSIpLCBidXRcbiAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzICJfX2luaXRfXygpIiBtZXRob2QsIGlmXG4gICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlXG4gICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgICJCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKSIuXG5cbiAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluIGNvbnN0cnVjdGluZ1xuICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvIGN1c3RvbWlzZVxuICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAiX19pbml0X18oKSI7IGRvaW5nIHNvXG4gICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG5cbm9iamVjdC5fX2RlbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc29cbiAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgbWV0aG9kLCB0aGVcbiAgIGRlcml2ZWQgY2xhc3NcJ3MgIl9fZGVsX18oKSIgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0XG4gICB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlLlxuICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yIHRoZVxuICAgIl9fZGVsX18oKSIgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW5cbiAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cblxuICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlIGxhdHRlciBpc1xuICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IlwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZSBjb21tb25cbiAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGZyb21cbiAgICAgZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gb2JqZWN0cyAoZS5nLixcbiAgICAgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggcGFyZW50IGFuZFxuICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIG9mXG4gICAgIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmV4Y19pbmZvKClbMl0iIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yIGEgcmVmZXJlbmNlXG4gICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuIHVuaGFuZGxlZFxuICAgICBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5sYXN0X3RyYWNlYmFjayIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSBmaXJzdFxuICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyB0aGUgY3ljbGVzO1xuICAgICB0aGUgc2Vjb25kIGNhbiBiZSByZXNvbHZlZCBieSBmcmVlaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlXG4gICAgIHRyYWNlYmFjayBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZnVsLCBhbmQgdGhlIHRoaXJkIGNhblxuICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gQ2lyY3VsYXJcbiAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgYW5kIGNsZWFuZWQgdXAgd2hlbiB0aGVcbiAgICAgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIGVuYWJsZWQgKGl0XCdzIG9uIGJ5IGRlZmF1bHQpLiBSZWZlclxuICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAgIGFib3V0IHRoaXMgdG9waWMuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoXG4gICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmdcbiAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG9cbiAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgaW52b2tlZCBpblxuICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGVcbiAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAiX19kZWxfXygpIlxuICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmdcbiAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXNcbiAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgbWluaW11bSBuZWVkZWRcbiAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjUsXG4gICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlXG4gICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyIGdsb2JhbHMgYXJlXG4gICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heVxuICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIGF0IHRoZVxuICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICJvZmZpY2lhbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXNcbiAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG9cbiAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZVxuICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtXG4gICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgcmV0dXJuXG4gICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICJfX3JlcHJfXygpIiBidXRcbiAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gImluZm9ybWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzIHJlcXVpcmVkLlxuXG4gICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZVxuICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG5cbm9iamVjdC5fX3N0cl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJmb3JtYXQoKSIgYW5kXG4gICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgKnN0cmluZypcbiAgIG9iamVjdC5cblxuICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCB0aGVyZSBpcyBub1xuICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYVxuICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuXG5cbiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgIm9iamVjdCJcbiAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuXG5cbm9iamVjdC5fX2J5dGVzX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW5cbiAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuXG5cbm9iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKVxuXG4gICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24gKGFuZCBieSBleHRlbnNpb24sIHRoZVxuICAgInN0ci5mb3JtYXQoKSIgbWV0aG9kIG9mIGNsYXNzICJzdHIiKSB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGFcbiAgIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9uc1xuICAgZGVzaXJlZC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIHVwIHRvXG4gICB0aGUgdHlwZSBpbXBsZW1lbnRpbmcgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGxcbiAgIGVpdGhlciBkZWxlZ2F0ZSBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhXG4gICBzaW1pbGFyIGZvcm1hdHRpbmcgb3B0aW9uIHN5bnRheC5cblxuICAgU2VlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVcbiAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuXG4gICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy40OiBUaGUgX19mb3JtYXRfXyBtZXRob2Qgb2YgIm9iamVjdCIgaXRzZWxmXG4gICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG5cbm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4gICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhc1xuICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICJ4Ll9fbGVfXyh5KSIsXG4gICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICJ4PnkiIGNhbGxzXG4gICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gIk5vdEltcGxlbWVudGVkIlxuICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciBvZlxuICAgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHJldHVybmVkIGZvciBhXG4gICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsXG4gICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLFxuICAgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiAiaWYiIHN0YXRlbWVudCksIFB5dGhvbiB3aWxsIGNhbGwgImJvb2woKSJcbiAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yIGZhbHNlLlxuXG4gICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCBpbnZlcnRzIHRoZVxuICAgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLiAgVGhlcmUgYXJlIG5vIG90aGVyIGltcGxpZWRcbiAgIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgZXhhbXBsZSwgdGhlXG4gICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyBhdXRvbWF0aWNhbGx5XG4gICBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCBvcGVyYXRpb24sIHNlZVxuICAgImZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpIi5cblxuICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvblxuICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tIGNvbXBhcmlzb25cbiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuXG4gICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICh0byBiZSB1c2VkXG4gICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0XG4gICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVyXCdzIHJlZmxlY3Rpb24sXG4gICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uIElmIHRoZVxuICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhXG4gICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZFwncyB0eXBlLCB0aGVcbiAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCBvdGhlcndpc2UgdGhlXG4gICBsZWZ0IG9wZXJhbmRcJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgaXMgbm90XG4gICBjb25zaWRlcmVkLlxuXG5vYmplY3QuX19oYXNoX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyBvbiBtZW1iZXJzXG4gICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICJkaWN0Ii5cbiAgICJfX2hhc2hfXygpIiBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seSByZXF1aXJlZCBwcm9wZXJ0eVxuICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlOyBpdCBpc1xuICAgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZyBleGNsdXNpdmUgb3IpIHRoZSBoYXNoXG4gICB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdCBhbHNvIHBsYXkgYSBwYXJ0IGluXG4gICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIE5vdGU6ICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBvYmplY3RcJ3NcbiAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAiUHlfc3NpemVfdCIuICBUaGlzXG4gICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gMzItYml0XG4gICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiBhbGxcbiAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAicHl0aG9uIC1jXG4gICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgbm90XG4gICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAiX19lcV9fKCkiXG4gICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgaXRlbXMgaW5cbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmRcbiAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50XG4gICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSBjb2xsZWN0aW9uc1xuICAgcmVxdWlyZXMgdGhhdCBhIGtleVwncyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiIG1ldGhvZHMgYnlcbiAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgdmFsdWUgc3VjaFxuICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gaGFzaCh5KSIuXG5cbiAgIEEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBhbmQgZG9lcyBub3QgZGVmaW5lICJfX2hhc2hfXygpIlxuICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgV2hlbiB0aGVcbiAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3NcbiAgIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgIlR5cGVFcnJvciIgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG9cbiAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gdGhlXG4gICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlIGludGVycHJldGVyXG4gICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID1cbiAgIDxQYXJlbnRDbGFzcz4uX19oYXNoX18iLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gc3VwcHJlc3NcbiAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlIGNsYXNzXG4gICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgdGhhdFxuICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgY2FsbC5cblxuICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyBhbmRcbiAgICAgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS5cbiAgICAgQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uXG4gICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkIGludm9jYXRpb25zIG9mXG4gICAgIFB5dGhvbi5UaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLVxuICAgICBvZi1zZXJ2aWNlIGNhdXNlZCBieSBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0IGV4cGxvaXQgdGhlXG4gICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpIGNvbXBsZXhpdHkuXG4gICAgIFNlZSBodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yXG4gICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mXG4gICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSBndWFyYW50ZWVzXG4gICAgIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdCB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gMzItYml0IGFuZFxuICAgICA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbyAiUFlUSE9OSEFTSFNFRUQiLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuXG5vYmplY3QuX19ib29sX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90XG4gICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzXG4gICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuXG5cbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAieC5uYW1lIikgZm9yXG5jbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIikuICAibmFtZSIgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLiBUaGlzXG4gICBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnlcbiAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzIGRvbmUgYm90aCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmVcbiAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgYXRcbiAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCBjb250cm9sIGJ5IG5vdFxuICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IChidXRcbiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICJfX2dldGF0dHJfXygpIixcbiAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAiX19nZXRhdHRyaWJ1dGVfXygpIiBlaXRoZXJcbiAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgbWV0aG9kXG4gICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpblxuICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3NcbiAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3JcbiAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG5cbiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbFxuICAgICBtZXRob2RzIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgbGFuZ3VhZ2Ugc3ludGF4XG4gICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlICpTcGVjaWFsIG1ldGhvZCBsb29rdXAqLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuXG5cbm9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsIG9iai5uYW1lIiBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxub2JqZWN0Ll9fZGlyX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQSBzZXF1ZW5jZSBtdXN0IGJlXG4gICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgdG8gYSBsaXN0IGFuZFxuICAgc29ydHMgaXQuXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgIl9fZGljdF9fIi5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yICJOb25lIiB3aGVuXG4gICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGRcbiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIlxuICAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5UaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgbW9kdWxlIGFzXG5zcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyB0aGlzXG5hcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgY2xhc3NcbmF0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSBvZiB0aGVcbmdpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSBmaXJzdFxucG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzIGF0dHJpYnV0ZSBmb3JcbnVuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmRcbiJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LCBpdFxuaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiYS54IiBoYXMgYVxubG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bXCd4XCddIiwgdGhlblxuInR5cGUoYSkuX19kaWN0X19bXCd4XCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG4idHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuXG5Ib3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgdGhlXG5kZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmRcbmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZVxucHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlIGRlZmluZWQgYW5kXG5ob3cgdGhleSB3ZXJlIGNhbGxlZC5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCAiYS54Ii4gSG93XG50aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOlxuICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAic3VwZXIoQixcbiAgIG9iaikubSgpIiBzZWFyY2hlcyAib2JqLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgdGhlIGJhc2UgY2xhc3MgIkEiXG4gICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgIkIiIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGVcbiAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXykiLlxuXG5Gb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzXG5vbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbmFueSBjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICJfX2RlbGV0ZV9fKCkiLiAgSWYgaXRcbmRvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsIHJldHVyblxudGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0XCdzXG5pbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiBhbmQvb3JcbiJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyBuZWl0aGVyLCBpdCBpc1xuYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lIGJvdGhcbiJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZVxuIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX3NldF9fKCkiIGFuZCAiX19nZXRfXygpIlxuZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluXG5jb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICJjbGFzc21ldGhvZCgpIikgYXJlXG5pbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuLS0tLS0tLS0tXG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGVcbnN0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2VcbnZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2Vcbm51bWJlcnMgb2YgaW5zdGFuY2VzLlxuXG5UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIGNsYXNzXG5kZWZpbml0aW9uLiBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZiBpbnN0YW5jZVxudmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvIGhvbGQgYVxudmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXMgbm90XG5jcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5vYmplY3QuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICpfX3Nsb3RzX18qXG4gICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlXG4gICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmQgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaFxuICAgaW5zdGFuY2UuXG5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcbn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG5cbiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKlxuICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyBhICpfX3Nsb3RzX18qXG4gIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuXG4qIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ld1xuICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvXG4gIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAiQXR0cmlidXRlRXJyb3IiLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXNcbiAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0c1xuICBpbnN0YW5jZXMuIElmIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZFxuICAiXCdfX3dlYWtyZWZfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZVxuICBpbnN0YW5jZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlXG4gIChleGNlcHQgYnkgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS5cbiAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAiYnl0ZXMiIGFuZCAidHVwbGUiLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3NcbiAgbWF5IGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuXG5cbkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlIGNsYXNzIGJvZHkgaXNcbmV4ZWN1dGVkIGluIGEgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgbG9jYWxseSB0byB0aGVcbnJlc3VsdCBvZiAidHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKSIuXG5cblRoZSBjbGFzcyBjcmVhdGlvbiBwcm9jZXNzIGNhbiBiZSBjdXN0b21pc2VkIGJ5IHBhc3NpbmcgdGhlXG4ibWV0YWNsYXNzIiBrZXl3b3JkIGFyZ3VtZW50IGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGxpbmUsIG9yIGJ5XG5pbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuIGFyZ3VtZW50LiBJblxudGhlIGZvbGxvd2luZyBleGFtcGxlLCBib3RoICJNeUNsYXNzIiBhbmQgIk15U3ViY2xhc3MiIGFyZSBpbnN0YW5jZXNcbm9mICJNZXRhIjpcblxuICAgY2xhc3MgTWV0YSh0eXBlKTpcbiAgICAgICBwYXNzXG5cbiAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU1ldGEpOlxuICAgICAgIHBhc3NcblxuICAgY2xhc3MgTXlTdWJjbGFzcyhNeUNsYXNzKTpcbiAgICAgICBwYXNzXG5cbkFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb25cbmFyZSBwYXNzZWQgdGhyb3VnaCB0byBhbGwgbWV0YWNsYXNzIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGJlbG93LlxuXG5XaGVuIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBleGVjdXRlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1cjpcblxuKiB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGlzIGRldGVybWluZWRcblxuKiB0aGUgY2xhc3MgbmFtZXNwYWNlIGlzIHByZXBhcmVkXG5cbiogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWRcblxuKiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWRcblxuXG5EZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgZm9yIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBkZXRlcm1pbmVkIGFzXG5mb2xsb3dzOlxuXG4qIGlmIG5vIGJhc2VzIGFuZCBubyBleHBsaWNpdCBtZXRhY2xhc3MgYXJlIGdpdmVuLCB0aGVuICJ0eXBlKCkiIGlzXG4gIHVzZWRcblxuKiBpZiBhbiBleHBsaWNpdCBtZXRhY2xhc3MgaXMgZ2l2ZW4gYW5kIGl0IGlzICpub3QqIGFuIGluc3RhbmNlIG9mXG4gICJ0eXBlKCkiLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkgYXMgdGhlIG1ldGFjbGFzc1xuXG4qIGlmIGFuIGluc3RhbmNlIG9mICJ0eXBlKCkiIGlzIGdpdmVuIGFzIHRoZSBleHBsaWNpdCBtZXRhY2xhc3MsIG9yXG4gIGJhc2VzIGFyZSBkZWZpbmVkLCB0aGVuIHRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHVzZWRcblxuVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgZXhwbGljaXRseSBzcGVjaWZpZWRcbm1ldGFjbGFzcyAoaWYgYW55KSBhbmQgdGhlIG1ldGFjbGFzc2VzIChpLmUuICJ0eXBlKGNscykiKSBvZiBhbGxcbnNwZWNpZmllZCBiYXNlIGNsYXNzZXMuIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIG9uZSB3aGljaCBpcyBhXG5zdWJ0eXBlIG9mICphbGwqIG9mIHRoZXNlIGNhbmRpZGF0ZSBtZXRhY2xhc3Nlcy4gSWYgbm9uZSBvZiB0aGVcbmNhbmRpZGF0ZSBtZXRhY2xhc3NlcyBtZWV0cyB0aGF0IGNyaXRlcmlvbiwgdGhlbiB0aGUgY2xhc3MgZGVmaW5pdGlvblxud2lsbCBmYWlsIHdpdGggIlR5cGVFcnJvciIuXG5cblxuUHJlcGFyaW5nIHRoZSBjbGFzcyBuYW1lc3BhY2Vcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk9uY2UgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBoYXMgYmVlbiBpZGVudGlmaWVkLCB0aGVuIHRoZSBjbGFzc1xubmFtZXNwYWNlIGlzIHByZXBhcmVkLiBJZiB0aGUgbWV0YWNsYXNzIGhhcyBhICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLFxuaXQgaXMgY2FsbGVkIGFzICJuYW1lc3BhY2UgPSBtZXRhY2xhc3MuX19wcmVwYXJlX18obmFtZSwgYmFzZXMsXG4qKmt3ZHMpIiAod2hlcmUgdGhlIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgY29tZSBmcm9tXG50aGUgY2xhc3MgZGVmaW5pdGlvbikuXG5cbklmIHRoZSBtZXRhY2xhc3MgaGFzIG5vICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLCB0aGVuIHRoZSBjbGFzc1xubmFtZXNwYWNlIGlzIGluaXRpYWxpc2VkIGFzIGFuIGVtcHR5ICJkaWN0KCkiIGluc3RhbmNlLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMwMDBcblxuICAgICBJbnRyb2R1Y2VkIHRoZSAiX19wcmVwYXJlX18iIG5hbWVzcGFjZSBob29rXG5cblxuRXhlY3V0aW5nIHRoZSBjbGFzcyBib2R5XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQgKGFwcHJveGltYXRlbHkpIGFzICJleGVjKGJvZHksIGdsb2JhbHMoKSxcbm5hbWVzcGFjZSkiLiBUaGUga2V5IGRpZmZlcmVuY2UgZnJvbSBhIG5vcm1hbCBjYWxsIHRvICJleGVjKCkiIGlzIHRoYXRcbmxleGljYWwgc2NvcGluZyBhbGxvd3MgdGhlIGNsYXNzIGJvZHkgKGluY2x1ZGluZyBhbnkgbWV0aG9kcykgdG9cbnJlZmVyZW5jZSBuYW1lcyBmcm9tIHRoZSBjdXJyZW50IGFuZCBvdXRlciBzY29wZXMgd2hlbiB0aGUgY2xhc3NcbmRlZmluaXRpb24gb2NjdXJzIGluc2lkZSBhIGZ1bmN0aW9uLlxuXG5Ib3dldmVyLCBldmVuIHdoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gb2NjdXJzIGluc2lkZSB0aGUgZnVuY3Rpb24sXG5tZXRob2RzIGRlZmluZWQgaW5zaWRlIHRoZSBjbGFzcyBzdGlsbCBjYW5ub3Qgc2VlIG5hbWVzIGRlZmluZWQgYXQgdGhlXG5jbGFzcyBzY29wZS4gQ2xhc3MgdmFyaWFibGVzIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgZmlyc3RcbnBhcmFtZXRlciBvZiBpbnN0YW5jZSBvciBjbGFzcyBtZXRob2RzLCBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IGFsbFxuZnJvbSBzdGF0aWMgbWV0aG9kcy5cblxuXG5DcmVhdGluZyB0aGUgY2xhc3Mgb2JqZWN0XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk9uY2UgdGhlIGNsYXNzIG5hbWVzcGFjZSBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgZXhlY3V0aW5nIHRoZSBjbGFzc1xuYm9keSwgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgIm1ldGFjbGFzcyhuYW1lLCBiYXNlcyxcbm5hbWVzcGFjZSwgKiprd2RzKSIgKHRoZSBhZGRpdGlvbmFsIGtleXdvcmRzIHBhc3NlZCBoZXJlIGFyZSB0aGUgc2FtZVxuYXMgdGhvc2UgcGFzc2VkIHRvICJfX3ByZXBhcmVfXyIpLlxuXG5UaGlzIGNsYXNzIG9iamVjdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSB6ZXJvLVxuYXJndW1lbnQgZm9ybSBvZiAic3VwZXIoKSIuICJfX2NsYXNzX18iIGlzIGFuIGltcGxpY2l0IGNsb3N1cmVcbnJlZmVyZW5jZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBpZiBhbnkgbWV0aG9kcyBpbiBhIGNsYXNzIGJvZHkgcmVmZXJcbnRvIGVpdGhlciAiX19jbGFzc19fIiBvciAic3VwZXIiLiBUaGlzIGFsbG93cyB0aGUgemVybyBhcmd1bWVudCBmb3JtXG5vZiAic3VwZXIoKSIgdG8gY29ycmVjdGx5IGlkZW50aWZ5IHRoZSBjbGFzcyBiZWluZyBkZWZpbmVkIGJhc2VkIG9uXG5sZXhpY2FsIHNjb3BpbmcsIHdoaWxlIHRoZSBjbGFzcyBvciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIHRvIG1ha2UgdGhlXG5jdXJyZW50IGNhbGwgaXMgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoZVxubWV0aG9kLlxuXG5BZnRlciB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgY2xhc3NcbmRlY29yYXRvcnMgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIHRoZSBkZWZpbmVkIGNsYXNzLlxuXG5XaGVuIGEgbmV3IGNsYXNzIGlzIGNyZWF0ZWQgYnkgInR5cGUuX19uZXdfXyIsIHRoZSBvYmplY3QgcHJvdmlkZWQgYXNcbnRoZSBuYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIHN0YW5kYXJkIFB5dGhvbiBkaWN0aW9uYXJ5IGFuZFxudGhlIG9yaWdpbmFsIG9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBiZWNvbWVzIHRoZSAiX19kaWN0X18iXG5hdHRyaWJ1dGUgb2YgdGhlIGNsYXNzIG9iamVjdC5cblxuU2VlIGFsc286ICoqUEVQIDMxMzUqKiAtIE5ldyBzdXBlclxuXG4gICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2VcblxuXG5NZXRhY2xhc3MgZXhhbXBsZVxuLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZVxuYmVlbiBleHBsb3JlZCBpbmNsdWRlIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgYXV0b21hdGljXG5kZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsIGZyYW1ld29ya3MsIGFuZFxuYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLlxuXG5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRhY2xhc3MgdGhhdCB1c2VzIGFuXG4iY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiIHRvIHJlbWVtYmVyIHRoZSBvcmRlciB0aGF0IGNsYXNzIHZhcmlhYmxlc1xuYXJlIGRlZmluZWQ6XG5cbiAgIGNsYXNzIE9yZGVyZWRDbGFzcyh0eXBlKTpcblxuICAgICAgIEBjbGFzc21ldGhvZFxuICAgICAgIGRlZiBfX3ByZXBhcmVfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgKiprd2RzKTpcbiAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KClcblxuICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2RzKTpcbiAgICAgICAgICAgcmVzdWx0ID0gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3QobmFtZXNwYWNlKSlcbiAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMgPSB0dXBsZShuYW1lc3BhY2UpXG4gICAgICAgICAgIHJldHVybiByZXN1bHRcblxuICAgY2xhc3MgQShtZXRhY2xhc3M9T3JkZXJlZENsYXNzKTpcbiAgICAgICBkZWYgb25lKHNlbGYpOiBwYXNzXG4gICAgICAgZGVmIHR3byhzZWxmKTogcGFzc1xuICAgICAgIGRlZiB0aHJlZShzZWxmKTogcGFzc1xuICAgICAgIGRlZiBmb3VyKHNlbGYpOiBwYXNzXG5cbiAgID4+PiBBLm1lbWJlcnNcbiAgIChcJ19fbW9kdWxlX19cJywgXCdvbmVcJywgXCd0d29cJywgXCd0aHJlZVwnLCBcJ2ZvdXJcJylcblxuV2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBmb3IgKkEqIGdldHMgZXhlY3V0ZWQsIHRoZSBwcm9jZXNzIGJlZ2luc1xud2l0aCBjYWxsaW5nIHRoZSBtZXRhY2xhc3NcJ3MgIl9fcHJlcGFyZV9fKCkiIG1ldGhvZCB3aGljaCByZXR1cm5zIGFuXG5lbXB0eSAiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLiAgVGhhdCBtYXBwaW5nIHJlY29yZHMgdGhlIG1ldGhvZHMgYW5kXG5hdHRyaWJ1dGVzIG9mICpBKiBhcyB0aGV5IGFyZSBkZWZpbmVkIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgY2xhc3NcbnN0YXRlbWVudC4gT25jZSB0aG9zZSBkZWZpbml0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBvcmRlcmVkIGRpY3Rpb25hcnlcbmlzIGZ1bGx5IHBvcHVsYXRlZCBhbmQgdGhlIG1ldGFjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgZ2V0c1xuaW52b2tlZC4gIFRoYXQgbWV0aG9kIGJ1aWxkcyB0aGUgbmV3IHR5cGUgYW5kIGl0IHNhdmVzIHRoZSBvcmRlcmVkXG5kaWN0aW9uYXJ5IGtleXMgaW4gYW4gYXR0cmlidXRlIGNhbGxlZCAibWVtYmVycyIuXG5cblxuQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlXG4iaXNpbnN0YW5jZSgpIiBhbmQgImlzc3ViY2xhc3MoKSIgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5JbiBwYXJ0aWN1bGFyLCB0aGUgbWV0YWNsYXNzICJhYmMuQUJDTWV0YSIgaW1wbGVtZW50cyB0aGVzZSBtZXRob2RzIGluXG5vcmRlciB0byBhbGxvdyB0aGUgYWRkaXRpb24gb2YgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBhc1xuInZpcnR1YWwgYmFzZSBjbGFzc2VzIiB0byBhbnkgY2xhc3Mgb3IgdHlwZSAoaW5jbHVkaW5nIGJ1aWx0LWluXG50eXBlcyksIGluY2x1ZGluZyBvdGhlciBBQkNzLlxuXG5jbGFzcy5fX2luc3RhbmNlY2hlY2tfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgUmV0dXJuIHRydWUgaWYgKmluc3RhbmNlKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3JcbiAgIGluZGlyZWN0KSBpbnN0YW5jZSBvZiAqY2xhc3MqLiBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICAiaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpIi5cblxuY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpXG5cbiAgIFJldHVybiB0cnVlIGlmICpzdWJjbGFzcyogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgICJpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcykiLlxuXG5Ob3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgbG9va2VkIHVwIG9uIHRoZSB0eXBlIChtZXRhY2xhc3MpIG9mIGFcbmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuXG5UaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWRcbm9uIGluc3RhbmNlcywgb25seSBpbiB0aGlzIGNhc2UgdGhlIGluc3RhbmNlIGlzIGl0c2VsZiBhIGNsYXNzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG5cbiAgICAgSW5jbHVkZXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIGN1c3RvbWl6aW5nICJpc2luc3RhbmNlKCkiIGFuZFxuICAgICAiaXNzdWJjbGFzcygpIiBiZWhhdmlvciB0aHJvdWdoICJfX2luc3RhbmNlY2hlY2tfXygpIiBhbmRcbiAgICAgIl9fc3ViY2xhc3NjaGVja19fKCkiLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpblxuICAgICB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlICJhYmMiXG4gICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLlxuXG5cbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG5cblxuRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLlxuQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSBvciBtYXBwaW5nc1xuKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLiAgVGhlXG5maXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG9cbmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGVcbmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSBrIDwgTiIgd2hlcmVcbipOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggZGVmaW5lIGFcbnJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGUgdGhlXG5tZXRob2RzICJrZXlzKCkiLCAidmFsdWVzKCkiLCAiaXRlbXMoKSIsICJnZXQoKSIsICJjbGVhcigpIixcbiJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAidXBkYXRlKCkiXG5iZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLlxuVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiBhYnN0cmFjdCBiYXNlXG5jbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAiX19nZXRpdGVtX18oKSIsXG4iX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlIHNlcXVlbmNlc1xuc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgImV4dGVuZCgpIixcbiJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgbGlrZSBQeXRob25cbnN0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnRcbmFkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZ1xucmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICJfX3JhZGRfXygpIixcbiJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiIGRlc2NyaWJlZFxuYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4iX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iIG9wZXJhdG9yO1xuZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yIHNlcXVlbmNlcywgaXRcbnNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGhcbm1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvIGFsbG93XG5lZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAiX19pdGVyX18oKSJcbnNob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGVcbnRocm91Z2ggdGhlIHZhbHVlcy5cblxub2JqZWN0Ll9fbGVuX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdFxuICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kXG4gICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkIHJldHVybiBhblxuICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuXG4gICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhpc1xuICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkIGZvclxuICAgY29ycmVjdG5lc3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLlxuICBBIGNhbGwgbGlrZVxuXG4gICAgIGFbMToyXSA9IGJcblxuICBpcyB0cmFuc2xhdGVkIHRvXG5cbiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG5cbiAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiB3aXRoICJOb25lIi5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3Igc2VxdWVuY2UgdHlwZXMsXG4gICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICBOb3RlIHRoYXRcbiAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSBjbGFzcyB3aXNoZXNcbiAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4gSWZcbiAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlIHJhaXNlZDsgaWYgb2ZcbiAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55XG4gICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiBzaG91bGQgYmVcbiAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGVcbiAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iIGZvciBkaWN0XG4gICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSJcbiAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAoIl9fbGVuX18oKSJcbiAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sXG4gICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhblxuICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnlcbiAgICJyZXZlcnNlZCgpIi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlIG1lbWJlcnNoaXAgdGVzdFxuICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZVxuICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSAqdGhpcyBzZWN0aW9uIGluIHRoZVxuICAgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cblxuXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuXG5cbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG9cbmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlclxuaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dFxuZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseVxuaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gKlRoZSB3aXRoXG5zdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgIndpdGgiXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS5cblxub2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcblxuICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzXG4gICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlXG4gICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbFxuICAgYmUgIk5vbmUiLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cFxuPT09PT09PT09PT09PT09PT09PT09XG5cbkZvciBjdXN0b20gY2xhc3NlcywgaW1wbGljaXQgaW52b2NhdGlvbnMgb2Ygc3BlY2lhbCBtZXRob2RzIGFyZSBvbmx5XG5ndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN0XCdzIHR5cGUsIG5vdCBpblxudGhlIG9iamVjdFwncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgVGhhdCBiZWhhdmlvdXIgaXMgdGhlIHJlYXNvbiB3aHlcbnRoZSBmb2xsb3dpbmcgY29kZSByYWlzZXMgYW4gZXhjZXB0aW9uOlxuXG4gICA+Pj4gY2xhc3MgQzpcbiAgIC4uLiAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGxlbihjKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBvYmplY3Qgb2YgdHlwZSBcJ0NcJyBoYXMgbm8gbGVuKClcblxuVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWxcbm1ldGhvZHMgc3VjaCBhcyAiX19oYXNoX18oKSIgYW5kICJfX3JlcHJfXygpIiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBieVxuYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgb2YgdGhlc2Vcbm1ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkIGZhaWwgd2hlblxuaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuXG4gICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgXCdfX2hhc2hfX1wnIG9mIFwnaW50XCcgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XG5cbkluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIHVuYm91bmQgbWV0aG9kIG9mIGEgY2xhc3MgaW4gdGhpc1xud2F5IGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBcJ21ldGFjbGFzcyBjb25mdXNpb25cJywgYW5kIGlzIGF2b2lkZWRcbmJ5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcblxuICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuICAgVHJ1ZVxuXG5JbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlIGludGVyZXN0IG9mXG5jb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvIGJ5cGFzc2VzXG50aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyBtZXRhY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4gICAuLi4gICAgICAgICBwcmludCgiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbiAgIC4uLiAgICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjbGFzcyBDKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOlxuICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTpcbiAgIC4uLiAgICAgICAgIHJldHVybiAxMFxuICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4gICAuLi4gICAgICAgICBwcmludCgiQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgaW5zdGFuY2VcbiAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgdHlwZVxuICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuICAgMTBcblxuQnlwYXNzaW5nIHRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uIHByb3ZpZGVzXG5zaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlIGludGVycHJldGVyLCBhdFxudGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2Ygc3BlY2lhbCBtZXRob2RzICh0aGVcbnNwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYgaW4gb3JkZXIgdG8gYmVcbmNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG4nLAotICdzdHJpbmctbWV0aG9kcyc6IHUnXG5TdHJpbmcgTWV0aG9kc1xuKioqKioqKioqKioqKipcblxuU3RyaW5ncyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zLCBhbG9uZyB3aXRoXG50aGUgYWRkaXRpb25hbCBtZXRob2RzIGRlc2NyaWJlZCBiZWxvdy5cblxuU3RyaW5ncyBhbHNvIHN1cHBvcnQgdHdvIHN0eWxlcyBvZiBzdHJpbmcgZm9ybWF0dGluZywgb25lIHByb3ZpZGluZyBhXG5sYXJnZSBkZWdyZWUgb2YgZmxleGliaWxpdHkgYW5kIGN1c3RvbWl6YXRpb24gKHNlZSAic3RyLmZvcm1hdCgpIixcbipGb3JtYXQgU3RyaW5nIFN5bnRheCogYW5kICpDdXN0b20gU3RyaW5nIEZvcm1hdHRpbmcqKSBhbmQgdGhlIG90aGVyXG5iYXNlZCBvbiBDICJwcmludGYiIHN0eWxlIGZvcm1hdHRpbmcgdGhhdCBoYW5kbGVzIGEgbmFycm93ZXIgcmFuZ2Ugb2ZcbnR5cGVzIGFuZCBpcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuIGZhc3RlciBmb3JcbnRoZSBjYXNlcyBpdCBjYW4gaGFuZGxlICgqcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKikuXG5cblRoZSAqVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzKiBzZWN0aW9uIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGNvdmVyc1xuYSBudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgdmFyaW91cyB0ZXh0IHJlbGF0ZWQgdXRpbGl0aWVzXG4oaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiIG1vZHVsZSkuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbnN0ci5jYXNlZm9sZCgpXG5cbiAgIFJldHVybiBhIGNhc2Vmb2xkZWQgY29weSBvZiB0aGUgc3RyaW5nLiBDYXNlZm9sZGVkIHN0cmluZ3MgbWF5IGJlXG4gICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy5cblxuICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSBhZ2dyZXNzaXZlIGJlY2F1c2VcbiAgIGl0IGlzIGludGVuZGVkIHRvIHJlbW92ZSBhbGwgY2FzZSBkaXN0aW5jdGlvbnMgaW4gYSBzdHJpbmcuIEZvclxuICAgZXhhbXBsZSwgdGhlIEdlcm1hbiBsb3dlcmNhc2UgbGV0dGVyICJcJ1x4ZGZcJyIgaXMgZXF1aXZhbGVudCB0byAiInNzIiIuXG4gICBTaW5jZSBpdCBpcyBhbHJlYWR5IGxvd2VyY2FzZSwgImxvd2VyKCkiIHdvdWxkIGRvIG5vdGhpbmcgdG8gIlwnXHhkZlwnIjtcbiAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuXG5cbiAgIFRoZSBjYXNlZm9sZGluZyBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cblxuc3RyLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nIGlzIGRvbmVcbiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSBzcGFjZSkuIFRoZVxuICAgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAibGVuKHMpIi5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5lbmNvZGUoZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJzdHJpY3QiKVxuXG4gICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgYSBieXRlcyBvYmplY3QuIERlZmF1bHRcbiAgIGVuY29kaW5nIGlzICJcJ3V0Zi04XCciLiAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgZGlmZmVyZW50XG4gICBlcnJvciBoYW5kbGluZyBzY2hlbWUuIFRoZSBkZWZhdWx0IGZvciAqZXJyb3JzKiBpcyAiXCdzdHJpY3RcJyIsXG4gICBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEgIlVuaWNvZGVFcnJvciIuIE90aGVyIHBvc3NpYmxlXG4gICB2YWx1ZXMgYXJlICJcJ2lnbm9yZVwnIiwgIlwncmVwbGFjZVwnIiwgIlwneG1sY2hhcnJlZnJlcGxhY2VcJyIsXG4gICAiXCdiYWNrc2xhc2hyZXBsYWNlXCciIGFuZCBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYVxuICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIiwgc2VlIHNlY3Rpb24gKkVycm9yIEhhbmRsZXJzKi4gRm9yIGEgbGlzdFxuICAgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWUgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gIlRydWUiIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgKnN1ZmZpeCosXG4gICBvdGhlcndpc2UgcmV0dXJuICJGYWxzZSIuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN1ZmZpeGVzXG4gICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXG5zdHIuZXhwYW5kdGFicyh0YWJzaXplPTgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkXG4gICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gYW5kIHRoZVxuICAgZ2l2ZW4gdGFiIHNpemUuICBUYWIgcG9zaXRpb25zIG9jY3VyIGV2ZXJ5ICp0YWJzaXplKiBjaGFyYWN0ZXJzXG4gICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2IGFuZCBzbyBvbikuXG4gICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvIGFuZCB0aGVcbiAgIHN0cmluZyBpcyBleGFtaW5lZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICB0YWIgKCJcXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIHJlc3VsdFxuICAgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4gKFRoZVxuICAgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgbmV3bGluZVxuICAgKCJcXG4iKSBvciByZXR1cm4gKCJcXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXNcbiAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgYW5kIHRoZVxuICAgY3VycmVudCBjb2x1bW4gaXMgaW5jcmVtZW50ZWQgYnkgb25lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZVxuICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC5cblxuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKClcbiAgIFwnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzRcJ1xuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKDQpXG4gICBcJzAxICAwMTIgMDEyMyAgICAwMTIzNFwnXG5cbnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCB3aXRoaW4gdGhlIHNsaWNlICJzW3N0YXJ0OmVuZF0iLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCpcbiAgIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uICBSZXR1cm4gIi0xIiBpZlxuICAgKnN1YiogaXMgbm90IGZvdW5kLlxuXG4gICBOb3RlOiBUaGUgImZpbmQoKSIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vd1xuICAgICB0aGUgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhIHN1YnN0cmluZyBvciBub3QsXG4gICAgIHVzZSB0aGUgImluIiBvcGVyYXRvcjpcblxuICAgICAgICA+Pj4gXCdQeVwnIGluIFwnUHl0aG9uXCdcbiAgICAgICAgVHJ1ZVxuXG5zdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcblxuICAgUGVyZm9ybSBhIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpc1xuICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzXG4gICBkZWxpbWl0ZWQgYnkgYnJhY2VzICJ7fSIuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlclxuICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhXG4gICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoXG4gICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlXG4gICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LlxuXG4gICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuICAgXCdUaGUgc3VtIG9mIDEgKyAyIGlzIDNcJ1xuXG4gICBTZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91c1xuICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy5cblxuc3RyLmZvcm1hdF9tYXAobWFwcGluZylcblxuICAgU2ltaWxhciB0byAic3RyLmZvcm1hdCgqKm1hcHBpbmcpIiwgZXhjZXB0IHRoYXQgIm1hcHBpbmciIGlzIHVzZWRcbiAgIGRpcmVjdGx5IGFuZCBub3QgY29waWVkIHRvIGEgImRpY3QiLiAgVGhpcyBpcyB1c2VmdWwgaWYgZm9yIGV4YW1wbGVcbiAgICJtYXBwaW5nIiBpcyBhIGRpY3Qgc3ViY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOlxuICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBrZXlcbiAgIC4uLlxuICAgPj4+IFwne25hbWV9IHdhcyBib3JuIGluIHtjb3VudHJ5fVwnLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPVwnR3VpZG9cJykpXG4gICBcJ0d1aWRvIHdhcyBib3JuIGluIGNvdW50cnlcJ1xuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlICJmaW5kKCkiLCBidXQgcmFpc2UgIlZhbHVlRXJyb3IiIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3RcbiAgIGZvdW5kLlxuXG5zdHIuaXNhbG51bSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhbnVtZXJpYyBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIEEgY2hhcmFjdGVyICJjIlxuICAgaXMgYWxwaGFudW1lcmljIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJldHVybnMgIlRydWUiOlxuICAgImMuaXNhbHBoYSgpIiwgImMuaXNkZWNpbWFsKCkiLCAiYy5pc2RpZ2l0KCkiLCBvciAiYy5pc251bWVyaWMoKSIuXG5cbnN0ci5pc2FscGhhKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFiZXRpYyBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIEFscGhhYmV0aWNcbiAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcbiAgIGRhdGFiYXNlIGFzICJMZXR0ZXIiLCBpLmUuLCB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHlcbiAgIGJlaW5nIG9uZSBvZiAiTG0iLCAiTHQiLCAiTHUiLCAiTGwiLCBvciAiTG8iLiAgTm90ZSB0aGF0IHRoaXMgaXNcbiAgIGRpZmZlcmVudCBmcm9tIHRoZSAiQWxwaGFiZXRpYyIgcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgVW5pY29kZVxuICAgU3RhbmRhcmQuXG5cbnN0ci5pc2RlY2ltYWwoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkZWNpbWFsIGNoYXJhY3RlcnNcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuIERlY2ltYWxcbiAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGZyb20gZ2VuZXJhbCBjYXRlZ29yeSAiTmQiLiBUaGlzIGNhdGVnb3J5XG4gICBpbmNsdWRlcyBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0b1xuICAgZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsIGUuZy4gVSswNjYwLCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTy5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBEaWdpdHMgaW5jbHVkZSBkZWNpbWFsXG4gICBjaGFyYWN0ZXJzIGFuZCBkaWdpdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcsIHN1Y2ggYXMgdGhlXG4gICBjb21wYXRpYmlsaXR5IHN1cGVyc2NyaXB0IGRpZ2l0cy4gIEZvcm1hbGx5LCBhIGRpZ2l0IGlzIGEgY2hhcmFjdGVyXG4gICB0aGF0IGhhcyB0aGUgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0IG9yXG4gICBOdW1lcmljX1R5cGU9RGVjaW1hbC5cblxuc3RyLmlzaWRlbnRpZmllcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBpZGVudGlmaWVyIGFjY29yZGluZyB0byB0aGVcbiAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyouXG5cbiAgIFVzZSAia2V5d29yZC5pc2tleXdvcmQoKSIgdG8gdGVzdCBmb3IgcmVzZXJ2ZWQgaWRlbnRpZmllcnMgc3VjaCBhc1xuICAgImRlZiIgYW5kICJjbGFzcyIuXG5cbnN0ci5pc2xvd2VyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmlzbnVtZXJpYygpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgY2hhcmFjdGVycyxcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuIE51bWVyaWNcbiAgIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlXG4gICB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LCBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OXG4gICBPTkUgRklGVEguICBGb3JtYWxseSwgbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIHRoZVxuICAgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0LCBOdW1lcmljX1R5cGU9RGVjaW1hbCBvclxuICAgTnVtZXJpY19UeXBlPU51bWVyaWMuXG5cbnN0ci5pc3ByaW50YWJsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHByaW50YWJsZSBvciB0aGVcbiAgIHN0cmluZyBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLiAgTm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlXG4gICB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIGFzXG4gICAiT3RoZXIiIG9yICJTZXBhcmF0b3IiLCBleGNlcHRpbmcgdGhlIEFTQ0lJIHNwYWNlICgweDIwKSB3aGljaCBpc1xuICAgY29uc2lkZXJlZCBwcmludGFibGUuICAoTm90ZSB0aGF0IHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoaXNcbiAgIGNvbnRleHQgYXJlIHRob3NlIHdoaWNoIHNob3VsZCBub3QgYmUgZXNjYXBlZCB3aGVuICJyZXByKCkiIGlzXG4gICBpbnZva2VkIG9uIGEgc3RyaW5nLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGhhbmRsaW5nIG9mIHN0cmluZ3NcbiAgIHdyaXR0ZW4gdG8gInN5cy5zdGRvdXQiIG9yICJzeXMuc3RkZXJyIi4pXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBXaGl0ZXNwYWNlXG4gICBjaGFyYWN0ZXJzICBhcmUgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuICAgZGF0YWJhc2UgYXMgIk90aGVyIiBvciAiU2VwYXJhdG9yIiBhbmQgdGhvc2Ugd2l0aCBiaWRpcmVjdGlvbmFsXG4gICBwcm9wZXJ0eSBiZWluZyBvbmUgb2YgIldTIiwgIkIiLCBvciAiUyIuXG5cbnN0ci5pc3RpdGxlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdFxuICAgbGVhc3Qgb25lIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcbiAgIGZvbGxvdyB1bmNhc2VkIGNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy5cbiAgIFJldHVybiBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5pc3VwcGVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmpvaW4oaXRlcmFibGUpXG5cbiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGVcbiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIEEgIlR5cGVFcnJvciIgd2lsbCBiZSByYWlzZWQgaWYgdGhlcmUgYXJlXG4gICBhbnkgbm9uLXN0cmluZyB2YWx1ZXMgaW4gKml0ZXJhYmxlKiwgaW5jbHVkaW5nICJieXRlcyIgb2JqZWN0cy5cbiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC5cblxuc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUlcbiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvclxuICAgZXF1YWwgdG8gImxlbihzKSIuXG5cbnN0ci5sb3dlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuXG5cbiAgIFRoZSBsb3dlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZVxuICAgVW5pY29kZSBTdGFuZGFyZC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5sc3RyaXAoKVxuICAgICAgXCdzcGFjaW91cyAgIFwnXG4gICAgICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5sc3RyaXAoXCdjbW93ei5cJylcbiAgICAgIFwnZXhhbXBsZS5jb21cJ1xuXG5zdGF0aWMgc3RyLm1ha2V0cmFucyh4WywgeVssIHpdXSlcblxuICAgVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSB0cmFuc2xhdGlvbiB0YWJsZSB1c2FibGUgZm9yXG4gICAic3RyLnRyYW5zbGF0ZSgpIi5cblxuICAgSWYgdGhlcmUgaXMgb25seSBvbmUgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmdcbiAgIFVuaWNvZGUgb3JkaW5hbHMgKGludGVnZXJzKSBvciBjaGFyYWN0ZXJzIChzdHJpbmdzIG9mIGxlbmd0aCAxKSB0b1xuICAgVW5pY29kZSBvcmRpbmFscywgc3RyaW5ncyAob2YgYXJiaXRyYXJ5IGxlbmd0aHMpIG9yIE5vbmUuXG4gICBDaGFyYWN0ZXIga2V5cyB3aWxsIHRoZW4gYmUgY29udmVydGVkIHRvIG9yZGluYWxzLlxuXG4gICBJZiB0aGVyZSBhcmUgdHdvIGFyZ3VtZW50cywgdGhleSBtdXN0IGJlIHN0cmluZ3Mgb2YgZXF1YWwgbGVuZ3RoLFxuICAgYW5kIGluIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeSwgZWFjaCBjaGFyYWN0ZXIgaW4geCB3aWxsIGJlIG1hcHBlZFxuICAgdG8gdGhlIGNoYXJhY3RlciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB5LiAgSWYgdGhlcmUgaXMgYSB0aGlyZFxuICAgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBzdHJpbmcsIHdob3NlIGNoYXJhY3RlcnMgd2lsbCBiZSBtYXBwZWQgdG9cbiAgIE5vbmUgaW4gdGhlIHJlc3VsdC5cblxuc3RyLnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsIGZvbGxvd2VkIGJ5XG4gICB0d28gZW1wdHkgc3RyaW5ncy5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluICJzW3N0YXJ0OmVuZF0iLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLlxuXG5zdHIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIExpa2UgInJmaW5kKCkiIGJ1dCByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gdGhlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgbm90IGZvdW5kLlxuXG5zdHIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUlcbiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvclxuICAgZXF1YWwgdG8gImxlbihzKSIuXG5cbnN0ci5ycGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBzdHJpbmdzLCBmb2xsb3dlZCBieVxuICAgdGhlIHN0cmluZyBpdHNlbGYuXG5cbnN0ci5yc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHNcbiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3JcbiAgICJOb25lIiwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nIGlzIGEgc2VwYXJhdG9yLiAgRXhjZXB0IGZvciBzcGxpdHRpbmdcbiAgIGZyb20gdGhlIHJpZ2h0LCAicnNwbGl0KCkiIGJlaGF2ZXMgbGlrZSAic3BsaXQoKSIgd2hpY2ggaXNcbiAgIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG5cbnN0ci5yc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlXG4gICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICAgICBcJyAgIHNwYWNpb3VzXCdcbiAgICAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICAgICBcJ21pc3Npc3NcJ1xuXG5zdHIuc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCpcbiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgIm1heHNwbGl0KzEiXG4gICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgIi0xIiwgdGhlbiB0aGVyZSBpc1xuICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgYXJlIG1hZGUpLlxuXG4gICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcbiAgIGFuZCBhcmUgZGVlbWVkIHRvIGRlbGltaXQgZW1wdHkgc3RyaW5ncyAoZm9yIGV4YW1wbGUsXG4gICAiXCcxLCwyXCcuc3BsaXQoXCcsXCcpIiByZXR1cm5zICJbXCcxXCcsIFwnXCcsIFwnMlwnXSIpLiAgVGhlICpzZXAqIGFyZ3VtZW50XG4gICBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSxcbiAgICJcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpIiByZXR1cm5zICJbXCcxXCcsIFwnMlwnLCBcJzNcJ10iKS4gU3BsaXR0aW5nIGFuXG4gICBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyAiW1wnXCddIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJzEsMiwzXCcuc3BsaXQoXCcsXCcpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cbiAgICAgID4+PiBcJzEsMiwzXCcuc3BsaXQoXCcsXCcsIG1heHNwbGl0PTEpXG4gICAgICBbXCcxXCcsIFwnMiwzXCddXG4gICAgICA+Pj4gXCcxLDIsLDMsXCcuc3BsaXQoXCcsXCcpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJ1wnLCBcJzNcJywgXCdcJ11cblxuICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyAiTm9uZSIsIGEgZGlmZmVyZW50IHNwbGl0dGluZ1xuICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWRcbiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3NcbiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZ1xuICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZ1xuICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhICJOb25lIiBzZXBhcmF0b3IgcmV0dXJucyAiW10iLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnMSAyIDNcJy5zcGxpdCgpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cbiAgICAgID4+PiBcJzEgMiAzXCcuc3BsaXQobWF4c3BsaXQ9MSlcbiAgICAgIFtcJzFcJywgXCcyIDNcJ11cbiAgICAgID4+PiBcJyAgIDEgICAyICAgMyAgIFwnLnNwbGl0KClcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuXG5zdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lXG4gICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3RcbiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuXG4gICBUaGlzIG1ldGhvZCBzcGxpdHMgb24gdGhlIGZvbGxvd2luZyBsaW5lIGJvdW5kYXJpZXMuICBJblxuICAgcGFydGljdWxhciwgdGhlIGJvdW5kYXJpZXMgYXJlIGEgc3VwZXJzZXQgb2YgKnVuaXZlcnNhbCBuZXdsaW5lcyouXG5cbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFJlcHJlc2VudGF0aW9uICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlxcbiIgICAgICAgICAgICAgICAgICAgIHwgTGluZSBGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcciIgICAgICAgICAgICAgICAgICAgIHwgQ2FycmlhZ2UgUmV0dXJuICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcclxcbiIgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHYiIG9yICJcXHgwYiIgICAgICAgICAgfCBMaW5lIFRhYnVsYXRpb24gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxmIiBvciAiXFx4MGMiICAgICAgICAgIHwgRm9ybSBGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFjIiAgICAgICAgICAgICAgICAgIHwgRmlsZSBTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFkIiAgICAgICAgICAgICAgICAgIHwgR3JvdXAgU2VwYXJhdG9yICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFlIiAgICAgICAgICAgICAgICAgIHwgUmVjb3JkIFNlcGFyYXRvciAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDg1IiAgICAgICAgICAgICAgICAgIHwgTmV4dCBMaW5lIChDMSBDb250cm9sIENvZGUpICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdTIwMjgiICAgICAgICAgICAgICAgIHwgTGluZSBTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdTIwMjkiICAgICAgICAgICAgICAgIHwgUGFyYWdyYXBoIFNlcGFyYXRvciAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIlxcdiIgYW5kICJcXGYiIGFkZGVkIHRvIGxpc3Qgb2YgbGluZVxuICAgYm91bmRhcmllcy5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcygpXG4gICAgICBbXCdhYiBjXCcsIFwnXCcsIFwnZGUgZmdcJywgXCdrbFwnXVxuICAgICAgPj4+IFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKGtlZXBlbmRzPVRydWUpXG4gICAgICBbXCdhYiBjXFxuXCcsIFwnXFxuXCcsIFwnZGUgZmdcXHJcJywgXCdrbFxcclxcblwnXVxuXG4gICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzXG4gICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbFxuICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZTpcblxuICAgICAgPj4+ICIiLnNwbGl0bGluZXMoKVxuICAgICAgW11cbiAgICAgID4+PiAiT25lIGxpbmVcXG4iLnNwbGl0bGluZXMoKVxuICAgICAgW1wnT25lIGxpbmVcJ11cblxuICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdChcJ1xcblwnKSIgZ2l2ZXM6XG5cbiAgICAgID4+PiBcJ1wnLnNwbGl0KFwnXFxuXCcpXG4gICAgICBbXCdcJ11cbiAgICAgID4+PiBcJ1R3byBsaW5lc1xcblwnLnNwbGl0KFwnXFxuXCcpXG4gICAgICBbXCdUd28gbGluZXNcJywgXCdcJ11cblxuc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuICJUcnVlIiBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCBvdGhlcndpc2UgcmV0dXJuXG4gICAiRmFsc2UiLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2sgZm9yLlxuICAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cbiAgIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXG5zdHIuc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycypcbiAgIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzXG4gICBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmVcbiAgIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnN0cmlwKClcbiAgICAgIFwnc3BhY2lvdXNcJ1xuICAgICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcuc3RyaXAoXCdjbW93ei5cJylcbiAgICAgIFwnZXhhbXBsZVwnXG5cbiAgIFRoZSBvdXRlcm1vc3QgbGVhZGluZyBhbmQgdHJhaWxpbmcgKmNoYXJzKiBhcmd1bWVudCB2YWx1ZXMgYXJlXG4gICBzdHJpcHBlZCBmcm9tIHRoZSBzdHJpbmcuIENoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGVhZGluZ1xuICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyBpbiAqY2hhcnMqLiBBIHNpbWlsYXIgYWN0aW9uIHRha2VzIHBsYWNlIG9uIHRoZVxuICAgdHJhaWxpbmcgZW5kLiBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nID0gXCcjLi4uLi4uLiBTZWN0aW9uIDMuMi4xIElzc3VlICMzMiAuLi4uLi4uXCdcbiAgICAgID4+PiBjb21tZW50X3N0cmluZy5zdHJpcChcJy4jISBcJylcbiAgICAgIFwnU2VjdGlvbiAzLjIuMSBJc3N1ZSAjMzJcJ1xuXG5zdHIuc3dhcGNhc2UoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG9cbiAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4gTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXRcbiAgICJzLnN3YXBjYXNlKCkuc3dhcGNhc2UoKSA9PSBzIi5cblxuc3RyLnRpdGxlKClcblxuICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhblxuICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCdIZWxsbyB3b3JsZFwnLnRpdGxlKClcbiAgICAgIFwnSGVsbG8gV29ybGRcJ1xuXG4gICBUaGUgYWxnb3JpdGhtIHVzZXMgYSBzaW1wbGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBhXG4gICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW5cbiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZFxuICAgcG9zc2Vzc2l2ZXMgZm9ybSB3b3JkIGJvdW5kYXJpZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGRlc2lyZWRcbiAgIHJlc3VsdDpcblxuICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbiAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG5cbiAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHJlZ3VsYXJcbiAgIGV4cHJlc3Npb25zOlxuXG4gICAgICA+Pj4gaW1wb3J0IHJlXG4gICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKTpcbiAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApWzBdLnVwcGVyKCkgK1xuICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgcylcbiAgICAgIC4uLlxuICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4gICAgICAiVGhleVwncmUgQmlsbFwncyBGcmllbmRzLiJcblxuc3RyLnRyYW5zbGF0ZSh0YWJsZSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyBiZWVuIG1hcHBlZFxuICAgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUuICBUaGUgdGFibGUgbXVzdCBiZSBhbiBvYmplY3RcbiAgIHRoYXQgaW1wbGVtZW50cyBpbmRleGluZyB2aWEgIl9fZ2V0aXRlbV9fKCkiLCB0eXBpY2FsbHkgYSAqbWFwcGluZypcbiAgIG9yICpzZXF1ZW5jZSouICBXaGVuIGluZGV4ZWQgYnkgYSBVbmljb2RlIG9yZGluYWwgKGFuIGludGVnZXIpLCB0aGVcbiAgIHRhYmxlIG9iamVjdCBjYW4gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6IHJldHVybiBhIFVuaWNvZGUgb3JkaW5hbFxuICAgb3IgYSBzdHJpbmcsIHRvIG1hcCB0aGUgY2hhcmFjdGVyIHRvIG9uZSBvciBtb3JlIG90aGVyIGNoYXJhY3RlcnM7XG4gICByZXR1cm4gIk5vbmUiLCB0byBkZWxldGUgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSByZXR1cm4gc3RyaW5nOyBvclxuICAgcmFpc2UgYSAiTG9va3VwRXJyb3IiIGV4Y2VwdGlvbiwgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gaXRzZWxmLlxuXG4gICBZb3UgY2FuIHVzZSAic3RyLm1ha2V0cmFucygpIiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBtYXAgZnJvbVxuICAgY2hhcmFjdGVyLXRvLWNoYXJhY3RlciBtYXBwaW5ncyBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cblxuICAgU2VlIGFsc28gdGhlICJjb2RlY3MiIG1vZHVsZSBmb3IgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIHRvIGN1c3RvbVxuICAgY2hhcmFjdGVyIG1hcHBpbmdzLlxuXG5zdHIudXBwZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0ICJzdHIudXBwZXIoKS5pc3VwcGVyKCkiIG1pZ2h0IGJlXG4gICAiRmFsc2UiIGlmICJzIiBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGVcbiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsXG4gICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbiAgIFRoZSB1cHBlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZVxuICAgVW5pY29kZSBTdGFuZGFyZC5cblxuc3RyLnpmaWxsKHdpZHRoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCBBU0NJSSAiXCcwXCciIGRpZ2l0cyB0b1xuICAgbWFrZSBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gQSBsZWFkaW5nIHNpZ24gcHJlZml4XG4gICAoIlwnK1wnIi8iXCctXCciKSBpcyBoYW5kbGVkIGJ5IGluc2VydGluZyB0aGUgcGFkZGluZyAqYWZ0ZXIqIHRoZSBzaWduXG4gICBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYmVmb3JlLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmXG4gICAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAibGVuKHMpIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiAiNDIiLnpmaWxsKDUpXG4gICAgICBcJzAwMDQyXCdcbiAgICAgID4+PiAiLTQyIi56ZmlsbCg1KVxuICAgICAgXCctMDA0MlwnXG4nLAotICdzdHJpbmdzJzogdSdcblN0cmluZyBhbmQgQnl0ZXMgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZylcbiAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgIlIiIHwgIlUiXG4gICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nc3RyaW5naXRlbSogIlwnXCdcJyIgfCBcJyIiIlwnIGxvbmdzdHJpbmdpdGVtKiBcJyIiIlwnXG4gICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuICAgbG9uZ3N0cmluZ2l0ZW0gIDo6PSBsb25nc3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+XG4gICBsb25nc3RyaW5nY2hhciAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbiAgIHN0cmluZ2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IHNvdXJjZSBjaGFyYWN0ZXI+XG5cbiAgIGJ5dGVzbGl0ZXJhbCAgIDo6PSBieXRlc3ByZWZpeChzaG9ydGJ5dGVzIHwgbG9uZ2J5dGVzKVxuICAgYnl0ZXNwcmVmaXggICAgOjo9ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiIgfCAicmIiIHwgInJCIiB8ICJSYiIgfCAiUkIiXG4gICBzaG9ydGJ5dGVzICAgICA6Oj0gIlwnIiBzaG9ydGJ5dGVzaXRlbSogIlwnIiB8IFwnIlwnIHNob3J0Ynl0ZXNpdGVtKiBcJyJcJ1xuICAgbG9uZ2J5dGVzICAgICAgOjo9ICJcJ1wnXCciIGxvbmdieXRlc2l0ZW0qICJcJ1wnXCciIHwgXCciIiJcJyBsb25nYnl0ZXNpdGVtKiBcJyIiIlwnXG4gICBzaG9ydGJ5dGVzaXRlbSA6Oj0gc2hvcnRieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuICAgbG9uZ2J5dGVzaXRlbSAgOjo9IGxvbmdieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuICAgc2hvcnRieXRlc2NoYXIgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ2J5dGVzY2hhciAgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuICAgYnl0ZXNlc2NhcGVzZXEgOjo9ICJcXCIgPGFueSBBU0NJSSBjaGFyYWN0ZXI+XG5cbk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0XG53aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlICJzdHJpbmdwcmVmaXgiIG9yICJieXRlc3ByZWZpeCJcbmFuZCB0aGUgcmVzdCBvZiB0aGUgbGl0ZXJhbC4gVGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGlzIGRlZmluZWQgYnlcbnRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgVVRGLTggaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXNcbmdpdmVuIGluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb24gKkVuY29kaW5nIGRlY2xhcmF0aW9ucyouXG5cbkluIHBsYWluIEVuZ2xpc2g6IEJvdGggdHlwZXMgb2YgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nXG5zaW5nbGUgcXVvdGVzICgiXCciKSBvciBkb3VibGUgcXVvdGVzICgiIiIpLiAgVGhleSBjYW4gYWxzbyBiZSBlbmNsb3NlZFxuaW4gbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmVcbmdlbmVyYWxseSByZWZlcnJlZCB0byBhcyAqdHJpcGxlLXF1b3RlZCBzdHJpbmdzKikuICBUaGUgYmFja3NsYXNoXG4oIlxcIikgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhXG5zcGVjaWFsIG1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlXG5jaGFyYWN0ZXIuXG5cbkJ5dGVzIGxpdGVyYWxzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCAiXCdiXCciIG9yICJcJ0JcJyI7IHRoZXkgcHJvZHVjZVxuYW4gaW5zdGFuY2Ugb2YgdGhlICJieXRlcyIgdHlwZSBpbnN0ZWFkIG9mIHRoZSAic3RyIiB0eXBlLiAgVGhleSBtYXlcbm9ubHkgY29udGFpbiBBU0NJSSBjaGFyYWN0ZXJzOyBieXRlcyB3aXRoIGEgbnVtZXJpYyB2YWx1ZSBvZiAxMjggb3JcbmdyZWF0ZXIgbXVzdCBiZSBleHByZXNzZWQgd2l0aCBlc2NhcGVzLlxuXG5BcyBvZiBQeXRob24gMy4zIGl0IGlzIHBvc3NpYmxlIGFnYWluIHRvIHByZWZpeCBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBhXG4idSIgcHJlZml4IHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIGR1YWwgMi54IGFuZCAzLnggY29kZWJhc2VzLlxuXG5Cb3RoIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCBhXG5sZXR0ZXIgIlwnclwnIiBvciAiXCdSXCciOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB0cmVhdFxuYmFja3NsYXNoZXMgYXMgbGl0ZXJhbCBjaGFyYWN0ZXJzLiAgQXMgYSByZXN1bHQsIGluIHN0cmluZyBsaXRlcmFscyxcbiJcJ1xcVVwnIiBhbmQgIlwnXFx1XCciIGVzY2FwZXMgaW4gcmF3IHN0cmluZ3MgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseS5cbkdpdmVuIHRoYXQgUHl0aG9uIDIueFwncyByYXcgdW5pY29kZSBsaXRlcmFscyBiZWhhdmUgZGlmZmVyZW50bHkgdGhhblxuUHl0aG9uIDMueFwncyB0aGUgIlwndXJcJyIgc3ludGF4IGlzIG5vdCBzdXBwb3J0ZWQuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJcJ3JiXCciIHByZWZpeCBvZiByYXcgYnl0ZXMgbGl0ZXJhbHMgaGFzIGJlZW5cbmFkZGVkIGFzIGEgc3lub255bSBvZiAiXCdiclwnIi5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciB0aGUgdW5pY29kZSBsZWdhY3kgbGl0ZXJhbFxuKCJ1XCd2YWx1ZVwnIikgd2FzIHJlaW50cm9kdWNlZCB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgZHVhbFxuUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG5JbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZFxuKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93XG50ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQSAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZVxubGl0ZXJhbCwgaS5lLiBlaXRoZXIgIlwnIiBvciAiIiIuKVxuXG5Vbmxlc3MgYW4gIlwnclwnIiBvciAiXCdSXCciIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZ1xuYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZVxudXNlZCBieSBTdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgIlxcbmV3bGluZSIgICAgICAgIHwgQmFja3NsYXNoIGFuZCBuZXdsaW5lIGlnbm9yZWQgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXFxcIiAgICAgICAgICAgICAgfCBCYWNrc2xhc2ggKCJcXCIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXFwnIiAgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKCJcJyIpICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXCIiICAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoIiIiKSAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxhIiAgICAgICAgICAgICAgfCBBU0NJSSBCZWxsIChCRUwpICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcYiIgICAgICAgICAgICAgIHwgQVNDSUkgQmFja3NwYWNlIChCUykgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXGYiICAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxuIiAgICAgICAgICAgICAgfCBBU0NJSSBMaW5lZmVlZCAoTEYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcciIgICAgICAgICAgICAgIHwgQVNDSUkgQ2FycmlhZ2UgUmV0dXJuIChDUikgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHQiICAgICAgICAgICAgICB8IEFTQ0lJIEhvcml6b250YWwgVGFiIChUQUIpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx2IiAgICAgICAgICAgICAgfCBBU0NJSSBWZXJ0aWNhbCBUYWIgKFZUKSAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcb29vIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgKm9vbyogIHwgKDEsMykgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHhoaCIgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICgyLDMpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Fc2NhcGUgc2VxdWVuY2VzIG9ubHkgcmVjb2duaXplZCBpbiBzdHJpbmcgbGl0ZXJhbHMgYXJlOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICB8XG4rPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT0rXG58ICJcXE57bmFtZX0iICAgICAgICB8IENoYXJhY3RlciBuYW1lZCAqbmFtZSogaW4gdGhlICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgZGF0YWJhc2UgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx1eHh4eCIgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlICAgfCAoNSkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCAqeHh4eCogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcVXh4eHh4eHh4IiAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMzItYml0IGhleCB2YWx1ZSAgIHwgKDYpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuXG4yLiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjMuIEluIGEgYnl0ZXMgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZVxuICAgYnl0ZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gSW4gYSBzdHJpbmcgbGl0ZXJhbCwgdGhlc2UgZXNjYXBlc1xuICAgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG5cbjQuIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIG5hbWUgYWxpYXNlcyBbMV0gaGFzIGJlZW5cbiAgIGFkZGVkLlxuXG41LiBFeGFjdGx5IGZvdXIgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjYuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheS4gIEV4YWN0bHkgZWlnaHRcbiAgIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuXG5Vbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluIHRoZVxuc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgcmVzdWx0Ki4gIChUaGlzXG5iZWhhdmlvciBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc6IGlmIGFuIGVzY2FwZSBzZXF1ZW5jZSBpcyBtaXN0eXBlZCxcbnRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzIGFsc29cbmltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZ1xubGl0ZXJhbHMgZmFsbCBpbnRvIHRoZSBjYXRlZ29yeSBvZiB1bnJlY29nbml6ZWQgZXNjYXBlcyBmb3IgYnl0ZXNcbmxpdGVyYWxzLlxuXG5FdmVuIGluIGEgcmF3IGxpdGVyYWwsIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBidXQgdGhlXG5iYWNrc2xhc2ggcmVtYWlucyBpbiB0aGUgcmVzdWx0OyBmb3IgZXhhbXBsZSwgInIiXFwiIiIgaXMgYSB2YWxpZFxuc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlXG5xdW90ZTsgInIiXFwiIiBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgY2Fubm90XG5lbmQgaW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcykuICBTcGVjaWZpY2FsbHksICphIHJhdyBsaXRlcmFsXG5jYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGQgZXNjYXBlXG50aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZSBiYWNrc2xhc2hcbmZvbGxvd2VkIGJ5IGEgbmV3bGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aG9zZSB0d28gY2hhcmFjdGVycyBhcyBwYXJ0XG5vZiB0aGUgbGl0ZXJhbCwgKm5vdCogYXMgYSBsaW5lIGNvbnRpbnVhdGlvbi5cbicsCi0gJ3N1YnNjcmlwdGlvbnMnOiB1J1xuU3Vic2NyaXB0aW9uc1xuKioqKioqKioqKioqKlxuXG5BIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSBvciBsaXN0KVxub3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OlxuXG4gICBzdWJzY3JpcHRpb24gOjo9IHByaW1hcnkgIlsiIGV4cHJlc3Npb25fbGlzdCAiXSJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBzdWJzY3JpcHRpb25cbihsaXN0cyBvciBkaWN0aW9uYXJpZXMgZm9yIGV4YW1wbGUpLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgY2FuIHN1cHBvcnRcbnN1YnNjcmlwdGlvbiBieSBkZWZpbmluZyBhICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbkZvciBidWlsdC1pbiBvYmplY3RzLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9iamVjdHMgdGhhdCBzdXBwb3J0XG5zdWJzY3JpcHRpb246XG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZywgdGhlIGV4cHJlc3Npb24gbGlzdCBtdXN0IGV2YWx1YXRlIHRvIGFuXG5vYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgdGhlXG5zdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgdmFsdWUgaW4gdGhlIG1hcHBpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGF0XG5rZXkuICAoVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBhIHR1cGxlIGV4Y2VwdCBpZiBpdCBoYXMgZXhhY3RseSBvbmVcbml0ZW0uKVxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIHNlcXVlbmNlLCB0aGUgZXhwcmVzc2lvbiAobGlzdCkgbXVzdCBldmFsdWF0ZSB0b1xuYW4gaW50ZWdlciBvciBhIHNsaWNlIChhcyBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uKS5cblxuVGhlIGZvcm1hbCBzeW50YXggbWFrZXMgbm8gc3BlY2lhbCBwcm92aXNpb24gZm9yIG5lZ2F0aXZlIGluZGljZXMgaW5cbnNlcXVlbmNlczsgaG93ZXZlciwgYnVpbHQtaW4gc2VxdWVuY2VzIGFsbCBwcm92aWRlIGEgIl9fZ2V0aXRlbV9fKCkiXG5tZXRob2QgdGhhdCBpbnRlcnByZXRzIG5lZ2F0aXZlIGluZGljZXMgYnkgYWRkaW5nIHRoZSBsZW5ndGggb2YgdGhlXG5zZXF1ZW5jZSB0byB0aGUgaW5kZXggKHNvIHRoYXQgInhbLTFdIiBzZWxlY3RzIHRoZSBsYXN0IGl0ZW0gb2YgIngiKS5cblRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuIHRoZSBudW1iZXJcbm9mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgaXRlbSB3aG9zZVxuaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4gU2luY2UgdGhlIHN1cHBvcnQgZm9yXG5uZWdhdGl2ZSBpbmRpY2VzIGFuZCBzbGljaW5nIG9jY3VycyBpbiB0aGUgb2JqZWN0XCdzICJfX2dldGl0ZW1fXygpIlxubWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgYWRkXG50aGF0IHN1cHBvcnQuXG5cbkEgc3RyaW5nXCdzIGl0ZW1zIGFyZSBjaGFyYWN0ZXJzLiAgQSBjaGFyYWN0ZXIgaXMgbm90IGEgc2VwYXJhdGUgZGF0YVxudHlwZSBidXQgYSBzdHJpbmcgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLlxuJywKLSAndHJ1dGgnOiB1J1xuVHJ1dGggVmFsdWUgVGVzdGluZ1xuKioqKioqKioqKioqKioqKioqKlxuXG5Bbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuICJpZiIgb3JcbiJ3aGlsZSIgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gVGhlXG5mb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGZhbHNlOlxuXG4qICJOb25lIlxuXG4qICJGYWxzZSJcblxuKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGUsIGZvciBleGFtcGxlLCAiMCIsICIwLjAiLCAiMGoiLlxuXG4qIGFueSBlbXB0eSBzZXF1ZW5jZSwgZm9yIGV4YW1wbGUsICJcJ1wnIiwgIigpIiwgIltdIi5cblxuKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsICJ7fSIuXG5cbiogaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLCBpZiB0aGUgY2xhc3MgZGVmaW5lcyBhXG4gICJfX2Jvb2xfXygpIiBvciAiX19sZW5fXygpIiBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJucyB0aGVcbiAgaW50ZWdlciB6ZXJvIG9yICJib29sIiB2YWx1ZSAiRmFsc2UiLiBbMV1cblxuQWxsIG90aGVyIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB0cnVlIC0tLSBzbyBvYmplY3RzIG9mIG1hbnkgdHlwZXMgYXJlXG5hbHdheXMgdHJ1ZS5cblxuT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0IGFsd2F5c1xucmV0dXJuICIwIiBvciAiRmFsc2UiIGZvciBmYWxzZSBhbmQgIjEiIG9yICJUcnVlIiBmb3IgdHJ1ZSwgdW5sZXNzXG5vdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyAib3IiXG5hbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKVxuJywKLSAndHJ5JzogdSdcblRoZSAidHJ5IiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiBub1xuZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciBhblxuZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgY2xhdXNlc1xuaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiBleHByZXNzaW9uLVxubGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG5leGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvblxuaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZ1xub2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgY29tcGF0aWJsZVxud2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgZXhjZXB0aW9uXG5vYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24uXG5cbklmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb25cbmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay5cblsxXVxuXG5JZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxucmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZFxuYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZFxudGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWZcbnByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHRcbmNsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpc1xucmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuXG4oVGhpcyBtZWFucyB0aGF0IGlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbixcbmFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlXG5vdXRlciBoYW5kbGVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuV2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gYXNzaWduZWQgdXNpbmcgImFzIHRhcmdldCIsIGl0IGlzIGNsZWFyZWRcbmF0IHRoZSBlbmQgb2YgdGhlIGV4Y2VwdCBjbGF1c2UuICBUaGlzIGlzIGFzIGlmXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgZm9vXG5cbndhcyB0cmFuc2xhdGVkIHRvXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgdHJ5OlxuICAgICAgICAgICBmb29cbiAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICBkZWwgTlxuXG5UaGlzIG1lYW5zIHRoZSBleGNlcHRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIGJlXG5hYmxlIHRvIHJlZmVyIHRvIGl0IGFmdGVyIHRoZSBleGNlcHQgY2xhdXNlLiAgRXhjZXB0aW9ucyBhcmUgY2xlYXJlZFxuYmVjYXVzZSB3aXRoIHRoZSB0cmFjZWJhY2sgYXR0YWNoZWQgdG8gdGhlbSwgdGhleSBmb3JtIGEgcmVmZXJlbmNlXG5jeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmVcbnVudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuXG5cbkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHZpYVxuInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mIHRoZVxuZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KikgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluIHRoZVxucHJvZ3JhbSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiAgInN5cy5leGNfaW5mbygpIiB2YWx1ZXMgYXJlXG5yZXN0b3JlZCB0byB0aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmdcbmZyb20gYSBmdW5jdGlvbiB0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuXG5UaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgInRyeSIgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgImVsc2UiIGNsYXVzZSBhcmVcbm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy5cblxuSWYgImZpbmFsbHkiIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGUgInRyeSJcbmNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSAiZXhjZXB0IiBhbmQgImVsc2UiIGNsYXVzZXMuICBJZiBhblxuZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGVcbmV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQuICBJZlxudGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICJmaW5hbGx5IlxuY2xhdXNlLiAgSWYgdGhlICJmaW5hbGx5IiBjbGF1c2UgcmFpc2VzIGFub3RoZXIgZXhjZXB0aW9uLCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSJcbmNsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iIG9yICJicmVhayIgc3RhdGVtZW50LCB0aGUgc2F2ZWQgZXhjZXB0aW9uXG5pcyBkaXNjYXJkZWQ6XG5cbiAgID4+PiBkZWYgZigpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICAxLzBcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiA0MlxuICAgLi4uXG4gICA+Pj4gZigpXG4gICA0MlxuXG5UaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nXG5leGVjdXRpb24gb2YgdGhlICJmaW5hbGx5IiBjbGF1c2UuXG5cbldoZW4gYSAicmV0dXJuIiwgImJyZWFrIiBvciAiY29udGludWUiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbiB0aGVcbiJ0cnkiIHN1aXRlIG9mIGEgInRyeSIuLi4iZmluYWxseSIgc3RhdGVtZW50LCB0aGUgImZpbmFsbHkiIGNsYXVzZSBpc1xuYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgaWxsZWdhbCBpblxudGhlICJmaW5hbGx5IiBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5UaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAicmV0dXJuIlxuc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlICJmaW5hbGx5IiBjbGF1c2UgYWx3YXlzIGV4ZWN1dGVzLCBhXG4icmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlXG5sYXN0IG9uZSBleGVjdXRlZDpcblxuICAgPj4+IGRlZiBmb28oKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwndHJ5XCdcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ2ZpbmFsbHlcJ1xuICAgLi4uXG4gICA+Pj4gZm9vKClcbiAgIFwnZmluYWxseVwnXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvXG5nZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cbicsCi0gJ3R5cGVzJzogdSdcblRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgYnVpbHQgaW50byBQeXRob24uICBFeHRlbnNpb25cbm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG5pbXBsZW1lbnRhdGlvbikgY2FuIGRlZmluZSBhZGRpdGlvbmFsIHR5cGVzLiAgRnV0dXJlIHZlcnNpb25zIG9mXG5QeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsIG51bWJlcnMsXG5lZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKSwgYWx0aG91Z2ggc3VjaCBhZGRpdGlvbnNcbndpbGwgb2Z0ZW4gYmUgcHJvdmlkZWQgdmlhIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQuXG5cblNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZ1xuXCdzcGVjaWFsIGF0dHJpYnV0ZXMuXCcgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlXG5pbXBsZW1lbnRhdGlvbiBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBUaGVpciBkZWZpbml0aW9uXG5tYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cbk5vbmVcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSAiTm9uZSIuIEl0XG4gICBpcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBtYW55IHNpdHVhdGlvbnMsIGUuZy4sXG4gICBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvblwndCBleHBsaWNpdGx5IHJldHVyblxuICAgYW55dGhpbmcuIEl0cyB0cnV0aCB2YWx1ZSBpcyBmYWxzZS5cblxuTm90SW1wbGVtZW50ZWRcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZVxuICAgIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kc1xuICAgc2hvdWxkIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvclxuICAgdGhlIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZVxuICAgcmVmbGVjdGVkIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZVxuICAgb3BlcmF0b3IuKSAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbiAgIFNlZSAqSW1wbGVtZW50aW5nIHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnMqIGZvciBtb3JlIGRldGFpbHMuXG5cbkVsbGlwc2lzXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGxpdGVyYWwgIi4uLiIgb3IgdGhlXG4gICBidWlsdC1pbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuIm51bWJlcnMuTnVtYmVyIlxuICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieVxuICAgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpY1xuICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbiAgIFB5dGhvbiBudW1iZXJzIGFyZSBvZiBjb3Vyc2Ugc3Ryb25nbHkgcmVsYXRlZCB0byBtYXRoZW1hdGljYWxcbiAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgcmVwcmVzZW50YXRpb25cbiAgIGluIGNvbXB1dGVycy5cblxuICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kXG4gICBjb21wbGV4IG51bWJlcnM6XG5cbiAgICJudW1iZXJzLkludGVncmFsIlxuICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgaW50ZWdlcnNcbiAgICAgIChwb3NpdGl2ZSBhbmQgbmVnYXRpdmUpLlxuXG4gICAgICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGludGVnZXJzOlxuXG4gICAgICBJbnRlZ2VycyAoImludCIpXG5cbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIGFuIHVubGltaXRlZCByYW5nZSwgc3ViamVjdCB0b1xuICAgICAgICAgYXZhaWxhYmxlICh2aXJ0dWFsKSBtZW1vcnkgb25seS4gIEZvciB0aGUgcHVycG9zZSBvZiBzaGlmdFxuICAgICAgICAgYW5kIG1hc2sgb3BlcmF0aW9ucywgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZCwgYW5kXG4gICAgICAgICBuZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMlwnc1xuICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mXG4gICAgICAgICBzaWduIGJpdHMgZXh0ZW5kaW5nIHRvIHRoZSBsZWZ0LlxuXG4gICAgICBCb29sZWFucyAoImJvb2wiKVxuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IHRoZSB0cnV0aCB2YWx1ZXMgRmFsc2UgYW5kIFRydWUuICBUaGUgdHdvXG4gICAgICAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgdGhlXG4gICAgICAgICBvbmx5IEJvb2xlYW4gb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlXG4gICAgICAgICBpbnRlZ2VyIHR5cGUsIGFuZCBCb29sZWFuIHZhbHVlcyBiZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgYW5kXG4gICAgICAgICAxLCByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsIHRoZSBleGNlcHRpb24gYmVpbmdcbiAgICAgICAgIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmdzICIiRmFsc2UiIiBvclxuICAgICAgICAgIiJUcnVlIiIgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuXG5cbiAgICAgIFRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGVcbiAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zXG4gICAgICBpbnZvbHZpbmcgbmVnYXRpdmUgaW50ZWdlcnMuXG5cbiAgICJudW1iZXJzLlJlYWwiICgiZmxvYXQiKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IG1hY2hpbmUtbGV2ZWwgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludFxuICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuICAgICAgYXJjaGl0ZWN0dXJlIChhbmQgQyBvciBKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkXG4gICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0IHNpbmdsZS1cbiAgICAgIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUgc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kXG4gICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBhcmVcbiAgICAgIGR3YXJmZWQgYnkgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIG9iamVjdHMgaW4gUHl0aG9uLCBzbyB0aGVyZSBpc1xuICAgICAgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mIGZsb2F0aW5nXG4gICAgICBwb2ludCBudW1iZXJzLlxuXG4gICAibnVtYmVycy5Db21wbGV4IiAoImNvbXBsZXgiKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbFxuICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseVxuICAgICAgYXMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYVxuICAgICAgY29tcGxleCBudW1iZXIgInoiIGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgcmVhZC1vbmx5XG4gICAgICBhdHRyaWJ1dGVzICJ6LnJlYWwiIGFuZCAiei5pbWFnIi5cblxuU2VxdWVuY2VzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZVxuICAgbnVtYmVycy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zXG4gICBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZSBpbmRleCBzZXRcbiAgIGNvbnRhaW5zIHRoZSBudW1iZXJzIDAsIDEsIC4uLiwgKm4qLTEuICBJdGVtICppKiBvZiBzZXF1ZW5jZSAqYSogaXNcbiAgIHNlbGVjdGVkIGJ5ICJhW2ldIi5cblxuICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiAiYVtpOmpdIiBzZWxlY3RzIGFsbCBpdGVtcyB3aXRoXG4gICBpbmRleCAqayogc3VjaCB0aGF0ICppKiAiPD0iICprKiAiPCIgKmoqLiAgV2hlbiB1c2VkIGFzIGFuXG4gICBleHByZXNzaW9uLCBhIHNsaWNlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gIFRoaXMgaW1wbGllc1xuICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC5cblxuICAgU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0ICJleHRlbmRlZCBzbGljaW5nIiB3aXRoIGEgdGhpcmQgInN0ZXAiXG4gICBwYXJhbWV0ZXI6ICJhW2k6ajprXSIgc2VsZWN0cyBhbGwgaXRlbXMgb2YgKmEqIHdpdGggaW5kZXggKngqIHdoZXJlXG4gICAieCA9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLlxuXG4gICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG5cbiAgIEltbXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXNcbiAgICAgIGNyZWF0ZWQuICAoSWYgdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMsXG4gICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlcixcbiAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGVcbiAgICAgIG9iamVjdCBjYW5ub3QgY2hhbmdlLilcblxuICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcblxuICAgICAgU3RyaW5nc1xuICAgICAgICAgQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgVW5pY29kZSBjb2RlXG4gICAgICAgICBwb2ludHMuIEFsbCB0aGUgY29kZSBwb2ludHMgaW4gdGhlIHJhbmdlICJVKzAwMDAgLSBVKzEwRkZGRiJcbiAgICAgICAgIGNhbiBiZSByZXByZXNlbnRlZCBpbiBhIHN0cmluZy4gIFB5dGhvbiBkb2VzblwndCBoYXZlIGEgImNoYXIiXG4gICAgICAgICB0eXBlOyBpbnN0ZWFkLCBldmVyeSBjb2RlIHBvaW50IGluIHRoZSBzdHJpbmcgaXMgcmVwcmVzZW50ZWRcbiAgICAgICAgIGFzIGEgc3RyaW5nIG9iamVjdCB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgICAgICAgICJvcmQoKSIgY29udmVydHMgYSBjb2RlIHBvaW50IGZyb20gaXRzIHN0cmluZyBmb3JtIHRvIGFuXG4gICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiI7ICJjaHIoKSIgY29udmVydHMgYW5cbiAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIiB0byB0aGUgY29ycmVzcG9uZGluZyBsZW5ndGhcbiAgICAgICAgICIxIiBzdHJpbmcgb2JqZWN0LiAic3RyLmVuY29kZSgpIiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGFcbiAgICAgICAgICJzdHIiIHRvICJieXRlcyIgdXNpbmcgdGhlIGdpdmVuIHRleHQgZW5jb2RpbmcsIGFuZFxuICAgICAgICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS5cblxuICAgICAgVHVwbGVzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgb2ZcbiAgICAgICAgIHR3byBvciBtb3JlIGl0ZW1zIGFyZSBmb3JtZWQgYnkgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mXG4gICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgXCdzaW5nbGV0b25cJykgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uIGJ5XG4gICAgICAgICBpdHNlbGYgZG9lcyBub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmVcbiAgICAgICAgIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy5cblxuICAgICAgQnl0ZXNcbiAgICAgICAgIEEgYnl0ZXMgb2JqZWN0IGlzIGFuIGltbXV0YWJsZSBhcnJheS4gIFRoZSBpdGVtcyBhcmUgOC1iaXRcbiAgICAgICAgIGJ5dGVzLCByZXByZXNlbnRlZCBieSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCA8PSB4IDwgMjU2LlxuICAgICAgICAgQnl0ZXMgbGl0ZXJhbHMgKGxpa2UgImJcJ2FiY1wnIikgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgICAgICAgImJ5dGVzKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBieXRlcyBvYmplY3RzLiAgQWxzbyxcbiAgICAgICAgIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8gc3RyaW5ncyB2aWEgdGhlICJkZWNvZGUoKSJcbiAgICAgICAgIG1ldGhvZC5cblxuICAgTXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIE11dGFibGUgc2VxdWVuY2VzIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGVcbiAgICAgIHN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZlxuICAgICAgYXNzaWdubWVudCBhbmQgImRlbCIgKGRlbGV0ZSkgc3RhdGVtZW50cy5cblxuICAgICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIG11dGFibGUgc2VxdWVuY2UgdHlwZXM6XG5cbiAgICAgIExpc3RzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBsaXN0IGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuICBMaXN0cyBhcmVcbiAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaW5cbiAgICAgICAgIHNxdWFyZSBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyBuZWVkZWRcbiAgICAgICAgIHRvIGZvcm0gbGlzdHMgb2YgbGVuZ3RoIDAgb3IgMS4pXG5cbiAgICAgIEJ5dGUgQXJyYXlzXG4gICAgICAgICBBIGJ5dGVhcnJheSBvYmplY3QgaXMgYSBtdXRhYmxlIGFycmF5LiBUaGV5IGFyZSBjcmVhdGVkIGJ5XG4gICAgICAgICB0aGUgYnVpbHQtaW4gImJ5dGVhcnJheSgpIiBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbiAgICAgICAgIG11dGFibGUgKGFuZCBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGVcbiAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbiAgICAgICAgIG9iamVjdHMuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlICJhcnJheSIgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBleGFtcGxlIG9mIGFcbiAgICAgIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgYXMgZG9lcyB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuXG5cblNldCB0eXBlc1xuICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGVcbiAgIG9iamVjdHMuIEFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gSG93ZXZlcixcbiAgIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIlxuICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdFxuICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4gICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuICAgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYyBkaWZmZXJlbmNlLlxuXG4gICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4gICBkaWN0aW9uYXJ5IGtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3JcbiAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZFxuICAgIjEuMCIpLCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBjb250YWluZWQgaW4gYSBzZXQuXG5cbiAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBzZXQgdHlwZXM6XG5cbiAgIFNldHNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBhIG11dGFibGUgc2V0LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgInNldCgpIiBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbFxuICAgICAgbWV0aG9kcywgc3VjaCBhcyAiYWRkKCkiLlxuXG4gICBGcm96ZW4gc2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGFuIGltbXV0YWJsZSBzZXQuICBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZVxuICAgICAgYnVpbHQtaW4gImZyb3plbnNldCgpIiBjb25zdHJ1Y3Rvci4gIEFzIGEgZnJvemVuc2V0IGlzIGltbXV0YWJsZVxuICAgICAgYW5kICpoYXNoYWJsZSosIGl0IGNhbiBiZSB1c2VkIGFnYWluIGFzIGFuIGVsZW1lbnQgb2YgYW5vdGhlclxuICAgICAgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LlxuXG5NYXBwaW5nc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgaW5kZXhcbiAgIHNldHMuIFRoZSBzdWJzY3JpcHQgbm90YXRpb24gImFba10iIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieSAiayJcbiAgIGZyb20gdGhlIG1hcHBpbmcgImEiOyB0aGlzIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zIGFuZCBhcyB0aGVcbiAgIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciAiZGVsIiBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy5cblxuICAgVGhlcmUgaXMgY3VycmVudGx5IGEgc2luZ2xlIGludHJpbnNpYyBtYXBwaW5nIHR5cGU6XG5cbiAgIERpY3Rpb25hcmllc1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBuZWFybHlcbiAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgYXNcbiAgICAgIGtleXMgYXJlIHZhbHVlcyBjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlclxuICAgICAgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbiAgICAgIGlkZW50aXR5LCB0aGUgcmVhc29uIGJlaW5nIHRoYXQgdGhlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V5XCdzIGhhc2ggdmFsdWUgdG8gcmVtYWluIGNvbnN0YW50LlxuICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpY1xuICAgICAgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZCAiMS4wIilcbiAgICAgIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbiAgICAgIGRpY3Rpb25hcnkgZW50cnkuXG5cbiAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInsuLi59IlxuICAgICAgbm90YXRpb24gKHNlZSBzZWN0aW9uICpEaWN0aW9uYXJ5IGRpc3BsYXlzKikuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlcyAiZGJtLm5kYm0iIGFuZCAiZGJtLmdudSIgcHJvdmlkZVxuICAgICAgYWRkaXRpb25hbCBleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiXG4gICAgICBtb2R1bGUuXG5cbkNhbGxhYmxlIHR5cGVzXG4gICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlXG4gICBzZWN0aW9uICpDYWxscyopIGNhbiBiZSBhcHBsaWVkOlxuXG4gICBVc2VyLWRlZmluZWQgZnVuY3Rpb25zXG4gICAgICBBIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uXG4gICAgICBkZWZpbml0aW9uIChzZWUgc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqKS4gIEl0IHNob3VsZCBiZVxuICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtc1xuICAgICAgYXMgdGhlIGZ1bmN0aW9uXCdzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC5cblxuICAgICAgU3BlY2lhbCBhdHRyaWJ1dGVzOlxuXG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT0rXG4gICAgICB8ICJfX2RvY19fIiAgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgIk5vbmUiIGlmICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZTsgbm90IGluaGVyaXRlZCBieSAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3ViY2xhc3NlcyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX25hbWVfXyIgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgbmFtZSAgICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX3F1YWxuYW1lX18iICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgKnF1YWxpZmllZCBuYW1lKiB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBpbiB2ZXJzaW9uIDMuMy4gICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19tb2R1bGVfXyIgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiTm9uZSIgaWYgdW5hdmFpbGFibGUuICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZGVmYXVsdHNfXyIgICAgICAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudCB2YWx1ZXMgZm9yIHRob3NlICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yICJOb25lIiBpZiBubyBhcmd1bWVudHMgaGF2ZSAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhIGRlZmF1bHQgdmFsdWUgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fY29kZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29tcGlsZWQgZnVuY3Rpb24gYm9keS4gICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZ2xvYmFsc19fIiAgICAgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvblwncyAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdsb2JhbCB2YXJpYWJsZXMgLS0tIHRoZSBnbG9iYWwgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZSBpbiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2RpY3RfXyIgICAgICAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJiaXRyYXJ5IGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2Nsb3N1cmVfXyIgICAgICAgICAgICAgfCAiTm9uZSIgb3IgYSB0dXBsZSBvZiBjZWxscyB0aGF0IHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uXCdzIGZyZWUgdmFyaWFibGVzLiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fYW5ub3RhdGlvbnNfXyIgICAgICAgICB8IEEgZGljdCBjb250YWluaW5nIGFubm90YXRpb25zICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGtleXMgb2YgdGhlIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGljdCBhcmUgdGhlIHBhcmFtZXRlciBuYW1lcywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFuZCAiXCdyZXR1cm5cJyIgZm9yIHRoZSByZXR1cm4gICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFubm90YXRpb24sIGlmIHByb3ZpZGVkLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19rd2RlZmF1bHRzX18iICAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgZGVmYXVsdHMgZm9yICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmQtb25seSBwYXJhbWV0ZXJzLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuXG4gICAgICBNb3N0IG9mIHRoZSBhdHRyaWJ1dGVzIGxhYmVsbGVkICJXcml0YWJsZSIgY2hlY2sgdGhlIHR5cGUgb2YgdGhlXG4gICAgICBhc3NpZ25lZCB2YWx1ZS5cblxuICAgICAgRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnlcbiAgICAgIGF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoIG1ldGFkYXRhXG4gICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kXG4gICAgICBzZXQgc3VjaCBhdHRyaWJ1dGVzLiAqTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHlcbiAgICAgIHN1cHBvcnRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gRnVuY3Rpb25cbiAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlXG4gICAgICBmdXR1cmUuKlxuXG4gICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb25cJ3MgZGVmaW5pdGlvbiBjYW4gYmVcbiAgICAgIHJldHJpZXZlZCBmcm9tIGl0cyBjb2RlIG9iamVjdDsgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBpbnRlcm5hbFxuICAgICAgdHlwZXMgYmVsb3cuXG5cbiAgIEluc3RhbmNlIG1ldGhvZHNcbiAgICAgIEFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSBhbmRcbiAgICAgIGFueSBjYWxsYWJsZSBvYmplY3QgKG5vcm1hbGx5IGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uKS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogIl9fc2VsZl9fIiBpcyB0aGUgY2xhc3MgaW5zdGFuY2VcbiAgICAgIG9iamVjdCwgIl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OyAiX19kb2NfXyIgaXMgdGhlXG4gICAgICBtZXRob2RcJ3MgZG9jdW1lbnRhdGlvbiAoc2FtZSBhcyAiX19mdW5jX18uX19kb2NfXyIpOyAiX19uYW1lX18iXG4gICAgICBpcyB0aGUgbWV0aG9kIG5hbWUgKHNhbWUgYXMgIl9fZnVuY19fLl9fbmFtZV9fIik7ICJfX21vZHVsZV9fIlxuICAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCBvciAiTm9uZSJcbiAgICAgIGlmIHVuYXZhaWxhYmxlLlxuXG4gICAgICBNZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlIGFyYml0cmFyeVxuICAgICAgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuXG5cbiAgICAgIFVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0cyBtYXkgYmUgY3JlYXRlZCB3aGVuIGdldHRpbmcgYW5cbiAgICAgIGF0dHJpYnV0ZSBvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgaWZcbiAgICAgIHRoYXQgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhIGNsYXNzXG4gICAgICBtZXRob2Qgb2JqZWN0LlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1cbiAgICAgIGRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyBpbnN0YW5jZXMsXG4gICAgICBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3RcbiAgICAgIGlzIHNhaWQgdG8gYmUgYm91bmQuICBUaGUgbmV3IG1ldGhvZFwncyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpc1xuICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciBpc1xuICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgIl9fZnVuY19fIlxuICAgICAgYXR0cmlidXRlIG9mIHRoZSBuZXcgaW5zdGFuY2UgaXMgbm90IHRoZSBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0XG4gICAgICBidXQgaXRzICJfX2Z1bmNfXyIgYXR0cmlidXRlLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgY2xhc3NcbiAgICAgIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGVcbiAgICAgIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXMgdGhlXG4gICAgICBmdW5jdGlvbiBvYmplY3QgdW5kZXJseWluZyB0aGUgY2xhc3MgbWV0aG9kLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZ1xuICAgICAgZnVuY3Rpb24gKCJfX2Z1bmNfXyIpIGlzIGNhbGxlZCwgaW5zZXJ0aW5nIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgKCJfX3NlbGZfXyIpIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCB3aGVuXG4gICAgICAiQyIgaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gImYoKSIsXG4gICAgICBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mICJDIiwgY2FsbGluZyAieC5mKDEpIiBpcyBlcXVpdmFsZW50IHRvXG4gICAgICBjYWxsaW5nICJDLmYoeCwgMSkiLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgbWV0aG9kXG4gICAgICBvYmplY3QsIHRoZSAiY2xhc3MgaW5zdGFuY2UiIHN0b3JlZCBpbiAiX19zZWxmX18iIHdpbGwgYWN0dWFsbHlcbiAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgInguZigxKSIgb3IgIkMuZigxKSJcbiAgICAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAiZihDLDEpIiB3aGVyZSAiZiIgaXMgdGhlIHVuZGVybHlpbmdcbiAgICAgIGZ1bmN0aW9uLlxuXG4gICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvIGluc3RhbmNlXG4gICAgICBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgIHRoZSBpbnN0YW5jZS4gIEluIHNvbWUgY2FzZXMsIGEgZnJ1aXRmdWwgb3B0aW1pemF0aW9uIGlzIHRvXG4gICAgICBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWxcbiAgICAgIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gb25seSBoYXBwZW5zIGZvclxuICAgICAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0cyAoYW5kIGFsbCBub24tXG4gICAgICBjYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXQgdHJhbnNmb3JtYXRpb24uICBJdCBpc1xuICAgICAgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgd2hpY2ggYXJlXG4gICAgICBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gYm91bmRcbiAgICAgIG1ldGhvZHM7IHRoaXMgKm9ubHkqIGhhcHBlbnMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgYW4gYXR0cmlidXRlXG4gICAgICBvZiB0aGUgY2xhc3MuXG5cbiAgIEdlbmVyYXRvciBmdW5jdGlvbnNcbiAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIHVzZXMgdGhlICJ5aWVsZCIgc3RhdGVtZW50IChzZWVcbiAgICAgIHNlY3Rpb24gKlRoZSB5aWVsZCBzdGF0ZW1lbnQqKSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yIGZ1bmN0aW9uKi5cbiAgICAgIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIGFsd2F5cyByZXR1cm5zIGFuIGl0ZXJhdG9yIG9iamVjdFxuICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb246ICBjYWxsaW5nXG4gICAgICB0aGUgaXRlcmF0b3JcJ3MgIml0ZXJhdG9yLl9fbmV4dF9fKCkiIG1ldGhvZCB3aWxsIGNhdXNlIHRoZVxuICAgICAgZnVuY3Rpb24gdG8gZXhlY3V0ZSB1bnRpbCBpdCBwcm92aWRlcyBhIHZhbHVlIHVzaW5nIHRoZSAieWllbGQiXG4gICAgICBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhICJyZXR1cm4iIHN0YXRlbWVudCBvclxuICAgICAgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZVxuICAgICAgaXRlcmF0b3Igd2lsbCBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZVxuICAgICAgcmV0dXJuZWQuXG5cbiAgIENvcm91dGluZSBmdW5jdGlvbnNcbiAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIGlzIGRlZmluZWQgdXNpbmcgImFzeW5jIGRlZiIgaXNcbiAgICAgIGNhbGxlZCBhICpjb3JvdXRpbmUgZnVuY3Rpb24qLiAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCxcbiAgICAgIHJldHVybnMgYSAqY29yb3V0aW5lKiBvYmplY3QuICBJdCBtYXkgY29udGFpbiAiYXdhaXQiXG4gICAgICBleHByZXNzaW9ucywgYXMgd2VsbCBhcyAiYXN5bmMgd2l0aCIgYW5kICJhc3luYyBmb3IiIHN0YXRlbWVudHMuXG4gICAgICBTZWUgYWxzbyB0aGUgKkNvcm91dGluZSBPYmplY3RzKiBzZWN0aW9uLlxuXG4gICBCdWlsdC1pbiBmdW5jdGlvbnNcbiAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSJcbiAgICAgICgibWF0aCIgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mXG4gICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtXG4gICAgICBvbmx5IGF0dHJpYnV0ZXM6ICJfX2RvY19fIiBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuICAgICAgc3RyaW5nLCBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGU7ICJfX25hbWVfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzXG4gICAgICBuYW1lOyAiX19zZWxmX18iIGlzIHNldCB0byAiTm9uZSIgKGJ1dCBzZWUgdGhlIG5leHQgaXRlbSk7XG4gICAgICAiX19tb2R1bGVfXyIgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWRcbiAgICAgIGluIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS5cblxuICAgQnVpbHQtaW4gbWV0aG9kc1xuICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpc1xuICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbiAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuICAgICAgImFsaXN0LmFwcGVuZCgpIiwgYXNzdW1pbmcgKmFsaXN0KiBpcyBhIGxpc3Qgb2JqZWN0LiBJbiB0aGlzXG4gICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlICJfX3NlbGZfXyIgaXMgc2V0IHRvIHRoZVxuICAgICAgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki5cblxuICAgQ2xhc3Nlc1xuICAgICAgQ2xhc3NlcyBhcmUgY2FsbGFibGUuICBUaGVzZSBvYmplY3RzIG5vcm1hbGx5IGFjdCBhcyBmYWN0b3JpZXNcbiAgICAgIGZvciBuZXcgaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3JcbiAgICAgIGNsYXNzIHR5cGVzIHRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZVxuICAgICAgY2FsbCBhcmUgcGFzc2VkIHRvICJfX25ld19fKCkiIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG9cbiAgICAgICJfX2luaXRfXygpIiB0byBpbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuXG5cbiAgIENsYXNzIEluc3RhbmNlc1xuICAgICAgSW5zdGFuY2VzIG9mIGFyYml0cmFyeSBjbGFzc2VzIGNhbiBiZSBtYWRlIGNhbGxhYmxlIGJ5IGRlZmluaW5nXG4gICAgICBhICJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuXG5cbk1vZHVsZXNcbiAgIE1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZVxuICAgY3JlYXRlZCBieSB0aGUgKmltcG9ydCBzeXN0ZW0qIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IlxuICAgc3RhdGVtZW50IChzZWUgImltcG9ydCIpLCBvciBieSBjYWxsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzXG4gICAiaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgYW5kIGJ1aWx0LWluICJfX2ltcG9ydF9fKCkiLiAgQSBtb2R1bGVcbiAgIG9iamVjdCBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnkgYSBkaWN0aW9uYXJ5IG9iamVjdCAodGhpcyBpc1xuICAgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUgIl9fZ2xvYmFsc19fIiBhdHRyaWJ1dGUgb2ZcbiAgIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLiAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlXG4gICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyBlcXVpdmFsZW50XG4gICB0byAibS5fX2RpY3RfX1sieCJdIi4gQSBtb2R1bGUgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvZGVcbiAgIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSAoc2luY2UgaXQgaXNuXCd0IG5lZWRlZCBvbmNlXG4gICB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiAgIGUuZy4sICJtLnggPSAxIiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0gPSAxIi5cblxuICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlXG4gICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LlxuXG4gICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4gICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZFxuICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsIGhhc1xuICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwIHRoZVxuICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIG1vZHVsZVwncyBuYW1lO1xuICAgIl9fZG9jX18iIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZlxuICAgdW5hdmFpbGFibGU7ICJfX2ZpbGVfXyIgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlXG4gICBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlICJfX2ZpbGVfXyJcbiAgIGF0dHJpYnV0ZSBtYXkgYmUgbWlzc2luZyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtb2R1bGVzLCBzdWNoIGFzIENcbiAgIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvclxuICAgZXh0ZW5zaW9uIG1vZHVsZXMgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXNcbiAgIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS5cblxuQ3VzdG9tIGNsYXNzZXNcbiAgIEN1c3RvbSBjbGFzcyB0eXBlcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnMgKHNlZVxuICAgc2VjdGlvbiAqQ2xhc3MgZGVmaW5pdGlvbnMqKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkXG4gICBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZFxuICAgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJDLngiIGlzIHRyYW5zbGF0ZWQgdG9cbiAgICJDLl9fZGljdF9fWyJ4Il0iIChhbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggYWxsb3dcbiAgIGZvciBvdGhlciBtZWFucyBvZiBsb2NhdGluZyBhdHRyaWJ1dGVzKS4gV2hlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXNcbiAgIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlXG4gICBjbGFzc2VzLiBUaGlzIHNlYXJjaCBvZiB0aGUgYmFzZSBjbGFzc2VzIHVzZXMgdGhlIEMzIG1ldGhvZFxuICAgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZlxuICAgXCdkaWFtb25kXCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGVcbiAgIGluaGVyaXRhbmNlIHBhdGhzIGxlYWRpbmcgYmFjayB0byBhIGNvbW1vbiBhbmNlc3Rvci4gQWRkaXRpb25hbFxuICAgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGVcbiAgIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMgcmVsZWFzZSBhdFxuICAgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvLy5cblxuICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyAiQyIsIHNheSkgd291bGQgeWllbGQgYVxuICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZXMgaXMgIkMiLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCBhXG4gICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgYnlcbiAgIHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycypcbiAgIGZvciBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5XG4gICBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseSBjb250YWluZWQgaW4gaXRzICJfX2RpY3RfXyIuXG5cbiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzXCdzIGRpY3Rpb25hcnksIG5ldmVyXG4gICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG5cbiAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZVxuICAgKHNlZSBiZWxvdykuXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgY2xhc3MgbmFtZTsgIl9fbW9kdWxlX18iIGlzXG4gICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyAiX19kaWN0X18iIGlzIHRoZVxuICAgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzc1wncyBuYW1lc3BhY2U7ICJfX2Jhc2VzX18iIGlzIGEgdHVwbGVcbiAgIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLCBpbiB0aGVcbiAgIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDsgIl9fZG9jX18iIGlzIHRoZVxuICAgY2xhc3NcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLlxuXG5DbGFzcyBpbnN0YW5jZXNcbiAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgYWJvdmUpLlxuICAgQSBjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoXG4gICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuICAgV2hlbiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIHRoZXJlLCBhbmQgdGhlIGluc3RhbmNlXCdzIGNsYXNzIGhhc1xuICAgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgd2l0aCB0aGUgY2xhc3NcbiAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkXG4gICBmdW5jdGlvbiBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdFxuICAgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLiAgU3RhdGljIG1ldGhvZCBhbmRcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBhbHNvIHRyYW5zZm9ybWVkOyBzZWUgYWJvdmUgdW5kZXJcbiAgICJDbGFzc2VzIi4gIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqIGZvciBhbm90aGVyIHdheVxuICAgaW4gd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXlcbiAgIGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3NcJ3MgIl9fZGljdF9fIi5cbiAgIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZSBvYmplY3RcJ3MgY2xhc3MgaGFzIGFcbiAgICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZVwnc1xuICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzc1wncyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhXG4gICAiX19zZXRhdHRyX18oKSIgb3IgIl9fZGVsYXR0cl9fKCkiIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgaW5zdGVhZFxuICAgb2YgdXBkYXRpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yIG1hcHBpbmdzXG4gICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4gICAqU3BlY2lhbCBtZXRob2QgbmFtZXMqLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6ICJfX2RpY3RfXyIgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5O1xuICAgIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuXG5JL08gb2JqZWN0cyAoYWxzbyBrbm93biBhcyBmaWxlIG9iamVjdHMpXG4gICBBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmVcbiAgIGF2YWlsYWJsZSB0byBjcmVhdGUgZmlsZSBvYmplY3RzOiB0aGUgIm9wZW4oKSIgYnVpbHQtaW4gZnVuY3Rpb24sXG4gICBhbmQgYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiIG1ldGhvZFxuICAgb2Ygc29ja2V0IG9iamVjdHMgKGFuZCBwZXJoYXBzIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBtZXRob2RzXG4gICBwcm92aWRlZCBieSBleHRlbnNpb24gbW9kdWxlcykuXG5cbiAgIFRoZSBvYmplY3RzICJzeXMuc3RkaW4iLCAic3lzLnN0ZG91dCIgYW5kICJzeXMuc3RkZXJyIiBhcmVcbiAgIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcnByZXRlclwnc1xuICAgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtczsgdGhleSBhcmUgYWxsIG9wZW4gaW4gdGV4dFxuICAgbW9kZSBhbmQgdGhlcmVmb3JlIGZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlXG4gICAiaW8uVGV4dElPQmFzZSIgYWJzdHJhY3QgY2xhc3MuXG5cbkludGVybmFsIHR5cGVzXG4gICBBIGZldyB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGludGVycHJldGVyIGFyZSBleHBvc2VkIHRvIHRoZVxuICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbiAgIGludGVycHJldGVyLCBidXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy5cblxuICAgQ29kZSBvYmplY3RzXG4gICAgICBDb2RlIG9iamVjdHMgcmVwcmVzZW50ICpieXRlLWNvbXBpbGVkKiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlLFxuICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4gICAgICBmdW5jdGlvbiBvYmplY3QgaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0XG4gICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uXCdzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzXG4gICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuICAgICAgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBub3RcbiAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdFxuICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgaW1tdXRhYmxlXG4gICAgICBhbmQgY29udGFpbiBubyByZWZlcmVuY2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBtdXRhYmxlXG4gICAgICBvYmplY3RzLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiY29fbmFtZSIgZ2l2ZXMgdGhlIGZ1bmN0aW9uIG5hbWU7XG4gICAgICAiY29fYXJnY291bnQiIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgKGluY2x1ZGluZ1xuICAgICAgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyAiY29fbmxvY2FscyIgaXMgdGhlIG51bWJlciBvZlxuICAgICAgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgYXJndW1lbnRzKTtcbiAgICAgICJjb192YXJuYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWxcbiAgICAgIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpOyAiY29fY2VsbHZhcnMiIGlzIGFcbiAgICAgIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZVxuICAgICAgcmVmZXJlbmNlZCBieSBuZXN0ZWQgZnVuY3Rpb25zOyAiY29fZnJlZXZhcnMiIGlzIGEgdHVwbGVcbiAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWUgdmFyaWFibGVzOyAiY29fY29kZSIgaXMgYSBzdHJpbmdcbiAgICAgIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zOyAiY29fY29uc3RzIlxuICAgICAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19uYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19maWxlbmFtZSIgaXMgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzIGNvbXBpbGVkO1xuICAgICAgImNvX2ZpcnN0bGluZW5vIiBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuICAgICAgImNvX2xub3RhYiIgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuICAgICAgb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgKGZvciBkZXRhaWxzIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlXG4gICAgICBpbnRlcnByZXRlcik7ICJjb19zdGFja3NpemUiIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4gICAgICAoaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7ICJjb19mbGFncyIgaXMgYW4gaW50ZWdlciBlbmNvZGluZyBhXG4gICAgICBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cblxuICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yICJjb19mbGFncyI6IGJpdCAiMHgwNCJcbiAgICAgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIiphcmd1bWVudHMiIHN5bnRheCB0byBhY2NlcHQgYW5cbiAgICAgIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdCAiMHgwOCIgaXMgc2V0IGlmXG4gICAgICB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIioqa2V5d29yZHMiIHN5bnRheCB0byBhY2NlcHQgYXJiaXRyYXJ5XG4gICAgICBrZXl3b3JkIGFyZ3VtZW50czsgYml0ICIweDIwIiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGFcbiAgICAgIGdlbmVyYXRvci5cblxuICAgICAgRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zICgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIpXG4gICAgICBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgb2JqZWN0XG4gICAgICB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgIjB4MjAwMCIgaXNcbiAgICAgIHNldCBpZiB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlIGRpdmlzaW9uIGVuYWJsZWQ7XG4gICAgICBiaXRzICIweDEwIiBhbmQgIjB4MTAwMCIgd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2ZcbiAgICAgIFB5dGhvbi5cblxuICAgICAgT3RoZXIgYml0cyBpbiAiY29fZmxhZ3MiIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuXG4gICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAgICJjb19jb25zdHMiIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4gICAgICAiTm9uZSIgaWYgdW5kZWZpbmVkLlxuXG4gICBGcmFtZSBvYmplY3RzXG4gICAgICBGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW5cbiAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiZl9iYWNrIiBpcyB0byB0aGUgcHJldmlvdXMgc3RhY2tcbiAgICAgIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciAiTm9uZSIgaWYgdGhpcyBpcyB0aGUgYm90dG9tXG4gICAgICBzdGFjayBmcmFtZTsgImZfY29kZSIgaXMgdGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXNcbiAgICAgIGZyYW1lOyAiZl9sb2NhbHMiIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cCBsb2NhbFxuICAgICAgdmFyaWFibGVzOyAiZl9nbG9iYWxzIiBpcyB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzO1xuICAgICAgImZfYnVpbHRpbnMiIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOyAiZl9sYXN0aSJcbiAgICAgIGdpdmVzIHRoZSBwcmVjaXNlIGluc3RydWN0aW9uICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlXG4gICAgICBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS5cblxuICAgICAgU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzOiAiZl90cmFjZSIsIGlmIG5vdCAiTm9uZSIsIGlzIGFcbiAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzXG4gICAgICB1c2VkIGJ5IHRoZSBkZWJ1Z2dlcik7ICJmX2xpbmVubyIgaXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2ZcbiAgICAgIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHNcbiAgICAgIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSBkZWJ1Z2dlclxuICAgICAgY2FuIGltcGxlbWVudCBhIEp1bXAgY29tbWFuZCAoYWthIFNldCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZ1xuICAgICAgdG8gZl9saW5lbm8uXG5cbiAgICAgIEZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBmcmFtZS5jbGVhcigpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaGVsZCBieVxuICAgICAgICAgdGhlIGZyYW1lLiAgQWxzbywgaWYgdGhlIGZyYW1lIGJlbG9uZ2VkIHRvIGEgZ2VuZXJhdG9yLCB0aGVcbiAgICAgICAgIGdlbmVyYXRvciBpcyBmaW5hbGl6ZWQuICBUaGlzIGhlbHBzIGJyZWFrIHJlZmVyZW5jZSBjeWNsZXNcbiAgICAgICAgIGludm9sdmluZyBmcmFtZSBvYmplY3RzIChmb3IgZXhhbXBsZSB3aGVuIGNhdGNoaW5nIGFuXG4gICAgICAgICBleGNlcHRpb24gYW5kIHN0b3JpbmcgaXRzIHRyYWNlYmFjayBmb3IgbGF0ZXIgdXNlKS5cblxuICAgICAgICAgIlJ1bnRpbWVFcnJvciIgaXMgcmFpc2VkIGlmIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXG4gICAgICAgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbiAgIFRyYWNlYmFjayBvYmplY3RzXG4gICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICBBXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiB0aGVcbiAgICAgIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdW53aW5kcyB0aGUgZXhlY3V0aW9uIHN0YWNrLCBhdFxuICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZlxuICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyBlbnRlcmVkLFxuICAgICAgdGhlIHN0YWNrIHRyYWNlIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtLiAoU2VlIHNlY3Rpb25cbiAgICAgICpUaGUgdHJ5IHN0YXRlbWVudCouKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIHRoZSB0aGlyZCBpdGVtIG9mIHRoZVxuICAgICAgdHVwbGUgcmV0dXJuZWQgYnkgInN5cy5leGNfaW5mbygpIi4gV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBub1xuICAgICAgc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSBmb3JtYXR0ZWQpXG4gICAgICB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsXG4gICAgICBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzICJzeXMubGFzdF90cmFjZWJhY2siLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAidGJfbmV4dCIgaXMgdGhlIG5leHQgbGV2ZWwgaW4gdGhlXG4gICAgICBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCksIG9yXG4gICAgICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgInRiX2ZyYW1lIiBwb2ludHMgdG8gdGhlXG4gICAgICBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7ICJ0Yl9saW5lbm8iIGdpdmVzIHRoZSBsaW5lXG4gICAgICBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZDsgInRiX2xhc3RpIiBpbmRpY2F0ZXMgdGhlXG4gICAgICBwcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIGFuZCBsYXN0IGluc3RydWN0aW9uIGluXG4gICAgICB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lXG4gICAgICBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIG5vXG4gICAgICBtYXRjaGluZyBleGNlcHQgY2xhdXNlIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cblxuICAgU2xpY2Ugb2JqZWN0c1xuICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAiX19nZXRpdGVtX18oKSJcbiAgICAgIG1ldGhvZHMuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluICJzbGljZSgpIlxuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJzdGFydCIgaXMgdGhlIGxvd2VyIGJvdW5kOyAic3RvcCJcbiAgICAgIGlzIHRoZSB1cHBlciBib3VuZDsgInN0ZXAiIGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzICJOb25lIiBpZlxuICAgICAgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG5cbiAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBzbGljZS5pbmRpY2VzKHNlbGYsIGxlbmd0aClcblxuICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbiAgICAgICAgIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzbGljZSB0aGF0IHRoZSBzbGljZSBvYmplY3RcbiAgICAgICAgIHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiBpdGVtcy5cbiAgICAgICAgIEl0IHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZVxuICAgICAgICAgdGhlICpzdGFydCogYW5kICpzdG9wKiBpbmRpY2VzIGFuZCB0aGUgKnN0ZXAqIG9yIHN0cmlkZVxuICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzbGljZS4gTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlXG4gICAgICAgICBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcy5cblxuICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4gICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZFxuICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbiAgICAgIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljXG4gICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlXG4gICAgICBvYmplY3QgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHdyYXBwZWQgb2JqZWN0LCB3aGljaCBpcyBub3RcbiAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmVcbiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseVxuICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic3RhdGljbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuXG4gICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlclxuICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3RcbiAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZlxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsXG4gICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZFxuICAgICAgYnkgdGhlIGJ1aWx0LWluICJjbGFzc21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cbicsCi0gJ3R5cGVzZnVuY3Rpb25zJzogdSdcbkZ1bmN0aW9uc1xuKioqKioqKioqXG5cbkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seVxub3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICJmdW5jKGFyZ3VtZW50LWxpc3QpIi5cblxuVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiBmdW5jdGlvbnNcbmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbFxudGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZVxuZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cblxuU2VlICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAotICd0eXBlc21hcHBpbmcnOiB1J1xuTWFwcGluZyBUeXBlcyAtLS0gImRpY3QiXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqbWFwcGluZyogb2JqZWN0IG1hcHMgKmhhc2hhYmxlKiB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuXG5NYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkXG5tYXBwaW5nIHR5cGUsIHRoZSAqZGljdGlvbmFyeSouICAoRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdC1cbmluICJsaXN0IiwgInNldCIsIGFuZCAidHVwbGUiIGNsYXNzZXMsIGFuZCB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuKVxuXG5BIGRpY3Rpb25hcnlcJ3Mga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyB0aGF0IGFyZVxubm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCBkaWN0aW9uYXJpZXMgb3Jcbm90aGVyIG11dGFibGUgdHlwZXMgKHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXlcbnRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbFxuKHN1Y2ggYXMgIjEiIGFuZCAiMS4wIikgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleFxudGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgY29tcHV0ZXJzIHN0b3JlXG5mbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgdW53aXNlIHRvIHVzZVxudGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuXG5EaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mICJrZXk6XG52YWx1ZSIgcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6ICJ7XCdqYWNrXCc6IDQwOTgsIFwnc2pvZXJkXCc6XG40MTI3fSIgb3IgIns0MDk4OiBcJ2phY2tcJywgNDEyNzogXCdzam9lcmRcJ30iLCBvciBieSB0aGUgImRpY3QiXG5jb25zdHJ1Y3Rvci5cblxuY2xhc3MgY2xhc3MgZGljdCgqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChtYXBwaW5nLCAqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChpdGVyYWJsZSwgKiprd2FyZylcblxuICAgUmV0dXJuIGEgbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhbiBvcHRpb25hbCBwb3NpdGlvbmFsXG4gICBhcmd1bWVudCBhbmQgYSBwb3NzaWJseSBlbXB0eSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMuXG5cbiAgIElmIG5vIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4sIGFuIGVtcHR5IGRpY3Rpb25hcnkgaXMgY3JlYXRlZC5cbiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYVxuICAgZGljdGlvbmFyeSBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlIHBhaXJzIGFzIHRoZSBtYXBwaW5nXG4gICBvYmplY3QuICBPdGhlcndpc2UsIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gKml0ZXJhYmxlKlxuICAgb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoXG4gICBleGFjdGx5IHR3byBvYmplY3RzLiAgVGhlIGZpcnN0IG9iamVjdCBvZiBlYWNoIGl0ZW0gYmVjb21lcyBhIGtleVxuICAgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LCBhbmQgdGhlIHNlY29uZCBvYmplY3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAgIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXlcbiAgIGJlY29tZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LlxuXG4gICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXJcbiAgIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgY3JlYXRlZCBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC4gIElmIGEga2V5IGJlaW5nIGFkZGVkIGlzIGFscmVhZHkgcHJlc2VudCwgdGhlIHZhbHVlIGZyb21cbiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC5cblxuICAgVG8gaWxsdXN0cmF0ZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbFxuICAgdG8gInsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9IjpcblxuICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MylcbiAgICAgID4+PiBiID0ge1wnb25lXCc6IDEsIFwndHdvXCc6IDIsIFwndGhyZWVcJzogM31cbiAgICAgID4+PiBjID0gZGljdCh6aXAoW1wnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJ10sIFsxLCAyLCAzXSkpXG4gICAgICA+Pj4gZCA9IGRpY3QoWyhcJ3R3b1wnLCAyKSwgKFwnb25lXCcsIDEpLCAoXCd0aHJlZVwnLCAzKV0pXG4gICAgICA+Pj4gZSA9IGRpY3Qoe1wndGhyZWVcJzogMywgXCdvbmVcJzogMSwgXCd0d29cJzogMn0pXG4gICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlXG4gICAgICBUcnVlXG5cbiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvclxuICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzXG4gICBjYW4gYmUgdXNlZC5cblxuICAgVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25zIHRoYXQgZGljdGlvbmFyaWVzIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUsXG4gICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOlxuXG4gICBsZW4oZClcblxuICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRpY3Rpb25hcnkgKmQqLlxuXG4gICBkW2tleV1cblxuICAgICAgUmV0dXJuIHRoZSBpdGVtIG9mICpkKiB3aXRoIGtleSAqa2V5Ki4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWZcbiAgICAgICprZXkqIGlzIG5vdCBpbiB0aGUgbWFwLlxuXG4gICAgICBJZiBhIHN1YmNsYXNzIG9mIGRpY3QgZGVmaW5lcyBhIG1ldGhvZCAiX19taXNzaW5nX18oKSIgYW5kICprZXkqXG4gICAgICBpcyBub3QgcHJlc2VudCwgdGhlICJkW2tleV0iIG9wZXJhdGlvbiBjYWxscyB0aGF0IG1ldGhvZCB3aXRoXG4gICAgICB0aGUga2V5ICprZXkqIGFzIGFyZ3VtZW50LiAgVGhlICJkW2tleV0iIG9wZXJhdGlvbiB0aGVuIHJldHVybnNcbiAgICAgIG9yIHJhaXNlcyB3aGF0ZXZlciBpcyByZXR1cm5lZCBvciByYWlzZWQgYnkgdGhlXG4gICAgICAiX19taXNzaW5nX18oa2V5KSIgY2FsbC4gTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZVxuICAgICAgIl9fbWlzc2luZ19fKCkiLiBJZiAiX19taXNzaW5nX18oKSIgaXMgbm90IGRlZmluZWQsICJLZXlFcnJvciJcbiAgICAgIGlzIHJhaXNlZC4gIl9fbWlzc2luZ19fKCkiIG11c3QgYmUgYSBtZXRob2Q7IGl0IGNhbm5vdCBiZSBhblxuICAgICAgaW5zdGFuY2UgdmFyaWFibGU6XG5cbiAgICAgICAgID4+PiBjbGFzcyBDb3VudGVyKGRpY3QpOlxuICAgICAgICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbiAgICAgICAgIC4uLiAgICAgICAgIHJldHVybiAwXG4gICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKVxuICAgICAgICAgPj4+IGNbXCdyZWRcJ11cbiAgICAgICAgIDBcbiAgICAgICAgID4+PiBjW1wncmVkXCddICs9IDFcbiAgICAgICAgID4+PiBjW1wncmVkXCddXG4gICAgICAgICAxXG5cbiAgICAgIFRoZSBleGFtcGxlIGFib3ZlIHNob3dzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICAiY29sbGVjdGlvbnMuQ291bnRlciIuICBBIGRpZmZlcmVudCAiX19taXNzaW5nX18iIG1ldGhvZCBpcyB1c2VkXG4gICAgICBieSAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLlxuXG4gICBkW2tleV0gPSB2YWx1ZVxuXG4gICAgICBTZXQgImRba2V5XSIgdG8gKnZhbHVlKi5cblxuICAgZGVsIGRba2V5XVxuXG4gICAgICBSZW1vdmUgImRba2V5XSIgZnJvbSAqZCouICBSYWlzZXMgYSAiS2V5RXJyb3IiIGlmICprZXkqIGlzIG5vdFxuICAgICAgaW4gdGhlIG1hcC5cblxuICAga2V5IGluIGRcblxuICAgICAgUmV0dXJuICJUcnVlIiBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlICJGYWxzZSIuXG5cbiAgIGtleSBub3QgaW4gZFxuXG4gICAgICBFcXVpdmFsZW50IHRvICJub3Qga2V5IGluIGQiLlxuXG4gICBpdGVyKGQpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBhXG4gICAgICBzaG9ydGN1dCBmb3IgIml0ZXIoZC5rZXlzKCkpIi5cblxuICAgY2xlYXIoKVxuXG4gICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNvcHkoKVxuXG4gICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNsYXNzbWV0aG9kIGZyb21rZXlzKHNlcVssIHZhbHVlXSlcblxuICAgICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gKnNlcSogYW5kIHZhbHVlcyBzZXQgdG9cbiAgICAgICp2YWx1ZSouXG5cbiAgICAgICJmcm9ta2V5cygpIiBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS5cbiAgICAgICp2YWx1ZSogZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICBnZXQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlXG4gICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvICJOb25lIiwgc29cbiAgICAgIHRoYXQgdGhpcyBtZXRob2QgbmV2ZXIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBpdGVtcyAoIihrZXksIHZhbHVlKSJcbiAgICAgIHBhaXJzKS4gU2VlIHRoZSAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBrZXlzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIHBvcChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIHBvcGl0ZW0oKVxuXG4gICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgIihrZXksIHZhbHVlKSIgcGFpciBmcm9tIHRoZVxuICAgICAgZGljdGlvbmFyeS5cblxuICAgICAgInBvcGl0ZW0oKSIgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbiAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydFxuICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICpkZWZhdWx0KlxuICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICB1cGRhdGUoW290aGVyXSlcblxuICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICpvdGhlciosXG4gICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuICJOb25lIi5cblxuICAgICAgInVwZGF0ZSgpIiBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuXG4gICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciBpdGVyYWJsZXMgb2ZcbiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogImQudXBkYXRlKHJlZD0xLFxuICAgICAgYmx1ZT0yKSIuXG5cbiAgIHZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIERpY3Rpb25hcmllcyBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSAiKGtleSxcbiAgIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zIChcJzxcJywgXCc8PVwnLCBcJz49XCcsIFwnPlwnKSByYWlzZVxuICAgIlR5cGVFcnJvciIuXG5cblNlZSBhbHNvOiAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVhZC1vbmx5XG4gIHZpZXcgb2YgYSAiZGljdCIuXG5cblxuRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvYmplY3RzIHJldHVybmVkIGJ5ICJkaWN0LmtleXMoKSIsICJkaWN0LnZhbHVlcygpIiBhbmRcbiJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgdmlldyBvbiB0aGVcbmRpY3Rpb25hcnlcJ3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5IGNoYW5nZXMsXG50aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuXG5EaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSxcbmFuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG5cbmxlbihkaWN0dmlldylcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cblxuaXRlcihkaWN0dmlldylcblxuICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXNcbiAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXNcbiAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb25cbiAgIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBJZiBrZXlzLFxuICAgdmFsdWVzIGFuZCBpdGVtcyB2aWV3cyBhcmUgaXRlcmF0ZWQgb3ZlciB3aXRoIG5vIGludGVydmVuaW5nXG4gICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseVxuICAgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiAiKHZhbHVlLCBrZXkpIiBwYWlycyB1c2luZ1xuICAgInppcCgpIjogInBhaXJzID0gemlwKGQudmFsdWVzKCksIGQua2V5cygpKSIuICBBbm90aGVyIHdheSB0b1xuICAgY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgInBhaXJzID0gWyh2LCBrKSBmb3IgKGssIHYpIGluIGQuaXRlbXMoKV0iLlxuXG4gICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnlcbiAgIG1heSByYWlzZSBhICJSdW50aW1lRXJyb3IiIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzLlxuXG54IGluIGRpY3R2aWV3XG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgKngqIGlzIGluIHRoZSB1bmRlcmx5aW5nIGRpY3Rpb25hcnlcJ3Mga2V5cywgdmFsdWVzXG4gICBvciBpdGVtcyAoaW4gdGhlIGxhdHRlciBjYXNlLCAqeCogc2hvdWxkIGJlIGEgIihrZXksIHZhbHVlKSJcbiAgIHR1cGxlKS5cblxuS2V5cyB2aWV3cyBhcmUgc2V0LWxpa2Ugc2luY2UgdGhlaXIgZW50cmllcyBhcmUgdW5pcXVlIGFuZCBoYXNoYWJsZS5cbklmIGFsbCB2YWx1ZXMgYXJlIGhhc2hhYmxlLCBzbyB0aGF0ICIoa2V5LCB2YWx1ZSkiIHBhaXJzIGFyZSB1bmlxdWVcbmFuZCBoYXNoYWJsZSwgdGhlbiB0aGUgaXRlbXMgdmlldyBpcyBhbHNvIHNldC1saWtlLiAgKFZhbHVlcyB2aWV3cyBhcmVcbm5vdCB0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pXG5Gb3Igc2V0LWxpa2Ugdmlld3MsIGFsbCBvZiB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciB0aGUgYWJzdHJhY3RcbmJhc2UgY2xhc3MgImNvbGxlY3Rpb25zLmFiYy5TZXQiIGFyZSBhdmFpbGFibGUgKGZvciBleGFtcGxlLCAiPT0iLFxuIjwiLCBvciAiXiIpLlxuXG5BbiBleGFtcGxlIG9mIGRpY3Rpb25hcnkgdmlldyB1c2FnZTpcblxuICAgPj4+IGRpc2hlcyA9IHtcJ2VnZ3NcJzogMiwgXCdzYXVzYWdlXCc6IDEsIFwnYmFjb25cJzogMSwgXCdzcGFtXCc6IDUwMH1cbiAgID4+PiBrZXlzID0gZGlzaGVzLmtleXMoKVxuICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52YWx1ZXMoKVxuXG4gICA+Pj4gIyBpdGVyYXRpb25cbiAgID4+PiBuID0gMFxuICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuICAgLi4uICAgICBuICs9IHZhbFxuICAgPj4+IHByaW50KG4pXG4gICA1MDRcblxuICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lIG9yZGVyXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2F1c2FnZVwnLCBcJ3NwYW1cJ11cbiAgID4+PiBsaXN0KHZhbHVlcylcbiAgIFsyLCAxLCAxLCA1MDBdXG5cbiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbiAgID4+PiBkZWwgZGlzaGVzW1wnZWdnc1wnXVxuICAgPj4+IGRlbCBkaXNoZXNbXCdzYXVzYWdlXCddXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnc3BhbVwnLCBcJ2JhY29uXCddXG5cbiAgID4+PiAjIHNldCBvcGVyYXRpb25zXG4gICA+Pj4ga2V5cyAmIHtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhbGFkXCd9XG4gICB7XCdiYWNvblwnfVxuICAgPj4+IGtleXMgXiB7XCdzYXVzYWdlXCcsIFwnanVpY2VcJ31cbiAgIHtcJ2p1aWNlXCcsIFwnc2F1c2FnZVwnLCBcJ2JhY29uXCcsIFwnc3BhbVwnfVxuJywKLSAndHlwZXNtZXRob2RzJzogdSdcbk1ldGhvZHNcbioqKioqKipcblxuTWV0aG9kcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB1c2luZyB0aGUgYXR0cmlidXRlIG5vdGF0aW9uLlxuVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBidWlsdC1pbiBtZXRob2RzIChzdWNoIGFzICJhcHBlbmQoKSIgb24gbGlzdHMpXG5hbmQgY2xhc3MgaW5zdGFuY2UgbWV0aG9kcy4gIEJ1aWx0LWluIG1ldGhvZHMgYXJlIGRlc2NyaWJlZCB3aXRoIHRoZVxudHlwZXMgdGhhdCBzdXBwb3J0IHRoZW0uXG5cbklmIHlvdSBhY2Nlc3MgYSBtZXRob2QgKGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhIGNsYXNzIG5hbWVzcGFjZSlcbnRocm91Z2ggYW4gaW5zdGFuY2UsIHlvdSBnZXQgYSBzcGVjaWFsIG9iamVjdDogYSAqYm91bmQgbWV0aG9kKiAoYWxzb1xuY2FsbGVkICppbnN0YW5jZSBtZXRob2QqKSBvYmplY3QuIFdoZW4gY2FsbGVkLCBpdCB3aWxsIGFkZCB0aGUgInNlbGYiXG5hcmd1bWVudCB0byB0aGUgYXJndW1lbnQgbGlzdC4gIEJvdW5kIG1ldGhvZHMgaGF2ZSB0d28gc3BlY2lhbCByZWFkLVxub25seSBhdHRyaWJ1dGVzOiAibS5fX3NlbGZfXyIgaXMgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kXG5vcGVyYXRlcywgYW5kICJtLl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuXG5DYWxsaW5nICJtKGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiIGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0b1xuY2FsbGluZyAibS5fX2Z1bmNfXyhtLl9fc2VsZl9fLCBhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIi5cblxuTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBib3VuZCBtZXRob2Qgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcgYXJiaXRyYXJ5XG5hdHRyaWJ1dGVzLiAgSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5IHN0b3JlZCBvblxudGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0ICgibWV0aC5fX2Z1bmNfXyIpLCBzZXR0aW5nIG1ldGhvZFxuYXR0cmlidXRlcyBvbiBib3VuZCBtZXRob2RzIGlzIGRpc2FsbG93ZWQuICBBdHRlbXB0aW5nIHRvIHNldCBhblxuYXR0cmlidXRlIG9uIGEgbWV0aG9kIHJlc3VsdHMgaW4gYW4gIkF0dHJpYnV0ZUVycm9yIiBiZWluZyByYWlzZWQuICBJblxub3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlXG51bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdDpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIGRlZiBtZXRob2Qoc2VsZik6XG4gICAuLi4gICAgICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5tZXRob2Qud2hvYW1pID0gXCdteSBuYW1lIGlzIG1ldGhvZFwnICAjIGNhblwndCBzZXQgb24gdGhlIG1ldGhvZFxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgQXR0cmlidXRlRXJyb3I6IFwnbWV0aG9kXCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgXCd3aG9hbWlcJ1xuICAgPj4+IGMubWV0aG9kLl9fZnVuY19fLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJ1xuICAgPj4+IGMubWV0aG9kLndob2FtaVxuICAgXCdteSBuYW1lIGlzIG1ldGhvZFwnXG5cblNlZSAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCi0gJ3R5cGVzbW9kdWxlcyc6IHUnXG5Nb2R1bGVzXG4qKioqKioqXG5cblRoZSBvbmx5IHNwZWNpYWwgb3BlcmF0aW9uIG9uIGEgbW9kdWxlIGlzIGF0dHJpYnV0ZSBhY2Nlc3M6ICJtLm5hbWUiLFxud2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWQgaW4gKm0qXCdzXG5zeW1ib2wgdGFibGUuIE1vZHVsZSBhdHRyaWJ1dGVzIGNhbiBiZSBhc3NpZ25lZCB0by4gIChOb3RlIHRoYXQgdGhlXG4iaW1wb3J0IiBzdGF0ZW1lbnQgaXMgbm90LCBzdHJpY3RseSBzcGVha2luZywgYW4gb3BlcmF0aW9uIG9uIGEgbW9kdWxlXG5vYmplY3Q7ICJpbXBvcnQgZm9vIiBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdCBuYW1lZCAqZm9vKiB0b1xuZXhpc3QsIHJhdGhlciBpdCByZXF1aXJlcyBhbiAoZXh0ZXJuYWwpICpkZWZpbml0aW9uKiBmb3IgYSBtb2R1bGVcbm5hbWVkICpmb28qIHNvbWV3aGVyZS4pXG5cbkEgc3BlY2lhbCBhdHRyaWJ1dGUgb2YgZXZlcnkgbW9kdWxlIGlzICJfX2RpY3RfXyIuIFRoaXMgaXMgdGhlXG5kaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZHVsZVwncyBzeW1ib2wgdGFibGUuIE1vZGlmeWluZyB0aGlzXG5kaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGVcJ3Mgc3ltYm9sIHRhYmxlLCBidXQgZGlyZWN0XG5hc3NpZ25tZW50IHRvIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW4gd3JpdGVcbiJtLl9fZGljdF9fW1wnYVwnXSA9IDEiLCB3aGljaCBkZWZpbmVzICJtLmEiIHRvIGJlICIxIiwgYnV0IHlvdSBjYW5cJ3RcbndyaXRlICJtLl9fZGljdF9fID0ge30iKS4gIE1vZGlmeWluZyAiX19kaWN0X18iIGRpcmVjdGx5IGlzIG5vdFxucmVjb21tZW5kZWQuXG5cbk1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPG1vZHVsZVxuXCdzeXNcJyAoYnVpbHQtaW4pPiIuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXNcbiI8bW9kdWxlIFwnb3NcJyBmcm9tIFwnL3Vzci9sb2NhbC9saWIvcHl0aG9uWC5ZL29zLnB5Y1wnPiIuXG4nLAotICd0eXBlc3NlcSc6IHUnXG5TZXF1ZW5jZSBUeXBlcyAtLS0gImxpc3QiLCAidHVwbGUiLCAicmFuZ2UiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSB0aHJlZSBiYXNpYyBzZXF1ZW5jZSB0eXBlczogbGlzdHMsIHR1cGxlcywgYW5kIHJhbmdlXG5vYmplY3RzLiBBZGRpdGlvbmFsIHNlcXVlbmNlIHR5cGVzIHRhaWxvcmVkIGZvciBwcm9jZXNzaW5nIG9mICpiaW5hcnlcbmRhdGEqIGFuZCAqdGV4dCBzdHJpbmdzKiBhcmUgZGVzY3JpYmVkIGluIGRlZGljYXRlZCBzZWN0aW9ucy5cblxuXG5Db21tb24gU2VxdWVuY2UgT3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgc3VwcG9ydGVkIGJ5IG1vc3Qgc2VxdWVuY2VcbnR5cGVzLCBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZS4gVGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQ1xuaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zXG5vbiBjdXN0b20gc2VxdWVuY2UgdHlwZXMuXG5cblRoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyBwcmlvcml0eS5cbkluIHRoZSB0YWJsZSwgKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLCAqbiosICppKixcbipqKiBhbmQgKmsqIGFyZSBpbnRlZ2VycyBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnlcbnR5cGUgYW5kIHZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKi5cblxuVGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzIHRoZVxuY29tcGFyaXNvbiBvcGVyYXRpb25zLiBUaGUgIisiIChjb25jYXRlbmF0aW9uKSBhbmQgIioiIChyZXBldGl0aW9uKVxub3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWNcbm9wZXJhdGlvbnMuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PStcbnwgInggaW4gcyIgICAgICAgICAgICAgICAgICAgfCAiVHJ1ZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiRmFsc2UiICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInggbm90IGluIHMiICAgICAgICAgICAgICAgfCAiRmFsc2UiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiVHJ1ZSIgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMgKyB0IiAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqcyogYW5kICp0KiB8ICg2KSg3KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzICogbiIgb3IgIm4gKiBzIiAgICAgICAgIHwgZXF1aXZhbGVudCB0byBhZGRpbmcgKnMqIHRvICAgICAgfCAoMikoNykgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdHNlbGYgKm4qIHRpbWVzICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2ldIiAgICAgICAgICAgICAgICAgICAgIHwgKmkqdGggaXRlbSBvZiAqcyosIG9yaWdpbiAwICAgICAgfCAoMykgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg1KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgImxlbihzKSIgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgKnMqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJtaW4ocykiICAgICAgICAgICAgICAgICAgIHwgc21hbGxlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibWF4KHMpIiAgICAgICAgICAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMuaW5kZXgoeFssIGlbLCBqXV0pIiAgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB8ICg4KSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogKGF0IG9yIGFmdGVyIGluZGV4ICAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKmkqIGFuZCBiZWZvcmUgaW5kZXggKmoqKSAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicy5jb3VudCh4KSIgICAgICAgICAgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuXG5TZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSBhbHNvIHN1cHBvcnQgY29tcGFyaXNvbnMuICBJbiBwYXJ0aWN1bGFyLFxudHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgY29tcGFyaW5nXG5jb3JyZXNwb25kaW5nIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZXZlcnlcbmVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG50eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluXG50aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlLilcblxuTm90ZXM6XG5cbjEuIFdoaWxlIHRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yIHNpbXBsZVxuICAgY29udGFpbm1lbnQgdGVzdGluZyBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBzb21lIHNwZWNpYWxpc2VkIHNlcXVlbmNlc1xuICAgKHN1Y2ggYXMgInN0ciIsICJieXRlcyIgYW5kICJieXRlYXJyYXkiKSBhbHNvIHVzZSB0aGVtIGZvclxuICAgc3Vic2VxdWVuY2UgdGVzdGluZzpcblxuICAgICAgPj4+ICJnZyIgaW4gImVnZ3MiXG4gICAgICBUcnVlXG5cbjIuIFZhbHVlcyBvZiAqbiogbGVzcyB0aGFuICIwIiBhcmUgdHJlYXRlZCBhcyAiMCIgKHdoaWNoIHlpZWxkcyBhblxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSB0aGF0IGl0ZW1zIGluIHRoZVxuICAgc2VxdWVuY2UgKnMqIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlIHRpbWVzLlxuICAgVGhpcyBvZnRlbiBoYXVudHMgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXV0gKiAzXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbXSwgW10sIFtdXVxuICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuICAgICAgPj4+IGxpc3RzXG4gICAgICBbWzNdLCBbM10sIFszXV1cblxuICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCAiW1tdXSIgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiAiW1tdXSAqIDMiIGFyZSByZWZlcmVuY2VzXG4gICB0byB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbiAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mXG4gICBkaWZmZXJlbnQgbGlzdHMgdGhpcyB3YXk6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV1cbiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgICAgID4+PiBsaXN0c1sxXS5hcHBlbmQoNSlcbiAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNylcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1szXSwgWzVdLCBbN11dXG5cbiAgIEZ1cnRoZXIgZXhwbGFuYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBGQVEgZW50cnkgKkhvdyBkbyBJIGNyZWF0ZVxuICAgYSBtdWx0aWRpbWVuc2lvbmFsIGxpc3Q/Ki5cblxuMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2ZcbiAgIHRoZSBzdHJpbmc6ICJsZW4ocykgKyBpIiBvciAibGVuKHMpICsgaiIgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZVxuICAgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi5cblxuNC4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgZGVmaW5lZCBhcyB0aGUgc2VxdWVuY2Ugb2ZcbiAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuICBJZiAqaSogb3IgKmoqIGlzXG4gICBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpcyBvbWl0dGVkIG9yICJOb25lIixcbiAgIHVzZSAiMCIuICBJZiAqaiogaXMgb21pdHRlZCBvciAiTm9uZSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpc1xuICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzIGVtcHR5LlxuXG41LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiB3aXRoIHN0ZXAgKmsqIGlzIGRlZmluZWQgYXMgdGhlXG4gICBzZXF1ZW5jZSBvZiBpdGVtcyB3aXRoIGluZGV4ICAieCA9IGkgKyBuKmsiIHN1Y2ggdGhhdCAiMCA8PSBuIDxcbiAgIChqLWkpL2siLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSAiaSIsICJpK2siLCAiaSsyKmsiLFxuICAgImkrMyprIiBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4gKmoqIGlzIHJlYWNoZWQgKGJ1dCBuZXZlclxuICAgaW5jbHVkaW5nICpqKikuICBJZiAqaSogb3IgKmoqIGlzIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlXG4gICAibGVuKHMpIi4gIElmICppKiBvciAqaiogYXJlIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGV5IGJlY29tZSAiZW5kIlxuICAgdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbiB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqIGNhbm5vdCBiZVxuICAgemVyby4gSWYgKmsqIGlzICJOb25lIiwgaXQgaXMgdHJlYXRlZCBsaWtlICIxIi5cblxuNi4gQ29uY2F0ZW5hdGluZyBpbW11dGFibGUgc2VxdWVuY2VzIGFsd2F5cyByZXN1bHRzIGluIGEgbmV3XG4gICBvYmplY3QuIFRoaXMgbWVhbnMgdGhhdCBidWlsZGluZyB1cCBhIHNlcXVlbmNlIGJ5IHJlcGVhdGVkXG4gICBjb25jYXRlbmF0aW9uIHdpbGwgaGF2ZSBhIHF1YWRyYXRpYyBydW50aW1lIGNvc3QgaW4gdGhlIHRvdGFsXG4gICBzZXF1ZW5jZSBsZW5ndGguIFRvIGdldCBhIGxpbmVhciBydW50aW1lIGNvc3QsIHlvdSBtdXN0IHN3aXRjaCB0b1xuICAgb25lIG9mIHRoZSBhbHRlcm5hdGl2ZXMgYmVsb3c6XG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAic3RyIiBvYmplY3RzLCB5b3UgY2FuIGJ1aWxkIGEgbGlzdCBhbmQgdXNlXG4gICAgICJzdHIuam9pbigpIiBhdCB0aGUgZW5kIG9yIGVsc2Ugd3JpdGUgdG8gYW4gImlvLlN0cmluZ0lPIlxuICAgICBpbnN0YW5jZSBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGVcblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJieXRlcyIgb2JqZWN0cywgeW91IGNhbiBzaW1pbGFybHkgdXNlXG4gICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZVxuICAgICBjb25jYXRlbmF0aW9uIHdpdGggYSAiYnl0ZWFycmF5IiBvYmplY3QuICAiYnl0ZWFycmF5IiBvYmplY3RzIGFyZVxuICAgICBtdXRhYmxlIGFuZCBoYXZlIGFuIGVmZmljaWVudCBvdmVyYWxsb2NhdGlvbiBtZWNoYW5pc21cblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWRcblxuICAgKiBmb3Igb3RoZXIgdHlwZXMsIGludmVzdGlnYXRlIHRoZSByZWxldmFudCBjbGFzcyBkb2N1bWVudGF0aW9uXG5cbjcuIFNvbWUgc2VxdWVuY2UgdHlwZXMgKHN1Y2ggYXMgInJhbmdlIikgb25seSBzdXBwb3J0IGl0ZW1cbiAgIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvblwndCBzdXBwb3J0XG4gICBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG5cbjguICJpbmRleCIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuXG4gICBzdXBwb3J0ZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgaW5kZXggbWV0aG9kIGFsbG93XG4gICBlZmZpY2llbnQgc2VhcmNoaW5nIG9mIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZS4gUGFzc2luZyB0aGVcbiAgIGV4dHJhIGFyZ3VtZW50cyBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdXNpbmcgInNbaTpqXS5pbmRleCh4KSIsXG4gICBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUgcmV0dXJuZWQgaW5kZXggYmVpbmdcbiAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZVxuICAgc2xpY2UuXG5cblxuSW1tdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9ubHkgb3BlcmF0aW9uIHRoYXQgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGdlbmVyYWxseSBpbXBsZW1lbnRcbnRoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyBzdXBwb3J0IGZvclxudGhlICJoYXNoKCkiIGJ1aWx0LWluLlxuXG5UaGlzIHN1cHBvcnQgYWxsb3dzIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHN1Y2ggYXMgInR1cGxlIiBpbnN0YW5jZXMsIHRvXG5iZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiIGluc3RhbmNlcy5cblxuQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHVuaGFzaGFibGVcbnZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMuIFRoZSAiY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSIgQUJDIGlzIHByb3ZpZGVkIHRvIG1ha2Vcbml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlXG50eXBlcy5cblxuSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueVxuaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSB0eXBlIGFuZFxudmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgb25seVxuYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICJzIiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0IHBhcnQgdGhlIHNhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzIGNvbnRlbnRzICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qIHRpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqIChzYW1lIGFzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSB4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG5cbjIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG4zLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG5cbjQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzXG4gICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkXG4gICBzZXF1ZW5jZS5cblxuNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4gICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvblwndCBzdXBwb3J0IHNsaWNpbmdcbiAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcblxuICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG5cbjYuIFRoZSB2YWx1ZSAqbiogaXMgYW4gaW50ZWdlciwgb3IgYW4gb2JqZWN0IGltcGxlbWVudGluZ1xuICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLlxuICAgSXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlXG4gICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyICpDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucyouXG5cblxuTGlzdHNcbj09PT09XG5cbkxpc3RzIGFyZSBtdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2ZcbmhvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsIHZhcnkgYnlcbmFwcGxpY2F0aW9uKS5cblxuY2xhc3MgY2xhc3MgbGlzdChbaXRlcmFibGVdKVxuXG4gICBMaXN0cyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gc2V2ZXJhbCB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMgdG8gZGVub3RlIHRoZSBlbXB0eSBsaXN0OiAiW10iXG5cbiAgICogVXNpbmcgc3F1YXJlIGJyYWNrZXRzLCBzZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiAiW2FdIixcbiAgICAgIlthLCBiLCBjXSJcblxuICAgKiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbjogIlt4IGZvciB4IGluIGl0ZXJhYmxlXSJcblxuICAgKiBVc2luZyB0aGUgdHlwZSBjb25zdHJ1Y3RvcjogImxpc3QoKSIgb3IgImxpc3QoaXRlcmFibGUpIlxuXG4gICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIGxpc3QsIGEgY29weSBpcyBtYWRlIGFuZFxuICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICJsaXN0KFwnYWJjXCcpIlxuICAgcmV0dXJucyAiW1wnYVwnLCBcJ2JcJywgXCdjXCddIiBhbmQgImxpc3QoICgxLCAyLCAzKSApIiByZXR1cm5zICJbMSwgMixcbiAgIDNdIi4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5XG4gICBsaXN0LCAiW10iLlxuXG4gICBNYW55IG90aGVyIG9wZXJhdGlvbnMgYWxzbyBwcm9kdWNlIGxpc3RzLCBpbmNsdWRpbmcgdGhlICJzb3J0ZWQoKSJcbiAgIGJ1aWx0LWluLlxuXG4gICBMaXN0cyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBhbmQgKm11dGFibGUqIHNlcXVlbmNlXG4gICBvcGVyYXRpb25zLiBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDpcblxuICAgc29ydCgqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1Ob25lKVxuXG4gICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgY29tcGFyaXNvbnNcbiAgICAgIGJldHdlZW4gaXRlbXMuIEV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIC0gaWYgYW55IGNvbXBhcmlzb25cbiAgICAgIG9wZXJhdGlvbnMgZmFpbCwgdGhlIGVudGlyZSBzb3J0IG9wZXJhdGlvbiB3aWxsIGZhaWwgKGFuZCB0aGVcbiAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuXG5cbiAgICAgICJzb3J0KCkiIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyB0aGF0IGNhbiBvbmx5IGJlIHBhc3NlZCBieVxuICAgICAga2V5d29yZCAoKmtleXdvcmQtb25seSBhcmd1bWVudHMqKTpcblxuICAgICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0b1xuICAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQgKGZvciBleGFtcGxlLFxuICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdFxuICAgICAgaXMgY2FsY3VsYXRlZCBvbmNlIGFuZCB0aGVuIHVzZWQgZm9yIHRoZSBlbnRpcmUgc29ydGluZyBwcm9jZXNzLlxuICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgIk5vbmUiIG1lYW5zIHRoYXQgbGlzdCBpdGVtcyBhcmUgc29ydGVkXG4gICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLlxuXG4gICAgICBUaGUgImZ1bmN0b29scy5jbXBfdG9fa2V5KCkiIHV0aWxpdHkgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgYVxuICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uXG5cbiAgICAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gIlRydWUiLCB0aGVuIHRoZSBsaXN0XG4gICAgICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICAgICBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkgb2Ygc3BhY2VcbiAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgb3BlcmF0ZXNcbiAgICAgIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHNvcnRlZCBzZXF1ZW5jZSAodXNlXG4gICAgICAic29ydGVkKCkiIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIG5ldyBzb3J0ZWQgbGlzdCBpbnN0YW5jZSkuXG5cbiAgICAgIFRoZSAic29ydCgpIiBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBBIHNvcnQgaXNcbiAgICAgIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyIG9mXG4gICAgICBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bCBmb3Igc29ydGluZyBpblxuICAgICAgbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LCB0aGVuIGJ5IHNhbGFyeVxuICAgICAgZ3JhZGUpLlxuXG4gICAgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSBsaXN0IGlzXG4gICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgYXBwZWFyXG4gICAgICBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzICJWYWx1ZUVycm9yIiBpZiBpdCBjYW4gZGV0ZWN0XG4gICAgICB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cblxuXG5UdXBsZXNcbj09PT09PVxuXG5UdXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mXG5oZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAiZW51bWVyYXRlKCkiXG5idWlsdC1pbikuIFR1cGxlcyBhcmUgYWxzbyB1c2VkIGZvciBjYXNlcyB3aGVyZSBhbiBpbW11dGFibGUgc2VxdWVuY2Vcbm9mIGhvbW9nZW5lb3VzIGRhdGEgaXMgbmVlZGVkIChzdWNoIGFzIGFsbG93aW5nIHN0b3JhZ2UgaW4gYSAic2V0IiBvclxuImRpY3QiIGluc3RhbmNlKS5cblxuY2xhc3MgY2xhc3MgdHVwbGUoW2l0ZXJhYmxlXSlcblxuICAgVHVwbGVzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBhIG51bWJlciBvZiB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAiKCkiXG5cbiAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgIihhLCkiXG5cbiAgICogU2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogImEsIGIsIGMiIG9yICIoYSwgYiwgYykiXG5cbiAgICogVXNpbmcgdGhlICJ0dXBsZSgpIiBidWlsdC1pbjogInR1cGxlKCkiIG9yICJ0dXBsZShpdGVyYWJsZSkiXG5cbiAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSB0dXBsZSB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIHR1cGxlLCBpdCBpcyByZXR1cm5lZFxuICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKFwnYWJjXCcpIiByZXR1cm5zICIoXCdhXCcsIFwnYlwnLCBcJ2NcJykiXG4gICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgaXNcbiAgIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSB0dXBsZSwgIigpIi5cblxuICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgdGhlXG4gICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSBlbXB0eVxuICAgdHVwbGUgY2FzZSwgb3Igd2hlbiB0aGV5IGFyZSBuZWVkZWQgdG8gYXZvaWQgc3ludGFjdGljIGFtYmlndWl0eS5cbiAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgYXJndW1lbnRzLFxuICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSBzb2xlXG4gICBhcmd1bWVudC5cblxuICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG5cbkZvciBoZXRlcm9nZW5lb3VzIGNvbGxlY3Rpb25zIG9mIGRhdGEgd2hlcmUgYWNjZXNzIGJ5IG5hbWUgaXMgY2xlYXJlclxudGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmVcbmFwcHJvcHJpYXRlIGNob2ljZSB0aGFuIGEgc2ltcGxlIHR1cGxlIG9iamVjdC5cblxuXG5SYW5nZXNcbj09PT09PVxuXG5UaGUgInJhbmdlIiB0eXBlIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIG51bWJlcnMgYW5kIGlzXG5jb21tb25seSB1c2VkIGZvciBsb29waW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzIGluICJmb3IiIGxvb3BzLlxuXG5jbGFzcyBjbGFzcyByYW5nZShzdG9wKVxuY2xhc3MgY2xhc3MgcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcblxuICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAoZWl0aGVyXG4gICBidWlsdC1pbiAiaW50IiBvciBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgIl9faW5kZXhfXyJcbiAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG9cbiAgICIxIi4gSWYgdGhlICpzdGFydCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIjAiLiBJZlxuICAgKnN0ZXAqIGlzIHplcm8sICJWYWx1ZUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIEZvciBhIHBvc2l0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIGEgcmFuZ2UgInIiIGFyZSBkZXRlcm1pbmVkXG4gICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgInJbaV0gPFxuICAgc3RvcCIuXG5cbiAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGxcbiAgIGRldGVybWluZWQgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIsIGJ1dCB0aGVcbiAgIGNvbnN0cmFpbnRzIGFyZSAiaSA+PSAwIiBhbmQgInJbaV0gPiBzdG9wIi5cblxuICAgQSByYW5nZSBvYmplY3Qgd2lsbCBiZSBlbXB0eSBpZiAiclswXSIgZG9lcyBub3QgbWVldCB0aGUgdmFsdWVcbiAgIGNvbnN0cmFpbnQuIFJhbmdlcyBkbyBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMsIGJ1dCB0aGVzZSBhcmVcbiAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgZGV0ZXJtaW5lZCBieVxuICAgdGhlIHBvc2l0aXZlIGluZGljZXMuXG5cbiAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFyZVxuICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZVxuICAgIk92ZXJmbG93RXJyb3IiLlxuXG4gICBSYW5nZSBleGFtcGxlczpcblxuICAgICAgPj4+IGxpc3QocmFuZ2UoMTApKVxuICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAxMSkpXG4gICAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpXG4gICAgICBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAxMCwgMykpXG4gICAgICBbMCwgMywgNiwgOV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIC0xMCwgLTEpKVxuICAgICAgWzAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCwgLTldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwKSlcbiAgICAgIFtdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAwKSlcbiAgICAgIFtdXG5cbiAgIFJhbmdlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zIGV4Y2VwdFxuICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2Ugb2JqZWN0c1xuICAgY2FuIG9ubHkgcmVwcmVzZW50IHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBhIHN0cmljdCBwYXR0ZXJuIGFuZFxuICAgcmVwZXRpdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiB3aWxsIHVzdWFsbHkgdmlvbGF0ZSB0aGF0IHBhdHRlcm4pLlxuXG4gICBzdGFydFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGFydCogcGFyYW1ldGVyIChvciAiMCIgaWYgdGhlIHBhcmFtZXRlciB3YXNcbiAgICAgIG5vdCBzdXBwbGllZClcblxuICAgc3RvcFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdG9wKiBwYXJhbWV0ZXJcblxuICAgc3RlcFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGVwKiBwYXJhbWV0ZXIgKG9yICIxIiBpZiB0aGUgcGFyYW1ldGVyIHdhc1xuICAgICAgbm90IHN1cHBsaWVkKVxuXG5UaGUgYWR2YW50YWdlIG9mIHRoZSAicmFuZ2UiIHR5cGUgb3ZlciBhIHJlZ3VsYXIgImxpc3QiIG9yICJ0dXBsZSIgaXNcbnRoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50IG9mXG5tZW1vcnksIG5vIG1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cyAoYXMgaXQgb25seVxuc3RvcmVzIHRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiB2YWx1ZXMsIGNhbGN1bGF0aW5nIGluZGl2aWR1YWxcbml0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS5cblxuUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kXG5wcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggbG9va3VwLFxuc2xpY2luZyBhbmQgc3VwcG9ydCBmb3IgbmVnYXRpdmUgaW5kaWNlcyAoc2VlICpTZXF1ZW5jZSBUeXBlcyAtLS1cbmxpc3QsIHR1cGxlLCByYW5nZSopOlxuXG4+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKVxuPj4+IHJcbnJhbmdlKDAsIDIwLCAyKVxuPj4+IDExIGluIHJcbkZhbHNlXG4+Pj4gMTAgaW4gclxuVHJ1ZVxuPj4+IHIuaW5kZXgoMTApXG41XG4+Pj4gcls1XVxuMTBcbj4+PiByWzo1XVxucmFuZ2UoMCwgMTAsIDIpXG4+Pj4gclstMV1cbjE4XG5cblRlc3RpbmcgcmFuZ2Ugb2JqZWN0cyBmb3IgZXF1YWxpdHkgd2l0aCAiPT0iIGFuZCAiIT0iIGNvbXBhcmVzIHRoZW0gYXNcbnNlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXlcbnJlcHJlc2VudCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiB2YWx1ZXMuICAoTm90ZSB0aGF0IHR3byByYW5nZSBvYmplY3RzXG50aGF0IGNvbXBhcmUgZXF1YWwgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCJcbmF0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgInJhbmdlKDAsIDMsXG4yKSA9PSByYW5nZSgwLCA0LCAyKSIuKVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCBzbGljaW5nXG5hbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluIGNvbnN0YW50XG50aW1lIGluc3RlYWQgb2YgaXRlcmF0aW5nIHRocm91Z2ggYWxsIGl0ZW1zLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUgXCc9PVwnIGFuZCBcJyE9XCcgdG8gY29tcGFyZSByYW5nZSBvYmplY3RzXG5iYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mIGNvbXBhcmluZ1xuYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5KS5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcy5cbicsCi0gJ3R5cGVzc2VxLW11dGFibGUnOiB1J1xuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlXG5pdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZVxudHlwZXMuXG5cbkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnlcbml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmRcbnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHlcbmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gW10iICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTpqOmtdIiBmcm9tIHRoZSBsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9IFt4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAiZGVsIHNbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY29weSgpIiAgICAgICAgICAgICAgICAgICAgIHwgY3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAic1s6XSIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicyAqPSBuIiAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGVzICpzKiB3aXRoIGl0cyBjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCB0aGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTppXSA9IFt4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnBvcChbaV0pIiAgICAgICAgICAgICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gKnMqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0geCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLlxuXG4yLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLlxuXG40LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2Vyc1xuICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSByZXZlcnNlZFxuICAgc2VxdWVuY2UuXG5cbjUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZVxuICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nXG4gICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuXG42LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbiAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSBzZXF1ZW5jZS5cbiAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZVxuICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciAqQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnMqLlxuJywKLSAndW5hcnknOiB1J1xuVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OlxuXG4gICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG5cblRoZSB1bmFyeSAiLSIgKG1pbnVzKSBvcGVyYXRvciB5aWVsZHMgdGhlIG5lZ2F0aW9uIG9mIGl0cyBudW1lcmljXG5hcmd1bWVudC5cblxuVGhlIHVuYXJ5ICIrIiAocGx1cykgb3BlcmF0b3IgeWllbGRzIGl0cyBudW1lcmljIGFyZ3VtZW50IHVuY2hhbmdlZC5cblxuVGhlIHVuYXJ5ICJ+IiAoaW52ZXJ0KSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGl0c1xuaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy5cblxuSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsIGFcbiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAotICd3aGlsZSc6IHUnXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKLSAnd2l0aCc6IHUnXG5UaGUgIndpdGgiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxudXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuXG4gICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbiAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG5cblRoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cblxuMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cblxuICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlXG4gICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmdcbiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cblxuNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuXG42LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsIHRocmVlXG4gICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLlxuICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmRcbiAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4gICBzdGF0ZW1lbnQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGVcbiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzogKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cbicsCi0gJ3lpZWxkJzogdSdcblRoZSAieWllbGQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHlpZWxkX3N0bXQgOjo9IHlpZWxkX2V4cHJlc3Npb25cblxuQSAieWllbGQiIHN0YXRlbWVudCBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBhICp5aWVsZFxuZXhwcmVzc2lvbiouIFRoZSB5aWVsZCBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gb21pdCB0aGUgcGFyZW50aGVzZXNcbnRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlcXVpcmVkIGluIHRoZSBlcXVpdmFsZW50IHlpZWxkIGV4cHJlc3Npb25cbnN0YXRlbWVudC4gRm9yIGV4YW1wbGUsIHRoZSB5aWVsZCBzdGF0ZW1lbnRzXG5cbiAgIHlpZWxkIDxleHByPlxuICAgeWllbGQgZnJvbSA8ZXhwcj5cblxuYXJlIGVxdWl2YWxlbnQgdG8gdGhlIHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50c1xuXG4gICAoeWllbGQgPGV4cHI+KVxuICAgKHlpZWxkIGZyb20gPGV4cHI+KVxuXG5ZaWVsZCBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYVxuKmdlbmVyYXRvciogZnVuY3Rpb24sIGFuZCBhcmUgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3JcbmZ1bmN0aW9uLiAgVXNpbmcgeWllbGQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8gY2F1c2VcbnRoYXQgZGVmaW5pdGlvbiB0byBjcmVhdGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIG5vcm1hbFxuZnVuY3Rpb24uXG5cbkZvciBmdWxsIGRldGFpbHMgb2YgInlpZWxkIiBzZW1hbnRpY3MsIHJlZmVyIHRvIHRoZSAqWWllbGRcbmV4cHJlc3Npb25zKiBzZWN0aW9uLlxuJ30KKyMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gTW9uIEF1ZyAxNSAxNjoxMToyMCAyMDE2Cit0b3BpY3MgPSB7J2Fzc2VydCc6ICdcbicKKyAgICAgICAgICAgJ1RoZSAiYXNzZXJ0IiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQXNzZXJ0IHN0YXRlbWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0IGRlYnVnZ2luZyAnCisgICAgICAgICAgICdhc3NlcnRpb25zXG4nCisgICAgICAgICAgICdpbnRvIGEgcHJvZ3JhbTpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgYXNzZXJ0X3N0bXQgOjo9ICJhc3NlcnQiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgc2ltcGxlIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbiIsIGlzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaWYgX19kZWJ1Z19fOlxuJworICAgICAgICAgICAnICAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyAnCisgICAgICAgICAgICdlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGlmIF9fZGVidWdfXzpcbicKKyAgICAgICAgICAgJyAgICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgIl9fZGVidWdfXyIgYW5kICJBc3NlcnRpb25FcnJvciIgJworICAgICAgICAgICAncmVmZXJcbicKKyAgICAgICAgICAgJ3RvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG4nCisgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlICJfX2RlYnVnX18iIGlzICJUcnVlIiB1bmRlclxuJworICAgICAgICAgICAnbm9ybWFsIGNpcmN1bXN0YW5jZXMsICJGYWxzZSIgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkICcKKyAgICAgICAgICAgJyhjb21tYW5kXG4nCisgICAgICAgICAgICdsaW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlIGZvciBhblxuJworICAgICAgICAgICAnYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZSB0aW1lLiAgJworICAgICAgICAgICAnTm90ZVxuJworICAgICAgICAgICAndGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlICcKKyAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgJ3RoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBwYXJ0IG9mICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnc3RhY2sgdHJhY2UuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0Fzc2lnbm1lbnRzIHRvICJfX2RlYnVnX18iIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgJworICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKKyAnYXNzaWdubWVudCc6ICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCAnCisgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICdtb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudF9zdG10IDo6PSAodGFyZ2V0X2xpc3QgIj0iKSsgKHN0YXJyZWRfZXhwcmVzc2lvbiAnCisgICAgICAgICAgICAgICAnfCB5aWVsZF9leHByZXNzaW9uKVxuJworICAgICAgICAgICAgICAgJyAgIHRhcmdldF9saXN0ICAgICA6Oj0gdGFyZ2V0ICgiLCIgdGFyZ2V0KSogWyIsIl1cbicKKyAgICAgICAgICAgICAgICcgICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgIigiIFt0YXJnZXRfbGlzdF0gIikiXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8ICJbIiBbdGFyZ2V0X2xpc3RdICJdIlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8IHNsaWNpbmdcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgIioiIHRhcmdldFxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyhTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yICcKKyAgICAgICAgICAgICAgICcqYXR0cmlidXRlcmVmKixcbicKKyAgICAgICAgICAgICAgICcqc3Vic2NyaXB0aW9uKiwgYW5kICpzbGljaW5nKi4pXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgJworICAgICAgICAgICAgICAgJyhyZW1lbWJlciB0aGF0XG4nCisgICAgICAgICAgICAgICAndGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgJworICAgICAgICAgICAgICAgJ2xhdHRlclxuJworICAgICAgICAgICAgICAgJ3lpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byAnCisgICAgICAgICAgICAgICAnZWFjaCBvZlxuJworICAgICAgICAgICAgICAgJ3RoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gJworICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSwgc3Vic2NyaXB0aW9uIG9yIHNsaWNpbmcpLCB0aGUgbXV0YWJsZSBvYmplY3QgbXVzdFxuJworICAgICAgICAgICAgICAgJ3VsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyAnCisgICAgICAgICAgICAgICAndmFsaWRpdHksIGFuZFxuJworICAgICAgICAgICAgICAgJ21heSByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGFzc2lnbm1lbnQgaXMgdW5hY2NlcHRhYmxlLiAgVGhlICcKKyAgICAgICAgICAgICAgICdydWxlc1xuJworICAgICAgICAgICAgICAgJ29ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gJworICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZVxuJworICAgICAgICAgICAgICAgJ2hpZXJhcmNoeSkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCwgb3B0aW9uYWxseSBlbmNsb3NlZCAnCisgICAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAgICdwYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMsIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMgJworICAgICAgICAgICAgICAgJ2ZvbGxvd3MuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgZW1wdHk6IFRoZSBvYmplY3QgbXVzdCBhbHNvIGJlIGFuICcKKyAgICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICAgJyAgaXRlcmFibGUuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBzaW5nbGUgdGFyZ2V0IGluIHBhcmVudGhlc2VzOiBUaGUgJworICAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAgJyAgaXMgYXNzaWduZWQgdG8gdGhhdCB0YXJnZXQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzLCBvciAnCisgICAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICAgJyAgc2luZ2xlIHRhcmdldCBpbiBzcXVhcmUgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiAnCisgICAgICAgICAgICAgICAnaXRlcmFibGVcbicKKyAgICAgICAgICAgICAgICcgIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnICBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnICBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW5cbicKKyAgICAgICAgICAgICAgICcgICAgYXN0ZXJpc2ssIGNhbGxlZCBhICJzdGFycmVkIiB0YXJnZXQ6IFRoZSBvYmplY3QgbXVzdCBiZSAnCisgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICcgICAgaXRlcmFibGUgd2l0aCBhdCBsZWFzdCBhcyBtYW55IGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzICcKKyAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICAgdGFyZ2V0IGxpc3QsIG1pbnVzIG9uZS4gIFRoZSBmaXJzdCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgJworICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgJyAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlICcKKyAgICAgICAgICAgICAgICdzdGFycmVkXG4nCisgICAgICAgICAgICAgICAnICAgIHRhcmdldC4gIFRoZSBmaW5hbCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkIHRvICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgICAgdGFyZ2V0cyBhZnRlciB0aGUgc3RhcnJlZCB0YXJnZXQuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZyAnCisgICAgICAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAgICAgICcgICAgaW4gdGhlIGl0ZXJhYmxlIGlzIHRoZW4gYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICcKKyAgICAgICAgICAgICAgICcodGhlIGxpc3RcbicKKyAgICAgICAgICAgICAgICcgICAgY2FuIGJlIGVtcHR5KS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyICcKKyAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgJyAgICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgJ2l0ZW1zIGFyZVxuJworICAgICAgICAgICAgICAgJyAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgICAndGFyZ2V0cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgJworICAgICAgICAgICAgICAgJ2RlZmluZWQgYXNcbicKKyAgICAgICAgICAgICAgICdmb2xsb3dzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSAiZ2xvYmFsIiBvciAibm9ubG9jYWwiICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICcgICAgaW4gdGhlIGN1cnJlbnQgY29kZSBibG9jazogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCAnCisgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKiBPdGhlcndpc2U6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGdsb2JhbFxuJworICAgICAgICAgICAgICAgJyAgICBuYW1lc3BhY2Ugb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICcKKyAgICAgICAgICAgICAgICcibm9ubG9jYWwiLFxuJworICAgICAgICAgICAgICAgJyAgICByZXNwZWN0aXZlbHkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJyAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgJworICAgICAgICAgICAgICAgJ3RvIHJlYWNoXG4nCisgICAgICAgICAgICAgICAnICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyAnCisgICAgICAgICAgICAgICAnZGVzdHJ1Y3RvciAoaWYgaXRcbicKKyAgICAgICAgICAgICAgICcgIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgJworICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaW5cbicKKyAgICAgICAgICAgICAgICcgIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4nCisgICAgICAgICAgICAgICAnICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAiVHlwZUVycm9yIiAnCisgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICcgIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCAnCisgICAgICAgICAgICAgICAnb2JqZWN0IHRvXG4nCisgICAgICAgICAgICAgICAnICB0aGUgZ2l2ZW4gYXR0cmlidXRlOyBpZiBpdCBjYW5ub3QgcGVyZm9ybSB0aGUgYXNzaWdubWVudCwgaXQgJworICAgICAgICAgICAgICAgJ3JhaXNlc1xuJworICAgICAgICAgICAgICAgJyAgYW4gZXhjZXB0aW9uICh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgJworICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgTm90ZTogSWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzIGluc3RhbmNlIGFuZCB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICcgIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTICcKKyAgICAgICAgICAgICAgICdleHByZXNzaW9uLFxuJworICAgICAgICAgICAgICAgJyAgImEueCIgY2FuIGFjY2VzcyBlaXRoZXIgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG9yIChpZiBubyAnCisgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgImEueCIgJworICAgICAgICAgICAgICAgJ2lzIGFsd2F5c1xuJworICAgICAgICAgICAgICAgJyAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgJworICAgICAgICAgICAgICAgJ1RodXMsIHRoZVxuJworICAgICAgICAgICAgICAgJyAgdHdvIG9jY3VycmVuY2VzIG9mICJhLngiIGRvIG5vdCBuZWNlc3NhcmlseSByZWZlciB0byB0aGUgJworICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIHRoZVxuJworICAgICAgICAgICAgICAgJyAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAnICBhc3NpZ25tZW50OlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgICAgY2xhc3MgQ2xzOlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbicKKyAgICAgICAgICAgICAgICcgICAgIGluc3QgPSBDbHMoKVxuJworICAgICAgICAgICAgICAgJyAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggJworICAgICAgICAgICAgICAgJ2FzIDNcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuJworICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCAicHJvcGVydHkoKSIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSAnCisgICAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICcgIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpIG9yIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSAnCisgICAgICAgICAgICAgICAnZGljdGlvbmFyeSkuXG4nCisgICAgICAgICAgICAgICAnICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhICcKKyAgICAgICAgICAgICAgICdsaXN0KSwgdGhlXG4nCisgICAgICAgICAgICAgICAnICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZSAnCisgICAgICAgICAgICAgICAic2VxdWVuY2Unc1xuIgorICAgICAgICAgICAgICAgJyAgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgJworICAgICAgICAgICAgICAgJ25vbm5lZ2F0aXZlXG4nCisgICAgICAgICAgICAgICAiICBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2UncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgIgorICAgICAgICAgICAgICAgJ2Fza2VkXG4nCisgICAgICAgICAgICAgICAnICB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0byBpdHMgaXRlbSB3aXRoIHRoYXQgaW5kZXguICAnCisgICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICAnICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICJJbmRleEVycm9yIiBpcyByYWlzZWQgKGFzc2lnbm1lbnQgdG8gJworICAgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAgICcgIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICIgIHN1YnNjcmlwdCBtdXN0IGhhdmUgYSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgbWFwcGluZydzIGtleSAiCisgICAgICAgICAgICAgICAndHlwZSxcbicKKyAgICAgICAgICAgICAgICcgIGFuZCB0aGUgbWFwcGluZyBpcyB0aGVuIGFza2VkIHRvIGNyZWF0ZSBhIGtleS9kYXR1bSBwYWlyICcKKyAgICAgICAgICAgICAgICd3aGljaCBtYXBzXG4nCisgICAgICAgICAgICAgICAnICB0aGUgc3Vic2NyaXB0IHRvIHRoZSBhc3NpZ25lZCBvYmplY3QuICBUaGlzIGNhbiBlaXRoZXIgJworICAgICAgICAgICAgICAgJ3JlcGxhY2UgYW5cbicKKyAgICAgICAgICAgICAgICcgIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSAnCisgICAgICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICAgICAnICBrZXkvdmFsdWUgcGFpciAoaWYgbm8ga2V5IHdpdGggdGhlIHNhbWUgdmFsdWUgZXhpc3RlZCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBGb3IgdXNlci1kZWZpbmVkIG9iamVjdHMsIHRoZSAiX19zZXRpdGVtX18oKSIgbWV0aG9kIGlzICcKKyAgICAgICAgICAgICAgICdjYWxsZWQgd2l0aFxuJworICAgICAgICAgICAgICAgJyAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhIHNsaWNpbmc6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnICAoc3VjaCBhcyBhIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnICBvZiB0aGUgc2FtZSB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvbnMgYXJlXG4nCisgICAgICAgICAgICAgICAnICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICIgIHNlcXVlbmNlJ3MgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gaW50ZWdlcnMuICIKKyAgICAgICAgICAgICAgICdJZlxuJworICAgICAgICAgICAgICAgIiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gIgorICAgICAgICAgICAgICAgJ2l0LiAgVGhlXG4nCisgICAgICAgICAgICAgICAnICByZXN1bHRpbmcgYm91bmRzIGFyZSBjbGlwcGVkIHRvIGxpZSBiZXR3ZWVuIHplcm8gYW5kIHRoZSAnCisgICAgICAgICAgICAgICAic2VxdWVuY2Unc1xuIgorICAgICAgICAgICAgICAgJyAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvICcKKyAgICAgICAgICAgICAgICdyZXBsYWNlXG4nCisgICAgICAgICAgICAgICAnICB0aGUgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlICcKKyAgICAgICAgICAgICAgICdsZW5ndGggb2ZcbicKKyAgICAgICAgICAgICAgICcgIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgJworICAgICAgICAgICAgICAgJ3NlcXVlbmNlLFxuJworICAgICAgICAgICAgICAgJyAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnICBzZXF1ZW5jZSBhbGxvd3MgaXQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24sIHRoZVxuJworICAgICAgICAgICAgICAgJ3N5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsICcKKyAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICdpbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgJworICAgICAgICAgICAgICAgJ2NhdXNpbmdcbicKKyAgICAgICAgICAgICAgICdsZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0FsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzICcKKyAgICAgICAgICAgICAgICdiZXR3ZWVuXG4nCisgICAgICAgICAgICAgICAidGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSAnc2ltdWx0YW5lb3VzJyAiCisgICAgICAgICAgICAgICAnKGZvclxuJworICAgICAgICAgICAgICAgJ2V4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIG9jY3VyIGxlZnQtdG8tcmlnaHQsICcKKyAgICAgICAgICAgICAgICdzb21ldGltZXNcbicKKyAgICAgICAgICAgICAgICdyZXN1bHRpbmcgaW4gY29uZnVzaW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gJworICAgICAgICAgICAgICAgJ3ByaW50c1xuJworICAgICAgICAgICAgICAgJyJbMCwgMl0iOlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIHggPSBbMCwgMV1cbicKKyAgICAgICAgICAgICAgICcgICBpID0gMFxuJworICAgICAgICAgICAgICAgJyAgIGksIHhbaV0gPSAxLCAyICAgICAgICAgIyBpIGlzIHVwZGF0ZWQsIHRoZW4geFtpXSBpcyAnCisgICAgICAgICAgICAgICAndXBkYXRlZFxuJworICAgICAgICAgICAgICAgJyAgIHByaW50KHgpXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqKlBFUCAzMTMyKiogLSBFeHRlbmRlZCBJdGVyYWJsZSBVbnBhY2tpbmdcbicKKyAgICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIip0YXJnZXQiIGZlYXR1cmUuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuJworICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQsIG9mIGFcbicKKyAgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgJworICAgICAgICAgICAgICAgJyhleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuJworICAgICAgICAgICAgICAgJyAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCAnCisgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuJworICAgICAgICAgICAgICAgJyAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAnCisgICAgICAgICAgICAgICAnIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyhTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgJworICAgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgICAnc3ltYm9scy4pXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2UgJworICAgICAgICAgICAgICAgJ25vcm1hbFxuJworICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAgJ2xpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAgICAgICdhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICAnb24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgJworICAgICAgICAgICAgICAgJ3RhcmdldC5cbicKKyAgICAgICAgICAgICAgICdUaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSAnCisgICAgICAgICAgICAgICAncmV3cml0dGVuIGFzXG4nCisgICAgICAgICAgICAgICAnInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCAnCisgICAgICAgICAgICAgICAnZWZmZWN0LiBJbiB0aGVcbicKKyAgICAgICAgICAgICAgICdhdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gJworICAgICAgICAgICAgICAgJ3Bvc3NpYmxlLFxuJworICAgICAgICAgICAgICAgJ3RoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgJworICAgICAgICAgICAgICAgJ3JhdGhlciB0aGFuXG4nCisgICAgICAgICAgICAgICAnY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgJworICAgICAgICAgICAgICAgJ29sZCBvYmplY3RcbicKKyAgICAgICAgICAgICAgICdpcyBtb2RpZmllZCBpbnN0ZWFkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1VubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAgJ2xlZnQtXG4nCisgICAgICAgICAgICAgICAnaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciAnCisgICAgICAgICAgICAgICAnZXhhbXBsZSwgImFbaV1cbicKKyAgICAgICAgICAgICAgICcrPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgJworICAgICAgICAgICAgICAgJ3BlcmZvcm1zXG4nCisgICAgICAgICAgICAgICAndGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICcKKyAgICAgICAgICAgICAgICciYVtpXSIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgJworICAgICAgICAgICAgICAgJ2luIGFcbicKKyAgICAgICAgICAgICAgICdzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICAnc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuICcKKyAgICAgICAgICAgICAgICdTaW1pbGFybHksXG4nCisgICAgICAgICAgICAgICAnd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgJworICAgICAgICAgICAgICAgJ2JpbmFyeVxuJworICAgICAgICAgICAgICAgJ29wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlICcKKyAgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCAnCisgICAgICAgICAgICAgICAnYWJvdXRcbicKKyAgICAgICAgICAgICAgICdjbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyBhcHBsaWVzIGFzIGZvciByZWd1bGFyICcKKyAgICAgICAgICAgICAgICdhc3NpZ25tZW50cy5cbicsCisgJ2F0b20taWRlbnRpZmllcnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSWRlbnRpZmllcnMgKE5hbWVzKVxuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdBbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSAnCisgICAgICAgICAgICAgICAgICAgICAnc2VjdGlvbiBJZGVudGlmaWVyc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCBrZXl3b3JkcyBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uIE5hbWluZyAnCisgICAgICAgICAgICAgICAgICAgICAnYW5kIGJpbmRpbmcgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdG9tIHlpZWxkc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RoYXQgb2JqZWN0LiBXaGVuIGEgbmFtZSBpcyBub3QgYm91bmQsIGFuIGF0dGVtcHQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ2V2YWx1YXRlIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAncmFpc2VzIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyoqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICd0ZXh0dWFsbHkgb2NjdXJzIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAnYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgJworICAgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnY29uc2lkZXJlZCBhICpwcml2YXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnbmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSAnCisgICAgICAgICAgICAgICAgICAgICAnbG9uZ2VyIGZvcm1cbicKKyAgICAgICAgICAgICAgICAgICAgICdiZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gJworICAgICAgICAgICAgICAgICAgICAgJ2luc2VydHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgJworICAgICAgICAgICAgICAgICAgICAgJ3NpbmdsZSB1bmRlcnNjb3JlXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW5zZXJ0ZWQsIGluIGZyb250IG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiX19zcGFtIlxuJworICAgICAgICAgICAgICAgICAgICAgJ29jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkICJIYW0iIHdpbGwgYmUgdHJhbnNmb3JtZWQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJyJfSGFtX19zcGFtIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCBpbiB3aGljaFxuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnZXh0cmVtZWx5IGxvbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcobG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMpLCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgICAgICd0cnVuY2F0aW9uIG1heVxuJworICAgICAgICAgICAgICAgICAgICAgJ2hhcHBlbi4gSWYgdGhlIGNsYXNzIG5hbWUgY29uc2lzdHMgb25seSBvZiB1bmRlcnNjb3JlcywgJworICAgICAgICAgICAgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCisgJ2F0b20tbGl0ZXJhbHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnTGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1B5dGhvbiBzdXBwb3J0cyBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIGFuZCB2YXJpb3VzICcKKyAgICAgICAgICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgICAgICAgICAnbGl0ZXJhbHM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgbGl0ZXJhbCA6Oj0gc3RyaW5nbGl0ZXJhbCB8IGJ5dGVzbGl0ZXJhbFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIHwgaW50ZWdlciB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0V2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyhzdHJpbmcsXG4nCisgICAgICAgICAgICAgICAgICAnYnl0ZXMsIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggJworICAgICAgICAgICAgICAgICAgJ3RoZSBnaXZlblxuJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlLiAgVGhlIHZhbHVlIG1heSBiZSBhcHByb3hpbWF0ZWQgaW4gdGhlIGNhc2Ugb2YgJworICAgICAgICAgICAgICAgICAgJ2Zsb2F0aW5nIHBvaW50XG4nCisgICAgICAgICAgICAgICAgICAnYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiBMaXRlcmFscyBmb3IgJworICAgICAgICAgICAgICAgICAgJ2RldGFpbHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWxsIGxpdGVyYWxzIGNvcnJlc3BvbmQgdG8gaW1tdXRhYmxlIGRhdGEgdHlwZXMsIGFuZCBoZW5jZSAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAib2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICAiCisgICAgICAgICAgICAgICAgICAnTXVsdGlwbGVcbicKKyAgICAgICAgICAgICAgICAgICdldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAgICAnb2NjdXJyZW5jZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IG9yIGEgZGlmZmVyZW50IG9jY3VycmVuY2UpICcKKyAgICAgICAgICAgICAgICAgICdtYXkgb2J0YWluXG4nCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZS5cbicsCisgJ2F0dHJpYnV0ZS1hY2Nlc3MnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnbWVhbmluZyBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgJworICAgICAgICAgICAgICAgICAgICAgJyJ4Lm5hbWUiKSBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzcyBpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3IgaXMgaXQgZm91bmRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBuYW1lLiBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlICcKKyAgICAgICAgICAgICAgICAgICAgICdvciByYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3JtYWwgbWVjaGFuaXNtLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gJworICAgICAgICAgICAgICAgICAgICAgJ2ludGVudGlvbmFsIGFzeW1tZXRyeVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdkb25lIGJvdGggZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgJworICAgICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCBhdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCAnCisgICAgICAgICAgICAgICAgICAgICAnY29udHJvbCBieSBub3RcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IChidXRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdhY3R1YWxseSBnZXQgdG90YWxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICAgICAnYWNjZXNzZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gJworICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgJworICAgICAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkICcKKyAgICAgICAgICAgICAgICAgICAgICdpbmZpbml0ZSByZWN1cnNpb24gaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGJhc2UgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCAnCisgICAgICAgICAgICAgICAgICAgICAnbmVlZHMsIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyAnCisgICAgICAgICAgICAgICAgICAgICAndXAgc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhICcKKyAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSBzeW50YXhcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlIFNwZWNpYWwgbWV0aG9kIGxvb2t1cC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgJworICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgY2FsbGVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAnCisgICAgICAgICAgICAgICAgICAgICAnKnZhbHVlKiBpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGVhZCBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgJworICAgICAgICAgICAgICAgICAgICAgJ29iai5uYW1lIiBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGlyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBICcKKyAgICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSBtdXN0IGJlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgJworICAgICAgICAgICAgICAgICAgICAgJ2xpc3QgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc29ydHMgaXQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4nCisgICAgICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpICcKKyAgICAgICAgICAgICAgICAgICAgICdhcHBlYXJzIGluIGFuXG4nCisgICAgICAgICAgICAgICAgICAgICAnKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICJvd25lcidzIGNsYXNzXG4iCisgICAgICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyAnCisgICAgICAgICAgICAgICAgICAgICAncGFyZW50cykuICBJbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdleGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICd3aG9zZSBuYW1lIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAidGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzJyAiCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGljdF9fIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgJworICAgICAgICAgICAgICAgICAgICAgJyppbnN0YW5jZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnIk5vbmUiIHdoZW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdtZXRob2Qgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogJworICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBvd25lclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnKmluc3RhbmNlKiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvd25lciBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRfbmFtZV9fKHNlbGYsIG93bmVyLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBhdCB0aGUgdGltZSB0aGUgb3duaW5nIGNsYXNzICpvd25lciogaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0ZWQuIFRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaXB0b3IgaGFzIGJlZW4gYXNzaWduZWQgdG8gKm5hbWUqLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuNi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnImluc3BlY3QiIG1vZHVsZSBhc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgICAgICcoc2V0dGluZyB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnZHluYW1pYyBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2Ugb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJ3VuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbnZva2luZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAnCisgICAgICAgICAgICAgICAgICAgICAnImJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICdiZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuICcKKyAgICAgICAgICAgICAgICAgICAgICdvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgJworICAgICAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2FuIG9iamVjdCwgaXRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsICcKKyAgICAgICAgICAgICAgICAgICAgICdzZXQsIG9yIGRlbGV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICIKKyAgICAgICAgICAgICAgICAgICAgICciYS54IiBoYXMgYVxuJworICAgICAgICAgICAgICAgICAgICAgJ2xvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzc2VzIG9mXG4nCisgICAgICAgICAgICAgICAgICAgICAnInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdIb3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyAnCisgICAgICAgICAgICAgICAgICAgICAnb25lIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICAgICdiZWhhdmlvciBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAncHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICAgICAnd2VyZSBkZWZpbmVkIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2hvdyB0aGV5IHdlcmUgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgJworICAgICAgICAgICAgICAgICAgICAgJ2JpbmRpbmcsICJhLngiLiBIb3dcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnRGlyZWN0IENhbGxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RseVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW5zdGFuY2UgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtZWQgaW50byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQ2xhc3MgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NhbGw6XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1N1cGVyIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAnCisgICAgICAgICAgICAgICAgICAgICAnInN1cGVyKEIsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MgIkEiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciB3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgJworICAgICAgICAgICAgICAgICAgICAgJ29iai5fX2NsYXNzX18pIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdGb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAgICAgJ2ludm9jYXRpb24gZGVwZW5kc1xuJworICAgICAgICAgICAgICAgICAgICAgJ29uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBICcKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbicKKyAgICAgICAgICAgICAgICAgICAgICdhbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuJworICAgICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluICcKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUgb2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fc2V0X18oKSIgYW5kL29yXG4nCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICAgICduZWl0aGVyLCBpdCBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2Egbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzICcKKyAgICAgICAgICAgICAgICAgICAgICdkZWZpbmUgYm90aFxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgJworICAgICAgICAgICAgICAgICAgICAgJ2hhdmUganVzdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCAiX19nZXRfXygpIlxuJworICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5LiAgSW5cbicKKyAgICAgICAgICAgICAgICAgICAgICdjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICciY2xhc3NtZXRob2QoKSIpIGFyZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgY2FuXG4nCisgICAgICAgICAgICAgICAgICAgICAncmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdhY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICAgICAnQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ19fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAgICAgJz09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuICcKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGluZyBsYXJnZVxuJworICAgICAgICAgICAgICAgICAgICAgJ251bWJlcnMgb2YgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluICcKKyAgICAgICAgICAgICAgICAgICAgICdhIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ29mIGluc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSB0byBob2xkIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgJworICAgICAgICAgICAgICAgICAgICAgJypfX2RpY3RfXyogaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgICAnY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zbG90c19fXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsICcKKyAgICAgICAgICAgICAgICAgICAgICdpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qICcKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgZWFjaFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19kaWN0X18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyAnCisgICAgICAgICAgICAgICAgICAgICAnYSAqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXNzaWduZWQgbmV3XG4nCisgICAgICAgICAgICAgICAgICAgICAnICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAgICAgICAgICdBdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICcKKyAgICAgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiLiBJZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiAnCisgICAgICAgICAgICAgICAgICAgICAnYWRkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZWNsYXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCAnCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gJworICAgICAgICAgICAgICAgICAgICAgJ2FkZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVjbGFyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5ICcKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVzY3JpcHRvcnMgKEltcGxlbWVudGluZyBEZXNjcmlwdG9ycykgZm9yIGVhY2ggJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlIG5hbWUuICBBcyBhXG4nCisgICAgICAgICAgICAgICAgICAgICAnICByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsICcKKyAgICAgICAgICAgICAgICAgICAgICdoYXZlIGEgKl9fZGljdF9fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGFpbiBuYW1lc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnaW5hY2Nlc3NpYmxlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MpLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgZnV0dXJlLCBhXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkICcKKyAgICAgICAgICAgICAgICAgICAgICdmcm9tXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAnCisgICAgICAgICAgICAgICAgICAgICAnImJ5dGVzIiBhbmQgInR1cGxlIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAgICAgICdtZWFuaW5nIG1heSBiZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgKl9fc2xvdHNfXyouXG4nLAorICdhdHRyaWJ1dGUtcmVmZXJlbmNlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQXR0cmlidXRlIHJlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuIGF0dHJpYnV0ZSByZWZlcmVuY2UgaXMgYSBwcmltYXJ5IGZvbGxvd2VkIGJ5IGEgJworICAgICAgICAgICAgICAgICAgICAgICAgICdwZXJpb2QgYW5kIGEgbmFtZTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllclxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhhdCBzdXBwb3J0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgcmVmZXJlbmNlcywgd2hpY2ggbW9zdCBvYmplY3RzIGRvLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCBpcyB0aGVuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fza2VkIHRvIHByb2R1Y2UgdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIiBpc1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdyYWlzZWQuICBPdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgb2JqZWN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZWQgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2YgJworICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIG1heSB5aWVsZCBkaWZmZXJlbnQgb2JqZWN0cy5cbicsCisgJ2F1Z2Fzc2lnbic6ICdcbicKKyAgICAgICAgICAgICAgJ0F1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsICcKKyAgICAgICAgICAgICAgJ29mIGFcbicKKyAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgJworICAgICAgICAgICAgICAnKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4nCisgICAgICAgICAgICAgICcgICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgJworICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuJworICAgICAgICAgICAgICAnICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICcKKyAgICAgICAgICAgICAgJyIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuJworICAgICAgICAgICAgICAnICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcoU2VlIHNlY3Rpb24gUHJpbWFyaWVzIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgICdzeW1ib2xzLilcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2UgJworICAgICAgICAgICAgICAnbm9ybWFsXG4nCisgICAgICAgICAgICAgICdhc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgJworICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAnbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgJworICAgICAgICAgICAgICAnYXNzaWdubWVudFxuJworICAgICAgICAgICAgICAnb24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgJworICAgICAgICAgICAgICAndGFyZ2V0LlxuJworICAgICAgICAgICAgICAnVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlICcKKyAgICAgICAgICAgICAgJ3Jld3JpdHRlbiBhc1xuJworICAgICAgICAgICAgICAnInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuICcKKyAgICAgICAgICAgICAgJ0luIHRoZVxuJworICAgICAgICAgICAgICAnYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuICcKKyAgICAgICAgICAgICAgJ3Bvc3NpYmxlLFxuJworICAgICAgICAgICAgICAndGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCAnCisgICAgICAgICAgICAgICdyYXRoZXIgdGhhblxuJworICAgICAgICAgICAgICAnY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkICcKKyAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAnaXMgbW9kaWZpZWQgaW5zdGVhZC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICdsZWZ0LVxuJworICAgICAgICAgICAgICAnaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciAnCisgICAgICAgICAgICAgICdleGFtcGxlLCAiYVtpXVxuJworICAgICAgICAgICAgICAnKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kICcKKyAgICAgICAgICAgICAgJ3BlcmZvcm1zXG4nCisgICAgICAgICAgICAgICd0aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyAnCisgICAgICAgICAgICAgICdpbiBhXG4nCisgICAgICAgICAgICAgICdzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICdzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gJworICAgICAgICAgICAgICAnU2ltaWxhcmx5LFxuJworICAgICAgICAgICAgICAnd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgJworICAgICAgICAgICAgICAnYmluYXJ5XG4nCisgICAgICAgICAgICAgICdvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSAnCisgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCAnCisgICAgICAgICAgICAgICdhYm91dFxuJworICAgICAgICAgICAgICAnY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXBwbGllcyBhcyBmb3IgcmVndWxhciAnCisgICAgICAgICAgICAgICdhc3NpZ25tZW50cy5cbicsCisgJ2JpbmFyeSc6ICdcbicKKyAgICAgICAgICAgJ0JpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5XG4nCisgICAgICAgICAgICdsZXZlbHMuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSBvcGVyYXRpb25zIGFsc28gYXBwbHkgdG8gY2VydGFpbiAnCisgICAgICAgICAgICdub24tXG4nCisgICAgICAgICAgICdudW1lcmljIHR5cGVzLiAgQXBhcnQgZnJvbSB0aGUgcG93ZXIgb3BlcmF0b3IsIHRoZXJlIGFyZSBvbmx5IHR3b1xuJworICAgICAgICAgICAnbGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZVxuJworICAgICAgICAgICAnb3BlcmF0b3JzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICJAIiBtX2V4cHIgfFxuJworICAgICAgICAgICAnICAgICAgICAgICAgICBtX2V4cHIgIi8vIiB1X2V4cHJ8IG1fZXhwciAiLyIgdV9leHByIHxcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgbV9leHByICIlIiB1X2V4cHJcbicKKyAgICAgICAgICAgJyAgIGFfZXhwciA6Oj0gbV9leHByIHwgYV9leHByICIrIiBtX2V4cHIgfCBhX2V4cHIgIi0iIG1fZXhwclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIioiIChtdWx0aXBsaWNhdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBwcm9kdWN0IG9mIGl0cyAnCisgICAgICAgICAgICdhcmd1bWVudHMuXG4nCisgICAgICAgICAgICdUaGUgYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycywgb3Igb25lIGFyZ3VtZW50IG11c3QgYmUgJworICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgJ2ludGVnZXIgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlXG4nCisgICAgICAgICAgICdudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSBhbmQgdGhlbiBtdWx0aXBsaWVkICcKKyAgICAgICAgICAgJ3RvZ2V0aGVyLlxuJworICAgICAgICAgICAnSW4gdGhlIGxhdHRlciBjYXNlLCBzZXF1ZW5jZSByZXBldGl0aW9uIGlzIHBlcmZvcm1lZDsgYSBuZWdhdGl2ZVxuJworICAgICAgICAgICAncmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIkAiIChhdCkgb3BlcmF0b3IgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWF0cml4XG4nCisgICAgICAgICAgICdtdWx0aXBsaWNhdGlvbi4gIE5vIGJ1aWx0aW4gUHl0aG9uIHR5cGVzIGltcGxlbWVudCB0aGlzIG9wZXJhdG9yLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiLyIgKGRpdmlzaW9uKSBhbmQgIi8vIiAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZCB0aGVcbicKKyAgICAgICAgICAgJ3F1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbicKKyAgICAgICAgICAgJ2NvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiBEaXZpc2lvbiBvZiBpbnRlZ2VycyB5aWVsZHMgYSBmbG9hdCwgJworICAgICAgICAgICAnd2hpbGVcbicKKyAgICAgICAgICAgJ2Zsb29yIGRpdmlzaW9uIG9mIGludGVnZXJzIHJlc3VsdHMgaW4gYW4gaW50ZWdlcjsgdGhlIHJlc3VsdCBpcyAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICJvZiBtYXRoZW1hdGljYWwgZGl2aXNpb24gd2l0aCB0aGUgJ2Zsb29yJyBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZVxuIgorICAgICAgICAgICAncmVzdWx0LiAgRGl2aXNpb24gYnkgemVybyByYWlzZXMgdGhlICJaZXJvRGl2aXNpb25FcnJvciIgJworICAgICAgICAgICAnZXhjZXB0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIiUiIChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGRpdmlzaW9uICcKKyAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICd0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgJworICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgJ2NvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgQSB6ZXJvIHJpZ2h0IGFyZ3VtZW50IHJhaXNlcyB0aGVcbicKKyAgICAgICAgICAgJyJaZXJvRGl2aXNpb25FcnJvciIgZXhjZXB0aW9uLiAgVGhlIGFyZ3VtZW50cyBtYXkgYmUgZmxvYXRpbmcgJworICAgICAgICAgICAncG9pbnRcbicKKyAgICAgICAgICAgJ251bWJlcnMsIGUuZy4sICIzLjE0JTAuNyIgZXF1YWxzICIwLjM0IiAoc2luY2UgIjMuMTQiIGVxdWFscyAnCisgICAgICAgICAgICciNCowLjcgK1xuJworICAgICAgICAgICAnMC4zNCIuKSAgVGhlIG1vZHVsbyBvcGVyYXRvciBhbHdheXMgeWllbGRzIGEgcmVzdWx0IHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICAnc2lnblxuJworICAgICAgICAgICAnYXMgaXRzIHNlY29uZCBvcGVyYW5kIChvciB6ZXJvKTsgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSByZXN1bHQgJworICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgJ3N0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kICcKKyAgICAgICAgICAgJ1sxXS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlICcKKyAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAnaWRlbnRpdHk6ICJ4ID09ICh4Ly95KSp5ICsgKHgleSkiLiAgRmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBhcmUgJworICAgICAgICAgICAnYWxzb1xuJworICAgICAgICAgICAnY29ubmVjdGVkIHdpdGggdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJkaXZtb2QoKSI6ICJkaXZtb2QoeCwgeSkgPT1cbicKKyAgICAgICAgICAgJyh4Ly95LCB4JXkpIi4gWzJdLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byBwZXJmb3JtaW5nIHRoZSBtb2R1bG8gb3BlcmF0aW9uIG9uIG51bWJlcnMsIHRoZSAnCisgICAgICAgICAgICciJSJcbicKKyAgICAgICAgICAgJ29wZXJhdG9yIGlzIGFsc28gb3ZlcmxvYWRlZCBieSBzdHJpbmcgb2JqZWN0cyB0byBwZXJmb3JtICcKKyAgICAgICAgICAgJ29sZC1zdHlsZVxuJworICAgICAgICAgICAnc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuICBUaGUgc3ludGF4IGZvclxuJworICAgICAgICAgICAnc3RyaW5nIGZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsXG4nCisgICAgICAgICAgICdzZWN0aW9uIHByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvIG9wZXJhdG9yLCBhbmQgdGhlICcKKyAgICAgICAgICAgJyJkaXZtb2QoKSJcbicKKyAgICAgICAgICAgJ2Z1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICdmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcgdGhlICJhYnMoKSIgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlXG4nCisgICAgICAgICAgICdhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggYmUgc2VxdWVuY2VzIG9mIHRoZSAnCisgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICd0eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uICcKKyAgICAgICAgICAgJ3R5cGVcbicKKyAgICAgICAgICAgJ2FuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlXG4nCisgICAgICAgICAgICdjb25jYXRlbmF0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzICcKKyAgICAgICAgICAgJ2FyZ3VtZW50cy5cbicKKyAgICAgICAgICAgJ1RoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG4nLAorICdiaXR3aXNlJzogJ1xuJworICAgICAgICAgICAgJ0JpbmFyeSBiaXR3aXNlIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnRWFjaCBvZiB0aGUgdGhyZWUgYml0d2lzZSBvcGVyYXRpb25zIGhhcyBhIGRpZmZlcmVudCBwcmlvcml0eSAnCisgICAgICAgICAgICAnbGV2ZWw6XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnICAgYW5kX2V4cHIgOjo9IHNoaWZ0X2V4cHIgfCBhbmRfZXhwciAiJiIgc2hpZnRfZXhwclxuJworICAgICAgICAgICAgJyAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwclxuJworICAgICAgICAgICAgJyAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICImIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoICcKKyAgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICAnYmUgaW50ZWdlcnMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICJeIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0c1xuJworICAgICAgICAgICAgJ2FyZ3VtZW50cywgd2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgInwiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgJworICAgICAgICAgICAgJ2FyZ3VtZW50cyxcbicKKyAgICAgICAgICAgICd3aGljaCBtdXN0IGJlIGludGVnZXJzLlxuJywKKyAnYmx0aW4tY29kZS1vYmplY3RzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnQ29kZSBPYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byAnCisgICAgICAgICAgICAgICAgICAgICAgICdyZXByZXNlbnQgInBzZXVkby1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGVkIiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICdib2R5LiBUaGV5IGRpZmZlclxuJworICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBmdW5jdGlvbiBvYmplY3RzIGJlY2F1c2UgdGhleSBkb24ndCBjb250YWluIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIHRvIHRoZWlyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSB0aGUgYnVpbHQtXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdpbiAiY29tcGlsZSgpIiBmdW5jdGlvbiBhbmQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlaXIgIl9fY29kZV9fIiBhdHRyaWJ1dGUuIFNlZSBhbHNvIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICciY29kZSIgbW9kdWxlLlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdBIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyAnCisgICAgICAgICAgICAgICAgICAgICAgICdpdCAoaW5zdGVhZCBvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2Ugc3RyaW5nKSB0byB0aGUgImV4ZWMoKSIgb3IgImV2YWwoKSIgIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9ucy5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnU2VlIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSBmb3IgbW9yZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdpbmZvcm1hdGlvbi5cbicsCisgJ2JsdGluLWVsbGlwc2lzLW9iamVjdCc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBFbGxpcHNpcyBPYmplY3RcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBvYmplY3QgaXMgY29tbW9ubHkgdXNlZCBieSBzbGljaW5nIChzZWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnU2xpY2luZ3MpLiAgSXQgc3VwcG9ydHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsbGlwc2lzIG9iamVjdCwgbmFtZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyJFbGxpcHNpcyIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShFbGxpcHNpcykoKSIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICciRWxsaXBzaXMiIHNpbmdsZXRvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnSXQgaXMgd3JpdHRlbiBhcyAiRWxsaXBzaXMiIG9yICIuLi4iLlxuJywKKyAnYmx0aW4tbnVsbC1vYmplY3QnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBOdWxsIE9iamVjdFxuJworICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSByZXR1cm4gYVxuJworICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAnZXhhY3RseSBvbmUgbnVsbFxuJworICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QsIG5hbWVkICJOb25lIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKE5vbmUpKCkiICcKKyAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ3NhbWUgc2luZ2xldG9uLlxuJworICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAnSXQgaXMgd3JpdHRlbiBhcyAiTm9uZSIuXG4nLAorICdibHRpbi10eXBlLW9iamVjdHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdUeXBlIE9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdUeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuICcKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCdzIHR5cGUgaXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAidHlwZSgpIi4gIFRoZXJlIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdubyBzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSAidHlwZXMiICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZXMgbmFtZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdhbGwgc3RhbmRhcmQgYnVpbHQtaW4gdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1R5cGVzIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxjbGFzcyBcJ2ludFwnPiIuXG4nLAorICdib29sZWFucyc6ICdcbicKKyAgICAgICAgICAgICAnQm9vbGVhbiBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgb3JfdGVzdCAgOjo9IGFuZF90ZXN0IHwgb3JfdGVzdCAib3IiIGFuZF90ZXN0XG4nCisgICAgICAgICAgICAgJyAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4nCisgICAgICAgICAgICAgJyAgIG5vdF90ZXN0IDo6PSBjb21wYXJpc29uIHwgIm5vdCIgbm90X3Rlc3RcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0luIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICd1c2VkIGJ5IGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgJworICAgICAgICAgICAgICdpbnRlcnByZXRlZFxuJworICAgICAgICAgICAgICdhcyBmYWxzZTogIkZhbHNlIiwgIk5vbmUiLCBudW1lcmljIHplcm8gb2YgYWxsIHR5cGVzLCBhbmQgZW1wdHlcbicKKyAgICAgICAgICAgICAnc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG4nCisgICAgICAgICAgICAgJ2RpY3Rpb25hcmllcywgc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgJ2ludGVycHJldGVkXG4nCisgICAgICAgICAgICAgJ2FzIHRydWUuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gY3VzdG9taXplIHRoZWlyIHRydXRoIHZhbHVlICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAncHJvdmlkaW5nIGEgIl9fYm9vbF9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvciAibm90IiB5aWVsZHMgIlRydWUiIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSwgJworICAgICAgICAgICAgICciRmFsc2UiXG4nCisgICAgICAgICAgICAgJ290aGVyd2lzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleHByZXNzaW9uICJ4IGFuZCB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgZmFsc2UsICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJ3ZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICdpcyByZXR1cm5lZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleHByZXNzaW9uICJ4IG9yIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyB0cnVlLCBpdHMgJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICdpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAncmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcoTm90ZSB0aGF0IG5laXRoZXIgImFuZCIgbm9yICJvciIgcmVzdHJpY3QgdGhlIHZhbHVlIGFuZCB0eXBlICcKKyAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICdyZXR1cm4gdG8gIkZhbHNlIiBhbmQgIlRydWUiLCBidXQgcmF0aGVyIHJldHVybiB0aGUgbGFzdCAnCisgICAgICAgICAgICAgJ2V2YWx1YXRlZFxuJworICAgICAgICAgICAgICdhcmd1bWVudC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgInMiIGlzIGEgc3RyaW5nICcKKyAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICdzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIGVtcHR5LCB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJyJzIG9yIFwnZm9vXCciIHlpZWxkcyB0aGUgZGVzaXJlZCB2YWx1ZS4gIEJlY2F1c2UgIm5vdCIgaGFzIHRvICcKKyAgICAgICAgICAgICAnY3JlYXRlIGFcbicKKyAgICAgICAgICAgICAnbmV3IHZhbHVlLCBpdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50IChmb3IgZXhhbXBsZSwgIm5vdCBcJ2Zvb1wnIiBwcm9kdWNlcyAiRmFsc2UiIHJhdGhlciAnCisgICAgICAgICAgICAgJ3RoYW4gIlwnXCciLilcbicsCisgJ2JyZWFrJzogJ1xuJworICAgICAgICAgICdUaGUgImJyZWFrIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBicmVha19zdG10IDo6PSAiYnJlYWsiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICciYnJlYWsiIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgImZvciIgb3IgIndoaWxlIlxuJworICAgICAgICAgICdsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gd2l0aGluIHRoYXRcbicKKyAgICAgICAgICAnbG9vcC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0l0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbCAnCisgICAgICAgICAgJyJlbHNlIlxuJworICAgICAgICAgICdjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGEgImZvciIgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0XG4nCisgICAgICAgICAgJ2tlZXBzIGl0cyBjdXJyZW50IHZhbHVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnV2hlbiAiYnJlYWsiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgJworICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAnY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2xvb3AuXG4nLAorICdjYWxsYWJsZS10eXBlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgJworICAgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgICcgICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG4nLAorICdjYWxscyc6ICdcbicKKyAgICAgICAgICAnQ2FsbHNcbicKKyAgICAgICAgICAnKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgJworICAgICAgICAgICdwb3NzaWJseVxuJworICAgICAgICAgICdlbXB0eSBzZXJpZXMgb2YgKmFyZ3VtZW50cyo6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl0gfCAnCisgICAgICAgICAgJ2NvbXByZWhlbnNpb25dICIpIlxuJworICAgICAgICAgICcgICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiAnCisgICAgICAgICAgJ3N0YXJyZWRfYW5kX2tleXdvcmRzXVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHN0YXJyZWRfYW5kX2tleXdvcmRzIFsiLCIgJworICAgICAgICAgICdrZXl3b3Jkc19hcmd1bWVudHNdXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZHNfYXJndW1lbnRzXG4nCisgICAgICAgICAgJyAgIHBvc2l0aW9uYWxfYXJndW1lbnRzIDo6PSBbIioiXSBleHByZXNzaW9uICgiLCIgWyIqIl0gJworICAgICAgICAgICdleHByZXNzaW9uKSpcbicKKyAgICAgICAgICAnICAgc3RhcnJlZF9hbmRfa2V5d29yZHMgOjo9ICgiKiIgZXhwcmVzc2lvbiB8IGtleXdvcmRfaXRlbSlcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgIioiIGV4cHJlc3Npb24gfCAiLCIgJworICAgICAgICAgICdrZXl3b3JkX2l0ZW0pKlxuJworICAgICAgICAgICcgICBrZXl3b3Jkc19hcmd1bWVudHMgICA6Oj0gKGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbilcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbikqXG4nCisgICAgICAgICAgJyAgIGtleXdvcmRfaXRlbSAgICAgICAgIDo6PSBpZGVudGlmaWVyICI9IiBleHByZXNzaW9uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBbiBvcHRpb25hbCB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmRcbicKKyAgICAgICAgICAna2V5d29yZCBhcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG4nCisgICAgICAgICAgJ2Z1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG4nCisgICAgICAgICAgJ29iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MgaW5zdGFuY2VzLCBhbmQgYWxsIG9iamVjdHMgaGF2aW5nIGFcbicKKyAgICAgICAgICAnIl9fY2FsbF9fKCkiIG1ldGhvZCBhcmUgY2FsbGFibGUpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZVxuJworICAgICAgICAgICdldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsIGlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uXG4nCisgICAgICAgICAgJ0Z1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbicKKyAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuJworICAgICAgICAgICdhcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoXG4nCisgICAgICAgICAgJ2tleXdvcmQgYXJndW1lbnQsIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZVxuJworICAgICAgICAgICdjb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCAnCisgICAgICAgICAgJ2Zvcm1hbFxuJworICAgICAgICAgICdwYXJhbWV0ZXIgbmFtZSwgdGhlIGZpcnN0IHNsb3QgaXMgdXNlZCwgYW5kIHNvIG9uKS4gIElmIHRoZSBzbG90ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnYWxyZWFkeSBmaWxsZWQsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbicKKyAgICAgICAgICAndmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdleHByZXNzaW9uIGlzICJOb25lIiwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwgYXJndW1lbnRzIGhhdmVcbicKKyAgICAgICAgICAnYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAnCisgICAgICAgICAgJyhEZWZhdWx0XG4nCisgICAgICAgICAgJ3ZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYVxuJworICAgICAgICAgICdtdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSAnCisgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAiYmUgc2hhcmVkIGJ5IGFsbCBjYWxscyB0aGF0IGRvbid0IHNwZWNpZnkgYW4gYXJndW1lbnQgdmFsdWUgZm9yICIKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSAnCisgICAgICAgICAgJ2FueVxuJworICAgICAgICAgICd1bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGEgJworICAgICAgICAgICciVHlwZUVycm9yIlxuJworICAgICAgICAgICdleGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQgc2xvdHMgaXMgdXNlZCAnCisgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgJ3RoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGVcbicKKyAgICAgICAgICAnYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgJworICAgICAgICAgICdldmVuXG4nCisgICAgICAgICAgImlmIHRoZXkgYXJlICduYW1lZCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaFxuIgorICAgICAgICAgICd0aGVyZWZvcmUgY2Fubm90IGJlIHN1cHBsaWVkIGJ5IGtleXdvcmQuICBJbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSAnCisgICAgICAgICAgJ2Nhc2VcbicKKyAgICAgICAgICAnZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlICJQeUFyZ19QYXJzZVR1cGxlKCkiIHRvICcKKyAgICAgICAgICAncGFyc2VcbicKKyAgICAgICAgICAndGhlaXIgYXJndW1lbnRzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsICcKKyAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgJ3Nsb3RzLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCAnCisgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICd1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0ICcKKyAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgJ3BhcmFtZXRlciByZWNlaXZlcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBwb3NpdGlvbmFsICcKKyAgICAgICAgICAnYXJndW1lbnRzXG4nCisgICAgICAgICAgJyhvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxuJworICAgICAgICAgICduYW1lLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbicKKyAgICAgICAgICAndXNpbmcgdGhlIHN5bnRheCAiKippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgJworICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAncGFyYW1ldGVyIHJlY2VpdmVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBleGNlc3Mga2V5d29yZFxuJworICAgICAgICAgICdhcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgJworICAgICAgICAgICdub1xuJworICAgICAgICAgICdleGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiB0aGUgc3ludGF4ICIqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCwgJworICAgICAgICAgICciZXhwcmVzc2lvbiJcbicKKyAgICAgICAgICAnbXVzdCBldmFsdWF0ZSB0byBhbiAqaXRlcmFibGUqLiAgRWxlbWVudHMgZnJvbSB0aGVzZSBpdGVyYWJsZXMgYXJlXG4nCisgICAgICAgICAgJ3RyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHMuICBGb3IgdGhlICcKKyAgICAgICAgICAnY2FsbFxuJworICAgICAgICAgICciZih4MSwgeDIsICp5LCB4MywgeDQpIiwgaWYgKnkqIGV2YWx1YXRlcyB0byBhIHNlcXVlbmNlICp5MSosIC4uLixcbicKKyAgICAgICAgICAnKnlNKiwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB3aXRoIE0rNCBwb3NpdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgJyp4MSosXG4nCisgICAgICAgICAgJyp4MiosICp5MSosIC4uLiwgKnlNKiwgKngzKiwgKng0Ki5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheCAnCisgICAgICAgICAgJ21heVxuJworICAgICAgICAgICdhcHBlYXIgKmFmdGVyKiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICcKKyAgICAgICAgICAnKmJlZm9yZSpcbicKKyAgICAgICAgICAndGhlIGtleXdvcmQgYXJndW1lbnRzIChhbmQgYW55ICIqKmV4cHJlc3Npb24iIGFyZ3VtZW50cyAtLSBzZWUgJworICAgICAgICAgICdiZWxvdykuXG4nCisgICAgICAgICAgJ1NvOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgPj4+IGRlZiBmKGEsIGIpOlxuJworICAgICAgICAgICcgICAuLi4gICAgIHByaW50KGEsIGIpXG4nCisgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICcgICA+Pj4gZihiPTEsICooMiwpKVxuJworICAgICAgICAgICcgICAyIDFcbicKKyAgICAgICAgICAnICAgPj4+IGYoYT0xLCAqKDIsKSlcbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbicKKyAgICAgICAgICAiICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYSdcbiIKKyAgICAgICAgICAnICAgPj4+IGYoMSwgKigyLCkpXG4nCisgICAgICAgICAgJyAgIDEgMlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlICIqZXhwcmVzc2lvbiIgJworICAgICAgICAgICdzeW50YXhcbicKKyAgICAgICAgICAndG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZSB0aGlzIGNvbmZ1c2lvbiBkb2VzICcKKyAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgJ2FyaXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgdGhlIHN5bnRheCAiKipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLFxuJworICAgICAgICAgICciZXhwcmVzc2lvbiIgbXVzdCBldmFsdWF0ZSB0byBhICptYXBwaW5nKiwgdGhlIGNvbnRlbnRzIG9mIHdoaWNoICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ3RyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIElmIGEga2V5d29yZCBpcyBhbHJlYWR5XG4nCisgICAgICAgICAgJ3ByZXNlbnQgKGFzIGFuIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnQsIG9yIGZyb20gYW5vdGhlciAnCisgICAgICAgICAgJ3VucGFja2luZyksXG4nCisgICAgICAgICAgJ2EgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0Zvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIlxuJworICAgICAgICAgICdjYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbicKKyAgICAgICAgICAnbmFtZXMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy41OiBGdW5jdGlvbiBjYWxscyBhY2NlcHQgYW55IG51bWJlciBvZiAiKiIgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnIioqIiB1bnBhY2tpbmdzLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXkgZm9sbG93IGl0ZXJhYmxlICcKKyAgICAgICAgICAndW5wYWNraW5nc1xuJworICAgICAgICAgICcoIioiKSwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBmb2xsb3cgZGljdGlvbmFyeSB1bnBhY2tpbmdzICcKKyAgICAgICAgICAnKCIqKiIpLlxuJworICAgICAgICAgICdPcmlnaW5hbGx5IHByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5ICJOb25lIiwgdW5sZXNzIGl0IHJhaXNlcyAnCisgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgJ2V4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG4nCisgICAgICAgICAgJ2NhbGxhYmxlIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGl0IGlzLS0tXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIHVzZXItZGVmaW5lZCBmdW5jdGlvbjpcbicKKyAgICAgICAgICAnICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbicKKyAgICAgICAgICAnICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJyAgIEZ1bmN0aW9uIGRlZmluaXRpb25zLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhICJyZXR1cm4iXG4nCisgICAgICAgICAgJyAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gJworICAgICAgICAgICdjYWxsLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XG4nCisgICAgICAgICAgJyAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgQnVpbHQtaW4gRnVuY3Rpb25zIGZvciAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBjbGFzcyBvYmplY3Q6XG4nCisgICAgICAgICAgJyAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIGNsYXNzIGluc3RhbmNlIG1ldGhvZDpcbicKKyAgICAgICAgICAnICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiAnCisgICAgICAgICAgJ2FyZ3VtZW50XG4nCisgICAgICAgICAgJyAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZVxuJworICAgICAgICAgICcgICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgY2xhc3MgaW5zdGFuY2U6XG4nCisgICAgICAgICAgJyAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhICJfX2NhbGxfXygpIiBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuXG4nLAorICdjbGFzcyc6ICdcbicKKyAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgJworICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICd0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiICcKKyAgICAgICAgICAnc3VpdGVcbicKKyAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4nCisgICAgICAgICAgJyAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgJworICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgJ3VzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIE1ldGFjbGFzc2VzIGZvciBtb3JlXG4nCisgICAgICAgICAgJ2FkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGEgJworICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICdvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlICcKKyAgICAgICAgICAnbGlzdFxuJworICAgICAgICAgICdpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGNsYXNzIEZvbzpcbicKKyAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGNsYXNzIEZvbyhvYmplY3QpOlxuJworICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiVGhlIGNsYXNzJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZVxuIgorICAgICAgICAgICdOYW1pbmcgYW5kIGJpbmRpbmcpLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGVcbicKKyAgICAgICAgICAnb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbicKKyAgICAgICAgICAiZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3MncyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sICIKKyAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgJ2V4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSAnCisgICAgICAgICAgJ0FcbicKKyAgICAgICAgICAnY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlICcKKyAgICAgICAgICAnYmFzZVxuJworICAgICAgICAgICdjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAnZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAnVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG4nCisgICAgICAgICAgJ25hbWVzcGFjZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0NsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyAnCisgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEBmMShhcmcpXG4nCisgICAgICAgICAgJyAgIEBmMlxuJworICAgICAgICAgICcgICBjbGFzcyBGb286IHBhc3NcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2lzIHJvdWdobHkgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgJyAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICdmdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBpcyB0aGVuIGJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiKipQcm9ncmFtbWVyJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAiCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICdjbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgJworICAgICAgICAgICdhdHRyaWJ1dGVzXG4nCisgICAgICAgICAgJ2NhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbicKKyAgICAgICAgICAnaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAnCisgICAgICAgICAgJyIic2VsZi5uYW1lIiIsXG4nCisgICAgICAgICAgJ2FuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSAnCisgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAnd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgJworICAgICAgICAgICdkZWZhdWx0c1xuJworICAgICAgICAgICdmb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkICcKKyAgICAgICAgICAndG9cbicKKyAgICAgICAgICAndW5leHBlY3RlZCByZXN1bHRzLiAgRGVzY3JpcHRvcnMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG4nCisgICAgICAgICAgJ3ZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4nCisgICAgICAgICAgJyAgQ2xhc3MgRGVjb3JhdG9yc1xuJywKKyAnY29tcGFyaXNvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgJ0NvbXBhcmlzb25zXG4nCisgICAgICAgICAgICAgICAgJyoqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdVbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgJ3ByaW9yaXR5LFxuJworICAgICAgICAgICAgICAgICd3aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yICcKKyAgICAgICAgICAgICAgICAnYml0d2lzZVxuJworICAgICAgICAgICAgICAgICdvcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlICJhIDwgYiA8IGMiIGhhdmUgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4nCisgICAgICAgICAgICAgICAgJyAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbicKKyAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCAiaXMiIFsibm90Il0gfCBbIm5vdCJdICJpbiJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0NvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0NvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCAieCA8IHkgPD0geiIgJworICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICdlcXVpdmFsZW50IHRvICJ4IDwgeSBhbmQgeSA8PSB6IiwgZXhjZXB0IHRoYXQgInkiIGlzICcKKyAgICAgICAgICAgICAgICAnZXZhbHVhdGVkIG9ubHlcbicKKyAgICAgICAgICAgICAgICAnb25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCAnCisgICAgICAgICAgICAgICAgJ3kiIGlzXG4nCisgICAgICAgICAgICAgICAgJ2ZvdW5kIHRvIGJlIGZhbHNlKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0Zvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgJworICAgICAgICAgICAgICAgICcqb3AxKixcbicKKyAgICAgICAgICAgICAgICAnKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiAnCisgICAgICAgICAgICAgICAgJ2MgLi4uIHlcbicKKyAgICAgICAgICAgICAgICAnb3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiAnCisgICAgICAgICAgICAgICAgJ3oiLCBleGNlcHRcbicKKyAgICAgICAgICAgICAgICAndGhhdCBlYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGF0IG1vc3Qgb25jZS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGJldHdlZW5cbicKKyAgICAgICAgICAgICAgICAnKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAnCisgICAgICAgICAgICAgICAgJyh0aG91Z2hcbicKKyAgICAgICAgICAgICAgICAncGVyaGFwcyBub3QgcHJldHR5KS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdWYWx1ZSBjb21wYXJpc29uc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9ycyAiPCIsICI+IiwgIj09IiwgIj49IiwgIjw9IiwgYW5kICIhPSIgY29tcGFyZSAnCisgICAgICAgICAgICAgICAgJ3RoZSB2YWx1ZXNcbicKKyAgICAgICAgICAgICAgICAnb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAndHlwZS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0NoYXB0ZXIgT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlcyBzdGF0ZXMgdGhhdCBvYmplY3RzIGhhdmUgYSAnCisgICAgICAgICAgICAgICAgJ3ZhbHVlIChpblxuJworICAgICAgICAgICAgICAgICdhZGRpdGlvbiB0byB0eXBlIGFuZCBpZGVudGl0eSkuICBUaGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzIGEgJworICAgICAgICAgICAgICAgICdyYXRoZXJcbicKKyAgICAgICAgICAgICAgICAnYWJzdHJhY3Qgbm90aW9uIGluIFB5dGhvbjogRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbCAnCisgICAgICAgICAgICAgICAgJ2FjY2Vzc1xuJworICAgICAgICAgICAgICAgICJtZXRob2QgZm9yIGFuIG9iamVjdCdzIHZhbHVlLiAgQWxzbywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgIgorICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICd2YWx1ZSBvZiBhbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIGluIGEgcGFydGljdWxhciB3YXksICcKKyAgICAgICAgICAgICAgICAnZS5nLlxuJworICAgICAgICAgICAgICAgICdjb21wcmlzZWQgb2YgYWxsIGl0cyBkYXRhIGF0dHJpYnV0ZXMuIENvbXBhcmlzb24gb3BlcmF0b3JzICcKKyAgICAgICAgICAgICAgICAnaW1wbGVtZW50IGFcbicKKyAgICAgICAgICAgICAgICAncGFydGljdWxhciBub3Rpb24gb2Ygd2hhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzLiAgT25lIGNhbiAnCisgICAgICAgICAgICAgICAgJ3RoaW5rIG9mXG4nCisgICAgICAgICAgICAgICAgJ3RoZW0gYXMgZGVmaW5pbmcgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpbmRpcmVjdGx5LCBieSBtZWFucyAnCisgICAgICAgICAgICAgICAgJ29mIHRoZWlyXG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gaW1wbGVtZW50YXRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdCZWNhdXNlIGFsbCB0eXBlcyBhcmUgKGRpcmVjdCBvciBpbmRpcmVjdCkgc3VidHlwZXMgb2YgJworICAgICAgICAgICAgICAgICcib2JqZWN0IiwgdGhleVxuJworICAgICAgICAgICAgICAgICdpbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IgZnJvbSAib2JqZWN0Ii4gIFR5cGVzICcKKyAgICAgICAgICAgICAgICAnY2FuXG4nCisgICAgICAgICAgICAgICAgJ2N1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIGJ5IGltcGxlbWVudGluZyAqcmljaCAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAgICAnbWV0aG9kcyogbGlrZSAiX19sdF9fKCkiLCBkZXNjcmliZWQgaW4gQmFzaWMgY3VzdG9taXphdGlvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlcXVhbGl0eSBjb21wYXJpc29uICgiPT0iIGFuZCAiIT0iKSAnCisgICAgICAgICAgICAgICAgJ2lzIGJhc2VkXG4nCisgICAgICAgICAgICAgICAgJ29uIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4gIEhlbmNlLCBlcXVhbGl0eSBjb21wYXJpc29uICcKKyAgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgcmVzdWx0cyBpbiBlcXVhbGl0eSwgYW5kICcKKyAgICAgICAgICAgICAgICAnZXF1YWxpdHlcbicKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBvZiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgaWRlbnRpdGllcyByZXN1bHRzIGluXG4nCisgICAgICAgICAgICAgICAgJ2luZXF1YWxpdHkuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCBiZWhhdmlvciBpcyB0aGUgJworICAgICAgICAgICAgICAgICdkZXNpcmUgdGhhdFxuJworICAgICAgICAgICAgICAgICdhbGwgb2JqZWN0cyBzaG91bGQgYmUgcmVmbGV4aXZlIChpLmUuICJ4IGlzIHkiIGltcGxpZXMgInggPT0gJworICAgICAgICAgICAgICAgICd5IikuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdBIGRlZmF1bHQgb3JkZXIgY29tcGFyaXNvbiAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSBpcyBub3QgJworICAgICAgICAgICAgICAgICdwcm92aWRlZDtcbicKKyAgICAgICAgICAgICAgICAnYW4gYXR0ZW1wdCByYWlzZXMgIlR5cGVFcnJvciIuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgJ2JlaGF2aW9yXG4nCisgICAgICAgICAgICAgICAgJ2lzIHRoZSBsYWNrIG9mIGEgc2ltaWxhciBpbnZhcmlhbnQgYXMgZm9yIGVxdWFsaXR5LlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IGVxdWFsaXR5IGNvbXBhcmlzb24sIHRoYXQgJworICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgd2l0aFxuJworICAgICAgICAgICAgICAgICdkaWZmZXJlbnQgaWRlbnRpdGllcyBhcmUgYWx3YXlzIHVuZXF1YWwsIG1heSBiZSBpbiBjb250cmFzdCAnCisgICAgICAgICAgICAgICAgJ3RvIHdoYXRcbicKKyAgICAgICAgICAgICAgICAndHlwZXMgd2lsbCBuZWVkIHRoYXQgaGF2ZSBhIHNlbnNpYmxlIGRlZmluaXRpb24gb2Ygb2JqZWN0ICcKKyAgICAgICAgICAgICAgICAndmFsdWUgYW5kXG4nCisgICAgICAgICAgICAgICAgJ3ZhbHVlLWJhc2VkIGVxdWFsaXR5LiAgU3VjaCB0eXBlcyB3aWxsIG5lZWQgdG8gY3VzdG9taXplICcKKyAgICAgICAgICAgICAgICAndGhlaXJcbicKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBiZWhhdmlvciwgYW5kIGluIGZhY3QsIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzICcKKyAgICAgICAgICAgICAgICAnaGF2ZSBkb25lXG4nCisgICAgICAgICAgICAgICAgJ3RoYXQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGxpc3QgZGVzY3JpYmVzIHRoZSBjb21wYXJpc29uIGJlaGF2aW9yIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgJ21vc3RcbicKKyAgICAgICAgICAgICAgICAnaW1wb3J0YW50IGJ1aWx0LWluIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBOdW1iZXJzIG9mIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgKE51bWVyaWMgVHlwZXMgLS0tIGludCwgJworICAgICAgICAgICAgICAgICdmbG9hdCxcbicKKyAgICAgICAgICAgICAgICAnICBjb21wbGV4KSBhbmQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgJworICAgICAgICAgICAgICAgICciZnJhY3Rpb25zLkZyYWN0aW9uIiBhbmRcbicKKyAgICAgICAgICAgICAgICAnICAiZGVjaW1hbC5EZWNpbWFsIiBjYW4gYmUgY29tcGFyZWQgd2l0aGluIGFuZCBhY3Jvc3MgdGhlaXIgJworICAgICAgICAgICAgICAgICd0eXBlcyxcbicKKyAgICAgICAgICAgICAgICAnICB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0IGNvbXBsZXggbnVtYmVycyBkbyBub3Qgc3VwcG9ydCAnCisgICAgICAgICAgICAgICAgJ29yZGVyXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyaXNvbi4gIFdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSB0eXBlcyBpbnZvbHZlZCwgdGhleSAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmVcbicKKyAgICAgICAgICAgICAgICAnICBtYXRoZW1hdGljYWxseSAoYWxnb3JpdGhtaWNhbGx5KSBjb3JyZWN0IHdpdGhvdXQgbG9zcyBvZiAnCisgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgVGhlIG5vdC1hLW51bWJlciB2YWx1ZXMgImZsb2F0KFwnTmFOXCcpIiBhbmQgJworICAgICAgICAgICAgICAgICciRGVjaW1hbChcJ05hTlwnKSIgYXJlXG4nCisgICAgICAgICAgICAgICAgJyAgc3BlY2lhbC4gIFRoZXkgYXJlIGlkZW50aWNhbCB0byB0aGVtc2VsdmVzICgieCBpcyB4IiBpcyAnCisgICAgICAgICAgICAgICAgJ3RydWUpIGJ1dFxuJworICAgICAgICAgICAgICAgICcgIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcyAoInggPT0geCIgaXMgZmFsc2UpLiAgJworICAgICAgICAgICAgICAgICdBZGRpdGlvbmFsbHksXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyaW5nIGFueSBudW1iZXIgdG8gYSBub3QtYS1udW1iZXIgdmFsdWUgd2lsbCByZXR1cm4gJworICAgICAgICAgICAgICAgICciRmFsc2UiLlxuJworICAgICAgICAgICAgICAgICcgIEZvciBleGFtcGxlLCBib3RoICIzIDwgZmxvYXQoXCdOYU5cJykiIGFuZCAiZmxvYXQoXCdOYU5cJykgJworICAgICAgICAgICAgICAgICc8IDMiIHdpbGxcbicKKyAgICAgICAgICAgICAgICAnICByZXR1cm4gIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogQmluYXJ5IHNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJieXRlcyIgb3IgImJ5dGVhcnJheSIpIGNhbiAnCisgICAgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyZWQgd2l0aGluIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMuICBUaGV5IGNvbXBhcmVcbicKKyAgICAgICAgICAgICAgICAnICBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlaXIgJworICAgICAgICAgICAgICAgICdlbGVtZW50cy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogU3RyaW5ncyAoaW5zdGFuY2VzIG9mICJzdHIiKSBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5ICcKKyAgICAgICAgICAgICAgICAndXNpbmcgdGhlXG4nCisgICAgICAgICAgICAgICAgJyAgbnVtZXJpY2FsIFVuaWNvZGUgY29kZSBwb2ludHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAnZnVuY3Rpb25cbicKKyAgICAgICAgICAgICAgICAnICAib3JkKCkiKSBvZiB0aGVpciBjaGFyYWN0ZXJzLiBbM11cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgU3RyaW5ncyBhbmQgYmluYXJ5IHNlcXVlbmNlcyBjYW5ub3QgYmUgZGlyZWN0bHkgY29tcGFyZWQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIFNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJ0dXBsZSIsICJsaXN0Iiwgb3IgInJhbmdlIikgY2FuICcKKyAgICAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAgICAnICBjb21wYXJlZCBvbmx5IHdpdGhpbiBlYWNoIG9mIHRoZWlyIHR5cGVzLCB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICAgJ3Jlc3RyaWN0aW9uIHRoYXRcbicKKyAgICAgICAgICAgICAgICAnICByYW5nZXMgZG8gbm90IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbi4gIEVxdWFsaXR5ICcKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBhY3Jvc3NcbicKKyAgICAgICAgICAgICAgICAnICB0aGVzZSB0eXBlcyByZXN1bHRzIGluIHVuZXF1YWxpdHksIGFuZCBvcmRlcmluZyBjb21wYXJpc29uICcKKyAgICAgICAgICAgICAgICAnYWNyb3NzXG4nCisgICAgICAgICAgICAgICAgJyAgdGhlc2UgdHlwZXMgcmFpc2VzICJUeXBlRXJyb3IiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBTZXF1ZW5jZXMgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mXG4nCisgICAgICAgICAgICAgICAgJyAgY29ycmVzcG9uZGluZyBlbGVtZW50cywgd2hlcmVieSByZWZsZXhpdml0eSBvZiB0aGUgZWxlbWVudHMgJworICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICcgIGVuZm9yY2VkLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBJbiBlbmZvcmNpbmcgcmVmbGV4aXZpdHkgb2YgZWxlbWVudHMsIHRoZSBjb21wYXJpc29uIG9mICcKKyAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnNcbicKKyAgICAgICAgICAgICAgICAnICBhc3N1bWVzIHRoYXQgZm9yIGEgY29sbGVjdGlvbiBlbGVtZW50ICJ4IiwgInggPT0geCIgaXMgJworICAgICAgICAgICAgICAgICdhbHdheXMgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAnICBCYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGVsZW1lbnQgaWRlbnRpdHkgaXMgY29tcGFyZWQgJworICAgICAgICAgICAgICAgICdmaXJzdCwgYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgZWxlbWVudCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBvbmx5IGZvciBkaXN0aW5jdCAnCisgICAgICAgICAgICAgICAgJ2VsZW1lbnRzLiAgVGhpc1xuJworICAgICAgICAgICAgICAgICcgIGFwcHJvYWNoIHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgYSBzdHJpY3QgZWxlbWVudCAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAgICAnICB3b3VsZCwgaWYgdGhlIGNvbXBhcmVkIGVsZW1lbnRzIGFyZSByZWZsZXhpdmUuICBGb3IgJworICAgICAgICAgICAgICAgICdub24tcmVmbGV4aXZlXG4nCisgICAgICAgICAgICAgICAgJyAgZWxlbWVudHMsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IHRoYW4gZm9yIHN0cmljdCBlbGVtZW50XG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyaXNvbiwgYW5kIG1heSBiZSBzdXJwcmlzaW5nOiAgVGhlIG5vbi1yZWZsZXhpdmUgJworICAgICAgICAgICAgICAgICdub3QtYS1udW1iZXJcbicKKyAgICAgICAgICAgICAgICAnICB2YWx1ZXMgZm9yIGV4YW1wbGUgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbiAnCisgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIHdoZW5cbicKKyAgICAgICAgICAgICAgICAnICB1c2VkIGluIGEgbGlzdDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgIiAgICAgPj4+IG5hbiA9IGZsb2F0KCdOYU4nKVxuIgorICAgICAgICAgICAgICAgICcgICAgID4+PiBuYW4gaXMgbmFuXG4nCisgICAgICAgICAgICAgICAgJyAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICcgICAgID4+PiBuYW4gPT0gbmFuXG4nCisgICAgICAgICAgICAgICAgJyAgICAgRmFsc2UgICAgICAgICAgICAgICAgIDwtLSB0aGUgZGVmaW5lZCBub24tcmVmbGV4aXZlICcKKyAgICAgICAgICAgICAgICAnYmVoYXZpb3Igb2YgTmFOXG4nCisgICAgICAgICAgICAgICAgJyAgICAgPj4+IFtuYW5dID09IFtuYW5dXG4nCisgICAgICAgICAgICAgICAgJyAgICAgVHJ1ZSAgICAgICAgICAgICAgICAgIDwtLSBsaXN0IGVuZm9yY2VzIHJlZmxleGl2aXR5IGFuZCAnCisgICAgICAgICAgICAgICAgJ3Rlc3RzIGlkZW50aXR5IGZpcnN0XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIExleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIGJldHdlZW4gYnVpbHQtaW4gY29sbGVjdGlvbnMgJworICAgICAgICAgICAgICAgICd3b3JrcyBhc1xuJworICAgICAgICAgICAgICAgICcgIGZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICogRm9yIHR3byBjb2xsZWN0aW9ucyB0byBjb21wYXJlIGVxdWFsLCB0aGV5IG11c3QgYmUgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgICcgICAgdHlwZSwgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIGFuZCBlYWNoIHBhaXIgb2YgJworICAgICAgICAgICAgICAgICdjb3JyZXNwb25kaW5nXG4nCisgICAgICAgICAgICAgICAgJyAgICBlbGVtZW50cyBtdXN0IGNvbXBhcmUgZXF1YWwgKGZvciBleGFtcGxlLCAiWzEsMl0gPT0gJworICAgICAgICAgICAgICAgICcoMSwyKSIgaXNcbicKKyAgICAgICAgICAgICAgICAnICAgIGZhbHNlIGJlY2F1c2UgdGhlIHR5cGUgaXMgbm90IHRoZSBzYW1lKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgKiBDb2xsZWN0aW9ucyB0aGF0IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbiBhcmUgb3JkZXJlZCB0aGUgJworICAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAgJyAgICBhcyB0aGVpciBmaXJzdCB1bmVxdWFsIGVsZW1lbnRzIChmb3IgZXhhbXBsZSwgIlsxLDIseF0gPD0gJworICAgICAgICAgICAgICAgICdbMSwyLHldIlxuJworICAgICAgICAgICAgICAgICcgICAgaGFzIHRoZSBzYW1lIHZhbHVlIGFzICJ4IDw9IHkiKS4gIElmIGEgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgICAgJ2VsZW1lbnQgZG9lc1xuJworICAgICAgICAgICAgICAgICcgICAgbm90IGV4aXN0LCB0aGUgc2hvcnRlciBjb2xsZWN0aW9uIGlzIG9yZGVyZWQgZmlyc3QgKGZvciAnCisgICAgICAgICAgICAgICAgJ2V4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgJyAgICAiWzEsMl0gPCBbMSwyLDNdIiBpcyB0cnVlKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogTWFwcGluZ3MgKGluc3RhbmNlcyBvZiAiZGljdCIpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgJworICAgICAgICAgICAgICAgICd0aGV5XG4nCisgICAgICAgICAgICAgICAgJyAgaGF2ZSBlcXVhbCAqKGtleSwgdmFsdWUpKiBwYWlycy4gRXF1YWxpdHkgY29tcGFyaXNvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICdrZXlzIGFuZFxuJworICAgICAgICAgICAgICAgICcgIGVsZW1lbnRzIGVuZm9yY2VzIHJlZmxleGl2aXR5LlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBPcmRlciBjb21wYXJpc29ucyAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSByYWlzZSAnCisgICAgICAgICAgICAgICAgJyJUeXBlRXJyb3IiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBTZXRzIChpbnN0YW5jZXMgb2YgInNldCIgb3IgImZyb3plbnNldCIpIGNhbiBiZSBjb21wYXJlZCAnCisgICAgICAgICAgICAgICAgJ3dpdGhpblxuJworICAgICAgICAgICAgICAgICcgIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFRoZXkgZGVmaW5lIG9yZGVyIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIG1lYW4gc3Vic2V0IGFuZCAnCisgICAgICAgICAgICAgICAgJ3N1cGVyc2V0XG4nCisgICAgICAgICAgICAgICAgJyAgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKGZvciAnCisgICAgICAgICAgICAgICAgJ2V4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgJyAgdGhlIHR3byBzZXRzICJ7MSwyfSIgYW5kICJ7MiwzfSIgYXJlIG5vdCBlcXVhbCwgbm9yIHN1YnNldHMgJworICAgICAgICAgICAgICAgICdvZiBvbmVcbicKKyAgICAgICAgICAgICAgICAnICBhbm90aGVyLCBub3Igc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyKS4gIEFjY29yZGluZ2x5LCBzZXRzICcKKyAgICAgICAgICAgICAgICAnYXJlIG5vdFxuJworICAgICAgICAgICAgICAgICcgIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCAnCisgICAgICAgICAgICAgICAgJ29yZGVyaW5nXG4nCisgICAgICAgICAgICAgICAgJyAgKGZvciBleGFtcGxlLCAibWluKCkiLCAibWF4KCkiLCBhbmQgInNvcnRlZCgpIiBwcm9kdWNlICcKKyAgICAgICAgICAgICAgICAndW5kZWZpbmVkXG4nCisgICAgICAgICAgICAgICAgJyAgcmVzdWx0cyBnaXZlbiBhIGxpc3Qgb2Ygc2V0cyBhcyBpbnB1dHMpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBDb21wYXJpc29uIG9mIHNldHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkgb2YgaXRzIGVsZW1lbnRzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBNb3N0IG90aGVyIGJ1aWx0LWluIHR5cGVzIGhhdmUgbm8gY29tcGFyaXNvbiBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQsXG4nCisgICAgICAgICAgICAgICAgJyAgc28gdGhleSBpbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdVc2VyLWRlZmluZWQgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yICcKKyAgICAgICAgICAgICAgICAnc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgJ2ZvbGxvdyBzb21lIGNvbnNpc3RlbmN5IHJ1bGVzLCBpZiBwb3NzaWJsZTpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogRXF1YWxpdHkgY29tcGFyaXNvbiBzaG91bGQgYmUgcmVmbGV4aXZlLiBJbiBvdGhlciB3b3JkcywgJworICAgICAgICAgICAgICAgICdpZGVudGljYWxcbicKKyAgICAgICAgICAgICAgICAnICBvYmplY3RzIHNob3VsZCBjb21wYXJlIGVxdWFsOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIENvbXBhcmlzb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4gSW4gb3RoZXIgd29yZHMsIHRoZSAnCisgICAgICAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAgICAgICcgIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPT0geSIgYW5kICJ5ID09IHgiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ICE9IHkiIGFuZCAieSAhPSB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8IHkiIGFuZCAieSA+IHgiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4IDw9IHkiIGFuZCAieSA+PSB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBDb21wYXJpc29uIHNob3VsZCBiZSB0cmFuc2l0aXZlLiBUaGUgZm9sbG93aW5nICcKKyAgICAgICAgICAgICAgICAnKG5vbi1leGhhdXN0aXZlKVxuJworICAgICAgICAgICAgICAgICcgIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhhdDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPiB5IGFuZCB5ID4geiIgaW1wbGllcyAieCA+IHoiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4IDwgeSBhbmQgeSA8PSB6IiBpbXBsaWVzICJ4IDwgeiJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogSW52ZXJzZSBjb21wYXJpc29uIHNob3VsZCByZXN1bHQgaW4gdGhlIGJvb2xlYW4gbmVnYXRpb24uICcKKyAgICAgICAgICAgICAgICAnSW4gb3RoZXJcbicKKyAgICAgICAgICAgICAgICAnICB3b3JkcywgdGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgJ3Jlc3VsdDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPT0geSIgYW5kICJub3QgeCAhPSB5IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8IHkiIGFuZCAibm90IHggPj0geSIgKGZvciB0b3RhbCBvcmRlcmluZylcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPiB5IiBhbmQgIm5vdCB4IDw9IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFRoZSBsYXN0IHR3byBleHByZXNzaW9ucyBhcHBseSB0byB0b3RhbGx5IG9yZGVyZWQgJworICAgICAgICAgICAgICAgICdjb2xsZWN0aW9ucyAoZS5nLlxuJworICAgICAgICAgICAgICAgICcgIHRvIHNlcXVlbmNlcywgYnV0IG5vdCB0byBzZXRzIG9yIG1hcHBpbmdzKS4gU2VlIGFsc28gdGhlXG4nCisgICAgICAgICAgICAgICAgJyAgInRvdGFsX29yZGVyaW5nKCkiIGRlY29yYXRvci5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1B5dGhvbiBkb2VzIG5vdCBlbmZvcmNlIHRoZXNlIGNvbnNpc3RlbmN5IHJ1bGVzLiBJbiBmYWN0LCAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICdub3QtYS1udW1iZXIgdmFsdWVzIGFyZSBhbiBleGFtcGxlIGZvciBub3QgZm9sbG93aW5nIHRoZXNlICcKKyAgICAgICAgICAgICAgICAncnVsZXMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnTWVtYmVyc2hpcCB0ZXN0IG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluICcKKyAgICAgICAgICAgICAgICAncyJcbicKKyAgICAgICAgICAgICAgICAnZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlICcKKyAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlLiAgInhcbicKKyAgICAgICAgICAgICAgICAnbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAnc2VxdWVuY2VzXG4nCisgICAgICAgICAgICAgICAgJ2FuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICcKKyAgICAgICAgICAgICAgICAnImluIiB0ZXN0c1xuJworICAgICAgICAgICAgICAgICd3aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyAnCisgICAgICAgICAgICAgICAgJ3N1Y2ggYXNcbicKKyAgICAgICAgICAgICAgICAnbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG4nCisgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgJworICAgICAgICAgICAgICAgICdmb3IgZSBpblxuJworICAgICAgICAgICAgICAgICd5KSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdGb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgJworICAgICAgICAgICAgICAgICdpZiAqeCogaXNcbicKKyAgICAgICAgICAgICAgICAnYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gJworICAgICAgICAgICAgICAgICctMSIuICBFbXB0eVxuJworICAgICAgICAgICAgICAgICdzdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgJworICAgICAgICAgICAgICAgICdzdHJpbmcsXG4nCisgICAgICAgICAgICAgICAgJ3NvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiAnCisgICAgICAgICAgICAgICAgJ21ldGhvZCwgInhcbicKKyAgICAgICAgICAgICAgICAnaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiICcKKyAgICAgICAgICAgICAgICAnYnV0IGRvXG4nCisgICAgICAgICAgICAgICAgJ2RlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAnCisgICAgICAgICAgICAgICAgJyJ4ID09IHoiXG4nCisgICAgICAgICAgICAgICAgJ2lzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICAgICAgJ3JhaXNlZFxuJworICAgICAgICAgICAgICAgICdkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCAnCisgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0xhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICdkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhICcKKyAgICAgICAgICAgICAgICAnbm9uLVxuJworICAgICAgICAgICAgICAgICduZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgJworICAgICAgICAgICAgICAgICdsb3dlclxuJworICAgICAgICAgICAgICAgICdpbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55ICcKKyAgICAgICAgICAgICAgICAnb3RoZXJcbicKKyAgICAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCAnCisgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbikuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgJworICAgICAgICAgICAgICAgICd2YWx1ZSBvZlxuJworICAgICAgICAgICAgICAgICciaW4iLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aXR5IGNvbXBhcmlzb25zXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgb3BlcmF0b3JzICJpcyIgYW5kICJpcyBub3QiIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogInggJworICAgICAgICAgICAgICAgICdpcyB5IiBpc1xuJworICAgICAgICAgICAgICAgICd0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICAieCBpcyAnCisgICAgICAgICAgICAgICAgJ25vdCB5IlxuJworICAgICAgICAgICAgICAgICd5aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKKyAnY29tcG91bmQnOiAnXG4nCisgICAgICAgICAgICAgJ0NvbXBvdW5kIHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgJworICAgICAgICAgICAgICdhZmZlY3RcbicKKyAgICAgICAgICAgICAnb3IgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRob3NlIG90aGVyIHN0YXRlbWVudHMgaW4gc29tZSB3YXkuICAnCisgICAgICAgICAgICAgJ0luXG4nCisgICAgICAgICAgICAgJ2dlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gJworICAgICAgICAgICAgICdzaW1wbGVcbicKKyAgICAgICAgICAgICAnaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lICcKKyAgICAgICAgICAgICAnbGluZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiaWYiLCAid2hpbGUiIGFuZCAiZm9yIiBzdGF0ZW1lbnRzIGltcGxlbWVudCB0cmFkaXRpb25hbCAnCisgICAgICAgICAgICAgJ2NvbnRyb2xcbicKKyAgICAgICAgICAgICAnZmxvdyBjb25zdHJ1Y3RzLiAgInRyeSIgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgJworICAgICAgICAgICAgICdjbGVhbnVwXG4nCisgICAgICAgICAgICAgJ2NvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cywgd2hpbGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgJworICAgICAgICAgICAgICdhbGxvd3MgdGhlXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiBpbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIGNvZGUgYXJvdW5kIGEgYmxvY2sgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICdjb2RlLiAgRnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgJworICAgICAgICAgICAgICdjb21wb3VuZFxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiQSBjb21wb3VuZCBzdGF0ZW1lbnQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgJ2NsYXVzZXMuJyAgQSAiCisgICAgICAgICAgICAgJ2NsYXVzZVxuJworICAgICAgICAgICAgICJjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSAnc3VpdGUuJyAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGFcbiIKKyAgICAgICAgICAgICAncGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiAnCisgICAgICAgICAgICAgJ2xldmVsLlxuJworICAgICAgICAgICAgICdFYWNoIGNsYXVzZSBoZWFkZXIgYmVnaW5zIHdpdGggYSB1bmlxdWVseSBpZGVudGlmeWluZyBrZXl3b3JkICcKKyAgICAgICAgICAgICAnYW5kIGVuZHNcbicKKyAgICAgICAgICAgICAnd2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhXG4nCisgICAgICAgICAgICAgJ2NsYXVzZS4gIEEgc3VpdGUgY2FuIGJlIG9uZSBvciBtb3JlIHNlbWljb2xvbi1zZXBhcmF0ZWQgc2ltcGxlXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlICcKKyAgICAgICAgICAgICAiaGVhZGVyJ3NcbiIKKyAgICAgICAgICAgICAnY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uICcKKyAgICAgICAgICAgICAnc3Vic2VxdWVudFxuJworICAgICAgICAgICAgICdsaW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIGEgc3VpdGUgY2FuIGNvbnRhaW4gbmVzdGVkICcKKyAgICAgICAgICAgICAnY29tcG91bmRcbicKKyAgICAgICAgICAgICAic3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG4ndCAiCisgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgJ2NsZWFyIHRvIHdoaWNoICJpZiIgY2xhdXNlIGEgZm9sbG93aW5nICJlbHNlIiBjbGF1c2Ugd291bGQgJworICAgICAgICAgICAgICdiZWxvbmc6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50KHgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBbHNvIG5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIGJpbmRzIHRpZ2h0ZXIgdGhhbiB0aGUgY29sb24gaW4gJworICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgJ2NvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnInByaW50KCkiIGNhbGxzIGFyZSBleGVjdXRlZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGlmIHggPCB5IDwgejogcHJpbnQoeCk7IHByaW50KHkpOyBwcmludCh6KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU3VtbWFyaXppbmc6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBjb21wb3VuZF9zdG10IDo6PSBpZl9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgdHJ5X3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCB3aXRoX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWZcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBhc3luY193aXRoX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mb3Jfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Z1bmNkZWZcbicKKyAgICAgICAgICAgICAnICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCAnCisgICAgICAgICAgICAgJ3N0YXRlbWVudCsgREVERU5UXG4nCisgICAgICAgICAgICAgJyAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuJworICAgICAgICAgICAgICcgICBzdG10X2xpc3QgICAgIDo6PSBzaW1wbGVfc3RtdCAoIjsiIHNpbXBsZV9zdG10KSogWyI7Il1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSAiTkVXTElORSIgcG9zc2libHkgZm9sbG93ZWQgJworICAgICAgICAgICAgICdieSBhXG4nCisgICAgICAgICAgICAgJyJERURFTlQiLiAgQWxzbyBub3RlIHRoYXQgb3B0aW9uYWwgY29udGludWF0aW9uIGNsYXVzZXMgYWx3YXlzICcKKyAgICAgICAgICAgICAnYmVnaW5cbicKKyAgICAgICAgICAgICAnd2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vXG4nCisgICAgICAgICAgICAgJ2FtYmlndWl0aWVzICh0aGUgXCdkYW5nbGluZyAiZWxzZSJcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICdyZXF1aXJpbmcgbmVzdGVkICJpZiIgc3RhdGVtZW50cyB0byBiZSBpbmRlbnRlZCkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zICcKKyAgICAgICAgICAgICAncGxhY2VzXG4nCisgICAgICAgICAgICAgJ2VhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zIG9uZVxuJworICAgICAgICAgICAgICdieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uIEJvb2xlYW4gJworICAgICAgICAgICAgICdvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJ2ZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkXG4nCisgICAgICAgICAgICAgJyhhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgJworICAgICAgICAgICAgICdldmFsdWF0ZWQpLlxuJworICAgICAgICAgICAgICdJZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsICcKKyAgICAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAgICAncHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyB0cnVlOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsICcKKyAgICAgICAgICAgICAnZXhlY3V0ZXMgdGhlXG4nCisgICAgICAgICAgICAgJ2ZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCAnCisgICAgICAgICAgICAgJ3RpbWVcbicKKyAgICAgICAgICAgICAnaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzICcKKyAgICAgICAgICAgICAnZXhlY3V0ZWRcbicKKyAgICAgICAgICAgICAnYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSAnCisgICAgICAgICAgICAgJ2xvb3BcbicKKyAgICAgICAgICAgICAnd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgJworICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyAnCisgICAgICAgICAgICAgJ2JhY2tcbicKKyAgICAgICAgICAgICAndG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgJworICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICcoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiAnCisgICAgICAgICAgICAgJ3N1aXRlXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiAnCisgICAgICAgICAgICAgJ2l0ZXJhYmxlXG4nCisgICAgICAgICAgICAgJ29iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG4nCisgICAgICAgICAgICAgJyJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCAnCisgICAgICAgICAgICAgJ2l0ZW1cbicKKyAgICAgICAgICAgICAncHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAnaXRlcmF0b3IuICBFYWNoXG4nCisgICAgICAgICAgICAgJ2l0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkICcKKyAgICAgICAgICAgICAncnVsZXNcbicKKyAgICAgICAgICAgICAnZm9yIGFzc2lnbm1lbnRzIChzZWUgQXNzaWdubWVudCBzdGF0ZW1lbnRzKSwgYW5kIHRoZW4gdGhlIHN1aXRlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSAnCisgICAgICAgICAgICAgJ3doZW4gdGhlXG4nCisgICAgICAgICAgICAgJ3NlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiksXG4nCisgICAgICAgICAgICAgJ3RoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgJworICAgICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgICAgJ3Rlcm1pbmF0ZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSAnCisgICAgICAgICAgICAgJ2xvb3BcbicKKyAgICAgICAgICAgICAnd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgJworICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgJworICAgICAgICAgICAgICdjb250aW51ZXNcbicKKyAgICAgICAgICAgICAnd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vICcKKyAgICAgICAgICAgICAnbmV4dFxuJworICAgICAgICAgICAgICdpdGVtLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCAnCisgICAgICAgICAgICAgJ2xpc3QuXG4nCisgICAgICAgICAgICAgJ1RoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzICcKKyAgICAgICAgICAgICAnaW5jbHVkaW5nXG4nCisgICAgICAgICAgICAgJ3Rob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZvciBpIGluIHJhbmdlKDEwKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIHByaW50KGkpXG4nCisgICAgICAgICAgICAgJyAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoICcKKyAgICAgICAgICAgICAndGhlIG5leHRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgJworICAgICAgICAgICAgICdmaW5pc2hlZCxcbicKKyAgICAgICAgICAgICAnYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgJworICAgICAgICAgICAgICd0byBhdFxuJworICAgICAgICAgICAgICdhbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICJpdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsJ3MgIgorICAgICAgICAgICAgICciZm9yIGlcbicKKyAgICAgICAgICAgICAnOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgJworICAgICAgICAgICAgICcyXSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5ICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgJworICAgICAgICAgICAgICdBblxuJworICAgICAgICAgICAgICcgIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCAnCisgICAgICAgICAgICAgJ25leHQsXG4nCisgICAgICAgICAgICAgJyAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciAnCisgICAgICAgICAgICAgJ2hhc1xuJworICAgICAgICAgICAgICcgIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgJworICAgICAgICAgICAgICdtZWFuc1xuJworICAgICAgICAgICAgICcgIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gJworICAgICAgICAgICAgICdmcm9tIHRoZVxuJworICAgICAgICAgICAgICcgIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgJworICAgICAgICAgICAgICdpbmRleCBvZlxuJworICAgICAgICAgICAgICcgIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCAnCisgICAgICAgICAgICAgJ2lmIHRoZVxuJworICAgICAgICAgICAgICcgIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlICcKKyAgICAgICAgICAgICAnbG9vcC5cbicKKyAgICAgICAgICAgICAnICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuJworICAgICAgICAgICAgICcgIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICBmb3IgeCBpbiBhWzpdOlxuJworICAgICAgICAgICAgICcgICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgInRyeSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCAnCisgICAgICAgICAgICAgJ2NvZGVcbicKKyAgICAgICAgICAgICAnZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4nCisgICAgICAgICAgICAgJyAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgJworICAgICAgICAgICAgICdzdWl0ZSkrXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJyAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gJworICAgICAgICAgICAgICdXaGVuIG5vXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoICcKKyAgICAgICAgICAgICAnZm9yIGFuXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0ICcKKyAgICAgICAgICAgICAnY2xhdXNlc1xuJworICAgICAgICAgICAgICdpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbi1cbicKKyAgICAgICAgICAgICAnbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlICcKKyAgICAgICAgICAgICAncmVzdWx0aW5nXG4nCisgICAgICAgICAgICAgJ29iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzICcKKyAgICAgICAgICAgICAnY29tcGF0aWJsZVxuJworICAgICAgICAgICAgICd3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICdvYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICdoYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gJworICAgICAgICAgICAgICdzdGFjay5cbicKKyAgICAgICAgICAgICAnWzFdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0ICcKKyAgICAgICAgICAgICAnY2xhdXNlXG4nCisgICAgICAgICAgICAgJ3JhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyAnCisgICAgICAgICAgICAgJ2NhbmNlbGVkIGFuZFxuJworICAgICAgICAgICAgICdhIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlICcKKyAgICAgICAgICAgICAnYW5kIG9uXG4nCisgICAgICAgICAgICAgJ3RoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50ICcKKyAgICAgICAgICAgICAncmFpc2VkXG4nCisgICAgICAgICAgICAgJ3RoZSBleGNlcHRpb24pLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICdhc3NpZ25lZCB0b1xuJworICAgICAgICAgICAgICd0aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0ICcKKyAgICAgICAgICAgICAnY2xhdXNlLCBpZlxuJworICAgICAgICAgICAgICJwcmVzZW50LCBhbmQgdGhlIGV4Y2VwdCBjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHRcbiIKKyAgICAgICAgICAgICAnY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzICcKKyAgICAgICAgICAgICAnYmxvY2sgaXNcbicKKyAgICAgICAgICAgICAncmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSAnCisgICAgICAgICAgICAgJ3N0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbixcbicKKyAgICAgICAgICAgICAnYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdvdXRlciBoYW5kbGVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyAnCisgICAgICAgICAgICAgJ2NsZWFyZWRcbicKKyAgICAgICAgICAgICAnYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdCBFIGFzIE46XG4nCisgICAgICAgICAgICAgJyAgICAgICBmb29cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3dhcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAgICAgICcgICAgICAgdHJ5OlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIGZvb1xuJworICAgICAgICAgICAgICcgICAgICAgZmluYWxseTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBkZWwgTlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byAnCisgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgJ2FibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSAnCisgICAgICAgICAgICAgJ2NsZWFyZWRcbicKKyAgICAgICAgICAgICAnYmVjYXVzZSB3aXRoIHRoZSB0cmFjZWJhY2sgYXR0YWNoZWQgdG8gdGhlbSwgdGhleSBmb3JtIGEgJworICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAnY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lICcKKyAgICAgICAgICAgICAnYWxpdmVcbicKKyAgICAgICAgICAgICAndW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG4iCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCAnCisgICAgICAgICAgICAgJ3ZpYVxuJworICAgICAgICAgICAgICcic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3RpbmcgJworICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgJworICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAncHJvZ3JhbSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiAgInN5cy5leGNfaW5mbygpIiB2YWx1ZXMgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAncmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gJworICAgICAgICAgICAgICdyZXR1cm5pbmdcbicKKyAgICAgICAgICAgICAnZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzICcKKyAgICAgICAgICAgICAnb2ZmXG4nCisgICAgICAgICAgICAgJ3RoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSWYgImZpbmFsbHkiIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICAnCisgICAgICAgICAgICAgJ1RoZSAidHJ5IlxuJworICAgICAgICAgICAgICdjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgJworICAgICAgICAgICAgICdJZiBhblxuJworICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuJworICAgICAgICAgICAgICdleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzICcKKyAgICAgICAgICAgICAnZXhlY3V0ZWQuICBJZlxuJworICAgICAgICAgICAgICd0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgJworICAgICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlLiAgSWYgdGhlICJmaW5hbGx5IiBjbGF1c2UgcmFpc2VzIGFub3RoZXIgZXhjZXB0aW9uLCB0aGUgJworICAgICAgICAgICAgICdzYXZlZFxuJworICAgICAgICAgICAgICdleGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgJworICAgICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICdpcyBkaXNjYXJkZWQ6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICA+Pj4gZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICB0cnk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIDEvMFxuJworICAgICAgICAgICAgICcgICAuLi4gICAgIGZpbmFsbHk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHJldHVybiA0MlxuJworICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAnICAgPj4+IGYoKVxuJworICAgICAgICAgICAgICcgICA0MlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtICcKKyAgICAgICAgICAgICAnZHVyaW5nXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gYSAicmV0dXJuIiwgImJyZWFrIiBvciAiY29udGludWUiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcidHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiAnCisgICAgICAgICAgICAgJ2NsYXVzZSBpc1xuJworICAgICAgICAgICAgICdhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyAnCisgICAgICAgICAgICAgJ2lsbGVnYWwgaW5cbicKKyAgICAgICAgICAgICAndGhlICJmaW5hbGx5IiBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50XG4nCisgICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlICcKKyAgICAgICAgICAgICAnZnV0dXJlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAnInJldHVybiJcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlICJmaW5hbGx5IiBjbGF1c2UgYWx3YXlzIGV4ZWN1dGVzLCAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzICcKKyAgICAgICAgICAgICAnYmUgdGhlXG4nCisgICAgICAgICAgICAgJ2xhc3Qgb25lIGV4ZWN1dGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgPj4+IGRlZiBmb28oKTpcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICB0cnk6XG4nCisgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5J1xuIgorICAgICAgICAgICAgICcgICAuLi4gICAgIGZpbmFsbHk6XG4nCisgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseSdcbiIKKyAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgJyAgID4+PiBmb28oKVxuJworICAgICAgICAgICAgICIgICAnZmluYWxseSdcbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0FkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuJworICAgICAgICAgICAgICdFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvICcKKyAgICAgICAgICAgICAnZ2VuZXJhdGVcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrICcKKyAgICAgICAgICAgICAnd2l0aFxuJworICAgICAgICAgICAgICdtZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggJworICAgICAgICAgICAgICdTdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnQ29udGV4dCBNYW5hZ2VycykuIFRoaXMgYWxsb3dzIGNvbW1vbiAnCisgICAgICAgICAgICAgJyJ0cnkiLi4uImV4Y2VwdCIuLi4iZmluYWxseSJcbicKKyAgICAgICAgICAgICAndXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyAnCisgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgJworICAgICAgICAgICAgICcid2l0aF9pdGVtIilcbicKKyAgICAgICAgICAgICAnICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4nCisgICAgICAgICAgICAgJyAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgJworICAgICAgICAgICAgICciX19lbnRlcl9fKCkiXG4nCisgICAgICAgICAgICAgJyAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCAnCisgICAgICAgICAgICAgJ2Fsd2F5cyBiZVxuJworICAgICAgICAgICAgICcgICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3IgJworICAgICAgICAgICAgICdvY2N1cnJpbmdcbicKKyAgICAgICAgICAgICAnICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICcgICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsICcKKyAgICAgICAgICAgICAndGhyZWVcbicKKyAgICAgICAgICAgICAnICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiAnCisgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgJyAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAncmVyYWlzZWQuXG4nCisgICAgICAgICAgICAgJyAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbicKKyAgICAgICAgICAgICAnICAgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiAnCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiwgdGhlXG4nCisgICAgICAgICAgICAgJyAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uICcKKyAgICAgICAgICAgICAncHJvY2VlZHNcbicKKyAgICAgICAgICAgICAnICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1dpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzICcKKyAgICAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAgICAnbXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjpcbicKKyAgICAgICAgICAgICAnICAgICAgIHN1aXRlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB3aXRoIEEoKSBhcyBhOlxuJworICAgICAgICAgICAgICcgICAgICAgd2l0aCBCKCkgYXMgYjpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBzdWl0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICcKKyAgICAgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAgICAgJyAgICAgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGRlZmluaXRpb25zXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgJworICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNkZWYgICAgICAgICAgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiICcKKyAgICAgICAgICAgICAnW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvcnMgICAgICAgICAgICAgIDo6PSBkZWNvcmF0b3IrXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvciAgICAgICAgICAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiAnCisgICAgICAgICAgICAgJ1thcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbicKKyAgICAgICAgICAgICAnICAgZG90dGVkX25hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyX2xpc3QgICAgICAgICAgOjo9IGRlZnBhcmFtZXRlciAoIiwiIGRlZnBhcmFtZXRlcikqICcKKyAgICAgICAgICAgICAnWyIsIiBbcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NdXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc1xuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJncyA6Oj0gIioiIFtwYXJhbWV0ZXJdICgiLCIgJworICAgICAgICAgICAgICdkZWZwYXJhbWV0ZXIpKiBbIiwiIFsiKioiIHBhcmFtZXRlciBbIiwiXV1dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyIFsiLCJdXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlciAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZGVmcGFyYW1ldGVyICAgICAgICAgICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNuYW1lICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uICcKKyAgICAgICAgICAgICAnYmluZHNcbicKKyAgICAgICAgICAgICAndGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCAnCisgICAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAgICdhcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgJworICAgICAgICAgICAgICdnZXRzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBpc1xuJworICAgICAgICAgICAgICdkZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgJ3Jlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBuYW1lXG4nCisgICAgICAgICAgICAgJ2luc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgJworICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICduZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgICAgJyAgIGRlZiBmdW5jKCk6IHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIHJvdWdobHkgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICcgICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBpcyBub3QgdGVtcG9yYXJpbHkgYm91bmQgdG8gJworICAgICAgICAgICAgICd0aGUgbmFtZVxuJworICAgICAgICAgICAgICciZnVuYyIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuJworICAgICAgICAgICAgICcqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyICcKKyAgICAgICAgICAgICAndmFsdWVzLiJcbicKKyAgICAgICAgICAgICAnRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgJyphcmd1bWVudCogbWF5XG4nCisgICAgICAgICAgICAgImJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgIgorICAgICAgICAgICAgICd2YWx1ZSBpc1xuJworICAgICAgICAgICAgICdzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSAnCisgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAnaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJ2dyYW1tYXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcqKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXNcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnInByZS1cbicKKyAgICAgICAgICAgICAnY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSAnCisgICAgICAgICAgICAgJ2ltcG9ydGFudFxuJworICAgICAgICAgICAgICd0byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoICcKKyAgICAgICAgICAgICAnYXMgYVxuJworICAgICAgICAgICAgICdsaXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICdhcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgJworICAgICAgICAgICAgICdtb2RpZmllZC5cbicKKyAgICAgICAgICAgICAnVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgJworICAgICAgICAgICAgICd0byB1c2VcbicKKyAgICAgICAgICAgICAnIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbiwgZS5nLjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBwZW5ndWluID0gW11cbicKKyAgICAgICAgICAgICAnICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbicKKyAgICAgICAgICAgICAnICAgICAgIHJldHVybiBwZW5ndWluXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb24gJworICAgICAgICAgICAgICdDYWxscy5cbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyAnCisgICAgICAgICAgICAgJ21lbnRpb25lZCBpblxuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbSAnCisgICAgICAgICAgICAgJ2tleXdvcmRcbicKKyAgICAgICAgICAgICAnYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm0gIiIqaWRlbnRpZmllciIiICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAncHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55IGV4Y2VzcyAnCisgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGUgZm9ybVxuJworICAgICAgICAgICAgICciIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICdyZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ldyAnCisgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZSAnCisgICAgICAgICAgICAgJ2tleXdvcmQtb25seVxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1BhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiAnCisgICAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiAnCisgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgJ29mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5ICcKKyAgICAgICAgICAgICAnaGF2ZVxuJworICAgICAgICAgICAgICcicmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSAnCisgICAgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICAgICdsaXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyAnCisgICAgICAgICAgICAgJ21heVxuJworICAgICAgICAgICAgICdiZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlICcKKyAgICAgICAgICAgICAnY29kZS5cbicKKyAgICAgICAgICAgICAnVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuJworICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzJyBuYW1lcyBpbiB0aGUgIgorICAgICAgICAgICAgICciX19hbm5vdGF0aW9uc19fIlxuJworICAgICAgICAgICAgICdhdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgJworICAgICAgICAgICAgICdib3VuZFxuJworICAgICAgICAgICAgICd0byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uIExhbWJkYXMuICBOb3RlIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gJworICAgICAgICAgICAgICdkZWZpbml0aW9uO1xuJworICAgICAgICAgICAgICdhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCAnCisgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSAnCisgICAgICAgICAgICAgJ2l0XG4nCisgICAgICAgICAgICAgJ2FsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiKipQcm9ncmFtbWVyJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIKKyAgICAgICAgICAgICAnIiJkZWYiIlxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzICcKKyAgICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAgICdpbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiBOYW1pbmcgYW5kIGJpbmRpbmcgZm9yICcKKyAgICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuJworICAgICAgICAgICAgICcgICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDbGFzcyBkZWZpbml0aW9uc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgJ3N0YW5kYXJkXG4nCisgICAgICAgICAgICAgJ3R5cGUgaGllcmFyY2h5KTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAnCisgICAgICAgICAgICAgJyI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSJcbicKKyAgICAgICAgICAgICAnICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSAnCisgICAgICAgICAgICAgJ2xpc3RcbicKKyAgICAgICAgICAgICAndXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgTWV0YWNsYXNzZXMgZm9yIG1vcmVcbicKKyAgICAgICAgICAgICAnYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYSAnCisgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgJ29iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2UgJworICAgICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgICAgJ2luaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vOlxuJworICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vKG9iamVjdCk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJUaGUgY2xhc3MncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAiCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbicKKyAgICAgICAgICAgICAiZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3MncyBzdWl0ZSBmaW5pc2hlcyAiCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiwgaXRzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuICcKKyAgICAgICAgICAgICAnWzRdIEFcbicKKyAgICAgICAgICAgICAnY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlICcKKyAgICAgICAgICAgICAnYmFzZVxuJworICAgICAgICAgICAgICdjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAnZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAnVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsICcKKyAgICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgICAnbmFtZXNwYWNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nICcKKyAgICAgICAgICAgICAnZnVuY3Rpb25zLFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbzogcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBjbGFzcyBGb286IHBhc3NcbicKKyAgICAgICAgICAgICAnICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzICcKKyAgICAgICAgICAgICAnbmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIioqUHJvZ3JhbW1lcidzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gIgorICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlICcKKyAgICAgICAgICAgICAnYXR0cmlidXRlc1xuJworICAgICAgICAgICAgICdjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAnCisgICAgICAgICAgICAgJyIic2VsZi5uYW1lIiIsXG4nCisgICAgICAgICAgICAgJ2FuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAgICAnd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgJworICAgICAgICAgICAgICdkZWZhdWx0c1xuJworICAgICAgICAgICAgICdmb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAndW5leHBlY3RlZCByZXN1bHRzLiAgRGVzY3JpcHRvcnMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG4nCisgICAgICAgICAgICAgJ3ZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4nCisgICAgICAgICAgICAgJyAgQ2xhc3MgRGVjb3JhdG9yc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Nvcm91dGluZXNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Nvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uXG4nCisgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luY19mdW5jZGVmIDo6PSBbZGVjb3JhdG9yc10gImFzeW5jIiAiZGVmIiBmdW5jbmFtZSAiKCIgJworICAgICAgICAgICAgICdbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0V4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0ICcKKyAgICAgICAgICAgICAnbWFueVxuJworICAgICAgICAgICAgICdwb2ludHMgKHNlZSAqY29yb3V0aW5lKikuICBJbiB0aGUgYm9keSBvZiBhIGNvcm91dGluZSwgYW55ICcKKyAgICAgICAgICAgICAnImF3YWl0IiBhbmRcbicKKyAgICAgICAgICAgICAnImFzeW5jIiBpZGVudGlmaWVycyBiZWNvbWUgcmVzZXJ2ZWQga2V5d29yZHM7ICJhd2FpdCIgJworICAgICAgICAgICAgICdleHByZXNzaW9ucyxcbicKKyAgICAgICAgICAgICAnImFzeW5jIGZvciIgYW5kICJhc3luYyB3aXRoIiBjYW4gb25seSBiZSB1c2VkIGluIGNvcm91dGluZSAnCisgICAgICAgICAgICAgJ2JvZGllcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9ucywgZXZlbiBpZiB0aGV5IGRvIG5vdCBjb250YWluICJhd2FpdCIgb3IgImFzeW5jIiAnCisgICAgICAgICAgICAgJ2tleXdvcmRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAieWllbGQiIGV4cHJlc3Npb25zIGluICJhc3luYyBkZWYiXG4nCisgICAgICAgICAgICAgJ2Nvcm91dGluZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBbiBleGFtcGxlIG9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmMgZGVmIGZ1bmMocGFyYW0xLCBwYXJhbTIpOlxuJworICAgICAgICAgICAgICcgICAgICAgZG9fc3R1ZmYoKVxuJworICAgICAgICAgICAgICcgICAgICAgYXdhaXQgc29tZV9jb3JvdXRpbmUoKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmNfZm9yX3N0bXQgOjo9ICJhc3luYyIgZm9yX3N0bXRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0FuICphc3luY2hyb25vdXMgaXRlcmFibGUqIGlzIGFibGUgdG8gY2FsbCBhc3luY2hyb25vdXMgY29kZSBpbiAnCisgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICcqaXRlciogaW1wbGVtZW50YXRpb24sIGFuZCAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiBjYW4gY2FsbFxuJworICAgICAgICAgICAgICdhc3luY2hyb25vdXMgY29kZSBpbiBpdHMgKm5leHQqIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXJcbicKKyAgICAgICAgICAgICAnYXN5bmNocm9ub3VzIGl0ZXJhdG9ycy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29kZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jIGZvciBUQVJHRVQgaW4gSVRFUjpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJyAgIGVsc2U6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DSzJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaXRlciA9IChJVEVSKVxuJworICAgICAgICAgICAgICcgICBpdGVyID0gdHlwZShpdGVyKS5fX2FpdGVyX18oaXRlcilcbicKKyAgICAgICAgICAgICAnICAgcnVubmluZyA9IFRydWVcbicKKyAgICAgICAgICAgICAnICAgd2hpbGUgcnVubmluZzpcbicKKyAgICAgICAgICAgICAnICAgICAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBUQVJHRVQgPSBhd2FpdCB0eXBlKGl0ZXIpLl9fYW5leHRfXyhpdGVyKVxuJworICAgICAgICAgICAgICcgICAgICAgZXhjZXB0IFN0b3BBc3luY0l0ZXJhdGlvbjpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBydW5uaW5nID0gRmFsc2VcbicKKyAgICAgICAgICAgICAnICAgICAgIGVsc2U6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgQkxPQ0tcbicKKyAgICAgICAgICAgICAnICAgZWxzZTpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLMlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc28gIl9fYWl0ZXJfXygpIiBhbmQgIl9fYW5leHRfXygpIiBmb3IgZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIGZvciIgc3RhdGVtZW50IG91dHNpZGUgb2YgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICciYXN5bmMgZGVmIiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQW4gKmFzeW5jaHJvbm91cyBjb250ZXh0IG1hbmFnZXIqIGlzIGEgKmNvbnRleHQgbWFuYWdlciogdGhhdCBpcyAnCisgICAgICAgICAgICAgJ2FibGVcbicKKyAgICAgICAgICAgICAndG8gc3VzcGVuZCBleGVjdXRpb24gaW4gaXRzICplbnRlciogYW5kICpleGl0KiBtZXRob2RzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBjb2RlOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmMgd2l0aCBFWFBSIGFzIFZBUjpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIG1nciA9IChFWFBSKVxuJworICAgICAgICAgICAgICcgICBhZXhpdCA9IHR5cGUobWdyKS5fX2FleGl0X19cbicKKyAgICAgICAgICAgICAnICAgYWVudGVyID0gdHlwZShtZ3IpLl9fYWVudGVyX18obWdyKVxuJworICAgICAgICAgICAgICcgICBleGMgPSBUcnVlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBWQVIgPSBhd2FpdCBhZW50ZXJcbicKKyAgICAgICAgICAgICAnICAgdHJ5OlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0tcbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0OlxuJworICAgICAgICAgICAgICcgICAgICAgaWYgbm90IGF3YWl0IGFleGl0KG1nciwgKnN5cy5leGNfaW5mbygpKTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICByYWlzZVxuJworICAgICAgICAgICAgICcgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgYXdhaXQgYWV4aXQobWdyLCBOb25lLCBOb25lLCBOb25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc28gIl9fYWVudGVyX18oKSIgYW5kICJfX2FleGl0X18oKSIgZm9yIGRldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJyJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286ICoqUEVQIDQ5MioqIC0gQ29yb3V0aW5lcyB3aXRoIGFzeW5jIGFuZCBhd2FpdCBzeW50YXhcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3NcbicKKyAgICAgICAgICAgICAnICAgIHRoZXJlIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXJcbicKKyAgICAgICAgICAgICAnICAgIGV4Y2VwdGlvbi4gVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSAnCisgICAgICAgICAgICAgJ2xvc3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgIGFuIGV4Y2VwdGlvbiBvciB0aGUgZXhlY3V0aW9uIG9mIGEgInJldHVybiIsICJjb250aW51ZSIsIG9yXG4nCisgICAgICAgICAgICAgJyAgICAiYnJlYWsiIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1szXSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZVxuJworICAgICAgICAgICAgICcgICAgZnVuY3Rpb24gYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyAiX19kb2NfXyJcbicKKyAgICAgICAgICAgICAiICAgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIHRoZSBmdW5jdGlvbidzICpkb2NzdHJpbmcqLlxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlICcKKyAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAnICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgbmFtZXNwYWNlXCdzICJfX2RvY19fIiBpdGVtICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgIiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzJ3MgKmRvY3N0cmluZyouXG4iLAorICdjb250ZXh0LW1hbmFnZXJzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1dpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAncnVudGltZSBjb250ZXh0IHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSAid2l0aCIgc3RhdGVtZW50LiBUaGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQgbWFuYWdlclxuJworICAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCAnCisgICAgICAgICAgICAgICAgICAgICAncnVudGltZSBjb250ZXh0XG4nCisgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICdtYW5hZ2VycyBhcmUgbm9ybWFsbHlcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbnZva2VkIHVzaW5nIHRoZSAid2l0aCIgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAnVGhlIHdpdGhcbicKKyAgICAgICAgICAgICAgICAgICAgICdzdGF0ZW1lbnQpLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyAnCisgICAgICAgICAgICAgICAgICAgICAndGhlaXIgbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJ3Jlc3RvcmluZyB2YXJpb3VzXG4nCisgICAgICAgICAgICAgICAgICAgICAna2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCAnCisgICAgICAgICAgICAgICAgICAgICAnY2xvc2luZyBvcGVuZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICdmaWxlcywgZXRjLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSBDb250ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICdNYW5hZ2VyIFR5cGVzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VudGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICAgICAiICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZCdzIHJldHVybiB2YWx1ZSB0byB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgJ3RhcmdldChzKVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgJworICAgICAgICAgICAgICAgICAgICAgJ2FueS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAgICAgJ3BhcmFtZXRlcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlICcKKyAgICAgICAgICAgICAgICAgICAgICdleGl0ZWQuIElmIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlICcKKyAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudHMgd2lsbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGJlICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byAnCisgICAgICAgICAgICAgICAgICAgICAnc3VwcHJlc3MgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksICcKKyAgICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICAgICAncHJvY2Vzc2VkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ3Bhc3NlZC1pblxuJworICAgICAgICAgICAgICAgICAgICAgIiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4iCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiAid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicsCisgJ2NvbnRpbnVlJzogJ1xuJworICAgICAgICAgICAgICdUaGUgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBjb250aW51ZV9zdG10IDo6PSAiY29udGludWUiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICciY29udGludWUiIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgImZvciIgb3IgJworICAgICAgICAgICAgICcid2hpbGUiXG4nCisgICAgICAgICAgICAgJ2xvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiBvciAnCisgICAgICAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAgICAgICdjbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlIG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ25lYXJlc3QgZW5jbG9zaW5nIGxvb3AuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuICJjb250aW51ZSIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYVxuJworICAgICAgICAgICAgICciZmluYWxseSIgY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlICcKKyAgICAgICAgICAgICAncmVhbGx5XG4nCisgICAgICAgICAgICAgJ3N0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAorICdjb252ZXJzaW9ucyc6ICdcbicKKyAgICAgICAgICAgICAgICAnQXJpdGhtZXRpYyBjb252ZXJzaW9uc1xuJworICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdXaGVuIGEgZGVzY3JpcHRpb24gb2YgYW4gYXJpdGhtZXRpYyBvcGVyYXRvciBiZWxvdyB1c2VzIHRoZSAnCisgICAgICAgICAgICAgICAgJ3BocmFzZVxuJworICAgICAgICAgICAgICAgICcidGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwiIHRoaXMgJworICAgICAgICAgICAgICAgICdtZWFuc1xuJworICAgICAgICAgICAgICAgICd0aGF0IHRoZSBvcGVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVpbHQtaW4gdHlwZXMgd29ya3MgYXMgJworICAgICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzICcKKyAgICAgICAgICAgICAgICAnY29udmVydGVkIHRvXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGxleDtcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJyAgb3RoZXIgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50O1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBvdGhlcndpc2UsIGJvdGggbXVzdCBiZSBpbnRlZ2VycyBhbmQgbm8gY29udmVyc2lvbiBpcyAnCisgICAgICAgICAgICAgICAgJ25lY2Vzc2FyeS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1NvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgJworICAgICAgICAgICAgICAgICdzdHJpbmcgYXMgYVxuJworICAgICAgICAgICAgICAgICJsZWZ0IGFyZ3VtZW50IHRvIHRoZSAnJScgb3BlcmF0b3IpLiAgRXh0ZW5zaW9ucyBtdXN0IGRlZmluZSAiCisgICAgICAgICAgICAgICAgJ3RoZWlyIG93blxuJworICAgICAgICAgICAgICAgICdjb252ZXJzaW9uIGJlaGF2aW9yLlxuJywKKyAnY3VzdG9taXphdGlvbic6ICdcbicKKyAgICAgICAgICAgICAgICAgICdCYXNpYyBjdXN0b21pemF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICcKKyAgICAgICAgICAgICAgICAgICciX19uZXdfXygpIiBpcyBhXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCAnCisgICAgICAgICAgICAgICAgICAnYXMgc3VjaClcbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkICcKKyAgICAgICAgICAgICAgICAgICdhcyBpdHNcbicKKyAgICAgICAgICAgICAgICAgICcgICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSAnCisgICAgICAgICAgICAgICAgICAncGFzc2VkIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgJworICAgICAgICAgICAgICAgICAgJ1RoZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgJyh1c3VhbGx5IGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2NsYXNzIGJ5XG4nCisgICAgICAgICAgICAgICAgICAnICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgInN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgICAgICAnICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgIl9fbmV3X18oKSIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ25ld1xuJworICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIGFuZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAnCisgICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCAnCisgICAgICAgICAgICAgICAgICAndGhlbiB0aGUgbmV3XG4nCisgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAgICAgICAgICcgICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAnY3JlYXRpb24uICBJdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gJworICAgICAgICAgICAgICAgICAgJ29yZGVyIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICcKKyAgICAgICAgICAgICAgICAgICciX19uZXdfXygpIiksIGJ1dFxuJworICAgICAgICAgICAgICAgICAgJyAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgJworICAgICAgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlICcKKyAgICAgICAgICAgICAgICAgICdjbGFzcyBoYXMgYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCwgaWZcbicKKyAgICAgICAgICAgICAgICAgICcgICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgJworICAgICAgICAgICAgICAgICAgJ2luaXRpYWxpemF0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgJyAgICJCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gJworICAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdGluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byAnCisgICAgICAgICAgICAgICAgICAnY3VzdG9taXNlXG4nCisgICAgICAgICAgICAgICAgICAnICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAnCisgICAgICAgICAgICAgICAgICAnIl9faW5pdF9fKCkiOyBkb2luZyBzb1xuJworICAgICAgICAgICAgICAgICAgJyAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICdpcyBhbHNvXG4nCisgICAgICAgICAgICAgICAgICAnICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiAnCisgICAgICAgICAgICAgICAgICAnbWV0aG9kLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0ICcKKyAgICAgICAgICAgICAgICAgICdleHBsaWNpdGx5IGNhbGwgaXRcbicKKyAgICAgICAgICAgICAgICAgICcgICB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIGJ5XG4nCisgICAgICAgICAgICAgICAgICAnICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgICdhdCBhIGxhdGVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAgICdndWFyYW50ZWVkIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCAnCisgICAgICAgICAgICAgICAgICAnZXhpc3Qgd2hlblxuJworICAgICAgICAgICAgICAgICAgJyAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gJworICAgICAgICAgICAgICAgICAgJ3RoZSBmb3JtZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbGF0dGVyIGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IlwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgJworICAgICAgICAgICAgICAgICAgJ1NvbWUgY29tbW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0IGZyb21cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgICdvYmplY3RzIChlLmcuLFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggJworICAgICAgICAgICAgICAgICAgJ3BhcmVudCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ3N0YWNrIGZyYW1lIG9mXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayAnCisgICAgICAgICAgICAgICAgICAnc3RvcmVkIGluXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAic3lzLmV4Y19pbmZvKClbMl0iIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yIGEgJworICAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gJworICAgICAgICAgICAgICAgICAgJ3VuaGFuZGxlZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkICcKKyAgICAgICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5sYXN0X3RyYWNlYmFjayIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gICcKKyAgICAgICAgICAgICAgICAgICdUaGUgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nICcKKyAgICAgICAgICAgICAgICAgICd0aGUgY3ljbGVzO1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRyYWNlYmFjayBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZnVsLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgICd0aGlyZCBjYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiAnCisgICAgICAgICAgICAgICAgICAnQ2lyY3VsYXJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkICcKKyAgICAgICAgICAgICAgICAgICd1cCB3aGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAgIiAgICAgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIGVuYWJsZWQgKGl0J3Mgb24gYnkgIgorICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQpLiBSZWZlclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZSBmb3IgbW9yZSAnCisgICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb25cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGFib3V0IHRoaXMgdG9waWMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgJworICAgICAgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgJworICAgICAgICAgICAgICAgICAgJ2R1cmluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgJworICAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyAnCisgICAgICAgICAgICAgICAgICAnaW52b2tlZCBpblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmcgZGVsZXRlZCAoZS5nLiwgd2hlbiAnCisgICAgICAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICAnIl9fZGVsX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyAnCisgICAgICAgICAgICAgICAgICAnb2YgYmVpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvcm4gZG93biAoZS5nLiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gICcKKyAgICAgICAgICAgICAgICAgICdGb3IgdGhpc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgJworICAgICAgICAgICAgICAgICAgJ21pbmltdW0gbmVlZGVkXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCAnCisgICAgICAgICAgICAgICAgICAndmVyc2lvbiAxLjUsXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCAnCisgICAgICAgICAgICAgICAgICAnYSBzaW5nbGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgICdnbG9iYWxzIGFyZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsICcKKyAgICAgICAgICAgICAgICAgICd0aGlzIG1heVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsICcKKyAgICAgICAgICAgICAgICAgICdhdmFpbGFibGUgYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSAnCisgICAgICAgICAgICAgICAgICAnIm9mZmljaWFsIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsICcKKyAgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ3VzZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICAnICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnZm9ybVxuJworICAgICAgICAgICAgICAgICAgJyAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuICcKKyAgICAgICAgICAgICAgICAgICdUaGUgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAnIl9fcmVwcl9fKCkiIGJ1dFxuJworICAgICAgICAgICAgICAgICAgJyAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gJworICAgICAgICAgICAgICAgICAgJyJpbmZvcm1hbCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgJworICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50ICcKKyAgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3N0cl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgJworICAgICAgICAgICAgICAgICAgJyJmb3JtYXQoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgb3IgbmljZWx5IHByaW50YWJsZSAnCisgICAgICAgICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgJworICAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICd0aGVyZSBpcyBub1xuJworICAgICAgICAgICAgICAgICAgJyAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgICdleHByZXNzaW9uOiBhXG4nCisgICAgICAgICAgICAgICAgICAnICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAnCisgICAgICAgICAgICAgICAgICAnIm9iamVjdCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2J5dGVzX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyAnCisgICAgICAgICAgICAgICAgICAncmVwcmVzZW50YXRpb24gb2YgYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdleHRlbnNpb24sXG4nCisgICAgICAgICAgICAgICAgICAnICAgZXZhbHVhdGlvbiBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgJyJzdHIuZm9ybWF0KCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIgc3RyaW5nIHJlcHJlc2VudGF0aW9uICcKKyAgICAgICAgICAgICAgICAgICdvZiBhblxuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYSBzdHJpbmcgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnY29udGFpbnMgYVxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgZGVzaXJlZC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICdpbnRlcnByZXRhdGlvblxuJworICAgICAgICAgICAgICAgICAgJyAgIG9mIHRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIHVwIHRvIHRoZSB0eXBlICcKKyAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbCBlaXRoZXIgJworICAgICAgICAgICAgICAgICAgJ2RlbGVnYXRlXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYSAnCisgICAgICAgICAgICAgICAgICAnc2ltaWxhclxuJworICAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdHRpbmcgb3B0aW9uIHN5bnRheC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBTZWUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBmb3IgYSBkZXNjcmlwdGlvbiAnCisgICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy40OiBUaGUgX19mb3JtYXRfXyBtZXRob2Qgb2YgJworICAgICAgICAgICAgICAgICAgJyJvYmplY3QiIGl0c2VsZlxuJworICAgICAgICAgICAgICAgICAgJyAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAgICAnaXMgYXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgJworICAgICAgICAgICAgICAgICAgJyJ4Ll9fbGVfXyh5KSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAnCisgICAgICAgICAgICAgICAgICAnIng+eSIgY2FsbHNcbicKKyAgICAgICAgICAgICAgICAgICcgICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAnCisgICAgICAgICAgICAgICAgICAnIk5vdEltcGxlbWVudGVkIlxuJworICAgICAgICAgICAgICAgICAgJyAgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIHBhaXIgJworICAgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlICcKKyAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBmb3IgYVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgICdhbnkgdmFsdWUsXG4nCisgICAgICAgICAgICAgICAgICAnICAgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhIEJvb2xlYW4gJworICAgICAgICAgICAgICAgICAgJ2NvbnRleHQgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiAiaWYiIHN0YXRlbWVudCksIFB5dGhvbiB3aWxsIGNhbGwgJworICAgICAgICAgICAgICAgICAgJyJib29sKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgJworICAgICAgICAgICAgICAgICAgJ2ZhbHNlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICdpbnZlcnRzIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4gIFRoZXJlIGFyZSBubyAnCisgICAgICAgICAgICAgICAgICAnb3RoZXIgaW1wbGllZFxuJworICAgICAgICAgICAgICAgICAgJyAgIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgJworICAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvICcKKyAgICAgICAgICAgICAgICAgICdhdXRvbWF0aWNhbGx5XG4nCisgICAgICAgICAgICAgICAgICAnICAgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3QgJworICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiwgc2VlXG4nCisgICAgICAgICAgICAgICAgICAnICAgImZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50ICcKKyAgICAgICAgICAgICAgICAgICdub3RlcyBvblxuJworICAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSAnCisgICAgICAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgJworICAgICAgICAgICAgICAgICAgJyh0byBiZSB1c2VkXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAgJ2J1dCB0aGUgcmlnaHRcbicKKyAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSAnCisgICAgICAgICAgICAgICAgICAiZWFjaCBvdGhlcidzXG4iCisgICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyAnCisgICAgICAgICAgICAgICAgICAncmVmbGVjdGlvbixcbicKKyAgICAgICAgICAgICAgICAgICcgICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uICcKKyAgICAgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICIgICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZCdzICIKKyAgICAgICAgICAgICAgICAgICd0eXBlIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgICIgICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZCdzIHR5cGUsICIKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZWZsZWN0ZWQgbWV0aG9kIG9mIHRoZSByaWdodCBvcGVyYW5kIGhhcyBwcmlvcml0eSwgJworICAgICAgICAgICAgICAgICAgJ290aGVyd2lzZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgICIgICBsZWZ0IG9wZXJhbmQncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyAiCisgICAgICAgICAgICAgICAgICAnaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19oYXNoX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAgICAgICdvbiBtZW1iZXJzXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAnCisgICAgICAgICAgICAgICAgICAnImRpY3QiLlxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seSAnCisgICAgICAgICAgICAgICAgICAncmVxdWlyZWQgcHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgICcgICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlOyBpdCBpc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlICcKKyAgICAgICAgICAgICAgICAgICdvcikgdGhlIGhhc2hcbicKKyAgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdCBhbHNvIHBsYXkgYSAnCisgICAgICAgICAgICAgICAgICAncGFydCBpblxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gJworICAgICAgICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAgICAgICAnICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICcKKyAgICAgICAgICAgICAgICAgICciUHlfc3NpemVfdCIuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBpcyB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uICcKKyAgICAgICAgICAgICAgICAgICczMi1iaXRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgJworICAgICAgICAgICAgICAgICAgJ2ludGVyb3BlcmF0ZSBvbiBidWlsZHNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uICcKKyAgICAgICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHN1cHBvcnRlZCBidWlsZHMuICBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggJworICAgICAgICAgICAgICAgICAgJyJweXRob24gLWNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0ICcKKyAgICAgICAgICAgICAgICAgICdzaG91bGQgbm90XG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgJyJfX2VxX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgJworICAgICAgICAgICAgICAgICAgJ2FzIGl0ZW1zIGluXG4nCisgICAgICAgICAgICAgICAgICAnICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90ICcKKyAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSAnCisgICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgICIgICByZXF1aXJlcyB0aGF0IGEga2V5J3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSAiCisgICAgICAgICAgICAgICAgICAib2JqZWN0J3MgaGFzaFxuIgorICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICAnbWV0aG9kcyBieVxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgJworICAgICAgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSAnCisgICAgICAgICAgICAgICAgICAndmFsdWUgc3VjaFxuJworICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09ICcKKyAgICAgICAgICAgICAgICAgICdoYXNoKHkpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAnCisgICAgICAgICAgICAgICAgICAnIl9faGFzaF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgJworICAgICAgICAgICAgICAgICAgJ1doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtICcKKyAgICAgICAgICAgICAgICAgICdhdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5ICcKKyAgICAgICAgICAgICAgICAgICdpZGVudGlmaWVkIGFzXG4nCisgICAgICAgICAgICAgICAgICAnICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgJworICAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zLkhhc2hhYmxlKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0ZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID1cbicKKyAgICAgICAgICAgICAgICAgICcgICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAgJ3N1cHByZXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgICAgICAnICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiAnCisgICAgICAgICAgICAgICAgICAnY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzICcKKyAgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSAnCisgICAgICAgICAgICAgICAgICAncmFuZG9tIHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgJworICAgICAgICAgICAgICAgICAgJ2ludm9jYXRpb25zIG9mXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCAnCisgICAgICAgICAgICAgICAgICAnYSBkZW5pYWwtXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBvZi1zZXJ2aWNlIGNhdXNlZCBieSBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdleHBsb2l0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgJworICAgICAgICAgICAgICAgICAgJ2NvbXBsZXhpdHkuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBTZWUgJworICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgICdvcmRlciBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlICcKKyAgICAgICAgICAgICAgICAgICdndWFyYW50ZWVzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgICczMi1iaXQgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbyAiUFlUSE9OSEFTSFNFRUQiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdkZWZhdWx0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Jvb2xfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAgICdvcGVyYXRpb25cbicKKyAgICAgICAgICAgICAgICAgICcgICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyAnCisgICAgICAgICAgICAgICAgICAnbWV0aG9kIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kICcKKyAgICAgICAgICAgICAgICAgICd0aGUgb2JqZWN0IGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAgJ2RlZmluZXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIsIGFsbCBpdHMgaW5zdGFuY2VzICcKKyAgICAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkIHRydWUuXG4nLAorICdkZWJ1Z2dlcic6ICdcbicKKyAgICAgICAgICAgICAnInBkYiIgLS0tIFRoZSBQeXRob24gRGVidWdnZXJcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyoqU291cmNlIGNvZGU6KiogTGliL3BkYi5weVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIG1vZHVsZSAicGRiIiBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgJ1B5dGhvbiBwcm9ncmFtcy4gIEl0IHN1cHBvcnRzIHNldHRpbmcgKGNvbmRpdGlvbmFsKSBicmVha3BvaW50cyAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICdzaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrICcKKyAgICAgICAgICAgICAnZnJhbWVzLFxuJworICAgICAgICAgICAgICdzb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnY29udGV4dCBvZiBhbnkgc3RhY2sgZnJhbWUuICBJdCBhbHNvIHN1cHBvcnRzIHBvc3QtbW9ydGVtICcKKyAgICAgICAgICAgICAnZGVidWdnaW5nXG4nCisgICAgICAgICAgICAgJ2FuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlICcKKyAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAnIlBkYiIuIFRoaXMgaXMgY3VycmVudGx5IHVuZG9jdW1lbnRlZCBidXQgZWFzaWx5IHVuZGVyc3Rvb2QgYnkgJworICAgICAgICAgICAgICdyZWFkaW5nXG4nCisgICAgICAgICAgICAgJ3RoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzICJiZGIiIGFuZCAnCisgICAgICAgICAgICAgJyJjbWQiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyAiKFBkYikiLiBUeXBpY2FsIHVzYWdlIHRvIHJ1biBhICcKKyAgICAgICAgICAgICAncHJvZ3JhbSB1bmRlclxuJworICAgICAgICAgICAgICdjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgcGRiXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgbXltb2R1bGVcbicKKyAgICAgICAgICAgICAiICAgPj4+IHBkYi5ydW4oJ215bW9kdWxlLnRlc3QoKScpXG4iCisgICAgICAgICAgICAgJyAgID4gPHN0cmluZz4oMCk/KClcbicKKyAgICAgICAgICAgICAnICAgKFBkYikgY29udGludWVcbicKKyAgICAgICAgICAgICAnICAgPiA8c3RyaW5nPigxKT8oKVxuJworICAgICAgICAgICAgICcgICAoUGRiKSBjb250aW51ZVxuJworICAgICAgICAgICAgICIgICBOYW1lRXJyb3I6ICdzcGFtJ1xuIgorICAgICAgICAgICAgICcgICA+IDxzdHJpbmc+KDEpPygpXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBUYWItY29tcGxldGlvbiB2aWEgdGhlICJyZWFkbGluZSIgbW9kdWxlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnYXZhaWxhYmxlIGZvciBjb21tYW5kcyBhbmQgY29tbWFuZCBhcmd1bWVudHMsIGUuZy4gdGhlIGN1cnJlbnQgJworICAgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgICAnYW5kIGxvY2FsIG5hbWVzIGFyZSBvZmZlcmVkIGFzIGFyZ3VtZW50cyBvZiB0aGUgInAiIGNvbW1hbmQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcicGRiLnB5IiBjYW4gYWxzbyBiZSBpbnZva2VkIGFzIGEgc2NyaXB0IHRvIGRlYnVnIG90aGVyICcKKyAgICAgICAgICAgICAnc2NyaXB0cy4gIEZvclxuJworICAgICAgICAgICAgICdleGFtcGxlOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgcHl0aG9uMyAtbSBwZGIgbXlzY3JpcHQucHlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gaW52b2tlZCBhcyBhIHNjcmlwdCwgcGRiIHdpbGwgYXV0b21hdGljYWxseSBlbnRlciAnCisgICAgICAgICAgICAgJ3Bvc3QtbW9ydGVtXG4nCisgICAgICAgICAgICAgJ2RlYnVnZ2luZyBpZiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBleGl0cyBhYm5vcm1hbGx5LiAgQWZ0ZXIgJworICAgICAgICAgICAgICdwb3N0LVxuJworICAgICAgICAgICAgICdtb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiAnCisgICAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgICAicmVzdGFydCB0aGUgcHJvZ3JhbS4gIEF1dG9tYXRpYyByZXN0YXJ0aW5nIHByZXNlcnZlcyBwZGIncyBzdGF0ZSAiCisgICAgICAgICAgICAgJyhzdWNoXG4nCisgICAgICAgICAgICAgJ2FzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBtb3JlIHVzZWZ1bCB0aGFuIHF1aXR0aW5nICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgImRlYnVnZ2VyIHVwb24gcHJvZ3JhbSdzIGV4aXQuXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjI6ICJwZGIucHkiIG5vdyBhY2NlcHRzIGEgIi1jIiBvcHRpb24gdGhhdCAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVzXG4nCisgICAgICAgICAgICAgJ2NvbW1hbmRzIGFzIGlmIGdpdmVuIGluIGEgIi5wZGJyYyIgZmlsZSwgc2VlIERlYnVnZ2VyIENvbW1hbmRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgJworICAgICAgICAgICAgICdwcm9ncmFtIGlzXG4nCisgICAgICAgICAgICAgJ3RvIGluc2VydFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdhdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuICcKKyAgICAgICAgICAgICAndGhlblxuJworICAgICAgICAgICAgICdzdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LCBhbmQgY29udGludWUgJworICAgICAgICAgICAgICdydW5uaW5nXG4nCisgICAgICAgICAgICAgJ3dpdGhvdXQgdGhlIGRlYnVnZ2VyIHVzaW5nIHRoZSAiY29udGludWUiIGNvbW1hbmQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgdHlwaWNhbCB1c2FnZSB0byBpbnNwZWN0IGEgY3Jhc2hlZCBwcm9ncmFtIGlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgPj4+IGltcG9ydCBwZGJcbicKKyAgICAgICAgICAgICAnICAgPj4+IGltcG9ydCBteW1vZHVsZVxuJworICAgICAgICAgICAgICcgICA+Pj4gbXltb2R1bGUudGVzdCgpXG4nCisgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4nCisgICAgICAgICAgICAgJyAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgNCwgaW4gdGVzdFxuJworICAgICAgICAgICAgICcgICAgICAgdGVzdDIoKVxuJworICAgICAgICAgICAgICcgICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDMsIGluIHRlc3QyXG4nCisgICAgICAgICAgICAgJyAgICAgICBwcmludChzcGFtKVxuJworICAgICAgICAgICAgICcgICBOYW1lRXJyb3I6IHNwYW1cbicKKyAgICAgICAgICAgICAnICAgPj4+IHBkYi5wbSgpXG4nCisgICAgICAgICAgICAgJyAgID4gLi9teW1vZHVsZS5weSgzKXRlc3QyKClcbicKKyAgICAgICAgICAgICAnICAgLT4gcHJpbnQoc3BhbSlcbicKKyAgICAgICAgICAgICAnICAgKFBkYilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczsgZWFjaCBlbnRlcnMgdGhlICcKKyAgICAgICAgICAgICAnZGVidWdnZXJcbicKKyAgICAgICAgICAgICAnaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGVjdXRlIHRoZSAqc3RhdGVtZW50KiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdCkgJworICAgICAgICAgICAgICd1bmRlclxuJworICAgICAgICAgICAgICcgICBkZWJ1Z2dlciBjb250cm9sLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGJlZm9yZSBhbnkgJworICAgICAgICAgICAgICdjb2RlIGlzXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGVkOyB5b3UgY2FuIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSAiY29udGludWUiLCBvciB5b3UgJworICAgICAgICAgICAgICdjYW5cbicKKyAgICAgICAgICAgICAnICAgc3RlcCB0aHJvdWdoIHRoZSBzdGF0ZW1lbnQgdXNpbmcgInN0ZXAiIG9yICJuZXh0IiAoYWxsIHRoZXNlXG4nCisgICAgICAgICAgICAgJyAgIGNvbW1hbmRzIGFyZSBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgJworICAgICAgICAgICAgICcqbG9jYWxzKlxuJworICAgICAgICAgICAgICcgICBhcmd1bWVudHMgc3BlY2lmeSB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGNvZGUgaXMgJworICAgICAgICAgICAgICdleGVjdXRlZDsgYnlcbicKKyAgICAgICAgICAgICAnICAgZGVmYXVsdCB0aGUgZGljdGlvbmFyeSBvZiB0aGUgbW9kdWxlICJfX21haW5fXyIgaXMgdXNlZC4gICcKKyAgICAgICAgICAgICAnKFNlZSB0aGVcbicKKyAgICAgICAgICAgICAnICAgZXhwbGFuYXRpb24gb2YgdGhlIGJ1aWx0LWluICJleGVjKCkiIG9yICJldmFsKCkiIGZ1bmN0aW9ucy4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIucnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlICcKKyAgICAgICAgICAgICAnb2JqZWN0KVxuJworICAgICAgICAgICAgICcgICB1bmRlciBkZWJ1Z2dlciBjb250cm9sLiAgV2hlbiAicnVuZXZhbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciAnCisgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgJyAgICJydW4oKSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIucnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENhbGwgdGhlICpmdW5jdGlvbiogKGEgZnVuY3Rpb24gb3IgbWV0aG9kIG9iamVjdCwgbm90IGEgJworICAgICAgICAgICAgICdzdHJpbmcpXG4nCisgICAgICAgICAgICAgJyAgIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFdoZW4gInJ1bmNhbGwoKSIgcmV0dXJucywgaXQgJworICAgICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgICAgJyAgIHdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCAnCisgICAgICAgICAgICAgJ2FwcGVhcnNcbicKKyAgICAgICAgICAgICAnICAgYXMgc29vbiBhcyB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5zZXRfdHJhY2UoKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRW50ZXIgdGhlIGRlYnVnZ2VyIGF0IHRoZSBjYWxsaW5nIHN0YWNrIGZyYW1lLiAgVGhpcyBpcyAnCisgICAgICAgICAgICAgJ3VzZWZ1bCB0b1xuJworICAgICAgICAgICAgICcgICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIGNvZGUgaXMgbm90IG90aGVyd2lzZSBiZWluZyBkZWJ1Z2dlZCAoZS5nLiB3aGVuIGFuIGFzc2VydGlvblxuJworICAgICAgICAgICAgICcgICBmYWlscykuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIucG9zdF9tb3J0ZW0odHJhY2ViYWNrPU5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIGdpdmVuICp0cmFjZWJhY2sqIG9iamVjdC4gICcKKyAgICAgICAgICAgICAnSWYgbm9cbicKKyAgICAgICAgICAgICAnICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCAoYW4gZXhjZXB0aW9uIG11c3QgYmUgYmVpbmcgaGFuZGxlZCAnCisgICAgICAgICAgICAgJ2lmIHRoZVxuJworICAgICAgICAgICAgICcgICBkZWZhdWx0IGlzIHRvIGJlIHVzZWQpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnBtKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgdHJhY2ViYWNrIGZvdW5kIGluXG4nCisgICAgICAgICAgICAgJyAgICJzeXMubGFzdF90cmFjZWJhY2siLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJydW4qIiBmdW5jdGlvbnMgYW5kICJzZXRfdHJhY2UoKSIgYXJlIGFsaWFzZXMgZm9yICcKKyAgICAgICAgICAgICAnaW5zdGFudGlhdGluZ1xuJworICAgICAgICAgICAgICd0aGUgIlBkYiIgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiAgSWYgeW91ICcKKyAgICAgICAgICAgICAnd2FudFxuJworICAgICAgICAgICAgICd0byBhY2Nlc3MgZnVydGhlciBmZWF0dXJlcywgeW91IGhhdmUgdG8gZG8gdGhpcyB5b3Vyc2VsZjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgImNsYXNzIHBkYi5QZGIoY29tcGxldGVrZXk9J3RhYicsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCAiCisgICAgICAgICAgICAgJ3NraXA9Tm9uZSwgbm9zaWdpbnQ9RmFsc2UpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAiUGRiIiBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgKmNvbXBsZXRla2V5KiwgKnN0ZGluKiBhbmQgKnN0ZG91dCogYXJndW1lbnRzIGFyZSBwYXNzZWQgJworICAgICAgICAgICAgICd0byB0aGVcbicKKyAgICAgICAgICAgICAnICAgdW5kZXJseWluZyAiY21kLkNtZCIgY2xhc3M7IHNlZSB0aGUgZGVzY3JpcHRpb24gdGhlcmUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgKnNraXAqIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiAnCisgICAgICAgICAgICAgJ2dsb2Itc3R5bGVcbicKKyAgICAgICAgICAgICAnICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyAnCisgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAnICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuICcKKyAgICAgICAgICAgICAnWzFdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBCeSBkZWZhdWx0LCBQZGIgc2V0cyBhIGhhbmRsZXIgZm9yIHRoZSBTSUdJTlQgc2lnbmFsICh3aGljaCAnCisgICAgICAgICAgICAgJ2lzIHNlbnRcbicKKyAgICAgICAgICAgICAnICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzICJDdHJsLUMiIG9uIHRoZSBjb25zb2xlKSB3aGVuIHlvdSBnaXZlICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSAnCisgICAgICAgICAgICAgJ2RlYnVnZ2VyXG4nCisgICAgICAgICAgICAgJyAgIGFnYWluIGJ5IHByZXNzaW5nICJDdHJsLUMiLiAgSWYgeW91IHdhbnQgUGRiIG5vdCB0byB0b3VjaCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBTSUdJTlQgaGFuZGxlciwgc2V0ICpub3NpZ2ludCogdG90IHRydWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGFtcGxlIGNhbGwgdG8gZW5hYmxlIHRyYWNpbmcgd2l0aCAqc2tpcCo6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIgICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKHNraXA9WydkamFuZ28uKiddKS5zZXRfdHJhY2UoKVxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4xOiBUaGUgKnNraXAqIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgKm5vc2lnaW50KiBhcmd1bWVudC4gIFByZXZpb3VzbHksIGEgJworICAgICAgICAgICAgICdTSUdJTlRcbicKKyAgICAgICAgICAgICAnICAgaGFuZGxlciB3YXMgbmV2ZXIgc2V0IGJ5IFBkYi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4nCisgICAgICAgICAgICAgJyAgIHJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbicKKyAgICAgICAgICAgICAnICAgcnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcbicKKyAgICAgICAgICAgICAnICAgc2V0X3RyYWNlKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9ucyBleHBsYWluZWQgYWJvdmUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRGVidWdnZXIgQ29tbWFuZHNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBkZWJ1Z2dlciBhcmUgbGlzdGVkIGJlbG93LiAgTW9zdFxuJworICAgICAgICAgICAgICdjb21tYW5kcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gb25lIG9yIHR3byBsZXR0ZXJzIGFzIGluZGljYXRlZDsgJworICAgICAgICAgICAgICdlLmcuXG4nCisgICAgICAgICAgICAgJyJoKGVscCkiIG1lYW5zIHRoYXQgZWl0aGVyICJoIiBvciAiaGVscCIgY2FuIGJlIHVzZWQgdG8gZW50ZXIgJworICAgICAgICAgICAgICd0aGUgaGVscFxuJworICAgICAgICAgICAgICdjb21tYW5kIChidXQgbm90ICJoZSIgb3IgImhlbCIsIG5vciAiSCIgb3IgIkhlbHAiIG9yICJIRUxQIikuXG4nCisgICAgICAgICAgICAgJ0FyZ3VtZW50cyB0byBjb21tYW5kcyBtdXN0IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIChzcGFjZXMgJworICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICd0YWJzKS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzICcKKyAgICAgICAgICAgICAnKCJbXSIpIGluXG4nCisgICAgICAgICAgICAgJ3RoZSBjb21tYW5kIHN5bnRheDsgdGhlIHNxdWFyZSBicmFja2V0cyBtdXN0IG5vdCBiZSB0eXBlZC5cbicKKyAgICAgICAgICAgICAnQWx0ZXJuYXRpdmVzIGluIHRoZSBjb21tYW5kIHN5bnRheCBhcmUgc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgJworICAgICAgICAgICAgICdiYXJcbicKKyAgICAgICAgICAgICAnKCJ8IikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdFbnRlcmluZyBhIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kIGVudGVyZWQuICAnCisgICAgICAgICAgICAgJ0V4Y2VwdGlvbjogaWZcbicKKyAgICAgICAgICAgICAndGhlIGxhc3QgY29tbWFuZCB3YXMgYSAibGlzdCIgY29tbWFuZCwgdGhlIG5leHQgMTEgbGluZXMgYXJlICcKKyAgICAgICAgICAgICAnbGlzdGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiQ29tbWFuZHMgdGhhdCB0aGUgZGVidWdnZXIgZG9lc24ndCByZWNvZ25pemUgYXJlIGFzc3VtZWQgdG8gYmUgIgorICAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50cyBhbmQgYXJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ncmFtIGJlaW5nXG4nCisgICAgICAgICAgICAgJ2RlYnVnZ2VkLiAgUHl0aG9uIHN0YXRlbWVudHMgY2FuIGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhbiAnCisgICAgICAgICAgICAgJ2V4Y2xhbWF0aW9uXG4nCisgICAgICAgICAgICAgJ3BvaW50ICgiISIpLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtICcKKyAgICAgICAgICAgICAnYmVpbmdcbicKKyAgICAgICAgICAgICAnZGVidWdnZWQ7IGl0IGlzIGV2ZW4gcG9zc2libGUgdG8gY2hhbmdlIGEgdmFyaWFibGUgb3IgY2FsbCBhICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1doZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBzdWNoIGEgc3RhdGVtZW50LCB0aGUgZXhjZXB0aW9uIG5hbWUgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICJwcmludGVkIGJ1dCB0aGUgZGVidWdnZXIncyBzdGF0ZSBpcyBub3QgY2hhbmdlZC5cbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBkZWJ1Z2dlciBzdXBwb3J0cyBhbGlhc2VzLiAgQWxpYXNlcyBjYW4gaGF2ZSBwYXJhbWV0ZXJzICcKKyAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAnYWxsb3dzIG9uZSBhIGNlcnRhaW4gbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyXG4nCisgICAgICAgICAgICAgJ2V4YW1pbmF0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTXVsdGlwbGUgY29tbWFuZHMgbWF5IGJlIGVudGVyZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5ICcKKyAgICAgICAgICAgICAnIjs7Ii5cbicKKyAgICAgICAgICAgICAnKEEgc2luZ2xlICI7IiBpcyBub3QgdXNlZCBhcyBpdCBpcyB0aGUgc2VwYXJhdG9yIGZvciBtdWx0aXBsZSAnCisgICAgICAgICAgICAgJ2NvbW1hbmRzXG4nCisgICAgICAgICAgICAgJ2luIGEgbGluZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgUHl0aG9uIHBhcnNlci4pICBObyBpbnRlbGxpZ2VuY2UgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdhcHBsaWVkIHRvIHNlcGFyYXRpbmcgdGhlIGNvbW1hbmRzOyB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnIjs7IiBwYWlyLCBldmVuIGlmIGl0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSBxdW90ZWQgc3RyaW5nLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSWYgYSBmaWxlICIucGRicmMiIGV4aXN0cyBpbiB0aGUgdXNlclwncyBob21lIGRpcmVjdG9yeSBvciBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjdXJyZW50IGRpcmVjdG9yeSwgaXQgaXMgcmVhZCBpbiBhbmQgZXhlY3V0ZWQgYXMgaWYgaXQgaGFkIGJlZW4gJworICAgICAgICAgICAgICd0eXBlZFxuJworICAgICAgICAgICAgICdhdCB0aGUgZGVidWdnZXIgcHJvbXB0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciAnCisgICAgICAgICAgICAgJ2FsaWFzZXMuICBJZlxuJworICAgICAgICAgICAgICdib3RoIGZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZSBob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0ICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJ2FsaWFzZXMgZGVmaW5lZCB0aGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgbG9jYWwgZmlsZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjI6ICIucGRicmMiIGNhbiBub3cgY29udGFpbiBjb21tYW5kcyB0aGF0XG4nCisgICAgICAgICAgICAgJ2NvbnRpbnVlIGRlYnVnZ2luZywgc3VjaCBhcyAiY29udGludWUiIG9yICJuZXh0Ii4gIFByZXZpb3VzbHksICcKKyAgICAgICAgICAgICAndGhlc2VcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgaGFkIG5vIGVmZmVjdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2goZWxwKSBbY29tbWFuZF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgYXJndW1lbnQsIHByaW50IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy4gIFdpdGggJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgICpjb21tYW5kKiBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQuICAiaGVscCAnCisgICAgICAgICAgICAgJ3BkYiJcbicKKyAgICAgICAgICAgICAnICAgZGlzcGxheXMgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiAodGhlIGRvY3N0cmluZyBvZiB0aGUgInBkYiJcbicKKyAgICAgICAgICAgICAnICAgbW9kdWxlKS4gIFNpbmNlIHRoZSAqY29tbWFuZCogYXJndW1lbnQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLCAnCisgICAgICAgICAgICAgJyJoZWxwXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWMiIG11c3QgYmUgZW50ZXJlZCB0byBnZXQgaGVscCBvbiB0aGUgIiEiIGNvbW1hbmQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd3KGhlcmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBQcmludCBhIHN0YWNrIHRyYWNlLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBmcmFtZSBhdCB0aGUgJworICAgICAgICAgICAgICdib3R0b20uICBBblxuJworICAgICAgICAgICAgICcgICBhcnJvdyBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGRldGVybWluZXMgdGhlICcKKyAgICAgICAgICAgICAnY29udGV4dCBvZlxuJworICAgICAgICAgICAgICcgICBtb3N0IGNvbW1hbmRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnZChvd24pIFtjb3VudF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyBkb3duIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHN0YWNrIHRyYWNlICh0byBhIG5ld2VyIGZyYW1lKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3UocCkgW2NvdW50XVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIHVwIGluIHRoZSAnCisgICAgICAgICAgICAgJ3N0YWNrXG4nCisgICAgICAgICAgICAgJyAgIHRyYWNlICh0byBhbiBvbGRlciBmcmFtZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdiKHJlYWspIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggYSAqbGluZW5vKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQgJworICAgICAgICAgICAgICdmaWxlLlxuJworICAgICAgICAgICAgICcgICBXaXRoIGEgKmZ1bmN0aW9uKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgYXQgdGhlIGZpcnN0ICcKKyAgICAgICAgICAgICAnZXhlY3V0YWJsZVxuJworICAgICAgICAgICAgICcgICBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgZnVuY3Rpb24uICBUaGUgbGluZSBudW1iZXIgbWF5IGJlICcKKyAgICAgICAgICAgICAncHJlZml4ZWRcbicKKyAgICAgICAgICAgICAnICAgd2l0aCBhIGZpbGVuYW1lIGFuZCBhIGNvbG9uLCB0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiAnCisgICAgICAgICAgICAgJ2Fub3RoZXJcbicKKyAgICAgICAgICAgICAiICAgZmlsZSAocHJvYmFibHkgb25lIHRoYXQgaGFzbid0IGJlZW4gbG9hZGVkIHlldCkuICBUaGUgZmlsZSAiCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgIHNlYXJjaGVkIG9uICJzeXMucGF0aCIuICBOb3RlIHRoYXQgZWFjaCBicmVha3BvaW50IGlzICcKKyAgICAgICAgICAgICAnYXNzaWduZWQgYVxuJworICAgICAgICAgICAgICcgICBudW1iZXIgdG8gd2hpY2ggYWxsIHRoZSBvdGhlciBicmVha3BvaW50IGNvbW1hbmRzIHJlZmVyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudCwgaXQgaXMgYW4gZXhwcmVzc2lvbiB3aGljaCAnCisgICAgICAgICAgICAgJ211c3RcbicKKyAgICAgICAgICAgICAnICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcywgaW5jbHVkaW5nIGZvciBlYWNoICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludCxcbicKKyAgICAgICAgICAgICAnICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJyZWFrcG9pbnQgaGFzIGJlZW4gaGl0LCB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIGlnbm9yZSBjb3VudCwgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpZiBhbnkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd0YnJlYWsgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGVtcG9yYXJ5IGJyZWFrcG9pbnQsIHdoaWNoIGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0ICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZmlyc3QgaGl0LiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgImJyZWFrIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NsKGVhcikgW2ZpbGVuYW1lOmxpbmVubyB8IGJwbnVtYmVyIFticG51bWJlciAuLi5dXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhICpmaWxlbmFtZTpsaW5lbm8qIGFyZ3VtZW50LCBjbGVhciBhbGwgdGhlIGJyZWFrcG9pbnRzICcKKyAgICAgICAgICAgICAnYXRcbicKKyAgICAgICAgICAgICAnICAgdGhpcyBsaW5lLiBXaXRoIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYnJlYWtwb2ludCBudW1iZXJzLCAnCisgICAgICAgICAgICAgJ2NsZWFyXG4nCisgICAgICAgICAgICAgJyAgIHRob3NlIGJyZWFrcG9pbnRzLiBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQgJworICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICcgICBhc2sgY29uZmlybWF0aW9uKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2Rpc2FibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRGlzYWJsZSB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZlxuJworICAgICAgICAgICAgICcgICBicmVha3BvaW50IG51bWJlcnMuICBEaXNhYmxpbmcgYSBicmVha3BvaW50IG1lYW5zIGl0IGNhbm5vdCAnCisgICAgICAgICAgICAgJ2NhdXNlXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLCBidXQgdW5saWtlIGNsZWFyaW5nIGEgJworICAgICAgICAgICAgICdicmVha3BvaW50LCBpdFxuJworICAgICAgICAgICAgICcgICByZW1haW5zIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzIGFuZCBjYW4gYmUgKHJlLSllbmFibGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnZW5hYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEVuYWJsZSB0aGUgYnJlYWtwb2ludHMgc3BlY2lmaWVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaWdub3JlIGJwbnVtYmVyIFtjb3VudF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFNldCB0aGUgaWdub3JlIGNvdW50IGZvciB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBudW1iZXIuICBJZiAnCisgICAgICAgICAgICAgJ2NvdW50IGlzXG4nCisgICAgICAgICAgICAgJyAgIG9taXR0ZWQsIHRoZSBpZ25vcmUgY291bnQgaXMgc2V0IHRvIDAuICBBIGJyZWFrcG9pbnQgYmVjb21lcyAnCisgICAgICAgICAgICAgJ2FjdGl2ZVxuJworICAgICAgICAgICAgICcgICB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZSBjb3VudCBpc1xuJworICAgICAgICAgICAgICcgICBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCBhbmQgdGhlICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludFxuJworICAgICAgICAgICAgICcgICBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gJworICAgICAgICAgICAgICd0cnVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY29uZGl0aW9uIGJwbnVtYmVyIFtjb25kaXRpb25dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTZXQgYSBuZXcgKmNvbmRpdGlvbiogZm9yIHRoZSBicmVha3BvaW50LCBhbiBleHByZXNzaW9uIHdoaWNoICcKKyAgICAgICAgICAgICAnbXVzdFxuJworICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLiAgSWYgJworICAgICAgICAgICAgICcqY29uZGl0aW9uKlxuJworICAgICAgICAgICAgICcgICBpcyBhYnNlbnQsIGFueSBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludFxuJworICAgICAgICAgICAgICcgICBpcyBtYWRlIHVuY29uZGl0aW9uYWwuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjb21tYW5kcyBbYnBudW1iZXJdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgKmJwbnVtYmVyKi4gICcKKyAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgJyAgIGNvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgJworICAgICAgICAgICAgICdsaW5lXG4nCisgICAgICAgICAgICAgJyAgIGNvbnRhaW5pbmcganVzdCAiZW5kIiB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgKFBkYikgY29tbWFuZHMgMVxuJworICAgICAgICAgICAgICcgICAgICAoY29tKSBwIHNvbWVfdmFyaWFibGVcbicKKyAgICAgICAgICAgICAnICAgICAgKGNvbSkgZW5kXG4nCisgICAgICAgICAgICAgJyAgICAgIChQZGIpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZCAnCisgICAgICAgICAgICAgJ2ZvbGxvd1xuJworICAgICAgICAgICAgICcgICBpdCBpbW1lZGlhdGVseSB3aXRoICJlbmQiOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aCBubyAqYnBudW1iZXIqIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QgJworICAgICAgICAgICAgICdicmVha3BvaW50XG4nCisgICAgICAgICAgICAgJyAgIHNldC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFlvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwICcKKyAgICAgICAgICAgICAnYWdhaW4uXG4nCisgICAgICAgICAgICAgJyAgIFNpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlciAnCisgICAgICAgICAgICAgJ2NvbW1hbmQgdGhhdFxuJworICAgICAgICAgICAgICcgICByZXN1bWVzIGV4ZWN1dGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFNwZWNpZnlpbmcgYW55IGNvbW1hbmQgcmVzdW1pbmcgZXhlY3V0aW9uIChjdXJyZW50bHkgJworICAgICAgICAgICAgICdjb250aW51ZSxcbicKKyAgICAgICAgICAgICAnICAgc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSAnCisgICAgICAgICAgICAgJ3Rlcm1pbmF0ZXNcbicKKyAgICAgICAgICAgICAnICAgdGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJyAgIGVuZCkuIFRoaXMgaXMgYmVjYXVzZSBhbnkgdGltZSB5b3UgcmVzdW1lIGV4ZWN1dGlvbiAoZXZlbiAnCisgICAgICAgICAgICAgJ3dpdGggYVxuJworICAgICAgICAgICAgICcgICBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIgYW5vdGhlciAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnQtLXdoaWNoXG4nCisgICAgICAgICAgICAgJyAgIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8gYW1iaWd1aXRpZXMgYWJvdXQgJworICAgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAgICcgICBsaXN0IHRvIGV4ZWN1dGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIgICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZSAiCisgICAgICAgICAgICAgJ3VzdWFsXG4nCisgICAgICAgICAgICAgJyAgIG1lc3NhZ2UgYWJvdXQgc3RvcHBpbmcgYXQgYSBicmVha3BvaW50IGlzIG5vdCBwcmludGVkLiAgVGhpcyAnCisgICAgICAgICAgICAgJ21heSBiZVxuJworICAgICAgICAgICAgICcgICBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgJworICAgICAgICAgICAgICdtZXNzYWdlIGFuZFxuJworICAgICAgICAgICAgICcgICB0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsICcKKyAgICAgICAgICAgICAneW91XG4nCisgICAgICAgICAgICAgJyAgIHNlZSBubyBzaWduIHRoYXQgdGhlIGJyZWFrcG9pbnQgd2FzIHJlYWNoZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdzKHRlcClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV4ZWN1dGUgdGhlIGN1cnJlbnQgbGluZSwgc3RvcCBhdCB0aGUgZmlyc3QgcG9zc2libGUgJworICAgICAgICAgICAgICdvY2Nhc2lvblxuJworICAgICAgICAgICAgICcgICAoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3Igb24gdGhlIG5leHQgbGluZSBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBjdXJyZW50IGZ1bmN0aW9uKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ24oZXh0KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgJworICAgICAgICAgICAgICdmdW5jdGlvbiBpc1xuJworICAgICAgICAgICAgICcgICByZWFjaGVkIG9yIGl0IHJldHVybnMuICAoVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAibmV4dCIgYW5kICcKKyAgICAgICAgICAgICAnInN0ZXAiXG4nCisgICAgICAgICAgICAgJyAgIGlzIHRoYXQgInN0ZXAiIHN0b3BzIGluc2lkZSBhIGNhbGxlZCBmdW5jdGlvbiwgd2hpbGUgIm5leHQiXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGVzIGNhbGxlZCBmdW5jdGlvbnMgYXQgKG5lYXJseSkgZnVsbCBzcGVlZCwgb25seSAnCisgICAgICAgICAgICAgJ3N0b3BwaW5nIGF0XG4nCisgICAgICAgICAgICAgJyAgIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndW50KGlsKSBbbGluZW5vXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aG91dCBhcmd1bWVudCwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBsaW5lIHdpdGggYSAnCisgICAgICAgICAgICAgJ251bWJlclxuJworICAgICAgICAgICAgICcgICBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGlzIHJlYWNoZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRoIGEgbGluZSBudW1iZXIsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCBhIGxpbmUgd2l0aCBhICcKKyAgICAgICAgICAgICAnbnVtYmVyXG4nCisgICAgICAgICAgICAgJyAgIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhhdCBpcyByZWFjaGVkLiAgSW4gYm90aCBjYXNlcywgYWxzbyAnCisgICAgICAgICAgICAgJ3N0b3Agd2hlblxuJworICAgICAgICAgICAgICcgICB0aGUgY3VycmVudCBmcmFtZSByZXR1cm5zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogQWxsb3cgZ2l2aW5nIGFuIGV4cGxpY2l0IGxpbmUgJworICAgICAgICAgICAgICdudW1iZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdyKGV0dXJuKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjKG9udChpbnVlKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzICcKKyAgICAgICAgICAgICAnZW5jb3VudGVyZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdqKHVtcCkgbGluZW5vXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTZXQgdGhlIG5leHQgbGluZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuICBPbmx5IGF2YWlsYWJsZSBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBib3R0b20tbW9zdCBmcmFtZS4gIFRoaXMgbGV0cyB5b3UganVtcCBiYWNrIGFuZCBleGVjdXRlIGNvZGUgJworICAgICAgICAgICAgICdhZ2FpbixcbicKKyAgICAgICAgICAgICAiICAgb3IganVtcCBmb3J3YXJkIHRvIHNraXAgY29kZSB0aGF0IHlvdSBkb24ndCB3YW50IHRvIHJ1bi5cbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IG5vdCBhbGwganVtcHMgYXJlIGFsbG93ZWQgLS0gZm9yICcKKyAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAnICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgImZvciIgbG9vcCBvciAnCisgICAgICAgICAgICAgJ291dFxuJworICAgICAgICAgICAgICcgICBvZiBhICJmaW5hbGx5IiBjbGF1c2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdsKGlzdCkgW2ZpcnN0WywgbGFzdF1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLiAgV2l0aG91dCBhcmd1bWVudHMsICcKKyAgICAgICAgICAgICAnbGlzdCAxMVxuJworICAgICAgICAgICAgICcgICBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZSBvciBjb250aW51ZSB0aGUgcHJldmlvdXMgJworICAgICAgICAgICAgICdsaXN0aW5nLlxuJworICAgICAgICAgICAgICcgICBXaXRoICIuIiBhcyBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZS4gICcKKyAgICAgICAgICAgICAnV2l0aFxuJworICAgICAgICAgICAgICcgICBvbmUgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIGF0IHRoYXQgbGluZS4gIFdpdGggdHdvXG4nCisgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7IGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgJworICAgICAgICAgICAgICdsZXNzXG4nCisgICAgICAgICAgICAgJyAgIHRoYW4gdGhlIGZpcnN0LCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNvdW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgY3VycmVudCBmcmFtZSBpcyBpbmRpY2F0ZWQgYnkgIi0+Ii4gICcKKyAgICAgICAgICAgICAnSWYgYW5cbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0aW9uIGlzIGJlaW5nIGRlYnVnZ2VkLCB0aGUgbGluZSB3aGVyZSB0aGUgZXhjZXB0aW9uICcKKyAgICAgICAgICAgICAnd2FzXG4nCisgICAgICAgICAgICAgJyAgIG9yaWdpbmFsbHkgcmFpc2VkIG9yIHByb3BhZ2F0ZWQgaXMgaW5kaWNhdGVkIGJ5ICI+PiIsIGlmIGl0ICcKKyAgICAgICAgICAgICAnZGlmZmVyc1xuJworICAgICAgICAgICAgICcgICBmcm9tIHRoZSBjdXJyZW50IGxpbmUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAiPj4iIG1hcmtlci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2xsIHwgbG9uZ2xpc3RcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIExpc3QgYWxsIHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiBvciBmcmFtZS5cbicKKyAgICAgICAgICAgICAnICAgSW50ZXJlc3RpbmcgbGluZXMgYXJlIG1hcmtlZCBhcyBmb3IgImxpc3QiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYShyZ3MpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBQcmludCB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3AgZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiBpbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwcmludCAnCisgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICcgICB2YWx1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5vdGU6ICJwcmludCgpIiBjYW4gYWxzbyBiZSB1c2VkLCBidXQgaXMgbm90IGEgZGVidWdnZXIgJworICAgICAgICAgICAgICdjb21tYW5kXG4nCisgICAgICAgICAgICAgJyAgICAgLS0tIHRoaXMgZXhlY3V0ZXMgdGhlIFB5dGhvbiAicHJpbnQoKSIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwcCBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaWtlIHRoZSAicCIgY29tbWFuZCwgZXhjZXB0IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyAnCisgICAgICAgICAgICAgJ3ByZXR0eS1cbicKKyAgICAgICAgICAgICAnICAgcHJpbnRlZCB1c2luZyB0aGUgInBwcmludCIgbW9kdWxlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnd2hhdGlzIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFByaW50IHRoZSB0eXBlIG9mIHRoZSAqZXhwcmVzc2lvbiouXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdzb3VyY2UgZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVHJ5IHRvIGdldCBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgZGlzcGxheSBpdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2Rpc3BsYXkgW2V4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBEaXNwbGF5IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpZiBpdCBjaGFuZ2VkLCBlYWNoIHRpbWVcbicKKyAgICAgICAgICAgICAnICAgZXhlY3V0aW9uIHN0b3BzIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aG91dCBleHByZXNzaW9uLCBsaXN0IGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIGZyYW1lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndW5kaXNwbGF5IFtleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRG8gbm90IGRpc3BsYXkgdGhlIGV4cHJlc3Npb24gYW55IG1vcmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgY2xlYXIgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSAnCisgICAgICAgICAgICAgJ2N1cnJlbnRcbicKKyAgICAgICAgICAgICAnICAgZnJhbWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdpbnRlcmFjdFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU3RhcnQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgKHVzaW5nIHRoZSAiY29kZSIgbW9kdWxlKSAnCisgICAgICAgICAgICAgJ3dob3NlXG4nCisgICAgICAgICAgICAgJyAgIGdsb2JhbCBuYW1lc3BhY2UgY29udGFpbnMgYWxsIHRoZSAoZ2xvYmFsIGFuZCBsb2NhbCkgbmFtZXMgJworICAgICAgICAgICAgICdmb3VuZCBpblxuJworICAgICAgICAgICAgICcgICB0aGUgY3VycmVudCBzY29wZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2FsaWFzIFtuYW1lIFtjb21tYW5kXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENyZWF0ZSBhbiBhbGlhcyBjYWxsZWQgKm5hbWUqIHRoYXQgZXhlY3V0ZXMgKmNvbW1hbmQqLiAgVGhlICcKKyAgICAgICAgICAgICAnY29tbWFuZFxuJworICAgICAgICAgICAgICcgICBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMgY2FuICcKKyAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAnICAgaW5kaWNhdGVkIGJ5ICIlMSIsICIlMiIsIGFuZCBzbyBvbiwgd2hpbGUgIiUqIiBpcyByZXBsYWNlZCBieSAnCisgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICcgICB0aGUgcGFyYW1ldGVycy4gSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgYWxpYXMgJworICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAnICAgKm5hbWUqIGlzIHNob3duLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUgJworICAgICAgICAgICAgICdsaXN0ZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlICcKKyAgICAgICAgICAgICAnbGVnYWxseVxuJworICAgICAgICAgICAgICcgICB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUgdGhhdCBpbnRlcm5hbCBwZGIgY29tbWFuZHMgJworICAgICAgICAgICAgICcqY2FuKiBiZVxuJworICAgICAgICAgICAgICcgICBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcyB0aGVuIGhpZGRlbiB1bnRpbCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgJworICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICcgICB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgJworICAgICAgICAgICAgICdsZWZ0XG4nCisgICAgICAgICAgICAgJyAgIGFsb25lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gJworICAgICAgICAgICAgICdwbGFjZWRcbicKKyAgICAgICAgICAgICAnICAgaW4gdGhlICIucGRicmMiIGZpbGUpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgKHVzYWdlICJwaSBjbGFzc0luc3QiKVxuJworICAgICAgICAgICAgICcgICAgICBhbGlhcyBwaSBmb3IgayBpbiAlMS5fX2RpY3RfXy5rZXlzKCk6ICcKKyAgICAgICAgICAgICAncHJpbnQoIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10pXG4nCisgICAgICAgICAgICAgJyAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzIGluIHNlbGZcbicKKyAgICAgICAgICAgICAnICAgICAgYWxpYXMgcHMgcGkgc2VsZlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndW5hbGlhcyBuYW1lXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBEZWxldGUgdGhlIHNwZWNpZmllZCBhbGlhcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyEgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGVjdXRlIHRoZSAob25lLWxpbmUpICpzdGF0ZW1lbnQqIGluIHRoZSBjb250ZXh0IG9mIHRoZSAnCisgICAgICAgICAgICAgJ2N1cnJlbnRcbicKKyAgICAgICAgICAgICAnICAgc3RhY2sgZnJhbWUuIFRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgd29yZCBvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuICBUbyBzZXQgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIGdsb2JhbCB2YXJpYWJsZSwgeW91IGNhbiBwcmVmaXggdGhlIGFzc2lnbm1lbnQgY29tbWFuZCB3aXRoICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFsnLWwnXVxuIgorICAgICAgICAgICAgICcgICAgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncnVuIFthcmdzIC4uLl1cbicKKyAgICAgICAgICAgICAncmVzdGFydCBbYXJncyAuLi5dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmIGFuIGFyZ3VtZW50IGlzICcKKyAgICAgICAgICAgICAnc3VwcGxpZWQsXG4nCisgICAgICAgICAgICAgJyAgIGl0IGlzIHNwbGl0IHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXdcbicKKyAgICAgICAgICAgICAnICAgInN5cy5hcmd2Ii4gSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAnb3B0aW9ucyBhcmVcbicKKyAgICAgICAgICAgICAnICAgcHJlc2VydmVkLiAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncSh1aXQpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgJworICAgICAgICAgICAgICdhYm9ydGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbMV0gV2hldGhlciBhIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gb3JpZ2luYXRlIGluIGEgY2VydGFpbiAnCisgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICcgICAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgIl9fbmFtZV9fIiBpbiB0aGUgZnJhbWUgZ2xvYmFscy5cbicsCisgJ2RlbCc6ICdcbicKKyAgICAgICAgJ1RoZSAiZGVsIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZGVsX3N0bXQgOjo9ICJkZWwiIHRhcmdldF9saXN0XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCAnCisgICAgICAgICdpc1xuJworICAgICAgICAnZGVmaW5lZC4gUmF0aGVyIHRoYW4gc3BlbGxpbmcgaXQgb3V0IGluIGZ1bGwgZGV0YWlscywgaGVyZSBhcmUgc29tZVxuJworICAgICAgICAnaGludHMuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGEgdGFyZ2V0IGxpc3QgcmVjdXJzaXZlbHkgZGVsZXRlcyBlYWNoIHRhcmdldCwgZnJvbSBsZWZ0XG4nCisgICAgICAgICd0byByaWdodC5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnRGVsZXRpb24gb2YgYSBuYW1lIHJlbW92ZXMgdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGZyb20gdGhlIGxvY2FsICcKKyAgICAgICAgJ29yXG4nCisgICAgICAgICdnbG9iYWwgbmFtZXNwYWNlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmFtZSBvY2N1cnMgaW4gYSAiZ2xvYmFsIlxuJworICAgICAgICAnc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhXG4nCisgICAgICAgICciTmFtZUVycm9yIiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBzdWJzY3JpcHRpb25zIGFuZCBzbGljaW5ncyBpcyAnCisgICAgICAgICdwYXNzZWRcbicKKyAgICAgICAgJ3RvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWxcbicKKyAgICAgICAgJ2VxdWl2YWxlbnQgdG8gYXNzaWdubWVudCBvZiBhbiBlbXB0eSBzbGljZSBvZiB0aGUgcmlnaHQgdHlwZSAoYnV0ICcKKyAgICAgICAgJ2V2ZW5cbicKKyAgICAgICAgJ3RoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2xpY2VkIG9iamVjdCkuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IFByZXZpb3VzbHkgaXQgd2FzIGlsbGVnYWwgdG8gZGVsZXRlIGEgbmFtZVxuJworICAgICAgICAnZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3VycyBhcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWRcbicKKyAgICAgICAgJ2Jsb2NrLlxuJywKKyAnZGljdCc6ICdcbicKKyAgICAgICAgICdEaWN0aW9uYXJ5IGRpc3BsYXlzXG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuJworICAgICAgICAgJ2VuY2xvc2VkIGluIGN1cmx5IGJyYWNlczpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICcKKyAgICAgICAgICcifSJcbicKKyAgICAgICAgICcgICBrZXlfZGF0dW1fbGlzdCAgICAgOjo9IGtleV9kYXR1bSAoIiwiIGtleV9kYXR1bSkqIFsiLCJdXG4nCisgICAgICAgICAnICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIHwgIioqIiBvcl9leHByXG4nCisgICAgICAgICAnICAgZGljdF9jb21wcmVoZW5zaW9uIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIGNvbXBfZm9yXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0lmIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGtleS9kYXR1bSBwYWlycyBpcyBnaXZlbiwgdGhleSBhcmVcbicKKyAgICAgICAgICdldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgJworICAgICAgICAgJ2RpY3Rpb25hcnk6XG4nCisgICAgICAgICAnZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgZGljdGlvbmFyeSB0byBzdG9yZSB0aGVcbicKKyAgICAgICAgICdjb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbicKKyAgICAgICAgICJtdWx0aXBsZSB0aW1lcyBpbiB0aGUga2V5L2RhdHVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeSdzICIKKyAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgJ2ZvciB0aGF0IGtleSB3aWxsIGJlIHRoZSBsYXN0IG9uZSBnaXZlbi5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdBIGRvdWJsZSBhc3RlcmlzayAiKioiIGRlbm90ZXMgKmRpY3Rpb25hcnkgdW5wYWNraW5nKi4gSXRzIG9wZXJhbmRcbicKKyAgICAgICAgICdtdXN0IGJlIGEgKm1hcHBpbmcqLiAgRWFjaCBtYXBwaW5nIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIG5ld1xuJworICAgICAgICAgJ2RpY3Rpb25hcnkuICBMYXRlciB2YWx1ZXMgcmVwbGFjZSB2YWx1ZXMgYWxyZWFkeSBzZXQgYnkgZWFybGllclxuJworICAgICAgICAgJ2tleS9kYXR1bSBwYWlycyBhbmQgZWFybGllciBkaWN0aW9uYXJ5IHVucGFja2luZ3MuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41OiBVbnBhY2tpbmcgaW50byBkaWN0aW9uYXJ5IGRpc3BsYXlzLCBvcmlnaW5hbGx5XG4nCisgICAgICAgICAncHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkaWN0IGNvbXByZWhlbnNpb24sIGluIGNvbnRyYXN0IHRvIGxpc3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucyxcbicKKyAgICAgICAgICduZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbicKKyAgICAgICAgICciZm9yIiBhbmQgImlmIiBjbGF1c2VzLiBXaGVuIHRoZSBjb21wcmVoZW5zaW9uIGlzIHJ1biwgdGhlICcKKyAgICAgICAgICdyZXN1bHRpbmdcbicKKyAgICAgICAgICdrZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlICcKKyAgICAgICAgICdvcmRlclxuJworICAgICAgICAgJ3RoZXkgYXJlIHByb2R1Y2VkLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1Jlc3RyaWN0aW9ucyBvbiB0aGUgdHlwZXMgb2YgdGhlIGtleSB2YWx1ZXMgYXJlIGxpc3RlZCBlYXJsaWVyIGluXG4nCisgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkuICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbicKKyAgICAgICAgICdzaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzXG4nCisgICAgICAgICAnYmV0d2VlbiBkdXBsaWNhdGUga2V5cyBhcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5XG4nCisgICAgICAgICAncmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKKyAnZHluYW1pYy1mZWF0dXJlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCAnCisgICAgICAgICAgICAgICAgICAgICAnYXQgY29tcGlsZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpID0gMTBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBkZWYgZigpOlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGkgPSA0MlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGYoKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAnaWxsZWdhbCB3aGVuIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnaWxsZWdhbCB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSAnCisgICAgICAgICAgICAgICAgICAgICAndGltZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgJworICAgICAgICAgICAgICAgICAgICAgJ3RvIHRoZSBmdWxsXG4nCisgICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlIGxvY2FsXG4nCisgICAgICAgICAgICAgICAgICAgICAnYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgJworICAgICAgICAgICAgICAgICAgICAgJ25vdCByZXNvbHZlZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsICcKKyAgICAgICAgICAgICAgICAgICAgICduYW1lc3BhY2UuICBbMV1cbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSAnCisgICAgICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnZWxzZSc6ICdcbicKKyAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICcgICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuJworICAgICAgICAgJyAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0l0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyAnCisgICAgICAgICAnb25lXG4nCisgICAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuICcKKyAgICAgICAgICdvcGVyYXRpb25zXG4nCisgICAgICAgICAnZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4nCisgICAgICAgICAnKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuJworICAgICAgICAgJ0lmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbicKKyAgICAgICAgICdwcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCisgJ2V4Y2VwdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9uc1xuJworICAgICAgICAgICAgICAgJyoqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgJworICAgICAgICAgICAgICAgJ2NvbnRyb2xcbicKKyAgICAgICAgICAgICAgICdvZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uYWxcbicKKyAgICAgICAgICAgICAgICdjb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgJworICAgICAgICAgICAgICAgJ2Vycm9yIGlzXG4nCisgICAgICAgICAgICAgICAnZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgJworICAgICAgICAgICAgICAgJ2J5IGFueVxuJworICAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgJworICAgICAgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgICAgICAndGhlIGVycm9yIG9jY3VycmVkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSAnCisgICAgICAgICAgICAgICAncnVuLXRpbWVcbicKKyAgICAgICAgICAgICAgICdlcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbicKKyAgICAgICAgICAgICAgICdleHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAgJ2hhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gICcKKyAgICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAgICciZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSAnCisgICAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICAgJ2NvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICAnd2hldGhlciBhblxuJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1B5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICAnaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0ICcKKyAgICAgICAgICAgICAgICdhbiBvdXRlclxuJworICAgICAgICAgICAgICAgJ2xldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlICcKKyAgICAgICAgICAgICAgICdvZiBjb2RlXG4nCisgICAgICAgICAgICAgICAnZnJvbSB0aGUgdG9wKS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciAnCisgICAgICAgICAgICAgICAndGVybWluYXRlc1xuJworICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiAnCisgICAgICAgICAgICAgICAnbG9vcC4gIEluXG4nCisgICAgICAgICAgICAgICAnZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICdleGNlcHRpb24gaXNcbicKKyAgICAgICAgICAgICAgICciU3lzdGVtRXhpdCIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgJworICAgICAgICAgICAgICAgJ2NsYXVzZSBpc1xuJworICAgICAgICAgICAgICAgJ3NlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0ICcKKyAgICAgICAgICAgICAgICdyZWZlcmVuY2UgdGhlXG4nCisgICAgICAgICAgICAgICAnY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICdjYW4gYmVcbicKKyAgICAgICAgICAgICAgICdyZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gJworICAgICAgICAgICAgICAgJ2Fib3V0IHRoZVxuJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdOb3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgJworICAgICAgICAgICAgICAgJ1RoZWlyXG4nCisgICAgICAgICAgICAgICAnICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0ICcKKyAgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICAnICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuICcKKyAgICAgICAgICAgICAgICd1bmRlclxuJworICAgICAgICAgICAgICAgJyAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1NlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAgICAgICd0cnlcbicKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQgYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlIHJhaXNlICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICAgJyAgICB0aGVzZSBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSAnCisgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICcgICAgY29tcGlsZWQuXG4nLAorICdleGVjbW9kZWwnOiAnXG4nCisgICAgICAgICAgICAgICdFeGVjdXRpb24gbW9kZWxcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1N0cnVjdHVyZSBvZiBhIHByb2dyYW1cbicKKyAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgJworICAgICAgICAgICAgICAnYSBwaWVjZVxuJworICAgICAgICAgICAgICAnb2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgdW5pdC4gVGhlICcKKyAgICAgICAgICAgICAgJ2ZvbGxvd2luZyBhcmVcbicKKyAgICAgICAgICAgICAgJ2Jsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MgZGVmaW5pdGlvbi4gJworICAgICAgICAgICAgICAnRWFjaFxuJworICAgICAgICAgICAgICAnY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgJworICAgICAgICAgICAgICAnZ2l2ZW5cbicKKyAgICAgICAgICAgICAgJ2FzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWQgYXMgYSBjb21tYW5kICcKKyAgICAgICAgICAgICAgJ2xpbmVcbicKKyAgICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIHRoZSBpbnRlcnByZXRlcikgaXMgYSBjb2RlIGJsb2NrLiAgQSBzY3JpcHQgY29tbWFuZCAnCisgICAgICAgICAgICAgICcoYVxuJworICAgICAgICAgICAgICAnY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICInKiotYyoqJ1xuIgorICAgICAgICAgICAgICAnb3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgJworICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lICcKKyAgICAgICAgICAgICAgJ2NvbnRhaW5zXG4nCisgICAgICAgICAgICAgICdzb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCAnCisgICAgICAgICAgICAgICdkZXRlcm1pbmVzXG4nCisgICAgICAgICAgICAgICJ3aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2sncyAiCisgICAgICAgICAgICAgICdleGVjdXRpb24gaGFzXG4nCisgICAgICAgICAgICAgICdjb21wbGV0ZWQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdCaW5kaW5nIG9mIG5hbWVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJypOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgJworICAgICAgICAgICAgICAnYmluZGluZ1xuJworICAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvICcKKyAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAgICAgJyJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2NsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCAnCisgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgJ2lkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgJworICAgICAgICAgICAgICAnb3IgYWZ0ZXJcbicKKyAgICAgICAgICAgICAgJyJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiICcKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAgICAnb2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgJ2ltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICAnCisgICAgICAgICAgICAgICdUaGlzIGZvcm1cbicKKyAgICAgICAgICAgICAgJ21heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCAnCisgICAgICAgICAgICAgICdib3VuZCBmb3JcbicKKyAgICAgICAgICAgICAgJ3RoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlICcKKyAgICAgICAgICAgICAgJ25hbWUpLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgJworICAgICAgICAgICAgICAnZGVmaW5lZCBieSBhXG4nCisgICAgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSAnCisgICAgICAgICAgICAgICd0b3AtbGV2ZWxcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2spLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0ICcKKyAgICAgICAgICAgICAgJ2Jsb2NrLFxuJworICAgICAgICAgICAgICAndW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgJworICAgICAgICAgICAgICAnYXQgdGhlXG4nCisgICAgICAgICAgICAgICdtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAnY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSAnCisgICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgICdibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAnCisgICAgICAgICAgICAgICcqYmluZGluZypcbicKKyAgICAgICAgICAgICAgJ29mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiAnCisgICAgICAgICAgICAgICdydWxlcy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdSZXNvbHV0aW9uIG9mIG5hbWVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmICcKKyAgICAgICAgICAgICAgJ2EgbG9jYWxcbicKKyAgICAgICAgICAgICAgJ3ZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICAnCisgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSAnCisgICAgICAgICAgICAgICdibG9ja3NcbicKKyAgICAgICAgICAgICAgJ2NvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrICcKKyAgICAgICAgICAgICAgJ2ludHJvZHVjZXNcbicKKyAgICAgICAgICAgICAgJ2EgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlICcKKyAgICAgICAgICAgICAgJ25lYXJlc3RcbicKKyAgICAgICAgICAgICAgJ2VuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICAgICJpcyBjYWxsZWQgdGhlIGJsb2NrJ3MgKmVudmlyb25tZW50Ki5cbiIKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICAncmFpc2VkLiBJZlxuJworICAgICAgICAgICAgICAndGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBmdW5jdGlvbiBzY29wZSwgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhICcKKyAgICAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICAgICd2YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgJworICAgICAgICAgICAgICAnd2hlcmUgdGhlXG4nCisgICAgICAgICAgICAgICduYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgJyJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYSBzdWJjbGFzcyBvZiAiTmFtZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrLCBhbGxcbicKKyAgICAgICAgICAgICAgJ3VzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAnY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgJworICAgICAgICAgICAgICAnd2l0aGluIGFcbicKKyAgICAgICAgICAgICAgJ2Jsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbicKKyAgICAgICAgICAgICAgJ2RlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyICcKKyAgICAgICAgICAgICAgJ2FueXdoZXJlXG4nCisgICAgICAgICAgICAgICd3aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuICcKKyAgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgJworICAgICAgICAgICAgICAnYmluZGluZ1xuJworICAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mICcKKyAgICAgICAgICAgICAgJ3RoZSBuYW1lXG4nCisgICAgICAgICAgICAgICdzcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICd0b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgJworICAgICAgICAgICAgICAnbmFtZXNwYWNlIGJ5XG4nCisgICAgICAgICAgICAgICdzZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgJworICAgICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlICcKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAgICAnb2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgJworICAgICAgICAgICAgICAnZmlyc3QuICBJZlxuJworICAgICAgICAgICAgICAndGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzICcKKyAgICAgICAgICAgICAgJ3NlYXJjaGVkLiAgVGhlXG4nCisgICAgICAgICAgICAgICciZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdUaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyAnCisgICAgICAgICAgICAgICdvcGVyYXRpb25cbicKKyAgICAgICAgICAgICAgJ2luIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgJworICAgICAgICAgICAgICAndmFyaWFibGVcbicKKyAgICAgICAgICAgICAgJ2NvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXMgdHJlYXRlZCBhcyBhICcKKyAgICAgICAgICAgICAgJ2dsb2JhbC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyICcKKyAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICdwcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gJworICAgICAgICAgICAgICAnc2NvcGUuXG4nCisgICAgICAgICAgICAgICciU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyAnCisgICAgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgICAgJ2V4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgJworICAgICAgICAgICAgICAndGltZSBhXG4nCisgICAgICAgICAgICAgICdtb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyAnCisgICAgICAgICAgICAgICdjYWxsZWRcbicKKyAgICAgICAgICAgICAgJyJfX21haW5fXyIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0NsYXNzIGRlZmluaXRpb24gYmxvY2tzIGFuZCBhcmd1bWVudHMgdG8gImV4ZWMoKSIgYW5kICJldmFsKCkiICcKKyAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAnc3BlY2lhbCBpbiB0aGUgY29udGV4dCBvZiBuYW1lIHJlc29sdXRpb24uIEEgY2xhc3MgZGVmaW5pdGlvbiAnCisgICAgICAgICAgICAgICdpcyBhblxuJworICAgICAgICAgICAgICAnZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlICcKKyAgICAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAgJ2ZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24gd2l0aCBhbiBleGNlcHRpb24gJworICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAndW5ib3VuZCBsb2NhbCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gJworICAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgICduYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgb2ZcbicKKyAgICAgICAgICAgICAgJ3RoZSBjbGFzcy4gVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyAnCisgICAgICAgICAgICAgICdsaW1pdGVkIHRvXG4nCisgICAgICAgICAgICAgICd0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgJworICAgICAgICAgICAgICAnbWV0aG9kcyAtLVxuJworICAgICAgICAgICAgICAndGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlICcKKyAgICAgICAgICAgICAgJ3RoZXkgYXJlXG4nCisgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAgJ3dpbGwgZmFpbDpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgY2xhc3MgQTpcbicKKyAgICAgICAgICAgICAgJyAgICAgICBhID0gNDJcbicKKyAgICAgICAgICAgICAgJyAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQnVpbHRpbnMgYW5kIHJlc3RyaWN0ZWQgZXhlY3V0aW9uXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgJworICAgICAgICAgICAgICAnYmxvY2tcbicKKyAgICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzICcKKyAgICAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAgICAnbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSAnCisgICAgICAgICAgICAgICdsYXR0ZXIgY2FzZVxuJworICAgICAgICAgICAgICAidGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiCisgICAgICAgICAgICAgICciX19tYWluX18iXG4nCisgICAgICAgICAgICAgICdtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiAnCisgICAgICAgICAgICAgICdpbiBhbnlcbicKKyAgICAgICAgICAgICAgJ290aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAnImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhICcKKyAgICAgICAgICAgICAgJ3VzZXItY3JlYXRlZFxuJworICAgICAgICAgICAgICAnZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuJworICAgICAgICAgICAgICAnIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gICcKKyAgICAgICAgICAgICAgJ1VzZXJzXG4nCisgICAgICAgICAgICAgICd3YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAnCisgICAgICAgICAgICAgICciaW1wb3J0IlxuJworICAgICAgICAgICAgICAndGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbicKKyAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCAnCisgICAgICAgICAgICAgICdjb21waWxlXG4nCisgICAgICAgICAgICAgICd0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGkgPSAxMFxuJworICAgICAgICAgICAgICAnICAgZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICAnICAgaSA9IDQyXG4nCisgICAgICAgICAgICAgICcgICBmKClcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgJworICAgICAgICAgICAgICAnd2hlbiB1c2VkXG4nCisgICAgICAgICAgICAgICdpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyAnCisgICAgICAgICAgICAgICdpbGxlZ2FsIHRvXG4nCisgICAgICAgICAgICAgICdkZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSAnCisgICAgICAgICAgICAgICdmdWxsXG4nCisgICAgICAgICAgICAgICdlbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSAnCisgICAgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAgICAnYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90ICcKKyAgICAgICAgICAgICAgJ3Jlc29sdmVkXG4nCisgICAgICAgICAgICAgICdpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCAnCisgICAgICAgICAgICAgICduYW1lc3BhY2UuICBbMV1cbicKKyAgICAgICAgICAgICAgJ1RoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4nCisgICAgICAgICAgICAgICdvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgJworICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgJ3NwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiAnCisgICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgICdvZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuJworICAgICAgICAgICAgICAnY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlICcKKyAgICAgICAgICAgICAgJ2Vycm9yIGlzXG4nCisgICAgICAgICAgICAgICdkZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciAnCisgICAgICAgICAgICAgICdieSBhbnlcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgJworICAgICAgICAgICAgICAnd2hlcmVcbicKKyAgICAgICAgICAgICAgJ3RoZSBlcnJvciBvY2N1cnJlZC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhICcKKyAgICAgICAgICAgICAgJ3J1bi10aW1lXG4nCisgICAgICAgICAgICAgICdlcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbicKKyAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiAnCisgICAgICAgICAgICAgICdFeGNlcHRpb25cbicKKyAgICAgICAgICAgICAgJ2hhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gICcKKyAgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgJworICAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICAnY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgJ3doZXRoZXIgYW5cbicKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdQeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gJworICAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICdoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gJworICAgICAgICAgICAgICAnb3V0ZXJcbicKKyAgICAgICAgICAgICAgJ2xldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2ZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiAnCisgICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgICdmcm9tIHRoZSB0b3ApLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciAnCisgICAgICAgICAgICAgICd0ZXJtaW5hdGVzXG4nCisgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gJworICAgICAgICAgICAgICAnbG9vcC4gIEluXG4nCisgICAgICAgICAgICAgICdlaXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgJworICAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzXG4nCisgICAgICAgICAgICAgICciU3lzdGVtRXhpdCIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiICcKKyAgICAgICAgICAgICAgJ2NsYXVzZSBpc1xuJworICAgICAgICAgICAgICAnc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgJworICAgICAgICAgICAgICAncmVmZXJlbmNlIHRoZVxuJworICAgICAgICAgICAgICAnY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgJ2NhbiBiZVxuJworICAgICAgICAgICAgICAncmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICcKKyAgICAgICAgICAgICAgJ2Fib3V0IHRoZVxuJworICAgICAgICAgICAgICAnZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOb3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgJworICAgICAgICAgICAgICAnVGhlaXJcbicKKyAgICAgICAgICAgICAgJyAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICcgIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gJworICAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAgJyAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICd0cnlcbicKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudCBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgcmFpc2UgJworICAgICAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgICcgICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgJworICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgJyAgICBjb21waWxlZC5cbicsCisgJ2V4cHJsaXN0cyc6ICdcbicKKyAgICAgICAgICAgICAgJ0V4cHJlc3Npb24gbGlzdHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgZXhwcmVzc2lvbl9saXN0ICAgIDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl1cbicKKyAgICAgICAgICAgICAgJyAgIHN0YXJyZWRfbGlzdCAgICAgICA6Oj0gc3RhcnJlZF9pdGVtICggIiwiIHN0YXJyZWRfaXRlbSApKiAnCisgICAgICAgICAgICAgICdbIiwiXVxuJworICAgICAgICAgICAgICAnICAgc3RhcnJlZF9leHByZXNzaW9uIDo6PSBleHByZXNzaW9uIHwgKCBzdGFycmVkX2l0ZW0gIiwiICkqICcKKyAgICAgICAgICAgICAgJ1tzdGFycmVkX2l0ZW1dXG4nCisgICAgICAgICAgICAgICcgICBzdGFycmVkX2l0ZW0gICAgICAgOjo9IGV4cHJlc3Npb24gfCAiKiIgb3JfZXhwclxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHQgd2hlbiBwYXJ0IG9mIGEgbGlzdCBvciBzZXQgZGlzcGxheSwgYW4gZXhwcmVzc2lvbiBsaXN0XG4nCisgICAgICAgICAgICAgICdjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZSBsZW5ndGggb2YgJworICAgICAgICAgICAgICAndGhlIHR1cGxlXG4nCisgICAgICAgICAgICAgICdpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlIGV4cHJlc3Npb25zIGFyZVxuJworICAgICAgICAgICAgICAnZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gYXN0ZXJpc2sgIioiIGRlbm90ZXMgKml0ZXJhYmxlIHVucGFja2luZyouICBJdHMgb3BlcmFuZCBtdXN0ICcKKyAgICAgICAgICAgICAgJ2JlIGFuXG4nCisgICAgICAgICAgICAgICcqaXRlcmFibGUqLiAgVGhlIGl0ZXJhYmxlIGlzIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSBvZiBpdGVtcywgJworICAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAgJ2FyZSBpbmNsdWRlZCBpbiB0aGUgbmV3IHR1cGxlLCBsaXN0LCBvciBzZXQsIGF0IHRoZSBzaXRlIG9mICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAndW5wYWNraW5nLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjU6IEl0ZXJhYmxlIHVucGFja2luZyBpbiBleHByZXNzaW9uIGxpc3RzLCAnCisgICAgICAgICAgICAgICdvcmlnaW5hbGx5XG4nCisgICAgICAgICAgICAgICdwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlICcKKyAgICAgICAgICAgICAgJyhhLmsuYS4gYVxuJworICAgICAgICAgICAgICAnKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSAnCisgICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgICJ3aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc24ndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciAiCisgICAgICAgICAgICAgICd5aWVsZHMgdGhlXG4nCisgICAgICAgICAgICAgICd2YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiAnCisgICAgICAgICAgICAgICdlbXB0eSBwYWlyXG4nCisgICAgICAgICAgICAgICdvZiBwYXJlbnRoZXNlczogIigpIi4pXG4nLAorICdmbG9hdGluZyc6ICdcbicKKyAgICAgICAgICAgICAnRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Zsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG4nCisgICAgICAgICAgICAgJ2RlZmluaXRpb25zOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbicKKyAgICAgICAgICAgICAnICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiJcbicKKyAgICAgICAgICAgICAnICAgZXhwb25lbnRmbG9hdCA6Oj0gKGludHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudFxuJworICAgICAgICAgICAgICcgICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0K1xuJworICAgICAgICAgICAgICcgICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdCtcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgYXJlIGFsd2F5cyBpbnRlcnByZXRlZCAnCisgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgJ3JhZGl4IDEwLiBGb3IgZXhhbXBsZSwgIjA3N2UwMTAiIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ251bWJlclxuJworICAgICAgICAgICAgICdhcyAiNzdlMTAiLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpc1xuJworICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICdsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgJworICAgICAgICAgICAgICciLTEiXG4nCisgICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICItIiBhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnbGl0ZXJhbCAiMSIuXG4nLAorICdmb3InOiAnXG4nCisgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50XG4nCisgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgJworICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgJyhzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG4nCisgICAgICAgICdvYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuJworICAgICAgICAnImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbicKKyAgICAgICAgJ3Byb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gICcKKyAgICAgICAgJ0VhY2hcbicKKyAgICAgICAgJ2l0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG4nCisgICAgICAgICdmb3IgYXNzaWdubWVudHMgKHNlZSBBc3NpZ25tZW50IHN0YXRlbWVudHMpLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXNcbicKKyAgICAgICAgJ2V4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ3NlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiAnCisgICAgICAgICdleGNlcHRpb24pLFxuJworICAgICAgICAndGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSAnCisgICAgICAgICdsb29wXG4nCisgICAgICAgICd0ZXJtaW5hdGVzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG4nCisgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kICcKKyAgICAgICAgJ2NvbnRpbnVlc1xuJworICAgICAgICAnd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHRcbicKKyAgICAgICAgJ2l0ZW0uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgJworICAgICAgICAnbGlzdC5cbicKKyAgICAgICAgJ1RoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzICcKKyAgICAgICAgJ2luY2x1ZGluZ1xuJworICAgICAgICAndGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBmb3IgaSBpbiByYW5nZSgxMCk6XG4nCisgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgJyAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgJworICAgICAgICAnbmV4dFxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ05hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCxcbicKKyAgICAgICAgJ2J1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0XG4nCisgICAgICAgICdhbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgYW5cbicKKyAgICAgICAgJ2l0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgImZvciAnCisgICAgICAgICdpXG4nCisgICAgICAgICc6PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAyXSIuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ05vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4nCisgICAgICAgICcgIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gIEFuXG4nCisgICAgICAgICcgIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LFxuJworICAgICAgICAnICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhc1xuJworICAgICAgICAnICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzICcKKyAgICAgICAgJ21lYW5zXG4nCisgICAgICAgICcgIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJyAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCAnCisgICAgICAgICdvZlxuJworICAgICAgICAnICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgJworICAgICAgICAndGhlXG4nCisgICAgICAgICcgIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuJworICAgICAgICAnICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbicKKyAgICAgICAgJyAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbicKKyAgICAgICAgJyAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgICAgZm9yIHggaW4gYVs6XTpcbicKKyAgICAgICAgJyAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJywKKyAnZm9ybWF0c3RyaW5ncyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICdGb3JtYXQgU3RyaW5nIFN5bnRheFxuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBhbmQgdGhlICJGb3JtYXR0ZXIiIGNsYXNzIHNoYXJlICcKKyAgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgJ3N5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mICcKKyAgICAgICAgICAgICAgICAgICciRm9ybWF0dGVyIixcbicKKyAgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4gIFRoZSAnCisgICAgICAgICAgICAgICAgICAnc3ludGF4IGlzXG4nCisgICAgICAgICAgICAgICAgICAncmVsYXRlZCB0byB0aGF0IG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMsIGJ1dCB0aGVyZSAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnZGlmZmVyZW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdjdXJseSBicmFjZXNcbicKKyAgICAgICAgICAgICAgICAgICcie30iLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzICcKKyAgICAgICAgICAgICAgICAgICdjb25zaWRlcmVkIGxpdGVyYWxcbicKKyAgICAgICAgICAgICAgICAgICd0ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCAnCisgICAgICAgICAgICAgICAgICAndG8gaW5jbHVkZVxuJworICAgICAgICAgICAgICAgICAgJ2EgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdkb3VibGluZzpcbicKKyAgICAgICAgICAgICAgICAgICcie3siIGFuZCAifX0iLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiAnCisgICAgICAgICAgICAgICAgICAnY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgZmllbGRfbmFtZSAgICAgICAgOjo9IGFyZ19uYW1lICgiLiIgYXR0cmlidXRlX25hbWUgfCAnCisgICAgICAgICAgICAgICAgICAnIlsiIGVsZW1lbnRfaW5kZXggIl0iKSpcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZV9uYW1lICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgZWxlbWVudF9pbmRleCAgICAgOjo9IGludGVnZXIgfCBpbmRleF9zdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAnIl0iPiArXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgY29udmVyc2lvbiAgICAgICAgOjo9ICJyIiB8ICJzIiB8ICJhIlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0ICcKKyAgICAgICAgICAgICAgICAgICdzZWN0aW9uPlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggJworICAgICAgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAgICAgICcqZmllbGRfbmFtZSogdGhhdCBzcGVjaWZpZXMgdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyB0byBiZSAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAgICAgICAnYW5kIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBpbnN0ZWFkIG9mIHRoZSByZXBsYWNlbWVudCAnCisgICAgICAgICAgICAgICAgICAnZmllbGQuIFRoZVxuJworICAgICAgICAgICAgICAgICAgJypmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiAnCisgICAgICAgICAgICAgICAgICAnZmllbGQsIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAncHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgIlwnIVwnIiwgYW5kIGEgJworICAgICAgICAgICAgICAgICAgJypmb3JtYXRfc3BlYyosIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAncHJlY2VkZWQgYnkgYSBjb2xvbiAiXCc6XCciLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgZm9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ3JlcGxhY2VtZW50IHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvIHRoZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIHNlY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpmaWVsZF9uYW1lKiBpdHNlbGYgYmVnaW5zIHdpdGggYW4gKmFyZ19uYW1lKiB0aGF0IGlzICcKKyAgICAgICAgICAgICAgICAgICdlaXRoZXIgYVxuJworICAgICAgICAgICAgICAgICAgIm51bWJlciBvciBhIGtleXdvcmQuICBJZiBpdCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSAiCisgICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAgImFyZ3VtZW50LCBhbmQgaWYgaXQncyBhIGtleXdvcmQsIGl0IHJlZmVycyB0byBhIG5hbWVkICIKKyAgICAgICAgICAgICAgICAgICdrZXl3b3JkXG4nCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ2FyZSAwLCAxLCAyLFxuJworICAgICAgICAgICAgICAgICAgJy4uLiBpbiBzZXF1ZW5jZSwgdGhleSBjYW4gYWxsIGJlIG9taXR0ZWQgKG5vdCBqdXN0IHNvbWUpICcKKyAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVycyAwLCAxLCAyLCAuLi4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ29yZGVyLlxuJworICAgICAgICAgICAgICAgICAgJ0JlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgJ3Bvc3NpYmxlIHRvXG4nCisgICAgICAgICAgICAgICAgICAnc3BlY2lmeSBhcmJpdHJhcnkgZGljdGlvbmFyeSBrZXlzIChlLmcuLCB0aGUgc3RyaW5ncyAnCisgICAgICAgICAgICAgICAgICAnIlwnMTBcJyIgb3JcbicKKyAgICAgICAgICAgICAgICAgICciXCc6LV1cJyIpIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZSAqYXJnX25hbWUqIGNhbiBiZSAnCisgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYW55XG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIG9mIGluZGV4IG9yIGF0dHJpYnV0ZSBleHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiAnCisgICAgICAgICAgICAgICAgICAndGhlIGZvcm1cbicKKyAgICAgICAgICAgICAgICAgICciXCcubmFtZVwnIiBzZWxlY3RzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgdXNpbmcgImdldGF0dHIoKSIsICcKKyAgICAgICAgICAgICAgICAgICd3aGlsZSBhblxuJworICAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gb2YgdGhlIGZvcm0gIlwnW2luZGV4XVwnIiBkb2VzIGFuIGluZGV4IGxvb2t1cCAnCisgICAgICAgICAgICAgICAgICAndXNpbmdcbicKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVycyAnCisgICAgICAgICAgICAgICAgICAnY2FuIGJlXG4nCisgICAgICAgICAgICAgICAgICAnb21pdHRlZCwgc28gIlwne30ge31cJyIgaXMgZXF1aXZhbGVudCB0byAiXCd7MH0gezF9XCciLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NvbWUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgICMgUmVmZXJlbmNlcyBmaXJzdCAnCisgICAgICAgICAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudFxuJworICAgICAgICAgICAgICAgICAgJyAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0bHkgJworICAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzICJGcm9tIHswfSB0byAnCisgICAgICAgICAgICAgICAgICAnezF9IlxuJworICAgICAgICAgICAgICAgICAgJyAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICAjIFJlZmVyZW5jZXMga2V5d29yZCAnCisgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJ25hbWUnXG4iCisgICAgICAgICAgICAgICAgICAnICAgIldlaWdodCBpbiB0b25zIHswLndlaWdodH0iICAgICAgICMgXCd3ZWlnaHRcJyBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgJ29mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIlVuaXRzIGRlc3Ryb3llZDoge3BsYXllcnNbMF19IiAgICMgRmlyc3QgZWxlbWVudCBvZiAnCisgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudCAncGxheWVycycuXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdOb3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJfX2Zvcm1hdF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzIGl0IGlzICcKKyAgICAgICAgICAgICAgICAgICdkZXNpcmFibGUgdG9cbicKKyAgICAgICAgICAgICAgICAgICdmb3JjZSBhIHR5cGUgdG8gYmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLCBvdmVycmlkaW5nIGl0cyAnCisgICAgICAgICAgICAgICAgICAnb3duXG4nCisgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSAnCisgICAgICAgICAgICAgICAgICAnc3RyaW5nIGJlZm9yZVxuJworICAgICAgICAgICAgICAgICAgJ2NhbGxpbmcgIl9fZm9ybWF0X18oKSIsIHRoZSBub3JtYWwgZm9ybWF0dGluZyBsb2dpYyBpcyAnCisgICAgICAgICAgICAgICAgICAnYnlwYXNzZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhyZWUgY29udmVyc2lvbiBmbGFncyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogIlwnIXNcJyIgJworICAgICAgICAgICAgICAgICAgJ3doaWNoIGNhbGxzXG4nCisgICAgICAgICAgICAgICAgICAnInN0cigpIiBvbiB0aGUgdmFsdWUsICJcJyFyXCciIHdoaWNoIGNhbGxzICJyZXByKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIlwnIWFcJyIgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICdjYWxscyAiYXNjaWkoKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnU29tZSBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiSGFyb2xkXCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJyAgICJNb3JlIHshYX0iICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbHMgYXNjaWkoKSBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpmb3JtYXRfc3BlYyogZmllbGQgY29udGFpbnMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGUgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgJworICAgICAgICAgICAgICAgICAgJ2FsaWdubWVudCxcbicKKyAgICAgICAgICAgICAgICAgICdwYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmUgaXRzXG4nCisgICAgICAgICAgICAgICAgICAnb3duICJmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UiIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnKmZvcm1hdF9zcGVjKi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdNb3N0IGJ1aWx0LWluIHR5cGVzIHN1cHBvcnQgYSBjb21tb24gZm9ybWF0dGluZyAnCisgICAgICAgICAgICAgICAgICAnbWluaS1sYW5ndWFnZSwgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICdpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkc1xuJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgY29udGFpbiBhICcKKyAgICAgICAgICAgICAgICAgICdmaWVsZCBuYW1lLFxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb24gZmxhZyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGJ1dCBkZWVwZXIgJworICAgICAgICAgICAgICAgICAgJ25lc3RpbmcgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAnYWxsb3dlZC4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZSAqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gJworICAgICAgICAgICAgICAgICAgJ1RoaXNcbicKKyAgICAgICAgICAgICAgICAgICdhbGxvd3MgdGhlIGZvcm1hdHRpbmcgb2YgYSB2YWx1ZSB0byBiZSBkeW5hbWljYWxseSAnCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NlZSB0aGUgRm9ybWF0IGV4YW1wbGVzIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZVxuJworICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICciRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzICcKKyAgICAgICAgICAgICAgICAgICdjb250YWluZWRcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50ZWRcbicKKyAgICAgICAgICAgICAgICAgICcoc2VlIEZvcm1hdCBTdHJpbmcgU3ludGF4IGFuZCBGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzKS4gJworICAgICAgICAgICAgICAgICAgJ1RoZXkgY2FuXG4nCisgICAgICAgICAgICAgICAgICAnYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluICJmb3JtYXQoKSIgJworICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uLiAgRWFjaFxuJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3cgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICd0byBiZVxuJworICAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ01vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdFxuJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlICcKKyAgICAgICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgICAgICAnc3VwcG9ydGVkIGJ5IHRoZSBudW1lcmljIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0EgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoIiIiIikgJworICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VzXG4nCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkICJzdHIoKSIgb24gdGhlIHZhbHVlLiAnCisgICAgICAgICAgICAgICAgICAnQSBub24tZW1wdHlcbicKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgc3RyaW5nIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBnZW5lcmFsIGZvcm0gb2YgYSAqc3RhbmRhcmQgZm9ybWF0IHNwZWNpZmllciogaXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0X3NwZWMgOjo9ICcKKyAgICAgICAgICAgICAgICAgICdbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXVxuJworICAgICAgICAgICAgICAgICAgJyAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICAgICAgICcgICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4nCisgICAgICAgICAgICAgICAgICAnICAgc2lnbiAgICAgICAgOjo9ICIrIiB8ICItIiB8ICIgIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyXG4nCisgICAgICAgICAgICAgICAgICAnICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICB0eXBlICAgICAgICA6Oj0gImIiIHwgImMiIHwgImQiIHwgImUiIHwgIkUiIHwgImYiIHwgIkYiICcKKyAgICAgICAgICAgICAgICAgICd8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0lmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWRlZCAnCisgICAgICAgICAgICAgICAgICAnYnkgYSAqZmlsbCpcbicKKyAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSAnCisgICAgICAgICAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAgICAgICAgICdvbWl0dGVkLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgbGl0ZXJhbCBjdXJseSBicmFjZSAnCisgICAgICAgICAgICAgICAgICAnKCIieyIiIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIiJ9IiIpIGFzIHRoZSAqZmlsbCogY2hhcmFjdGVyIGluIGEgZm9ybWF0dGVkIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAnbGl0ZXJhbCBvciB3aGVuXG4nCisgICAgICAgICAgICAgICAgICAndXNpbmcgdGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlICcKKyAgICAgICAgICAgICAgICAgICd0byBpbnNlcnQgYVxuJworICAgICAgICAgICAgICAgICAgJ2N1cmx5IGJyYWNlIHdpdGggYSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGQuICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICJsaW1pdGF0aW9uIGRvZXNuJ3RcbiIKKyAgICAgICAgICAgICAgICAgICdhZmZlY3QgdGhlICJmb3JtYXQoKSIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgJworICAgICAgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBPcHRpb24gICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnPFwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCAnCisgICAgICAgICAgICAgICAgICAnd2l0aGluIHRoZSBhdmFpbGFibGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cykuICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCc+XCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCAnCisgICAgICAgICAgICAgICAgICAnd2l0aGluIHRoZSBhdmFpbGFibGUgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJz1cJyIgICAgIHwgRm9yY2VzIHRoZSBwYWRkaW5nIHRvIGJlIHBsYWNlZCBhZnRlciAnCisgICAgICAgICAgICAgICAgICAndGhlIHNpZ24gKGlmIGFueSkgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYnV0IGJlZm9yZSB0aGUgZGlnaXRzLiAgVGhpcyBpcyB1c2VkIGZvciAnCisgICAgICAgICAgICAgICAgICAncHJpbnRpbmcgZmllbGRzICAgfFxuJworICAgICAgICAgICAgICAgICAgIiAgIHwgICAgICAgICAgIHwgaW4gdGhlIGZvcm0gJyswMDAwMDAxMjAnLiBUaGlzIGFsaWdubWVudCAiCisgICAgICAgICAgICAgICAgICAnb3B0aW9uIGlzIG9ubHkgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdmFsaWQgZm9yIG51bWVyaWMgdHlwZXMuICBJdCBiZWNvbWVzIHRoZSAnCisgICAgICAgICAgICAgICAgICAiZGVmYXVsdCB3aGVuICcwJyAgfFxuIgorICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICd3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnXlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGNlbnRlcmVkIHdpdGhpbiAnCisgICAgICAgICAgICAgICAgICAndGhlIGF2YWlsYWJsZSAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCB1bmxlc3MgYSBtaW5pbXVtIGZpZWxkIHdpZHRoIGlzIGRlZmluZWQsIHRoZSAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgd2lkdGhcbicKKyAgICAgICAgICAgICAgICAgICd3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBkYXRhIHRvIGZpbGwgaXQsIHNvICcKKyAgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJ2FsaWdubWVudCBvcHRpb24gaGFzIG5vIG1lYW5pbmcgaW4gdGhpcyBjYXNlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqc2lnbiogb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIG51bWJlciB0eXBlcywgYW5kIGNhbiAnCisgICAgICAgICAgICAgICAgICAnYmUgb25lIG9mXG4nCisgICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZzpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE9wdGlvbiAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCcrXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAgJ2JvdGggcG9zaXRpdmUgYXMgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJy1cJyIgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkICcKKyAgICAgICAgICAgICAgICAgICdvbmx5IGZvciBuZWdhdGl2ZSAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAnYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgc3BhY2UgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICAndXNlZCBvbiBwb3NpdGl2ZSAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVycy4gICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAiXCcjXCciIG9wdGlvbiBjYXVzZXMgdGhlICJhbHRlcm5hdGUgZm9ybSIgdG8gYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICAnZm9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb24uICBUaGUgYWx0ZXJuYXRlIGZvcm0gaXMgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudFxuJworICAgICAgICAgICAgICAgICAgJ3R5cGVzLiAgVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlciwgZmxvYXQsICcKKyAgICAgICAgICAgICAgICAgICdjb21wbGV4IGFuZFxuJworICAgICAgICAgICAgICAgICAgJ0RlY2ltYWwgdHlwZXMuIEZvciBpbnRlZ2Vycywgd2hlbiBiaW5hcnksIG9jdGFsLCBvciAnCisgICAgICAgICAgICAgICAgICAnaGV4YWRlY2ltYWwgb3V0cHV0XG4nCisgICAgICAgICAgICAgICAgICAnaXMgdXNlZCwgdGhpcyBvcHRpb24gYWRkcyB0aGUgcHJlZml4IHJlc3BlY3RpdmUgIlwnMGJcJyIsICcKKyAgICAgICAgICAgICAgICAgICciXCcwb1wnIiwgb3JcbicKKyAgICAgICAgICAgICAgICAgICciXCcweFwnIiB0byB0aGUgb3V0cHV0IHZhbHVlLiBGb3IgZmxvYXRzLCBjb21wbGV4IGFuZCAnCisgICAgICAgICAgICAgICAgICAnRGVjaW1hbCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiB0byAnCisgICAgICAgICAgICAgICAgICAnYWx3YXlzIGNvbnRhaW4gYVxuJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuICcKKyAgICAgICAgICAgICAgICAgICdOb3JtYWxseSwgYVxuJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHJlc3VsdCBvZiB0aGVzZSAnCisgICAgICAgICAgICAgICAgICAnY29udmVyc2lvbnNcbicKKyAgICAgICAgICAgICAgICAgICdvbmx5IGlmIGEgZGlnaXQgZm9sbG93cyBpdC4gSW4gYWRkaXRpb24sIGZvciAiXCdnXCciIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIlwnR1wnIlxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25zLCB0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgJ3Jlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgIlwnLFwnIiBvcHRpb24gc2lnbmFscyB0aGUgdXNlIG9mIGEgY29tbWEgZm9yIGEgJworICAgICAgICAgICAgICAgICAgJ3Rob3VzYW5kcyBzZXBhcmF0b3IuXG4nCisgICAgICAgICAgICAgICAgICAnRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSAiXCduXCciIGludGVnZXIgJworICAgICAgICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbiB0eXBlXG4nCisgICAgICAgICAgICAgICAgICAnaW5zdGVhZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCB0aGUgIlwnLFwnIiBvcHRpb24gKHNlZSBhbHNvICcKKyAgICAgICAgICAgICAgICAgICcqKlBFUCAzNzgqKikuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnd2lkdGguICBJZiBub3RcbicKKyAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgYnkgYVxuJworICAgICAgICAgICAgICAgICAgJ3plcm8gKCJcJzBcJyIpIGNoYXJhY3RlciBlbmFibGVzIHNpZ24tYXdhcmUgemVyby1wYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICdmb3IgbnVtZXJpY1xuJworICAgICAgICAgICAgICAgICAgJ3R5cGVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgKmZpbGwqIGNoYXJhY3RlciBvZiAiXCcwXCciICcKKyAgICAgICAgICAgICAgICAgICd3aXRoIGFuXG4nCisgICAgICAgICAgICAgICAgICAnKmFsaWdubWVudCogdHlwZSBvZiAiXCc9XCciLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgJworICAgICAgICAgICAgICAgICAgJ2RpZ2l0cyBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICdiZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGVkIHdpdGggIlwnZlwnIiBhbmQgIlwnRlwnIiwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgcG9pbnRcbicKKyAgICAgICAgICAgICAgICAgICdmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBmb3JtYXR0ZWQgd2l0aCAiXCdnXCciIG9yICcKKyAgICAgICAgICAgICAgICAgICciXCdHXCciLiAgRm9yIG5vbi1cbicKKyAgICAgICAgICAgICAgICAgICdudW1iZXIgdHlwZXMgdGhlIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBmaWVsZCBzaXplIC0gJworICAgICAgICAgICAgICAgICAgJ2luIG90aGVyXG4nCisgICAgICAgICAgICAgICAgICAnd29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkIGZyb20gdGhlIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICdjb250ZW50LiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICcqcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlciB2YWx1ZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRmluYWxseSwgdGhlICp0eXBlKiBkZXRlcm1pbmVzIGhvdyB0aGUgZGF0YSBzaG91bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ3ByZXNlbnRlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgYXZhaWxhYmxlIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ3NcJyIgICAgIHwgU3RyaW5nIGZvcm1hdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0eXBlICcKKyAgICAgICAgICAgICAgICAgICdmb3Igc3RyaW5ncyBhbmQgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgICdvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgJworICAgICAgICAgICAgICAgICAgJyJcJ3NcJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBUeXBlICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnYlwnIiAgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gJworICAgICAgICAgICAgICAgICAgJ2Jhc2UgMi4gICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdjXCciICAgICB8IENoYXJhY3Rlci4gQ29udmVydHMgdGhlIGludGVnZXIgdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kaW5nICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAncHJpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2RcJyIgICAgIHwgRGVjaW1hbCBJbnRlZ2VyLiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gJworICAgICAgICAgICAgICAgICAgJ2Jhc2UgMTAuICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnb1wnIiAgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICc4LiAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCd4XCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICcxNiwgdXNpbmcgbG93ZXItICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSAnCisgICAgICAgICAgICAgICAgICAnOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ1hcJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgJworICAgICAgICAgICAgICAgICAgJzE2LCB1c2luZyB1cHBlci0gICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlICcKKyAgICAgICAgICAgICAgICAgICc5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZFwnIiwgJworICAgICAgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICcKKyAgICAgICAgICAgICAgICAgICciXCdkXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBwcmVzZW50YXRpb24gdHlwZXMsIGludGVnZXJzIGNhbiAnCisgICAgICAgICAgICAgICAgICAnYmUgZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAnCisgICAgICAgICAgICAgICAgICAnKGV4Y2VwdCAiXCduXCciXG4nCisgICAgICAgICAgICAgICAgICAnYW5kIE5vbmUpLiBXaGVuIGRvaW5nIHNvLCAiZmxvYXQoKSIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW50ZWdlciB0b1xuJworICAgICAgICAgICAgICAgICAgJ2EgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJlZm9yZSBmb3JtYXR0aW5nLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgdmFsdWVzXG4nCisgICAgICAgICAgICAgICAgICAnYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFByaW50cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdzY2llbnRpZmljICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgIiAgIHwgICAgICAgICAgIHwgbm90YXRpb24gdXNpbmcgdGhlIGxldHRlciAnZScgdG8gaW5kaWNhdGUgIgorICAgICAgICAgICAgICAgICAgJ3RoZSBleHBvbmVudC4gICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnRVwnIiAgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyAiXCdlXCciICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgaXQgdXNlcyBhbiB1cHBlciAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IGNhc2UgJ0UnIGFzIHRoZSBzZXBhcmF0b3IgIgorICAgICAgICAgICAgICAgICAgJ2NoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIERpc3BsYXlzIHRoZSBudW1iZXIgYXMgYSAnCisgICAgICAgICAgICAgICAgICAnZml4ZWQtcG9pbnQgbnVtYmVyLiAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnRlwnIiAgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyAiXCdmXCciLCBidXQgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRzICJuYW4iIHRvICJOQU4iICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFuZCAiaW5mIiB0byAnCisgICAgICAgICAgICAgICAgICAnIklORiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gJworICAgICAgICAgICAgICAgICAgJyJwID49IDEiLCB0aGlzICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcm91bmRzIHRoZSBudW1iZXIgdG8gInAiIHNpZ25pZmljYW50ICcKKyAgICAgICAgICAgICAgICAgICdkaWdpdHMgYW5kIHRoZW4gICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZm9ybWF0cyB0aGUgcmVzdWx0IGluIGVpdGhlciBmaXhlZC1wb2ludCAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IG9yIGluICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyAnCisgICAgICAgICAgICAgICAgICAnbWFnbml0dWRlLiAgVGhlICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcHJlY2lzZSBydWxlcyBhcmUgYXMgZm9sbG93czogc3VwcG9zZSB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICd0aGUgcmVzdWx0ICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiAnCisgICAgICAgICAgICAgICAgICAnYW5kIHByZWNpc2lvbiAicC0xIiB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3b3VsZCBoYXZlIGV4cG9uZW50ICJleHAiLiAgVGhlbiBpZiAiLTQgPD0gJworICAgICAgICAgICAgICAgICAgJ2V4cCA8IHAiLCB0aGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyJcJ2ZcJyIgYW5kICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHByZWNpc2lvbiAicC0xLWV4cCIuICBPdGhlcndpc2UsIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIGlzIGZvcm1hdHRlZCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiBhbmQgJworICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbiAicC0xIi4gSW4gYm90aCAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgY2FzZXMgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyBhcmUgJworICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQgZnJvbSB0aGUgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc2lnbmlmaWNhbmQsIGFuZCB0aGUgZGVjaW1hbCBwb2ludCBpcyBhbHNvICcKKyAgICAgICAgICAgICAgICAgICdyZW1vdmVkIGlmICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nICcKKyAgICAgICAgICAgICAgICAgICdpdC4gIFBvc2l0aXZlIGFuZCAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbmVnYXRpdmUgaW5maW5pdHksIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnemVybywgYW5kIG5hbnMsICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYXJlIGZvcm1hdHRlZCBhcyAiaW5mIiwgIi1pbmYiLCAiMCIsICItMCIgJworICAgICAgICAgICAgICAgICAgJ2FuZCAibmFuIiAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAncHJlY2lzaW9uLiAgQSBwcmVjaXNpb24gb2YgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgIjAiIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBhICcKKyAgICAgICAgICAgICAgICAgICdwcmVjaXNpb24gb2YgIjEiLiBUaGUgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZGVmYXVsdCBwcmVjaXNpb24gaXMgJworICAgICAgICAgICAgICAgICAgJyI2Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnR1wnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyAiXCdnXCciIGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAnc3dpdGNoZXMgdG8gIlwnRVwnIiBpZiAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdGhlIG51bWJlciBnZXRzIHRvbyBsYXJnZS4gVGhlICcKKyAgICAgICAgICAgICAgICAgICdyZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHkgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgJworICAgICAgICAgICAgICAgICAgJ3Rvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZ1wnIiwgJworICAgICAgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJyVcJyIgICAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCAnCisgICAgICAgICAgICAgICAgICAnYW5kIGRpc3BsYXlzIGluICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZml4ZWQgKCJcJ2ZcJyIpIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSAnCisgICAgICAgICAgICAgICAgICAncGVyY2VudCBzaWduLiAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBOb25lICAgICAgfCBTaW1pbGFyIHRvICJcJ2dcJyIsIGV4Y2VwdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdmaXhlZC1wb2ludCBub3RhdGlvbiwgd2hlbiAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHVzZWQsIGhhcyBhdCBsZWFzdCBvbmUgZGlnaXQgcGFzdCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgcG9pbnQuIFRoZSAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzIGFzIGhpZ2ggYXMgbmVlZGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICdyZXByZXNlbnQgdGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHBhcnRpY3VsYXIgdmFsdWUuIFRoZSBvdmVyYWxsIGVmZmVjdCBpcyB0byAnCisgICAgICAgICAgICAgICAgICAnbWF0Y2ggdGhlICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG91dHB1dCBvZiAic3RyKCkiIGFzIGFsdGVyZWQgYnkgdGhlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdtb2RpZmllcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IGV4YW1wbGVzXG4nCisgICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSAic3RyLmZvcm1hdCgpIiBzeW50YXggJworICAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gd2l0aCB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkICcKKyAgICAgICAgICAgICAgICAgICciJSItZm9ybWF0dGluZyxcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgInt9IiBhbmQgd2l0aCAiOiIgdXNlZCBpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICAgICAgICciJSIuIEZvclxuJworICAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsICJcJyUwMy4yZlwnIiBjYW4gYmUgdHJhbnNsYXRlZCB0byAiXCd7OjAzLjJmfVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCAnCisgICAgICAgICAgICAgICAgICAnb3B0aW9ucywgc2hvd25cbicKKyAgICAgICAgICAgICAgICAgICdpbiB0aGUgZm9sbG93IGV4YW1wbGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0FjY2Vzc2luZyBhcmd1bWVudHMgYnkgcG9zaXRpb246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7MH0sIHsxfSwgezJ9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYSwgYiwgYydcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3t9LCB7fSwge30nLmZvcm1hdCgnYScsICdiJywgJ2MnKSAgIyAzLjErIG9ubHlcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYSwgYiwgYydcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgnYScsICdiJywgJ2MnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdjLCBiLCBhJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezJ9LCB7MX0sIHswfScuZm9ybWF0KConYWJjJykgICAgICAjIHVucGFja2luZyAiCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQgc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICIgICAnYywgYiwgYSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3swfXsxfXswfScuZm9ybWF0KCdhYnJhJywgJ2NhZCcpICAgIyBhcmd1bWVudHMnICIKKyAgICAgICAgICAgICAgICAgICdpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuJworICAgICAgICAgICAgICAgICAgIiAgICdhYnJhY2FkYWJyYSdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IG5hbWU6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwgIgorICAgICAgICAgICAgICAgICAgIntsb25naXR1ZGV9Jy5mb3JtYXQobGF0aXR1ZGU9JzM3LjI0TicsICIKKyAgICAgICAgICAgICAgICAgICJsb25naXR1ZGU9Jy0xMTUuODFXJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+IGNvb3JkID0geydsYXRpdHVkZSc6ICczNy4yNE4nLCAnbG9uZ2l0dWRlJzogIgorICAgICAgICAgICAgICAgICAgIictMTE1LjgxVyd9XG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwgIgorICAgICAgICAgICAgICAgICAgIntsb25naXR1ZGV9Jy5mb3JtYXQoKipjb29yZClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIGFyZ3VtZW50cycgYXR0cmlidXRlczpcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IDMtNWpcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gKCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsICIKKyAgICAgICAgICAgICAgICAgICJwYXJ0IHswLnJlYWx9ICdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LicpLmZvcm1hdChjKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgIgorICAgICAgICAgICAgICAgICAgIjMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBQb2ludDpcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KTpcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHlcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAnUG9pbnQoe3NlbGYueH0sICIKKyAgICAgICAgICAgICAgICAgICJ7c2VsZi55fSknLmZvcm1hdChzZWxmPXNlbGYpXG4iCisgICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IHN0cihQb2ludCg0LCAyKSlcbicKKyAgICAgICAgICAgICAgICAgICIgICAnUG9pbnQoNCwgMiknXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIGFyZ3VtZW50cycgaXRlbXM6XG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGNvb3JkID0gKDMsIDUpXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdYOiB7MFswXX07ICBZOiB7MFsxXX0nLmZvcm1hdChjb29yZClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnWDogMzsgIFk6IDUnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnUmVwbGFjaW5nICIlcyIgYW5kICIlciI6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogJworICAgICAgICAgICAgICAgICAgJ3shc30iLmZvcm1hdChcJ3Rlc3QxXCcsIFwndGVzdDJcJylcbicKKyAgICAgICAgICAgICAgICAgICcgICAicmVwcigpIHNob3dzIHF1b3RlczogXCd0ZXN0MVwnOyBzdHIoKSBkb2VzblwndDogdGVzdDIiXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWxpZ25pbmcgdGhlIHRleHQgYW5kIHNwZWNpZnlpbmcgYSB3aWR0aDpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6PDMwfScuZm9ybWF0KCdsZWZ0IGFsaWduZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdsZWZ0IGFsaWduZWQgICAgICAgICAgICAgICAgICAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oj4zMH0nLmZvcm1hdCgncmlnaHQgYWxpZ25lZCcpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6XjMwfScuZm9ybWF0KCdjZW50ZXJlZCcpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgICdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6Kl4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKSAgIyB1c2UgJyonIGFzIGEgZmlsbCAiCisgICAgICAgICAgICAgICAgICAnY2hhclxuJworICAgICAgICAgICAgICAgICAgIiAgICcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKionXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnUmVwbGFjaW5nICIlK2YiLCAiJS1mIiwgYW5kICIlIGYiIGFuZCBzcGVjaWZ5aW5nIGEgc2lnbjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6K2Z9OyB7OitmfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGl0ICIKKyAgICAgICAgICAgICAgICAgICdhbHdheXNcbicKKyAgICAgICAgICAgICAgICAgICIgICAnKzMuMTQwMDAwOyAtMy4xNDAwMDAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OiBmfTsgezogZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBhIHNwYWNlICIKKyAgICAgICAgICAgICAgICAgICdmb3IgcG9zaXRpdmUgbnVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgIiAgICcgMy4xNDAwMDA7IC0zLjE0MDAwMCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6LWZ9OyB7Oi1mfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlICIKKyAgICAgICAgICAgICAgICAgICJtaW51cyAtLSBzYW1lIGFzICd7OmZ9OyB7OmZ9J1xuIgorICAgICAgICAgICAgICAgICAgIiAgICczLjE0MDAwMDsgLTMuMTQwMDAwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJXgiIGFuZCAiJW8iIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byAnCisgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50IGJhc2VzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDp4fTsgIG9jdDogezA6b307ICBiaW46ICcKKyAgICAgICAgICAgICAgICAgICd7MDpifSIuZm9ybWF0KDQyKVxuJworICAgICAgICAgICAgICAgICAgIiAgICdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMCdcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46ICcKKyAgICAgICAgICAgICAgICAgICd7MDojYn0iLmZvcm1hdCg0MilcbicKKyAgICAgICAgICAgICAgICAgICIgICAnaW50OiA0MjsgIGhleDogMHgyYTsgIG9jdDogMG81MjsgIGJpbjogMGIxMDEwMTAnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6LH0nLmZvcm1hdCgxMjM0NTY3ODkwKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcxLDIzNCw1NjcsODkwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0V4cHJlc3NpbmcgYSBwZXJjZW50YWdlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBwb2ludHMgPSAxOVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiB0b3RhbCA9IDIyXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfScuZm9ybWF0KHBvaW50cy90b3RhbClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29ycmVjdCBhbnN3ZXJzOiA4Ni4zNiUnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgZGF0ZXRpbWVcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDcsIDQsIDEyLCAxNSwgNTgpXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OiVZLSVtLSVkICVIOiVNOiVTfScuZm9ybWF0KGQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJzIwMTAtMDctMDQgMTI6MTU6NTgnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gZm9yIGFsaWduLCB0ZXh0IGluIHppcCgnPF4+JywgWydsZWZ0JywgJ2NlbnRlcicsICIKKyAgICAgICAgICAgICAgICAgICIncmlnaHQnXSk6XG4iCisgICAgICAgICAgICAgICAgICAiICAgLi4uICAgICAnezA6e2ZpbGx9e2FsaWdufTE2fScuZm9ybWF0KHRleHQsIGZpbGw9YWxpZ24sICIKKyAgICAgICAgICAgICAgICAgICdhbGlnbj1hbGlnbilcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICIgICAnbGVmdDw8PDw8PDw8PDw8PCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnXl5eXl5jZW50ZXJeXl5eXidcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnPj4+Pj4+Pj4+Pj5yaWdodCdcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj5cbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gb2N0ZXRzID0gWzE5MiwgMTY4LCAwLCAxXVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezowMlh9ezowMlh9ezowMlh9ezowMlh9Jy5mb3JtYXQoKm9jdGV0cylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQzBBODAwMDEnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGludChfLCAxNilcbicKKyAgICAgICAgICAgICAgICAgICcgICAzMjMyMjM1NTIxXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+XG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IHdpZHRoID0gNVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBmb3IgbnVtIGluIHJhbmdlKDUsMTIpOiAjZG9jdGVzdDogJworICAgICAgICAgICAgICAgICAgJytOT1JNQUxJWkVfV0hJVEVTUEFDRVxuJworICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gJ2RYb2InOlxuIgorICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHByaW50KCd7MDp7d2lkdGh9e2Jhc2V9fScuZm9ybWF0KG51bSwgIgorICAgICAgICAgICAgICAgICAgImJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLCBlbmQ9JyAnKVxuIgorICAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoKVxuJworICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDYgICAgIDYgICAgIDYgICAxMTBcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgNyAgICAgNyAgICAgNyAgIDExMVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDkgICAgIDkgICAgMTEgIDEwMDFcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAxMCAgICAgQSAgICAxMiAgMTAxMFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIDExICAgICBCICAgIDEzICAxMDExXG4nLAorICdmdW5jdGlvbic6ICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb24gZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAnCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZnVuY2RlZiAgICAgICAgICAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgJworICAgICAgICAgICAgICdbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9ycyAgICAgICAgICAgICAgOjo9IGRlY29yYXRvcitcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9yICAgICAgICAgICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiICcKKyAgICAgICAgICAgICAnW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuJworICAgICAgICAgICAgICcgICBkb3R0ZWRfbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdCAgICAgICAgICA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogJworICAgICAgICAgICAgICdbIiwiIFtwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc11dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzIDo6PSAiKiIgW3BhcmFtZXRlcl0gKCIsIiAnCisgICAgICAgICAgICAgJ2RlZnBhcmFtZXRlcikqIFsiLCIgWyIqKiIgcGFyYW1ldGVyIFsiLCJdXV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXIgWyIsIl1cbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICcgICBkZWZwYXJhbWV0ZXIgICAgICAgICAgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZnVuY25hbWUgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gJworICAgICAgICAgICAgICdiaW5kc1xuJworICAgICAgICAgICAgICd0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICcoYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuJworICAgICAgICAgICAgICdmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsICcKKyAgICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICAgJ2FzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyAnCisgICAgICAgICAgICAgJ2dldHNcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGlzXG4nCisgICAgICAgICAgICAgJ2RlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAncmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICdhcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIG5hbWVcbicKKyAgICAgICAgICAgICAnaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCAnCisgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgJ25lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBAZjEoYXJnKVxuJworICAgICAgICAgICAgICcgICBAZjJcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBkZWYgZnVuYygpOiBwYXNzXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnZXhjZXB0IHRoYXQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGlzIG5vdCB0ZW1wb3JhcmlseSBib3VuZCB0byAnCisgICAgICAgICAgICAgJ3RoZSBuYW1lXG4nCisgICAgICAgICAgICAgJyJmdW5jIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4nCisgICAgICAgICAgICAgJypleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgJworICAgICAgICAgICAgICd2YWx1ZXMuIlxuJworICAgICAgICAgICAgICdGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAgICAnKmFyZ3VtZW50KiBtYXlcbicKKyAgICAgICAgICAgICAiYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyJ3MgZGVmYXVsdCAiCisgICAgICAgICAgICAgJ3ZhbHVlIGlzXG4nCisgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tICcKKyAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICdpcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAnZ3JhbW1hci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyoqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpc1xuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgJworICAgICAgICAgICAgICcicHJlLVxuJworICAgICAgICAgICAgICdjb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5ICcKKyAgICAgICAgICAgICAnaW1wb3J0YW50XG4nCisgICAgICAgICAgICAgJ3RvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggJworICAgICAgICAgICAgICdhcyBhXG4nCisgICAgICAgICAgICAgJ2xpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJ2FwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCAnCisgICAgICAgICAgICAgJ21vZGlmaWVkLlxuJworICAgICAgICAgICAgICdUaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyAnCisgICAgICAgICAgICAgJ3RvIHVzZVxuJworICAgICAgICAgICAgICciTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLCBlLmcuOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuJworICAgICAgICAgICAgICcgICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHBlbmd1aW4gPSBbXVxuJworICAgICAgICAgICAgICcgICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuJworICAgICAgICAgICAgICcgICAgICAgcmV0dXJuIHBlbmd1aW5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgJ0NhbGxzLlxuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzICcKKyAgICAgICAgICAgICAnbWVudGlvbmVkIGluXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tICcKKyAgICAgICAgICAgICAna2V5d29yZFxuJworICAgICAgICAgICAgICdhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybSAiIippZGVudGlmaWVyIiIgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnkgZXhjZXNzICcKKyAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZSBmb3JtXG4nCisgICAgICAgICAgICAgJyIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcgJworICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgJ3JlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAnZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlICcKKyAgICAgICAgICAgICAna2V5d29yZC1vbmx5XG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiICcKKyAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuICcKKyAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAnb2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgJworICAgICAgICAgICAgICdoYXZlXG4nCisgICAgICAgICAgICAgJyJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlICcKKyAgICAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgICAgJ2xpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zICcKKyAgICAgICAgICAgICAnbWF5XG4nCisgICAgICAgICAgICAgJ2JlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgJworICAgICAgICAgICAgICdjb2RlLlxuJworICAgICAgICAgICAgICdUaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuJworICAgICAgICAgICAgICdmdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG4nCisgICAgICAgICAgICAgImRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnMnIG5hbWVzIGluIHRoZSAiCisgICAgICAgICAgICAgJyJfX2Fubm90YXRpb25zX18iXG4nCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCAnCisgICAgICAgICAgICAgJ2JvdW5kXG4nCisgICAgICAgICAgICAgJ3RvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gTGFtYmRhcy4gIE5vdGUgdGhhdCB0aGUgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ2RlZmluaXRpb247XG4nCisgICAgICAgICAgICAgJ2EgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kICcKKyAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAnYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSAnCisgICAgICAgICAgICAgJ2xhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlICcKKyAgICAgICAgICAgICAnaXRcbicKKyAgICAgICAgICAgICAnYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIgorICAgICAgICAgICAgICciImRlZiIiXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuJworICAgICAgICAgICAgICdmdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgJworICAgICAgICAgICAgICd1c2VkXG4nCisgICAgICAgICAgICAgJ2luIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IgJworICAgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuJywKKyAnZ2xvYmFsJzogJ1xuJworICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImdsb2JhbCIgc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZSAnCisgICAgICAgICAgICdlbnRpcmVcbicKKyAgICAgICAgICAgJ2N1cnJlbnQgY29kZSBibG9jay4gIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3RlZCBpZGVudGlmaWVycyBhcmUgdG8gJworICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgJ2ludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhICcKKyAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAndmFyaWFibGUgd2l0aG91dCAiZ2xvYmFsIiwgYWx0aG91Z2ggZnJlZSB2YXJpYWJsZXMgbWF5IHJlZmVyIHRvXG4nCisgICAgICAgICAgICdnbG9iYWxzIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQgZ2xvYmFsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBpbiB0aGUgc2FtZSAnCisgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICdibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgImdsb2JhbCIgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyAnCisgICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAgJ3BhcmFtZXRlcnMgb3IgaW4gYSAiZm9yIiBsb29wIGNvbnRyb2wgdGFyZ2V0LCAiY2xhc3MiIGRlZmluaXRpb24sXG4nCisgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9uLCBvciAiaW1wb3J0IiBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyAnCisgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgJ2VuZm9yY2UgdGhlIHR3byByZXN0cmljdGlvbnMsIGJ1dCBwcm9ncmFtcyBzaG91bGQgbm90IGFidXNlIHRoaXNcbicKKyAgICAgICAgICAgJ2ZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseSAnCisgICAgICAgICAgICdjaGFuZ2VcbicKKyAgICAgICAgICAgJ3RoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiB0aGUgImdsb2JhbCIgaXMgYSBkaXJlY3RpdmUgdG8gdGhlICcKKyAgICAgICAgICAgJ3BhcnNlci4gIEl0XG4nCisgICAgICAgICAgICdhcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgImdsb2JhbCJcbicKKyAgICAgICAgICAgJ3N0YXRlbWVudC4gSW4gcGFydGljdWxhciwgYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgY29udGFpbmVkIGluIGEgJworICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICdvciBjb2RlIG9iamVjdCBzdXBwbGllZCB0byB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgZnVuY3Rpb24gZG9lcyAnCisgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgJ2FmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlIGZ1bmN0aW9uIGNhbGwsIGFuZCBjb2RlXG4nCisgICAgICAgICAgICdjb250YWluZWQgaW4gc3VjaCBhIHN0cmluZyBpcyB1bmFmZmVjdGVkIGJ5ICJnbG9iYWwiIHN0YXRlbWVudHMgaW4gJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdjb2RlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGNhbGwuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSAnCisgICAgICAgICAgICciZXZhbCgpIlxuJworICAgICAgICAgICAnYW5kICJjb21waWxlKCkiIGZ1bmN0aW9ucy5cbicsCisgJ2lkLWNsYXNzZXMnOiAnXG4nCisgICAgICAgICAgICAgICAnUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuJworICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdDZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgJworICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICdtZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mICcKKyAgICAgICAgICAgICAgICdsZWFkaW5nIGFuZFxuJworICAgICAgICAgICAgICAgJ3RyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICciXyoiXG4nCisgICAgICAgICAgICAgICAnICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCAnCisgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiXyJcbicKKyAgICAgICAgICAgICAgICcgICBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0ICcKKyAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICAnCisgICAgICAgICAgICAgICAnV2hlbiBub3RcbicKKyAgICAgICAgICAgICAgICcgICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICdkZWZpbmVkLlxuJworICAgICAgICAgICAgICAgJyAgIFNlZSBzZWN0aW9uIFRoZSBpbXBvcnQgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbicKKyAgICAgICAgICAgICAgICcgICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4nCisgICAgICAgICAgICAgICAnICAgICAiZ2V0dGV4dCIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgJworICAgICAgICAgICAgICAgJ2NvbnZlbnRpb24uXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl9fKl9fIlxuJworICAgICAgICAgICAgICAgJyAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAnICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gICcKKyAgICAgICAgICAgICAgICdDdXJyZW50XG4nCisgICAgICAgICAgICAgICAnICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICdzZWN0aW9uIGFuZFxuJworICAgICAgICAgICAgICAgJyAgIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgJworICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAnICAgUHl0aG9uLiAgKkFueSogdXNlIG9mICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0ICcKKyAgICAgICAgICAgICAgICdkb2VzIG5vdFxuJworICAgICAgICAgICAgICAgJyAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlICcKKyAgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICAnICAgd2FybmluZy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICciX18qIlxuJworICAgICAgICAgICAgICAgJyAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgJworICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgJworICAgICAgICAgICAgICAgJ21hbmdsZWQgZm9ybVxuJworICAgICAgICAgICAgICAgJyAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgJworICAgICAgICAgICAgICAgJ2Jhc2UgYW5kXG4nCisgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLlxuJywKKyAnaWRlbnRpZmllcnMnOiAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xuJworICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzICpuYW1lcyopIGFyZSBkZXNjcmliZWQgYnkgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgc3ludGF4IG9mIGlkZW50aWZpZXJzIGluIFB5dGhvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgJ3N0YW5kYXJkXG4nCisgICAgICAgICAgICAgICAgJ2FubmV4IFVBWC0zMSwgd2l0aCBlbGFib3JhdGlvbiBhbmQgY2hhbmdlcyBhcyBkZWZpbmVkIGJlbG93OyAnCisgICAgICAgICAgICAgICAgJ3NlZSBhbHNvXG4nCisgICAgICAgICAgICAgICAgJyoqUEVQIDMxMzEqKiBmb3IgZnVydGhlciBkZXRhaWxzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnV2l0aGluIHRoZSBBU0NJSSByYW5nZSAoVSswMDAxLi5VKzAwN0YpLCB0aGUgdmFsaWQgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICdpZGVudGlmaWVycyBhcmUgdGhlIHNhbWUgYXMgaW4gUHl0aG9uIDIueDogdGhlIHVwcGVyY2FzZSBhbmQgJworICAgICAgICAgICAgICAgICdsb3dlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAnbGV0dGVycyAiQSIgdGhyb3VnaCAiWiIsIHRoZSB1bmRlcnNjb3JlICJfIiBhbmQsIGV4Y2VwdCBmb3IgJworICAgICAgICAgICAgICAgICd0aGUgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVyLCB0aGUgZGlnaXRzICIwIiB0aHJvdWdoICI5Ii5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1B5dGhvbiAzLjAgaW50cm9kdWNlcyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgZnJvbSBvdXRzaWRlIHRoZSAnCisgICAgICAgICAgICAgICAgJ0FTQ0lJXG4nCisgICAgICAgICAgICAgICAgJ3JhbmdlIChzZWUgKipQRVAgMzEzMSoqKS4gIEZvciB0aGVzZSBjaGFyYWN0ZXJzLCB0aGUgJworICAgICAgICAgICAgICAgICdjbGFzc2lmaWNhdGlvblxuJworICAgICAgICAgICAgICAgICd1c2VzIHRoZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBhcyAnCisgICAgICAgICAgICAgICAgJ2luY2x1ZGVkIGluIHRoZVxuJworICAgICAgICAgICAgICAgICcidW5pY29kZWRhdGEiIG1vZHVsZS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIGFyZSB1bmxpbWl0ZWQgaW4gbGVuZ3RoLiAgQ2FzZSBpcyBzaWduaWZpY2FudC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIGlkZW50aWZpZXIgICA6Oj0geGlkX3N0YXJ0IHhpZF9jb250aW51ZSpcbicKKyAgICAgICAgICAgICAgICAnICAgaWRfc3RhcnQgICAgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gZ2VuZXJhbCBjYXRlZ29yaWVzIEx1LCAnCisgICAgICAgICAgICAgICAgJ0xsLCBMdCwgTG0sIExvLCBObCwgdGhlIHVuZGVyc2NvcmUsIGFuZCBjaGFyYWN0ZXJzIHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAnT3RoZXJfSURfU3RhcnQgcHJvcGVydHk+XG4nCisgICAgICAgICAgICAgICAgJyAgIGlkX2NvbnRpbnVlICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0LCBwbHVzICcKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBpbiB0aGUgY2F0ZWdvcmllcyBNbiwgTWMsIE5kLCBQYyBhbmQgb3RoZXJzIHdpdGggJworICAgICAgICAgICAgICAgICd0aGUgT3RoZXJfSURfQ29udGludWUgcHJvcGVydHk+XG4nCisgICAgICAgICAgICAgICAgJyAgIHhpZF9zdGFydCAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0IHdob3NlIE5GS0MgJworICAgICAgICAgICAgICAgICdub3JtYWxpemF0aW9uIGlzIGluICJpZF9zdGFydCB4aWRfY29udGludWUqIj5cbicKKyAgICAgICAgICAgICAgICAnICAgeGlkX2NvbnRpbnVlIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfY29udGludWUgd2hvc2UgTkZLQyAnCisgICAgICAgICAgICAgICAgJ25vcm1hbGl6YXRpb24gaXMgaW4gImlkX2NvbnRpbnVlKiI+XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgVW5pY29kZSBjYXRlZ29yeSBjb2RlcyBtZW50aW9uZWQgYWJvdmUgc3RhbmQgZm9yOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTHUqIC0gdXBwZXJjYXNlIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxsKiAtIGxvd2VyY2FzZSBsZXR0ZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpMdCogLSB0aXRsZWNhc2UgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTG0qIC0gbW9kaWZpZXIgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTG8qIC0gb3RoZXIgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTmwqIC0gbGV0dGVyIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk1uKiAtIG5vbnNwYWNpbmcgbWFya3NcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk1jKiAtIHNwYWNpbmcgY29tYmluaW5nIG1hcmtzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpOZCogLSBkZWNpbWFsIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKlBjKiAtIGNvbm5lY3RvciBwdW5jdHVhdGlvbnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk90aGVyX0lEX1N0YXJ0KiAtIGV4cGxpY2l0IGxpc3Qgb2YgY2hhcmFjdGVycyBpbiAnCisgICAgICAgICAgICAgICAgJ1Byb3BMaXN0LnR4dCB0b1xuJworICAgICAgICAgICAgICAgICcgIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk90aGVyX0lEX0NvbnRpbnVlKiAtIGxpa2V3aXNlXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdBbGwgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBub3JtYWwgZm9ybSBORktDIHdoaWxlICcKKyAgICAgICAgICAgICAgICAncGFyc2luZztcbicKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBvZiBpZGVudGlmaWVycyBpcyBiYXNlZCBvbiBORktDLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQSBub24tbm9ybWF0aXZlIEhUTUwgZmlsZSBsaXN0aW5nIGFsbCB2YWxpZCBpZGVudGlmaWVyICcKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBmb3JcbicKKyAgICAgICAgICAgICAgICAnVW5pY29kZSA0LjEgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmRjbC5ocGkudW5pLVxuJworICAgICAgICAgICAgICAgICdwb3RzZGFtLmRlL2hvbWUvbG9ld2lzL3RhYmxlLTMxMzEuaHRtbC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdLZXl3b3Jkc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBpZGVudGlmaWVycyBhcmUgdXNlZCBhcyByZXNlcnZlZCB3b3Jkcywgb3IgJworICAgICAgICAgICAgICAgICcqa2V5d29yZHMqIG9mXG4nCisgICAgICAgICAgICAgICAgJ3RoZSBsYW5ndWFnZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG9yZGluYXJ5IGlkZW50aWZpZXJzLiAgJworICAgICAgICAgICAgICAgICdUaGV5IG11c3RcbicKKyAgICAgICAgICAgICAgICAnYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIEZhbHNlICAgICAgY2xhc3MgICAgICBmaW5hbGx5ICAgIGlzICAgICAgICAgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgJyAgIE5vbmUgICAgICAgY29udGludWUgICBmb3IgICAgICAgIGxhbWJkYSAgICAgdHJ5XG4nCisgICAgICAgICAgICAgICAgJyAgIFRydWUgICAgICAgZGVmICAgICAgICBmcm9tICAgICAgIG5vbmxvY2FsICAgd2hpbGVcbicKKyAgICAgICAgICAgICAgICAnICAgYW5kICAgICAgICBkZWwgICAgICAgIGdsb2JhbCAgICAgbm90ICAgICAgICB3aXRoXG4nCisgICAgICAgICAgICAgICAgJyAgIGFzICAgICAgICAgZWxpZiAgICAgICBpZiAgICAgICAgIG9yICAgICAgICAgeWllbGRcbicKKyAgICAgICAgICAgICAgICAnICAgYXNzZXJ0ICAgICBlbHNlICAgICAgIGltcG9ydCAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICcgICBicmVhayAgICAgIGV4Y2VwdCAgICAgaW4gICAgICAgICByYWlzZVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1Jlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlICcKKyAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICdtZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mICcKKyAgICAgICAgICAgICAgICAnbGVhZGluZyBhbmRcbicKKyAgICAgICAgICAgICAgICAndHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnIl8qIlxuJworICAgICAgICAgICAgICAgICcgICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4gIFRoZSBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiXyJcbicKKyAgICAgICAgICAgICAgICAnICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCAnCisgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICcgICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICAnCisgICAgICAgICAgICAgICAgJ1doZW4gbm90XG4nCisgICAgICAgICAgICAgICAgJyAgIGluIGludGVyYWN0aXZlIG1vZGUsICJfIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpcyBub3QgJworICAgICAgICAgICAgICAgICdkZWZpbmVkLlxuJworICAgICAgICAgICAgICAgICcgICBTZWUgc2VjdGlvbiBUaGUgaW1wb3J0IHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbicKKyAgICAgICAgICAgICAgICAnICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJyAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzICcKKyAgICAgICAgICAgICAgICAnY29udmVudGlvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfXypfXyJcbicKKyAgICAgICAgICAgICAgICAnICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAgJyAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICAnCisgICAgICAgICAgICAgICAgJ0N1cnJlbnRcbicKKyAgICAgICAgICAgICAgICAnICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICAnc2VjdGlvbiBhbmRcbicKKyAgICAgICAgICAgICAgICAnICAgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyAnCisgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgJyAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCAnCisgICAgICAgICAgICAgICAgJ2RvZXMgbm90XG4nCisgICAgICAgICAgICAgICAgJyAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlICcKKyAgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgICcgICB3YXJuaW5nLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnIl9fKiJcbicKKyAgICAgICAgICAgICAgICAnICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCAnCisgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAnICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhICcKKyAgICAgICAgICAgICAgICAnbWFuZ2xlZCBmb3JtXG4nCisgICAgICAgICAgICAgICAgJyAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgJworICAgICAgICAgICAgICAgICdiYXNlIGFuZFxuJworICAgICAgICAgICAgICAgICcgICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uIElkZW50aWZpZXJzIChOYW1lcykuXG4nLAorICdpZic6ICdcbicKKyAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAnXG4nCisgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAnICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgJ1xuJworICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICdvbmVcbicKKyAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuIG9wZXJhdGlvbnNcbicKKyAgICAgICAnZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4nCisgICAgICAgJyhhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbicKKyAgICAgICAnSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxuJworICAgICAgICdwcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCisgJ2ltYWdpbmFyeSc6ICdcbicKKyAgICAgICAgICAgICAgJ0ltYWdpbmFyeSBsaXRlcmFsc1xuJworICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0ltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCAnCisgICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCAnCisgICAgICAgICAgICAgICdvZiAwLjAuXG4nCisgICAgICAgICAgICAgICdDb21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCAnCisgICAgICAgICAgICAgICdudW1iZXJzXG4nCisgICAgICAgICAgICAgICdhbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSAnCisgICAgICAgICAgICAgICdjb21wbGV4XG4nCisgICAgICAgICAgICAgICdudW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gJworICAgICAgICAgICAgICAnaXQsXG4nCisgICAgICAgICAgICAgICdlLmcuLCAiKDMrNGopIi4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICAzLjE0aiAgIDEwLmogICAgMTBqICAgICAuMDAxaiAgIDFlMTAwaiAgMy4xNGUtMTBqXG4nLAorICdpbXBvcnQnOiAnXG4nCisgICAgICAgICAgICdUaGUgImltcG9ydCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydF9zdG10ICAgICA6Oj0gImltcG9ydCIgbW9kdWxlIFsiYXMiIG5hbWVdICggIiwiIG1vZHVsZSAnCisgICAgICAgICAgICdbImFzIiBuYW1lXSApKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyICcKKyAgICAgICAgICAgJ1siYXMiIG5hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgJworICAgICAgICAgICAnaWRlbnRpZmllciBbImFzIiBuYW1lXVxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgbW9kdWxlICJpbXBvcnQiICIqIlxuJworICAgICAgICAgICAnICAgbW9kdWxlICAgICAgICAgIDo6PSAoaWRlbnRpZmllciAiLiIpKiBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICcgICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iK1xuJworICAgICAgICAgICAnICAgbmFtZSAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBiYXNpYyBpbXBvcnQgc3RhdGVtZW50IChubyAiZnJvbSIgY2xhdXNlKSBpcyBleGVjdXRlZCBpbiB0d29cbicKKyAgICAgICAgICAgJ3N0ZXBzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcxLiBmaW5kIGEgbW9kdWxlLCBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJzIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlXG4nCisgICAgICAgICAgICcgICB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAndHdvIHN0ZXBzIGFyZSBjYXJyaWVkIG91dCBzZXBhcmF0ZWx5IGZvciBlYWNoIGNsYXVzZSwganVzdCBhcyAnCisgICAgICAgICAgICd0aG91Z2hcbicKKyAgICAgICAgICAgJ3RoZSBjbGF1c2VzIGhhZCBiZWVuIHNlcGFyYXRlZCBvdXQgaW50byBpbmRpdmlkdWFsIGltcG9ydCAnCisgICAgICAgICAgICdzdGF0ZW1lbnRzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZGV0YWlscyBvZiB0aGUgZmlyc3Qgc3RlcCwgZmluZGluZyBhbmQgbG9hZGluZyBtb2R1bGVzIGFyZVxuJworICAgICAgICAgICAnZGVzY3JpYmVkIGluIGdyZWF0ZXIgZGV0YWlsIGluIHRoZSBzZWN0aW9uIG9uIHRoZSBpbXBvcnQgc3lzdGVtLCAnCisgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAnYWxzbyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgdHlwZXMgb2YgcGFja2FnZXMgYW5kIG1vZHVsZXMgdGhhdCBjYW4gJworICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgJ2ltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdpbXBvcnQgc3lzdGVtLiBOb3RlIHRoYXQgZmFpbHVyZXMgaW4gdGhpcyBzdGVwIG1heSBpbmRpY2F0ZSAnCisgICAgICAgICAgICdlaXRoZXJcbicKKyAgICAgICAgICAgJ3RoYXQgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9jYXRlZCwgKm9yKiB0aGF0IGFuIGVycm9yIG9jY3VycmVkXG4nCisgICAgICAgICAgICd3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAibW9kdWxlJ3MgY29kZS5cbiIKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgdGhlIHJlcXVlc3RlZCBtb2R1bGUgaXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSwgaXQgd2lsbCBiZSAnCisgICAgICAgICAgICdtYWRlXG4nCisgICAgICAgICAgICdhdmFpbGFibGUgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBpbiBvbmUgb2YgdGhyZWUgd2F5czpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgImFzIiwgdGhlbiB0aGUgbmFtZSBmb2xsb3dpbmdcbicKKyAgICAgICAgICAgJyAgImFzIiBpcyBib3VuZCBkaXJlY3RseSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIElmIG5vIG90aGVyIG5hbWUgaXMgc3BlY2lmaWVkLCBhbmQgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICIgIHRvcCBsZXZlbCBtb2R1bGUsIHRoZSBtb2R1bGUncyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCAiCisgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgJyAgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGltcG9ydGVkIG1vZHVsZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnICBuYW1lIG9mIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgaXMgYm91bmQgJworICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgJyAgdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIHBhY2thZ2UuICcKKyAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAnICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZVxuJworICAgICAgICAgICAnICByYXRoZXIgdGhhbiBkaXJlY3RseVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcxLiBmaW5kIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAiZnJvbSIgY2xhdXNlLCBsb2FkaW5nIGFuZFxuJworICAgICAgICAgICAnICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTtcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMi4gZm9yIGVhY2ggb2YgdGhlIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiB0aGUgImltcG9ydCIgY2xhdXNlczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMS4gY2hlY2sgaWYgdGhlIGltcG9ydGVkIG1vZHVsZSBoYXMgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCAnCisgICAgICAgICAgICd0aGVuXG4nCisgICAgICAgICAgICcgICAgICBjaGVjayB0aGUgaW1wb3J0ZWQgbW9kdWxlIGFnYWluIGZvciB0aGF0IGF0dHJpYnV0ZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIDQuIG90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhhdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsXG4nCisgICAgICAgICAgICcgICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyAnCisgICAgICAgICAgICdwcmVzZW50LFxuJworICAgICAgICAgICAnICAgICAgb3RoZXJ3aXNlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdFeGFtcGxlczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaW1wb3J0IGZvbyAgICAgICAgICAgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGJvdW5kIGxvY2FsbHlcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCAnCisgICAgICAgICAgICdsb2NhbGx5XG4nCisgICAgICAgICAgICcgICBpbXBvcnQgZm9vLmJhci5iYXogYXMgZmJiICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyAnCisgICAgICAgICAgICdmYmJcbicKKyAgICAgICAgICAgJyAgIGZyb20gZm9vLmJhciBpbXBvcnQgYmF6ICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzICcKKyAgICAgICAgICAgJ2JhelxuJworICAgICAgICAgICAnICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzICcKKyAgICAgICAgICAgJ2F0dHJcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgcmVwbGFjZWQgYnkgYSBzdGFyICgiXCcqXCciKSwgYWxsICcKKyAgICAgICAgICAgJ3B1YmxpY1xuJworICAgICAgICAgICAnbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIGFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3Njb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgIl9fYWxsX18iOyBpZiBkZWZpbmVkLCBpdCAnCisgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICdiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgJworICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAnbW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluICJfX2FsbF9fIiBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljICcKKyAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAnYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgIl9fYWxsX18iIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mICcKKyAgICAgICAgICAgJ3B1YmxpY1xuJworICAgICAgICAgICAibmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGUncyBuYW1lc3BhY2Ugd2hpY2ggZG8gIgorICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdiZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyICgiXCdfXCciKS4gICJfX2FsbF9fIiBzaG91bGQgJworICAgICAgICAgICAnY29udGFpblxuJworICAgICAgICAgICAndGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZCBhY2NpZGVudGFsbHkgJworICAgICAgICAgICAnZXhwb3J0aW5nXG4nCisgICAgICAgICAgICdpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCAnCisgICAgICAgICAgICd3ZXJlXG4nCisgICAgICAgICAgICdpbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIgLS0tIGlzICcKKyAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgJ2FsbG93ZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4gIEF0dGVtcHRpbmcgdG8gdXNlIGl0IGluIGNsYXNzIG9yXG4nCisgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9ucyB3aWxsIHJhaXNlIGEgIlN5bnRheEVycm9yIi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiBzcGVjaWZ5aW5nIHdoYXQgbW9kdWxlIHRvIGltcG9ydCB5b3UgZG8gbm90IGhhdmUgdG8gc3BlY2lmeSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2Fic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzICcKKyAgICAgICAgICAgJ2NvbnRhaW5lZFxuJworICAgICAgICAgICAnd2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0ICcKKyAgICAgICAgICAgJ3dpdGhpblxuJworICAgICAgICAgICAndGhlIHNhbWUgdG9wIHBhY2thZ2Ugd2l0aG91dCBoYXZpbmcgdG8gbWVudGlvbiB0aGUgcGFja2FnZSBuYW1lLiAnCisgICAgICAgICAgICdCeVxuJworICAgICAgICAgICAndXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgImZyb20iICcKKyAgICAgICAgICAgJ3lvdVxuJworICAgICAgICAgICAnY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHlcbicKKyAgICAgICAgICAgJ3dpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50XG4nCisgICAgICAgICAgICdwYWNrYWdlIHdoZXJlIHRoZSBtb2R1bGUgbWFraW5nIHRoZSBpbXBvcnQgZXhpc3RzLiBUd28gZG90cyBtZWFucyAnCisgICAgICAgICAgICd1cFxuJworICAgICAgICAgICAnb25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgJworICAgICAgICAgICAnZXhlY3V0ZVxuJworICAgICAgICAgICAnImZyb20gLiBpbXBvcnQgbW9kIiBmcm9tIGEgbW9kdWxlIGluIHRoZSAicGtnIiBwYWNrYWdlIHRoZW4geW91ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ2VuZCB1cCBpbXBvcnRpbmcgInBrZy5tb2QiLiBJZiB5b3UgZXhlY3V0ZSAiZnJvbSAuLnN1YnBrZzIgaW1wb3J0ICcKKyAgICAgICAgICAgJ21vZCJcbicKKyAgICAgICAgICAgJ2Zyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGVcbicKKyAgICAgICAgICAgJ3NwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXMgY29udGFpbmVkIHdpdGhpbiAqKlBFUCAnCisgICAgICAgICAgICczMjgqKi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgJ2RldGVybWluZSBkeW5hbWljYWxseSB0aGUgbW9kdWxlcyB0byBiZSBsb2FkZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRnV0dXJlIHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0EgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgJworICAgICAgICAgICAncGFydGljdWxhclxuJworICAgICAgICAgICAnbW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZVxuJworICAgICAgICAgICAnYXZhaWxhYmxlIGluIGEgc3BlY2lmaWVkIGZ1dHVyZSByZWxlYXNlIG9mIFB5dGhvbiB3aGVyZSB0aGUgJworICAgICAgICAgICAnZmVhdHVyZVxuJworICAgICAgICAgICAnYmVjb21lcyBzdGFuZGFyZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlICcKKyAgICAgICAgICAgJ3ZlcnNpb25zXG4nCisgICAgICAgICAgICdvZiBQeXRob24gdGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlLiAgJworICAgICAgICAgICAnSXRcbicKKyAgICAgICAgICAgJ2FsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZVxuJworICAgICAgICAgICAncmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgJworICAgICAgICAgICAnbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgJworICAgICAgICAgICAnWyJhcyIgbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIlxuJworICAgICAgICAgICAnICAgZmVhdHVyZSAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnICAgbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgbmVhciB0aGUgdG9wIG9mIHRoZSBtb2R1bGUuICBUaGUgJworICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAnbGluZXMgdGhhdCBjYW4gYXBwZWFyIGJlZm9yZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIHRoZSBtb2R1bGUgZG9jc3RyaW5nIChpZiBhbnkpLFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIGNvbW1lbnRzLFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIGJsYW5rIGxpbmVzLCBhbmRcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBvdGhlciBmdXR1cmUgc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDMuMCBhcmUgImFic29sdXRlX2ltcG9ydCIsXG4nCisgICAgICAgICAgICciZGl2aXNpb24iLCAiZ2VuZXJhdG9ycyIsICJ1bmljb2RlX2xpdGVyYWxzIiwgInByaW50X2Z1bmN0aW9uIixcbicKKyAgICAgICAgICAgJyJuZXN0ZWRfc2NvcGVzIiBhbmQgIndpdGhfc3RhdGVtZW50Ii4gIFRoZXkgYXJlIGFsbCByZWR1bmRhbnQgJworICAgICAgICAgICAnYmVjYXVzZVxuJworICAgICAgICAgICAndGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcyAnCisgICAgICAgICAgICdjb21wYXRpYmlsaXR5LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgcmVjb2duaXplZCBhbmQgdHJlYXRlZCBzcGVjaWFsbHkgYXQgY29tcGlsZVxuJworICAgICAgICAgICAndGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW5cbicKKyAgICAgICAgICAgJ2ltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgZGlmZmVyZW50IGNvZGUuICBJdCBtYXkgZXZlbiBiZSB0aGUgJworICAgICAgICAgICAnY2FzZVxuJworICAgICAgICAgICAndGhhdCBhIG5ldyBmZWF0dXJlIGludHJvZHVjZXMgbmV3IGluY29tcGF0aWJsZSBzeW50YXggKHN1Y2ggYXMgYSAnCisgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgJ3Jlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZSBkaWZmZXJlbnRseS4gIFN1Y2ggZGVjaXNpb25zIGNhbm5vdCBiZSBwdXNoZWQgb2ZmIHVudGlsXG4nCisgICAgICAgICAgICdydW50aW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdGb3IgYW55IGdpdmVuIHJlbGVhc2UsIHRoZSBjb21waWxlciBrbm93cyB3aGljaCBmZWF0dXJlIG5hbWVzICcKKyAgICAgICAgICAgJ2hhdmVcbicKKyAgICAgICAgICAgJ2JlZW4gZGVmaW5lZCwgYW5kIHJhaXNlcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZ1dHVyZSAnCisgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJ2NvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBkaXJlY3QgcnVudGltZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGZvciBhbnkgaW1wb3J0ICcKKyAgICAgICAgICAgJ3N0YXRlbWVudDpcbicKKyAgICAgICAgICAgJ3RoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgJworICAgICAgICAgICAnd2lsbFxuJworICAgICAgICAgICAnYmUgaW1wb3J0ZWQgaW4gdGhlIHVzdWFsIHdheSBhdCB0aGUgdGltZSB0aGUgZnV0dXJlIHN0YXRlbWVudCBpc1xuJworICAgICAgICAgICAnZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBpbnRlcmVzdGluZyBydW50aW1lIHNlbWFudGljcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGZlYXR1cmVcbicKKyAgICAgICAgICAgJ2VuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ05vdGUgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHN0YXRlbWVudDpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgIlRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXQncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50ICIKKyAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgJ25vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0NvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXhlYygpIiBhbmRcbicKKyAgICAgICAgICAgJyJjb21waWxlKCkiIHRoYXQgb2NjdXIgaW4gYSBtb2R1bGUgIk0iIGNvbnRhaW5pbmcgYSBmdXR1cmUgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICd3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldyBzeW50YXggb3Igc2VtYW50aWNzIGFzc29jaWF0ZWQgd2l0aCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2Z1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAnImNvbXBpbGUoKSIgLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIGZvciAnCisgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ3Rha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuXG4nCisgICAgICAgICAgICdpbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlICItaSIgb3B0aW9uLCBpcyBwYXNzZWQgYSBzY3JpcHQgJworICAgICAgICAgICAnbmFtZVxuJworICAgICAgICAgICAndG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlICcKKyAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICdlZmZlY3QgaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc3RhcnRlZCBhZnRlciB0aGUgc2NyaXB0IGlzXG4nCisgICAgICAgICAgICdleGVjdXRlZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG4nCisgICAgICAgICAgICcgICAgIFRoZSBvcmlnaW5hbCBwcm9wb3NhbCBmb3IgdGhlIF9fZnV0dXJlX18gbWVjaGFuaXNtLlxuJywKKyAnaW4nOiAnXG4nCisgICAgICAgJ01lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4nCisgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgJ1xuJworICAgICAgICdUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuJworICAgICAgICdldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbicKKyAgICAgICAnbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuJworICAgICAgICdhbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iICcKKyAgICAgICAndGVzdHNcbicKKyAgICAgICAnd2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xuJworICAgICAgICdsaXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbicKKyAgICAgICAnZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxuJworICAgICAgICd5KSIuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqICcKKyAgICAgICAnaXNcbicKKyAgICAgICAnYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbicKKyAgICAgICAnc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbicKKyAgICAgICAnc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbicKKyAgICAgICAnaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuJworICAgICAgICdkZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbicKKyAgICAgICAnaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuJworICAgICAgICdkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG4nCisgICAgICAgJ1xuJworICAgICAgICdMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbicKKyAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxuJworICAgICAgICduZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbicKKyAgICAgICAnaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuJworICAgICAgICdleGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG4nCisgICAgICAgJ1xuJworICAgICAgICdUaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbicKKyAgICAgICAnImluIi5cbicsCisgJ2ludGVnZXJzJzogJ1xuJworICAgICAgICAgICAgICdJbnRlZ2VyIGxpdGVyYWxzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0ludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGludGVnZXIgICAgICAgIDo6PSBkZWNpbWFsaW50ZWdlciB8IG9jdGludGVnZXIgfCBoZXhpbnRlZ2VyIHwgJworICAgICAgICAgICAgICdiaW5pbnRlZ2VyXG4nCisgICAgICAgICAgICAgJyAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuJworICAgICAgICAgICAgICcgICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiXG4nCisgICAgICAgICAgICAgJyAgIGRpZ2l0ICAgICAgICAgIDo6PSAiMCIuLi4iOSJcbicKKyAgICAgICAgICAgICAnICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgaGV4aW50ZWdlciAgICAgOjo9ICIwIiAoIngiIHwgIlgiKSBoZXhkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgYmluaW50ZWdlciAgICAgOjo9ICIwIiAoImIiIHwgIkIiKSBiaW5kaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuJworICAgICAgICAgICAgICcgICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiJcbicKKyAgICAgICAgICAgICAnICAgYmluZGlnaXQgICAgICAgOjo9ICIwIiB8ICIxIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgaW50ZWdlciBsaXRlcmFscyBhcGFydCBmcm9tICcKKyAgICAgICAgICAgICAnd2hhdFxuJworICAgICAgICAgICAgICdjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgJworICAgICAgICAgICAgICdhbGxvd2VkLlxuJworICAgICAgICAgICAgICdUaGlzIGlzIGZvciBkaXNhbWJpZ3VhdGlvbiB3aXRoIEMtc3R5bGUgb2N0YWwgbGl0ZXJhbHMsIHdoaWNoICcKKyAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgJ3VzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU29tZSBleGFtcGxlcyBvZiBpbnRlZ2VyIGxpdGVyYWxzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgNyAgICAgMjE0NzQ4MzY0NyAgICAgICAgICAgICAgICAgICAgICAgIDBvMTc3ICAgIDBiMTAwMTEwMTExXG4nCisgICAgICAgICAgICAgJyAgIDMgICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ICAgICAwbzM3NyAgICAweGRlYWRiZWVmXG4nLAorICdsYW1iZGEnOiAnXG4nCisgICAgICAgICAgICdMYW1iZGFzXG4nCisgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGxhbWJkYV9leHByICAgICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuJworICAgICAgICAgICAnICAgbGFtYmRhX2V4cHJfbm9jb25kIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiAnCisgICAgICAgICAgICdleHByZXNzaW9uX25vY29uZFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdMYW1iZGEgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgbGFtYmRhIGZvcm1zKSBhcmUgdXNlZCB0byAnCisgICAgICAgICAgICdjcmVhdGVcbicKKyAgICAgICAgICAgJ2Fub255bW91cyBmdW5jdGlvbnMuIFRoZSBleHByZXNzaW9uICJsYW1iZGEgYXJndW1lbnRzOiAnCisgICAgICAgICAgICdleHByZXNzaW9uIlxuJworICAgICAgICAgICAneWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhICcKKyAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICdvYmplY3QgZGVmaW5lZCB3aXRoOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBkZWYgPGxhbWJkYT4oYXJndW1lbnRzKTpcbicKKyAgICAgICAgICAgJyAgICAgICByZXR1cm4gZXhwcmVzc2lvblxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdTZWUgc2VjdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgJworICAgICAgICAgICAnbGlzdHMuXG4nCisgICAgICAgICAgICdOb3RlIHRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZXhwcmVzc2lvbnMgY2Fubm90ICcKKyAgICAgICAgICAgJ2NvbnRhaW5cbicKKyAgICAgICAgICAgJ3N0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuXG4nLAorICdsaXN0cyc6ICdcbicKKyAgICAgICAgICAnTGlzdCBkaXNwbGF5c1xuJworICAgICAgICAgICcqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJ3NxdWFyZSBicmFja2V0czpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGxpc3RfZGlzcGxheSA6Oj0gIlsiIFtzdGFycmVkX2xpc3QgfCBjb21wcmVoZW5zaW9uXSAiXSJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgbGlzdCBkaXNwbGF5IHlpZWxkcyBhIG5ldyBsaXN0IG9iamVjdCwgdGhlIGNvbnRlbnRzIGJlaW5nICcKKyAgICAgICAgICAnc3BlY2lmaWVkXG4nCisgICAgICAgICAgJ2J5IGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBjb21wcmVoZW5zaW9uLiAgV2hlbiBhIGNvbW1hLVxuJworICAgICAgICAgICdzZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSAnCisgICAgICAgICAgJ2V2YWx1YXRlZFxuJworICAgICAgICAgICdmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpbiB0aGF0IG9yZGVyLlxuJworICAgICAgICAgICdXaGVuIGEgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGVcbicKKyAgICAgICAgICAnZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gdGhlIGNvbXByZWhlbnNpb24uXG4nLAorICduYW1pbmcnOiAnXG4nCisgICAgICAgICAgICdOYW1pbmcgYW5kIGJpbmRpbmdcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0JpbmRpbmcgb2YgbmFtZXNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG4nCisgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gJworICAgICAgICAgICAnZnVuY3Rpb25zLFxuJworICAgICAgICAgICAnImltcG9ydCIgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0ICcKKyAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAnaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsICJmb3IiIGxvb3AgaGVhZGVyLCBvciAnCisgICAgICAgICAgICdhZnRlclxuJworICAgICAgICAgICAnImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQgb3IgImV4Y2VwdCIgY2xhdXNlLiBUaGUgImltcG9ydCIgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICdvZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZVxuJworICAgICAgICAgICAnaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgJworICAgICAgICAgICAnZm9ybVxuJworICAgICAgICAgICAnbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIHRhcmdldCBvY2N1cnJpbmcgaW4gYSAiZGVsIiBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kICcKKyAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAndGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgJworICAgICAgICAgICAnbmFtZSkuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0VhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkICcKKyAgICAgICAgICAgJ2J5IGFcbicKKyAgICAgICAgICAgJ2NsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlICcKKyAgICAgICAgICAgJ3RvcC1sZXZlbFxuJworICAgICAgICAgICAnY29kZSBibG9jaykuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgJworICAgICAgICAgICAnYmxvY2ssXG4nCisgICAgICAgICAgICd1bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlIHZhcmlhYmxlcyBvZiB0aGUgJworICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICdjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhICcKKyAgICAgICAgICAgJ2NvZGVcbicKKyAgICAgICAgICAgJ2Jsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0VhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICcKKyAgICAgICAgICAgJypiaW5kaW5nKlxuJworICAgICAgICAgICAnb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1Jlc29sdXRpb24gb2YgbmFtZXNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSAnCisgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAndmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55ICcKKyAgICAgICAgICAgJ2Jsb2Nrc1xuJworICAgICAgICAgICAnY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgJworICAgICAgICAgICAnaW50cm9kdWNlc1xuJworICAgICAgICAgICAnYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgJworICAgICAgICAgICAnbmVhcmVzdFxuJworICAgICAgICAgICAnZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgJworICAgICAgICAgICAnYmxvY2tcbicKKyAgICAgICAgICAgImlzIGNhbGxlZCB0aGUgYmxvY2sncyAqZW52aXJvbm1lbnQqLlxuIgorICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdXaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICdyYWlzZWQuIElmXG4nCisgICAgICAgICAgICd0aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgJworICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ25hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJworICAgICAgICAgICAnIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssICcKKyAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAndXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdjdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAnYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuJworICAgICAgICAgICAnZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbicKKyAgICAgICAgICAgJ3dpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbicKKyAgICAgICAgICAgJ2RldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSAnCisgICAgICAgICAgICdiaW5kaW5nXG4nCisgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlICcKKyAgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAgJ3NwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3RvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCAnCisgICAgICAgICAgICduYW1lc3BhY2UgYnlcbicKKyAgICAgICAgICAgJ3NlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbicKKyAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgJworICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICdvZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCAnCisgICAgICAgICAgICdmaXJzdC4gIElmXG4nCisgICAgICAgICAgICd0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJyJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nICcKKyAgICAgICAgICAgJ29wZXJhdGlvblxuJworICAgICAgICAgICAnaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSAnCisgICAgICAgICAgICd2YXJpYWJsZVxuJworICAgICAgICAgICAnY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgJworICAgICAgICAgICAnZ2xvYmFsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbicKKyAgICAgICAgICAgJ3ByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiAnCisgICAgICAgICAgICdzY29wZS5cbicKKyAgICAgICAgICAgJyJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzICcKKyAgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICAnZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lICcKKyAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgJ21vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzICcKKyAgICAgICAgICAgJ2NhbGxlZFxuJworICAgICAgICAgICAnIl9fbWFpbl9fIi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgJworICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICdzcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzICcKKyAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICdleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgJworICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAnZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICd1bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJ25hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAnCisgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAndGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJ3RoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzICcKKyAgICAgICAgICAgJy0tXG4nCisgICAgICAgICAgICd0aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSAnCisgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgJ2ltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlICcKKyAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAnd2lsbCBmYWlsOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBjbGFzcyBBOlxuJworICAgICAgICAgICAnICAgICAgIGEgPSA0MlxuJworICAgICAgICAgICAnICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdCdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSAnCisgICAgICAgICAgICdibG9ja1xuJworICAgICAgICAgICAnaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgJworICAgICAgICAgICAnZ2xvYmFsXG4nCisgICAgICAgICAgICduYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciAnCisgICAgICAgICAgICdjYXNlXG4nCisgICAgICAgICAgICJ0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlICIKKyAgICAgICAgICAgJyJfX21haW5fXyJcbicKKyAgICAgICAgICAgJ21vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluICcKKyAgICAgICAgICAgJ2FueVxuJworICAgICAgICAgICAnb3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICciYnVpbHRpbnMiIG1vZHVsZSBpdHNlbGYuICAiX19idWlsdGluc19fIiBjYW4gYmUgc2V0IHRvIGEgJworICAgICAgICAgICAndXNlci1jcmVhdGVkXG4nCisgICAgICAgICAgICdkaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG4nCisgICAgICAgICAgICciX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbicKKyAgICAgICAgICAgJ3dhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICcKKyAgICAgICAgICAgJyJpbXBvcnQiXG4nCisgICAgICAgICAgICd0aGUgImJ1aWx0aW5zIiBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcyBhcHByb3ByaWF0ZWx5LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0ludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuJworICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ05hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0ICcKKyAgICAgICAgICAgJ2NvbXBpbGVcbicKKyAgICAgICAgICAgJ3RpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaSA9IDEwXG4nCisgICAgICAgICAgICcgICBkZWYgZigpOlxuJworICAgICAgICAgICAnICAgICAgIHByaW50KGkpXG4nCisgICAgICAgICAgICcgICBpID0gNDJcbicKKyAgICAgICAgICAgJyAgIGYoKVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuICcKKyAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgJ2luIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJ2RlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlICcKKyAgICAgICAgICAgJ2Z1bGxcbicKKyAgICAgICAgICAgJ2Vudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlICcKKyAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICdhbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgJworICAgICAgICAgICAncmVzb2x2ZWRcbicKKyAgICAgICAgICAgJ2luIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICcKKyAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAnVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbicKKyAgICAgICAgICAgJ292ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSAnCisgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAnc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnbm9ubG9jYWwnOiAnXG4nCisgICAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIG5vbmxvY2FsX3N0bXQgOjo9ICJub25sb2NhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIHRvIHJlZmVyICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAncHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlICcKKyAgICAgICAgICAgICAnZXhjbHVkaW5nXG4nCisgICAgICAgICAgICAgJ2dsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yICcKKyAgICAgICAgICAgICAnYmluZGluZyBpc1xuJworICAgICAgICAgICAgICd0byBzZWFyY2ggdGhlIGxvY2FsIG5hbWVzcGFjZSBmaXJzdC4gIFRoZSBzdGF0ZW1lbnQgYWxsb3dzXG4nCisgICAgICAgICAgICAgJ2VuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgbG9jYWwgJworICAgICAgICAgICAgICdzY29wZVxuJworICAgICAgICAgICAgICdiZXNpZGVzIHRoZSBnbG9iYWwgKG1vZHVsZSkgc2NvcGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCwgdW5saWtlIHRob3NlIGxpc3RlZCBpbiAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhblxuJworICAgICAgICAgICAgICdlbmNsb3Npbmcgc2NvcGUgKHRoZSBzY29wZSBpbiB3aGljaCBhIG5ldyBiaW5kaW5nIHNob3VsZCBiZSAnCisgICAgICAgICAgICAgJ2NyZWF0ZWRcbicKKyAgICAgICAgICAgICAnY2Fubm90IGJlIGRldGVybWluZWQgdW5hbWJpZ3VvdXNseSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBjb2xsaWRlIHdpdGggJworICAgICAgICAgICAgICdwcmUtXG4nCisgICAgICAgICAgICAgJ2V4aXN0aW5nIGJpbmRpbmdzIGluIHRoZSBsb2NhbCBzY29wZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzMTA0KiogLSBBY2Nlc3MgdG8gTmFtZXMgaW4gT3V0ZXIgU2NvcGVzXG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC5cbicsCisgJ251bWJlcnMnOiAnXG4nCisgICAgICAgICAgICAnTnVtZXJpYyBsaXRlcmFsc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogaW50ZWdlcnMsIGZsb2F0aW5nICcKKyAgICAgICAgICAgICdwb2ludFxuJworICAgICAgICAgICAgJ251bWJlcnMsIGFuZCBpbWFnaW5hcnkgbnVtYmVycy4gIFRoZXJlIGFyZSBubyBjb21wbGV4IGxpdGVyYWxzXG4nCisgICAgICAgICAgICAnKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhblxuJworICAgICAgICAgICAgJ2ltYWdpbmFyeSBudW1iZXIpLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ05vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAnCisgICAgICAgICAgICAnIi0xIlxuJworICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yIFwnIi0iXCcgJworICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICdsaXRlcmFsICIxIi5cbicsCisgJ251bWVyaWMtdHlwZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAnTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAnCisgICAgICAgICAgICAgICAgICAnYnkgdGhlXG4nCisgICAgICAgICAgICAgICAgICAncGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSAnCisgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9ucyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICdub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSAnCisgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgICciZGl2bW9kKCkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSwgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIG9mIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzICcKKyAgICAgICAgICAgICAgICAgICdjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gJworICAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgJworICAgICAgICAgICAgICAgICAgJ3JlbGF0ZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVkIHRvIGFjY2VwdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgJworICAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgJworICAgICAgICAgICAgICAgICAgJyhzd2FwcGVkKVxuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCAnCisgICAgICAgICAgICAgICAgICAnb3BlcmFuZCBkb2VzXG4nCisgICAgICAgICAgICAgICAgICAnICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICAgICAgICAgJ2FyZSBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlICcKKyAgICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IC1cbicKKyAgICAgICAgICAgICAgICAgICcgICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gJworICAgICAgICAgICAgICAgICAgJyJfX3JzdWJfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiAnCisgICAgICAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAgJyAgICpOb3RJbXBsZW1lbnRlZCouXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICAnIl9fcnBvd19fKCkiICh0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgJ2xlZnRcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSAiCisgICAgICAgICAgICAgICAgICAncmVmbGVjdGVkIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAndGhlIGxlZnRcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzICIKKyAgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICAiICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnMnIG9wZXJhdGlvbnMuXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCAnCisgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgJworICAgICAgICAgICAgICAgICAgJyIqKj0iLFxuJworICAgICAgICAgICAgICAgICAgJyAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICAnYXR0ZW1wdCB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gJworICAgICAgICAgICAgICAgICAgJ3RoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgICcgICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSAnCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyAnCisgICAgICAgICAgICAgICAgICAnYmFjayB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mICcKKyAgICAgICAgICAgICAgICAgICdhIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICcKKyAgICAgICAgICAgICAgICAgICcieCA9XG4nCisgICAgICAgICAgICAgICAgICAnICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnInkuX19yYWRkX18oeCkiIGFyZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gJworICAgICAgICAgICAgICAgICAgJ2NlcnRhaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluICcKKyAgICAgICAgICAgICAgICAgICd1bmV4cGVjdGVkIGVycm9yc1xuJworICAgICAgICAgICAgICAgICAgIiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbJ2l0ZW0nXSByYWlzZSBhbiBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgJ3doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgYWRkaXRpb24gd29ya3M/KSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mICcKKyAgICAgICAgICAgICAgICAgICd0aGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAgJyAgIG1vZGVsLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lZ19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcG9zX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19hYnNfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludmVydF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAgICAgICcoIi0iLCAiKyIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgImFicygpIiBhbmQgIn4iKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb21wbGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Zsb2F0X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImNvbXBsZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgICciaW50KCkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICB0eXBlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2luZGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyICcKKyAgICAgICAgICAgICAgICAgICdQeXRob24gbmVlZHNcbicKKyAgICAgICAgICAgICAgICAgICcgICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgJworICAgICAgICAgICAgICAgICAgJ29iamVjdCAoc3VjaFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIm9jdCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnbnVtZXJpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IEluIG9yZGVyIHRvIGhhdmUgYSBjb2hlcmVudCBpbnRlZ2VyIHR5cGUgY2xhc3MsICcKKyAgICAgICAgICAgICAgICAgICd3aGVuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgJworICAgICAgICAgICAgICAgICAgJ2RlZmluZWQsIGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJywKKyAnb2JqZWN0cyc6ICdcbicKKyAgICAgICAgICAgICdPYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzXG4nCisgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIipPYmplY3RzKiBhcmUgUHl0aG9uJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhICIKKyAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICdwcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gJworICAgICAgICAgICAgJ29iamVjdHMuIChJblxuJworICAgICAgICAgICAgJ2Egc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFublwncyBtb2RlbCBvZiBhICJzdG9yZWRcbicKKyAgICAgICAgICAgICdwcm9ncmFtIGNvbXB1dGVyLCIgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKVxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdCdzXG4iCisgICAgICAgICAgICAnKmlkZW50aXR5KiBuZXZlciBjaGFuZ2VzIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZDsgeW91IG1heSB0aGluayAnCisgICAgICAgICAgICAnb2YgaXRcbicKKyAgICAgICAgICAgICdhcyB0aGUgb2JqZWN0XCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlIFwnImlzIlwnIG9wZXJhdG9yICcKKyAgICAgICAgICAgICdjb21wYXJlcyB0aGVcbicKKyAgICAgICAgICAgICdpZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlICJpZCgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXJcbicKKyAgICAgICAgICAgICdyZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5LlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogRm9yIENQeXRob24sICJpZCh4KSIgaXMgdGhlICcKKyAgICAgICAgICAgICdtZW1vcnlcbicKKyAgICAgICAgICAgICdhZGRyZXNzIHdoZXJlICJ4IiBpcyBzdG9yZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAiQW4gb2JqZWN0J3MgdHlwZSBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCAiCisgICAgICAgICAgICAnc3VwcG9ydHNcbicKKyAgICAgICAgICAgICcoZS5nLiwgImRvZXMgaXQgaGF2ZSBhIGxlbmd0aD8iKSBhbmQgYWxzbyBkZWZpbmVzIHRoZSBwb3NzaWJsZSAnCisgICAgICAgICAgICAndmFsdWVzXG4nCisgICAgICAgICAgICAnZm9yIG9iamVjdHMgb2YgdGhhdCB0eXBlLiAgVGhlICJ0eXBlKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gJworICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAndHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gJworICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAnKnR5cGUqIGlzIGFsc28gdW5jaGFuZ2VhYmxlLiBbMV1cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHMgd2hvc2UgdmFsdWUgY2FuXG4nCisgICAgICAgICAgICAnY2hhbmdlIGFyZSBzYWlkIHRvIGJlICptdXRhYmxlKjsgb2JqZWN0cyB3aG9zZSB2YWx1ZSBpcyAnCisgICAgICAgICAgICAndW5jaGFuZ2VhYmxlXG4nCisgICAgICAgICAgICAnb25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGUgdmFsdWUgb2YgYW5cbicKKyAgICAgICAgICAgICdpbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgJworICAgICAgICAgICAgJ211dGFibGVcbicKKyAgICAgICAgICAgICJvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXIncyB2YWx1ZSBpcyBjaGFuZ2VkOyBob3dldmVyICIKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdjb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gJworICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAnb2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG4nCisgICAgICAgICAgICAnc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSAnCisgICAgICAgICAgICAnc3VidGxlLilcbicKKyAgICAgICAgICAgICJBbiBvYmplY3QncyBtdXRhYmlsaXR5IGlzIGRldGVybWluZWQgYnkgaXRzIHR5cGU7IGZvciBpbnN0YW5jZSxcbiIKKyAgICAgICAgICAgICdudW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzICcKKyAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICdsaXN0cyBhcmUgbXV0YWJsZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdPYmplY3RzIGFyZSBuZXZlciBleHBsaWNpdGx5IGRlc3Ryb3llZDsgaG93ZXZlciwgd2hlbiB0aGV5ICcKKyAgICAgICAgICAgICdiZWNvbWVcbicKKyAgICAgICAgICAgICd1bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG4nCisgICAgICAgICAgICAnYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIC0tLSAnCisgICAgICAgICAgICAnaXQgaXNcbicKKyAgICAgICAgICAgICdhIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbicKKyAgICAgICAgICAgICdpbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGxcbicKKyAgICAgICAgICAgICdyZWFjaGFibGUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgJworICAgICAgICAgICAgJ3JlZmVyZW5jZS1cbicKKyAgICAgICAgICAgICdjb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgJworICAgICAgICAgICAgJ2xpbmtlZFxuJworICAgICAgICAgICAgJ2dhcmJhZ2UsIHdoaWNoIGNvbGxlY3RzIG1vc3Qgb2JqZWN0cyBhcyBzb29uIGFzIHRoZXkgYmVjb21lXG4nCisgICAgICAgICAgICAndW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuJworICAgICAgICAgICAgJ2NpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICJnYyIgbW9kdWxlICcKKyAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICdpbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gJworICAgICAgICAgICAgJ090aGVyXG4nCisgICAgICAgICAgICAnaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgJworICAgICAgICAgICAgJ2RlcGVuZFxuJworICAgICAgICAgICAgJ29uIGltbWVkaWF0ZSBmaW5hbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIHRoZXkgYmVjb21lIHVucmVhY2hhYmxlICcKKyAgICAgICAgICAgICcoc29cbicKKyAgICAgICAgICAgICd5b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICJOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb24ncyB0cmFjaW5nIG9yIGRlYnVnZ2luZ1xuIgorICAgICAgICAgICAgJ2ZhY2lsaXRpZXMgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlICcKKyAgICAgICAgICAgICdjb2xsZWN0YWJsZS5cbicKKyAgICAgICAgICAgICdBbHNvIG5vdGUgdGhhdCBjYXRjaGluZyBhbiBleGNlcHRpb24gd2l0aCBhIFwnInRyeSIuLi4iZXhjZXB0IlwnXG4nCisgICAgICAgICAgICAnc3RhdGVtZW50IG1heSBrZWVwIG9iamVjdHMgYWxpdmUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzICcKKyAgICAgICAgICAgICdvcGVuXG4nCisgICAgICAgICAgICAnZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlICcKKyAgICAgICAgICAgICdmcmVlZFxuJworICAgICAgICAgICAgJ3doZW4gdGhlIG9iamVjdCBpcyBnYXJiYWdlLWNvbGxlY3RlZCwgYnV0IHNpbmNlIGdhcmJhZ2UgJworICAgICAgICAgICAgJ2NvbGxlY3Rpb24gaXNcbicKKyAgICAgICAgICAgICdub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgJworICAgICAgICAgICAgJ3dheSB0b1xuJworICAgICAgICAgICAgJ3JlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgImNsb3NlKCkiIG1ldGhvZC4gJworICAgICAgICAgICAgJ1Byb2dyYW1zXG4nCisgICAgICAgICAgICAnYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaCBvYmplY3RzLiAgVGhlXG4nCisgICAgICAgICAgICAnXCcidHJ5Ii4uLiJmaW5hbGx5IlwnIHN0YXRlbWVudCBhbmQgdGhlIFwnIndpdGgiXCcgc3RhdGVtZW50ICcKKyAgICAgICAgICAgICdwcm92aWRlXG4nCisgICAgICAgICAgICAnY29udmVuaWVudCB3YXlzIHRvIGRvIHRoaXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgJworICAgICAgICAgICAgJ2NhbGxlZFxuJworICAgICAgICAgICAgJypjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbicKKyAgICAgICAgICAgICJkaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lcidzIHZhbHVlLiAgIgorICAgICAgICAgICAgJ0luXG4nCisgICAgICAgICAgICAnbW9zdCBjYXNlcywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciwgd2UgaW1wbHkgJworICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ3ZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgJworICAgICAgICAgICAgJ3doZW4gd2VcbicKKyAgICAgICAgICAgICd0YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdpbW1lZGlhdGVseSBjb250YWluZWQgb2JqZWN0cyBhcmUgaW1wbGllZC4gIFNvLCBpZiBhbiBpbW11dGFibGVcbicKKyAgICAgICAgICAgICdjb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlICcKKyAgICAgICAgICAgICdvYmplY3QsIGl0c1xuJworICAgICAgICAgICAgJ3ZhbHVlIGNoYW5nZXMgaWYgdGhhdCBtdXRhYmxlIG9iamVjdCBpcyBjaGFuZ2VkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1R5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGVcbicKKyAgICAgICAgICAgICdpbXBvcnRhbmNlIG9mIG9iamVjdCBpZGVudGl0eSBpcyBhZmZlY3RlZCBpbiBzb21lIHNlbnNlOiBmb3IgJworICAgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICAgJ3R5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYVxuJworICAgICAgICAgICAgJ3JlZmVyZW5jZSB0byBhbnkgZXhpc3Rpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUsICcKKyAgICAgICAgICAgICd3aGlsZVxuJworICAgICAgICAgICAgJ2ZvciBtdXRhYmxlIG9iamVjdHMgdGhpcyBpcyBub3QgYWxsb3dlZC4gIEUuZy4sIGFmdGVyICJhID0gMTsgYiA9ICcKKyAgICAgICAgICAgICcxIixcbicKKyAgICAgICAgICAgICciYSIgYW5kICJiIiBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUgJworICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAnb25lLCBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgYWZ0ZXIgImMgPSBbXTsgZCA9IFtdIiwgJworICAgICAgICAgICAgJyJjIlxuJworICAgICAgICAgICAgJ2FuZCAiZCIgYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCwgdW5pcXVlLCBuZXdseVxuJworICAgICAgICAgICAgJ2NyZWF0ZWQgZW1wdHkgbGlzdHMuIChOb3RlIHRoYXQgImMgPSBkID0gW10iIGFzc2lnbnMgdGhlIHNhbWUgJworICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgJ3RvIGJvdGggImMiIGFuZCAiZCIuKVxuJywKKyAnb3BlcmF0b3Itc3VtbWFyeSc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdPcGVyYXRvciBwcmVjZWRlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gUHl0aG9uLCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICAgICAnbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnKG1vc3RcbicKKyAgICAgICAgICAgICAgICAgICAgICdiaW5kaW5nKS4gIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgICAgICAncHJlY2VkZW5jZS4gIFVubGVzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzeW50YXggaXMgZXhwbGljaXRseSBnaXZlbiwgb3BlcmF0b3JzIGFyZSBiaW5hcnkuICAnCisgICAgICAgICAgICAgICAgICAgICAnT3BlcmF0b3JzIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2V4cG9uZW50aWF0aW9uLCB3aGljaFxuJworICAgICAgICAgICAgICAgICAgICAgJ2dyb3VwcyBmcm9tIHJpZ2h0IHRvIGxlZnQpLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCBjb21wYXJpc29ucywgbWVtYmVyc2hpcCB0ZXN0cywgYW5kIGlkZW50aXR5ICcKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0cywgYWxsIGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyAnCisgICAgICAgICAgICAgICAgICAgICAnZmVhdHVyZSBhc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaWJlZCBpbiB0aGUgQ29tcGFyaXNvbnMgc2VjdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAibGFtYmRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiaWYiIC0tICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAibm90IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiaW4iLCAibm90IGluIiwgImlzIiwgImlzIG5vdCIsICI8IiwgIjw9IiwgIj4iLCB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICI+PSIsICIhPSIsICI9PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJ8IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICImIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICI8PCIsICI+PiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ1NoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIrIiwgIi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0FkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ011bHRpcGxpY2F0aW9uLCBtYXRyaXggbXVsdGlwbGljYXRpb24gfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnZGl2aXNpb24sIHJlbWFpbmRlciBbNV0gICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIit4IiwgIi14IiwgIn54IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIioqIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnRXhwb25lbnRpYXRpb24gWzZdICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImF3YWl0IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQXdhaXQgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInhbaW5kZXhdIiwgInhbaW5kZXg6aW5kZXhdIiwgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiKGV4cHJlc3Npb25zLi4uKSIsICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6ICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCaW5kaW5nIG9yIHR1cGxlIGRpc3BsYXksIGxpc3QgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8IHZhbHVlLi4ufSIsICJ7ZXhwcmVzc2lvbnMuLi59IiAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0ICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1sxXSBXaGlsZSAiYWJzKHgleSkgPCBhYnMoeSkiIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksICcKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgZmxvYXRzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGl0IG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuICcKKyAgICAgICAgICAgICAgICAgICAgICdJRUVFIDc1NCBkb3VibGUtXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgIi0xZS0xMDAgJSAxZTEwMCIgJworICAgICAgICAgICAgICAgICAgICAgJ2hhdmUgdGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgJworICAgICAgICAgICAgICAgICAgICAgJzFlMTAwIiwgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byAiMWUxMDAiLiAgVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAibWF0aC5mbW9kKCkiIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2lnbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGlzIGNhc2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1syXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiAnCisgICAgICAgICAgICAgICAgICAgICAieSwgaXQnc1xuIgorICAgICAgICAgICAgICAgICAgICAgJyAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAnCisgICAgICAgICAgICAgICAgICAgICAnIih4LXgleSkvL3kiIGR1ZSB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgJworICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCwgaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb3JkZXIgdG8gcHJlc2VydmUgdGhhdCAiZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHkiICcKKyAgICAgICAgICAgICAgICAgICAgICdiZSB2ZXJ5IGNsb3NlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHRvICJ4Ii5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbM10gVGhlIFVuaWNvZGUgc3RhbmRhcmQgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuICpjb2RlICcKKyAgICAgICAgICAgICAgICAgICAgICdwb2ludHMqIChlLmcuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFUrMDA0MSkgYW5kICphYnN0cmFjdCBjaGFyYWN0ZXJzKiAoZS5nLiAiTEFUSU4gJworICAgICAgICAgICAgICAgICAgICAgJ0NBUElUQUwgTEVUVEVSIEEiKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgJworICAgICAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG9uZSBjb2RlIHBvaW50LCB0aGVyZSBpcyBhIG51bWJlciBvZiBhYnN0cmFjdCAnCisgICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB0aGF0IGNhbiBpbiBhZGRpdGlvbiBiZSByZXByZXNlbnRlZCB1c2luZyBhIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiBtb3JlIHRoYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgICAnIkxBVElOXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBIiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgJworICAgICAgICAgICAgICAgICAgICAgJ2Egc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICpwcmVjb21wb3NlZCBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMEM3LCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnYXMgYSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOICcKKyAgICAgICAgICAgICAgICAgICAgICdDQVBJVEFMXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIExFVFRFUiBDKSwgZm9sbG93ZWQgYnkgYSAqY29tYmluaW5nIGNoYXJhY3RlciogYXQgJworICAgICAgICAgICAgICAgICAgICAgJ2NvZGUgcG9zaXRpb25cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdsZXZlbCBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBVbmljb2RlIGNvZGUgcG9pbnRzLiBUaGlzIG1heSBiZSBjb3VudGVyLWludHVpdGl2ZSAnCisgICAgICAgICAgICAgICAgICAgICAndG8gaHVtYW5zLiAgRm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGV4YW1wbGUsICIiXFx1MDBDNyIgPT0gIlxcdTAwNDNcXHUwMzI3IiIgaXMgIkZhbHNlIiwgJworICAgICAgICAgICAgICAgICAgICAgJ2V2ZW4gdGhvdWdoIGJvdGhcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTiAnCisgICAgICAgICAgICAgICAgICAgICAnQ0FQSVRBTFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBMRVRURVIgQyBXSVRIIENFRElMTEEiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBUbyBjb21wYXJlIHN0cmluZ3MgYXQgdGhlIGxldmVsIG9mIGFic3RyYWN0ICcKKyAgICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzICh0aGF0IGlzLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICcKKyAgICAgICAgICAgICAgICAgICAgICcidW5pY29kZWRhdGEubm9ybWFsaXplKCkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1s0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgZHluYW1pYyBuYXR1cmUgb2YgZGVzY3JpcHRvcnMsIHlvdSBtYXkgbm90aWNlICcKKyAgICAgICAgICAgICAgICAgICAgICdzZWVtaW5nbHkgdW51c3VhbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBiZWhhdmlvdXIgaW4gY2VydGFpbiB1c2VzIG9mIHRoZSAiaXMiIG9wZXJhdG9yLCBsaWtlICcKKyAgICAgICAgICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpbnZvbHZpbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnY29uc3RhbnRzLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBDaGVjayB0aGVpciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzVdIFRoZSAiJSIgb3BlcmF0b3IgaXMgYWxzbyB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZzsgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHByZWNlZGVuY2UgYXBwbGllcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbNl0gVGhlIHBvd2VyIG9wZXJhdG9yICIqKiIgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gYW4gJworICAgICAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb3IgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsICcKKyAgICAgICAgICAgICAgICAgICAgICciMioqLTEiIGlzICIwLjUiLlxuJywKKyAncGFzcyc6ICdcbicKKyAgICAgICAgICdUaGUgInBhc3MiIHN0YXRlbWVudFxuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgcGFzc19zdG10IDo6PSAicGFzcyJcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcicGFzcyIgaXMgYSBudWxsIG9wZXJhdGlvbiAtLS0gd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyAnCisgICAgICAgICAnaGFwcGVucy5cbicKKyAgICAgICAgICdJdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG4nCisgICAgICAgICAnc3ludGFjdGljYWxseSwgYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgY2xhc3MgQzogcGFzcyAgICAgICAjIGEgY2xhc3Mgd2l0aCBubyBtZXRob2RzICh5ZXQpXG4nLAorICdwb3dlcic6ICdcbicKKyAgICAgICAgICAnVGhlIHBvd2VyIG9wZXJhdG9yXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHNcbicKKyAgICAgICAgICAnbGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJ3N5bnRheCBpczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHBvd2VyIDo6PSAoIGF3YWl0X2V4cHIgfCBwcmltYXJ5ICkgWyIqKiIgdV9leHByXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGh1cywgaW4gYW4gdW5wYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIHBvd2VyIGFuZCB1bmFyeSBvcGVyYXRvcnMsICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ29wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCAnCisgICAgICAgICAgJ2NvbnN0cmFpblxuJworICAgICAgICAgICd0aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogIi0xKioyIiByZXN1bHRzIGluICItMSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gInBvdygpIlxuJworICAgICAgICAgICdmdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgJworICAgICAgICAgICdhcmd1bWVudFxuJworICAgICAgICAgICdyYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICdmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwgYW5kIHRoZSByZXN1bHQgaXMgb2YgdGhhdCB0eXBlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRm9yIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICd1bmxlc3NcbicKKyAgICAgICAgICAndGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZVxuJworICAgICAgICAgICdjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsXG4nCisgICAgICAgICAgJyIxMCoqMiIgcmV0dXJucyAiMTAwIiwgYnV0ICIxMCoqLTIiIHJldHVybnMgIjAuMDEiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnUmFpc2luZyAiMC4wIiB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYSAnCisgICAgICAgICAgJyJaZXJvRGl2aXNpb25FcnJvciIuXG4nCisgICAgICAgICAgJ1JhaXNpbmcgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmcmFjdGlvbmFsIHBvd2VyIHJlc3VsdHMgaW4gYSAnCisgICAgICAgICAgJyJjb21wbGV4IlxuJworICAgICAgICAgICdudW1iZXIuIChJbiBlYXJsaWVyIHZlcnNpb25zIGl0IHJhaXNlZCBhICJWYWx1ZUVycm9yIi4pXG4nLAorICdyYWlzZSc6ICdcbicKKyAgICAgICAgICAnVGhlICJyYWlzZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbImZyb20iIGV4cHJlc3Npb25dXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsICJyYWlzZSIgcmUtcmFpc2VzIHRoZSBsYXN0ICcKKyAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ3RoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICd0aGUgY3VycmVudCBzY29wZSwgYSAiUnVudGltZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmdcbicKKyAgICAgICAgICAndGhhdCB0aGlzIGlzIGFuIGVycm9yLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnT3RoZXJ3aXNlLCAicmFpc2UiIGV2YWx1YXRlcyB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhcyB0aGUgZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ29iamVjdC4gIEl0IG11c3QgYmUgZWl0aGVyIGEgc3ViY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2ZcbicKKyAgICAgICAgICAnIkJhc2VFeGNlcHRpb24iLiBJZiBpdCBpcyBhIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHdpbGwgYmVcbicKKyAgICAgICAgICAnb2J0YWluZWQgd2hlbiBuZWVkZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3Mgd2l0aCBubyBhcmd1bWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICJUaGUgKnR5cGUqIG9mIHRoZSBleGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSdzIGNsYXNzLCB0aGVcbiIKKyAgICAgICAgICAnKnZhbHVlKiBpcyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSB0cmFjZWJhY2sgb2JqZWN0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuICcKKyAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ2lzIHJhaXNlZCBhbmQgYXR0YWNoZWQgdG8gaXQgYXMgdGhlICJfX3RyYWNlYmFja19fIiBhdHRyaWJ1dGUsICcKKyAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAnaXMgd3JpdGFibGUuIFlvdSBjYW4gY3JlYXRlIGFuIGV4Y2VwdGlvbiBhbmQgc2V0IHlvdXIgb3duIHRyYWNlYmFjayAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJ29uZSBzdGVwIHVzaW5nIHRoZSAid2l0aF90cmFjZWJhY2soKSIgZXhjZXB0aW9uIG1ldGhvZCAod2hpY2ggJworICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgJ3RoZSBzYW1lIGV4Y2VwdGlvbiBpbnN0YW5jZSwgd2l0aCBpdHMgdHJhY2ViYWNrIHNldCB0byBpdHMgJworICAgICAgICAgICdhcmd1bWVudCksXG4nCisgICAgICAgICAgJ2xpa2Ugc286XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICByYWlzZSBFeGNlcHRpb24oImZvbyBvY2N1cnJlZCIpLndpdGhfdHJhY2ViYWNrKHRyYWNlYmFja29iailcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSAiZnJvbSIgY2xhdXNlIGlzIHVzZWQgZm9yIGV4Y2VwdGlvbiBjaGFpbmluZzogaWYgZ2l2ZW4sIHRoZSAnCisgICAgICAgICAgJ3NlY29uZFxuJworICAgICAgICAgICcqZXhwcmVzc2lvbiogbXVzdCBiZSBhbm90aGVyIGV4Y2VwdGlvbiBjbGFzcyBvciBpbnN0YW5jZSwgd2hpY2ggJworICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgJ3RoZW4gYmUgYXR0YWNoZWQgdG8gdGhlIHJhaXNlZCBleGNlcHRpb24gYXMgdGhlICJfX2NhdXNlX18iICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyh3aGljaCBpcyB3cml0YWJsZSkuICBJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCwgYm90aFxuJworICAgICAgICAgICdleGNlcHRpb25zIHdpbGwgYmUgcHJpbnRlZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgID4+PiB0cnk6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4nCisgICAgICAgICAgJyAgIC4uLiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbicKKyAgICAgICAgICAnICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIGV4Y1xuJworICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgJyAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyAnCisgICAgICAgICAgJ2V4Y2VwdGlvbjpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuJworICAgICAgICAgICcgICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0Egc2ltaWxhciBtZWNoYW5pc20gd29ya3MgaW1wbGljaXRseSBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkICcKKyAgICAgICAgICAnaW5zaWRlXG4nCisgICAgICAgICAgJ2FuIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIGEgImZpbmFsbHkiIGNsYXVzZTogdGhlIHByZXZpb3VzIGV4Y2VwdGlvbiAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJ3RoZW4gYXR0YWNoZWQgYXMgdGhlIG5ldyBleGNlcHRpb25cJ3MgIl9fY29udGV4dF9fIiBhdHRyaWJ1dGU6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICA+Pj4gdHJ5OlxuJworICAgICAgICAgICcgICAuLi4gICAgIHByaW50KDEgLyAwKVxuJworICAgICAgICAgICcgICAuLi4gZXhjZXB0OlxuJworICAgICAgICAgICcgICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpXG4nCisgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sIGFub3RoZXIgZXhjZXB0aW9uICcKKyAgICAgICAgICAnb2NjdXJyZWQ6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgICAnRXhjZXB0aW9ucywgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhhbmRsaW5nIGV4Y2VwdGlvbnMgaXMgaW4gJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJ1RoZSB0cnkgc3RhdGVtZW50LlxuJywKKyAncmV0dXJuJzogJ1xuJworICAgICAgICAgICAnVGhlICJyZXR1cm4iIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICByZXR1cm5fc3RtdCA6Oj0gInJldHVybiIgW2V4cHJlc3Npb25fbGlzdF1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnInJldHVybiIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBmdW5jdGlvbiAnCisgICAgICAgICAgICdkZWZpbml0aW9uLFxuJworICAgICAgICAgICAnbm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlICJOb25lIiBpc1xuJworICAgICAgICAgICAnc3Vic3RpdHV0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyJyZXR1cm4iIGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGV4cHJlc3Npb24gbGlzdCAnCisgICAgICAgICAgICcob3JcbicKKyAgICAgICAgICAgJyJOb25lIikgYXMgcmV0dXJuIHZhbHVlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdXaGVuICJyZXR1cm4iIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgJworICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICdjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdmdW5jdGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSAicmV0dXJuIiBzdGF0ZW1lbnQgaW5kaWNhdGVzIHRoYXQgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSAiU3RvcEl0ZXJhdGlvbiIgdG8gYmUgcmFpc2VkLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJ3JldHVybmVkIHZhbHVlIChpZiBhbnkpIGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gY29uc3RydWN0XG4nCisgICAgICAgICAgICciU3RvcEl0ZXJhdGlvbiIgYW5kIGJlY29tZXMgdGhlICJTdG9wSXRlcmF0aW9uLnZhbHVlIiBhdHRyaWJ1dGUuXG4nLAorICdzZXF1ZW5jZS10eXBlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50ICcKKyAgICAgICAgICAgICAgICAgICAnY29udGFpbmVyIG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ0NvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgJworICAgICAgICAgICAgICAgICAgICdvciBtYXBwaW5nc1xuJworICAgICAgICAgICAgICAgICAgICcobGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzICcKKyAgICAgICAgICAgICAgICAgICAnd2VsbC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAgICdmaXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICdvciB0b1xuJworICAgICAgICAgICAgICAgICAgICdlbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9ICcKKyAgICAgICAgICAgICAgICAgICAnayA8IE4iIHdoZXJlXG4nCisgICAgICAgICAgICAgICAgICAgJypOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggJworICAgICAgICAgICAgICAgICAgICdkZWZpbmUgYVxuJworICAgICAgICAgICAgICAgICAgICdyYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGUgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ21ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgJworICAgICAgICAgICAgICAgICAgICciY2xlYXIoKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJyJ1cGRhdGUoKSJcbicKKyAgICAgICAgICAgICAgICAgICAiYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSAiCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgJworICAgICAgICAgICAgICAgICAgICdhYnN0cmFjdCBiYXNlXG4nCisgICAgICAgICAgICAgICAgICAgJ2NsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0IG9mICcKKyAgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLFxuJworICAgICAgICAgICAgICAgICAgICciX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2VzXG4nCisgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgICAnImV4dGVuZCgpIixcbicKKyAgICAgICAgICAgICAgICAgICAnImluc2VydCgpIiwgInBvcCgpIiwgInJlbW92ZSgpIiwgInJldmVyc2UoKSIgYW5kICJzb3J0KCkiLCAnCisgICAgICAgICAgICAgICAgICAgJ2xpa2UgUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAgICdhZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gJworICAgICAgICAgICAgICAgICAgICcobWVhbmluZ1xuJworICAgICAgICAgICAgICAgICAgICdyZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUgbWV0aG9kcyAiX19hZGRfXygpIiwgJworICAgICAgICAgICAgICAgICAgICciX19yYWRkX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICAnZGVzY3JpYmVkXG4nCisgICAgICAgICAgICAgICAgICAgJ2JlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICAnCisgICAgICAgICAgICAgICAgICAgJ0l0IGlzXG4nCisgICAgICAgICAgICAgICAgICAgJ3JlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICciX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iICcKKyAgICAgICAgICAgICAgICAgICAnb3BlcmF0b3I7XG4nCisgICAgICAgICAgICAgICAgICAgJ2ZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcywgaXRcbicKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyICcKKyAgICAgICAgICAgICAgICAgICAncmVjb21tZW5kZWQgdGhhdCBib3RoXG4nCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kICcKKyAgICAgICAgICAgICAgICAgICAndG8gYWxsb3dcbicKKyAgICAgICAgICAgICAgICAgICAnZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAgICciX19pdGVyX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHRoZSBzYW1lIGFzICJrZXlzKCkiOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgJworICAgICAgICAgICAgICAgICAgICdpdGVyYXRlXG4nCisgICAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlIHZhbHVlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiLiAgJworICAgICAgICAgICAgICAgICAgICdTaG91bGQgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICcKKyAgICAgICAgICAgICAgICAgICAnIl9fbGVuX18oKSIgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZW5ndGhfaGludF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyICcKKyAgICAgICAgICAgICAgICAgICAnb3IgbGVzcyB0aGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBhY3R1YWwgbGVuZ3RoKS4gVGhlIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgIj49IiAnCisgICAgICAgICAgICAgICAgICAgJzAuIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkICcKKyAgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvcnJlY3RuZXNzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy40LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSAnCisgICAgICAgICAgICAgICAgICAgJ21ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgQSBjYWxsIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgYVsxOjJdID0gYlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICBhbmQgc28gZm9ydGguICBNaXNzaW5nIHNsaWNlIGl0ZW1zIGFyZSBhbHdheXMgZmlsbGVkIGluICcKKyAgICAgICAgICAgICAgICAgICAnd2l0aCAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSB0eXBlcyxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuICBOb3RlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnY2xhc3Mgd2lzaGVzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgJworICAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIgbWV0aG9kLiBJZlxuJworICAgICAgICAgICAgICAgICAgICcgICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICAgJ3JhaXNlZDsgaWYgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAnKGFmdGVyIGFueVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICcKKyAgICAgICAgICAgICAgICAgICAnIkluZGV4RXJyb3IiIHNob3VsZCBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAgICdyYWlzZWQgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCAnCisgICAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAnCisgICAgICAgICAgICAgICAgICAgJyJzZWxmW2tleV0iIGZvciBkaWN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN1YmNsYXNzZXMgd2hlbiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lICcKKyAgICAgICAgICAgICAgICAgICAnbm90ZSBhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgJworICAgICAgICAgICAgICAgICAgICdpZiBuZXcga2V5c1xuJworICAgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlICcKKyAgICAgICAgICAgICAgICAgICAncmVwbGFjZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFzIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlICcKKyAgICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAnbWFwcGluZ3MgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgJworICAgICAgICAgICAgICAgICAgICdpZiBlbGVtZW50c1xuJworICAgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgJworICAgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pdGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciAnCisgICAgICAgICAgICAgICAgICAgJ2EgY29udGFpbmVyLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAnY2FuIGl0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7ICcKKyAgICAgICAgICAgICAgICAgICAndGhleSBhcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnCisgICAgICAgICAgICAgICAgICAgJ2l0ZXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMsIHNlZSBJdGVyYXRvciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JldmVyc2VkX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byAnCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAgICcgICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3IgJworICAgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluICcKKyAgICAgICAgICAgICAgICAgICAncmV2ZXJzZSBvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJyJyZXZlcnNlZCgpIlxuJworICAgICAgICAgICAgICAgICAgICcgICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgJworICAgICAgICAgICAgICAgICAgICcoIl9fbGVuX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSBwcm90b2NvbFxuJworICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gJworICAgICAgICAgICAgICAgICAgICdwcm92aWRlIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInJldmVyc2VkKCkiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgJworICAgICAgICAgICAgICAgICAgICdub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgJworICAgICAgICAgICAgICAgICAgICdjb250YWluZXJcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhICcKKyAgICAgICAgICAgICAgICAgICAnbW9yZSBlZmZpY2llbnRcbicKKyAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAnYSBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0cnVlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cywgdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBrZXktaXRlbSBwYWlycy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdtZW1iZXJzaGlwIHRlc3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgdGhpcyAnCisgICAgICAgICAgICAgICAgICAgJ3NlY3Rpb24gaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIHJlZmVyZW5jZS5cbicsCisgJ3NoaWZ0aW5nJzogJ1xuJworICAgICAgICAgICAgICdTaGlmdGluZyBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICdvcGVyYXRpb25zOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoICI8PCIgfCAiPj4iICkgYV9leHByXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGVzZSBvcGVyYXRvcnMgYWNjZXB0IGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZXkgc2hpZnQgdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5ICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ3NlY29uZCBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBmbG9vciBkaXZpc2lvbiBieSAnCisgICAgICAgICAgICAgJyJwb3coMixuKSIuXG4nCisgICAgICAgICAgICAgJ0EgbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggJworICAgICAgICAgICAgICcicG93KDIsbikiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZTogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbicKKyAgICAgICAgICAgICAnICByZXF1aXJlZCB0byBiZSBhdCBtb3N0ICJzeXMubWF4c2l6ZSIuICBJZiB0aGUgcmlnaHQtaGFuZCAnCisgICAgICAgICAgICAgJ29wZXJhbmQgaXNcbicKKyAgICAgICAgICAgICAnICBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFuICJPdmVyZmxvd0Vycm9yIiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICdyYWlzZWQuXG4nLAorICdzbGljaW5ncyc6ICdcbicKKyAgICAgICAgICAgICAnU2xpY2luZ3NcbicKKyAgICAgICAgICAgICAnKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Egc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICdzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgJworICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICd0YXJnZXRzIGluIGFzc2lnbm1lbnQgb3IgImRlbCIgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEgJworICAgICAgICAgICAgICdzbGljaW5nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc2xpY2luZyAgICAgIDo6PSBwcmltYXJ5ICJbIiBzbGljZV9saXN0ICJdIlxuJworICAgICAgICAgICAgICcgICBzbGljZV9saXN0ICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbicKKyAgICAgICAgICAgICAnICAgc2xpY2VfaXRlbSAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlXG4nCisgICAgICAgICAgICAgJyAgIHByb3Blcl9zbGljZSA6Oj0gW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXSBbICI6IiAnCisgICAgICAgICAgICAgJ1tzdHJpZGVdIF1cbicKKyAgICAgICAgICAgICAnICAgbG93ZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJyAgIHVwcGVyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICcgICBzdHJpZGUgICAgICAgOjo9IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUgZm9ybWFsIHN5bnRheCBoZXJlOiBhbnl0aGluZyB0aGF0ICcKKyAgICAgICAgICAgICAnbG9va3MgbGlrZVxuJworICAgICAgICAgICAgICdhbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55ICcKKyAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgJ2NhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyICcKKyAgICAgICAgICAgICAnY29tcGxpY2F0aW5nIHRoZVxuJworICAgICAgICAgICAgICdzeW50YXgsIHRoaXMgaXMgZGlzYW1iaWd1YXRlZCBieSBkZWZpbmluZyB0aGF0IGluIHRoaXMgY2FzZSB0aGVcbicKKyAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb24gYXMgYSBzdWJzY3JpcHRpb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGVcbicKKyAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0XG4nCisgICAgICAgICAgICAgJ2NvbnRhaW5zIG5vIHByb3BlciBzbGljZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgc2VtYW50aWNzIGZvciBhIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBpcyAnCisgICAgICAgICAgICAgJ2luZGV4ZWRcbicKKyAgICAgICAgICAgICAnKHVzaW5nIHRoZSBzYW1lICJfX2dldGl0ZW1fXygpIiBtZXRob2QgYXMgbm9ybWFsIHN1YnNjcmlwdGlvbikgJworICAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICAna2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSAnCisgICAgICAgICAgICAgJ3NsaWNlXG4nCisgICAgICAgICAgICAgJ2xpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgJworICAgICAgICAgICAgICdsb25lXG4nCisgICAgICAgICAgICAgJ3NsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhIHByb3BlciBzbGljZSAnCisgICAgICAgICAgICAgJ2lzIGFcbicKKyAgICAgICAgICAgICAnc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIHdob3NlICcKKyAgICAgICAgICAgICAnInN0YXJ0IixcbicKKyAgICAgICAgICAgICAnInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICAgICAgICdnaXZlblxuJworICAgICAgICAgICAgICdhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSwgcmVzcGVjdGl2ZWx5LCAnCisgICAgICAgICAgICAgJ3N1YnN0aXR1dGluZ1xuJworICAgICAgICAgICAgICciTm9uZSIgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuXG4nLAorICdzcGVjaWFsYXR0cnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIEF0dHJpYnV0ZXNcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzICcKKyAgICAgICAgICAgICAgICAgJ3RvIHNldmVyYWxcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSAnCisgICAgICAgICAgICAgICAgICdub3QgcmVwb3J0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ2J5IHRoZSAiZGlyKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaWN0X19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQSBkaWN0aW9uYXJ5IG9yIG90aGVyIG1hcHBpbmcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gJworICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgJyAgICh3cml0YWJsZSkgYXR0cmlidXRlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2UuX19jbGFzc19fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fYmFzZXNfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLl9fbmFtZV9fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IgJworICAgICAgICAgICAgICAgICAnZ2VuZXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi5fX3F1YWxuYW1lX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlICpxdWFsaWZpZWQgbmFtZSogb2YgdGhlIGNsYXNzLCBmdW5jdGlvbiwgbWV0aG9kLCAnCisgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLCBvclxuJworICAgICAgICAgICAgICAgICAnICAgZ2VuZXJhdG9yIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fbXJvX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgJworICAgICAgICAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MubXJvKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgJworICAgICAgICAgICAgICAgICAnYXQgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiAiX19tcm9fXyIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fc3ViY2xhc3Nlc19fKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRWFjaCBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0cyAnCisgICAgICAgICAgICAgICAgICdpbW1lZGlhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAgICAgICAnICAgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuJworICAgICAgICAgICAgICAgICAiICAgICAgWzxjbGFzcyAnYm9vbCc+XVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICdmb3VuZFxuJworICAgICAgICAgICAgICAgICAnICAgIGluIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbCAoQmFzaWMgY3VzdG9taXphdGlvbikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1syXSBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCAiWzEsIDJdIiBpcyBjb25zaWRlcmVkIGVxdWFsICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICcgICAgIlsxLjAsIDIuMF0iLCBhbmQgc2ltaWxhcmx5IGZvciB0dXBsZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIlszXSBUaGV5IG11c3QgaGF2ZSBzaW5jZSB0aGUgcGFyc2VyIGNhbid0IHRlbGwgdGhlIHR5cGUgb2YgIgorICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgb3BlcmFuZHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1s0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgJworICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgJyAgICBiZWluZyBvbmUgb2YgIkx1IiAoTGV0dGVyLCB1cHBlcmNhc2UpLCAiTGwiIChMZXR0ZXIsICcKKyAgICAgICAgICAgICAgICAgJ2xvd2VyY2FzZSksXG4nCisgICAgICAgICAgICAgICAgICcgICAgb3IgIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdbNV0gVG8gZm9ybWF0IG9ubHkgYSB0dXBsZSB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICBzaW5nbGV0b24gdHVwbGUgd2hvc2Ugb25seSBlbGVtZW50IGlzIHRoZSB0dXBsZSB0byBiZSAnCisgICAgICAgICAgICAgICAgICdmb3JtYXR0ZWQuXG4nLAorICdzcGVjaWFsbmFtZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIG1ldGhvZCBuYW1lc1xuJworICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJ3N5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICdzbGljaW5nKSBieVxuJworICAgICAgICAgICAgICAgICAiZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uJ3MgIgorICAgICAgICAgICAgICAgICAnYXBwcm9hY2ggdG9cbicKKyAgICAgICAgICAgICAgICAgJypvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biAnCisgICAgICAgICAgICAgICAgICdiZWhhdmlvclxuJworICAgICAgICAgICAgICAgICAnd2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgICdhIG1ldGhvZCBuYW1lZCAiX19nZXRpdGVtX18oKSIsIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgJworICAgICAgICAgICAgICAgICAndGhpcyBjbGFzcyxcbicKKyAgICAgICAgICAgICAgICAgJ3RoZW4gInhbaV0iIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAidHlwZSh4KS5fX2dldGl0ZW1fXyh4LCAnCisgICAgICAgICAgICAgICAgICdpKSIuXG4nCisgICAgICAgICAgICAgICAgICdFeGNlcHQgd2hlcmUgbWVudGlvbmVkLCBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdyYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAnZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseVxuJworICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIiBvciAiVHlwZUVycm9yIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgJworICAgICAgICAgICAgICAgICAnaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2ltcG9ydGFudCB0aGF0IHRoZSBlbXVsYXRpb24gb25seSBiZSBpbXBsZW1lbnRlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnZGVncmVlIHRoYXQgaXRcbicKKyAgICAgICAgICAgICAgICAgJ21ha2VzIHNlbnNlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1vZGVsbGVkLiAgRm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAgICAgJ3NvbWVcbicKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAnZWxlbWVudHMsIGJ1dFxuJworICAgICAgICAgICAgICAgICAnZXh0cmFjdGluZyBhIHNsaWNlIG1heSBub3QgbWFrZSBzZW5zZS4gIChPbmUgZXhhbXBsZSBvZiB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2lzIHRoZVxuJworICAgICAgICAgICAgICAgICAnIk5vZGVMaXN0IiBpbnRlcmZhY2UgaW4gdGhlIFczQ1wncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0Jhc2ljIGN1c3RvbWl6YXRpb25cbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgJworICAgICAgICAgICAgICAgICAnYXMgc3VjaClcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgJworICAgICAgICAgICAgICAgICAnYXMgaXRzXG4nCisgICAgICAgICAgICAgICAgICcgICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgJworICAgICAgICAgICAgICAgICAndG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gICcKKyAgICAgICAgICAgICAgICAgJ1RoZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICcodXN1YWxseSBhblxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICAgICAnICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ25ld1xuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuJworICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gJworICAgICAgICAgICAgICAgICAndGhlIG5ld1xuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiAnCisgICAgICAgICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2NyZWF0aW9uLiAgSXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiKSwgYnV0XG4nCisgICAgICAgICAgICAgICAgICcgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgICAgICcgICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgJworICAgICAgICAgICAgICAgICAnY2xhc3MgaGFzIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLCBpZlxuJworICAgICAgICAgICAgICAgICAnICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyICcKKyAgICAgICAgICAgICAgICAgJ2luaXRpYWxpemF0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICcgICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiAnCisgICAgICAgICAgICAgICAgICdjb25zdHJ1Y3RpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byAnCisgICAgICAgICAgICAgICAgICdjdXN0b21pc2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyAnCisgICAgICAgICAgICAgICAgICdkb2luZyBzb1xuJworICAgICAgICAgICAgICAgICAnICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdpcyBhbHNvXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCwgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0ICcKKyAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgY2FsbCBpdFxuJworICAgICAgICAgICAgICAgICAnICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgYnlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCAnCisgICAgICAgICAgICAgICAgICdhIGxhdGVyXG4nCisgICAgICAgICAgICAgICAgICcgICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlZCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCAnCisgICAgICAgICAgICAgICAgICdleGlzdCB3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSAnCisgICAgICAgICAgICAgICAgICd0aGUgZm9ybWVyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdsYXR0ZXIgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gICcKKyAgICAgICAgICAgICAgICAgJ1NvbWUgY29tbW9uXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgJ3BhcmVudCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayAnCisgICAgICAgICAgICAgICAgICdmcmFtZSBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayAnCisgICAgICAgICAgICAgICAgICdzdG9yZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhICcKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiAnCisgICAgICAgICAgICAgICAgICd1bmhhbmRsZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgJworICAgICAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgJworICAgICAgICAgICAgICAgICAndGhlIGN5Y2xlcztcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICd0aGlyZCBjYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuICcKKyAgICAgICAgICAgICAgICAgJ0NpcmN1bGFyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkICcKKyAgICAgICAgICAgICAgICAgJ3VwIHdoZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICIgICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdCdzIG9uIGJ5ICIKKyAgICAgICAgICAgICAgICAgJ2RlZmF1bHQpLiBSZWZlclxuJworICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlICcKKyAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFib3V0IHRoaXMgdG9waWMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciAnCisgICAgICAgICAgICAgICAgICdkdXJpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgJworICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgaW52b2tlZCAnCisgICAgICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICAgICAnICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuICcKKyAgICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICciX19kZWxfXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAnb2YgYmVpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgJworICAgICAgICAgICAgICAgICAnRm9yIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgJworICAgICAgICAgICAgICAgICAnbWluaW11bSBuZWVkZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAnCisgICAgICAgICAgICAgICAgICcxLjUsXG4nCisgICAgICAgICAgICAgICAgICcgICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgJworICAgICAgICAgICAgICAgICAnc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgJ2dsb2JhbHMgYXJlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCAnCisgICAgICAgICAgICAgICAgICd0aGlzIG1heVxuJworICAgICAgICAgICAgICAgICAnICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgJworICAgICAgICAgICAgICAgICAnYXZhaWxhYmxlIGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JlcHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJvZmZpY2lhbCJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsICcKKyAgICAgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgJ3VzZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdmb3JtXG4nCisgICAgICAgICAgICAgICAgICcgICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgJworICAgICAgICAgICAgICAgICAncmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgJyJfX3JlcHJfXygpIiBidXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gJworICAgICAgICAgICAgICAgICAnImluZm9ybWFsIlxuJworICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3N0cl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICcKKyAgICAgICAgICAgICAgICAgJyJmb3JtYXQoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlICcKKyAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgJworICAgICAgICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgJworICAgICAgICAgICAgICAgICAndGhlcmUgaXMgbm9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb246IGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgJyJvYmplY3QiXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ieXRlc19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGF0aW9uIG9mIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQgYnkgJworICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uLFxuJworICAgICAgICAgICAgICAgICAnICAgZXZhbHVhdGlvbiBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAnInN0ci5mb3JtYXQoKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgZGVzaXJlZC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uXG4nCisgICAgICAgICAgICAgICAgICcgICBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsIGVpdGhlciAnCisgICAgICAgICAgICAgICAgICdkZWxlZ2F0ZVxuJworICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYSAnCisgICAgICAgICAgICAgICAgICdzaW1pbGFyXG4nCisgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFNlZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIGZvciBhIGRlc2NyaXB0aW9uICcKKyAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiAnCisgICAgICAgICAgICAgICAgICdpdHNlbGZcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICAgJ2lzIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgJworICAgICAgICAgICAgICAgICAnInguX19sZV9fKHkpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgJworICAgICAgICAgICAgICAgICAnIng+eSIgY2FsbHNcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAnCisgICAgICAgICAgICAgICAgICciTm90SW1wbGVtZW50ZWQiXG4nCisgICAgICAgICAgICAgICAgICcgICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyICcKKyAgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgJworICAgICAgICAgICAgICAgICAnZm9yIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ2FueSB2YWx1ZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAnCisgICAgICAgICAgICAgICAgICciYm9vbCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgJworICAgICAgICAgICAgICAgICAnZmFsc2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2ludmVydHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgJworICAgICAgICAgICAgICAgICAnaW1wbGllZFxuJworICAgICAgICAgICAgICAgICAnICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciAnCisgICAgICAgICAgICAgICAgICdleGFtcGxlLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvICcKKyAgICAgICAgICAgICAgICAgJ2F1dG9tYXRpY2FsbHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290ICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiwgc2VlXG4nCisgICAgICAgICAgICAgICAgICcgICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50ICcKKyAgICAgICAgICAgICAgICAgJ25vdGVzIG9uXG4nCisgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gJworICAgICAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgJworICAgICAgICAgICAgICAgICAnKHRvIGJlIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCAnCisgICAgICAgICAgICAgICAgICd0aGUgcmlnaHRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlICcKKyAgICAgICAgICAgICAgICAgImVhY2ggb3RoZXInc1xuIgorICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyAnCisgICAgICAgICAgICAgICAgICdyZWZsZWN0aW9uLFxuJworICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiAnCisgICAgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgIiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kJ3MgdHlwZSAiCisgICAgICAgICAgICAgICAgICdpcyBhXG4nCisgICAgICAgICAgICAgICAgICIgICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZCdzIHR5cGUsICIKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksICcKKyAgICAgICAgICAgICAgICAgJ290aGVyd2lzZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgIiAgIGxlZnQgb3BlcmFuZCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nICIKKyAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faGFzaF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICAgICAnb24gbWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAnICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAnCisgICAgICAgICAgICAgICAgICciZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgcmVxdWlyZWQgJworICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZTsgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlIG9yKSAnCisgICAgICAgICAgICAgICAgICd0aGUgaGFzaFxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgJworICAgICAgICAgICAgICAgICAncGFydCBpblxuJworICAgICAgICAgICAgICAgICAnICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gJworICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAnCisgICAgICAgICAgICAgICAgICciUHlfc3NpemVfdCIuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gJworICAgICAgICAgICAgICAgICAnMzItYml0XG4nCisgICAgICAgICAgICAgICAgICcgICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgJworICAgICAgICAgICAgICAgICAnaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuJworICAgICAgICAgICAgICAgICAnICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiAnCisgICAgICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAnCisgICAgICAgICAgICAgICAgICcicHl0aG9uIC1jXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgJworICAgICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICciX19lcV9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgJworICAgICAgICAgICAgICAgICAnaXRlbXMgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyAnCisgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSAnCisgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uc1xuJworICAgICAgICAgICAgICAgICAiICAgcmVxdWlyZXMgdGhhdCBhIGtleSdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgIgorICAgICAgICAgICAgICAgICAib2JqZWN0J3MgaGFzaFxuIgorICAgICAgICAgICAgICAgICAnICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0ICcKKyAgICAgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlICcKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlIHN1Y2hcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09ICcKKyAgICAgICAgICAgICAgICAgJ2hhc2goeSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAnCisgICAgICAgICAgICAgICAgICciX19oYXNoX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gICcKKyAgICAgICAgICAgICAgICAgJ1doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtICcKKyAgICAgICAgICAgICAgICAgJ2F0dGVtcHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICdpZGVudGlmaWVkIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCAnCisgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSAnCisgICAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgICAnICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4nCisgICAgICAgICAgICAgICAgICcgICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgJ3N1cHByZXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiICcKKyAgICAgICAgICAgICAgICAgJ2NhbGwuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgJworICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSAnCisgICAgICAgICAgICAgICAgICdyYW5kb20gdmFsdWUuXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICAgICAnICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCAnCisgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9ucyBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhICcKKyAgICAgICAgICAgICAgICAgJ2RlbmlhbC1cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdleHBsb2l0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSAnCisgICAgICAgICAgICAgICAgICdjb21wbGV4aXR5LlxuJworICAgICAgICAgICAgICAgICAnICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdvcmRlciBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgJworICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlc1xuJworICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgJzMyLWJpdCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgJworICAgICAgICAgICAgICAgICAnZGVmYXVsdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAnICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBpc1xuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICAnICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyAnCisgICAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlICcKKyAgICAgICAgICAgICAgICAgJ21lYW5pbmcgb2ZcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgJworICAgICAgICAgICAgICAgICAnIngubmFtZSIpIGZvclxuJworICAgICAgICAgICAgICAgICAnY2xhc3MgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgJworICAgICAgICAgICAgICAgICAnaXQgZm91bmRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnbmFtZS4gVGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsICcKKyAgICAgICAgICAgICAgICAgJ21lY2hhbmlzbSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgJworICAgICAgICAgICAgICAgICAnYXN5bW1ldHJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyAnCisgICAgICAgICAgICAgICAgICdkb25lIGJvdGggZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiAnCisgICAgICAgICAgICAgICAgICd3b3VsZCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICcgICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSAnCisgICAgICAgICAgICAgICAgICd0aGF0IGF0XG4nCisgICAgICAgICAgICAgICAgICcgICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCAnCisgICAgICAgICAgICAgICAgICdieSBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICcoYnV0XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgJworICAgICAgICAgICAgICAgICAnZ2V0IHRvdGFsXG4nCisgICAgICAgICAgICAgICAgICcgICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgJworICAgICAgICAgICAgICAgICAnZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSAnCisgICAgICAgICAgICAgICAgICdyZWN1cnNpb24gaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSAnCisgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCAnCisgICAgICAgICAgICAgICAgICduZWVkcywgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhICcKKyAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlIHN5bnRheFxuJworICAgICAgICAgICAgICAgICAnICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSBTcGVjaWFsIG1ldGhvZCBsb29rdXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdpcyBjYWxsZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICcKKyAgICAgICAgICAgICAgICAgJyp2YWx1ZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIGl0XG4nCisgICAgICAgICAgICAgICAgICcgICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgJworICAgICAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgJworICAgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgJworICAgICAgICAgICAgICAgICAnb2JqLm5hbWUiIGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgJ211c3QgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhICcKKyAgICAgICAgICAgICAgICAgJ2xpc3QgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICBzb3J0cyBpdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpICcKKyAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgaW4gYW5cbicKKyAgICAgICAgICAgICAgICAgIipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lcidzICIKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzICcKKyAgICAgICAgICAgICAgICAgJ3BhcmVudHMpLiAgSW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICdleGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgJ3dob3NlIG5hbWUgaXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAnICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAnCisgICAgICAgICAgICAgICAgICcqaW5zdGFuY2UqIGlzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAnCisgICAgICAgICAgICAgICAgICciTm9uZSIgd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdtZXRob2Qgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICcKKyAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiAnCisgICAgICAgICAgICAgICAgICd0aGUgb3duZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogJworICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBvd25lciBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGF0IHRoZSB0aW1lIHRoZSBvd25pbmcgY2xhc3MgKm93bmVyKiBpcyBjcmVhdGVkLiAnCisgICAgICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaXB0b3IgaGFzIGJlZW4gYXNzaWduZWQgdG8gKm5hbWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjYuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICJpbnNwZWN0IiAnCisgICAgICAgICAgICAgICAgICdtb2R1bGUgYXNcbicKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nICcKKyAgICAgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAnZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgICAgICdwb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGZvclxuJworICAgICAgICAgICAgICAgICAndW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ludm9raW5nIERlc2NyaXB0b3JzXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgJyJiaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICdiZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgJworICAgICAgICAgICAgICAgICAnbWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAnaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsIGFuZFxuJworICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiAnCisgICAgICAgICAgICAgICAgICdvYmplY3QsIGl0XG4nCisgICAgICAgICAgICAgICAgICdpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yICcKKyAgICAgICAgICAgICAgICAgJ2RlbGV0ZVxuJworICAgICAgICAgICAgICAgICAidGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgIgorICAgICAgICAgICAgICAgICAnImEueCIgaGFzIGFcbicKKyAgICAgICAgICAgICAgICAgJ2xvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbicKKyAgICAgICAgICAgICAgICAgJyJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgJworICAgICAgICAgICAgICAgICAnY2xhc3NlcyBvZlxuJworICAgICAgICAgICAgICAgICAnInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAnYmVoYXZpb3IgYW5kXG4nCisgICAgICAgICAgICAgICAgICdpbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3ByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSAnCisgICAgICAgICAgICAgICAgICdkZWZpbmVkIGFuZFxuJworICAgICAgICAgICAgICAgICAnaG93IHRoZXkgd2VyZSBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgJworICAgICAgICAgICAgICAgICAnImEueCIuIEhvd1xuJworICAgICAgICAgICAgICAgICAndGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEaXJlY3QgQ2FsbFxuJworICAgICAgICAgICAgICAgICAnICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSAnCisgICAgICAgICAgICAgICAgICdkaXJlY3RseVxuJworICAgICAgICAgICAgICAgICAnICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW5zdGFuY2UgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkICcKKyAgICAgICAgICAgICAgICAgJ2ludG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0NsYXNzIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgJworICAgICAgICAgICAgICAgICAnY2FsbDpcbicKKyAgICAgICAgICAgICAgICAgJyAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU3VwZXIgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgJworICAgICAgICAgICAgICAgICAnInN1cGVyKEIsXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSBiYXNlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzICJBIlxuJworICAgICAgICAgICAgICAgICAnICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yICcKKyAgICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yICcKKyAgICAgICAgICAgICAgICAgJ2ludm9jYXRpb24gZGVwZW5kc1xuJworICAgICAgICAgICAgICAgICAnb24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICdjYW4gZGVmaW5lXG4nCisgICAgICAgICAgICAgICAgICdhbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIi4gIElmIGl0XG4nCisgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnd2lsbCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiAnCisgICAgICAgICAgICAgICAgICdhbmQvb3JcbicKKyAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICduZWl0aGVyLCBpdCBpc1xuJworICAgICAgICAgICAgICAgICAnYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lICcKKyAgICAgICAgICAgICAgICAgJ2JvdGhcbicKKyAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSAnCisgICAgICAgICAgICAgICAgICdqdXN0IHRoZVxuJworICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX3NldF9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICciX19nZXRfXygpIlxuJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeS4gIEluXG4nCisgICAgICAgICAgICAgICAgICdjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJjbGFzc21ldGhvZCgpIikgYXJlXG4nCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgJworICAgICAgICAgICAgICAgICAnY2FuXG4nCisgICAgICAgICAgICAgICAgICdyZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIHRvXG4nCisgICAgICAgICAgICAgICAgICdhY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnc2FtZSBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgJworICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvci5cbicKKyAgICAgICAgICAgICAgICAgJ0FjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhICcKKyAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ19fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgJ3N0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gJworICAgICAgICAgICAgICAgICAnY3JlYXRpbmcgbGFyZ2VcbicKKyAgICAgICAgICAgICAgICAgJ251bWJlcnMgb2YgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLiBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZiAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAndmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvICcKKyAgICAgICAgICAgICAgICAgJ2hvbGQgYVxuJworICAgICAgICAgICAgICAgICAndmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogJworICAgICAgICAgICAgICAgICAnaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICdjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zbG90c19fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgJworICAgICAgICAgICAgICAgICAnb3Igc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmQgKl9fd2Vha3JlZl9fKiBmb3IgJworICAgICAgICAgICAgICAgICAnZWFjaFxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgJ35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgJworICAgICAgICAgICAgICAgICAnKl9fZGljdF9fKlxuJworICAgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyBhICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlICcKKyAgICAgICAgICAgICAgICAgJ2Fzc2lnbmVkIG5ld1xuJworICAgICAgICAgICAgICAgICAnICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAgICAgJ0F0dGVtcHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICcgIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAnCisgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiLiBJZlxuJworICAgICAgICAgICAgICAgICAnICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuJworICAgICAgICAgICAgICAgICAnICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVjbGFyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZXMuIElmIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZFxuJworICAgICAgICAgICAgICAgICAnICAiXCdfX3dlYWtyZWZfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVjbGFyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSAnCisgICAgICAgICAgICAgICAgICdjcmVhdGluZ1xuJworICAgICAgICAgICAgICAgICAnICBkZXNjcmlwdG9ycyAoSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKSBmb3IgZWFjaCB2YXJpYWJsZSAnCisgICAgICAgICAgICAgICAgICduYW1lLiAgQXMgYVxuJworICAgICAgICAgICAgICAgICAnICByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAndmFsdWVzIGZvclxuJworICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgJworICAgICAgICAgICAgICAgICAnKl9fZGljdF9fKlxuJworICAgICAgICAgICAgICAgICAnICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5ICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW4gbmFtZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzICcKKyAgICAgICAgICAgICAgICAgJ2luYWNjZXNzaWJsZVxuJworICAgICAgICAgICAgICAgICAnICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzcykuXG4nCisgICAgICAgICAgICAgICAgICcgIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgJworICAgICAgICAgICAgICAgICAnZnV0dXJlLCBhXG4nCisgICAgICAgICAgICAgICAgICcgIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkICcKKyAgICAgICAgICAgICAgICAgJ2Zyb21cbicKKyAgICAgICAgICAgICAgICAgJyAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgImJ5dGVzIiAnCisgICAgICAgICAgICAgICAgICdhbmQgInR1cGxlIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouICcKKyAgICAgICAgICAgICAgICAgJ01hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICcgIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyAnCisgICAgICAgICAgICAgICAgICdtYXkgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgJworICAgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgICAnICAqX19zbG90c19fKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvblxuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnV2hlbmV2ZXIgYSBjbGFzcyBpbmhlcml0cyBmcm9tIGFub3RoZXIgY2xhc3MsICcKKyAgICAgICAgICAgICAgICAgJypfX2luaXRfc3ViY2xhc3NfXyogaXNcbicKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCBvbiB0aGF0IGNsYXNzLiBUaGlzIHdheSwgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NlcyB3aGljaFxuJworICAgICAgICAgICAgICAgICAnY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBzdWJjbGFzc2VzLiBUaGlzIGlzIGNsb3NlbHkgcmVsYXRlZCAnCisgICAgICAgICAgICAgICAgICd0byBjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVjb3JhdG9ycywgYnV0IHdoZXJlIGNsYXNzIGRlY29yYXRvcnMgb25seSBhZmZlY3QgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmljIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICd0aGV5XCdyZSBhcHBsaWVkIHRvLCAiX19pbml0X3N1YmNsYXNzX18iIHNvbGVseSBhcHBsaWVzIHRvICcKKyAgICAgICAgICAgICAgICAgJ2Z1dHVyZVxuJworICAgICAgICAgICAgICAgICAnc3ViY2xhc3NlcyBvZiB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3NtZXRob2Qgb2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fKGNscylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb250YWluaW5nIGNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3N1YmNsYXNzZWQuXG4nCisgICAgICAgICAgICAgICAgICcgICAqY2xzKiBpcyB0aGVuIHRoZSBuZXcgc3ViY2xhc3MuIElmIGRlZmluZWQgYXMgYSBub3JtYWwgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgdGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICdtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEtleXdvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBnaXZlbiB0byBhIG5ldyBjbGFzcyBhcmUgJworICAgICAgICAgICAgICAgICAncGFzc2VkIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgcGFyZW50XCdzIGNsYXNzICJfX2luaXRfc3ViY2xhc3NfXyIuIEZvciBjb21wYXRpYmlsaXR5ICcKKyAgICAgICAgICAgICAgICAgJ3dpdGggb3RoZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzZXMgdXNpbmcgIl9faW5pdF9zdWJjbGFzc19fIiwgb25lIHNob3VsZCB0YWtlIG91dCAnCisgICAgICAgICAgICAgICAgICd0aGUgbmVlZGVkXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgcGFzcyB0aGUgb3RoZXJzIG92ZXIgdG8gdGhlIGJhc2UgJworICAgICAgICAgICAgICAgICAnY2xhc3MsIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICBpbjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgY2xhc3MgUGhpbG9zb3BoZXI6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgZGVmYXVsdF9uYW1lLCAnCisgICAgICAgICAgICAgICAgICcqKmt3YXJncyk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHN1cGVyKCkuX19pbml0X3N1YmNsYXNzX18oKiprd2FyZ3MpXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIGNscy5kZWZhdWx0X25hbWUgPSBkZWZhdWx0X25hbWVcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgY2xhc3MgQXVzdHJhbGlhblBoaWxvc29waGVyKFBoaWxvc29waGVyLCAnCisgICAgICAgICAgICAgICAgICdkZWZhdWx0X25hbWU9IkJydWNlIik6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAib2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fIiAnCisgICAgICAgICAgICAgICAgICdkb2VzIG5vdGhpbmcsXG4nCisgICAgICAgICAgICAgICAgICcgICBidXQgcmFpc2VzIGFuIGVycm9yIGlmIGl0IGlzIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSBtZXRhY2xhc3MgaGludCAibWV0YWNsYXNzIiBpcyBjb25zdW1lZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAncmVzdCBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICB0aGUgdHlwZSBtYWNoaW5lcnksIGFuZCBpcyBuZXZlciBwYXNzZWQgdG8gJworICAgICAgICAgICAgICAgICAnIl9faW5pdF9zdWJjbGFzc19fIlxuJworICAgICAgICAgICAgICAgICAnICAgICBpbXBsZW1lbnRhdGlvbnMuIFRoZSBhY3R1YWwgbWV0YWNsYXNzIChyYXRoZXIgdGhhbiB0aGUgJworICAgICAgICAgICAgICAgICAnZXhwbGljaXRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaGludCkgY2FuIGJlIGFjY2Vzc2VkIGFzICJ0eXBlKGNscykiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjYuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTWV0YWNsYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQsIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nICJ0eXBlKCkiLiBUaGUgJworICAgICAgICAgICAgICAgICAnY2xhc3MgYm9keSBpc1xuJworICAgICAgICAgICAgICAgICAnZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCAnCisgICAgICAgICAgICAgICAgICdsb2NhbGx5IHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAncmVzdWx0IG9mICJ0eXBlKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWlzZWQgYnkgcGFzc2luZyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJtZXRhY2xhc3MiIGtleXdvcmQgYXJndW1lbnQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gbGluZSwgJworICAgICAgICAgICAgICAgICAnb3IgYnlcbicKKyAgICAgICAgICAgICAgICAgJ2luaGVyaXRpbmcgZnJvbSBhbiBleGlzdGluZyBjbGFzcyB0aGF0IGluY2x1ZGVkIHN1Y2ggYW4gJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQuIEluXG4nCisgICAgICAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlc1xuJworICAgICAgICAgICAgICAgICAnb2YgIk1ldGEiOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBNZXRhKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICAgICAnYXJlIHBhc3NlZCB0aHJvdWdoIHRvIGFsbCBtZXRhY2xhc3Mgb3BlcmF0aW9ucyBkZXNjcmliZWQgJworICAgICAgICAgICAgICAgICAnYmVsb3cuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzICcKKyAgICAgICAgICAgICAgICAgJ29jY3VyOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBjbGFzcyBuYW1lc3BhY2UgaXMgcHJlcGFyZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBmb3IgYSBjbGFzcyBkZWZpbml0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAgJ2RldGVybWluZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogaWYgbm8gYmFzZXMgYW5kIG5vIGV4cGxpY2l0IG1ldGFjbGFzcyBhcmUgZ2l2ZW4sIHRoZW4gJworICAgICAgICAgICAgICAgICAnInR5cGUoKSIgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgdXNlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIGFuIGV4cGxpY2l0IG1ldGFjbGFzcyBpcyBnaXZlbiBhbmQgaXQgaXMgKm5vdCogYW4gJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2Ugb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgInR5cGUoKSIsIHRoZW4gaXQgaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgbWV0YWNsYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogaWYgYW4gaW5zdGFuY2Ugb2YgInR5cGUoKSIgaXMgZ2l2ZW4gYXMgdGhlIGV4cGxpY2l0ICcKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzcywgb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgYmFzZXMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgJworICAgICAgICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBzZWxlY3RlZCBmcm9tIHRoZSBleHBsaWNpdGx5ICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZFxuJworICAgICAgICAgICAgICAgICAnbWV0YWNsYXNzIChpZiBhbnkpIGFuZCB0aGUgbWV0YWNsYXNzZXMgKGkuZS4gInR5cGUoY2xzKSIpIG9mICcKKyAgICAgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGJhc2UgY2xhc3Nlcy4gVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgb25lICcKKyAgICAgICAgICAgICAgICAgJ3doaWNoIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJ3N1YnR5cGUgb2YgKmFsbCogb2YgdGhlc2UgY2FuZGlkYXRlIG1ldGFjbGFzc2VzLiBJZiBub25lIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnY2FuZGlkYXRlIG1ldGFjbGFzc2VzIG1lZXRzIHRoYXQgY3JpdGVyaW9uLCB0aGVuIHRoZSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uXG4nCisgICAgICAgICAgICAgICAgICd3aWxsIGZhaWwgd2l0aCAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdQcmVwYXJpbmcgdGhlIGNsYXNzIG5hbWVzcGFjZVxuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnT25jZSB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGhhcyBiZWVuIGlkZW50aWZpZWQsIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UgaXMgcHJlcGFyZWQuIElmIHRoZSBtZXRhY2xhc3MgaGFzIGEgIl9fcHJlcGFyZV9fIiAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsXG4nCisgICAgICAgICAgICAgICAgICdpdCBpcyBjYWxsZWQgYXMgIm5hbWVzcGFjZSA9IG1ldGFjbGFzcy5fX3ByZXBhcmVfXyhuYW1lLCAnCisgICAgICAgICAgICAgICAgICdiYXNlcyxcbicKKyAgICAgICAgICAgICAgICAgJyoqa3dkcykiICh3aGVyZSB0aGUgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgaWYgYW55LCAnCisgICAgICAgICAgICAgICAgICdjb21lIGZyb21cbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzcyBkZWZpbml0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSWYgdGhlIG1ldGFjbGFzcyBoYXMgbm8gIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UgaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgImRpY3QoKSIgaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzMDAwXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEludHJvZHVjZWQgdGhlICJfX3ByZXBhcmVfXyIgbmFtZXNwYWNlIGhvb2tcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFeGVjdXRpbmcgdGhlIGNsYXNzIGJvZHlcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZCAoYXBwcm94aW1hdGVseSkgYXMgImV4ZWMoYm9keSwgJworICAgICAgICAgICAgICAgICAnZ2xvYmFscygpLFxuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlKSIuIFRoZSBrZXkgZGlmZmVyZW5jZSBmcm9tIGEgbm9ybWFsIGNhbGwgdG8gJworICAgICAgICAgICAgICAgICAnImV4ZWMoKSIgaXMgdGhhdFxuJworICAgICAgICAgICAgICAgICAnbGV4aWNhbCBzY29waW5nIGFsbG93cyB0aGUgY2xhc3MgYm9keSAoaW5jbHVkaW5nIGFueSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzKSB0b1xuJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIG5hbWVzIGZyb20gdGhlIGN1cnJlbnQgYW5kIG91dGVyIHNjb3BlcyB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIGEgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hvd2V2ZXIsIGV2ZW4gd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIHRoZSAnCisgICAgICAgICAgICAgICAgICdmdW5jdGlvbixcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgZGVmaW5lZCBpbnNpZGUgdGhlIGNsYXNzIHN0aWxsIGNhbm5vdCBzZWUgbmFtZXMgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIHNjb3BlLiBDbGFzcyB2YXJpYWJsZXMgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICAgICAncGFyYW1ldGVyIG9mIGluc3RhbmNlIG9yIGNsYXNzIG1ldGhvZHMsIGFuZCBjYW5ub3QgYmUgJworICAgICAgICAgICAgICAgICAnYWNjZXNzZWQgYXQgYWxsXG4nCisgICAgICAgICAgICAgICAgICdmcm9tIHN0YXRpYyBtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0NyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnT25jZSB0aGUgY2xhc3MgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBleGVjdXRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdib2R5LCB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICcibWV0YWNsYXNzKG5hbWUsIGJhc2VzLFxuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlLCAqKmt3ZHMpIiAodGhlIGFkZGl0aW9uYWwga2V5d29yZHMgcGFzc2VkIGhlcmUgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICdhcyB0aG9zZSBwYXNzZWQgdG8gIl9fcHJlcGFyZV9fIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoaXMgY2xhc3Mgb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3plcm8tXG4nCisgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmb3JtIG9mICJzdXBlcigpIi4gIl9fY2xhc3NfXyIgaXMgYW4gaW1wbGljaXQgJworICAgICAgICAgICAgICAgICAnY2xvc3VyZVxuJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGlmIGFueSBtZXRob2RzIGluIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnYm9keSByZWZlclxuJworICAgICAgICAgICAgICAgICAndG8gZWl0aGVyICJfX2NsYXNzX18iIG9yICJzdXBlciIuIFRoaXMgYWxsb3dzIHRoZSB6ZXJvICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZvcm1cbicKKyAgICAgICAgICAgICAgICAgJ29mICJzdXBlcigpIiB0byBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAnYmFzZWQgb25cbicKKyAgICAgICAgICAgICAgICAgJ2xleGljYWwgc2NvcGluZywgd2hpbGUgdGhlIGNsYXNzIG9yIGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgJworICAgICAgICAgICAgICAgICAndG8gbWFrZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2N1cnJlbnQgY2FsbCBpcyBpZGVudGlmaWVkIGJhc2VkIG9uIHRoZSBmaXJzdCBhcmd1bWVudCAnCisgICAgICAgICAgICAgICAgICdwYXNzZWQgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICdtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FmdGVyIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVjb3JhdG9ycyBpbmNsdWRlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAoaWYgYW55KSBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Jlc3VsdGluZ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0IGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgdGhlIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAnY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gYSBuZXcgY2xhc3MgaXMgY3JlYXRlZCBieSAidHlwZS5fX25ld19fIiwgdGhlIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlZCBhc1xuJworICAgICAgICAgICAgICAgICAndGhlIG5hbWVzcGFjZSBwYXJhbWV0ZXIgaXMgY29waWVkIHRvIGEgc3RhbmRhcmQgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgYW5kXG4nCisgICAgICAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgb2JqZWN0IGlzIGRpc2NhcmRlZC4gVGhlIG5ldyBjb3B5IGJlY29tZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJfX2RpY3RfXyJcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzMTM1KiogLSBOZXcgc3VwZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRGVzY3JpYmVzIHRoZSBpbXBsaWNpdCAiX19jbGFzc19fIiBjbG9zdXJlIHJlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ01ldGFjbGFzcyBleGFtcGxlXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgJworICAgICAgICAgICAgICAgICAndGhhdCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICdiZWVuIGV4cGxvcmVkIGluY2x1ZGUgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCAnCisgICAgICAgICAgICAgICAgICdhdXRvbWF0aWNcbicKKyAgICAgICAgICAgICAgICAgJ2RlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgJworICAgICAgICAgICAgICAgICAnZnJhbWV3b3JrcywgYW5kXG4nCisgICAgICAgICAgICAgICAgICdhdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIG1ldGFjbGFzcyB0aGF0IHVzZXMgYW5cbicKKyAgICAgICAgICAgICAgICAgJyJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIgdG8gcmVtZW1iZXIgdGhlIG9yZGVyIHRoYXQgY2xhc3MgJworICAgICAgICAgICAgICAgICAndmFyaWFibGVzXG4nCisgICAgICAgICAgICAgICAgICdhcmUgZGVmaW5lZDpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgT3JkZXJlZENsYXNzKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgQGNsYXNzbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIF9fcHJlcGFyZV9fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCAqKmt3ZHMpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlLCAqKmt3ZHMpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXN1bHQgPSB0eXBlLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgJworICAgICAgICAgICAgICAgICAnZGljdChuYW1lc3BhY2UpKVxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXN1bHQubWVtYmVycyA9IHR1cGxlKG5hbWVzcGFjZSlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBBKG1ldGFjbGFzcz1PcmRlcmVkQ2xhc3MpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBvbmUoc2VsZik6IHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBkZWYgdHdvKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIHRocmVlKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIGZvdXIoc2VsZik6IHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IEEubWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAiICAgKCdfX21vZHVsZV9fJywgJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yICpBKiBnZXRzIGV4ZWN1dGVkLCB0aGUgcHJvY2VzcyAnCisgICAgICAgICAgICAgICAgICdiZWdpbnNcbicKKyAgICAgICAgICAgICAgICAgJ3dpdGggY2FsbGluZyB0aGUgbWV0YWNsYXNzXCdzICJfX3ByZXBhcmVfXygpIiBtZXRob2Qgd2hpY2ggJworICAgICAgICAgICAgICAgICAncmV0dXJucyBhblxuJworICAgICAgICAgICAgICAgICAnZW1wdHkgImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0Ii4gIFRoYXQgbWFwcGluZyByZWNvcmRzIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGFuZFxuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcyBvZiAqQSogYXMgdGhleSBhcmUgZGVmaW5lZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdzdGF0ZW1lbnQuIE9uY2UgdGhvc2UgZGVmaW5pdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgb3JkZXJlZCAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICdpcyBmdWxseSBwb3B1bGF0ZWQgYW5kIHRoZSBtZXRhY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kICcKKyAgICAgICAgICAgICAgICAgJ2dldHNcbicKKyAgICAgICAgICAgICAgICAgJ2ludm9rZWQuICBUaGF0IG1ldGhvZCBidWlsZHMgdGhlIG5ldyB0eXBlIGFuZCBpdCBzYXZlcyB0aGUgJworICAgICAgICAgICAgICAgICAnb3JkZXJlZFxuJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSBrZXlzIGluIGFuIGF0dHJpYnV0ZSBjYWxsZWQgIm1lbWJlcnMiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0N1c3RvbWl6aW5nIGluc3RhbmNlIGFuZCBzdWJjbGFzcyBjaGVja3NcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAnImlzaW5zdGFuY2UoKSIgYW5kICJpc3N1YmNsYXNzKCkiIGJ1aWx0LWluIGZ1bmN0aW9ucy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyAiYWJjLkFCQ01ldGEiIGltcGxlbWVudHMgdGhlc2UgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBpblxuJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgJworICAgICAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAgICAgJyJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyAnCisgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAndHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0ICcKKyAgICAgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgICAgICcgICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAnICAgImlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCAnCisgICAgICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAiaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICcobWV0YWNsYXNzKSBvZiBhXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy4gIFRoZXkgY2Fubm90IGJlIGRlZmluZWQgYXMgY2xhc3MgbWV0aG9kcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnYWN0dWFsIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAnVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdhcmUgY2FsbGVkXG4nCisgICAgICAgICAgICAgICAgICdvbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyAnCisgICAgICAgICAgICAgICAgICciaXNpbnN0YW5jZSgpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgJworICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX3N1YmNsYXNzY2hlY2tfXygpIiwgd2l0aCBtb3RpdmF0aW9uIGZvciB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uYWxpdHkgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSAnCisgICAgICAgICAgICAgICAgICciYWJjIlxuJworICAgICAgICAgICAgICAgICAnICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmICcKKyAgICAgICAgICAgICAgICAgJ3RoaXMgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ0NvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgJworICAgICAgICAgICAgICAgICAnb3IgbWFwcGluZ3NcbicKKyAgICAgICAgICAgICAgICAgJyhsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgJworICAgICAgICAgICAgICAgICAnd2VsbC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAnZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICdlbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICdhbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayAnCisgICAgICAgICAgICAgICAgICc8IE4iIHdoZXJlXG4nCisgICAgICAgICAgICAgICAgICcqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZSBhXG4nCisgICAgICAgICAgICAgICAgICdyYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlIHRoZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAnCisgICAgICAgICAgICAgICAgICciY2xlYXIoKSIsXG4nCisgICAgICAgICAgICAgICAgICcic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgJworICAgICAgICAgICAgICAgICAnInVwZGF0ZSgpIlxuJworICAgICAgICAgICAgICAgICAiYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSAiCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiAnCisgICAgICAgICAgICAgICAgICdhYnN0cmFjdCBiYXNlXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAnCisgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICciX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICAgICAnc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgJworICAgICAgICAgICAgICAgICAnImV4dGVuZCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgJworICAgICAgICAgICAgICAgICAnbGlrZSBQeXRob25cbicKKyAgICAgICAgICAgICAgICAgJ3N0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJ2FkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAnCisgICAgICAgICAgICAgICAgICcobWVhbmluZ1xuJworICAgICAgICAgICAgICAgICAncmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICcKKyAgICAgICAgICAgICAgICAgJyJfX3JhZGRfXygpIixcbicKKyAgICAgICAgICAgICAgICAgJyJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaWJlZFxuJworICAgICAgICAgICAgICAgICAnYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0ICcKKyAgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4nCisgICAgICAgICAgICAgICAgICciX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdG9yO1xuJworICAgICAgICAgICAgICAgICAnZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcywgaXRcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCAnCisgICAgICAgICAgICAgICAgICd0aGF0IGJvdGhcbicKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvICcKKyAgICAgICAgICAgICAgICAgJ2FsbG93XG4nCisgICAgICAgICAgICAgICAgICdlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAnCisgICAgICAgICAgICAgICAgICciX19pdGVyX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlIHZhbHVlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gICcKKyAgICAgICAgICAgICAgICAgJ1Nob3VsZCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgJworICAgICAgICAgICAgICAgICAnIl9fbGVuX18oKSIgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gJworICAgICAgICAgICAgICAgICAnY29udGV4dC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkICcKKyAgICAgICAgICAgICAgICAgJ3JldHVybiBhblxuJworICAgICAgICAgICAgICAgICAnICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgJworICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gJworICAgICAgICAgICAgICAgICAnVGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgY29ycmVjdG5lc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnICBBIGNhbGwgbGlrZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFbMToyXSA9IGJcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiAnCisgICAgICAgICAgICAgICAgICd3aXRoICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgJworICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgdHlwZXMsXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICAnCisgICAgICAgICAgICAgICAgICdOb3RlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyB3aXNoZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZC4gSWZcbicKKyAgICAgICAgICAgICAgICAgJyAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZDsgaWYgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICcoYWZ0ZXIgYW55XG4nCisgICAgICAgICAgICAgICAgICcgICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiAnCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAncmFpc2VkIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iICcKKyAgICAgICAgICAgICAgICAgJ2ZvciBkaWN0XG4nCisgICAgICAgICAgICAgICAgICcgICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSAnCisgICAgICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgJworICAgICAgICAgICAgICAgICAnbmV3IGtleXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgJworICAgICAgICAgICAgICAgICAncmVwbGFjZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSAnCisgICAgICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiAnCisgICAgICAgICAgICAgICAgICdlbGVtZW50c1xuJworICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZVxuJworICAgICAgICAgICAgICAgICAnICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pdGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgJworICAgICAgICAgICAgICAgICAnY29udGFpbmVyLlxuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gJworICAgICAgICAgICAgICAgICAnaXRlcmF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgJworICAgICAgICAgICAgICAgICAnc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5ICcKKyAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnCisgICAgICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0cywgc2VlIEl0ZXJhdG9yIFR5cGVzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgJworICAgICAgICAgICAgICAgICAnInJldmVyc2VkKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgJworICAgICAgICAgICAgICAgICAnKCJfX2xlbl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICdwcm90b2NvbFxuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgJworICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lICcKKyAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICAicmV2ZXJzZWQoKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlICcKKyAgICAgICAgICAgICAgICAgJ25vcm1hbGx5XG4nCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgJworICAgICAgICAgICAgICAgICAnY29udGFpbmVyXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSAnCisgICAgICAgICAgICAgICAgICdlZmZpY2llbnRcbicKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICdyZXR1cm4gdHJ1ZVxuJworICAgICAgICAgICAgICAgICAnICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cywgdGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBrZXktaXRlbSBwYWlycy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZW1iZXJzaGlwIHRlc3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgJworICAgICAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgdGhpcyBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBudW1lcmljIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkICcKKyAgICAgICAgICAgICAgICAgJ2J5IHRoZVxuJworICAgICAgICAgICAgICAgICAncGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRpb25zIGZvclxuJworICAgICAgICAgICAgICAgICAnbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKS4gIEZvciBpbnN0YW5jZSwgJworICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvICcKKyAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19mbG9vcmRpdl9fKCkiIGFuZCAiX19tb2RfXygpIjsgaXQgc2hvdWxkIG5vdCBiZSAnCisgICAgICAgICAgICAgICAgICdyZWxhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAndG8gYWNjZXB0XG4nCisgICAgICAgICAgICAgICAgICcgICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAnICAgInBvdygpIiBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuICJOb3RJbXBsZW1lbnRlZCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgJworICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgJworICAgICAgICAgICAgICAgICAnImRpdm1vZCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpIHdpdGggcmVmbGVjdGVkICcKKyAgICAgICAgICAgICAgICAgJyhzd2FwcGVkKVxuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0ICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhbmQgZG9lc1xuJworICAgICAgICAgICAgICAgICAnICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICAgICAgICAnYXJlIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IC1cbicKKyAgICAgICAgICAgICAgICAgJyAgIHkiLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiAnCisgICAgICAgICAgICAgICAgICciX19yc3ViX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiAnCisgICAgICAgICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgICAgICAgICcgICAqTm90SW1wbGVtZW50ZWQqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICcKKyAgICAgICAgICAgICAgICAgJyJfX3Jwb3dfXygpIiAodGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmQncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgJ2xlZnRcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCAiCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICd0aGUgbGVmdFxuJworICAgICAgICAgICAgICAgICAiICAgICBvcGVyYW5kJ3Mgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyAiCisgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICIgICAgIHRvIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy5cbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgJworICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAnCisgICAgICAgICAgICAgICAgICciKio9IixcbicKKyAgICAgICAgICAgICAgICAgJyAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdhdHRlbXB0IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ3RoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgJyAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmljXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyAnCisgICAgICAgICAgICAgICAgICdiYWNrIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggJworICAgICAgICAgICAgICAgICAnPVxuJworICAgICAgICAgICAgICAgICAnICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAnCisgICAgICAgICAgICAgICAgICcieS5fX3JhZGRfXyh4KSIgYXJlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluICcKKyAgICAgICAgICAgICAgICAgJ2NlcnRhaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCAnCisgICAgICAgICAgICAgICAgICdlcnJvcnNcbicKKyAgICAgICAgICAgICAgICAgIiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbJ2l0ZW0nXSByYWlzZSBhbiBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAnd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFkZGl0aW9uIHdvcmtzPyksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiAnCisgICAgICAgICAgICAgICAgICd0aGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAnICAgbW9kZWwuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lZ19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3NfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWJzX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludmVydF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAnCisgICAgICAgICAgICAgICAgICciKyIsXG4nCisgICAgICAgICAgICAgICAgICcgICAiYWJzKCkiIGFuZCAifiIpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb21wbGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9hdF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAnCisgICAgICAgICAgICAgICAgICciaW50KCkiLFxuJworICAgICAgICAgICAgICAgICAnICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICB0eXBlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbmRleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgJworICAgICAgICAgICAgICAgICAnUHl0aG9uIG5lZWRzXG4nCisgICAgICAgICAgICAgICAgICcgICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgJworICAgICAgICAgICAgICAgICAnb2JqZWN0IChzdWNoXG4nCisgICAgICAgICAgICAgICAgICcgICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIm9jdCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ251bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCAnCisgICAgICAgICAgICAgICAgICd3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSAnCisgICAgICAgICAgICAgICAgICdkZWZpbmVkLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1dpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgdG9cbicKKyAgICAgICAgICAgICAgICAgJ2JlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgbWFuYWdlclxuJworICAgICAgICAgICAgICAgICAnaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkICcKKyAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dFxuJworICAgICAgICAgICAgICAgICAnZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAnaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1R5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICdyZXN0b3JpbmcgdmFyaW91c1xuJworICAgICAgICAgICAgICAgICAna2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCAnCisgICAgICAgICAgICAgICAgICdjbG9zaW5nIG9wZW5lZFxuJworICAgICAgICAgICAgICAgICAnZmlsZXMsIGV0Yy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgJworICAgICAgICAgICAgICAgICAnTWFuYWdlciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAnCisgICAgICAgICAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgIiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2QncyByZXR1cm4gdmFsdWUgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgJ3RhcmdldChzKVxuJworICAgICAgICAgICAgICAgICAnICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAncGFyYW1ldGVyc1xuJworICAgICAgICAgICAgICAgICAnICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSAnCisgICAgICAgICAgICAgICAgICdleGl0ZWQuIElmIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgJworICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHdpbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJlICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAnc3VwcHJlc3MgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgJworICAgICAgICAgICAgICAgICAnc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICdwcm9jZXNzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSAnCisgICAgICAgICAgICAgICAgICdwYXNzZWQtaW5cbicKKyAgICAgICAgICAgICAgICAgIiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvbiAid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NwZWNpYWwgbWV0aG9kIGxvb2t1cFxuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBjdXN0b20gY2xhc3NlcywgaW1wbGljaXQgaW52b2NhdGlvbnMgb2Ygc3BlY2lhbCBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBvbmx5XG4nCisgICAgICAgICAgICAgICAgICJndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN0J3MgdHlwZSwgIgorICAgICAgICAgICAgICAgICAnbm90IGluXG4nCisgICAgICAgICAgICAgICAgICJ0aGUgb2JqZWN0J3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSAiCisgICAgICAgICAgICAgICAgICdyZWFzb24gd2h5XG4nCisgICAgICAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIEM6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSBDKClcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjLl9fbGVuX18gPSBsYW1iZGE6IDVcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsZW4oYylcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIFR5cGVFcnJvcjogb2JqZWN0IG9mIHR5cGUgJ0MnIGhhcyBubyBsZW4oKVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2YgJworICAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBzdWNoIGFzICJfX2hhc2hfXygpIiBhbmQgIl9fcmVwcl9fKCkiIHRoYXQgYXJlICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGJ5XG4nCisgICAgICAgICAgICAgICAgICdhbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVzZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyB1c2VkIHRoZSBjb252ZW50aW9uYWwgbG9va3VwIHByb2Nlc3MsIHRoZXkgd291bGQgJworICAgICAgICAgICAgICAgICAnZmFpbCB3aGVuXG4nCisgICAgICAgICAgICAgICAgICdpbnZva2VkIG9uIHRoZSB0eXBlIG9iamVjdCBpdHNlbGY6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAxIC5fX2hhc2hfXygpID09IGhhc2goMSlcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludClcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciAnX19oYXNoX18nIG9mICdpbnQnIG9iamVjdCBuZWVkcyBhbiAiCisgICAgICAgICAgICAgICAgICdhcmd1bWVudFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGluIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgIndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgJ21ldGFjbGFzcyBjb25mdXNpb24nLCBhbmQgIgorICAgICAgICAgICAgICAgICAnaXMgYXZvaWRlZFxuJworICAgICAgICAgICAgICAgICAnYnkgYnlwYXNzaW5nIHRoZSBpbnN0YW5jZSB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZSgxKS5fX2hhc2hfXygxKSA9PSBoYXNoKDEpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZShpbnQpLl9faGFzaF9fKGludCkgPT0gaGFzaChpbnQpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luIGFkZGl0aW9uIHRvIGJ5cGFzc2luZyBhbnkgaW5zdGFuY2UgYXR0cmlidXRlcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJlc3Qgb2ZcbicKKyAgICAgICAgICAgICAgICAgJ2NvcnJlY3RuZXNzLCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgZ2VuZXJhbGx5IGFsc28gJworICAgICAgICAgICAgICAgICAnYnlwYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzICcKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzczpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHByaW50KCJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHByaW50KCJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjID0gQygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5fX2xlbl9fKCkgICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAnICAgQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZShjKS5fX2xlbl9fKGMpICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSAnCisgICAgICAgICAgICAgICAgICd0eXBlXG4nCisgICAgICAgICAgICAgICAgICcgICBNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGVuKGMpICAgICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXQgbG9va3VwXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeXBhc3NpbmcgdGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb24gJworICAgICAgICAgICAgICAgICAncHJvdmlkZXNcbicKKyAgICAgICAgICAgICAgICAgJ3NpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0ZXIsIGF0XG4nCisgICAgICAgICAgICAgICAgICd0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgKHRoZVxuJworICAgICAgICAgICAgICAgICAnc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0IGl0c2VsZiBpbiAnCisgICAgICAgICAgICAgICAgICdvcmRlciB0byBiZVxuJworICAgICAgICAgICAgICAgICAnY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cbicsCisgJ3N0cmluZy1tZXRob2RzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICdTdHJpbmcgTWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5ncyBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tb24gc2VxdWVuY2Ugb3BlcmF0aW9ucywgJworICAgICAgICAgICAgICAgICAgICdhbG9uZyB3aXRoXG4nCisgICAgICAgICAgICAgICAgICAgJ3RoZSBhZGRpdGlvbmFsIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5ncyBhbHNvIHN1cHBvcnQgdHdvIHN0eWxlcyBvZiBzdHJpbmcgZm9ybWF0dGluZywgb25lICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkaW5nIGFcbicKKyAgICAgICAgICAgICAgICAgICAnbGFyZ2UgZGVncmVlIG9mIGZsZXhpYmlsaXR5IGFuZCBjdXN0b21pemF0aW9uIChzZWUgJworICAgICAgICAgICAgICAgICAgICcic3RyLmZvcm1hdCgpIixcbicKKyAgICAgICAgICAgICAgICAgICAnRm9ybWF0IFN0cmluZyBTeW50YXggYW5kIEN1c3RvbSBTdHJpbmcgRm9ybWF0dGluZykgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ290aGVyIGJhc2VkXG4nCisgICAgICAgICAgICAgICAgICAgJ29uIEMgInByaW50ZiIgc3R5bGUgZm9ybWF0dGluZyB0aGF0IGhhbmRsZXMgYSBuYXJyb3dlciAnCisgICAgICAgICAgICAgICAgICAgJ3JhbmdlIG9mIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAgJ2FuZCBpcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuICcKKyAgICAgICAgICAgICAgICAgICAnZmFzdGVyIGZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnY2FzZXMgaXQgY2FuIGhhbmRsZSAocHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSBUZXh0IFByb2Nlc3NpbmcgU2VydmljZXMgc2VjdGlvbiBvZiB0aGUgc3RhbmRhcmQgJworICAgICAgICAgICAgICAgICAgICdsaWJyYXJ5IGNvdmVycyBhXG4nCisgICAgICAgICAgICAgICAgICAgJ251bWJlciBvZiBvdGhlciBtb2R1bGVzIHRoYXQgcHJvdmlkZSB2YXJpb3VzIHRleHQgcmVsYXRlZCAnCisgICAgICAgICAgICAgICAgICAgJ3V0aWxpdGllc1xuJworICAgICAgICAgICAgICAgICAgICcoaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiICcKKyAgICAgICAgICAgICAgICAgICAnbW9kdWxlKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jYXBpdGFsaXplKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdjYXBpdGFsaXplZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jYXNlZm9sZCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjYXNlZm9sZGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gQ2FzZWZvbGRlZCAnCisgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MgbWF5IGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVzZWQgZm9yIGNhc2VsZXNzIG1hdGNoaW5nLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSAnCisgICAgICAgICAgICAgICAgICAgJ2FnZ3Jlc3NpdmUgYmVjYXVzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBpdCBpcyBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGNhc2UgZGlzdGluY3Rpb25zIGluIGEgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmcuIEZvclxuJworICAgICAgICAgICAgICAgICAgICcgICBleGFtcGxlLCB0aGUgR2VybWFuIGxvd2VyY2FzZSBsZXR0ZXIgIlwnw59cJyIgaXMgJworICAgICAgICAgICAgICAgICAgICdlcXVpdmFsZW50IHRvICIic3MiIi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2luY2UgaXQgaXMgYWxyZWFkeSBsb3dlcmNhc2UsICJsb3dlcigpIiB3b3VsZCBkbyAnCisgICAgICAgICAgICAgICAgICAgJ25vdGhpbmcgdG8gIlwnw59cJyI7XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgY2FzZWZvbGRpbmcgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgJworICAgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgJworICAgICAgICAgICAgICAgICAgICdpcyBkb25lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSAnCisgICAgICAgICAgICAgICAgICAgJ3NwYWNlKS4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciAnCisgICAgICAgICAgICAgICAgICAgJ2VxdWFsIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgKnN1YipcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgJworICAgICAgICAgICAgICAgICAgICcqc3RhcnQqIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZW5jb2RlKGVuY29kaW5nPSJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBhIGJ5dGVzICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0LiBEZWZhdWx0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVuY29kaW5nIGlzICJcJ3V0Zi04XCciLiAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgJworICAgICAgICAgICAgICAgICAgICdkaWZmZXJlbnRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXMgJworICAgICAgICAgICAgICAgICAgICciXCdzdHJpY3RcJyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYSAiVW5pY29kZUVycm9yIi4gJworICAgICAgICAgICAgICAgICAgICdPdGhlciBwb3NzaWJsZVxuJworICAgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYXJlICJcJ2lnbm9yZVwnIiwgIlwncmVwbGFjZVwnIiwgJworICAgICAgICAgICAgICAgICAgICciXCd4bWxjaGFycmVmcmVwbGFjZVwnIixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIlwnYmFja3NsYXNocmVwbGFjZVwnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCAnCisgICAgICAgICAgICAgICAgICAgJ3ZpYVxuJworICAgICAgICAgICAgICAgICAgICcgICAiY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCkiLCBzZWUgc2VjdGlvbiBFcnJvciBIYW5kbGVycy4gJworICAgICAgICAgICAgICAgICAgICdGb3IgYSBsaXN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9mIHBvc3NpYmxlIGVuY29kaW5ncywgc2VlIHNlY3Rpb24gU3RhbmRhcmQgRW5jb2RpbmdzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgJworICAgICAgICAgICAgICAgICAgICdhZGRlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICcKKyAgICAgICAgICAgICAgICAgICAnKnN1ZmZpeCosXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG90aGVyd2lzZSByZXR1cm4gIkZhbHNlIi4gICpzdWZmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgJworICAgICAgICAgICAgICAgICAgICdvZiBzdWZmaXhlc1xuJworICAgICAgICAgICAgICAgICAgICcgICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgJworICAgICAgICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmV4cGFuZHRhYnModGFic2l6ZT04KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSByZXBsYWNlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgJworICAgICAgICAgICAgICAgICAgICdhbmQgc28gb24pLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciBpcyBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRhYiAoIlxcdCIpLCBvbmUgb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLiAoVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGEgbmV3bGluZVxuJworICAgICAgICAgICAgICAgICAgICcgICAoIlxcbiIpIG9yIHJldHVybiAoIlxcciIpLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAgICAgICAnY29sdW1uIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNCcuZXhwYW5kdGFicygpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNCdcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNCcuZXhwYW5kdGFicyg0KVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnMDEgIDAxMiAwMTIzICAgIDAxMjM0J1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnKnN1YiogaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQgd2l0aGluIHRoZSBzbGljZSAic1tzdGFydDplbmRdIi4gIE9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICpzdGFydCpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4gIFJldHVybiAnCisgICAgICAgICAgICAgICAgICAgJyItMSIgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKnN1YiogaXMgbm90IGZvdW5kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogVGhlICJmaW5kKCkiIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSAnCisgICAgICAgICAgICAgICAgICAgJ25lZWQgdG8ga25vd1xuJworICAgICAgICAgICAgICAgICAgICcgICAgIHRoZSBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgb3Igbm90LFxuJworICAgICAgICAgICAgICAgICAgICcgICAgIHVzZSB0aGUgImluIiBvcGVyYXRvcjpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPj4+ICdQeScgaW4gJ1B5dGhvbidcbiIKKyAgICAgICAgICAgICAgICAgICAnICAgICAgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uICcKKyAgICAgICAgICAgICAgICAgICAnd2hpY2ggdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciAnCisgICAgICAgICAgICAgICAgICAgJ3JlcGxhY2VtZW50IGZpZWxkc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkZWxpbWl0ZWQgYnkgYnJhY2VzICJ7fSIuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICAnY29udGFpbnMgZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgJworICAgICAgICAgICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlICcKKyAgICAgICAgICAgICAgICAgICAnZWFjaFxuJworICAgICAgICAgICAgICAgICAgICcgICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICdUaGUgc3VtIG9mIDEgKyAyIGlzIDMnXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBTZWUgRm9ybWF0IFN0cmluZyBTeW50YXggZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAndmFyaW91c1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCAnCisgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZm9ybWF0X21hcChtYXBwaW5nKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2ltaWxhciB0byAic3RyLmZvcm1hdCgqKm1hcHBpbmcpIiwgZXhjZXB0IHRoYXQgJworICAgICAgICAgICAgICAgICAgICcibWFwcGluZyIgaXMgdXNlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBkaXJlY3RseSBhbmQgbm90IGNvcGllZCB0byBhICJkaWN0Ii4gIFRoaXMgaXMgdXNlZnVsIGlmICcKKyAgICAgICAgICAgICAgICAgICAnZm9yIGV4YW1wbGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4ga2V5XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3tuYW1lfSB3YXMgYm9ybiBpbiAiCisgICAgICAgICAgICAgICAgICAgIntjb3VudHJ5fScuZm9ybWF0X21hcChEZWZhdWx0KG5hbWU9J0d1aWRvJykpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICdHdWlkbyB3YXMgYm9ybiBpbiBjb3VudHJ5J1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBMaWtlICJmaW5kKCkiLCBidXQgcmFpc2UgIlZhbHVlRXJyb3IiIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgICcgICBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2FsbnVtKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnYWxwaGFudW1lcmljIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyICJjIlxuJworICAgICAgICAgICAgICAgICAgICcgICBpcyBhbHBoYW51bWVyaWMgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJucyAnCisgICAgICAgICAgICAgICAgICAgJyJUcnVlIjpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImMuaXNhbHBoYSgpIiwgImMuaXNkZWNpbWFsKCkiLCAiYy5pc2RpZ2l0KCkiLCBvciAnCisgICAgICAgICAgICAgICAgICAgJyJjLmlzbnVtZXJpYygpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2FscGhhKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnYWxwaGFiZXRpYyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgJworICAgICAgICAgICAgICAgICAgICdBbHBoYWJldGljXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICBkYXRhYmFzZSBhcyAiTGV0dGVyIiwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5ICcKKyAgICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYmVpbmcgb25lIG9mICJMbSIsICJMdCIsICJMdSIsICJMbCIsIG9yICJMbyIuICBOb3RlICcKKyAgICAgICAgICAgICAgICAgICAndGhhdCB0aGlzIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCBmcm9tIHRoZSAiQWxwaGFiZXRpYyIgcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFN0YW5kYXJkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzZGVjaW1hbCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkZWNpbWFsICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAnCisgICAgICAgICAgICAgICAgICAgJ0RlY2ltYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgZnJvbSBnZW5lcmFsIGNhdGVnb3J5ICJOZCIuIFRoaXMgJworICAgICAgICAgICAgICAgICAgICdjYXRlZ29yeVxuJworICAgICAgICAgICAgICAgICAgICcgICBpbmNsdWRlcyBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBjYW4gJworICAgICAgICAgICAgICAgICAgICdiZSB1c2VkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDICcKKyAgICAgICAgICAgICAgICAgICAnRElHSVQgWkVSTy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2RpZ2l0KClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyAnCisgICAgICAgICAgICAgICAgICAgJ2FuZCB0aGVyZSBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBEaWdpdHMgJworICAgICAgICAgICAgICAgICAgICdpbmNsdWRlIGRlY2ltYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBhbmQgZGlnaXRzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgJworICAgICAgICAgICAgICAgICAgICdhIGNoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGF0IGhhcyB0aGUgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0IG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE51bWVyaWNfVHlwZT1EZWNpbWFsLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzaWRlbnRpZmllcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciAnCisgICAgICAgICAgICAgICAgICAgJ2FjY29yZGluZyB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgc2VjdGlvbiBJZGVudGlmaWVycyBhbmQga2V5d29yZHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBVc2UgImtleXdvcmQuaXNrZXl3b3JkKCkiIHRvIHRlc3QgZm9yIHJlc2VydmVkICcKKyAgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllcnMgc3VjaCBhc1xuJworICAgICAgICAgICAgICAgICAgICcgICAiZGVmIiBhbmQgImNsYXNzIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2xvd2VyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIGxvd2VyY2FzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2UgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNudW1lcmljKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzLFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAnCisgICAgICAgICAgICAgICAgICAgJ051bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3RoYXQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LCBlLmcuIFUrMjE1NSwgVlVMR0FSICcKKyAgICAgICAgICAgICAgICAgICAnRlJBQ1RJT05cbicKKyAgICAgICAgICAgICAgICAgICAnICAgT05FIEZJRlRILiAgRm9ybWFsbHksIG51bWVyaWMgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQsIE51bWVyaWNfVHlwZT1EZWNpbWFsICcKKyAgICAgICAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTnVtZXJpY19UeXBlPU51bWVyaWMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNwcmludGFibGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgJworICAgICAgICAgICAgICAgICAgICdwcmludGFibGUgb3IgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLiAgTm9ucHJpbnRhYmxlICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBhcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ2RhdGFiYXNlIGFzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJPdGhlciIgb3IgIlNlcGFyYXRvciIsIGV4Y2VwdGluZyB0aGUgQVNDSUkgc3BhY2UgJworICAgICAgICAgICAgICAgICAgICcoMHgyMCkgd2hpY2ggaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCBwcmludGFibGUuICAoTm90ZSB0aGF0IHByaW50YWJsZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBjb250ZXh0IGFyZSB0aG9zZSB3aGljaCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2hlbiAnCisgICAgICAgICAgICAgICAgICAgJyJyZXByKCkiIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGludm9rZWQgb24gYSBzdHJpbmcuICBJdCBoYXMgbm8gYmVhcmluZyBvbiB0aGUgaGFuZGxpbmcgJworICAgICAgICAgICAgICAgICAgICdvZiBzdHJpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdyaXR0ZW4gdG8gInN5cy5zdGRvdXQiIG9yICJzeXMuc3RkZXJyIi4pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNzcGFjZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gJworICAgICAgICAgICAgICAgICAgICd0aGUgc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICAnCisgICAgICAgICAgICAgICAgICAgJ1doaXRlc3BhY2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyAgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICBkYXRhYmFzZSBhcyAiT3RoZXIiIG9yICJTZXBhcmF0b3IiIGFuZCB0aG9zZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICAnYmlkaXJlY3Rpb25hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBwcm9wZXJ0eSBiZWluZyBvbmUgb2YgIldTIiwgIkIiLCBvciAiUyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXN0aXRsZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgICAndGhlcmUgaXMgYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGVhc3Qgb25lIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdtYXkgb25seVxuJworICAgICAgICAgICAgICAgICAgICcgICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5ICcKKyAgICAgICAgICAgICAgICAgICAnY2FzZWQgb25lcy5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc3VwcGVyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIHVwcGVyY2FzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2UgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuam9pbihpdGVyYWJsZSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAqaXRlcmFibGUqICppdGVyYWJsZSouICBBICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmICcKKyAgICAgICAgICAgICAgICAgICAndGhlcmUgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFueSBub24tc3RyaW5nIHZhbHVlcyBpbiAqaXRlcmFibGUqLCBpbmNsdWRpbmcgImJ5dGVzIiAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nIHByb3ZpZGluZyAnCisgICAgICAgICAgICAgICAgICAgJ3RoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICcKKyAgICAgICAgICAgICAgICAgICAnKndpZHRoKi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGFuIEFTQ0lJXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuIG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVxdWFsIHRvICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmxvd2VyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIFs0XVxuJworICAgICAgICAgICAgICAgICAgICcgICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnMy4xMyBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sc3RyaXAoW2NoYXJzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIHRvIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgJworICAgICAgICAgICAgICAgICAgICdwcmVmaXg7IHJhdGhlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLmxzdHJpcCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdzcGFjaW91cyAgICdcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICd3d3cuZXhhbXBsZS5jb20nLmxzdHJpcCgnY21vd3ouJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ2V4YW1wbGUuY29tJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RhdGljIHN0ci5tYWtldHJhbnMoeFssIHlbLCB6XV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIHRyYW5zbGF0aW9uIHRhYmxlIHVzYWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAic3RyLnRyYW5zbGF0ZSgpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBvcmRpbmFscyAoaW50ZWdlcnMpIG9yIGNoYXJhY3RlcnMgKHN0cmluZ3Mgb2YgJworICAgICAgICAgICAgICAgICAgICdsZW5ndGggMSkgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBvcmRpbmFscywgc3RyaW5ncyAob2YgYXJiaXRyYXJ5IGxlbmd0aHMpIG9yICcKKyAgICAgICAgICAgICAgICAgICAnTm9uZS5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhcmFjdGVyIGtleXMgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBvcmRpbmFscy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzLCB0aGV5IG11c3QgYmUgc3RyaW5ncyBvZiAnCisgICAgICAgICAgICAgICAgICAgJ2VxdWFsIGxlbmd0aCxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIGluIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeSwgZWFjaCBjaGFyYWN0ZXIgaW4geCAnCisgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgbWFwcGVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4geS4gIElmIHRoZXJlICcKKyAgICAgICAgICAgICAgICAgICAnaXMgYSB0aGlyZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hvc2UgY2hhcmFjdGVycyB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgICAnbWFwcGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5vbmUgaW4gdGhlIHJlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5wYXJ0aXRpb24oc2VwKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcGFyYXRvciBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgJworICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieVxuJworICAgICAgICAgICAgICAgICAgICcgICB0d28gZW1wdHkgc3RyaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpvbGQqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgJworICAgICAgICAgICAgICAgICAgICdnaXZlbiwgb25seVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJypzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiAnCisgICAgICAgICAgICAgICAgICAgJyJzW3N0YXJ0OmVuZF0iLlxuJworICAgICAgICAgICAgICAgICAgICcgICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzICcKKyAgICAgICAgICAgICAgICAgICAnaW4gc2xpY2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTGlrZSAicmZpbmQoKSIgYnV0IHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgKnN1YiogaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm90IGZvdW5kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAnCisgICAgICAgICAgICAgICAgICAgJyp3aWR0aCouXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICdpcyBhbiBBU0NJSVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhbiBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBlcXVhbCB0byAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5ycGFydGl0aW9uKHNlcClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcGFyYXRvciBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgJworICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgc3RyaW5nIGl0c2VsZi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogJworICAgICAgICAgICAgICAgICAgICdhcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyptYXhzcGxpdCogc3BsaXRzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCBvclxuJworICAgICAgICAgICAgICAgICAgICcgICAiTm9uZSIsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAgJ2ZvciBzcGxpdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZnJvbSB0aGUgcmlnaHQsICJyc3BsaXQoKSIgYmVoYXZlcyBsaWtlICJzcGxpdCgpIiB3aGljaCAnCisgICAgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAncmVtb3ZlZC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgdG8gYmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCAnCisgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSAnCisgICAgICAgICAgICAgICAgICAgJ3N1ZmZpeDsgcmF0aGVyLFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcucnN0cmlwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJyAgIHNwYWNpb3VzJ1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ21pc3Npc3NpcHBpJy5yc3RyaXAoJ2lweicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdtaXNzaXNzJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAnKm1heHNwbGl0KlxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGxpdHMgYXJlIGRvbmUgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAnIm1heHNwbGl0KzEiXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciAiLTEiLCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZW4gdGhlcmUgaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgJworICAgICAgICAgICAgICAgICAgICdhcmUgbWFkZSkuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90ICcKKyAgICAgICAgICAgICAgICAgICAnZ3JvdXBlZCB0b2dldGhlclxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICcgICAiXCcxLCwyXCcuc3BsaXQoXCcsXCcpIiByZXR1cm5zICJbXCcxXCcsIFwnXCcsICcKKyAgICAgICAgICAgICAgICAgICAnXCcyXCddIikuICBUaGUgKnNlcCogYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpIiByZXR1cm5zICJbXCcxXCcsIFwnMlwnLCAnCisgICAgICAgICAgICAgICAgICAgJ1wnM1wnXSIpLiBTcGxpdHRpbmcgYW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgJworICAgICAgICAgICAgICAgICAgICciW1wnXCddIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsMycuc3BsaXQoJywnKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICczJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsMycuc3BsaXQoJywnLCBtYXhzcGxpdD0xKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMiwzJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsLDMsJy5zcGxpdCgnLCcpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJycsICczJywgJyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiwgYSBkaWZmZXJlbnQgJworICAgICAgICAgICAgICAgICAgICdzcGxpdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSByZWdhcmRlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyAnCisgICAgICAgICAgICAgICAgICAgJ2VtcHR5IHN0cmluZ3NcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yICcKKyAgICAgICAgICAgICAgICAgICAndHJhaWxpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciAnCisgICAgICAgICAgICAgICAgICAgJ2Egc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSAiTm9uZSIgc2VwYXJhdG9yICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJucyAiW10iLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJzEgMiAzJy5zcGxpdCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJzMnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJzEgMiAzJy5zcGxpdChtYXhzcGxpdD0xKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMiAzJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICAxICAgMiAgIDMgICAnLnNwbGl0KClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzInLCAnMyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgJworICAgICAgICAgICAgICAgICAgICdsaW5lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdGluZyBsaXN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2Qgc3BsaXRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBib3VuZGFyaWVzLiAgJworICAgICAgICAgICAgICAgICAgICdJblxuJworICAgICAgICAgICAgICAgICAgICcgICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsICcKKyAgICAgICAgICAgICAgICAgICAnbmV3bGluZXMqLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8IFJlcHJlc2VudGF0aW9uICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICdEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHIiICAgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlICcKKyAgICAgICAgICAgICAgICAgICAnUmV0dXJuICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcclxcbiIgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiArIExpbmUgJworICAgICAgICAgICAgICAgICAgICdGZWVkICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcdiIgb3IgIlxceDBiIiAgICAgICAgICB8IExpbmUgJworICAgICAgICAgICAgICAgICAgICdUYWJ1bGF0aW9uICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcZiIgb3IgIlxceDBjIiAgICAgICAgICB8IEZvcm0gJworICAgICAgICAgICAgICAgICAgICdGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDFjIiAgICAgICAgICAgICAgICAgIHwgRmlsZSAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHgxZSIgICAgICAgICAgICAgICAgICB8IFJlY29yZCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDg1IiAgICAgICAgICAgICAgICAgIHwgTmV4dCBMaW5lIChDMSBDb250cm9sICcKKyAgICAgICAgICAgICAgICAgICAnQ29kZSkgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHUyMDI5IiAgICAgICAgICAgICAgICB8IFBhcmFncmFwaCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXFx2IiBhbmQgIlxcZiIgYWRkZWQgdG8gbGlzdCAnCisgICAgICAgICAgICAgICAgICAgJ29mIGxpbmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYm91bmRhcmllcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcbicuc3BsaXRsaW5lcygpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnYWIgYycsICcnLCAnZGUgZmcnLCAna2wnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ2FiIGNcXG5cXG5kZSAiCisgICAgICAgICAgICAgICAgICAgImZnXFxya2xcXHJcXG4nLnNwbGl0bGluZXMoa2VlcGVuZHM9VHJ1ZSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWydhYiBjXFxuJywgJ1xcbicsICdkZSBmZ1xccicsICdrbFxcclxcbiddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZ2l2ZW4sIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdCBmb3IgdGhlIGVtcHR5IHN0cmluZywgYW5kICcKKyAgICAgICAgICAgICAgICAgICAnYSB0ZXJtaW5hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICIiLnNwbGl0bGluZXMoKVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICBbXVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gIk9uZSBsaW5lXFxuIi5zcGxpdGxpbmVzKClcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWydPbmUgbGluZSddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgY29tcGFyaXNvbiwgInNwbGl0KFwnXFxuXCcpIiBnaXZlczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnJy5zcGxpdCgnXFxuJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ1R3byBsaW5lc1xcbicuc3BsaXQoJ1xcbicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnVHdvIGxpbmVzJywgJyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCAnCisgICAgICAgICAgICAgICAgICAgJ290aGVyd2lzZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgIkZhbHNlIi4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byAnCisgICAgICAgICAgICAgICAgICAgJ2xvb2sgZm9yLlxuJworICAgICAgICAgICAgICAgICAgICcgICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAncG9zaXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAncG9zaXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3RyaXAoW2NoYXJzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3RyYWlsaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgICdzcGVjaWZ5aW5nIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yICJOb25lIiwgJworICAgICAgICAgICAgICAgICAgICd0aGUgKmNoYXJzKlxuJworICAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKiAnCisgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmlwcGVkOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcuc3RyaXAoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnc3BhY2lvdXMnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5zdHJpcCgnY21vd3ouJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ2V4YW1wbGUnXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgb3V0ZXJtb3N0IGxlYWRpbmcgYW5kIHRyYWlsaW5nICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmlwcGVkIGZyb20gdGhlIHN0cmluZy4gQ2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAndGhlIGxlYWRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2V0IG9mIGNoYXJhY3RlcnMgaW4gKmNoYXJzKi4gQSBzaW1pbGFyIGFjdGlvbiB0YWtlcyAnCisgICAgICAgICAgICAgICAgICAgJ3BsYWNlIG9uIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0cmFpbGluZyBlbmQuIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nID0gJyMuLi4uLi4uIFNlY3Rpb24gMy4yLjEgSXNzdWUgIgorICAgICAgICAgICAgICAgICAgICIjMzIgLi4uLi4uLidcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nLnN0cmlwKCcuIyEgJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ1NlY3Rpb24gMy4yLjEgSXNzdWUgIzMyJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN3YXBjYXNlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnY29udmVydGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4gTm90ZSB0aGF0IGl0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ25lY2Vzc2FyaWx5IHRydWUgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICAicy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkgPT0gcyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudGl0bGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgJworICAgICAgICAgICAgICAgICAgICdzdGFydCB3aXRoIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgJworICAgICAgICAgICAgICAgICAgICdsb3dlcmNhc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnSGVsbG8gd29ybGQnLnRpdGxlKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ0hlbGxvIFdvcmxkJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50ICcKKyAgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJ3dvcmtzIGluXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gJworICAgICAgICAgICAgICAgICAgICdjb250cmFjdGlvbnMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ2Rlc2lyZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVzdWx0OlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nICcKKyAgICAgICAgICAgICAgICAgICAncmVndWxhclxuJworICAgICAgICAgICAgICAgICAgICcgICBleHByZXNzaW9uczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBpbXBvcnQgcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogJworICAgICAgICAgICAgICAgICAgICdtby5ncm91cCgwKVswXS51cHBlcigpICtcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICdtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudHJhbnNsYXRlKHRhYmxlKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyAnCisgICAgICAgICAgICAgICAgICAgJ2JlZW4gbWFwcGVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLiAgVGhlIHRhYmxlIG11c3QgYmUgJworICAgICAgICAgICAgICAgICAgICdhbiBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhhdCBpbXBsZW1lbnRzIGluZGV4aW5nIHZpYSAiX19nZXRpdGVtX18oKSIsIHR5cGljYWxseSAnCisgICAgICAgICAgICAgICAgICAgJ2EgKm1hcHBpbmcqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9yICpzZXF1ZW5jZSouICBXaGVuIGluZGV4ZWQgYnkgYSBVbmljb2RlIG9yZGluYWwgKGFuICcKKyAgICAgICAgICAgICAgICAgICAnaW50ZWdlciksIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWJsZSBvYmplY3QgY2FuIGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOiByZXR1cm4gYSAnCisgICAgICAgICAgICAgICAgICAgJ1VuaWNvZGUgb3JkaW5hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBvciBhIHN0cmluZywgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzO1xuJworICAgICAgICAgICAgICAgICAgICcgICByZXR1cm4gIk5vbmUiLCB0byBkZWxldGUgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSByZXR1cm4gJworICAgICAgICAgICAgICAgICAgICdzdHJpbmc7IG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJhaXNlIGEgIkxvb2t1cEVycm9yIiBleGNlcHRpb24sIHRvIG1hcCB0aGUgY2hhcmFjdGVyICcKKyAgICAgICAgICAgICAgICAgICAndG8gaXRzZWxmLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgWW91IGNhbiB1c2UgInN0ci5tYWtldHJhbnMoKSIgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gJworICAgICAgICAgICAgICAgICAgICdtYXAgZnJvbVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXItdG8tY2hhcmFjdGVyIG1hcHBpbmdzIGluIGRpZmZlcmVudCBmb3JtYXRzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2VlIGFsc28gdGhlICJjb2RlY3MiIG1vZHVsZSBmb3IgYSBtb3JlIGZsZXhpYmxlICcKKyAgICAgICAgICAgICAgICAgICAnYXBwcm9hY2ggdG8gY3VzdG9tXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlciBtYXBwaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci51cHBlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBbNF1cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udmVydGVkIHRvIHVwcGVyY2FzZS4gIE5vdGUgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJyJzdHIudXBwZXIoKS5pc3VwcGVyKCkiIG1pZ2h0IGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJGYWxzZSIgaWYgInMiIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiICcKKyAgICAgICAgICAgICAgICAgICAnKExldHRlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdXBwZXJjYXNlKSwgYnV0IGUuZy4gIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnMy4xMyBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci56ZmlsbCh3aWR0aClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICcKKyAgICAgICAgICAgICAgICAgICAnIlwnMFwnIiBkaWdpdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWFrZSBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gQSBsZWFkaW5nIHNpZ24gcHJlZml4XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICgiXCcrXCciLyJcJy1cJyIpIGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nIHRoZSBwYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICAnKmFmdGVyKiB0aGUgc2lnblxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYmVmb3JlLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuZWQgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gImxlbihzKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiNDIiLnpmaWxsKDUpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICcwMDA0MidcbiIKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICItNDIiLnpmaWxsKDUpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICctMDA0MidcbiIsCisgJ3N0cmluZ3MnOiAnXG4nCisgICAgICAgICAgICAnU3RyaW5nIGFuZCBCeXRlcyBsaXRlcmFsc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdTdHJpbmcgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgJ2RlZmluaXRpb25zOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyAgIHN0cmluZ2xpdGVyYWwgICA6Oj0gW3N0cmluZ3ByZWZpeF0oc2hvcnRzdHJpbmcgfCBsb25nc3RyaW5nKVxuJworICAgICAgICAgICAgJyAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgIlIiIHwgIlUiIHwgImYiIHwgIkYiXG4nCisgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICB8ICJmciIgfCAiRnIiIHwgImZSIiB8ICJGUiIgfCAicmYiIHwgInJGIiB8ICcKKyAgICAgICAgICAgICciUmYiIHwgIlJGIlxuJworICAgICAgICAgICAgJyAgIHNob3J0c3RyaW5nICAgICA6Oj0gIlwnIiBzaG9ydHN0cmluZ2l0ZW0qICJcJyIgfCBcJyJcJyAnCisgICAgICAgICAgICAnc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmcgICAgICA6Oj0gIlwnXCdcJyIgbG9uZ3N0cmluZ2l0ZW0qICJcJ1wnXCciIHwgJworICAgICAgICAgICAgJ1wnIiIiXCcgbG9uZ3N0cmluZ2l0ZW0qIFwnIiIiXCdcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZ2NoYXIgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciAnCisgICAgICAgICAgICAnbmV3bGluZSBvciB0aGUgcXVvdGU+XG4nCisgICAgICAgICAgICAnICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4nCisgICAgICAgICAgICAnICAgc3RyaW5nZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgc291cmNlIGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICBieXRlc2xpdGVyYWwgICA6Oj0gYnl0ZXNwcmVmaXgoc2hvcnRieXRlcyB8IGxvbmdieXRlcylcbicKKyAgICAgICAgICAgICcgICBieXRlc3ByZWZpeCAgICA6Oj0gImIiIHwgIkIiIHwgImJyIiB8ICJCciIgfCAiYlIiIHwgIkJSIiB8ICcKKyAgICAgICAgICAgICcicmIiIHwgInJCIiB8ICJSYiIgfCAiUkIiXG4nCisgICAgICAgICAgICAnICAgc2hvcnRieXRlcyAgICAgOjo9ICJcJyIgc2hvcnRieXRlc2l0ZW0qICJcJyIgfCBcJyJcJyAnCisgICAgICAgICAgICAnc2hvcnRieXRlc2l0ZW0qIFwnIlwnXG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzICAgICAgOjo9ICJcJ1wnXCciIGxvbmdieXRlc2l0ZW0qICJcJ1wnXCciIHwgXCciIiJcJyAnCisgICAgICAgICAgICAnbG9uZ2J5dGVzaXRlbSogXCciIiJcJ1xuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXNpdGVtIDo6PSBzaG9ydGJ5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzaXRlbSAgOjo9IGxvbmdieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXNjaGFyIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciBuZXdsaW5lICcKKyAgICAgICAgICAgICdvciB0aGUgcXVvdGU+XG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzY2hhciAgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuJworICAgICAgICAgICAgJyAgIGJ5dGVzZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ09uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyAnCisgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgJ3doaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgInN0cmluZ3ByZWZpeCIgb3IgJworICAgICAgICAgICAgJyJieXRlc3ByZWZpeCJcbicKKyAgICAgICAgICAgICdhbmQgdGhlIHJlc3Qgb2YgdGhlIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkICcKKyAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgJ3RoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgVVRGLTggaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gJworICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAnZ2l2ZW4gaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiBFbmNvZGluZyBkZWNsYXJhdGlvbnMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnSW4gcGxhaW4gRW5nbGlzaDogQm90aCB0eXBlcyBvZiBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gJworICAgICAgICAgICAgJ21hdGNoaW5nXG4nCisgICAgICAgICAgICAnc2luZ2xlIHF1b3RlcyAoIlwnIikgb3IgZG91YmxlIHF1b3RlcyAoIiIiKS4gIFRoZXkgY2FuIGFsc28gYmUgJworICAgICAgICAgICAgJ2VuY2xvc2VkXG4nCisgICAgICAgICAgICAnaW4gbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmVcbicKKyAgICAgICAgICAgICdnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlICcKKyAgICAgICAgICAgICdiYWNrc2xhc2hcbicKKyAgICAgICAgICAgICcoIlxcIikgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSAnCisgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgJ3NwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGVcbicKKyAgICAgICAgICAgICdjaGFyYWN0ZXIuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQnl0ZXMgbGl0ZXJhbHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoICJcJ2JcJyIgb3IgIlwnQlwnIjsgdGhleSAnCisgICAgICAgICAgICAncHJvZHVjZVxuJworICAgICAgICAgICAgJ2FuIGluc3RhbmNlIG9mIHRoZSAiYnl0ZXMiIHR5cGUgaW5zdGVhZCBvZiB0aGUgInN0ciIgdHlwZS4gIFRoZXkgJworICAgICAgICAgICAgJ21heVxuJworICAgICAgICAgICAgJ29ubHkgY29udGFpbiBBU0NJSSBjaGFyYWN0ZXJzOyBieXRlcyB3aXRoIGEgbnVtZXJpYyB2YWx1ZSBvZiAxMjggJworICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAnZ3JlYXRlciBtdXN0IGJlIGV4cHJlc3NlZCB3aXRoIGVzY2FwZXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQXMgb2YgUHl0aG9uIDMuMyBpdCBpcyBwb3NzaWJsZSBhZ2FpbiB0byBwcmVmaXggc3RyaW5nIGxpdGVyYWxzICcKKyAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICcidSIgcHJlZml4IHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIGR1YWwgMi54IGFuZCAzLnggJworICAgICAgICAgICAgJ2NvZGViYXNlcy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdCb3RoIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCBhXG4nCisgICAgICAgICAgICAnbGV0dGVyICJcJ3JcJyIgb3IgIlwnUlwnIjsgc3VjaCBzdHJpbmdzIGFyZSBjYWxsZWQgKnJhdyBzdHJpbmdzKiAnCisgICAgICAgICAgICAnYW5kIHRyZWF0XG4nCisgICAgICAgICAgICAnYmFja3NsYXNoZXMgYXMgbGl0ZXJhbCBjaGFyYWN0ZXJzLiAgQXMgYSByZXN1bHQsIGluIHN0cmluZyAnCisgICAgICAgICAgICAnbGl0ZXJhbHMsXG4nCisgICAgICAgICAgICAnIlwnXFxVXCciIGFuZCAiXCdcXHVcJyIgZXNjYXBlcyBpbiByYXcgc3RyaW5ncyBhcmUgbm90IHRyZWF0ZWQgJworICAgICAgICAgICAgJ3NwZWNpYWxseS5cbicKKyAgICAgICAgICAgICJHaXZlbiB0aGF0IFB5dGhvbiAyLngncyByYXcgdW5pY29kZSBsaXRlcmFscyBiZWhhdmUgZGlmZmVyZW50bHkgIgorICAgICAgICAgICAgJ3RoYW5cbicKKyAgICAgICAgICAgICdQeXRob24gMy54XCdzIHRoZSAiXCd1clwnIiBzeW50YXggaXMgbm90IHN1cHBvcnRlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAiXCdyYlwnIiBwcmVmaXggb2YgcmF3IGJ5dGVzIGxpdGVyYWxzIGhhcyAnCisgICAgICAgICAgICAnYmVlblxuJworICAgICAgICAgICAgJ2FkZGVkIGFzIGEgc3lub255bSBvZiAiXCdiclwnIi5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIHRoZSB1bmljb2RlIGxlZ2FjeSBsaXRlcmFsXG4nCisgICAgICAgICAgICAnKCJ1XCd2YWx1ZVwnIikgd2FzIHJlaW50cm9kdWNlZCB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgJworICAgICAgICAgICAgJ2R1YWxcbicKKyAgICAgICAgICAgICdQeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLiBTZWUgKipQRVAgNDE0KiogZm9yIG1vcmUgJworICAgICAgICAgICAgJ2luZm9ybWF0aW9uLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0Egc3RyaW5nIGxpdGVyYWwgd2l0aCAiXCdmXCciIG9yICJcJ0ZcJyIgaW4gaXRzIHByZWZpeCBpcyBhICcKKyAgICAgICAgICAgICcqZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAnc3RyaW5nIGxpdGVyYWwqOyBzZWUgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscy4gIFRoZSAiXCdmXCciIG1heSAnCisgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICdjb21iaW5lZCB3aXRoICJcJ3JcJyIsIGJ1dCBub3Qgd2l0aCAiXCdiXCciIG9yICJcJ3VcJyIsIHRoZXJlZm9yZSAnCisgICAgICAgICAgICAncmF3XG4nCisgICAgICAgICAgICAnZm9ybWF0dGVkIHN0cmluZ3MgYXJlIHBvc3NpYmxlLCBidXQgZm9ybWF0dGVkIGJ5dGVzIGxpdGVyYWxzIGFyZSAnCisgICAgICAgICAgICAnbm90LlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0luIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbHMsIHVuZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGVzIGFyZSAnCisgICAgICAgICAgICAnYWxsb3dlZFxuJworICAgICAgICAgICAgJyhhbmQgYXJlIHJldGFpbmVkKSwgZXhjZXB0IHRoYXQgdGhyZWUgdW5lc2NhcGVkIHF1b3RlcyBpbiBhIHJvd1xuJworICAgICAgICAgICAgJ3Rlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gJworICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ2xpdGVyYWwsIGkuZS4gZWl0aGVyICJcJyIgb3IgIiIiLilcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdVbmxlc3MgYW4gIlwnclwnIiBvciAiXCdSXCciIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzICcKKyAgICAgICAgICAgICdpbiBzdHJpbmdcbicKKyAgICAgICAgICAgICdhbmQgYnl0ZXMgbGl0ZXJhbHMgYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byBydWxlcyBzaW1pbGFyIHRvICcKKyAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgJ3VzZWQgYnkgU3RhbmRhcmQgQy4gIFRoZSByZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbicKKyAgICAgICAgICAgICd8ICJcXG5ld2xpbmUiICAgICAgICB8IEJhY2tzbGFzaCBhbmQgbmV3bGluZSBpZ25vcmVkICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxcXCIgICAgICAgICAgICAgIHwgQmFja3NsYXNoICgiXFwiKSAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxcJyIgICAgICAgICAgICAgIHwgU2luZ2xlIHF1b3RlICgiXCciKSAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFwiIiAgICAgICAgICAgICAgfCBEb3VibGUgcXVvdGUgKCIiIikgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcYSIgICAgICAgICAgICAgIHwgQVNDSUkgQmVsbCAoQkVMKSAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXGIiICAgICAgICAgICAgICB8IEFTQ0lJIEJhY2tzcGFjZSAoQlMpICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxmIiAgICAgICAgICAgICAgfCBBU0NJSSBGb3JtZmVlZCAoRkYpICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcbiIgICAgICAgICAgICAgIHwgQVNDSUkgTGluZWZlZWQgKExGKSAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHIiICAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFx0IiAgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdiIgICAgICAgICAgICAgIHwgQVNDSUkgVmVydGljYWwgVGFiIChWVCkgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXG9vbyIgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIG9jdGFsIHZhbHVlICpvb28qICB8ICcKKyAgICAgICAgICAgICcoMSwzKSAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFx4aGgiICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBoZXggdmFsdWUgKmhoKiAgICAgfCAnCisgICAgICAgICAgICAnKDIsMykgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0VzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xuJworICAgICAgICAgICAgJ3wgIlxcTntuYW1lfSIgICAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgJworICAgICAgICAgICAgJyg0KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIGRhdGFiYXNlICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdXh4eHgiICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgJworICAgICAgICAgICAgJyg1KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCAqeHh4eCogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcVXh4eHh4eHh4IiAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMzItYml0IGhleCB2YWx1ZSAgIHwgJworICAgICAgICAgICAgJyg2KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCAqeHh4eHh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzEuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnMi4gVW5saWtlIGluIFN0YW5kYXJkIEMsIGV4YWN0bHkgdHdvIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzMuIEluIGEgYnl0ZXMgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZVxuJworICAgICAgICAgICAgJyAgIGJ5dGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIEluIGEgc3RyaW5nIGxpdGVyYWwsIHRoZXNlIGVzY2FwZXNcbicKKyAgICAgICAgICAgICcgICBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICc0LiBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciBuYW1lIGFsaWFzZXMgWzFdIGhhcyBiZWVuXG4nCisgICAgICAgICAgICAnICAgYWRkZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnNS4gRXhhY3RseSBmb3VyIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzYuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheS4gIEV4YWN0bHkgZWlnaHRcbicKKyAgICAgICAgICAgICcgICBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdVbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdzdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSByZXN1bHQqLiAgJworICAgICAgICAgICAgJyhUaGlzXG4nCisgICAgICAgICAgICAnYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgJworICAgICAgICAgICAgJ21pc3R5cGVkLFxuJworICAgICAgICAgICAgJ3RoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzICcKKyAgICAgICAgICAgICdhbHNvXG4nCisgICAgICAgICAgICAnaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gJworICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgJ2xpdGVyYWxzIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YgdW5yZWNvZ25pemVkIGVzY2FwZXMgZm9yICcKKyAgICAgICAgICAgICdieXRlc1xuJworICAgICAgICAgICAgJ2xpdGVyYWxzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0V2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsICcKKyAgICAgICAgICAgICdidXQgdGhlXG4nCisgICAgICAgICAgICAnYmFja3NsYXNoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdDsgZm9yIGV4YW1wbGUsICJyIlxcIiIiIGlzIGEgJworICAgICAgICAgICAgJ3ZhbGlkXG4nCisgICAgICAgICAgICAnc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgJworICAgICAgICAgICAgJ2RvdWJsZVxuJworICAgICAgICAgICAgJ3F1b3RlOyAiciJcXCIiIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIChldmVuIGEgcmF3IHN0cmluZyAnCisgICAgICAgICAgICAnY2Fubm90XG4nCisgICAgICAgICAgICAnZW5kIGluIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMpLiAgU3BlY2lmaWNhbGx5LCAqYSByYXcgJworICAgICAgICAgICAgJ2xpdGVyYWxcbicKKyAgICAgICAgICAgICdjYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGQgJworICAgICAgICAgICAgJ2VzY2FwZVxuJworICAgICAgICAgICAgJ3RoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlICcKKyAgICAgICAgICAgICdiYWNrc2xhc2hcbicKKyAgICAgICAgICAgICdmb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnMgYXMgJworICAgICAgICAgICAgJ3BhcnRcbicKKyAgICAgICAgICAgICdvZiB0aGUgbGl0ZXJhbCwgKm5vdCogYXMgYSBsaW5lIGNvbnRpbnVhdGlvbi5cbicsCisgJ3N1YnNjcmlwdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnU3Vic2NyaXB0aW9uc1xuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSAnCisgICAgICAgICAgICAgICAgICAnb3IgbGlzdClcbicKKyAgICAgICAgICAgICAgICAgICdvciBtYXBwaW5nIChkaWN0aW9uYXJ5KSBvYmplY3Q6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyAnCisgICAgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnKGxpc3RzIG9yIGRpY3Rpb25hcmllcyBmb3IgZXhhbXBsZSkuICBVc2VyLWRlZmluZWQgb2JqZWN0cyAnCisgICAgICAgICAgICAgICAgICAnY2FuIHN1cHBvcnRcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gYnkgZGVmaW5pbmcgYSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0ZvciBidWlsdC1pbiBvYmplY3RzLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9iamVjdHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnc3VwcG9ydFxuJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXZhbHVhdGUgdG8gYW5cbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kcyB0byB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAna2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzICcKKyAgICAgICAgICAgICAgICAgICdleGFjdGx5IG9uZVxuJworICAgICAgICAgICAgICAgICAgJ2l0ZW0uKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0lmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0ICcKKyAgICAgICAgICAgICAgICAgICdldmFsdWF0ZSB0b1xuJworICAgICAgICAgICAgICAgICAgJ2FuIGludGVnZXIgb3IgYSBzbGljZSAoYXMgZGlzY3Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgJworICAgICAgICAgICAgICAgICAgJ3NlY3Rpb24pLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBmb3JtYWwgc3ludGF4IG1ha2VzIG5vIHNwZWNpYWwgcHJvdmlzaW9uIGZvciBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnaW5kaWNlcyBpblxuJworICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlczsgaG93ZXZlciwgYnVpbHQtaW4gc2VxdWVuY2VzIGFsbCBwcm92aWRlIGEgJworICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCB0aGF0IGludGVycHJldHMgbmVnYXRpdmUgaW5kaWNlcyBieSBhZGRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgICdsZW5ndGggb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgdG8gdGhlIGluZGV4IChzbyB0aGF0ICJ4Wy0xXSIgc2VsZWN0cyB0aGUgbGFzdCAnCisgICAgICAgICAgICAgICAgICAnaXRlbSBvZiAieCIpLlxuJworICAgICAgICAgICAgICAgICAgJ1RoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuICcKKyAgICAgICAgICAgICAgICAgICd0aGUgbnVtYmVyXG4nCisgICAgICAgICAgICAgICAgICAnb2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaXRlbSB3aG9zZVxuJworICAgICAgICAgICAgICAgICAgJ2luZGV4IGlzIHRoYXQgdmFsdWUgKGNvdW50aW5nIGZyb20gemVybykuIFNpbmNlIHRoZSBzdXBwb3J0ICcKKyAgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBpbmRpY2VzIGFuZCBzbGljaW5nIG9jY3VycyBpbiB0aGUgb2JqZWN0J3MgIgorICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCB0byAnCisgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSBhZGRcbicKKyAgICAgICAgICAgICAgICAgICd0aGF0IHN1cHBvcnQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQSBzdHJpbmcncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhICIKKyAgICAgICAgICAgICAgICAgICdzZXBhcmF0ZSBkYXRhXG4nCisgICAgICAgICAgICAgICAgICAndHlwZSBidXQgYSBzdHJpbmcgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLlxuJywKKyAndHJ1dGgnOiAnXG4nCisgICAgICAgICAgJ1RydXRoIFZhbHVlIFRlc3RpbmdcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiAiaWYiIG9yXG4nCisgICAgICAgICAgJyJ3aGlsZSIgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gJworICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAnZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBmYWxzZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogIk5vbmUiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqICJGYWxzZSJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogemVybyBvZiBhbnkgbnVtZXJpYyB0eXBlLCBmb3IgZXhhbXBsZSwgIjAiLCAiMC4wIiwgIjBqIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgIlwnXCciLCAiKCkiLCAiW10iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsICJ7fSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcywgaWYgdGhlIGNsYXNzIGRlZmluZXMgYVxuJworICAgICAgICAgICcgICJfX2Jvb2xfXygpIiBvciAiX19sZW5fXygpIiBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJucyB0aGVcbicKKyAgICAgICAgICAnICBpbnRlZ2VyIHplcm8gb3IgImJvb2wiIHZhbHVlICJGYWxzZSIuIFsxXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQWxsIG90aGVyIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB0cnVlIC0tLSBzbyBvYmplY3RzIG9mIG1hbnkgdHlwZXMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnYWx3YXlzIHRydWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdPcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgJworICAgICAgICAgICdhbHdheXNcbicKKyAgICAgICAgICAncmV0dXJuICIwIiBvciAiRmFsc2UiIGZvciBmYWxzZSBhbmQgIjEiIG9yICJUcnVlIiBmb3IgdHJ1ZSwgdW5sZXNzXG4nCisgICAgICAgICAgJ290aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zICcKKyAgICAgICAgICAnIm9yIlxuJworICAgICAgICAgICdhbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKVxuJywKKyAndHJ5JzogJ1xuJworICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudFxuJworICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuJworICAgICAgICAnZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbicKKyAgICAgICAgJyAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiICcKKyAgICAgICAgJ3N1aXRlKStcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuJworICAgICAgICAnICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuICcKKyAgICAgICAgJ25vXG4nCisgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG4nCisgICAgICAgICdleGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yICcKKyAgICAgICAgJ2FuXG4nCisgICAgICAgICdleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCAnCisgICAgICAgICdjbGF1c2VzXG4nCisgICAgICAgICdpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuICcKKyAgICAgICAgJ2V4cHJlc3Npb24tXG4nCisgICAgICAgICdsZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbicKKyAgICAgICAgJ2V4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG4nCisgICAgICAgICdpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG4nCisgICAgICAgICdvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG4nCisgICAgICAgICd3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSAnCisgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgJ29iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuICcKKyAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAnaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uICcKKyAgICAgICAgJ3N0YWNrLlxuJworICAgICAgICAnWzFdXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG4nCisgICAgICAgICdyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgJworICAgICAgICAnYW5kXG4nCisgICAgICAgICdhIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxuJworICAgICAgICAndGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgJworICAgICAgICAncmFpc2VkXG4nCisgICAgICAgICd0aGUgZXhjZXB0aW9uKS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbicKKyAgICAgICAgJ3RoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCAnCisgICAgICAgICdpZlxuJworICAgICAgICAicHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG4iCisgICAgICAgICdjbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ3JlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgJworICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAnKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSAnCisgICAgICAgICdleGNlcHRpb24sXG4nCisgICAgICAgICdhbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxuJworICAgICAgICAnb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1doZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG4nCisgICAgICAgICdhdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAnICAgICAgIGZvb1xuJworICAgICAgICAnXG4nCisgICAgICAgICd3YXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAnICAgICAgIHRyeTpcbicKKyAgICAgICAgJyAgICAgICAgICAgZm9vXG4nCisgICAgICAgICcgICAgICAgZmluYWxseTpcbicKKyAgICAgICAgJyAgICAgICAgICAgZGVsIE5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuJworICAgICAgICAnYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbicKKyAgICAgICAgJ2JlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuJworICAgICAgICAnY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG4nCisgICAgICAgICd1bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICJCZWZvcmUgYW4gZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuIgorICAgICAgICAnZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHZpYVxuJworICAgICAgICAnInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgKHNlZVxuJworICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbicKKyAgICAgICAgJ3Byb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxuJworICAgICAgICAncmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG4nCisgICAgICAgICdmcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbicKKyAgICAgICAgJ3RoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG4nCisgICAgICAgICdub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICcKKyAgICAgICAgJyJ0cnkiXG4nCisgICAgICAgICdjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgJworICAgICAgICAnYW5cbicKKyAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG4nCisgICAgICAgICdleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgJworICAgICAgICAnSWZcbicKKyAgICAgICAgJ3RoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAnCisgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgJ2NsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG4nCisgICAgICAgICdleGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgJworICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICdjbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuJworICAgICAgICAnaXMgZGlzY2FyZGVkOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICA+Pj4gZGVmIGYoKTpcbicKKyAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAnICAgLi4uICAgICAgICAgMS8wXG4nCisgICAgICAgICcgICAuLi4gICAgIGZpbmFsbHk6XG4nCisgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gNDJcbicKKyAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAnICAgPj4+IGYoKVxuJworICAgICAgICAnICAgNDJcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuJworICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdXaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4nCisgICAgICAgICcidHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ2Fsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgJworICAgICAgICAnaW5cbicKKyAgICAgICAgJ3RoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuJworICAgICAgICAnaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbicKKyAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuJworICAgICAgICAnInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnbGFzdCBvbmUgZXhlY3V0ZWQ6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgID4+PiBkZWYgZm9vKCk6XG4nCisgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5J1xuIgorICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAiICAgLi4uICAgICAgICAgcmV0dXJuICdmaW5hbGx5J1xuIgorICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICcgICA+Pj4gZm9vKClcbicKKyAgICAgICAgIiAgICdmaW5hbGx5J1xuIgorICAgICAgICAnXG4nCisgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgJ0V4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG8gJworICAgICAgICAnZ2VuZXJhdGVcbicKKyAgICAgICAgJ2V4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gVGhlIHJhaXNlIHN0YXRlbWVudC5cbicsCisgJ3R5cGVzJzogJ1xuJworICAgICAgICAgICdUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHlcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgJworICAgICAgICAgICdFeHRlbnNpb25cbicKKyAgICAgICAgICAnbW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbicKKyAgICAgICAgICAnaW1wbGVtZW50YXRpb24pIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB0eXBlcy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZlxuJworICAgICAgICAgICdQeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsICcKKyAgICAgICAgICAnbnVtYmVycyxcbicKKyAgICAgICAgICAnZWZmaWNpZW50bHkgc3RvcmVkIGFycmF5cyBvZiBpbnRlZ2VycywgZXRjLiksIGFsdGhvdWdoIHN1Y2ggJworICAgICAgICAgICdhZGRpdGlvbnNcbicKKyAgICAgICAgICAnd2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZ1xuJworICAgICAgICAgICInc3BlY2lhbCBhdHRyaWJ1dGVzLicgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gIgorICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnaW1wbGVtZW50YXRpb24gYW5kIGFyZSBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgVGhlaXIgJworICAgICAgICAgICdkZWZpbml0aW9uXG4nCisgICAgICAgICAgJ21heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ05vbmVcbicKKyAgICAgICAgICAnICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoICcKKyAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICcgICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSAiTm9uZSIuICcKKyAgICAgICAgICAnSXRcbicKKyAgICAgICAgICAnICAgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLCAnCisgICAgICAgICAgJ2UuZy4sXG4nCisgICAgICAgICAgIiAgIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhwbGljaXRseSByZXR1cm5cbiIKKyAgICAgICAgICAnICAgYW55dGhpbmcuIEl0cyB0cnV0aCB2YWx1ZSBpcyBmYWxzZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ05vdEltcGxlbWVudGVkXG4nCisgICAgICAgICAgJyAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbicKKyAgICAgICAgICAnICAgIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kc1xuJworICAgICAgICAgICcgICBzaG91bGQgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgdGhlIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZVxuJworICAgICAgICAgICcgICByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlXG4nCisgICAgICAgICAgJyAgIG9wZXJhdG9yLikgIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VlIEltcGxlbWVudGluZyB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGZvciBtb3JlIGRldGFpbHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdFbGxpcHNpc1xuJworICAgICAgICAgICcgICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBsaXRlcmFsICIuLi4iIG9yIHRoZVxuJworICAgICAgICAgICcgICBidWlsdC1pbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyJudW1iZXJzLk51bWJlciJcbicKKyAgICAgICAgICAnICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgIGFyaXRobWV0aWMgb3BlcmF0b3JzIGFuZCBhcml0aG1ldGljIGJ1aWx0LWluIGZ1bmN0aW9ucy4gICcKKyAgICAgICAgICAnTnVtZXJpY1xuJworICAgICAgICAgICcgICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuJworICAgICAgICAgICcgICBQeXRob24gbnVtYmVycyBhcmUgb2YgY291cnNlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbWF0aGVtYXRpY2FsXG4nCisgICAgICAgICAgJyAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgJworICAgICAgICAgICdyZXByZXNlbnRhdGlvblxuJworICAgICAgICAgICcgICBpbiBjb21wdXRlcnMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICBjb21wbGV4IG51bWJlcnM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAibnVtYmVycy5JbnRlZ3JhbCJcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgJworICAgICAgICAgICdpbnRlZ2Vyc1xuJworICAgICAgICAgICcgICAgICAocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBJbnRlZ2VycyAoImludCIpXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiBhbiB1bmxpbWl0ZWQgcmFuZ2UsIHN1YmplY3QgdG9cbicKKyAgICAgICAgICAnICAgICAgICAgYXZhaWxhYmxlICh2aXJ0dWFsKSBtZW1vcnkgb25seS4gIEZvciB0aGUgcHVycG9zZSBvZiAnCisgICAgICAgICAgJ3NoaWZ0XG4nCisgICAgICAgICAgJyAgICAgICAgIGFuZCBtYXNrIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgIiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyJ3NcbiIKKyAgICAgICAgICAnICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgICAgc2lnbiBiaXRzIGV4dGVuZGluZyB0byB0aGUgbGVmdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJvb2xlYW5zICgiYm9vbCIpXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZXNlIHJlcHJlc2VudCB0aGUgdHJ1dGggdmFsdWVzIEZhbHNlIGFuZCBUcnVlLiAgVGhlIHR3b1xuJworICAgICAgICAgICcgICAgICAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgICAgb25seSBCb29sZWFuIG9iamVjdHMuIFRoZSBCb29sZWFuIHR5cGUgaXMgYSBzdWJ0eXBlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgICAgIGludGVnZXIgdHlwZSwgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICAgICAxLCByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsIHRoZSBleGNlcHRpb24gJworICAgICAgICAgICdiZWluZ1xuJworICAgICAgICAgICcgICAgICAgICB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5ncyAiIkZhbHNlIiIgb3JcbicKKyAgICAgICAgICAnICAgICAgICAgIiJUcnVlIiIgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgcnVsZXMgZm9yIGludGVnZXIgcmVwcmVzZW50YXRpb24gYXJlIGludGVuZGVkIHRvIGdpdmUgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgaW52b2x2aW5nIG5lZ2F0aXZlIGludGVnZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuUmVhbCIgKCJmbG9hdCIpXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBtYWNoaW5lLWxldmVsIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgJworICAgICAgICAgICdwb2ludFxuJworICAgICAgICAgICcgICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4nCisgICAgICAgICAgJyAgICAgIGFyY2hpdGVjdHVyZSAoYW5kIEMgb3IgSmF2YSBpbXBsZW1lbnRhdGlvbikgZm9yIHRoZSBhY2NlcHRlZFxuJworICAgICAgICAgICcgICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0ICcKKyAgICAgICAgICAnc2luZ2xlLVxuJworICAgICAgICAgICcgICAgICBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlIHNhdmluZ3MgaW4gcHJvY2Vzc29yICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGFyZVxuJworICAgICAgICAgICcgICAgICBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28gdGhlcmUgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgJworICAgICAgICAgICdmbG9hdGluZ1xuJworICAgICAgICAgICcgICAgICBwb2ludCBudW1iZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuQ29tcGxleCIgKCJjb21wbGV4IilcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbFxuJworICAgICAgICAgICcgICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzICcKKyAgICAgICAgICAnYXBwbHlcbicKKyAgICAgICAgICAnICAgICAgYXMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgJworICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgJyAgICAgIGNvbXBsZXggbnVtYmVyICJ6IiBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seVxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzICJ6LnJlYWwiIGFuZCAiei5pbWFnIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NlcXVlbmNlc1xuJworICAgICAgICAgICcgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZVxuJworICAgICAgICAgICcgICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgJworICAgICAgICAgICdpdGVtc1xuJworICAgICAgICAgICcgICBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZSBpbmRleCAnCisgICAgICAgICAgJ3NldFxuJworICAgICAgICAgICcgICBjb250YWlucyB0aGUgbnVtYmVycyAwLCAxLCAuLi4sICpuKi0xLiAgSXRlbSAqaSogb2Ygc2VxdWVuY2UgKmEqICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgc2VsZWN0ZWQgYnkgImFbaV0iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiAiYVtpOmpdIiBzZWxlY3RzIGFsbCBpdGVtcyB3aXRoXG4nCisgICAgICAgICAgJyAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqICI8PSIgKmsqICI8IiAqaiouICBXaGVuIHVzZWQgYXMgYW5cbicKKyAgICAgICAgICAnICAgZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzICcKKyAgICAgICAgICAnaW1wbGllc1xuJworICAgICAgICAgICcgICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0ICJleHRlbmRlZCBzbGljaW5nIiB3aXRoIGEgdGhpcmQgJworICAgICAgICAgICcic3RlcCJcbicKKyAgICAgICAgICAnICAgcGFyYW1ldGVyOiAiYVtpOmo6a10iIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KiAnCisgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgJyAgICJ4ID0gaSArIG4qayIsICpuKiAiPj0iICIwIiBhbmQgKmkqICI8PSIgKngqICI8IiAqaiouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBJbW11dGFibGUgc2VxdWVuY2VzXG4nCisgICAgICAgICAgJyAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciAnCisgICAgICAgICAgJ29iamVjdHMsXG4nCisgICAgICAgICAgJyAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyAnCisgICAgICAgICAgJ2hvd2V2ZXIsXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiAnCisgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBvYmplY3QgY2Fubm90IGNoYW5nZS4pXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3RyaW5nc1xuJworICAgICAgICAgICcgICAgICAgICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlICcKKyAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICcgICAgICAgICBwb2ludHMuIEFsbCB0aGUgY29kZSBwb2ludHMgaW4gdGhlIHJhbmdlICJVKzAwMDAgLSAnCisgICAgICAgICAgJ1UrMTBGRkZGIlxuJworICAgICAgICAgICIgICAgICAgICBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYSBzdHJpbmcuICBQeXRob24gZG9lc24ndCBoYXZlIGEgIgorICAgICAgICAgICciY2hhciJcbicKKyAgICAgICAgICAnICAgICAgICAgdHlwZTsgaW5zdGVhZCwgZXZlcnkgY29kZSBwb2ludCBpbiB0aGUgc3RyaW5nIGlzICcKKyAgICAgICAgICAncmVwcmVzZW50ZWRcbicKKyAgICAgICAgICAnICAgICAgICAgYXMgYSBzdHJpbmcgb2JqZWN0IHdpdGggbGVuZ3RoICIxIi4gIFRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgICAgICJvcmQoKSIgY29udmVydHMgYSBjb2RlIHBvaW50IGZyb20gaXRzIHN0cmluZyBmb3JtIHRvIGFuXG4nCisgICAgICAgICAgJyAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIjsgImNocigpIiBjb252ZXJ0cyBhblxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICdsZW5ndGhcbicKKyAgICAgICAgICAnICAgICAgICAgIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgJworICAgICAgICAgICdhXG4nCisgICAgICAgICAgJyAgICAgICAgICJzdHIiIHRvICJieXRlcyIgdXNpbmcgdGhlIGdpdmVuIHRleHQgZW5jb2RpbmcsIGFuZFxuJworICAgICAgICAgICcgICAgICAgICAiYnl0ZXMuZGVjb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIG9wcG9zaXRlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVHVwbGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgICAgIHR3byBvciBtb3JlIGl0ZW1zIGFyZSBmb3JtZWQgYnkgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mXG4nCisgICAgICAgICAgIiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSAnc2luZ2xldG9uJykgY2FuIGJlXG4iCisgICAgICAgICAgJyAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICAgICAgICBpdHNlbGYgZG9lcyBub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmVcbicKKyAgICAgICAgICAnICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gJworICAgICAgICAgICdiZVxuJworICAgICAgICAgICcgICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJ5dGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIEEgYnl0ZXMgb2JqZWN0IGlzIGFuIGltbXV0YWJsZSBhcnJheS4gIFRoZSBpdGVtcyBhcmUgJworICAgICAgICAgICc4LWJpdFxuJworICAgICAgICAgICcgICAgICAgICBieXRlcywgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgPD0geCA8IDI1Ni5cbicKKyAgICAgICAgICAnICAgICAgICAgQnl0ZXMgbGl0ZXJhbHMgKGxpa2UgImJcJ2FiY1wnIikgYW5kIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgICAgICJieXRlcygpIiBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYnl0ZXMgb2JqZWN0cy4gIEFsc28sXG4nCisgICAgICAgICAgJyAgICAgICAgIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8gc3RyaW5ncyB2aWEgdGhlICcKKyAgICAgICAgICAnImRlY29kZSgpIlxuJworICAgICAgICAgICcgICAgICAgICBtZXRob2QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBNdXRhYmxlIHNlcXVlbmNlc1xuJworICAgICAgICAgICcgICAgICBNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgJworICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAnICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0ICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgYXNzaWdubWVudCBhbmQgImRlbCIgKGRlbGV0ZSkgc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgTGlzdHNcbicKKyAgICAgICAgICAnICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJyAgICAgICAgIHNxdWFyZSBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyAnCisgICAgICAgICAgJ25lZWRlZFxuJworICAgICAgICAgICcgICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgQnl0ZSBBcnJheXNcbicKKyAgICAgICAgICAnICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBidWlsdC1pbiAiYnl0ZWFycmF5KCkiIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuJworICAgICAgICAgICcgICAgICAgICBtdXRhYmxlIChhbmQgaGVuY2UgdW5oYXNoYWJsZSksIGJ5dGUgYXJyYXlzIG90aGVyd2lzZSAnCisgICAgICAgICAgJ3Byb3ZpZGVcbicKKyAgICAgICAgICAnICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuJworICAgICAgICAgICcgICAgICAgICBvYmplY3RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgImFycmF5IiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgJworICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgJyAgICAgIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgYXMgZG9lcyB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTZXQgdHlwZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiAnCisgICAgICAgICAgJ0hvd2V2ZXIsXG4nCisgICAgICAgICAgJyAgIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIlxuJworICAgICAgICAgICcgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSAnCisgICAgICAgICAgJ2Zhc3RcbicKKyAgICAgICAgICAnICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4nCisgICAgICAgICAgJyAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4nCisgICAgICAgICAgJyAgIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbicKKyAgICAgICAgICAnICAgZGljdGlvbmFyeSBrZXlzLiBOb3RlIHRoYXQgbnVtZXJpYyB0eXBlcyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kXG4nCisgICAgICAgICAgJyAgICIxLjAiKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNldHNcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlICcKKyAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAnICAgICAgInNldCgpIiBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgJworICAgICAgICAgICdzZXZlcmFsXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZHMsIHN1Y2ggYXMgImFkZCgpIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZyb3plbiBzZXRzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBhbiBpbW11dGFibGUgc2V0LiAgVGhleSBhcmUgY3JlYXRlZCBieSB0aGVcbicKKyAgICAgICAgICAnICAgICAgYnVpbHQtaW4gImZyb3plbnNldCgpIiBjb25zdHJ1Y3Rvci4gIEFzIGEgZnJvemVuc2V0IGlzICcKKyAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mICcKKyAgICAgICAgICAnYW5vdGhlclxuJworICAgICAgICAgICcgICAgICBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdNYXBwaW5nc1xuJworICAgICAgICAgICcgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSAnCisgICAgICAgICAgJ2luZGV4XG4nCisgICAgICAgICAgJyAgIHNldHMuIFRoZSBzdWJzY3JpcHQgbm90YXRpb24gImFba10iIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieSAnCisgICAgICAgICAgJyJrIlxuJworICAgICAgICAgICcgICBmcm9tIHRoZSBtYXBwaW5nICJhIjsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmQgYXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgRGljdGlvbmFyaWVzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgbmVhcmx5XG4nCisgICAgICAgICAgJyAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgJworICAgICAgICAgICdhc1xuJworICAgICAgICAgICcgICAgICBrZXlzIGFyZSB2YWx1ZXMgY29udGFpbmluZyBsaXN0cyBvciBkaWN0aW9uYXJpZXMgb3Igb3RoZXJcbicKKyAgICAgICAgICAnICAgICAgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZyB0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICIgICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXkncyBoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC5cbiIKKyAgICAgICAgICAnICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgJworICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgJyAgICAgIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sICIxIiBhbmQgJworICAgICAgICAgICciMS4wIilcbicKKyAgICAgICAgICAnICAgICAgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuJworICAgICAgICAgICcgICAgICBkaWN0aW9uYXJ5IGVudHJ5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSAiey4uLn0iXG4nCisgICAgICAgICAgJyAgICAgIG5vdGF0aW9uIChzZWUgc2VjdGlvbiBEaWN0aW9uYXJ5IGRpc3BsYXlzKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlcyAiZGJtLm5kYm0iIGFuZCAiZGJtLmdudSIgcHJvdmlkZVxuJworICAgICAgICAgICcgICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMsIGFzIGRvZXMgdGhlICcKKyAgICAgICAgICAnImNvbGxlY3Rpb25zIlxuJworICAgICAgICAgICcgICAgICBtb2R1bGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDYWxsYWJsZSB0eXBlc1xuJworICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlXG4nCisgICAgICAgICAgJyAgIHNlY3Rpb24gQ2FsbHMpIGNhbiBiZSBhcHBsaWVkOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVXNlci1kZWZpbmVkIGZ1bmN0aW9uc1xuJworICAgICAgICAgICcgICAgICBBIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb25zKS4gIEl0IHNob3VsZCBiZVxuJworICAgICAgICAgICcgICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mICcKKyAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAiICAgICAgYXMgdGhlIGZ1bmN0aW9uJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuIgorICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCBhdHRyaWJ1dGVzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19kb2NfXyIgICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzICcKKyAgICAgICAgICAnZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZTsgbm90IGluaGVyaXRlZCBieSAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1YmNsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX25hbWVfXyIgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgJworICAgICAgICAgICduYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fcXVhbG5hbWVfXyIgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAqcXVhbGlmaWVkICcKKyAgICAgICAgICAnbmFtZSogfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBpbiB2ZXJzaW9uIDMuMy4gICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX21vZHVsZV9fIiAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZGVmYXVsdHNfXyIgICAgICAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnQgdmFsdWVzIGZvciB0aG9zZSAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yICJOb25lIiBpZiBubyBhcmd1bWVudHMgaGF2ZSAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fY29kZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIGJvZHkuICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZ2xvYmFsc19fIiAgICAgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgJworICAgICAgICAgICd8IFJlYWQtb25seSAgIHxcbicKKyAgICAgICAgICAiICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhhdCBob2xkcyB0aGUgZnVuY3Rpb24ncyAgICAgICAiCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnbG9iYWwgdmFyaWFibGVzIC0tLSB0aGUgZ2xvYmFsICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZGljdF9fIiAgICAgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJiaXRyYXJ5IGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fY2xvc3VyZV9fIiAgICAgICAgICAgICB8ICJOb25lIiBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgJworICAgICAgICAgICd8IFJlYWQtb25seSAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbidzIGZyZWUgdmFyaWFibGVzLiAgICAgICIKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19hbm5vdGF0aW9uc19fIiAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGtleXMgb2YgdGhlICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpY3QgYXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMsICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kICJcJ3JldHVyblwnIiBmb3IgdGhlICcKKyAgICAgICAgICAncmV0dXJuICAgfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFubm90YXRpb24sIGlmIHByb3ZpZGVkLiAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2t3ZGVmYXVsdHNfXyIgICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3IgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmQtb25seSBwYXJhbWV0ZXJzLiAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBsYWJlbGxlZCAiV3JpdGFibGUiIGNoZWNrIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGFzc2lnbmVkIHZhbHVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggJworICAgICAgICAgICdtZXRhZGF0YVxuJworICAgICAgICAgICcgICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgICAgc2V0IHN1Y2ggYXR0cmlidXRlcy4gKk5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAnCisgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAnICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAnCisgICAgICAgICAgJ0Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1dHVyZS4qXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24ncyBkZWZpbml0aW9uIGNhbiBiZVxuIgorICAgICAgICAgICcgICAgICByZXRyaWV2ZWQgZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgJworICAgICAgICAgICdpbnRlcm5hbFxuJworICAgICAgICAgICcgICAgICB0eXBlcyBiZWxvdy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEluc3RhbmNlIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgICAgQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIGFueSBjYWxsYWJsZSBvYmplY3QgKG5vcm1hbGx5IGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJfX3NlbGZfXyIgaXMgdGhlIGNsYXNzICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCAiX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7ICJfX2RvY19fIiBpcyB0aGVcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kXCdzIGRvY3VtZW50YXRpb24gKHNhbWUgYXMgIl9fZnVuY19fLl9fZG9jX18iKTsgJworICAgICAgICAgICciX19uYW1lX18iXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBtZXRob2QgbmFtZSAoc2FtZSBhcyAiX19mdW5jX18uX19uYW1lX18iKTsgJworICAgICAgICAgICciX19tb2R1bGVfXyJcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCBvciAnCisgICAgICAgICAgJyJOb25lIlxuJworICAgICAgICAgICcgICAgICBpZiB1bmF2YWlsYWJsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgJworICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBVc2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQgd2hlbiBnZXR0aW5nIGFuXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZSBvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICB0aGF0IGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3Qgb3IgYSBjbGFzc1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhICcKKyAgICAgICAgICAndXNlci1cbicKKyAgICAgICAgICAnICAgICAgZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzICcKKyAgICAgICAgICAnaW5zdGFuY2VzLFxuJworICAgICAgICAgICcgICAgICBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpcyBzYWlkIHRvIGJlIGJvdW5kLiAgVGhlIG5ldyBtZXRob2RcJ3MgIl9fZnVuY19fIiBhdHRyaWJ1dGUgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuJworICAgICAgICAgICcgICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgJworICAgICAgICAgICciX19mdW5jX18iXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIGJ1dCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgJworICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzICJfX3NlbGZfXyIgJworICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGVcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uICgiX19mdW5jX18iKSBpcyBjYWxsZWQsIGluc2VydGluZyB0aGUgY2xhc3MgJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAgICAoIl9fc2VsZl9fIikgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3IgaW5zdGFuY2UsICcKKyAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICcgICAgICAiQyIgaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gJworICAgICAgICAgICciZigpIixcbicKKyAgICAgICAgICAnICAgICAgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiAiQyIsIGNhbGxpbmcgInguZigxKSIgaXMgZXF1aXZhbGVudCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJyAgICAgIGNhbGxpbmcgIkMuZih4LCAxKSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgJworICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCB0aGUgImNsYXNzIGluc3RhbmNlIiBzdG9yZWQgaW4gIl9fc2VsZl9fIiB3aWxsICcKKyAgICAgICAgICAnYWN0dWFsbHlcbicKKyAgICAgICAgICAnICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAnCisgICAgICAgICAgJyJDLmYoMSkiXG4nCisgICAgICAgICAgJyAgICAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAiZihDLDEpIiB3aGVyZSAiZiIgaXMgdGhlICcKKyAgICAgICAgICAndW5kZXJseWluZ1xuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkICcKKyAgICAgICAgICAnZnJvbVxuJworICAgICAgICAgICcgICAgICB0aGUgaW5zdGFuY2UuICBJbiBzb21lIGNhc2VzLCBhIGZydWl0ZnVsIG9wdGltaXphdGlvbiBpcyB0b1xuJworICAgICAgICAgICcgICAgICBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWxcbicKKyAgICAgICAgICAnICAgICAgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgICAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0cyAoYW5kIGFsbCBub24tXG4nCisgICAgICAgICAgJyAgICAgIGNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgd2hpY2ggYXJlXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZFxuJworICAgICAgICAgICcgICAgICBtZXRob2RzOyB0aGlzICpvbmx5KiBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGFuICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyAgICAgIG9mIHRoZSBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEdlbmVyYXRvciBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZVxuJworICAgICAgICAgICcgICAgICBzZWN0aW9uIFRoZSB5aWVsZCBzdGF0ZW1lbnQpIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgJworICAgICAgICAgICdmdW5jdGlvbiouXG4nCisgICAgICAgICAgJyAgICAgIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIGFsd2F5cyByZXR1cm5zIGFuIGl0ZXJhdG9yICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgJworICAgICAgICAgICdjYWxsaW5nXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBpdGVyYXRvclwncyAiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdW50aWwgaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgJworICAgICAgICAgICcieWllbGQiXG4nCisgICAgICAgICAgJyAgICAgIHN0YXRlbWVudC4gIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgInJldHVybiIgc3RhdGVtZW50ICcKKyAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAnICAgICAgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gJworICAgICAgICAgICdiZVxuJworICAgICAgICAgICcgICAgICByZXR1cm5lZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENvcm91dGluZSBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpc1xuJworICAgICAgICAgICcgICAgICBjYWxsZWQgYSAqY29yb3V0aW5lIGZ1bmN0aW9uKi4gIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiAnCisgICAgICAgICAgJ2NhbGxlZCxcbicKKyAgICAgICAgICAnICAgICAgcmV0dXJucyBhICpjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCJcbicKKyAgICAgICAgICAnICAgICAgZXhwcmVzc2lvbnMsIGFzIHdlbGwgYXMgImFzeW5jIHdpdGgiIGFuZCAiYXN5bmMgZm9yIiAnCisgICAgICAgICAgJ3N0YXRlbWVudHMuXG4nCisgICAgICAgICAgJyAgICAgIFNlZSBhbHNvIHRoZSBDb3JvdXRpbmUgT2JqZWN0cyBzZWN0aW9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQnVpbHQtaW4gZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuJworICAgICAgICAgICcgICAgICBFeGFtcGxlcyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlICJsZW4oKSIgYW5kICJtYXRoLnNpbigpIlxuJworICAgICAgICAgICcgICAgICAoIm1hdGgiIGlzIGEgc3RhbmRhcmQgYnVpbHQtaW4gbW9kdWxlKS4gVGhlIG51bWJlciBhbmQgdHlwZSAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgJworICAgICAgICAgICdyZWFkLVxuJworICAgICAgICAgICcgICAgICBvbmx5IGF0dHJpYnV0ZXM6ICJfX2RvY19fIiBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuJworICAgICAgICAgICcgICAgICBzdHJpbmcsIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZTsgIl9fbmFtZV9fIiBpcyB0aGUgJworICAgICAgICAgICJmdW5jdGlvbidzXG4iCisgICAgICAgICAgJyAgICAgIG5hbWU7ICJfX3NlbGZfXyIgaXMgc2V0IHRvICJOb25lIiAoYnV0IHNlZSB0aGUgbmV4dCBpdGVtKTtcbicKKyAgICAgICAgICAnICAgICAgIl9fbW9kdWxlX18iIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIGZ1bmN0aW9uIHdhcyAnCisgICAgICAgICAgJ2RlZmluZWRcbicKKyAgICAgICAgICAnICAgICAgaW4gb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQnVpbHQtaW4gbWV0aG9kc1xuJworICAgICAgICAgICcgICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbicKKyAgICAgICAgICAnICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4nCisgICAgICAgICAgJyAgICAgICJhbGlzdC5hcHBlbmQoKSIsIGFzc3VtaW5nICphbGlzdCogaXMgYSBsaXN0IG9iamVjdC4gSW4gdGhpc1xuJworICAgICAgICAgICcgICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlICJfX3NlbGZfXyIgaXMgc2V0IHRvICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBkZW5vdGVkIGJ5ICphbGlzdCouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDbGFzc2VzXG4nCisgICAgICAgICAgJyAgICAgIENsYXNzZXMgYXJlIGNhbGxhYmxlLiAgVGhlc2Ugb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgJworICAgICAgICAgICdmYWN0b3JpZXNcbicKKyAgICAgICAgICAnICAgICAgZm9yIG5ldyBpbnN0YW5jZXMgb2YgdGhlbXNlbHZlcywgYnV0IHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgICAgIGNsYXNzIHR5cGVzIHRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZVxuJworICAgICAgICAgICcgICAgICBjYWxsIGFyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0b1xuJworICAgICAgICAgICcgICAgICAiX19pbml0X18oKSIgdG8gaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3MgSW5zdGFuY2VzXG4nCisgICAgICAgICAgJyAgICAgIEluc3RhbmNlcyBvZiBhcmJpdHJhcnkgY2xhc3NlcyBjYW4gYmUgbWFkZSBjYWxsYWJsZSBieSAnCisgICAgICAgICAgJ2RlZmluaW5nXG4nCisgICAgICAgICAgJyAgICAgIGEgIl9fY2FsbF9fKCkiIG1ldGhvZCBpbiB0aGVpciBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ01vZHVsZXNcbicKKyAgICAgICAgICAnICAgTW9kdWxlcyBhcmUgYSBiYXNpYyBvcmdhbml6YXRpb25hbCB1bml0IG9mIFB5dGhvbiBjb2RlLCBhbmQgYXJlXG4nCisgICAgICAgICAgJyAgIGNyZWF0ZWQgYnkgdGhlIGltcG9ydCBzeXN0ZW0gYXMgaW52b2tlZCBlaXRoZXIgYnkgdGhlICJpbXBvcnQiXG4nCisgICAgICAgICAgJyAgIHN0YXRlbWVudCAoc2VlICJpbXBvcnQiKSwgb3IgYnkgY2FsbGluZyBmdW5jdGlvbnMgc3VjaCBhc1xuJworICAgICAgICAgICcgICAiaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgYW5kIGJ1aWx0LWluICJfX2ltcG9ydF9fKCkiLiAgQSAnCisgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICcgICBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QgKHRoaXMgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZSAiX19nbG9iYWxzX18iIGF0dHJpYnV0ZSBvZlxuJworICAgICAgICAgICcgICBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlKS4gIEF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZVxuJworICAgICAgICAgICcgICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyAnCisgICAgICAgICAgJ2VxdWl2YWxlbnRcbicKKyAgICAgICAgICAnICAgdG8gIm0uX19kaWN0X19bIngiXSIuIEEgbW9kdWxlIG9iamVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlXG4nCisgICAgICAgICAgIiAgIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSAoc2luY2UgaXQgaXNuJ3QgbmVlZGVkICIKKyAgICAgICAgICAnb25jZVxuJworICAgICAgICAgICcgICB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICBBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGUncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiIKKyAgICAgICAgICAnICAgZS5nLiwgIm0ueCA9IDEiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSA9IDEiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGVcJ3MgJworICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAnICAgYXMgYSBkaWN0aW9uYXJ5IG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQmVjYXVzZSBvZiB0aGUgd2F5IENQeXRob25cbicKKyAgICAgICAgICAnICAgY2xlYXJzIG1vZHVsZSBkaWN0aW9uYXJpZXMsIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB3aWxsIGJlICcKKyAgICAgICAgICAnY2xlYXJlZFxuJworICAgICAgICAgICcgICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgJworICAgICAgICAgICdoYXNcbicKKyAgICAgICAgICAnICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIG1vZHVsZSBhcm91bmQgd2hpbGUgdXNpbmcgaXRzIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgbW9kdWxlXCdzICcKKyAgICAgICAgICAnbmFtZTtcbicKKyAgICAgICAgICAnICAgIl9fZG9jX18iIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZlxuJworICAgICAgICAgICcgICB1bmF2YWlsYWJsZTsgIl9fZmlsZV9fIiBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlICJfX2ZpbGVfXyJcbicKKyAgICAgICAgICAnICAgYXR0cmlidXRlIG1heSBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMgJworICAgICAgICAgICdDXG4nCisgICAgICAgICAgJyAgIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvclxuJworICAgICAgICAgICcgICBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0N1c3RvbSBjbGFzc2VzXG4nCisgICAgICAgICAgJyAgIEN1c3RvbSBjbGFzcyB0eXBlcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnMgJworICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgJyAgIHNlY3Rpb24gQ2xhc3MgZGVmaW5pdGlvbnMpLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJyAgIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAiQy54IiBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgJyAgICJDLl9fZGljdF9fWyJ4Il0iIChhbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggJworICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICcgICBmb3Igb3RoZXIgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgbm90IGZvdW5kIHRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2VcbicKKyAgICAgICAgICAnICAgY2xhc3Nlcy4gVGhpcyBzZWFyY2ggb2YgdGhlIGJhc2UgY2xhc3NlcyB1c2VzIHRoZSBDMyBtZXRob2RcbicKKyAgICAgICAgICAnICAgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseSBldmVuIGluIHRoZSBwcmVzZW5jZSAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgIiAgICdkaWFtb25kJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZVxuIgorICAgICAgICAgICcgICBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8gYSBjb21tb24gYW5jZXN0b3IuIEFkZGl0aW9uYWxcbicKKyAgICAgICAgICAnICAgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGVcbicKKyAgICAgICAgICAnICAgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuMyByZWxlYXNlIGF0XG4nCisgICAgICAgICAgJyAgIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzICJDIiwgc2F5KSB3b3VsZCAnCisgICAgICAgICAgJ3lpZWxkIGFcbicKKyAgICAgICAgICAnICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2RcbicKKyAgICAgICAgICAnICAgb2JqZWN0IHdob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlcyBpcyAiQyIuICBXaGVuIGl0IHdvdWxkIHlpZWxkICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICcgICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICB0aGUgc3RhdGljIG1ldGhvZCBvYmplY3QuIFNlZSBzZWN0aW9uIEltcGxlbWVudGluZyBEZXNjcmlwdG9ycyAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICcgICBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5ICcKKyAgICAgICAgICAnZGlmZmVyXG4nCisgICAgICAgICAgJyAgIGZyb20gdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyAiX19kaWN0X18iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3MncyBkaWN0aW9uYXJ5LCAiCisgICAgICAgICAgJ25ldmVyXG4nCisgICAgICAgICAgJyAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyAnCisgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgJyAgIChzZWUgYmVsb3cpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19uYW1lX18iIGlzIHRoZSBjbGFzcyBuYW1lOyAiX19tb2R1bGVfXyIgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyAiX19kaWN0X18iIGlzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY2xhc3NcJ3MgbmFtZXNwYWNlOyAiX19iYXNlc19fIiBpcyBhICcKKyAgICAgICAgICAndHVwbGVcbicKKyAgICAgICAgICAnICAgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDsgIl9fZG9jX18iIGlzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgIiAgIGNsYXNzJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLlxuIgorICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2xhc3MgaW5zdGFuY2VzXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgJworICAgICAgICAgICdhYm92ZSkuXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3MgaW5zdGFuY2UgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGFzIGEgZGljdGlvbmFyeSAnCisgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgJyAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuXG4nCisgICAgICAgICAgIiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZSdzIGNsYXNzICIKKyAgICAgICAgICAnaGFzXG4nCisgICAgICAgICAgJyAgIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzXG4nCisgICAgICAgICAgJyAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgJworICAgICAgICAgICd1c2VyLWRlZmluZWRcbicKKyAgICAgICAgICAnICAgZnVuY3Rpb24gb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGluc3RhbmNlIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UuICBTdGF0aWMgbWV0aG9kIGFuZFxuJworICAgICAgICAgICcgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyB0cmFuc2Zvcm1lZDsgc2VlIGFib3ZlIHVuZGVyXG4nCisgICAgICAgICAgJyAgICJDbGFzc2VzIi4gIFNlZSBzZWN0aW9uIEltcGxlbWVudGluZyBEZXNjcmlwdG9ycyBmb3IgYW5vdGhlciB3YXkgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICB3aGljaCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgcmV0cmlldmVkIHZpYSBpdHMgaW5zdGFuY2VzIG1heSAnCisgICAgICAgICAgJ2RpZmZlclxuJworICAgICAgICAgICcgICBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3NcJ3MgIl9fZGljdF9fIi4gIElmICcKKyAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAiICAgY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kLCBhbmQgdGhlIG9iamVjdCdzIGNsYXNzIGhhcyBhXG4iCisgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2Unc1xuIgorICAgICAgICAgICIgICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYVxuIgorICAgICAgICAgICcgICAiX19zZXRhdHRyX18oKSIgb3IgIl9fZGVsYXR0cl9fKCkiIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgJworICAgICAgICAgICdpbnN0ZWFkXG4nCisgICAgICAgICAgJyAgIG9mIHVwZGF0aW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgJworICAgICAgICAgICdtYXBwaW5nc1xuJworICAgICAgICAgICcgICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgbWV0aG9kIG5hbWVzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19kaWN0X18iIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTtcbicKKyAgICAgICAgICAnICAgIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSS9PIG9iamVjdHMgKGFsc28ga25vd24gYXMgZmlsZSBvYmplY3RzKVxuJworICAgICAgICAgICcgICBBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmVcbicKKyAgICAgICAgICAnICAgYXZhaWxhYmxlIHRvIGNyZWF0ZSBmaWxlIG9iamVjdHM6IHRoZSAib3BlbigpIiBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uLFxuJworICAgICAgICAgICcgICBhbmQgYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiICcKKyAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgJyAgIG9mIHNvY2tldCBvYmplY3RzIChhbmQgcGVyaGFwcyBieSBvdGhlciBmdW5jdGlvbnMgb3IgbWV0aG9kc1xuJworICAgICAgICAgICcgICBwcm92aWRlZCBieSBleHRlbnNpb24gbW9kdWxlcykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUaGUgb2JqZWN0cyAic3lzLnN0ZGluIiwgInN5cy5zdGRvdXQiIGFuZCAic3lzLnN0ZGVyciIgYXJlXG4nCisgICAgICAgICAgIiAgIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcnByZXRlcidzXG4iCisgICAgICAgICAgJyAgIHN0YW5kYXJkIGlucHV0LCBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXM7IHRoZXkgYXJlIGFsbCBvcGVuIGluICcKKyAgICAgICAgICAndGV4dFxuJworICAgICAgICAgICcgICBtb2RlIGFuZCB0aGVyZWZvcmUgZm9sbG93IHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGVcbicKKyAgICAgICAgICAnICAgImlvLlRleHRJT0Jhc2UiIGFic3RyYWN0IGNsYXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSW50ZXJuYWwgdHlwZXNcbicKKyAgICAgICAgICAnICAgQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICB1c2VyLiBUaGVpciBkZWZpbml0aW9ucyBtYXkgY2hhbmdlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoZVxuJworICAgICAgICAgICcgICBpbnRlcnByZXRlciwgYnV0IHRoZXkgYXJlIG1lbnRpb25lZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDb2RlIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgQ29kZSBvYmplY3RzIHJlcHJlc2VudCAqYnl0ZS1jb21waWxlZCogZXhlY3V0YWJsZSBQeXRob24gJworICAgICAgICAgICdjb2RlLFxuJworICAgICAgICAgICcgICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGFcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiAnCisgICAgICAgICAgJ2V4cGxpY2l0XG4nCisgICAgICAgICAgIiAgICAgIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24ncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0ICIKKyAgICAgICAgICAnd2FzXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUgb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgJworICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAnICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkICcKKyAgICAgICAgICAnYXRcbicKKyAgICAgICAgICAnICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgJworICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgICAgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gJworICAgICAgICAgICdtdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiY29fbmFtZSIgZ2l2ZXMgdGhlIGZ1bmN0aW9uICcKKyAgICAgICAgICAnbmFtZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX2FyZ2NvdW50IiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzICcKKyAgICAgICAgICAnKGluY2x1ZGluZ1xuJworICAgICAgICAgICcgICAgICBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7ICJjb19ubG9jYWxzIiBpcyB0aGUgbnVtYmVyICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgYXJndW1lbnRzKTtcbicKKyAgICAgICAgICAnICAgICAgImNvX3Zhcm5hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBsb2NhbFxuJworICAgICAgICAgICcgICAgICB2YXJpYWJsZXMgKHN0YXJ0aW5nIHdpdGggdGhlIGFyZ3VtZW50IG5hbWVzKTsgImNvX2NlbGx2YXJzIiAnCisgICAgICAgICAgJ2lzIGFcbicKKyAgICAgICAgICAnICAgICAgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlXG4nCisgICAgICAgICAgJyAgICAgIHJlZmVyZW5jZWQgYnkgbmVzdGVkIGZ1bmN0aW9uczsgImNvX2ZyZWV2YXJzIiBpcyBhIHR1cGxlXG4nCisgICAgICAgICAgJyAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWUgdmFyaWFibGVzOyAiY29fY29kZSIgaXMgYSAnCisgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICcgICAgICByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mIGJ5dGVjb2RlIGluc3RydWN0aW9uczsgJworICAgICAgICAgICciY29fY29uc3RzIlxuJworICAgICAgICAgICcgICAgICBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGxpdGVyYWxzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuJworICAgICAgICAgICcgICAgICAiY29fbmFtZXMiIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieSB0aGUgJworICAgICAgICAgICdieXRlY29kZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX2ZpbGVuYW1lIiBpcyB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgJworICAgICAgICAgICdjb21waWxlZDtcbicKKyAgICAgICAgICAnICAgICAgImNvX2ZpcnN0bGluZW5vIiBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuJworICAgICAgICAgICcgICAgICAiY29fbG5vdGFiIiBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4nCisgICAgICAgICAgJyAgICAgIG9mZnNldHMgdG8gbGluZSBudW1iZXJzIChmb3IgZGV0YWlscyBzZWUgdGhlIHNvdXJjZSBjb2RlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGludGVycHJldGVyKTsgImNvX3N0YWNrc2l6ZSIgaXMgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemVcbicKKyAgICAgICAgICAnICAgICAgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZXMpOyAiY29fZmxhZ3MiIGlzIGFuIGludGVnZXIgJworICAgICAgICAgICdlbmNvZGluZyBhXG4nCisgICAgICAgICAgJyAgICAgIG51bWJlciBvZiBmbGFncyBmb3IgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yICJjb19mbGFncyI6IGJpdCAnCisgICAgICAgICAgJyIweDA0IlxuJworICAgICAgICAgICcgICAgICBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqYXJndW1lbnRzIiBzeW50YXggdG8gYWNjZXB0ICcKKyAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAnICAgICAgYXJiaXRyYXJ5IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIioqa2V5d29yZHMiIHN5bnRheCB0byBhY2NlcHQgJworICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAga2V5d29yZCBhcmd1bWVudHM7IGJpdCAiMHgyMCIgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiBpcyBhXG4nCisgICAgICAgICAgJyAgICAgIGdlbmVyYXRvci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZ1dHVyZSBmZWF0dXJlIGRlY2xhcmF0aW9ucyAoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgJworICAgICAgICAgICdkaXZpc2lvbiIpXG4nCisgICAgICAgICAgJyAgICAgIGFsc28gdXNlIGJpdHMgaW4gImNvX2ZsYWdzIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgY29kZSAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgIjB4MjAwMCIgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBzZXQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGZ1dHVyZSBkaXZpc2lvbiAnCisgICAgICAgICAgJ2VuYWJsZWQ7XG4nCisgICAgICAgICAgJyAgICAgIGJpdHMgIjB4MTAiIGFuZCAiMHgxMDAwIiB3ZXJlIHVzZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZlxuJworICAgICAgICAgICcgICAgICBQeXRob24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbicKKyAgICAgICAgICAnICAgICAgImNvX2NvbnN0cyIgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbicKKyAgICAgICAgICAnICAgICAgIk5vbmUiIGlmIHVuZGVmaW5lZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZyYW1lIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgRnJhbWUgb2JqZWN0cyByZXByZXNlbnQgZXhlY3V0aW9uIGZyYW1lcy4gIFRoZXkgbWF5IG9jY3VyIGluXG4nCisgICAgICAgICAgJyAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImZfYmFjayIgaXMgdG8gdGhlIHByZXZpb3VzICcKKyAgICAgICAgICAnc3RhY2tcbicKKyAgICAgICAgICAnICAgICAgZnJhbWUgKHRvd2FyZHMgdGhlIGNhbGxlciksIG9yICJOb25lIiBpZiB0aGlzIGlzIHRoZSBib3R0b21cbicKKyAgICAgICAgICAnICAgICAgc3RhY2sgZnJhbWU7ICJmX2NvZGUiIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZCBpbiAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgICAgZnJhbWU7ICJmX2xvY2FscyIgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwIGxvY2FsXG4nCisgICAgICAgICAgJyAgICAgIHZhcmlhYmxlczsgImZfZ2xvYmFscyIgaXMgdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcztcbicKKyAgICAgICAgICAnICAgICAgImZfYnVpbHRpbnMiIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOyAnCisgICAgICAgICAgJyJmX2xhc3RpIlxuJworICAgICAgICAgICcgICAgICBnaXZlcyB0aGUgcHJlY2lzZSBpbnN0cnVjdGlvbiAodGhpcyBpcyBhbiBpbmRleCBpbnRvIHRoZVxuJworICAgICAgICAgICcgICAgICBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlczogImZfdHJhY2UiLCBpZiBub3QgIk5vbmUiLCBpcyBhXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdXNlZCBieSB0aGUgZGVidWdnZXIpOyAiZl9saW5lbm8iIGlzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGZyYW1lIC0tLSB3cml0aW5nIHRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiAnCisgICAgICAgICAgJ2p1bXBzXG4nCisgICAgICAgICAgJyAgICAgIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSAnCisgICAgICAgICAgJ2RlYnVnZ2VyXG4nCisgICAgICAgICAgJyAgICAgIGNhbiBpbXBsZW1lbnQgYSBKdW1wIGNvbW1hbmQgKGFrYSBTZXQgTmV4dCBTdGF0ZW1lbnQpIGJ5ICcKKyAgICAgICAgICAnd3JpdGluZ1xuJworICAgICAgICAgICcgICAgICB0byBmX2xpbmVuby5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgZnJhbWUuY2xlYXIoKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgICAgICAgdGhlIGZyYW1lLiAgQWxzbywgaWYgdGhlIGZyYW1lIGJlbG9uZ2VkIHRvIGEgZ2VuZXJhdG9yLCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICAgICBnZW5lcmF0b3IgaXMgZmluYWxpemVkLiAgVGhpcyBoZWxwcyBicmVhayByZWZlcmVuY2UgJworICAgICAgICAgICdjeWNsZXNcbicKKyAgICAgICAgICAnICAgICAgICAgaW52b2x2aW5nIGZyYW1lIG9iamVjdHMgKGZvciBleGFtcGxlIHdoZW4gY2F0Y2hpbmcgYW5cbicKKyAgICAgICAgICAnICAgICAgICAgZXhjZXB0aW9uIGFuZCBzdG9yaW5nIGl0cyB0cmFjZWJhY2sgZm9yIGxhdGVyIHVzZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICAiUnVudGltZUVycm9yIiBpcyByYWlzZWQgaWYgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSAnCisgICAgICAgICAgJ2V4ZWN1dGluZy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIFRyYWNlYmFjayBvYmplY3RzIHJlcHJlc2VudCBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gICcKKyAgICAgICAgICAnQVxuJworICAgICAgICAgICcgICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgJworICAgICAgICAgICdhdFxuJworICAgICAgICAgICcgICAgICBlYWNoIHVud291bmQgbGV2ZWwgYSB0cmFjZWJhY2sgb2JqZWN0IGlzIGluc2VydGVkIGluIGZyb250ICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyAnCisgICAgICAgICAgJ2VudGVyZWQsXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gKFNlZSAnCisgICAgICAgICAgJ3NlY3Rpb25cbicKKyAgICAgICAgICAnICAgICAgVGhlIHRyeSBzdGF0ZW1lbnQuKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIHRoZSB0aGlyZCBpdGVtIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHR1cGxlIHJldHVybmVkIGJ5ICJzeXMuZXhjX2luZm8oKSIuIFdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgJworICAgICAgICAgICdub1xuJworICAgICAgICAgICcgICAgICBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiAobmljZWx5ICcKKyAgICAgICAgICAnZm9ybWF0dGVkKVxuJworICAgICAgICAgICcgICAgICB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgJworICAgICAgICAgICdpbnRlcmFjdGl2ZSxcbicKKyAgICAgICAgICAnICAgICAgaXQgaXMgYWxzbyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyAnCisgICAgICAgICAgJyJzeXMubGFzdF90cmFjZWJhY2siLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInRiX25leHQiIGlzIHRoZSBuZXh0IGxldmVsIGluICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHN0YWNrIHRyYWNlICh0b3dhcmRzIHRoZSBmcmFtZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkKSwgJworICAgICAgICAgICdvclxuJworICAgICAgICAgICcgICAgICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgInRiX2ZyYW1lIiBwb2ludHMgdG8gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDsgInRiX2xpbmVubyIgZ2l2ZXMgdGhlICcKKyAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICcgICAgICBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZDsgInRiX2xhc3RpIiBpbmRpY2F0ZXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgcHJlY2lzZSBpbnN0cnVjdGlvbi4gIFRoZSBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJyAgICAgIHRoZSB0cmFjZWJhY2sgbWF5IGRpZmZlciBmcm9tIHRoZSBsaW5lIG51bWJlciBvZiBpdHMgZnJhbWVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGlmIHRoZSBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCAnCisgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgJyAgICAgIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2xpY2Ugb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBTbGljZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzbGljZXMgZm9yICcKKyAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZHMuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluICJzbGljZSgpIlxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJzdGFydCIgaXMgdGhlIGxvd2VyIGJvdW5kOyAnCisgICAgICAgICAgJyJzdG9wIlxuJworICAgICAgICAgICcgICAgICBpcyB0aGUgdXBwZXIgYm91bmQ7ICJzdGVwIiBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpcyAiTm9uZSIgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICBvbWl0dGVkLiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZFxuJworICAgICAgICAgICcgICAgICAgICBjb21wdXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xpY2UgdGhhdCB0aGUgc2xpY2UgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgICAgd291bGQgZGVzY3JpYmUgaWYgYXBwbGllZCB0byBhIHNlcXVlbmNlIG9mICpsZW5ndGgqICcKKyAgICAgICAgICAnaXRlbXMuXG4nCisgICAgICAgICAgJyAgICAgICAgIEl0IHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSAqc3RhcnQqIGFuZCAqc3RvcCogaW5kaWNlcyBhbmQgdGhlICpzdGVwKiBvciBzdHJpZGVcbicKKyAgICAgICAgICAnICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzbGljZS4gTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBwcm92aWRlIGEgd2F5IG9mIGRlZmVhdGluZyB0aGVcbicKKyAgICAgICAgICAnICAgICAgdHJhbnNmb3JtYXRpb24gb2YgZnVuY3Rpb24gb2JqZWN0cyB0byBtZXRob2Qgb2JqZWN0cyAnCisgICAgICAgICAgJ2Rlc2NyaWJlZFxuJworICAgICAgICAgICcgICAgICBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFueSBvdGhlclxuJworICAgICAgICAgICcgICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpY1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkIG9iamVjdCwgd2hpY2ggaXMgbm90XG4nCisgICAgICAgICAgJyAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICcgICAgICBub3QgdGhlbXNlbHZlcyBjYWxsYWJsZSwgYWx0aG91Z2ggdGhlIG9iamVjdHMgdGhleSB3cmFwICcKKyAgICAgICAgICAndXN1YWxseVxuJworICAgICAgICAgICcgICAgICBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbicKKyAgICAgICAgICAnICAgICAgInN0YXRpY21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIEEgY2xhc3MgbWV0aG9kIG9iamVjdCwgbGlrZSBhIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpcyBhICcKKyAgICAgICAgICAnd3JhcHBlclxuJworICAgICAgICAgICcgICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0ICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIHVwb24gc3VjaCByZXRyaWV2YWwgaXMgZGVzY3JpYmVkIGFib3ZlLFxuJworICAgICAgICAgICcgICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgJworICAgICAgICAgICdjcmVhdGVkXG4nCisgICAgICAgICAgJyAgICAgIGJ5IHRoZSBidWlsdC1pbiAiY2xhc3NtZXRob2QoKSIgY29uc3RydWN0b3IuXG4nLAorICd0eXBlc2Z1bmN0aW9ucyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRnVuY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnRnVuY3Rpb24gb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZSAnCisgICAgICAgICAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICcKKyAgICAgICAgICAgICAgICAgICAnImZ1bmMoYXJndW1lbnQtbGlzdCkiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uc1xuJworICAgICAgICAgICAgICAgICAgICdhbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gIEJvdGggc3VwcG9ydCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiAodG8gY2FsbFxuJworICAgICAgICAgICAgICAgICAgICd0aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1NlZSBGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbWFwcGluZyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ01hcHBpbmcgVHlwZXMgLS0tICJkaWN0IlxuJworICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0EgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSAnCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnTWFwcGluZ3MgYXJlIG11dGFibGUgb2JqZWN0cy4gIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSAnCisgICAgICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICAgICAnbWFwcGluZyB0eXBlLCB0aGUgKmRpY3Rpb25hcnkqLiAgKEZvciBvdGhlciBjb250YWluZXJzIHNlZSAnCisgICAgICAgICAgICAgICAgICd0aGUgYnVpbHQtXG4nCisgICAgICAgICAgICAgICAgICdpbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgJworICAgICAgICAgICAgICAgICAnbW9kdWxlLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiQSBkaWN0aW9uYXJ5J3Mga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyAiCisgICAgICAgICAgICAgICAgICd0aGF0IGFyZVxuJworICAgICAgICAgICAgICAgICAnbm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJpZXMgb3JcbicKKyAgICAgICAgICAgICAgICAgJ290aGVyIG11dGFibGUgdHlwZXMgKHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuICcKKyAgICAgICAgICAgICAgICAgJ2J5IG9iamVjdFxuJworICAgICAgICAgICAgICAgICAnaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciAnCisgICAgICAgICAgICAgICAgICdrZXlzIG9iZXlcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgJworICAgICAgICAgICAgICAgICAnY29tcGFyZSBlcXVhbFxuJworICAgICAgICAgICAgICAgICAnKHN1Y2ggYXMgIjEiIGFuZCAiMS4wIikgdGhlbiB0aGV5IGNhbiBiZSB1c2VkICcKKyAgICAgICAgICAgICAgICAgJ2ludGVyY2hhbmdlYWJseSB0byBpbmRleFxuJworICAgICAgICAgICAgICAgICAndGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgJworICAgICAgICAgICAgICAgICAnY29tcHV0ZXJzIHN0b3JlXG4nCisgICAgICAgICAgICAgICAgICdmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgJworICAgICAgICAgICAgICAgICAndW53aXNlIHRvIHVzZVxuJworICAgICAgICAgICAgICAgICAndGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCAnCisgICAgICAgICAgICAgICAgICdsaXN0IG9mICJrZXk6XG4nCisgICAgICAgICAgICAgICAgICd2YWx1ZSIgcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6ICJ7XCdqYWNrXCc6IDQwOTgsICcKKyAgICAgICAgICAgICAgICAgIidzam9lcmQnOlxuIgorICAgICAgICAgICAgICAgICAnNDEyN30iIG9yICJ7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9Iiwgb3IgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJkaWN0IlxuJworICAgICAgICAgICAgICAgICAnY29uc3RydWN0b3IuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QoKiprd2FyZylcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2lzIGNyZWF0ZWQuXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyAnCisgICAgICAgICAgICAgICAgICdvYmplY3QsIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyAnCisgICAgICAgICAgICAgICAgICd0aGUgbWFwcGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICcKKyAgICAgICAgICAgICAgICAgJyppdGVyYWJsZSpcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gJworICAgICAgICAgICAgICAgICAnaXRlcmFibGUgd2l0aFxuJworICAgICAgICAgICAgICAgICAnICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtICcKKyAgICAgICAgICAgICAgICAgJ2JlY29tZXMgYSBrZXlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSAnCisgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgJworICAgICAgICAgICAgICAgICAnZm9yIHRoYXQga2V5XG4nCisgICAgICAgICAgICAgICAgICcgICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kICcKKyAgICAgICAgICAgICAgICAgJ3RoZWlyXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSBmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgZXF1YWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRvICJ7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfSI6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpXG4nCisgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gYiA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDN9XG4iCisgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gYyA9IGRpY3QoemlwKFsnb25lJywgJ3R3bycsICd0aHJlZSddLCBbMSwgMiwgM10pKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGQgPSBkaWN0KFsoJ3R3bycsIDIpLCAoJ29uZScsIDEpLCAoJ3RocmVlJywgMyldKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGUgPSBkaWN0KHsndGhyZWUnOiAzLCAnb25lJzogMSwgJ3R3byc6IDJ9KVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSAnCisgICAgICAgICAgICAgICAgICd3b3JrcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgJworICAgICAgICAgICAgICAgICAndmFsaWQga2V5c1xuJworICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIHVzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgJworICAgICAgICAgICAgICAgICAndGhlcmVmb3JlLFxuJworICAgICAgICAgICAgICAgICAnICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgbGVuKGQpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZFtrZXldXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSAnCisgICAgICAgICAgICAgICAgICciS2V5RXJyb3IiIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgYSBzdWJjbGFzcyBvZiBkaWN0IGRlZmluZXMgYSBtZXRob2QgIl9fbWlzc2luZ19fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2FuZCAqa2V5KlxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgbm90IHByZXNlbnQsIHRoZSAiZFtrZXldIiBvcGVyYXRpb24gY2FsbHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdtZXRob2Qgd2l0aFxuJworICAgICAgICAgICAgICAgICAnICAgICAgdGhlIGtleSAqa2V5KiBhcyBhcmd1bWVudC4gIFRoZSAiZFtrZXldIiBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAndGhlbiByZXR1cm5zXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBvciByYWlzZXMgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgIl9fbWlzc2luZ19fKGtleSkiIGNhbGwuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBpbnZva2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJfX21pc3NpbmdfXygpIi4gSWYgIl9fbWlzc2luZ19fKCkiIGlzIG5vdCBkZWZpbmVkLCAnCisgICAgICAgICAgICAgICAgICciS2V5RXJyb3IiXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpcyByYWlzZWQuICJfX21pc3NpbmdfXygpIiBtdXN0IGJlIGEgbWV0aG9kOyBpdCBjYW5ub3QgJworICAgICAgICAgICAgICAgICAnYmUgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGluc3RhbmNlIHZhcmlhYmxlOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICA+Pj4gY2xhc3MgQ291bnRlcihkaWN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAuLi4gICAgICAgICByZXR1cm4gMFxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgPj4+IGMgPSBDb3VudGVyKClcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgICAgMFxuJworICAgICAgICAgICAgICAgICAiICAgICAgICAgPj4+IGNbJ3JlZCddICs9IDFcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgICAgMVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBUaGUgZXhhbXBsZSBhYm92ZSBzaG93cyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiAgQSBkaWZmZXJlbnQgIl9fbWlzc2luZ19fIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QgaXMgdXNlZFxuJworICAgICAgICAgICAgICAgICAnICAgICAgYnkgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0Ii5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZFtrZXldID0gdmFsdWVcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgU2V0ICJkW2tleV0iIHRvICp2YWx1ZSouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlbCBkW2tleV1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmVtb3ZlICJkW2tleV0iIGZyb20gKmQqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZiAnCisgICAgICAgICAgICAgICAgICcqa2V5KiBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGluIHRoZSBtYXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleSBpbiBkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiAiVHJ1ZSIgaWYgKmQqIGhhcyBhIGtleSAqa2V5KiwgZWxzZSAiRmFsc2UiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXkgbm90IGluIGRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgRXF1aXZhbGVudCB0byAibm90IGtleSBpbiBkIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgaXRlcihkKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gICcKKyAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgYVxuJworICAgICAgICAgICAgICAgICAnICAgICAgc2hvcnRjdXQgZm9yICJpdGVyKGQua2V5cygpKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsZWFyKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjb3B5KClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzc21ldGhvZCBmcm9ta2V5cyhzZXFbLCB2YWx1ZV0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgc2V0IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAiZnJvbWtleXMoKSIgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3ICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqdmFsdWUqIGRlZmF1bHRzIHRvICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZ2V0KGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSwgZWxzZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmRlZmF1bHQqLiBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byAnCisgICAgICAgICAgICAgICAgICciTm9uZSIsIHNvXG4nCisgICAgICAgICAgICAgICAgICcgICAgICB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhICJLZXlFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZW1zKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgaXRlbXMgKCIoa2V5LCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSkiXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBwYWlycykuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleXMoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICIgICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeSdzIGtleXMuICBTZWUgdGhlXG4iCisgICAgICAgICAgICAgICAgICcgICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgcG9wKGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gJworICAgICAgICAgICAgICAgICAnaXRzIHZhbHVlLFxuJworICAgICAgICAgICAgICAgICAnICAgICAgZWxzZSByZXR1cm4gKmRlZmF1bHQqLiAgSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiBhbmQgJworICAgICAgICAgICAgICAgICAnKmtleSogaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgYSAiS2V5RXJyb3IiIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgcG9waXRlbSgpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSAiKGtleSwgdmFsdWUpIiBwYWlyICcKKyAgICAgICAgICAgICAgICAgJ2Zyb20gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAicG9waXRlbSgpIiBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpcyBlbXB0eSwgY2FsbGluZyAicG9waXRlbSgpIiByYWlzZXMgYSAiS2V5RXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0cyB2YWx1ZS4gIElmICcKKyAgICAgICAgICAgICAgICAgJ25vdCwgaW5zZXJ0XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgJworICAgICAgICAgICAgICAgICAnKmRlZmF1bHQqXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkZWZhdWx0cyB0byAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHVwZGF0ZShbb3RoZXJdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gJworICAgICAgICAgICAgICAgICAnKm90aGVyKixcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMuICBSZXR1cm4gIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAidXBkYXRlKCkiIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgZGljdGlvbmFyeSBvYmplY3Qgb3IgJworICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yIG90aGVyICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlcyBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgbGVuZ3RoIHR3bykuICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOiAnCisgICAgICAgICAgICAgICAgICciZC51cGRhdGUocmVkPTEsXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBibHVlPTIpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnkncyB2YWx1ZXMuICBTZWUgIgorICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRGljdGlvbmFyaWVzIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSAnCisgICAgICAgICAgICAgICAgICdzYW1lICIoa2V5LFxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUpIiBwYWlycy4gT3JkZXIgY29tcGFyaXNvbnMgKFwnPFwnLCBcJzw9XCcsIFwnPj1cJywgJworICAgICAgICAgICAgICAgICAiJz4nKSByYWlzZVxuIgorICAgICAgICAgICAgICAgICAnICAgIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOiAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgJworICAgICAgICAgICAgICAgICAncmVhZC1vbmx5XG4nCisgICAgICAgICAgICAgICAgICcgIHZpZXcgb2YgYSAiZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBvYmplY3RzIHJldHVybmVkIGJ5ICJkaWN0LmtleXMoKSIsICJkaWN0LnZhbHVlcygpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgJworICAgICAgICAgICAgICAgICAndmlldyBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkncyBlbnRyaWVzLCB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIGRpY3Rpb25hcnkgIgorICAgICAgICAgICAgICAgICAnY2hhbmdlcyxcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RpY3Rpb25hcnkgdmlld3MgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgdG8geWllbGQgdGhlaXIgJworICAgICAgICAgICAgICAgICAncmVzcGVjdGl2ZSBkYXRhLFxuJworICAgICAgICAgICAgICAgICAnYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnbGVuKGRpY3R2aWV3KVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdpdGVyKGRpY3R2aWV3KVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cywgdmFsdWVzIG9yIGl0ZW1zICcKKyAgICAgICAgICAgICAgICAgJyhyZXByZXNlbnRlZCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgdHVwbGVzIG9mICIoa2V5LCB2YWx1ZSkiKSBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIGFuIGFyYml0cmFyeSBvcmRlciAnCisgICAgICAgICAgICAgICAgICd3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAnICAgbm9uLXJhbmRvbSwgdmFyaWVzIGFjcm9zcyBQeXRob24gaW1wbGVtZW50YXRpb25zLCBhbmQgJworICAgICAgICAgICAgICAgICAnZGVwZW5kcyBvblxuJworICAgICAgICAgICAgICAgICAiICAgdGhlIGRpY3Rpb25hcnkncyBoaXN0b3J5IG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gSWYgIgorICAgICAgICAgICAgICAgICAna2V5cyxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyAnCisgICAgICAgICAgICAgICAgICdpbnRlcnZlbmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIG9yZGVyIG9mIGl0ZW1zIHdpbGwgJworICAgICAgICAgICAgICAgICAnZGlyZWN0bHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgIih2YWx1ZSwga2V5KSIgJworICAgICAgICAgICAgICAgICAncGFpcnMgdXNpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ6aXAoKSI6ICJwYWlycyA9IHppcChkLnZhbHVlcygpLCBkLmtleXMoKSkiLiAgQW5vdGhlciAnCisgICAgICAgICAgICAgICAgICd3YXkgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzICJwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbiAnCisgICAgICAgICAgICAgICAgICdkLml0ZW1zKCldIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSXRlcmF0aW5nIHZpZXdzIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBtYXkgcmFpc2UgYSAiUnVudGltZUVycm9yIiBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgJworICAgICAgICAgICAgICAgICAnZW50cmllcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAneCBpbiBkaWN0dmlld1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gIlRydWUiIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzICcKKyAgICAgICAgICAgICAgICAgJ2tleXMsIHZhbHVlc1xuJworICAgICAgICAgICAgICAgICAnICAgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhICIoa2V5LCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSkiXG4nCisgICAgICAgICAgICAgICAgICcgICB0dXBsZSkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0tleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgJworICAgICAgICAgICAgICAgICAnaGFzaGFibGUuXG4nCisgICAgICAgICAgICAgICAgICdJZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAiKGtleSwgdmFsdWUpIiBwYWlycyBhcmUgJworICAgICAgICAgICAgICAgICAndW5pcXVlXG4nCisgICAgICAgICAgICAgICAgICdhbmQgaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgJworICAgICAgICAgICAgICAgICAndmlld3MgYXJlXG4nCisgICAgICAgICAgICAgICAgICdub3QgdHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCAnCisgICAgICAgICAgICAgICAgICd1bmlxdWUuKVxuJworICAgICAgICAgICAgICAgICAnRm9yIHNldC1saWtlIHZpZXdzLCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Fic3RyYWN0XG4nCisgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzICJjb2xsZWN0aW9ucy5hYmMuU2V0IiBhcmUgYXZhaWxhYmxlIChmb3IgZXhhbXBsZSwgJworICAgICAgICAgICAgICAgICAnIj09IixcbicKKyAgICAgICAgICAgICAgICAgJyI8Iiwgb3IgIl4iKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkaXNoZXMgPSB7J2VnZ3MnOiAyLCAnc2F1c2FnZSc6IDEsICdiYWNvbic6IDEsICIKKyAgICAgICAgICAgICAgICAgIidzcGFtJzogNTAwfVxuIgorICAgICAgICAgICAgICAgICAnICAgPj4+IGtleXMgPSBkaXNoZXMua2V5cygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdmFsdWVzID0gZGlzaGVzLnZhbHVlcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAjIGl0ZXJhdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IG4gPSAwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gZm9yIHZhbCBpbiB2YWx1ZXM6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIG4gKz0gdmFsXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gcHJpbnQobilcbicKKyAgICAgICAgICAgICAgICAgJyAgIDUwNFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAnb3JkZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KGtleXMpXG4nCisgICAgICAgICAgICAgICAgICIgICBbJ2VnZ3MnLCAnYmFjb24nLCAnc2F1c2FnZScsICdzcGFtJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KHZhbHVlcylcbicKKyAgICAgICAgICAgICAgICAgJyAgIFsyLCAxLCAxLCA1MDBdXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkZWwgZGlzaGVzWydlZ2dzJ11cbiIKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkZWwgZGlzaGVzWydzYXVzYWdlJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KGtleXMpXG4nCisgICAgICAgICAgICAgICAgICIgICBbJ3NwYW0nLCAnYmFjb24nXVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBzZXQgb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICAgICAiICAgPj4+IGtleXMgJiB7J2VnZ3MnLCAnYmFjb24nLCAnc2FsYWQnfVxuIgorICAgICAgICAgICAgICAgICAiICAgeydiYWNvbid9XG4iCisgICAgICAgICAgICAgICAgICIgICA+Pj4ga2V5cyBeIHsnc2F1c2FnZScsICdqdWljZSd9XG4iCisgICAgICAgICAgICAgICAgICIgICB7J2p1aWNlJywgJ3NhdXNhZ2UnLCAnYmFjb24nLCAnc3BhbSd9XG4iLAorICd0eXBlc21ldGhvZHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ01ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICdub3RhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSB0d28gZmxhdm9yczogYnVpbHQtaW4gbWV0aG9kcyAoc3VjaCBhcyAiYXBwZW5kKCkiICcKKyAgICAgICAgICAgICAgICAgJ29uIGxpc3RzKVxuJworICAgICAgICAgICAgICAgICAnYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWQgJworICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3R5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJZiB5b3UgYWNjZXNzIGEgbWV0aG9kIChhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UpXG4nCisgICAgICAgICAgICAgICAgICd0aHJvdWdoIGFuIGluc3RhbmNlLCB5b3UgZ2V0IGEgc3BlY2lhbCBvYmplY3Q6IGEgKmJvdW5kICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCogKGFsc29cbicKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCAqaW5zdGFuY2UgbWV0aG9kKikgb2JqZWN0LiBXaGVuIGNhbGxlZCwgaXQgd2lsbCBhZGQgJworICAgICAgICAgICAgICAgICAndGhlICJzZWxmIlxuJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBCb3VuZCBtZXRob2RzIGhhdmUgdHdvICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWwgcmVhZC1cbicKKyAgICAgICAgICAgICAgICAgJ29ubHkgYXR0cmlidXRlczogIm0uX19zZWxmX18iIGlzIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnb3BlcmF0ZXMsIGFuZCAibS5fX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnQ2FsbGluZyAibShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIiBpcyBjb21wbGV0ZWx5ICcKKyAgICAgICAgICAgICAgICAgJ2VxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAgICAgJ2NhbGxpbmcgIm0uX19mdW5jX18obS5fX3NlbGZfXywgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0xpa2UgZnVuY3Rpb24gb2JqZWN0cywgYm91bmQgbWV0aG9kIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nICcKKyAgICAgICAgICAgICAgICAgJ2FyYml0cmFyeVxuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcy4gIEhvd2V2ZXIsIHNpbmNlIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBhY3R1YWxseSAnCisgICAgICAgICAgICAgICAgICdzdG9yZWQgb25cbicKKyAgICAgICAgICAgICAgICAgJ3RoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoIm1ldGguX19mdW5jX18iKSwgc2V0dGluZyAnCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMgb24gYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byAnCisgICAgICAgICAgICAgICAgICdzZXQgYW5cbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluIGFuICJBdHRyaWJ1dGVFcnJvciIgYmVpbmcgJworICAgICAgICAgICAgICAgICAncmFpc2VkLiAgSW5cbicKKyAgICAgICAgICAgICAgICAgJ29yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0ICcKKyAgICAgICAgICAgICAgICAgJ2l0IG9uIHRoZVxuJworICAgICAgICAgICAgICAgICAndW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IEMoKVxuJworICAgICAgICAgICAgICAgICAiICAgPj4+IGMubWV0aG9kLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcgICMgY2FuJ3Qgc2V0IG9uICIKKyAgICAgICAgICAgICAgICAgJ3RoZSBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIEF0dHJpYnV0ZUVycm9yOiAnbWV0aG9kJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICInd2hvYW1pJ1xuIgorICAgICAgICAgICAgICAgICAiICAgPj4+IGMubWV0aG9kLl9fZnVuY19fLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCdcbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjLm1ldGhvZC53aG9hbWlcbicKKyAgICAgICAgICAgICAgICAgIiAgICdteSBuYW1lIGlzIG1ldGhvZCdcbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbW9kdWxlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ01vZHVsZXNcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKipcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczogJworICAgICAgICAgICAgICAgICAnIm0ubmFtZSIsXG4nCisgICAgICAgICAgICAgICAgICd3aGVyZSAqbSogaXMgYSBtb2R1bGUgYW5kICpuYW1lKiBhY2Nlc3NlcyBhIG5hbWUgZGVmaW5lZCBpbiAnCisgICAgICAgICAgICAgICAgICIqbSonc1xuIgorICAgICAgICAgICAgICAgICAnc3ltYm9sIHRhYmxlLiBNb2R1bGUgYXR0cmlidXRlcyBjYW4gYmUgYXNzaWduZWQgdG8uICAoTm90ZSAnCisgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnImltcG9ydCIgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdvbiBhIG1vZHVsZVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0OyAiaW1wb3J0IGZvbyIgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3QgbmFtZWQgJworICAgICAgICAgICAgICAgICAnKmZvbyogdG9cbicKKyAgICAgICAgICAgICAgICAgJ2V4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbiogZm9yIGEgJworICAgICAgICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICAgICAgICduYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyAiX19kaWN0X18iLiBUaGlzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUuIE1vZGlmeWluZyAiCisgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUsICIKKyAgICAgICAgICAgICAgICAgJ2J1dCBkaXJlY3RcbicKKyAgICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnQgdG8gdGhlICJfX2RpY3RfXyIgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91ICcKKyAgICAgICAgICAgICAgICAgJ2NhbiB3cml0ZVxuJworICAgICAgICAgICAgICAgICAnIm0uX19kaWN0X19bXCdhXCddID0gMSIsIHdoaWNoIGRlZmluZXMgIm0uYSIgdG8gYmUgIjEiLCBidXQgJworICAgICAgICAgICAgICAgICAieW91IGNhbid0XG4iCisgICAgICAgICAgICAgICAgICd3cml0ZSAibS5fX2RpY3RfXyA9IHt9IikuICBNb2RpZnlpbmcgIl9fZGljdF9fIiBkaXJlY3RseSBpcyAnCisgICAgICAgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgICAgICAgJ3JlY29tbWVuZGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogJworICAgICAgICAgICAgICAgICAnIjxtb2R1bGVcbicKKyAgICAgICAgICAgICAgICAgJ1wnc3lzXCcgKGJ1aWx0LWluKT4iLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSAnCisgICAgICAgICAgICAgICAgICd3cml0dGVuIGFzXG4nCisgICAgICAgICAgICAgICAgICciPG1vZHVsZSBcJ29zXCcgZnJvbSAnCisgICAgICAgICAgICAgICAgICdcJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWNcJz4iLlxuJywKKyAndHlwZXNzZXEnOiAnXG4nCisgICAgICAgICAgICAgJ1NlcXVlbmNlIFR5cGVzIC0tLSAibGlzdCIsICJ0dXBsZSIsICJyYW5nZSJcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlcmUgYXJlIHRocmVlIGJhc2ljIHNlcXVlbmNlIHR5cGVzOiBsaXN0cywgdHVwbGVzLCBhbmQgcmFuZ2VcbicKKyAgICAgICAgICAgICAnb2JqZWN0cy4gQWRkaXRpb25hbCBzZXF1ZW5jZSB0eXBlcyB0YWlsb3JlZCBmb3IgcHJvY2Vzc2luZyBvZiAnCisgICAgICAgICAgICAgJ2JpbmFyeVxuJworICAgICAgICAgICAgICdkYXRhIGFuZCB0ZXh0IHN0cmluZ3MgYXJlIGRlc2NyaWJlZCBpbiBkZWRpY2F0ZWQgc2VjdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIHN1cHBvcnRlZCBieSBtb3N0ICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAndHlwZXMsIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlLiBUaGUgJworICAgICAgICAgICAgICciY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkNcbicKKyAgICAgICAgICAgICAnaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSAnCisgICAgICAgICAgICAgJ29wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnb24gY3VzdG9tIHNlcXVlbmNlIHR5cGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nICcKKyAgICAgICAgICAgICAncHJpb3JpdHkuXG4nCisgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSwgKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLCAqbiosICcKKyAgICAgICAgICAgICAnKmkqLFxuJworICAgICAgICAgICAgICcqaiogYW5kICprKiBhcmUgaW50ZWdlcnMgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgJworICAgICAgICAgICAgICdtZWV0cyBhbnlcbicKKyAgICAgICAgICAgICAndHlwZSBhbmQgdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb3BlcmF0aW9ucy4gVGhlICIrIiAoY29uY2F0ZW5hdGlvbikgYW5kICIqIiAnCisgICAgICAgICAgICAgJyhyZXBldGl0aW9uKVxuJworICAgICAgICAgICAgICdvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY1xuJworICAgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgTm90ZXMgICAgICB8XG4nCisgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICd8ICJ4IGluIHMiICAgICAgICAgICAgICAgICAgIHwgIlRydWUiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAgJworICAgICAgICAgICAgICd8ICgxKSAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJGYWxzZSIgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAieCBub3QgaW4gcyIgICAgICAgICAgICAgICB8ICJGYWxzZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgICcKKyAgICAgICAgICAgICAnfCAoMSkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiVHJ1ZSIgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMgKyB0IiAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqcyogYW5kICp0KiAnCisgICAgICAgICAgICAgJ3wgKDYpKDcpICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICogbiIgb3IgIm4gKiBzIiAgICAgICAgIHwgZXF1aXZhbGVudCB0byBhZGRpbmcgKnMqIHRvICAgICAgJworICAgICAgICAgICAgICd8ICgyKSg3KSAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRzZWxmICpuKiB0aW1lcyAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpXSIgICAgICAgICAgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgICcKKyAgICAgICAgICAgICAnfCAoMykgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICAnCisgICAgICAgICAgICAgJ3wgKDMpKDQpICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgJworICAgICAgICAgICAgICd8ICgzKSg1KSAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2l0aCBzdGVwICprKiAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAibGVuKHMpIiAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgIm1pbihzKSIgICAgICAgICAgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJtYXgocykiICAgICAgICAgICAgICAgICAgIHwgbGFyZ2VzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5pbmRleCh4WywgaVssIGpdXSkiICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICcKKyAgICAgICAgICAgICAnfCAoOCkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogKGF0IG9yIGFmdGVyIGluZGV4ICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICppKiBhbmQgYmVmb3JlIGluZGV4ICpqKikgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuY291bnQoeCkiICAgICAgICAgICAgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUgYWxzbyBzdXBwb3J0IGNvbXBhcmlzb25zLiAgSW4gJworICAgICAgICAgICAgICdwYXJ0aWN1bGFyLFxuJworICAgICAgICAgICAgICd0dXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSBieSBjb21wYXJpbmdcbicKKyAgICAgICAgICAgICAnY29ycmVzcG9uZGluZyBlbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5XG4nCisgICAgICAgICAgICAgJ2VsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSAnCisgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAndHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgJworICAgICAgICAgICAgICdDb21wYXJpc29ucyBpblxuJworICAgICAgICAgICAgICd0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3IgJworICAgICAgICAgICAgICdzaW1wbGVcbicKKyAgICAgICAgICAgICAnICAgY29udGFpbm1lbnQgdGVzdGluZyBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBzb21lIHNwZWNpYWxpc2VkICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VzXG4nCisgICAgICAgICAgICAgJyAgIChzdWNoIGFzICJzdHIiLCAiYnl0ZXMiIGFuZCAiYnl0ZWFycmF5IikgYWxzbyB1c2UgdGhlbSBmb3JcbicKKyAgICAgICAgICAgICAnICAgc3Vic2VxdWVuY2UgdGVzdGluZzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiAiZ2ciIGluICJlZ2dzIlxuJworICAgICAgICAgICAgICcgICAgICBUcnVlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBWYWx1ZXMgb2YgKm4qIGxlc3MgdGhhbiAiMCIgYXJlIHRyZWF0ZWQgYXMgIjAiICh3aGljaCB5aWVsZHMgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICcgICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIHRoYXQgaXRlbXMgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgKnMqIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlICcKKyAgICAgICAgICAgICAndGltZXMuXG4nCisgICAgICAgICAgICAgJyAgIFRoaXMgb2Z0ZW4gaGF1bnRzIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzID0gW1tdXSAqIDNcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzXG4nCisgICAgICAgICAgICAgJyAgICAgIFtbXSwgW10sIFtdXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1xuJworICAgICAgICAgICAgICcgICAgICBbWzNdLCBbM10sIFszXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgIltbXV0iIGlzIGEgb25lLWVsZW1lbnQgbGlzdCAnCisgICAgICAgICAgICAgJ2NvbnRhaW5pbmdcbicKKyAgICAgICAgICAgICAnICAgYW4gZW1wdHkgbGlzdCwgc28gYWxsIHRocmVlIGVsZW1lbnRzIG9mICJbW11dICogMyIgYXJlICcKKyAgICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAgICcgICB0byB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbicKKyAgICAgICAgICAgICAnICAgImxpc3RzIiBtb2RpZmllcyB0aGlzIHNpbmdsZSBsaXN0LiBZb3UgY2FuIGNyZWF0ZSBhIGxpc3Qgb2ZcbicKKyAgICAgICAgICAgICAnICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzID0gW1tdIGZvciBpIGluIHJhbmdlKDMpXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1sxXS5hcHBlbmQoNSlcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzJdLmFwcGVuZCg3KVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNcbicKKyAgICAgICAgICAgICAnICAgICAgW1szXSwgWzVdLCBbN11dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBGdXJ0aGVyIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRkFRIGVudHJ5IEhvdyBkbyBJICcKKyAgICAgICAgICAgICAnY3JlYXRlIGFcbicKKyAgICAgICAgICAgICAnICAgbXVsdGlkaW1lbnNpb25hbCBsaXN0Py5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuIElmICppKiBvciAqaiogaXMgbmVnYXRpdmUsIHRoZSBpbmRleCBpcyByZWxhdGl2ZSB0byB0aGUgZW5kICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgdGhlIHN0cmluZzogImxlbihzKSArIGkiIG9yICJsZW4ocykgKyBqIiBpcyBzdWJzdGl0dXRlZC4gIEJ1dCAnCisgICAgICAgICAgICAgJ25vdGVcbicKKyAgICAgICAgICAgICAnICAgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgaXRlbXMgd2l0aCBpbmRleCAqayogc3VjaCB0aGF0ICJpIDw9IGsgPCBqIi4gIElmICppKiBvciAqaiogJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpcyBvbWl0dGVkIG9yICcKKyAgICAgICAgICAgICAnIk5vbmUiLFxuJworICAgICAgICAgICAgICcgICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKmoqLCB0aGUgc2xpY2UgaXMgZW1wdHkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc1LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiB3aXRoIHN0ZXAgKmsqIGlzIGRlZmluZWQgYXMgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiAnCisgICAgICAgICAgICAgJzxcbicKKyAgICAgICAgICAgICAnICAgKGotaSkvayIuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlICJpIiwgImkrayIsICcKKyAgICAgICAgICAgICAnImkrMiprIixcbicKKyAgICAgICAgICAgICAnICAgImkrMyprIiBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4gKmoqIGlzIHJlYWNoZWQgKGJ1dCBuZXZlclxuJworICAgICAgICAgICAgICcgICBpbmNsdWRpbmcgKmoqKS4gIElmICppKiBvciAqaiogaXMgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2VcbicKKyAgICAgICAgICAgICAnICAgImxlbihzKSIuICBJZiAqaSogb3IgKmoqIGFyZSBvbWl0dGVkIG9yICJOb25lIiwgdGhleSBiZWNvbWUgJworICAgICAgICAgICAgICciZW5kIlxuJworICAgICAgICAgICAgICcgICB2YWx1ZXMgKHdoaWNoIGVuZCBkZXBlbmRzIG9uIHRoZSBzaWduIG9mICprKikuICBOb3RlLCAqayogJworICAgICAgICAgICAgICdjYW5ub3QgYmVcbicKKyAgICAgICAgICAgICAnICAgemVyby4gSWYgKmsqIGlzICJOb25lIiwgaXQgaXMgdHJlYXRlZCBsaWtlICIxIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzYuIENvbmNhdGVuYXRpbmcgaW1tdXRhYmxlIHNlcXVlbmNlcyBhbHdheXMgcmVzdWx0cyBpbiBhIG5ld1xuJworICAgICAgICAgICAgICcgICBvYmplY3QuIFRoaXMgbWVhbnMgdGhhdCBidWlsZGluZyB1cCBhIHNlcXVlbmNlIGJ5IHJlcGVhdGVkXG4nCisgICAgICAgICAgICAgJyAgIGNvbmNhdGVuYXRpb24gd2lsbCBoYXZlIGEgcXVhZHJhdGljIHJ1bnRpbWUgY29zdCBpbiB0aGUgJworICAgICAgICAgICAgICd0b3RhbFxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSBsZW5ndGguIFRvIGdldCBhIGxpbmVhciBydW50aW1lIGNvc3QsIHlvdSBtdXN0ICcKKyAgICAgICAgICAgICAnc3dpdGNoIHRvXG4nCisgICAgICAgICAgICAgJyAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGJlbG93OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJzdHIiIG9iamVjdHMsIHlvdSBjYW4gYnVpbGQgYSBsaXN0IGFuZCAnCisgICAgICAgICAgICAgJ3VzZVxuJworICAgICAgICAgICAgICcgICAgICJzdHIuam9pbigpIiBhdCB0aGUgZW5kIG9yIGVsc2Ugd3JpdGUgdG8gYW4gImlvLlN0cmluZ0lPIlxuJworICAgICAgICAgICAgICcgICAgIGluc3RhbmNlIGFuZCByZXRyaWV2ZSBpdHMgdmFsdWUgd2hlbiBjb21wbGV0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJieXRlcyIgb2JqZWN0cywgeW91IGNhbiBzaW1pbGFybHkgdXNlXG4nCisgICAgICAgICAgICAgJyAgICAgImJ5dGVzLmpvaW4oKSIgb3IgImlvLkJ5dGVzSU8iLCBvciB5b3UgY2FuIGRvIGluLXBsYWNlXG4nCisgICAgICAgICAgICAgJyAgICAgY29uY2F0ZW5hdGlvbiB3aXRoIGEgImJ5dGVhcnJheSIgb2JqZWN0LiAgImJ5dGVhcnJheSIgJworICAgICAgICAgICAgICdvYmplY3RzIGFyZVxuJworICAgICAgICAgICAgICcgICAgIG11dGFibGUgYW5kIGhhdmUgYW4gZWZmaWNpZW50IG92ZXJhbGxvY2F0aW9uIG1lY2hhbmlzbVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogZm9yIG90aGVyIHR5cGVzLCBpbnZlc3RpZ2F0ZSB0aGUgcmVsZXZhbnQgY2xhc3MgJworICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc3LiBTb21lIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzICJyYW5nZSIpIG9ubHkgc3VwcG9ydCBpdGVtXG4nCisgICAgICAgICAgICAgIiAgIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvbid0ICIKKyAgICAgICAgICAgICAnc3VwcG9ydFxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc4LiAiaW5kZXgiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gJworICAgICAgICAgICAgICdXaGVuXG4nCisgICAgICAgICAgICAgJyAgIHN1cHBvcnRlZCwgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBpbmRleCBtZXRob2QgJworICAgICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICAgICcgICBlZmZpY2llbnQgc2VhcmNoaW5nIG9mIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZS4gUGFzc2luZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBleHRyYSBhcmd1bWVudHMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHVzaW5nICcKKyAgICAgICAgICAgICAnInNbaTpqXS5pbmRleCh4KSIsXG4nCisgICAgICAgICAgICAgJyAgIG9ubHkgd2l0aG91dCBjb3B5aW5nIGFueSBkYXRhIGFuZCB3aXRoIHRoZSByZXR1cm5lZCBpbmRleCAnCisgICAgICAgICAgICAgJ2JlaW5nXG4nCisgICAgICAgICAgICAgJyAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0ICcKKyAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgJyAgIHNsaWNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0ltbXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBnZW5lcmFsbHkgJworICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAndGhhdCBpcyBub3QgYWxzbyBpbXBsZW1lbnRlZCBieSBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGlzICcKKyAgICAgICAgICAgICAnc3VwcG9ydCBmb3JcbicKKyAgICAgICAgICAgICAndGhlICJoYXNoKCkiIGJ1aWx0LWluLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyBzdXBwb3J0IGFsbG93cyBpbW11dGFibGUgc2VxdWVuY2VzLCBzdWNoIGFzICJ0dXBsZSIgJworICAgICAgICAgICAgICdpbnN0YW5jZXMsIHRvXG4nCisgICAgICAgICAgICAgJ2JlIHVzZWQgYXMgImRpY3QiIGtleXMgYW5kIHN0b3JlZCBpbiAic2V0IiBhbmQgImZyb3plbnNldCIgJworICAgICAgICAgICAgICdpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBdHRlbXB0aW5nIHRvIGhhc2ggYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgJworICAgICAgICAgICAgICd1bmhhc2hhYmxlXG4nCisgICAgICAgICAgICAgJ3ZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdNdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ3R5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byAnCisgICAgICAgICAgICAgJ21ha2VcbicKKyAgICAgICAgICAgICAnaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gJworICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICd0eXBlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiAnCisgICAgICAgICAgICAgJ2lzIGFueVxuJworICAgICAgICAgICAgICdpdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55ICcKKyAgICAgICAgICAgICAndHlwZSBhbmRcbicKKyAgICAgICAgICAgICAndmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgJworICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgJ2FjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9ICcKKyAgICAgICAgICAgICAnMjU1IikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgJ1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkICcKKyAgICAgICAgICAgICAnYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICcqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogJworICAgICAgICAgICAgICdpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiAnCisgICAgICAgICAgICAgJ3RoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICcKKyAgICAgICAgICAgICAnKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSAnCisgICAgICAgICAgICAgJ1tdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgJworICAgICAgICAgICAgICdhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgJworICAgICAgICAgICAgICcqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAnb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgJworICAgICAgICAgICAgICdsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgZW5kIG9mICcKKyAgICAgICAgICAgICAndGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSAnCisgICAgICAgICAgICAgJ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAnW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgJworICAgICAgICAgICAgICcoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCAnCisgICAgICAgICAgICAgJ3NbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgJworICAgICAgICAgICAgICcicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICcKKyAgICAgICAgICAgICAnInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyAnCisgICAgICAgICAgICAgJ29mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSAnCisgICAgICAgICAgICAgJ3NhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAndCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgJworICAgICAgICAgICAgICdjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qICcKKyAgICAgICAgICAgICAndGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0ICcKKyAgICAgICAgICAgICAndGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSAnCisgICAgICAgICAgICAgJ2FzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSAnCisgICAgICAgICAgICAgJ1t4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgKmkqICcKKyAgICAgICAgICAgICAnYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAnCisgICAgICAgICAgICAgJypzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gJworICAgICAgICAgICAgICcqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0gJworICAgICAgICAgICAgICd4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogJworICAgICAgICAgICAgICdpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAncGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIHJlcGxhY2luZy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSAnCisgICAgICAgICAgICAgJ2RlZmF1bHRcbicKKyAgICAgICAgICAgICAnICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuJworICAgICAgICAgICAgICcgICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgJworICAgICAgICAgICAgICd1c2Vyc1xuJworICAgICAgICAgICAgICcgICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlICcKKyAgICAgICAgICAgICAncmV2ZXJzZWRcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc1LiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIGFyZSBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAiICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb24ndCBzdXBwb3J0IHNsaWNpbmdcbiIKKyAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbicKKyAgICAgICAgICAgICAnICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlICcKKyAgICAgICAgICAgICAnc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgJyAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCAnCisgICAgICAgICAgICAgJ211bHRpcGxlXG4nCisgICAgICAgICAgICAgJyAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgQ29tbW9uIFNlcXVlbmNlICcKKyAgICAgICAgICAgICAnT3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdMaXN0c1xuJworICAgICAgICAgICAgICc9PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTGlzdHMgYXJlIG11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJ2hvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsICcKKyAgICAgICAgICAgICAndmFyeSBieVxuJworICAgICAgICAgICAgICdhcHBsaWNhdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyBsaXN0KFtpdGVyYWJsZV0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0cyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gc2V2ZXJhbCB3YXlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIHBhaXIgb2Ygc3F1YXJlIGJyYWNrZXRzIHRvIGRlbm90ZSB0aGUgZW1wdHkgbGlzdDogJworICAgICAgICAgICAgICciW10iXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogJworICAgICAgICAgICAgICciW2FdIixcbicKKyAgICAgICAgICAgICAnICAgICAiW2EsIGIsIGNdIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbjogIlt4IGZvciB4IGluIGl0ZXJhYmxlXSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJsaXN0KCkiIG9yICJsaXN0KGl0ZXJhYmxlKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSBsaXN0IHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAiICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgIgorICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gJworICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICcgICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmRcbicKKyAgICAgICAgICAgICAnICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAnImxpc3QoXCdhYmNcJykiXG4nCisgICAgICAgICAgICAgJyAgIHJldHVybnMgIltcJ2FcJywgXCdiXCcsIFwnY1wnXSIgYW5kICJsaXN0KCAoMSwgMiwgMykgKSIgJworICAgICAgICAgICAgICdyZXR1cm5zICJbMSwgMixcbicKKyAgICAgICAgICAgICAnICAgM10iLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICcgICBsaXN0LCAiW10iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTWFueSBvdGhlciBvcGVyYXRpb25zIGFsc28gcHJvZHVjZSBsaXN0cywgaW5jbHVkaW5nIHRoZSAnCisgICAgICAgICAgICAgJyJzb3J0ZWQoKSJcbicKKyAgICAgICAgICAgICAnICAgYnVpbHQtaW4uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0cyBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tb24gYW5kIG11dGFibGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICcgICBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoaXMgbWV0aG9kIHNvcnRzIHRoZSBsaXN0IGluIHBsYWNlLCB1c2luZyBvbmx5ICI8IiAnCisgICAgICAgICAgICAgJ2NvbXBhcmlzb25zXG4nCisgICAgICAgICAgICAgJyAgICAgIGJldHdlZW4gaXRlbXMuIEV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIC0gaWYgYW55ICcKKyAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICcgICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgICAgbGlzdCB3aWxsIGxpa2VseSBiZSBsZWZ0IGluIGEgcGFydGlhbGx5IG1vZGlmaWVkIHN0YXRlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICJzb3J0KCkiIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyB0aGF0IGNhbiBvbmx5IGJlIHBhc3NlZCBieVxuJworICAgICAgICAgICAgICcgICAgICBrZXl3b3JkIChrZXl3b3JkLW9ubHkgYXJndW1lbnRzKTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICcgICAgICBleHRyYWN0IGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudCAoZm9yICcKKyAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAnICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiAnCisgICAgICAgICAgICAgJ3RoZSBsaXN0XG4nCisgICAgICAgICAgICAgJyAgICAgIGlzIGNhbGN1bGF0ZWQgb25jZSBhbmQgdGhlbiB1c2VkIGZvciB0aGUgZW50aXJlIHNvcnRpbmcgJworICAgICAgICAgICAgICdwcm9jZXNzLlxuJworICAgICAgICAgICAgICcgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAiTm9uZSIgbWVhbnMgdGhhdCBsaXN0IGl0ZW1zIGFyZSAnCisgICAgICAgICAgICAgJ3NvcnRlZFxuJworICAgICAgICAgICAgICcgICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byAnCisgICAgICAgICAgICAgJ2NvbnZlcnQgYVxuJworICAgICAgICAgICAgICcgICAgICAyLnggc3R5bGUgKmNtcCogZnVuY3Rpb24gdG8gYSAqa2V5KiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gIlRydWUiLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgJ2xpc3RcbicKKyAgICAgICAgICAgICAnICAgICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3IgZWNvbm9teSBvZiAnCisgICAgICAgICAgICAgJ3NwYWNlXG4nCisgICAgICAgICAgICAgJyAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgJworICAgICAgICAgICAgICdvcGVyYXRlc1xuJworICAgICAgICAgICAgICcgICAgICBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSBzb3J0ZWQgc2VxdWVuY2UgJworICAgICAgICAgICAgICcodXNlXG4nCisgICAgICAgICAgICAgJyAgICAgICJzb3J0ZWQoKSIgdG8gZXhwbGljaXRseSByZXF1ZXN0IGEgbmV3IHNvcnRlZCBsaXN0ICcKKyAgICAgICAgICAgICAnaW5zdGFuY2UpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlICJzb3J0KCkiIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgICAgIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgICAgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWwgZm9yICcKKyAgICAgICAgICAgICAnc29ydGluZyBpblxuJworICAgICAgICAgICAgICcgICAgICBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsIHRoZW4gYnkgJworICAgICAgICAgICAgICdzYWxhcnlcbicKKyAgICAgICAgICAgICAnICAgICAgZ3JhZGUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgJworICAgICAgICAgICAgICdzb3J0ZWQsXG4nCisgICAgICAgICAgICAgJyAgICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlICcKKyAgICAgICAgICAgICAnbGlzdCBpc1xuJworICAgICAgICAgICAgICcgICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgJworICAgICAgICAgICAgICdhcHBlYXJcbicKKyAgICAgICAgICAgICAnICAgICAgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyAiVmFsdWVFcnJvciIgaWYgaXQgY2FuICcKKyAgICAgICAgICAgICAnZGV0ZWN0XG4nCisgICAgICAgICAgICAgJyAgICAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1R1cGxlc1xuJworICAgICAgICAgICAgICc9PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1R1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgJworICAgICAgICAgICAgICdjb2xsZWN0aW9ucyBvZlxuJworICAgICAgICAgICAgICdoZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJyJlbnVtZXJhdGUoKSJcbicKKyAgICAgICAgICAgICAnYnVpbHQtaW4pLiBUdXBsZXMgYXJlIGFsc28gdXNlZCBmb3IgY2FzZXMgd2hlcmUgYW4gaW1tdXRhYmxlICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAnb2YgaG9tb2dlbmVvdXMgZGF0YSBpcyBuZWVkZWQgKHN1Y2ggYXMgYWxsb3dpbmcgc3RvcmFnZSBpbiBhICcKKyAgICAgICAgICAgICAnInNldCIgb3JcbicKKyAgICAgICAgICAgICAnImRpY3QiIGluc3RhbmNlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHR1cGxlKFtpdGVyYWJsZV0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUdXBsZXMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHdheXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAnCisgICAgICAgICAgICAgJyIoKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgJworICAgICAgICAgICAgICciKGEsKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogU2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogImEsIGIsIGMiIG9yICIoYSwgYiwgYykiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHRoZSAidHVwbGUoKSIgYnVpbHQtaW46ICJ0dXBsZSgpIiBvciAnCisgICAgICAgICAgICAgJyJ0dXBsZShpdGVyYWJsZSkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgdHVwbGUgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCAnCisgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICIgICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSoncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciAiCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiAnCisgICAgICAgICAgICAgJ2l0ZXJhdG9yXG4nCisgICAgICAgICAgICAgJyAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIHR1cGxlLCBpdCBpcyByZXR1cm5lZFxuJworICAgICAgICAgICAgICcgICB1bmNoYW5nZWQuIEZvciBleGFtcGxlLCAidHVwbGUoXCdhYmNcJykiIHJldHVybnMgIihcJ2FcJywgJworICAgICAgICAgICAgICdcJ2JcJywgXCdjXCcpIlxuJworICAgICAgICAgICAgICcgICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkgdHVwbGUsICIoKSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaXQgaXMgYWN0dWFsbHkgdGhlIGNvbW1hIHdoaWNoIG1ha2VzIGEgdHVwbGUsIG5vdCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSAnCisgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgJyAgIHR1cGxlIGNhc2UsIG9yIHdoZW4gdGhleSBhcmUgbmVlZGVkIHRvIGF2b2lkIHN5bnRhY3RpYyAnCisgICAgICAgICAgICAgJ2FtYmlndWl0eS5cbicKKyAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGUsICJmKGEsIGIsIGMpIiBpcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCB0aHJlZSAnCisgICAgICAgICAgICAgJ2FyZ3VtZW50cyxcbicKKyAgICAgICAgICAgICAnICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSAnCisgICAgICAgICAgICAgJ3NvbGVcbicKKyAgICAgICAgICAgICAnICAgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUdXBsZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGb3IgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9ucyBvZiBkYXRhIHdoZXJlIGFjY2VzcyBieSBuYW1lIGlzICcKKyAgICAgICAgICAgICAnY2xlYXJlclxuJworICAgICAgICAgICAgICd0aGFuIGFjY2VzcyBieSBpbmRleCwgImNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoKSIgbWF5IGJlIGEgbW9yZVxuJworICAgICAgICAgICAgICdhcHByb3ByaWF0ZSBjaG9pY2UgdGhhbiBhIHNpbXBsZSB0dXBsZSBvYmplY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUmFuZ2VzXG4nCisgICAgICAgICAgICAgJz09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJyYW5nZSIgdHlwZSByZXByZXNlbnRzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBudW1iZXJzIGFuZCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2NvbW1vbmx5IHVzZWQgZm9yIGxvb3BpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMgaW4gImZvciIgJworICAgICAgICAgICAgICdsb29wcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHJhbmdlKHN0b3ApXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgYXJndW1lbnRzIHRvIHRoZSByYW5nZSBjb25zdHJ1Y3RvciBtdXN0IGJlIGludGVnZXJzICcKKyAgICAgICAgICAgICAnKGVpdGhlclxuJworICAgICAgICAgICAgICcgICBidWlsdC1pbiAiaW50IiBvciBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgIl9faW5kZXhfXyJcbicKKyAgICAgICAgICAgICAnICAgc3BlY2lhbCBtZXRob2QpLiAgSWYgdGhlICpzdGVwKiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCAnCisgICAgICAgICAgICAgJ2RlZmF1bHRzIHRvXG4nCisgICAgICAgICAgICAgJyAgICIxIi4gSWYgdGhlICpzdGFydCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIjAiLiAnCisgICAgICAgICAgICAgJ0lmXG4nCisgICAgICAgICAgICAgJyAgICpzdGVwKiBpcyB6ZXJvLCAiVmFsdWVFcnJvciIgaXMgcmFpc2VkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRm9yIGEgcG9zaXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgYSByYW5nZSAiciIgYXJlICcKKyAgICAgICAgICAgICAnZGV0ZXJtaW5lZFxuJworICAgICAgICAgICAgICcgICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgJworICAgICAgICAgICAgICcicltpXSA8XG4nCisgICAgICAgICAgICAgJyAgIHN0b3AiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRm9yIGEgbmVnYXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgdGhlIHJhbmdlIGFyZSBzdGlsbFxuJworICAgICAgICAgICAgICcgICBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtdWxhICJyW2ldID0gc3RhcnQgKyBzdGVwKmkiLCBidXQgdGhlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnN0cmFpbnRzIGFyZSAiaSA+PSAwIiBhbmQgInJbaV0gPiBzdG9wIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEEgcmFuZ2Ugb2JqZWN0IHdpbGwgYmUgZW1wdHkgaWYgInJbMF0iIGRvZXMgbm90IG1lZXQgdGhlICcKKyAgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICAnICAgY29uc3RyYWludC4gUmFuZ2VzIGRvIHN1cHBvcnQgbmVnYXRpdmUgaW5kaWNlcywgYnV0IHRoZXNlICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJyAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5XG4nCisgICAgICAgICAgICAgJyAgIHRoZSBwb3NpdGl2ZSBpbmRpY2VzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2VzIGNvbnRhaW5pbmcgYWJzb2x1dGUgdmFsdWVzIGxhcmdlciB0aGFuICJzeXMubWF4c2l6ZSIgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZVxuJworICAgICAgICAgICAgICcgICAiT3ZlcmZsb3dFcnJvciIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSYW5nZSBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEwKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDExKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCA1LCAxMCwgMTUsIDIwLCAyNV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMTAsIDMpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgMywgNiwgOV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgLTEwLCAtMSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgwKSlcbicKKyAgICAgICAgICAgICAnICAgICAgW11cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFtdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSYW5nZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICdleGNlcHRcbicKKyAgICAgICAgICAgICAnICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2UgJworICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJyAgIGNhbiBvbmx5IHJlcHJlc2VudCBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgYSBzdHJpY3QgcGF0dGVybiAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICcgICByZXBldGl0aW9uIGFuZCBjb25jYXRlbmF0aW9uIHdpbGwgdXN1YWxseSB2aW9sYXRlIHRoYXQgJworICAgICAgICAgICAgICdwYXR0ZXJuKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHN0YXJ0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGFydCogcGFyYW1ldGVyIChvciAiMCIgaWYgdGhlICcKKyAgICAgICAgICAgICAncGFyYW1ldGVyIHdhc1xuJworICAgICAgICAgICAgICcgICAgICBub3Qgc3VwcGxpZWQpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdG9wXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdG9wKiBwYXJhbWV0ZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXBcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0ZXAqIHBhcmFtZXRlciAob3IgIjEiIGlmIHRoZSBwYXJhbWV0ZXIgJworICAgICAgICAgICAgICd3YXNcbicKKyAgICAgICAgICAgICAnICAgICAgbm90IHN1cHBsaWVkKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGFkdmFudGFnZSBvZiB0aGUgInJhbmdlIiB0eXBlIG92ZXIgYSByZWd1bGFyICJsaXN0IiBvciAnCisgICAgICAgICAgICAgJyJ0dXBsZSIgaXNcbicKKyAgICAgICAgICAgICAndGhhdCBhICJyYW5nZSIgb2JqZWN0IHdpbGwgYWx3YXlzIHRha2UgdGhlIHNhbWUgKHNtYWxsKSBhbW91bnQgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICdtZW1vcnksIG5vIG1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cyAoYXMgaXQgJworICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgJ3N0b3JlcyB0aGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgdmFsdWVzLCBjYWxjdWxhdGluZyAnCisgICAgICAgICAgICAgJ2luZGl2aWR1YWxcbicKKyAgICAgICAgICAgICAnaXRlbXMgYW5kIHN1YnJhbmdlcyBhcyBuZWVkZWQpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kXG4nCisgICAgICAgICAgICAgJ3Byb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBjb250YWlubWVudCB0ZXN0cywgZWxlbWVudCBpbmRleCAnCisgICAgICAgICAgICAgJ2xvb2t1cCxcbicKKyAgICAgICAgICAgICAnc2xpY2luZyBhbmQgc3VwcG9ydCBmb3IgbmVnYXRpdmUgaW5kaWNlcyAoc2VlIFNlcXVlbmNlIFR5cGVzIC0tLSAnCisgICAgICAgICAgICAgJ2xpc3QsXG4nCisgICAgICAgICAgICAgJ3R1cGxlLCByYW5nZSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKVxuJworICAgICAgICAgICAgICc+Pj4gclxuJworICAgICAgICAgICAgICdyYW5nZSgwLCAyMCwgMilcbicKKyAgICAgICAgICAgICAnPj4+IDExIGluIHJcbicKKyAgICAgICAgICAgICAnRmFsc2VcbicKKyAgICAgICAgICAgICAnPj4+IDEwIGluIHJcbicKKyAgICAgICAgICAgICAnVHJ1ZVxuJworICAgICAgICAgICAgICc+Pj4gci5pbmRleCgxMClcbicKKyAgICAgICAgICAgICAnNVxuJworICAgICAgICAgICAgICc+Pj4gcls1XVxuJworICAgICAgICAgICAgICcxMFxuJworICAgICAgICAgICAgICc+Pj4gcls6NV1cbicKKyAgICAgICAgICAgICAncmFuZ2UoMCwgMTAsIDIpXG4nCisgICAgICAgICAgICAgJz4+PiByWy0xXVxuJworICAgICAgICAgICAgICcxOFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGVzdGluZyByYW5nZSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoICI9PSIgYW5kICIhPSIgY29tcGFyZXMgJworICAgICAgICAgICAgICd0aGVtIGFzXG4nCisgICAgICAgICAgICAgJ3NlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmICcKKyAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICdyZXByZXNlbnQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzLiAgKE5vdGUgdGhhdCB0d28gcmFuZ2UgJworICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJ3RoYXQgY29tcGFyZSBlcXVhbCBtaWdodCBoYXZlIGRpZmZlcmVudCAic3RhcnQiLCAic3RvcCIgYW5kICcKKyAgICAgICAgICAgICAnInN0ZXAiXG4nCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgJworICAgICAgICAgICAgICcicmFuZ2UoMCwgMyxcbicKKyAgICAgICAgICAgICAnMikgPT0gcmFuZ2UoMCwgNCwgMikiLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEltcGxlbWVudCB0aGUgU2VxdWVuY2UgQUJDLiBTdXBwb3J0ICcKKyAgICAgICAgICAgICAnc2xpY2luZ1xuJworICAgICAgICAgICAgICdhbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluICcKKyAgICAgICAgICAgICAnY29uc3RhbnRcbicKKyAgICAgICAgICAgICAndGltZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpdGVtcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IERlZmluZSAnPT0nIGFuZCAnIT0nIHRvIGNvbXBhcmUgcmFuZ2UgIgorICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJ2Jhc2VkIG9uIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhleSBkZWZpbmUgKGluc3RlYWQgb2YgJworICAgICAgICAgICAgICdjb21wYXJpbmdcbicKKyAgICAgICAgICAgICAnYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5KS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMuXG4nLAorICd0eXBlc3NlcS1tdXRhYmxlJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ011dGFibGUgU2VxdWVuY2UgVHlwZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiAnCisgICAgICAgICAgICAgICAgICAgICAnbXV0YWJsZSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncHJvdmlkZWQgdG8gbWFrZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2l0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gJworICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlLCAqdCogaXMgYW55XG4nCisgICAgICAgICAgICAgICAgICAgICAnaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICdtZWV0cyBhbnkgdHlwZSBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAnCisgICAgICAgICAgICAgICAgICAgICAnImJ5dGVhcnJheSIgb25seVxuJworICAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4ICcKKyAgICAgICAgICAgICAgICAgICAgICc8PSAyNTUiKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICcqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqICcKKyAgICAgICAgICAgICAgICAgICAgICd0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAnCisgICAgICAgICAgICAgICAgICAgICAnKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gJworICAgICAgICAgICAgICAgICAgICAgJ1tdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnInNbaTpqOmtdIiBhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgJworICAgICAgICAgICAgICAgICAgICAgJ29mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2xpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2VuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgJworICAgICAgICAgICAgICAgICAgICAgJ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gJworICAgICAgICAgICAgICAgICAgICAgJ1t4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyAnCisgICAgICAgICAgICAgICAgICAgICAnZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCAnCisgICAgICAgICAgICAgICAgICAgICAnc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93ICcKKyAgICAgICAgICAgICAgICAgICAgICdjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAnCisgICAgICAgICAgICAgICAgICAgICAnInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSAnCisgICAgICAgICAgICAgICAgICAgICAnPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiAnCisgICAgICAgICAgICAgICAgICAgICAndGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiAnCisgICAgICAgICAgICAgICAgICAgICAnYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqICcKKyAgICAgICAgICAgICAgICAgICAgICcoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSAnCisgICAgICAgICAgICAgICAgICAgICAnW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgJworICAgICAgICAgICAgICAgICAgICAgJyppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gJworICAgICAgICAgICAgICAgICAgICAgJypzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSAnCisgICAgICAgICAgICAgICAgICAgICAnZnJvbSAqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSAnCisgICAgICAgICAgICAgICAgICAgICAneCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncmVwbGFjaW5nLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAnYnkgZGVmYXVsdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gJworICAgICAgICAgICAgICAgICAgICAgJypzKi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICc0LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSAnCisgICAgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gJworICAgICAgICAgICAgICAgICAgICAgJ3JlbWluZCB1c2Vyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHJldmVyc2VkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5ICcKKyAgICAgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgIiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAnc2xpY2luZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjM6ICJjbGVhcigpIiBhbmQgImNvcHkoKSIgbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICc2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VkIG11bHRpcGxlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciBDb21tb24gU2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbnMuXG4nLAorICd1bmFyeSc6ICdcbicKKyAgICAgICAgICAnVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAncHJpb3JpdHk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIi0iIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpY1xuJworICAgICAgICAgICdhcmd1bWVudC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSB1bmFyeSAiKyIgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCAnCisgICAgICAgICAgJ3VuY2hhbmdlZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSB1bmFyeSAifiIgKGludmVydCkgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAnCisgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICdpbnRlZ2VyIGFyZ3VtZW50LiAgVGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mICJ4IiBpcyBkZWZpbmVkIGFzXG4nCisgICAgICAgICAgJyItKHgrMSkiLiAgSXQgb25seSBhcHBsaWVzIHRvIGludGVncmFsIG51bWJlcnMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwgJworICAgICAgICAgICdhXG4nCisgICAgICAgICAgJyJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAorICd3aGlsZSc6ICdcbicKKyAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG4nCisgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgdHJ1ZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgJworICAgICAgICAgICd0aW1lXG4nCisgICAgICAgICAgJ2l0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyAnCisgICAgICAgICAgJ2V4ZWN1dGVkXG4nCisgICAgICAgICAgJ2FuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgJworICAgICAgICAgICdiYWNrXG4nCisgICAgICAgICAgJ3RvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAorICd3aXRoJzogJ1xuJworICAgICAgICAgJ1RoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbicKKyAgICAgICAgICdtZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggU3RhdGVtZW50XG4nCisgICAgICAgICAnQ29udGV4dCBNYW5hZ2VycykuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG4nCisgICAgICAgICAndXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuJworICAgICAgICAgJyAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbicKKyAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbicKKyAgICAgICAgICcgICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc0LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbicKKyAgICAgICAgICcgICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4nCisgICAgICAgICAnICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyAnCisgICAgICAgICAnYmVcbicKKyAgICAgICAgICcgICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbicKKyAgICAgICAgICcgICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4nCisgICAgICAgICAnICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc2LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4nCisgICAgICAgICAnICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuJworICAgICAgICAgJyAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgJworICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAnICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gJworICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAnICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgJworICAgICAgICAgJ3JlcmFpc2VkLlxuJworICAgICAgICAgJyAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4nCisgICAgICAgICAnICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbicKKyAgICAgICAgICcgICBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sICcKKyAgICAgICAgICd0aGVcbicKKyAgICAgICAgICcgICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiAnCisgICAgICAgICAncHJvY2VlZHNcbicKKyAgICAgICAgICcgICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1dpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG4nCisgICAgICAgICAnbXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4nCisgICAgICAgICAnICAgICAgIHN1aXRlXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGE6XG4nCisgICAgICAgICAnICAgICAgIHdpdGggQigpIGFzIGI6XG4nCisgICAgICAgICAnICAgICAgICAgICBzdWl0ZVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICcKKyAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicsCisgJ3lpZWxkJzogJ1xuJworICAgICAgICAgICdUaGUgInlpZWxkIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBICJ5aWVsZCIgc3RhdGVtZW50IGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgeWllbGQgJworICAgICAgICAgICdleHByZXNzaW9uLlxuJworICAgICAgICAgICdUaGUgeWllbGQgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIG9taXQgdGhlIHBhcmVudGhlc2VzIHRoYXQgd291bGRcbicKKyAgICAgICAgICAnb3RoZXJ3aXNlIGJlIHJlcXVpcmVkIGluIHRoZSBlcXVpdmFsZW50IHlpZWxkIGV4cHJlc3Npb24gJworICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgJ0ZvciBleGFtcGxlLCB0aGUgeWllbGQgc3RhdGVtZW50c1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgeWllbGQgPGV4cHI+XG4nCisgICAgICAgICAgJyAgIHlpZWxkIGZyb20gPGV4cHI+XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhcmUgZXF1aXZhbGVudCB0byB0aGUgeWllbGQgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAoeWllbGQgPGV4cHI+KVxuJworICAgICAgICAgICcgICAoeWllbGQgZnJvbSA8ZXhwcj4pXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdZaWVsZCBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYVxuJworICAgICAgICAgICcqZ2VuZXJhdG9yKiBmdW5jdGlvbiwgYW5kIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlICcKKyAgICAgICAgICAnZ2VuZXJhdG9yXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uLiAgVXNpbmcgeWllbGQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8gJworICAgICAgICAgICdjYXVzZVxuJworICAgICAgICAgICd0aGF0IGRlZmluaXRpb24gdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBub3JtYWxcbicKKyAgICAgICAgICAnZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdGb3IgZnVsbCBkZXRhaWxzIG9mICJ5aWVsZCIgc2VtYW50aWNzLCByZWZlciB0byB0aGUgWWllbGQgJworICAgICAgICAgICdleHByZXNzaW9uc1xuJworICAgICAgICAgICdzZWN0aW9uLlxuJ30KZGlmZiAtLWdpdCBhL0xpYi9yYW5kb20ucHkgYi9MaWIvcmFuZG9tLnB5CmluZGV4IDRlZmJiMGEuLjgyZjYwMTMgMTAwNjQ0Ci0tLSBhL0xpYi9yYW5kb20ucHkKKysrIGIvTGliL3JhbmRvbS5weQpAQCAtMTA1LDE1ICsxMDUsNiBAQAogCiAgICAgICAgICIiIgogCi0gICAgICAgIGlmIGEgaXMgTm9uZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIFNlZWQgd2l0aCBlbm91Z2ggYnl0ZXMgdG8gc3BhbiB0aGUgMTk5MzcgYml0Ci0gICAgICAgICAgICAgICAgIyBzdGF0ZSBzcGFjZSBmb3IgdGhlIE1lcnNlbm5lIFR3aXN0ZXIKLSAgICAgICAgICAgICAgICBhID0gaW50LmZyb21fYnl0ZXMoX3VyYW5kb20oMjUwMCksICdiaWcnKQotICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKLSAgICAgICAgICAgICAgICBhID0gaW50KHRpbWUudGltZSgpICogMjU2KSAjIHVzZSBmcmFjdGlvbmFsIHNlY29uZHMKLQogICAgICAgICBpZiB2ZXJzaW9uID09IDEgYW5kIGlzaW5zdGFuY2UoYSwgKHN0ciwgYnl0ZXMpKToKICAgICAgICAgICAgIHggPSBvcmQoYVswXSkgPDwgNyBpZiBhIGVsc2UgMAogICAgICAgICAgICAgZm9yIGMgaW4gYToKQEAgLTEyMSwxMiArMTEyLDExIEBACiAgICAgICAgICAgICB4IF49IGxlbihhKQogICAgICAgICAgICAgYSA9IC0yIGlmIHggPT0gLTEgZWxzZSB4CiAKLSAgICAgICAgaWYgdmVyc2lvbiA9PSAyOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCAoc3RyLCBieXRlcywgYnl0ZWFycmF5KSk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBzdHIpOgotICAgICAgICAgICAgICAgICAgICBhID0gYS5lbmNvZGUoKQotICAgICAgICAgICAgICAgIGEgKz0gX3NoYTUxMihhKS5kaWdlc3QoKQotICAgICAgICAgICAgICAgIGEgPSBpbnQuZnJvbV9ieXRlcyhhLCAnYmlnJykKKyAgICAgICAgaWYgdmVyc2lvbiA9PSAyIGFuZCBpc2luc3RhbmNlKGEsIChzdHIsIGJ5dGVzLCBieXRlYXJyYXkpKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgc3RyKToKKyAgICAgICAgICAgICAgICBhID0gYS5lbmNvZGUoKQorICAgICAgICAgICAgYSArPSBfc2hhNTEyKGEpLmRpZ2VzdCgpCisgICAgICAgICAgICBhID0gaW50LmZyb21fYnl0ZXMoYSwgJ2JpZycpCiAKICAgICAgICAgc3VwZXIoKS5zZWVkKGEpCiAgICAgICAgIHNlbGYuZ2F1c3NfbmV4dCA9IE5vbmUKQEAgLTYxNSwxMSArNjA1LDExIEBACiAKICAgICAgICAgIyBUaGlzIHZlcnNpb24gZHVlIHRvIEphbm5lIFNpbmtrb25lbiwgYW5kIG1hdGNoZXMgYWxsIHRoZSBzdGQKICAgICAgICAgIyB0ZXh0cyAoZS5nLiwgS251dGggVm9sIDIgRWQgMyBwZyAxMzQgInRoZSBiZXRhIGRpc3RyaWJ1dGlvbiIpLgotICAgICAgICB5ID0gc2VsZi5nYW1tYXZhcmlhdGUoYWxwaGEsIDEuKQorICAgICAgICB5ID0gc2VsZi5nYW1tYXZhcmlhdGUoYWxwaGEsIDEuMCkKICAgICAgICAgaWYgeSA9PSAwOgogICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHkgLyAoeSArIHNlbGYuZ2FtbWF2YXJpYXRlKGJldGEsIDEuKSkKKyAgICAgICAgICAgIHJldHVybiB5IC8gKHkgKyBzZWxmLmdhbW1hdmFyaWF0ZShiZXRhLCAxLjApKQogCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJldG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvTGliL3JlLnB5IGIvTGliL3JlLnB5CmluZGV4IGRkZTg5MDEuLjY2MTkyOWUgMTAwNjQ0Ci0tLSBhL0xpYi9yZS5weQorKysgYi9MaWIvcmUucHkKQEAgLTExOSw3ICsxMTksNiBAQAogCiAiIiIKIAotaW1wb3J0IHN5cwogaW1wb3J0IHNyZV9jb21waWxlCiBpbXBvcnQgc3JlX3BhcnNlCiB0cnk6CmRpZmYgLS1naXQgYS9MaWIvcmxjb21wbGV0ZXIucHkgYi9MaWIvcmxjb21wbGV0ZXIucHkKaW5kZXggNDAxYTYyNi4uYmNhNGE3YiAxMDA2NDQKLS0tIGEvTGliL3JsY29tcGxldGVyLnB5CisrKyBiL0xpYi9ybGNvbXBsZXRlci5weQpAQCAtMTEzLDYgKzExMywxMiBAQAogICAgICAgICBmb3Igd29yZCBpbiBrZXl3b3JkLmt3bGlzdDoKICAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IHRleHQ6CiAgICAgICAgICAgICAgICAgc2Vlbi5hZGQod29yZCkKKyAgICAgICAgICAgICAgICBpZiB3b3JkIGluIHsnZmluYWxseScsICd0cnknfToKKyAgICAgICAgICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAnOicKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgbm90IGluIHsnRmFsc2UnLCAnTm9uZScsICdUcnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJlYWsnLCAnY29udGludWUnLCAncGFzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vsc2UnfToKKyAgICAgICAgICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAnICcKICAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCh3b3JkKQogICAgICAgICBmb3IgbnNwYWNlIGluIFtzZWxmLm5hbWVzcGFjZSwgYnVpbHRpbnMuX19kaWN0X19dOgogICAgICAgICAgICAgZm9yIHdvcmQsIHZhbCBpbiBuc3BhY2UuaXRlbXMoKToKQEAgLTE1MiwxNCArMTU4LDMwIEBACiAgICAgICAgICAgICB3b3Jkcy51cGRhdGUoZ2V0X2NsYXNzX21lbWJlcnModGhpc29iamVjdC5fX2NsYXNzX18pKQogICAgICAgICBtYXRjaGVzID0gW10KICAgICAgICAgbiA9IGxlbihhdHRyKQotICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKLSAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IGF0dHI6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHRoaXNvYmplY3QsIHdvcmQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgICMgRXhjbHVkZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBzZXQKLSAgICAgICAgICAgICAgICB3b3JkID0gc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsICIlcy4lcyIgJSAoZXhwciwgd29yZCkpCi0gICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKKyAgICAgICAgaWYgYXR0ciA9PSAnJzoKKyAgICAgICAgICAgIG5vcHJlZml4ID0gJ18nCisgICAgICAgIGVsaWYgYXR0ciA9PSAnXyc6CisgICAgICAgICAgICBub3ByZWZpeCA9ICdfXycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vcHJlZml4ID0gTm9uZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICAgICAgaWYgKHdvcmRbOm5dID09IGF0dHIgYW5kCisgICAgICAgICAgICAgICAgICAgIG5vdCAobm9wcmVmaXggYW5kIHdvcmRbOm4rMV0gPT0gbm9wcmVmaXgpKToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAiJXMuJXMiICUgKGV4cHIsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIodGhpc29iamVjdCwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICMgSW5jbHVkZSBldmVuIGlmIGF0dHJpYnV0ZSBub3Qgc2V0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHNlbGYuX2NhbGxhYmxlX3Bvc3RmaXgodmFsLCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQobWF0Y2gpCisgICAgICAgICAgICBpZiBtYXRjaGVzIG9yIG5vdCBub3ByZWZpeDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm9wcmVmaXggPT0gJ18nOgorICAgICAgICAgICAgICAgIG5vcHJlZml4ID0gJ19fJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub3ByZWZpeCA9IE5vbmUKICAgICAgICAgbWF0Y2hlcy5zb3J0KCkKICAgICAgICAgcmV0dXJuIG1hdGNoZXMKIApkaWZmIC0tZ2l0IGEvTGliL3J1bnB5LnB5IGIvTGliL3J1bnB5LnB5CmluZGV4IGUyOTBjMjEuLmQ4NmYwZTQgMTAwNjQ0Ci0tLSBhL0xpYi9ydW5weS5weQorKysgYi9MaWIvcnVucHkucHkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAjIG1heSBiZSBjbGVhcmVkIHdoZW4gdGhlIHRlbXBvcmFyeSBtb2R1bGUgZ29lcyBhd2F5CiAgICAgcmV0dXJuIG1vZF9nbG9iYWxzLmNvcHkoKQogCi0jIEhlbHBlciB0byBnZXQgdGhlIGxvYWRlciwgY29kZSBhbmQgZmlsZW5hbWUgZm9yIGEgbW9kdWxlCisjIEhlbHBlciB0byBnZXQgdGhlIGZ1bGwgbmFtZSwgc3BlYyBhbmQgY29kZSBmb3IgYSBtb2R1bGUKIGRlZiBfZ2V0X21vZHVsZV9kZXRhaWxzKG1vZF9uYW1lLCBlcnJvcj1JbXBvcnRFcnJvcik6CiAgICAgaWYgbW9kX25hbWUuc3RhcnRzd2l0aCgiLiIpOgogICAgICAgICByYWlzZSBlcnJvcigiUmVsYXRpdmUgbW9kdWxlIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKQpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgIHJldHVybiBfcnVuX21vZHVsZV9jb2RlKGNvZGUsIGluaXRfZ2xvYmFscywgcnVuX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ19uYW1lPXBrZ19uYW1lLCBzY3JpcHRfbmFtZT1mbmFtZSkKICAgICBlbHNlOgotICAgICAgICAjIEltcG9ydGVyIGlzIGRlZmluZWQgZm9yIHBhdGgsIHNvIGFkZCBpdCB0bworICAgICAgICAjIEZpbmRlciBpcyBkZWZpbmVkIGZvciBwYXRoLCBzbyBhZGQgaXQgdG8KICAgICAgICAgIyB0aGUgc3RhcnQgb2Ygc3lzLnBhdGgKICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGhfbmFtZSkKICAgICAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3NjaGVkLnB5IGIvTGliL3NjaGVkLnB5CmluZGV4IGI0NzY0OGQuLmJkN2MwZjEgMTAwNjQ0Ci0tLSBhL0xpYi9zY2hlZC5weQorKysgYi9MaWIvc2NoZWQucHkKQEAgLTQ2LDYgKzQ2LDE3IEBACiAgICAgZGVmIF9fZ3RfXyhzLCBvKTogcmV0dXJuIChzLnRpbWUsIHMucHJpb3JpdHkpID4gIChvLnRpbWUsIG8ucHJpb3JpdHkpCiAgICAgZGVmIF9fZ2VfXyhzLCBvKTogcmV0dXJuIChzLnRpbWUsIHMucHJpb3JpdHkpID49IChvLnRpbWUsIG8ucHJpb3JpdHkpCiAKK0V2ZW50LnRpbWUuX19kb2NfXyA9ICgnJydOdW1lcmljIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCit0aW1lZnVuYyBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLicnJykKK0V2ZW50LnByaW9yaXR5Ll9fZG9jX18gPSAoJycnRXZlbnRzIHNjaGVkdWxlZCBmb3IgdGhlIHNhbWUgdGltZSB3aWxsIGJlIGV4ZWN1dGVkCitpbiB0aGUgb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHkuJycnKQorRXZlbnQuYWN0aW9uLl9fZG9jX18gPSAoJycnRXhlY3V0aW5nIHRoZSBldmVudCBtZWFucyBleGVjdXRpbmcKK2FjdGlvbigqYXJndW1lbnQsICoqa3dhcmdzKScnJykKK0V2ZW50LmFyZ3VtZW50Ll9fZG9jX18gPSAoJycnYXJndW1lbnQgaXMgYSBzZXF1ZW5jZSBob2xkaW5nIHRoZSBwb3NpdGlvbmFsCithcmd1bWVudHMgZm9yIHRoZSBhY3Rpb24uJycnKQorRXZlbnQua3dhcmdzLl9fZG9jX18gPSAoJycna3dhcmdzIGlzIGEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBrZXl3b3JkCithcmd1bWVudHMgZm9yIHRoZSBhY3Rpb24uJycnKQorCiBfc2VudGluZWwgPSBvYmplY3QoKQogCiBjbGFzcyBzY2hlZHVsZXI6CmRpZmYgLS1naXQgYS9MaWIvc2VjcmV0cy5weSBiL0xpYi9zZWNyZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2VjcmV0cy5weQpAQCAtMCwwICsxLDcxIEBACisiIiJHZW5lcmF0ZSBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcgcHNldWRvLXJhbmRvbSBudW1iZXJzIHN1aXRhYmxlIGZvcgorbWFuYWdpbmcgc2VjcmV0cyBzdWNoIGFzIGFjY291bnQgYXV0aGVudGljYXRpb24sIHRva2VucywgYW5kIHNpbWlsYXIuCisKK1NlZSBQRVAgNTA2IGZvciBtb3JlIGluZm9ybWF0aW9uLgoraHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDUwNi8KKworIiIiCisKK19fYWxsX18gPSBbJ2Nob2ljZScsICdyYW5kYmVsb3cnLCAncmFuZGJpdHMnLCAnU3lzdGVtUmFuZG9tJywKKyAgICAgICAgICAgJ3Rva2VuX2J5dGVzJywgJ3Rva2VuX2hleCcsICd0b2tlbl91cmxzYWZlJywKKyAgICAgICAgICAgJ2NvbXBhcmVfZGlnZXN0JywKKyAgICAgICAgICAgXQorCisKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IG9zCisKK2Zyb20gaG1hYyBpbXBvcnQgY29tcGFyZV9kaWdlc3QKK2Zyb20gcmFuZG9tIGltcG9ydCBTeXN0ZW1SYW5kb20KKworX3N5c3JhbmQgPSBTeXN0ZW1SYW5kb20oKQorCityYW5kYml0cyA9IF9zeXNyYW5kLmdldHJhbmRiaXRzCitjaG9pY2UgPSBfc3lzcmFuZC5jaG9pY2UKKworZGVmIHJhbmRiZWxvdyhleGNsdXNpdmVfdXBwZXJfYm91bmQpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLCBuKS4iIiIKKyAgICByZXR1cm4gX3N5c3JhbmQuX3JhbmRiZWxvdyhleGNsdXNpdmVfdXBwZXJfYm91bmQpCisKK0RFRkFVTFRfRU5UUk9QWSA9IDMyICAjIG51bWJlciBvZiBieXRlcyB0byByZXR1cm4gYnkgZGVmYXVsdAorCitkZWYgdG9rZW5fYnl0ZXMobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBieXRlIHN0cmluZyBjb250YWluaW5nICpuYnl0ZXMqIGJ5dGVzLgorCisgICAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUKKyAgICBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5fYnl0ZXMoMTYpICAjZG9jdGVzdDorU0tJUAorICAgIGInXFx4ZWJyXFx4MTdEKnRcXHhhZVxceGQ0XFx4ZTNTXFx4YjZcXHhlMlxceGViUDFcXHg4YicKKworICAgICIiIgorICAgIGlmIG5ieXRlcyBpcyBOb25lOgorICAgICAgICBuYnl0ZXMgPSBERUZBVUxUX0VOVFJPUFkKKyAgICByZXR1cm4gb3MudXJhbmRvbShuYnl0ZXMpCisKK2RlZiB0b2tlbl9oZXgobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSB0ZXh0IHN0cmluZywgaW4gaGV4YWRlY2ltYWwuCisKKyAgICBUaGUgc3RyaW5nIGhhcyAqbmJ5dGVzKiByYW5kb20gYnl0ZXMsIGVhY2ggYnl0ZSBjb252ZXJ0ZWQgdG8gdHdvCisgICAgaGV4IGRpZ2l0cy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlCisgICAgZGVmYXVsdCBpcyB1c2VkLgorCisgICAgPj4+IHRva2VuX2hleCgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgJ2Y5YmY3OGI5YTE4Y2U2ZDQ2YTBjZDJiMGI4NmRmOWRhJworCisgICAgIiIiCisgICAgcmV0dXJuIGJpbmFzY2lpLmhleGxpZnkodG9rZW5fYnl0ZXMobmJ5dGVzKSkuZGVjb2RlKCdhc2NpaScpCisKK2RlZiB0b2tlbl91cmxzYWZlKG5ieXRlcz1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSByYW5kb20gVVJMLXNhZmUgdGV4dCBzdHJpbmcsIGluIEJhc2U2NCBlbmNvZGluZy4KKworICAgIFRoZSBzdHJpbmcgaGFzICpuYnl0ZXMqIHJhbmRvbSBieXRlcy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgCisgICAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorCisgICAgPj4+IHRva2VuX3VybHNhZmUoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICdEcm1oemU2RVBjdjBmTl84MUJqLW5BJworCisgICAgIiIiCisgICAgdG9rID0gdG9rZW5fYnl0ZXMobmJ5dGVzKQorICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUodG9rKS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCmRpZmYgLS1naXQgYS9MaWIvc2hsZXgucHkgYi9MaWIvc2hsZXgucHkKaW5kZXggZWNkMmVmZC4uZTg3MjY2ZiAxMDA2NDQKLS0tIGEvTGliL3NobGV4LnB5CisrKyBiL0xpYi9zaGxleC5weQpAQCAtNSw2ICs1LDcgQEAKICMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiAjIFBvc2l4IGNvbXBsaWFuY2UsIHNwbGl0KCksIHN0cmluZyBhcmd1bWVudHMsIGFuZAogIyBpdGVyYXRvciBpbnRlcmZhY2UgYnkgR3VzdGF2byBOaWVtZXllciwgQXByaWwgMjAwMy4KKyMgY2hhbmdlcyB0byB0b2tlbml6ZSBtb3JlIGxpa2UgUG9zaXggc2hlbGxzIGJ5IFZpbmF5IFNhamlwLCBKdWx5IDIwMTYuCiAKIGltcG9ydCBvcwogaW1wb3J0IHJlCkBAIC0xNyw3ICsxOCw4IEBACiAKIGNsYXNzIHNobGV4OgogICAgICJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlLAorICAgICAgICAgICAgICAgICBwdW5jdHVhdGlvbl9jaGFycz1GYWxzZSk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5zdHJlYW0sIHN0cik6CiAgICAgICAgICAgICBpbnN0cmVhbSA9IFN0cmluZ0lPKGluc3RyZWFtKQogICAgICAgICBpZiBpbnN0cmVhbSBpcyBub3QgTm9uZToKQEAgLTQ5LDYgKzUxLDE5IEBACiAgICAgICAgIHNlbGYudG9rZW4gPSAnJwogICAgICAgICBzZWxmLmZpbGVzdGFjayA9IGRlcXVlKCkKICAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lCisgICAgICAgIGlmIG5vdCBwdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgIHB1bmN0dWF0aW9uX2NoYXJzID0gJycKKyAgICAgICAgZWxpZiBwdW5jdHVhdGlvbl9jaGFycyBpcyBUcnVlOgorICAgICAgICAgICAgcHVuY3R1YXRpb25fY2hhcnMgPSAnKCk7PD58JicKKyAgICAgICAgc2VsZi5wdW5jdHVhdGlvbl9jaGFycyA9IHB1bmN0dWF0aW9uX2NoYXJzCisgICAgICAgIGlmIHB1bmN0dWF0aW9uX2NoYXJzOgorICAgICAgICAgICAgIyBfcHVzaGJhY2tfY2hhcnMgaXMgYSBwdXNoIGJhY2sgcXVldWUgdXNlZCBieSBsb29rYWhlYWQgbG9naWMKKyAgICAgICAgICAgIHNlbGYuX3B1c2hiYWNrX2NoYXJzID0gZGVxdWUoKQorICAgICAgICAgICAgIyB0aGVzZSBjaGFycyBhZGRlZCBiZWNhdXNlIGFsbG93ZWQgaW4gZmlsZSBuYW1lcywgYXJncywgd2lsZGNhcmRzCisgICAgICAgICAgICBzZWxmLndvcmRjaGFycyArPSAnfi0uLyo/PScKKyAgICAgICAgICAgICNyZW1vdmUgYW55IHB1bmN0dWF0aW9uIGNoYXJzIGZyb20gd29yZGNoYXJzCisgICAgICAgICAgICB0ID0gc2VsZi53b3JkY2hhcnMubWFrZXRyYW5zKGRpY3QuZnJvbWtleXMocHVuY3R1YXRpb25fY2hhcnMpKQorICAgICAgICAgICAgc2VsZi53b3JkY2hhcnMgPSBzZWxmLndvcmRjaGFycy50cmFuc2xhdGUodCkKIAogICAgIGRlZiBwdXNoX3Rva2VuKHNlbGYsIHRvayk6CiAgICAgICAgICJQdXNoIGEgdG9rZW4gb250byB0aGUgc3RhY2sgcG9wcGVkIGJ5IHRoZSBnZXRfdG9rZW4gbWV0aG9kIgpAQCAtMTE1LDEyICsxMzAsMTUgQEAKICAgICAgICAgcXVvdGVkID0gRmFsc2UKICAgICAgICAgZXNjYXBlZHN0YXRlID0gJyAnCiAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuaW5zdHJlYW0ucmVhZCgxKQorICAgICAgICAgICAgaWYgc2VsZi5wdW5jdHVhdGlvbl9jaGFycyBhbmQgc2VsZi5fcHVzaGJhY2tfY2hhcnM6CisgICAgICAgICAgICAgICAgbmV4dGNoYXIgPSBzZWxmLl9wdXNoYmFja19jaGFycy5wb3AoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuaW5zdHJlYW0ucmVhZCgxKQogICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ1xuJzoKLSAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgICAgICAgIHNlbGYubGluZW5vICs9IDEKICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMzoKLSAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IGluIHN0YXRlIiwgcmVwcihzZWxmLnN0YXRlKSwgXAotICAgICAgICAgICAgICAgICAgICAgICJJIHNlZSBjaGFyYWN0ZXI6IiwgcmVwcihuZXh0Y2hhcikpCisgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBpbiBzdGF0ZSAlciBJIHNlZSBjaGFyYWN0ZXI6ICVyIiAlIChzZWxmLnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGNoYXIpKQogICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSAnJyAgICAgICAgIyBwYXN0IGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgYnJlYWsKQEAgLTEzNywxMyArMTU1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5jb21tZW50ZXJzOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gKz0gMQogICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJworICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5wdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYycKICAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgogICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgpAQCAtMTY2LDE3ICsxODcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gY2xvc2luZyBxdW90YXRpb24iKQogICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyID09IHNlbGYuc3RhdGU6CiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiArPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKLSAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlZHF1b3RlczoKKyAgICAgICAgICAgICAgICBlbGlmIChzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZSBhbmQgc2VsZi5zdGF0ZQorICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYuZXNjYXBlZHF1b3Rlcyk6CiAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9IHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuICs9IG5leHRjaGFyCiAgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgpAQCAtMTg1LDEyICsyMDYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gZXNjYXBlZCBjaGFyYWN0ZXIiKQogICAgICAgICAgICAgICAgICMgSW4gcG9zaXggc2hlbGxzLCBvbmx5IHRoZSBxdW90ZSBpdHNlbGYgb3IgdGhlIGVzY2FwZQogICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuCi0gICAgICAgICAgICAgICAgaWYgZXNjYXBlZHN0YXRlIGluIHNlbGYucXVvdGVzIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgIT0gc2VsZi5zdGF0ZSBhbmQgbmV4dGNoYXIgIT0gZXNjYXBlZHN0YXRlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUKLSAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWRzdGF0ZSBpbiBzZWxmLnF1b3RlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICE9IHNlbGYuc3RhdGUgYW5kIG5leHRjaGFyICE9IGVzY2FwZWRzdGF0ZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gKz0gc2VsZi5zdGF0ZQorICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gKz0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gZXNjYXBlZHN0YXRlCi0gICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gJ2EnOgorICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlIGluICgnYScsICdjJyk6CiAgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKQEAgLTIwNCw3ICsyMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vICs9IDEKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CkBAIC0yMTYsMTEgKzIzNywyMiBAQAogICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKLSAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzIG9yIG5leHRjaGFyIGluIHNlbGYucXVvdGVzIFwKLSAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi53aGl0ZXNwYWNlX3NwbGl0OgotICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdjJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGNoYXIgaW4gc2VsZi5wdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gKz0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyIG5vdCBpbiBzZWxmLndoaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHVzaGJhY2tfY2hhcnMuYXBwZW5kKG5leHRjaGFyKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIChuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFycyBvciBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlcworICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYud2hpdGVzcGFjZV9zcGxpdCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gKz0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQobmV4dGNoYXIpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucHVuY3R1YXRpb25fY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wdXNoYmFja19jaGFycy5hcHBlbmQobmV4dGNoYXIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQobmV4dGNoYXIpCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogSSBzZWUgcHVuY3R1YXRpb24gaW4gd29yZCBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKZGlmZiAtLWdpdCBhL0xpYi9zaHV0aWwucHkgYi9MaWIvc2h1dGlsLnB5CmluZGV4IDMxNzQ2NDguLjlkMTkzYjUgMTAwNjQ0Ci0tLSBhL0xpYi9zaHV0aWwucHkKKysrIGIvTGliL3NodXRpbC5weQpAQCAtNjQsNyArNjQsNyBAQAogCiBjbGFzcyBSZWdpc3RyeUVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiUmFpc2VkIHdoZW4gYSByZWdpc3RyeSBvcGVyYXRpb24gd2l0aCB0aGUgYXJjaGl2aW5nCi0gICAgYW5kIHVucGFja2luZyByZWdpc3RlcmllcyBmYWlscyIiIgorICAgIGFuZCB1bnBhY2tpbmcgcmVnaXN0cmllcyBmYWlscyIiIgogCiAKIGRlZiBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0LCBsZW5ndGg9MTYqMTAyNCk6CkBAIC05NzQsNiArOTc0LDkgQEAKIAogICAgIF9fYWxsX18uYXBwZW5kKCdkaXNrX3VzYWdlJykKICAgICBfbnR1cGxlX2Rpc2t1c2FnZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3VzYWdlJywgJ3RvdGFsIHVzZWQgZnJlZScpCisgICAgX250dXBsZV9kaXNrdXNhZ2UudG90YWwuX19kb2NfXyA9ICdUb3RhbCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS51c2VkLl9fZG9jX18gPSAnVXNlZCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS5mcmVlLl9fZG9jX18gPSAnRnJlZSBzcGFjZSBpbiBieXRlcycKIAogICAgIGRlZiBkaXNrX3VzYWdlKHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gZGlzayB1c2FnZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBnaXZlbiBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dCBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZjYyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBleGlzdHMgc28gdGhhdCAzcmQgcGFydHkgcGFja2FnZXMgY2FuIGJlIGluc3RhbGxlZAoraGVyZS4gIFJlYWQgdGhlIHNvdXJjZSBmb3Igc2l0ZS5weSBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCAzZjc4ZWY1Li5hODRlM2JiIDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTMxLDEzICsxMzEsMTMgQEAKIAogCiBkZWYgX2luaXRfcGF0aGluZm8oKToKLSAgICAiIiJSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBzeXMucGF0aCIiIgorICAgICIiIlJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBleGlzdGluZyBmaWxlIHN5c3RlbSBpdGVtcyBmcm9tIHN5cy5wYXRoLiIiIgogICAgIGQgPSBzZXQoKQotICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyKToKLSAgICAgICAgICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChkaXIpCi0gICAgICAgICAgICAgICAgZC5hZGQoZGlyY2FzZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGl0ZW0pOgorICAgICAgICAgICAgICAgIF8sIGl0ZW1jYXNlID0gbWFrZXBhdGgoaXRlbSkKKyAgICAgICAgICAgICAgICBkLmFkZChpdGVtY2FzZSkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgcmV0dXJuIGQKQEAgLTE1MCw5ICsxNTAsOSBAQAogICAgICIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzaXRlZGlyLCBuYW1lKQogICAgIHRyeToKICAgICAgICAgZiA9IG9wZW4oZnVsbG5hbWUsICJyIikKQEAgLTE5MCw5ICsxOTAsOSBAQAogICAgICdzaXRlZGlyJyIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBzaXRlZGlyLCBzaXRlZGlyY2FzZSA9IG1ha2VwYXRoKHNpdGVkaXIpCiAgICAgaWYgbm90IHNpdGVkaXJjYXNlIGluIGtub3duX3BhdGhzOgogICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2l0ZWRpcikgICAgICAgICMgQWRkIHBhdGggY29tcG9uZW50CkBAIC0zMDQsNyArMzA0LDcgQEAKIAogICAgICAgICBpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uJWQuJWQiICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQocHJlZml4KQpAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiL0xpYnJhcnkiLCBmcmFtZXdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwgInNpdGUtcGFja2FnZXMiKSkKICAgICByZXR1cm4gc2l0ZXBhY2thZ2VzCiAKIGRlZiBhZGRzaXRlcGFja2FnZXMoa25vd25fcGF0aHMsIHByZWZpeGVzPU5vbmUpOgpAQCAtNTA0LDkgKzUwNCwxMyBAQAogZGVmIGV4ZWNzaXRlY3VzdG9taXplKCk6CiAgICAgIiIiUnVuIGN1c3RvbSBzaXRlIHNwZWNpZmljIGNvZGUsIGlmIGF2YWlsYWJsZS4iIiIKICAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBzaXRlY3VzdG9taXplCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzaXRlY3VzdG9taXplCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMubmFtZSA9PSAnc2l0ZWN1c3RvbWl6ZSc6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQogICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVkVSQk9TRSIpOgogICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soKnN5cy5leGNfaW5mbygpKQpAQCAtNTIwLDkgKzUyNCwxMyBAQAogZGVmIGV4ZWN1c2VyY3VzdG9taXplKCk6CiAgICAgIiIiUnVuIGN1c3RvbSB1c2VyIHNwZWNpZmljIGNvZGUsIGlmIGF2YWlsYWJsZS4iIiIKICAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB1c2VyY3VzdG9taXplCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB1c2VyY3VzdG9taXplCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMubmFtZSA9PSAndXNlcmN1c3RvbWl6ZSc6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQogICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVkVSQk9TRSIpOgogICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soKnN5cy5leGNfaW5mbygpKQpkaWZmIC0tZ2l0IGEvTGliL3NtdHBkLnB5IGIvTGliL3NtdHBkLnB5CmluZGV4IDczMjA2NmUuLjgxMDNjYTkgMTAwNzU1Ci0tLSBhL0xpYi9zbXRwZC5weQorKysgYi9MaWIvc210cGQucHkKQEAgLTg5LDcgKzg5LDEwIEBACiBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCiBmcm9tIGVtYWlsLl9oZWFkZXJfdmFsdWVfcGFyc2VyIGltcG9ydCBnZXRfYWRkcl9zcGVjLCBnZXRfYW5nbGVfYWRkcgogCi1fX2FsbF9fID0gWyJTTVRQU2VydmVyIiwiRGVidWdnaW5nU2VydmVyIiwiUHVyZVByb3h5IiwiTWFpbG1hblByb3h5Il0KK19fYWxsX18gPSBbCisgICAgIlNNVFBDaGFubmVsIiwgIlNNVFBTZXJ2ZXIiLCAiRGVidWdnaW5nU2VydmVyIiwgIlB1cmVQcm94eSIsCisgICAgIk1haWxtYW5Qcm94eSIsCitdCiAKIHByb2dyYW0gPSBzeXMuYXJndlswXQogX192ZXJzaW9uX18gPSAnUHl0aG9uIFNNVFAgcHJveHkgdmVyc2lvbiAwLjMnCkBAIC0xMjgsMjQgKzEzMSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZF9zaXplX2xpbWl0CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBjb25uLCBhZGRyLCBkYXRhX3NpemVfbGltaXQ9REFUQV9TSVpFX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPU5vbmUpOgorICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSk6CiAgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubiwgbWFwPW1hcCkKICAgICAgICAgc2VsZi5zbXRwX3NlcnZlciA9IHNlcnZlcgogICAgICAgICBzZWxmLmNvbm4gPSBjb25uCiAgICAgICAgIHNlbGYuYWRkciA9IGFkZHIKICAgICAgICAgc2VsZi5kYXRhX3NpemVfbGltaXQgPSBkYXRhX3NpemVfbGltaXQKICAgICAgICAgc2VsZi5lbmFibGVfU01UUFVURjggPSBlbmFibGVfU01UUFVURjgKLSAgICAgICAgaWYgZW5hYmxlX1NNVFBVVEY4OgotICAgICAgICAgICAgaWYgZGVjb2RlX2RhdGE6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBjYW5ub3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlIHNldCB0byBUcnVlIGF0IHRoZSBzYW1lIHRpbWUiKQotICAgICAgICAgICAgZGVjb2RlX2RhdGEgPSBGYWxzZQotICAgICAgICBpZiBkZWNvZGVfZGF0YSBpcyBOb25lOgotICAgICAgICAgICAgd2FybigiVGhlIGRlY29kZV9kYXRhIGRlZmF1bHQgb2YgVHJ1ZSB3aWxsIGNoYW5nZSB0byBGYWxzZSBpbiAzLjY7IgotICAgICAgICAgICAgICAgICAiIHNwZWNpZnkgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMga2V5d29yZCIsCi0gICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gVHJ1ZQogICAgICAgICBzZWxmLl9kZWNvZGVfZGF0YSA9IGRlY29kZV9kYXRhCisgICAgICAgIGlmIGVuYWJsZV9TTVRQVVRGOCBhbmQgZGVjb2RlX2RhdGE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IGNhbm5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZSBzZXQgdG8gVHJ1ZSBhdCB0aGUgc2FtZSB0aW1lIikKICAgICAgICAgaWYgZGVjb2RlX2RhdGE6CiAgICAgICAgICAgICBzZWxmLl9lbXB0eXN0cmluZyA9ICcnCiAgICAgICAgICAgICBzZWxmLl9saW5lc2VwID0gJ1xyXG4nCkBAIC02MzUsMjMgKzYzMSwxNSBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsYWRkciwgcmVtb3RlYWRkciwKICAgICAgICAgICAgICAgICAgZGF0YV9zaXplX2xpbWl0PURBVEFfU0laRV9ERUZBVUxULCBtYXA9Tm9uZSwKLSAgICAgICAgICAgICAgICAgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1Ob25lKToKKyAgICAgICAgICAgICAgICAgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSk6CiAgICAgICAgIHNlbGYuX2xvY2FsYWRkciA9IGxvY2FsYWRkcgogICAgICAgICBzZWxmLl9yZW1vdGVhZGRyID0gcmVtb3RlYWRkcgogICAgICAgICBzZWxmLmRhdGFfc2l6ZV9saW1pdCA9IGRhdGFfc2l6ZV9saW1pdAogICAgICAgICBzZWxmLmVuYWJsZV9TTVRQVVRGOCA9IGVuYWJsZV9TTVRQVVRGOAotICAgICAgICBpZiBlbmFibGVfU01UUFVURjg6Ci0gICAgICAgICAgICBpZiBkZWNvZGVfZGF0YToKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVycyBjYW5ub3QgYmUgc2V0IHRvIFRydWUgYXQgdGhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzYW1lIHRpbWUuIikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gRmFsc2UKLSAgICAgICAgaWYgZGVjb2RlX2RhdGEgaXMgTm9uZToKLSAgICAgICAgICAgIHdhcm4oIlRoZSBkZWNvZGVfZGF0YSBkZWZhdWx0IG9mIFRydWUgd2lsbCBjaGFuZ2UgdG8gRmFsc2UgaW4gMy42OyIKLSAgICAgICAgICAgICAgICAgIiBzcGVjaWZ5IGFuIGV4cGxpY2l0IHZhbHVlIGZvciB0aGlzIGtleXdvcmQiLAotICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgICAgICBkZWNvZGVfZGF0YSA9IFRydWUKICAgICAgICAgc2VsZi5fZGVjb2RlX2RhdGEgPSBkZWNvZGVfZGF0YQorICAgICAgICBpZiBlbmFibGVfU01UUFVURjggYW5kIGRlY29kZV9kYXRhOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBjYW5ub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmUgc2V0IHRvIFRydWUgYXQgdGhlIHNhbWUgdGltZSIpCiAgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgbWFwPW1hcCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZ2FpX3Jlc3VsdHMgPSBzb2NrZXQuZ2V0YWRkcmluZm8oKmxvY2FsYWRkciwKQEAgLTY5OCw5ICs2ODYsOSBAQAogICAgICAgICBjb250YWluaW5nIGEgYC4nIGZvbGxvd2VkIGJ5IG90aGVyIHRleHQgaGFzIGhhZCB0aGUgbGVhZGluZyBkb3QKICAgICAgICAgcmVtb3ZlZC4KIAotICAgICAgICBrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gSXQgaXMgZW1wdHkKLSAgICAgICAgdW5sZXNzIGRlY29kZV9kYXRhPUZhbHNlIG9yIGVuYWJsZV9TTVRQVVRGOD1UcnVlIHdhcyBnaXZlbiBhcyBpbml0Ci0gICAgICAgIHBhcmFtZXRlciwgaW4gd2hpY2ggY2FzZSB1dCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBrZXlzOgorICAgICAgICBrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIEl0IGlzCisgICAgICAgIGVtcHR5IGlmIGRlY29kZV9kYXRhPVRydWUgd2FzIGdpdmVuIGFzIGluaXQgcGFyYW1ldGVyLCBvdGhlcndpc2UKKyAgICAgICAgaXQgd2lsbCBjb250YWluIHRoZSBmb2xsb3dpbmcga2V5czoKICAgICAgICAgICAgICdtYWlsX29wdGlvbnMnOiBsaXN0IG9mIHBhcmFtZXRlcnMgdG8gdGhlIG1haWwgY29tbWFuZC4gIEFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSB1cHBlcmNhc2Ugc3RyaW5ncy4gIEV4YW1wbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydCT0RZPThCSVRNSU1FJywgJ1NNVFBVVEY4J10uCmRpZmYgLS1naXQgYS9MaWIvc25kaGRyLnB5IGIvTGliL3NuZGhkci5weQppbmRleCBlNTkwMWVjLi43ZWNhZmI0IDEwMDY0NAotLS0gYS9MaWIvc25kaGRyLnB5CisrKyBiL0xpYi9zbmRoZHIucHkKQEAgLTM3LDYgKzM3LDE4IEBACiBTbmRIZWFkZXJzID0gbmFtZWR0dXBsZSgnU25kSGVhZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZXR5cGUgZnJhbWVyYXRlIG5jaGFubmVscyBuZnJhbWVzIHNhbXB3aWR0aCcpCiAKK1NuZEhlYWRlcnMuZmlsZXR5cGUuX19kb2NfXyA9ICgiIiJUaGUgdmFsdWUgZm9yIHR5cGUgaW5kaWNhdGVzIHRoZSBkYXRhIHR5cGUKK2FuZCB3aWxsIGJlIG9uZSBvZiB0aGUgc3RyaW5ncyAnYWlmYycsICdhaWZmJywgJ2F1JywnaGNvbScsCisnc25kcicsICdzbmR0JywgJ3ZvYycsICd3YXYnLCAnOHN2eCcsICdzYicsICd1YicsIG9yICd1bCcuIiIiKQorU25kSGVhZGVycy5mcmFtZXJhdGUuX19kb2NfXyA9ICgiIiJUaGUgc2FtcGxpbmdfcmF0ZSB3aWxsIGJlIGVpdGhlciB0aGUgYWN0dWFsCit2YWx1ZSBvciAwIGlmIHVua25vd24gb3IgZGlmZmljdWx0IHRvIGRlY29kZS4iIiIpCitTbmRIZWFkZXJzLm5jaGFubmVscy5fX2RvY19fID0gKCIiIlRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgMCBpZiBpdCBjYW5ub3QgYmUKK2RldGVybWluZWQgb3IgaWYgdGhlIHZhbHVlIGlzIGRpZmZpY3VsdCB0byBkZWNvZGUuIiIiKQorU25kSGVhZGVycy5uZnJhbWVzLl9fZG9jX18gPSAoIiIiVGhlIHZhbHVlIGZvciBmcmFtZXMgd2lsbCBiZSBlaXRoZXIgdGhlIG51bWJlcgorb2YgZnJhbWVzIG9yIC0xLiIiIikKK1NuZEhlYWRlcnMuc2FtcHdpZHRoLl9fZG9jX18gPSAoIiIiRWl0aGVyIHRoZSBzYW1wbGUgc2l6ZSBpbiBiaXRzIG9yCisnQScgZm9yIEEtTEFXIG9yICdVJyBmb3IgdS1MQVcuIiIiKQorCiBkZWYgd2hhdChmaWxlbmFtZSk6CiAgICAgIiIiR3Vlc3MgdGhlIHR5cGUgb2YgYSBzb3VuZCBmaWxlLiIiIgogICAgIHJlcyA9IHdoYXRoZHIoZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9MaWIvc29ja2V0c2VydmVyLnB5IGIvTGliL3NvY2tldHNlcnZlci5weQppbmRleCA4ODA4ODEzLi40MWEzNzY2IDEwMDY0NAotLS0gYS9MaWIvc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi9zb2NrZXRzZXJ2ZXIucHkKQEAgLTEyNywxNiArMTI3LDIwIEBACiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgb3MKIGltcG9ydCBlcnJubworaW1wb3J0IHN5cwogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZworZnJvbSBpbyBpbXBvcnQgQnVmZmVyZWRJT0Jhc2UKIGZyb20gdGltZSBpbXBvcnQgbW9ub3RvbmljIGFzIHRpbWUKIAotX19hbGxfXyA9IFsiQmFzZVNlcnZlciIsICJUQ1BTZXJ2ZXIiLCAiVURQU2VydmVyIiwgIkZvcmtpbmdVRFBTZXJ2ZXIiLAotICAgICAgICAgICAiRm9ya2luZ1RDUFNlcnZlciIsICJUaHJlYWRpbmdVRFBTZXJ2ZXIiLCAiVGhyZWFkaW5nVENQU2VydmVyIiwKK19fYWxsX18gPSBbIkJhc2VTZXJ2ZXIiLCAiVENQU2VydmVyIiwgIlVEUFNlcnZlciIsCisgICAgICAgICAgICJUaHJlYWRpbmdVRFBTZXJ2ZXIiLCAiVGhyZWFkaW5nVENQU2VydmVyIiwKICAgICAgICAgICAgIkJhc2VSZXF1ZXN0SGFuZGxlciIsICJTdHJlYW1SZXF1ZXN0SGFuZGxlciIsCi0gICAgICAgICAgICJEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyIiwgIlRocmVhZGluZ01peEluIiwgIkZvcmtpbmdNaXhJbiJdCisgICAgICAgICAgICJEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyIiwgIlRocmVhZGluZ01peEluIl0KK2lmIGhhc2F0dHIob3MsICJmb3JrIik6CisgICAgX19hbGxfXy5leHRlbmQoWyJGb3JraW5nVURQU2VydmVyIiwiRm9ya2luZ1RDUFNlcnZlciIsICJGb3JraW5nTWl4SW4iXSkKIGlmIGhhc2F0dHIoc29ja2V0LCAiQUZfVU5JWCIpOgogICAgIF9fYWxsX18uZXh0ZW5kKFsiVW5peFN0cmVhbVNlcnZlciIsIlVuaXhEYXRhZ3JhbVNlcnZlciIsCiAgICAgICAgICAgICAgICAgICAgICJUaHJlYWRpbmdVbml4U3RyZWFtU2VydmVyIiwKQEAgLTMxMSw5ICszMTUsMTIgQEAKICAgICAgICAgaWYgc2VsZi52ZXJpZnlfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQogICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKIApAQCAtMzY3LDEyICszNzQsMTggQEAKICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gcHJpbnQgYSB0cmFjZWJhY2sgYW5kIGNvbnRpbnVlLgogCiAgICAgICAgICIiIgotICAgICAgICBwcmludCgnLScqNDApCi0gICAgICAgIHByaW50KCdFeGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBmcm9tJywgZW5kPScgJykKLSAgICAgICAgcHJpbnQoY2xpZW50X2FkZHJlc3MpCisgICAgICAgIHByaW50KCctJyo0MCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnRXhjZXB0aW9uIGhhcHBlbmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIHJlcXVlc3QgZnJvbScsCisgICAgICAgICAgICBjbGllbnRfYWRkcmVzcywgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCi0gICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKSAjIFhYWCBCdXQgdGhpcyBnb2VzIHRvIHN0ZGVyciEKLSAgICAgICAgcHJpbnQoJy0nKjQwKQorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgcHJpbnQoJy0nKjQwLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQogCiAKIGNsYXNzIFRDUFNlcnZlcihCYXNlU2VydmVyKToKQEAgLTUyNyw4NSArNTQwLDg2IEBACiAgICAgICAgICMgTm8gbmVlZCB0byBjbG9zZSBhbnl0aGluZy4KICAgICAgICAgcGFzcwogCi1jbGFzcyBGb3JraW5nTWl4SW46CitpZiBoYXNhdHRyKG9zLCAiZm9yayIpOgorICAgIGNsYXNzIEZvcmtpbmdNaXhJbjoKKyAgICAgICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgcHJvY2Vzcy4iIiIKIAotICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHByb2Nlc3MuIiIiCisgICAgICAgIHRpbWVvdXQgPSAzMDAKKyAgICAgICAgYWN0aXZlX2NoaWxkcmVuID0gTm9uZQorICAgICAgICBtYXhfY2hpbGRyZW4gPSA0MAogCi0gICAgdGltZW91dCA9IDMwMAotICAgIGFjdGl2ZV9jaGlsZHJlbiA9IE5vbmUKLSAgICBtYXhfY2hpbGRyZW4gPSA0MAotCi0gICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6Ci0gICAgICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpbGRyZW4gdGhhdCBoYXZlIGV4aXRlZC4iIiIKLSAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICMgSWYgd2UncmUgYWJvdmUgdGhlIG1heCBudW1iZXIgb2YgY2hpbGRyZW4sIHdhaXQgYW5kIHJlYXAgdGhlbSB1bnRpbAotICAgICAgICAjIHdlIGdvIGJhY2sgYmVsb3cgdGhyZXNob2xkLiBOb3RlIHRoYXQgd2UgdXNlIHdhaXRwaWQoLTEpIGJlbG93IHRvIGJlCi0gICAgICAgICMgYWJsZSB0byBjb2xsZWN0IGNoaWxkcmVuIGluIHNpemUoPGRlZnVuY3QgY2hpbGRyZW4+KSBzeXNjYWxscyBpbnN0ZWFkCi0gICAgICAgICMgb2Ygc2l6ZSg8Y2hpbGRyZW4+KTogdGhlIGRvd25zaWRlIGlzIHRoYXQgdGhpcyBtaWdodCByZWFwIGNoaWxkcmVuCi0gICAgICAgICMgd2hpY2ggd2UgZGlkbid0IHNwYXduLCB3aGljaCBpcyB3aHkgd2Ugb25seSByZXNvcnQgdG8gdGhpcyB3aGVuIHdlJ3JlCi0gICAgICAgICMgYWJvdmUgbWF4X2NoaWxkcmVuLgotICAgICAgICB3aGlsZSBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pID49IHNlbGYubWF4X2NoaWxkcmVuOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQoLTEsIDApCi0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCi0gICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiwgd2UncmUgZG9uZQotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNsZWFyKCkKLSAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgIyBOb3cgcmVhcCBhbGwgZGVmdW5jdCBjaGlsZHJlbi4KLSAgICAgICAgZm9yIHBpZCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jb3B5KCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGlkLCBfID0gb3Mud2FpdHBpZChwaWQsIG9zLldOT0hBTkcpCi0gICAgICAgICAgICAgICAgIyBpZiB0aGUgY2hpbGQgaGFzbid0IGV4aXRlZCB5ZXQsIHBpZCB3aWxsIGJlIDAgYW5kIGlnbm9yZWQgYnkKLSAgICAgICAgICAgICAgICAjIGRpc2NhcmQoKSBiZWxvdwotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQotICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgotICAgICAgICAgICAgICAgICMgc29tZW9uZSBlbHNlIHJlYXBlZCBpdAotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQotICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotCi0gICAgZGVmIGhhbmRsZV90aW1lb3V0KHNlbGYpOgotICAgICAgICAiIiJXYWl0IGZvciB6b21iaWVzIGFmdGVyIHNlbGYudGltZW91dCBzZWNvbmRzIG9mIGluYWN0aXZpdHkuCi0KLSAgICAgICAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgZGVmIHNlcnZpY2VfYWN0aW9ucyhzZWxmKToKLSAgICAgICAgIiIiQ29sbGVjdCB0aGUgem9tYmllIGNoaWxkIHByb2Nlc3NlcyByZWd1bGFybHkgaW4gdGhlIEZvcmtpbmdNaXhJbi4KLQotICAgICAgICBzZXJ2aWNlX2FjdGlvbnMgaXMgY2FsbGVkIGluIHRoZSBCYXNlU2VydmVyJ3Mgc2VydmVfZm9ydmVyIGxvb3AuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6Ci0gICAgICAgICIiIkZvcmsgYSBuZXcgc3VicHJvY2VzcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgotICAgICAgICBwaWQgPSBvcy5mb3JrKCkKLSAgICAgICAgaWYgcGlkOgotICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcworICAgICAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gd2FpdCBmb3IgY2hpbGRyZW4gdGhhdCBoYXZlIGV4aXRlZC4iIiIKICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4gPSBzZXQoKQotICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uYWRkKHBpZCkKLSAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIENoaWxkIHByb2Nlc3MuCi0gICAgICAgICAgICAjIFRoaXMgbXVzdCBuZXZlciByZXR1cm4sIGhlbmNlIG9zLl9leGl0KCkhCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQotICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIElmIHdlJ3JlIGFib3ZlIHRoZSBtYXggbnVtYmVyIG9mIGNoaWxkcmVuLCB3YWl0IGFuZCByZWFwIHRoZW0gdW50aWwKKyAgICAgICAgICAgICMgd2UgZ28gYmFjayBiZWxvdyB0aHJlc2hvbGQuIE5vdGUgdGhhdCB3ZSB1c2Ugd2FpdHBpZCgtMSkgYmVsb3cgdG8gYmUKKyAgICAgICAgICAgICMgYWJsZSB0byBjb2xsZWN0IGNoaWxkcmVuIGluIHNpemUoPGRlZnVuY3QgY2hpbGRyZW4+KSBzeXNjYWxscyBpbnN0ZWFkCisgICAgICAgICAgICAjIG9mIHNpemUoPGNoaWxkcmVuPik6IHRoZSBkb3duc2lkZSBpcyB0aGF0IHRoaXMgbWlnaHQgcmVhcCBjaGlsZHJlbgorICAgICAgICAgICAgIyB3aGljaCB3ZSBkaWRuJ3Qgc3Bhd24sIHdoaWNoIGlzIHdoeSB3ZSBvbmx5IHJlc29ydCB0byB0aGlzIHdoZW4gd2UncmUKKyAgICAgICAgICAgICMgYWJvdmUgbWF4X2NoaWxkcmVuLgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuYWN0aXZlX2NoaWxkcmVuKSA+PSBzZWxmLm1heF9jaGlsZHJlbjoKICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQoLTEsIDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbiwgd2UncmUgZG9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jbGVhcigpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgTm93IHJlYXAgYWxsIGRlZnVuY3QgY2hpbGRyZW4uCisgICAgICAgICAgICBmb3IgcGlkIGluIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNvcHkoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQocGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGlsZCBoYXNuJ3QgZXhpdGVkIHlldCwgcGlkIHdpbGwgYmUgMCBhbmQgaWdub3JlZCBieQorICAgICAgICAgICAgICAgICAgICAjIGRpc2NhcmQoKSBiZWxvdworICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgc29tZW9uZSBlbHNlIHJlYXBlZCBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBoYW5kbGVfdGltZW91dChzZWxmKToKKyAgICAgICAgICAgICIiIldhaXQgZm9yIHpvbWJpZXMgYWZ0ZXIgc2VsZi50aW1lb3V0IHNlY29uZHMgb2YgaW5hY3Rpdml0eS4KKworICAgICAgICAgICAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCisKKyAgICAgICAgZGVmIHNlcnZpY2VfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgICAgICIiIkNvbGxlY3QgdGhlIHpvbWJpZSBjaGlsZCBwcm9jZXNzZXMgcmVndWxhcmx5IGluIHRoZSBGb3JraW5nTWl4SW4uCisKKyAgICAgICAgICAgIHNlcnZpY2VfYWN0aW9ucyBpcyBjYWxsZWQgaW4gdGhlIEJhc2VTZXJ2ZXIncyBzZXJ2ZV9mb3J2ZXIgbG9vcC4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKKworICAgICAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgICAgICIiIkZvcmsgYSBuZXcgc3VicHJvY2VzcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgorICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcworICAgICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuID0gc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5hZGQocGlkKQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENoaWxkIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgIyBUaGlzIG11c3QgbmV2ZXIgcmV0dXJuLCBoZW5jZSBvcy5fZXhpdCgpIQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDAKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdChzdGF0dXMpCiAKIAogY2xhc3MgVGhyZWFkaW5nTWl4SW46CkBAIC02MjMsOSArNjM3LDkgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKIAogICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgpAQCAtNjM2LDggKzY1MCw5IEBACiAgICAgICAgIHQuc3RhcnQoKQogCiAKLWNsYXNzIEZvcmtpbmdVRFBTZXJ2ZXIoRm9ya2luZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCi1jbGFzcyBGb3JraW5nVENQU2VydmVyKEZvcmtpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcworaWYgaGFzYXR0cihvcywgImZvcmsiKToKKyAgICBjbGFzcyBGb3JraW5nVURQU2VydmVyKEZvcmtpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcworICAgIGNsYXNzIEZvcmtpbmdUQ1BTZXJ2ZXIoRm9ya2luZ01peEluLCBUQ1BTZXJ2ZXIpOiBwYXNzCiAKIGNsYXNzIFRocmVhZGluZ1VEUFNlcnZlcihUaHJlYWRpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcwogY2xhc3MgVGhyZWFkaW5nVENQU2VydmVyKFRocmVhZGluZ01peEluLCBUQ1BTZXJ2ZXIpOiBwYXNzCkBAIC03MjksNyArNzQ0LDEwIEBACiAgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2V0c29ja29wdChzb2NrZXQuSVBQUk9UT19UQ1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuVENQX05PREVMQVksIFRydWUpCiAgICAgICAgIHNlbGYucmZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3JiJywgc2VsZi5yYnVmc2l6ZSkKLSAgICAgICAgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgnd2InLCBzZWxmLndidWZzaXplKQorICAgICAgICBpZiBzZWxmLndidWZzaXplID09IDA6CisgICAgICAgICAgICBzZWxmLndmaWxlID0gX1NvY2tldFdyaXRlcihzZWxmLmNvbm5lY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3YicsIHNlbGYud2J1ZnNpemUpCiAKICAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgICBpZiBub3Qgc2VsZi53ZmlsZS5jbG9zZWQ6CkBAIC03NDIsNiArNzYwLDI0IEBACiAgICAgICAgIHNlbGYud2ZpbGUuY2xvc2UoKQogICAgICAgICBzZWxmLnJmaWxlLmNsb3NlKCkKIAorY2xhc3MgX1NvY2tldFdyaXRlcihCdWZmZXJlZElPQmFzZSk6CisgICAgIiIiU2ltcGxlIHdyaXRhYmxlIEJ1ZmZlcmVkSU9CYXNlIGltcGxlbWVudGF0aW9uIGZvciBhIHNvY2tldAorCisgICAgRG9lcyBub3QgaG9sZCBkYXRhIGluIGEgYnVmZmVyLCBhdm9pZGluZyBhbnkgbmVlZCB0byBjYWxsIGZsdXNoKCkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jayk6CisgICAgICAgIHNlbGYuX3NvY2sgPSBzb2NrCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIHNlbGYuX3NvY2suc2VuZGFsbChiKQorICAgICAgICB3aXRoIG1lbW9yeXZpZXcoYikgYXMgdmlldzoKKyAgICAgICAgICAgIHJldHVybiB2aWV3Lm5ieXRlcworCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2suZmlsZW5vKCkKIAogY2xhc3MgRGF0YWdyYW1SZXF1ZXN0SGFuZGxlcihCYXNlUmVxdWVzdEhhbmRsZXIpOgogCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQppbmRleCA3ZmI4ZDdlLi5jYjg1ODE0IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKQEAgLTE4OCw3ICsxODgsMTAgQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQotICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgaW5jb21lIG51bWJlcikiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoCisgICAgICAgICAgICAiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCAiCisgICAgICAgICAgICAiaW5jb21lIG51bWJlciwgdW5pcXVlX3Rlc3QgdGV4dCB1bmlxdWUpIgorICAgICAgICApCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CkBAIC00NjIsNiArNDY1LDQ0IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIGN1ciA9IHNxbGl0ZS5DdXJzb3IoZm9vKQogCisgICAgZGVmIENoZWNrTGFzdFJvd0lET25SZXBsYWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSU5TRVJUIE9SIFJFUExBQ0UgYW5kIFJFUExBQ0UgSU5UTyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSBiZWhhdmlvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNxbCA9ICd7fSBJTlRPIHRlc3QoaWQsIHVuaXF1ZV90ZXN0KSBWQUxVRVMgKD8sID8pJworICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnSU5TRVJUIE9SIFJFUExBQ0UnLCAnUkVQTEFDRScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RhdGVtZW50PXN0YXRlbWVudCk6CisgICAgICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKHNxbC5mb3JtYXQoc3RhdGVtZW50KSwgKDEsICdmb28nKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UubGFzdHJvd2lkLCAxKQorCisgICAgZGVmIENoZWNrTGFzdFJvd0lET25JZ25vcmUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKKyAgICAgICAgICAgICJpbnNlcnQgb3IgaWdub3JlIGludG8gdGVzdCh1bmlxdWVfdGVzdCkgdmFsdWVzICg/KSIsCisgICAgICAgICAgICAoJ3Rlc3QnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKKyAgICAgICAgICAgICJpbnNlcnQgb3IgaWdub3JlIGludG8gdGVzdCh1bmlxdWVfdGVzdCkgdmFsdWVzICg/KSIsCisgICAgICAgICAgICAoJ3Rlc3QnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDIpCisKKyAgICBkZWYgQ2hlY2tMYXN0Um93SURJbnNlcnRPUihzZWxmKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gKCdGQUlMJywgJ0FCT1JUJywgJ1JPTExCQUNLJyk6CisgICAgICAgICAgICBzcWwgPSAnSU5TRVJUIE9SIHt9IElOVE8gdGVzdCh1bmlxdWVfdGVzdCkgVkFMVUVTICg/KScKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHN0YXRlbWVudD0nSU5TRVJUIE9SIHt9Jy5mb3JtYXQoc3RhdGVtZW50KSk6CisgICAgICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKHNxbC5mb3JtYXQoc3RhdGVtZW50KSwgKHN0YXRlbWVudCwpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChzdGF0ZW1lbnQsIHNlbGYuY3UubGFzdHJvd2lkKSkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksIChzdGF0ZW1lbnQsKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoc3RhdGVtZW50LCBzZWxmLmN1Lmxhc3Ryb3dpZCkpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdGQUlMJywgMiksICgnRkFJTCcsIDIpLAorICAgICAgICAgICAgKCdBQk9SVCcsIDMpLCAoJ0FCT1JUJywgMyksCisgICAgICAgICAgICAoJ1JPTExCQUNLJywgNCksICgnUk9MTEJBQ0snLCA0KSwKKyAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RoaXMgdGVzdCByZXF1aXJlcyB0aHJlYWRpbmcuJykKIGNsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvc3JlX2NvbXBpbGUucHkgYi9MaWIvc3JlX2NvbXBpbGUucHkKaW5kZXggNTAyYjA2MS4uNGVkYjAzZiAxMDA2NDQKLS0tIGEvTGliL3NyZV9jb21waWxlLnB5CisrKyBiL0xpYi9zcmVfY29tcGlsZS5weQpAQCAtNDA5LDU3ICs0MDksMzkgQEAKICAgICAgICAgICAgIHRhYmxlW2ldID0gaWR4ICsgMQogICAgIHJldHVybiB0YWJsZQogCi1kZWYgX2NvbXBpbGVfaW5mbyhjb2RlLCBwYXR0ZXJuLCBmbGFncyk6Ci0gICAgIyBpbnRlcm5hbDogY29tcGlsZSBhbiBpbmZvIGJsb2NrLiAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwKLSAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAotICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAotICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQotICAgIGlmIGhpID4gTUFYQ09ERToKLSAgICAgICAgaGkgPSBNQVhDT0RFCi0gICAgaWYgbG8gPT0gMDoKLSAgICAgICAgY29kZS5leHRlbmQoW0lORk8sIDQsIDAsIGxvLCBoaV0pCi0gICAgICAgIHJldHVybgotICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAorZGVmIF9nZXRfbGl0ZXJhbF9wcmVmaXgocGF0dGVybik6CisgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAogICAgIHByZWZpeCA9IFtdCiAgICAgcHJlZml4YXBwZW5kID0gcHJlZml4LmFwcGVuZAotICAgIHByZWZpeF9za2lwID0gMAorICAgIHByZWZpeF9za2lwID0gTm9uZQorICAgIGdvdF9hbGwgPSBUcnVlCisgICAgZm9yIG9wLCBhdiBpbiBwYXR0ZXJuLmRhdGE6CisgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCisgICAgICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTjoKKyAgICAgICAgICAgIHByZWZpeDEsIHByZWZpeF9za2lwMSwgZ290X2FsbCA9IF9nZXRfbGl0ZXJhbF9wcmVmaXgoYXZbMV0pCisgICAgICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGF2WzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IGxlbihwcmVmaXgpCisgICAgICAgICAgICAgICAgZWxpZiBwcmVmaXhfc2tpcDEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gbGVuKHByZWZpeCkgKyBwcmVmaXhfc2tpcDEKKyAgICAgICAgICAgIHByZWZpeC5leHRlbmQocHJlZml4MSkKKyAgICAgICAgICAgIGlmIG5vdCBnb3RfYWxsOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb3RfYWxsID0gRmFsc2UKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIHByZWZpeCwgcHJlZml4X3NraXAsIGdvdF9hbGwKKworZGVmIF9nZXRfY2hhcnNldF9wcmVmaXgocGF0dGVybik6CiAgICAgY2hhcnNldCA9IFtdICMgbm90IHVzZWQKICAgICBjaGFyc2V0YXBwZW5kID0gY2hhcnNldC5hcHBlbmQKLSAgICBpZiBub3QgKGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRSk6Ci0gICAgICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKLSAgICAgICAgZm9yIG9wLCBhdiBpbiBwYXR0ZXJuLmRhdGE6CisgICAgaWYgcGF0dGVybi5kYXRhOgorICAgICAgICBvcCwgYXYgPSBwYXR0ZXJuLmRhdGFbMF0KKyAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06CisgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQogICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSBwcmVmaXhfc2tpcDoKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBwcmVmaXhfc2tpcCArIDEKLSAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCi0gICAgICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGxlbihhdlsxXSkgPT0gMToKLSAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQotICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAjIGlmIG5vIHByZWZpeCwgbG9vayBmb3IgY2hhcnNldCBwcmVmaXgKLSAgICAgICAgaWYgbm90IHByZWZpeCBhbmQgcGF0dGVybi5kYXRhOgotICAgICAgICAgICAgb3AsIGF2ID0gcGF0dGVybi5kYXRhWzBdCi0gICAgICAgICAgICBpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBhdlsxXToKLSAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQotICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXRhcHBlbmQoKG9wLCBhdikpCi0gICAgICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBbXQotICAgICAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKLSAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKKyAgICAgICAgICAgICAgICBjaGFyc2V0YXBwZW5kKChvcCwgYXYpKQogICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CiAgICAgICAgICAgICAgICAgYyA9IFtdCiAgICAgICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCkBAIC00NzMsOCArNDU1LDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCi0gICAgICAgICAgICBlbGlmIG9wIGlzIElOOgotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgIGMgPSBbXQorICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCisgICAgICAgICAgICBmb3IgcCBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICBpZiBub3QgcDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBvcCwgYXYgPSBwWzBdCisgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCgob3AsIGF2KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICBlbGlmIG9wIGlzIElOOgorICAgICAgICAgICAgY2hhcnNldCA9IGF2CisgICAgcmV0dXJuIGNoYXJzZXQKKworZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYW4gaW5mbyBibG9jay4gIGluIHRoZSBjdXJyZW50IHZlcnNpb24sCisgICAgIyB0aGlzIGNvbnRhaW5zIG1pbi9tYXggcGF0dGVybiB3aWR0aCwgYW5kIGFuIG9wdGlvbmFsIGxpdGVyYWwKKyAgICAjIHByZWZpeCBvciBhIGNoYXJhY3RlciBtYXAKKyAgICBsbywgaGkgPSBwYXR0ZXJuLmdldHdpZHRoKCkKKyAgICBpZiBoaSA+IE1BWENPREU6CisgICAgICAgIGhpID0gTUFYQ09ERQorICAgIGlmIGxvID09IDA6CisgICAgICAgIGNvZGUuZXh0ZW5kKFtJTkZPLCA0LCAwLCBsbywgaGldKQorICAgICAgICByZXR1cm4KKyAgICAjIGxvb2sgZm9yIGEgbGl0ZXJhbCBwcmVmaXgKKyAgICBwcmVmaXggPSBbXQorICAgIHByZWZpeF9za2lwID0gMAorICAgIGNoYXJzZXQgPSBbXSAjIG5vdCB1c2VkCisgICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0UpOgorICAgICAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4CisgICAgICAgIHByZWZpeCwgcHJlZml4X3NraXAsIGdvdF9hbGwgPSBfZ2V0X2xpdGVyYWxfcHJlZml4KHBhdHRlcm4pCisgICAgICAgICMgaWYgbm8gcHJlZml4LCBsb29rIGZvciBjaGFyc2V0IHByZWZpeAorICAgICAgICBpZiBub3QgcHJlZml4OgorICAgICAgICAgICAgY2hhcnNldCA9IF9nZXRfY2hhcnNldF9wcmVmaXgocGF0dGVybikKICMjICAgICBpZiBwcmVmaXg6CiAjIyAgICAgICAgIHByaW50KCIqKiogUFJFRklYIiwgcHJlZml4LCBwcmVmaXhfc2tpcCkKICMjICAgICBpZiBjaGFyc2V0OgpAQCAtNDg3LDcgKzUwNCw3IEBACiAgICAgbWFzayA9IDAKICAgICBpZiBwcmVmaXg6CiAgICAgICAgIG1hc2sgPSBTUkVfSU5GT19QUkVGSVgKLSAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXAgPT0gbGVuKHBhdHRlcm4uZGF0YSk6CisgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmUgYW5kIGdvdF9hbGw6CiAgICAgICAgICAgICBtYXNrID0gbWFzayB8IFNSRV9JTkZPX0xJVEVSQUwKICAgICBlbGlmIGNoYXJzZXQ6CiAgICAgICAgIG1hc2sgPSBtYXNrIHwgU1JFX0lORk9fQ0hBUlNFVApAQCAtNTAyLDYgKzUxOSw4IEBACiAgICAgIyBhZGQgbGl0ZXJhbCBwcmVmaXgKICAgICBpZiBwcmVmaXg6CiAgICAgICAgIGVtaXQobGVuKHByZWZpeCkpICMgbGVuZ3RoCisgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmU6CisgICAgICAgICAgICBwcmVmaXhfc2tpcCA9ICBsZW4ocHJlZml4KQogICAgICAgICBlbWl0KHByZWZpeF9za2lwKSAjIHNraXAKICAgICAgICAgY29kZS5leHRlbmQocHJlZml4KQogICAgICAgICAjIGdlbmVyYXRlIG92ZXJsYXAgdGFibGUKZGlmZiAtLWdpdCBhL0xpYi9zcmVfcGFyc2UucHkgYi9MaWIvc3JlX3BhcnNlLnB5CmluZGV4IDRmZjUwZDEuLjUyMWUzNzkgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfcGFyc2UucHkKKysrIGIvTGliL3NyZV9wYXJzZS5weQpAQCAtMjgyLDMzICsyODIsNiBAQAogICAgIGRlZiBlcnJvcihzZWxmLCBtc2csIG9mZnNldD0wKToKICAgICAgICAgcmV0dXJuIGVycm9yKG1zZywgc2VsZi5zdHJpbmcsIHNlbGYudGVsbCgpIC0gb2Zmc2V0KQogCi0jIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBub3QgdXNlZCBpbiB0aGlzIG1vZHVsZSBhbnltb3JlLCBidXQgd2Uga2VlcAotIyB0aGVtIGhlcmUgKHdpdGggRGVwcmVjYXRpb25XYXJuaW5ncykgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotCi1kZWYgaXNpZGVudChjaGFyKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICB3YXJuaW5ncy53YXJuKCdzcmVfcGFyc2UuaXNpZGVudCgpIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjUnLAotICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuICJhIiA8PSBjaGFyIDw9ICJ6IiBvciAiQSIgPD0gY2hhciA8PSAiWiIgb3IgY2hhciA9PSAiXyIKLQotZGVmIGlzZGlnaXQoY2hhcik6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgd2FybmluZ3Mud2Fybignc3JlX3BhcnNlLmlzZGlnaXQoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMy41JywKLSAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgIHJldHVybiAiMCIgPD0gY2hhciA8PSAiOSIKLQotZGVmIGlzbmFtZShuYW1lKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICB3YXJuaW5ncy53YXJuKCdzcmVfcGFyc2UuaXNuYW1lKCkgd2lsbCBiZSByZW1vdmVkIGluIDMuNScsCi0gICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICAjIGNoZWNrIHRoYXQgZ3JvdXAgbmFtZSBpcyBhIHZhbGlkIHN0cmluZwotICAgIGlmIG5vdCBpc2lkZW50KG5hbWVbMF0pOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBmb3IgY2hhciBpbiBuYW1lWzE6XToKLSAgICAgICAgaWYgbm90IGlzaWRlbnQoY2hhcikgYW5kIG5vdCBpc2RpZ2l0KGNoYXIpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKLQogZGVmIF9jbGFzc19lc2NhcGUoc291cmNlLCBlc2NhcGUpOgogICAgICMgaGFuZGxlIGVzY2FwZSBjb2RlIGluc2lkZSBjaGFyYWN0ZXIgY2xhc3MKICAgICBjb2RlID0gRVNDQVBFUy5nZXQoZXNjYXBlKQpAQCAtMzUxLDkgKzMyNCw3IEBACiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CiAgICAgICAgICAgICBpZiBjIGluIEFTQ0lJTEVUVEVSUzoKLSAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdiYWQgZXNjYXBlICVzJyAlIGVzY2FwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD04KQorICAgICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcignYmFkIGVzY2FwZSAlcycgJSBlc2NhcGUsIGxlbihlc2NhcGUpKQogICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIHBhc3MKQEAgLTQxOCw5ICszODksNyBAQAogICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCJpbnZhbGlkIGdyb3VwIHJlZmVyZW5jZSIsIGxlbihlc2NhcGUpKQogICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgogICAgICAgICAgICAgaWYgYyBpbiBBU0NJSUxFVFRFUlM6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignYmFkIGVzY2FwZSAlcycgJSBlc2NhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9OCkKKyAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoImJhZCBlc2NhcGUgJXMiICUgZXNjYXBlLCBsZW4oZXNjYXBlKSkKICAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBvcmQoZXNjYXBlWzFdKQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICBwYXNzCkBAIC03OTgsMTAgKzc2Nyw3IEBACiAgICAgIyBDaGVjayBhbmQgZml4IGZsYWdzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBwYXR0ZXJuIChzdHIgb3IgYnl0ZXMpCiAgICAgaWYgaXNpbnN0YW5jZShzcmMsIHN0cik6CiAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJMT0NBTEUgZmxhZyB3aXRoIGEgc3RyIHBhdHRlcm4gaXMgZGVwcmVjYXRlZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBiZSBhbiBlcnJvciBpbiAzLjYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NikKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCB1c2UgTE9DQUxFIGZsYWcgd2l0aCBhIHN0ciBwYXR0ZXJuIikKICAgICAgICAgaWYgbm90IGZsYWdzICYgU1JFX0ZMQUdfQVNDSUk6CiAgICAgICAgICAgICBmbGFncyB8PSBTUkVfRkxBR19VTklDT0RFCiAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgpAQCAtODEwLDEwICs3NzYsNyBAQAogICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgdXNlIFVOSUNPREUgZmxhZyB3aXRoIGEgYnl0ZXMgcGF0dGVybiIpCiAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFIGFuZCBmbGFncyAmIFNSRV9GTEFHX0FTQ0lJOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBU0NJSSBhbmQgTE9DQUxFIGZsYWdzIGFyZSBpbmNvbXBhdGlibGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbGwgYmUgYW4gZXJyb3IgaW4gMy42IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTYpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBU0NJSSBhbmQgTE9DQUxFIGZsYWdzIGFyZSBpbmNvbXBhdGlibGUiKQogICAgIHJldHVybiBmbGFncwogCiBkZWYgcGFyc2Uoc3RyLCBmbGFncz0wLCBwYXR0ZXJuPU5vbmUpOgpAQCAtOTE0LDkgKzg3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBjaHIoRVNDQVBFU1t0aGlzXVsxXSkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gQVNDSUlMRVRURVJTOgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdiYWQgZXNjYXBlICVzJyAlIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD00KQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugcy5lcnJvcignYmFkIGVzY2FwZSAlcycgJSB0aGlzLCBsZW4odGhpcykpCiAgICAgICAgICAgICAgICAgbGFwcGVuZCh0aGlzKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbGFwcGVuZCh0aGlzKQpkaWZmIC0tZ2l0IGEvTGliL3NzbC5weSBiL0xpYi9zc2wucHkKaW5kZXggZTE5MTM5MC4uNDJjYTE2OCAxMDA2NDQKLS0tIGEvTGliL3NzbC5weQorKysgYi9MaWIvc3NsLnB5CkBAIC04OTgsNyArODk4LDYgQEAKICAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IGFtb3VudCk6CiAgICAgICAgICAgICAgICAgdiA9IHNlbGYuc2VuZChkYXRhW2NvdW50Ol0pCiAgICAgICAgICAgICAgICAgY291bnQgKz0gdgotICAgICAgICAgICAgcmV0dXJuIGFtb3VudAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5zZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzKQogCmRpZmYgLS1naXQgYS9MaWIvc3RhdGlzdGljcy5weSBiL0xpYi9zdGF0aXN0aWNzLnB5CmluZGV4IDRmNWMxYzEuLjdkNTNlMGMgMTAwNjQ0Ci0tLSBhL0xpYi9zdGF0aXN0aWNzLnB5CisrKyBiL0xpYi9zdGF0aXN0aWNzLnB5CkBAIC0xLDIwICsxLDMgQEAKLSMjICBNb2R1bGUgc3RhdGlzdGljcy5weQotIyMKLSMjICBDb3B5cmlnaHQgKGMpIDIwMTMgU3RldmVuIEQnQXByYW5vIDxzdGV2ZStweXRob25AcGVhcndvb2QuaW5mbz4uCi0jIwotIyMgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyMgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMjICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMjCi0jIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIwotIyMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyMgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyMgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCiAiIiIKIEJhc2ljIHN0YXRpc3RpY3MgbW9kdWxlLgogCkBAIC0yOCw2ICsxMSw4IEBACiBGdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uCiA9PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogbWVhbiAgICAgICAgICAgICAgICBBcml0aG1ldGljIG1lYW4gKGF2ZXJhZ2UpIG9mIGRhdGEuCitnZW9tZXRyaWNfbWVhbiAgICAgIEdlb21ldHJpYyBtZWFuIG9mIGRhdGEuCitoYXJtb25pY19tZWFuICAgICAgIEhhcm1vbmljIG1lYW4gb2YgZGF0YS4KIG1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuCiBtZWRpYW5fbG93ICAgICAgICAgIExvdyBtZWRpYW4gb2YgZGF0YS4KIG1lZGlhbl9oaWdoICAgICAgICAgSGlnaCBtZWRpYW4gb2YgZGF0YS4KQEAgLTk1LDE2ICs4MCwxOCBAQAogX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsCiAgICAgICAgICAgICAncHN0ZGV2JywgJ3B2YXJpYW5jZScsICdzdGRldicsICd2YXJpYW5jZScsCiAgICAgICAgICAgICAnbWVkaWFuJywgICdtZWRpYW5fbG93JywgJ21lZGlhbl9oaWdoJywgJ21lZGlhbl9ncm91cGVkJywKLSAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLAorICAgICAgICAgICAgJ21lYW4nLCAnbW9kZScsICdnZW9tZXRyaWNfbWVhbicsICdoYXJtb25pY19tZWFuJywKICAgICAgICAgICBdCiAKLQogaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgZGVjaW1hbAogaW1wb3J0IG1hdGgKK2ltcG9ydCBudW1iZXJzCiAKIGZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgogZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgZ3JvdXBieQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnksIGNoYWluCitmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQsIGJpc2VjdF9yaWdodAogCiAKIApAQCAtMTM0LDcgKzEyMSw4IEBACiAKICAgICBTb21lIHNvdXJjZXMgb2Ygcm91bmQtb2ZmIGVycm9yIHdpbGwgYmUgYXZvaWRlZDoKIAotICAgID4+PiBfc3VtKFsxZTUwLCAxLCAtMWU1MF0gKiAxMDAwKSAgIyBCdWlsdC1pbiBzdW0gcmV0dXJucyB6ZXJvLgorICAgICMgQnVpbHQtaW4gc3VtIHJldHVybnMgemVyby4KKyAgICA+Pj4gX3N1bShbMWU1MCwgMSwgLTFlNTBdICogMTAwMCkKICAgICAoPGNsYXNzICdmbG9hdCc+LCBGcmFjdGlvbigxMDAwLCAxKSwgMzAwMCkKIAogICAgIEZyYWN0aW9ucyBhbmQgRGVjaW1hbHMgYXJlIGFsc28gc3VwcG9ydGVkOgpAQCAtMjIzLDU2ICsyMTEsMjYgQEAKICAgICAgICAgIyBPcHRpbWlzZSB0aGUgY29tbW9uIGNhc2Ugb2YgZmxvYXRzLiBXZSBleHBlY3QgdGhhdCB0aGUgbW9zdCBvZnRlbgogICAgICAgICAjIHVzZWQgbnVtZXJpYyB0eXBlIHdpbGwgYmUgYnVpbHRpbiBmbG9hdHMsIHNvIHRyeSB0byBtYWtlIHRoaXMgYXMKICAgICAgICAgIyBmYXN0IGFzIHBvc3NpYmxlLgotICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0OgorICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0IG9yIHR5cGUoeCkgaXMgRGVjaW1hbDoKICAgICAgICAgICAgIHJldHVybiB4LmFzX2ludGVnZXJfcmF0aW8oKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIHggbWF5IGJlIGFuIGludCwgRnJhY3Rpb24sIG9yIEludGVncmFsIEFCQy4KICAgICAgICAgICAgIHJldHVybiAoeC5udW1lcmF0b3IsIHguZGVub21pbmF0b3IpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgZmxvYXQgc3ViY2xhc3MuCisgICAgICAgICAgICAgICAgIyB4IG1heSBiZSBhIGZsb2F0IG9yIERlY2ltYWwgc3ViY2xhc3MuCiAgICAgICAgICAgICAgICAgcmV0dXJuIHguYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgRGVjaW1hbC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNpbWFsX3RvX3JhdGlvKHgpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAjIEp1c3QgZ2l2ZSB1cD8KLSAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICMgSnVzdCBnaXZlIHVwPworICAgICAgICAgICAgICAgIHBhc3MKICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAjIGZsb2F0IE5BTiBvciBJTkYuCi0gICAgICAgIGFzc2VydCBub3QgbWF0aC5pc2Zpbml0ZSh4KQorICAgICAgICBhc3NlcnQgbm90IF9pc2Zpbml0ZSh4KQogICAgICAgICByZXR1cm4gKHgsIE5vbmUpCiAgICAgbXNnID0gImNhbid0IGNvbnZlcnQgdHlwZSAne30nIHRvIG51bWVyYXRvci9kZW5vbWluYXRvciIKICAgICByYWlzZSBUeXBlRXJyb3IobXNnLmZvcm1hdCh0eXBlKHgpLl9fbmFtZV9fKSkKIAogCi0jIEZJWE1FIFRoaXMgaXMgZmFzdGVyIHRoYW4gRnJhY3Rpb24uZnJvbV9kZWNpbWFsLCBidXQgc3RpbGwgdG9vIHNsb3cuCi1kZWYgX2RlY2ltYWxfdG9fcmF0aW8oZCk6Ci0gICAgIiIiQ29udmVydCBEZWNpbWFsIGQgdG8gZXhhY3QgaW50ZWdlciByYXRpbyAobnVtZXJhdG9yLCBkZW5vbWluYXRvcikuCi0KLSAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi0gICAgPj4+IF9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjIuNiIpKQotICAgICgyNiwgMTApCi0KLSAgICAiIiIKLSAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGQuYXNfdHVwbGUoKQotICAgIGlmIGV4cCBpbiAoJ0YnLCAnbicsICdOJyk6ICAjIElORiwgTkFOLCBzTkFOCi0gICAgICAgIGFzc2VydCBub3QgZC5pc19maW5pdGUoKQotICAgICAgICByZXR1cm4gKGQsIE5vbmUpCi0gICAgbnVtID0gMAotICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6Ci0gICAgICAgIG51bSA9IG51bSoxMCArIGRpZ2l0Ci0gICAgaWYgZXhwIDwgMDoKLSAgICAgICAgZGVuID0gMTAqKi1leHAKLSAgICBlbHNlOgotICAgICAgICBudW0gKj0gMTAqKmV4cAotICAgICAgICBkZW4gPSAxCi0gICAgaWYgc2lnbjoKLSAgICAgICAgbnVtID0gLW51bQotICAgIHJldHVybiAobnVtLCBkZW4pCi0KLQogZGVmIF9jb252ZXJ0KHZhbHVlLCBUKToKICAgICAiIiJDb252ZXJ0IHZhbHVlIHRvIGdpdmVuIG51bWVyaWMgdHlwZSBULiIiIgogICAgIGlmIHR5cGUodmFsdWUpIGlzIFQ6CkBAIC0zMDUsNiArMjYzLDI1MyBAQAogICAgIHJldHVybiB0YWJsZQogCiAKK2RlZiBfZmluZF9sdGVxKGEsIHgpOgorICAgICdMb2NhdGUgdGhlIGxlZnRtb3N0IHZhbHVlIGV4YWN0bHkgZXF1YWwgdG8geCcKKyAgICBpID0gYmlzZWN0X2xlZnQoYSwgeCkKKyAgICBpZiBpICE9IGxlbihhKSBhbmQgYVtpXSA9PSB4OgorICAgICAgICByZXR1cm4gaQorICAgIHJhaXNlIFZhbHVlRXJyb3IKKworCitkZWYgX2ZpbmRfcnRlcShhLCBsLCB4KToKKyAgICAnTG9jYXRlIHRoZSByaWdodG1vc3QgdmFsdWUgZXhhY3RseSBlcXVhbCB0byB4JworICAgIGkgPSBiaXNlY3RfcmlnaHQoYSwgeCwgbG89bCkKKyAgICBpZiBpICE9IChsZW4oYSkrMSkgYW5kIGFbaS0xXSA9PSB4OgorICAgICAgICByZXR1cm4gaS0xCisgICAgcmFpc2UgVmFsdWVFcnJvcgorCisKK2RlZiBfZmFpbF9uZWcodmFsdWVzLCBlcnJtc2c9J25lZ2F0aXZlIHZhbHVlJyk6CisgICAgIiIiSXRlcmF0ZSBvdmVyIHZhbHVlcywgZmFpbGluZyBpZiBhbnkgYXJlIGxlc3MgdGhhbiB6ZXJvLiIiIgorICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgaWYgeCA8IDA6CisgICAgICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoZXJybXNnKQorICAgICAgICB5aWVsZCB4CisKKworY2xhc3MgX25yb290X05TOgorICAgICIiIkhhbmRzIG9mZiEgRG9uJ3QgdG91Y2ghCisKKyAgICBFdmVyeXRoaW5nIGluc2lkZSB0aGlzIG5hbWVzcGFjZSAoY2xhc3MpIGlzIGFuIGV2ZW4tbW9yZS1wcml2YXRlCisgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBwcml2YXRlIF9udGhfcm9vdCBmdW5jdGlvbi4KKyAgICAiIiIKKyAgICAjIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgdG8gYmUgdXNlZCBhcyBhIG5hbWVzcGFjZSwgZm9yIGNvbnZlbmllbmNlCisgICAgIyBvZiBiZWluZyBhYmxlIHRvIGtlZXAgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHRvZ2V0aGVyLCBhbmQgdG8KKyAgICAjIGNvbGxhcHNlIHRoZSBncm91cCBpbiBhbiBlZGl0b3IuIElmIHRoaXMgd2VyZSBDIyBvciBDKyssIEkgd291bGQKKyAgICAjIHVzZSBhIE5hbWVzcGFjZSwgYnV0IHRoZSBjbG9zZXN0IFB5dGhvbiBoYXMgaXMgYSBjbGFzcy4KKyAgICAjCisgICAgIyBGSVhNRSBwb3NzaWJseSBtb3ZlIHRoaXMgb3V0IGludG8gYSBzZXBhcmF0ZSBtb2R1bGU/CisgICAgIyBUaGF0IGZlZWxzIGxpa2Ugb3ZlcmtpbGwsIGFuZCBtYXkgZW5jb3VyYWdlIHBlb3BsZSB0byB0cmVhdCBpdCBhcworICAgICMgYSBwdWJsaWMgZmVhdHVyZS4KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbmFtZXNwYWNlIG9ubHksIGRvIG5vdCBpbnN0YW50aWF0ZScpCisKKyAgICBkZWYgbnRoX3Jvb3QoeCwgbik6CisgICAgICAgICIiIlJldHVybiB0aGUgcG9zaXRpdmUgbnRoIHJvb3Qgb2YgbnVtZXJpYyB4LgorCisgICAgICAgIFRoaXMgbWF5IGJlIG1vcmUgYWNjdXJhdGUgdGhhbiAqKiBvciBwb3coKToKKworICAgICAgICA+Pj4gbWF0aC5wb3coMTAwMCwgMS4wLzMpICAjZG9jdGVzdDorU0tJUAorICAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OAorCisgICAgICAgID4+PiBfbnRoX3Jvb3QoMTAwMCwgMykKKyAgICAgICAgMTAuMAorICAgICAgICA+Pj4gX250aF9yb290KDExKio1LCA1KQorICAgICAgICAxMS4wCisgICAgICAgID4+PiBfbnRoX3Jvb3QoMiwgMTIpCisgICAgICAgIDEuMDU5NDYzMDk0MzU5Mjk1MworCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdkZWdyZWUgbiBtdXN0IGJlIGFuIGludCcpCisgICAgICAgIGlmIG4gPCAyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZGVncmVlIG4gbXVzdCBiZSAyIG9yIG1vcmUnKQorICAgICAgICBpZiBpc2luc3RhbmNlKHgsIGRlY2ltYWwuRGVjaW1hbCk6CisgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmRlY2ltYWxfbnJvb3QoeCwgbikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHgsIG51bWJlcnMuUmVhbCk6CisgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmZsb2F0X25yb290KHgsIG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgbnVtYmVyLCBnb3QgJXMnKSAlIHR5cGUoeCkuX19uYW1lX18KKworICAgIGRlZiBmbG9hdF9ucm9vdCh4LCBuKToKKyAgICAgICAgIiIiSGFuZGxlIG50aCByb290IG9mIFJlYWxzLCB0cmVhdGVkIGFzIGEgZmxvYXQuIiIiCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG4sIGludCkgYW5kIG4gPiAxCisgICAgICAgIGlmIHggPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZG9tYWluIGVycm9yOiByb290IG9mIG5lZ2F0aXZlIG51bWJlcicpCisgICAgICAgIGVsaWYgeCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIG1hdGguY29weXNpZ24oMC4wLCB4KQorICAgICAgICBlbGlmIHggPiAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzaW5maW5pdHkgPSBtYXRoLmlzaW5mKHgpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX25yb290X05TLmJpZ251bV9ucm9vdCh4LCBuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luZmluaXR5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoJ2luZicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ucm9vdF9OUy5ucm9vdCh4LCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IG1hdGguaXNuYW4oeCkKKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgnbmFuJykKKworICAgIGRlZiBucm9vdCh4LCBuKToKKyAgICAgICAgIiIiQ2FsY3VsYXRlIHgqKigxL24pLCB0aGVuIGltcHJvdmUgdGhlIGFuc3dlci4iIiIKKyAgICAgICAgIyBUaGlzIHVzZXMgbWF0aC5wb3coKSB0byBjYWxjdWxhdGUgYW4gaW5pdGlhbCBndWVzcyBmb3IgdGhlIHJvb3QsCisgICAgICAgICMgdGhlbiB1c2VzIHRoZSBpdGVyYXRlZCBucm9vdCBhbGdvcml0aG0gdG8gaW1wcm92ZSBpdC4KKyAgICAgICAgIworICAgICAgICAjIEJ5IG15IHRlc3RpbmcsIGFib3V0IDglIG9mIHRoZSB0aW1lIHRoZSBpdGVyYXRlZCBhbGdvcml0aG0gZW5kcworICAgICAgICAjIHVwIGNvbnZlcmdpbmcgdG8gYSByZXN1bHQgd2hpY2ggaXMgbGVzcyBhY2N1cmF0ZSB0aGFuIHRoZSBpbml0aWFsCisgICAgICAgICMgZ3Vlc3MuIFtGSVhNRTogaXMgdGhpcyBzdGlsbCB0cnVlP10gSW4gdGhhdCBjYXNlLCB3ZSB1c2UgdGhlCisgICAgICAgICMgZ3Vlc3MgaW5zdGVhZCBvZiB0aGUgImltcHJvdmVkIiB2YWx1ZS4gVGhpcyB3YXksIHdlJ3JlIG5ldmVyCisgICAgICAgICMgbGVzcyBhY2N1cmF0ZSB0aGFuIG1hdGgucG93KCkuCisgICAgICAgIHIxID0gbWF0aC5wb3coeCwgMS4wL24pCisgICAgICAgIGVwczEgPSBhYnMocjEqKm4gLSB4KQorICAgICAgICBpZiBlcHMxID09IDAuMDoKKyAgICAgICAgICAgICMgcjEgaXMgdGhlIGV4YWN0IHJvb3QsIHNvIHdlJ3JlIGRvbmUuIEJ5IG15IHRlc3RpbmcsIHRoaXMKKyAgICAgICAgICAgICMgb2NjdXJzIGFib3V0IDgwJSBvZiB0aGUgdGltZSBmb3IgeCA8IDEgYW5kIDMwJSBvZiB0aGUKKyAgICAgICAgICAgICMgdGltZSBmb3IgeCA+IDEuCisgICAgICAgICAgICByZXR1cm4gcjEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByMiA9IF9ucm9vdF9OUy5pdGVyYXRlZF9ucm9vdCh4LCBuLCByMSkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHIxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVwczIgPSBhYnMocjIqKm4gLSB4KQorICAgICAgICAgICAgICAgIGlmIGVwczEgPCBlcHMyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjEKKyAgICAgICAgICAgICAgICByZXR1cm4gcjIKKworICAgIGRlZiBpdGVyYXRlZF9ucm9vdChhLCBuLCBnKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudGggcm9vdCBvZiBhLCBzdGFydGluZyB3aXRoIGd1ZXNzIGcuCisKKyAgICAgICAgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOZXd0b24ncyBNZXRob2QuCisgICAgICAgIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL050aF9yb290X2FsZ29yaXRobQorICAgICAgICAiIiIKKyAgICAgICAgbnAgPSBuIC0gMQorICAgICAgICBkZWYgaXRlcmF0ZShyKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5wKnIgKyBhL21hdGgucG93KHIsIG5wKSkvbgorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgIyBJZiByIGlzIGxhcmdlIGVub3VnaCwgcioqbnAgbWF5IG92ZXJmbG93LiBJZiB0aGF0CisgICAgICAgICAgICAgICAgIyBoYXBwZW5zLCByKiotbnAgd2lsbCBiZSBzbWFsbCwgYnV0IG5vdCBuZWNlc3NhcmlseSB6ZXJvLgorICAgICAgICAgICAgICAgIHJldHVybiAobnAqciArIGEqbWF0aC5wb3cociwgLW5wKSkvbgorICAgICAgICAjIFdpdGggYSBnb29kIGd1ZXNzLCBzdWNoIGFzIGcgPSBhKiooMS9uKSwgdGhpcyB3aWxsIGNvbnZlcmdlIGluCisgICAgICAgICMgb25seSBhIGZldyBpdGVyYXRpb25zLiBIb3dldmVyIGEgcG9vciBndWVzcyBjYW4gdGFrZSB0aG91c2FuZHMKKyAgICAgICAgIyBvZiBpdGVyYXRpb25zIHRvIGNvbnZlcmdlLCBpZiBhdCBhbGwuIFdlIGd1YXJkIGFnYWluc3QgcG9vcgorICAgICAgICAjIGd1ZXNzZXMgYnkgc2V0dGluZyBhbiB1cHBlciBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuCisgICAgICAgIHIxID0gZworICAgICAgICByMiA9IGl0ZXJhdGUoZykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBpZiByMSA9PSByMjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBVc2UgRmxveWQncyBjeWNsZS1maW5kaW5nIGFsZ29yaXRobSB0byBhdm9pZCBiZWluZyB0cmFwcGVkCisgICAgICAgICAgICAjIGluIGEgY3ljbGUuCisgICAgICAgICAgICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5Y2xlX2RldGVjdGlvbiNUb3J0b2lzZV9hbmRfaGFyZQorICAgICAgICAgICAgcjEgPSBpdGVyYXRlKHIxKQorICAgICAgICAgICAgcjIgPSBpdGVyYXRlKGl0ZXJhdGUocjIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiB0aGUgZ3Vlc3MgaXMgcGFydGljdWxhcmx5IGJhZCwgdGhlIGFib3ZlIG1heSBmYWlsIHRvCisgICAgICAgICAgICAjIGNvbnZlcmdlIGluIGFueSByZWFzb25hYmxlIHRpbWUuCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ250aC1yb290IGZhaWxlZCB0byBjb252ZXJnZScpCisgICAgICAgIHJldHVybiByMgorCisgICAgZGVmIGRlY2ltYWxfbnJvb3QoeCwgbik6CisgICAgICAgICIiIkhhbmRsZSBudGggcm9vdCBvZiBEZWNpbWFscy4iIiIKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgZGVjaW1hbC5EZWNpbWFsKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuLCBpbnQpCisgICAgICAgIGlmIHguaXNfc25hbigpOgorICAgICAgICAgICAgIyBTaWduYWxsaW5nIE5BTnMgYWx3YXlzIHJhaXNlLgorICAgICAgICAgICAgcmFpc2UgZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uKCdudGgtcm9vdCBvZiBzbmFuJykKKyAgICAgICAgaWYgeC5pc19xbmFuKCk6CisgICAgICAgICAgICAjIFF1aWV0IE5BTnMgb25seSByYWlzZSBpZiB0aGUgY29udGV4dCBpcyBzZXQgdG8gcmFpc2UsCisgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gYSBOQU4uCisgICAgICAgICAgICBjdHggPSBkZWNpbWFsLmdldGNvbnRleHQoKQorICAgICAgICAgICAgaWYgY3R4LnRyYXBzW2RlY2ltYWwuSW52YWxpZE9wZXJhdGlvbl06CisgICAgICAgICAgICAgICAgcmFpc2UgZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uKCdudGgtcm9vdCBvZiBuYW4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFByZXNlcnZlIHRoZSBpbnB1dCBOQU4uCisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgaWYgeCA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkb21haW4gZXJyb3I6IHJvb3Qgb2YgbmVnYXRpdmUgbnVtYmVyJykKKyAgICAgICAgaWYgeC5pc19pbmZpbml0ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgIyBGSVhNRSB0aGlzIGhhc24ndCBoYWQgdGhlIGV4dGVuc2l2ZSB0ZXN0aW5nIG9mIHRoZSBmbG9hdAorICAgICAgICAjIHZlcnNpb24gX2l0ZXJhdGVkX25yb290IHNvIHRoZXJlJ3MgcG9zc2libHkgc29tZSBidWdneQorICAgICAgICAjIGNvcm5lciBjYXNlcyBidXJpZWQgaW4gaGVyZS4gQ2FuIGl0IG92ZXJmbG93PyBGYWlsIHRvCisgICAgICAgICMgY29udmVyZ2Ugb3IgZ2V0IHRyYXBwZWQgaW4gYSBjeWNsZT8gQ29udmVyZ2UgdG8gYSBsZXNzCisgICAgICAgICMgYWNjdXJhdGUgcm9vdD8KKyAgICAgICAgbnAgPSBuIC0gMQorICAgICAgICBkZWYgaXRlcmF0ZShyKToKKyAgICAgICAgICAgIHJldHVybiAobnAqciArIHgvcioqbnApL24KKyAgICAgICAgcjAgPSB4KiooZGVjaW1hbC5EZWNpbWFsKDEpL24pCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHIwLCBkZWNpbWFsLkRlY2ltYWwpCisgICAgICAgIHIxID0gaXRlcmF0ZShyMCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHIxID09IHIwOgorICAgICAgICAgICAgICAgIHJldHVybiByMQorICAgICAgICAgICAgcjAsIHIxID0gcjEsIGl0ZXJhdGUocjEpCisKKyAgICBkZWYgYmlnbnVtX25yb290KHgsIG4pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG50aCByb290IG9mIGEgcG9zaXRpdmUgaHVnZSBudW1iZXIuIiIiCisgICAgICAgIGFzc2VydCB4ID4gMAorICAgICAgICAjIEkgc3RhdGUgd2l0aG91dCBwcm9vZiB0aGF0IOKBv+KImngg4omIIOKBv+KImjLCt+KBv+KImih4Ly8yKQorICAgICAgICAjIGFuZCB0aGF0IGZvciBzdWZmaWNpZW50bHkgYmlnIHggdGhlIGVycm9yIGlzIGFjY2VwdGFibGUuCisgICAgICAgICMgV2Ugbm93IGhhbHZlIHggdW50aWwgaXQgaXMgc21hbGwgZW5vdWdoIHRvIGdldCB0aGUgcm9vdC4KKyAgICAgICAgbSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHggLy89IDIKKyAgICAgICAgICAgIG0gKz0gMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHkgPSBmbG9hdCh4KQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGEgPSBfbnJvb3RfTlMubnJvb3QoeSwgbikKKyAgICAgICAgIyBBdCB0aGlzIHBvaW50LCB3ZSB3YW50IHRoZSBudGgtcm9vdCBvZiAyKiptLCBvciAyKioobS9uKS4KKyAgICAgICAgIyBXZSBjYW4gd3JpdGUgdGhhdCBhcyAyKioocSArIHIvbikgPSAyKipxICog4oG/4oiaMioqciB3aGVyZSBxID0gbS8vbi4KKyAgICAgICAgcSwgciA9IGRpdm1vZChtLCBuKQorICAgICAgICBiID0gMioqcSAqIF9ucm9vdF9OUy5ucm9vdCgyKipyLCBuKQorICAgICAgICByZXR1cm4gYSAqIGIKKworCisjIFRoaXMgaXMgdGhlIChwcml2YXRlKSBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgbnRoIHJvb3RzOgorX250aF9yb290ID0gX25yb290X05TLm50aF9yb290Cithc3NlcnQgdHlwZShfbnRoX3Jvb3QpIGlzIHR5cGUobGFtYmRhOiBOb25lKQorCisKK2RlZiBfcHJvZHVjdCh2YWx1ZXMpOgorICAgICIiIlJldHVybiBwcm9kdWN0IG9mIHZhbHVlcyBhcyAoZXhwb25lbnQsIG1hbnRpc3NhKS4iIiIKKyAgICBlcnJtc2cgPSAnbWl4ZWQgRGVjaW1hbCBhbmQgZmxvYXQgaXMgbm90IHN1cHBvcnRlZCcKKyAgICBwcm9kID0gMQorICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBmbG9hdCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBwcm9kICo9IHgKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gKDAsIHByb2QpCisgICAgaWYgaXNpbnN0YW5jZShwcm9kLCBEZWNpbWFsKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKGVycm1zZykKKyAgICAjIFNpbmNlIGZsb2F0cyBjYW4gb3ZlcmZsb3cgZWFzaWx5LCB3ZSBjYWxjdWxhdGUgdGhlIHByb2R1Y3QgYXMgYQorICAgICMgc29ydCBvZiBwb29yLW1hbidzIEJpZ0Zsb2F0LiBHaXZlbiB0aGF0OgorICAgICMKKyAgICAjICAgeCA9IDIqKnAgKiBtICAjIHAgPT0gcG93ZXIgb3IgZXhwb25lbnQgKHNjYWxlKSwgbSA9IG1hbnRpc3NhCisgICAgIworICAgICMgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0d28gKG9yIG1vcmUpIHggdmFsdWVzIGFzOgorICAgICMKKyAgICAjICAgeDEqeDIgPSAyKipwMSptMSAqIDIqKnAyKm0yID0gMioqKHAxK3AyKSoobTEqbTIpCisgICAgIworICAgIG1hbnQsIHNjYWxlID0gMSwgMCAgI21hdGguZnJleHAocHJvZCkgICMgRklYTUUKKyAgICBmb3IgeSBpbiBjaGFpbihbeF0sIHZhbHVlcyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoeSwgRGVjaW1hbCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoZXJybXNnKQorICAgICAgICBtMSwgZTEgPSBtYXRoLmZyZXhwKHkpCisgICAgICAgIG0yLCBlMiA9IG1hdGguZnJleHAobWFudCkKKyAgICAgICAgc2NhbGUgKz0gKGUxICsgZTIpCisgICAgICAgIG1hbnQgPSBtMSptMgorICAgIHJldHVybiAoc2NhbGUsIG1hbnQpCisKKwogIyA9PT0gTWVhc3VyZXMgb2YgY2VudHJhbCB0ZW5kZW5jeSAoYXZlcmFnZXMpID09PQogCiBkZWYgbWVhbihkYXRhKToKQEAgLTMzMyw2ICs1MzgsOTUgQEAKICAgICByZXR1cm4gX2NvbnZlcnQodG90YWwvbiwgVCkKIAogCitkZWYgZ2VvbWV0cmljX21lYW4oZGF0YSk6CisgICAgIiIiUmV0dXJuIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBkYXRhLgorCisgICAgVGhlIGdlb21ldHJpYyBtZWFuIGlzIGFwcHJvcHJpYXRlIHdoZW4gYXZlcmFnaW5nIHF1YW50aXRpZXMgd2hpY2gKKyAgICBhcmUgbXVsdGlwbGllZCB0b2dldGhlciByYXRoZXIgdGhhbiBhZGRlZCwgZm9yIGV4YW1wbGUgZ3Jvd3RoIHJhdGVzLgorICAgIFN1cHBvc2UgYW4gaW52ZXN0bWVudCBncm93cyBieSAxMCUgaW4gdGhlIGZpcnN0IHllYXIsIGZhbGxzIGJ5IDUlIGluCisgICAgdGhlIHNlY29uZCwgdGhlbiBncm93cyBieSAxMiUgaW4gdGhlIHRoaXJkLCB3aGF0IGlzIHRoZSBhdmVyYWdlIHJhdGUKKyAgICBvZiBncm93dGggb3ZlciB0aGUgdGhyZWUgeWVhcnM/CisKKyAgICA+Pj4gZ2VvbWV0cmljX21lYW4oWzEuMTAsIDAuOTUsIDEuMTJdKQorICAgIDEuMDUzODQ4MzEyMzM4MjE3MgorCisgICAgZ2l2aW5nIGFuIGF2ZXJhZ2UgZ3Jvd3RoIG9mIDUuMzg1JS4gVXNpbmcgdGhlIGFyaXRobWV0aWMgbWVhbiB3aWxsCisgICAgZ2l2ZSBhcHByb3hpbWF0ZWx5IDUuNjY3JSwgd2hpY2ggaXMgdG9vIGhpZ2guCisKKyAgICBgYFN0YXRpc3RpY3NFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGlmIGBgZGF0YWBgIGlzIGVtcHR5LCBvciBhbnkKKyAgICBlbGVtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICIiIgorICAgIGlmIGl0ZXIoZGF0YSkgaXMgZGF0YToKKyAgICAgICAgZGF0YSA9IGxpc3QoZGF0YSkKKyAgICBlcnJtc2cgPSAnZ2VvbWV0cmljIG1lYW4gZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMnCisgICAgbiA9IGxlbihkYXRhKQorICAgIGlmIG4gPCAxOgorICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoJ2dlb21ldHJpY19tZWFuIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBkYXRhIHBvaW50JykKKyAgICBlbGlmIG4gPT0gMToKKyAgICAgICAgeCA9IGRhdGFbMF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShnLCAobnVtYmVycy5SZWFsLCBEZWNpbWFsKSk6CisgICAgICAgICAgICBpZiB4IDwgMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoZXJybXNnKQorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgdHlwZScpCisgICAgZWxzZToKKyAgICAgICAgc2NhbGUsIHByb2QgPSBfcHJvZHVjdChfZmFpbF9uZWcoZGF0YSwgZXJybXNnKSkKKyAgICAgICAgciA9IF9udGhfcm9vdChwcm9kLCBuKQorICAgICAgICBpZiBzY2FsZToKKyAgICAgICAgICAgIHAsIHEgPSBkaXZtb2Qoc2NhbGUsIG4pCisgICAgICAgICAgICBzID0gMioqcCAqIF9udGhfcm9vdCgyKipxLCBuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IDEKKyAgICAgICAgcmV0dXJuIHMqcgorCisKK2RlZiBoYXJtb25pY19tZWFuKGRhdGEpOgorICAgICIiIlJldHVybiB0aGUgaGFybW9uaWMgbWVhbiBvZiBkYXRhLgorCisgICAgVGhlIGhhcm1vbmljIG1lYW4sIHNvbWV0aW1lcyBjYWxsZWQgdGhlIHN1YmNvbnRyYXJ5IG1lYW4sIGlzIHRoZQorICAgIHJlY2lwcm9jYWwgb2YgdGhlIGFyaXRobWV0aWMgbWVhbiBvZiB0aGUgcmVjaXByb2NhbHMgb2YgdGhlIGRhdGEsCisgICAgYW5kIGlzIG9mdGVuIGFwcHJvcHJpYXRlIHdoZW4gYXZlcmFnaW5nIHF1YW50aXRpZXMgd2hpY2ggYXJlIHJhdGVzCisgICAgb3IgcmF0aW9zLCBmb3IgZXhhbXBsZSBzcGVlZHMuIEV4YW1wbGU6CisKKyAgICBTdXBwb3NlIGFuIGludmVzdG9yIHB1cmNoYXNlcyBhbiBlcXVhbCB2YWx1ZSBvZiBzaGFyZXMgaW4gZWFjaCBvZgorICAgIHRocmVlIGNvbXBhbmllcywgd2l0aCBQL0UgKHByaWNlL2Vhcm5pbmcpIHJhdGlvcyBvZiAyLjUsIDMgYW5kIDEwLgorICAgIFdoYXQgaXMgdGhlIGF2ZXJhZ2UgUC9FIHJhdGlvIGZvciB0aGUgaW52ZXN0b3IncyBwb3J0Zm9saW8/CisKKyAgICA+Pj4gaGFybW9uaWNfbWVhbihbMi41LCAzLCAxMF0pICAjIEZvciBhbiBlcXVhbCBpbnZlc3RtZW50IHBvcnRmb2xpby4KKyAgICAzLjYKKworICAgIFVzaW5nIHRoZSBhcml0aG1ldGljIG1lYW4gd291bGQgZ2l2ZSBhbiBhdmVyYWdlIG9mIGFib3V0IDUuMTY3LCB3aGljaAorICAgIGlzIHRvbyBoaWdoLgorCisgICAgSWYgYGBkYXRhYGAgaXMgZW1wdHksIG9yIGFueSBlbGVtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLAorICAgIGBgaGFybW9uaWNfbWVhbmBgIHdpbGwgcmFpc2UgYGBTdGF0aXN0aWNzRXJyb3JgYC4KKyAgICAiIiIKKyAgICAjIEZvciBhIGp1c3RpZmljYXRpb24gZm9yIHVzaW5nIGhhcm1vbmljIG1lYW4gZm9yIFAvRSByYXRpb3MsIHNlZQorICAgICMgaHR0cDovL2ZpeHRoZXBpdGNoLnBlbGx1Y2lkLmNvbS9jb21wcy1hbmFseXNpcy10aGUtbWlzc2luZy1oYXJtb255LW9mLXN1bW1hcnktc3RhdGlzdGljcy8KKyAgICAjIGh0dHA6Ly9wYXBlcnMuc3Nybi5jb20vc29sMy9wYXBlcnMuY2ZtP2Fic3RyYWN0X2lkPTI2MjEwODcKKyAgICBpZiBpdGVyKGRhdGEpIGlzIGRhdGE6CisgICAgICAgIGRhdGEgPSBsaXN0KGRhdGEpCisgICAgZXJybXNnID0gJ2hhcm1vbmljIG1lYW4gZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSB2YWx1ZXMnCisgICAgbiA9IGxlbihkYXRhKQorICAgIGlmIG4gPCAxOgorICAgICAgICByYWlzZSBTdGF0aXN0aWNzRXJyb3IoJ2hhcm1vbmljX21lYW4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGRhdGEgcG9pbnQnKQorICAgIGVsaWYgbiA9PSAxOgorICAgICAgICB4ID0gZGF0YVswXQorICAgICAgICBpZiBpc2luc3RhbmNlKHgsIChudW1iZXJzLlJlYWwsIERlY2ltYWwpKToKKyAgICAgICAgICAgIGlmIHggPCAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0YXRpc3RpY3NFcnJvcihlcnJtc2cpCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCB0eXBlJykKKyAgICB0cnk6CisgICAgICAgIFQsIHRvdGFsLCBjb3VudCA9IF9zdW0oMS94IGZvciB4IGluIF9mYWlsX25lZyhkYXRhLCBlcnJtc2cpKQorICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBhc3NlcnQgY291bnQgPT0gbgorICAgIHJldHVybiBfY29udmVydChuL3RvdGFsLCBUKQorCisKICMgRklYTUU6IGludmVzdGlnYXRlIHdheXMgdG8gY2FsY3VsYXRlIG1lZGlhbnMgd2l0aG91dCBzb3J0aW5nPyBRdWlja3NlbGVjdD8KIGRlZiBtZWRpYW4oZGF0YSk6CiAgICAgIiIiUmV0dXJuIHRoZSBtZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgbnVtZXJpYyBkYXRhLgpAQCAtNDQyLDkgKzczNiwxNSBAQAogICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICMgTWl4ZWQgdHlwZS4gRm9yIG5vdyB3ZSBqdXN0IGNvZXJjZSB0byBmbG9hdC4KICAgICAgICAgTCA9IGZsb2F0KHgpIC0gZmxvYXQoaW50ZXJ2YWwpLzIKLSAgICBjZiA9IGRhdGEuaW5kZXgoeCkgICMgTnVtYmVyIG9mIHZhbHVlcyBiZWxvdyB0aGUgbWVkaWFuIGludGVydmFsLgotICAgICMgRklYTUUgVGhlIGZvbGxvd2luZyBsaW5lIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGZvciBiaWcgbGlzdHMuCi0gICAgZiA9IGRhdGEuY291bnQoeCkgICMgTnVtYmVyIG9mIGRhdGEgcG9pbnRzIGluIHRoZSBtZWRpYW4gaW50ZXJ2YWwuCisKKyAgICAjIFVzZXMgYmlzZWN0aW9uIHNlYXJjaCB0byBzZWFyY2ggZm9yIHggaW4gZGF0YSB3aXRoIGxvZyhuKSB0aW1lIGNvbXBsZXhpdHkKKyAgICAjIEZpbmQgdGhlIHBvc2l0aW9uIG9mIGxlZnRtb3N0IG9jY3VycmVuY2Ugb2YgeCBpbiBkYXRhCisgICAgbDEgPSBfZmluZF9sdGVxKGRhdGEsIHgpCisgICAgIyBGaW5kIHRoZSBwb3NpdGlvbiBvZiByaWdodG1vc3Qgb2NjdXJyZW5jZSBvZiB4IGluIGRhdGFbbDEuLi5sZW4oZGF0YSldCisgICAgIyBBc3N1bWluZyBhbHdheXMgbDEgPD0gbDIKKyAgICBsMiA9IF9maW5kX3J0ZXEoZGF0YSwgbDEsIHgpCisgICAgY2YgPSBsMQorICAgIGYgPSBsMiAtIGwxICsgMQogICAgIHJldHVybiBMICsgaW50ZXJ2YWwqKG4vMiAtIGNmKS9mCiAKIApkaWZmIC0tZ2l0IGEvTGliL3N0cmluZy5weSBiL0xpYi9zdHJpbmcucHkKaW5kZXggODkyODdjNC4uNzI5OGM4OSAxMDA2NDQKLS0tIGEvTGliL3N0cmluZy5weQorKysgYi9MaWIvc3RyaW5nLnB5CkBAIC0xMTYsMTAgKzExNiw3IEBACiAgICAgICAgICAgICAjIENoZWNrIHRoZSBtb3N0IGNvbW1vbiBwYXRoIGZpcnN0LgogICAgICAgICAgICAgbmFtZWQgPSBtby5ncm91cCgnbmFtZWQnKSBvciBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIG5hbWVkIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHZhbCA9IG1hcHBpbmdbbmFtZWRdCi0gICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlciB3aWxsCi0gICAgICAgICAgICAgICAgIyBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkgY2hhcmFjdGVycy4KLSAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlICh2YWwsKQorICAgICAgICAgICAgICAgIHJldHVybiBzdHIobWFwcGluZ1tuYW1lZF0pCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnZXNjYXBlZCcpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlcgogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2ludmFsaWQnKSBpcyBub3QgTm9uZToKQEAgLTE0Niw5ICsxNDMsNyBAQAogICAgICAgICAgICAgbmFtZWQgPSBtby5ncm91cCgnbmFtZWQnKSBvciBtby5ncm91cCgnYnJhY2VkJykKICAgICAgICAgICAgIGlmIG5hbWVkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlcgotICAgICAgICAgICAgICAgICAgICAjIHdpbGwgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbbmFtZWRdLCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihtYXBwaW5nW25hbWVkXSkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtby5ncm91cCgpCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnZXNjYXBlZCcpIGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCBkOGQ2YWIyLi4zZGVhMDg5IDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtMzcyLDkgKzM3MiwxMSBAQAogCiAKIGNsYXNzIENhbGxlZFByb2Nlc3NFcnJvcihTdWJwcm9jZXNzRXJyb3IpOgotICAgICIiIlRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGEgcHJvY2VzcyBydW4gYnkgY2hlY2tfY2FsbCgpIG9yCi0gICAgY2hlY2tfb3V0cHV0KCkgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLgotICAgIFRoZSBleGl0IHN0YXR1cyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGU7CisgICAgIiIiUmFpc2VkIHdoZW4gYSBjaGVja19jYWxsKCkgb3IgY2hlY2tfb3V0cHV0KCkgcHJvY2VzcyByZXR1cm5zIG5vbi16ZXJvLgorCisgICAgVGhlIGV4aXQgc3RhdHVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZSwgbmVnYXRpdmUKKyAgICBpZiBpdCByZXByZXNlbnRzIGEgc2lnbmFsIG51bWJlci4KKwogICAgIGNoZWNrX291dHB1dCgpIHdpbGwgYWxzbyBzdG9yZSB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgYXR0cmlidXRlLgogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5jb2RlLCBjbWQsIG91dHB1dD1Ob25lLCBzdGRlcnI9Tm9uZSk6CkBAIC0zODQsNyArMzg2LDE2IEBACiAgICAgICAgIHNlbGYuc3RkZXJyID0gc3RkZXJyCiAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBzdGF0dXMgJWQiICUgKHNlbGYuY21kLCBzZWxmLnJldHVybmNvZGUpCisgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBhbmQgc2VsZi5yZXR1cm5jb2RlIDwgMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyBkaWVkIHdpdGggJXIuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY21kLCBzaWduYWwuU2lnbmFscygtc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIGRpZWQgd2l0aCB1bmtub3duIHNpZ25hbCAlZC4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbWQsIC1zZWxmLnJldHVybmNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZC4iICUgKAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZCwgc2VsZi5yZXR1cm5jb2RlKQogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIHN0ZG91dChzZWxmKToKQEAgLTQ3MSw3ICs0ODIsOCBAQAogICAgIF9fYWxsX18uZXh0ZW5kKFsiQ1JFQVRFX05FV19DT05TT0xFIiwgIkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCIsCiAgICAgICAgICAgICAgICAgICAgICJTVERfSU5QVVRfSEFORExFIiwgIlNURF9PVVRQVVRfSEFORExFIiwKICAgICAgICAgICAgICAgICAgICAgIlNURF9FUlJPUl9IQU5ETEUiLCAiU1dfSElERSIsCi0gICAgICAgICAgICAgICAgICAgICJTVEFSVEZfVVNFU1RESEFORExFUyIsICJTVEFSVEZfVVNFU0hPV1dJTkRPVyJdKQorICAgICAgICAgICAgICAgICAgICAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciLAorICAgICAgICAgICAgICAgICAgICAiU1RBUlRVUElORk8iXSkKIAogICAgIGNsYXNzIEhhbmRsZShpbnQpOgogICAgICAgICBjbG9zZWQgPSBGYWxzZQpAQCAtNTIwLDYgKzUzMiwxNiBAQAogIyBidXQgaXQncyBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIGltcG9ydGVkIHdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIHdpdGhvdXQKICMgdGhyZWFkcy4KIAorZGVmIF9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKKyAgICBvcHRpbWl6YXRpb24gc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgorICAgIGFyZ3MgPSBbXQorICAgIHZhbHVlID0gc3lzLmZsYWdzLm9wdGltaXplCisgICAgaWYgdmFsdWUgPiAwOgorICAgICAgICBhcmdzLmFwcGVuZCgnLScgKyAnTycgKiB2YWx1ZSkKKyAgICByZXR1cm4gYXJncworCisKIGRlZiBfYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CiAgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzIGFuZCBzeXMud2Fybm9wdGlvbnMuIiIiCkBAIC01MjcsNyArNTQ5LDYgQEAKICAgICAgICAgJ2RlYnVnJzogJ2QnLAogICAgICAgICAjICdpbnNwZWN0JzogJ2knLAogICAgICAgICAjICdpbnRlcmFjdGl2ZSc6ICdpJywKLSAgICAgICAgJ29wdGltaXplJzogJ08nLAogICAgICAgICAnZG9udF93cml0ZV9ieXRlY29kZSc6ICdCJywKICAgICAgICAgJ25vX3VzZXJfc2l0ZSc6ICdzJywKICAgICAgICAgJ25vX3NpdGUnOiAnUycsCkBAIC01MzUsOCArNTU2LDkgQEAKICAgICAgICAgJ3ZlcmJvc2UnOiAndicsCiAgICAgICAgICdieXRlc193YXJuaW5nJzogJ2InLAogICAgICAgICAncXVpZXQnOiAncScsCisgICAgICAgICMgLU8gaXMgaGFuZGxlZCBpbiBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKICAgICB9Ci0gICAgYXJncyA9IFtdCisgICAgYXJncyA9IF9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogICAgIGZvciBmbGFnLCBvcHQgaW4gZmxhZ19vcHRfbWFwLml0ZW1zKCk6CiAgICAgICAgIHYgPSBnZXRhdHRyKHN5cy5mbGFncywgZmxhZykKICAgICAgICAgaWYgdiA+IDA6CkBAIC05NzEsNyArOTkzLDYgQEAKIAogICAgICAgICAgICAgcmFpc2UKIAotCiAgICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSwgZW5jb2RpbmcpOgogICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKS5yZXBsYWNlKCJcciIsICJcbiIpCkBAIC05OTUsNiArMTAxNiwxMSBAQAogICAgICAgICBpZiBub3Qgc2VsZi5fY2hpbGRfY3JlYXRlZDoKICAgICAgICAgICAgICMgV2UgZGlkbid0IGdldCB0byBzdWNjZXNzZnVsbHkgY3JlYXRlIGEgY2hpbGQgcHJvY2Vzcy4KICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm90IHJlYWRpbmcgc3VicHJvY2VzcyBleGl0IHN0YXR1cyBjcmVhdGVzIGEgem9tYmkgcHJvY2VzcyB3aGljaAorICAgICAgICAgICAgIyBpcyBvbmx5IGRlc3Ryb3llZCBhdCB0aGUgcGFyZW50IHB5dGhvbiBwcm9jZXNzIGV4aXQKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInN1YnByb2Nlc3MgJXMgaXMgc3RpbGwgcnVubmluZyIgJSBzZWxmLnBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VXYXJuaW5nLCBzb3VyY2U9c2VsZikKICAgICAgICAgIyBJbiBjYXNlIHRoZSBjaGlsZCBoYXNuJ3QgYmVlbiB3YWl0ZWQgb24sIGNoZWNrIGlmIGl0J3MgZG9uZS4KICAgICAgICAgc2VsZi5faW50ZXJuYWxfcG9sbChfZGVhZHN0YXRlPV9tYXhzaXplKQogICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZSBhbmQgX2FjdGl2ZSBpcyBub3QgTm9uZToKQEAgLTE1MjAsOSArMTU0NiwxNCBAQAogCiAgICAgICAgICAgICBpZiBlcnJwaXBlX2RhdGE6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBvcy53YWl0cGlkKHNlbGYucGlkLCAwKQorICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIDApCisgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IHN5cy5tYXhzaXplCiAgICAgICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCisKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9uYW1lLCBoZXhfZXJybm8sIGVycl9tc2cgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJycGlwZV9kYXRhLnNwbGl0KGInOicsIDIpKQpkaWZmIC0tZ2l0IGEvTGliL3N5c2NvbmZpZy5weSBiL0xpYi9zeXNjb25maWcucHkKaW5kZXggOWMzNGJlMC4uZWY1MzA2MSAxMDA2NDQKLS0tIGEvTGliL3N5c2NvbmZpZy5weQorKysgYi9MaWIvc3lzY29uZmlnLnB5CkBAIC04Niw4ICs4Niw4IEBACiAgIyBGSVhNRSBkb24ndCByZWx5IG9uIHN5cy52ZXJzaW9uIGhlcmUsIGl0cyBmb3JtYXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsCiAgIyBvZiBDUHl0aG9uLCB1c2Ugc3lzLnZlcnNpb25faW5mbyBvciBzeXMuaGV4dmVyc2lvbgogX1BZX1ZFUlNJT04gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCi1fUFlfVkVSU0lPTl9TSE9SVCA9IHN5cy52ZXJzaW9uWzozXQotX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQorX1BZX1ZFUlNJT05fU0hPUlQgPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KK19QWV9WRVJTSU9OX1NIT1JUX05PX0RPVCA9ICclZCVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiBfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQogX0JBU0VfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMuYmFzZV9wcmVmaXgpCiBfRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKQEAgLTMzNyw2ICszMzcsOCBAQAogICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnLSVzJXMnICUgKF9QWV9WRVJTSU9OX1NIT1JULCBzeXMuYWJpZmxhZ3MpCiAgICAgZWxzZToKICAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZycKKyAgICBpZiBoYXNhdHRyKHN5cy5pbXBsZW1lbnRhdGlvbiwgJ19tdWx0aWFyY2gnKToKKyAgICAgICAgY29uZmlnX2Rpcl9uYW1lICs9ICctJXMnICUgc3lzLmltcGxlbWVudGF0aW9uLl9tdWx0aWFyY2gKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGdldF9wYXRoKCdzdGRsaWInKSwgY29uZmlnX2Rpcl9uYW1lLCAnTWFrZWZpbGUnKQogCiBkZWYgX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKToKQEAgLTM3OSwxNCArMzgxLDE0IEBACiAgICAgIyBfc3lzY29uZmlnZGF0YSBtb2R1bGUgbWFudWFsbHkgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGJ1aWxkIHZhcnMuCiAgICAgIyBUaGlzIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50IGZvciBlbnN1cmluZyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvCiAgICAgIyBnZXRfcGxhdGZvcm0oKSBzdWNjZWVkcy4KLSAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhJworICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGFfJyArIHN5cy5hYmlmbGFncwogICAgIGlmICdkYXJ3aW4nIGluIHN5cy5wbGF0Zm9ybToKICAgICAgICAgaW1wb3J0IHR5cGVzCiAgICAgICAgIG1vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUobmFtZSkKICAgICAgICAgbW9kdWxlLmJ1aWxkX3RpbWVfdmFycyA9IHZhcnMKICAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKIAotICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgc3lzLnZlcnNpb25bOjNdKQorICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgX1BZX1ZFUlNJT05fU0hPUlQpCiAgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CiAgICAgICAgIHB5YnVpbGRkaXIgKz0gJy1weWRlYnVnJwogICAgIG9zLm1ha2VkaXJzKHB5YnVpbGRkaXIsIGV4aXN0X29rPVRydWUpCkBAIC00MDUsNyArNDA3LDkgQEAKIGRlZiBfaW5pdF9wb3NpeCh2YXJzKToKICAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCiAgICAgIyBfc3lzY29uZmlnZGF0YSBpcyBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZSwgc2VlIF9nZW5lcmF0ZV9wb3NpeF92YXJzKCkKLSAgICBmcm9tIF9zeXNjb25maWdkYXRhIGltcG9ydCBidWlsZF90aW1lX3ZhcnMKKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhXycgKyBzeXMuYWJpZmxhZ3MKKyAgICBfdGVtcCA9IF9faW1wb3J0X18obmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWydidWlsZF90aW1lX3ZhcnMnXSwgMCkKKyAgICBidWlsZF90aW1lX3ZhcnMgPSBfdGVtcC5idWlsZF90aW1lX3ZhcnMKICAgICB2YXJzLnVwZGF0ZShidWlsZF90aW1lX3ZhcnMpCiAKIGRlZiBfaW5pdF9ub25fcG9zaXgodmFycyk6CkBAIC01MTgsNyArNTIyLDcgQEAKICAgICAgICAgX0NPTkZJR19WQVJTWydleGVjX3ByZWZpeCddID0gX0VYRUNfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbiddID0gX1BZX1ZFUlNJT04KICAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX3Nob3J0J10gPSBfUFlfVkVSU0lPTl9TSE9SVAotICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KKyAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX25vZG90J10gPSBfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QKICAgICAgICAgX0NPTkZJR19WQVJTWydpbnN0YWxsZWRfYmFzZSddID0gX0JBU0VfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1snYmFzZSddID0gX1BSRUZJWAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2luc3RhbGxlZF9wbGF0YmFzZSddID0gX0JBU0VfRVhFQ19QUkVGSVgKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNzIxZjlkNy4uOTYwYzY3MyAxMDA3NTUKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTY0LDcgKzY0LDEwIEBACiAgICAgcGFzcwogCiAjIGZyb20gdGFyZmlsZSBpbXBvcnQgKgotX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiXQorX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiLCAiUmVhZEVycm9yIiwKKyAgICAgICAgICAgIkNvbXByZXNzaW9uRXJyb3IiLCAiU3RyZWFtRXJyb3IiLCAiRXh0cmFjdEVycm9yIiwgIkhlYWRlckVycm9yIiwKKyAgICAgICAgICAgIkVOQ09ESU5HIiwgIlVTVEFSX0ZPUk1BVCIsICJHTlVfRk9STUFUIiwgIlBBWF9GT1JNQVQiLAorICAgICAgICAgICAiREVGQVVMVF9GT1JNQVQiLCAib3BlbiJdCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGFyIGNvbnN0YW50cwpAQCAtMTQxLDcgKzE0NCw3IEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGluaXRpYWxpemF0aW9uCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKK2lmIG9zLm5hbWUgPT0gIm50IjoKICAgICBFTkNPRElORyA9ICJ1dGYtOCIKIGVsc2U6CiAgICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKQEAgLTIzNzQsOSArMjM3NywzMiBAQAogICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKLSAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCisgICAgICAgICAgICB5aWVsZCBmcm9tIHNlbGYubWVtYmVycworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBZaWVsZCBpdGVtcyB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgIyBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgorICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCisgICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAorICAgICAgICAjIHdoaWNoIHdpbGwgaGF2ZSBhbHJlYWR5IGV4aGF1c3RlZCB0aGUgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbworCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBpbmRleCA8IGxlbihzZWxmLm1lbWJlcnMpOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm1lbWJlcnNbaW5kZXhdCisgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLl9sb2FkZWQ6CisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCisgICAgICAgICAgICAgICAgaWYgbm90IHRhcmluZm86CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbwogCiAgICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KQEAgLTIzOTcsNDUgKzI0MjMsNiBAQAogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQotIyBjbGFzcyBUYXJGaWxlCi0KLWNsYXNzIFRhckl0ZXI6Ci0gICAgIiIiSXRlcmF0b3IgQ2xhc3MuCi0KLSAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6Ci0gICAgICAgICAgIHN1aXRlLi4uCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQotICAgICAgICBzZWxmLmluZGV4ID0gMAotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KLSAgICAgICAgICAgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KLSAgICAgICAgIiIiCi0gICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgotICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKLSAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KLQotICAgICAgICBpZiBzZWxmLmluZGV4ID09IDAgYW5kIHNlbGYudGFyZmlsZS5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCi0gICAgICAgIGVsaWYgc2VsZi5pbmRleCA8IGxlbihzZWxmLnRhcmZpbGUubWVtYmVycyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm1lbWJlcnNbc2VsZi5pbmRleF0KLSAgICAgICAgZWxpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICAgICAgaWYgbm90IHRhcmluZm86Ci0gICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBzZWxmLmluZGV4ICs9IDEKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGV4cG9ydGVkIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvTGliL3RlbG5ldGxpYi5weSBiL0xpYi90ZWxuZXRsaWIucHkKaW5kZXggNzJkYWJjNy4uYjA4NjNiMSAxMDA2NDQKLS0tIGEvTGliL3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVsbmV0bGliLnB5CkBAIC02MzcsNiArNjM3LDEyIEBACiAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgogICAgICAgICByZXR1cm4gKC0xLCBOb25lLCB0ZXh0KQogCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKIAogZGVmIHRlc3QoKToKICAgICAiIiJUZXN0IHByb2dyYW0gZm9yIHRlbG5ldGxpYi4KQEAgLTY2MCwxMSArNjY2LDEwIEBACiAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnRzdHIpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHBvcnRzdHIsICd0Y3AnKQotICAgIHRuID0gVGVsbmV0KCkKLSAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQotICAgIHRuLm9wZW4oaG9zdCwgcG9ydCwgdGltZW91dD0wLjUpCi0gICAgdG4uaW50ZXJhY3QoKQotICAgIHRuLmNsb3NlKCkKKyAgICB3aXRoIFRlbG5ldCgpIGFzIHRuOgorICAgICAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQorICAgICAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQorICAgICAgICB0bi5pbnRlcmFjdCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVtcGZpbGUucHkgYi9MaWIvdGVtcGZpbGUucHkKaW5kZXggYWQ2ODdiOS4uNjE0NjIzNSAxMDA2NDQKLS0tIGEvTGliL3RlbXBmaWxlLnB5CisrKyBiL0xpYi90ZW1wZmlsZS5weQpAQCAtNzk3LDcgKzc5Nyw2IEBACiAgICAgICAgIF9zaHV0aWwucm10cmVlKG5hbWUpCiAgICAgICAgIF93YXJuaW5ncy53YXJuKHdhcm5fbWVzc2FnZSwgUmVzb3VyY2VXYXJuaW5nKQogCi0KICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPHt9IHshcn0+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX19tYWluX18ucHkgYi9MaWIvdGVzdC9fX21haW5fXy5weQppbmRleCBkNWZiZTE1Li4xOWE2YjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fX21haW5fXy5weQorKysgYi9MaWIvdGVzdC9fX21haW5fXy5weQpAQCAtMSwzICsxLDIgQEAKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLQotcmVncnRlc3QubWFpbl9pbl90ZW1wX2N3ZCgpCitmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KK21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CmluZGV4IDExYTYzMTAuLmNmZDgwMWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQorKysgYi9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTI2LDcgKzI2LDcgQEAKIF9tdWx0aXByb2Nlc3NpbmcgPSB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnX211bHRpcHJvY2Vzc2luZycpCiAjIFNraXAgdGVzdHMgaWYgc2VtX29wZW4gaW1wbGVtZW50YXRpb24gaXMgYnJva2VuLgogdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ211bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZScpCi0jIGltcG9ydCB0aHJlYWRpbmcgYWZ0ZXIgX211bHRpcHJvY2Vzc2luZyB0byByYWlzZSBhIG1vcmUgcmV2ZWxhbnQgZXJyb3IKKyMgaW1wb3J0IHRocmVhZGluZyBhZnRlciBfbXVsdGlwcm9jZXNzaW5nIHRvIHJhaXNlIGEgbW9yZSByZWxldmFudCBlcnJvcgogIyBtZXNzYWdlOiAiTm8gbW9kdWxlIG5hbWVkIF9tdWx0aXByb2Nlc3NpbmciLiBfbXVsdGlwcm9jZXNzaW5nIGlzIG5vdCBjb21waWxlZAogIyB3aXRob3V0IHRocmVhZCBzdXBwb3J0LgogaW1wb3J0IHRocmVhZGluZwpAQCAtMTY2OCw2ICsxNjY4LDEwIEBACiBkZWYgbXVsKHgsIHkpOgogICAgIHJldHVybiB4KnkKIAorZGVmIHJhaXNlX2xhcmdlX3ZhbHVlcnJvcih3YWl0KToKKyAgICB0aW1lLnNsZWVwKHdhaXQpCisgICAgcmFpc2UgVmFsdWVFcnJvcigieCIgKiAxMDI0KioyKQorCiBjbGFzcyBTYXlXaGVuRXJyb3IoVmFsdWVFcnJvcik6IHBhc3MKIAogZGVmIGV4Y2VwdGlvbl90aHJvd2luZ19nZW5lcmF0b3IodG90YWwsIHdoZW4pOgpAQCAtMTkxMCw2ICsxOTE0LDI2IEBACiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CiAgICAgICAgICAgICAgICAgcC5hcHBseShzZWxmLl90ZXN0X3dyYXBwZWRfZXhjZXB0aW9uKQogCisgICAgZGVmIHRlc3RfbWFwX25vX2ZhaWxmYXN0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMyMzk5MjogdGhlIGZhaWwtZmFzdCBiZWhhdmlvdXIgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkCisgICAgICAgICMgZHVyaW5nIG1hcCgpIHdvdWxkIG1ha2UgUG9vbC5qb2luKCkgZGVhZGxvY2ssIGJlY2F1c2UgYSB3b3JrZXIKKyAgICAgICAgIyBwcm9jZXNzIHdvdWxkIGZpbGwgdGhlIHJlc3VsdCBxdWV1ZSAoYWZ0ZXIgdGhlIHJlc3VsdCBoYW5kbGVyIHRocmVhZAorICAgICAgICAjIHRlcm1pbmF0ZWQsIGhlbmNlIG5vdCBkcmFpbmluZyBpdCBhbnltb3JlKS4KKworICAgICAgICB0X3N0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBzZWxmLlBvb2woMikgYXMgcDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHAubWFwKHJhaXNlX2xhcmdlX3ZhbHVlcnJvciwgWzAsIDFdKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcC5qb2luKCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgd2UgaW5kZWVkIHdhaXRlZCBmb3IgYWxsIGpvYnMKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHRpbWUudGltZSgpIC0gdF9zdGFydCwgMC45KQorCiAKIGRlZiByYWlzaW5nKCk6CiAgICAgcmFpc2UgS2V5RXJyb3IoImtleSIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5IGIvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQppbmRleCAwYWUyMjQyLi5kM2U4ZTllIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2F1ZGlvdGVzdHMucHkKQEAgLTEsOSArMSw4IEBACiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIFRFU1RGTiwgdW5saW5rCi1pbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBhcnJheQogaW1wb3J0IGlvCiBpbXBvcnQgcGlja2xlCi1pbXBvcnQgc3lzCisKIAogY2xhc3MgVW5zZWVrYWJsZUlPKGlvLkZpbGVJTyk6CiAgICAgZGVmIHRlbGwoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9hdXRvdGVzdC5weSBiL0xpYi90ZXN0L2F1dG90ZXN0LnB5CmluZGV4IDQxYzIwODguLmZhODVjYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2F1dG90ZXN0LnB5CisrKyBiL0xpYi90ZXN0L2F1dG90ZXN0LnB5CkBAIC0xLDYgKzEsNSBAQAogIyBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgcmVncnRlc3QucHkgZnJvbSB0aGUgY21kbGluZS4KICMgSXQgY2FuIGJlIGVzcGVjaWFsbHkgaGFuZHkgaWYgeW91J3JlIGluIGFuIGludGVyYWN0aXZlIHNoZWxsLCBlLmcuLAogIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0LgotCi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci1yZWdydGVzdC5tYWluKCkKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbgorbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvMGU0MDE1YjkuMCBiL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmQyNTliLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlDbFRDQ0FmNmdBd0lCQWdJSkFLR1U5NXdLUjhwVE1BMEdDU3FHU0liM0RRRUJCUVVBTUhBeEN6QUpCZ05WCi1CQVlUQWxoWk1SY3dGUVlEVlFRSERBNURZWE4wYkdVZ1FXNTBhSEpoZURFak1DRUdBMVVFQ2d3YVVIbDBhRzl1Ci1JRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4SXpBaEJnTlZCQU1NR25ObGJHWXRjMmxuYm1Wa0xuQjVkR2h2Ci1iblJsYzNRdWJtVjBNQjRYRFRFME1URXdNakU0TURreU9Wb1hEVEkwTVRBek1ERTRNRGt5T1Zvd2NERUxNQWtHCi1BMVVFQmhNQ1dGa3hGekFWQmdOVkJBY01Ea05oYzNSc1pTQkJiblJvY21GNE1TTXdJUVlEVlFRS0RCcFFlWFJvCi1iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFak1DRUdBMVVFQXd3YWMyVnNaaTF6YVdkdVpXUXVjSGwwCi1hRzl1ZEdWemRDNXVaWFF3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU5EWFFYVzl0anlaCi1YdDBJdjJ0TEwxK2ppbnI0d0dnMzZpb0xETEZrTWYrMlkxR0wwdjBCbktZRzROMU9LbEFVMTVMWEdlR2VyOHZtCi1Tdi95SXZtZHJFTHZoQWJibzN3NGE5VE1ZUUE0WGtJVkxkdnUzbXZOT0FldCs4UE1KeG4yNmRiRGhHODA5QUx2Ci1FSFk1N2xRc0JTM0c1OVJaeUJQVnFBcW1JbVdOSm5WekFnTUJBQUdqTnpBMU1DVUdBMVVkRVFRZU1CeUNHbk5sCi1iR1l0YzJsbmJtVmtMbkI1ZEdodmJuUmxjM1F1Ym1WME1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOCi1BUUVGQlFBRGdZRUFJdXpBaGdNb3VKcE5kZjNVUkNISWluZXlvU3Q2V0svOStleVVjamxLT3JEb1hOWmFENzJoCi1UWE1lS1lvV3ZKeVZjU0xLTDhja1B0RG9iZ1AyT1R0MFVreUFhajBuK1pIYXFxMWxIMnlWZkdVQTFJTEp2NTE1Ci1DOEJxYnZWWnVxbTNpN3lnbXczYnFFL2xZTWdPcll0WFhucU9yejZudnNFNlljOVY5ckZmbE9NPQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoL2IxOTMwMjE4LjAgYi9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMzNDljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY2FwYXRoL2IxOTMwMjE4LjAKQEAgLTAsMCArMSwyMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEYlRDQ0FsV2dBd0lCQWdJSkFMQ1NaTEh5MmlIUU1BMEdDU3FHU0liM0RRRUJCUVVBTUUweEN6QUpCZ05WCitCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJpQkRRVEVXCitNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pBZUZ3MHhNekF4TURReE9UUTNNRGRhRncweU16QXhNREl4CitPVFEzTURkYU1FMHhDekFKQmdOVkJBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnCitSbTkxYm1SaGRHbHZiaUJEUVRFV01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakNDQVNJd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9mZTZlTU1ud0Myb2Ywclc1YlNiOHpndm9hNUlGN3NBM3BWCitxK3FrNmZsSmhkSm0xZTNIZXVwV2ppMlA1MExpWWlpcG45WWJqdXUxdEp5ZkZLdmY1cFNMZGgwK2JTUmg3UXkvCitBSXBoRE45Y3lEWnpGZ0ROUjdwdHBLUjBpSU1qQ2huOENhYzhTa3ZUNXgwdDVPcE1WQ0h6SnR1Sk54alVBcnRBCitNbCtrL3kwYzk5Uzc3STdQWElLczVud0liRWlGWVFkL0plQmM0THcwWCtDNUJFZDF5RWNMamJ6V3lHaGZNNE5pCiswaUJFTmJHdGdScUt6Yncxc0Z5TFI5WVk2WndZbDh3QlBDbk02QjdrNU1HNDN1ZkNFUmlIV3BNMDJLWWw5eFJ4Cis2K1Fob3RJUExpN1VZZ0ExMDlidlhHQkxUS2tVNHQwVldFWTNNeWEzNXk1ZDdVTGt4VTBDQXdFQUFhTlFNRTR3CitIUVlEVlIwT0JCWUVGTHpkWXRsMjJodlNWR3ZQNEdhYkhoNTdWZ3dMTUI4R0ExVWRJd1FZTUJhQUZMemRZdGwyCisyaHZTVkd2UDRHYWJIaDU3Vmd3TE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCitBSDBLOWN1TjAxMjltWTc0S3crNjY4TFpwaWRQTG5zdkRtVFlIRFZRVHU3OGtMbU5iYWpGeGdhd3IvTXR2enU0CitRZ2ZkR0gxdGxWUlhoUmhnUnkvcmVCdjU2QmY5V2cySEZ5aXNUR3JtdkNuMDlGVndLVUxlaGVxcmJDTUdaREIxCitBbzVUdkY0Qk16Zk1IczI0cFAzSzVGOWxPNE1jaHZGVkFxQTZqOXVSdDBBVXRPZU4wdTV6dXVQbE5DMjhsRzlPCitKQWIzWDRzT3A0NXIzbDUxOURLYVVMRkVNNXJRQmVKNGd2L2Iyb3BqNjZuZDBiK2dZYTNqbm9va1hXSU81MHlSCitmKy9mTkRZN0wxMzFoTEl2eEcyVGxocHZNQ2p4MmhLYVpMUkFNeDI5M2l0VHFPcSsxcnhPbHZWRSt6SVlydFVmCis5bW12dGs1N0hWanNPNmxUbzE1WXlKND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC9jZTdiODY0My4wIGIvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDI1OWIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUNsVENDQWY2Z0F3SUJBZ0lKQUtHVTk1d0tSOHBUTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlYKLUJBWVRBbGhaTVJjd0ZRWURWUVFIREE1RFlYTjBiR1VnUVc1MGFISmhlREVqTUNFR0ExVUVDZ3dhVUhsMGFHOXUKLUlGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhJekFoQmdOVkJBTU1Hbk5sYkdZdGMybG5ibVZrTG5CNWRHaHYKLWJuUmxjM1F1Ym1WME1CNFhEVEUwTVRFd01qRTRNRGt5T1ZvWERUSTBNVEF6TURFNE1Ea3lPVm93Y0RFTE1Ba0cKLUExVUVCaE1DV0ZreEZ6QVZCZ05WQkFjTURrTmhjM1JzWlNCQmJuUm9jbUY0TVNNd0lRWURWUVFLREJwUWVYUm8KLWIyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVqTUNFR0ExVUVBd3dhYzJWc1ppMXphV2R1WldRdWNIbDAKLWFHOXVkR1Z6ZEM1dVpYUXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTkRYUVhXOXRqeVoKLVh0MEl2MnRMTDEramlucjR3R2czNmlvTERMRmtNZisyWTFHTDB2MEJuS1lHNE4xT0tsQVUxNUxYR2VHZXI4dm0KLVN2L3lJdm1kckVMdmhBYmJvM3c0YTlUTVlRQTRYa0lWTGR2dTNtdk5PQWV0KzhQTUp4bjI2ZGJEaEc4MDlBTHYKLUVIWTU3bFFzQlMzRzU5Ulp5QlBWcUFxbUltV05KblZ6QWdNQkFBR2pOekExTUNVR0ExVWRFUVFlTUJ5Q0duTmwKLWJHWXRjMmxuYm1Wa0xuQjVkR2h2Ym5SbGMzUXVibVYwTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y04KLUFRRUZCUUFEZ1lFQUl1ekFoZ01vdUpwTmRmM1VSQ0hJaW5leW9TdDZXSy85K2V5VWNqbEtPckRvWE5aYUQ3MmgKLVRYTWVLWW9Xdkp5VmNTTEtMOGNrUHREb2JnUDJPVHQwVWt5QWFqMG4rWkhhcXExbEgyeVZmR1VBMUlMSnY1MTUKLUM4QnFidlZadXFtM2k3eWdtdzNicUUvbFlNZ09yWXRYWG5xT3J6Nm52c0U2WWM5VjlyRmZsT009Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvY2VmZjE3MTAuMCBiL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jYXBhdGgvY2VmZjE3MTAuMApAQCAtMCwwICsxLDIxIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURiVENDQWxXZ0F3SUJBZ0lKQUxDU1pMSHkyaUhRTUEwR0NTcUdTSWIzRFFFQkJRVUFNRTB4Q3pBSkJnTlYKK0JBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmlCRFFURVcKK01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakFlRncweE16QXhNRFF4T1RRM01EZGFGdzB5TXpBeE1ESXgKK09UUTNNRGRhTUUweEN6QUpCZ05WQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWcKK1JtOTFibVJoZEdsdmJpQkRRVEVXTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2ZlNmVNTW53QzJvZjByVzViU2I4emd2b2E1SUY3c0EzcFYKK3ErcWs2ZmxKaGRKbTFlM0hldXBXamkyUDUwTGlZaWlwbjlZYmp1dTF0SnlmRkt2ZjVwU0xkaDArYlNSaDdReS8KK0FJcGhETjljeURaekZnRE5SN3B0cEtSMGlJTWpDaG44Q2FjOFNrdlQ1eDB0NU9wTVZDSHpKdHVKTnhqVUFydEEKK01sK2sveTBjOTlTNzdJN1BYSUtzNW53SWJFaUZZUWQvSmVCYzRMdzBYK0M1QkVkMXlFY0xqYnpXeUdoZk00TmkKKzBpQkVOYkd0Z1JxS3pidzFzRnlMUjlZWTZad1lsOHdCUENuTTZCN2s1TUc0M3VmQ0VSaUhXcE0wMktZbDl4UngKKzYrUWhvdElQTGk3VVlnQTEwOWJ2WEdCTFRLa1U0dDBWV0VZM015YTM1eTVkN1VMa3hVMENBd0VBQWFOUU1FNHcKK0hRWURWUjBPQkJZRUZMemRZdGwyMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQjhHQTFVZEl3UVlNQmFBRkx6ZFl0bDIKKzJodlNWR3ZQNEdhYkhoNTdWZ3dMTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKK0FIMEs5Y3VOMDEyOW1ZNzRLdys2NjhMWnBpZFBMbnN2RG1UWUhEVlFUdTc4a0xtTmJhakZ4Z2F3ci9NdHZ6dTQKK1FnZmRHSDF0bFZSWGhSaGdSeS9yZUJ2NTZCZjlXZzJIRnlpc1RHcm12Q24wOUZWd0tVTGVoZXFyYkNNR1pEQjEKK0FvNVR2RjRCTXpmTUhzMjRwUDNLNUY5bE80TWNodkZWQXFBNmo5dVJ0MEFVdE9lTjB1NXp1dVBsTkMyOGxHOU8KK0pBYjNYNHNPcDQ1cjNsNTE5REthVUxGRU01clFCZUo0Z3YvYjJvcGo2Nm5kMGIrZ1lhM2pub29rWFdJTzUweVIKK2YrL2ZORFk3TDEzMWhMSXZ4RzJUbGhwdk1DangyaEthWkxSQU14MjkzaXRUcU9xKzFyeE9sdlZFK3pJWXJ0VWYKKzltbXZ0azU3SFZqc082bFRvMTVZeUo0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dCBiL0xpYi90ZXN0L2NtYXRoX3Rlc3RjYXNlcy50eHQKaW5kZXggOWIwODY1My4uZGQ3ZTQ1OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dAorKysgYi9MaWIvdGVzdC9jbWF0aF90ZXN0Y2FzZXMudHh0CkBAIC01Myw2ICs1MywxMiBAQAogLS0gTVBGUiBob21lcGFnZSBhdCBodHRwOi8vd3d3Lm1wZnIub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZQogLS0gTVBGUiBwcm9qZWN0LgogCistLSBBIG1pbm9yaXR5IG9mIHRoZSB0ZXN0IGNhc2VzIHdlcmUgZ2VuZXJhdGVkIHdpdGggdGhlIGhlbHAgb2YKKy0tIG1wbWF0aCAwLjE5IGF0IDEwMCBiaXQgYWNjdXJhY3kgKGh0dHA6Ly9tcG1hdGgub3JnKSB0byBpbXByb3ZlCistLSBjb3ZlcmFnZSBvZiByZWFsIGZ1bmN0aW9ucyB3aXRoIHJlYWwtdmFsdWVkIGFyZ3VtZW50cy4gVGhlc2UgYXJlCistLSB1c2VkIGluIHRlc3QudGVzdF9tYXRoLk1hdGhUZXN0cy50ZXN0X3Rlc3RmaWxlLCBhcyB3ZWxsIGFzIGluCistLSB0ZXN0X2NtYXRoLgorCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtLSBhY29zOiBJbnZlcnNlIGNvc2luZSAtLQpAQCAtODQ4LDYgKzg1NCwxOCBAQAogYXRhbjAzMDMgYXRhbiAtMWUtMTY1IDEuMCAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCAxOTAuMzA5ODQzNzYyMjg4NzUKIGF0YW4wMzA0IGF0YW4gLTkuOTk5ODg4NjcxODI2ODMwMWUtMzIxIC0xLjAgLT4gLTAuNzg1Mzk4MTYzMzk3NDQ4MjggLTM2OC43NjAxOTQwMzU3NjY5MgogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCithdGFuMDQwMCBhdGFuIDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYxOTIgMC4wCithdGFuMDQwMSBhdGFuIC0xLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NjE5MiAwLjAKK2F0YW4wNDAyIGF0YW4gMWUtMTcgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDcxNWUtMTcgMC4wCithdGFuMDQwMyBhdGFuIC0xZS0xNyAwLjAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDcxNWUtMTcgMC4wCithdGFuMDQwNCBhdGFuIDAuMDAwMSAwLjAgLT4gMC4wMDAwOTk5OTk5OTk2NjY2NjY2NzM0NTkgMC4wCithdGFuMDQwNSBhdGFuIC0wLjAwMDEgMC4wIC0+IC0wLjAwMDA5OTk5OTk5OTY2NjY2NjY3MzQ1OSAwLjAKK2F0YW4wNDA2IGF0YW4gMC45OTk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuNzg1Mzk4MTYzMzk3NDQ3ODEwMDIgMC4wCithdGFuMDQwNyBhdGFuIDEuMDAwMDAwMDAwMDAwMDAxIDAuMCAtPiAwLjc4NTM5ODE2MzM5NzQ0ODg2NDczIDAuMAorYXRhbjA0MDggYXRhbiAxNC4xMDE0MTk5NDcxNzE3MTkgMC4wIC0+IDEuNDk5OTk5OTk5OTk5OTk5OTk2OSAwLjAKK2F0YW4wNDA5IGF0YW4gMTI1NS43NjU1OTE1MDA3ODk3IDAuMCAtPiAxLjU3MDAwMDAwMDAwMDAwMDA2MjIgMC4wCisKIC0tIHNwZWNpYWwgdmFsdWVzCiBhdGFuMTAwMCBhdGFuIC0wLjAgMC4wIC0+IC0wLjAgMC4wCiBhdGFuMTAwMSBhdGFuIG5hbiAwLjAgLT4gbmFuIDAuMApAQCAtMTUxNCw2ICsxNTMyLDExIEBACiBzcXJ0MDE0MCBzcXJ0IDEuNjk5OTk5OTk5OTk5OTk5OWUrMzA4IC0xLjY5OTk5OTk5OTk5OTk5OTllKzMwOCAtPiAxLjQzMjUwODgyMzAxNTQ1NzNlKzE1NCAtNS45MzM2NDU4MjcxMjEyMjA3ZSsxNTMKIHNxcnQwMTQxIHNxcnQgLTEuNzk3ZSszMDggLTkuOTk5OTk5OTk5OTk5OTk5OWUrMzA2IC0+IDMuNzI4NDQ3NjQzMjA1NzMwN2UrMTUyIC0xLjM0MTA0MDY4OTk4MDI5MDFlKzE1NAogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCitzcXJ0MDE1MCBzcXJ0IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4IDAuMCAtPiAxLjM0MDc4MDc5Mjk5NDI1OTYzNTVlKzE1NCAwLjAKK3NxcnQwMTUxIHNxcnQgMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDggMC4wIC0+IDEuNDkxNjY4MTQ2MjQwMDQxMzQ4N2UtMTU0IDAuMAorc3FydDAxNTIgc3FydCA1ZS0zMjQgMC4wIC0+IDIuMjIyNzU4NzQ5NDg1MDc3NDgzNGUtMTYyIDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogc3FydDEwMDAgc3FydCAwLjAgMC4wIC0+IDAuMCAwLjAKIHNxcnQxMDAxIHNxcnQgLTAuMCAwLjAgLT4gMC4wIDAuMApAQCAtMTYxNiw2ICsxNjM5LDIwIEBACiBleHAwMDUzIGV4cCA3MTAuMCAxLjYgLT4gLTYuNTIzMTU3OTk5NTUwMTM3MmUrMzA2IGluZiAgIG92ZXJmbG93CiBleHAwMDU0IGV4cCA3MTAuMCAyLjggLT4gLWluZiA3LjQ4MzYxNzc0MTc0NDg1MjhlKzMwNyAgIG92ZXJmbG93CiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK2V4cDAwNzAgZXhwIDFlLTA4IDAuMCAtPiAxLjAwMDAwMDAxMDAwMDAwMDA1IDAuMAorZXhwMDA3MSBleHAgMC4wMDAzIDAuMCAtPiAxLjAwMDMwMDA0NTAwNDUwMDMzNzUgMC4wCitleHAwMDcyIGV4cCAwLjIgMC4wIC0+IDEuMjIxNDAyNzU4MTYwMTY5ODQ3NSAwLjAKK2V4cDAwNzMgZXhwIDEuMCAwLjAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzU0IDAuMAorZXhwMDA3NCBleHAgLTFlLTA4IDAuMCAtPiAwLjk5OTk5OTk5MDAwMDAwMDA1IDAuMAorZXhwMDA3NSBleHAgLTAuMDAwMyAwLjAgLT4gMC45OTk3MDAwNDQ5OTU1MDAzMzc1MSAwLjAKK2V4cDAwNzYgZXhwIC0xLjAgMC4wIC0+IDAuMzY3ODc5NDQxMTcxNDQyMzIxNiAwLjAKK2V4cDAwNzcgZXhwIDIuMjIwNDQ2MDQ5MjUwMzEzZS0xNiAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAyMjIgMC4wCitleHAwMDc4IGV4cCAtMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNiAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTk4ODg5OCAwLjAKK2V4cDAwNzkgZXhwIDIuMzAyNTg1MDkyOTk0MDQ2IDAuMCAtPiAxMC4wMDAwMDAwMDAwMDAwMDIxNzEgMC4wCitleHAwMDgwIGV4cCAtMi4zMDI1ODUwOTI5OTQwNDYgMC4wIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTc4MjkyIDAuMAorZXhwMDA4MSBleHAgNzA5Ljc4MjcgMC4wIC0+IDEuNzk3NjY5OTU2NjYzODAxNDY1NGUrMzA4IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogZXhwMTAwMCBleHAgMC4wIDAuMCAtPiAxLjAgMC4wCiBleHAxMDAxIGV4cCAtMC4wIDAuMCAtPiAxLjAgMC4wCkBAIC0xNzA4LDYgKzE3NDUsMjMgQEAKIGNvc2gwMDMwIGNvc2ggNzEwLjUgMi4zNTE5OTk5OTk5OTk5OTk5IC0+IC0xLjI5Njc0NjUyMzkzNTU5OThlKzMwOCAxLjMwNzY3MDc5MDg4NTczMzNlKzMwOAogY29zaDAwMzEgY29zaCAtNzEwLjUgMC42OTk5OTk5OTk5OTk5OTk5NiAtPiAxLjQwODU0NjYzODEzOTI0OTllKzMwOCAtMS4xODY0MDI0NjY2NDUwMjM5ZSszMDgKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQorY29zaDAwNTAgY29zaCAxZS0xNTAgMC4wIC0+IDEuMCAwLjAKK2Nvc2gwMDUxIGNvc2ggMWUtMTggMC4wIC0+IDEuMCAwLjAKK2Nvc2gwMDUyIGNvc2ggMWUtMDkgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwNSAwLjAKK2Nvc2gwMDUzIGNvc2ggMC4wMDAzIDAuMCAtPiAxLjAwMDAwMDA0NTAwMDAwMDMzNzUgMC4wCitjb3NoMDA1NCBjb3NoIDAuMiAwLjAgLT4gMS4wMjAwNjY3NTU2MTkwNzU4NDg1IDAuMAorY29zaDAwNTUgY29zaCAxLjAgMC4wIC0+IDEuNTQzMDgwNjM0ODE1MjQzNzc4NSAwLjAKK2Nvc2gwMDU2IGNvc2ggLTFlLTE4IDAuMCAtPiAxLjAgLTAuMAorY29zaDAwNTcgY29zaCAtMC4wMDAzIDAuMCAtPiAxLjAwMDAwMDA0NTAwMDAwMDMzNzUgLTAuMAorY29zaDAwNTggY29zaCAtMS4wIDAuMCAtPiAxLjU0MzA4MDYzNDgxNTI0Mzc3ODUgLTAuMAorY29zaDAwNTkgY29zaCAxLjMxNjk1Nzg5NjkyNDgxNjggMC4wIC0+IDIuMDAwMDAwMDAwMDAwMDAwMTUwNCAwLjAKK2Nvc2gwMDYwIGNvc2ggLTEuMzE2OTU3ODk2OTI0ODE2OCAwLjAgLT4gMi4wMDAwMDAwMDAwMDAwMDAxNTA0IC0wLjAKK2Nvc2gwMDYxIGNvc2ggMTcuMzI4Njc5NTEzOTk4NjMzIDAuMCAtPiAxNjc3NzIxNi4wMDAwMDAwMjE5MzggMC4wCitjb3NoMDA2MiBjb3NoIDE4LjcxNDk3Mzg3NTExODUyNCAwLjAgLT4gNjcxMDg4NjQuMDAwMDAwMDQzNjYyIDAuMAorY29zaDAwNjMgY29zaCA3MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgMC4wCitjb3NoMDA2NCBjb3NoIC03MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgLTAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogY29zaDEwMDAgY29zaCAwLjAgMC4wIC0+IDEuMCAwLjAKIGNvc2gxMDAxIGNvc2ggMC4wIGluZiAtPiBuYW4gMC4wICAgICAgICBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KQEAgLTE4MDAsNiArMTg1NCwyNCBAQAogc2luaDAwMzAgc2luaCA3MTAuNSAtMi4zOTk5OTk5OTk5OTk5OTk5IC0+IC0xLjM1Nzk5NzA1NjQ4ODU5MTllKzMwOCAtMS4yNDM5NDQ3MDkwNzc5OGUrMzA4CiBzaW5oMDAzMSBzaW5oIC03MTAuNSAwLjgwMDAwMDAwMDAwMDAwMDA0IC0+IC0xLjI4MzA2NzE2MDE3MzUxNjRlKzMwOCAxLjMyMTA5NTQxOTM5OTc2NzhlKzMwOAogCistLSBBZGRpdGlvbmFsIHJlYWwgdmFsdWVzIChtcG1hdGgpCitzaW5oMDA1MCBzaW5oIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAorc2luaDAwNTEgc2luaCA1ZS0xNyAwLjAgLT4gNC45OTk5OTk5OTk5OTk5OTk4OTU1ZS0xNyAwLjAKK3NpbmgwMDUyIHNpbmggMWUtMTYgMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5NzkxZS0xNyAwLjAKK3NpbmgwMDUzIHNpbmggMy43ZS0wOCAwLjAgLT4gMy43MDAwMDAwMDAwMDAwMDA4ODg1ZS04IDAuMAorc2luaDAwNTQgc2luaCAwLjAwMSAwLjAgLT4gMC4wMDEwMDAwMDAxNjY2NjY2NzUwMjA4IDAuMAorc2luaDAwNTUgc2luaCAwLjIgMC4wIC0+IDAuMjAxMzM2MDAyNTQxMDkzOTk4OTUgMC4wCitzaW5oMDA1NiBzaW5oIDEuMCAwLjAgLT4gMS4xNzUyMDExOTM2NDM4MDE0NTY5IDAuMAorc2luaDAwNTcgc2luaCAtMy43ZS0wOCAwLjAgLT4gLTMuNzAwMDAwMDAwMDAwMDAwODg4NWUtOCAwLjAKK3NpbmgwMDU4IHNpbmggLTAuMDAxIDAuMCAtPiAtMC4wMDEwMDAwMDAxNjY2NjY2NzUwMjA4IDAuMAorc2luaDAwNTkgc2luaCAtMS4wIDAuMCAtPiAtMS4xNzUyMDExOTM2NDM4MDE0NTY5IDAuMAorc2luaDAwNjAgc2luaCAxLjQ0MzYzNTQ3NTE3ODgxMDMgMC4wIC0+IDEuOTk5OTk5OTk5OTk5OTk5OTA3OCAwLjAKK3NpbmgwMDYxIHNpbmggLTEuNDQzNjM1NDc1MTc4ODEwMyAwLjAgLT4gLTEuOTk5OTk5OTk5OTk5OTk5OTA3OCAwLjAKK3NpbmgwMDYyIHNpbmggMTcuMzI4Njc5NTEzOTk4NjMzIDAuMCAtPiAxNjc3NzIxNS45OTk5OTk5OTIxMzYgMC4wCitzaW5oMDA2MyBzaW5oIDE4LjcxNDk3Mzg3NTExODUyNCAwLjAgLT4gNjcxMDg4NjQuMDAwMDAwMDM2MjExIDAuMAorc2luaDAwNjQgc2luaCA3MDkuNzgyNyAwLjAgLT4gOC45ODgzNDk3ODMzMTkwMDczMjcyZSszMDcgMC4wCitzaW5oMDA2NSBzaW5oIC03MDkuNzgyNyAwLjAgLT4gLTguOTg4MzQ5NzgzMzE5MDA3MzI3MmUrMzA3IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogc2luaDEwMDAgc2luaCAwLjAgMC4wIC0+IDAuMCAwLjAKIHNpbmgxMDAxIHNpbmggMC4wIGluZiAtPiAwLjAgbmFuICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KQEAgLTE4OTcsNiArMTk2OSwyNCBAQAogdGFuaDAwMzIgdGFuaCAxMDAwIC0yLjMxOTk5OTk5OTk5OTk5OTggLT4gMS4wIDAuMAogdGFuaDAwMzMgdGFuaCAtMS4wMDAwMDAwMDAwMDAwMDAxZSszMDAgLTkuNjY5OTk5OTk5OTk5OTk5OSAtPiAtMS4wIC0wLjAKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQordGFuaDAwNTAgdGFuaCAxZS0xMDAgMC4wIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDJlLTEwMCAwLjAKK3RhbmgwMDUxIHRhbmggNWUtMTcgMC4wIC0+IDQuOTk5OTk5OTk5OTk5OTk5ODk1NWUtMTcgMC4wCit0YW5oMDA1MiB0YW5oIDFlLTE2IDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTc5MWUtMTcgMC4wCit0YW5oMDA1MyB0YW5oIDMuN2UtMDggMC4wIC0+IDMuNjk5OTk5OTk5OTk5OTk4MzU1OWUtOCAwLjAKK3RhbmgwMDU0IHRhbmggMC4wMDEgMC4wIC0+IDAuMDAwOTk5OTk5NjY2NjY2ODAwMDIwNzYgMC4wCit0YW5oMDA1NSB0YW5oIDAuMiAwLjAgLT4gMC4xOTczNzUzMjAyMjQ5MDQwMTE0MSAwLjAKK3RhbmgwMDU2IHRhbmggMS4wIDAuMCAtPiAwLjc2MTU5NDE1NTk1NTc2NDg4ODEyIDAuMAordGFuaDAwNTcgdGFuaCAtMy43ZS0wOCAwLjAgLT4gLTMuNjk5OTk5OTk5OTk5OTk4MzU1OWUtOCAwLjAKK3RhbmgwMDU4IHRhbmggLTAuMDAxIDAuMCAtPiAtMC4wMDA5OTk5OTk2NjY2NjY4MDAwMjA3NiAwLjAKK3RhbmgwMDU5IHRhbmggLTEuMCAwLjAgLT4gLTAuNzYxNTk0MTU1OTU1NzY0ODg4MTIgMC4wCit0YW5oMDA2MCB0YW5oIDAuNTQ5MzA2MTQ0MzM0MDU0OSAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwMzQwMiAwLjAKK3RhbmgwMDYxIHRhbmggLTAuNTQ5MzA2MTQ0MzM0MDU0OSAwLjAgLT4gLTAuNTAwMDAwMDAwMDAwMDAwMDM0MDIgMC4wCit0YW5oMDA2MiB0YW5oIDE3LjMyODY3OTUxMzk5ODYzMyAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTgyMjM2NCAwLjAKK3RhbmgwMDYzIHRhbmggMTguNzE0OTczODc1MTE4NTI0IDAuMCAtPiAwLjk5OTk5OTk5OTk5OTk5OTg4ODk4IDAuMAordGFuaDAwNjQgdGFuaCA3MTEgMC4wIC0+IDEuMCAwLjAKK3RhbmgwMDY1IHRhbmggMS43OTdlKzMwOCAwLjAgLT4gMS4wIDAuMAorCiAtLXNwZWNpYWwgdmFsdWVzCiB0YW5oMTAwMCB0YW5oIDAuMCAwLjAgLT4gMC4wIDAuMAogdGFuaDEwMDEgdGFuaCAwLjAgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKQEAgLTE5ODUsNiArMjA3NSwyMiBAQAogY29zMDAyMiBjb3MgNy45OTE0NTE1NDMzODU4NTE1IDAuNzE2NTk5NjY2MTU1MDE0MzYgLT4gLTAuMTczNzU0Mzk5MDY5MzY1NjYgLTAuNzcyMTcwNDM1MjcyOTQ1ODIKIGNvczAwMjMgY29zIDAuNDUxMjQzNTExNTI1NDAyMjYgMS42OTkyNjkzOTkzODEyMTU4IC0+IDIuNTQzNDc3OTQ4OTcyMjM3IC0xLjE1MjgxOTM2OTQ4NzU0NzcKIAorLS0gQWRkaXRpb25hbCByZWFsIHZhbHVlcyAobXBtYXRoKQorY29zMDA1MCBjb3MgMWUtMTUwIDAuMCAtPiAxLjAgLTAuMAorY29zMDA1MSBjb3MgMWUtMTggMC4wIC0+IDEuMCAtMC4wCitjb3MwMDUyIGNvcyAxZS0wOSAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTk5OTk1IC0wLjAKK2NvczAwNTMgY29zIDAuMDAwMyAwLjAgLT4gMC45OTk5OTk5NTUwMDAwMDAzMzc1IC0wLjAKK2NvczAwNTQgY29zIDAuMiAwLjAgLT4gMC45ODAwNjY1Nzc4NDEyNDE2Mjg5MiAtMC4wCitjb3MwMDU1IGNvcyAxLjAgMC4wIC0+IDAuNTQwMzAyMzA1ODY4MTM5NzE3NCAtMC4wCitjb3MwMDU2IGNvcyAtMWUtMTggMC4wIC0+IDEuMCAwLjAKK2NvczAwNTcgY29zIC0wLjAwMDMgMC4wIC0+IDAuOTk5OTk5OTU1MDAwMDAwMzM3NSAwLjAKK2NvczAwNTggY29zIC0xLjAgMC4wIC0+IDAuNTQwMzAyMzA1ODY4MTM5NzE3NCAwLjAKK2NvczAwNTkgY29zIDEuMDQ3MTk3NTUxMTk2NTk3NiAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwOTk0NSAtMC4wCitjb3MwMDYwIGNvcyAyLjU3MDc5NjMyNjc5NDg5NjYgMC4wIC0+IC0wLjg0MTQ3MDk4NDgwNzg5NjQ3MzU3IC0wLjAKK2NvczAwNjEgY29zIC0yLjU3MDc5NjMyNjc5NDg5NjYgMC4wIC0+IC0wLjg0MTQ3MDk4NDgwNzg5NjQ3MzU3IDAuMAorY29zMDA2MiBjb3MgNy4yMjU2NjMxMDMyNTY1MjMgMC4wIC0+IDAuNTg3Nzg1MjUyMjkyNDc0MDc1NTkgLTAuMAorY29zMDA2MyBjb3MgLTguNzk2NDU5NDMwMDUxNDIgMC4wIC0+IC0wLjgwOTAxNjk5NDM3NDk0NzIyMjU1IDAuMAorCiAtLSBzcGVjaWFsIHZhbHVlcwogY29zMTAwMCBjb3MgLTAuMCAwLjAgLT4gMS4wIDAuMAogY29zMTAwMSBjb3MgLWluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KQEAgLTIwNzMsNiArMjE3OSwyMiBAQAogc2luMDAyMiBzaW4gMS4xNTE4MDg3MzU0NDAzNzI1IDQuODU5NzIzNTk2NjE1MDU1OCAtPiA1OC45MTkxNDE5ODk2MDMwNDEgMjYuMjM3MDAzNDAzNzU4ODUyCiBzaW4wMDIzIHNpbiAwLjAwMDg3NzczMDc4NDA2NjQ5MTkyIDM0Ljc5MjM3OTIxMTMxMjA5NSAtPiA1NjU1NDgxNDU1NjkuMzgyNDUgNjQ0MzI5Njg1ODIyNzAwLjYyCiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK3NpbjAwNTAgc2luIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAorc2luMDA1MSBzaW4gMy43ZS0wOCAwLjAgLT4gMy42OTk5OTk5OTk5OTk5OTkyMDAxZS04IDAuMAorc2luMDA1MiBzaW4gMC4wMDEgMC4wIC0+IDAuMDAwOTk5OTk5ODMzMzMzMzQxNjg3NDggMC4wCitzaW4wMDUzIHNpbiAwLjIgMC4wIC0+IDAuMTk4NjY5MzMwNzk1MDYxMjI2MzQgMC4wCitzaW4wMDU0IHNpbiAxLjAgMC4wIC0+IDAuODQxNDcwOTg0ODA3ODk2NTA2NjUgMC4wCitzaW4wMDU1IHNpbiAtMy43ZS0wOCAwLjAgLT4gLTMuNjk5OTk5OTk5OTk5OTk5MjAwMWUtOCAwLjAKK3NpbjAwNTYgc2luIC0wLjAwMSAwLjAgLT4gLTAuMDAwOTk5OTk5ODMzMzMzMzQxNjg3NDggMC4wCitzaW4wMDU3IHNpbiAtMS4wIDAuMCAtPiAtMC44NDE0NzA5ODQ4MDc4OTY1MDY2NSAwLjAKK3NpbjAwNTggc2luIDAuNTIzNTk4Nzc1NTk4Mjk4OSAwLjAgLT4gMC41MDAwMDAwMDAwMDAwMDAwNDY0MiAwLjAKK3NpbjAwNTkgc2luIC0wLjUyMzU5ODc3NTU5ODI5ODkgMC4wIC0+IC0wLjUwMDAwMDAwMDAwMDAwMDA0NjQyIDAuMAorc2luMDA2MCBzaW4gMi42MTc5OTM4Nzc5OTE0OTQ0IDAuMCAtPiAwLjQ5OTk5OTk5OTk5OTk5OTk2MDE4IC0wLjAKK3NpbjAwNjEgc2luIC0yLjYxNzk5Mzg3Nzk5MTQ5NDQgMC4wIC0+IC0wLjQ5OTk5OTk5OTk5OTk5OTk2MDE4IC0wLjAKK3NpbjAwNjIgc2luIDcuMjI1NjYzMTAzMjU2NTIzIDAuMCAtPiAwLjgwOTAxNjk5NDM3NDk0NjczNjQ4IDAuMAorc2luMDA2MyBzaW4gLTguNzk2NDU5NDMwMDUxNDIgMC4wIC0+IC0wLjU4Nzc4NTI1MjI5MjQ3MzQwNjU4IC0wLjAKKwogLS0gc3BlY2lhbCB2YWx1ZXMKIHNpbjEwMDAgc2luIC0wLjAgMC4wIC0+IC0wLjAgMC4wCiBzaW4xMDAxIHNpbiAtaW5mIDAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgpAQCAtMjE2MSw2ICsyMjgzLDI1IEBACiB0YW4wMDIyIHRhbiAxLjE2MTUzMTM5MDA4ODA1NzcgMS43OTU2Mjk4NzI4NjQ3MTA3IC0+IDAuMDQxNzkzMTg2ODI2MzkwMzYyIDEuMDM3NTMzOTU0NjAzNDc5MgogdGFuMDAyMyB0YW4gMC4wNjcwMTQ3Nzk0Nzc5MDg5NDUgNS44NTE3MzYxNTc3NDU3MDk3IC0+IDIuMjA4ODYzOTc1NDgwMDAzNGUtMDYgMC45OTk5ODM2MTgyNDIwMDYxCiAKKy0tIEFkZGl0aW9uYWwgcmVhbCB2YWx1ZXMgKG1wbWF0aCkKK3RhbjAwNTAgdGFuIDFlLTEwMCAwLjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMmUtMTAwIDAuMAordGFuMDA1MSB0YW4gMy43ZS0wOCAwLjAgLT4gMy43MDAwMDAwMDAwMDAwMDE3MzI4ZS04IDAuMAordGFuMDA1MiB0YW4gMC4wMDEgMC4wIC0+IDAuMDAxMDAwMDAwMzMzMzMzNDY2Njg3NSAwLjAKK3RhbjAwNTMgdGFuIDAuMiAwLjAgLT4gMC4yMDI3MTAwMzU1MDg2NzI0OTQ4OCAwLjAKK3RhbjAwNTQgdGFuIDEuMCAwLjAgLT4gMS41NTc0MDc3MjQ2NTQ5MDIyMzA1IDAuMAordGFuMDA1NSB0YW4gLTMuN2UtMDggMC4wIC0+IC0zLjcwMDAwMDAwMDAwMDAwMTczMjhlLTggMC4wCit0YW4wMDU2IHRhbiAtMC4wMDEgMC4wIC0+IC0wLjAwMTAwMDAwMDMzMzMzMzQ2NjY4NzUgMC4wCit0YW4wMDU3IHRhbiAtMS4wIDAuMCAtPiAtMS41NTc0MDc3MjQ2NTQ5MDIyMzA1IDAuMAordGFuMDA1OCB0YW4gMC40NjM2NDc2MDkwMDA4MDYxIDAuMCAtPiAwLjQ5OTk5OTk5OTk5OTk5OTk3MTYzIDAuMAordGFuMDA1OSB0YW4gLTAuNDYzNjQ3NjA5MDAwODA2MSAwLjAgLT4gLTAuNDk5OTk5OTk5OTk5OTk5OTcxNjMgMC4wCit0YW4wMDYwIHRhbiAxLjEwNzE0ODcxNzc5NDA5MDQgMC4wIC0+IDEuOTk5OTk5OTk5OTk5OTk5NTI5OCAwLjAKK3RhbjAwNjEgdGFuIC0xLjEwNzE0ODcxNzc5NDA5MDQgMC4wIC0+IC0xLjk5OTk5OTk5OTk5OTk5OTUyOTggMC4wCit0YW4wMDYyIHRhbiAxLjUgMC4wIC0+IDE0LjEwMTQxOTk0NzE3MTcxOTM4OCAwLjAKK3RhbjAwNjMgdGFuIDEuNTcgMC4wIC0+IDEyNTUuNzY1NTkxNTAwNzg5NjQ3NSAwLjAKK3RhbjAwNjQgdGFuIDEuNTcwNzk2MzI2Nzk0ODk2MSAwLjAgLT4gMTk3ODkzNzk2NjA5NTIxOS4wNTM4IDAuMAordGFuMDA2NSB0YW4gNy4yMjU2NjMxMDMyNTY1MjMgMC4wIC0+IDEuMzc2MzgxOTIwNDcxMTcwMTUyMiAwLjAKK3RhbjAwNjYgdGFuIC04Ljc5NjQ1OTQzMDA1MTQyIDAuMCAtPiAwLjcyNjU0MjUyODAwNTM2MTQwOTggMC4wCisKIC0tIHNwZWNpYWwgdmFsdWVzCiB0YW4xMDAwIHRhbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAogdGFuMTAwMSB0YW4gLWluZiAwLjAgLT4gbmFuIG5hbiBpbnZhbGlkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weSBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CmluZGV4IGY1MjIyYzcuLjg2YzkzNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CisrKyBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CkBAIC0yLDE0ICsyLDIyIEBACiAKIFNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9UZXN0Q2FzZXMKICIiIgorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKKworaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IGJpc2VjdAogCiBpbXBvcnQgY29weQogaW1wb3J0IGRlY2ltYWwKIGltcG9ydCBzeXMKK2ltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cnVjdAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5CisKIGZyb20gb3BlcmF0b3IgaW1wb3J0IGx0LCBsZSwgZ3QsIGdlLCBlcSwgbmUsIHRydWVkaXYsIGZsb29yZGl2LCBtb2QKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yODQsNyArMjkyLDggQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOiBzZWxmLkVTVC5kc3QoNSkKIAogICAgIGRlZiB0ZXN0X3R6bmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDKzAwOjAwJywgdGltZXpvbmUoWkVSTykudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZS51dGMudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZShaRVJPKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wNTowMCcsIHRpbWV6b25lKC01ICogSE9VUikudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMrMDk6MzAnLCB0aW1lem9uZSg5LjUgKiBIT1VSKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wMDowMScsIHRpbWV6b25lKHRpbWVkZWx0YShtaW51dGVzPS0xKSkudHpuYW1lKE5vbmUpKQpAQCAtMTU1OCwxMyArMTU2NywzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQogCiAgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyLCA0LCA1LCAxLCAxMjMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDItMDMtMDJceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1QnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMS0wMi0wMyAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdceDAwJyksICIwMDAxLTAyLTAzXHgwMDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2hvdXJzJyksICIwMDAxLTAyLTAzVDA0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wM1QwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdChzZXA9JyAnLCB0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wMyAwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nZm9vJykKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDEtMDItMDMgMDQ6MDU6MDEuMDAwMTIzIikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxLCA5OTk1MDAsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS45OTkrMDA6MDAiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDEsIDk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMDAwMS0wMi0wM1QwNDowNTowMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMDAwIikKIAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKQEAgLTE1NzIsNiArMTYwMCwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDAwOjAwOjAwIikKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwMDowMDowMCIpCisgICAgICAgICMgSVNPIGZvcm1hdCB3aXRoIHRpbWV6b25lCisgICAgICAgIHR6ID0gRml4ZWRPZmZzZXQodGltZWRlbHRhKHNlY29uZHM9MTYpLCAnWFhYJykKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMiwgMywgMiwgdHppbmZvPXR6KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDAyLTAzLTAyVDAwOjAwOjAwKzAwOjAwOjE2IikKIAogICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDcsIDksIDEwLCA0LCA1LCAxLCAxMjMpCkBAIC0xNjkxLDYgKzE3MjMsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIDIzLCA1OSwgNTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDApCisgICAgICAgICMgYmFkIGZvbGQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIGZvbGQ9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsIDEsIDMxLCBmb2xkPTIpCisgICAgICAgICMgUG9zaXRpb25hbCBmb2xkOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudGhlY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsIDEsIDMxLCAyMywgNTksIDU5LCAwLCBOb25lLCAxKQogCiAgICAgZGVmIHRlc3RfaGFzaF9lcXVhbGl0eShzZWxmKToKICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDMxLCAyMywgMzAsIDE3KQpAQCAtMTg3NCwxNiArMTkxNCwyMCBAQAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxOTcwLCAxLCAxLCAxLCAyLCAzLCA0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGltZXN0YW1wKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTgwMDAuMCArIDM2MDAgKyAyKjYwICsgMyArIDQqMWUtNikKLSAgICAgICAgIyBNaXNzaW5nIGhvdXIgbWF5IHByb2R1Y2UgcGxhdGZvcm0tZGVwZW5kZW50IHJlc3VsdAotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDEyLCAzLCAxMSwgMiwgMzApCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKHQudGltZXN0YW1wKCkpLAotICAgICAgICAgICAgICAgICAgICAgIFt0IC0gdGltZWRlbHRhKGhvdXJzPTEpLCB0ICsgdGltZWRlbHRhKGhvdXJzPTEpXSkKKyAgICAgICAgIyBNaXNzaW5nIGhvdXIKKyAgICAgICAgdDAgPSBzZWxmLnRoZWNsYXNzKDIwMTIsIDMsIDExLCAyLCAzMCkKKyAgICAgICAgdDEgPSB0MC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodDEudGltZXN0YW1wKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHQwIC0gdGltZWRlbHRhKGhvdXJzPTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCh0MC50aW1lc3RhbXAoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdDEgKyB0aW1lZGVsdGEoaG91cnM9MSkpCiAgICAgICAgICMgQW1iaWd1b3VzIGhvdXIgZGVmYXVsdHMgdG8gRFNUCiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMTIsIDExLCA0LCAxLCAzMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodC50aW1lc3RhbXAoKSksIHQpCiAKICAgICAgICAgIyBUaW1lc3RhbXAgbWF5IHJhaXNlIGFuIG92ZXJmbG93IGVycm9yIG9uIHNvbWUgcGxhdGZvcm1zCi0gICAgICAgIGZvciB0IGluIFtzZWxmLnRoZWNsYXNzKDEsMSwxKSwgc2VsZi50aGVjbGFzcyg5OTk5LDEyLDEyKV06CisgICAgICAgICMgWFhYOiBEbyB3ZSBjYXJlIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGFuZCBsYXN0IHllYXI/CisgICAgICAgIGZvciB0IGluIFtzZWxmLnRoZWNsYXNzKDIsMSwxKSwgc2VsZi50aGVjbGFzcyg5OTk4LDEyLDEyKV06CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcyA9IHQudGltZXN0YW1wKCkKICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgpAQCAtMTkwMiw2ICsxOTQ2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRpbWVzdGFtcCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIDE4MDAwICsgMzYwMCArIDIqNjAgKyAzICsgNCoxZS02KQogCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ01TSy0wMycpICAjIFNvbWV0aGluZyBlYXN0IG9mIEdyZWVud2ljaAogICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kX3JvdW5kaW5nKHNlbGYpOgogICAgICAgICBmb3IgZnRzIGluIFtzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3MudXRjZnJvbXRpbWVzdGFtcF06CkBAIC0yMDc2LDExICsyMTIxLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluZSkgIyBuZWVkIGFuIGFyZwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQpICMgbmVlZCB0d28gYXJncwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIHQsIGQpICMgYXJncyByZXZlcnNlZAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQsIHQsIDEpICMgdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQsIHQsIDEpICMgd3JvbmcgdHppbmZvIHR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkLCB0LCAxLCAyKSAgIyB0b28gbWFueSBhcmdzCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluZSwgImRhdGUiLCAidGltZSIpICMgd3JvbmcgdHlwZXMKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkLCAidGltZSIpICMgd3JvbmcgdHlwZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsICJkYXRlIiwgdCkgIyB3cm9uZyB0eXBlCiAKKyAgICAgICAgIyB0emluZm89IGFyZ3VtZW50CisgICAgICAgIGR0ID0gY29tYmluZShkLCB0LCB0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZHQudHppbmZvLCB0aW1lem9uZS51dGMpCisgICAgICAgIGR0ID0gY29tYmluZShkLCB0LCB0emluZm89dGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydElzKGR0LnR6aW5mbywgdGltZXpvbmUudXRjKQorICAgICAgICB0ID0gdGltZSgpCisgICAgICAgIGR0ID0gY29tYmluZShkdCwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXRlKCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQudGltZSgpLCB0KQorCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcwogICAgICAgICBhcmdzID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddCkBAIC0yMTA3LDYgKzIxNjMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIHllYXI9MjAwMSkKIAogICAgIGRlZiB0ZXN0X2FzdGltZXpvbmUoc2VsZik6CisgICAgICAgIHJldHVybiAgIyBUaGUgcmVzdCBpcyBubyBsb25nZXIgYXBwbGljYWJsZQogICAgICAgICAjIFByZXR0eSBib3JpbmchICBUaGUgVFogdGVzdCBpcyBtb3JlIGludGVyZXN0aW5nIGhlcmUuICBhc3RpbWV6b25lKCkKICAgICAgICAgIyBzaW1wbHkgY2FuJ3QgYmUgYXBwbGllZCB0byBhIG5haXZlIG9iamVjdC4KICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm5vdygpCkBAIC0yMzI0LDYgKzIzODEsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMTAwMDAwIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCiAKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTEyMzQ1NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0naG91cnMnKSwgIjEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMTI6MzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdzZWNvbmRzJyksICIxMjozNDo1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMTI6MzQ6NTYuMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIxMjozNDo1Ni4xMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJyksICIxMjozNDo1Ni4xMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0Lmlzb2Zvcm1hdCwgdGltZXNwZWM9J21vbmtleScpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIxMjozNDo1Ni45OTkiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjEyOjM0OjU2LjAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpLCAiMTI6MzQ6NTYuMDAwMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMTI6MzQ6NTYiKQorCiAgICAgZGVmIHRlc3RfMTY1MzczNihzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgaXQgZG9lc24ndCBhY2NlcHQgZXh0cmEga2V5d29yZCBhcmd1bWVudHMKICAgICAgICAgdCA9IHNlbGYudGhlY2xhc3Moc2Vjb25kPTEpCkBAIC0yNTgyLDkgKzI2NTYsOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5kc3QpCiAKLSAgICAgICAgIyBOb3QgYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KKyAgICAgICAgIyBOb3QgYSB3aG9sZSBudW1iZXIgb2Ygc2Vjb25kcy4KICAgICAgICAgY2xhc3MgQzcodHppbmZvKToKLSAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9NjEpCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9NjEpCiAgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9LTgxKQogICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1DNygpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKQEAgLTM4ODQsNyArMzk1OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRlID49IGFzX2RhdGV0aW1lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZXRpbWUgPj0gYXNfZGF0ZSkKIAotICAgICAgICAjIE5ldmVydGhlbHNzLCBjb21wYXJpc29uIHNob3VsZCB3b3JrIHdpdGggdGhlIGJhc2UtY2xhc3MgKGRhdGUpCisgICAgICAgICMgTmV2ZXJ0aGVsZXNzLCBjb21wYXJpc29uIHNob3VsZCB3b3JrIHdpdGggdGhlIGJhc2UtY2xhc3MgKGRhdGUpCiAgICAgICAgICMgcHJvamVjdGlvbiBpZiB1c2Ugb2YgYSBkYXRlIG1ldGhvZCBpcyBmb3JjZWQuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpLCBUcnVlKQogICAgICAgICBkaWZmZXJlbnRfZGF5ID0gKGFzX2RhdGUuZGF5ICsgMSkgJSAyMCArIDEKQEAgLTM5NTcsNSArNDAzMSw3OTAgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgZGF0ZXRpbWUoMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAuKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMb2NhbCBUaW1lIERpc2FtYmlndWF0aW9uCisKKyMgQW4gZXhwZXJpbWVudGFsIHJlaW1wbGVtZW50YXRpb24gb2YgZnJvbXV0YyB0aGF0IHJlc3BlY3RzIHRoZSAiZm9sZCIgZmxhZy4KKworY2xhc3MgdHppbmZvMih0emluZm8pOgorCisgICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOgorICAgICAgICAiZGF0ZXRpbWUgaW4gVVRDIC0+IGRhdGV0aW1lIGluIGxvY2FsIHRpbWUuIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImZyb211dGMoKSByZXF1aXJlcyBhIGRhdGV0aW1lIGFyZ3VtZW50IikKKyAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZHQudHppbmZvIGlzIG5vdCBzZWxmIikKKyAgICAgICAgIyBSZXR1cm5lZCB2YWx1ZSBzYXRpc2ZpZXMKKyAgICAgICAgIyAgICAgICAgICBkdCArIGxkdC51dGNvZmZzZXQoKSA9IGxkdAorICAgICAgICBvZmYwID0gZHQucmVwbGFjZShmb2xkPTApLnV0Y29mZnNldCgpCisgICAgICAgIG9mZjEgPSBkdC5yZXBsYWNlKGZvbGQ9MSkudXRjb2Zmc2V0KCkKKyAgICAgICAgaWYgb2ZmMCBpcyBOb25lIG9yIG9mZjEgaXMgTm9uZSBvciBkdC5kc3QoKSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBpZiBvZmYwID09IG9mZjE6CisgICAgICAgICAgICBsZHQgPSBkdCArIG9mZjAKKyAgICAgICAgICAgIG9mZjEgPSBsZHQudXRjb2Zmc2V0KCkKKyAgICAgICAgICAgIGlmIG9mZjAgPT0gb2ZmMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGR0CisgICAgICAgICMgTm93LCB3ZSBkaXNjb3ZlcmVkIGJvdGggcG9zc2libGUgb2Zmc2V0cywgc28KKyAgICAgICAgIyB3ZSBjYW4ganVzdCB0cnkgZm91ciBwb3NzaWJsZSBzb2x1dGlvbnM6CisgICAgICAgIGZvciBvZmYgaW4gW29mZjAsIG9mZjFdOgorICAgICAgICAgICAgbGR0ID0gZHQgKyBvZmYKKyAgICAgICAgICAgIGlmIGxkdC51dGNvZmZzZXQoKSA9PSBvZmY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxkdAorICAgICAgICAgICAgbGR0ID0gbGR0LnJlcGxhY2UoZm9sZD0xKQorICAgICAgICAgICAgaWYgbGR0LnV0Y29mZnNldCgpID09IG9mZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbGR0CisKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gc3VpdGFibGUgbG9jYWwgdGltZSBmb3VuZCIpCisKKyMgUmVpbXBsZW1lbnRpbmcgc2ltcGxpZmllZCBVUyB0aW1lem9uZXMgdG8gcmVzcGVjdCB0aGUgImZvbGQiIGZsYWc6CisKK2NsYXNzIFVTVGltZVpvbmUyKHR6aW5mbzIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvdXJzLCByZXBybmFtZSwgc3RkbmFtZSwgZHN0bmFtZSk6CisgICAgICAgIHNlbGYuc3Rkb2Zmc2V0ID0gdGltZWRlbHRhKGhvdXJzPWhvdXJzKQorICAgICAgICBzZWxmLnJlcHJuYW1lID0gcmVwcm5hbWUKKyAgICAgICAgc2VsZi5zdGRuYW1lID0gc3RkbmFtZQorICAgICAgICBzZWxmLmRzdG5hbWUgPSBkc3RuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHJuYW1lCisKKyAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKKyAgICAgICAgaWYgc2VsZi5kc3QoZHQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZHN0bmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RkbmFtZQorCisgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgIHJldHVybiBzZWxmLnN0ZG9mZnNldCArIHNlbGYuZHN0KGR0KQorCisgICAgZGVmIGRzdChzZWxmLCBkdCk6CisgICAgICAgIGlmIGR0IGlzIE5vbmUgb3IgZHQudHppbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAjIEFuIGV4Y2VwdGlvbiBpbnN0ZWFkIG1heSBiZSBzZW5zaWJsZSBoZXJlLCBpbiBvbmUgb3IgbW9yZSBvZgorICAgICAgICAgICAgIyB0aGUgY2FzZXMuCisgICAgICAgICAgICByZXR1cm4gWkVSTworICAgICAgICBhc3NlcnQgZHQudHppbmZvIGlzIHNlbGYKKworICAgICAgICAjIEZpbmQgZmlyc3QgU3VuZGF5IGluIEFwcmlsLgorICAgICAgICBzdGFydCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihEU1RTVEFSVC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCisgICAgICAgIGFzc2VydCBzdGFydC53ZWVrZGF5KCkgPT0gNiBhbmQgc3RhcnQubW9udGggPT0gNCBhbmQgc3RhcnQuZGF5IDw9IDcKKworICAgICAgICAjIEZpbmQgbGFzdCBTdW5kYXkgaW4gT2N0b2Jlci4KKyAgICAgICAgZW5kID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKERTVEVORC5yZXBsYWNlKHllYXI9ZHQueWVhcikpCisgICAgICAgIGFzc2VydCBlbmQud2Vla2RheSgpID09IDYgYW5kIGVuZC5tb250aCA9PSAxMCBhbmQgZW5kLmRheSA+PSAyNQorCisgICAgICAgICMgQ2FuJ3QgY29tcGFyZSBuYWl2ZSB0byBhd2FyZSBvYmplY3RzLCBzbyBzdHJpcCB0aGUgdGltZXpvbmUgZnJvbQorICAgICAgICAjIGR0IGZpcnN0LgorICAgICAgICBkdCA9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIGlmIHN0YXJ0ICsgSE9VUiA8PSBkdCA8IGVuZDoKKyAgICAgICAgICAgICMgRFNUIGlzIGluIGVmZmVjdC4KKyAgICAgICAgICAgIHJldHVybiBIT1VSCisgICAgICAgIGVsaWYgZW5kIDw9IGR0IDwgZW5kICsgSE9VUjoKKyAgICAgICAgICAgICMgRm9sZCAoYW4gYW1iaWd1b3VzIGhvdXIpOiB1c2UgZHQuZm9sZCB0byBkaXNhbWJpZ3VhdGUuCisgICAgICAgICAgICByZXR1cm4gWkVSTyBpZiBkdC5mb2xkIGVsc2UgSE9VUgorICAgICAgICBlbGlmIHN0YXJ0IDw9IGR0IDwgc3RhcnQgKyBIT1VSOgorICAgICAgICAgICAgIyBHYXAgKGEgbm9uLWV4aXN0ZW50IGhvdXIpOiByZXZlcnNlIHRoZSBmb2xkIHJ1bGUuCisgICAgICAgICAgICByZXR1cm4gSE9VUiBpZiBkdC5mb2xkIGVsc2UgWkVSTworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBEU1QgaXMgb2ZmLgorICAgICAgICAgICAgcmV0dXJuIFpFUk8KKworRWFzdGVybjIgID0gVVNUaW1lWm9uZTIoLTUsICJFYXN0ZXJuMiIsICAiRVNUIiwgIkVEVCIpCitDZW50cmFsMiAgPSBVU1RpbWVab25lMigtNiwgIkNlbnRyYWwyIiwgICJDU1QiLCAiQ0RUIikKK01vdW50YWluMiA9IFVTVGltZVpvbmUyKC03LCAiTW91bnRhaW4yIiwgIk1TVCIsICJNRFQiKQorUGFjaWZpYzIgID0gVVNUaW1lWm9uZTIoLTgsICJQYWNpZmljMiIsICAiUFNUIiwgIlBEVCIpCisKKyMgRXVyb3BlX1ZpbG5pdXNfMTk0MSB0emluZm8gaW1wbGVtZW50YXRpb24gcmVwcm9kdWNlcyB0aGUgZm9sbG93aW5nCisjIDE5NDEgdHJhbnNpdGlvbiBmcm9tIE9sc29uJ3MgdHpkaXN0OgorIworIyBab25lIE5BTUUgICAgICAgICAgIEdNVE9GRiBSVUxFUyAgRk9STUFUIFtVTlRJTF0KKyMgWm9uZUV1cm9wZS9WaWxuaXVzICAxOjAwICAgLSAgICAgIENFVCAgICAxOTQwIEF1ZyAgMworIyAgICAgICAgICAgICAgICAgICAgIDM6MDAgICAtICAgICAgTVNLICAgIDE5NDEgSnVuIDI0CisjICAgICAgICAgICAgICAgICAgICAgMTowMCAgIEMtRXVyICBDRSVzVCAgMTk0NCBBdWcKKyMKKyMgJCB6ZHVtcCAtdiBFdXJvcGUvVmlsbml1cyB8IGdyZXAgMTk0MQorIyBFdXJvcGUvVmlsbml1cyAgTW9uIEp1biAyMyAyMDo1OTo1OSAxOTQxIFVUQyA9IE1vbiBKdW4gMjMgMjM6NTk6NTkgMTk0MSBNU0sgaXNkc3Q9MCBnbXRvZmY9MTA4MDAKKyMgRXVyb3BlL1ZpbG5pdXMgIE1vbiBKdW4gMjMgMjE6MDA6MDAgMTk0MSBVVEMgPSBNb24gSnVuIDIzIDIzOjAwOjAwIDE5NDEgQ0VTVCBpc2RzdD0xIGdtdG9mZj03MjAwCisKK2NsYXNzIEV1cm9wZV9WaWxuaXVzXzE5NDEodHppbmZvKToKKyAgICBkZWYgX3V0Y19mb2xkKHNlbGYpOgorICAgICAgICByZXR1cm4gW2RhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMSwgdHppbmZvPXNlbGYpLCAgIyBNb24gSnVuIDIzIDIxOjAwOjAwIDE5NDEgVVRDCisgICAgICAgICAgICAgICAgZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIyLCB0emluZm89c2VsZildICAjIE1vbiBKdW4gMjMgMjI6MDA6MDAgMTk0MSBVVEMKKworICAgIGRlZiBfbG9jX2ZvbGQoc2VsZik6CisgICAgICAgIHJldHVybiBbZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIzLCB0emluZm89c2VsZiksICAjIE1vbiBKdW4gMjMgMjM6MDA6MDAgMTk0MSBNU0sgLyBDRVNUCisgICAgICAgICAgICAgICAgZGF0ZXRpbWUoMTk0MSwgNiwgMjQsIDAsIHR6aW5mbz1zZWxmKV0gICAjIE1vbiBKdW4gMjQgMDA6MDA6MDAgMTk0MSBDRVNUCisKKyAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgZm9sZF9zdGFydCwgZm9sZF9zdG9wID0gc2VsZi5fbG9jX2ZvbGQoKQorICAgICAgICBpZiBkdCA8IGZvbGRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gMyAqIEhPVVIKKyAgICAgICAgaWYgZHQgPCBmb2xkX3N0b3A6CisgICAgICAgICAgICByZXR1cm4gKDIgaWYgZHQuZm9sZCBlbHNlIDMpICogSE9VUgorICAgICAgICAjIGlmIGR0ID49IGZvbGRfc3RvcAorICAgICAgICByZXR1cm4gMiAqIEhPVVIKKworICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICBmb2xkX3N0YXJ0LCBmb2xkX3N0b3AgPSBzZWxmLl9sb2NfZm9sZCgpCisgICAgICAgIGlmIGR0IDwgZm9sZF9zdGFydDoKKyAgICAgICAgICAgIHJldHVybiAwICogSE9VUgorICAgICAgICBpZiBkdCA8IGZvbGRfc3RvcDoKKyAgICAgICAgICAgIHJldHVybiAoMSBpZiBkdC5mb2xkIGVsc2UgMCkgKiBIT1VSCisgICAgICAgICMgaWYgZHQgPj0gZm9sZF9zdG9wCisgICAgICAgIHJldHVybiAxICogSE9VUgorCisgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgIGZvbGRfc3RhcnQsIGZvbGRfc3RvcCA9IHNlbGYuX2xvY19mb2xkKCkKKyAgICAgICAgaWYgZHQgPCBmb2xkX3N0YXJ0OgorICAgICAgICAgICAgcmV0dXJuICdNU0snCisgICAgICAgIGlmIGR0IDwgZm9sZF9zdG9wOgorICAgICAgICAgICAgcmV0dXJuICgnTVNLJywgJ0NFU1QnKVtkdC5mb2xkXQorICAgICAgICAjIGlmIGR0ID49IGZvbGRfc3RvcAorICAgICAgICByZXR1cm4gJ0NFU1QnCisKKyAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6CisgICAgICAgIGFzc2VydCBkdC5mb2xkID09IDAKKyAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCisgICAgICAgIGlmIGR0LnllYXIgIT0gMTk0MToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgZm9sZF9zdGFydCwgZm9sZF9zdG9wID0gc2VsZi5fdXRjX2ZvbGQoKQorICAgICAgICBpZiBkdCA8IGZvbGRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gZHQgKyAzICogSE9VUgorICAgICAgICBpZiBkdCA8IGZvbGRfc3RvcDoKKyAgICAgICAgICAgIHJldHVybiAoZHQgKyAyICogSE9VUikucmVwbGFjZShmb2xkPTEpCisgICAgICAgICMgaWYgZHQgPj0gZm9sZF9zdG9wCisgICAgICAgIHJldHVybiBkdCArIDIgKiBIT1VSCisKKworY2xhc3MgVGVzdExvY2FsVGltZURpc2FtYmlndWF0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3ZpbG5pdXNfMTk0MV9mcm9tdXRjKHNlbGYpOgorICAgICAgICBWaWxuaXVzID0gRXVyb3BlX1ZpbG5pdXNfMTk0MSgpCisKKyAgICAgICAgZ2R0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIwLCA1OSwgNTksIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIGxkdCA9IGdkdC5hc3RpbWV6b25lKFZpbG5pdXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LnN0cmZ0aW1lKCIlYyAlWiV6IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ01vbiBKdW4gMjMgMjM6NTk6NTkgMTk0MSBNU0srMDMwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LmZvbGQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGR0LmRzdCgpKQorCisgICAgICAgIGdkdCA9IGRhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMSwgdHppbmZvPXRpbWV6b25lLnV0YykKKyAgICAgICAgbGR0ID0gZ2R0LmFzdGltZXpvbmUoVmlsbml1cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuc3RyZnRpbWUoIiVjICVaJXoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAyMzowMDowMCAxOTQxIENFU1QrMDIwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGR0LmZvbGQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZHQuZHN0KCkpCisKKyAgICAgICAgZ2R0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIyLCB0emluZm89dGltZXpvbmUudXRjKQorICAgICAgICBsZHQgPSBnZHQuYXN0aW1lem9uZShWaWxuaXVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5zdHJmdGltZSgiJWMgJVoleiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUdWUgSnVuIDI0IDAwOjAwOjAwIDE5NDEgQ0VTVCswMjAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxkdC5kc3QoKSkKKworICAgIGRlZiB0ZXN0X3ZpbG5pdXNfMTk0MV90b3V0YyhzZWxmKToKKyAgICAgICAgVmlsbml1cyA9IEV1cm9wZV9WaWxuaXVzXzE5NDEoKQorCisgICAgICAgIGxkdCA9IGRhdGV0aW1lKDE5NDEsIDYsIDIzLCAyMiwgNTksIDU5LCB0emluZm89Vmlsbml1cykKKyAgICAgICAgZ2R0ID0gbGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkdC5zdHJmdGltZSgiJWMgJVoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAxOTo1OTo1OSAxOTQxIFVUQycpCisKKyAgICAgICAgbGR0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjMsIDIzLCA1OSwgNTksIHR6aW5mbz1WaWxuaXVzKQorICAgICAgICBnZHQgPSBsZHQuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2R0LnN0cmZ0aW1lKCIlYyAlWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdNb24gSnVuIDIzIDIwOjU5OjU5IDE5NDEgVVRDJykKKworICAgICAgICBsZHQgPSBkYXRldGltZSgxOTQxLCA2LCAyMywgMjMsIDU5LCA1OSwgdHppbmZvPVZpbG5pdXMsIGZvbGQ9MSkKKyAgICAgICAgZ2R0ID0gbGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkdC5zdHJmdGltZSgiJWMgJVoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTW9uIEp1biAyMyAyMTo1OTo1OSAxOTQxIFVUQycpCisKKyAgICAgICAgbGR0ID0gZGF0ZXRpbWUoMTk0MSwgNiwgMjQsIDAsIHR6aW5mbz1WaWxuaXVzKQorICAgICAgICBnZHQgPSBsZHQuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2R0LnN0cmZ0aW1lKCIlYyAlWiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdNb24gSnVuIDIzIDIyOjAwOjAwIDE5NDEgVVRDJykKKworCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JzKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwLCBmb2xkPTEpCisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSwgZm9sZD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5mb2xkLCAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0aW1lKDAsIDAsIDAsIDAsIE5vbmUsIDApCisKKyAgICBkZWYgdGVzdF9tZW1iZXIoc2VsZik6CisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSwgZm9sZD0xKQorICAgICAgICB0ID0gZHQudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5mb2xkLCAxKQorICAgICAgICB0ID0gZHQudGltZXR6KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmZvbGQsIDEpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZXBsYWNlKGZvbGQ9MSkuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5yZXBsYWNlKGZvbGQ9MSkuZm9sZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnJlcGxhY2UoZm9sZD0wKS5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnJlcGxhY2UoZm9sZD0wKS5mb2xkLCAwKQorICAgICAgICAjIENoZWNrIHRoYXQgcmVwbGFjZW1lbnQgb2Ygb3RoZXIgZmllbGRzIGRvZXMgbm90IGNoYW5nZSAiZm9sZCIuCisgICAgICAgIHQgPSB0LnJlcGxhY2UoZm9sZD0xLCB0emluZm89RWFzdGVybikKKyAgICAgICAgZHQgPSBkdC5yZXBsYWNlKGZvbGQ9MSwgdHppbmZvPUVhc3Rlcm4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZXBsYWNlKHR6aW5mbz1Ob25lKS5mb2xkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnJlcGxhY2UodHppbmZvPU5vbmUpLmZvbGQsIDEpCisgICAgICAgICMgQ2hlY2sgdGhhdCBmb2xkIGlzIGEga2V5d29yZC1vbmx5IGFyZ3VtZW50CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVwbGFjZSgxLCAxLCAxLCBOb25lLCAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBkdC5yZXBsYWNlKDEsIDEsIDEsIDEsIDEsIDEsIDEsIE5vbmUsIDEpCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29uKHNlbGYpOgorICAgICAgICB0ID0gdGltZSgwKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5yZXBsYWNlKGZvbGQ9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0LnJlcGxhY2UoZm9sZD0xKSkKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIHQgPSB0aW1lKDApCisgICAgICAgIGR0ID0gZGF0ZXRpbWUoMSwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQpLCBoYXNoKHQucmVwbGFjZShmb2xkPTEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGR0KSwgaGFzaChkdC5yZXBsYWNlKGZvbGQ9MSkpKQorCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgcyA9IDE0MTQ5MDYyMDAKKyAgICAgICAgZHQwID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICBkdDEgPSBkYXRldGltZS5mcm9tdGltZXN0YW1wKHMgKyAzNjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MC5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS5mb2xkLCAxKQorCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0F1c3RyYWxpYS9Mb3JkX0hvd2UnKQorICAgIGRlZiB0ZXN0X2Zyb210aW1lc3RhbXBfbG9yZF9ob3dlKHNlbGYpOgorICAgICAgICB0bSA9IF90aW1lLmxvY2FsdGltZSgxLjRlOSkKKyAgICAgICAgaWYgX3RpbWUuc3RyZnRpbWUoJyVaJXonLCB0bSkgIT0gJ0xIU1QrMTAzMCc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdBdXN0cmFsaWEvTG9yZF9Ib3dlIHRpbWV6b25lIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybScpCisgICAgICAgICMgJCBUWj1BdXN0cmFsaWEvTG9yZF9Ib3dlIGRhdGUgLXIgMTQyODE1ODcwMAorICAgICAgICAjIFN1biBBcHIgIDUgMDE6NDU6MDAgTEhEVCAyMDE1CisgICAgICAgICMgJCBUWj1BdXN0cmFsaWEvTG9yZF9Ib3dlIGRhdGUgLXIgMTQyODE2MDUwMAorICAgICAgICAjIFN1biBBcHIgIDUgMDE6NDU6MDAgTEhTVCAyMDE1CisgICAgICAgIHMgPSAxNDI4MTU4NzAwCisgICAgICAgIHQwID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICB0MSA9IGRhdGV0aW1lLmZyb210aW1lc3RhbXAocyArIDE4MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDAsIHQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQwLmZvbGQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuZm9sZCwgMSkKKworCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBkdDAgPSBkYXRldGltZSgyMDE0LCAxMSwgMiwgMSwgMzApCisgICAgICAgIGR0MSA9IGR0MC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDAudGltZXN0YW1wKCkgKyAzNjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR0MS50aW1lc3RhbXAoKSkKKworICAgIEBzdXBwb3J0LnJ1bl93aXRoX3R6KCdBdXN0cmFsaWEvTG9yZF9Ib3dlJykKKyAgICBkZWYgdGVzdF90aW1lc3RhbXBfbG9yZF9ob3dlKHNlbGYpOgorICAgICAgICB0bSA9IF90aW1lLmxvY2FsdGltZSgxLjRlOSkKKyAgICAgICAgaWYgX3RpbWUuc3RyZnRpbWUoJyVaJXonLCB0bSkgIT0gJ0xIU1QrMTAzMCc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdBdXN0cmFsaWEvTG9yZF9Ib3dlIHRpbWV6b25lIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybScpCisgICAgICAgIHQgPSBkYXRldGltZSgyMDE1LCA0LCA1LCAxLCA0NSkKKyAgICAgICAgczAgPSB0LnJlcGxhY2UoZm9sZD0wKS50aW1lc3RhbXAoKQorICAgICAgICBzMSA9IHQucmVwbGFjZShmb2xkPTEpLnRpbWVzdGFtcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAgKyAxODAwLCBzMSkKKworCisgICAgQHN1cHBvcnQucnVuX3dpdGhfdHooJ0VTVCswNUVEVCxNMy4yLjAsTTExLjEuMCcpCisgICAgZGVmIHRlc3RfYXN0aW1lem9uZShzZWxmKToKKyAgICAgICAgZHQwID0gZGF0ZXRpbWUoMjAxNCwgMTEsIDIsIDEsIDMwKQorICAgICAgICBkdDEgPSBkdDAucmVwbGFjZShmb2xkPTEpCisgICAgICAgICMgQ29udmVydCBib3RoIG5haXZlIGluc3RhbmNlcyB0byBhd2FyZS4KKyAgICAgICAgYWR0MCA9IGR0MC5hc3RpbWV6b25lKCkKKyAgICAgICAgYWR0MSA9IGR0MS5hc3RpbWV6b25lKCkKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBpbiBEU1Qgem9uZSBhbmQgdGhlIHNlY29uZCBpbiBTVEQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQwLnR6bmFtZSgpLCAnRURUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQxLnR6bmFtZSgpLCAnRVNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZHQwICsgSE9VUiwgYWR0MSkKKyAgICAgICAgIyBBd2FyZSBpbnN0YW5jZXMgd2l0aCBmaXhlZCBvZmZzZXQgdHppbmZvJ3MgYWx3YXlzIGhhdmUgZm9sZD0wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWR0MC5mb2xkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkdDEuZm9sZCwgMCkKKworCisgICAgZGVmIHRlc3RfcGlja2xlX2ZvbGQoc2VsZik6CisgICAgICAgIHQgPSB0aW1lKGZvbGQ9MSkKKyAgICAgICAgZHQgPSBkYXRldGltZSgxLCAxLCAxLCBmb2xkPTEpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZm9yIHggaW4gW3QsIGR0XToKKyAgICAgICAgICAgICAgICBzID0gcGlja2xlci5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgICAgICB5ID0gdW5waWNrbGVyLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgaWYgcHJvdG8gPCA0IGVsc2UgeC5mb2xkKSwgeS5mb2xkKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgdCA9IHRpbWUoZm9sZD0xKQorICAgICAgICBkdCA9IGRhdGV0aW1lKDEsIDEsIDEsIGZvbGQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLCAnZGF0ZXRpbWUudGltZSgwLCAwLCBmb2xkPTEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMSwgMSwgMSwgMCwgMCwgZm9sZD0xKScpCisKKyAgICBkZWYgdGVzdF9kc3Qoc2VsZik6CisgICAgICAgICMgTGV0J3MgZmlyc3QgZXN0YWJsaXNoIHRoYXQgdGhpbmdzIHdvcmsgaW4gcmVndWxhciB0aW1lcy4KKyAgICAgICAgZHRfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgZHRfd2ludGVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAyLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLmRzdCgpLCBIT1VSKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0X3dpbnRlci5kc3QoKSwgWkVSTykKKyAgICAgICAgIyBUaGUgZGlzYW1iaWd1YXRpb24gZmxhZyBpcyBpZ25vcmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLnJlcGxhY2UoZm9sZD0xKS5kc3QoKSwgSE9VUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdF93aW50ZXIucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBaRVJPKQorCisgICAgICAgICMgUGljayBsb2NhbCB0aW1lIGluIHRoZSBmb2xkLgorICAgICAgICBmb3IgbWludXRlIGluIFswLCAzMCwgNTldOgorICAgICAgICAgICAgZHQgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDEsIG1pbnV0ZSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICAgICAgIyBXaXRoIGZvbGQ9MCAodGhlIGRlZmF1bHQpIGl0IGlzIGluIERTVC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZHN0KCksIEhPVVIpCisgICAgICAgICAgICAjIFdpdGggZm9sZD0xIGl0IGlzIGluIFNURC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBaRVJPKQorCisgICAgICAgICMgUGljayBsb2NhbCB0aW1lIGluIHRoZSBnYXAuCisgICAgICAgIGZvciBtaW51dGUgaW4gWzAsIDMwLCA1OV06CisgICAgICAgICAgICBkdCA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIG1pbnV0ZSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICAgICAgIyBXaXRoIGZvbGQ9MCAodGhlIGRlZmF1bHQpIGl0IGlzIGluIFNURC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZHN0KCksIFpFUk8pCisgICAgICAgICAgICAjIFdpdGggZm9sZD0xIGl0IGlzIGluIERTVC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQucmVwbGFjZShmb2xkPTEpLmRzdCgpLCBIT1VSKQorCisKKyAgICBkZWYgdGVzdF91dGNvZmZzZXQoc2VsZik6CisgICAgICAgICMgTGV0J3MgZmlyc3QgZXN0YWJsaXNoIHRoYXQgdGhpbmdzIHdvcmsgaW4gcmVndWxhciB0aW1lcy4KKyAgICAgICAgZHRfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgZHRfd2ludGVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAyLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfc3VtbWVyLnV0Y29mZnNldCgpLCAtNCAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHRfd2ludGVyLnV0Y29mZnNldCgpLCAtNSAqIEhPVVIpCisgICAgICAgICMgVGhlIGRpc2FtYmlndWF0aW9uIGZsYWcgaXMgaWdub3JlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0X3N1bW1lci5yZXBsYWNlKGZvbGQ9MSkudXRjb2Zmc2V0KCksIC00ICogSE9VUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdF93aW50ZXIucmVwbGFjZShmb2xkPTEpLnV0Y29mZnNldCgpLCAtNSAqIEhPVVIpCisKKyAgICBkZWYgdGVzdF9mcm9tdXRjKHNlbGYpOgorICAgICAgICAjIExldCdzIGZpcnN0IGVzdGFibGlzaCB0aGF0IHRoaW5ncyB3b3JrIGluIHJlZ3VsYXIgdGltZXMuCisgICAgICAgIHVfc3VtbWVyID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCA2LCB0emluZm89RWFzdGVybjIpIC0gdGltZWRlbHRhLnJlc29sdXRpb24KKyAgICAgICAgdV93aW50ZXIgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDcsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdF9zdW1tZXIgPSBFYXN0ZXJuMi5mcm9tdXRjKHVfc3VtbWVyKQorICAgICAgICB0X3dpbnRlciA9IEVhc3Rlcm4yLmZyb211dGModV93aW50ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF9zdW1tZXIsIHVfc3VtbWVyIC0gNCAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF93aW50ZXIsIHVfd2ludGVyIC0gNSAqIEhPVVIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodF9zdW1tZXIuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0X3dpbnRlci5mb2xkLCAwKQorCisgICAgICAgICMgV2hhdCBoYXBwZW5zIGluIHRoZSBmYWxsLWJhY2sgZm9sZD8KKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgNSwgMzAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdDAgPSBFYXN0ZXJuMi5mcm9tdXRjKHUpCisgICAgICAgIHUgKz0gSE9VUgorICAgICAgICB0MSA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MCwgdDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDAuZm9sZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5mb2xkLCAxKQorICAgICAgICAjIFRoZSB0cmlja3kgcGFydCBpcyB3aGVuIHUgaXMgaW4gdGhlIGxvY2FsIGZvbGQ6CisgICAgICAgIHUgPSBkYXRldGltZSgyMDAyLCAxMCwgMjcsIDEsIDMwLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHQgPSBFYXN0ZXJuMi5mcm9tdXRjKHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHQuZGF5LCB0LmhvdXIpLCAoMjYsIDIxKSkKKyAgICAgICAgIyAuLiBvciBnZXRzIGludG8gdGhlIGxvY2FsIGZvbGQgYWZ0ZXIgYSBzdGFuZGFyZCB0aW1lIGFkanVzdG1lbnQKKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgNiwgMzAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdCA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodC5kYXksIHQuaG91ciksICgyNywgMSkpCisKKyAgICAgICAgIyBXaGF0IGhhcHBlbnMgaW4gdGhlIHNwcmluZy1mb3J3YXJkIGdhcD8KKyAgICAgICAgdSA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIDAsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdCA9IEVhc3Rlcm4yLmZyb211dGModSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodC5kYXksIHQuaG91ciksICg2LCAyMSkpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX3JlZ3VsYXIoc2VsZik6CisgICAgICAgIHQgPSBkYXRldGltZSgyMDAwLCAxLCAxLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykpCisgICAgICAgIHQgPSBkYXRldGltZSgyMDAwLCA2LCAxLCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX2ZvbGQoc2VsZik6CisgICAgICAgIHRfZm9sZCA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgMSwgNDUsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgdF9mb2xkX3V0YyA9IHRfZm9sZC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0X2ZvbGQsIHRfZm9sZF91dGMpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlX2dhcChzZWxmKToKKyAgICAgICAgdF9nYXAgPSBkYXRldGltZSgyMDAyLCA0LCA3LCAyLCA0NSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICB0X2dhcF91dGMgPSB0X2dhcC5hc3RpbWV6b25lKHRpbWV6b25lLnV0YykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0X2dhcCwgdF9nYXBfdXRjKQorCisgICAgZGVmIHRlc3RfaGFzaF9hd2FyZShzZWxmKToKKyAgICAgICAgdCA9IGRhdGV0aW1lKDIwMDAsIDEsIDEsIHR6aW5mbz1FYXN0ZXJuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQpLCBoYXNoKHQucmVwbGFjZShmb2xkPTEpKSkKKyAgICAgICAgdF9mb2xkID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxLCA0NSwgdHppbmZvPUVhc3Rlcm4yKQorICAgICAgICB0X2dhcCA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIsIDQ1LCB0emluZm89RWFzdGVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0X2ZvbGQpLCBoYXNoKHRfZm9sZC5yZXBsYWNlKGZvbGQ9MSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godF9nYXApLCBoYXNoKHRfZ2FwLnJlcGxhY2UoZm9sZD0xKSkpCisKK1NFQyA9IHRpbWVkZWx0YSgwLCAxKQorCitkZWYgcGFpcnMoaXRlcmFibGUpOgorICAgIGEsIGIgPSBpdGVydG9vbHMudGVlKGl0ZXJhYmxlKQorICAgIG5leHQoYiwgTm9uZSkKKyAgICByZXR1cm4gemlwKGEsIGIpCisKK2NsYXNzIFpvbmVJbmZvKHR6aW5mbyk6CisgICAgem9uZXJvb3QgPSAnL3Vzci9zaGFyZS96b25laW5mbycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXQsIHRpKToKKyAgICAgICAgIiIiCisKKyAgICAgICAgOnBhcmFtIHV0OiBhcnJheQorICAgICAgICAgICAgQXJyYXkgb2YgdHJhbnNpdGlvbiBwb2ludCB0aW1lc3RhbXBzCisgICAgICAgIDpwYXJhbSB0aTogbGlzdAorICAgICAgICAgICAgQSBsaXN0IG9mIChvZmZzZXQsIGlzZHN0LCBhYmJyKSB0dXBsZXMKKyAgICAgICAgOnJldHVybjogTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51dCA9IHV0CisgICAgICAgIHNlbGYudGkgPSB0aQorICAgICAgICBzZWxmLmx0ID0gc2VsZi5pbnZlcnQodXQsIHRpKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpbnZlcnQodXQsIHRpKToKKyAgICAgICAgbHQgPSAoYXJyYXkoJ3EnLCB1dCksIGFycmF5KCdxJywgdXQpKQorICAgICAgICBpZiB1dDoKKyAgICAgICAgICAgIG9mZnNldCA9IHRpWzBdWzBdIC8vIFNFQworICAgICAgICAgICAgbHRbMF1bMF0gKz0gb2Zmc2V0CisgICAgICAgICAgICBsdFsxXVswXSArPSBvZmZzZXQKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbih1dCkpOgorICAgICAgICAgICAgICAgIGx0WzBdW2ldICs9IHRpW2ktMV1bMF0gLy8gU0VDCisgICAgICAgICAgICAgICAgbHRbMV1baV0gKz0gdGlbaV1bMF0gLy8gU0VDCisgICAgICAgIHJldHVybiBsdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21maWxlKGNscywgZmlsZW9iaik6CisgICAgICAgIGlmIGZpbGVvYmoucmVhZCg0KS5kZWNvZGUoKSAhPSAiVFppZiI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgYSB6b25laW5mbyBmaWxlIikKKyAgICAgICAgZmlsZW9iai5zZWVrKDMyKQorICAgICAgICBjb3VudHMgPSBhcnJheSgnaScpCisgICAgICAgIGNvdW50cy5mcm9tZmlsZShmaWxlb2JqLCAzKQorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICAgICAgY291bnRzLmJ5dGVzd2FwKCkKKworICAgICAgICB1dCA9IGFycmF5KCdpJykKKyAgICAgICAgdXQuZnJvbWZpbGUoZmlsZW9iaiwgY291bnRzWzBdKQorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICAgICAgdXQuYnl0ZXN3YXAoKQorCisgICAgICAgIHR5cGVfaW5kaWNlcyA9IGFycmF5KCdCJykKKyAgICAgICAgdHlwZV9pbmRpY2VzLmZyb21maWxlKGZpbGVvYmosIGNvdW50c1swXSkKKworICAgICAgICB0dGlzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY291bnRzWzFdKToKKyAgICAgICAgICAgIHR0aXMuYXBwZW5kKHN0cnVjdC51bnBhY2soIj5sYmIiLCBmaWxlb2JqLnJlYWQoNikpKQorCisgICAgICAgIGFiYnJzID0gZmlsZW9iai5yZWFkKGNvdW50c1syXSkKKworICAgICAgICAjIENvbnZlcnQgdHRpcworICAgICAgICBmb3IgaSwgKGdtdG9mZiwgaXNkc3QsIGFiYnJpbmQpIGluIGVudW1lcmF0ZSh0dGlzKToKKyAgICAgICAgICAgIGFiYnIgPSBhYmJyc1thYmJyaW5kOmFiYnJzLmZpbmQoMCwgYWJicmluZCldLmRlY29kZSgpCisgICAgICAgICAgICB0dGlzW2ldID0gKHRpbWVkZWx0YSgwLCBnbXRvZmYpLCBpc2RzdCwgYWJicikKKworICAgICAgICB0aSA9IFtOb25lXSAqIGxlbih1dCkKKyAgICAgICAgZm9yIGksIGlkeCBpbiBlbnVtZXJhdGUodHlwZV9pbmRpY2VzKToKKyAgICAgICAgICAgIHRpW2ldID0gdHRpc1tpZHhdCisKKyAgICAgICAgc2VsZiA9IGNscyh1dCwgdGkpCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tbmFtZShjbHMsIG5hbWUpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGNscy56b25lcm9vdCwgbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CisgICAgICAgICAgICByZXR1cm4gY2xzLmZyb21maWxlKGYpCisKKyAgICBFUE9DSE9SRElOQUwgPSBkYXRlKDE5NzAsIDEsIDEpLnRvb3JkaW5hbCgpCisKKyAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6CisgICAgICAgICIiImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLiIiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGR0LCBkYXRldGltZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImZyb211dGMoKSByZXF1aXJlcyBhIGRhdGV0aW1lIGFyZ3VtZW50IikKKyAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZHQudHppbmZvIGlzIG5vdCBzZWxmIikKKworICAgICAgICB0aW1lc3RhbXAgPSAoKGR0LnRvb3JkaW5hbCgpIC0gc2VsZi5FUE9DSE9SRElOQUwpICogODY0MDAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQuaG91ciAqIDM2MDAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQubWludXRlICogNjAKKyAgICAgICAgICAgICAgICAgICAgICsgZHQuc2Vjb25kKQorCisgICAgICAgIGlmIHRpbWVzdGFtcCA8IHNlbGYudXRbMV06CisgICAgICAgICAgICB0dGkgPSBzZWxmLnRpWzBdCisgICAgICAgICAgICBmb2xkID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWR4ID0gYmlzZWN0LmJpc2VjdF9yaWdodChzZWxmLnV0LCB0aW1lc3RhbXApCisgICAgICAgICAgICBhc3NlcnQgc2VsZi51dFtpZHgtMV0gPD0gdGltZXN0YW1wCisgICAgICAgICAgICBhc3NlcnQgaWR4ID09IGxlbihzZWxmLnV0KSBvciB0aW1lc3RhbXAgPCBzZWxmLnV0W2lkeF0KKyAgICAgICAgICAgIHR0aV9wcmV2LCB0dGkgPSBzZWxmLnRpW2lkeC0yOmlkeF0KKyAgICAgICAgICAgICMgRGV0ZWN0IGZvbGQKKyAgICAgICAgICAgIHNoaWZ0ID0gdHRpX3ByZXZbMF0gLSB0dGlbMF0KKyAgICAgICAgICAgIGZvbGQgPSAoc2hpZnQgPiB0aW1lZGVsdGEoMCwgdGltZXN0YW1wIC0gc2VsZi51dFtpZHgtMV0pKQorICAgICAgICBkdCArPSB0dGlbMF0KKyAgICAgICAgaWYgZm9sZDoKKyAgICAgICAgICAgIHJldHVybiBkdC5yZXBsYWNlKGZvbGQ9MSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBkdAorCisgICAgZGVmIF9maW5kX3RpKHNlbGYsIGR0LCBpKToKKyAgICAgICAgdGltZXN0YW1wID0gKChkdC50b29yZGluYWwoKSAtIHNlbGYuRVBPQ0hPUkRJTkFMKSAqIDg2NDAwCisgICAgICAgICAgICAgKyBkdC5ob3VyICogMzYwMAorICAgICAgICAgICAgICsgZHQubWludXRlICogNjAKKyAgICAgICAgICAgICArIGR0LnNlY29uZCkKKyAgICAgICAgbHQgPSBzZWxmLmx0W2R0LmZvbGRdCisgICAgICAgIGlkeCA9IGJpc2VjdC5iaXNlY3RfcmlnaHQobHQsIHRpbWVzdGFtcCkKKworICAgICAgICByZXR1cm4gc2VsZi50aVttYXgoMCwgaWR4IC0gMSldW2ldCisKKyAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfdGkoZHQsIDApCisKKyAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgaXNkc3QgPSBzZWxmLl9maW5kX3RpKGR0LCAxKQorICAgICAgICAjIFhYWDogV2UgY2Fubm90IGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHRoZSAic2F2ZSIgdmFsdWUsCisgICAgICAgICMgc28gbGV0J3MgcmV0dXJuIDFoIHdoZW5ldmVyIERTVCBpcyBpbiBlZmZlY3QuICBTaW5jZQorICAgICAgICAjIHdlIGRvbid0IHVzZSBkc3QoKSBpbiBmcm9tdXRjKCksIGl0IGlzIHVubGlrZWx5IHRoYXQKKyAgICAgICAgIyBpdCB3aWxsIGJlIG5lZWRlZCBmb3IgYW55dGhpbmcgbW9yZSB0aGFuIGJvb2woZHN0KCkpLgorICAgICAgICByZXR1cm4gWkVSTyBpZiBpc2RzdCBlbHNlIEhPVVIKKworICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF90aShkdCwgMikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB6b25lbmFtZXMoY2xzLCB6b25lZGlyPU5vbmUpOgorICAgICAgICBpZiB6b25lZGlyIGlzIE5vbmU6CisgICAgICAgICAgICB6b25lZGlyID0gY2xzLnpvbmVyb290CisgICAgICAgIHpvbmVfdGFiID0gb3MucGF0aC5qb2luKHpvbmVkaXIsICd6b25lLnRhYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHpvbmVfdGFiKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUuc3BsaXQoKVsyXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN0YXRzKGNscywgc3RhcnRfeWVhcj0xKToKKyAgICAgICAgY291bnQgPSBnYXBfY291bnQgPSBmb2xkX2NvdW50ID0gemVyb3NfY291bnQgPSAwCisgICAgICAgIG1pbl9nYXAgPSBtaW5fZm9sZCA9IHRpbWVkZWx0YS5tYXgKKyAgICAgICAgbWF4X2dhcCA9IG1heF9mb2xkID0gWkVSTworICAgICAgICBtaW5fZ2FwX2RhdGV0aW1lID0gbWF4X2dhcF9kYXRldGltZSA9IGRhdGV0aW1lLm1pbgorICAgICAgICBtaW5fZ2FwX3pvbmUgPSBtYXhfZ2FwX3pvbmUgPSBOb25lCisgICAgICAgIG1pbl9mb2xkX2RhdGV0aW1lID0gbWF4X2ZvbGRfZGF0ZXRpbWUgPSBkYXRldGltZS5taW4KKyAgICAgICAgbWluX2ZvbGRfem9uZSA9IG1heF9mb2xkX3pvbmUgPSBOb25lCisgICAgICAgIHN0YXRzX3NpbmNlID0gZGF0ZXRpbWUoc3RhcnRfeWVhciwgMSwgMSkgIyBTdGFydGluZyBmcm9tIDE5NzAgZWxpbWluYXRlcyBhIGxvdCBvZiBub2lzZQorICAgICAgICBmb3Igem9uZW5hbWUgaW4gY2xzLnpvbmVuYW1lcygpOgorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgdHogPSBjbHMuZnJvbW5hbWUoem9uZW5hbWUpCisgICAgICAgICAgICBmb3IgZHQsIHNoaWZ0IGluIHR6LnRyYW5zaXRpb25zKCk6CisgICAgICAgICAgICAgICAgaWYgZHQgPCBzdGF0c19zaW5jZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBzaGlmdCA+IFpFUk86CisgICAgICAgICAgICAgICAgICAgIGdhcF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZHQpID4gKG1heF9nYXAsIG1heF9nYXBfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2dhcCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZ2FwX3pvbmUgPSB6b25lbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2dhcF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZGF0ZXRpbWUubWF4IC0gZHQpIDwgKG1pbl9nYXAsIGRhdGV0aW1lLm1heCAtIG1pbl9nYXBfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2dhcCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZ2FwX3pvbmUgPSB6b25lbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2dhcF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgZWxpZiBzaGlmdCA8IFpFUk86CisgICAgICAgICAgICAgICAgICAgIGZvbGRfY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IC1zaGlmdAorICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQsIGR0KSA+IChtYXhfZm9sZCwgbWF4X2ZvbGRfZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZvbGQgPSBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZvbGRfem9uZSA9IHpvbmVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZm9sZF9kYXRldGltZSA9IGR0CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCwgZGF0ZXRpbWUubWF4IC0gZHQpIDwgKG1pbl9mb2xkLCBkYXRldGltZS5tYXggLSBtaW5fZm9sZF9kYXRldGltZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZm9sZCA9IHNoaWZ0CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZm9sZF96b25lID0gem9uZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9mb2xkX2RhdGV0aW1lID0gZHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB6ZXJvc19jb3VudCArPSAxCisgICAgICAgIHRyYW5zX2NvdW50cyA9IChnYXBfY291bnQsIGZvbGRfY291bnQsIHplcm9zX2NvdW50KQorICAgICAgICBwcmludCgiTnVtYmVyIG9mIHpvbmVzOiAgICAgICAlNWQiICUgY291bnQpCisgICAgICAgIHByaW50KCJOdW1iZXIgb2YgdHJhbnNpdGlvbnM6ICU1ZCA9ICVkIChnYXBzKSArICVkIChmb2xkcykgKyAlZCAoemVyb3MpIiAlCisgICAgICAgICAgICAgICgoc3VtKHRyYW5zX2NvdW50cyksKSArIHRyYW5zX2NvdW50cykpCisgICAgICAgIHByaW50KCJNaW4gZ2FwOiAgICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1pbl9nYXAsIG1pbl9nYXBfZGF0ZXRpbWUsIG1pbl9nYXBfem9uZSkpCisgICAgICAgIHByaW50KCJNYXggZ2FwOiAgICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1heF9nYXAsIG1heF9nYXBfZGF0ZXRpbWUsIG1heF9nYXBfem9uZSkpCisgICAgICAgIHByaW50KCJNaW4gZm9sZDogICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1pbl9mb2xkLCBtaW5fZm9sZF9kYXRldGltZSwgbWluX2ZvbGRfem9uZSkpCisgICAgICAgIHByaW50KCJNYXggZm9sZDogICAgICAgICUxNnMgYXQgJXMgaW4gJXMiICUgKG1heF9mb2xkLCBtYXhfZm9sZF9kYXRldGltZSwgbWF4X2ZvbGRfem9uZSkpCisKKworICAgIGRlZiB0cmFuc2l0aW9ucyhzZWxmKToKKyAgICAgICAgZm9yIChfLCBwcmV2X3RpKSwgKHQsIHRpKSBpbiBwYWlycyh6aXAoc2VsZi51dCwgc2VsZi50aSkpOgorICAgICAgICAgICAgc2hpZnQgPSB0aVswXSAtIHByZXZfdGlbMF0KKyAgICAgICAgICAgIHlpZWxkIGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodCksIHNoaWZ0CisKKyAgICBkZWYgbm9uZHN0X2ZvbGRzKHNlbGYpOgorICAgICAgICAiIiJGaW5kIGFsbCBmb2xkcyB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIGlzZHN0IG9uIGJvdGggc2lkZXMgb2YgdGhlIHRyYW5zaXRpb24uIiIiCisgICAgICAgIGZvciAoXywgcHJldl90aSksICh0LCB0aSkgaW4gcGFpcnMoemlwKHNlbGYudXQsIHNlbGYudGkpKToKKyAgICAgICAgICAgIHNoaWZ0ID0gdGlbMF0gLSBwcmV2X3RpWzBdCisgICAgICAgICAgICBpZiBzaGlmdCA8IFpFUk8gYW5kIHRpWzFdID09IHByZXZfdGlbMV06CisgICAgICAgICAgICAgICAgeWllbGQgZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCh0KSwgLXNoaWZ0LCBwcmV2X3RpWzJdLCB0aVsyXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHByaW50X2FsbF9ub25kc3RfZm9sZHMoY2xzLCBzYW1lX2FiYnI9RmFsc2UsIHN0YXJ0X3llYXI9MSk6CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3Igem9uZW5hbWUgaW4gY2xzLnpvbmVuYW1lcygpOgorICAgICAgICAgICAgdHogPSBjbHMuZnJvbW5hbWUoem9uZW5hbWUpCisgICAgICAgICAgICBmb3IgZHQsIHNoaWZ0LCBwcmV2X2FiYnIsIGFiYnIgaW4gdHoubm9uZHN0X2ZvbGRzKCk6CisgICAgICAgICAgICAgICAgaWYgZHQueWVhciA8IHN0YXJ0X3llYXIgb3Igc2FtZV9hYmJyIGFuZCBwcmV2X2FiYnIgIT0gYWJicjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgcHJpbnQoIiUzZCkgJS0zMHMgJXMgJTEwcyAlNXMgLT4gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAoY291bnQsIHpvbmVuYW1lLCBkdCwgc2hpZnQsIHByZXZfYWJiciwgYWJicikpCisKKyAgICBkZWYgZm9sZHMoc2VsZik6CisgICAgICAgIGZvciB0LCBzaGlmdCBpbiBzZWxmLnRyYW5zaXRpb25zKCk6CisgICAgICAgICAgICBpZiBzaGlmdCA8IFpFUk86CisgICAgICAgICAgICAgICAgeWllbGQgdCwgLXNoaWZ0CisKKyAgICBkZWYgZ2FwcyhzZWxmKToKKyAgICAgICAgZm9yIHQsIHNoaWZ0IGluIHNlbGYudHJhbnNpdGlvbnMoKToKKyAgICAgICAgICAgIGlmIHNoaWZ0ID4gWkVSTzoKKyAgICAgICAgICAgICAgICB5aWVsZCB0LCBzaGlmdAorCisgICAgZGVmIHplcm9zKHNlbGYpOgorICAgICAgICBmb3IgdCwgc2hpZnQgaW4gc2VsZi50cmFuc2l0aW9ucygpOgorICAgICAgICAgICAgaWYgbm90IHNoaWZ0OgorICAgICAgICAgICAgICAgIHlpZWxkIHQKKworCitjbGFzcyBab25lSW5mb1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHpvbmVuYW1lID0gJ0FtZXJpY2EvTmV3X1lvcmsnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgem9uZWluZm8gdGVzdHMgb24gV2luZG93cyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHogPSBab25lSW5mby5mcm9tbmFtZShzZWxmLnpvbmVuYW1lKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgJXM6ICVzIiAlIChzZWxmLnpvbmVuYW1lLCBlcnIpKQorCisgICAgZGVmIGFzc2VydEVxdWl2RGF0ZXRpbWVzKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLnJlcGxhY2UodHppbmZvPU5vbmUpLCBhLmZvbGQsIGlkKGEudHppbmZvKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGIucmVwbGFjZSh0emluZm89Tm9uZSksIGIuZm9sZCwgaWQoYi50emluZm8pKSkKKworICAgIGRlZiB0ZXN0X2ZvbGRzKHNlbGYpOgorICAgICAgICB0eiA9IHNlbGYudHoKKyAgICAgICAgZm9yIGR0LCBzaGlmdCBpbiB0ei5mb2xkcygpOgorICAgICAgICAgICAgZm9yIHggaW4gWzAgKiBzaGlmdCwgMC41ICogc2hpZnQsIHNoaWZ0IC0gdGltZWRlbHRhLnJlc29sdXRpb25dOgorICAgICAgICAgICAgICAgIHVkdCA9IGR0ICsgeAorICAgICAgICAgICAgICAgIGxkdCA9IHR6LmZyb211dGModWR0LnJlcGxhY2UodHppbmZvPXR6KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5mb2xkLCAxKQorICAgICAgICAgICAgICAgIGFkdCA9IHVkdC5yZXBsYWNlKHR6aW5mbz10aW1lem9uZS51dGMpLmFzdGltZXpvbmUodHopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVpdkRhdGV0aW1lcyhhZHQsIGxkdCkKKyAgICAgICAgICAgICAgICB1dGNvZmZzZXQgPSBsZHQudXRjb2Zmc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSwgdWR0ICsgdXRjb2Zmc2V0KQorICAgICAgICAgICAgICAgICMgUm91bmQgdHJpcAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1aXZEYXRldGltZXMobGR0LmFzdGltZXpvbmUodGltZXpvbmUudXRjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkdC5yZXBsYWNlKHR6aW5mbz10aW1lem9uZS51dGMpKQorCisKKyAgICAgICAgICAgIGZvciB4IGluIFstdGltZWRlbHRhLnJlc29sdXRpb24sIHNoaWZ0XToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICB1ZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dHopCisgICAgICAgICAgICAgICAgbGR0ID0gdHouZnJvbXV0Yyh1ZHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKworICAgIGRlZiB0ZXN0X2dhcHMoc2VsZik6CisgICAgICAgIHR6ID0gc2VsZi50egorICAgICAgICBmb3IgZHQsIHNoaWZ0IGluIHR6LmdhcHMoKToKKyAgICAgICAgICAgIGZvciB4IGluIFswICogc2hpZnQsIDAuNSAqIHNoaWZ0LCBzaGlmdCAtIHRpbWVkZWx0YS5yZXNvbHV0aW9uXToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICB1ZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dHopCisgICAgICAgICAgICAgICAgbGR0ID0gdHouZnJvbXV0Yyh1ZHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKyAgICAgICAgICAgICAgICBhZHQgPSB1ZHQucmVwbGFjZSh0emluZm89dGltZXpvbmUudXRjKS5hc3RpbWV6b25lKHR6KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1aXZEYXRldGltZXMoYWR0LCBsZHQpCisgICAgICAgICAgICAgICAgdXRjb2Zmc2V0ID0gbGR0LnV0Y29mZnNldCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQucmVwbGFjZSh0emluZm89Tm9uZSksIHVkdC5yZXBsYWNlKHR6aW5mbz1Ob25lKSArIHV0Y29mZnNldCkKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIGxvY2FsIHRpbWUgaW5zaWRlIHRoZSBnYXAKKyAgICAgICAgICAgICAgICBsZHQgPSB0ei5mcm9tdXRjKGR0LnJlcGxhY2UodHppbmZvPXR6KSkgLSBzaGlmdCArIHgKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MobGR0LnJlcGxhY2UoZm9sZD0xKS51dGNvZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGR0LnJlcGxhY2UoZm9sZD0wKS51dGNvZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0ICVzLiIgJSBsZHQpCisKKyAgICAgICAgICAgIGZvciB4IGluIFstdGltZWRlbHRhLnJlc29sdXRpb24sIHNoaWZ0XToKKyAgICAgICAgICAgICAgICB1ZHQgPSBkdCArIHgKKyAgICAgICAgICAgICAgICBsZHQgPSB0ei5mcm9tdXRjKHVkdC5yZXBsYWNlKHR6aW5mbz10eikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZHQuZm9sZCwgMCkKKworICAgIGRlZiB0ZXN0X3N5c3RlbV90cmFuc2l0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgKCdSaXlhZGg4JyBpbiBzZWxmLnpvbmVuYW1lIG9yCisgICAgICAgICAgICAjIEZyb20gdHpkYXRhIE5FV1MgZmlsZToKKyAgICAgICAgICAgICMgVGhlIGZpbGVzIHNvbGFyODcsIHNvbGFyODgsIGFuZCBzb2xhcjg5IGFyZSBubyBsb25nZXIgZGlzdHJpYnV0ZWQuCisgICAgICAgICAgICAjIFRoZXkgd2VyZSBhIG5lZ2F0aXZlIGV4cGVyaW1lbnQgLSB0aGF0IGlzLCBhIGRlbW9uc3RyYXRpb24gdGhhdAorICAgICAgICAgICAgIyB0eiBkYXRhIGNhbiByZXByZXNlbnQgc29sYXIgdGltZSBvbmx5IHdpdGggc29tZSBkaWZmaWN1bHR5IGFuZCBlcnJvci4KKyAgICAgICAgICAgICMgVGhlaXIgcHJlc2VuY2UgaW4gdGhlIGRpc3RyaWJ1dGlvbiBjYXVzZWQgY29uZnVzaW9uLCBhcyBSaXlhZGgKKyAgICAgICAgICAgICMgY2l2aWwgdGltZSB3YXMgZ2VuZXJhbGx5IG5vdCBzb2xhciB0aW1lIGluIHRob3NlIHllYXJzLgorICAgICAgICAgICAgICAgIHNlbGYuem9uZW5hbWUuc3RhcnRzd2l0aCgncmlnaHQvJykpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgJXMiICUgc2VsZi56b25lbmFtZSkKKyAgICAgICAgdHogPSBzZWxmLnR6CisgICAgICAgIFRaID0gb3MuZW52aXJvbi5nZXQoJ1RaJykKKyAgICAgICAgb3MuZW52aXJvblsnVFonXSA9IHNlbGYuem9uZW5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3RpbWUudHpzZXQoKQorICAgICAgICAgICAgZm9yIHVkdCwgc2hpZnQgaW4gdHoudHJhbnNpdGlvbnMoKToKKyAgICAgICAgICAgICAgICBpZiB1ZHQueWVhciA+PSAyMDM3OgorICAgICAgICAgICAgICAgICAgICAjIFN5c3RlbSBzdXBwb3J0IGZvciB0aW1lcyBhcm91bmQgdGhlIGVuZCBvZiAzMi1iaXQgdGltZV90CisgICAgICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGlzIGZsYWt5IG9uIG1hbnkgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzMCA9ICh1ZHQgLSBkYXRldGltZSgxOTcwLCAxLCAxKSkgLy8gU0VDCisgICAgICAgICAgICAgICAgc3MgPSBzaGlmdCAvLyBTRUMgICAjIHNoaWZ0IHNlY29uZHMKKyAgICAgICAgICAgICAgICBmb3IgeCBpbiBbLTQwICogMzYwMCwgLTIwKjM2MDAsIC0xLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcyAtIDEsIHNzICsgMjAgKiAzNjAwLCBzcyArIDQwICogMzYwMF06CisgICAgICAgICAgICAgICAgICAgIHMgPSBzMCArIHgKKyAgICAgICAgICAgICAgICAgICAgc2R0ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzKQorICAgICAgICAgICAgICAgICAgICB0emR0ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcChzLCB0eikucmVwbGFjZSh0emluZm89Tm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVpdkRhdGV0aW1lcyhzZHQsIHR6ZHQpCisgICAgICAgICAgICAgICAgICAgIHMxID0gc2R0LnRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgczEpCisgICAgICAgICAgICAgICAgaWYgc3MgPiAwOiAgIyBnYXAKKyAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgbG9jYWwgdGltZSBpbnNpZGUgdGhlIGdhcAorICAgICAgICAgICAgICAgICAgICBkdCA9IGRhdGV0aW1lLmZyb210aW1lc3RhbXAoczApIC0gc2hpZnQgLyAyCisgICAgICAgICAgICAgICAgICAgIHRzMCA9IGR0LnRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgIHRzMSA9IGR0LnJlcGxhY2UoZm9sZD0xKS50aW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMCwgczAgKyBzcyAvIDIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMxLCBzMCAtIHNzIC8gMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIFRaIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ1RaJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnVFonXSA9IFRaCisgICAgICAgICAgICBfdGltZS50enNldCgpCisKKworY2xhc3MgWm9uZUluZm9Db21wbGV0ZVRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgndHpkYXRhJyk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBab25lSW5mby56b25lbmFtZXMoKToKKyAgICAgICAgICAgICAgICBUZXN0ID0gdHlwZSgnWm9uZUluZm9UZXN0WyVzXScgJSBuYW1lLCAoWm9uZUluZm9UZXN0LCksIHt9KQorICAgICAgICAgICAgICAgIFRlc3Quem9uZW5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgZm9yIG1ldGhvZCBpbiBkaXIoVGVzdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZC5zdGFydHN3aXRoKCd0ZXN0XycpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3QobWV0aG9kKSkKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyh0ZXN0cykKKworIyBJcmFuIGhhZCBhIHN1Yi1taW51dGUgVVRDIG9mZnNldCBiZWZvcmUgMTk0Ni4KK2NsYXNzIElyYW5UZXN0KFpvbmVJbmZvVGVzdCk6CisgICAgem9uZW5hbWUgPSAnQXNpYS9UZWhyYW4nCisKK2RlZiBsb2FkX3Rlc3RzKGxvYWRlciwgc3RhbmRhcmRfdGVzdHMsIHBhdHRlcm4pOgorICAgIHN0YW5kYXJkX3Rlc3RzLmFkZFRlc3QoWm9uZUluZm9Db21wbGV0ZVRlc3QoKSkKKyAgICByZXR1cm4gc3RhbmRhcmRfdGVzdHMKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weSBiL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKaW5kZXggZTNmMWFhNS4uNGZjNzliMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQorKysgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CkBAIC05LDcgKzksNyBAQAogIiIiCiAKIGltcG9ydCBjb250ZXh0bGliCi1pbXBvcnQgaW8KK2ltcG9ydCBmYXVsdGhhbmRsZXIKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNpZ25hbApAQCAtNTAsNiArNTAsMTAgQEAKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIGNscy5zaWduYWxfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnNpZ25hbF9wZXJpb2QpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjUyNzc6IFVzZSBmYXVsdGhhbmRsZXIgdG8gdHJ5IHRvIGRlYnVnIGEgaGFuZyBvbiBGcmVlQlNECisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigxMCAqIDYwLCBleGl0PVRydWUpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc3RvcF9hbGFybShjbHMpOgogICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNpZ25hbC5JVElNRVJfUkVBTCwgMCwgMCkKQEAgLTU4LDYgKzYyLDggQEAKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgogICAgICAgICBjbHMuc3RvcF9hbGFybSgpCiAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNscy5vcmlnX2hhbmRsZXIpCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKIAogICAgIGRlZiBzdWJwcm9jZXNzKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgY21kX2FyZ3MgPSAoc3lzLmV4ZWN1dGFibGUsICctYycpICsgYXJncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmEwZTZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSw1IEBACisjIFdlIGltcG9ydCBpbXBvcnRsaWIgKkFTQVAqIGluIG9yZGVyIHRvIHRlc3QgIzE1Mzg2CitpbXBvcnQgaW1wb3J0bGliCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5jbWRsaW5lIGltcG9ydCBfcGFyc2VfYXJncywgUkVTT1VSQ0VfTkFNRVMKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5tYWluIGltcG9ydCBtYWluCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9jbWRsaW5lLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdhYWVkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpAQCAtMCwwICsxLDM0NCBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK1VTQUdFID0gIiIiXAorcHl0aG9uIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCitweXRob24gcGF0aC90by9MaWIvdGVzdC9yZWdydGVzdC5weSBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KKyIiIgorCitERVNDUklQVElPTiA9ICIiIlwKK1J1biBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy4KKworSWYgbm8gYXJndW1lbnRzIG9yIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBmaW5kcyBhbGwgZmlsZXMgbWF0Y2hpbmcKK3RoZSBwYXR0ZXJuICJ0ZXN0XyoiIGluIHRoZSBMaWIvdGVzdCBzdWJkaXJlY3RvcnkgYW5kIHJ1bnMKK3RoZW0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyIChidXQgc2VlIC1NIGFuZCAtdSwgYmVsb3csIGZvciBleGNlcHRpb25zKS4KKworRm9yIG1vcmUgcmlnb3JvdXMgdGVzdGluZywgaXQgaXMgdXNlZnVsIHRvIHVzZSB0aGUgZm9sbG93aW5nCitjb21tYW5kIGxpbmU6CisKK3B5dGhvbiAtRSAtV2QgLW0gdGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgLi4uXQorIiIiCisKK0VQSUxPRyA9ICIiIlwKK0FkZGl0aW9uYWwgb3B0aW9uIGRldGFpbHM6CisKKy1yIHJhbmRvbWl6ZXMgdGVzdCBleGVjdXRpb24gb3JkZXIuIFlvdSBjYW4gdXNlIC0tcmFuZHNlZWQ9aW50IHRvIHByb3ZpZGUgYW4KK2ludCBzZWVkIHZhbHVlIGZvciB0aGUgcmFuZG9taXplcjsgdGhpcyBpcyB1c2VmdWwgZm9yIHJlcHJvZHVjaW5nIHRyb3VibGVzb21lCit0ZXN0IG9yZGVycy4KKworLXMgT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcmVncnRlc3QgdXNpbmcgLXMsIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZm91bmQKK29yIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBpcyBydW4sIGFuZCB0aGUgbmFtZSBvZgordGhlIG5leHQgdGVzdCBpcyByZWNvcmRlZCBpbiBhIGZpbGUgbmFtZWQgcHluZXh0dGVzdC4gIElmIHJ1biBmcm9tIHRoZQorUHl0aG9uIGJ1aWxkIGRpcmVjdG9yeSwgcHluZXh0dGVzdCBpcyBsb2NhdGVkIGluIHRoZSAnYnVpbGQnIHN1YmRpcmVjdG9yeSwKK290aGVyd2lzZSBpdCBpcyBsb2NhdGVkIGluIHRlbXBmaWxlLmdldHRlbXBkaXIoKS4gIE9uIHN1YnNlcXVlbnQgcnVucywKK3RoZSB0ZXN0IGluIHB5bmV4dHRlc3QgaXMgcnVuLCBhbmQgdGhlIG5leHQgdGVzdCBpcyB3cml0dGVuIHRvIHB5bmV4dHRlc3QuCitXaGVuIHRoZSBsYXN0IHRlc3QgaGFzIGJlZW4gcnVuLCBweW5leHR0ZXN0IGlzIGRlbGV0ZWQuICBJbiB0aGlzIHdheSBpdAoraXMgcG9zc2libGUgdG8gc2luZ2xlIHN0ZXAgdGhyb3VnaCB0aGUgdGVzdCBmaWxlcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4KK2RvaW5nIG1lbW9yeSBhbmFseXNpcyBvbiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3aGljaCBwcm9jZXNzIHRlbmRzIHRvCitjb25zdW1lIHRvbyBtYW55IHJlc291cmNlcyB0byBydW4gdGhlIGZ1bGwgcmVncmVzc2lvbiB0ZXN0IG5vbi1zdG9wLgorCistUyBpcyB1c2VkIHRvIGNvbnRpbnVlIHJ1bm5pbmcgdGVzdHMgYWZ0ZXIgYW4gYWJvcnRlZCBydW4uICBJdCB3aWxsCittYWludGFpbiB0aGUgb3JkZXIgYSBzdGFuZGFyZCBydW4gKGllLCB0aGlzIGFzc3VtZXMgLXIgaXMgbm90IHVzZWQpLgorVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgdGhlIHRlc3RzIGhhdmUgcHJlbWF0dXJlbHkgc3RvcHBlZCBmb3Igc29tZSBleHRlcm5hbAorcmVhc29uIGFuZCB5b3Ugd2FudCB0byBzdGFydCBydW5uaW5nIGZyb20gd2hlcmUgeW91IGxlZnQgb2ZmIHJhdGhlcgordGhhbiBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuCisKKy1mIHJlYWRzIHRoZSBuYW1lcyBvZiB0ZXN0cyBmcm9tIHRoZSBmaWxlIGdpdmVuIGFzIGYncyBhcmd1bWVudCwgb25lCitvciBtb3JlIHRlc3QgbmFtZXMgcGVyIGxpbmUuICBXaGl0ZXNwYWNlIGlzIGlnbm9yZWQuICBCbGFuayBsaW5lcyBhbmQKK2xpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yCit3aGl0dGxpbmcgZG93biBmYWlsdXJlcyBpbnZvbHZpbmcgaW50ZXJhY3Rpb25zIGFtb25nIHRlc3RzLgorCistTCBjYXVzZXMgdGhlIGxlYWtzKDEpIGNvbW1hbmQgdG8gYmUgcnVuIGp1c3QgYmVmb3JlIGV4aXQgaWYgaXQgZXhpc3RzLgorbGVha3MoMSkgaXMgYXZhaWxhYmxlIG9uIE1hYyBPUyBYIGFuZCBwcmVzdW1hYmx5IG9uIHNvbWUgb3RoZXIKK0ZyZWVCU0QtZGVyaXZlZCBzeXN0ZW1zLgorCistUiBydW5zIGVhY2ggdGVzdCBzZXZlcmFsIHRpbWVzIGFuZCBleGFtaW5lcyBzeXMuZ2V0dG90YWxyZWZjb3VudCgpIHRvCitzZWUgaWYgdGhlIHRlc3QgYXBwZWFycyB0byBiZSBsZWFraW5nIHJlZmVyZW5jZXMuICBUaGUgYXJndW1lbnQgc2hvdWxkCitiZSBvZiB0aGUgZm9ybSBzdGFiOnJ1bjpmbmFtZSB3aGVyZSAnc3RhYicgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKK3Rlc3QgaXMgcnVuIHRvIGxldCBnZXR0b3RhbHJlZmNvdW50IHNldHRsZSBkb3duLCAncnVuJyBpcyB0aGUgbnVtYmVyCitvZiB0aW1lcyBmdXJ0aGVyIGl0IGlzIHJ1biBhbmQgJ2ZuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUKK3JlcG9ydHMgYXJlIHdyaXR0ZW4gdG8uICBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBoYXZlIGRlZmF1bHRzICg1LCA0IGFuZAorInJlZmxvZy50eHQiIHJlc3BlY3RpdmVseSksIGFuZCB0aGUgbWluaW1hbCBpbnZvY2F0aW9uIGlzICctUiA6Jy4KKworLU0gcnVucyB0ZXN0cyB0aGF0IHJlcXVpcmUgYW4gZXhvcmJpdGFudCBhbW91bnQgb2YgbWVtb3J5LiBUaGVzZSB0ZXN0cwordHlwaWNhbGx5IHRyeSB0byBhc2NlcnRhaW4gY29udGFpbmVycyBrZWVwIHdvcmtpbmcgd2hlbiBjb250YWluaW5nIG1vcmUgdGhhbgorMiBiaWxsaW9uIG9iamVjdHMsIHdoaWNoIG9ubHkgd29ya3Mgb24gNjQtYml0IHN5c3RlbXMuIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3Rlc3RzIHRoYXQgdHJ5IHRvIGV4aGF1c3QgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MsIHdoaWNoIG9ubHkgbWFrZXMKK3NlbnNlIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGggYXQgbGVhc3QgMkdiIG9mIG1lbW9yeS4gVGhlIHBhc3NlZC1pbiBtZW1saW1pdCwKK3doaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mICcyLjVHYicsIGRldGVybWluZXMgaG93bXVjaCBtZW1vcnkgdGhlCit0ZXN0cyB3aWxsIGxpbWl0IHRoZW1zZWx2ZXMgdG8gKGJ1dCB0aGV5IG1heSBnbyBzbGlnaHRseSBvdmVyLikgVGhlIG51bWJlcgorc2hvdWxkbid0IGJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIG1hY2hpbmUgaGFzIChpbmNsdWRpbmcgc3dhcCBtZW1vcnkpLiBZb3UKK3Nob3VsZCBhbHNvIGtlZXAgaW4gbWluZCB0aGF0IHN3YXAgbWVtb3J5IGlzIGdlbmVyYWxseSBtdWNoLCBtdWNoIHNsb3dlcgordGhhbiBSQU0sIGFuZCBzZXR0aW5nIG1lbWxpbWl0IHRvIGFsbCBhdmFpbGFibGUgUkFNIG9yIGhpZ2hlciB3aWxsIGhlYXZpbHkKK3RheCB0aGUgbWFjaGluZS4gT24gdGhlIG90aGVyIGhhbmQsIGl0IGlzIG5vIHVzZSBydW5uaW5nIHRoZXNlIHRlc3RzIHdpdGggYQorbGltaXQgb2YgbGVzcyB0aGFuIDIuNUdiLCBhbmQgbWFueSByZXF1aXJlIG1vcmUgdGhhbiAyMEdiLiBUZXN0cyB0aGF0IGV4cGVjdAordG8gdXNlIG1vcmUgdGhhbiBtZW1saW1pdCBtZW1vcnkgd2lsbCBiZSBza2lwcGVkLiBUaGUgYmlnLW1lbW9yeSB0ZXN0cworZ2VuZXJhbGx5IHJ1biB2ZXJ5LCB2ZXJ5IGxvbmcuCisKKy11IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyB0byBydW4sCitzdWNoIGFzIHRob3NlIHJlcXVpcmluZyBsYXJnZSBmaWxlIHN1cHBvcnQgb3IgbmV0d29yayBjb25uZWN0aXZpdHkuCitUaGUgYXJndW1lbnQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JkcyBpbmRpY2F0aW5nIHRoZQorcmVzb3VyY2VzIHRvIHRlc3QuICBDdXJyZW50bHkgb25seSB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkOgorCisgICAgYWxsIC0gICAgICAgRW5hYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcy4KKworICAgIG5vbmUgLSAgICAgIERpc2FibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KKworICAgIGF1ZGlvIC0gICAgIFRlc3RzIHRoYXQgdXNlIHRoZSBhdWRpbyBkZXZpY2UuICAoVGhlcmUgYXJlIGtub3duCisgICAgICAgICAgICAgICAgY2FzZXMgb2YgYnJva2VuIGF1ZGlvIGRyaXZlcnMgdGhhdCBjYW4gY3Jhc2ggUHl0aG9uIG9yCisgICAgICAgICAgICAgICAgZXZlbiB0aGUgTGludXgga2VybmVsLikKKworICAgIGN1cnNlcyAtICAgIFRlc3RzIHRoYXQgdXNlIGN1cnNlcyBhbmQgd2lsbCBtb2RpZnkgdGhlIHRlcm1pbmFsJ3MKKyAgICAgICAgICAgICAgICBzdGF0ZSBhbmQgb3V0cHV0IG1vZGVzLgorCisgICAgbGFyZ2VmaWxlIC0gSXQgaXMgb2theSB0byBydW4gc29tZSB0ZXN0IHRoYXQgbWF5IGNyZWF0ZSBodWdlCisgICAgICAgICAgICAgICAgZmlsZXMuICBUaGVzZSB0ZXN0cyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgbWF5CisgICAgICAgICAgICAgICAgY29uc3VtZSA+MkdCIG9mIGRpc2sgc3BhY2UgdGVtcG9yYXJpbHkuCisKKyAgICBuZXR3b3JrIC0gICBJdCBpcyBva2F5IHRvIHJ1biB0ZXN0cyB0aGF0IHVzZSBleHRlcm5hbCBuZXR3b3JrCisgICAgICAgICAgICAgICAgcmVzb3VyY2UsIGUuZy4gdGVzdGluZyBTU0wgc3VwcG9ydCBmb3Igc29ja2V0cy4KKworICAgIGRlY2ltYWwgLSAgIFRlc3QgdGhlIGRlY2ltYWwgbW9kdWxlIGFnYWluc3QgYSBsYXJnZSBzdWl0ZSB0aGF0CisgICAgICAgICAgICAgICAgdmVyaWZpZXMgY29tcGxpYW5jZSB3aXRoIHN0YW5kYXJkcy4KKworICAgIGNwdSAtICAgICAgIFVzZWQgZm9yIGNlcnRhaW4gQ1BVLWhlYXZ5IHRlc3RzLgorCisgICAgc3VicHJvY2VzcyAgUnVuIGFsbCB0ZXN0cyBmb3IgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLgorCisgICAgdXJsZmV0Y2ggLSAgSXQgaXMgb2theSB0byBkb3dubG9hZCBmaWxlcyByZXF1aXJlZCBvbiB0ZXN0aW5nLgorCisgICAgZ3VpIC0gICAgICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSBhIHJ1bm5pbmcgR1VJLgorCisgICAgdHpkYXRhIC0gICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSB0aW1lem9uZSBkYXRhLgorCitUbyBlbmFibGUgYWxsIHJlc291cmNlcyBleGNlcHQgb25lLCB1c2UgJy11YWxsLC08cmVzb3VyY2U+Jy4gIEZvcgorZXhhbXBsZSwgdG8gcnVuIGFsbCB0aGUgdGVzdHMgZXhjZXB0IGZvciB0aGUgZ3VpIHRlc3RzLCBnaXZlIHRoZQorb3B0aW9uICctdWFsbCwtZ3VpJy4KKyIiIgorCisKK1JFU09VUkNFX05BTUVTID0gKCdhdWRpbycsICdjdXJzZXMnLCAnbGFyZ2VmaWxlJywgJ25ldHdvcmsnLAorICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwnLCAnY3B1JywgJ3N1YnByb2Nlc3MnLCAndXJsZmV0Y2gnLCAnZ3VpJywgJ3R6ZGF0YScpCisKK2NsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQorCisKK2RlZiBfY3JlYXRlX3BhcnNlcigpOgorICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgorICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KKyAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQorCisgICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KKyAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KKyAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJworCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQorICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3dlc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tbGlzdC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgd3JpdGUgdGhlIG5hbWUgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBleGVjdXRlIHRoZW0iKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wZ28nLCBkZXN0PSdwZ28nLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdlbmFibGUgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIHRyYWluaW5nJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3MnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorCisgICAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgorICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKKyAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKKworCitkZWYgaHVudHJsZWFrcyhzdHJpbmcpOgorICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQorICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0CisgICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKKyAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCisKKworZGVmIHJlc291cmNlc19saXN0KHN0cmluZyk6CisgICAgdSA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KCcsJyldCisgICAgZm9yIHIgaW4gdToKKyAgICAgICAgaWYgciA9PSAnYWxsJyBvciByID09ICdub25lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgIGlmIHIgbm90IGluIFJFU09VUkNFX05BTUVTOgorICAgICAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoJ2ludmFsaWQgcmVzb3VyY2U6ICcgKyByKQorICAgIHJldHVybiB1CisKKworZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKKyAgICAjIERlZmF1bHRzCisgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCisgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKKyAgICAgICAgc2V0YXR0cihucywgaywgdikKKyAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQorCisgICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQorCisgICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLmZhaWxmYXN0IGFuZCBub3QgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XIikKKyAgICBpZiBucy5wZ28gYW5kIChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UyIG9yIG5zLnZlcmJvc2UzKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItLXBnby8tdiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgaWYgbnMubm93aW5kb3dzOgorICAgICAgICBwcmludCgiV2FybmluZzogdGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICAgICAgICAgIlVzZSAtdnYgdG8gZGlzcGxheSBhc3NlcnRpb25zIGluIHN0ZGVyci4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBpZiBucy5xdWlldDoKKyAgICAgICAgbnMudmVyYm9zZSA9IDAKKyAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6CisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6CisgICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAorICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQorICAgIGlmIG5zLnVzZToKKyAgICAgICAgZm9yIGEgaW4gbnMudXNlOgorICAgICAgICAgICAgZm9yIHIgaW4gYToKKyAgICAgICAgICAgICAgICBpZiByID09ICdhbGwnOgorICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzWzpdID0gUkVTT1VSQ0VfTkFNRVMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByID09ICdub25lJzoKKyAgICAgICAgICAgICAgICAgICAgZGVsIG5zLnVzZV9yZXNvdXJjZXNbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZW1vdmUgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHIgPSByWzE6XQorICAgICAgICAgICAgICAgIGlmIHJlbW92ZToKKyAgICAgICAgICAgICAgICAgICAgaWYgciBpbiBucy51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5yZW1vdmUocikKKyAgICAgICAgICAgICAgICBlbGlmIHIgbm90IGluIG5zLnVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMuYXBwZW5kKHIpCisgICAgaWYgbnMucmFuZG9tX3NlZWQgaXMgbm90IE5vbmU6CisgICAgICAgIG5zLnJhbmRvbWl6ZSA9IFRydWUKKworICAgIHJldHVybiBucwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvbWFpbi5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKQEAgLTAsMCArMSw1MjYgQEAKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCAoCisgICAgZmluZHRlc3RzLCBydW50ZXN0LAorICAgIFNURFRFU1RTLCBOT1RURVNUUywgUEFTU0VELCBGQUlMRUQsIEVOVl9DSEFOR0VELCBTS0lQUEVELCBSRVNPVVJDRV9ERU5JRUQsCisgICAgSU5URVJSVVBURUQsIENISUxEX0VSUk9SLAorICAgIFBST0dSRVNTX01JTl9USU1FLCBmb3JtYXRfdGVzdF9yZXN1bHQpCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2V0dXAgaW1wb3J0IHNldHVwX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworCisjIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCisjIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCisjIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCitpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQorZWxzZToKKyAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCisKKworZGVmIGZvcm1hdF9kdXJhdGlvbihzZWNvbmRzKToKKyAgICBpZiBzZWNvbmRzIDwgMS4wOgorICAgICAgICByZXR1cm4gJyUuMGYgbXMnICUgKHNlY29uZHMgKiAxZTMpCisgICAgaWYgc2Vjb25kcyA8IDYwLjA6CisgICAgICAgIHJldHVybiAnJS4wZiBzZWMnICUgc2Vjb25kcworCisgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MC4wKQorICAgIHJldHVybiAnJS4wZiBtaW4gJS4wZiBzZWMnICUgKG1pbnV0ZXMsIHNlY29uZHMpCisKKworY2xhc3MgUmVncnRlc3Q6CisgICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCisKKyAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKKyAgICBhY2NvcmRpbmdseS4KKworICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCisgICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKKworICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KKyAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KKworICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQorICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQorICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCisgICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAorICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKKyAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncworICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIE5hbWVzcGFjZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBzZWxmLm5zID0gTm9uZQorCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBbXQorCisgICAgICAgICMgdGVzdCByZXN1bHRzCisgICAgICAgIHNlbGYuZ29vZCA9IFtdCisgICAgICAgIHNlbGYuYmFkID0gW10KKyAgICAgICAgc2VsZi5za2lwcGVkID0gW10KKyAgICAgICAgc2VsZi5yZXNvdXJjZV9kZW5pZWRzID0gW10KKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkID0gW10KKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tc2xvdworICAgICAgICBzZWxmLnRlc3RfdGltZXMgPSBbXQorCisgICAgICAgICMgdXNlZCBieSAtLWNvdmVyYWdlLCB0cmFjZS5UcmFjZSBpbnN0YW5jZQorICAgICAgICBzZWxmLnRyYWNlciA9IE5vbmUKKworICAgICAgICAjIHVzZWQgYnkgLS1maW5kbGVha3MsIHN0b3JlIGZvciBnYy5nYXJiYWdlCisgICAgICAgIHNlbGYuZm91bmRfZ2FyYmFnZSA9IFtdCisKKyAgICAgICAgIyB1c2VkIHRvIGRpc3BsYXkgdGhlIHByb2dyZXNzIGJhciAiWyAzLzEwMF0iCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMQorCisgICAgICAgICMgdXNlZCBieSAtLXNpbmdsZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6CisgICAgICAgICAgICBzZWxmLnRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBzZWxmLmdvb2QuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgorICAgICAgICAgICAgc2VsZi5iYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNlbGYuc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgZGlzcGxheV9wcm9ncmVzcyhzZWxmLCB0ZXN0X2luZGV4LCB0ZXN0KToKKyAgICAgICAgaWYgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJhZCBhbmQgbm90IHNlbGYubnMucGdvOgorICAgICAgICAgICAgZm10ID0gInt0aW1lfSBbe3Rlc3RfaW5kZXg6e2NvdW50X3dpZHRofX17dGVzdF9jb3VudH0ve25iYWR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9ICJ7dGltZX0gW3t0ZXN0X2luZGV4Ontjb3VudF93aWR0aH19e3Rlc3RfY291bnR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgdGVzdF90aW1lID0gdGltZS5tb25vdG9uaWMoKSAtIHNlbGYuc3RhcnRfdGltZQorICAgICAgICB0ZXN0X3RpbWUgPSBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1pbnQodGVzdF90aW1lKSkKKyAgICAgICAgbGluZSA9IGZtdC5mb3JtYXQoY291bnRfd2lkdGg9c2VsZi50ZXN0X2NvdW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZGV4PXRlc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQ9c2VsZi50ZXN0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYmFkPWxlbihzZWxmLmJhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZT10ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lPXRlc3RfdGltZSkKKyAgICAgICAgcHJpbnQobGluZSwgZmx1c2g9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGt3YXJncyk6CisgICAgICAgIG5zID0gX3BhcnNlX2FyZ3Moc3lzLmFyZ3ZbMTpdLCAqKmt3YXJncykKKworICAgICAgICBpZiBucy50aW1lb3V0IGFuZCBub3QgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IFRoZSB0aW1lb3V0IG9wdGlvbiByZXF1aXJlcyAiCisgICAgICAgICAgICAgICAgICAiZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyIiwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKKworICAgICAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmUgYW5kIGdjIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCgnTm8gR0MgYXZhaWxhYmxlLCBpZ25vcmUgLS10aHJlc2hvbGQuJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGhyZXNob2xkID0gTm9uZQorCisgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgIGlmIGdjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90CisgICAgICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKKyAgICAgICAgICAgICAgICAjIGdhcmJhZ2UgdGhhdCBpcyBub3QgY29sbGVjdGFibGUgYnkgdGhlIEdDIGlzIHJlcG9ydGVkLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGRpc2FibGluZyAtLWZpbmRsZWFrcycsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIG5zLmZpbmRsZWFrcyA9IEZhbHNlCisKKyAgICAgICAgIyBTdHJpcCAucHkgZXh0ZW5zaW9ucy4KKyAgICAgICAgcmVtb3ZlcHkobnMuYXJncykKKworICAgICAgICByZXR1cm4gbnMKKworICAgIGRlZiBmaW5kX3Rlc3RzKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICAgICAgaWYgc2VsZi5ucy5zaW5nbGU6CisgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90ZXN0ID0gZnAucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0cyA9IFtuZXh0X3Rlc3RdCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgc2VsZi5ucy5mcm9tZmlsZToKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBbXQorICAgICAgICAgICAgIyByZWdleCB0byBtYXRjaCAndGVzdF9idWlsdGluJyBpbiBsaW5lOgorICAgICAgICAgICAgIyAnMDowMDowMCBbICA0LzQwMF0gdGVzdF9idWlsdGluIC0tIHRlc3RfZGljdCB0b29rIDEgc2VjJworICAgICAgICAgICAgcmVnZXggPSAocideKD86WzAtOV0rOlswLTldKzpbMC05XSsgKik/JworICAgICAgICAgICAgICAgICAgICAgcicoPzpcW1swLTkvIF0rXF0gKik/JworICAgICAgICAgICAgICAgICAgICAgcicodGVzdF9bYS16QS1aMC05X10rKScpCisgICAgICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgpCisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHNlbGYubnMuZnJvbWZpbGUpKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdHMuYXBwZW5kKG1hdGNoLmdyb3VwKDEpKQorCisgICAgICAgIHJlbW92ZXB5KHNlbGYudGVzdHMpCisKKyAgICAgICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQorICAgICAgICBub3R0ZXN0cyA9IE5PVFRFU1RTLmNvcHkoKQorICAgICAgICBpZiBzZWxmLm5zLmV4Y2x1ZGU6CisgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYubnMuYXJnczoKKyAgICAgICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCisgICAgICAgICAgICAgICAgbm90dGVzdHMuYWRkKGFyZykKKyAgICAgICAgICAgIHNlbGYubnMuYXJncyA9IFtdCisKKyAgICAgICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KKyAgICAgICAgIyBkb24ndCBhZGQgZGVmYXVsdCB0ZXN0cyB0byBiZSBleGVjdXRlZCBvciBza2lwcGVkIChwYXNzIGVtcHR5IHZhbHVlcykKKyAgICAgICAgaWYgc2VsZi5ucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBsaXN0KCksIHNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCisKKyAgICAgICAgaWYgbm90IHNlbGYubnMuZnJvbWZpbGU6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkID0gc2VsZi50ZXN0cyBvciBzZWxmLm5zLmFyZ3Mgb3IgYWxsdGVzdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBzZWxmLnRlc3RzCisgICAgICAgIGlmIHNlbGYubnMuc2luZ2xlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYuc2VsZWN0ZWRbOjFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zID0gYWxsdGVzdHMuaW5kZXgoc2VsZi5zZWxlY3RlZFswXSkKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1twb3MgKyAxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgorICAgICAgICBpZiBzZWxmLm5zLnN0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnNlbGVjdGVkWzpzZWxmLnNlbGVjdGVkLmluZGV4KHNlbGYubnMuc3RhcnQpXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiCisgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLm5zLnN0YXJ0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5yYW5kb21pemU6CisgICAgICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5ucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCisgICAgICAgICAgICByYW5kb20uc2VlZChzZWxmLm5zLnJhbmRvbV9zZWVkKQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZi5zZWxlY3RlZCkKKworICAgIGRlZiBsaXN0X3Rlc3RzKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgcHJpbnQobmFtZSkKKworICAgIGRlZiByZXJ1bl9mYWlsZWRfdGVzdHMoc2VsZik6CisgICAgICAgIHNlbGYubnMudmVyYm9zZSA9IFRydWUKKyAgICAgICAgc2VsZi5ucy5mYWlsZmFzdCA9IEZhbHNlCisgICAgICAgIHNlbGYubnMudmVyYm9zZTMgPSBGYWxzZQorICAgICAgICBzZWxmLm5zLm1hdGNoX3Rlc3RzID0gTm9uZQorCisgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUiKQorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLmJhZFs6XToKKyAgICAgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICAgICAgICAgIG9rID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFkLnJlbW92ZSh0ZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQorICAgICAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgIGRlZiBkaXNwbGF5X3Jlc3VsdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIGFmdGVyIF5DCisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCisgICAgICAgICAgICBleGVjdXRlZCA9IHNldChzZWxmLmdvb2QpIHwgc2V0KHNlbGYuYmFkKSB8IHNldChzZWxmLnNraXBwZWQpCisgICAgICAgICAgICBvbWl0dGVkID0gc2V0KHNlbGYuc2VsZWN0ZWQpIC0gZXhlY3V0ZWQKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihvbWl0dGVkKSwgInRlc3QiKSwgIm9taXR0ZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChvbWl0dGVkKQorCisgICAgICAgICMgSWYgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgUEdPIHRoZW4gbm8gb25lIGNhcmVzIGFib3V0CisgICAgICAgICMgcmVzdWx0cy4KKyAgICAgICAgaWYgc2VsZi5ucy5wZ286CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmdvb2QgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgaWYgKG5vdCBzZWxmLmJhZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5za2lwcGVkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmludGVycnVwdGVkCisgICAgICAgICAgICAgICAgYW5kIGxlbihzZWxmLmdvb2QpID4gMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIkFsbCIsIGVuZD0nICcpCisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5nb29kKSwgInRlc3QiKSwgIk9LLiIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5wcmludF9zbG93OgorICAgICAgICAgICAgc2VsZi50ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoIjEwIHNsb3dlc3QgdGVzdHM6IikKKyAgICAgICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHNlbGYudGVzdF90aW1lc1s6MTBdOgorICAgICAgICAgICAgICAgIHByaW50KCItICVzOiAlcyIgJSAodGVzdCwgZm9ybWF0X2R1cmF0aW9uKHRpbWUpKSkKKworICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgICAgICBpZiBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQ6CisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgY291bnQobGVuKHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCkKKworICAgICAgICBpZiBzZWxmLnNraXBwZWQgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5za2lwcGVkKQorCisgICAgZGVmIHJ1bl90ZXN0c19zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5zLnRyYWNlOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlCisgICAgICAgICAgICBzZWxmLnRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQorCisgICAgICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQorCisgICAgICAgIHByaW50KCJSdW4gdGVzdHMgc2VxdWVudGlhbGx5IikKKworICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUoc2VsZi50ZXN0cywgMSk6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorCisgICAgICAgICAgICB0ZXh0ID0gdGVzdAorICAgICAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJyVzIC0tICVzJyAlICh0ZXh0LCBwcmV2aW91c190ZXN0KQorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgIGlmIHNlbGYudHJhY2VyOgorICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKKyAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KKyAgICAgICAgICAgICAgICBjbWQgPSAoJ3Jlc3VsdCA9IHJ1bnRlc3Qoc2VsZi5ucywgdGVzdCk7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KScpCisgICAgICAgICAgICAgICAgbnMgPSBkaWN0KGxvY2FscygpKQorICAgICAgICAgICAgICAgIHNlbGYudHJhY2VyLnJ1bmN0eChjbWQsIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9bnMpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnNbJ3Jlc3VsdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCAoSU5URVJSVVBURUQsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3QsIHJlc3VsdFswXSkKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUubW9ub3RvbmljKCkgLSBzdGFydF90aW1lCisgICAgICAgICAgICBpZiB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUU6CisgICAgICAgICAgICAgICAgcHJldmlvdXNfdGVzdCA9ICIlcyBpbiAlcyIgJSAocHJldmlvdXNfdGVzdCwgZm9ybWF0X2R1cmF0aW9uKHRlc3RfdGltZSkpCisgICAgICAgICAgICBlbGlmIHJlc3VsdFswXSA9PSBQQVNTRUQ6CisgICAgICAgICAgICAgICAgIyBiZSBxdWlldDogc2F5IG5vdGhpbmcgaWYgdGhlIHRlc3QgcGFzc2VkIHNob3J0bHkKKyAgICAgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLm5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQorICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKKyAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQorICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZF9nYXJiYWdlLmV4dGVuZChnYy5nYXJiYWdlKQorICAgICAgICAgICAgICAgICAgICBkZWwgZ2MuZ2FyYmFnZVs6XQorCisgICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQorICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnVubG9hZChtb2R1bGUpCisKKyAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgIHByaW50KHByZXZpb3VzX3Rlc3QpCisKKyAgICBkZWYgX3Rlc3RfZm9yZXZlcihzZWxmLCB0ZXN0cyk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKKyAgICAgICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgorICAgICAgICBpZiAoc2VsZi5ucy52ZXJib3NlCisgICAgICAgICAgICBvciBzZWxmLm5zLmhlYWRlcgorICAgICAgICAgICAgb3Igbm90IChzZWxmLm5zLnBnbyBvciBzZWxmLm5zLnF1aWV0IG9yIHNlbGYubnMuc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYudGVzdHMgb3Igc2VsZi5ucy5hcmdzKSk6CisgICAgICAgICAgICAjIFByaW50IGJhc2ljIHBsYXRmb3JtIGluZm9ybWF0aW9uCisgICAgICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCisgICAgICAgICAgICBwcmludCgiPT0gICIsIHBsYXRmb3JtLnBsYXRmb3JtKGFsaWFzZWQ9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgImhhc2ggYWxnb3JpdGhtOiIsIHN5cy5oYXNoX2luZm8uYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgb3MuZ2V0Y3dkKCkpCisgICAgICAgICAgICBwcmludCgiVGVzdGluZyB3aXRoIGZsYWdzOiIsIHN5cy5mbGFncykKKworICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbWl6ZToKKyAgICAgICAgICAgIHByaW50KCJVc2luZyByYW5kb20gc2VlZCIsIHNlbGYubnMucmFuZG9tX3NlZWQpCisKKyAgICAgICAgaWYgc2VsZi5ucy5mb3JldmVyOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IHNlbGYuX3Rlc3RfZm9yZXZlcihsaXN0KHNlbGYuc2VsZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudF93aWR0aCA9IDMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBpdGVyKHNlbGYuc2VsZWN0ZWQpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnQgPSAnL3t9Jy5mb3JtYXQobGVuKHNlbGYuc2VsZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gbGVuKHNlbGYudGVzdF9jb3VudCkgLSAxCisKKyAgICAgICAgaWYgc2VsZi5ucy51c2VfbXA6CisgICAgICAgICAgICBmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdF9tcCBpbXBvcnQgcnVuX3Rlc3RzX211bHRpcHJvY2VzcworICAgICAgICAgICAgcnVuX3Rlc3RzX211bHRpcHJvY2VzcyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHNfc2VxdWVudGlhbCgpCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWU6CisgICAgICAgICAgICBpZiBzZWxmLm5leHRfc2luZ2xlX3Rlc3Q6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUsICd3JykgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKHNlbGYubmV4dF9zaW5nbGVfdGVzdCArICdcbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lKQorCisgICAgICAgIGlmIHNlbGYudHJhY2VyOgorICAgICAgICAgICAgciA9IHNlbGYudHJhY2VyLnJlc3VsdHMoKQorICAgICAgICAgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJkaXI9c2VsZi5ucy5jb3ZlcmRpcikKKworICAgICAgICBwcmludCgpCisgICAgICAgIGR1cmF0aW9uID0gdGltZS5tb25vdG9uaWMoKSAtIHNlbGYuc3RhcnRfdGltZQorICAgICAgICBwcmludCgiVG90YWwgZHVyYXRpb246ICVzIiAlIGZvcm1hdF9kdXJhdGlvbihkdXJhdGlvbikpCisKKyAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICByZXN1bHQgPSAiRkFJTFVSRSIKKyAgICAgICAgZWxpZiBzZWxmLmludGVycnVwdGVkOgorICAgICAgICAgICAgcmVzdWx0ID0gIklOVEVSUlVQVEVEIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gIlNVQ0NFU1MiCisgICAgICAgIHByaW50KCJUZXN0cyByZXN1bHQ6ICVzIiAlIHJlc3VsdCkKKworICAgICAgICBpZiBzZWxmLm5zLnJ1bmxlYWtzOgorICAgICAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKKworICAgIGRlZiBtYWluKHNlbGYsIHRlc3RzPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgZ2xvYmFsIFRFTVBESVIKKworICAgICAgICBpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKKyAgICAgICAgICAgIGV4Y2VwdCBGaWxlRXhpc3RzRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKKyAgICAgICAgIyB0aGUgdGVzdHMuIFRoZSBuYW1lIG9mIHRoZSBkaXIgaW5jbHVkZXMgdGhlIHBpZCB0byBhbGxvdyBwYXJhbGxlbAorICAgICAgICAjIHRlc3RpbmcgKHNlZSB0aGUgLWogb3B0aW9uKS4KKyAgICAgICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKKyAgICAgICAgdGVzdF9jd2QgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGVzdF9jd2QpCisKKyAgICAgICAgIyBSdW4gdGhlIHRlc3RzIGluIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgdGVtcG9yYXJpbHkgY2hhbmdlcyB0aGUgQ1dEIHRvIGEKKyAgICAgICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgorICAgICAgICAjIGNoYW5nZSB0aGUgQ1dELCB0aGUgb3JpZ2luYWwgQ1dEIHdpbGwgYmUgdXNlZC4gIFRoZSBvcmlnaW5hbCBDV0QgaXMKKyAgICAgICAgIyBhdmFpbGFibGUgZnJvbSBzdXBwb3J0LlNBVkVEQ1dELgorICAgICAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgorICAgICAgICAgICAgc2VsZi5fbWFpbih0ZXN0cywga3dhcmdzKQorCisgICAgZGVmIF9tYWluKHNlbGYsIHRlc3RzLCBrd2FyZ3MpOgorICAgICAgICBzZWxmLm5zID0gc2VsZi5wYXJzZV9hcmdzKGt3YXJncykKKworICAgICAgICBpZiBzZWxmLm5zLnNsYXZlYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfc2xhdmUKKyAgICAgICAgICAgIHJ1bl90ZXN0c19zbGF2ZShzZWxmLm5zLnNsYXZlYXJncykKKworICAgICAgICBpZiBzZWxmLm5zLndhaXQ6CisgICAgICAgICAgICBpbnB1dCgiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4uLiIpCisKKyAgICAgICAgc2V0dXBfdGVzdHMoc2VsZi5ucykKKworICAgICAgICBzZWxmLmZpbmRfdGVzdHModGVzdHMpCisKKyAgICAgICAgaWYgc2VsZi5ucy5saXN0X3Rlc3RzOgorICAgICAgICAgICAgc2VsZi5saXN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorICAgICAgICBzZWxmLmRpc3BsYXlfcmVzdWx0KCkKKworICAgICAgICBpZiBzZWxmLm5zLnZlcmJvc2UyIGFuZCBzZWxmLmJhZDoKKyAgICAgICAgICAgIHNlbGYucmVydW5fZmFpbGVkX3Rlc3RzKCkKKworICAgICAgICBzZWxmLmZpbmFsaXplKCkKKyAgICAgICAgc3lzLmV4aXQobGVuKHNlbGYuYmFkKSA+IDAgb3Igc2VsZi5pbnRlcnJ1cHRlZCkKKworCitkZWYgcmVtb3ZlcHkobmFtZXMpOgorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBleHQgPT0gJy5weSc6CisgICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKKworCitkZWYgY291bnQobiwgd29yZCk6CisgICAgaWYgbiA9PSAxOgorICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQorCisKK2RlZiBwcmludGxpc3QoeCwgd2lkdGg9NzAsIGluZGVudD00KToKKyAgICAiIiJQcmludCB0aGUgZWxlbWVudHMgb2YgaXRlcmFibGUgeCB0byBzdGRvdXQuCisKKyAgICBPcHRpb25hbCBhcmcgd2lkdGggKGRlZmF1bHQgNzApIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorICAgIE9wdGlvbmFsIGFyZyBpbmRlbnQgKGRlZmF1bHQgNCkgaXMgdGhlIG51bWJlciBvZiBibGFua3Mgd2l0aCB3aGljaCB0bworICAgIGJlZ2luIGVhY2ggbGluZS4KKyAgICAiIiIKKworICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAorICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKKyAgICBwcmludCh0ZXh0d3JhcC5maWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCisKKworZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICIiIlJ1biB0aGUgUHl0aG9uIHN1aXRlLiIiIgorICAgIFJlZ3J0ZXN0KCkubWFpbih0ZXN0cz10ZXN0cywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRjNDlmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpAQCAtMCwwICsxLDIwMiBAQAoraW1wb3J0IGVycm5vCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgTUFYRkQgPSAyNTYKKworCitkZWYgZmRfY291bnQoKToKKyAgICAiIiJDb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbGludXgnLCAnZnJlZWJzZCcpKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKCIvcHJvYy9zZWxmL2ZkIikKKyAgICAgICAgICAgIHJldHVybiBsZW4obmFtZXMpCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGNvdW50ID0gMAorICAgIGZvciBmZCBpbiByYW5nZShNQVhGRCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUHJlZmVyIGR1cCgpIG92ZXIgZnN0YXQoKS4gZnN0YXQoKSBjYW4gcmVxdWlyZSBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgICMgd2hlcmVhcyBkdXAoKSBkb2Vzbid0LgorICAgICAgICAgICAgZmQyID0gb3MuZHVwKGZkKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2xvc2UoZmQyKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgIHJldHVybiBjb3VudAorCisKK2RlZiBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgaW5kaXJlY3RfdGVzdCwgaHVudHJsZWFrcyk6CisgICAgIiIiUnVuIGEgdGVzdCBtdWx0aXBsZSB0aW1lcywgbG9va2luZyBmb3IgcmVmZXJlbmNlIGxlYWtzLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgRmFsc2UgaWYgdGhlIHRlc3QgZGlkbid0IGxlYWsgcmVmZXJlbmNlczsgVHJ1ZSBpZiB3ZSBkZXRlY3RlZCByZWZsZWFrcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgorICAgIGltcG9ydCBjb3B5cmVnCisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworCisgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRyYWNraW5nIHJlZmVyZW5jZSBsZWFrcyByZXF1aXJlcyBhIGRlYnVnIGJ1aWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiBQeXRob24iKQorCisgICAgIyBTYXZlIGN1cnJlbnQgdmFsdWVzIGZvciBkYXNoX1JfY2xlYW51cCgpIHRvIHJlc3RvcmUuCisgICAgZnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgcHMgPSBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNvcHkoKQorICAgIHBpYyA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNvcHkoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemRjID0gTm9uZSAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0CisgICAgZWxzZToKKyAgICAgICAgemRjID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNvcHkoKQorICAgIGFiY3MgPSB7fQorICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106CisgICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBhYmNzW29ial0gPSBvYmouX2FiY19yZWdpc3RyeS5jb3B5KCkKKworICAgIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZSA9IGh1bnRybGVha3MKKyAgICBmbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCBmbmFtZSkKKyAgICByZXBjb3VudCA9IG53YXJtdXAgKyBudHJhY2tlZAorICAgIHJjX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisgICAgYWxsb2NfZGVsdGFzID0gWzBdICogcmVwY291bnQKKyAgICBmZF9kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorCisgICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICMgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gbWFrZSBweWZsYWtlcyBxdWlldAorICAgIHJjX2JlZm9yZSA9IGFsbG9jX2JlZm9yZSA9IGZkX2JlZm9yZSA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6CisgICAgICAgIGluZGlyZWN0X3Rlc3QoKQorICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIsIGZkX2FmdGVyID0gZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiY3MpCisgICAgICAgIHByaW50KCcuJywgZW5kPScnLCBmbHVzaD1UcnVlKQorICAgICAgICBpZiBpID49IG53YXJtdXA6CisgICAgICAgICAgICByY19kZWx0YXNbaV0gPSByY19hZnRlciAtIHJjX2JlZm9yZQorICAgICAgICAgICAgYWxsb2NfZGVsdGFzW2ldID0gYWxsb2NfYWZ0ZXIgLSBhbGxvY19iZWZvcmUKKyAgICAgICAgICAgIGZkX2RlbHRhc1tpXSA9IGZkX2FmdGVyIC0gZmRfYmVmb3JlCisgICAgICAgIGFsbG9jX2JlZm9yZSA9IGFsbG9jX2FmdGVyCisgICAgICAgIHJjX2JlZm9yZSA9IHJjX2FmdGVyCisgICAgICAgIGZkX2JlZm9yZSA9IGZkX2FmdGVyCisgICAgcHJpbnQoZmlsZT1zeXMuc3RkZXJyKQorICAgICMgVGhlc2UgY2hlY2tlcnMgcmV0dXJuIEZhbHNlIG9uIHN1Y2Nlc3MsIFRydWUgb24gZmFpbHVyZQorICAgIGRlZiBjaGVja19yY19kZWx0YXMoZGVsdGFzKToKKyAgICAgICAgcmV0dXJuIGFueShkZWx0YXMpCisgICAgZGVmIGNoZWNrX2FsbG9jX2RlbHRhcyhkZWx0YXMpOgorICAgICAgICAjIEF0IGxlYXN0IDEvM3JkIG9mIDBzCisgICAgICAgIGlmIDMgKiBkZWx0YXMuY291bnQoMCkgPCBsZW4oZGVsdGFzKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgTm90aGluZyBlbHNlIHRoYW4gMXMsIDBzIGFuZCAtMXMKKyAgICAgICAgaWYgbm90IHNldChkZWx0YXMpIDw9IHsxLDAsLTF9OgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbGVkID0gRmFsc2UKKyAgICBmb3IgZGVsdGFzLCBpdGVtX25hbWUsIGNoZWNrZXIgaW4gWworICAgICAgICAocmNfZGVsdGFzLCAncmVmZXJlbmNlcycsIGNoZWNrX3JjX2RlbHRhcyksCisgICAgICAgIChhbGxvY19kZWx0YXMsICdtZW1vcnkgYmxvY2tzJywgY2hlY2tfYWxsb2NfZGVsdGFzKSwKKyAgICAgICAgKGZkX2RlbHRhcywgJ2ZpbGUgZGVzY3JpcHRvcnMnLCBjaGVja19yY19kZWx0YXMpXToKKyAgICAgICAgaWYgY2hlY2tlcihkZWx0YXMpOgorICAgICAgICAgICAgbXNnID0gJyVzIGxlYWtlZCAlcyAlcywgc3VtPSVzJyAlICgKKyAgICAgICAgICAgICAgICB0ZXN0LCBkZWx0YXNbbndhcm11cDpdLCBpdGVtX25hbWUsIHN1bShkZWx0YXMpKQorICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJhIikgYXMgcmVmcmVwOgorICAgICAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1yZWZyZXApCisgICAgICAgICAgICAgICAgcmVmcmVwLmZsdXNoKCkKKyAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKKyAgICByZXR1cm4gZmFpbGVkCisKKworZGVmIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpOgorICAgIGltcG9ydCBnYywgY29weXJlZworICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZQorICAgIGltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0LCBtaW1ldHlwZXMsIGRvY3Rlc3QKKyAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wLCBjb2xsZWN0aW9ucy5hYmMKKyAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAorICAgIGZyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAorCisgICAgIyBDbGVhciB0aGUgd2FybmluZ3MgcmVnaXN0cnksIHNvIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBhZ2FpbgorICAgIGZvciBtb2QgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgorICAgICAgICAgICAgZGVsIG1vZC5fX3dhcm5pbmdyZWdpc3RyeV9fCisKKyAgICAjIFJlc3RvcmUgc29tZSBvcmlnaW5hbCB2YWx1ZXMuCisgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS5jbGVhcigpCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS51cGRhdGUocHMpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUudXBkYXRlKHpkYykKKworICAgICMgY2xlYXIgdHlwZSBjYWNoZQorICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCisKKyAgICAjIENsZWFyIEFCQyByZWdpc3RyaWVzLCByZXN0b3JpbmcgcHJldmlvdXNseSBzYXZlZCBBQkMgcmVnaXN0cmllcy4KKyAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgorICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgorICAgICAgICAgICAgb2JqLl9hYmNfcmVnaXN0cnkgPSBhYmNzLmdldChvYmosIFdlYWtTZXQoKSkuY29weSgpCisgICAgICAgICAgICBvYmouX2FiY19jYWNoZS5jbGVhcigpCisgICAgICAgICAgICBvYmouX2FiY19uZWdhdGl2ZV9jYWNoZS5jbGVhcigpCisKKyAgICAjIEZsdXNoIHN0YW5kYXJkIG91dHB1dCwgc28gdGhhdCBidWZmZXJlZCBkYXRhIGlzIHNlbnQgdG8gdGhlIE9TIGFuZAorICAgICMgYXNzb2NpYXRlZCBQeXRob24gb2JqZWN0cyBhcmUgcmVjbGFpbWVkLgorICAgIGZvciBzdHJlYW0gaW4gKHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIHN5cy5fX3N0ZG91dF9fLCBzeXMuX19zdGRlcnJfXyk6CisgICAgICAgIGlmIHN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpCisKKyAgICAjIENsZWFyIGFzc29ydGVkIG1vZHVsZSBjYWNoZXMuCisgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCisgICAgcmUucHVyZ2UoKQorICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGUuY2xlYXIoKQorICAgIHVybGxpYi5wYXJzZS5jbGVhcl9jYWNoZSgpCisgICAgdXJsbGliLnJlcXVlc3QudXJsY2xlYW51cCgpCisgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKyAgICBmaWxlY21wLl9jYWNoZS5jbGVhcigpCisgICAgc3RydWN0Ll9jbGVhcmNhY2hlKCkKKyAgICBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgRG9uJ3Qgd29ycnkgYWJvdXQgcmVzZXR0aW5nIHRoZSBjYWNoZSBpZiBjdHlwZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgY3R5cGVzLl9yZXNldF9jYWNoZSgpCisKKyAgICAjIENvbGxlY3QgY3ljbGljIHRyYXNoIGFuZCByZWFkIG1lbW9yeSBzdGF0aXN0aWNzIGltbWVkaWF0ZWx5IGFmdGVyLgorICAgIGZ1bmMxID0gc3lzLmdldGFsbG9jYXRlZGJsb2NrcworICAgIGZ1bmMyID0gc3lzLmdldHRvdGFscmVmY291bnQKKyAgICBnYy5jb2xsZWN0KCkKKyAgICByZXR1cm4gZnVuYzEoKSwgZnVuYzIoKSwgZmRfY291bnQoKQorCisKK2RlZiB3YXJtX2NhY2hlcygpOgorICAgICMgY2hhciBjYWNoZQorICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQorICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgIHNbaTppKzFdCisgICAgIyB1bmljb2RlIGNhY2hlCisgICAgW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXQorICAgICMgaW50IGNhY2hlCisgICAgbGlzdChyYW5nZSgtNSwgMjU3KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTI5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5CkBAIC0wLDAgKzEsMjQ0IEBACitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgaW8KK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QubGlicmVncnRlc3QucmVmbGVhayBpbXBvcnQgZGFzaF9SCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2F2ZV9lbnYgaW1wb3J0IHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQKKworCisjIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KK1BBU1NFRCA9IDEKK0ZBSUxFRCA9IDAKK0VOVl9DSEFOR0VEID0gLTEKK1NLSVBQRUQgPSAtMgorUkVTT1VSQ0VfREVOSUVEID0gLTMKK0lOVEVSUlVQVEVEID0gLTQKK0NISUxEX0VSUk9SID0gLTUgICAjIGVycm9yIGluIGEgY2hpbGQgcHJvY2VzcworCitfRk9STUFUX1RFU1RfUkVTVUxUID0geworICAgIFBBU1NFRDogJyVzIHBhc3NlZCcsCisgICAgRkFJTEVEOiAnJXMgZmFpbGVkJywKKyAgICBFTlZfQ0hBTkdFRDogJyVzIGZhaWxlZCAoZW52IGNoYW5nZWQpJywKKyAgICBTS0lQUEVEOiAnJXMgc2tpcHBlZCcsCisgICAgUkVTT1VSQ0VfREVOSUVEOiAnJXMgc2tpcHBlZCAocmVzb3VyY2UgZGVuaWVkKScsCisgICAgSU5URVJSVVBURUQ6ICclcyBpbnRlcnJ1cHRlZCcsCisgICAgQ0hJTERfRVJST1I6ICclcyBjcmFzaGVkJywKK30KKworIyBNaW5pbXVtIGR1cmF0aW9uIG9mIGEgdGVzdCB0byBkaXNwbGF5IGl0cyBkdXJhdGlvbiBvciB0byBtZW50aW9uIHRoYXQKKyMgdGhlIHRlc3QgaXMgcnVubmluZyBpbiBiYWNrZ3JvdW5kCitQUk9HUkVTU19NSU5fVElNRSA9IDMwLjAgICAjIHNlY29uZHMKKworIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKKyMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQorU1REVEVTVFMgPSBbCisgICAgJ3Rlc3RfZ3JhbW1hcicsCisgICAgJ3Rlc3Rfb3Bjb2RlcycsCisgICAgJ3Rlc3RfZGljdCcsCisgICAgJ3Rlc3RfYnVpbHRpbicsCisgICAgJ3Rlc3RfZXhjZXB0aW9ucycsCisgICAgJ3Rlc3RfdHlwZXMnLAorICAgICd0ZXN0X3VuaXR0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0MicsCisgICAgJ3Rlc3Rfc3VwcG9ydCcKK10KKworIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKK05PVFRFU1RTID0gc2V0KCkKKworCitkZWYgZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3RfbmFtZSwgcmVzdWx0KToKKyAgICBmbXQgPSBfRk9STUFUX1RFU1RfUkVTVUxULmdldChyZXN1bHQsICIlcyIpCisgICAgcmV0dXJuIGZtdCAlIHRlc3RfbmFtZQorCisKK2RlZiBmaW5kdGVzdHModGVzdGRpcj1Ob25lLCBzdGR0ZXN0cz1TVERURVNUUywgbm90dGVzdHM9Tk9UVEVTVFMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGFwcGxpY2FibGUgdGVzdCBtb2R1bGVzLiIiIgorICAgIHRlc3RkaXIgPSBmaW5kdGVzdGRpcih0ZXN0ZGlyKQorICAgIG5hbWVzID0gb3MubGlzdGRpcih0ZXN0ZGlyKQorICAgIHRlc3RzID0gW10KKyAgICBvdGhlcnMgPSBzZXQoc3RkdGVzdHMpIHwgbm90dGVzdHMKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgbW9kLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIG1vZFs6NV0gPT0gInRlc3RfIiBhbmQgZXh0IGluICgiLnB5IiwgIiIpIGFuZCBtb2Qgbm90IGluIG90aGVyczoKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2QpCisgICAgcmV0dXJuIHN0ZHRlc3RzICsgc29ydGVkKHRlc3RzKQorCisKK2RlZiBydW50ZXN0KG5zLCB0ZXN0KToKKyAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKworICAgIG5zIC0tIHJlZ3J0ZXN0IG5hbWVzcGFjZSBvZiBvcHRpb25zCisgICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorCisgICAgUmV0dXJucyB0aGUgdHVwbGUgKHJlc3VsdCwgdGVzdF90aW1lKSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUKKyAgICBjb25zdGFudHM6CisKKyAgICAgICAgSU5URVJSVVBURUQgICAgICBLZXlib2FyZEludGVycnVwdCB3aGVuIHJ1biB1bmRlciAtagorICAgICAgICBSRVNPVVJDRV9ERU5JRUQgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAorICAgICAgICBTS0lQUEVEICAgICAgICAgIHRlc3Qgc2tpcHBlZCBmb3Igc29tZSBvdGhlciByZWFzb24KKyAgICAgICAgRU5WX0NIQU5HRUQgICAgICB0ZXN0IGZhaWxlZCBiZWNhdXNlIGl0IGNoYW5nZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAorICAgICAgICBGQUlMRUQgICAgICAgICAgIHRlc3QgZmFpbGVkCisgICAgICAgIFBBU1NFRCAgICAgICAgICAgdGVzdCBwYXNzZWQKKyAgICAiIiIKKworICAgIG91dHB1dF9vbl9mYWlsdXJlID0gbnMudmVyYm9zZTMKKworICAgIHVzZV90aW1lb3V0ID0gKG5zLnRpbWVvdXQgaXMgbm90IE5vbmUpCisgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcihucy50aW1lb3V0LCBleGl0PVRydWUpCisgICAgdHJ5OgorICAgICAgICBzdXBwb3J0Lm1hdGNoX3Rlc3RzID0gbnMubWF0Y2hfdGVzdHMKKyAgICAgICAgaWYgbnMuZmFpbGZhc3Q6CisgICAgICAgICAgICBzdXBwb3J0LmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICBpZiBvdXRwdXRfb25fZmFpbHVyZToKKyAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IFRydWUKKworICAgICAgICAgICAgIyBSZXVzZSB0aGUgc2FtZSBpbnN0YW5jZSB0byBhbGwgY2FsbHMgdG8gcnVudGVzdCgpLiBTb21lCisgICAgICAgICAgICAjIHRlc3RzIGtlZXAgYSByZWZlcmVuY2UgdG8gc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyCisgICAgICAgICAgICAjIChlZy4gdGVzdF9hcmdwYXJzZSkuCisgICAgICAgICAgICBpZiBydW50ZXN0LnN0cmluZ2lvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gaW8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHJ1bnRlc3Quc3RyaW5naW8gPSBzdHJlYW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gcnVudGVzdC5zdHJpbmdpbworICAgICAgICAgICAgICAgIHN0cmVhbS5zZWVrKDApCisgICAgICAgICAgICAgICAgc3RyZWFtLnRydW5jYXRlKCkKKworICAgICAgICAgICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBvcmlnX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3RyZWFtCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHN0cmVhbQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3RfaW5uZXIobnMsIHRlc3QsIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAorICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcihucywgdGVzdCwgZGlzcGxheV9mYWlsdXJlPW5vdCBucy52ZXJib3NlKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZmluYWxseToKKyAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKKyAgICAgICAgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0LCBucy52ZXJib3NlKQorcnVudGVzdC5zdHJpbmdpbyA9IE5vbmUKKworCitkZWYgcnVudGVzdF9pbm5lcihucywgdGVzdCwgZGlzcGxheV9mYWlsdXJlPVRydWUpOgorICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCisKKyAgICB0ZXN0X3RpbWUgPSAwLjAKKyAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KKyAgICB0cnk6CisgICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKSBvciBucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWJzdGVzdCA9IHRlc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWx3YXlzIGltcG9ydCBpdCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgIGFic3Rlc3QgPSAndGVzdC4nICsgdGVzdAorICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsIHBnbz1ucy5wZ28pIGFzIGVudmlyb25tZW50OgorICAgICAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICB0aGVfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoYWJzdGVzdCkKKyAgICAgICAgICAgICMgSWYgdGhlIHRlc3QgaGFzIGEgdGVzdF9tYWluLCB0aGF0IHdpbGwgcnVuIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgIyB0ZXN0cy4gIElmIG5vdCwgdXNlIG5vcm1hbCB1bml0dGVzdCB0ZXN0IGxvYWRpbmcuCisgICAgICAgICAgICB0ZXN0X3J1bm5lciA9IGdldGF0dHIodGhlX21vZHVsZSwgInRlc3RfbWFpbiIsIE5vbmUpCisgICAgICAgICAgICBpZiB0ZXN0X3J1bm5lciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X3J1bm5lcigpOgorICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGVfbW9kdWxlKQorICAgICAgICAgICAgICAgICAgICBmb3IgZXJyb3IgaW4gbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGVycm9yLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgICAgIGlmIGxvYWRlci5lcnJvcnM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImVycm9ycyB3aGlsZSBsb2FkaW5nIHRlc3RzIikKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdHMpCisgICAgICAgICAgICB0ZXN0X3J1bm5lcigpCisgICAgICAgICAgICBpZiBucy5odW50cmxlYWtzOgorICAgICAgICAgICAgICAgIHJlZmxlYWsgPSBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgdGVzdF9ydW5uZXIsIG5zLmh1bnRybGVha3MpCisgICAgICAgICAgICB0ZXN0X3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKKyAgICBleGNlcHQgc3VwcG9ydC5SZXNvdXJjZURlbmllZCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgorICAgICAgICBpZiBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286CisgICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZywgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIFNLSVBQRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgc3VwcG9ydC5UZXN0RmFpbGVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IG5zLnBnbzoKKyAgICAgICAgICAgIGlmIGRpc3BsYXlfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdDoKKyAgICAgICAgbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorICAgICAgICBpZiBub3QgbnMucGdvOgorICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiY3Jhc2hlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZWxzZToKKyAgICAgICAgaWYgcmVmbGVhazoKKyAgICAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgICAgICBpZiBlbnZpcm9ubWVudC5jaGFuZ2VkOgorICAgICAgICAgICAgcmV0dXJuIEVOVl9DSEFOR0VELCB0ZXN0X3RpbWUKKyAgICAgICAgcmV0dXJuIFBBU1NFRCwgdGVzdF90aW1lCisKKworZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgorICAgIGltcG9ydCBzaHV0aWwKKyAgICBpbXBvcnQgc3RhdAorICAgIGltcG9ydCBnYworCisgICAgIyBGaXJzdCBraWxsIGFueSBkYW5nbGluZyByZWZlcmVuY2VzIHRvIG9wZW4gZmlsZXMgZXRjLgorICAgICMgVGhpcyBjYW4gYWxzbyBpc3N1ZSBzb21lIFJlc291cmNlV2FybmluZ3Mgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGdldAorICAgICMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZm9sbG93aW5nIHRlc3QgcnVuLCBhbmQgcG9zc2libHkgcHJvZHVjZSBmYWlsdXJlcy4KKyAgICBnYy5jb2xsZWN0KCkKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluIChzdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgImRiX2hvbWUiLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImRpcmVjdG9yeSIsIHNodXRpbC5ybXRyZWUKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImZpbGUiLCBvcy51bmxpbmsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCJvcy5wYXRoIHNheXMgJXIgZXhpc3RzIGJ1dCBpcyBuZWl0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3Rvcnkgbm9yIGZpbGUiICUgbmFtZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIiVyIGxlZnQgYmVoaW5kICVzICVyIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBjaG1vZCwgZml4IHBvc3NpYmxlIHBlcm1pc3Npb25zIHByb2JsZW1zCisgICAgICAgICAgICAjIHRoYXQgbWlnaHQgcHJldmVudCBjbGVhbnVwCisgICAgICAgICAgICBpZiAoaGFzYXR0cihvcywgJ2NobW9kJykpOgorICAgICAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIHN0YXQuU19JUldYVSB8IHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykKKyAgICAgICAgICAgIG51a2VyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgbXNnOgorICAgICAgICAgICAgcHJpbnQoKCIlciBsZWZ0IGJlaGluZCAlcyAlciBhbmQgaXQgY291bGRuJ3QgYmUgIgorICAgICAgICAgICAgICAgICJyZW1vdmVkOiAlcyIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUsIG1zZykpLCBmaWxlPXN5cy5zdGRlcnIpCisKKworZGVmIGZpbmR0ZXN0ZGlyKHBhdGg9Tm9uZSk6CisgICAgcmV0dXJuIHBhdGggb3Igb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIG9yIG9zLmN1cmRpcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNGMxNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKQEAgLTAsMCArMSwyNDUgQEAKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBxdWV1ZQoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB0eXBlcworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKKyAgICBzeXMuZXhpdCgyKQorCitmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdCBpbXBvcnQgKAorICAgIHJ1bnRlc3QsIElOVEVSUlVQVEVELCBDSElMRF9FUlJPUiwgUFJPR1JFU1NfTUlOX1RJTUUsCisgICAgZm9ybWF0X3Rlc3RfcmVzdWx0KQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnNldHVwIGltcG9ydCBzZXR1cF90ZXN0cworCisKKyMgRGlzcGxheSB0aGUgcnVubmluZyB0ZXN0cyBpZiBub3RoaW5nIGhhcHBlbmVkIGxhc3QgTiBzZWNvbmRzCitQUk9HUkVTU19VUERBVEUgPSAzMC4wICAgIyBzZWNvbmRzCisKKyMgSWYgaW50ZXJydXB0ZWQsIGRpc3BsYXkgdGhlIHdhaXQgcHJvZ3Jlc3MgZXZlcnkgTiBzZWNvbmRzCitXQUlUX1BST0dSRVNTID0gMi4wICAgIyBzZWNvbmRzCisKKworZGVmIHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdG5hbWUsIG5zKToKKyAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgaW4gYSBzdWJwcm9jZXNzIHdpdGggLS1zbGF2ZWFyZ3MuCisKKyAgICBucyBpcyB0aGUgb3B0aW9uIE5hbWVzcGFjZSBwYXJzZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiByZWdydGVzdAorICAgIGlzIGludm9rZWQgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIC0tc2xhdmVhcmdzIGFyZ3VtZW50OyB3aGVuIHRoZQorICAgIHN1YnByb2Nlc3MgZXhpdHMsIGl0cyByZXR1cm4gY29kZSwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJldHVybmVkIGFzIGEKKyAgICAzLXR1cGxlLgorICAgICIiIgorICAgIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKKworICAgIG5zX2RpY3QgPSB2YXJzKG5zKQorICAgIHNsYXZlYXJncyA9IChuc19kaWN0LCB0ZXN0bmFtZSkKKyAgICBzbGF2ZWFyZ3MgPSBqc29uLmR1bXBzKHNsYXZlYXJncykKKworICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgKnN1cHBvcnQuYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICctWCcsICdmYXVsdGhhbmRsZXInLAorICAgICAgICAgICAnLW0nLCAndGVzdC5yZWdydGVzdCcsCisgICAgICAgICAgICctLXNsYXZlYXJncycsIHNsYXZlYXJnc10KKyAgICBpZiBucy5wZ286CisgICAgICAgIGNtZCArPSBbJy0tcGdvJ10KKworICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCisgICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgorICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KKyAgICBwb3BlbiA9IFBvcGVuKGNtZCwKKyAgICAgICAgICAgICAgICAgIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwKKyAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPShvcy5uYW1lICE9ICdudCcpLAorICAgICAgICAgICAgICAgICAgY3dkPXN1cHBvcnQuU0FWRURDV0QpCisgICAgd2l0aCBwb3BlbjoKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwb3Blbi5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKKyAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKKworCitkZWYgcnVuX3Rlc3RzX3NsYXZlKHNsYXZlYXJncyk6CisgICAgbnNfZGljdCwgdGVzdG5hbWUgPSBqc29uLmxvYWRzKHNsYXZlYXJncykKKyAgICBucyA9IHR5cGVzLlNpbXBsZU5hbWVzcGFjZSgqKm5zX2RpY3QpCisKKyAgICBzZXR1cF90ZXN0cyhucykKKworICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gcnVudGVzdChucywgdGVzdG5hbWUpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKKyAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQorCisgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCisgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpLCBmbHVzaD1UcnVlKQorICAgIHN5cy5leGl0KDApCisKKworIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgorY2xhc3MgTXVsdGlwcm9jZXNzSXRlcmF0b3I6CisKKyAgICAiIiJBIHRocmVhZC1zYWZlIGl0ZXJhdG9yIG92ZXIgdGVzdHMgZm9yIG11bHRpcHJvY2VzcyBtb2RlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5sb2NrOgorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCd0ZXN0cyBpbnRlcnJ1cHRlZCcpCisgICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRlc3RzKQorCisKK2NsYXNzIE11bHRpcHJvY2Vzc1RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGVuZGluZywgb3V0cHV0LCBucyk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQorICAgICAgICBzZWxmLnBlbmRpbmcgPSBwZW5kaW5nCisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CisgICAgICAgIHNlbGYubnMgPSBucworICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQorCisgICAgZGVmIF9ydW50ZXN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0ID0gbmV4dChzZWxmLnBlbmRpbmcpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSB0ZXN0CisKKyAgICAgICAgICAgIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyID0gcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0LCBzZWxmLm5zKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSBOb25lCisKKyAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCisgICAgICAgIGlmIHJldGNvZGUgIT0gMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IChDSElMRF9FUlJPUiwgIkV4aXQgY29kZSAlcyIgJSByZXRjb2RlKQorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQorICAgICAgICBzZWxmLm91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3RvcCA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBub3Qgc3RvcDoKKyAgICAgICAgICAgICAgICBzdG9wID0gc2VsZi5fcnVudGVzdCgpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIHJ1bl90ZXN0c19tdWx0aXByb2Nlc3MocmVncnRlc3QpOgorICAgIG91dHB1dCA9IHF1ZXVlLlF1ZXVlKCkKKyAgICBwZW5kaW5nID0gTXVsdGlwcm9jZXNzSXRlcmF0b3IocmVncnRlc3QudGVzdHMpCisgICAgdGVzdF90aW1lb3V0ID0gcmVncnRlc3QubnMudGltZW91dAorICAgIHVzZV90aW1lb3V0ID0gKHRlc3RfdGltZW91dCBpcyBub3QgTm9uZSkKKworICAgIHdvcmtlcnMgPSBbTXVsdGlwcm9jZXNzVGhyZWFkKHBlbmRpbmcsIG91dHB1dCwgcmVncnRlc3QubnMpCisgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZWdydGVzdC5ucy51c2VfbXApXQorICAgIHByaW50KCJSdW4gdGVzdHMgaW4gcGFyYWxsZWwgdXNpbmcgJXMgY2hpbGQgcHJvY2Vzc2VzIgorICAgICAgICAgICUgbGVuKHdvcmtlcnMpKQorICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgd29ya2VyLnN0YXJ0KCkKKworICAgIGRlZiBnZXRfcnVubmluZyh3b3JrZXJzKToKKyAgICAgICAgcnVubmluZyA9IFtdCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIGN1cnJlbnRfdGVzdCA9IHdvcmtlci5jdXJyZW50X3Rlc3QKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50X3Rlc3Q6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGR0ID0gdGltZS5tb25vdG9uaWMoKSAtIHdvcmtlci5zdGFydF90aW1lCisgICAgICAgICAgICBpZiBkdCA+PSBQUk9HUkVTU19NSU5fVElNRToKKyAgICAgICAgICAgICAgICBydW5uaW5nLmFwcGVuZCgnJXMgKCUuMGYgc2VjKScgJSAoY3VycmVudF90ZXN0LCBkdCkpCisgICAgICAgIHJldHVybiBydW5uaW5nCisKKyAgICBmaW5pc2hlZCA9IDAKKyAgICB0ZXN0X2luZGV4ID0gMQorICAgIGdldF90aW1lb3V0ID0gbWF4KFBST0dSRVNTX1VQREFURSwgUFJPR1JFU1NfTUlOX1RJTUUpCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IHJlZ3J0ZXN0Lm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcih0ZXN0X3RpbWVvdXQsIGV4aXQ9VHJ1ZSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZW0gPSBvdXRwdXQuZ2V0KHRpbWVvdXQ9Z2V0X3RpbWVvdXQpCisgICAgICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcnVubmluZyA9IGdldF9ydW5uaW5nKHdvcmtlcnMpCisgICAgICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ3J1bm5pbmc6ICVzJyAlICcsICcuam9pbihydW5uaW5nKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gaXRlbQorICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZpbmlzaGVkICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVncnRlc3QuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICAjIERpc3BsYXkgcHJvZ3Jlc3MKKyAgICAgICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKKyAgICAgICAgICAgIHRleHQgPSBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdCwgb2spCisgICAgICAgICAgICBpZiAob2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpCisgICAgICAgICAgICAgICAgYW5kIHRlc3RfdGltZSA+PSBQUk9HUkVTU19NSU5fVElNRQorICAgICAgICAgICAgICAgIGFuZCBub3QgcmVncnRlc3QubnMucGdvKToKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgKCUuMGYgc2VjKScgJSB0ZXN0X3RpbWUKKyAgICAgICAgICAgIHJ1bm5pbmcgPSBnZXRfcnVubmluZyh3b3JrZXJzKQorICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgLS0gcnVubmluZzogJXMnICUgJywgJy5qb2luKHJ1bm5pbmcpCisgICAgICAgICAgICByZWdydGVzdC5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgICMgQ29weSBzdGRvdXQgYW5kIHN0ZGVyciBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAgICAgICBpZiBzdGRvdXQ6CisgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0LCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgaWYgc3RkZXJyIGFuZCBub3QgcmVncnRlc3QubnMucGdvOgorICAgICAgICAgICAgICAgIHByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorCisgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gSU5URVJSVVBURUQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKKyAgICAgICAgICAgICAgICBtc2cgPSAiQ2hpbGQgZXJyb3Igb24ge306IHt9Ii5mb3JtYXQodGVzdCwgcmVzdWx0WzFdKQorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICB0ZXN0X2luZGV4ICs9IDEKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJlZ3J0ZXN0LmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwZW5kaW5nLmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwcmludCgpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKKworICAgICMgSWYgdGVzdHMgYXJlIGludGVycnVwdGVkLCB3YWl0IHVudGlsIHRlc3RzIGNvbXBsZXRlCisgICAgd2FpdF9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBydW5uaW5nID0gW3dvcmtlci5jdXJyZW50X3Rlc3QgZm9yIHdvcmtlciBpbiB3b3JrZXJzXQorICAgICAgICBydW5uaW5nID0gbGlzdChmaWx0ZXIoYm9vbCwgcnVubmluZykpCisgICAgICAgIGlmIG5vdCBydW5uaW5nOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBkdCA9IHRpbWUubW9ub3RvbmljKCkgLSB3YWl0X3N0YXJ0CisgICAgICAgIGxpbmUgPSAiV2FpdGluZyBmb3IgJXMgKCVzIHRlc3RzKSIgJSAoJywgJy5qb2luKHJ1bm5pbmcpLCBsZW4ocnVubmluZykpCisgICAgICAgIGlmIGR0ID49IFdBSVRfUFJPR1JFU1M6CisgICAgICAgICAgICBsaW5lID0gIiVzIHNpbmNlICUuMGYgc2VjIiAlIChsaW5lLCBkdCkKKyAgICAgICAgcHJpbnQobGluZSkKKyAgICAgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICAgICAgd29ya2VyLmpvaW4oV0FJVF9QUk9HUkVTUykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmYmMxNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5CkBAIC0wLDAgKzEsMjg1IEBACitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCisKKworIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAorIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCisjIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCisjIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cworIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KKyMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKKyMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCisKK2NsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6CisgICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KKworICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKKyAgICAgICAgICAgICNzdHVmZgorCisgICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKKyAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJworICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAorICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KKyAgICAiIiIKKworICAgIGNoYW5nZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgorICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKKyAgICAgICAgc2VsZi5wZ28gPSBwZ28KKworICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKKyAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCisgICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCisgICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0CisgICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKKyAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KKyAgICAjCisgICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCisgICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCisKKyAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKKyAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCisgICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAorICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKKyAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCisgICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKKyAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgorICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAorICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCisgICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICAnc2h1dGlsX2FyY2hpdmVfZm9ybWF0cycsICdzaHV0aWxfdW5wYWNrX2Zvcm1hdHMnLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgorICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCisKKyAgICBkZWYgZ2V0X2N3ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCisgICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKKworICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKKworICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKKworICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KKworICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCisgICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKKyAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKKyAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQorCisgICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgorICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCisgICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KKworICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKKyAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKKworICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KKyAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgorICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XworCisgICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQorCisgICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCisgICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KKyAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKKworICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQorICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAorICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQorICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQorCisgICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCisKKyAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKKyAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKKyAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6CisgICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycworICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6CisgICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgorICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCisgICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KKworICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKKyAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KKyAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQorICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IHRocmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKKyAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCisKKyAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cworICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cworICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCisgICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCisgICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQorCisgICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAorICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCisgICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKKyAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKKworICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6CisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCisgICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQorICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKKyAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKKworICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQorICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KKyAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKKyAgICAgICAgcGFpcmluZ3MgPSBbXQorICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBwYWlyaW5ncworICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6CisgICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgorICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgorCisgICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgorICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKKyAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkgICMgU29tZSByZXNvdXJjZXMgdXNlIHdlYWsgcmVmZXJlbmNlcworICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgorICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCisgICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKKyAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6CisgICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJXYXJuaW5nIC0tIHtuYW1lfSB3YXMgbW9kaWZpZWQgYnkge3NlbGYudGVzdG5hbWV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiIgIEJlZm9yZToge29yaWdpbmFsfSIiXG4iZiIgIEFmdGVyOiAge2N1cnJlbnR9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI0NTMxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkKQEAgLTAsMCArMSwxMjEgQEAKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJlZmxlYWsgaW1wb3J0IHdhcm1fY2FjaGVzCisKKworZGVmIHNldHVwX3Rlc3RzKG5zKToKKyAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzIChlLmcuIHNlZ2ZhdWx0KQorICAgIGZhdWx0aGFuZGxlci5lbmFibGUoYWxsX3RocmVhZHM9VHJ1ZSkKKworICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBTSUdBTFJNIG9yIFNJR1VTUjEgc2lnbmFsCisgICAgc2lnbmFscyA9IFtdCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdBTFJNJyk6CisgICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdBTFJNKQorICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpOgorICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHVVNSMSkKKyAgICBmb3Igc2lnbnVtIGluIHNpZ25hbHM6CisgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWdudW0sIGNoYWluPVRydWUpCisKKyAgICByZXBsYWNlX3N0ZG91dCgpCisgICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCisKKyAgICBpZiBucy50ZXN0ZGlyOgorICAgICAgICAjIFByZXBlbmQgdGVzdCBkaXJlY3RvcnkgdG8gc3lzLnBhdGgsIHNvIHJ1bnRlc3QoKSB3aWxsIGJlIGFibGUKKyAgICAgICAgIyB0byBsb2NhdGUgdGVzdHMKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aChucy50ZXN0ZGlyKSkKKworICAgICMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KKyAgICAjIExpYi8pIGFuZCwgaWYgd2UgY2hhbmdlIHRoZSBDV0QgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHRlbXBvcmFyeSBkaXIsIHNvbWUKKyAgICAjIGltcG9ydHMgbWlnaHQgZmFpbC4gIFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBtb2R1bGVzIGltcG9ydGVkIGJlZm9yZSBvcy5jaGRpcigpLgorICAgICMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgorICAgICMgdGhleSBhcmUgZm91bmQgaW4gdGhlIENXRCB0aGVpciBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSByZWxhdGl2ZSAodGhpcworICAgICMgaGFwcGVucyBiZWZvcmUgdGhlIGNoZGlyKS4gIEFsbCB0aGUgbW9kdWxlcyBpbXBvcnRlZCBhZnRlciB0aGUgY2hkaXIsIGFyZQorICAgICMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQorICAgICMgKHNpdGUucHkgYWJzb2x1dGl6ZSB0aGVtKSwgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIGFic29sdXRlIHRvby4KKyAgICAjIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gYWJzb2x1dGl6ZSBtYW51YWxseSB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIG9mCisgICAgIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KKyAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgaW5kZXgsIHBhdGggaW4gZW51bWVyYXRlKG1vZHVsZS5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kdWxlLl9fcGF0aF9fW2luZGV4XSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQorCisgICAgIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAorICAgICMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KKyAgICAjIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aGVuIHJ1bm5pbmcgdGVzdF9yZS5weSBhbmQgdGVzdF9zcmUucHkuICBUaGUKKyAgICAjIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCisgICAgIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKKyAgICAjIHN1ZmZlciBmcm9tIHNtYWxsIGRlZmF1bHQgc3RhY2sgbGltaXRzLgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQorICAgICAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKKyAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfU1RBQ0ssIChuZXdzb2Z0LCBoYXJkKSkKKworICAgIGlmIG5zLmh1bnRybGVha3M6CisgICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQorCisgICAgICAgICMgQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byB2YXJpb3VzIGNhY2hlcworICAgICAgICAjIGZpbGxpbmcgc2xvd2x5IHdpdGggcmFuZG9tIGRhdGE6CisgICAgICAgIHdhcm1fY2FjaGVzKCkKKworICAgIGlmIG5zLm1lbWxpbWl0IGlzIG5vdCBOb25lOgorICAgICAgICBzdXBwb3J0LnNldF9tZW1saW1pdChucy5tZW1saW1pdCkKKworICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZChucy50aHJlc2hvbGQpCisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKKyAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCisKKyAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCisKKworZGVmIHJlcGxhY2Vfc3Rkb3V0KCk6CisgICAgIiIiU2V0IHN0ZG91dCBlbmNvZGVyIGVycm9yIGhhbmRsZXIgdG8gYmFja3NsYXNocmVwbGFjZSAoYXMgc3RkZXJyIGVycm9yCisgICAgaGFuZGxlcikgdG8gYXZvaWQgVW5pY29kZUVuY29kZUVycm9yIHdoZW4gcHJpbnRpbmcgYSB0cmFjZWJhY2siIiIKKyAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IG9wZW4oc3Rkb3V0LmZpbGVubygpLCAndycsCisgICAgICAgIGVuY29kaW5nPXN0ZG91dC5lbmNvZGluZywKKyAgICAgICAgZXJyb3JzPSJiYWNrc2xhc2hyZXBsYWNlIiwKKyAgICAgICAgY2xvc2VmZD1GYWxzZSwKKyAgICAgICAgbmV3bGluZT0nXG4nKQorCisgICAgZGVmIHJlc3RvcmVfc3Rkb3V0KCk6CisgICAgICAgIHN5cy5zdGRvdXQuY2xvc2UoKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisgICAgYXRleGl0LnJlZ2lzdGVyKHJlc3RvcmVfc3Rkb3V0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weSBiL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKaW5kZXggZjIwZmRjMC4uMjZlOTM2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CkBAIC0yNjYsOSArMjY2LDIxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbGlzdCgic3BhbWVnZ3MiKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuZXh0ZW5kLCBOb25lKQotCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQpCiAKKyAgICAgICAgIyBvdmVyZmxvdyB0ZXN0LiBpc3N1ZTE2MjEKKyAgICAgICAgY2xhc3MgQ3VzdG9tSXRlcjoKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5tYXhzaXplCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMSwyLDMsNF0pCisgICAgICAgIGEuZXh0ZW5kKEN1c3RvbUl0ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMSwyLDMsNF0pCisKKwogICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkKICAgICAgICAgYS5pbnNlcnQoMCwgLTIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5IGIvTGliL3Rlc3QvbG9ja190ZXN0cy5weQppbmRleCBhNjRhYTE4Li5hNmNiM2IxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKQEAgLTcsNiArNyw3IEBACiBmcm9tIF90aHJlYWQgaW1wb3J0IHN0YXJ0X25ld190aHJlYWQsIFRJTUVPVVRfTUFYCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCkBAIC0xOTgsNiArMTk5LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXSkKICAgICAgICAgc2VsZi5hc3NlcnRUaW1lb3V0KHJlc3VsdHNbMV0sIDAuNSkKIAorICAgIGRlZiB0ZXN0X3dlYWtyZWZfZXhpc3RzKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlZigpKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9kZWxldGVkKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIGRlbCBsb2NrCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlZigpKQorCiAKIGNsYXNzIExvY2tUZXN0cyhCYXNlTG9ja1Rlc3RzKToKICAgICAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5IGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKaW5kZXggYTFmMjk4ZC4uNGQ5ZjAxYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKKysrIGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKQEAgLTMsNyArMyw2IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IDc5MjJiNTQuLjVjODMzNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgICAgICAgICBiJzAnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1AKICAgICAgICAgICAgIGInMScsICAgICAgICAgICAgICAgICAgICAgICAjIFBPUF9NQVJLCiAgICAgICAgICAgICBiJzInLCAgICAgICAgICAgICAgICAgICAgICAgIyBEVVAKLSAgICAgICAgICAgICMgYicoMicsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKDInLAogICAgICAgICAgICAgYidSJywgICAgICAgICAgICAgICAgICAgICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJylSJywKICAgICAgICAgICAgIGInYScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgIGInTmInLAogICAgICAgICAgICAgYidkJywgICAgICAgICAgICAgICAgICAgICAgICMgRElDVAogICAgICAgICAgICAgYidlJywgICAgICAgICAgICAgICAgICAgICAgICMgQVBQRU5EUwotICAgICAgICAgICAgIyBiJyhlJywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhlJywKICAgICAgICAgICAgIGInaWJ1aWx0aW5zXG5saXN0XG4nLCAgICAgICAjIElOU1QKICAgICAgICAgICAgIGInbCcsICAgICAgICAgICAgICAgICAgICAgICAjIExJU1QKICAgICAgICAgICAgIGInbycsICAgICAgICAgICAgICAgICAgICAgICAjIE9CSgpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgIGInTk5zJywKICAgICAgICAgICAgIGIndCcsICAgICAgICAgICAgICAgICAgICAgICAjIFRVUExFCiAgICAgICAgICAgICBiJ3UnLCAgICAgICAgICAgICAgICAgICAgICAgIyBTRVRJVEVNUwotICAgICAgICAgICAgIyBiJyh1JywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgZG9lc24ndCByYWlzZQorICAgICAgICAgICAgYicodScsCiAgICAgICAgICAgICBiJ30oTnUnLAogICAgICAgICAgICAgYidceDgxJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKCiAgICAgICAgICAgICBiJylceDgxJywKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBiJ05ceDg3JywKICAgICAgICAgICAgIGInTk5ceDg3JywKICAgICAgICAgICAgIGInXHg5MCcsICAgICAgICAgICAgICAgICAgICAjIEFERElURU1TCi0gICAgICAgICAgICAjIGInKFx4OTAnLCAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGInKFx4OTAnLAogICAgICAgICAgICAgYidceDkxJywgICAgICAgICAgICAgICAgICAgICMgRlJPWkVOU0VUCiAgICAgICAgICAgICBiJ1x4OTInLCAgICAgICAgICAgICAgICAgICAgIyBORVdPQkpfRVgKICAgICAgICAgICAgIGInKX1ceDkyJywKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKICAgICBkZWYgdGVzdF9iYWRfbWFyayhzZWxmKToKICAgICAgICAgYmFkcGlja2xlcyA9IFsKLSAgICAgICAgICAgICMgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAorICAgICAgICAgICAgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAogICAgICAgICAgICAgYidOKDInLCAgICAgICAgICAgICAgICAgICAgICMgRFVQCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKShSJywgICAgIyBSRURVQ0UKICAgICAgICAgICAgIGInY2J1aWx0aW5zXG5saXN0XG4oKVInLApAQCAtMTA4MSw3ICsxMDgxLDcgQEAKICAgICAgICAgICAgIGInTihceDk0JywgICAgICAgICAgICAgICAgICAjIE1FTU9JWkUKICAgICAgICAgXQogICAgICAgICBmb3IgcCBpbiBiYWRwaWNrbGVzOgotICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX21hcmtfZXJyb3JzLCBwKQorICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX3N0YWNrX2Vycm9ycywgcCkKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9kYXRhKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VucGlja2xpbmdfZXJyb3IoRU9GRXJyb3IsIGInJykKQEAgLTE4NTUsMTYgKzE4NTUsMTQgQEAKICAgICAgICAgeC5hYmMgPSA2NjYKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHByb3RvPXByb3RvKToKLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgeCwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgaWYgcHJvdG8gPCAxOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInXG5MNjQyMDYnLCBzKSAgIyBMT05HCiAgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNXHhjZVx4ZmEnLCBzKSAgIyBCSU5JTlQyCisgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidYXHgwNFx4MDBceDAwXHgwMEZBQ0UnLCBzKSAgIyBCSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHByb3RvID49IDQKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1x4OGNceDA0RkFDRScsIHMpICAjIFNIT1JUX0JJTlVOSUNPREUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkpfRVgsIHMpLApAQCAtMjU4MywxMSArMjU4MSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGluZ0Vycm9yLCBCYWRQaWNrbGVyKCkuZHVtcCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGlja2xlLlVucGlja2xpbmdFcnJvciwgQmFkVW5waWNrbGVyKCkubG9hZCkKIAotICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKLSAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAotICAgICAgICBzID0gYnl0ZXMoWzB4NTgsIDAsIDAsIDAsIDB4NTRdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgcGlja2xlLmxvYWRzLCBzKQotCiAKIGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiYThhNzgwLi4yMWIwZWRmCi0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC02LDE2MDUgKzYsMzMgQEAKIFJ1biB0aGlzIHNjcmlwdCB3aXRoIC1oIG9yIC0taGVscCBmb3IgZG9jdW1lbnRhdGlvbi4KICIiIgogCi1VU0FHRSA9ICIiIlwKLXB5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCi0iIiIKLQotREVTQ1JJUFRJT04gPSAiIiJcCi1SdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCi0KLUlmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCi10aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCi10aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCi0KLUZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZwotY29tbWFuZCBsaW5lOgotCi1weXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KLSIiIgotCi1FUElMT0cgPSAiIiJcCi1BZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgotCi0tciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCi1pbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQotdGVzdCBvcmRlcnMuCi0KLS1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCi1vciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKLVB5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCi1vdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCi10aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgotV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKLWlzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCi1kb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bwotY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KLQotLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAotbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KLVRoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKLXJlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKLXRoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgotCi0tZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQotb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCi1saW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgotd2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KLQotLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KLWxlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCi1GcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KLQotLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bwotc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAotYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi10ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgotb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCi1yZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKLSJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCi0KLS1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKLXR5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KLTIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCi10ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCi1zZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCi13aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQotdGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKLXNob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91Ci1zaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKLXRoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Ci10YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKLWxpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKLXRvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKLWdlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgotCi0tdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAotc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgotVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKLXJlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKLQotICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCi0KLSAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCi0KLSAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgotICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgotICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCi0KLSAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCi0gICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KLQotICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQotICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQotICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgotCi0gICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yawotICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCi0KLSAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAotICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCi0KLSAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KLQotICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KLQotICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KLQotICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KLQotVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKLWV4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKLW9wdGlvbiAnLXVhbGwsLWd1aScuCi0iIiIKLQogIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgogaW1wb3J0IGltcG9ydGxpYgogCi1pbXBvcnQgYXJncGFyc2UKLWltcG9ydCBidWlsdGlucwotaW1wb3J0IGZhdWx0aGFuZGxlcgotaW1wb3J0IGlvCi1pbXBvcnQganNvbgotaW1wb3J0IGxvY2FsZQotaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKLWltcG9ydCBzeXNjb25maWcKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCi1mcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbgogCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHRocmVhZGluZyA9IE5vbmUKLXRyeToKLSAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCiAKKyMgQWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGp1c3QgaW4gY2FzZSkKK21haW5faW5fdGVtcF9jd2QgPSBtYWluCiAKLSMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KLSMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQotIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KLSMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgotIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCi0jIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKLSMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQotIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgotIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgotIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KLWZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgotICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbb3MucGF0aC5hYnNwYXRoKHBhdGgpIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KLSAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCiAKLQotIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAotIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgotIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCi0jIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCi0jIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAotIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KLWlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCByZXNvdXJjZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQotICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQotICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCi0KLSMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgotUEFTU0VEID0gMQotRkFJTEVEID0gMAotRU5WX0NIQU5HRUQgPSAtMQotU0tJUFBFRCA9IC0yCi1SRVNPVVJDRV9ERU5JRUQgPSAtMwotSU5URVJSVVBURUQgPSAtNAotQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCi0KLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCi1SRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKLSAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCi0KLSMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKLSMgdG8ga2VlcCB0aGUgdGVzdCBmaWxlcyBpbiBhIHN1YmZvbGRlci4gIFRoaXMgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKLSMgZmlsZXMgdXNpbmcgdGhlICJtYWtlIGRpc3RjbGVhbiIgY29tbWFuZC4KLWlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICBURU1QRElSID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdidWlsZCcpCi1lbHNlOgotICAgIFRFTVBESVIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKLVRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoVEVNUERJUikKLQotY2xhc3MgX0FyZ1BhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6Ci0KLSAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSArICJcblBhc3MgLWggb3IgLS1oZWxwIGZvciBjb21wbGV0ZSBoZWxwLiIpCi0KLWRlZiBfY3JlYXRlX3BhcnNlcigpOgotICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgotICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KLSAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQotCi0gICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KLSAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KLSAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJwotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQotICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1QJywgJy0tcGdvJywgZGVzdD0ncGdvJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZW5hYmxlIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiB0cmFpbmluZycpCi0KLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmdzJywgbmFyZ3M9YXJncGFyc2UuUkVNQUlOREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKLQotICAgIHJldHVybiBwYXJzZXIKLQotZGVmIHJlbGF0aXZlX2ZpbGVuYW1lKHN0cmluZyk6Ci0gICAgIyBDV0QgaXMgcmVwbGFjZWQgd2l0aCBhIHRlbXBvcmFyeSBkaXIgYmVmb3JlIGNhbGxpbmcgbWFpbigpLCBzbyB3ZQotICAgICMgam9pbiBpdCB3aXRoIHRoZSBzYXZlZCBDV0Qgc28gaXQgZW5kcyB1cCB3aGVyZSB0aGUgdXNlciBleHBlY3RzLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc3RyaW5nKQotCi1kZWYgaHVudHJsZWFrcyhzdHJpbmcpOgotICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQotICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgotICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKLSAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCi0gICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQotICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0Ci0gICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKLSAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCi0KLWRlZiByZXNvdXJjZXNfbGlzdChzdHJpbmcpOgotICAgIHUgPSBbeC5sb3dlcigpIGZvciB4IGluIHN0cmluZy5zcGxpdCgnLCcpXQotICAgIGZvciByIGluIHU6Ci0gICAgICAgIGlmIHIgPT0gJ2FsbCcgb3IgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgIHIgPSByWzE6XQotICAgICAgICBpZiByIG5vdCBpbiBSRVNPVVJDRV9OQU1FUzoKLSAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKCdpbnZhbGlkIHJlc291cmNlOiAnICsgcikKLSAgICByZXR1cm4gdQotCi1kZWYgX3BhcnNlX2FyZ3MoYXJncywgKiprd2FyZ3MpOgotICAgICMgRGVmYXVsdHMKLSAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSh0ZXN0ZGlyPU5vbmUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsCi0gICAgICAgICBleGNsdWRlPUZhbHNlLCBzaW5nbGU9RmFsc2UsIHJhbmRvbWl6ZT1GYWxzZSwgZnJvbWZpbGU9Tm9uZSwKLSAgICAgICAgIGZpbmRsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLCB0cmFjZT1GYWxzZSwgY292ZXJkaXI9J2NvdmVyYWdlJywKLSAgICAgICAgIHJ1bmxlYWtzPUZhbHNlLCBodW50cmxlYWtzPUZhbHNlLCB2ZXJib3NlMj1GYWxzZSwgcHJpbnRfc2xvdz1GYWxzZSwKLSAgICAgICAgIHJhbmRvbV9zZWVkPU5vbmUsIHVzZV9tcD1Ob25lLCB2ZXJib3NlMz1GYWxzZSwgZm9yZXZlcj1GYWxzZSwKLSAgICAgICAgIGhlYWRlcj1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsIHBnbz1GYWxzZSkKLSAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobnMsIGspOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclciBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBmdW5jdGlvbicgJSBrKQotICAgICAgICBzZXRhdHRyKG5zLCBrLCB2KQotICAgIGlmIG5zLnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKLSAgICAgICAgbnMudXNlX3Jlc291cmNlcyA9IFtdCi0KLSAgICBwYXJzZXIgPSBfY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1hcmdzLCBuYW1lc3BhY2U9bnMpCi0KLSAgICBpZiBucy5zaW5nbGUgYW5kIG5zLmZyb21maWxlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMudHJhY2U6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5maW5kbGVha3M6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLWwgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5tZW1saW1pdDoKLSAgICAgICAgcGFyc2VyLmVycm9yKCItTSBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy5mYWlsZmFzdCBhbmQgbm90IChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UzKToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItRy8tLWZhaWxmYXN0IG5lZWRzIGVpdGhlciAtdiBvciAtVyIpCi0KLSAgICBpZiBucy5xdWlldDoKLSAgICAgICAgbnMudmVyYm9zZSA9IDAKLSAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgotICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6Ci0gICAgICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6Ci0gICAgICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBUaGUgdGltZW91dCBvcHRpb24gcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlciIpCi0gICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQotICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6Ci0gICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAotICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQotICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKLSAgICBpZiBucy51c2U6Ci0gICAgICAgIGZvciBhIGluIG5zLnVzZToKLSAgICAgICAgICAgIGZvciByIGluIGE6Ci0gICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKLSAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgICAgICAgICBpZiByZW1vdmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCi0gICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgotICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQotICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgotICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCi0KLSAgICByZXR1cm4gbnMKLQotCi1kZWYgcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0bmFtZSwgbnMpOgotICAgICIiIlJ1biB0aGUgZ2l2ZW4gdGVzdCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCAtLXNsYXZlYXJncy4KLQotICAgIG5zIGlzIHRoZSBvcHRpb24gTmFtZXNwYWNlIHBhcnNlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIHJlZ3J0ZXN0Ci0gICAgaXMgaW52b2tlZCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgLS1zbGF2ZWFyZ3MgYXJndW1lbnQ7IHdoZW4gdGhlCi0gICAgc3VicHJvY2VzcyBleGl0cywgaXRzIHJldHVybiBjb2RlLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmV0dXJuZWQgYXMgYQotICAgIDMtdHVwbGUuCi0gICAgIiIiCi0gICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQotICAgIGJhc2VfY21kID0gKFtzeXMuZXhlY3V0YWJsZV0gKyBzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpICsKLSAgICAgICAgICAgICAgICBbJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctbScsICd0ZXN0LnJlZ3J0ZXN0J10pCi0gICAgIyByZXF1aXJlZCB0byBzcGF3biBhIG5ldyBwcm9jZXNzIHdpdGggUEdPIGZsYWcgb24vb2ZmCi0gICAgaWYgbnMucGdvOgotICAgICAgICBiYXNlX2NtZCA9IGJhc2VfY21kICsgWyctLXBnbyddCi0gICAgc2xhdmVhcmdzID0gKAotICAgICAgICAgICAgKHRlc3RuYW1lLCBucy52ZXJib3NlLCBucy5xdWlldCksCi0gICAgICAgICAgICBkaWN0KGh1bnRybGVha3M9bnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlcz1ucy51c2VfcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgbWF0Y2hfdGVzdHM9bnMubWF0Y2hfdGVzdHMsIHBnbz1ucy5wZ28pKQotICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCi0gICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgotICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KLSAgICBwb3BlbiA9IFBvcGVuKGJhc2VfY21kICsgWyctLXNsYXZlYXJncycsIGpzb24uZHVtcHMoc2xhdmVhcmdzKV0sCi0gICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCi0gICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKLSAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQotICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQotICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKLSAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKLQotCi1kZWYgbWFpbih0ZXN0cz1Ob25lLCAqKmt3YXJncyk6Ci0gICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCi0KLSAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKLSAgICBhY2NvcmRpbmdseS4KLQotICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCi0gICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKLQotICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KLSAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQotICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KLQotICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQotICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQotICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KLQotICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCi0gICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAotICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKLSAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncwotICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgIiIiCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycyAoZS5nLiBzZWdmYXVsdCkKLSAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKGFsbF90aHJlYWRzPVRydWUpCi0KLSAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gU0lHQUxSTSBvciBTSUdVU1IxIHNpZ25hbAotICAgIHNpZ25hbHMgPSBbXQotICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpOgotICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHQUxSTSkKLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR1VTUjEpCi0gICAgZm9yIHNpZ251bSBpbiBzaWduYWxzOgotICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbnVtLCBjaGFpbj1UcnVlKQotCi0gICAgcmVwbGFjZV9zdGRvdXQoKQotCi0gICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCi0KLSAgICBucyA9IF9wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgKiprd2FyZ3MpCi0KLSAgICBpZiBucy5odW50cmxlYWtzOgotICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKLSAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgotICAgICAgICB3YXJtX2NhY2hlcygpCi0gICAgaWYgbnMubWVtbGltaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQuc2V0X21lbWxpbWl0KG5zLm1lbWxpbWl0KQotICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKLSAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQotICAgIGlmIG5zLm5vd2luZG93czoKLSAgICAgICAgcHJpbnQoJ1RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAnCi0gICAgICAgICAgICAgICdVc2UgLXZ2IHRvIGRpc3BsYXkgYXNzZXJ0aW9ucyBpbiBzdGRlcnIuJykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBtc3ZjcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKLSAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCi0gICAgaWYgbnMud2FpdDoKLSAgICAgICAgaW5wdXQoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKQotCi0gICAgaWYgbnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgotICAgICAgICBhcmdzLCBrd2FyZ3MgPSBqc29uLmxvYWRzKG5zLnNsYXZlYXJncykKLSAgICAgICAgaWYga3dhcmdzLmdldCgnaHVudHJsZWFrcycpOgotICAgICAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKLSAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKLSAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQotICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCi0gICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgIGdvb2QgPSBbXQotICAgIGJhZCA9IFtdCi0gICAgc2tpcHBlZCA9IFtdCi0gICAgcmVzb3VyY2VfZGVuaWVkcyA9IFtdCi0gICAgZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCi0gICAgaW50ZXJydXB0ZWQgPSBGYWxzZQotCi0gICAgaWYgbnMuZmluZGxlYWtzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGZpbmRsZWFrcy4nKQotICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQotICAgICAgICAgICAgIyBnYXJiYWdlIHRoYXQgaXMgbm90IGNvbGxlY3RhYmxlIGJ5IHRoZSBHQyBpcyByZXBvcnRlZC4KLSAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKLSAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UgPSBbXQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGZwOgotICAgICAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgdGVzdHMgPSBbbmV4dF90ZXN0XQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgIGlmIG5zLmZyb21maWxlOgotICAgICAgICB0ZXN0cyA9IFtdCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgbnMuZnJvbWZpbGUpKSBhcyBmcDoKLSAgICAgICAgICAgIGNvdW50X3BhdCA9IHJlLmNvbXBpbGUocidcW1xzKlxkKy9ccypcZCtcXScpCi0gICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKLSAgICAgICAgICAgICAgICBsaW5lID0gY291bnRfcGF0LnN1YignJywgbGluZSkKLSAgICAgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGlmIGd1dHMgYW5kIG5vdCBndXRzWzBdLnN0YXJ0c3dpdGgoJyMnKToKLSAgICAgICAgICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKGd1dHMpCi0KLSAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgotICAgIHJlbW92ZXB5KG5zLmFyZ3MpCi0gICAgcmVtb3ZlcHkodGVzdHMpCi0KLSAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCi0gICAgbm90dGVzdHMgPSBOT1RURVNUUy5jb3B5KCkKLSAgICBpZiBucy5leGNsdWRlOgotICAgICAgICBmb3IgYXJnIGluIG5zLmFyZ3M6Ci0gICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6Ci0gICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKLSAgICAgICAgICAgIG5vdHRlc3RzLmFkZChhcmcpCi0gICAgICAgIG5zLmFyZ3MgPSBbXQotCi0gICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgotICAgIGlmIChucy52ZXJib3NlIG9yIG5zLmhlYWRlciBvcgotICAgICAgICAgICAgbm90IChucy5wZ28gb3IgbnMucXVpZXQgb3IgbnMuc2luZ2xlIG9yIHRlc3RzIG9yIG5zLmFyZ3MpKToKLSAgICAgICAgIyBQcmludCBiYXNpYyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgotICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCi0gICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKLSAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKLSAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKLSAgICAgICAgcHJpbnQoIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MpCi0KLSAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbwotICAgICMgZG9uJ3QgYWRkIGRlZmF1bHQgdGVzdHMgdG8gYmUgZXhlY3V0ZWQgb3Igc2tpcHBlZCAocGFzcyBlbXB0eSB2YWx1ZXMpCi0gICAgaWYgbnMudGVzdGRpcjoKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgbGlzdCgpLCBzZXQoKSkKLSAgICBlbHNlOgotICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCi0KLSAgICBzZWxlY3RlZCA9IHRlc3RzIG9yIG5zLmFyZ3Mgb3IgYWxsdGVzdHMKLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWRbOjFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1thbGx0ZXN0cy5pbmRleChzZWxlY3RlZFswXSkrMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQotICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgotICAgIGlmIG5zLnN0YXJ0OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZWwgc2VsZWN0ZWRbOnNlbGVjdGVkLmluZGV4KG5zLnN0YXJ0KV0KLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIgJSBucy5zdGFydCkKLSAgICBpZiBucy5yYW5kb21pemU6Ci0gICAgICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6Ci0gICAgICAgICAgICBucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCi0gICAgICAgIHJhbmRvbS5zZWVkKG5zLnJhbmRvbV9zZWVkKQotICAgICAgICBwcmludCgiVXNpbmcgcmFuZG9tIHNlZWQiLCBucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZWN0ZWQpCi0gICAgaWYgbnMudHJhY2U6Ci0gICAgICAgIGltcG9ydCB0cmFjZSwgdGVtcGZpbGUKLSAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuZ2V0dGVtcGRpcigpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCi0KLSAgICB0ZXN0X3RpbWVzID0gW10KLSAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAgICAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKLSAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCi0gICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCi0KLSAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KToKLSAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAotICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6Ci0gICAgICAgICAgICB0ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKLSAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgotICAgICAgICAgICAgZ29vZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBGQUlMRUQ6Ci0gICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6Ci0gICAgICAgICAgICBlbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFJFU09VUkNFX0RFTklFRDoKLSAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCi0gICAgICAgICAgICByZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQotCi0gICAgaWYgbnMuZm9yZXZlcjoKLSAgICAgICAgZGVmIHRlc3RfZm9yZXZlcih0ZXN0cz1saXN0KHNlbGVjdGVkKSk6Ci0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICB0ZXN0cyA9IHRlc3RfZm9yZXZlcigpCi0gICAgICAgIHRlc3RfY291bnQgPSAnJwotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gMwotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzID0gaXRlcihzZWxlY3RlZCkKLSAgICAgICAgdGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZWN0ZWQpKQotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gbGVuKHRlc3RfY291bnQpIC0gMQotCi0gICAgaWYgbnMudXNlX21wOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKLSAgICAgICAgICAgIHN5cy5leGl0KDIpCi0gICAgICAgIGZyb20gcXVldWUgaW1wb3J0IFF1ZXVlCi0gICAgICAgIGRlYnVnX291dHB1dF9wYXQgPSByZS5jb21waWxlKHIiXFtcZCsgcmVmcywgXGQrIGJsb2Nrc1xdJCIpCi0gICAgICAgIG91dHB1dCA9IFF1ZXVlKCkKLSAgICAgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc1Rlc3RzKHRlc3RzKQotICAgICAgICBkZWYgd29yaygpOgotICAgICAgICAgICAgIyBBIHdvcmtlciB0aHJlYWQuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IG5leHQocGVuZGluZykKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgbnMpCi0gICAgICAgICAgICAgICAgICAgICMgU3RyaXAgbGFzdCByZWZjb3VudCBvdXRwdXQgbGluZSBpZiBpdCBleGlzdHMsIHNpbmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICMgY29tZXMgZnJvbSB0aGUgc2h1dGRvd24gb2YgdGhlIGludGVycHJldGVyIGluIHRoZSBzdWJjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBkZWJ1Z19vdXRwdXRfcGF0LnN1YigiIiwgc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKLSAgICAgICAgICAgICAgICAgICAgaWYgcmV0Y29kZSAhPSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKENISUxEX0VSUk9SLCAiRXhpdCBjb2RlICVzIiAlIHJldGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLCByZXN1bHQpKQotICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgd29ya2VycyA9IFtUaHJlYWQodGFyZ2V0PXdvcmspIGZvciBpIGluIHJhbmdlKG5zLnVzZV9tcCldCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5zdGFydCgpCi0gICAgICAgIGZpbmlzaGVkID0gMAotICAgICAgICB0ZXN0X2luZGV4ID0gMQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IG5zLnVzZV9tcDoKLSAgICAgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gb3V0cHV0LmdldCgpCi0gICAgICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICAgICAgaWYgYmFkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9XSB7NH0iCi0gICAgICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGJhZCksIHRlc3QpKQotICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0KQotICAgICAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3RkZXJyLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDaGlsZCBlcnJvciBvbiB7fToge30iLmZvcm1hdCh0ZXN0LCByZXN1bHRbMV0pKQotICAgICAgICAgICAgICAgIHRlc3RfaW5kZXggKz0gMQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgIHBlbmRpbmcuaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5qb2luKCkKLSAgICBlbHNlOgotICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgotICAgICAgICAgICAgaWYgbm90IG5zLnF1aWV0OgotICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnRfd2lkdGgsIHRlc3RfaW5kZXgsIHRlc3RfY291bnQsIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgICAgIGlmIG5zLnRyYWNlOgotICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKLSAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KLSAgICAgICAgICAgICAgICB0cmFjZXIucnVuY3R4KCdydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LCB0aW1lb3V0PW5zLnRpbWVvdXQpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9dmFycygpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIGZhaWxmYXN0PW5zLmZhaWxmYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKQotICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgotICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKLSAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQotICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKLSAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KLSAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCi0gICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKLSAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKLQotICAgIGlmIGludGVycnVwdGVkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQwotICAgICAgICBwcmludCgpCi0gICAgICAgIHByaW50KCJUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuIikKLSAgICAgICAgb21pdHRlZCA9IHNldChzZWxlY3RlZCkgLSBzZXQoZ29vZCkgLSBzZXQoYmFkKSAtIHNldChza2lwcGVkKQotICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCi0gICAgICAgIHByaW50bGlzdChvbWl0dGVkKQotICAgIGlmIGdvb2QgYW5kIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgaWYgbm90IGJhZCBhbmQgbm90IHNraXBwZWQgYW5kIG5vdCBpbnRlcnJ1cHRlZCBhbmQgbGVuKGdvb2QpID4gMToKLSAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjb3VudChsZW4oZ29vZCksICJ0ZXN0IiksICJPSy4iKQotICAgIGlmIG5zLnByaW50X3Nsb3c6Ci0gICAgICAgIHRlc3RfdGltZXMuc29ydChyZXZlcnNlPVRydWUpCi0gICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCi0gICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHRlc3RfdGltZXNbOjEwXToKLSAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQotICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KGJhZCkKLSAgICBpZiBlbnZpcm9ubWVudF9jaGFuZ2VkIGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAotICAgICAgICAgICAgICAgICBjb3VudChsZW4oZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQotICAgICAgICBwcmludGxpc3QoZW52aXJvbm1lbnRfY2hhbmdlZCkKLSAgICBpZiBza2lwcGVkIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihza2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KHNraXBwZWQpCi0KLSAgICBpZiBucy52ZXJib3NlMiBhbmQgYmFkOgotICAgICAgICBwcmludCgiUmUtcnVubmluZyBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlIikKLSAgICAgICAgZm9yIHRlc3QgaW4gYmFkWzpdOgotICAgICAgICAgICAgaWYgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICBwcmludCgiUmUtcnVubmluZyB0ZXN0ICVyIGluIHZlcmJvc2UgbW9kZSIgJSB0ZXN0KQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbnMudmVyYm9zZSA9IFRydWUKLSAgICAgICAgICAgICAgICBvayA9IHJ1bnRlc3QodGVzdCwgVHJ1ZSwgbnMucXVpZXQsIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgcGdvPW5zLnBnbykKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBzZXBhcmF0ZSBmcm9tIHRoZSBeQwotICAgICAgICAgICAgICAgIHByaW50KCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBva1swXSBpbiB7UEFTU0VELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVEfToKLSAgICAgICAgICAgICAgICAgICAgYmFkLnJlbW92ZSh0ZXN0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgYmFkOgotICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAndGVzdCcpLCAiZmFpbGVkIGFnYWluOiIpCi0gICAgICAgICAgICAgICAgcHJpbnRsaXN0KGJhZCkKLQotICAgIGlmIG5zLnNpbmdsZToKLSAgICAgICAgaWYgbmV4dF9zaW5nbGVfdGVzdDoKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBmcC53cml0ZShuZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICByID0gdHJhY2VyLnJlc3VsdHMoKQotICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9bnMuY292ZXJkaXIpCi0KLSAgICBpZiBucy5ydW5sZWFrczoKLSAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKLQotICAgIHN5cy5leGl0KGxlbihiYWQpID4gMCBvciBpbnRlcnJ1cHRlZCkKLQotCi0jIHNtYWxsIHNldCBvZiB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIGJhc2ljYWxseSBmdW5jdGlvbmluZyBpbnRlcnByZXRlcgotIyAoaS5lLiBpZiBhbnkgb2YgdGhlc2UgZmFpbCwgdGhlbiBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBmb2xsb3cpCi1TVERURVNUUyA9IFsKLSAgICAndGVzdF9ncmFtbWFyJywKLSAgICAndGVzdF9vcGNvZGVzJywKLSAgICAndGVzdF9kaWN0JywKLSAgICAndGVzdF9idWlsdGluJywKLSAgICAndGVzdF9leGNlcHRpb25zJywKLSAgICAndGVzdF90eXBlcycsCi0gICAgJ3Rlc3RfdW5pdHRlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QyJywKLSAgICAndGVzdF9zdXBwb3J0JwotXQotCi0jIHNldCBvZiB0ZXN0cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB1c2luZyByZWdydGVzdAotTk9UVEVTVFMgPSBzZXQoKQotCi1kZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKLSAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKLSAgICB0ZXN0cyA9IFtdCi0gICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBtb2RbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCBpbiAoIi5weSIsICIiKSBhbmQgbW9kIG5vdCBpbiBvdGhlcnM6Ci0gICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kKQotICAgIHJldHVybiBzdGR0ZXN0cyArIHNvcnRlZCh0ZXN0cykKLQotIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgotY2xhc3MgTXVsdGlwcm9jZXNzVGVzdHMob2JqZWN0KToKLQotICAgICIiIkEgdGhyZWFkLXNhZmUgaXRlcmF0b3Igb3ZlciB0ZXN0cyBmb3IgbXVsdGlwcm9jZXNzIG1vZGUuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMpOgotICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQotICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmxvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLmludGVycnVwdGVkOgotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oJ3Rlc3RzIGludGVycnVwdGVkJykKLSAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYudGVzdHMpCi0KLWRlZiByZXBsYWNlX3N0ZG91dCgpOgotICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgotICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCi0gICAgaW1wb3J0IGF0ZXhpdAotCi0gICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAotICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCi0gICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCi0gICAgICAgIGNsb3NlZmQ9RmFsc2UsCi0gICAgICAgIG5ld2xpbmU9J1xuJykKLQotICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgotICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKLSAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAotICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKLQotZGVmIHJ1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQsCi0gICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCB1c2VfcmVzb3VyY2VzPU5vbmUsCi0gICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsCi0gICAgICAgICAgICB0aW1lb3V0PU5vbmUsICosIHBnbz1GYWxzZSk6Ci0gICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCi0KLSAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCi0gICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCi0gICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKLSAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCi0gICAgdXNlX3Jlc291cmNlcyAtLSBsaXN0IG9mIGV4dHJhIHJlc291cmNlcyB0byB1c2UKLSAgICBvdXRwdXRfb25fZmFpbHVyZSAtLSBpZiB0cnVlLCBkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUKLSAgICB0aW1lb3V0IC0tIGR1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICB0aW1lb3V0IHNlY29uZHMKLSAgICBmYWlsZmFzdCwgbWF0Y2hfdGVzdHMgLS0gU2VlIHJlZ3J0ZXN0IGNvbW1hbmQtbGluZSBmbGFncyBmb3IgdGhlc2UuCi0gICAgcGdvIC0tIGlmIHRydWUsIGRvIG5vdCBwcmludCB1bm5lY2Vzc2FyeSBpbmZvIHdoZW4gcnVubmluZyB0aGUgdGVzdAotICAgICAgICAgICBmb3IgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIGJ1aWxkCi0KLSAgICBSZXR1cm5zIHRoZSB0dXBsZSByZXN1bHQsIHRlc3RfdGltZSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzOgotICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCi0gICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCi0gICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgotICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50Ci0gICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKLSAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAotICAgICIiIgotICAgIGlmIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IHVzZV9yZXNvdXJjZXMKLSAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQotICAgIGlmIHVzZV90aW1lb3V0OgotICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQotICAgIHRyeToKLSAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCi0gICAgICAgIGlmIGZhaWxmYXN0OgotICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKLSAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCi0KLSAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQotICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgotICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgotICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KLSAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQotICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCi0KLSAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPUZhbHNlLCBwZ289cGdvKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBGQUlMRUQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLndyaXRlKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gb3JpZ19zdGRlcnIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IHZlcmJvc2UgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9bm90IHZlcmJvc2UsIHBnbz1wZ28pCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICBmaW5hbGx5OgotICAgICAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQotICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCi1ydW50ZXN0LnN0cmluZ2lvID0gTm9uZQotCi0jIFVuaXQgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGxlYXZlIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdW5jaGFuZ2VkCi0jIG9uY2UgdGhleSBjb21wbGV0ZS4gIEJ1dCBzb21ldGltZXMgdGVzdHMgaGF2ZSBidWdzLCBlc3BlY2lhbGx5IHdoZW4KLSMgdGVzdHMgZmFpbCwgYW5kIHRoZSBjaGFuZ2VzIHRvIGVudmlyb25tZW50IGdvIG9uIHRvIG1lc3MgdXAgb3RoZXIKLSMgdGVzdHMuICBUaGlzIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBidWlsZGJvdCBzdGFiaWxpdHksIHNpbmNlIHRlc3RzCi0jIGFyZSBydW4gaW4gcmFuZG9tIG9yZGVyIGFuZCBzbyBwcm9ibGVtcyBtYXkgYXBwZWFyIHRvIGNvbWUgYW5kIGdvLgotIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHdlIGNhbiBzYXZlIGFuZCByZXN0b3JlIHRvIG1pdGlnYXRlIHRoaXMsIGFuZAotIyB0aGUgZm9sbG93aW5nIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoaXMgdGFzay4KLQotY2xhc3Mgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudDoKLSAgICAiIiJTYXZlIGJpdHMgb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIHJlc3RvcmUgdGhlbSBhdCBibG9jayBleGl0LgotCi0gICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0bmFtZSwgdmVyYm9zZSwgcXVpZXQpOgotICAgICAgICAgICAgI3N0dWZmCi0KLSAgICBVbmxlc3MgcXVpZXQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyIGlmIGFueSBvZgotICAgIHRoZSBzYXZlZCBpdGVtcyB3YXMgY2hhbmdlZCBieSB0aGUgdGVzdC4gIFRoZSBhdHRyaWJ1dGUgJ2NoYW5nZWQnCi0gICAgaXMgaW5pdGlhbGx5IEZhbHNlLCBidXQgaXMgc2V0IHRvIFRydWUgaWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuCi0KLSAgICBJZiB2ZXJib3NlIGlzIG1vcmUgdGhhbiAxLCB0aGUgYmVmb3JlIGFuZCBhZnRlciBzdGF0ZSBvZiBjaGFuZ2VkCi0gICAgaXRlbXMgaXMgYWxzbyBwcmludGVkLgotICAgICIiIgotCi0gICAgY2hhbmdlZCA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdG5hbWUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsICosIHBnbz1GYWxzZSk6Ci0gICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQotICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCi0gICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAotICAgICAgICBzZWxmLnBnbyA9IHBnbwotCi0gICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAotICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKLSAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKLSAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKLSAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgotICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgotICAgICMKLSAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKLSAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KLQotICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAotICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdzeXMucGF0aF9ob29rcycsICdfX2ltcG9ydF9fJywKLSAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzLmZpbHRlcnMnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCi0gICAgICAgICAgICAgICAgICdsb2dnaW5nLl9oYW5kbGVycycsICdsb2dnaW5nLl9oYW5kbGVyTGlzdCcsICdzeXMuZ2V0dHJhY2UnLAotICAgICAgICAgICAgICAgICAnc3lzLndhcm5vcHRpb25zJywKLSAgICAgICAgICAgICAgICAgIyBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpIG1heSByZWxlYXNlIHJlZgotICAgICAgICAgICAgICAgICAjIHRvIGEgdGhyZWFkLCBzbyBjaGVjayBwcm9jZXNzZXMgZmlyc3QuCi0gICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcnLCAndGhyZWFkaW5nLl9kYW5nbGluZycsCi0gICAgICAgICAgICAgICAgICdzeXNjb25maWcuX0NPTkZJR19WQVJTJywgJ3N5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTJywKLSAgICAgICAgICAgICAgICAgJ2ZpbGVzJywgJ2xvY2FsZScsICd3YXJuaW5ncy5zaG93d2FybmluZycsCi0gICAgICAgICAgICAgICAgICdzaHV0aWxfYXJjaGl2ZV9mb3JtYXRzJywgJ3NodXRpbF91bnBhY2tfZm9ybWF0cycsCi0gICAgICAgICAgICAgICAgKQotCi0gICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6Ci0gICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQotICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KLQotICAgIGRlZiBnZXRfY3dkKHNlbGYpOgotICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKLSAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKLSAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQotCi0gICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAotICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKLSAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAotCi0gICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgotICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKLSAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgotCi0gICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuc3RkaW4KLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgotICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgotCi0gICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKLSAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgotICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQotICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKLSAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKLQotICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQotICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgotICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KLSAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoX2hvb2tzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGhfaG9va3MpLCBzeXMucGF0aF9ob29rcywgc3lzLnBhdGhfaG9va3NbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aF9ob29rcyhzZWxmLCBzYXZlZF9ob29rcyk6Ci0gICAgICAgIHN5cy5wYXRoX2hvb2tzID0gc2F2ZWRfaG9va3NbMV0KLSAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzYXZlZF9ob29rc1syXQotCi0gICAgZGVmIGdldF9zeXNfZ2V0dHJhY2Uoc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuZ2V0dHJhY2UoKQotICAgIGRlZiByZXN0b3JlX3N5c19nZXR0cmFjZShzZWxmLCB0cmFjZV9meG4pOgotICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VfZnhuKQotCi0gICAgZGVmIGdldF9fX2ltcG9ydF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gYnVpbHRpbnMuX19pbXBvcnRfXwotICAgIGRlZiByZXN0b3JlX19faW1wb3J0X18oc2VsZiwgaW1wb3J0Xyk6Ci0gICAgICAgIGJ1aWx0aW5zLl9faW1wb3J0X18gPSBpbXBvcnRfCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX2ZpbHRlcnMoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZCh3YXJuaW5ncy5maWx0ZXJzKSwgd2FybmluZ3MuZmlsdGVycywgd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX2ZpbHRlcnMoc2VsZiwgc2F2ZWRfZmlsdGVycyk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBzYXZlZF9maWx0ZXJzWzFdCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlZF9maWx0ZXJzWzJdCi0KLSAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KLSAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQotICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKLSAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKLSAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQotICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQotCi0gICAgZGVmIGdldF9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgotICAgICAgICAjIHdlIGNvdWxkIGNhbGwgZ2V0X2FyY2hpdmVzX2Zvcm1hdHMoKSBidXQgdGhhdCBvbmx5IHJldHVybnMgdGhlCi0gICAgICAgICMgcmVnaXN0cnkga2V5czsgd2Ugd2FudCB0byBjaGVjayB0aGUgdmFsdWVzIHRvbyAodGhlIGZ1bmN0aW9ucyB0aGF0Ci0gICAgICAgICMgYXJlIHJlZ2lzdGVyZWQpCi0gICAgICAgIHJldHVybiBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUywgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTID0gc2F2ZWRbMF0KLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMsIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlcnMoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJzIGlzIGEgV2Vha1ZhbHVlRGljdGlvbmFyeQotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlcnMpLCBsb2dnaW5nLl9oYW5kbGVycywgbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlcnMoc2VsZiwgc2F2ZWRfaGFuZGxlcnMpOgotICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmKToKLSAgICAgICAgIyBfaGFuZGxlckxpc3QgaXMgYSBsaXN0IG9mIHdlYWtyZWZzIHRvIGhhbmRsZXJzCi0gICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVyTGlzdCksIGxvZ2dpbmcuX2hhbmRsZXJMaXN0LCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYsIHNhdmVkX2hhbmRsZXJMaXN0KToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfc3lzX3dhcm5vcHRpb25zKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLndhcm5vcHRpb25zKSwgc3lzLndhcm5vcHRpb25zLCBzeXMud2Fybm9wdGlvbnNbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfd2Fybm9wdGlvbnMoc2VsZiwgc2F2ZWRfb3B0aW9ucyk6Ci0gICAgICAgIHN5cy53YXJub3B0aW9ucyA9IHNhdmVkX29wdGlvbnNbMV0KLSAgICAgICAgc3lzLndhcm5vcHRpb25zWzpdID0gc2F2ZWRfb3B0aW9uc1syXQotCi0gICAgIyBDb250cm9sbGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIFRocmVhZCBvYmplY3RzIGNhbiBtYWtlIGl0IGVhc2llcgotICAgICMgdG8gdHJhY2sgcmVmZXJlbmNlIGxlYWtzLgotICAgIGRlZiBnZXRfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiB0aHJlYWRpbmcuX2RhbmdsaW5nLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKLQotICAgICMgU2FtZSBmb3IgUHJvY2VzcyBvYmplY3RzCi0gICAgZGVmIGdldF9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFVuam9pbmVkIHByb2Nlc3Mgb2JqZWN0cyBjYW4gc3Vydml2ZSBhZnRlciBwcm9jZXNzIGV4aXRzCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkKLSAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKLSAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jbGVhcigpCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZik6Ci0gICAgICAgICMgbWFrZSBzdXJlIHRoZSBkaWN0IGlzIGluaXRpYWxpemVkCi0gICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHJlZml4JykKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0NPTkZJR19WQVJTKSwgc3lzY29uZmlnLl9DT05GSUdfVkFSUywKLSAgICAgICAgICAgICAgICBkaWN0KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpKQotICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy5jbGVhcigpCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyksIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLAotICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNvcHkoKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy51cGRhdGUoc2F2ZWRbMl0pCi0KLSAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICByZXR1cm4gc29ydGVkKGZuICsgKCcvJyBpZiBvcy5wYXRoLmlzZGlyKGZuKSBlbHNlICcnKQotICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKCkpCi0gICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZiwgc2F2ZWRfdmFsdWUpOgotICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCi0gICAgICAgIGlmIGZuIG5vdCBpbiBzYXZlZF92YWx1ZSBhbmQgKGZuICsgJy8nKSBub3QgaW4gc2F2ZWRfdmFsdWU6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoZm4pCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQucm10cmVlKGZuKQotCi0gICAgX2xjID0gW2dldGF0dHIobG9jYWxlLCBsYykgZm9yIGxjIGluIGRpcihsb2NhbGUpCi0gICAgICAgICAgIGlmIGxjLnN0YXJ0c3dpdGgoJ0xDXycpXQotICAgIGRlZiBnZXRfbG9jYWxlKHNlbGYpOgotICAgICAgICBwYWlyaW5ncyA9IFtdCi0gICAgICAgIGZvciBsYyBpbiBzZWxmLl9sYzoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwYWlyaW5ncy5hcHBlbmQoKGxjLCBsb2NhbGUuc2V0bG9jYWxlKGxjLCBOb25lKSkpCi0gICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcmV0dXJuIHBhaXJpbmdzCi0gICAgZGVmIHJlc3RvcmVfbG9jYWxlKHNlbGYsIHNhdmVkKToKLSAgICAgICAgZm9yIGxjLCBzZXR0aW5nIGluIHNhdmVkOgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsYywgc2V0dGluZykKLQotICAgIGRlZiBnZXRfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiB3YXJuaW5ncy5zaG93d2FybmluZwotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYsIGZ4bik6Ci0gICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gZnhuCi0KLSAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKLSAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6Ci0gICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQotICAgICAgICAgICAgZ2V0X25hbWUgPSAnZ2V0XycgKyBtZXRob2Rfc3VmZml4Ci0gICAgICAgICAgICByZXN0b3JlX25hbWUgPSAncmVzdG9yZV8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgeWllbGQgbmFtZSwgZ2V0YXR0cihzZWxmLCBnZXRfbmFtZSksIGdldGF0dHIoc2VsZiwgcmVzdG9yZV9uYW1lKQotCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zYXZlZF92YWx1ZXMgPSBkaWN0KChuYW1lLCBnZXQoKSkgZm9yIG5hbWUsIGdldCwgcmVzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCkpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6Ci0gICAgICAgIHNhdmVkX3ZhbHVlcyA9IHNlbGYuc2F2ZWRfdmFsdWVzCi0gICAgICAgIGRlbCBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKSAgIyBTb21lIHJlc291cmNlcyB1c2Ugd2VhayByZWZlcmVuY2VzCi0gICAgICAgIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCk6Ci0gICAgICAgICAgICBjdXJyZW50ID0gZ2V0KCkKLSAgICAgICAgICAgIG9yaWdpbmFsID0gc2F2ZWRfdmFsdWVzLnBvcChuYW1lKQotICAgICAgICAgICAgIyBDaGVjayBmb3IgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UncyB2YWx1ZQotICAgICAgICAgICAgaWYgY3VycmVudCAhPSBvcmlnaW5hbDoKLSAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgcmVzdG9yZShvcmlnaW5hbCkKLSAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5xdWlldCBhbmQgbm90IHNlbGYucGdvOgotICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZyAtLSB7fSB3YXMgbW9kaWZpZWQgYnkge30iLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzZWxmLnRlc3RuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDEgYW5kIG5vdCBzZWxmLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCIgIEJlZm9yZToge31cbiAgQWZ0ZXI6ICB7fSAiLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwsIGN1cnJlbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0KLWRlZiBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LAotICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgZGlzcGxheV9mYWlsdXJlPVRydWUsIHBnbz1GYWxzZSk6Ci0gICAgc3VwcG9ydC51bmxvYWQodGVzdCkKLQotICAgIHRlc3RfdGltZSA9IDAuMAotICAgIHJlZmxlYWsgPSBGYWxzZSAgIyBUcnVlIGlmIHRoZSB0ZXN0IGxlYWtlZCByZWZlcmVuY2VzLgotICAgIHRyeToKLSAgICAgICAgaWYgdGVzdC5zdGFydHN3aXRoKCd0ZXN0LicpOgotICAgICAgICAgICAgYWJzdGVzdCA9IHRlc3QKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgQWx3YXlzIGltcG9ydCBpdCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UKLSAgICAgICAgICAgIGFic3Rlc3QgPSAndGVzdC4nICsgdGVzdAotICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdCwgdmVyYm9zZSwgcXVpZXQsIHBnbz1wZ28pIGFzIGVudmlyb25tZW50OgotICAgICAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgICAgICAgICB0aGVfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoYWJzdGVzdCkKLSAgICAgICAgICAgICMgSWYgdGhlIHRlc3QgaGFzIGEgdGVzdF9tYWluLCB0aGF0IHdpbGwgcnVuIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAgICAgIyB0ZXN0cy4gIElmIG5vdCwgdXNlIG5vcm1hbCB1bml0dGVzdCB0ZXN0IGxvYWRpbmcuCi0gICAgICAgICAgICB0ZXN0X3J1bm5lciA9IGdldGF0dHIodGhlX21vZHVsZSwgInRlc3RfbWFpbiIsIE5vbmUpCi0gICAgICAgICAgICBpZiB0ZXN0X3J1bm5lciBpcyBOb25lOgotICAgICAgICAgICAgICAgIGRlZiB0ZXN0X3J1bm5lcigpOgotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGVfbW9kdWxlKQotICAgICAgICAgICAgICAgICAgICBmb3IgZXJyb3IgaW4gbG9hZGVyLmVycm9yczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGVycm9yLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgICAgIGlmIGxvYWRlci5lcnJvcnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImVycm9ycyB3aGlsZSBsb2FkaW5nIHRlc3RzIikKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdHMpCi0gICAgICAgICAgICB0ZXN0X3J1bm5lcigpCi0gICAgICAgICAgICBpZiBodW50cmxlYWtzOgotICAgICAgICAgICAgICAgIHJlZmxlYWsgPSBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgdGVzdF9ydW5uZXIsIGh1bnRybGVha3MpCi0gICAgICAgICAgICB0ZXN0X3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKLSAgICBleGNlcHQgc3VwcG9ydC5SZXNvdXJjZURlbmllZCBhcyBtc2c6Ci0gICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnKQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgIHJldHVybiBSRVNPVVJDRV9ERU5JRUQsIHRlc3RfdGltZQotICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCBhcyBtc2c6Ci0gICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnKQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgIHJldHVybiBTS0lQUEVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHJhaXNlCi0gICAgZXhjZXB0IHN1cHBvcnQuVGVzdEZhaWxlZCBhcyBtc2c6Ci0gICAgICAgIGlmIG5vdCBwZ286Ci0gICAgICAgICAgICBpZiBkaXNwbGF5X2ZhaWx1cmU6Ci0gICAgICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiZmFpbGVkIC0tIiwgbXNnLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCIsIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgIGV4Y2VwdDoKLSAgICAgICAgbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQotICAgICAgICBpZiBub3QgcGdvOgotICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiY3Jhc2hlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCi0gICAgZWxzZToKLSAgICAgICAgaWYgcmVmbGVhazoKLSAgICAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgICAgICBpZiBlbnZpcm9ubWVudC5jaGFuZ2VkOgotICAgICAgICAgICAgcmV0dXJuIEVOVl9DSEFOR0VELCB0ZXN0X3RpbWUKLSAgICAgICAgcmV0dXJuIFBBU1NFRCwgdGVzdF90aW1lCi0KLWRlZiBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3RuYW1lLCB2ZXJib3NlKToKLSAgICBpbXBvcnQgc2h1dGlsCi0gICAgaW1wb3J0IHN0YXQKLSAgICBpbXBvcnQgZ2MKLQotICAgICMgRmlyc3Qga2lsbCBhbnkgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBvcGVuIGZpbGVzIGV0Yy4KLSAgICAjIFRoaXMgY2FuIGFsc28gaXNzdWUgc29tZSBSZXNvdXJjZVdhcm5pbmdzIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBnZXQKLSAgICAjIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGZvbGxvd2luZyB0ZXN0IHJ1biwgYW5kIHBvc3NpYmx5IHByb2R1Y2UgZmFpbHVyZXMuCi0gICAgZ2MuY29sbGVjdCgpCi0KLSAgICAjIFRyeSB0byBjbGVhbiB1cCBqdW5rIGNvbW1vbmx5IGxlZnQgYmVoaW5kLiAgV2hpbGUgdGVzdHMgc2hvdWxkbid0IGxlYXZlCi0gICAgIyBhbnkgZmlsZXMgb3IgZGlyZWN0b3JpZXMgYmVoaW5kLCB3aGVuIGEgdGVzdCBmYWlscyB0aGF0IGNhbiBiZSB0ZWRpb3VzCi0gICAgIyBmb3IgaXQgdG8gYXJyYW5nZS4gIFRoZSBjb25zZXF1ZW5jZXMgY2FuIGJlIGVzcGVjaWFsbHkgbmFzdHkgb24gV2luZG93cywKLSAgICAjIHNpbmNlIGlmIGEgdGVzdCBsZWF2ZXMgYSBmaWxlIG9wZW4sIGl0IGNhbm5vdCBiZSBkZWxldGVkIGJ5IG5hbWUgKHdoaWxlCi0gICAgIyB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoYXQgaGVyZSBlaXRoZXIsIHdlIGNhbiBkaXNwbGF5IHRoZQotICAgICMgbmFtZSBvZiB0aGUgb2ZmZW5kaW5nIHRlc3QsIHdoaWNoIGlzIGEgcmVhbCBoZWxwKS4KLSAgICBmb3IgbmFtZSBpbiAoc3VwcG9ydC5URVNURk4sCi0gICAgICAgICAgICAgICAgICJkYl9ob21lIiwKLSAgICAgICAgICAgICAgICApOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6Ci0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZSk6Ci0gICAgICAgICAgICBraW5kLCBudWtlciA9ICJkaXJlY3RvcnkiLCBzaHV0aWwucm10cmVlCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmFtZSk6Ci0gICAgICAgICAgICBraW5kLCBudWtlciA9ICJmaWxlIiwgb3MudW5saW5rCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcigib3MucGF0aCBzYXlzICVyIGV4aXN0cyBidXQgaXMgbmVpdGhlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IG5vciBmaWxlIiAlIG5hbWUpCi0KLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50KCIlciBsZWZ0IGJlaGluZCAlcyAlciIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICAjIGlmIHdlIGhhdmUgY2htb2QsIGZpeCBwb3NzaWJsZSBwZXJtaXNzaW9ucyBwcm9ibGVtcwotICAgICAgICAgICAgIyB0aGF0IG1pZ2h0IHByZXZlbnQgY2xlYW51cAotICAgICAgICAgICAgaWYgKGhhc2F0dHIob3MsICdjaG1vZCcpKToKLSAgICAgICAgICAgICAgICBvcy5jaG1vZChuYW1lLCBzdGF0LlNfSVJXWFUgfCBzdGF0LlNfSVJXWEcgfCBzdGF0LlNfSVJXWE8pCi0gICAgICAgICAgICBudWtlcihuYW1lKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIG1zZzoKLSAgICAgICAgICAgIHByaW50KCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIgYW5kIGl0IGNvdWxkbid0IGJlICIKLSAgICAgICAgICAgICAgICAicmVtb3ZlZDogJXMiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lLCBtc2cpKSwgZmlsZT1zeXMuc3RkZXJyKQotCi1kZWYgZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIGluZGlyZWN0X3Rlc3QsIGh1bnRybGVha3MpOgotICAgICIiIlJ1biBhIHRlc3QgbXVsdGlwbGUgdGltZXMsIGxvb2tpbmcgZm9yIHJlZmVyZW5jZSBsZWFrcy4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIEZhbHNlIGlmIHRoZSB0ZXN0IGRpZG4ndCBsZWFrIHJlZmVyZW5jZXM7IFRydWUgaWYgd2UgZGV0ZWN0ZWQgcmVmbGVha3MuCi0gICAgIiIiCi0gICAgIyBUaGlzIGNvZGUgaXMgaGFja2lzaCBhbmQgaW5lbGVnYW50LCBidXQgaXQgc2VlbXMgdG8gZG8gdGhlIGpvYi4KLSAgICBpbXBvcnQgY29weXJlZwotICAgIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKLQotICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKToKLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUcmFja2luZyByZWZlcmVuY2UgbGVha3MgcmVxdWlyZXMgYSBkZWJ1ZyBidWlsZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib2YgUHl0aG9uIikKLQotICAgICMgU2F2ZSBjdXJyZW50IHZhbHVlcyBmb3IgZGFzaF9SX2NsZWFudXAoKSB0byByZXN0b3JlLgotICAgIGZzID0gd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIHBzID0gY29weXJlZy5kaXNwYXRjaF90YWJsZS5jb3B5KCkKLSAgICBwaWMgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jb3B5KCkKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB6aXBpbXBvcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHpkYyA9IE5vbmUgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAotICAgIGVsc2U6Ci0gICAgICAgIHpkYyA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jb3B5KCkKLSAgICBhYmNzID0ge30KLSAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgotICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgotICAgICAgICAgICAgYWJjc1tvYmpdID0gb2JqLl9hYmNfcmVnaXN0cnkuY29weSgpCi0KLSAgICBud2FybXVwLCBudHJhY2tlZCwgZm5hbWUgPSBodW50cmxlYWtzCi0gICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgZm5hbWUpCi0gICAgcmVwY291bnQgPSBud2FybXVwICsgbnRyYWNrZWQKLSAgICByY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAotICAgIGFsbG9jX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50Ci0KLSAgICBwcmludCgiYmVnaW5uaW5nIiwgcmVwY291bnQsICJyZXBldGl0aW9ucyIsIGZpbGU9c3lzLnN0ZGVycikKLSAgICBwcmludCgoIjEyMzQ1Njc4OTAiKihyZXBjb3VudC8vMTAgKyAxKSlbOnJlcGNvdW50XSwgZmlsZT1zeXMuc3RkZXJyKQotICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgIGZvciBpIGluIHJhbmdlKHJlcGNvdW50KToKLSAgICAgICAgaW5kaXJlY3RfdGVzdCgpCi0gICAgICAgIGFsbG9jX2FmdGVyLCByY19hZnRlciA9IGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJy4nKQotICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgaWYgaSA+PSBud2FybXVwOgotICAgICAgICAgICAgcmNfZGVsdGFzW2ldID0gcmNfYWZ0ZXIgLSByY19iZWZvcmUKLSAgICAgICAgICAgIGFsbG9jX2RlbHRhc1tpXSA9IGFsbG9jX2FmdGVyIC0gYWxsb2NfYmVmb3JlCi0gICAgICAgIGFsbG9jX2JlZm9yZSwgcmNfYmVmb3JlID0gYWxsb2NfYWZ0ZXIsIHJjX2FmdGVyCi0gICAgcHJpbnQoZmlsZT1zeXMuc3RkZXJyKQotICAgICMgVGhlc2UgY2hlY2tlcnMgcmV0dXJuIEZhbHNlIG9uIHN1Y2Nlc3MsIFRydWUgb24gZmFpbHVyZQotICAgIGRlZiBjaGVja19yY19kZWx0YXMoZGVsdGFzKToKLSAgICAgICAgcmV0dXJuIGFueShkZWx0YXMpCi0gICAgZGVmIGNoZWNrX2FsbG9jX2RlbHRhcyhkZWx0YXMpOgotICAgICAgICAjIEF0IGxlYXN0IDEvM3JkIG9mIDBzCi0gICAgICAgIGlmIDMgKiBkZWx0YXMuY291bnQoMCkgPCBsZW4oZGVsdGFzKToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICMgTm90aGluZyBlbHNlIHRoYW4gMXMsIDBzIGFuZCAtMXMKLSAgICAgICAgaWYgbm90IHNldChkZWx0YXMpIDw9IHsxLDAsLTF9OgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgZmFpbGVkID0gRmFsc2UKLSAgICBmb3IgZGVsdGFzLCBpdGVtX25hbWUsIGNoZWNrZXIgaW4gWwotICAgICAgICAocmNfZGVsdGFzLCAncmVmZXJlbmNlcycsIGNoZWNrX3JjX2RlbHRhcyksCi0gICAgICAgIChhbGxvY19kZWx0YXMsICdtZW1vcnkgYmxvY2tzJywgY2hlY2tfYWxsb2NfZGVsdGFzKV06Ci0gICAgICAgIGlmIGNoZWNrZXIoZGVsdGFzKToKLSAgICAgICAgICAgIG1zZyA9ICclcyBsZWFrZWQgJXMgJXMsIHN1bT0lcycgJSAoCi0gICAgICAgICAgICAgICAgdGVzdCwgZGVsdGFzW253YXJtdXA6XSwgaXRlbV9uYW1lLCBzdW0oZGVsdGFzKSkKLSAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJhIikgYXMgcmVmcmVwOgotICAgICAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1yZWZyZXApCi0gICAgICAgICAgICAgICAgcmVmcmVwLmZsdXNoKCkKLSAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKLSAgICByZXR1cm4gZmFpbGVkCi0KLWRlZiBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKToKLSAgICBpbXBvcnQgZ2MsIGNvcHlyZWcKLSAgICBpbXBvcnQgX3N0cnB0aW1lLCBsaW5lY2FjaGUKLSAgICBpbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdCwgbWltZXR5cGVzLCBkb2N0ZXN0Ci0gICAgaW1wb3J0IHN0cnVjdCwgZmlsZWNtcCwgY29sbGVjdGlvbnMuYWJjCi0gICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKLSAgICBmcm9tIHdlYWtyZWYgaW1wb3J0IFdlYWtTZXQKLQotICAgICMgQ2xlYXIgdGhlIHdhcm5pbmdzIHJlZ2lzdHJ5LCBzbyB0aGV5IGNhbiBiZSBkaXNwbGF5ZWQgYWdhaW4KLSAgICBmb3IgbW9kIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgotICAgICAgICBpZiBoYXNhdHRyKG1vZCwgJ19fd2FybmluZ3JlZ2lzdHJ5X18nKToKLSAgICAgICAgICAgIGRlbCBtb2QuX193YXJuaW5ncmVnaXN0cnlfXwotCi0gICAgIyBSZXN0b3JlIHNvbWUgb3JpZ2luYWwgdmFsdWVzLgotICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBmcwotICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY2xlYXIoKQotICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUudXBkYXRlKHBzKQotICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKLSAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS51cGRhdGUocGljKQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHppcGltcG9ydAotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcyAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0Ci0gICAgZWxzZToKLSAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNsZWFyKCkKLSAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLnVwZGF0ZSh6ZGMpCi0KLSAgICAjIGNsZWFyIHR5cGUgY2FjaGUKLSAgICBzeXMuX2NsZWFyX3R5cGVfY2FjaGUoKQotCi0gICAgIyBDbGVhciBBQkMgcmVnaXN0cmllcywgcmVzdG9yaW5nIHByZXZpb3VzbHkgc2F2ZWQgQUJDIHJlZ2lzdHJpZXMuCi0gICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKLSAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKLSAgICAgICAgICAgIG9iai5fYWJjX3JlZ2lzdHJ5ID0gYWJjcy5nZXQob2JqLCBXZWFrU2V0KCkpLmNvcHkoKQotICAgICAgICAgICAgb2JqLl9hYmNfY2FjaGUuY2xlYXIoKQotICAgICAgICAgICAgb2JqLl9hYmNfbmVnYXRpdmVfY2FjaGUuY2xlYXIoKQotCi0gICAgIyBGbHVzaCBzdGFuZGFyZCBvdXRwdXQsIHNvIHRoYXQgYnVmZmVyZWQgZGF0YSBpcyBzZW50IHRvIHRoZSBPUyBhbmQKLSAgICAjIGFzc29jaWF0ZWQgUHl0aG9uIG9iamVjdHMgYXJlIHJlY2xhaW1lZC4KLSAgICBmb3Igc3RyZWFtIGluIChzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyLCBzeXMuX19zdGRvdXRfXywgc3lzLl9fc3RkZXJyX18pOgotICAgICAgICBpZiBzdHJlYW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzdHJlYW0uZmx1c2goKQotCi0gICAgIyBDbGVhciBhc3NvcnRlZCBtb2R1bGUgY2FjaGVzLgotICAgIF9wYXRoX2NyZWF0ZWQuY2xlYXIoKQotICAgIHJlLnB1cmdlKCkKLSAgICBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlLmNsZWFyKCkKLSAgICB1cmxsaWIucGFyc2UuY2xlYXJfY2FjaGUoKQotICAgIHVybGxpYi5yZXF1ZXN0LnVybGNsZWFudXAoKQotICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKLSAgICBtaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCi0gICAgZmlsZWNtcC5fY2FjaGUuY2xlYXIoKQotICAgIHN0cnVjdC5fY2xlYXJjYWNoZSgpCi0gICAgZG9jdGVzdC5tYXN0ZXIgPSBOb25lCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgY3R5cGVzCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAjIERvbid0IHdvcnJ5IGFib3V0IHJlc2V0dGluZyB0aGUgY2FjaGUgaWYgY3R5cGVzIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGN0eXBlcy5fcmVzZXRfY2FjaGUoKQotCi0gICAgIyBDb2xsZWN0IGN5Y2xpYyB0cmFzaCBhbmQgcmVhZCBtZW1vcnkgc3RhdGlzdGljcyBpbW1lZGlhdGVseSBhZnRlci4KLSAgICBmdW5jMSA9IHN5cy5nZXRhbGxvY2F0ZWRibG9ja3MKLSAgICBmdW5jMiA9IHN5cy5nZXR0b3RhbHJlZmNvdW50Ci0gICAgZ2MuY29sbGVjdCgpCi0gICAgcmV0dXJuIGZ1bmMxKCksIGZ1bmMyKCkKLQotZGVmIHdhcm1fY2FjaGVzKCk6Ci0gICAgIyBjaGFyIGNhY2hlCi0gICAgcyA9IGJ5dGVzKHJhbmdlKDI1NikpCi0gICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKLSAgICAgICAgc1tpOmkrMV0KLSAgICAjIHVuaWNvZGUgY2FjaGUKLSAgICB4ID0gW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXQotICAgICMgaW50IGNhY2hlCi0gICAgeCA9IGxpc3QocmFuZ2UoLTUsIDI1NykpCi0KLWRlZiBmaW5kdGVzdGRpcihwYXRoPU5vbmUpOgotICAgIHJldHVybiBwYXRoIG9yIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyCi0KLWRlZiByZW1vdmVweShuYW1lcyk6Ci0gICAgaWYgbm90IG5hbWVzOgotICAgICAgICByZXR1cm4KLSAgICBmb3IgaWR4LCBuYW1lIGluIGVudW1lcmF0ZShuYW1lcyk6Ci0gICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCi0gICAgICAgIGlmIGV4dCA9PSAnLnB5JzoKLSAgICAgICAgICAgIG5hbWVzW2lkeF0gPSBiYXNlbmFtZQotCi1kZWYgY291bnQobiwgd29yZCk6Ci0gICAgaWYgbiA9PSAxOgotICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQotCi1kZWYgcHJpbnRsaXN0KHgsIHdpZHRoPTcwLCBpbmRlbnQ9NCk6Ci0gICAgIiIiUHJpbnQgdGhlIGVsZW1lbnRzIG9mIGl0ZXJhYmxlIHggdG8gc3Rkb3V0LgotCi0gICAgT3B0aW9uYWwgYXJnIHdpZHRoIChkZWZhdWx0IDcwKSBpcyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aC4KLSAgICBPcHRpb25hbCBhcmcgaW5kZW50IChkZWZhdWx0IDQpIGlzIHRoZSBudW1iZXIgb2YgYmxhbmtzIHdpdGggd2hpY2ggdG8KLSAgICBiZWdpbiBlYWNoIGxpbmUuCi0gICAgIiIiCi0KLSAgICBmcm9tIHRleHR3cmFwIGltcG9ydCBmaWxsCi0gICAgYmxhbmtzID0gJyAnICogaW5kZW50Ci0gICAgIyBQcmludCB0aGUgc29ydGVkIGxpc3Q6ICd4JyBtYXkgYmUgYSAnLS1yYW5kb20nIGxpc3Qgb3IgYSBzZXQoKQotICAgIHByaW50KGZpbGwoJyAnLmpvaW4oc3RyKGVsdCkgZm9yIGVsdCBpbiBzb3J0ZWQoeCkpLCB3aWR0aCwKLSAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PWJsYW5rcywgc3Vic2VxdWVudF9pbmRlbnQ9YmxhbmtzKSkKLQotCi1kZWYgbWFpbl9pbl90ZW1wX2N3ZCgpOgotICAgICIiIlJ1biBtYWluKCkgaW4gYSB0ZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkuIiIiCi0gICAgaWYgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5ta2RpcihURU1QRElSKQotICAgICAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yOgotICAgICAgICAgICAgcGFzcwotCi0gICAgIyBEZWZpbmUgYSB3cml0YWJsZSB0ZW1wIGRpciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjd2Qgd2hpbGUgcnVubmluZwotICAgICMgdGhlIHRlc3RzLiBUaGUgbmFtZSBvZiB0aGUgZGlyIGluY2x1ZGVzIHRoZSBwaWQgdG8gYWxsb3cgcGFyYWxsZWwKLSAgICAjIHRlc3RpbmcgKHNlZSB0aGUgLWogb3B0aW9uKS4KLSAgICB0ZXN0X2N3ZCA9ICd0ZXN0X3B5dGhvbl97fScuZm9ybWF0KG9zLmdldHBpZCgpKQotICAgIHRlc3RfY3dkID0gb3MucGF0aC5qb2luKFRFTVBESVIsIHRlc3RfY3dkKQotCi0gICAgIyBSdW4gdGhlIHRlc3RzIGluIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgdGVtcG9yYXJpbHkgY2hhbmdlcyB0aGUgQ1dEIHRvIGEKLSAgICAjIHRlbXBvcmFyeSBhbmQgd3JpdGFibGUgZGlyZWN0b3J5LiAgSWYgaXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG9yCi0gICAgIyBjaGFuZ2UgdGhlIENXRCwgdGhlIG9yaWdpbmFsIENXRCB3aWxsIGJlIHVzZWQuICBUaGUgb3JpZ2luYWwgQ1dEIGlzCi0gICAgIyBhdmFpbGFibGUgZnJvbSBzdXBwb3J0LlNBVkVEQ1dELgotICAgIHdpdGggc3VwcG9ydC50ZW1wX2N3ZCh0ZXN0X2N3ZCwgcXVpZXQ9VHJ1ZSk6Ci0gICAgICAgIG1haW4oKQotCitkZWYgX21haW4oKToKKyAgICBnbG9iYWwgX19maWxlX18KIAotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAjIFJlbW92ZSByZWdydGVzdC5weSdzIG93biBkaXJlY3RvcnkgZnJvbSB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLiBEZXNwaXRlCiAgICAgIyB0aGUgZWxpbWluYXRpb24gb2YgaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0cywgdGhpcyBpcyBzdGlsbCBuZWVkZWQgdG8KICAgICAjIGVuc3VyZSB0aGF0IHN1Ym1vZHVsZXMgb2YgdGhlIHRlc3QgcGFja2FnZSBkbyBub3QgaW5hcHByb3ByaWF0ZWx5IGFwcGVhcgogICAgICMgYXMgdG9wLWxldmVsIG1vZHVsZXMgZXZlbiB3aGVuIHBlb3BsZSAob3IgYnVpbGRib3RzISkgaW52b2tlIHJlZ3J0ZXN0LnB5CiAgICAgIyBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSAtbSBzd2l0Y2gKICAgICBteWRpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpKQotICAgIGkgPSBsZW4oc3lzLnBhdGgpCisgICAgaSA9IGxlbihzeXMucGF0aCkgLSAxCiAgICAgd2hpbGUgaSA+PSAwOgotICAgICAgICBpIC09IDEKICAgICAgICAgaWYgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoc3lzLnBhdGhbaV0pKSA9PSBteWRpcjoKICAgICAgICAgICAgIGRlbCBzeXMucGF0aFtpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSAtPSAxCiAKICAgICAjIGZpbmR0ZXN0ZGlyKCkgZ2V0cyB0aGUgZGlybmFtZSBvdXQgb2YgX19maWxlX18sIHNvIHdlIGhhdmUgdG8gbWFrZSBpdAogICAgICMgYWJzb2x1dGUgYmVmb3JlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KQEAgLTE2MTUsNCArNDMsOCBAQAogICAgICMgc2FuaXR5IGNoZWNrCiAgICAgYXNzZXJ0IF9fZmlsZV9fID09IG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlswXSkKIAotICAgIG1haW5faW5fdGVtcF9jd2QoKQorICAgIG1haW4oKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5IGIvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5CmluZGV4IDcyZjQ4NDUuLjFlN2E2ZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3NlcV90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9zZXFfdGVzdHMucHkKQEAgLTMxOCw3ICszMTgsNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChzKSwgaWQocyoxKSkKIAogICAgIGRlZiB0ZXN0X2JpZ3JlcGVhdChzZWxmKToKLSAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICBpZiBzeXMubWF4c2l6ZSA8PSAyMTQ3NDgzNjQ3OgogICAgICAgICAgICAgeCA9IHNlbGYudHlwZTJ0ZXN0KFswXSkKICAgICAgICAgICAgIHggKj0gMioqMTYKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weSBiL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FlMTcwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3Qvc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5CkBAIC0wLDAgKzEsODQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBTSUdVU1IxRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZ290X3NpZ25hbHMgPSB7J1NJR0hVUCc6IDAsICdTSUdVU1IxJzogMCwgJ1NJR0FMUk0nOiAwfQorCisgICAgZGVmIHNpZ2h1cF9oYW5kbGVyKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzWydTSUdIVVAnXSArPSAxCisKKyAgICBkZWYgc2lndXNyMV9oYW5kbGVyKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzWydTSUdVU1IxJ10gKz0gMQorICAgICAgICByYWlzZSBTSUdVU1IxRXhjZXB0aW9uCisKKyAgICBkZWYgd2FpdF9zaWduYWwoc2VsZiwgY2hpbGQsIHNpZ25hbWUsIGV4Y19jbGFzcz1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgY2hpbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBUaGlzIHdhaXQgc2hvdWxkIGJlIGludGVycnVwdGVkIGJ5IGV4Y19jbGFzcworICAgICAgICAgICAgICAgICMgKGlmIHNldCkKKyAgICAgICAgICAgICAgICBjaGlsZC53YWl0KCkKKworICAgICAgICAgICAgdGltZW91dCA9IDEwLjAKKyAgICAgICAgICAgIGRlYWRsaW5lID0gdGltZS5tb25vdG9uaWMoKSArIHRpbWVvdXQKKworICAgICAgICAgICAgd2hpbGUgdGltZS5tb25vdG9uaWMoKSA8IGRlYWRsaW5lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZ290X3NpZ25hbHNbc2lnbmFtZV06CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Y19jbGFzcyBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShleGMsIGV4Y19jbGFzcyk6CisgICAgICAgICAgICAgICAgIyBnb3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBzZWxmLmZhaWwoJ3NpZ25hbCAlcyBub3QgcmVjZWl2ZWQgYWZ0ZXIgJXMgc2Vjb25kcycKKyAgICAgICAgICAgICAgICAgICUgKHNpZ25hbWUsIHRpbWVvdXQpKQorCisgICAgZGVmIHN1YnByb2Nlc3Nfc2VuZF9zaWduYWwoc2VsZiwgcGlkLCBzaWduYW1lKToKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgb3MsIHNpZ25hbDsgb3Mua2lsbCglcywgc2lnbmFsLiVzKScgJSAocGlkLCBzaWduYW1lKQorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLUknLCAnLWMnLCBjb2RlXQorICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5Qb3BlbihhcmdzKQorCisgICAgZGVmIHRlc3RfaW50ZXJwcm9jZXNzX3NpZ25hbChzZWxmKToKKyAgICAgICAgIyBJbnN0YWxsIGhhbmRsZXJzLiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gYSBzdWItcHJvY2Vzcywgc28gd2UKKyAgICAgICAgIyBkb24ndCB3b3JyeSBhYm91dCByZS1zZXR0aW5nIHRoZSBkZWZhdWx0IGhhbmRsZXJzLgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuc2lnaHVwX2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNlbGYuc2lndXNyMV9oYW5kbGVyKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBzaWduYWwuU0lHX0lHTikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCisKKyAgICAgICAgIyBMZXQgdGhlIHN1Yi1wcm9jZXNzZXMga25vdyB3aG8gdG8gc2VuZCBzaWduYWxzIHRvLgorICAgICAgICBwaWQgPSBzdHIob3MuZ2V0cGlkKCkpCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHSFVQIikgYXMgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXRfc2lnbmFsKGNoaWxkLCAnU0lHSFVQJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9zaWduYWxzLCB7J1NJR0hVUCc6IDEsICdTSUdVU1IxJzogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NJR0FMUk0nOiAwfSkKKworICAgICAgICB3aXRoIHNlbGYuc3VicHJvY2Vzc19zZW5kX3NpZ25hbChwaWQsICJTSUdVU1IxIikgYXMgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXRfc2lnbmFsKGNoaWxkLCAnU0lHVVNSMScsIFNJR1VTUjFFeGNlcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHVVNSMiIpIGFzIGNoaWxkOgorICAgICAgICAgICAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW46IFNJR1VTUjIgaXMgaWdub3JlZAorICAgICAgICAgICAgY2hpbGQud2FpdCgpCisKKyAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgIHNlbGYud2FpdF9zaWduYWwoTm9uZSwgJ1NJR0FMUk0nLCBLZXlib2FyZEludGVycnVwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9zaWduYWxzLCB7J1NJR0hVUCc6IDEsICdTSUdVU1IxJzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NJR0FMUk0nOiAwfSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKaW5kZXggMDA3ZjNiYy4uNGE3Y2Q0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCitpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5lcnJvcgogaW1wb3J0IHdhcm5pbmdzCkBAIC04OSw4ICs5MCw5IEBACiAgICAgImJpZ21lbXRlc3QiLCAiYmlnYWRkcnNwYWNldGVzdCIsICJjcHl0aG9uX29ubHkiLCAiZ2V0X2F0dHJpYnV0ZSIsCiAgICAgInJlcXVpcmVzX0lFRUVfNzU0IiwgInNraXBfdW5sZXNzX3hhdHRyIiwgInJlcXVpcmVzX3psaWIiLAogICAgICJhbnRpY2lwYXRlX2ZhaWx1cmUiLCAibG9hZF9wYWNrYWdlX3Rlc3RzIiwgImRldGVjdF9hcGlfbWlzbWF0Y2giLAorICAgICJjaGVja19fYWxsX18iLAogICAgICMgc3lzCi0gICAgImlzX2p5dGhvbiIsICJjaGVja19pbXBsX2RldGFpbCIsCisgICAgImlzX2p5dGhvbiIsICJpc19hbmRyb2lkIiwgImNoZWNrX2ltcGxfZGV0YWlsIiwgInVuaXhfc2hlbGwiLAogICAgICMgbmV0d29yawogICAgICJIT1NUIiwgIklQVjZfRU5BQkxFRCIsICJmaW5kX3VudXNlZF9wb3J0IiwgImJpbmRfcG9ydCIsICJvcGVuX3VybHJlc291cmNlIiwKICAgICAjIHByb2Nlc3NlcwpAQCAtNzMzLDYgKzczNSwxMyBAQAogCiBpc19qeXRob24gPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpCiAKK2lzX2FuZHJvaWQgPSBib29sKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQU5EUk9JRF9BUElfTEVWRUwnKSkKKworaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgdW5peF9zaGVsbCA9ICcvc3lzdGVtL2Jpbi9zaCcgaWYgaXNfYW5kcm9pZCBlbHNlICcvYmluL3NoJworZWxzZToKKyAgICB1bml4X3NoZWxsID0gTm9uZQorCiAjIEZpbGVuYW1lIHVzZWQgZm9yIHRlc3RpbmcKIGlmIG9zLm5hbWUgPT0gJ2phdmEnOgogICAgICMgSnl0aG9uIGRpc2FsbG93cyBAIGluIG1vZHVsZSBuYW1lcwpAQCAtODAyLDcgKzgxMSw3IEBACiAjIGVuY29kZWQgYnkgdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcgKGluIHN0cmljdCBtb2RlKS4gSXQgY2FuIGJlIE5vbmUgaWYgd2UKICMgY2Fubm90IGdlbmVyYXRlIHN1Y2ggZmlsZW5hbWUuCiBURVNURk5fVU5FTkNPREFCTEUgPSBOb25lCi1pZiBvcy5uYW1lIGluICgnbnQnLCAnY2UnKToKK2lmIG9zLm5hbWUgPT0gJ250JzoKICAgICAjIHNraXAgd2luMzJzICgwKSBvciBXaW5kb3dzIDl4L01FICgxKQogICAgIGlmIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpLnBsYXRmb3JtID49IDI6CiAgICAgICAgICMgRGlmZmVyZW50IGtpbmRzIG9mIGNoYXJhY3RlcnMgZnJvbSB2YXJpb3VzIGxhbmd1YWdlcyB0byBtaW5pbWl6ZSB0aGUKQEAgLTkwMSw3ICs5MTAsNyBAQAogICAgICAgICB5aWVsZCBwYXRoCiAgICAgZmluYWxseToKICAgICAgICAgaWYgZGlyX2NyZWF0ZWQ6Ci0gICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCisgICAgICAgICAgICBybXRyZWUocGF0aCkKIAogQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKIGRlZiBjaGFuZ2VfY3dkKHBhdGgsIHF1aWV0PUZhbHNlKToKQEAgLTIwNzgsNiArMjA4NywxMSBAQAogICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgogICAgIHJldHVybiBzdWJwcm9jZXNzLl9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogCitkZWYgb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgb3B0aW1pemF0aW9uIHNldHRpbmdzIGluIHN5cy5mbGFncy4iIiIKKyAgICByZXR1cm4gc3VicHJvY2Vzcy5fb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKwogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBTdXBwb3J0IGZvciBhc3NlcnRpb25zIGFib3V0IGxvZ2dpbmcuCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMjI5LDYgKzIyNDMsNjUgQEAKICAgICByZXR1cm4gbWlzc2luZ19pdGVtcwogCiAKK2RlZiBjaGVja19fYWxsX18odGVzdF9jYXNlLCBtb2R1bGUsIG5hbWVfb2ZfbW9kdWxlPU5vbmUsIGV4dHJhPSgpLAorICAgICAgICAgICAgICAgICBibGFja2xpc3Q9KCkpOgorICAgICIiIkFzc2VydCB0aGF0IHRoZSBfX2FsbF9fIHZhcmlhYmxlIG9mICdtb2R1bGUnIGNvbnRhaW5zIGFsbCBwdWJsaWMgbmFtZXMuCisKKyAgICBUaGUgbW9kdWxlJ3MgcHVibGljIG5hbWVzIChpdHMgQVBJKSBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbgorICAgIHdoZXRoZXIgdGhleSBtYXRjaCB0aGUgcHVibGljIG5hbWUgY29udmVudGlvbiBhbmQgd2VyZSBkZWZpbmVkIGluCisgICAgJ21vZHVsZScuCisKKyAgICBUaGUgJ25hbWVfb2ZfbW9kdWxlJyBhcmd1bWVudCBjYW4gc3BlY2lmeSAoYXMgYSBzdHJpbmcgb3IgdHVwbGUgdGhlcmVvZikKKyAgICB3aGF0IG1vZHVsZShzKSBhbiBBUEkgY291bGQgYmUgZGVmaW5lZCBpbiBpbiBvcmRlciB0byBiZSBkZXRlY3RlZCBhcyBhCisgICAgcHVibGljIEFQSS4gT25lIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiAnbW9kdWxlJyBpbXBvcnRzIHBhcnQgb2YgaXRzIHB1YmxpYworICAgIEFQSSBmcm9tIG90aGVyIG1vZHVsZXMsIHBvc3NpYmx5IGEgQyBiYWNrZW5kIChsaWtlICdjc3YnIGFuZCBpdHMgJ19jc3YnKS4KKworICAgIFRoZSAnZXh0cmEnIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IHdvdWxkbid0IG90aGVyd2lzZSBiZQorICAgIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYXMgInB1YmxpYyIsIGxpa2Ugb2JqZWN0cyB3aXRob3V0IGEgcHJvcGVyCisgICAgJ19fbW9kdWxlX18nIGF0dHJpdWJ1dGUuIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICAgIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgb25lcy4KKworICAgIFRoZSAnYmxhY2tsaXN0JyBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCBtdXN0IG5vdCBiZSB0cmVhdGVkCisgICAgYXMgcGFydCBvZiB0aGUgcHVibGljIEFQSSBldmVuIHRob3VnaCB0aGVpciBuYW1lcyBpbmRpY2F0ZSBvdGhlcndpc2UuCisKKyAgICBVc2FnZToKKyAgICAgICAgaW1wb3J0IGJhcgorICAgICAgICBpbXBvcnQgZm9vCisgICAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworICAgICAgICBjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZvbykKKworICAgICAgICBjbGFzcyBPdGhlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBleHRyYSA9IHsnQkFSX0NPTlNUJywgJ0ZPT19DT05TVCd9CisgICAgICAgICAgICAgICAgYmxhY2tsaXN0ID0geydiYXonfSAgIyBVbmRvY3VtZW50ZWQgbmFtZS4KKyAgICAgICAgICAgICAgICAjIGJhciBpbXBvcnRzIHBhcnQgb2YgaXRzIEFQSSBmcm9tIF9iYXIuCisgICAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgYmFyLCAoJ2JhcicsICdfYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgICAiIiIKKworICAgIGlmIG5hbWVfb2ZfbW9kdWxlIGlzIE5vbmU6CisgICAgICAgIG5hbWVfb2ZfbW9kdWxlID0gKG1vZHVsZS5fX25hbWVfXywgKQorICAgIGVsaWYgaXNpbnN0YW5jZShuYW1lX29mX21vZHVsZSwgc3RyKToKKyAgICAgICAgbmFtZV9vZl9tb2R1bGUgPSAobmFtZV9vZl9tb2R1bGUsICkKKworICAgIGV4cGVjdGVkID0gc2V0KGV4dHJhKQorCisgICAgZm9yIG5hbWUgaW4gZGlyKG1vZHVsZSk6CisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIG9yIG5hbWUgaW4gYmxhY2tsaXN0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgb2JqID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCisgICAgICAgIGlmIChnZXRhdHRyKG9iaiwgJ19fbW9kdWxlX18nLCBOb25lKSBpbiBuYW1lX29mX21vZHVsZSBvcgorICAgICAgICAgICAgICAgIChub3QgaGFzYXR0cihvYmosICdfX21vZHVsZV9fJykgYW5kCisgICAgICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKG9iaiwgdHlwZXMuTW9kdWxlVHlwZSkpKToKKyAgICAgICAgICAgIGV4cGVjdGVkLmFkZChuYW1lKQorICAgIHRlc3RfY2FzZS5hc3NlcnRDb3VudEVxdWFsKG1vZHVsZS5fX2FsbF9fLCBleHBlY3RlZCkKKworCiBjbGFzcyBTdXBwcmVzc0NyYXNoUmVwb3J0OgogICAgICIiIlRyeSB0byBwcmV2ZW50IGEgY3Jhc2ggcmVwb3J0IGZyb20gcG9wcGluZyB1cC4KIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CmluZGV4IDU4ZjJmMDQuLmFiNGUyNDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKQEAgLTQsNyArNCw2IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgbmxfbGFuZ2luZm8gPSBOb25lCiAKLWltcG9ydCBjb2RlY3MKIGltcG9ydCBsb2NhbGUKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weQppbmRleCBhYzYzMjVhLi5iY2JhOGNhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weQpAQCAtNCw3ICs0LDYgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgcGxhdGZvcm0KLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzdGF0CiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYWlmYy5weSBiL0xpYi90ZXN0L3Rlc3RfYWlmYy5weQppbmRleCBhYjUxNDM3Li4xYmQxZjg5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FpZmMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9haWZjLnB5CkBAIC0yLDcgKzIsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IGF1ZGlvdGVzdHMKIGZyb20gYXVkaW9vcCBpbXBvcnQgYnl0ZXN3YXAKLWltcG9ydCBvcwogaW1wb3J0IGlvCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RydWN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQppbmRleCBmOWVlMzk4Li41MmM2MjQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKQEAgLTQ1MTIsNiArNDUxMiwyMSBAQAogICAgICAgICBzdHJpbmcgPSAiTmFtZXNwYWNlKGJhcj0nc3BhbScsIGZvbz00MikiCiAgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKIAorICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9zdGFya3dhcmdzX25vdGlkZW50aWZpZXIoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKCoqeyciJzogJ3F1b3RlJ30pCisgICAgICAgIHN0cmluZyA9ICIiIk5hbWVzcGFjZSgqKnsnIic6ICdxdW90ZSd9KSIiIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfa3dhcmdzX2FuZF9zdGFya3dhcmdzX25vdGlkZW50aWZpZXIoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKGE9MSwgKip7JyInOiAncXVvdGUnfSkKKyAgICAgICAgc3RyaW5nID0gIiIiTmFtZXNwYWNlKGE9MSwgKip7JyInOiAncXVvdGUnfSkiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX3N0YXJrd2FyZ3NfaWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKip7J3ZhbGlkJzogVHJ1ZX0pCisgICAgICAgIHN0cmluZyA9ICJOYW1lc3BhY2UodmFsaWQ9VHJ1ZSkiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKwogICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKICAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCiAgICAgICAgIHN0cmluZyA9ICgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CmluZGV4IDQ4MjUyNmUuLjhmZDU0Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtNyw4ICs3LDYgQEAKIGltcG9ydCB3ZWFrcmVmCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgb3BlcmF0b3IKLWltcG9ydCBpbwotaW1wb3J0IG1hdGgKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzeXMKIGltcG9ydCB3YXJuaW5ncwpAQCAtMzE4LDggKzMxNiwxOSBAQAogICAgICAgICAgICAgZCA9IHBpY2tsZS5kdW1wcygoaXRvcmlnLCBvcmlnKSwgcHJvdG8pCiAgICAgICAgICAgICBpdCwgYSA9IHBpY2tsZS5sb2FkcyhkKQogICAgICAgICAgICAgYS5mcm9tbGlzdChkYXRhMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpdCksIHR5cGUoaXRvcmlnKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIGRhdGEyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pCisKKyAgICBkZWYgdGVzdF9leGhhdXN0ZWRfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgbGlzdChzZWxmLmV4YW1wbGUpKQorICAgICAgICBleGhpdCA9IGl0ZXIoYSkKKyAgICAgICAgZW1waXQgPSBpdGVyKGEpCisgICAgICAgIGZvciB4IGluIGV4aGl0OiAgIyBleGhhdXN0IHRoZSBpdGVyYXRvcgorICAgICAgICAgICAgbmV4dChlbXBpdCkgICMgbm90IGV4aGF1c3RlZAorICAgICAgICBhLmFwcGVuZChzZWxmLm91dHNpZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChleGhpdCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZW1waXQpLCBbc2VsZi5vdXRzaWRlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCBsaXN0KHNlbGYuZXhhbXBsZSkgKyBbc2VsZi5vdXRzaWRlXSkKIAogICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKQEAgLTEwNzAsNiArMTA3OSwxMiBAQAogICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ0InLCBiIiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBnZXRidWZmZXJfd2l0aF9udWxsX3ZpZXcsIGEpCiAKKyAgICBkZWYgdGVzdF9mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmLCBpdGVyLCBhcnJheS5hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi50eXBlY29kZSwpKQorICAgICAgICBzdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIHJldmVyc2VkLCBhcnJheS5hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi50eXBlY29kZSwpKQorCiBjbGFzcyBTdHJpbmdUZXN0KEJhc2VUZXN0KToKIAogICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CmluZGV4IGQzZTZkMzUuLmUwMzJmNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0xLDcgKzEsOCBAQAoraW1wb3J0IGFzdAoraW1wb3J0IGRpcwogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBhc3QKIGltcG9ydCB3ZWFrcmVmCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydApAQCAtMjM4LDcgKzIzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFzdF90cmVlID0gY29tcGlsZShpLCAiPyIsIGtpbmQsIGFzdC5QeUNGX09OTFlfQVNUKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvX3R1cGxlKGFzdF90cmVlKSwgbykKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGFzdF90cmVlLCAoMCwgMCkpCi0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYWN0aW9uPSJjb21waWxpbmciLCBpbnB1dD1pKToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChhY3Rpb249ImNvbXBpbGluZyIsIGlucHV0PWksIGtpbmQ9a2luZCk6CiAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUoYXN0X3RyZWUsICI/Iiwga2luZCkKIAogICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgpAQCAtNTQ3LDYgKzU0OCwxNyBAQAogICAgICAgICAgICAgY29tcGlsZShtb2QsICd0ZXN0JywgJ2V4ZWMnKQogICAgICAgICBzZWxmLmFzc2VydEluKCJpbnZhbGlkIGludGVnZXIgdmFsdWU6IE5vbmUiLCBzdHIoY20uZXhjZXB0aW9uKSkKIAorICAgIGRlZiB0ZXN0X2xldmVsX2FzX25vbmUoc2VsZik6CisgICAgICAgIGJvZHkgPSBbYXN0LkltcG9ydEZyb20obW9kdWxlPSd0aW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcz1bYXN0LmFsaWFzKG5hbWU9J3NsZWVwJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPTAsIGNvbF9vZmZzZXQ9MCldCisgICAgICAgIG1vZCA9IGFzdC5Nb2R1bGUoYm9keSkKKyAgICAgICAgY29kZSA9IGNvbXBpbGUobW9kLCAndGVzdCcsICdleGVjJykKKyAgICAgICAgbnMgPSB7fQorICAgICAgICBleGVjKGNvZGUsIG5zKQorICAgICAgICBzZWxmLmFzc2VydEluKCdzbGVlcCcsIG5zKQorCiAKIGNsYXNzIEFTVFZhbGlkYXRvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNzQyLDcgKzc1NCw3IEBACiAKICAgICBkZWYgdGVzdF9pbXBvcnRmcm9tKHNlbGYpOgogICAgICAgICBpbXAgPSBhc3QuSW1wb3J0RnJvbShOb25lLCBbYXN0LmFsaWFzKCJ4IiwgTm9uZSldLCAtNDIpCi0gICAgICAgIHNlbGYuc3RtdChpbXAsICJsZXZlbCBsZXNzIHRoYW4gLTEiKQorICAgICAgICBzZWxmLnN0bXQoaW1wLCAiTmVnYXRpdmUgSW1wb3J0RnJvbSBsZXZlbCIpCiAgICAgICAgIHNlbGYuc3RtdChhc3QuSW1wb3J0RnJvbShOb25lLCBbXSwgMCksICJlbXB0eSBuYW1lcyBvbiBJbXBvcnRGcm9tIikKIAogICAgIGRlZiB0ZXN0X2dsb2JhbChzZWxmKToKQEAgLTkzMyw2ICs5NDUsMTI1IEBACiAgICAgICAgICAgICBjb21waWxlKG1vZCwgZm4sICJleGVjIikKIAogCitjbGFzcyBDb25zdGFudFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBvbiB0aGUgYXN0LkNvbnN0YW50IG5vZGUgdHlwZS4iIiIKKworICAgIGRlZiBjb21waWxlX2NvbnN0YW50KHNlbGYsIHZhbHVlKToKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZSgieCA9IDEyMyIpCisKKyAgICAgICAgbm9kZSA9IHRyZWUuYm9keVswXS52YWx1ZQorICAgICAgICBuZXdfbm9kZSA9IGFzdC5Db25zdGFudCh2YWx1ZT12YWx1ZSkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X25vZGUsIG5vZGUpCisgICAgICAgIHRyZWUuYm9keVswXS52YWx1ZSA9IG5ld19ub2RlCisKKyAgICAgICAgY29kZSA9IGNvbXBpbGUodHJlZSwgIjxzdHJpbmc+IiwgImV4ZWMiKQorCisgICAgICAgIG5zID0ge30KKyAgICAgICAgZXhlYyhjb2RlLCBucykKKyAgICAgICAgcmV0dXJuIG5zWyd4J10KKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZV9jb25zdGFudChbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBhbiBpbnZhbGlkIHR5cGUgaW4gQ29uc3RhbnQ6IGxpc3QiKQorCisgICAgZGVmIHRlc3Rfc2luZ2xldG9ucyhzZWxmKToKKyAgICAgICAgZm9yIGNvbnN0IGluIChOb25lLCBGYWxzZSwgVHJ1ZSwgRWxsaXBzaXMsIGInJywgZnJvemVuc2V0KCkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoY29uc3Q9Y29uc3QpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb21waWxlX2NvbnN0YW50KGNvbnN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmFsdWUsIGNvbnN0KQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBuZXN0ZWRfdHVwbGUgPSAoMSwpCisgICAgICAgIG5lc3RlZF9mcm96ZW5zZXQgPSBmcm96ZW5zZXQoezF9KQorICAgICAgICBmb3IgbGV2ZWwgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBuZXN0ZWRfdHVwbGUgPSAobmVzdGVkX3R1cGxlLCAyKQorICAgICAgICAgICAgbmVzdGVkX2Zyb3plbnNldCA9IGZyb3plbnNldCh7bmVzdGVkX2Zyb3plbnNldCwgMn0pCisgICAgICAgIHZhbHVlcyA9ICgxMjMsIDEyMy4wLCAxMjNqLAorICAgICAgICAgICAgICAgICAgInVuaWNvZGUiLCBiJ2J5dGVzJywKKyAgICAgICAgICAgICAgICAgIHR1cGxlKCJ0dXBsZSIpLCBmcm96ZW5zZXQoImZyb3plbnNldCIpLAorICAgICAgICAgICAgICAgICAgbmVzdGVkX3R1cGxlLCBuZXN0ZWRfZnJvemVuc2V0KQorICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QodmFsdWU9dmFsdWUpOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29tcGlsZV9jb25zdGFudCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgdmFsdWUpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fdG9fY29uc3RhbnQoc2VsZik6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoInggPSAxIikKKworICAgICAgICB0YXJnZXQgPSB0cmVlLmJvZHlbMF0udGFyZ2V0c1swXQorICAgICAgICBuZXdfdGFyZ2V0ID0gYXN0LkNvbnN0YW50KHZhbHVlPTEpCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld190YXJnZXQsIHRhcmdldCkKKyAgICAgICAgdHJlZS5ib2R5WzBdLnRhcmdldHNbMF0gPSBuZXdfdGFyZ2V0CisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGNvbXBpbGUodHJlZSwgInN0cmluZyIsICJleGVjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwcmVzc2lvbiB3aGljaCBjYW4ndCBiZSBhc3NpZ25lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGluIFN0b3JlIGNvbnRleHQiKQorCisgICAgZGVmIHRlc3RfZ2V0X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZSgiJ2RvY3N0cmluZydcbnggPSAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZ2V0X2RvY3N0cmluZyh0cmVlKSwgJ2RvY3N0cmluZycpCisKKyAgICAgICAgdHJlZS5ib2R5WzBdLnZhbHVlID0gYXN0LkNvbnN0YW50KHZhbHVlPSdjb25zdGFudCBkb2NzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5nZXRfZG9jc3RyaW5nKHRyZWUpLCAnY29uc3RhbnQgZG9jc3RyaW5nJykKKworICAgIGRlZiBnZXRfbG9hZF9jb25zdChzZWxmLCB0cmVlKToKKyAgICAgICAgIyBDb21waWxlIHRvIGJ5dGVjb2RlLCBkaXNhc3NlbWJsZSBhbmQgZ2V0IHBhcmFtZXRlciBvZiBMT0FEX0NPTlNUCisgICAgICAgICMgaW5zdHJ1Y3Rpb25zCisgICAgICAgIGNvID0gY29tcGlsZSh0cmVlLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGNvbnN0cyA9IFtdCisgICAgICAgIGZvciBpbnN0ciBpbiBkaXMuZ2V0X2luc3RydWN0aW9ucyhjbyk6CisgICAgICAgICAgICBpZiBpbnN0ci5vcG5hbWUgPT0gJ0xPQURfQ09OU1QnOgorICAgICAgICAgICAgICAgIGNvbnN0cy5hcHBlbmQoaW5zdHIuYXJndmFsKQorICAgICAgICByZXR1cm4gY29uc3RzCisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9sb2FkX2NvbnN0KHNlbGYpOgorICAgICAgICBjb25zdHMgPSBbTm9uZSwKKyAgICAgICAgICAgICAgICAgIFRydWUsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgMTI0LAorICAgICAgICAgICAgICAgICAgMi4wLAorICAgICAgICAgICAgICAgICAgM2osCisgICAgICAgICAgICAgICAgICAidW5pY29kZSIsCisgICAgICAgICAgICAgICAgICBiJ2J5dGVzJywKKyAgICAgICAgICAgICAgICAgICgxLCAyLCAzKV0KKworICAgICAgICBjb2RlID0gJ1xuJy5qb2luKFsneD17IXJ9Jy5mb3JtYXQoY29uc3QpIGZvciBjb25zdCBpbiBjb25zdHNdKQorICAgICAgICBjb2RlICs9ICdcbnggPSAuLi4nCisgICAgICAgIGNvbnN0cy5leHRlbmQoKEVsbGlwc2lzLCBOb25lKSkKKworICAgICAgICB0cmVlID0gYXN0LnBhcnNlKGNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfbG9hZF9jb25zdCh0cmVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMpCisKKyAgICAgICAgIyBSZXBsYWNlIGV4cHJlc3Npb24gbm9kZXMgd2l0aCBjb25zdGFudHMKKyAgICAgICAgZm9yIGFzc2lnbiwgY29uc3QgaW4gemlwKHRyZWUuYm9keSwgY29uc3RzKToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGFzc2lnbiwgYXN0LkFzc2lnbiksIGFzdC5kdW1wKGFzc2lnbikKKyAgICAgICAgICAgIG5ld19ub2RlID0gYXN0LkNvbnN0YW50KHZhbHVlPWNvbnN0KQorICAgICAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X25vZGUsIGFzc2lnbi52YWx1ZSkKKyAgICAgICAgICAgIGFzc2lnbi52YWx1ZSA9IG5ld19ub2RlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF9sb2FkX2NvbnN0KHRyZWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cykKKworICAgIGRlZiB0ZXN0X2xpdGVyYWxfZXZhbChzZWxmKToKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZSgiMSArIDIiKQorICAgICAgICBiaW5vcCA9IHRyZWUuYm9keVswXS52YWx1ZQorCisgICAgICAgIG5ld19sZWZ0ID0gYXN0LkNvbnN0YW50KHZhbHVlPTEwKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfbGVmdCwgYmlub3AubGVmdCkKKyAgICAgICAgYmlub3AubGVmdCA9IG5ld19sZWZ0CisKKyAgICAgICAgbmV3X3JpZ2h0ID0gYXN0LkNvbnN0YW50KHZhbHVlPTIwKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfcmlnaHQsIGJpbm9wLnJpZ2h0KQorICAgICAgICBiaW5vcC5yaWdodCA9IG5ld19yaWdodAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbChiaW5vcCksIDMwKQorCisKIGRlZiBtYWluKCk6CiAgICAgaWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzoKICAgICAgICAgcmV0dXJuCkBAIC05NDAsOCArMTA3MSw5IEBACiAgICAgICAgIGZvciBzdGF0ZW1lbnRzLCBraW5kIGluICgoZXhlY190ZXN0cywgImV4ZWMiKSwgKHNpbmdsZV90ZXN0cywgInNpbmdsZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2YWxfdGVzdHMsICJldmFsIikpOgogICAgICAgICAgICAgcHJpbnQoa2luZCsiX3Jlc3VsdHMgPSBbIikKLSAgICAgICAgICAgIGZvciBzIGluIHN0YXRlbWVudHM6Ci0gICAgICAgICAgICAgICAgcHJpbnQocmVwcih0b190dXBsZShjb21waWxlKHMsICI/Iiwga2luZCwgMHg0MDApKSkrIiwiKQorICAgICAgICAgICAgZm9yIHN0YXRlbWVudCBpbiBzdGF0ZW1lbnRzOgorICAgICAgICAgICAgICAgIHRyZWUgPSBhc3QucGFyc2Uoc3RhdGVtZW50LCAiPyIsIGtpbmQpCisgICAgICAgICAgICAgICAgcHJpbnQoIiVyLCIgJSAodG9fdHVwbGUodHJlZSksKSkKICAgICAgICAgICAgIHByaW50KCJdIikKICAgICAgICAgcHJpbnQoIm1haW4oKSIpCiAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CmluZGV4IDNhMzNmYzguLjBlYmE3NmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQpAQCAtMTIsNyArMTIsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgdW5pdHRlc3QubW9jawogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKQEAgLTI5NywzNyArMjk2LDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3luY2hhdC5maW5kX3ByZWZpeF9hdF9lbmQoInF3ZXJ0eWRramYiLCAiXHJcbiIpLCAwKQogCiAKLWNsYXNzIFRlc3RGaWZvKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZykgYXMgY206Ci0gICAgICAgICAgICBmID0gYXN5bmNoYXQuZmlmbygpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLndhcm5pbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJmaWZvIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy42IikKLSAgICAgICAgZi5wdXNoKDcpCi0gICAgICAgIGYucHVzaChiJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZpcnN0KCksIDcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZpcnN0KCksIGInYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc19lbXB0eSgpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgYidhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNfZW1wdHkoKSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMCwgTm9uZSkpCi0KLSAgICBkZWYgdGVzdF9naXZlbl9saXN0KHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKSBhcyBjbToKLSAgICAgICAgICAgIGYgPSBhc3luY2hhdC5maWZvKFtiJ3gnLCAxNywgM10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLndhcm5pbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJmaWZvIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy42IikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIGIneCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCAxNykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDMpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgwLCBOb25lKSkKLQotCiBjbGFzcyBUZXN0Tm90Q29ubmVjdGVkKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kaXNhbGxvd19uZWdhdGl2ZV90ZXJtaW5hdG9yKHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTI1OQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfbG9ja3MucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9sb2Nrcy5weQppbmRleCBkM2JkYzUxLi5lNTU3MjEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9sb2Nrcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9sb2Nrcy5weQpAQCAtMTMwLDggKzEzMCw4IEBACiAgICAgZGVmIHRlc3RfY2FuY2VsX3JhY2Uoc2VsZik6CiAgICAgICAgICMgU2V2ZXJhbCB0YXNrczoKICAgICAgICAgIyAtIEEgYWNxdWlyZXMgdGhlIGxvY2sKLSAgICAgICAgIyAtIEIgaXMgYmxvY2tlZCBpbiBhcWN1aXJlKCkKLSAgICAgICAgIyAtIEMgaXMgYmxvY2tlZCBpbiBhcWN1aXJlKCkKKyAgICAgICAgIyAtIEIgaXMgYmxvY2tlZCBpbiBhY3F1aXJlKCkKKyAgICAgICAgIyAtIEMgaXMgYmxvY2tlZCBpbiBhY3F1aXJlKCkKICAgICAgICAgIwogICAgICAgICAjIE5vdywgY29uY3VycmVudGx5OgogICAgICAgICAjIC0gQiBpcyBjYW5jZWxsZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKaW5kZXggNTA5M2U5ZC4uNTkzMGQ5ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTgzLDYgKzgzLDEwIEBACiAgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKICAgICAgICAgICAgICAgICByZXR1cm4gYXVnX3Rlc3QzKHNlbGYudmFsICsgdmFsKQogCisgICAgICAgIGNsYXNzIGF1Z190ZXN0NChhdWdfdGVzdDMpOgorICAgICAgICAgICAgIiIiQmxvY2tzIGluaGVyaXRhbmNlLCBhbmQgZmFsbGJhY2sgdG8gX19hZGRfXyIiIgorICAgICAgICAgICAgX19pYWRkX18gPSBOb25lCisKICAgICAgICAgeCA9IGF1Z190ZXN0KDEpCiAgICAgICAgIHkgPSB4CiAgICAgICAgIHggKz0gMTAKQEAgLTEwNiw2ICsxMTAsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWwsIDEzKQogCisgICAgICAgIHggPSBhdWdfdGVzdDQoNCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgeCArPSAxMAorCiAKICAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMyKHRlc3Rfc2VsZik6CiAgICAgICAgIG91dHB1dCA9IFtdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDQwYWM5YmYuLjYxMzNiYmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHN5cwotaW1wb3J0IGZ1bmN0b29scwogCiAjIFRoZXNlIHRlc3RzIGFsbCB1c2Ugb25lIG9mIHRoZSBiaWdtZW10ZXN0IGRlY29yYXRvcnMgdG8gaW5kaWNhdGUgaG93IG11Y2gKICMgbWVtb3J5IHRoZXkgdXNlIGFuZCBob3cgbXVjaCBtZW1vcnkgdGhleSBuZWVkIHRvIGJlIGV2ZW4gbWVhbmluZ2Z1bC4gIFRoZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggODM2N2FmZS4uZmJjOTMzZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQpAQCAtMTU5LDExICsxNTksMjUgQEAKICAgICAgICAgIyBUaGVuIGNhbGN1bGF0ZSB0aGUgaGV4YmluNCBiaW5hcnktdG8tQVNDSUkgdHJhbnNsYXRpb24KICAgICAgICAgcmxlID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQogICAgICAgICBhID0gYmluYXNjaWkuYjJhX2hxeChzZWxmLnR5cGUydGVzdChybGUpKQorCiAgICAgICAgIGIsIF8gPSBiaW5hc2NpaS5hMmJfaHF4KHNlbGYudHlwZTJ0ZXN0KGEpKQogICAgICAgICByZXMgPSBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KGIpCi0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKIAorICAgIGRlZiB0ZXN0X3JsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHJlcGV0aXRpb24gd2l0aCBhIHJlcGV0aXRpb24gbG9uZ2VyIHRoYW4gdGhlIGxpbWl0IG9mIDI1NQorICAgICAgICBkYXRhID0gKGInYScgKiAxMDAgKyBiJ2InICsgYidjJyAqIDMwMCkKKworICAgICAgICBlbmNvZGVkID0gYmluYXNjaWkucmxlY29kZV9ocXgoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ2FceDkwZCcgICAgICAjICdhJyAqIDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2InICAgICAgICAgICAjICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwXHhmZicgICAjICdjJyAqIDI1NQorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwLScpKSAgICAjICdjJyAqIDQ1CisKKyAgICAgICAgZGVjb2RlZCA9IGJpbmFzY2lpLnJsZWRlY29kZV9ocXgoZW5jb2RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkLCBkYXRhKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICAjIHRlc3QgaGV4bGlmaWNhdGlvbgogICAgICAgICBzID0gYid7c1wwMDVcMDAwXDAwMFwwMDB3b3JsZGlcMDAyXDAwMFwwMDBcMDAwc1wwMDVcMDAwXDAwMFwwMDBoZWxsb2lcMDAxXDAwMFwwMDBcMDAwMCcKQEAgLTI2Miw2ICsyNzYsMTYgQEAKICAgICAgICAgICAgICMgbm9uLUFTQ0lJIHN0cmluZwogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYTJiLCAiXHg4MCIpCiAKKyAgICBkZWYgdGVzdF9iMmFfYmFzZTY0X25ld2xpbmUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzI1MzU3OiB0ZXN0IG5ld2xpbmUgcGFyYW1ldGVyCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FHVnNiRzg9JykKKwogCiBjbGFzcyBBcnJheUJpbkFTQ0lJVGVzdChCaW5BU0NJSVRlc3QpOgogICAgIGRlZiB0eXBlMnRlc3Qoc2VsZiwgcyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmhleC5weSBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CmluZGV4IDlkNGM4NWEuLjIxZjQ0NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CkBAIC00LDcgKzQsNiBAQAogICAgQmFzZWQgb24gYW4gb3JpZ2luYWwgdGVzdCBieSBSb2dlciBFLiBNYXNzZS4KICIiIgogaW1wb3J0IGJpbmhleAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQppbmRleCBlOWRiZGRjLi4zZWQwMThlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKQEAgLTIsNyArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Ci1mcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbmUsIGx0LCBndCwgbGUsIGdlCitmcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbGUsIG5lCiBmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YQogCiBkZWYgZ2NkKGEsIGIpOgpAQCAtMzg4LDYgKzM4OCw1NCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wX3NlcXVlbmNlKGVxLCBCLCBWKSwgWydCLl9fZXFfXycsICdWLl9fZXFfXyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wX3NlcXVlbmNlKGxlLCBCLCBWKSwgWydCLl9fbGVfXycsICdWLl9fZ2VfXyddKQogCitjbGFzcyBTdXBFcShvYmplY3QpOgorICAgICIiIkNsYXNzIHRoYXQgY2FuIHRlc3QgZXF1YWxpdHkiIiIKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUyhTdXBFcSk6CisgICAgIiIiU3ViY2xhc3Mgb2YgU3VwRXEgdGhhdCBzaG91bGQgZmFpbCIiIgorICAgIF9fZXFfXyA9IE5vbmUKKworY2xhc3MgRihvYmplY3QpOgorICAgICIiIkluZGVwZW5kZW50IGNsYXNzIHRoYXQgc2hvdWxkIGZhbGwgYmFjayIiIgorCitjbGFzcyBYKG9iamVjdCk6CisgICAgIiIiSW5kZXBlbmRlbnQgY2xhc3MgdGhhdCBzaG91bGQgZmFpbCIiIgorICAgIF9fZXFfXyA9IE5vbmUKKworY2xhc3MgU04oU3VwRXEpOgorICAgICIiIlN1YmNsYXNzIG9mIFN1cEVxIHRoYXQgY2FuIHRlc3QgZXF1YWxpdHksIGJ1dCBub3Qgbm9uLWVxdWFsaXR5IiIiCisgICAgX19uZV9fID0gTm9uZQorCitjbGFzcyBYTjoKKyAgICAiIiJJbmRlcGVuZGVudCBjbGFzcyB0aGF0IGNhbiB0ZXN0IGVxdWFsaXR5LCBidXQgbm90IG5vbi1lcXVhbGl0eSIiIgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIF9fbmVfXyA9IE5vbmUKKworY2xhc3MgRmFsbGJhY2tCbG9ja2luZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJVbml0IHRlc3RzIGZvciBOb25lIG1ldGhvZCBibG9ja2luZyIiIgorCisgICAgZGVmIHRlc3RfZmFsbGJhY2tfcm1ldGhvZF9ibG9ja2luZyhzZWxmKToKKyAgICAgICAgZSwgZiwgcywgeCA9IFN1cEVxKCksIEYoKSwgUygpLCBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZSkKKyAgICAgICAgIyBsZWZ0IG9wZXJhbmQgaXMgY2hlY2tlZCBmaXJzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXEsIHgsIGUpCisgICAgICAgICMgUyBpcyBhIHN1YmNsYXNzLCBzbyBpdCdzIGFsd2F5cyBjaGVja2VkIGZpcnN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXEsIGUsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXEsIHMsIGUpCisKKyAgICBkZWYgdGVzdF9mYWxsYmFja19uZV9ibG9ja2luZyhzZWxmKToKKyAgICAgICAgZSwgc24sIHhuID0gU3VwRXEoKSwgU04oKSwgWE4oKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGUgIT0gZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZSwgZSwgc24pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbmUsIHNuLCBlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGUgIT0geG4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbmUsIHhuLCBlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5IGIvTGliL3Rlc3QvdGVzdF9ib29sLnB5CmluZGV4IGQzMGEzYjkuLjlmOGYwZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKQEAgLTk2LDYgKzk2LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UvMSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS8xLCBGYWxzZSkKIAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUlMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlJTEsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUlMiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlJTIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UlMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZSUxLCBGYWxzZSkKKwogICAgICAgICBmb3IgYiBpbiBGYWxzZSwgVHJ1ZToKICAgICAgICAgICAgIGZvciBpIGluIDAsIDEsIDI6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiKippLCBpbnQoYikqKmkpCkBAIC0zMzMsNiArMzQwLDE3IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0IChFeGNlcHRpb24pIGFzIGVfbGVuOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlX2Jvb2wpLCBzdHIoZV9sZW4pKQogCisgICAgZGVmIHRlc3RfYmxvY2tlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fYm9vbF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2wsIEEoKSkKKworICAgICAgICBjbGFzcyBCOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwCisgICAgICAgICAgICBfX2Jvb2xfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBib29sLCBCKCkpCisKICAgICBkZWYgdGVzdF9yZWFsX2FuZF9pbWFnKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUucmVhbCwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLmltYWcsIDApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmZlci5weSBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CmluZGV4IDJlZWY5ZmMuLmI4M2YyZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC0xNiw3ICsxNiw2IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBwZXJtdXRhdGlvbnMsIHByb2R1Y3QKIGZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNhbXBsZSwgY2hvaWNlCi1mcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXIKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHN5cywgYXJyYXksIGlvCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weSBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQppbmRleCAzOWM4MGIwLi40ODZmNDQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CkBAIC0xNiw4ICsxNiwxMCBAQAogaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gb3BlcmF0b3IgaW1wb3J0IG5lZwotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rLCAgcnVuX3VuaXR0ZXN0LCBjaGVja193YXJuaW5ncworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IChURVNURk4sIHVubGluaywgIHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNweXRob25fb25seSkKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKIHRyeToKICAgICBpbXBvcnQgcHR5LCBzaWduYWwKQEAgLTE3MTAsMjEgKzE3MTIsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNwYW0oKSwgJ3NwYW00MicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC50b19ieXRlcygyLCAnbGl0dGxlJyksIGInXHgyYVx4MDAnKQogCi0gICAgZGVmIHRlc3RfdHlwZV9uZXdfa2V5d29yZHMoc2VsZik6Ci0gICAgICAgIGNsYXNzIEI6Ci0gICAgICAgICAgICBkZWYgaGFtKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiAnaGFtJWQnICUgc2VsZgotICAgICAgICBDID0gdHlwZS5fX25ld19fKHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nQycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZXM9KEIsIGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGljdD17J3NwYW0nOiBsYW1iZGEgc2VsZjogJ3NwYW0lcycgJSBzZWxmfSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fbmFtZV9fLCAnQycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5fX3F1YWxuYW1lX18sICdDJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fbW9kdWxlX18sIF9fbmFtZV9fKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19iYXNlc19fLCAoQiwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhDLl9fYmFzZV9fLCBpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NwYW0nLCBDLl9fZGljdF9fKQotICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdoYW0nLCBDLl9fZGljdF9fKQorICAgIGRlZiB0ZXN0X3R5cGVfbm9rd2FyZ3Moc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHR5cGUoJ2EnLCAoKSwge30sIHg9NSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdHlwZSgnYScsICgpLCBkaWN0PXt9KQogCiAgICAgZGVmIHRlc3RfdHlwZV9uYW1lKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiAnQScsICdceGM0JywgJ1xVMDAwMWY0MGQnLCAnQi5BJywgJzQyJywgJyc6CkBAIC0xNzg4LDYgKzE3ODAsMTk0IEBACiAgICAgICAgICAgICBBLl9fZG9jX18gPSBkb2MKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQS5fX2RvY19fLCBkb2MpCiAKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfbm9uZW1wdHkoc2VsZik6CisgICAgICAgIGNsYXNzIFNwYW06CisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBkID0gNAorICAgICAgICAgICAgZWdncyA9IDIKKyAgICAgICAgICAgIGUgPSA1CisgICAgICAgICAgICBiID0gNDIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNwYW0uX19kZWZpbml0aW9uX29yZGVyX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdfX21vZHVsZV9fJywgJ19fcXVhbG5hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdiJywgJ2MnLCAnYScsICdkJywgJ2VnZ3MnLCAnZScpKQorCisgICAgZGVmIHRlc3RfdHlwZV9kZWZpbml0aW9uX29yZGVyX2VtcHR5KHNlbGYpOgorICAgICAgICBjbGFzcyBFbXB0eToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEVtcHR5Ll9fZGVmaW5pdGlvbl9vcmRlcl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnX19tb2R1bGVfXycsICdfX3F1YWxuYW1lX18nKSkKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9vbl9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgU3BhbToKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBTcGFtKCkuX19kZWZpbml0aW9uX29yZGVyX18KKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9zZXRfdG9fTm9uZShzZWxmKToKKyAgICAgICAgY2xhc3MgU3BhbToKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgU3BhbS5fX2RlZmluaXRpb25fb3JkZXJfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTcGFtLl9fZGVmaW5pdGlvbl9vcmRlcl9fLCBOb25lKQorCisgICAgZGVmIHRlc3RfdHlwZV9kZWZpbml0aW9uX29yZGVyX3NldF90b190dXBsZShzZWxmKToKKyAgICAgICAgY2xhc3MgU3BhbToKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgU3BhbS5fX2RlZmluaXRpb25fb3JkZXJfXyA9ICgneCcsICd5JywgJ3onKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNwYW0uX19kZWZpbml0aW9uX29yZGVyX18sICgneCcsICd5JywgJ3onKSkKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9kZWxldGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtOgorICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAxCisgICAgICAgICAgICBjID0gMworICAgICAgICBkZWwgU3BhbS5fX2RlZmluaXRpb25fb3JkZXJfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNwYW0uX19kZWZpbml0aW9uX29yZGVyX18sIE5vbmUpCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfc2V0X3RvX2JhZF90eXBlKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtOgorICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAxCisgICAgICAgICAgICBjID0gMworICAgICAgICBTcGFtLl9fZGVmaW5pdGlvbl9vcmRlcl9fID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTcGFtLl9fZGVmaW5pdGlvbl9vcmRlcl9fLCA0MikKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9idWlsdGlucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmplY3QuX19kZWZpbml0aW9uX29yZGVyX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZS5fX2RlZmluaXRpb25fb3JkZXJfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0Ll9fZGVmaW5pdGlvbl9vcmRlcl9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoTm9uZSkuX19kZWZpbml0aW9uX29yZGVyX18sIE5vbmUpCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfZHVuZGVyX25hbWVzX2luY2x1ZGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBEdW5kZXI6CisgICAgICAgICAgICBWQVIgPSAzCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRHVuZGVyLl9fZGVmaW5pdGlvbl9vcmRlcl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnX19tb2R1bGVfXycsICdfX3F1YWxuYW1lX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnVkFSJywgJ19faW5pdF9fJykpCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfb25seV9kdW5kZXJfbmFtZXMoc2VsZik6CisgICAgICAgIGNsYXNzIER1bmRlck9ubHk6CisgICAgICAgICAgICBfX3h5el9fID0gTm9uZQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKER1bmRlck9ubHkuX19kZWZpbml0aW9uX29yZGVyX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdfX21vZHVsZV9fJywgJ19fcXVhbG5hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3h5el9fJywgJ19faW5pdF9fJykpCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfdW5kZXJzY29yZV9uYW1lcyhzZWxmKToKKyAgICAgICAgY2xhc3MgSGFsZkR1bmRlcjoKKyAgICAgICAgICAgIF9fd2hldGhlcl90b19iZSA9IFRydWUKKyAgICAgICAgICAgIG9yX25vdF90b19iZV9fID0gRmFsc2UKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhhbGZEdW5kZXIuX19kZWZpbml0aW9uX29yZGVyX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdfX21vZHVsZV9fJywgJ19fcXVhbG5hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdfSGFsZkR1bmRlcl9fd2hldGhlcl90b19iZScsICdvcl9ub3RfdG9fYmVfXycpKQorCisgICAgZGVmIHRlc3RfdHlwZV9kZWZpbml0aW9uX29yZGVyX3dpdGhfc2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIFNsb3RzOgorICAgICAgICAgICAgX19zbG90c19fID0gKCd4JywgJ3knKQorICAgICAgICAgICAgYSA9IDEKKyAgICAgICAgICAgIGIgPSAyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTbG90cy5fX2RlZmluaXRpb25fb3JkZXJfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ19fbW9kdWxlX18nLCAnX19xdWFsbmFtZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fc2xvdHNfXycsICdhJywgJ2InKSkKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9vdmVyd3JpdHRlbl9Ob25lKHNlbGYpOgorICAgICAgICBjbGFzcyBPdmVyd3JpdHRlbk5vbmU6CisgICAgICAgICAgICBfX2RlZmluaXRpb25fb3JkZXJfXyA9IE5vbmUKKyAgICAgICAgICAgIGEgPSAxCisgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgYyA9IDMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE92ZXJ3cml0dGVuTm9uZS5fX2RlZmluaXRpb25fb3JkZXJfXywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9vdmVyd3JpdHRlbl90dXBsZShzZWxmKToKKyAgICAgICAgY2xhc3MgT3ZlcndyaXR0ZW5UdXBsZToKKyAgICAgICAgICAgIF9fZGVmaW5pdGlvbl9vcmRlcl9fID0gKCd4JywgJ3knLCAneicpCisgICAgICAgICAgICBhID0gMQorICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgIGMgPSAzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChPdmVyd3JpdHRlblR1cGxlLl9fZGVmaW5pdGlvbl9vcmRlcl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICgneCcsICd5JywgJ3onKSkKKworICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9vdmVyd3JpdHRlbl9iYWRfaXRlbShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgUG9vcmx5T3ZlcndyaXR0ZW46CisgICAgICAgICAgICAgICAgX19kZWZpbml0aW9uX29yZGVyX18gPSAoJ2EnLCAyLCAnYycpCisgICAgICAgICAgICAgICAgYSA9IDEKKyAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgIGMgPSAzCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfb3ZlcndyaXR0ZW5fYmFkX3R5cGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIFBvb3JseU92ZXJ3cml0dGVuOgorICAgICAgICAgICAgICAgIF9fZGVmaW5pdGlvbl9vcmRlcl9fID0gWydhJywgMiwgJ2MnXQorICAgICAgICAgICAgICAgIGEgPSAxCisgICAgICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgICAgICBjID0gMworCisgICAgZGVmIHRlc3RfdHlwZV9kZWZpbml0aW9uX29yZGVyX21ldGFjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTWV0YSh0eXBlKToKKyAgICAgICAgICAgIFNQQU0gPSA0MgorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1ldGEuX19kZWZpbml0aW9uX29yZGVyX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdfX21vZHVsZV9fJywgJ19fcXVhbG5hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdTUEFNJywgJ19faW5pdF9fJykpCisKKyAgICBkZWYgdGVzdF90eXBlX2RlZmluaXRpb25fb3JkZXJfT3JkZXJlZERpY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19wcmVwYXJlX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gT3JkZXJlZERpY3QoKQorCisgICAgICAgIGNsYXNzIFdpdGhPRGljdChtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICB4PSd5JworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoV2l0aE9EaWN0Ll9fZGVmaW5pdGlvbl9vcmRlcl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnX19tb2R1bGVfXycsICdfX3F1YWxuYW1lX18nLCAneCcpKQorCisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19wcmVwYXJlX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBjbGFzcyBPRGljdFN1YihPcmRlcmVkRGljdCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICByZXR1cm4gT0RpY3RTdWIoKQorCisgICAgICAgIGNsYXNzIFdpdGhPRGljdFN1YihtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICB4PSd5JworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoV2l0aE9EaWN0U3ViLl9fZGVmaW5pdGlvbl9vcmRlcl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnX19tb2R1bGVfXycsICdfX3F1YWxuYW1lX18nLCAneCcpKQorCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3R5cGVfZGVmaW5pdGlvbl9vcmRlcl9jcHl0aG9uKHNlbGYpOgorICAgICAgICAjIHNvbWUgaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSBhbiBvcmRlcmVkLWJ5LWRlZmF1bHQgZGljdC4KKworICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fcHJlcGFyZV9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHt9CisKKyAgICAgICAgY2xhc3MgTm90T3JkZXJlZChtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICB4PSd5JworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm90T3JkZXJlZC5fX2RlZmluaXRpb25fb3JkZXJfXywgTm9uZSkKKwogICAgIGRlZiB0ZXN0X2JhZF9hcmdzKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICB0eXBlKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CmluZGV4IGNjMzEyYjEuLjhiYmQ2NjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQpAQCAtMjY5LDYgKzI2OSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMjAwLCBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IDMwMCBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IC0xIGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogc3lzLm1heHNpemUrMSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZmxvYXQob3JkKCdhJykpIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAiYSIgaW4gYikKQEAgLTMwMCw2ICszMDEsMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCwgJ1x4MDAnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAnMTIgICBceDAwICAgMzQnKQogCisgICAgICAgIGZvciBkYXRhLCBwb3MgaW4gKAorICAgICAgICAgICAgIyBpbnZhbGlkIGZpcnN0IGhleGFkZWNpbWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgKCcxMiB4NCA1NicsIDMpLAorICAgICAgICAgICAgIyBpbnZhbGlkIHNlY29uZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICgnMTIgM3ggNTYnLCA0KSwKKyAgICAgICAgICAgICMgdHdvIGludmFsaWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVycworICAgICAgICAgICAgKCcxMiB4eSA1NicsIDMpLAorICAgICAgICAgICAgIyB0ZXN0IG5vbi1BU0NJSSBzdHJpbmcKKyAgICAgICAgICAgICgnMTIgM1x4ZmYgNTYnLCA0KSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgc2VsZi50eXBlMnRlc3QuZnJvbWhleChkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignYXQgcG9zaXRpb24gJXMnICUgcG9zLCBzdHIoY20uZXhjZXB0aW9uKSkKKwogICAgIGRlZiB0ZXN0X2hleChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5oZXgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuaGV4LCAxKQpAQCAtNjc0LDYgKzY4OSwzNyBAQAogICAgICAgICB0ZXN0LnN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgaXRlciwgc2VsZi50eXBlMnRlc3QpCiAgICAgICAgIHRlc3Quc3VwcG9ydC5jaGVja19mcmVlX2FmdGVyX2l0ZXJhdGluZyhzZWxmLCByZXZlcnNlZCwgc2VsZi50eXBlMnRlc3QpCiAKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgcm9zZXR0YSA9IGJ5dGVhcnJheShyYW5nZSgyNTYpKQorICAgICAgICByb3NldHRhW29yZCgnbycpXSA9IG9yZCgnZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLnRyYW5zbGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLnRyYW5zbGF0ZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYi50cmFuc2xhdGUsIGJ5dGVzKHJhbmdlKDI1NSkpKQorCisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShyb3NldHRhLCBiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIHNlbGYudHlwZTJ0ZXN0KQorCisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShyb3NldHRhKQorICAgICAgICBkID0gYi50cmFuc2xhdGUocm9zZXR0YSwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWxsZScpCisKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEsIGInbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQorICAgICAgICBjID0gYi50cmFuc2xhdGUoTm9uZSwgYidlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hsbG8nKQorCisgICAgICAgICMgdGVzdCBkZWxldGUgYXMgYSBrZXl3b3JkIGFyZ3VtZW50CisgICAgICAgIGMgPSBiLnRyYW5zbGF0ZShyb3NldHRhLCBkZWxldGU9YicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGVsbGUnKQorICAgICAgICBjID0gYi50cmFuc2xhdGUocm9zZXR0YSwgZGVsZXRlPWInbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQorICAgICAgICBjID0gYi50cmFuc2xhdGUoTm9uZSwgZGVsZXRlPWInZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidobGxvJykKKwogCiBjbGFzcyBCeXRlc1Rlc3QoQmFzZUJ5dGVzVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIHR5cGUydGVzdCA9IGJ5dGVzCkBAIC03MjIsMzEgKzc2OCwxNDIgQEAKIAogICAgICMgVGVzdCBQeUJ5dGVzX0Zyb21Gb3JtYXQoKQogICAgIGRlZiB0ZXN0X2Zyb21fZm9ybWF0KHNlbGYpOgotICAgICAgICB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHB5dGhvbmFwaSwgcHlfb2JqZWN0LCBjX2ludCwgY19jaGFyX3AKKyAgICAgICAgY3R5cGVzID0gdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2N0eXBlcycpCisgICAgICAgIF90ZXN0Y2FwaSA9IHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGVzdGNhcGknKQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBweV9vYmplY3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0ICgKKyAgICAgICAgICAgIGNfaW50LCBjX3VpbnQsCisgICAgICAgICAgICBjX2xvbmcsIGNfdWxvbmcsCisgICAgICAgICAgICBjX3NpemVfdCwgY19zc2l6ZV90LAorICAgICAgICAgICAgY19jaGFyX3ApCisKICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0ID0gcHl0aG9uYXBpLlB5Qnl0ZXNfRnJvbUZvcm1hdAogICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQucmVzdHlwZSA9IHB5X29iamVjdAogCisgICAgICAgICMgYmFzaWMgdGVzdHMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidmb3JtYXQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Zvcm1hdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInSGVsbG8gJXMgIScsIGInd29ybGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ0hlbGxvIHdvcmxkICEnKQogCisgICAgICAgICMgdGVzdCBmb3JtYXR0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9XDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludChvcmQoJ0AnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1AJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQoMjU1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPVx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KDEpLCBjX2xvbmcoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9MSBsZD0yIHpkPTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KC0xKSwgY19sb25nKC0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoLTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9LTEgbGQ9LTIgemQ9LTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3U9JXUgbHU9JWx1IHp1PSV6dScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdWludCgxMjMpLCBjX3Vsb25nKDQ1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDc4OSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIndT0xMjMgbHU9NDU2IHp1PTc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInaT0laScsIGNfaW50KDEyMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInaT0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2k9JWknLCBjX2ludCgtMTIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidpPS0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JXgnLCBjX2ludCgweGFiYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIneD1hYmMnKQorCisgICAgICAgIHNpemVvZl9wdHIgPSBjdHlwZXMuc2l6ZW9mKGNfY2hhcl9wKQorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgICMgV2luZG93cyAoTVNDUlQpCisgICAgICAgICAgICBwdHJfZm9ybWF0ID0gJzB4JTB7fVgnLmZvcm1hdCgyICogc2l6ZW9mX3B0cikKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChwdHJfZm9ybWF0ICUgcHRyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVTklYIChnbGliYykKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuICclI3gnICUgcHRyCisKKyAgICAgICAgcHRyID0gMHhhYmNkZWYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidwdHI9JXAnLCBjX2NoYXJfcChwdHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3B0cj0nICsgcHRyX2Zvcm1hdHRlcihwdHIpKS5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIncz0lcycsIGNfY2hhcl9wKGInY3N0cicpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3M9Y3N0cicpCisKKyAgICAgICAgIyB0ZXN0IG1pbmltdW0gYW5kIG1heGltdW0gaW50ZWdlciB2YWx1ZXMKKyAgICAgICAgc2l6ZV9tYXggPSBjX3NpemVfdCgtMSkudmFsdWUKKyAgICAgICAgZm9yIGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUsIHZhbHVlLCBweV9mb3JtYXR0ZXIgaW4gKAorICAgICAgICAgICAgKGInJWQnLCBjX2ludCwgX3Rlc3RjYXBpLklOVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclZCcsIGNfaW50LCBfdGVzdGNhcGkuSU5UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsZCcsIGNfbG9uZywgX3Rlc3RjYXBpLkxPTkdfTUlOLCBzdHIpLAorICAgICAgICAgICAgKGInJWxkJywgY19sb25nLCBfdGVzdGNhcGkuTE9OR19NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclbHUnLCBjX3Vsb25nLCBfdGVzdGNhcGkuVUxPTkdfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJXpkJywgY19zc2l6ZV90LCBfdGVzdGNhcGkuUFlfU1NJWkVfVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclemQnLCBjX3NzaXplX3QsIF90ZXN0Y2FwaS5QWV9TU0laRV9UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6dScsIGNfc2l6ZV90LCBzaXplX21heCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVwJywgY19jaGFyX3AsIHNpemVfbWF4LCBwdHJfZm9ybWF0dGVyKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUodmFsdWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfZm9ybWF0dGVyKHZhbHVlKS5lbmNvZGUoJ2FzY2lpJykpLAorCisgICAgICAgICMgd2lkdGggYW5kIHByZWNpc2lvbiAod2lkdGggaXMgY3VycmVudGx5IGlnbm9yZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJTVzJywgYidhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclLjNzJywgYidhYmNkZWYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FiYycpCisKKyAgICAgICAgIyAnJSUnIGZvcm1hdHRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidbJSVdJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidbJV0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJWMnLCBjX2ludChvcmQoJ18nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJXMnKQorCisgICAgICAgICMgSW52YWxpZCBmb3JtYXRzIGFuZCBwYXJ0aWFsIGZvcm1hdHRpbmcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJyksIGInJScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUnKSwgYiclJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJXMnKSwgYiclcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInWyUlXScpLCBiJ1slXScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUlYycsIGNfaW50KG9yZCgnXycpKSksIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JWkgeT0lJywgY19pbnQoMiksIGNfaW50KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3g9MiB5PSUnKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYzolYycsIGNfaW50KDI1NSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInYzpceGZmJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidzOiVzJywgY19jaGFyX3AoYidjc3RyJykpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInczpjc3RyJykKLQotICAgICAgICAjIElzc3VlICMxOTk2OQorICAgICAgICAjIElzc3VlICMxOTk2OTogJWMgbXVzdCByYWlzZSBPdmVyZmxvd0Vycm9yIGZvciB2YWx1ZXMKKyAgICAgICAgIyBub3QgaW4gdGhlIHJhbmdlIFswOyAyNTVdCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdCwgYiclYycsIGNfaW50KC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0LCBiJyVjJywgY19pbnQoMjU2KSkKIAorICAgIGRlZiB0ZXN0X2J5dGVzX2Jsb2NraW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBJdGVyYXRpb25CbG9ja2VkKGxpc3QpOgorICAgICAgICAgICAgX19ieXRlc19fID0gTm9uZQorICAgICAgICBpID0gWzAsIDEsIDIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoaSksIGInXHgwMFx4MDFceDAyXHgwMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnl0ZXMsIEl0ZXJhdGlvbkJsb2NrZWQoaSkpCisKKyAgICAgICAgIyBBdCBsZWFzdCBpbiBDUHl0aG9uLCBiZWNhdXNlIGJ5dGVzLl9fbmV3X18gYW5kIHRoZSBDIEFQSQorICAgICAgICAjIFB5Qnl0ZXNfRnJvbU9iamVjdCBoYXZlIGRpZmZlcmVudCBmYWxsYmFjayBydWxlcywgaW50ZWdlcgorICAgICAgICAjIGZhbGxiYWNrIGlzIGhhbmRsZWQgc3BlY2lhbGx5LCBzbyB0ZXN0IHNlcGFyYXRlbHkuCisgICAgICAgIGNsYXNzIEludEJsb2NrZWQoaW50KToKKyAgICAgICAgICAgIF9fYnl0ZXNfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcygzKSwgYidcMFwwXDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ5dGVzLCBJbnRCbG9ja2VkKDMpKQorCisgICAgICAgICMgV2hpbGUgdGhlcmUgaXMgbm8gc2VwYXJhdGVseS1kZWZpbmVkIHJ1bGUgZm9yIGhhbmRsaW5nIGJ5dGVzCisgICAgICAgICMgc3ViY2xhc3NlcyBkaWZmZXJlbnRseSBmcm9tIG90aGVyIGJ1ZmZlci1pbnRlcmZhY2UgY2xhc3NlcywKKyAgICAgICAgIyBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgd2VsbCBzcGVjaWFsLWNhc2UgdGhlbSAoYXMgQ1B5dGhvbiAyLngKKyAgICAgICAgIyBzdHIgZGlkKSwgc28gdGVzdCB0aGVtIHNlcGFyYXRlbHkuCisgICAgICAgIGNsYXNzIEJ5dGVzU3ViY2xhc3NCbG9ja2VkKGJ5dGVzKToKKyAgICAgICAgICAgIF9fYnl0ZXNfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiJ2FiJyksIGInYWInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ5dGVzLCBCeXRlc1N1YmNsYXNzQmxvY2tlZChiJ2FiJykpCisKKyAgICAgICAgY2xhc3MgQnVmZmVyQmxvY2tlZChieXRlYXJyYXkpOgorICAgICAgICAgICAgX19ieXRlc19fID0gTm9uZQorICAgICAgICBiYSwgYmIgPSBieXRlYXJyYXkoYidhYicpLCBCdWZmZXJCbG9ja2VkKGInYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGJhKSwgYidhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnl0ZXMsIGJiKQorCiAKIGNsYXNzIEJ5dGVBcnJheVRlc3QoQmFzZUJ5dGVzVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIHR5cGUydGVzdCA9IGJ5dGVhcnJheQpAQCAtMTMyMywyNCArMTQ4MCw2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiIiVzIicgJSBjaHIoYykpCiAKLSAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6Ci0gICAgICAgIGIgPSBiJ2hlbGxvJwotICAgICAgICBiYSA9IGJ5dGVhcnJheShiKQotICAgICAgICByb3NldHRhID0gYnl0ZWFycmF5KHJhbmdlKDAsIDI1NikpCi0gICAgICAgIHJvc2V0dGFbb3JkKCdvJyldID0gb3JkKCdlJykKLSAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEsIGInbCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidoZWxsbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQotICAgICAgICBjID0gYmEudHJhbnNsYXRlKHJvc2V0dGEsIGInbCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmEsIGInaGVsbG8nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGVlJykKLSAgICAgICAgYyA9IGIudHJhbnNsYXRlKE5vbmUsIGInZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidobGxvJykKLSAgICAgICAgYyA9IGJhLnRyYW5zbGF0ZShOb25lLCBiJ2UnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGxsbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi50cmFuc2xhdGUsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmEudHJhbnNsYXRlLCBOb25lLCBOb25lKQotCiAgICAgZGVmIHRlc3Rfc3BsaXRfYnl0ZWFycmF5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYSBiJy5zcGxpdChtZW1vcnl2aWV3KGInICcpKSwgW2InYScsIGInYiddKQogCkBAIC0xNTA0LDcgKzE2NDMsMzIgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhLnkpLCB0eXBlKGIueSkpCiAKLSAgICB0ZXN0X2Zyb21oZXggPSBCYXNlQnl0ZXNUZXN0LnRlc3RfZnJvbWhleAorICAgIGRlZiB0ZXN0X2Zyb21oZXgoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdC5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBzZWxmLnR5cGUydGVzdCkKKworICAgICAgICBjbGFzcyBCMShzZWxmLmJhc2V0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgdmFsdWUpOgorICAgICAgICAgICAgICAgIG1lID0gc2VsZi5iYXNldHlwZS5fX25ld19fKGNscywgdmFsdWUpCisgICAgICAgICAgICAgICAgbWUuZm9vID0gJ2JhcicKKyAgICAgICAgICAgICAgICByZXR1cm4gbWUKKworICAgICAgICBiID0gQjEuZnJvbWhleCgnMWEyQjMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ1x4MWFceDJiXHgzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiKSwgQjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5mb28sICdiYXInKQorCisgICAgICAgIGNsYXNzIEIyKHNlbGYuYmFzZXR5cGUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKG1lLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYmFzZXR5cGUgaXMgbm90IGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJhc2V0eXBlLl9faW5pdF9fKG1lLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgbWUuZm9vID0gJ2JhcicKKworICAgICAgICBiID0gQjIuZnJvbWhleCgnMWEyQjMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ1x4MWFceDJiXHgzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiKSwgQjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5mb28sICdiYXInKQogCiAKIGNsYXNzIEJ5dGVBcnJheVN1YmNsYXNzKGJ5dGVhcnJheSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5IGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQppbmRleCA4MGVkNjMyLi42ZGFkMDU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKQEAgLTcwMiwxOSArNzAyLDE5IEBACiAKICAgICBkZWYgYXNzZXJ0RmFpbHVyZShzZWxmLCAqYXJncyk6CiAgICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLW0nLCAnY2FsZW5kYXInLCAqYXJncykKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1VzYWdlOicsIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ3VzYWdlOicsIHN0ZGVycikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMikKIAogICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CiAgICAgICAgIHN0ZG91dCA9IHNlbGYucnVuX29rKCctaCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVc2FnZTonLCBzdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYid1c2FnZTonLCBzdGRvdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidjYWxlbmRhci5weScsIHN0ZG91dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihiJy0taGVscCcsIHN0ZG91dCkKIAogICAgIGRlZiB0ZXN0X2lsbGVnYWxfYXJndW1lbnRzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJy16JykKLSAgICAgICAgI3NlbGYuYXNzZXJ0RmFpbHVyZSgnc3BhbScpCi0gICAgICAgICNzZWxmLmFzc2VydEZhaWx1cmUoJzIwMDQnLCAnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnMjAwNCcsICdzcGFtJykKICAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCctdCcsICdodG1sJywgJzIwMDQnLCAnMScpCiAKICAgICBkZWYgdGVzdF9vdXRwdXRfY3VycmVudF95ZWFyKHNlbGYpOgpAQCAtODE1LDUgKzgxNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgIGInaHJlZj0iY3VzdG9tLmNzcyIgLz4nLCBzdGRvdXQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbWRheXMnLCAnSmFudWFyeScsICdGZWJydWFyeScsICdFUE9DSCcsCisgICAgICAgICAgICAgICAgICAgICAnTU9OREFZJywgJ1RVRVNEQVknLCAnV0VETkVTREFZJywgJ1RIVVJTREFZJywgJ0ZSSURBWScsCisgICAgICAgICAgICAgICAgICAgICAnU0FUVVJEQVknLCAnU1VOREFZJywgJ2RpZmZlcmVudF9sb2NhbGUnLCAnYycsCisgICAgICAgICAgICAgICAgICAgICAncHJ3ZWVrJywgJ3dlZWsnLCAnZm9ybWF0JywgJ2Zvcm1hdHN0cmluZycsICdtYWluJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgY2FsZW5kYXIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQppbmRleCAxZWFkZDIyLi42ODUyMzgxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CkBAIC00LDggKzQsMTAgQEAKIGltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZwogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CkBAIC00NDIsNiArNDQ0LDcgQEAKICAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zdHJpcCgpLCBleHBlY3RlZF9vdXRwdXQpCiAKKwogY2xhc3MgU2tpcGl0ZW1UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3NraXBpdGVtKHNlbGYpOgpAQCAtNDkxLDEwICs0OTQsMTAgQEAKICAgICAgICAgICAgICAgICBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzKHR1cGxlXzEsIGRpY3RfYiwKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmVuY29kZSgiYXNjaWkiKSwga2V5d29yZHMpCiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IEZhbHNlCi0gICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICBzID0gImFyZ3VtZW50IDEgKGltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPikiCiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IChzdHIoZSkgPT0gcykKLSAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IEZhbHNlCiAKICAgICAgICAgICAgICMgdGVzdCB0aGUgZm9ybWF0IHVuaXQgd2hlbiBza2lwcGVkCkBAIC01MDMsNyArNTA2LDcgQEAKICAgICAgICAgICAgICAgICBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzKGVtcHR5X3R1cGxlLCBkaWN0X2IsCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2Zvcm1hdC5lbmNvZGUoImFzY2lpIiksIGtleXdvcmRzKQogICAgICAgICAgICAgICAgIHdoZW5fc2tpcHBlZCA9IEZhbHNlCi0gICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGU6CisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICBzID0gImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPjogJ3t9JyIuZm9ybWF0KGZvcm1hdCkKICAgICAgICAgICAgICAgICB3aGVuX3NraXBwZWQgPSAoc3RyKGUpID09IHMpCiAKQEAgLTUyNCw2ICs1MjcsMzIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX3Rlc3RjYXBpLnBhcnNlX3R1cGxlX2FuZF9rZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCksIHt9LCBiJycsIFs0Ml0pCiAKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX29ubHkoc2VsZik6CisgICAgICAgIHBhcnNlID0gX3Rlc3RjYXBpLnBhcnNlX3R1cGxlX2FuZF9rZXl3b3JkcworCisgICAgICAgIHBhcnNlKCgxLCAyLCAzKSwge30sIGInT09PJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgcGFyc2UoKDEsIDIpLCB7J2EnOiAzfSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICdGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAyIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMSBnaXZlblwpJyk6CisgICAgICAgICAgICBwYXJzZSgoMSwpLCB7J2EnOiAzfSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfE9PJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAnRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKCksIHt9LCBiJ098T08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwgMiksIHsnYSc6IDN9LCBiJ09PJE8nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICdGdW5jdGlvbiB0YWtlcyBleGFjdGx5IDIgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgxIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHsnYSc6IDN9LCBiJ09PJE8nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfE8kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDEgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgwIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgpLCB7fSwgYidPfE8kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FcnJvciwgJ0VtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyIFwkJyk6CisgICAgICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfCRPTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FcnJvciwgJ0VtcHR5IGtleXdvcmQnKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098T08nLCBbJycsICdhJywgJyddKQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiBjbGFzcyBUZXN0VGhyZWFkU3RhdGUodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC01NDgsNiArNTc3LDcgQEAKICAgICAgICAgdC5zdGFydCgpCiAgICAgICAgIHQuam9pbigpCiAKKwogY2xhc3MgVGVzdF90ZXN0Y2FwaSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfX3Rlc3RjYXBpKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKQEAgLTU1Niw1ICs1ODYsODQgQEAKICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICB0ZXN0KCkKIAorCitjbGFzcyBQeU1lbURlYnVnVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFBZVEhPTk1BTExPQyA9ICdkZWJ1ZycKKyAgICAjICcweDA0YzA2ZTAnIG9yICcwNEMwNkUwJworICAgIFBUUl9SRUdFWCA9IHInKD86MHgpP1swLTlhLWZBLUZdKycKKworICAgIGRlZiBjaGVjayhzZWxmLCBjb2RlKToKKyAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKKyAgICAgICAgICAgIG91dCA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZVEhPTk1BTExPQz1zZWxmLlBZVEhPTk1BTExPQykKKyAgICAgICAgc3RkZXJyID0gb3V0LmVycgorICAgICAgICByZXR1cm4gc3RkZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW1lbV9idWZmZXJfb3ZlcmZsb3coKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIG5vdCBhbGwgRk9SQklEREVOQllURSBcKDB4WzAtOWEtZl17ezJ9fVwpOlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMDogMHg3OCBcKlwqXCogT1VDSFxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMTogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMjogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgLipcbiIKKyAgICAgICAgICAgICAgICAgciIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgI1swLTldKyB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIKKyAgICAgICAgICAgICAgICAgciIgICAgRGF0YSBhdCBwOiBjYiBjYiBjYiAuKlxuIgorICAgICAgICAgICAgICAgICByIlxuIgorICAgICAgICAgICAgICAgICByIkZhdGFsIFB5dGhvbiBlcnJvcjogYmFkIHRyYWlsaW5nIHBhZCBieXRlIikKKyAgICAgICAgcmVnZXggPSByZWdleC5mb3JtYXQocHRyPXNlbGYuUFRSX1JFR0VYKQorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgsIGZsYWdzPXJlLkRPVEFMTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3RfYXBpX21pc3VzZShzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjaygnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5bWVtX2FwaV9taXN1c2UoKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjWzAtOV0rIHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBEYXRhIGF0IHA6IGNiIGNiIGNiIC4qXG4iCisgICAgICAgICAgICAgICAgIHIiXG4iCisgICAgICAgICAgICAgICAgIHIiRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgSUQ6IEFsbG9jYXRlZCB1c2luZyBBUEkgJ20nLCB2ZXJpZmllZCB1c2luZyBBUEkgJ3InXG4iKQorICAgICAgICByZWdleCA9IHJlZ2V4LmZvcm1hdChwdHI9c2VsZi5QVFJfUkVHRVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0LCByZWdleCkKKworICAgIGRlZiBjaGVja19tYWxsb2Nfd2l0aG91dF9naWwoc2VsZiwgY29kZSk6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soY29kZSkKKyAgICAgICAgZXhwZWN0ZWQgPSAoJ0ZhdGFsIFB5dGhvbiBlcnJvcjogUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgICAgJ3dpdGhvdXQgaG9sZGluZyB0aGUgR0lMJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgb3V0KQorCisgICAgZGVmIHRlc3RfcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIERlYnVnIGhvb2tzIG11c3QgcmFpc2UgYW4gZXJyb3IgaWYgUHlNZW1fTWFsbG9jKCkgaXMgY2FsbGVkCisgICAgICAgICMgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgX3Rlc3RjYXBpOyBfdGVzdGNhcGkucHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKCknCisgICAgICAgIHNlbGYuY2hlY2tfbWFsbG9jX3dpdGhvdXRfZ2lsKGNvZGUpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgRGVidWcgaG9va3MgbXVzdCByYWlzZSBhbiBlcnJvciBpZiBQeU9iamVjdF9NYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgIyB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICBjb2RlID0gJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoKScKKyAgICAgICAgc2VsZi5jaGVja19tYWxsb2Nfd2l0aG91dF9naWwoY29kZSkKKworCitjbGFzcyBQeU1lbU1hbGxvY0RlYnVnVGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICBQWVRIT05NQUxMT0MgPSAnbWFsbG9jX2RlYnVnJworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9QWU1BTExPQycpID09IDEsCisgICAgICAgICAgICAgICAgICAgICAnbmVlZCBweW1hbGxvYycpCitjbGFzcyBQeU1lbVB5bWFsbG9jRGVidWdUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgIFBZVEhPTk1BTExPQyA9ICdweW1hbGxvY19kZWJ1ZycKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgUHlfREVCVUcnKQorY2xhc3MgUHlNZW1EZWZhdWx0VGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICAjIHRlc3QgZGVmYXVsdCBhbGxvY2F0b3Igb2YgUHl0aG9uIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUKKyAgICBQWVRIT05NQUxMT0MgPSAnJworCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IGFiOWY2YWIuLjE2NDc4NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC03LDYgKzcsNyBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTywgQnl0ZXNJTworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIGNsYXNzIEhhY2tlZFN5c01vZHVsZToKICAgICAjIFRoZSByZWdyZXNzaW9uIHRlc3Qgd2lsbCBoYXZlIHJlYWwgdmFsdWVzIGluIHN5cy5hcmd2LCB3aGljaApAQCAtNDczLDYgKzQ3NCwxMSBAQAogICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignZm9ybS1kYXRhOyBuYW1lPSJmaWxlcyI7IGZpbGVuYW1lPSJmb1xcIm87YmFyIicpLAogICAgICAgICAgICAgKCJmb3JtLWRhdGEiLCB7Im5hbWUiOiAiZmlsZXMiLCAiZmlsZW5hbWUiOiAnZm8ibztiYXInfSkpCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsibG9nZmlsZSIsICJsb2dmcCIsICJpbml0bG9nIiwgImRvbG9nIiwgIm5vbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICJjbG9zZWxvZyIsICJsb2ciLCAibWF4bGVuIiwgInZhbGlkX2JvdW5kYXJ5In0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgY2dpLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiAKIEJPVU5EQVJZID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NCIKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQppbmRleCA0MDY0YWVmLi4wZDQ1OTRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQpAQCAtOSw3ICs5LDcgQEAKIAogIiIiIyIKIAotaW1wb3J0IHRlc3Quc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiBpbXBvcnQgY29kZWNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5CmluZGV4IDFmODg0ZTUuLjA0NTFmYjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWF0aC5weQpAQCAtNCw2ICs0LDggQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGNtYXRoLCBtYXRoCiBmcm9tIGNtYXRoIGltcG9ydCBwaGFzZSwgcG9sYXIsIHJlY3QsIHBpCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKIAogSU5GID0gZmxvYXQoJ2luZicpCkBAIC0xNTQsNiArMTU2LDIzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY21hdGguZSwgZV9leHBlY3RlZCwgcGxhY2VzPTksCiAgICAgICAgICAgICBtc2c9ImNtYXRoLmUgaXMge307IHNob3VsZCBiZSB7fSIuZm9ybWF0KGNtYXRoLmUsIGVfZXhwZWN0ZWQpKQogCisgICAgZGVmIHRlc3RfaW5maW5pdHlfYW5kX25hbl9jb25zdGFudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21hdGguaW5mLnJlYWwsIG1hdGguaW5mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtYXRoLmluZi5pbWFnLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21hdGguaW5mai5yZWFsLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21hdGguaW5mai5pbWFnLCBtYXRoLmluZikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihjbWF0aC5uYW4ucmVhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21hdGgubmFuLmltYWcsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWF0aC5uYW5qLnJlYWwsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oY21hdGgubmFuai5pbWFnKSkKKworICAgICAgICAjIENoZWNrIGNvbnNpc3RlbmN5IHdpdGggcmVwcnMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjbWF0aC5pbmYpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNtYXRoLmluZmopLCAiaW5maiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjbWF0aC5uYW4pLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNtYXRoLm5hbmopLCAibmFuaiIpCisKICAgICBkZWYgdGVzdF91c2VyX29iamVjdChzZWxmKToKICAgICAgICAgIyBUZXN0IGF1dG9tYXRpYyBjYWxsaW5nIG9mIF9fY29tcGxleF9fIGFuZCBfX2Zsb2F0X18gYnkgY21hdGgKICAgICAgICAgIyBmdW5jdGlvbnMKQEAgLTMxNSw2ICszMzQsMTggQEAKIAogICAgIEByZXF1aXJlc19JRUVFXzc1NAogICAgIGRlZiB0ZXN0X3NwZWNpZmljX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBTb21lIHRlc3RzIG5lZWQgdG8gYmUgc2tpcHBlZCBvbiBhbmNpZW50IE9TIFggdmVyc2lvbnMuCisgICAgICAgICMgU2VlIGlzc3VlICMyNzk1My4KKyAgICAgICAgU0tJUF9PTl9USUdFUiA9IHsndGFuMDA2NCd9CisKKyAgICAgICAgb3N4X3ZlcnNpb24gPSBOb25lCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHZlcnNpb25fdHh0ID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3N4X3ZlcnNpb24gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uX3R4dC5zcGxpdCgnLicpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKwogICAgICAgICBkZWYgcmVjdF9jb21wbGV4KHopOgogICAgICAgICAgICAgIiIiV3JhcHBlZCB2ZXJzaW9uIG9mIHJlY3QgdGhhdCBhY2NlcHRzIGEgY29tcGxleCBudW1iZXIgaW5zdGVhZCBvZgogICAgICAgICAgICAgdHdvIGZsb2F0IGFyZ3VtZW50cy4iIiIKQEAgLTMyOCw2ICszNTksMTIgQEAKICAgICAgICAgZm9yIGlkLCBmbiwgYXIsIGFpLCBlciwgZWksIGZsYWdzIGluIHBhcnNlX3Rlc3RmaWxlKHRlc3RfZmlsZSk6CiAgICAgICAgICAgICBhcmcgPSBjb21wbGV4KGFyLCBhaSkKICAgICAgICAgICAgIGV4cGVjdGVkID0gY29tcGxleChlciwgZWkpCisKKyAgICAgICAgICAgICMgU2tpcCBjZXJ0YWluIHRlc3RzIG9uIE9TIFggMTAuNC4KKyAgICAgICAgICAgIGlmIG9zeF92ZXJzaW9uIGlzIG5vdCBOb25lIGFuZCBvc3hfdmVyc2lvbiA8ICgxMCwgNSk6CisgICAgICAgICAgICAgICAgaWYgaWQgaW4gU0tJUF9PTl9USUdFUjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICAgICAgaWYgZm4gPT0gJ3JlY3QnOgogICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gcmVjdF9jb21wbGV4CiAgICAgICAgICAgICBlbGlmIGZuID09ICdwb2xhcic6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCAzZDJmNzY5Li44NzU3MWQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTM0OCw4ICszNDgsOSBAQAogICAgICAgICAgICAgdGVzdC5zdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKS5fX2VudGVyX18oKQogICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneCcpCiAgICAgICAgICAgICBvcy5jbG9zZShzeXMuc3Rkb3V0LmZpbGVubygpKSIiIgotICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctYycsIGNvZGUpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyMCwgcmMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoZXJyLmRlY29kZSgnYXNjaWknLCAnaWdub3JlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbiBpZ25vcmVkIGluLipcbk9TRXJyb3I6IC4qJykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQppbmRleCBiZWZlMGU0Li42ZTBiNjY5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQpAQCAtMTM4LDkgKzEzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndjAsIGV4cGVjdGVkX3BhdGgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3BhY2thZ2UsIGV4cGVjdGVkX2xvYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgotICAgICAgICBpZiBub3QgX19kZWJ1Z19fOgotICAgICAgICAgICAgY21kX2xpbmVfc3dpdGNoZXMgKz0gKCctJyArICdPJyAqIHN5cy5mbGFncy5vcHRpbWl6ZSwpCi0gICAgICAgIHJ1bl9hcmdzID0gY21kX2xpbmVfc3dpdGNoZXMgKyAoc2NyaXB0X25hbWUsKSArIHR1cGxlKGV4YW1wbGVfYXJncykKKyAgICAgICAgcnVuX2FyZ3MgPSBbKnN1cHBvcnQub3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICpjbWRfbGluZV9zd2l0Y2hlcywgc2NyaXB0X25hbWUsICpleGFtcGxlX2FyZ3NdCiAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soKnJ1bl9hcmdzLCBfX2lzb2xhdGVkPUZhbHNlKQogICAgICAgICBzZWxmLl9jaGVja19vdXRwdXQoc2NyaXB0X25hbWUsIHJjLCBvdXQgKyBlcnIsIGV4cGVjdGVkX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGF0aDAsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVfbW9kdWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlX21vZHVsZS5weQppbmRleCAzMzk0YjM5Li4xYThmNjk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVfbW9kdWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZV9tb2R1bGUucHkKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgIyB3aXRoIGJhbm5lcgogICAgICAgICBzZWxmLmluZnVuYy5zaWRlX2VmZmVjdCA9IEVPRkVycm9yKCdGaW5pc2hlZCcpCiAgICAgICAgIHNlbGYuY29uc29sZS5pbnRlcmFjdChiYW5uZXI9J0ZvbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxscyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxscyksIDMpCiAgICAgICAgIGJhbm5lcl9jYWxsID0gc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFubmVyX2NhbGwsIFsnd3JpdGUnLCAoJ0Zvb1xuJywpLCB7fV0pCiAKQEAgLTc3LDggKzc3LDM2IEBACiAgICAgICAgIHNlbGYuc3RkZXJyLnJlc2V0X21vY2soKQogICAgICAgICBzZWxmLmluZnVuYy5zaWRlX2VmZmVjdCA9IEVPRkVycm9yKCdGaW5pc2hlZCcpCiAgICAgICAgIHNlbGYuY29uc29sZS5pbnRlcmFjdChiYW5uZXI9JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxscyksIDIpCisKKyAgICBkZWYgdGVzdF9leGl0X21zZyhzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0IGV4aXQgbWVzc2FnZQorICAgICAgICBzZWxmLmluZnVuYy5zaWRlX2VmZmVjdCA9IEVPRkVycm9yKCdGaW5pc2hlZCcpCisgICAgICAgIHNlbGYuY29uc29sZS5pbnRlcmFjdChiYW5uZXI9JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxscyksIDIpCisgICAgICAgIGVycl9tc2cgPSBzZWxmLnN0ZGVyci5tZXRob2RfY2FsbHNbMV0KKyAgICAgICAgZXhwZWN0ZWQgPSAnbm93IGV4aXRpbmcgSW50ZXJhY3RpdmVDb25zb2xlLi4uXG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyX21zZywgWyd3cml0ZScsIChleHBlY3RlZCwpLCB7fV0pCisKKyAgICAgICAgIyBubyBleGl0IG1lc3NhZ2UKKyAgICAgICAgc2VsZi5zdGRlcnIucmVzZXRfbW9jaygpCisgICAgICAgIHNlbGYuaW5mdW5jLnNpZGVfZWZmZWN0ID0gRU9GRXJyb3IoJ0ZpbmlzaGVkJykKKyAgICAgICAgc2VsZi5jb25zb2xlLmludGVyYWN0KGJhbm5lcj0nJywgZXhpdG1zZz0nJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zdGRlcnIubWV0aG9kX2NhbGxzKSwgMSkKIAorICAgICAgICAjIGN1c3RvbSBleGl0IG1lc3NhZ2UKKyAgICAgICAgc2VsZi5zdGRlcnIucmVzZXRfbW9jaygpCisgICAgICAgIG1lc3NhZ2UgPSAoCisgICAgICAgICAgICAnYnllISBcTntHUkVFSyBTTUFMTCBMRVRURVIgWkVUQX1cTntDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFfScKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5pbmZ1bmMuc2lkZV9lZmZlY3QgPSBFT0ZFcnJvcignRmluaXNoZWQnKQorICAgICAgICBzZWxmLmNvbnNvbGUuaW50ZXJhY3QoYmFubmVyPScnLCBleGl0bXNnPW1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc3RkZXJyLm1ldGhvZF9jYWxscyksIDIpCisgICAgICAgIGVycl9tc2cgPSBzZWxmLnN0ZGVyci5tZXRob2RfY2FsbHNbMV0KKyAgICAgICAgZXhwZWN0ZWQgPSBtZXNzYWdlICsgJ1xuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycl9tc2csIFsnd3JpdGUnLCAoZXhwZWN0ZWQsKSwge31dKQorCisKICAgICBkZWYgdGVzdF9jYXVzZV90YihzZWxmKToKICAgICAgICAgc2VsZi5pbmZ1bmMuc2lkZV9lZmZlY3QgPSBbInJhaXNlIFZhbHVlRXJyb3IoJycpIGZyb20gQXR0cmlidXRlRXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU9GRXJyb3IoJ0ZpbmlzaGVkJyldCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQppbmRleCBlZTFlMjhhLi5jOGNkYWNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKQEAgLTQsNyArNCw2IEBACiBpbXBvcnQgdGVzdC5zdXBwb3J0CiBpbXBvcnQgdW5pY29kZWRhdGEKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCiAKIGNsYXNzIFBvc1JldHVybjoKICAgICAjIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGNvbmZpZ3VyYWJsZSBjYWxsYmFja3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CmluZGV4IGQwZTNhMTUuLjNiZGY3ZDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUFJDIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQppbmRleCBiYjliZTExLi5jNWUyZjk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIEhvbmdLb25nIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKaW5kZXggOGEzY2E3MC4uMDBlYTFjMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weQpAQCAtMSw2ICsxLDUgQEAKICMgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIElTTyAyMDIyIGVuY29kaW5ncy4KIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQppbmRleCA0NGI2M2EwLi45NDM3OGQxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQppbmRleCBiNmE3NGZiLi44NjNkMTZiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPSyBlbmNvZGluZ3MuCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKaW5kZXggOTE3NDI5Ni4uYmIxZDEzMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBST0MgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkKaW5kZXggZjFiZDM4NC4uODllNTFjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUFJDIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkKaW5kZXggNGMwYzQxNS4uN2E0OGQyNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQppbmRleCA1NzczODIzLi5mZGZlYzgwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBKYXBhbmVzZSBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5CmluZGV4IDZjYjQxYzguLjQ3MWNkNzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIFJPSyBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5CmluZGV4IDJlYTQ0YjUuLjE0NWE5N2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDA0Nzk1NDIuLmQ4NzUzNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC00LDcgKzQsNiBAQAogaW1wb3J0IGxvY2FsZQogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCBlbmNvZGluZ3MKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yNyw2ICsyNiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKICAgICByZXR1cm4gY2hlY2sKIAorCiBjbGFzcyBRdWV1ZShvYmplY3QpOgogICAgICIiIgogICAgIHF1ZXVlOiB3cml0ZSBieXRlcyBhdCBvbmUgZW5kLCByZWFkIGJ5dGVzIGZyb20gdGhlIG90aGVyIGVuZApAQCAtNDcsNiArNDcsNyBAQAogICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gc2VsZi5fYnVmZmVyW3NpemU6XQogICAgICAgICAgICAgcmV0dXJuIHMKIAorCiBjbGFzcyBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZzoKICAgICBkZWYgY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKHNlbGYsIGVuY29kaW5nLCB1LCBzKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgpAQCAtODAsNiArODEsNyBAQAogICAgICAgICAgICAgcGFydDIgPSBkLmVuY29kZSh1W2k6XSwgVHJ1ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGFydDErcGFydDIpCiAKKwogY2xhc3MgUmVhZFRlc3QoTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiBjaGVja19wYXJ0aWFsKHNlbGYsIGlucHV0LCBwYXJ0aWFscmVzdWx0cyk6CiAgICAgICAgICMgZ2V0IGEgU3RyZWFtUmVhZGVyIGZvciB0aGUgZW5jb2RpbmcgYW5kIGZlZWQgdGhlIGJ5dGVzdHJpbmcgdmVyc2lvbgpAQCAtMzU4LDYgKzM2MCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIls/XSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQogCisgICAgICAgICMgc2VxdWVudGlhbCBzdXJyb2dhdGUgY2hhcmFjdGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJpZ25vcmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1RDgwMFx1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbPz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisKICAgICAgICAgYm9tID0gIiIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIGZvciBiZWZvcmUsIGFmdGVyIGluIFsoIlxVMDAwMTBmZmYiLCAiQSIpLCAoIlsiLCAiXSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJBIiwgIlxVMDAwMTBmZmYiKV06CkBAIC0zODMsNiArMzkxLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9zZXF1ZW5jZS5kZWNvZGUoc2VsZi5lbmNvZGluZywgImJhY2tzbGFzaHJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlICsgYmFja3NsYXNocmVwbGFjZSArIGFmdGVyKQogCisKIGNsYXNzIFVURjMyVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMiIKICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgpAQCAtNDc4LDYgKzQ4Nyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2JlKVswXSkKIAorCiBjbGFzcyBVVEYzMkxFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1sZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDgwXHhkY1x4MDBceDAwIgpAQCAtNTIzLDYgKzUzMyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2xlX2RlY29kZShlbmNvZGVkKVswXSkKIAorCiBjbGFzcyBVVEYzMkJFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1iZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDAwXHgwMFx4ZGNceDgwIgpAQCAtNzQ3LDYgKzc1OCw3IEBACiAgICAgZW5jb2RpbmcgPSAidXRmLTgiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZSA9IGIiXHhlZFx4YjJceDgwIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2VfcmVwbGFjZSA9ICJcdWZmZmQiICogMworICAgIEJPTSA9IGInJwogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKApAQCAtNzc1LDI3ICs3ODcsNDkgQEAKICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZi5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSwgdS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZShzZWxmLmVuY29kaW5nLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCiAgICAgZGVmIHRlc3RfbG9uZV9zdXJyb2dhdGVzKHNlbGYpOgogICAgICAgICBzdXBlcigpLnRlc3RfbG9uZV9zdXJyb2dhdGVzKCkKICAgICAgICAgIyBub3Qgc3VyZSBpZiB0aGlzIGlzIG1ha2luZyBzZW5zZSBmb3IKICAgICAgICAgIyBVVEYtMTYgYW5kIFVURi0zMgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKCd1dGYtOCcsICJzdXJyb2dhdGVlc2NhcGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ1tceDgwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYidbXHg4MF0nKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICJbXHVEQzgwXHVEODAwXHVERkZGXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQorICAgICAgICBleGMgPSBjbS5leGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSwgJ1x1RDgwMFx1REZGRicpCiAKICAgICBkZWYgdGVzdF9zdXJyb2dhdGVwYXNzX2hhbmRsZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImFiY1x1ZDgwMGRlZiIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiYWJjXHhlZFx4YTBceDgwZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceGVkXHhhMFx4ODBceGVkXHhiMlx4ODBdJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjXHVkODAwZGVmIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlxVMDAwMTBmZmZcdUQ4MDAiKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlY3MubG9va3VwX2Vycm9yKCJzdXJyb2dhdGVwYXNzIikpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpCisgICAgICAgICAgICBiImFiY1x4ZWRceGEwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBiImFiY1x4ZWRceGEweiIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAogICAgICAgICAgICAgICAgICAgICAgJ2NwNjUwMDEgaXMgYSBXaW5kb3dzLW9ubHkgY29kZWMnKQpAQCAtMTA1OSw2ICsxMDkzLDcgQEAKIAogY2xhc3MgVVRGOFNpZ1Rlc3QoVVRGOFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBlbmNvZGluZyA9ICJ1dGYtOC1zaWciCisgICAgQk9NID0gY29kZWNzLkJPTV9VVEY4CiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCkBAIC0xMTk0LDYgKzEyMjksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJpZ25vcmUiKSwgKGIiW10iLCA4KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4MF1ceDAiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgOCkpCiAKKwogY2xhc3MgUmVjb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZWNvZGluZyhzZWxmKToKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTMxMyw2ICsxMzQ5LDcgQEAKICAgICBpZiBsZW4oaSkhPTI6CiAgICAgICAgIHByaW50KHJlcHIoaSkpCiAKKwogY2xhc3MgUHVueWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CiAgICAgICAgIGZvciB1bmksIHB1bnkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgpAQCAtMTMzMiw2ICsxMzY5LDcgQEAKICAgICAgICAgICAgIHB1bnkgPSBwdW55LmRlY29kZSgiYXNjaWkiKS5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pLCBwdW55LmRlY29kZSgicHVueWNvZGUiKSkKIAorCiBjbGFzcyBVbmljb2RlSW50ZXJuYWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhTSVpFT0ZfV0NIQVJfVCA9PSA0LCAnc3BlY2lmaWMgdG8gMzItYml0IHdjaGFyX3QnKQogICAgIGRlZiB0ZXN0X2J1ZzEyNTEzMDAoc2VsZik6CkBAIC0xNTg2LDYgKzE2MjQsNyBAQAogICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKIAorCiBjbGFzcyBJRE5BQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9idWlsdGluX2RlY29kZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYiJweXRob24ub3JnIiwgImlkbmEiKSwgInB5dGhvbi5vcmciKQpAQCAtMTY3Miw2ICsxNzExLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICBiInB5dGhvbi5vcmciLmRlY29kZSwgImlkbmEiLCBlcnJvcnMpCiAKKwogY2xhc3MgQ29kZWNzTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CkBAIC0xNzgwLDYgKzE4MjAsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLAogICAgICAgICAgICAgICAgIGNvZGVjcy5kZWNvZGUsIGInYWJjJywgJ3VuZGVmaW5lZCcsIGVycm9ycykKIAorCiBjbGFzcyBTdHJlYW1SZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE3OTAsNiArMTgzMSw3IEBACiAgICAgICAgIGYgPSBzZWxmLnJlYWRlcihzZWxmLnN0cmVhbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbJ1x1ZDU1Y1xuJywgJ1x1YWUwMCddKQogCisKIGNsYXNzIEVuY29kZWRGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTE5MjAsNiArMTk2Miw3IEBACiAgICAgInVuaWNvZGVfaW50ZXJuYWwiCiBdCiAKKwogY2xhc3MgQmFzaWNVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKICAgICAgICAgcyA9ICJhYmMxMjMiICAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCkBAIC0yMDgyLDYgKzIxMjUsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKGVuY29kaW5nLCB1LCB1LmVuY29kZShlbmNvZGluZykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19lbmNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKIAorCiBjbGFzcyBDaGFybWFwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3dpdGhfc3RyaW5nX21hcChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTIzMzIsNiArMjM3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXdyaXRlciwgJ3N0cmljdCcpIGFzIHNydzoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3J3LnJlYWQoKSwgIlx4ZmMiKQogCisKIGNsYXNzIFR5cGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgTW9zdCBkZWNvZGVycyBkb24ndCBhY2NlcHQgdW5pY29kZSBpbnB1dApAQCAtMjYyMiw2ICsyNjY3LDcgQEAKICAgICBieXRlc190cmFuc2Zvcm1fZW5jb2RpbmdzLmFwcGVuZCgiYnoyX2NvZGVjIikKICAgICB0cmFuc2Zvcm1fYWxpYXNlc1siYnoyX2NvZGVjIl0gPSBbImJ6MiJdCiAKKwogY2xhc3MgVHJhbnNmb3JtQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKQEAgLTMwOTksNSArMzE0NSw4MSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsICgnYWJjJywgMykpCiAKIAorY2xhc3MgQVNDSUlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYzEyMycuZW5jb2RlKCdhc2NpaScpLCBiJ2FiYzEyMycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAnaWdub3JlJywgYidbXScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNdJywgJ3JlcGxhY2UnLCBiJ1s/Pz9dJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzEyODsmIzI1NTsmIzgzNjQ7XScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNcVTAwMGFiY2RlXScsICdiYWNrc2xhc2hyZXBsYWNlJywKKyAgICAgICAgICAgICBiJ1tcXHg4MFxceGZmXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHVkYzgwXHVkY2ZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCBiJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHhmZicuZW5jb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJy5kZWNvZGUoJ2FzY2lpJyksICdhYmMnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdpZ25vcmUnLCAnW10nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAncmVwbGFjZScsICdbXHVmZmZkXHVmZmZkXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCAnW1x1ZGM4MFx1ZGNmZl0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnYmFja3NsYXNocmVwbGFjZScsICdbXFx4ODBcXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworCitjbGFzcyBMYXRpbjFUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ2FiYycsIGInYWJjJyksCisgICAgICAgICAgICAoJ1x4ODBceGU5XHhmZicsIGInXHg4MFx4ZTlceGZmJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ3JlcGxhY2UnLCBiJ1s/P10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xcdTIwYWNcXFUwMDBhYmNkZV0nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzgzNjQ7JiM1NjQ0ODtdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnbGF0aW4xJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHUyMGFjJy5lbmNvZGUoJ2xhdGluMScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInYWJjJywgJ2FiYycpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZW9wLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKaW5kZXggNTA5YmY1ZC4uOThkYTI2ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkKQEAgLTI4Miw3ICsyODIsNiBAQAogICAgICAgICBhaSgiaWYgKGEgPT0gMSBhbmQgYiA9IDIpOiBwYXNzIikKIAogICAgICAgICBhaSgiZGVsIDEiKQotICAgICAgICBhaSgiZGVsICgpIikKICAgICAgICAgYWkoImRlbCAoMSwpIikKICAgICAgICAgYWkoImRlbCBbMV0iKQogICAgICAgICBhaSgiZGVsICcxJyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQppbmRleCA1MjM4MzgyLi5mMWZiMDExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKQEAgLTIwLDEwICsyMCwxMCBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQXdhaXRhYmxlLCBDb3JvdXRpbmUsIEFzeW5jSXRlcmF0b3IsIEFzeW5jSXRlcmFibGUKLWZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBHZW5lcmF0b3IKLWZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZQorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvciwgUmV2ZXJzaWJsZQorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlLCBDb2xsZWN0aW9uCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgU2V0LCBNdXRhYmxlU2V0Ci1mcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIEtleXNWaWV3LCBJdGVtc1ZpZXcKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgS2V5c1ZpZXcsIEl0ZW1zVmlldywgVmFsdWVzVmlldwogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNlcXVlbmNlLCBNdXRhYmxlU2VxdWVuY2UKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBCeXRlU3RyaW5nCiAKQEAgLTQxMiw2ICs0MTIsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOVENvbG9yLl9maWVsZHMsICgncmVkJywgJ2dyZWVuJywgJ2JsdWUnKSkKICAgICAgICAgZ2xvYmFscygpLnBvcCgnTlRDb2xvcicsIE5vbmUpICAgICAgICAgICMgY2xlYW4tdXAgYWZ0ZXIgdGhpcyB0ZXN0CiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX29ubHlfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTYyOAorICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgdGVtcGxhdGU6CisgICAgICAgICAgICBOVCA9IG5hbWVkdHVwbGUoJ05UJywgWyd4JywgJ3knXSwgdmVyYm9zZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEluKCdjbGFzcyBOVCcsIE5ULl9zb3VyY2UpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIE5UID0gbmFtZWR0dXBsZSgnTlQnLCBbJ3gnLCAneSddLCBUcnVlKQorCisgICAgICAgIE5UID0gbmFtZWR0dXBsZSgnTlQnLCBbJ2FiYycsICdkZWYnXSwgcmVuYW1lPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlQuX2ZpZWxkcywgKCdhYmMnLCAnXzEnKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgTlQgPSBuYW1lZHR1cGxlKCdOVCcsIFsnYWJjJywgJ2RlZiddLCBGYWxzZSwgVHJ1ZSkKIAogICAgIGRlZiB0ZXN0X25hbWVkdHVwbGVfc3ViY2xhc3NfaXNzdWVfMjQ5MzEoc2VsZik6CiAgICAgICAgIGNsYXNzIFBvaW50KG5hbWVkdHVwbGUoJ19Qb2ludCcsIFsneCcsICd5J10pKToKQEAgLTQ4Nyw2ICs0OTksOSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG90aGVyLnJpZ2h0X3NpZGUsJ1JpZ2h0IHNpZGUgbm90IGNhbGxlZCBmb3IgJXMuJXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodHlwZShpbnN0YW5jZSksIG5hbWUpKQogCitkZWYgX3Rlc3RfZ2VuKCk6CisgICAgeWllbGQKKwogY2xhc3MgVGVzdE9uZVRyaWNrUG9ueUFCQ3MoQUJDVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfQXdhaXRhYmxlKHNlbGYpOgpAQCAtNjc0LDcgKzY4OSw3IEBACiAgICAgICAgIHNhbXBsZXMgPSBbYnl0ZXMoKSwgc3RyKCksCiAgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKICAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwgZGljdCgpLnZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKQEAgLTY4OCw2ICs3MDMsMTYxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzdHIsIEkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoSXRlcmFibGUsICdfX2l0ZXJfXycpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShJdGVyYWJsZSwgJ19faXRlcl9fJykKKyAgICAgICAgIyBDaGVjayBOb25lIGJsb2NraW5nCisgICAgICAgIGNsYXNzIEl0OgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgY2xhc3MgSXRCbG9ja2VkKEl0KToKKyAgICAgICAgICAgIF9faXRlcl9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhJdCwgSXRlcmFibGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShJdCgpLCBJdGVyYWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhJdEJsb2NrZWQsIEl0ZXJhYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKEl0QmxvY2tlZCgpLCBJdGVyYWJsZSkpCisKKyAgICBkZWYgdGVzdF9SZXZlcnNpYmxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLXJldmVyc2libGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgZGljdCgpLCBzZXQoKSwgZnJvemVuc2V0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSBub24tcmV2ZXJzaWJsZSBpdGVyYWJsZXMKKyAgICAgICAgbm9uX3JldmVyc2libGVzID0gW2RpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyKCksIENvdW50ZXIoKS5rZXlzKCksIENvdW50ZXIoKS5pdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcigpLnZhbHVlcygpLCBfdGVzdF9nZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwgaXRlcihbXSksIHJldmVyc2VkKFtdKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX3JldmVyc2libGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSByZXZlcnNpYmxlIGl0ZXJhYmxlcworICAgICAgICBzYW1wbGVzID0gW2J5dGVzKCksIHN0cigpLCB0dXBsZSgpLCBsaXN0KCksIE9yZGVyZWREaWN0KCksCisgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QoKS5rZXlzKCksIE9yZGVyZWREaWN0KCkuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdCgpLnZhbHVlcygpXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBSZXZlcnNpYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBhbHNvIE1hcHBpbmcsIE11dGFibGVNYXBwaW5nLCBhbmQgU2VxdWVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoU2VxdWVuY2UsIFJldmVyc2libGUpLCByZXByKFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKE1hcHBpbmcsIFJldmVyc2libGUpLCByZXByKE1hcHBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoTXV0YWJsZU1hcHBpbmcsIFJldmVyc2libGUpLCByZXByKE11dGFibGVNYXBwaW5nKSkKKyAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKKyAgICAgICAgY2xhc3MgUihSZXZlcnNpYmxlKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKGxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKFIoKSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBSKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKFJldmVyc2libGUsICdfX3JldmVyc2VkX18nLCAnX19pdGVyX18nKQorICAgICAgICAjIENoZWNrIHJldmVyc2libGUgbm9uLWl0ZXJhYmxlICh3aGljaCBpcyBub3QgUmV2ZXJzaWJsZSkKKyAgICAgICAgY2xhc3MgUmV2Tm9JdGVyOgorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKTogcmV0dXJuIHJldmVyc2VkKFtdKQorICAgICAgICBjbGFzcyBSZXZQbHVzSXRlcihSZXZOb0l0ZXIpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFJldk5vSXRlciwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShSZXZOb0l0ZXIoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFJldlBsdXNJdGVyLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoUmV2UGx1c0l0ZXIoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgICMgQ2hlY2sgTm9uZSBibG9ja2luZworICAgICAgICBjbGFzcyBSZXY6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKTogcmV0dXJuIHJldmVyc2VkKFtdKQorICAgICAgICBjbGFzcyBSZXZJdEJsb2NrZWQoUmV2KToKKyAgICAgICAgICAgIF9faXRlcl9fID0gTm9uZQorICAgICAgICBjbGFzcyBSZXZSZXZCbG9ja2VkKFJldik6CisgICAgICAgICAgICBfX3JldmVyc2VkX18gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFJldiwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKFJldigpLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFJldkl0QmxvY2tlZCwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShSZXZJdEJsb2NrZWQoKSwgUmV2ZXJzaWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhSZXZSZXZCbG9ja2VkLCBSZXZlcnNpYmxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKFJldlJldkJsb2NrZWQoKSwgUmV2ZXJzaWJsZSkpCisKKyAgICBkZWYgdGVzdF9Db2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLWNvbGxlY3Rpb25zCisgICAgICAgIG5vbl9jb2xsZWN0aW9ucyA9IFtOb25lLCA0MiwgMy4xNCwgMWosIGxhbWJkYSB4OiAyKnhdCisgICAgICAgIGZvciB4IGluIG5vbl9jb2xsZWN0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh4LCBDb2xsZWN0aW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbGxlY3Rpb24pLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLWNvbGxlY3Rpb24gaXRlcmFibGVzCisgICAgICAgIG5vbl9jb2xfaXRlcmFibGVzID0gW190ZXN0X2dlbigpLCBpdGVyKGInJyksIGl0ZXIoYnl0ZWFycmF5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksIGRpY3QoKS52YWx1ZXMoKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX2NvbF9pdGVyYWJsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBDb2xsZWN0aW9uKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBzb21lIGNvbGxlY3Rpb25zCisgICAgICAgIHNhbXBsZXMgPSBbc2V0KCksIGZyb3plbnNldCgpLCBkaWN0KCksIGJ5dGVzKCksIHN0cigpLCB0dXBsZSgpLAorICAgICAgICAgICAgICAgICAgIGxpc3QoKSwgZGljdCgpLmtleXMoKSwgZGljdCgpLml0ZW1zKCldCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbGxlY3Rpb24pLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIGFsc28gTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIGV0Yy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoU2VxdWVuY2UsIENvbGxlY3Rpb24pLCByZXByKFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTWFwcGluZywgQ29sbGVjdGlvbiksIHJlcHIoTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE11dGFibGVNYXBwaW5nLCBDb2xsZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoTXV0YWJsZU1hcHBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTZXQsIENvbGxlY3Rpb24pLCByZXByKFNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE11dGFibGVTZXQsIENvbGxlY3Rpb24pLCByZXByKE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTZXF1ZW5jZSwgQ29sbGVjdGlvbiksIHJlcHIoTXV0YWJsZVNldCkpCisgICAgICAgICMgQ2hlY2sgZGlyZWN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIENvbChDb2xsZWN0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgRGVyQ29sKENvbCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0ZXIoQ29sKCkpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhsaXN0LCBDb2wpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3Moc2V0LCBDb2wpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoZmxvYXQsIENvbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdGVyKERlckNvbCgpKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MobGlzdCwgRGVyQ29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHNldCwgRGVyQ29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBEZXJDb2wpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoQ29sbGVjdGlvbiwgJ19fbGVuX18nLCAnX19pdGVyX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fY29udGFpbnNfXycpCisgICAgICAgICMgQ2hlY2sgc2l6ZWQgY29udGFpbmVyIG5vbi1pdGVyYWJsZSAod2hpY2ggaXMgbm90IENvbGxlY3Rpb24pIGV0Yy4KKyAgICAgICAgY2xhc3MgQ29sTm9JdGVyOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOiByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgQ29sTm9TaXplOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6IHJldHVybiBGYWxzZQorICAgICAgICBjbGFzcyBDb2xOb0NvbnQ6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDb2xOb0l0ZXIsIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoQ29sTm9JdGVyKCksIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQ29sTm9TaXplLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKENvbE5vU2l6ZSgpLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKENvbE5vQ29udCwgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShDb2xOb0NvbnQoKSwgQ29sbGVjdGlvbikpCisgICAgICAgICMgQ2hlY2sgTm9uZSBibG9ja2luZworICAgICAgICBjbGFzcyBTaXplQmxvY2s6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKFtdKQorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmKTogcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBfX2xlbl9fID0gTm9uZQorICAgICAgICBjbGFzcyBJdGVyQmxvY2s6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZik6IHJldHVybiBUcnVlCisgICAgICAgICAgICBfX2l0ZXJfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKFNpemVCbG9jaywgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShTaXplQmxvY2soKSwgQ29sbGVjdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhJdGVyQmxvY2ssIENvbGxlY3Rpb24pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoSXRlckJsb2NrKCksIENvbGxlY3Rpb24pKQorICAgICAgICAjIENoZWNrIE5vbmUgYmxvY2tpbmcgaW4gc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgQ29sSW1wbDoKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgY2xhc3MgTm9uQ29sKENvbEltcGwpOgorICAgICAgICAgICAgX19jb250YWluc19fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoTm9uQ29sLCBDb2xsZWN0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKE5vbkNvbCgpLCBDb2xsZWN0aW9uKSkKKwogCiAgICAgZGVmIHRlc3RfSXRlcmF0b3Ioc2VsZik6CiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgYiIiLCAiIiwgKCksIFtdLCB7fSwgc2V0KCldCkBAIC02OTksNyArODY5LDcgQEAKICAgICAgICAgICAgICAgICAgICBpdGVyKHNldCgpKSwgaXRlcihmcm96ZW5zZXQoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkua2V5cygpKSwgaXRlcihkaWN0KCkuaXRlbXMoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkudmFsdWVzKCkpLAotICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKQEAgLTc4Nyw3ICs5NTcsNyBAQAogCiAgICAgZGVmIHRlc3RfU2l6ZWQoc2VsZik6CiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTgwNSw3ICs5NzUsNyBAQAogCiAgICAgZGVmIHRlc3RfQ29udGFpbmVyKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosCi0gICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgICAgIF90ZXN0X2dlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CkBAIC04MjQsNyArOTk0LDcgQEAKICAgICBkZWYgdGVzdF9DYWxsYWJsZShzZWxmKToKICAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLAogICAgICAgICAgICAgICAgICAgICAgICAiIiwgYiIiLCAoKSwgW10sIHt9LCBzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RfZ2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTg0MiwxNCArMTAxMiwxNCBAQAogICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoQ2FsbGFibGUsICdfX2NhbGxfXycpCiAKICAgICBkZWYgdGVzdF9kaXJlY3Rfc3ViY2xhc3Npbmcoc2VsZik6Ci0gICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgorICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBSZXZlcnNpYmxlLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKICAgICAgICAgICAgIGNsYXNzIEMoQik6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKLSAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFJldmVyc2libGUsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgogICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgICMgTWFrZSBzdXJlIGl0IGlzbid0IGhhc2hhYmxlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCKSwgQi5fX25hbWVfXykKQEAgLTEwNDksNiArMTIxOSwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5jcyA+IGNzKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobmNzID49IGNzKQogCisgICAgZGVmIHRlc3RfaXNzdWUyNjkxNShzZWxmKToKKyAgICAgICAgIyBDb250YWluZXIgbWVtYmVyc2hpcCB0ZXN0IHNob3VsZCBjaGVjayBpZGVudGl0eSBmaXJzdAorICAgICAgICBjbGFzcyBDdXN0b21FcXVhbE9iamVjdDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBjbGFzcyBDdXN0b21TZXF1ZW5jZShsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZS5fX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpCisKKyAgICAgICAgbmFuID0gZmxvYXQoJ25hbicpCisgICAgICAgIG9iaiA9IEN1c3RvbUVxdWFsT2JqZWN0KCkKKyAgICAgICAgY29udGFpbmVycyA9IFsKKyAgICAgICAgICAgIEN1c3RvbVNlcXVlbmNlKFtuYW4sIG9ial0pLAorICAgICAgICAgICAgSXRlbXNWaWV3KHsxOiBuYW4sIDI6IG9ian0pLAorICAgICAgICAgICAgVmFsdWVzVmlldyh7MTogbmFuLCAyOiBvYmp9KQorICAgICAgICBdCisgICAgICAgIGZvciBjb250YWluZXIgaW4gY29udGFpbmVyczoKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGNvbnRhaW5lcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGNvbnRhaW5lcikKKwogICAgIGRlZiBhc3NlcnRTYW1lU2V0KHNlbGYsIHMxLCBzMik6CiAgICAgICAgICMgY29lcmNlIGJvdGggdG8gYSByZWFsIHNldCB0aGVuIGNoZWNrIGVxdWFsaXR5CiAgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoc2V0KHMxKSwgc2V0KHMyKSkKQEAgLTEyMTksNiArMTQwOSw3IEBACiAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfY29tcGFyaXNvbihNeU1hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgTXlNYXBwaW5nKCkpCiAKICAgICBkZWYgdGVzdF9NdXRhYmxlTWFwcGluZyhzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggODI0ZTg0My4uOTYzOGU2OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtNDczLDEwICs0NzMsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MTogMiwgMzogNH0pCiAKICAgICBkZWYgdGVzdF9jb21waWxlX2ZpbGVuYW1lKHNlbGYpOgotICAgICAgICBmb3IgZmlsZW5hbWUgaW4gKCdmaWxlLnB5JywgYidmaWxlLnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlYXJyYXkoYidmaWxlLnB5JyksIG1lbW9yeXZpZXcoYidmaWxlLnB5JykpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gJ2ZpbGUucHknLCBiJ2ZpbGUucHknOgogICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoJ3Bhc3MnLCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLmNvX2ZpbGVuYW1lLCAnZmlsZS5weScpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBieXRlYXJyYXkoYidmaWxlLnB5JyksIG1lbW9yeXZpZXcoYidmaWxlLnB5Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZSgncGFzcycsIGZpbGVuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICdmaWxlLnB5JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCAncGFzcycsIGxpc3QoYidmaWxlLnB5JyksICdleGVjJykKIAogICAgIEBzdXBwb3J0LmNweXRob25fb25seQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CmluZGV4IDJjZThhNjEuLjliNDI0YTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKQEAgLTEsNiArMSw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgY29tcGlsZWFsbAogaW1wb3J0IGltcG9ydGxpYi51dGlsCitpbXBvcnQgdGVzdC50ZXN0X2ltcG9ydGxpYi51dGlsCiBpbXBvcnQgb3MKIGltcG9ydCBwYXRobGliCiBpbXBvcnQgcHlfY29tcGlsZQpAQCAtNDAsNiArNDEsMTEgQEAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXJlY3RvcnkpCiAKKyAgICBkZWYgYWRkX2JhZF9zb3VyY2VfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5iYWRfc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdF9iYWQucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iYWRfc291cmNlX3BhdGgsICd3JykgYXMgZmlsZToKKyAgICAgICAgICAgIGZpbGUud3JpdGUoJ3ggKFxuJykKKwogICAgIGRlZiBkYXRhKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgogICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCg4KQpAQCAtNzgsMTUgKzg0LDQzIEBACiAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLnNvdXJjZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKICAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQ9VHJ1ZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgyKQorICAgICAgICAjIFRlc3QgYWdhaW5zdCBiYWQgZmlsZXMKKyAgICAgICAgc2VsZi5hZGRfYmFkX3NvdXJjZV9maWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLmJhZF9zb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD0yKSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfcGF0aChzZWxmKToKKyAgICAgICAgIyBFeGNsdWRlIExpYi90ZXN0LyB3aGljaCBjb250YWlucyBpbnZhbGlkIFB5dGhvbiBmaWxlcyBsaWtlCisgICAgICAgICMgTGliL3Rlc3QvYmFkc3ludGF4X3BlcDMxMjAucHkKKyAgICAgICAgdGVzdGRpciA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKyAgICAgICAgaWYgdGVzdGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXRhdHRyLCBzeXMsICdwYXRoJywgc3lzLnBhdGgpCisKKyAgICAgICAgICAgIHN5cy5wYXRoID0gbGlzdChzeXMucGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUodGVzdGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX3BhdGgocXVpZXQ9MikpCisKKyAgICAgICAgd2l0aCB0ZXN0LnRlc3RfaW1wb3J0bGliLnV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W3NlbGYuZGlyZWN0b3J5XSk6CisgICAgICAgICAgICBzZWxmLmFkZF9iYWRfc291cmNlX2ZpbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgcXVpZXQ9MikpCiAKICAgICBkZWYgdGVzdF9ub19weWNhY2hlX2luX25vbl9wYWNrYWdlKHNlbGYpOgogICAgICAgICAjIEJ1ZyA4NTYzIHJlcG9ydGVkIHRoYXQgX19weWNhY2hlX18gZGlyZWN0b3JpZXMgZ290IGNyZWF0ZWQgYnkKQEAgLTE5NywxMCArMjMxLDkgQEAKICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdub3QgYWxsIGVudHJpZXMgb24gc3lzLnBhdGggYXJlIHdyaXRhYmxlJykKIAogICAgIGRlZiBfZ2V0X3J1bl9hcmdzKHNlbGYsIGFyZ3MpOgotICAgICAgICBpbnRlcnBfYXJncyA9IFsnLVMnXQotICAgICAgICBpZiBzeXMuZmxhZ3Mub3B0aW1pemU6Ci0gICAgICAgICAgICBpbnRlcnBfYXJncy5hcHBlbmQoezEgOiAnLU8nLCAyIDogJy1PTyd9W3N5cy5mbGFncy5vcHRpbWl6ZV0pCi0gICAgICAgIHJldHVybiBpbnRlcnBfYXJncyArIFsnLW0nLCAnY29tcGlsZWFsbCddICsgbGlzdChhcmdzKQorICAgICAgICByZXR1cm4gWypzdXBwb3J0Lm9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpLAorICAgICAgICAgICAgICAgICctUycsICctbScsICdjb21waWxlYWxsJywKKyAgICAgICAgICAgICAgICAqYXJnc10KIAogICAgIGRlZiBhc3NlcnRSdW5PSyhzZWxmLCAqYXJncywgKiplbnZfdmFycyk6CiAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vaygKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29uY3VycmVudF9mdXR1cmVzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb25jdXJyZW50X2Z1dHVyZXMucHkKaW5kZXggY2RiOTMwOC4uMjNlOTViMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb25jdXJyZW50X2Z1dHVyZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb25jdXJyZW50X2Z1dHVyZXMucHkKQEAgLTQsNyArNCw3IEBACiB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnX211bHRpcHJvY2Vzc2luZycpCiAjIFNraXAgdGVzdHMgaWYgc2VtX29wZW4gaW1wbGVtZW50YXRpb24gaXMgYnJva2VuLgogdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ211bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZScpCi0jIGltcG9ydCB0aHJlYWRpbmcgYWZ0ZXIgX211bHRpcHJvY2Vzc2luZyB0byByYWlzZSBhIG1vcmUgcmV2ZWxhbnQgZXJyb3IKKyMgaW1wb3J0IHRocmVhZGluZyBhZnRlciBfbXVsdGlwcm9jZXNzaW5nIHRvIHJhaXNlIGEgbW9yZSByZWxldmFudCBlcnJvcgogIyBtZXNzYWdlOiAiTm8gbW9kdWxlIG5hbWVkIF9tdWx0aXByb2Nlc3NpbmciLiBfbXVsdGlwcm9jZXNzaW5nIGlzIG5vdCBjb21waWxlZAogIyB3aXRob3V0IHRocmVhZCBzdXBwb3J0LgogdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCkBAIC0xNTQsNiArMTU0LDMwIEBACiAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CiAgICAgICAgICAgICB0LmpvaW4oKQogCisgICAgZGVmIHRlc3RfdGhyZWFkX25hbWVzX2Fzc2lnbmVkKHNlbGYpOgorICAgICAgICBleGVjdXRvciA9IGZ1dHVyZXMuVGhyZWFkUG9vbEV4ZWN1dG9yKAorICAgICAgICAgICAgbWF4X3dvcmtlcnM9NSwgdGhyZWFkX25hbWVfcHJlZml4PSdTcGVjaWFsUG9vbCcpCisgICAgICAgIGV4ZWN1dG9yLm1hcChhYnMsIHJhbmdlKC01LCA1KSkKKyAgICAgICAgdGhyZWFkcyA9IGV4ZWN1dG9yLl90aHJlYWRzCisgICAgICAgIGRlbCBleGVjdXRvcgorCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KHQubmFtZSwgcideU3BlY2lhbFBvb2xfWzAtNF0kJykKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBkZWYgdGVzdF90aHJlYWRfbmFtZXNfZGVmYXVsdChzZWxmKToKKyAgICAgICAgZXhlY3V0b3IgPSBmdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcihtYXhfd29ya2Vycz01KQorICAgICAgICBleGVjdXRvci5tYXAoYWJzLCByYW5nZSgtNSwgNSkpCisgICAgICAgIHRocmVhZHMgPSBleGVjdXRvci5fdGhyZWFkcworICAgICAgICBkZWwgZXhlY3V0b3IKKworICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgIyBXZSBkb24ndCBwYXJ0aWN1bGFybHkgY2FyZSB3aGF0IHRoZSBkZWZhdWx0IG5hbWUgaXMsIGp1c3QgdGhhdAorICAgICAgICAgICAgIyBpdCBoYXMgYSBkZWZhdWx0IG5hbWUgaW1wbHlpbmcgdGhhdCBpdCBpcyBhIFRocmVhZFBvb2xFeGVjdXRvcgorICAgICAgICAgICAgIyBmb2xsb3dlZCBieSB3aGF0IGxvb2tzIGxpa2UgYSB0aHJlYWQgbnVtYmVyLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSZWdleCh0Lm5hbWUsIHInXi4qVGhyZWFkUG9vbEV4ZWN1dG9yLipfWzAtNF0kJykKKyAgICAgICAgICAgIHQuam9pbigpCisKIAogY2xhc3MgUHJvY2Vzc1Bvb2xTaHV0ZG93blRlc3QoUHJvY2Vzc1Bvb2xNaXhpbiwgRXhlY3V0b3JTaHV0ZG93blRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgX3ByaW1lX2V4ZWN1dG9yKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkKaW5kZXggM2M2YmRlZi4uMDM2YTFkMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CkBAIC04NCw2ICs4NCwzMSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbnRhaW5lciA9PSBjb25zdHJ1Y3Rvcih2YWx1ZXMpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbnRhaW5lciA9PSBjb250YWluZXIpCiAKKyAgICBkZWYgdGVzdF9ibG9ja19mYWxsYmFjayhzZWxmKToKKyAgICAgICAgIyBibG9ja2luZyBmYWxsYmFjayB3aXRoIF9fY29udGFpbnNfXyA9IE5vbmUKKyAgICAgICAgY2xhc3MgQnlDb250YWlucyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGMgPSBCeUNvbnRhaW5zKCkKKyAgICAgICAgY2xhc3MgQmxvY2tDb250YWlucyhCeUNvbnRhaW5zKToKKyAgICAgICAgICAgICIiIklzIG5vdCBhIGNvbnRhaW5lcgorCisgICAgICAgICAgICBUaGlzIGNsYXNzIGlzIGEgcGVyZmVjdGx5IGdvb2QgaXRlcmFibGUgKGFzIHRlc3RlZCBieQorICAgICAgICAgICAgbGlzdChiYykpLCBhcyB3ZWxsIGFzIGluaGVyaXRpbmcgZnJvbSBhIHBlcmZlY3RseSBnb29kCisgICAgICAgICAgICBjb250YWluZXIsIGJ1dCBfX2NvbnRhaW5zX18gPSBOb25lIHByZXZlbnRzIHRoZSB1c3VhbAorICAgICAgICAgICAgZmFsbGJhY2sgdG8gaXRlcmF0aW9uIGluIHRoZSBjb250YWluZXIgcHJvdG9jb2wuIFRoYXQKKyAgICAgICAgICAgIGlzLCBub3JtYWxseSwgMCBpbiBiYyB3b3VsZCBmYWxsIGJhY2sgdG8gdGhlIGVxdWl2YWxlbnQKKyAgICAgICAgICAgIG9mIGFueSh4PT0wIGZvciB4IGluIGJjKSwgYnV0IGhlcmUgaXQncyBibG9ja2VkIGZyb20KKyAgICAgICAgICAgIGRvaW5nIHNvLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgd2hpbGUgRmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5vbmUKKyAgICAgICAgICAgIF9fY29udGFpbnNfXyA9IE5vbmUKKyAgICAgICAgYmMgPSBCbG9ja0NvbnRhaW5zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgwIGluIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMCBpbiBsaXN0KGJjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IDAgaW4gYmMpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggNTE2NDAzZS4uYzA0YzgwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMTIsNiArMTIsMzkgQEAKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKIAorY2xhc3MgVGVzdEFic3RyYWN0Q29udGV4dE1hbmFnZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZW50ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIERlZmF1bHRFbnRlcihBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2V4aXRfXygqYXJncykKKworICAgICAgICBtYW5hZ2VyID0gRGVmYXVsdEVudGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYW5hZ2VyLl9fZW50ZXJfXygpLCBtYW5hZ2VyKQorCisgICAgZGVmIHRlc3RfZXhpdF9pc19hYnN0cmFjdChzZWxmKToKKyAgICAgICAgY2xhc3MgTWlzc2luZ0V4aXQoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgTWlzc2luZ0V4aXQoKQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJhbF9zdWJjbGFzc2luZyhzZWxmKToKKyAgICAgICAgY2xhc3MgTWFuYWdlckZyb21TY3JhdGNoOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhNYW5hZ2VyRnJvbVNjcmF0Y2gsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpKQorCisgICAgICAgIGNsYXNzIERlZmF1bHRFbnRlcihBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2V4aXRfXygqYXJncykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhEZWZhdWx0RW50ZXIsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpKQorCisKIGNsYXNzIENvbnRleHRNYW5hZ2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfcGxhaW4oc2VsZik6CkBAIC04OSw3ICsxMjIsNyBAQAogICAgICAgICBkZWYgd29vaG9vKCk6CiAgICAgICAgICAgICB5aWVsZAogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgICAgICB3aXRoIHdvb2hvbygpOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBzdG9wX2V4YwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CmluZGV4IDBlMWY2NzAuLjQ1YTY5MjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29weS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgdGVzdHMgPSBbTm9uZSwgLi4uLCBOb3RJbXBsZW1lbnRlZCwKICAgICAgICAgICAgICAgICAgNDIsIDIqKjEwMCwgMy4xNCwgVHJ1ZSwgRmFsc2UsIDFqLAogICAgICAgICAgICAgICAgICAiaGVsbG8iLCAiaGVsbG9cdTEyMzQiLCBmLl9fY29kZV9fLAotICAgICAgICAgICAgICAgICBiIndvcmxkIiwgYnl0ZXMocmFuZ2UoMjU2KSksIHJhbmdlKDEwKSwKKyAgICAgICAgICAgICAgICAgYiJ3b3JsZCIsIGJ5dGVzKHJhbmdlKDI1NikpLCByYW5nZSgxMCksIHNsaWNlKDEsIDEwLCAyKSwKICAgICAgICAgICAgICAgICAgTmV3U3R5bGUsIENsYXNzaWMsIG1heCwgV2l0aE1ldGFjbGFzc10KICAgICAgICAgZm9yIHggaW4gdGVzdHM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNvcHkuY29weSh4KSwgeCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2Nwcm9maWxlLnB5CmluZGV4IGYxODk4M2YuLjUzZjg5MTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weQpAQCAtNiw3ICs2LDcgQEAKICMgcmlwIG9mZiBhbGwgaW50ZXJlc3Rpbmcgc3R1ZmYgZnJvbSB0ZXN0X3Byb2ZpbGUKIGltcG9ydCBjUHJvZmlsZQogZnJvbSB0ZXN0LnRlc3RfcHJvZmlsZSBpbXBvcnQgUHJvZmlsZVRlc3QsIHJlZ2VuZXJhdGVfZXhwZWN0ZWRfb3V0cHV0Ci1mcm9tIHRlc3QucHJvZmlsZWUgaW1wb3J0IHRlc3RmdW5jCisKIAogY2xhc3MgQ1Byb2ZpbGVUZXN0KFByb2ZpbGVUZXN0KToKICAgICBwcm9maWxlcmNsYXNzID0gY1Byb2ZpbGUuUHJvZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jc3YucHkgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQppbmRleCA3N2MzMTVlLi43ZGNlYTljIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nzdi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQpAQCAtMiw5ICsyLDcgQEAKICMgY3N2IHBhY2thZ2UgdW5pdCB0ZXN0cwogCiBpbXBvcnQgY29weQotaW1wb3J0IGlvCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeUZpbGUKQEAgLTEyLDYgKzEwLDkgQEAKIGltcG9ydCBnYwogaW1wb3J0IHBpY2tsZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Citmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcGVybXV0YXRpb25zCitmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CiAKIGNsYXNzIFRlc3RfQ3N2KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiIKQEAgLTQyNiwxNyArNDI3LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAtMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IDEwMCkKIAotICAgICMgU2VlIGlzc3VlICMyMjk5NQotICAgICMjIGRlZiB0ZXN0X2NvcHkoc2VsZik6Ci0gICAgIyMgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6Ci0gICAgIyMgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCi0gICAgIyMgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHkuY29weSwgZGlhbGVjdCkKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgorICAgICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5LmNvcHksIGRpYWxlY3QpCiAKLSAgICAjIyBkZWYgdGVzdF9waWNrbGUoc2VsZik6Ci0gICAgIyMgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6Ci0gICAgIyMgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCi0gICAgIyMgICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSAgICAjIyAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZGlhbGVjdCwgcHJvdG8pCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgorICAgICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQorICAgICAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGRpYWxlY3QsIHByb3RvKQogCiBjbGFzcyBUZXN0Q3N2QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHJlYWRlckFzc2VydEVxdWFsKHNlbGYsIGlucHV0LCBleHBlY3RlZF9yZXN1bHQpOgpAQCAtMTA4MCw3ICsxMDgwLDYgQEAKICAgICAgICAgICAgICAiRnJhbsOnb2lzIFBpbmFyZCJdCiAKICAgICBkZWYgdGVzdF91bmljb2RlX3JlYWQoc2VsZik6Ci0gICAgICAgIGltcG9ydCBpbwogICAgICAgICB3aXRoIFRlbXBvcmFyeUZpbGUoIncrIiwgbmV3bGluZT0nJywgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmlsZW9iajoKICAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIiwiLmpvaW4oc2VsZi5uYW1lcykgKyAiXHJcbiIpCiAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKQEAgLTEwODksNyArMTA4OCw2IEBACiAKIAogICAgIGRlZiB0ZXN0X3VuaWNvZGVfd3JpdGUoc2VsZik6Ci0gICAgICAgIGltcG9ydCBpbwogICAgICAgICB3aXRoIFRlbXBvcmFyeUZpbGUoIncrIiwgbmV3bGluZT0nJywgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmlsZW9iajoKICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhzZWxmLm5hbWVzKQpAQCAtMTA5Nyw2ICsxMDk1LDYzIEBACiAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQogCitjbGFzcyBLZXlPcmRlcmluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfb3JkZXJpbmdfZm9yX3RoZV9kaWN0X3JlYWRlcl9hbmRfd3JpdGVyKHNlbGYpOgorICAgICAgICByZXN1bHRzZXQgPSBzZXQoKQorICAgICAgICBmb3Iga2V5cyBpbiBwZXJtdXRhdGlvbnMoImFiY2RlIik6CisgICAgICAgICAgICB3aXRoIFRlbXBvcmFyeUZpbGUoJ3crJywgbmV3bGluZT0nJywgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmlsZW9iamVjdDoKKyAgICAgICAgICAgICAgICBkdyA9IGNzdi5EaWN0V3JpdGVyKGZpbGVvYmplY3QsIGtleXMpCisgICAgICAgICAgICAgICAgZHcud3JpdGVoZWFkZXIoKQorICAgICAgICAgICAgICAgIGZpbGVvYmplY3Quc2VlaygwKQorICAgICAgICAgICAgICAgIGRyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iamVjdCkKKyAgICAgICAgICAgICAgICBrdCA9IHR1cGxlKGRyLmZpZWxkbmFtZXMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBrdCkKKyAgICAgICAgICAgICAgICByZXN1bHRzZXQuYWRkKGt0KQorICAgICAgICAjIEZpbmFsIHNhbml0eSBjaGVjazogd2VyZSBhbGwgcGVybXV0YXRpb25zIHVuaXF1ZT8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0c2V0KSwgMTIwLCAiS2V5IG9yZGVyaW5nOiBzb21lIGtleSBwZXJtdXRhdGlvbnMgbm90IGNvbGxlY3RlZCAoZXhwZWN0ZWQgMTIwKSIpCisKKyAgICBkZWYgdGVzdF9vcmRlcmVkX2RpY3RfcmVhZGVyKHNlbGYpOgorICAgICAgICBkYXRhID0gZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIEZpcnN0TmFtZSxMYXN0TmFtZQorICAgICAgICAgICAgRXJpYyxJZGxlCisgICAgICAgICAgICBHcmFoYW0sQ2hhcG1hbixPdmVyMSxPdmVyMgorCisgICAgICAgICAgICBVbmRlcjEKKyAgICAgICAgICAgIEpvaG4sQ2xlZXNlCisgICAgICAgICcnJykuc3BsaXRsaW5lcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNzdi5EaWN0UmVhZGVyKGRhdGEpKSwKKyAgICAgICAgICAgIFtPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnRXJpYycpLCAoJ0xhc3ROYW1lJywgJ0lkbGUnKV0pLAorICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ0ZpcnN0TmFtZScsICdHcmFoYW0nKSwgKCdMYXN0TmFtZScsICdDaGFwbWFuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBbJ092ZXIxJywgJ092ZXIyJ10pXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ1VuZGVyMScpLCAoJ0xhc3ROYW1lJywgTm9uZSldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnSm9obicpLCAoJ0xhc3ROYW1lJywgJ0NsZWVzZScpXSksCisgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjc3YuRGljdFJlYWRlcihkYXRhLCByZXN0a2V5PSdPdGhlckluZm8nKSksCisgICAgICAgICAgICBbT3JkZXJlZERpY3QoWygnRmlyc3ROYW1lJywgJ0VyaWMnKSwgKCdMYXN0TmFtZScsICdJZGxlJyldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnR3JhaGFtJyksICgnTGFzdE5hbWUnLCAnQ2hhcG1hbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ090aGVySW5mbycsIFsnT3ZlcjEnLCAnT3ZlcjInXSldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdGaXJzdE5hbWUnLCAnVW5kZXIxJyksICgnTGFzdE5hbWUnLCBOb25lKV0pLAorICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ0ZpcnN0TmFtZScsICdKb2huJyksICgnTGFzdE5hbWUnLCAnQ2xlZXNlJyldKSwKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgZGVsIGRhdGFbMF0gICAgICAgICAgICAjIFJlbW92ZSB0aGUgaGVhZGVyIHJvdworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY3N2LkRpY3RSZWFkZXIoZGF0YSwgZmllbGRuYW1lcz1bJ2ZuYW1lJywgJ2xuYW1lJ10pKSwKKyAgICAgICAgICAgIFtPcmRlcmVkRGljdChbKCdmbmFtZScsICdFcmljJyksICgnbG5hbWUnLCAnSWRsZScpXSksCisgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnZm5hbWUnLCAnR3JhaGFtJyksICgnbG5hbWUnLCAnQ2hhcG1hbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgWydPdmVyMScsICdPdmVyMiddKV0pLAorICAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ2ZuYW1lJywgJ1VuZGVyMScpLCAoJ2xuYW1lJywgTm9uZSldKSwKKyAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdmbmFtZScsICdKb2huJyksICgnbG5hbWUnLCAnQ2xlZXNlJyldKSwKKyAgICAgICAgICAgIF0pCisKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGV4dHJhID0geydfX2RvY19fJywgJ19fdmVyc2lvbl9fJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgY3N2LCAoJ2NzdicsICdfY3N2JyksIGV4dHJhPWV4dHJhKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQppbmRleCAyZDRlYjUyLi4yNDJlMWJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKQEAgLTIzLDkgKzIzLDE2IEBACiB0ZXN0X2NsYXNzZXMgPSBbXQogCiBmb3IgbW9kdWxlLCBzdWZmaXggaW4gemlwKHRlc3RfbW9kdWxlcywgdGVzdF9zdWZmaXhlcyk6CisgICAgdGVzdF9jbGFzc2VzID0gW10KICAgICBmb3IgbmFtZSwgY2xzIGluIG1vZHVsZS5fX2RpY3RfXy5pdGVtcygpOgotICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UoY2xzLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhjbHMsIHVuaXR0ZXN0LlRlc3RDYXNlKSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNscywgdHlwZSk6CiAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBpc3N1YmNsYXNzKGNscywgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdGVzdF9jbGFzc2VzLmFwcGVuZChjbHMpCisgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhjbHMsIHVuaXR0ZXN0LlRlc3RTdWl0ZSk6CisgICAgICAgICAgICBzdWl0ID0gY2xzKCkKKyAgICAgICAgICAgIHRlc3RfY2xhc3Nlcy5leHRlbmQodHlwZSh0ZXN0KSBmb3IgdGVzdCBpbiBzdWl0KQorICAgIGZvciBjbHMgaW4gdGVzdF9jbGFzc2VzOgogICAgICAgICBjbHMuX19uYW1lX18gPSBuYW1lICsgc3VmZml4CiAgICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHNfLCBtb2R1bGU9bW9kdWxlKToKQEAgLTM5LDcgKzQ2LDYgQEAKICAgICAgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShjbHNfLl9zYXZlX3N5c19tb2R1bGVzKQogICAgICAgICBjbHMuc2V0VXBDbGFzcyA9IHNldFVwQ2xhc3MKICAgICAgICAgY2xzLnRlYXJEb3duQ2xhc3MgPSB0ZWFyRG93bkNsYXNzCi0gICAgICAgIHRlc3RfY2xhc3Nlcy5hcHBlbmQoY2xzKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibS5weSBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CmluZGV4IDYyM2Q5OTIuLmYwYTQyOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CkBAIC0xLDYgKzEsNSBAQAogIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBkYm0ub3BlbiBmdW5jdGlvbiBiYXNlZCBvbiB0ZXN0ZHVtYmRibS5weSIiIgogCi1pbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGdsb2IKIGltcG9ydCB0ZXN0LnN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGJtX2R1bWIucHkgYi9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5CmluZGV4IGZmNjNjODguLjJkNzdmMDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtX2R1bWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kYm1fZHVtYi5weQpAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGRibS5kdW1iIGFzIGR1bWJkYm0KIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKQEAgLTc4LDYgKzc5LDEyIEBACiAgICAgICAgIHNlbGYuaW5pdF9kYigpCiAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAncicpCiAgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBvbmx5Jyk6CisgICAgICAgICAgICBmW2InZyddID0gYid4JworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgZGF0YWJhc2UgaXMgb3BlbmVkIGZvciByZWFkaW5nIG9ubHknKToKKyAgICAgICAgICAgIGRlbCBmW2InYSddCiAgICAgICAgIGYuY2xvc2UoKQogCiAgICAgZGVmIHRlc3RfZHVtYmRibV9rZXlzKHNlbGYpOgpAQCAtMTQ4LDcgKzE1NSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RpY3Rba2V5XSwgZltrZXldKQogCiAgICAgZGVmIGluaXRfZGIoc2VsZik6Ci0gICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAndycpCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAnbicpCiAgICAgICAgIGZvciBrIGluIHNlbGYuX2RpY3Q6CiAgICAgICAgICAgICBmW2tdID0gc2VsZi5fZGljdFtrXQogICAgICAgICBmLmNsb3NlKCkKQEAgLTIzNCw2ICsyNDEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJycpCiAKKyAgICBkZWYgdGVzdF93YXJuX29uX2lnbm9yZWRfZmxhZ3Moc2VsZik6CisgICAgICAgIGZvciB2YWx1ZSBpbiAoJ3InLCAndycpOgorICAgICAgICAgICAgX2RlbGV0ZV9maWxlcygpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRhdGFiYXNlIGZpbGUgaXMgbWlzc2luZywgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW1hbnRpY3Mgb2YgdGhlICdjJyBmbGFnIHdpbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIHVzZWQuIik6CisgICAgICAgICAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUsIHZhbHVlKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2ZsYWcoc2VsZik6CisgICAgICAgIGZvciBmbGFnIGluICgneCcsICdyZicsIE5vbmUpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsYWcgbXVzdCBiZSBvbmUgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidyJywgJ3cnLCAnYycsIG9yICduJyIpOgorICAgICAgICAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCBmbGFnKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIF9kZWxldGVfZmlsZXMoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkgYi9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkKaW5kZXggYTc4MDhmNS4uMzA0YjMzMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtX2dudS5weQpAQCAtMiw3ICsyLDcgQEAKIGdkYm0gPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoImRibS5nbnUiKSAjc2tpcCBpZiBub3Qgc3VwcG9ydGVkCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgdW5saW5rCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCB1bmxpbmsKIAogCiBmaWxlbmFtZSA9IFRFU1RGTgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weSBiL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkKaW5kZXggMjI5MTU2MS4uNDlmNDQyNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibV9uZGJtLnB5CkBAIC0xLDggKzEsNiBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBzdXBwb3J0LmltcG9ydF9tb2R1bGUoImRibS5uZGJtIikgI3NraXAgaWYgbm90IHN1cHBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgb3MKLWltcG9ydCByYW5kb20KIGltcG9ydCBkYm0ubmRibQogZnJvbSBkYm0ubmRibSBpbXBvcnQgZXJyb3IKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IDFhYTBiZjguLjc0OTJmNTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTIwNDcsNiArMjA0NywzOSBAQAogICAgICAgICBkID0gRGVjaW1hbCggKDEsICgwLCAyLCA3LCAxKSwgJ0YnKSApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMSwgKDAsKSwgJ0YnKSkKIAorICAgIGRlZiB0ZXN0X2FzX2ludGVnZXJfcmF0aW8oc2VsZik6CisgICAgICAgIERlY2ltYWwgPSBzZWxmLmRlY2ltYWwuRGVjaW1hbAorCisgICAgICAgICMgZXhjZXB0aW9uYWwgY2FzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCctaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLW5hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJ3NuYW4xMjMnKSkKKworICAgICAgICBmb3IgZXhwIGluIHJhbmdlKC00LCAyKToKKyAgICAgICAgICAgIGZvciBjb2VmZiBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICBmb3Igc2lnbiBpbiAnKycsICctJzoKKyAgICAgICAgICAgICAgICAgICAgZCA9IERlY2ltYWwoJyVzJWRFJWQnICUgKHNpZ24sIGNvZWZmLCBleHApKQorICAgICAgICAgICAgICAgICAgICBwcSA9IGQuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICAgICAgICAgICAgIHAsIHEgPSBwcQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcmV0dXJuIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBxLCB0dXBsZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHAsIGludCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHEsIGludCkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIG5vcm1hbGl6YXRpb246ICBxIHNob3VsZCBiZSBwb3NpdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgIyBwIHNob3VsZCBiZSByZWxhdGl2ZWx5IHByaW1lIHRvIHEuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihxLCAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZ2NkKHAsIHEpLCAxKQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhhdCBwL3EgYWN0dWFsbHkgZ2l2ZXMgdGhlIGNvcnJlY3QgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKHApIC8gRGVjaW1hbChxKSwgZCkKKwogICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgogICAgICAgICAjIERpZmZlcmVudCBiZWhhdmlvdXJzIHdoZW4gc3ViY2xhc3NpbmcgRGVjaW1hbAogICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CmluZGV4IDE4ZTFkZjAuLmNlNTE3YjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQpAQCAtMjg5LDcgKzI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaW5kZXgoZWxlbWVudCwgc3RhcnQsIHN0b3ApLCB0YXJnZXQpCiAKLSAgICBkZWYgdGVzdF9pbnNlcnRfYnVnXzI0OTEzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2luZGV4X2J1Z18yNDkxMyhzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKCdBJyAqIDMpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CiAgICAgICAgICAgICBpID0gZC5pbmRleCgiSGVsbG8gd29ybGQiLCAwLCA0KQpAQCAtNjIyLDIwICs2MjIsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgotICAgICAgICBkID0gZGVxdWUocmFuZ2UoMjAwKSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoZCwgaSkKLSAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorICAgICAgICBmb3IgZCBpbiBkZXF1ZShyYW5nZSgyMDApKSwgZGVxdWUocmFuZ2UoMjAwKSwgMTAwKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkLCBpKQorICAgICAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGUpLCBpZChkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZSksIGxpc3QoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1heGxlbiwgZC5tYXhsZW4pCiAKLSMjICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6Ci0jIyAgICAgICAgZCA9IGRlcXVlKCdhYmMnKQotIyMgICAgICAgIGQuYXBwZW5kKGQpCi0jIyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSMjICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCi0jIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlWy0xXSkpCisgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgZm9yIGQgaW4gZGVxdWUoJ2FiYycpLCBkZXF1ZSgnYWJjJywgMyk6CisgICAgICAgICAgICBkLmFwcGVuZChkKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkLCBpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGUpLCBpZChkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGVbLTFdKSwgaWQoZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1heGxlbiwgZC5tYXhsZW4pCiAKICAgICBkZWYgdGVzdF9pdGVyYXRvcl9waWNrbGUoc2VsZik6CiAgICAgICAgIG9yaWcgPSBkZXF1ZShyYW5nZSgyMDApKQpAQCAtNjk2LDYgKzY5OCwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgZm9yIG1heGxlbiBpbiByYW5nZSgtMSwgNik6CisgICAgICAgICAgICAgICAgcyA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGogaW4gcmFuZ2UoaSldCisgICAgICAgICAgICAgICAgZCA9IGRlcXVlKHMpIGlmIG1heGxlbiA9PSAtMSBlbHNlIGRlcXVlKHMsIG1heGxlbikKKyAgICAgICAgICAgICAgICBlID0gZC5jb3B5KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLm1heGxlbiwgZS5tYXhsZW4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbCh4IGlzIHkgZm9yIHgsIHkgaW4gemlwKGQsIGUpKSkKKwogICAgIGRlZiB0ZXN0X2NvcHlfbWV0aG9kKHNlbGYpOgogICAgICAgICBtdXQgPSBbMTBdCiAgICAgICAgIGQgPSBkZXF1ZShbbXV0XSkKQEAgLTg0NSwyNCArODU2LDI2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoZSkpCiAKLSMjICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSMjICAgICAgICBkID0gRGVxdWUoJ2FiYycpCi0jIyAgICAgICAgZC5hcHBlbmQoZCkKLSMjCi0jIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQotIyMgICAgICAgIGRkID0gZC5wb3AoKQotIyMgICAgICAgIGVlID0gZS5wb3AoKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZSksIGlkKGVlKSkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCi0jIwotIyMgICAgICAgIGQueCA9IGQKLSMjICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkKSkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlLngpKQotIyMKLSMjICAgICAgICBkID0gRGVxdWVXaXRoQmFkSXRlcignYWJjJykKLSMjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZCkKKyAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGZvciBkIGluIERlcXVlKCdhYmMnKSwgRGVxdWUoJ2FiYycsIDMpOgorICAgICAgICAgICAgICAgIGQuYXBwZW5kKGQpCisKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkLCBwcm90bykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUpLCB0eXBlKGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQorICAgICAgICAgICAgICAgIGRkID0gZC5wb3AoKQorICAgICAgICAgICAgICAgIGVlID0gZS5wb3AoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZWUpLCBpZChlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIGQpCisKKyAgICAgICAgICAgICAgICBkLnggPSBkCisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZS54KSwgaWQoZSkpCisKKyAgICAgICAgICAgIGZvciBkIGluIERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpLCBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnLCAyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZCwgcHJvdG8pCiAKICAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgogICAgICAgICBkID0gZGVxdWUoJ2dhbGxhaGFkJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IGExMzBjZWMuLjA5NTBiOGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtODc2LDcgKzg3Niw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRnJhZygpLl9faW50X18oKSwgNDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KEZyYWcoKSksIDQyKQogCi0gICAgZGVmIHRlc3RfZGlhbW9uZF9pbmhlcml0ZW5jZShzZWxmKToKKyAgICBkZWYgdGVzdF9kaWFtb25kX2luaGVyaXRhbmNlKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc3BlY2lhbCBjYXNlcy4uLgogICAgICAgICBjbGFzcyBBKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgc3BhbShzZWxmKTogcmV0dXJuICJBIgpAQCAtNDczOCwxMSArNDczOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIChhcmdzLCBrd2FyZ3MpCiAgICAgICAgIG9iaiA9IEMzKCkKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKLSAgICAgICAgICAgIGlmIHByb3RvID49IDQ6CisgICAgICAgICAgICBpZiBwcm90byA+PSAyOgogICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3JlZHVjZShwcm90bywgb2JqLCBhcmdzLCBrd2FyZ3MpCi0gICAgICAgICAgICBlbGlmIHByb3RvID49IDI6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgICAgICAgICAgICAgICAgb2JqLl9fcmVkdWNlX2V4X18ocHJvdG8pCiAKICAgICAgICAgY2xhc3MgQzQ6CiAgICAgICAgICAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6CkBAIC01MDYxLDEwICs1MDU4LDYgQEAKICAgICAgICAgICAgICAgICBrd2FyZ3MgPSBnZXRhdHRyKGNscywgJ0tXQVJHUycsIHt9KQogICAgICAgICAgICAgICAgIG9iaiA9IGNscygqY2xzLkFSR1MsICoqa3dhcmdzKQogICAgICAgICAgICAgICAgIHByb3RvID0gcGlja2xlX2NvcGllci5wcm90bwotICAgICAgICAgICAgICAgIGlmIDIgPD0gcHJvdG8gPCA0IGFuZCBoYXNhdHRyKGNscywgJ19fZ2V0bmV3YXJnc19leF9fJyk6Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGVfY29waWVyLmR1bXBzKG9iaiwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgb2JqY29weSA9IHBpY2tsZV9jb3BpZXIuY29weShvYmopCiAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2lzX2NvcHkob2JqLCBvYmpjb3B5KQogICAgICAgICAgICAgICAgICMgRm9yIHRlc3QgY2xhc3NlcyB0aGF0IHN1cHBvcnRzIHRoaXMsIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgZ28KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CmluZGV4IDUwNmQxYWIuLmI4NGQ2NDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weQpAQCAtMTgyLDYgKzE4Miw3IEBACiAgICAgICdfX2lhZGRfXycsCiAgICAgICdfX2ltdWxfXycsCiAgICAgICdfX2luaXRfXycsCisgICAgICdfX2luaXRfc3ViY2xhc3NfXycsCiAgICAgICdfX2l0ZXJfXycsCiAgICAgICdfX2xlX18nLAogICAgICAnX19sZW5fXycsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkgYi9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkKaW5kZXggOTU1NjE4YS4uYzEzM2M4MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGV2cG9sbC5weQpAQCAtNSw5ICs1LDggQEAKIGltcG9ydCBvcwogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHNlbGVjdAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIGNweXRob25fb25seQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY3B5dGhvbl9vbmx5CiAKIGlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgJ2RldnBvbGwnKSA6CiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ3Rlc3Qgd29ya3Mgb25seSBvbiBTb2xhcmlzIE9TIGZhbWlseScpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKaW5kZXggNmQ2OGU3Ni4uNmM0NzA2NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQpAQCAtMSwxMCArMSwxMiBAQAotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQotaW1wb3J0IGNvbGxlY3Rpb25zLCByYW5kb20sIHN0cmluZworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi1pbXBvcnQgZ2MsIHdlYWtyZWYKK2ltcG9ydCBnYwogaW1wb3J0IHBpY2tsZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cmluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRGljdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtOTY5LDUgKzk3MSw2IEBACiBjbGFzcyBTdWJjbGFzc01hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CiAgICAgdHlwZTJ0ZXN0ID0gRGljdAogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CmluZGV4IDNjOGI5NWMuLjA4NzMwNzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CkBAIC0xLDcgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCiAjIEZvciBzY29wZSB0ZXN0aW5nLgogZyA9ICJHbG9iYWwgdmFyaWFibGUiCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKaW5kZXggYWIyM2NhMS4uNGMyOTBmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKQEAgLTEsMyArMSw0IEBACitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb3B5CiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTIxOSw2ICsyMjAsMjcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHBpY2tsZS5QaWNrbGluZ0Vycm9yKSwKICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMsIGQuaXRlbXMoKSwgcHJvdG8pCiAKKyAgICBkZWYgdGVzdF9hYmNfcmVnaXN0cnkoc2VsZik6CisgICAgICAgIGQgPSBkaWN0KGE9MSkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLktleXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlZhbHVlc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlNpemVkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZW1zVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQppbmRleCBhYjlkZWJmLi4xNTZiNTIzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CkBAIC0xMjIsMTcgKzEyMiwxNyBAQAogIiIiCiAKIHBhdGNoOTE0NTc1X2Zyb20yID0gIiIiCi1cdFx0TGluZSAxOiBwcmVjZWVkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQotICBcdFx0TGluZSAyOiBwcmVjZWVkZWQgYnkgZnJvbTpbc3N0dF0gdG86W3Nzc3N0XQotICBcdCBcdExpbmUgMzogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQorXHRcdExpbmUgMTogcHJlY2VkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQorICBcdFx0TGluZSAyOiBwcmVjZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgIFx0IFx0TGluZSAzOiBwcmVjZWRlZCBieSBmcm9tOltzc3RzdF0gdG86W3Nzc3Nzc10KIExpbmUgNDogIFx0aGFzIGZyb206W3NzdF0gdG86W3Nzc10gYWZ0ZXIgOgogTGluZSA1OiBoYXMgZnJvbTpbdF0gdG86W3NzXSBhdCBlbmRcdAogIiIiCiAKIHBhdGNoOTE0NTc1X3RvMiA9ICIiIgotICAgIExpbmUgMTogcHJlY2VlZGVkIGJ5IGZyb206W3R0XSB0bzpbc3Nzc10KLSAgICBcdExpbmUgMjogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHRdIHRvOltzc3NzdF0KLSAgICAgIExpbmUgMzogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQorICAgIExpbmUgMTogcHJlY2VkZWQgYnkgZnJvbTpbdHRdIHRvOltzc3NzXQorICAgIFx0TGluZSAyOiBwcmVjZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgICAgICBMaW5lIDM6IHByZWNlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQogTGluZSA0OiAgIGhhcyBmcm9tOltzc3RdIHRvOltzc3NdIGFmdGVyIDoKIExpbmUgNTogaGFzIGZyb206W3RdIHRvOltzc10gYXQgZW5kCiAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbCBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbAppbmRleCBlYTdhMjRlLi4zZTZhN2I3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliX2V4cGVjdC5odG1sCkBAIC0zODcsOSArMzg3LDkgQEAKICAgICAgICAgCiAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvOV9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PC90cj4KLSAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtMaW5lJm5ic3A7MjombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48L3RyPgogICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NTombmJzcDtoYXMmbmJzcDtmcm9tOlt0XSZuYnNwO3RvOltzc10mbmJzcDthdCZuYnNwO2VuZDxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs1OiZuYnNwO2hhcyZuYnNwO2Zyb206W3RdJm5ic3A7dG86W3NzXSZuYnNwO2F0Jm5ic3A7ZW5kPC90ZD48L3RyPgogICAgICAgICA8L3Rib2R5PgpAQCAtNDAzLDkgKzQwMyw5IEBACiAgICAgICAgIAogICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEwX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTBfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+Ci0gICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48L3RyPgotICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PC90cj4KICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8L3RkPjwvdHI+CiAgICAgICAgIDwvdGJvZHk+CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rpcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CmluZGV4IDBmZDEzNDguLjA5ZTY4Y2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CkBAIC00MCw0MSArNDAsNDEgQEAKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICAgICAgOSBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoc2VsZikKLSAgICAgICAgICAgICAxMiBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAxOCBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgICAgIDYgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKHNlbGYpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuX19pbml0X18uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLCkKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kX2J5dGVzID0gIiIiXAogICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgIDE4IFJFVFVSTl9WQUxVRQorICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgNiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgICA4IFNUT1JFX0FUVFIgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDApCisgICAgICAgICAxMiBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfY19jbGFzc19tZXRob2QgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgIDYgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQotICAgICAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCi0gICAgICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTUgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTggUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuY20uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAyLCkKIAogZGlzX2Nfc3RhdGljX21ldGhvZCA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAgNiBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCi0gICAgICAgICAgICAgIDkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTUgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiICUgKF9DLnNtLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMiwpCiAKICMgQ2xhc3MgZGlzYXNzZW1ibGluZyBpbmZvIGhhcyBhbiBleHRyYSBuZXdsaW5lIGF0IGVuZC4KQEAgLTk1LDIzICs5NSwyMyBAQAogCiBkaXNfZiA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocHJpbnQpCi0gICAgICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCi0gICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgIDkgUE9QX1RPUAorICAgICAgICAgICAgICAyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorICAgICAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgICAgICA2IFBPUF9UT1AKIAotJTNkICAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgIDEzIFJFVFVSTl9WQUxVRQorJTNkICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiICUgKF9mLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMSwKICAgICAgICBfZi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIpCiAKIAogZGlzX2ZfY29fY29kZSA9ICIiIlwKICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAgNiBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMSAoMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKLSAgICAgICAgICA5IFBPUF9UT1AKLSAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgIDYgUE9QX1RPUAorICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAxMCBSRVRVUk5fVkFMVUUKICIiIgogCiAKQEAgLTEyMSwyMCArMTIxLDIwIEBACiAgICAgICAgIHBhc3MKIAogZGlzX2J1ZzcwODkwMSA9ICIiIlwKLSUzZCAgICAgICAgICAgMCBTRVRVUF9MT09QICAgICAgICAgICAgICAyMyAodG8gMjYpCi0gICAgICAgICAgICAgIDMgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHJhbmdlKQotICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorJTNkICAgICAgICAgICAwIFNFVFVQX0xPT1AgICAgICAgICAgICAgIDE4ICh0byAyMCkKKyAgICAgICAgICAgICAgMiBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocmFuZ2UpCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCiAKLSUzZCAgICAgICAgICAgOSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMTApCi0gICAgICAgICAgICAgMTIgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDIgKDIgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgMTUgR0VUX0lURVIKLSAgICAgICAgPj4gICAxNiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNiAodG8gMjUpCi0gICAgICAgICAgICAgMTkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKKyUzZCAgICAgICAgICAgNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMTApCisgICAgICAgICAgICAgIDggQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDIgKDIgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisgICAgICAgICAgICAgMTAgR0VUX0lURVIKKyAgICAgICAgPj4gICAxMiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNCAodG8gMTgpCisgICAgICAgICAgICAgMTQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKIAotJTNkICAgICAgICAgIDIyIEpVTVBfQUJTT0xVVEUgICAgICAgICAgIDE2Ci0gICAgICAgID4+ICAgMjUgUE9QX0JMT0NLCi0gICAgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMjkgUkVUVVJOX1ZBTFVFCislM2QgICAgICAgICAgMTYgSlVNUF9BQlNPTFVURSAgICAgICAgICAgMTIKKyAgICAgICAgPj4gICAxOCBQT1BfQkxPQ0sKKyAgICAgICAgPj4gICAyMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAyMiBSRVRVUk5fVkFMVUUKICIiIiAlIChidWc3MDg5MDEuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIGJ1ZzcwODkwMS5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIsCiAgICAgICAgYnVnNzA4OTAxLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMykKQEAgLTE0NywyMiArMTQ3LDIyIEBACiAKIGRpc19idWcxMzMzOTgyID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgwKQotICAgICAgICAgICAgICAzIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDM1Ci0gICAgICAgICAgICAgIDYgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQotICAgICAgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCi0gICAgICAgICAgICAgMTUgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAxOCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAyMSBHRVRfSVRFUgorICAgICAgICAgICAgICAyIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDI2CisgICAgICAgICAgICAgIDQgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQorICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCisgICAgICAgICAgICAgMTAgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAxMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNCBHRVRfSVRFUgorICAgICAgICAgICAgIDE2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorCislM2QgICAgICAgICAgMTggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDQgKDEpCisgICAgICAgICAgICAgMjAgQklOQVJZX0FERAogICAgICAgICAgICAgIDIyIENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgICAgIDI0IFJBSVNFX1ZBUkFSR1MgICAgICAgICAgICAxCiAKLSUzZCAgICAgICAgICAyNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgNCAoMSkKLSAgICAgICAgICAgICAyOCBCSU5BUllfQURECi0gICAgICAgICAgICAgMjkgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgMzIgUkFJU0VfVkFSQVJHUyAgICAgICAgICAgIDEKLQotJTNkICAgICA+PiAgIDM1IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgIDM4IFJFVFVSTl9WQUxVRQorJTNkICAgICA+PiAgIDI2IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDI4IFJFVFVSTl9WQUxVRQogIiIiICUgKGJ1ZzEzMzM5ODIuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIF9fZmlsZV9fLAogICAgICAgIGJ1ZzEzMzM5ODIuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLApAQCAtMTcxLDE5ICsxNzEsMTkgQEAKIAogX0JJR19MSU5FTk9fRk9STUFUID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChzcGFtKQotICAgICAgICAgICAgICAzIFBPUF9UT1AKKyAgICAgICAgICAgICAgMiBQT1BfVE9QCiAgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDYgUkVUVVJOX1ZBTFVFCiAiIiIKIAogZGlzX21vZHVsZV9leHBlY3RlZF9yZXN1bHRzID0gIiIiXAogRGlzYXNzZW1ibHkgb2YgZjoKICAgNCAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBSRVRVUk5fVkFMVUUKIAogRGlzYXNzZW1ibHkgb2YgZzoKICAgNSAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBSRVRVUk5fVkFMVUUKIAogIiIiCiAKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAKIGRpc19leHByX3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKLSAgICAgICAgICAgICAgNiBCSU5BUllfQURECi0gICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCisgICAgICAgICAgICAgIDQgQklOQVJZX0FERAorICAgICAgICAgICAgICA2IFJFVFVSTl9WQUxVRQogIiIiCiAKIHNpbXBsZV9zdG10X3N0ciA9ICJ4ID0geCArIDEiCiAKIGRpc19zaW1wbGVfc3RtdF9zdHIgPSAiIiJcCiAgIDEgICAgICAgICAgIDAgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCi0gICAgICAgICAgICAgIDYgQklOQVJZX0FERAotICAgICAgICAgICAgICA3IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxIChOb25lKQotICAgICAgICAgICAgIDEzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgxKQorICAgICAgICAgICAgICA0IEJJTkFSWV9BREQKKyAgICAgICAgICAgICAgNiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoTm9uZSkKKyAgICAgICAgICAgICAxMCBSRVRVUk5fVkFMVUUKICIiIgogCiBjb21wb3VuZF9zdG10X3N0ciA9ICIiIlwKQEAgLTIxNSw1NCArMjE1LDU0IEBACiAKIGRpc19jb21wb3VuZF9zdG10X3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgICAgICAgMyBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgMiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKIAotICAyICAgICAgICAgICA2IFNFVFVQX0xPT1AgICAgICAgICAgICAgIDE0ICh0byAyMykKKyAgMiAgICAgICAgICAgNCBTRVRVUF9MT09QICAgICAgICAgICAgICAxMiAodG8gMTgpCiAKLSAgMyAgICAgPj4gICAgOSBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAxNSBJTlBMQUNFX0FERAotICAgICAgICAgICAgIDE2IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDE5IEpVTVBfQUJTT0xVVEUgICAgICAgICAgICA5Ci0gICAgICAgICAgICAgMjIgUE9QX0JMT0NLCi0gICAgICAgID4+ICAgMjMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKE5vbmUpCi0gICAgICAgICAgICAgMjYgUkVUVVJOX1ZBTFVFCisgIDMgICAgID4+ICAgIDYgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgMTAgSU5QTEFDRV9BREQKKyAgICAgICAgICAgICAxMiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNCBKVU1QX0FCU09MVVRFICAgICAgICAgICAgNgorICAgICAgICAgICAgIDE2IFBPUF9CTE9DSworICAgICAgICA+PiAgIDE4IExPQURfQ09OU1QgICAgICAgICAgICAgICAyIChOb25lKQorICAgICAgICAgICAgIDIwIFJFVFVSTl9WQUxVRQogIiIiCiAKIGRpc190cmFjZWJhY2sgPSAiIiJcCi0lM2QgICAgICAgICAgIDAgU0VUVVBfRVhDRVBUICAgICAgICAgICAgMTIgKHRvIDE1KQorJTNkICAgICAgICAgICAwIFNFVFVQX0VYQ0VQVCAgICAgICAgICAgIDEyICh0byAxNCkKIAotJTNkICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgwKQotICAgIC0tPiAgICAgICA5IEJJTkFSWV9UUlVFX0RJVklERQotICAgICAgICAgICAgIDEwIFBPUF9UT1AKLSAgICAgICAgICAgICAxMSBQT1BfQkxPQ0sKLSAgICAgICAgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICA0NiAodG8gNjEpCislM2QgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDApCisgICAgLS0+ICAgICAgIDYgQklOQVJZX1RSVUVfRElWSURFCisgICAgICAgICAgICAgIDggUE9QX1RPUAorICAgICAgICAgICAgIDEwIFBPUF9CTE9DSworICAgICAgICAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgIDQwICh0byA1NCkKIAotJTNkICAgICA+PiAgIDE1IERVUF9UT1AKKyUzZCAgICAgPj4gICAxNCBEVVBfVE9QCiAgICAgICAgICAgICAgMTYgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAxOSBDT01QQVJFX09QICAgICAgICAgICAgICAxMCAoZXhjZXB0aW9uIG1hdGNoKQotICAgICAgICAgICAgIDIyIFBPUF9KVU1QX0lGX0ZBTFNFICAgICAgIDYwCi0gICAgICAgICAgICAgMjUgUE9QX1RPUAotICAgICAgICAgICAgIDI2IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChlKQotICAgICAgICAgICAgIDI5IFBPUF9UT1AKLSAgICAgICAgICAgICAzMCBTRVRVUF9GSU5BTExZICAgICAgICAgICAxNCAodG8gNDcpCisgICAgICAgICAgICAgMTggQ09NUEFSRV9PUCAgICAgICAgICAgICAgMTAgKGV4Y2VwdGlvbiBtYXRjaCkKKyAgICAgICAgICAgICAyMCBQT1BfSlVNUF9JRl9GQUxTRSAgICAgICA1MgorICAgICAgICAgICAgIDIyIFBPUF9UT1AKKyAgICAgICAgICAgICAyNCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKKyAgICAgICAgICAgICAyNiBQT1BfVE9QCisgICAgICAgICAgICAgMjggU0VUVVBfRklOQUxMWSAgICAgICAgICAgMTIgKHRvIDQyKQogCi0lM2QgICAgICAgICAgMzMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGUpCi0gICAgICAgICAgICAgMzYgTE9BRF9BVFRSICAgICAgICAgICAgICAgIDEgKF9fdHJhY2ViYWNrX18pCi0gICAgICAgICAgICAgMzkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDEgKHRiKQotICAgICAgICAgICAgIDQyIFBPUF9CTE9DSwotICAgICAgICAgICAgIDQzIFBPUF9FWENFUFQKLSAgICAgICAgICAgICA0NCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgPj4gICA0NyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICA1MCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICA1MyBERUxFVEVfRkFTVCAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICA1NiBFTkRfRklOQUxMWQotICAgICAgICAgICAgIDU3IEpVTVBfRk9SV0FSRCAgICAgICAgICAgICAxICh0byA2MSkKLSAgICAgICAgPj4gICA2MCBFTkRfRklOQUxMWQorJTNkICAgICAgICAgIDMwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChlKQorICAgICAgICAgICAgIDMyIExPQURfQVRUUiAgICAgICAgICAgICAgICAxIChfX3RyYWNlYmFja19fKQorICAgICAgICAgICAgIDM0IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAxICh0YikKKyAgICAgICAgICAgICAzNiBQT1BfQkxPQ0sKKyAgICAgICAgICAgICAzOCBQT1BfRVhDRVBUCisgICAgICAgICAgICAgNDAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgID4+ICAgNDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgNDQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgNDYgREVMRVRFX0ZBU1QgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgNDggRU5EX0ZJTkFMTFkKKyAgICAgICAgICAgICA1MCBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgMiAodG8gNTQpCisgICAgICAgID4+ICAgNTIgRU5EX0ZJTkFMTFkKIAotJTNkICAgICA+PiAgIDYxIExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh0YikKLSAgICAgICAgICAgICA2NCBSRVRVUk5fVkFMVUUKKyUzZCAgICAgPj4gICA1NCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAodGIpCisgICAgICAgICAgICAgNTYgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoVFJBQ0VCQUNLX0NPREUuY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIFRSQUNFQkFDS19DT0RFLmNvX2ZpcnN0bGluZW5vICsgMiwKICAgICAgICBUUkFDRUJBQ0tfQ09ERS5jb19maXJzdGxpbmVubyArIDMsCkBAIC02NDksMTcxICs2NDksMTY5IEBACiAKIEluc3RydWN0aW9uID0gZGlzLkluc3RydWN0aW9uCiBleHBlY3RlZF9vcGluZm9fb3V0ZXIgPSBbCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MywgYXJncmVwcj0nMycsIG9mZnNldD0wLCBzdGFydHNfbGluZT0yLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9Y29kZV9vYmplY3RfZiwgYXJncmVwcj1yZXByKGNvZGVfb2JqZWN0X2YpLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mJyIsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfQ0xPU1VSRScsIG9wY29kZT0xMzQsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTIxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MCwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTI3LCBzdGFydHNfbGluZT03LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTMwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTMzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9JycsIGFyZ3JlcHI9IicnIiwgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz02LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD0zOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX0xJU1QnLCBvcGNvZGU9MTAzLCBhcmc9MCwgYXJndmFsPTAsIGFyZ3JlcHI9JycsIG9mZnNldD00Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX01BUCcsIG9wY29kZT0xMDUsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTQ1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz03LCBhcmd2YWw9J0hlbGxvIHdvcmxkIScsIGFyZ3JlcHI9IidIZWxsbyB3b3JsZCEnIiwgb2Zmc2V0PTQ4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz03LCBhcmd2YWw9NywgYXJncmVwcj0nNyBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD01MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MiwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD01NSwgc3RhcnRzX2xpbmU9OCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTgsIGFyZ3ZhbD0oMywgNCksIGFyZ3JlcHI9JygzLCA0KScsIG9mZnNldD0wLCBzdGFydHNfbGluZT0yLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9mLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfZiksIG9mZnNldD04LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J291dGVyLjxsb2NhbHM+LmYnLCBhcmdyZXByPSInb3V0ZXIuPGxvY2Fscz4uZiciLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdNQUtFX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMiwgYXJnPTksIGFyZ3ZhbD05LCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0nJywgYXJncmVwcj0iJyciLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTElTVCcsIG9wY29kZT0xMDMsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTUFQJywgb3Bjb2RlPTEwNSwgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0nSGVsbG8gd29ybGQhJywgYXJncmVwcj0iJ0hlbGxvIHdvcmxkISciLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTcsIGFyZ3ZhbD03LCBhcmdyZXByPSc3IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAogXQogCiBleHBlY3RlZF9vcGluZm9fZiA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEsIGFyZ3ZhbD01LCBhcmdyZXByPSc1Jywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTMsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0wLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz00LCBhcmd2YWw9NCwgYXJncmVwcj0nJywgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9Y29kZV9vYmplY3RfaW5uZXIsIGFyZ3JlcHI9cmVwcihjb2RlX29iamVjdF9pbm5lciksIG9mZnNldD0yMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdvdXRlci48bG9jYWxzPi5mLjxsb2NhbHM+LmlubmVyJywgYXJncmVwcj0iJ291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInIiwgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTUFLRV9DTE9TVVJFJywgb3Bjb2RlPTEzNCwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0zMywgc3RhcnRzX2xpbmU9NSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0zOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD00Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD00NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JzQgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD01Miwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0oNSwgNiksIGFyZ3JlcHI9Jyg1LCA2KScsIG9mZnNldD0wLCBzdGFydHNfbGluZT0zLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTIsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0zLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTQsIGFyZ3ZhbD00LCBhcmdyZXByPScnLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9pbm5lciwgYXJncmVwcj1yZXByKGNvZGVfb2JqZWN0X2lubmVyKSwgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInLCBhcmdyZXByPSInb3V0ZXIuPGxvY2Fscz4uZi48bG9jYWxzPi5pbm5lciciLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdNQUtFX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMiwgYXJnPTksIGFyZ3ZhbD05LCBhcmdyZXByPScnLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0yMCwgc3RhcnRzX2xpbmU9NSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0yNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD0yNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JzQgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2lubmVyID0gWwogICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0wLCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0zLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0nZScsIGFyZ3JlcHI9J2UnLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MSwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NiwgYXJndmFsPTYsIGFyZ3JlcHI9JzYgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2UnLCBhcmdyZXByPSdlJywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTEsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTYsIGFyZ3ZhbD02LCBhcmdyZXByPSc2IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKIGV4cGVjdGVkX29waW5mb19qdW1weSA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTY4LCBhcmd2YWw9NzEsIGFyZ3JlcHI9J3RvIDcxJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3JhbmdlJywgYXJncmVwcj0ncmFuZ2UnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MSwgYXJndmFsPTEwLCBhcmdyZXByPScxMCcsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nR0VUX0lURVInLCBvcGNvZGU9NjgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRk9SX0lURVInLCBvcGNvZGU9OTMsIGFyZz00NCwgYXJndmFsPTYwLCBhcmdyZXByPSd0byA2MCcsIG9mZnNldD0xMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE5LCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTI1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTI5LCBzdGFydHNfbGluZT01LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MCwgYXJndmFsPSc8JywgYXJncmVwcj0nPCcsIG9mZnNldD0zNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTQ0LCBhcmd2YWw9NDQsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9MTMsIGFyZ3ZhbD0xMywgYXJncmVwcj0nJywgb2Zmc2V0PTQxLCBzdGFydHNfbGluZT02LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NDQsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9NDcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTQsIGFyZ3ZhbD0nPicsIGFyZ3JlcHI9Jz4nLCBvZmZzZXQ9NTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCUkVBS19MT09QJywgb3Bjb2RlPTgwLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01Niwgc3RhcnRzX2xpbmU9OCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9MTMsIGFyZ3ZhbD0xMywgYXJncmVwcj0nJywgb2Zmc2V0PTU3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD02MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTYxLCBzdGFydHNfbGluZT0xMCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdJIGNhbiBoYXogZWxzZSBjbGF1c2U/JywgYXJncmVwcj0iJ0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nIiwgb2Zmc2V0PTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD02Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTY4LCBhcmd2YWw9MTQyLCBhcmdyZXByPSd0byAxNDInLCBvZmZzZXQ9NzEsIHN0YXJ0c19saW5lPTExLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD03NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTMxLCBhcmd2YWw9MTMxLCBhcmdyZXByPScnLCBvZmZzZXQ9NzcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9ODAsIHN0YXJ0c19saW5lPTEyLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9ODMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTg2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD04OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTkwLCBzdGFydHNfbGluZT0xMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9OTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdJTlBMQUNFX1NVQlRSQUNUJywgb3Bjb2RlPTU2LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD05Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD05Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTEwMCwgc3RhcnRzX2xpbmU9MTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTEwMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD0xMDYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMTUsIGFyZ3ZhbD0xMTUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMDksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTc0LCBhcmd2YWw9NzQsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTIsIHN0YXJ0c19saW5lPTE1LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTE1LCBzdGFydHNfbGluZT0xNiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0xMTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTAsIGFyZ3ZhbD0nPCcsIGFyZ3JlcHI9JzwnLCBvZmZzZXQ9MTIxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTEyNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyNywgc3RhcnRzX2xpbmU9MTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTc0LCBhcmd2YWw9NzQsIGFyZ3JlcHI9JycsIG9mZnNldD0xMjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTEzMiwgc3RhcnRzX2xpbmU9MTksIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0nV2hvIGxldCBsb2xjYXR6IGludG8gdGhpcyB0ZXN0IHN1aXRlPycsIGFyZ3JlcHI9IidXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JyIsIG9mZnNldD0xMzUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTEzOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfRklOQUxMWScsIG9wY29kZT0xMjIsIGFyZz03MywgYXJndmFsPTIxOCwgYXJncmVwcj0ndG8gMjE4Jywgb2Zmc2V0PTE0Miwgc3RhcnRzX2xpbmU9MjAsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0VYQ0VQVCcsIG9wY29kZT0xMjEsIGFyZz0xMiwgYXJndmFsPTE2MCwgYXJncmVwcj0ndG8gMTYwJywgb2Zmc2V0PTE0NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9MTQ4LCBzdGFydHNfbGluZT0yMSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NywgYXJndmFsPTAsIGFyZ3JlcHI9JzAnLCBvZmZzZXQ9MTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQklOQVJZX1RSVUVfRElWSURFJywgb3Bjb2RlPTI3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTU2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI4LCBhcmd2YWw9MTg4LCBhcmdyZXByPSd0byAxODgnLCBvZmZzZXQ9MTU3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRFVQX1RPUCcsIG9wY29kZT00LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjAsIHN0YXJ0c19saW5lPTIyLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0yLCBhcmd2YWw9J1plcm9EaXZpc2lvbkVycm9yJywgYXJncmVwcj0nWmVyb0RpdmlzaW9uRXJyb3InLCBvZmZzZXQ9MTYxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0xMCwgYXJndmFsPSdleGNlcHRpb24gbWF0Y2gnLCBhcmdyZXByPSdleGNlcHRpb24gbWF0Y2gnLCBvZmZzZXQ9MTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTg3LCBhcmd2YWw9MTg3LCBhcmdyZXByPScnLCBvZmZzZXQ9MTY3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE3Mywgc3RhcnRzX2xpbmU9MjMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTgsIGFyZ3ZhbD0nSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLicsIGFyZ3JlcHI9IidIZXJlIHdlIGdvLCBoZXJlIHdlIGdvLCBoZXJlIHdlIGdvLi4uJyIsIG9mZnNldD0xNzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE3OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTgyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0VYQ0VQVCcsIG9wY29kZT04OSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTgzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI3LCBhcmd2YWw9MjE0LCBhcmdyZXByPSd0byAyMTQnLCBvZmZzZXQ9MTg0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTg4LCBzdGFydHNfbGluZT0yNSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfV0lUSCcsIG9wY29kZT0xNDMsIGFyZz0xNywgYXJndmFsPTIxMSwgYXJncmVwcj0ndG8gMjExJywgb2Zmc2V0PTE5MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MSwgYXJndmFsPSdkb2RneScsIGFyZ3JlcHI9J2RvZGd5Jywgb2Zmc2V0PTE5NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xOTcsIHN0YXJ0c19saW5lPTI2LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz05LCBhcmd2YWw9J05ldmVyIHJlYWNoIHRoaXMnLCBhcmdyZXByPSInTmV2ZXIgcmVhY2ggdGhpcyciLCBvZmZzZXQ9MjAwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0yMDMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjA3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yMDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfU1RBUlQnLCBvcGNvZGU9ODEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIxMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nV0lUSF9DTEVBTlVQX0ZJTklTSCcsIG9wY29kZT04MiwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIxMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTIxNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0yMTgsIHN0YXJ0c19saW5lPTI4LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEwLCBhcmd2YWw9Ik9LLCBub3cgd2UncmUgZG9uZSIsIGFyZ3JlcHI9JyJPSywgbm93IHdlXCdyZSBkb25lIicsIG9mZnNldD0yMjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTIyNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjI3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MjI5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTUyLCBhcmd2YWw9NTQsIGFyZ3JlcHI9J3RvIDU0Jywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3JhbmdlJywgYXJncmVwcj0ncmFuZ2UnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MSwgYXJndmFsPTEwLCBhcmdyZXByPScxMCcsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nR0VUX0lURVInLCBvcGNvZGU9NjgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdGT1JfSVRFUicsIG9wY29kZT05MywgYXJnPTMyLCBhcmd2YWw9NDQsIGFyZ3JlcHI9J3RvIDQ0Jywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MzIsIGFyZ3ZhbD0zMiwgYXJncmVwcj0nJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTEwLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQwLCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9NDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQ0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NDYsIHN0YXJ0c19saW5lPTEwLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nLCBhcmdyZXByPSInSSBjYW4gaGF6IGVsc2UgY2xhdXNlPyciLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTUwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NTIsIGFyZ3ZhbD0xMDgsIGFyZ3JlcHI9J3RvIDEwOCcsIG9mZnNldD01NCwgc3RhcnRzX2xpbmU9MTEsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTU2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz05OCwgYXJndmFsPTk4LCBhcmdyZXByPScnLCBvZmZzZXQ9NTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NjAsIHN0YXJ0c19saW5lPTEyLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD02Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTY4LCBzdGFydHNfbGluZT0xMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9NzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdJTlBMQUNFX1NVQlRSQUNUJywgb3Bjb2RlPTU2LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD03Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD03NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTc2LCBzdGFydHNfbGluZT0xNCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9NzgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTQsIGFyZ3ZhbD0nPicsIGFyZ3JlcHI9Jz4nLCBvZmZzZXQ9ODAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz04NiwgYXJndmFsPTg2LCBhcmdyZXByPScnLCBvZmZzZXQ9ODIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTU2LCBhcmd2YWw9NTYsIGFyZ3JlcHI9JycsIG9mZnNldD04NCwgc3RhcnRzX2xpbmU9MTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD04Niwgc3RhcnRzX2xpbmU9MTYsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MiwgYXJndmFsPTQsIGFyZ3JlcHI9JzQnLCBvZmZzZXQ9ODgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTAsIGFyZ3ZhbD0nPCcsIGFyZ3JlcHI9JzwnLCBvZmZzZXQ9OTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz01NiwgYXJndmFsPTU2LCBhcmdyZXByPScnLCBvZmZzZXQ9OTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCUkVBS19MT09QJywgb3Bjb2RlPTgwLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD05NCwgc3RhcnRzX2xpbmU9MTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTU2LCBhcmd2YWw9NTYsIGFyZ3JlcHI9JycsIG9mZnNldD05Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9OTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xMDAsIHN0YXJ0c19saW5lPTE5LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz02LCBhcmd2YWw9J1dobyBsZXQgbG9sY2F0eiBpbnRvIHRoaXMgdGVzdCBzdWl0ZT8nLCBhcmdyZXByPSInV2hvIGxldCBsb2xjYXR6IGludG8gdGhpcyB0ZXN0IHN1aXRlPyciLCBvZmZzZXQ9MTAyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xMDQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0ZJTkFMTFknLCBvcGNvZGU9MTIyLCBhcmc9NzAsIGFyZ3ZhbD0xODAsIGFyZ3JlcHI9J3RvIDE4MCcsIG9mZnNldD0xMDgsIHN0YXJ0c19saW5lPTIwLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9FWENFUFQnLCBvcGNvZGU9MTIxLCBhcmc9MTIsIGFyZ3ZhbD0xMjQsIGFyZ3JlcHI9J3RvIDEyNCcsIG9mZnNldD0xMTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTExMiwgc3RhcnRzX2xpbmU9MjEsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0wLCBhcmdyZXByPScwJywgb2Zmc2V0PTExNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JJTkFSWV9UUlVFX0RJVklERScsIG9wY29kZT0yNywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfRk9SV0FSRCcsIG9wY29kZT0xMTAsIGFyZz0yOCwgYXJndmFsPTE1MiwgYXJncmVwcj0ndG8gMTUyJywgb2Zmc2V0PTEyMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0RVUF9UT1AnLCBvcGNvZGU9NCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTI0LCBzdGFydHNfbGluZT0yMiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MiwgYXJndmFsPSdaZXJvRGl2aXNpb25FcnJvcicsIGFyZ3JlcHI9J1plcm9EaXZpc2lvbkVycm9yJywgb2Zmc2V0PTEyNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MTAsIGFyZ3ZhbD0nZXhjZXB0aW9uIG1hdGNoJywgYXJncmVwcj0nZXhjZXB0aW9uIG1hdGNoJywgb2Zmc2V0PTEyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTE1MCwgYXJndmFsPTE1MCwgYXJncmVwcj0nJywgb2Zmc2V0PTEzMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xMzgsIHN0YXJ0c19saW5lPTIzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz04LCBhcmd2YWw9J0hlcmUgd2UgZ28sIGhlcmUgd2UgZ28sIGhlcmUgd2UgZ28uLi4nLCBhcmdyZXByPSInSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLiciLCBvZmZzZXQ9MTQwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xNDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE0NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9FWENFUFQnLCBvcGNvZGU9ODksIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE0Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfRk9SV0FSRCcsIG9wY29kZT0xMTAsIGFyZz0yNiwgYXJndmFsPTE3NiwgYXJncmVwcj0ndG8gMTc2Jywgb2Zmc2V0PTE0OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTE1Miwgc3RhcnRzX2xpbmU9MjUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX1dJVEgnLCBvcGNvZGU9MTQzLCBhcmc9MTQsIGFyZ3ZhbD0xNzAsIGFyZ3JlcHI9J3RvIDE3MCcsIG9mZnNldD0xNTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTEsIGFyZ3ZhbD0nZG9kZ3knLCBhcmdyZXByPSdkb2RneScsIG9mZnNldD0xNTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTU4LCBzdGFydHNfbGluZT0yNiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OSwgYXJndmFsPSdOZXZlciByZWFjaCB0aGlzJywgYXJncmVwcj0iJ05ldmVyIHJlYWNoIHRoaXMnIiwgb2Zmc2V0PTE2MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTYyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTY4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nV0lUSF9DTEVBTlVQX1NUQVJUJywgb3Bjb2RlPTgxLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1dJVEhfQ0xFQU5VUF9GSU5JU0gnLCBvcGNvZGU9ODIsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0xNzgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTgwLCBzdGFydHNfbGluZT0yOCwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xMCwgYXJndmFsPSJPSywgbm93IHdlJ3JlIGRvbmUiLCBhcmdyZXByPSciT0ssIG5vdyB3ZVwncmUgZG9uZSInLCBvZmZzZXQ9MTgyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xODQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTE5MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTkyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKICMgT25lIGxhc3QgcGllY2Ugb2YgaW5zcGVjdCBmb2RkZXIgdG8gY2hlY2sgdGhlIGRlZmF1bHQgbGluZSBudW1iZXIgaGFuZGxpbmcKIGRlZiBzaW1wbGUoKTogcGFzcwogZXhwZWN0ZWRfb3BpbmZvX3NpbXBsZSA9IFsKICAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPXNpbXBsZS5fX2NvZGVfXy5jb19maXJzdGxpbmVubywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSkKIF0KIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggMzMxNjNiOS4uYTk1MjBhNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMTg3Niw3ICsxODc2LDYgQEAKICAgICAgICAgVG8gZGVtb25zdHJhdGUgdGhpcywgd2UnbGwgY3JlYXRlIGEgZmFrZSBzdGFuZGFyZCBpbnB1dCB0aGF0CiAgICAgICAgIGNhcHR1cmVzIG91ciBkZWJ1Z2dlciBpbnB1dDoKIAotICAgICAgICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKICAgICAgICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgogICAgICAgICAgID4+PiBzeXMuc3RkaW4gPSBfRmFrZUlucHV0KFsKICAgICAgICAgICAuLi4gICAgJ3ByaW50KHgpJywgICMgcHJpbnQgZGF0YSBkZWZpbmVkIGJ5IHRoZSBleGFtcGxlCkBAIC0xOTE3LDcgKzE5MTYsNyBAQAogICAgICAgICAgIC4uLiBmaW5hbGx5OgogICAgICAgICAgIC4uLiAgICAgc3lzLnN0ZGluID0gcmVhbF9zdGRpbgogICAgICAgICAgIC0tUmV0dXJuLS0KLSAgICAgICAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZVs4XT4oMyljYWxsc19zZXRfdHJhY2UoKS0+Tm9uZQorICAgICAgICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlWzddPigzKWNhbGxzX3NldF90cmFjZSgpLT5Ob25lCiAgICAgICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgKFBkYikgcHJpbnQoeSkKICAgICAgICAgICAyCkBAIC0yNzk4LDcgKzI3OTcsNiBAQAogICAgIC4uLiAgICAgICAgIF8gPSBmLndyaXRlKCIgICAgICAgJ2FiYyBkZWYnXG4iKQogICAgIC4uLiAgICAgICAgIF8gPSBmLndyaXRlKCJcbiIpCiAgICAgLi4uICAgICAgICAgXyA9IGYud3JpdGUoJyAgIFwiXCJcIlxuJykKLSAgICAuLi4gICAgIGltcG9ydCBzaHV0aWwKICAgICAuLi4gICAgIHJjMSwgb3V0MSwgZXJyMSA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKAogICAgIC4uLiAgICAgICAgICAgICAnLW0nLCAnZG9jdGVzdCcsIGZuLCBmbjIpCiAgICAgLi4uICAgICByYzIsIG91dDIsIGVycjIgPSBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soCkBAIC0yOTQyLDEyICsyOTQwLDExIEBACiBkZWYgdGVzdF9tYWluKCk6CiAgICAgIyBDaGVjayB0aGUgZG9jdGVzdCBjYXNlcyBpbiBkb2N0ZXN0IGl0c2VsZjoKICAgICByZXQgPSBzdXBwb3J0LnJ1bl9kb2N0ZXN0KGRvY3Rlc3QsIHZlcmJvc2l0eT1UcnVlKQorCiAgICAgIyBDaGVjayB0aGUgZG9jdGVzdCBjYXNlcyBkZWZpbmVkIGhlcmU6CiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RvY3Rlc3QKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCiAKLWltcG9ydCBzeXMsIHJlLCBpbwotCiBkZWYgdGVzdF9jb3ZlcmFnZShjb3ZlcmRpcik6CiAgICAgdHJhY2UgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RyYWNlJykKICAgICB0cmFjZXIgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMuYmFzZV9wcmVmaXgsIHN5cy5iYXNlX2V4ZWNfcHJlZml4LF0sCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2R5bmFtaWMucHkgYi9MaWIvdGVzdC90ZXN0X2R5bmFtaWMucHkKaW5kZXggNTA4MGVjOS4uM2FlMDkwZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9keW5hbWljLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weQpAQCAtMSw3ICsxLDYgQEAKICMgVGVzdCB0aGUgbW9zdCBkeW5hbWljIGNvcm5lciBjYXNlcyBvZiBQeXRob24ncyBydW50aW1lIHNlbWFudGljcy4KIAogaW1wb3J0IGJ1aWx0aW5zCi1pbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IHVuaXR0ZXN0CiAKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBzd2FwX2l0ZW0sIHN3YXBfYXR0cgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9laW50ci5weSBiL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKaW5kZXggYWFiYWQ4My4uMjVmODZkMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9laW50ci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CkBAIC0xLDcgKzEsNSBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc2lnbmFsCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydApAQCAtMTYsMTQgKzE0LDggQEAKICAgICAgICAgIyBSdW4gdGhlIHRlc3RlciBpbiBhIHN1Yi1wcm9jZXNzLCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUKICAgICAgICAgIyB0aHJlYWQgKGZvciByZWxpYWJsZSBzaWduYWwgZGVsaXZlcnkpLgogICAgICAgICB0ZXN0ZXIgPSBzdXBwb3J0LmZpbmRmaWxlKCJlaW50cl90ZXN0ZXIucHkiLCBzdWJkaXI9ImVpbnRyZGF0YSIpCi0KLSAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgdGVzdGVyXQotICAgICAgICAgICAgd2l0aCBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MpIGFzIHByb2M6Ci0gICAgICAgICAgICAgICAgZXhpdGNvZGUgPSBwcm9jLndhaXQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGl0Y29kZSwgMCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vayh0ZXN0ZXIpCisgICAgICAgICMgdXNlIC11IHRvIHRyeSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IGlmIHRoZSB0ZXN0IGhhbmdzIG9yIGNyYXNoCisgICAgICAgIHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vaygiLXUiLCB0ZXN0ZXIpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvX19pbml0X18ucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL19faW5pdF9fLnB5CmluZGV4IGQyZjdkMzEuLjE2MDAxNTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weQpAQCAtMSw1ICsxLDQgQEAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBlbWFpbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2FzaWFuX2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9hc2lhbl9jb2RlY3MucHkKaW5kZXggZjljZDdkOS4uMWUwY2FlZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2FzaWFuX2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5CkBAIC0zLDcgKzMsNiBAQAogIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCiAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIHRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQogZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZW1haWwucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZW1haWwucHkKaW5kZXggOTBmZDllMS4uOGFhY2EwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2VtYWlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weQpAQCAtNzIzLDEyICs3MjMsMTIgQEAKIAogICAgICMgSXNzdWUgNTg3MTogcmVqZWN0IGFuIGF0dGVtcHQgdG8gZW1iZWQgYSBoZWFkZXIgaW5zaWRlIGEgaGVhZGVyIHZhbHVlCiAgICAgIyAoaGVhZGVyIGluamVjdGlvbiBhdHRhY2spLgotICAgIGRlZiB0ZXN0X2VtYmVkZWRfaGVhZGVyX3ZpYV9IZWFkZXJfcmVqZWN0ZWQoc2VsZik6CisgICAgZGVmIHRlc3RfZW1iZWRkZWRfaGVhZGVyX3ZpYV9IZWFkZXJfcmVqZWN0ZWQoc2VsZik6CiAgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQogICAgICAgICBtc2dbJ0R1bW15J10gPSBIZWFkZXIoJ2R1bW15XG5YLUluamVjdGVkLUhlYWRlcjogdGVzdCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBtc2cuYXNfc3RyaW5nKQogCi0gICAgZGVmIHRlc3RfZW1iZWRlZF9oZWFkZXJfdmlhX3N0cmluZ19yZWplY3RlZChzZWxmKToKKyAgICBkZWYgdGVzdF9lbWJlZGRlZF9oZWFkZXJfdmlhX3N0cmluZ19yZWplY3RlZChzZWxmKToKICAgICAgICAgbXNnID0gTWVzc2FnZSgpCiAgICAgICAgIG1zZ1snRHVtbXknXSA9ICdkdW1teVxuWC1JbmplY3RlZC1IZWFkZXI6IHRlc3QnCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBtc2cuYXNfc3RyaW5nKQpAQCAtMzQyMSw3ICszNDIxLDYgQEAKIGNsYXNzIFRlc3RGZWVkUGFyc2VycyhUZXN0RW1haWxCYXNlKToKIAogICAgIGRlZiBwYXJzZShzZWxmLCBjaHVua3MpOgotICAgICAgICBmcm9tIGVtYWlsLmZlZWRwYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKICAgICAgICAgZmVlZHBhcnNlciA9IEZlZWRQYXJzZXIoKQogICAgICAgICBmb3IgY2h1bmsgaW4gY2h1bmtzOgogICAgICAgICAgICAgZmVlZHBhcnNlci5mZWVkKGNodW5rKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2dlbmVyYXRvci5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9nZW5lcmF0b3IucHkKaW5kZXggYjFjYmNlMi4uN2M4ODc3ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2dlbmVyYXRvci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZ2VuZXJhdG9yLnB5CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBkZWYgdGVzdF9zZXRfbWFuZ2xlX2Zyb21fdmlhX3BvbGljeShzZWxmKToKICAgICAgICAgc291cmNlID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKICAgICAgICAgICAgIFN1YmplY3Q6IHRlc3QgdGhhdAotICAgICAgICAgICAgIGZyb20gaXMgbWFuZ2VsZCBpbiB0aGUgYm9keSEKKyAgICAgICAgICAgICBmcm9tIGlzIG1hbmdsZWQgaW4gdGhlIGJvZHkhCiAKICAgICAgICAgICAgIEZyb20gdGltZSB0byB0aW1lIEkgd3JpdGUgYSByaHltZS4KICAgICAgICAgICAgICIiIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9oZWFkZXJyZWdpc3RyeS5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9oZWFkZXJyZWdpc3RyeS5weQppbmRleCA1NWVjZGVhLi5hZjgzNmRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2hlYWRlcnJlZ2lzdHJ5LnB5CkBAIC0xLDcgKzEsNiBAQAogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHR5cGVzCiBmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKIGZyb20gZW1haWwgaW1wb3J0IHBvbGljeQogZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VudW0ucHkgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKaW5kZXggNjMwYjE1NS4uNjk4ZmQzMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW51bS5weQpAQCAtMyw5ICszLDEwIEBACiBpbXBvcnQgcHlkb2MKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKLWZyb20gZW51bSBpbXBvcnQgRW51bSwgSW50RW51bSwgRW51bU1ldGEsIHVuaXF1ZQorZnJvbSBlbnVtIGltcG9ydCBFbnVtLCBJbnRFbnVtLCBFbnVtTWV0YSwgRmxhZywgSW50RmxhZywgdW5pcXVlCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogZnJvbSBwaWNrbGUgaW1wb3J0IGR1bXBzLCBsb2FkcywgUGlja2xpbmdFcnJvciwgSElHSEVTVF9QUk9UT0NPTAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKICMgZm9yIHBpY2tsZSB0ZXN0cwogdHJ5OgpAQCAtMzIsNiArMzMsMTQgQEAKIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgIEZsb2F0U3Rvb2dlcyA9IGV4YwogCit0cnk6CisgICAgY2xhc3MgRmxhZ1N0b29nZXMoRmxhZyk6CisgICAgICAgIExBUlJZID0gMQorICAgICAgICBDVVJMWSA9IDIKKyAgICAgICAgTU9FID0gMworZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgRmxhZ1N0b29nZXMgPSBleGMKKwogIyBmb3IgcGlja2xlIHRlc3QgYW5kIHN1YmNsYXNzIHRlc3RzCiB0cnk6CiAgICAgY2xhc3MgU3RyRW51bShzdHIsIEVudW0pOgpAQCAtMjgzLDYgKzI5MiwyOCBAQAogICAgICAgICAgICAgY2xhc3MgV3JvbmcoRW51bSk6CiAgICAgICAgICAgICAgICAgX2FueV9uYW1lXyA9IDkKIAorICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgICMgcGxhaW4gRW51bSBtZW1iZXJzIGFyZSBhbHdheXMgVHJ1ZQorICAgICAgICBjbGFzcyBMb2dpYyhFbnVtKToKKyAgICAgICAgICAgIHRydWUgPSBUcnVlCisgICAgICAgICAgICBmYWxzZSA9IEZhbHNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTG9naWMuZmFsc2UpCisgICAgICAgICMgdW5sZXNzIG92ZXJyaWRkZW4KKyAgICAgICAgY2xhc3MgUmVhbExvZ2ljKEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IFRydWUKKyAgICAgICAgICAgIGZhbHNlID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92YWx1ZV8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShSZWFsTG9naWMudHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShSZWFsTG9naWMuZmFsc2UpCisgICAgICAgICMgbWl4ZWQgRW51bXMgZGVwZW5kIG9uIG1peGVkLWluIHR5cGUKKyAgICAgICAgY2xhc3MgSW50TG9naWMoaW50LCBFbnVtKToKKyAgICAgICAgICAgIHRydWUgPSAxCisgICAgICAgICAgICBmYWxzZSA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEludExvZ2ljLnRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoSW50TG9naWMuZmFsc2UpCisKICAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKICAgICAgICAgU2Vhc29uID0gc2VsZi5TZWFzb24KICAgICAgICAgc2VsZi5hc3NlcnRJbihTZWFzb24uQVVUVU1OLCBTZWFzb24pCkBAIC0xNTQ4LDYgKzE1NzksNTgwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTGFiZWxsZWRMaXN0KDEpLCBMYWJlbGxlZExpc3QudW5wcm9jZXNzZWQpCiAKIAorY2xhc3MgVGVzdE9yZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NhbWVfbWVtYmVycyhzZWxmKToKKyAgICAgICAgY2xhc3MgQ29sb3IoRW51bSk6CisgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlJworICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgZ3JlZW4gPSAyCisgICAgICAgICAgICBibHVlID0gMworCisgICAgZGVmIHRlc3Rfc2FtZV9tZW1iZXJzX3dpdGhfYWxpYXNlcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQ29sb3IoRW51bSk6CisgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlJworICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgZ3JlZW4gPSAyCisgICAgICAgICAgICBibHVlID0gMworICAgICAgICAgICAgdmVyZGUgPSBncmVlbgorCisgICAgZGVmIHRlc3Rfc2FtZV9tZW1iZXJzX3dyb25nX29yZGVyKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnbWVtYmVyIG9yZGVyIGRvZXMgbm90IG1hdGNoIF9vcmRlcl8nKToKKyAgICAgICAgICAgIGNsYXNzIENvbG9yKEVudW0pOgorICAgICAgICAgICAgICAgIF9vcmRlcl8gPSAncmVkIGdyZWVuIGJsdWUnCisgICAgICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgICAgIGJsdWUgPSAzCisgICAgICAgICAgICAgICAgZ3JlZW4gPSAyCisKKyAgICBkZWYgdGVzdF9vcmRlcl9oYXNfZXh0cmFfbWVtYmVycyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ21lbWJlciBvcmRlciBkb2VzIG5vdCBtYXRjaCBfb3JkZXJfJyk6CisgICAgICAgICAgICBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlIHB1cnBsZScKKyAgICAgICAgICAgICAgICByZWQgPSAxCisgICAgICAgICAgICAgICAgZ3JlZW4gPSAyCisgICAgICAgICAgICAgICAgYmx1ZSA9IDMKKworICAgIGRlZiB0ZXN0X29yZGVyX2hhc19leHRyYV9tZW1iZXJzX3dpdGhfYWxpYXNlcyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ21lbWJlciBvcmRlciBkb2VzIG5vdCBtYXRjaCBfb3JkZXJfJyk6CisgICAgICAgICAgICBjbGFzcyBDb2xvcihFbnVtKToKKyAgICAgICAgICAgICAgICBfb3JkZXJfID0gJ3JlZCBncmVlbiBibHVlIHB1cnBsZScKKyAgICAgICAgICAgICAgICByZWQgPSAxCisgICAgICAgICAgICAgICAgZ3JlZW4gPSAyCisgICAgICAgICAgICAgICAgYmx1ZSA9IDMKKyAgICAgICAgICAgICAgICB2ZXJkZSA9IGdyZWVuCisKKyAgICBkZWYgdGVzdF9lbnVtX2hhc19leHRyYV9tZW1iZXJzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnbWVtYmVyIG9yZGVyIGRvZXMgbm90IG1hdGNoIF9vcmRlcl8nKToKKyAgICAgICAgICAgIGNsYXNzIENvbG9yKEVudW0pOgorICAgICAgICAgICAgICAgIF9vcmRlcl8gPSAncmVkIGdyZWVuIGJsdWUnCisgICAgICAgICAgICAgICAgcmVkID0gMQorICAgICAgICAgICAgICAgIGdyZWVuID0gMgorICAgICAgICAgICAgICAgIGJsdWUgPSAzCisgICAgICAgICAgICAgICAgcHVycGxlID0gNAorCisgICAgZGVmIHRlc3RfZW51bV9oYXNfZXh0cmFfbWVtYmVyc193aXRoX2FsaWFzZXMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdtZW1iZXIgb3JkZXIgZG9lcyBub3QgbWF0Y2ggX29yZGVyXycpOgorICAgICAgICAgICAgY2xhc3MgQ29sb3IoRW51bSk6CisgICAgICAgICAgICAgICAgX29yZGVyXyA9ICdyZWQgZ3JlZW4gYmx1ZScKKyAgICAgICAgICAgICAgICByZWQgPSAxCisgICAgICAgICAgICAgICAgZ3JlZW4gPSAyCisgICAgICAgICAgICAgICAgYmx1ZSA9IDMKKyAgICAgICAgICAgICAgICBwdXJwbGUgPSA0CisgICAgICAgICAgICAgICAgdmVyZGUgPSBncmVlbgorCisKK2NsYXNzIFRlc3RGbGFnKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBvZiB0aGUgRmxhZ3MuIiIiCisKKyAgICBjbGFzcyBQZXJtKEZsYWcpOgorICAgICAgICBSLCBXLCBYID0gNCwgMiwgMQorCisgICAgY2xhc3MgT3BlbihGbGFnKToKKyAgICAgICAgUk8gPSAwCisgICAgICAgIFdPID0gMQorICAgICAgICBSVyA9IDIKKyAgICAgICAgQUMgPSAzCisgICAgICAgIENFID0gMTw8MTkKKworICAgIGRlZiB0ZXN0X3N0cihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIpLCAnUGVybS5SJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5XKSwgJ1Blcm0uVycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uWCksICdQZXJtLlgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIgfCBQZXJtLlcpLCAnUGVybS5SfFcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpLCAnUGVybS5SfFd8WCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0oMCkpLCAnUGVybS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoflBlcm0uUiksICdQZXJtLld8WCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5QZXJtLlcpLCAnUGVybS5SfFgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+UGVybS5YKSwgJ1Blcm0uUnxXJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihQZXJtLlIgfCBQZXJtLlcpKSwgJ1Blcm0uWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oUGVybS5SIHwgUGVybS5XIHwgUGVybS5YKSksICdQZXJtLjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtKH4wKSksICdQZXJtLlJ8V3xYJykKKworICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4uUk8pLCAnT3Blbi5STycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4uV08pLCAnT3Blbi5XTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4uQUMpLCAnT3Blbi5BQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4uUk8gfCBPcGVuLkNFKSwgJ09wZW4uQ0UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLldPIHwgT3Blbi5DRSksICdPcGVuLkNFfFdPJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofk9wZW4uUk8pLCAnT3Blbi5DRXxBQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5PcGVuLldPKSwgJ09wZW4uQ0V8UlcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+T3Blbi5BQyksICdPcGVuLkNFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihPcGVuLlJPIHwgT3Blbi5DRSkpLCAnT3Blbi5BQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH4oT3Blbi5XTyB8IE9wZW4uQ0UpKSwgJ09wZW4uUlcnKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5SKSwgJzxQZXJtLlI6IDQ+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uVyksICc8UGVybS5XOiAyPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlgpLCAnPFBlcm0uWDogMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5SIHwgUGVybS5XKSwgJzxQZXJtLlJ8VzogNj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5SIHwgUGVybS5XIHwgUGVybS5YKSwgJzxQZXJtLlJ8V3xYOiA3PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtKDApKSwgJzxQZXJtLjA6IDA+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5QZXJtLlIpLCAnPFBlcm0uV3xYOiAzPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+UGVybS5XKSwgJzxQZXJtLlJ8WDogNT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoflBlcm0uWCksICc8UGVybS5SfFc6IDY+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH4oUGVybS5SIHwgUGVybS5XKSksICc8UGVybS5YOiAxPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCkpLCAnPFBlcm0uMDogMD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybSh+MCkpLCAnPFBlcm0uUnxXfFg6IDc+JykKKworICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuLlJPKSwgJzxPcGVuLlJPOiAwPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuLldPKSwgJzxPcGVuLldPOiAxPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuLkFDKSwgJzxPcGVuLkFDOiAzPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuLlJPIHwgT3Blbi5DRSksICc8T3Blbi5DRTogNTI0Mjg4PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuLldPIHwgT3Blbi5DRSksICc8T3Blbi5DRXxXTzogNTI0Mjg5PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+T3Blbi5STyksICc8T3Blbi5DRXxBQzogNTI0MjkxPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+T3Blbi5XTyksICc8T3Blbi5DRXxSVzogNTI0MjkwPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+T3Blbi5BQyksICc8T3Blbi5DRTogNTI0Mjg4PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KE9wZW4uUk8gfCBPcGVuLkNFKSksICc8T3Blbi5BQzogMz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihPcGVuLldPIHwgT3Blbi5DRSkpLCAnPE9wZW4uUlc6IDI+JykKKworICAgIGRlZiB0ZXN0X29yKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBmb3IgaiBpbiBQZXJtOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgfCBqKSwgUGVybShpLnZhbHVlIHwgai52YWx1ZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSB8IGopLnZhbHVlLCBpLnZhbHVlIHwgai52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSB8IGopLCBQZXJtKQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpIHwgaSwgaSkKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydElzKE9wZW4uUk8gfCBPcGVuLkNFLCBPcGVuLkNFKQorCisgICAgZGVmIHRlc3RfYW5kKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIFJXID0gUGVybS5SIHwgUGVybS5XCisgICAgICAgIFJYID0gUGVybS5SIHwgUGVybS5YCisgICAgICAgIFdYID0gUGVybS5XIHwgUGVybS5YCisgICAgICAgIFJXWCA9IFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICB2YWx1ZXMgPSBsaXN0KFBlcm0pICsgW1JXLCBSWCwgV1gsIFJXWCwgUGVybSgwKV0KKyAgICAgICAgZm9yIGkgaW4gdmFsdWVzOgorICAgICAgICAgICAgZm9yIGogaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgJiBqKS52YWx1ZSwgaS52YWx1ZSAmIGoudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGkgJiBqKSwgUGVybSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSAmIGksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgJiBSV1gsIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKFJXWCAmIGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPICYgT3Blbi5DRSwgT3Blbi5STykKKworICAgIGRlZiB0ZXN0X3hvcihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgZm9yIGogaW4gUGVybToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpIF4gaikudmFsdWUsIGkudmFsdWUgXiBqLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpIF4gaiksIFBlcm0pCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgXiBQZXJtKDApLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhQZXJtKDApIF4gaSwgaSkKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydElzKE9wZW4uUk8gXiBPcGVuLkNFLCBPcGVuLkNFKQorICAgICAgICBzZWxmLmFzc2VydElzKE9wZW4uQ0UgXiBPcGVuLkNFLCBPcGVuLlJPKQorCisgICAgZGVmIHRlc3RfaW52ZXJ0KHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIFJXID0gUGVybS5SIHwgUGVybS5XCisgICAgICAgIFJYID0gUGVybS5SIHwgUGVybS5YCisgICAgICAgIFdYID0gUGVybS5XIHwgUGVybS5YCisgICAgICAgIFJXWCA9IFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICB2YWx1ZXMgPSBsaXN0KFBlcm0pICsgW1JXLCBSWCwgV1gsIFJXWCwgUGVybSgwKV0KKyAgICAgICAgZm9yIGkgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKH5pKSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwofn5pLCBpKQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh+fmksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLldPICYgfk9wZW4uV08sIE9wZW4uUk8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoKE9wZW4uV098T3Blbi5DRSkgJiB+T3Blbi5XTywgT3Blbi5DRSkKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgZm9yIGYgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIGZvciBmIGluIE9wZW46CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woZi52YWx1ZSksIGJvb2woZikpCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmcoc2VsZik6CisgICAgICAgIFBlcm0gPSBGbGFnKCdQZXJtJywgJ1IgVyBYJykKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDxpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworICAgIGRlZiB0ZXN0X3Byb2dyYW1hdGljX2Z1bmN0aW9uX3N0cmluZ193aXRoX3N0YXJ0KHNlbGYpOgorICAgICAgICBQZXJtID0gRmxhZygnUGVybScsICdSIFcgWCcsIHN0YXJ0PTgpCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gODw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmdfbGlzdChzZWxmKToKKyAgICAgICAgUGVybSA9IEZsYWcoJ1Blcm0nLCBbJ1InLCAnVycsICdYJ10pCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gMTw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9pdGVyYWJsZShzZWxmKToKKyAgICAgICAgUGVybSA9IEZsYWcoJ1Blcm0nLCAoKCdSJywgMiksICgnVycsIDgpLCAoJ1gnLCAzMikpKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PCgyKmkrMSkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fZnJvbV9kaWN0KHNlbGYpOgorICAgICAgICBQZXJtID0gRmxhZygnUGVybScsIE9yZGVyZWREaWN0KCgoJ1InLCAyKSwgKCdXJywgOCksICgnWCcsIDMyKSkpKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PCgyKmkrMSkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKEZsYWdTdG9vZ2VzLCBFeGNlcHRpb24pOgorICAgICAgICAgICAgcmFpc2UgRmxhZ1N0b29nZXMKKyAgICAgICAgdGVzdF9waWNrbGVfZHVtcF9sb2FkKHNlbGYuYXNzZXJ0SXMsIEZsYWdTdG9vZ2VzLkNVUkxZfEZsYWdTdG9vZ2VzLk1PRSkKKyAgICAgICAgdGVzdF9waWNrbGVfZHVtcF9sb2FkKHNlbGYuYXNzZXJ0SXMsIEZsYWdTdG9vZ2VzKQorCisKKyAgICBkZWYgdGVzdF9jb250YWlubWVudChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSLCBXLCBYID0gUGVybQorICAgICAgICBSVyA9IFIgfCBXCisgICAgICAgIFJYID0gUiB8IFgKKyAgICAgICAgV1ggPSBXIHwgWAorICAgICAgICBSV1ggPSBSIHwgVyB8IFgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFIgaW4gUlcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShSIGluIFJYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUiBpbiBSV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXIGluIFJXKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVyBpbiBXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFcgaW4gUldYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWCBpbiBSWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFggaW4gV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShYIGluIFJXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShSIGluIFdYKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFcgaW4gUlgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoWCBpbiBSVykKKworY2xhc3MgVGVzdEludEZsYWcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG9mIHRoZSBJbnRGbGFncy4iIiIKKworICAgIGNsYXNzIFBlcm0oSW50RmxhZyk6CisgICAgICAgIFggPSAxIDw8IDAKKyAgICAgICAgVyA9IDEgPDwgMQorICAgICAgICBSID0gMSA8PCAyCisKKyAgICBjbGFzcyBPcGVuKEludEZsYWcpOgorICAgICAgICBSTyA9IDAKKyAgICAgICAgV08gPSAxCisgICAgICAgIFJXID0gMgorICAgICAgICBBQyA9IDMKKyAgICAgICAgQ0UgPSAxPDwxOQorCisgICAgZGVmIHRlc3Rfc3RyKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uUiksICdQZXJtLlInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtLlcpLCAnUGVybS5XJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5YKSwgJ1Blcm0uWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uUiB8IFBlcm0uVyksICdQZXJtLlJ8VycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCksICdQZXJtLlJ8V3xYJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybS5SIHwgOCksICdQZXJtLjh8UicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0oMCkpLCAnUGVybS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoUGVybSg4KSksICdQZXJtLjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+UGVybS5SKSwgJ1Blcm0uV3xYfC04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoflBlcm0uVyksICdQZXJtLlJ8WHwtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKH5QZXJtLlgpLCAnUGVybS5SfFd8LTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+KFBlcm0uUiB8IFBlcm0uVykpLCAnUGVybS5YfC04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgpKSwgJ1Blcm0uLTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih+KFBlcm0uUiB8IDgpKSwgJ1Blcm0uV3xYfC0xNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFBlcm0ofjApKSwgJ1Blcm0uUnxXfFh8LTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihQZXJtKH44KSksICdQZXJtLlJ8V3xYfC0xNicpCisKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLlJPKSwgJ09wZW4uUk8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLldPKSwgJ09wZW4uV08nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLkFDKSwgJ09wZW4uQUMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihPcGVuLlJPIHwgT3Blbi5DRSksICdPcGVuLkNFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbi5XTyB8IE9wZW4uQ0UpLCAnT3Blbi5DRXxXTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE9wZW4oNCkpLCAnT3Blbi40JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofk9wZW4uUk8pLCAnT3Blbi5DRXxBQ3wtNTI0MjkyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofk9wZW4uV08pLCAnT3Blbi5DRXxSV3wtNTI0MjkyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofk9wZW4uQUMpLCAnT3Blbi5DRXwtNTI0MjkyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihPcGVuLlJPIHwgT3Blbi5DRSkpLCAnT3Blbi5BQ3wtNTI0MjkyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIofihPcGVuLldPIHwgT3Blbi5DRSkpLCAnT3Blbi5SV3wtNTI0MjkyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoT3Blbih+NCkpLCAnT3Blbi5DRXxBQ3wtNTI0Mjk2JykKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiksICc8UGVybS5SOiA0PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtLlcpLCAnPFBlcm0uVzogMj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5YKSwgJzxQZXJtLlg6IDE+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiB8IFBlcm0uVyksICc8UGVybS5SfFc6IDY+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCksICc8UGVybS5SfFd8WDogNz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybS5SIHwgOCksICc8UGVybS44fFI6IDEyPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtKDApKSwgJzxQZXJtLjA6IDA+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFBlcm0oOCkpLCAnPFBlcm0uODogOD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoflBlcm0uUiksICc8UGVybS5XfFh8LTg6IC01PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+UGVybS5XKSwgJzxQZXJtLlJ8WHwtODogLTM+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5QZXJtLlgpLCAnPFBlcm0uUnxXfC04OiAtMj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofihQZXJtLlIgfCBQZXJtLlcpKSwgJzxQZXJtLlh8LTg6IC03PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWCkpLCAnPFBlcm0uLTg6IC04PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KFBlcm0uUiB8IDgpKSwgJzxQZXJtLld8WHwtMTY6IC0xMz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoUGVybSh+MCkpLCAnPFBlcm0uUnxXfFh8LTg6IC0xPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihQZXJtKH44KSksICc8UGVybS5SfFd8WHwtMTY6IC05PicpCisKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5STyksICc8T3Blbi5STzogMD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5XTyksICc8T3Blbi5XTzogMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5BQyksICc8T3Blbi5BQzogMz4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5STyB8IE9wZW4uQ0UpLCAnPE9wZW4uQ0U6IDUyNDI4OD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbi5XTyB8IE9wZW4uQ0UpLCAnPE9wZW4uQ0V8V086IDUyNDI4OT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3Blbig0KSksICc8T3Blbi40OiA0PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+T3Blbi5STyksICc8T3Blbi5DRXxBQ3wtNTI0MjkyOiAtMT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIofk9wZW4uV08pLCAnPE9wZW4uQ0V8Uld8LTUyNDI5MjogLTI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKH5PcGVuLkFDKSwgJzxPcGVuLkNFfC01MjQyOTI6IC00PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KE9wZW4uUk8gfCBPcGVuLkNFKSksICc8T3Blbi5BQ3wtNTI0MjkyOiAtNTI0Mjg5PicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih+KE9wZW4uV08gfCBPcGVuLkNFKSksICc8T3Blbi5SV3wtNTI0MjkyOiAtNTI0MjkwPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcGVuKH40KSksICc8T3Blbi5DRXxBQ3wtNTI0Mjk2OiAtNT4nKQorCisgICAgZGVmIHRlc3Rfb3Ioc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIGZvciBqIGluIFBlcm06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpIHwgaiwgaS52YWx1ZSB8IGoudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSB8IGopLnZhbHVlLCBpLnZhbHVlIHwgai52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSB8IGopLCBQZXJtKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoOCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpIHwgaiwgaS52YWx1ZSB8IGopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSB8IGopLnZhbHVlLCBpLnZhbHVlIHwgaikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaSB8IGopLCBQZXJtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiB8IGksIGogfCBpLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGogfCBpKS52YWx1ZSwgaiB8IGkudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGogfCBpKSwgUGVybSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSB8IGksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgfCAwLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygwIHwgaSwgaSkKKyAgICAgICAgT3BlbiA9IHNlbGYuT3BlbgorICAgICAgICBzZWxmLmFzc2VydElzKE9wZW4uUk8gfCBPcGVuLkNFLCBPcGVuLkNFKQorCisgICAgZGVmIHRlc3RfYW5kKHNlbGYpOgorICAgICAgICBQZXJtID0gc2VsZi5QZXJtCisgICAgICAgIFJXID0gUGVybS5SIHwgUGVybS5XCisgICAgICAgIFJYID0gUGVybS5SIHwgUGVybS5YCisgICAgICAgIFdYID0gUGVybS5XIHwgUGVybS5YCisgICAgICAgIFJXWCA9IFBlcm0uUiB8IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICB2YWx1ZXMgPSBsaXN0KFBlcm0pICsgW1JXLCBSWCwgV1gsIFJXWCwgUGVybSgwKV0KKyAgICAgICAgZm9yIGkgaW4gdmFsdWVzOgorICAgICAgICAgICAgZm9yIGogaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSAmIGosIGkudmFsdWUgJiBqLnZhbHVlLCAnaSBpcyAlciwgaiBpcyAlcicgJSAoaSwgaikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSAmIGopLnZhbHVlLCBpLnZhbHVlICYgai52YWx1ZSwgJ2kgaXMgJXIsIGogaXMgJXInICUgKGksIGopKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpICYgaiksIFBlcm0sICdpIGlzICVyLCBqIGlzICVyJyAlIChpLCBqKSkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSAmIGosIGkudmFsdWUgJiBqKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGkgJiBqKS52YWx1ZSwgaS52YWx1ZSAmIGopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGkgJiBqKSwgUGVybSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGogJiBpLCBqICYgaS52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChqICYgaSkudmFsdWUsIGogJiBpLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShqICYgaSksIFBlcm0pCisgICAgICAgIGZvciBpIGluIFBlcm06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGkgJiBpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpICYgNywgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoNyAmIGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPICYgT3Blbi5DRSwgT3Blbi5STykKKworICAgIGRlZiB0ZXN0X3hvcihzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgZm9yIGogaW4gUGVybToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgXiBqLCBpLnZhbHVlIF4gai52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpIF4gaikudmFsdWUsIGkudmFsdWUgXiBqLnZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpIF4gaiksIFBlcm0pCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSg4KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgXiBqLCBpLnZhbHVlIF4gaikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChpIF4gaikudmFsdWUsIGkudmFsdWUgXiBqKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShpIF4gaiksIFBlcm0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqIF4gaSwgaiBeIGkudmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaiBeIGkpLnZhbHVlLCBqIF4gaS52YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoaiBeIGkpLCBQZXJtKQorICAgICAgICBmb3IgaSBpbiBQZXJtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpIF4gMCwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCBeIGksIGkpCisgICAgICAgIE9wZW4gPSBzZWxmLk9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLlJPIF4gT3Blbi5DRSwgT3Blbi5DRSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhPcGVuLkNFIF4gT3Blbi5DRSwgT3Blbi5STykKKworICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSVyA9IFBlcm0uUiB8IFBlcm0uVworICAgICAgICBSWCA9IFBlcm0uUiB8IFBlcm0uWAorICAgICAgICBXWCA9IFBlcm0uVyB8IFBlcm0uWAorICAgICAgICBSV1ggPSBQZXJtLlIgfCBQZXJtLlcgfCBQZXJtLlgKKyAgICAgICAgdmFsdWVzID0gbGlzdChQZXJtKSArIFtSVywgUlgsIFdYLCBSV1gsIFBlcm0oMCldCisgICAgICAgIGZvciBpIGluIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwofmksIH5pLnZhbHVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgofmkpLnZhbHVlLCB+aS52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZSh+aSksIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKH5+aSwgaSkKKyAgICAgICAgZm9yIGkgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMofn5pLCBpKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoT3Blbi5XTyAmIH5PcGVuLldPLCBPcGVuLlJPKQorICAgICAgICBzZWxmLmFzc2VydElzKChPcGVuLldPfE9wZW4uQ0UpICYgfk9wZW4uV08sIE9wZW4uQ0UpCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmcoc2VsZik6CisgICAgICAgIFBlcm0gPSBJbnRGbGFnKCdQZXJtJywgJ1IgVyBYJykKKyAgICAgICAgbHN0ID0gbGlzdChQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBsZW4oUGVybSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFBlcm0pLCAzLCBQZXJtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgW1Blcm0uUiwgUGVybS5XLCBQZXJtLlhdKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUoJ1IgVyBYJy5zcGxpdCgpKToKKyAgICAgICAgICAgIHYgPSAxPDxpCisgICAgICAgICAgICBlID0gUGVybSh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnZhbHVlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUudmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubmFtZSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZSwgUGVybSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlKSwgUGVybSkKKworICAgIGRlZiB0ZXN0X3Byb2dyYW1hdGljX2Z1bmN0aW9uX3N0cmluZ193aXRoX3N0YXJ0KHNlbGYpOgorICAgICAgICBQZXJtID0gSW50RmxhZygnUGVybScsICdSIFcgWCcsIHN0YXJ0PTgpCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gODw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9zdHJpbmdfbGlzdChzZWxmKToKKyAgICAgICAgUGVybSA9IEludEZsYWcoJ1Blcm0nLCBbJ1InLCAnVycsICdYJ10pCisgICAgICAgIGxzdCA9IGxpc3QoUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgbGVuKFBlcm0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihQZXJtKSwgMywgUGVybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFtQZXJtLlIsIFBlcm0uVywgUGVybS5YXSkKKyAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKCdSIFcgWCcuc3BsaXQoKSk6CisgICAgICAgICAgICB2ID0gMTw8aQorICAgICAgICAgICAgZSA9IFBlcm0odikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS52YWx1ZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlLnZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCB2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm5hbWUsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGUsIFBlcm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZSksIFBlcm0pCisKKyAgICBkZWYgdGVzdF9wcm9ncmFtYXRpY19mdW5jdGlvbl9pdGVyYWJsZShzZWxmKToKKyAgICAgICAgUGVybSA9IEludEZsYWcoJ1Blcm0nLCAoKCdSJywgMiksICgnVycsIDgpLCAoJ1gnLCAzMikpKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PCgyKmkrMSkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisgICAgZGVmIHRlc3RfcHJvZ3JhbWF0aWNfZnVuY3Rpb25fZnJvbV9kaWN0KHNlbGYpOgorICAgICAgICBQZXJtID0gSW50RmxhZygnUGVybScsIE9yZGVyZWREaWN0KCgoJ1InLCAyKSwgKCdXJywgOCksICgnWCcsIDMyKSkpKQorICAgICAgICBsc3QgPSBsaXN0KFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIGxlbihQZXJtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oUGVybSksIDMsIFBlcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbUGVybS5SLCBQZXJtLlcsIFBlcm0uWF0pCisgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZSgnUiBXIFgnLnNwbGl0KCkpOgorICAgICAgICAgICAgdiA9IDE8PCgyKmkrMSkKKyAgICAgICAgICAgIGUgPSBQZXJtKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUudmFsdWUsIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZS52YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZSwgdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5uYW1lLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlLCBQZXJtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGUpLCBQZXJtKQorCisKKyAgICBkZWYgdGVzdF9jb250YWlubWVudChzZWxmKToKKyAgICAgICAgUGVybSA9IHNlbGYuUGVybQorICAgICAgICBSLCBXLCBYID0gUGVybQorICAgICAgICBSVyA9IFIgfCBXCisgICAgICAgIFJYID0gUiB8IFgKKyAgICAgICAgV1ggPSBXIHwgWAorICAgICAgICBSV1ggPSBSIHwgVyB8IFgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFIgaW4gUlcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShSIGluIFJYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoUiBpbiBSV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXIGluIFJXKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVyBpbiBXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFcgaW4gUldYKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWCBpbiBSWCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFggaW4gV1gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShYIGluIFJXWCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShSIGluIFdYKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFcgaW4gUlgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoWCBpbiBSVykKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIFBlcm0gPSBzZWxmLlBlcm0KKyAgICAgICAgZm9yIGYgaW4gUGVybToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKQorICAgICAgICBPcGVuID0gc2VsZi5PcGVuCisgICAgICAgIGZvciBmIGluIE9wZW46CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woZi52YWx1ZSksIGJvb2woZikpCisKIGNsYXNzIFRlc3RVbmlxdWUodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfdW5pcXVlX2NsZWFuKHNlbGYpOgpAQCAtMTczOSw1ICsyMzQ0LDQ3IEBACiAgICAgICAgIGlmIGZhaWxlZDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVzdWx0IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkLCBzZWUgcHJpbnQgYWJvdmUiKQogCisKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBlbnVtKQorCisKKyMgVGhlc2UgYXJlIHVub3JkZXJlZCBoZXJlIG9uIHB1cnBvc2UgdG8gZW5zdXJlIHRoYXQgZGVjbGFyYXRpb24gb3JkZXIKKyMgbWFrZXMgbm8gZGlmZmVyZW5jZS4KK0NPTlZFUlRfVEVTVF9OQU1FX0QgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9DID0gNQorQ09OVkVSVF9URVNUX05BTUVfQiA9IDUKK0NPTlZFUlRfVEVTVF9OQU1FX0EgPSA1ICAjIFRoaXMgb25lIHNob3VsZCBzb3J0IGZpcnN0LgorQ09OVkVSVF9URVNUX05BTUVfRSA9IDUKK0NPTlZFUlRfVEVTVF9OQU1FX0YgPSA1CisKK2NsYXNzIFRlc3RJbnRFbnVtQ29udmVydCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29udmVydF92YWx1ZV9sb29rdXBfcHJpb3JpdHkoc2VsZik6CisgICAgICAgIHRlc3RfdHlwZSA9IGVudW0uSW50RW51bS5fY29udmVydCgKKyAgICAgICAgICAgICAgICAnVW5pdHRlc3RDb252ZXJ0JywgJ3Rlc3QudGVzdF9lbnVtJywKKyAgICAgICAgICAgICAgICBmaWx0ZXI9bGFtYmRhIHg6IHguc3RhcnRzd2l0aCgnQ09OVkVSVF9URVNUXycpKQorICAgICAgICAjIFdlIGRvbid0IHdhbnQgdGhlIHJldmVyc2UgbG9va3VwIHZhbHVlIHRvIHZhcnkgd2hlbiB0aGVyZSBhcmUKKyAgICAgICAgIyBtdWx0aXBsZSBwb3NzaWJsZSBuYW1lcyBmb3IgYSBnaXZlbiB2YWx1ZS4gIEl0IHNob3VsZCBhbHdheXMKKyAgICAgICAgIyByZXBvcnQgdGhlIGZpcnN0IGxleGlncmFwaGljYWwgbmFtZSBpbiB0aGF0IGNhc2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlKDUpLm5hbWUsICdDT05WRVJUX1RFU1RfTkFNRV9BJykKKworICAgIGRlZiB0ZXN0X2NvbnZlcnQoc2VsZik6CisgICAgICAgIHRlc3RfdHlwZSA9IGVudW0uSW50RW51bS5fY29udmVydCgKKyAgICAgICAgICAgICAgICAnVW5pdHRlc3RDb252ZXJ0JywgJ3Rlc3QudGVzdF9lbnVtJywKKyAgICAgICAgICAgICAgICBmaWx0ZXI9bGFtYmRhIHg6IHguc3RhcnRzd2l0aCgnQ09OVkVSVF9URVNUXycpKQorICAgICAgICAjIEVuc3VyZSB0aGF0IHRlc3RfdHlwZSBoYXMgYWxsIG9mIHRoZSBkZXNpcmVkIG5hbWVzIGFuZCB2YWx1ZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0EpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0IsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0MsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0QsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF90eXBlLkNPTlZFUlRfVEVTVF9OQU1FX0UsIDUpCisgICAgICAgICMgRW5zdXJlIHRoYXQgdGVzdF90eXBlIG9ubHkgcGlja2VkIHVwIG5hbWVzIG1hdGNoaW5nIHRoZSBmaWx0ZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW25hbWUgZm9yIG5hbWUgaW4gZGlyKHRlc3RfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZVswOjJdIG5vdCBpbiAoJ0NPJywgJ19fJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBtc2c9J05hbWVzIG90aGVyIHRoYW4gQ09OVkVSVF9URVNUXyogZm91bmQuJykKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkgYi9MaWIvdGVzdC90ZXN0X2VudW1lcmF0ZS5weQppbmRleCAyNjMwY2YyLi5lNDU1YWRlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VudW1lcmF0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VudW1lcmF0ZS5weQpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgZGVmIHRlc3Rfb2JqbWV0aG9kcyhzZWxmKToKICAgICAgICAgIyBPYmplY3RzIG11c3QgaGF2ZSBfX2xlbl9fKCkgYW5kIF9fZ2V0aXRlbV9fKCkgaW1wbGVtZW50ZWQuCiAgICAgICAgIGNsYXNzIE5vTGVuKG9iamVjdCk6Ci0gICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZik6IHJldHVybiAxCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiAxCiAgICAgICAgIG5sID0gTm9MZW4oKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBubCkKIApAQCAtMjMyLDYgKzIzMiwxMyBAQAogICAgICAgICBuZ2kgPSBOb0dldEl0ZW0oKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBuZ2kpCiAKKyAgICAgICAgY2xhc3MgQmxvY2tlZChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOiByZXR1cm4gMQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiAyCisgICAgICAgICAgICBfX3JldmVyc2VkX18gPSBOb25lCisgICAgICAgIGIgPSBCbG9ja2VkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgYikKKwogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKICAgICAgICAgZm9yIGRhdGEgaW4gJ2FiYycsIHJhbmdlKDUpLCB0dXBsZShlbnVtZXJhdGUoJ2FiYycpKSwgcmFuZ2UoMSwxNyw1KToKICAgICAgICAgICAgIHNlbGYuY2hlY2tfcGlja2xlKHJldmVyc2VkKGRhdGEpLCBsaXN0KGRhdGEpWzo6LTFdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lcG9sbC5weSBiL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKaW5kZXggYTczNTllOS4uYTdhZmY4YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaWYgbm90IGhhc2F0dHIoc2VsZWN0LCAiZXBvbGwiKToKICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCB3b3JrcyBvbmx5IG9uIExpbnV4IDIuNiIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9mYXVsdGhhbmRsZXIucHkKaW5kZXggMTU2MmVlYy4uMWZmMTdiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mYXVsdGhhbmRsZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mYXVsdGhhbmRsZXIucHkKQEAgLTIzLDYgKzIzLDcgQEAKICAgICBfdGVzdGNhcGkgPSBOb25lCiAKIFRJTUVPVVQgPSAwLjUKK01TX1dJTkRPV1MgPSAob3MubmFtZSA9PSAnbnQnKQogCiBkZWYgZXhwZWN0ZWRfdHJhY2ViYWNrKGxpbmVubzEsIGxpbmVubzIsIGhlYWRlciwgbWluX2NvdW50PTEpOgogICAgIHJlZ2V4ID0gaGVhZGVyCkBAIC01OCw4ICs1OSw5IEBACiAgICAgICAgICAgICBwYXNzX2Zkcy5hcHBlbmQoZmQpCiAgICAgICAgIHdpdGggc3VwcG9ydC5TdXBwcmVzc0NyYXNoUmVwb3J0KCk6CiAgICAgICAgICAgICBwcm9jZXNzID0gc2NyaXB0X2hlbHBlci5zcGF3bl9weXRob24oJy1jJywgY29kZSwgcGFzc19mZHM9cGFzc19mZHMpCi0gICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCi0gICAgICAgIGV4aXRjb2RlID0gcHJvY2Vzcy53YWl0KCkKKyAgICAgICAgICAgIHdpdGggcHJvY2VzczoKKyAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gcHJvY2Vzcy53YWl0KCkKICAgICAgICAgb3V0cHV0ID0gc3VwcG9ydC5zdHJpcF9weXRob25fc3RkZXJyKHN0ZG91dCkKICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmRlY29kZSgnYXNjaWknLCAnYmFja3NsYXNocmVwbGFjZScpCiAgICAgICAgIGlmIGZpbGVuYW1lOgpAQCAtNzMsMTQgKzc1LDExIEBACiAgICAgICAgICAgICB3aXRoIG9wZW4oZmQsICJyYiIsIGNsb3NlZmQ9RmFsc2UpIGFzIGZwOgogICAgICAgICAgICAgICAgIG91dHB1dCA9IGZwLnJlYWQoKQogICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmRlY29kZSgnYXNjaWknLCAnYmFja3NsYXNocmVwbGFjZScpCi0gICAgICAgIG91dHB1dCA9IHJlLnN1YignQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsnLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0N1cnJlbnQgdGhyZWFkIFhYWCcsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCiAgICAgICAgIHJldHVybiBvdXRwdXQuc3BsaXRsaW5lcygpLCBleGl0Y29kZQogCi0gICAgZGVmIGNoZWNrX2ZhdGFsX2Vycm9yKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBuYW1lX3JlZ2V4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1Ob25lLCBhbGxfdGhyZWFkcz1UcnVlLCBvdGhlcl9yZWdleD1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmZD1Ob25lKToKKyAgICBkZWYgY2hlY2tfZXJyb3Ioc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIGZhdGFsX2Vycm9yLCAqLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1Ob25lLCBhbGxfdGhyZWFkcz1UcnVlLCBvdGhlcl9yZWdleD1Ob25lLAorICAgICAgICAgICAgICAgICAgICBmZD1Ob25lLCBrbm93X2N1cnJlbnRfdGhyZWFkPVRydWUpOgogICAgICAgICAiIiIKICAgICAgICAgQ2hlY2sgdGhhdCB0aGUgZmF1bHQgaGFuZGxlciBmb3IgZmF0YWwgZXJyb3JzIGlzIGVuYWJsZWQgYW5kIGNoZWNrIHRoZQogICAgICAgICB0cmFjZWJhY2sgZnJvbSB0aGUgY2hpbGQgcHJvY2VzcyBvdXRwdXQuCkBAIC04OCwxOSArODcsMjIgQEAKICAgICAgICAgUmFpc2UgYW4gZXJyb3IgaWYgdGhlIG91dHB1dCBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBmb3JtYXQuCiAgICAgICAgICIiIgogICAgICAgICBpZiBhbGxfdGhyZWFkczoKLSAgICAgICAgICAgIGhlYWRlciA9ICdDdXJyZW50IHRocmVhZCBYWFggKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpJworICAgICAgICAgICAgaWYga25vd19jdXJyZW50X3RocmVhZDoKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAnQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhlYWRlciA9ICdUaHJlYWQgMHhbMC05YS1mXSsnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBoZWFkZXIgPSAnU3RhY2sgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpJworICAgICAgICAgICAgaGVhZGVyID0gJ1N0YWNrJwogICAgICAgICByZWdleCA9ICIiIgotICAgICAgICAgICAgXkZhdGFsIFB5dGhvbiBlcnJvcjoge25hbWV9CisgICAgICAgICAgICBee2ZhdGFsX2Vycm9yfQogCi0gICAgICAgICAgICB7aGVhZGVyfToKKyAgICAgICAgICAgIHtoZWFkZXJ9IFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgogICAgICAgICAgICAgICBGaWxlICI8c3RyaW5nPiIsIGxpbmUge2xpbmVub30gaW4gPG1vZHVsZT4KICAgICAgICAgICAgICIiIgogICAgICAgICByZWdleCA9IGRlZGVudChyZWdleC5mb3JtYXQoCiAgICAgICAgICAgICBsaW5lbm89bGluZV9udW1iZXIsCi0gICAgICAgICAgICBuYW1lPW5hbWVfcmVnZXgsCi0gICAgICAgICAgICBoZWFkZXI9cmUuZXNjYXBlKGhlYWRlcikpKS5zdHJpcCgpCisgICAgICAgICAgICBmYXRhbF9lcnJvcj1mYXRhbF9lcnJvciwKKyAgICAgICAgICAgIGhlYWRlcj1oZWFkZXIpKS5zdHJpcCgpCiAgICAgICAgIGlmIG90aGVyX3JlZ2V4OgogICAgICAgICAgICAgcmVnZXggKz0gJ3wnICsgb3RoZXJfcmVnZXgKICAgICAgICAgb3V0cHV0LCBleGl0Y29kZSA9IHNlbGYuZ2V0X291dHB1dChjb2RlLCBmaWxlbmFtZT1maWxlbmFtZSwgZmQ9ZmQpCkBAIC0xMDgsMTcgKzExMCwzNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KG91dHB1dCwgcmVnZXgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXhpdGNvZGUsIDApCiAKKyAgICBkZWYgY2hlY2tfZmF0YWxfZXJyb3Ioc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsICoqa3cpOgorICAgICAgICBmYXRhbF9lcnJvciA9ICdGYXRhbCBQeXRob24gZXJyb3I6ICVzJyAlIG5hbWVfcmVnZXgKKyAgICAgICAgc2VsZi5jaGVja19lcnJvcihjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICoqa3cpCisKKyAgICBkZWYgY2hlY2tfd2luZG93c19leGNlcHRpb24oc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsICoqa3cpOgorICAgICAgICBmYXRhbF9lcnJvciA9ICdXaW5kb3dzIGZhdGFsIGV4Y2VwdGlvbjogJXMnICUgbmFtZV9yZWdleAorICAgICAgICBzZWxmLmNoZWNrX2Vycm9yKGNvZGUsIGxpbmVfbnVtYmVyLCBmYXRhbF9lcnJvciwgKiprdykKKwogICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2FpeCcpLAogICAgICAgICAgICAgICAgICAgICAgInRoZSBmaXJzdCBwYWdlIG9mIG1lbW9yeSBpcyBhIG1hcHBlZCByZWFkLW9ubHkgb24gQUlYIikKICAgICBkZWYgdGVzdF9yZWFkX251bGwoc2VsZik6Ci0gICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCi0gICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCi0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKLSAgICAgICAgICAgICIiIiwKLSAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAjIElzc3VlICMxMjcwMDogUmVhZCBOVUxMIHJhaXNlcyBTSUdJTEwgb24gTWFjIE9TIFggTGlvbgotICAgICAgICAgICAgJyg/OlNlZ21lbnRhdGlvbiBmYXVsdHxCdXMgZXJyb3J8SWxsZWdhbCBpbnN0cnVjdGlvbiknKQorICAgICAgICBpZiBub3QgTVNfV0lORE9XUzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAjIElzc3VlICMxMjcwMDogUmVhZCBOVUxMIHJhaXNlcyBTSUdJTEwgb24gTWFjIE9TIFggTGlvbgorICAgICAgICAgICAgICAgICcoPzpTZWdtZW50YXRpb24gZmF1bHQnCisgICAgICAgICAgICAgICAgICAgICd8QnVzIGVycm9yJworICAgICAgICAgICAgICAgICAgICAnfElsbGVnYWwgaW5zdHJ1Y3Rpb24pJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfd2luZG93c19leGNlcHRpb24oIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmVhZF9udWxsKCkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAnYWNjZXNzIHZpb2xhdGlvbicpCiAKICAgICBkZWYgdGVzdF9zaWdzZWd2KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgpAQCAtMTI5LDYgKzE1MCwxNyBAQAogICAgICAgICAgICAgMywKICAgICAgICAgICAgICdTZWdtZW50YXRpb24gZmF1bHQnKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgSEFWRV9USFJFQURTLCAnbmVlZCB0aHJlYWRzJykKKyAgICBkZWYgdGVzdF9mYXRhbF9lcnJvcl9jX3RocmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKKyAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9mYXRhbF9lcnJvcl9jX3RocmVhZCgpCisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgJ2luIG5ldyB0aHJlYWQnLAorICAgICAgICAgICAga25vd19jdXJyZW50X3RocmVhZD1GYWxzZSkKKwogICAgIGRlZiB0ZXN0X3NpZ2FicnQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCiAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCkBAIC00NjUsNyArNDk3LDcgQEAKICAgICAgICAgICAgICAgRmlsZSAiLip0aHJlYWRpbmcucHkiLCBsaW5lIFswLTldKyBpbiBfYm9vdHN0cmFwX2lubmVyCiAgICAgICAgICAgICAgIEZpbGUgIi4qdGhyZWFkaW5nLnB5IiwgbGluZSBbMC05XSsgaW4gX2Jvb3RzdHJhcAogCi0gICAgICAgICAgICBDdXJyZW50IHRocmVhZCBYWFggXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6CisgICAgICAgICAgICBDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKyBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKToKICAgICAgICAgICAgICAgRmlsZSAiPHN0cmluZz4iLCBsaW5lIHtsaW5lbm99IGluIGR1bXAKICAgICAgICAgICAgICAgRmlsZSAiPHN0cmluZz4iLCBsaW5lIDI4IGluIDxtb2R1bGU+JAogICAgICAgICAgICAgIiIiCkBAIC02MzcsNyArNjY5LDcgQEAKICAgICAgICAgdHJhY2UgPSAnXG4nLmpvaW4odHJhY2UpCiAgICAgICAgIGlmIG5vdCB1bnJlZ2lzdGVyOgogICAgICAgICAgICAgaWYgYWxsX3RocmVhZHM6Ci0gICAgICAgICAgICAgICAgcmVnZXggPSAnQ3VycmVudCB0aHJlYWQgWFhYIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOlxuJworICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0N1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOlxuJwogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByZWdleCA9ICdTdGFjayBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKICAgICAgICAgICAgIHJlZ2V4ID0gZXhwZWN0ZWRfdHJhY2ViYWNrKDE0LCAzMiwgcmVnZXgpCkBAIC02OTYsNiArNzI4LDIyIEBACiAgICAgICAgICAgICB3aXRoIHNlbGYuY2hlY2tfc3RkZXJyX25vbmUoKToKICAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbmFsLlNJR1VTUjEpCiAKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhNU19XSU5ET1dTLCAnc3BlY2lmaWMgdG8gV2luZG93cycpCisgICAgZGVmIHRlc3RfcmFpc2VfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBmb3IgZXhjLCBuYW1lIGluICgKKyAgICAgICAgICAgICgnRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04nLCAnYWNjZXNzIHZpb2xhdGlvbicpLAorICAgICAgICAgICAgKCdFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPJywgJ2ludCBkaXZpZGUgYnkgemVybycpLAorICAgICAgICAgICAgKCdFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1cnLCAnc3RhY2sgb3ZlcmZsb3cnKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfd2luZG93c19leGNlcHRpb24oIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmFpc2VfZXhjZXB0aW9uKGZhdWx0aGFuZGxlci5fe2V4Y30pCisgICAgICAgICAgICAgICAgIiIiLmZvcm1hdChleGM9ZXhjKSwKKyAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgIG5hbWUpCisKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IDRlMzkyYjcuLjY1YmUzMGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTcsNyArNyw3IEBACiBpbXBvcnQgaW8KIGltcG9ydCBfcHlpbyBhcyBweWlvCiAKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTgogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgVXNlckxpc3QKIAogY2xhc3MgQXV0b0ZpbGVUZXN0czoKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAgICAgZGVmIHRlc3RNb2RlU3RyaW5ncyhzZWxmKToKICAgICAgICAgIyBjaGVjayBpbnZhbGlkIG1vZGUgc3RyaW5ncwotICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiKToKKyAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIiwgIlUrIiwgIitVIiwgInJVKyIpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCBtb2RlKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IDc4NGJjOTIuLjU2NTYzM2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0yMiw4ICsyMiw5IEBACiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPLCBTdHJpbmdJTwogZnJvbSBmaWxlaW5wdXQgaW1wb3J0IEZpbGVJbnB1dCwgaG9va19lbmNvZGVkCiAKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBURVNURk4sIHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBURVNURk4sIGNoZWNrX3dhcm5pbmdzCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgdW5saW5rIGFzIHNhZmVfdW5saW5rCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKIAogCkBAIC05Miw3ICs5MywxMSBAQAogICAgICAgICAgICAgICAgIHQyID0gd3JpdGVUbXAoMiwgWyJMaW5lICVzIG9mIGZpbGUgMlxuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDEwKV0pCiAgICAgICAgICAgICAgICAgdDMgPSB3cml0ZVRtcCgzLCBbIkxpbmUgJXMgb2YgZmlsZSAzXG4iICUgKGkrMSkgZm9yIGkgaW4gcmFuZ2UoNSldKQogICAgICAgICAgICAgICAgIHQ0ID0gd3JpdGVUbXAoNCwgWyJMaW5lICVzIG9mIGZpbGUgNFxuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDEpXSkKLSAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplX3Rlc3QodDEsIHQyLCB0MywgdDQsIGJzLCByb3VuZCkKKyAgICAgICAgICAgICAgICBpZiBiczoKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplX3Rlc3QodDEsIHQyLCB0MywgdDQsIGJzLCByb3VuZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplX3Rlc3QodDEsIHQyLCB0MywgdDQsIGJzLCByb3VuZCkKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSwgdDIsIHQzLCB0NCkKIApAQCAtOTQwLDcgKzk0NSw4IEBACiAKICAgICBkZWYgdGVzdChzZWxmKToKICAgICAgICAgZW5jb2RpbmcgPSBvYmplY3QoKQotICAgICAgICByZXN1bHQgPSBmaWxlaW5wdXQuaG9va19lbmNvZGVkKGVuY29kaW5nKQorICAgICAgICBlcnJvcnMgPSBvYmplY3QoKQorICAgICAgICByZXN1bHQgPSBmaWxlaW5wdXQuaG9va19lbmNvZGVkKGVuY29kaW5nLCBlcnJvcnM9ZXJyb3JzKQogCiAgICAgICAgIGZha2Vfb3BlbiA9IEludm9jYXRpb25SZWNvcmRlcigpCiAgICAgICAgIG9yaWdpbmFsX29wZW4gPSBidWlsdGlucy5vcGVuCkBAIC05NTgsOCArOTY0LDI2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoYXJnc1swXSwgZmlsZW5hbWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoYXJnc1sxXSwgbW9kZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhrd2FyZ3MucG9wKCdlbmNvZGluZycpLCBlbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhrd2FyZ3MucG9wKCdlcnJvcnMnKSwgZXJyb3JzKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGt3YXJncykKIAorICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3diJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoYidceDgwYWJjJykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNhZmVfdW5saW5rLCBURVNURk4pCisKKyAgICAgICAgZGVmIGNoZWNrKGVycm9ycywgZXhwZWN0ZWRfbGluZXMpOgorICAgICAgICAgICAgd2l0aCBGaWxlSW5wdXQoZmlsZXM9VEVTVEZOLCBtb2RlPSdyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5ob29rPWhvb2tfZW5jb2RlZCgndXRmLTgnLCBlcnJvcnM9ZXJyb3JzKSkgYXMgZmk6CisgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgZXhwZWN0ZWRfbGluZXMpCisKKyAgICAgICAgY2hlY2soJ2lnbm9yZScsIFsnYWJjJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgIGNoZWNrKCdzdHJpY3QnLCBbJ2FiYyddKQorICAgICAgICBjaGVjaygncmVwbGFjZScsIFsnXHVmZmZkYWJjJ10pCisgICAgICAgIGNoZWNrKCdiYWNrc2xhc2hyZXBsYWNlJywgWydcXHg4MGFiYyddKQorCiAgICAgZGVmIHRlc3RfbW9kZXMoc2VsZik6CiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3YicpIGFzIGY6CiAgICAgICAgICAgICAjIFVURi03IGlzIGEgY29udmVuaWVudCwgc2VsZG9tIHVzZWQgZW5jb2RpbmcKQEAgLTk4MSw1ICsxMDA1LDExIEBACiAgICAgICAgICAgICBjaGVjaygncmInLCBbJ0FcbicsICdCXHJcbicsICdDXHInLCAnRFx1MjBhYyddKQogCiAKK2NsYXNzIE1pc2NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZmlsZWlucHV0KQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5IGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQppbmRleCBjYjFmNmRiLi42OGIyMTJlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKQEAgLTEsNiArMSw1IEBACiAKIGltcG9ydCBmcmFjdGlvbnMKLWltcG9ydCBtYXRoCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBvcwogaW1wb3J0IHJhbmRvbQpAQCAtMTYyLDExICsxNjEsMTIgQEAKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHN0cihzZWxmKSkgKyAxCiAKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28xKCkpLCA0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMigpKSwgNDIuKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzMoMjEpKSwgNDIuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEZvbzEoKSksIDQyLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGb28yKCkpLCA0Mi4pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGb28zKDIxKSksIDQyLikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmbG9hdCwgRm9vNCg0MikpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vU3RyKCc4JykpLCA5LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGb29TdHIoJzgnKSksIDkuKQogCiAgICAgICAgIGNsYXNzIEZvbzU6CiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgpAQCAtMTc3LDEwICsxNzcsMTQgQEAKICAgICAgICAgY2xhc3MgRjoKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE90aGVyRmxvYXRTdWJjbGFzcyg0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRigpKSwgNDIuKQotICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZmxvYXQoRigpKSksIE90aGVyRmxvYXRTdWJjbGFzcykKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChGbG9hdFN1YmNsYXNzKEYoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKEZsb2F0U3ViY2xhc3MoRigpKSksIEZsb2F0U3ViY2xhc3MpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGKCkpLCA0Mi4pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGZsb2F0KEYoKSkpLCBmbG9hdCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZsb2F0U3ViY2xhc3MoRigpKSwgNDIuKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShGbG9hdFN1YmNsYXNzKEYoKSkpLCBGbG9hdFN1YmNsYXNzKQogCiAgICAgZGVmIHRlc3RfaXNfaW50ZWdlcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgoMS4xKS5pc19pbnRlZ2VyKCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weSBiL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5CmluZGV4IDliMTM2MzIuLjhhZmQ1YjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAgICAgdGVzdF9leGMoJyVkJywgJzEnLCBUeXBlRXJyb3IsICIlZCBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCBub3Qgc3RyIikKICAgICAgICAgdGVzdF9leGMoJyV4JywgJzEnLCBUeXBlRXJyb3IsICIleCBmb3JtYXQ6IGFuIGludGVnZXIgaXMgcmVxdWlyZWQsIG5vdCBzdHIiKQogICAgICAgICB0ZXN0X2V4YygnJXgnLCAzLjE0LCBUeXBlRXJyb3IsICIleCBmb3JtYXQ6IGFuIGludGVnZXIgaXMgcmVxdWlyZWQsIG5vdCBmbG9hdCIpCi0gICAgICAgIHRlc3RfZXhjKCclZycsICcxJywgVHlwZUVycm9yLCAiYSBmbG9hdCBpcyByZXF1aXJlZCIpCisgICAgICAgIHRlc3RfZXhjKCclZycsICcxJywgVHlwZUVycm9yLCAibXVzdCBiZSByZWFsIG51bWJlciwgbm90IHN0ciIpCiAgICAgICAgIHRlc3RfZXhjKCdubyBmb3JtYXQnLCAnMScsIFR5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQogICAgICAgICB0ZXN0X2V4YygnJWMnLCAtMSwgT3ZlcmZsb3dFcnJvciwgIiVjIGFyZyBub3QgaW4gcmFuZ2UoMHgxMTAwMDApIikKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCA3LCBiIlx4MDciKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBiIloiLCBiIloiKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBieXRlYXJyYXkoYiJaIiksIGIiWiIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlNWMiLCA2NSwgYiIgICAgQSIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlLTVjIiwgNjUsIGIiQSAgICAiKQogICAgICAgICAjICViIHdpbGwgaW5zZXJ0IGEgc2VyaWVzIG9mIGJ5dGVzLCBlaXRoZXIgZnJvbSBhIHR5cGUgdGhhdCBzdXBwb3J0cwogICAgICAgICAjIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wsIG9yIHNvbWV0aGluZyB0aGF0IGhhcyBhIF9fYnl0ZXNfXyBtZXRob2QKICAgICAgICAgY2xhc3MgRmFrZUJ5dGVzKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CmluZGV4IDlkZjRhNTQuLjc5MDVjMzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CkBAIC0xNTAsNiArMTUwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAiMy8yIiwgMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAzLCAwaikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAzLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAxLCAyLCAzKQogCiAgICAgQHJlcXVpcmVzX0lFRUVfNzU0CiAgICAgZGVmIHRlc3RJbml0RnJvbUZsb2F0KHNlbGYpOgpAQCAtMjYzLDEzICsyNjQsMTMgQEAKICAgICAgICAgbmFuID0gaW5mIC0gaW5mCiAgICAgICAgICMgYnVnIDE2NDY5OiBlcnJvciB0eXBlcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIGZsb2F0IC0+IGludAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgaW5mIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZmxvYXQsIGluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1pbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgLWluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IG5hbiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgbmFuKQogCiAgICAgZGVmIHRlc3RGcm9tRGVjaW1hbChzZWxmKToKQEAgLTI4NCwxNiArMjg1LDE2IEBACiAKICAgICAgICAgIyBidWcgMTY0Njk6IGVycm9yIHR5cGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZGVjaW1hbCAtPiBpbnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgiaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCAtSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCItaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgibmFuIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBzTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoInNuYW4iKSkKIAogICAgIGRlZiB0ZXN0TGltaXREZW5vbWluYXRvcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmExYjIxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5CkBAIC0wLDAgKzEsNzA1IEBACitpbXBvcnQgYXN0CitpbXBvcnQgdHlwZXMKK2ltcG9ydCBkZWNpbWFsCitpbXBvcnQgdW5pdHRlc3QKKworYV9nbG9iYWwgPSAnZ2xvYmFsIHZhcmlhYmxlJworCisjIFlvdSBjb3VsZCBhcmd1ZSB0aGF0IEknbSB0b28gc3RyaWN0IGluIGxvb2tpbmcgZm9yIHNwZWNpZmljIGVycm9yCisjICB2YWx1ZXMgd2l0aCBhc3NlcnRSYWlzZXNSZWdleCwgYnV0IHdpdGhvdXQgaXQgaXQncyB3YXkgdG9vIGVhc3kgdG8KKyMgIG1ha2UgYSBzeW50YXggZXJyb3IgaW4gdGhlIHRlc3Qgc3RyaW5ncy4gRXNwZWNpYWxseSB3aXRoIGFsbCBvZiB0aGUKKyMgIHRyaXBsZSBxdW90ZXMsIHJhdyBzdHJpbmdzLCBiYWNrc2xhc2hlcywgZXRjLiBJIHRoaW5rIGl0J3MgYQorIyAgd29ydGh3aGlsZSB0cmFkZW9mZi4gV2hlbiBJIHN3aXRjaGVkIHRvIHRoaXMgbWV0aG9kLCBJIGZvdW5kIG1hbnkKKyMgIGV4YW1wbGVzIHdoZXJlIEkgd2Fzbid0IHRlc3Rpbmcgd2hhdCBJIHRob3VnaHQgSSB3YXMuCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0QWxsUmFpc2Uoc2VsZiwgZXhjZXB0aW9uX3R5cGUsIHJlZ2V4LCBlcnJvcl9zdHJpbmdzKToKKyAgICAgICAgZm9yIHN0ciBpbiBlcnJvcl9zdHJpbmdzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RyPXN0cik6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGV4Y2VwdGlvbl90eXBlLCByZWdleCk6CisgICAgICAgICAgICAgICAgICAgIGV2YWwoc3RyKQorCisgICAgZGVmIHRlc3RfX2Zvcm1hdF9fbG9va3VwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBfX2Zvcm1hdF9fIGlzIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSwgbm90IHRoZSBpbnN0YW5jZS4KKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAnY2xhc3MnCisKKyAgICAgICAgeCA9IFgoKQorCisgICAgICAgICMgQWRkIGEgYm91bmQgX19mb3JtYXRfXyBtZXRob2QgdG8gdGhlICd5JyBpbnN0YW5jZSwgYnV0IG5vdAorICAgICAgICAjICB0aGUgJ3gnIGluc3RhbmNlLgorICAgICAgICB5ID0gWCgpCisgICAgICAgIHkuX19mb3JtYXRfXyA9IHR5cGVzLk1ldGhvZFR5cGUobGFtYmRhIHNlbGYsIHNwZWM6ICdpbnN0YW5jZScsIHkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsIGZvcm1hdCh5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgpLCBmb3JtYXQoeSkpCisKKyAgICAgICAgIyBfX2Zvcm1hdF9fIGlzIG5vdCBjYWxsZWQgdGhpcyB3YXksIGJ1dCBzdGlsbCBtYWtlIHN1cmUgaXQKKyAgICAgICAgIyAgcmV0dXJucyB3aGF0IHdlIGV4cGVjdCAoc28gd2UgY2FuIG1ha2Ugc3VyZSB3ZSdyZSBieXBhc3NpbmcKKyAgICAgICAgIyAgaXQpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19mb3JtYXRfXygnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2Zvcm1hdF9fKCcnKSwgJ2luc3RhbmNlJykKKworICAgICAgICAjIFRoaXMgaXMgaG93IF9fZm9ybWF0X18gaXMgYWN0dWFsbHkgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeCkuX19mb3JtYXRfXyh4LCAnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh5KS5fX2Zvcm1hdF9fKHksICcnKSwgJ2NsYXNzJykKKworICAgIGRlZiB0ZXN0X2FzdChzZWxmKToKKyAgICAgICAgIyBJbnNwaXJlZCBieSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQ5NzUKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBleHByID0gIiIiCithID0gMTAKK2Yne2EgKiB4KCl9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgeCB3YXMgbm90IGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4LmNhbGxlZCkKKworICAgICAgICAjIEFjdHVhbGx5IHJ1biB0aGUgY29kZS4KKyAgICAgICAgZXhlYyhjKQorCisgICAgICAgICMgTWFrZSBzdXJlIHggd2FzIGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguY2FsbGVkKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICAjIFdpdGggbm8gZXhwcmVzc2lvbnMsIGFuIGYtc3RyaW5nIGlzIG9rYXkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyIpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyAneSciKSwgJ3h5JykKKworICAgICAgICAjIEJ1dCB0aGlzIHNob3VsZCByYWlzZSBhbiBlcnJvci4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYneHszfSciKQorCisgICAgICAgICMgQXMgc2hvdWxkIHRoaXMsIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgYXN0IG5vZGUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYnezN9JyIpCisKKyAgICBkZWYgdGVzdF9hc3RfY29tcGlsZV90aW1lX2NvbmNhdChzZWxmKToKKyAgICAgICAgeCA9IFsnJ10KKworICAgICAgICBleHByID0gIiIieFswXSA9ICdmb28nIGYnezN9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisgICAgICAgIGV4ZWMoYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLCAnZm9vMycpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhJywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnICcsICcgJykKKworICAgIGRlZiB0ZXN0X3VudGVybWluYXRlZF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiIiJmJ3sieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3sieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7KCJ4JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbWlzbWF0Y2hlZF9wYXJlbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogbWlzbWF0Y2hlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3soKH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9icmFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eycsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7eycsICdheycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7e2InLCAne2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYXt7YicsICdhe2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX0nLCAnYX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1iJywgJ31iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F9fWInLCAnYX1iJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3t7MTB9JywgJ3sxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXsxMH0nLCAnfTEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319e3t7MTB9JywgJ317MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1he3t7MTB9JywgJ31hezEwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfXt7JywgJzEweycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX0nLCAnMTB9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fXt7JywgJzEwfXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19YXt7JyAnfScsICcxMH1he30nKQorCisgICAgICAgICMgSW5zaWRlIG9mIHN0cmluZ3MsIGRvbid0IGludGVycHJldCBkb3VibGVkIGJyYWNrZXRzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ7e319In0nLCAne3t9fScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShUeXBlRXJyb3IsICd1bmhhc2hhYmxlIHR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7IHt7fX0gfSciLCAjIGRpY3QgaW4gYSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfdGltZV9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSAnZGVmJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYnIyMge3h9Z2hpJywgJ2FiYyMjIGRlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaGknLCAnYWJjZGVmZ2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJ3t4fScgJ2doJyBmJ2l7eDo0fScsICdhYmNkZWZnaGlkZWYgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eCcgZid7eH0nLCAne3hkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eH0nIGYne3h9JywgJ3t4fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eH19JyBmJ3t4fScsICd7e3h9fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eCcgZid7eH0nLCAne3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneH19JyBmJ3t4fScsICd4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAneH19JywgJ2RlZnh9fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScgJycsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYne3h9JywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcyJywgJ2RlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScgJzInLCAnMWRlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScsICcxZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgZicte3h9JywgJ2RlZi1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycgJycgZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJyAnJywgJycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMnIGYnfSciLCAgIyBjYW4ndCBjb25jYXQgdG8gZ2V0IGEgdmFsaWQgZi1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICAjIFRoZXNlIGFyZW4ndCBjb21tZW50cywgc2luY2UgdGhleSdyZSBpbiBzdHJpbmdzLgorICAgICAgICBkID0geycjJzogJ2hhc2gnfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIjIn0nLCAnIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiIyJdfScsICdoYXNoJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezEjfSciLCAgICMgZXJyb3IgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiBiZWNvbWVzICIoMSMpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MygjKX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21hbnlfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgc3RyaW5nIHdpdGggbWFueSBleHByZXNzaW9ucyBpbiBpdC4gTm90ZSB0aGF0CisgICAgICAgICMgIGJlY2F1c2Ugd2UgaGF2ZSBhIHNwYWNlIGluIGhlcmUgYXMgYSBsaXRlcmFsLCB3ZSdyZSBhY3R1YWxseQorICAgICAgICAjICBnb2luZyB0byB1c2UgdHdpY2UgYXMgbWFueSBhc3Qgbm9kZXM6IG9uZSBmb3IgZWFjaCBsaXRlcmFsCisgICAgICAgICMgIHBsdXMgb25lIGZvciBlYWNoIGV4cHJlc3Npb24uCisgICAgICAgIGRlZiBidWlsZF9mc3RyKG4sIGV4dHJhPScnKToKKyAgICAgICAgICAgIHJldHVybiAiZiciICsgKCd7eH0gJyAqIG4pICsgZXh0cmEgKyAiJyIKKworICAgICAgICB4ID0gJ1gnCisgICAgICAgIHdpZHRoID0gMQorCisgICAgICAgICMgVGVzdCBhcm91bmQgMjU2LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTAsIDI2MCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cihpKSksICh4KycgJykqaSkKKworICAgICAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyAyIGxhcmdzIGZzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cigyNTUpKjI1NiksICh4KycgJykqKDI1NSoyNTYpKQorCisgICAgICAgIHMgPSBidWlsZF9mc3RyKDI1MywgJ3t4Ont3aWR0aH19ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgKHgrJyAnKSoyNTQpCisKKyAgICAgICAgIyBUZXN0IGxvdHMgb2YgZXhwcmVzc2lvbnMgYW5kIGNvbnN0YW50cywgY29uY2F0ZW5hdGVkLgorICAgICAgICBzID0gImYnezF9JyAneCcgJ3knIiAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHMpLCAnMXh5JyAqIDEwMjQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfc3BlY2lmaWVyX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICB3aWR0aCA9IDEwCisgICAgICAgIHByZWNpc2lvbiA9IDQKKyAgICAgICAgdmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwoJzEyLjM0NTY3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aH0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGghcn0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGg6MH0ue3ByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnsxfXswOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7IDF9eyAwOjB9LnsgcHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MX0weH0nLCAnICAgICAgIDB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6eyIjIn0xezB9eyJ4In19JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDoteyIjIn0xezB9eH0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7LTEwOnsiLSJ9I3sxfTB7IngifX0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6I3szICE9IHs0OjV9IGFuZCB3aWR0aH14fScsICcgICAgICAgMHhhJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiIiJmJ3sicyIhcnsiOjEwIn19JyIiIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbG9va3MgbGlrZSBhIG5lc3RlZCBmb3JtYXQgc3BlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiaW52YWxpZCBzeW50YXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIEludmFsaWQgc3ludGF4IGluc2lkZSBhIG5lc3RlZCBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7NDp7LzV9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwcmVzc2lvbnMgbmVzdGVkIHRvbyBkZWVwbHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIENhbid0IG5lc3QgZm9ybWF0IHNwZWNpZmllcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aDp7MH19LntwcmVjaXNpb246MX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBObyBleHBhbnNpb24gaW5zaWRlIGNvbnZlcnNpb24gb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIHRoZSA6IG9yICEgaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJmJ3sicyIheyJyIn19JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3NpZGVfZWZmZWN0X29yZGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLmkpCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9IHt4fScsICcxIDInKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IH0nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZicge30gJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAhcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezEwOnsgfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnIHsgfSAnIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhdGNoIHRoZSBlbXB0eSBleHByZXNzaW9uIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgaW52YWxpZCBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6YX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHI6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cjphfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7On0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGZpbmQgdGhlIGVtcHR5IGV4cHJlc3Npb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBtaXNzaW5nIGNsb3NpbmcgYnJhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezp4JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9wYXJlbnNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Myx9JywgJygzLCknKQorCisgICAgICAgICMgQWRkIHRoZXNlIGJlY2F1c2Ugd2hlbiBhbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgcGFyZW5zCisgICAgICAgICMgIGFyZSBhZGRlZCBhcm91bmQgaXQuIEJ1dCB3ZSBzaG91bGRuJ3QgZ28gZnJvbSBhbiBpbnZhbGlkCisgICAgICAgICMgIGV4cHJlc3Npb24gdG8gYSB2YWxpZCBvbmUuIFRoZSBhZGRlZCBwYXJlbnMgYXJlIGp1c3QKKyAgICAgICAgIyAgc3VwcG9zZWQgdG8gYWxsb3cgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIG5ld2xpbmVzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyx9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3ssfSciLCAgIyB0aGlzIGlzICgsKSwgd2hpY2ggaXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7MykrKDR9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ0VPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3tcbn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25vX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNzkyMQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIHdvcmssIGJ1dCBjdXJyZW50bHkgZG9uJ3QKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2JhY2tzbGFzaGVzIG5vdCBhbGxvd2VkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ1x0JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7Mn1cdCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XHR7M30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ1x0ezN9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7Mn1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfXszfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidcdTAzOTQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3syfVx1MDM5NCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XHUwMzk0ezN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidcdTAzOTR7M30nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXFUwMDAwMDM5NCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XFUwMDAwMDM5NCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezJ9XFUwMDAwMDM5NHszfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnXFUwMDAwMDM5NHszfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidceDIwJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7Mn1ceDIwJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7Mn1ceDIwezN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZidceDIwezN9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJzJceDIwJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZicyXHgyMDMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJzJceDIwMyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgICMgQW5kIHRoZXNlIGRvbid0IHdvcmsgbm93LCBhbmQgc2hvdWxkbid0IHdvcmsgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2JhY2tzbGFzaGVzIG5vdCBhbGxvd2VkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3tcJ2FcJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3tcdDN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAjIGFkZCB0aGlzIHdoZW4gYmFja3NsYXNoZXMgYXJlIGFsbG93ZWQgYWdhaW4uIHNlZSBpc3N1ZSAyNzkyMQorICAgICMgdGhlc2UgdGVzdCB3aWxsIGJlIG5lZWRlZCBiZWNhdXNlIHVuaWNvZGUgbmFtZXMgd2lsbCBiZSBwYXJzZWQKKyAgICAjIGRpZmZlcmVudGx5IG9uY2UgYmFja3NsYXNoZXMgYXJlIGFsbG93ZWQgaW5zaWRlIGV4cHJlc3Npb25zCisgICAgIyMgZGVmIHRlc3RfbWlzZm9ybWVkX3VuaWNvZGVfY2hhcmFjdGVyX25hbWUoc2VsZik6CisgICAgIyMgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd4eCcsCisgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZidcTiciLAorICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYnXE57JyIsCisgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZidcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQSciLAorICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MH0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmYnJyd7MysKKzR9JycnLCAnNycpCisKKyAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CisgICAgICAgIHggPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyfScsICInODg4ODgnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpIXI6MTB9JywgIic4ODg4OCcgICAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iik6MTB9JywgIjg4ODg4ICAgICAiKQorCisgICAgICAgICMgbGFtYmRhIGRvZXNuJ3Qgd29yayB3aXRob3V0IHBhcmVucywgYmVjYXVzZSB0aGUgY29sb24KKyAgICAgICAgIyAgbWFrZXMgdGhlIHBhcnNlciB0aGluayBpdCdzIGEgZm9ybWF0X3NwZWMKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgRU9GIHdoaWxlIHBhcnNpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7bGFtYmRhIHg6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3lpZWxkKHNlbGYpOgorICAgICAgICAjIE5vdCB0ZXJyaWJseSB1c2VmdWwsIGJ1dCBtYWtlIHN1cmUgdGhlIHlpZWxkIHR1cm5zCisgICAgICAgICMgIGEgZnVuY3Rpb24gaW50byBhIGdlbmVyYXRvcgorICAgICAgICBkZWYgZm4oeSk6CisgICAgICAgICAgICBmJ3k6e3lpZWxkIHkqMn0nCisKKyAgICAgICAgZyA9IGZuKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgOCkKKworICAgIGRlZiB0ZXN0X3lpZWxkX3NlbmQoc2VsZik6CisgICAgICAgIGRlZiBmbih4KToKKyAgICAgICAgICAgIHlpZWxkIGYneDp7eWllbGQgKGxhbWJkYSBpOiB4ICogaSl9JworCisgICAgICAgIGcgPSBmbigxMCkKKyAgICAgICAgdGhlX2xhbWJkYSA9IG5leHQoZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVfbGFtYmRhKDQpLCA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLnNlbmQoJ3N0cmluZycpLCAneDpzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfZXhwcmVzc2lvbnNfd2l0aF90cmlwbGVfcXVvdGVkX3N0cmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycneCcnJ30iLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycnZXJpYydzJycnfSIsICJlcmljJ3MiKQorCisgICAgICAgICMgVGVzdCBjb25jYXRlbmF0aW9uIHdpdGhpbiBhbiBleHByZXNzaW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IngiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieCIgIiIiZXJpYyJzIiIifScsICd4ZXJpYyJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljInMiIiIgInkifScsICdlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAiIiJ5IiIifScsICd4ZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ciIiIngiIiIgIiIiZXJpYyJzIiIiICIiInkiIiJ9JywgJ3hlcmljInN5JykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3ZhcnMoc2VsZik6CisgICAgICAgIHggPSA5OAorICAgICAgICB5ID0gJ2FiYycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fScsICc5OGFiYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH17eX0nLCAnWDk4YWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX0nLCAnOThYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fVgnLCAnOThhYmNYJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fVl7eX0nLCAnWDk4WWFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9e3l9WScsICdYOThhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX1ZJywgJzk4WGFiY1knKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9WXt5fVonLCAnWDk4WWFiY1onKQorCisgICAgZGVmIHRlc3RfY2xvc3VyZShzZWxmKToKKyAgICAgICAgZGVmIG91dGVyKHgpOgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYneDp7eH0nCisgICAgICAgICAgICByZXR1cm4gaW5uZXIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKCc5ODcnKSgpLCAneDo5ODcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKDcpKCksICd4OjcnKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICB5ID0gMgorICAgICAgICBkZWYgZih4LCB3aWR0aCk6CisgICAgICAgICAgICByZXR1cm4gZid4PXt4Knk6e3dpZHRofX0nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKCdmb28nLCAxMCksICd4PWZvb2ZvbyAgICAnKQorICAgICAgICB4ID0gJ2JhcicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEwLCAxMCksICd4PSAgICAgICAgMjAnKQorCisgICAgZGVmIHRlc3RfbG9jYWxzKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IDEyMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYndjp7dmFsdWV9JywgJ3Y6MTIzJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFyaWFibGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIGYndjp7dmFsdWV9JworCisgICAgZGVmIHRlc3RfbWlzc2luZ19mb3JtYXRfc3BlYyhzZWxmKToKKyAgICAgICAgY2xhc3MgTzoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzcGVjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyonCisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp4fScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tPKCl9JywgJyonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp9JywgJyonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhczp9JywgJzMnKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6Z2xvYmFsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywgImc6J2dsb2JhbCB2YXJpYWJsZSciKQorCisgICAgICAgIGFfbG9jYWwgPSAnbG9jYWwgdmFyaWFibGUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnOmdsb2JhbCB2YXJpYWJsZSBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzonZ2xvYmFsIHZhcmlhYmxlJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6Z2xvYmFsIHZhcmlhYmxlIGw6J2xvY2FsIHZhcmlhYmxlJyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigibW9kdWxlICd1bml0dGVzdCcgZnJvbSIsIGYne3VuaXR0ZXN0fScpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dlZF9nbG9iYWwoc2VsZik6CisgICAgICAgIGFfZ2xvYmFsID0gJ3JlYWxseSBhIGxvY2FsJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6cmVhbGx5IGEgbG9jYWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLCAiZzoncmVhbGx5IGEgbG9jYWwnIikKKworICAgICAgICBhX2xvY2FsID0gJ2xvY2FsIHZhcmlhYmxlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWx9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZzpyZWFsbHkgYSBsb2NhbCBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzoncmVhbGx5IGEgbG9jYWwnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzpyZWFsbHkgYSBsb2NhbCBsOidsb2NhbCB2YXJpYWJsZSciKQorCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgZGVmIGZvbyh4KToKKyAgICAgICAgICAgIHJldHVybiAneD0nICsgc3RyKHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmb28oMTApfScsICd4PTEwJykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9mc3RyaW5ncyhzZWxmKToKKyAgICAgICAgeSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInswfSIqM30nLCAnMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInt5fSIqM30nLCAnNTU1JykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfc3RyaW5nX3ByZWZpeGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAndW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmVScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidUYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZnInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVVInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sZWFkaW5nX3RyYWlsaW5nX3NwYWNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sgM30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ICAzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIH0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyAgfScsICczJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZXhwcj17IHt4OiB5IGZvciB4LCB5IGluIFsoMSwgMiksIF19fScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHI9ezE6IDJ9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2V4cHI9eyB7eDogeSBmb3IgeCwgeSBpbiBbKDEsIDIpLCBdfSB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcj17MTogMn0nKQorCisgICAgZGVmIHRlc3Rfbm90X2VxdWFsKHNlbGYpOgorICAgICAgICAjIFRoZXJlJ3MgYSBzcGVjaWFsIHRlc3QgZm9yIHRoaXMgYmVjYXVzZSB0aGVyZSdzIGEgc3BlY2lhbAorICAgICAgICAjICBjYXNlIGluIHRoZSBmLXN0cmluZyBwYXJzZXIgdG8gbG9vayBmb3IgIT0gYXMgbm90IGVuZGluZyBhbgorICAgICAgICAjICBleHByZXNzaW9uLiBOb3JtYWxseSBpdCB3b3VsZCwgd2hpbGUgbG9va2luZyBmb3IgIXMgb3IgIXIuCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00fScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00On0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzfScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00IXM6LjN9JywgJ1RydScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OjEwLjEwfScsICcgICAgICAzLjE0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXM6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhcjoxMC4xMH0nLCAnMy4xNCAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFhOjEwLjEwfScsICczLjE0ICAgICAgJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIn0nLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIXJ9JywgIidhJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIWF9JywgIidhJyIpCisKKyAgICAgICAgIyBOb3QgYSBjb252ZXJzaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIXIifScsICJhIXIiKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbiwgYnV0IHNob3cgdGhhdCAhIGlzIGFsbG93ZWQgaW4gYSBmb3JtYXQgc3BlYy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OiE8MTAuMTB9JywgJzMuMTQhISEhISEnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogaW52YWxpZCBjb252ZXJzaW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szIWd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szISF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szITp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szISBzfSciLCAgIyBubyBzcGFjZSBiZWZvcmUgY29udmVyc2lvbiBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne3ghc3t5fX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhc3N9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzOn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhc3M6c30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJycgPSAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezB9JyA9IHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7eH0nID0geCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kZWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJkZWwgZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlbCAnJyBmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbWlzbWF0Y2hlZF9icmFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t7fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e319fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h9eCciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FuJ3QgaGF2ZSB7IG9yIH0gaW4gYSBmb3JtYXQgc3BlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6fT4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6fX0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezM6e3s+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szISciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MzonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzOiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzOjMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneHsnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneHt4JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOnMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7fX17JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3snIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIEJ1dCB0aGVzZSBhcmUganVzdCBub3JtYWwgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieyJ9JywgJ3snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ9In0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp7In0ifT4xMH0nLCAnfX19fX19fX19MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mjp7InsifT4xMH0nLCAne3t7e3t7e3t7MicpCisKKyAgICBkZWYgdGVzdF9pZl9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIHNwZWNpYWwgbG9naWMgaW4gY29tcGlsZS5jIHRvIHRlc3QgaWYgdGhlCisgICAgICAgICMgIGNvbmRpdGlvbmFsIGZvciBhbiBpZiAoYW5kIHdoaWxlKSBhcmUgY29uc3RhbnRzLiBFeGVyY2lzZQorICAgICAgICAjICB0aGF0IGNvZGUuCisKKyAgICAgICAgZGVmIHRlc3RfZnN0cmluZyh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9lbXB0eSh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgJycgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcgJyBmJ3t4fSc6CisgICAgICAgICAgICAgICAgZmxhZyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmxhZyA9IDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgZXhwZWN0ZWQpCisKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcnLCAyKQorICAgICAgICB0ZXN0X2ZzdHJpbmcoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X2VtcHR5KCcnLCAyKQorICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnICcsIDEpCisKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcnLCAxKQorICAgICAgICB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoJyAnLCAxKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZm9ybWF0X3NwZWNpZmllcihzZWxmKToKKyAgICAgICAgeCA9ICd0ZXN0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3g6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXM6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXI6fScsICIndGVzdCciKQorCisgICAgZGVmIHRlc3Rfc3RyX2Zvcm1hdF9kaWZmZXJlbmNlcyhzZWxmKToKKyAgICAgICAgZCA9IHsnYSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgIDA6ICdpbnRlZ2VyJywKKyAgICAgICAgICAgICB9CisgICAgICAgIGEgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFswXX0nLCAnaW50ZWdlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiYSJdfScsICdzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbYV19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7ZFthXX0nLmZvcm1hdChkPWQpLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbMF19Jy5mb3JtYXQoZD1kKSwgJ2ludGVnZXInKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3thWzQpfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne2EoNF19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgMjYyODcKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShUeXBlRXJyb3IsICdub24tZW1wdHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYneyhsYW1iZGE6IDApOnh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7KDAsKTp4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFZhbHVlRXJyb3IsICdVbmtub3duIGZvcm1hdCBjb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3sxMDAwOmp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7MTAwMDpqfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sb29wKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidpOntpfScsICdpOicgKyBzdHIoaSkpCisKKyAgICBkZWYgdGVzdF9kaWN0KHNlbGYpOgorICAgICAgICBkID0geyciJzogJ2RxdW90ZScsCisgICAgICAgICAgICAgIiciOiAnc3F1b3RlJywKKyAgICAgICAgICAgICAnZm9vJzogJ2JhcicsCisgICAgICAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyd7ZFsiJyJdfScnJywgJ3NxdW90ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiIiIntkWyciJ119IiIiLCAnZHF1b3RlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbImZvbyJdfScsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbJ2ZvbyddfSIsICdiYXInKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQppbmRleCBhZWY2NmRhLi45ZDhkZTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQpAQCAtMTA0OSwxMCArMTA0OSwxOSBAQAogICAgICAgICBmdHAuY2xvc2UoKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZShUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J01TR19PT0InLCAnRlRQX1BPUlQnLCAnTUFYTElORScsICdDUkxGJywgJ0JfQ1JMRicsCisgICAgICAgICAgICAgICAgICAgICAnRXJyb3InLCAncGFyc2UxNTAnLCAncGFyc2UyMjcnLCAncGFyc2UyMjknLCAncGFyc2UyNTcnLAorICAgICAgICAgICAgICAgICAgICAgJ3ByaW50X2xpbmUnLCAnZnRwY3AnLCAndGVzdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZ0cGxpYiwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbVGVzdEZUUENsYXNzLCBUZXN0VGltZW91dHMsCiAgICAgICAgICAgICAgVGVzdElQdjZFbnZpcm9ubWVudCwKLSAgICAgICAgICAgICBUZXN0VExTX0ZUUENsYXNzTWl4aW4sIFRlc3RUTFNfRlRQQ2xhc3NdCisgICAgICAgICAgICAgVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzLAorICAgICAgICAgICAgIE1pc2NUZXN0Q2FzZV0KIAogICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggYWI1MWEzNS4uNDBmMjIzNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTE1NDgsMTMgKzE1NDgsMTUgQEAKICAgICAgICAgYmFzZXMgPSBbYy5TZXF1ZW5jZSwgYy5NdXRhYmxlTWFwcGluZywgYy5NYXBwaW5nLCBjLlNldF0KICAgICAgICAgZm9yIGhheXN0YWNrIGluIHBlcm11dGF0aW9ucyhiYXNlcyk6CiAgICAgICAgICAgICBtID0gbXJvKGRpY3QsIGhheXN0YWNrKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbZGljdCwgYy5NdXRhYmxlTWFwcGluZywgYy5NYXBwaW5nLCBjLlNpemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5JdGVyYWJsZSwgYy5Db250YWluZXIsIG9iamVjdF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIFtkaWN0LCBjLk11dGFibGVNYXBwaW5nLCBjLk1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbGxlY3Rpb24sIGMuU2l6ZWQsIGMuSXRlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbnRhaW5lciwgb2JqZWN0XSkKICAgICAgICAgYmFzZXMgPSBbYy5Db250YWluZXIsIGMuTWFwcGluZywgYy5NdXRhYmxlTWFwcGluZywgYy5PcmRlcmVkRGljdF0KICAgICAgICAgZm9yIGhheXN0YWNrIGluIHBlcm11dGF0aW9ucyhiYXNlcyk6CiAgICAgICAgICAgICBtID0gbXJvKGMuQ2hhaW5NYXAsIGhheXN0YWNrKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbYy5DaGFpbk1hcCwgYy5NdXRhYmxlTWFwcGluZywgYy5NYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5TaXplZCwgYy5JdGVyYWJsZSwgYy5Db250YWluZXIsIG9iamVjdF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbGxlY3Rpb24sIGMuU2l6ZWQsIGMuSXRlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLkNvbnRhaW5lciwgb2JqZWN0XSkKIAogICAgICAgICAjIElmIHRoZXJlJ3MgYSBnZW5lcmljIGZ1bmN0aW9uIHdpdGggaW1wbGVtZW50YXRpb25zIHJlZ2lzdGVyZWQgZm9yCiAgICAgICAgICMgYm90aCBTaXplZCBhbmQgQ29udGFpbmVyLCBwYXNzaW5nIGEgZGVmYXVsdGRpY3QgdG8gaXQgcmVzdWx0cyBpbiBhbgpAQCAtMTU3NSw5ICsxNTc3LDkgQEAKICAgICAgICAgYmFzZXMgPSBbYy5NdXRhYmxlU2VxdWVuY2UsIGMuTXV0YWJsZU1hcHBpbmddCiAgICAgICAgIGZvciBoYXlzdGFjayBpbiBwZXJtdXRhdGlvbnMoYmFzZXMpOgogICAgICAgICAgICAgbSA9IG1ybyhELCBiYXNlcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobSwgW0QsIGMuTXV0YWJsZVNlcXVlbmNlLCBjLlNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5kZWZhdWx0ZGljdCwgZGljdCwgYy5NdXRhYmxlTWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuTWFwcGluZywgYy5TaXplZCwgYy5JdGVyYWJsZSwgYy5Db250YWluZXIsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIFtELCBjLk11dGFibGVTZXF1ZW5jZSwgYy5TZXF1ZW5jZSwgYy5SZXZlcnNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5kZWZhdWx0ZGljdCwgZGljdCwgYy5NdXRhYmxlTWFwcGluZywgYy5NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Db2xsZWN0aW9uLCBjLlNpemVkLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF0pCiAKICAgICAgICAgIyBDb250YWluZXIgYW5kIENhbGxhYmxlIGFyZSByZWdpc3RlcmVkIG9uIGRpZmZlcmVudCBiYXNlIGNsYXNzZXMgYW5kCkBAIC0xNTkwLDcgKzE1OTIsOCBAQAogICAgICAgICBmb3IgaGF5c3RhY2sgaW4gcGVybXV0YXRpb25zKGJhc2VzKToKICAgICAgICAgICAgIG0gPSBtcm8oQywgaGF5c3RhY2spCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIFtDLCBjLkNhbGxhYmxlLCBjLmRlZmF1bHRkaWN0LCBkaWN0LCBjLk1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLlNpemVkLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwgb2JqZWN0XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ29sbGVjdGlvbiwgYy5TaXplZCwgYy5JdGVyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ29udGFpbmVyLCBvYmplY3RdKQogCiAgICAgZGVmIHRlc3RfcmVnaXN0ZXJfYWJjKHNlbGYpOgogICAgICAgICBjID0gY29sbGVjdGlvbnMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkgYi9MaWIvdGVzdC90ZXN0X2djLnB5CmluZGV4IGE0ZDY4NGIuLmU3Mjc0OTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nYy5weQpAQCAtNjg0LDcgKzY4NCw2IEBACiAgICAgICAgICMgQ3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlIHRocm91Z2ggdGhlIF9fbWFpbl9fIG1vZHVsZSBhbmQgY2hlY2sKICAgICAgICAgIyBpdCBnZXRzIGNvbGxlY3RlZCBhdCBpbnRlcnByZXRlciBzaHV0ZG93bi4KICAgICAgICAgY29kZSA9ICIiImlmIDE6Ci0gICAgICAgICAgICBpbXBvcnQgd2Vha3JlZgogICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ19fZGVsX18gY2FsbGVkJykKQEAgLTY5OSw3ICs2OTgsNiBAQAogICAgICAgICAjIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGEgbm9uLV9fbWFpbl9fIG1vZHVsZS4KICAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CiAgICAgICAgICAgICBtb2R1bGUgPSAiIiJpZiAxOgotICAgICAgICAgICAgICAgIGltcG9ydCB3ZWFrcmVmCiAgICAgICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnX19kZWxfXyBjYWxsZWQnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZGIucHkgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQppbmRleCAzZGIxMGI2Li4wOWJhZmJkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQpAQCAtNSw3ICs1LDYgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKLWltcG9ydCBwcHJpbnQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3lzY29uZmlnCkBAIC0xNzcsNiArMTc2LDcgQEAKICAgICAgICAgYXJncyA9IFsnLS1ldmFsLWNvbW1hbmQ9JXMnICUgY21kIGZvciBjbWQgaW4gY29tbWFuZHNdCiAgICAgICAgIGFyZ3MgKz0gWyItLWFyZ3MiLAogICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZV0KKyAgICAgICAgYXJncy5leHRlbmQoc3VicHJvY2Vzcy5fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkpCiAKICAgICAgICAgaWYgbm90IGltcG9ydF9zaXRlOgogICAgICAgICAgICAgIyAtUyBzdXBwcmVzc2VzIHRoZSBkZWZhdWx0ICdpbXBvcnQgc2l0ZScKQEAgLTI5Miw3ICsyOTIsOSBAQAogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgZGljdGlvbmFyaWVzJwogICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoe30pCiAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInfSwgInsnZm9vJzogJ2Jhcid9IikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzogNDJ9LCAieydkb3VnbGFzJzogNDIsICdmb28nOiAnYmFyJ30iKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBpdGVtIG9yZGVyCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzogNDJ9LCAieydkb3VnbGFzJzogNDIsICdmb28nOiAnYmFyJ30iKQogCiAgICAgZGVmIHRlc3RfbGlzdHMoc2VsZik6CiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBsaXN0cycKQEAgLTM1NSw5ICszNTcsMTIgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIHNldHMnCiAgICAgICAgIGlmIChnZGJfbWFqb3JfdmVyc2lvbiwgZ2RiX21pbm9yX3ZlcnNpb24pIDwgKDcsIDMpOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicHJldHR5LXByaW50aW5nIG9mIHNldHMgbmVlZHMgZ2RiIDcuMyBvciBsYXRlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoKSwgJ3NldCgpJykKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbJ2EnLCAnYiddKSwgInsnYScsICdiJ30iKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFs0LCA1LCA2XSksICJ7NCwgNSwgNn0iKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KCksICJzZXQoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJ10pLCAieydhJ30iKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBmcm96ZW5zZXQgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJywgJ2InXSksICJ7J2EnLCAnYid9IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWzQsIDUsIDZdKSwgIns0LCA1LCA2fSIpCiAKICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBoYW5kbGUgc2V0cyBjb250YWluaW5nIHRoZSAiZHVtbXkiIGtleSB2YWx1ZSwKICAgICAgICAgIyB3aGljaCBoYXBwZW5zIG9uIGRlbGV0aW9uOgpAQCAtMzcwLDkgKzM3NSwxMiBAQAogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgZnJvemVuc2V0cycKICAgICAgICAgaWYgKGdkYl9tYWpvcl92ZXJzaW9uLCBnZGJfbWlub3JfdmVyc2lvbikgPCAoNywgMyk6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJwcmV0dHktcHJpbnRpbmcgb2YgZnJvemVuc2V0cyBuZWVkcyBnZGIgNy4zIG9yIGxhdGVyIikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldCgpLCAnZnJvemVuc2V0KCknKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYScsICdiJ10pLCAiZnJvemVuc2V0KHsnYScsICdiJ30pIikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbNCwgNSwgNl0pLCAiZnJvemVuc2V0KHs0LCA1LCA2fSkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KCksICJmcm96ZW5zZXQoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWydhJ10pLCAiZnJvemVuc2V0KHsnYSd9KSIpCisgICAgICAgICMgUFlUSE9OSEFTSFNFRUQgaXMgbmVlZCB0byBnZXQgdGhlIGV4YWN0IGZyb3plbnNldCBpdGVtIG9yZGVyCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbJ2EnLCAnYiddKSwgImZyb3plbnNldCh7J2EnLCAnYid9KSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFs0LCA1LCA2XSksICJmcm96ZW5zZXQoezQsIDUsIDZ9KSIpCiAKICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIFRlc3QgYSBSdW50aW1lRXJyb3IKQEAgLTUwMSw2ICs1MDksMTAgQEAKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5zX2hlbHAoc2VsZik6CiAgICAgICAgICdFbnN1cmUgdGhhdCB0aGUgbmV3LXN0eWxlIGNsYXNzIF9IZWxwZXIgaW4gc2l0ZS5weSBjYW4gYmUgaGFuZGxlZCcKKworICAgICAgICBpZiBzeXMuZmxhZ3Mubm9fc2l0ZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm5lZWQgc2l0ZSBtb2R1bGUsIGJ1dCAtUyBvcHRpb24gd2FzIHVzZWQiKQorCiAgICAgICAgICMgKHRoaXMgd2FzIHRoZSBpc3N1ZSBjYXVzaW5nIHRyYWNlYmFja3MgaW4KICAgICAgICAgIyAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTgwMzIjbXNnMTAwNTM3ICkKICAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignaWQoX19idWlsdGluc19fLmhlbHApJywgaW1wb3J0X3NpdGU9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQppbmRleCAzZjgyNDYyLi5mNGIzM2FmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogICAgICAgICAgICAgeWllbGQKIAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24pLCBcCi0gICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKIAogICAgICAgICAgICAgbmV4dChnZW4oKSkKIAotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0b3IgLiogcmFpc2VkIFN0b3BJdGVyYXRpb24iKSwgXAogICAgICAgICAgICAgIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICBnID0gZigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgMSkKIAotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24pOgogICAgICAgICAgICAgICAgIG5leHQoZykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKaW5kZXggYjc3ZDFkNy4uYzhmMTU4ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CkBAIC0xMCwxMSArMTAsOSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAotZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6Ci0gICAgdHJ5OgotICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBwYXNzCitkZWYgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGRhdGE9Yidmb28nKToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd4YicsIDApIGFzIGZwOgorICAgICAgICBmcC53cml0ZShkYXRhKQogCiAKIGNsYXNzIEdlbmVyaWNUZXN0OgpAQCAtOTcsNTIgKzk1LDQ3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczFbbjpuKzFdLCBzMltuOm4rMV0pCiAKICAgICBkZWYgdGVzdF9nZXRzaXplKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUoc3VwcG9ydC5URVNURk4pLCAzKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKIAotICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6Ci0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJhYiIpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZShmaWxlbmFtZSksIDUpCisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidIZWxsbyBXb3JsZCEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aG1vZHVsZS5nZXRzaXplKGZpbGVuYW1lKSwgMTIpCisKKyAgICBkZWYgdGVzdF9maWxldGltZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ2ZvbycpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAiYWIiLCAwKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImJhciIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKQotICAgICAgICAgICAgZCA9IGYucmVhZCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgYiJmb29iYXIiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgKLSAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRtdGltZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgICkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImZvb2JhciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoZmlsZW5hbWUpLAorICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldG10aW1lKGZpbGVuYW1lKQorICAgICAgICApCiAKICAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAieGIiKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXRobW9kdWxlID09IGdlbmVyaWNwYXRoOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmxleGlzdHMoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhtb2R1bGUgPT0gZ2VuZXJpY3BhdGg6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKGZpbGVuYW1lKSwgVHJ1ZSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJwaXBlIiksICJyZXF1aXJlcyBvcy5waXBlKCkiKQogICAgIGRlZiB0ZXN0X2V4aXN0c19mZChzZWxmKToKQEAgLTE1NCw1MyArMTQ3LDY2IEBACiAgICAgICAgICAgICBvcy5jbG9zZSh3KQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5leGlzdHMocikpCiAKLSAgICBkZWYgdGVzdF9pc2RpcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIHNhZmVfcm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgZGVmIHRlc3RfaXNkaXJfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQogCi0gICAgZGVmIHRlc3RfaXNmaWxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2FmZV9ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCiAKLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9jcmVhdGVfZmlsZShmaWxlbmFtZSk6Ci0gICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoYidmb28nKQorICAgIGRlZiB0ZXN0X2lzZGlyX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgb3MubWtkaXIoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzZmlsZV9maWxlKHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNmaWxlX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIG9zLm1rZGlyKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X3NhbWVmaWxlKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0X2ZuID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4sIHRlc3RfZm4pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgZmlsZTEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBmaWxlMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUxKSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUyKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSkKKworICAgIGRlZiBfdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6CisgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4xKQorCisgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCisgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUodGVzdF9mbjEsIHRlc3RfZm4yKSkKIAogICAgIEBzdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9zeW1saW5rKHNlbGYpOgpAQCAtMjA5LDMxICsyMTUsMzcgQEAKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9saW5rKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhvcy5saW5rKQogCi0gICAgZGVmIF90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhzZWxmLCBmdW5jKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjEpCi0KLSAgICAgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjEpCi0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCi0KICAgICBkZWYgdGVzdF9zYW1lc3RhdChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbiA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuKQotICAgICAgICAgICAgdGVzdF9mbnMgPSBbdGVzdF9mbl0qMgotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjEpCisgICAgICAgIHN0YXQxID0gb3Muc3RhdCh0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChzdGF0MSwgb3Muc3RhdCh0ZXN0X2ZuMSkpKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4yKQorICAgICAgICBzdGF0MiA9IG9zLnN0YXQodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KHN0YXQxLCBzdGF0MikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQpCisKKyAgICBkZWYgX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKKyAgICAgICAgZnVuYyh0ZXN0X2ZuMSwgdGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQob3Muc3RhdCh0ZXN0X2ZuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X2ZuMikpKQorICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KG9zLnN0YXQodGVzdF9mbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3RfZm4yKSkpCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fc3ltbGluayhzZWxmKToKQEAgLTI0MiwzMSArMjU0LDE3IEBACiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fbGluayhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMob3MubGluaykKIAotICAgIGRlZiBfdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4xKQotICAgICAgICAgICAgdGVzdF9mbnMgPSAodGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgZnVuYygqdGVzdF9mbnMpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQoKnN0YXRzKSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjIpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4xKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCiAgICAgZGVmIHRlc3Rfc2FtZW9wZW5maWxlKHNlbGYpOgotICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgIHdpdGggb3BlbihmbmFtZSwgIndiIikgYXMgYSwgb3BlbihmbmFtZSwgIndiIikgYXMgYjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZW9wZW5maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmZpbGVubygpLCBiLmZpbGVubygpKSkKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSkKKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGZwMToKKyAgICAgICAgICAgIGZkMSA9IGZwMS5maWxlbm8oKQorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmcDI6CisgICAgICAgICAgICAgICAgZmQyID0gZnAyLmZpbGVubygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lb3BlbmZpbGUoZmQxLCBmZDIpKQorCiAKIGNsYXNzIFRlc3RHZW5lcmljVGVzdChHZW5lcmljVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgSXNzdWUgMTY4NTI6IEdlbmVyaWNUZXN0IGNhbid0IGluaGVyaXQgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZQpAQCAtNDUyLDE2ICs0NTAsMTUgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmpvaW4oJ3N0cicsIGInYnl0ZXMnKQogICAgICAgICAgICAgIyByZWdyZXNzaW9uLCBzZWUgIzE1Mzc3Ci0gICAgICAgICAgICBlcnJtc2cgPSByJ2pvaW5cKFwpIGFyZ3VtZW50IG11c3QgYmUgc3RyIG9yIGJ5dGVzLCBub3QgJXInCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cgJSAnaW50Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnaW50Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmpvaW4oNDIsICdzdHInKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2ludCcpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ2ludCcpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5qb2luKCdzdHInLCA0MikKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyAlICdpbnQnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdpbnQnKToKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuam9pbig0MikKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyAlICdsaXN0Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnbGlzdCcpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5qb2luKFtdKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2J5dGVhcnJheScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ2J5dGVhcnJheScpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5qb2luKGJ5dGVhcnJheShiJ2ZvbycpLCBieXRlYXJyYXkoYidiYXInKSkKIAogICAgIGRlZiB0ZXN0X3JlbHBhdGhfZXJyb3JzKHNlbGYpOgpAQCAtNDczLDE0ICs0NzAsNTkgQEAKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUucmVscGF0aChiJ2J5dGVzJywgJ3N0cicpCiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5yZWxwYXRoKCdzdHInLCBiJ2J5dGVzJykKLSAgICAgICAgICAgIGVycm1zZyA9IHIncmVscGF0aFwoXCkgYXJndW1lbnQgbXVzdCBiZSBzdHIgb3IgYnl0ZXMsIG5vdCAlcicKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIGVycm1zZyAlICdpbnQnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdpbnQnKToKICAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUucmVscGF0aCg0MiwgJ3N0cicpCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCBlcnJtc2cgJSAnaW50Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnaW50Jyk6CiAgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLnJlbHBhdGgoJ3N0cicsIDQyKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgZXJybXNnICUgJ2J5dGVhcnJheScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ2J5dGVhcnJheScpOgogICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5yZWxwYXRoKGJ5dGVhcnJheShiJ2ZvbycpLCBieXRlYXJyYXkoYidiYXInKSkKIAogCitjbGFzcyBQYXRoTGlrZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNsYXNzIFBhdGhMaWtlOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD0nJyk6CisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhdGgsIEJhc2VFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYucGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gc3VwcG9ydC5URVNURk4ubG93ZXIoKQorICAgICAgICBzZWxmLmZpbGVfcGF0aCA9IHNlbGYuUGF0aExpa2Uoc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5maWxlX25hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZmlsZV9uYW1lLCBiInRlc3RfZ2VuZXJpY3BhdGguUGF0aExpa2VUZXN0cyIpCisKKyAgICBkZWYgYXNzZXJ0UGF0aEVxdWFsKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoc2VsZi5maWxlX3BhdGgpLCBmdW5jKHNlbGYuZmlsZV9uYW1lKSkKKworICAgIGRlZiB0ZXN0X3BhdGhfZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChvcy5wYXRoLmV4aXN0cykKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChvcy5wYXRoLmlzZmlsZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguaXNkaXIpCisKKyAgICBkZWYgdGVzdF9wYXRoX2NvbW1vbnByZWZpeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmNvbW1vbnByZWZpeChbc2VsZi5maWxlX3BhdGgsIHNlbGYuZmlsZV9uYW1lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlX25hbWUpCisKKyAgICBkZWYgdGVzdF9wYXRoX2dldHNpemUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguZ2V0c2l6ZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfZ2V0bXRpbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKG9zLnBhdGguZ2V0YXRpbWUpCisKKyAgICBkZWYgdGVzdF9wYXRoX2dldGN0aW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChvcy5wYXRoLmdldGN0aW1lKQorCisgICAgZGVmIHRlc3RfcGF0aF9zYW1lZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguc2FtZWZpbGUoc2VsZi5maWxlX3BhdGgsIHNlbGYuZmlsZV9uYW1lKSkKKworCiBpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IDk4NGFhYzcuLjE2ZTE2M2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtMzY1LDcgKzM2NSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEZsb2F0U3ViY2xhc3MoNy41KSksIDcuNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoRmxvYXRTdWJjbGFzczIoNy41KSksIDcuNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2YsIEJhZEZsb2F0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0MigpKSwgNC4yNSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZihCYWRGbG9hdDIoKSksIDQuMjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0Myg3LjUpKSwgNy41KQogCiAgICAgICAgIGZvciB4IGluIChGTFRfTUlOLCAtRkxUX01JTiwgRkxUX01BWCwgLUZMVF9NQVgsIElORiwgLUlORik6CkBAIC0zOTAsNyArMzkxLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoRmxvYXRTdWJjbGFzcyg3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChGbG9hdFN1YmNsYXNzMig3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZCwgQmFkRmxvYXQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQyKCkpLCA0LjI1KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19kKEJhZEZsb2F0MigpKSwgNC4yNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQzKDcuNSkpLCA3LjUpCiAKICAgICAgICAgZm9yIHggaW4gKERCTF9NSU4sIC1EQkxfTUlOLCBEQkxfTUFYLCAtREJMX01BWCwgSU5GLCAtSU5GKToKQEAgLTQ3NCw3ICs0NzYsNyBAQAogCiAgICAgICAgIHJldCA9IGdldF9hcmdzKCpUdXBsZVN1YmNsYXNzKFsxLCAyXSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAoMSwgMikpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXQsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocmV0KSwgdHVwbGUpCiAKICAgICAgICAgcmV0ID0gZ2V0X2FyZ3MoKQogICAgICAgICBzZWxmLmFzc2VydEluKHJldCwgKCgpLCBOb25lKSkKQEAgLTUxMiw3ICs1MTQsNyBAQAogCiAgICAgICAgIHJldCA9IGdldF9rd2FyZ3MoKipEaWN0U3ViY2xhc3MoeydhJzogMSwgJ2InOiAyfSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCB7J2EnOiAxLCAnYic6IDJ9KQotICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmV0LCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocmV0KSwgZGljdCkKIAogICAgICAgICByZXQgPSBnZXRfa3dhcmdzKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihyZXQsICh7fSwgTm9uZSkpCkBAIC02NTYsNiArNjU4LDM5IEBACiAgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRfb25seSgxLCAyLCAqKnsnXHVEQzgwJzogMTB9KQogCiAKK2NsYXNzIFBvc2l0aW9uYWxPbmx5QW5kS2V5d29yZHNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMgYXMgZ2V0YXJncworCisgICAgZGVmIHRlc3RfcG9zaXRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICAjIHVzaW5nIGFsbCBwb3NzaWJsZSBwb3NpdGlvbmFsIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSwgMiwgMyksICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X21peGVkX2FyZ3Moc2VsZik6CisgICAgICAgICMgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIDIsIGtleXdvcmQ9MyksICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X29wdGlvbmFsX2FyZ3Moc2VsZik6CisgICAgICAgICMgbWlzc2luZyBvcHRpb25hbCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIDIpLCAoMSwgMiwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxLCBrZXl3b3JkPTMpLCAoMSwgLTEsIDMpKQorCisgICAgZGVmIHRlc3RfcmVxdWlyZWRfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSksICgxLCAtMSwgLTEpKQorICAgICAgICAjIHJlcXVpcmVkIHBvc2l0aW9uYWwgYXJnIG1pc3NpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAxIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMCBnaXZlblwpIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3MoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKSIpOgorICAgICAgICAgICAgc2VsZi5nZXRhcmdzKGtleXdvcmQ9MykKKworICAgIGRlZiB0ZXN0X2VtcHR5X2tleXdvcmQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAiJycgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3MoMSwgMiwgKip7Jyc6IDY2Nn0pCisKKwogY2xhc3MgQnl0ZXNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Moc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2MKQEAgLTgyMiwxMCArODU3LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19lc19oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X2V0X2hhc2goc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2V0X2hhc2gKQEAgLTg0OCwxMCArODgzLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19ldF9oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X3Uoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQppbmRleCBkZTYxMGM3Li5kMzQ1YmFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IG9zCiBpbXBvcnQgYmFzZTY0Ci1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgZ2V0dGV4dAogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTQ0MCw2ICs0MzksMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYzJweScsICdFTk9FTlQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBnZXR0ZXh0LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IDE1NGUzYjYuLmJmZTUyMjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTI5NSw2ICsyOTUsMTAgQEAKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCiAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqKTogcGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZGVmIGYoKiwpOiBwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqLCAqKmt3ZHMpOiBwYXNzIikKKwogICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzIGFmdGVyICphcmdsaXN0CiAgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICByZXR1cm4gYXJncywga3dhcmdzCkBAIC0zNDEsNyArMzQ1LDcgQEAKICAgICAgICAgZGVmIGYoeCkgLT4gbGlzdDogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuX19hbm5vdGF0aW9uc19fLCB7J3JldHVybic6IGxpc3R9KQogCi0gICAgICAgICMgdGVzdCBNQUtFX0NMT1NVUkUgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncworICAgICAgICAjIHRlc3QgY2xvc3VyZXMgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmdzCiAgICAgICAgIGNsb3N1cmUgPSAxCiAgICAgICAgIGRlZiBmKCk6IHJldHVybiBjbG9zdXJlCiAgICAgICAgIGRlZiBmKHg9MSk6IHJldHVybiBjbG9zdXJlCkBAIC0zNTIsNiArMzU2LDIzIEBACiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqZygxPTIpKSIpCiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqKmcoMT0yKSkiKQogCisgICAgICAgICMgQ2hlY2sgdHJhaWxpbmcgY29tbWFzIGFyZSBwZXJtaXR0ZWQgaW4gZnVuY2RlZiBhcmd1bWVudCBsaXN0CisgICAgICAgIGRlZiBmKGEsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywpOiBwYXNzCisgICAgICAgIGRlZiBmKCoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsIGIsKTogcGFzcworICAgICAgICBkZWYgZigqLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiwgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiwgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsIGIsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICosIGIsICoqa3dkcywpOiBwYXNzCisKICAgICBkZWYgdGVzdF9sYW1iZGVmKHNlbGYpOgogICAgICAgICAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAogICAgICAgICBsMSA9IGxhbWJkYSA6IDAKQEAgLTM3MCw2ICszOTEsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNigxLDIpLCAxKzIrMjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDYoMSwyLGs9MTApLCAxKzIrMTApCiAKKyAgICAgICAgIyBjaGVjayB0aGF0IHRyYWlsaW5nIGNvbW1hcyBhcmUgcGVybWl0dGVkCisgICAgICAgIGwxMCA9IGxhbWJkYSBhLDogMAorICAgICAgICBsMTEgPSBsYW1iZGEgKmFyZ3MsOiAwCisgICAgICAgIGwxMiA9IGxhbWJkYSAqKmt3ZHMsOiAwCisgICAgICAgIGwxMyA9IGxhbWJkYSBhLCAqYXJncyw6IDAKKyAgICAgICAgbDE0ID0gbGFtYmRhIGEsICoqa3dkcyw6IDAKKyAgICAgICAgbDE1ID0gbGFtYmRhICphcmdzLCBiLDogMAorICAgICAgICBsMTYgPSBsYW1iZGEgKiwgYiw6IDAKKyAgICAgICAgbDE3ID0gbGFtYmRhICphcmdzLCAqKmt3ZHMsOiAwCisgICAgICAgIGwxOCA9IGxhbWJkYSBhLCAqYXJncywgYiw6IDAKKyAgICAgICAgbDE5ID0gbGFtYmRhIGEsICosIGIsOiAwCisgICAgICAgIGwyMCA9IGxhbWJkYSBhLCAqYXJncywgKiprd2RzLDogMAorICAgICAgICBsMjEgPSBsYW1iZGEgKmFyZ3MsIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIyID0gbGFtYmRhICosIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIzID0gbGFtYmRhIGEsICphcmdzLCBiLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyNCA9IGxhbWJkYSBhLCAqLCBiLCAqKmt3ZHMsOiAwCisKIAogICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKICAgICAjIFRlc3RlZCBiZWxvdwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncnAucHkgYi9MaWIvdGVzdC90ZXN0X2dycC5weQppbmRleCAyNzJiMDg2Li42OTA5NWEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dycC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dycC5weQpAQCAtOTIsNSArOTIsMTUgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZ3JwLmdldGdyZ2lkLCBmYWtlZ2lkKQogCisgICAgZGVmIHRlc3Rfbm9uaW50ZWdlcl9naWQoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBncnAuZ2V0Z3JhbGwoKQorICAgICAgICBpZiBub3QgZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIGdyb3VwcycpCisgICAgICAgICMgQ2hvb3NlIGFuIGV4aXN0ZW50IGdpZC4KKyAgICAgICAgZ2lkID0gZW50cmllc1swXVsyXQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBmbG9hdChnaWQpKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBzdHIoZ2lkKSkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5IGIvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5CmluZGV4IGM5YjExM2UuLmU5NGZjM2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hhc2hsaWIucHkKQEAgLTcsNiArNyw3IEBACiAjCiAKIGltcG9ydCBhcnJheQorZnJvbSBiaW5hc2NpaSBpbXBvcnQgdW5oZXhsaWZ5CiBpbXBvcnQgaGFzaGxpYgogaW1wb3J0IGl0ZXJ0b29scwogaW1wb3J0IG9zCkBAIC0yNiw2ICsyNywxNCBAQAogY19oYXNobGliID0gaW1wb3J0X2ZyZXNoX21vZHVsZSgnaGFzaGxpYicsIGZyZXNoPVsnX2hhc2hsaWInXSkKIHB5X2hhc2hsaWIgPSBpbXBvcnRfZnJlc2hfbW9kdWxlKCdoYXNobGliJywgYmxvY2tlZD1bJ19oYXNobGliJ10pCiAKK3RyeToKKyAgICBpbXBvcnQgX2JsYWtlMgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9ibGFrZTIgPSBOb25lCisKK3JlcXVpcmVzX2JsYWtlMiA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoX2JsYWtlMiwgJ3JlcXVpcmVzIF9ibGFrZTInKQorCisKIGRlZiBoZXhzdHIocyk6CiAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocywgYnl0ZXMpLCByZXByKHMpCiAgICAgaCA9ICIwMTIzNDU2Nzg5YWJjZGVmIgpAQCAtMzUsMTAgKzQ0LDI0IEBACiAgICAgcmV0dXJuIHIKIAogCitVUkwgPSAiaHR0cDovL3d3dy5weXRob250ZXN0Lm5ldC9oYXNobGliL3t9LnR4dCIKKworZGVmIHJlYWRfdmVjdG9ycyhoYXNoX25hbWUpOgorICAgIHdpdGggc3VwcG9ydC5vcGVuX3VybHJlc291cmNlKFVSTC5mb3JtYXQoaGFzaF9uYW1lKSkgYXMgZjoKKyAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoJywnKQorICAgICAgICAgICAgcGFydHNbMF0gPSBieXRlcy5mcm9taGV4KHBhcnRzWzBdKQorICAgICAgICAgICAgeWllbGQgcGFydHMKKworCiBjbGFzcyBIYXNoTGliVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIHN1cHBvcnRlZF9oYXNoX25hbWVzID0gKCAnbWQ1JywgJ01ENScsICdzaGExJywgJ1NIQTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhMjI0JywgJ1NIQTIyNCcsICdzaGEyNTYnLCAnU0hBMjU2JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYTM4NCcsICdTSEEzODQnLCAnc2hhNTEyJywgJ1NIQTUxMicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGEzODQnLCAnU0hBMzg0JywgJ3NoYTUxMicsICdTSEE1MTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxha2UyYicsICdibGFrZTJzJykKIAogICAgICMgSXNzdWUgIzE0NjkzOiBmYWxsYmFjayBtb2R1bGVzIGFyZSBhbHdheXMgY29tcGlsZWQgdW5kZXIgUE9TSVgKICAgICBfd2Fybl9vbl9leHRlbnNpb25faW1wb3J0ID0gb3MubmFtZSA9PSAncG9zaXgnIG9yIENPTVBJTEVEX1dJVEhfUFlERUJVRwpAQCAtNTYsNiArNzksMTEgQEAKICAgICAgICAgYWxnb3JpdGhtcyA9IHNldCgpCiAgICAgICAgIGZvciBhbGdvcml0aG0gaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKICAgICAgICAgICAgIGFsZ29yaXRobXMuYWRkKGFsZ29yaXRobS5sb3dlcigpKQorCisgICAgICAgIF9ibGFrZTIgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfYmxha2UyJykKKyAgICAgICAgaWYgX2JsYWtlMjoKKyAgICAgICAgICAgIGFsZ29yaXRobXMudXBkYXRlKHsnYmxha2UyYicsICdibGFrZTJzJ30pCisKICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdCA9IHt9CiAgICAgICAgIGZvciBhbGdvcml0aG0gaW4gYWxnb3JpdGhtczoKICAgICAgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbYWxnb3JpdGhtXSA9IHNldCgpCkBAIC02NCwxMCArOTIsMTAgQEAKICAgICAgICAgIyBvZiBoYXNobGliLm5ldyBnaXZlbiB0aGUgYWxnb3JpdGhtIG5hbWUuCiAgICAgICAgIGZvciBhbGdvcml0aG0sIGNvbnN0cnVjdG9ycyBpbiBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0Lml0ZW1zKCk6CiAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKGdldGF0dHIoaGFzaGxpYiwgYWxnb3JpdGhtKSkKLSAgICAgICAgICAgIGRlZiBfdGVzdF9hbGdvcml0aG1fdmlhX2hhc2hsaWJfbmV3KGRhdGE9Tm9uZSwgX2FsZz1hbGdvcml0aG0pOgorICAgICAgICAgICAgZGVmIF90ZXN0X2FsZ29yaXRobV92aWFfaGFzaGxpYl9uZXcoZGF0YT1Ob25lLCBfYWxnPWFsZ29yaXRobSwgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcsIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLm5ldyhfYWxnLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5uZXcoX2FsZywgZGF0YSwgKiprd2FyZ3MpCiAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKF90ZXN0X2FsZ29yaXRobV92aWFfaGFzaGxpYl9uZXcpCiAKICAgICAgICAgX2hhc2hsaWIgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfaGFzaGxpYicpCkBAIC05OSw2ICsxMjcsOSBAQAogICAgICAgICBpZiBfc2hhNTEyOgogICAgICAgICAgICAgYWRkX2J1aWx0aW5fY29uc3RydWN0b3IoJ3NoYTM4NCcpCiAgICAgICAgICAgICBhZGRfYnVpbHRpbl9jb25zdHJ1Y3Rvcignc2hhNTEyJykKKyAgICAgICAgaWYgX2JsYWtlMjoKKyAgICAgICAgICAgIGFkZF9idWlsdGluX2NvbnN0cnVjdG9yKCdibGFrZTJzJykKKyAgICAgICAgICAgIGFkZF9idWlsdGluX2NvbnN0cnVjdG9yKCdibGFrZTJiJykKIAogICAgICAgICBzdXBlcihIYXNoTGliVGVzdENhc2UsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKIApAQCAtMTkzLDEzICsyMjQsMTMgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG00X2NvcHkuZGlnZXN0KCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG00LmRpZ2VzdCgpLCBtNF9kaWdlc3QpCiAKLSAgICBkZWYgY2hlY2soc2VsZiwgbmFtZSwgZGF0YSwgaGV4ZGlnZXN0KToKKyAgICBkZWYgY2hlY2soc2VsZiwgbmFtZSwgZGF0YSwgaGV4ZGlnZXN0LCAqKmt3YXJncyk6CiAgICAgICAgIGhleGRpZ2VzdCA9IGhleGRpZ2VzdC5sb3dlcigpCiAgICAgICAgIGNvbnN0cnVjdG9ycyA9IHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbbmFtZV0KICAgICAgICAgIyAyIGlzIGZvciBoYXNobGliLm5hbWUoLi4uKSBhbmQgaGFzaGxpYi5uZXcobmFtZSwgLi4uKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChsZW4oY29uc3RydWN0b3JzKSwgMikKICAgICAgICAgZm9yIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yIGluIGNvbnN0cnVjdG9yczoKLSAgICAgICAgICAgIG0gPSBoYXNoX29iamVjdF9jb25zdHJ1Y3RvcihkYXRhKQorICAgICAgICAgICAgbSA9IGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yKGRhdGEsICoqa3dhcmdzKQogICAgICAgICAgICAgY29tcHV0ZWQgPSBtLmhleGRpZ2VzdCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgaGV4ZGlnZXN0LApAQCAtMjI2LDYgKzI1NywxMSBAQAogICAgICAgICBzZWxmLmNoZWNrX25vX3VuaWNvZGUoJ3NoYTM4NCcpCiAgICAgICAgIHNlbGYuY2hlY2tfbm9fdW5pY29kZSgnc2hhNTEyJykKIAorICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ub191bmljb2RlX2JsYWtlMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdibGFrZTJiJykKKyAgICAgICAgc2VsZi5jaGVja19ub191bmljb2RlKCdibGFrZTJzJykKKwogICAgIGRlZiBjaGVja19ibG9ja3NpemVfbmFtZShzZWxmLCBuYW1lLCBibG9ja19zaXplPTAsIGRpZ2VzdF9zaXplPTApOgogICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W25hbWVdCiAgICAgICAgIGZvciBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnM6CkBAIC0yNDUsNiArMjgxLDExIEBACiAgICAgICAgIHNlbGYuY2hlY2tfYmxvY2tzaXplX25hbWUoJ3NoYTM4NCcsIDEyOCwgNDgpCiAgICAgICAgIHNlbGYuY2hlY2tfYmxvY2tzaXplX25hbWUoJ3NoYTUxMicsIDEyOCwgNjQpCiAKKyAgICBAcmVxdWlyZXNfYmxha2UyCisgICAgZGVmIHRlc3RfYmxvY2tzaXplX25hbWVfYmxha2UyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Jsb2Nrc2l6ZV9uYW1lKCdibGFrZTJiJywgMTI4LCA2NCkKKyAgICAgICAgc2VsZi5jaGVja19ibG9ja3NpemVfbmFtZSgnYmxha2UycycsIDY0LCAzMikKKwogICAgIGRlZiB0ZXN0X2Nhc2VfbWQ1XzAoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsIGInJywgJ2Q0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlJykKIApAQCAtMzczLDYgKzQxNCwxNTUgQEAKICAgICAgICAgICAiZTcxODQ4M2QwY2U3Njk2NDRlMmU0MmM3YmMxNWI0NjM4ZTFmOThiMTNiMjA0NDI4NTYzMmE4MDNhZmE5NzNlYiIrCiAgICAgICAgICAgImRlMGZmMjQ0ODc3ZWE2MGE0Y2IwNDMyY2U1NzdjMzFiZWIwMDljNWMyYzQ5YWEyZTRlYWRiMjE3YWQ4Y2MwOWIiKQogCisgICAgZGVmIGNoZWNrX2JsYWtlMihzZWxmLCBjb25zdHJ1Y3Rvciwgc2FsdF9zaXplLCBwZXJzb25fc2l6ZSwga2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICBkaWdlc3Rfc2l6ZSwgbWF4X29mZnNldCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uc3RydWN0b3IuU0FMVF9TSVpFLCBzYWx0X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNhbHRfc2l6ZSArIDEpOgorICAgICAgICAgICAgY29uc3RydWN0b3Ioc2FsdD1iJ2EnICogaSkKKyAgICAgICAgc2FsdCA9IGInYScgKiAoc2FsdF9zaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIHNhbHQ9c2FsdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLlBFUlNPTl9TSVpFLCBwZXJzb25fc2l6ZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGVyc29uX3NpemUrMSk6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihwZXJzb249YidhJyAqIGkpCisgICAgICAgIHBlcnNvbiA9IGInYScgKiAocGVyc29uX3NpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgcGVyc29uPXBlcnNvbikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLk1BWF9ESUdFU1RfU0laRSwgZGlnZXN0X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGRpZ2VzdF9zaXplICsgMSk6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihkaWdlc3Rfc2l6ZT1pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGlnZXN0X3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBkaWdlc3Rfc2l6ZT0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGlnZXN0X3NpemU9ZGlnZXN0X3NpemUrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnN0cnVjdG9yLk1BWF9LRVlfU0laRSwga2V5X3NpemUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGtleV9zaXplKzEpOgorICAgICAgICAgICAgY29uc3RydWN0b3Ioa2V5PWInYScgKiBpKQorICAgICAgICBrZXkgPSBiJ2EnICogKGtleV9zaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIGtleT1rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uc3RydWN0b3IoKS5oZXhkaWdlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcihrZXk9YicnKS5oZXhkaWdlc3QoKSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAyNTYpOgorICAgICAgICAgICAgY29uc3RydWN0b3IoZmFub3V0PWkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBmYW5vdXQ9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBmYW5vdXQ9MjU2KQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDI1Nik6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcihkZXB0aD1pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGVwdGg9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBkZXB0aD0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3RvciwgZGVwdGg9MjU2KQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIDI1Nik6CisgICAgICAgICAgICBjb25zdHJ1Y3Rvcihub2RlX2RlcHRoPWkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBub2RlX2RlcHRoPS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb25zdHJ1Y3Rvciwgbm9kZV9kZXB0aD0yNTYpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgZGlnZXN0X3NpemUgKyAxKToKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yKGlubmVyX3NpemU9aSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29uc3RydWN0b3IsIGlubmVyX3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbnN0cnVjdG9yLCBpbm5lcl9zaXplPWRpZ2VzdF9zaXplKzEpCisKKyAgICAgICAgY29uc3RydWN0b3IobGVhZl9zaXplPTApCisgICAgICAgIGNvbnN0cnVjdG9yKGxlYWZfc2l6ZT0oMTw8MzIpLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvbnN0cnVjdG9yLCBsZWFmX3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvbnN0cnVjdG9yLCBsZWFmX3NpemU9MTw8MzIpCisKKyAgICAgICAgY29uc3RydWN0b3Iobm9kZV9vZmZzZXQ9MCkKKyAgICAgICAgY29uc3RydWN0b3Iobm9kZV9vZmZzZXQ9bWF4X29mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgY29uc3RydWN0b3IsIG5vZGVfb2Zmc2V0PS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBjb25zdHJ1Y3Rvciwgbm9kZV9vZmZzZXQ9bWF4X29mZnNldCsxKQorCisgICAgICAgIGNvbnN0cnVjdG9yKAorICAgICAgICAgICAgc3RyaW5nPWInJywKKyAgICAgICAgICAgIGtleT1iJycsCisgICAgICAgICAgICBzYWx0PWInJywKKyAgICAgICAgICAgIHBlcnNvbj1iJycsCisgICAgICAgICAgICBkaWdlc3Rfc2l6ZT0xNywKKyAgICAgICAgICAgIGZhbm91dD0xLAorICAgICAgICAgICAgZGVwdGg9MSwKKyAgICAgICAgICAgIGxlYWZfc2l6ZT0yNTYsCisgICAgICAgICAgICBub2RlX29mZnNldD01MTIsCisgICAgICAgICAgICBub2RlX2RlcHRoPTEsCisgICAgICAgICAgICBpbm5lcl9zaXplPTcsCisgICAgICAgICAgICBsYXN0X25vZGU9VHJ1ZQorICAgICAgICApCisKKyAgICBkZWYgYmxha2UyX3JmYzc2OTMoc2VsZiwgY29uc3RydWN0b3IsIG1kX2xlbiwgaW5fbGVuKToKKyAgICAgICAgZGVmIHNlbGZ0ZXN0X3NlcShsZW5ndGgsIHNlZWQpOgorICAgICAgICAgICAgbWFzayA9ICgxPDwzMiktMQorICAgICAgICAgICAgYSA9ICgweERFQUQ0QkFEICogc2VlZCkgJiBtYXNrCisgICAgICAgICAgICBiID0gMQorICAgICAgICAgICAgb3V0ID0gYnl0ZWFycmF5KGxlbmd0aCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbmd0aCk6CisgICAgICAgICAgICAgICAgdCA9IChhICsgYikgJiBtYXNrCisgICAgICAgICAgICAgICAgYSwgYiA9IGIsIHQKKyAgICAgICAgICAgICAgICBvdXRbaV0gPSAodCA+PiAyNCkgJiAweEZGCisgICAgICAgICAgICByZXR1cm4gb3V0CisgICAgICAgIG91dGVyID0gY29uc3RydWN0b3IoZGlnZXN0X3NpemU9MzIpCisgICAgICAgIGZvciBvdXRsZW4gaW4gbWRfbGVuOgorICAgICAgICAgICAgZm9yIGlubGVuIGluIGluX2xlbjoKKyAgICAgICAgICAgICAgICBpbmRhdGEgPSBzZWxmdGVzdF9zZXEoaW5sZW4sIGlubGVuKQorICAgICAgICAgICAgICAgIGtleSA9IHNlbGZ0ZXN0X3NlcShvdXRsZW4sIG91dGxlbikKKyAgICAgICAgICAgICAgICB1bmtleWVkID0gY29uc3RydWN0b3IoaW5kYXRhLCBkaWdlc3Rfc2l6ZT1vdXRsZW4pCisgICAgICAgICAgICAgICAgb3V0ZXIudXBkYXRlKHVua2V5ZWQuZGlnZXN0KCkpCisgICAgICAgICAgICAgICAga2V5ZWQgPSBjb25zdHJ1Y3RvcihpbmRhdGEsIGtleT1rZXksIGRpZ2VzdF9zaXplPW91dGxlbikKKyAgICAgICAgICAgICAgICBvdXRlci51cGRhdGUoa2V5ZWQuZGlnZXN0KCkpCisgICAgICAgIHJldHVybiBvdXRlci5oZXhkaWdlc3QoKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2JsYWtlMmIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmxha2UyKGhhc2hsaWIuYmxha2UyYiwgMTYsIDE2LCA2NCwgNjQsICgxPDw2NCktMSkKKyAgICAgICAgYjJiX21kX2xlbiA9IFsyMCwgMzIsIDQ4LCA2NF0KKyAgICAgICAgYjJiX2luX2xlbiA9IFswLCAzLCAxMjgsIDEyOSwgMjU1LCAxMDI0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5ibGFrZTJfcmZjNzY5MyhoYXNobGliLmJsYWtlMmIsIGIyYl9tZF9sZW4sIGIyYl9pbl9sZW4pLAorICAgICAgICAgICAgImMyM2E3ODAwZDk4MTIzYmQxMGY1MDZjNjFlMjlkYTU2MDNkNzYzYjhiYmFkMmU3MzdmNWU3NjVhN2JjY2Q0NzUiKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2Nhc2VfYmxha2UyYl8wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdibGFrZTJiJywgYiIiLAorICAgICAgICAgICI3ODZhMDJmNzQyMDE1OTAzYzZjNmZkODUyNTUyZDI3MjkxMmY0NzQwZTE1ODQ3NjE4YTg2ZTIxN2Y3MWY1NDE5IisKKyAgICAgICAgICAiZDI1ZTEwMzFhZmVlNTg1MzEzODk2NDQ0OTM0ZWIwNGI5MDNhNjg1YjE0NDhiNzU1ZDU2ZjcwMWFmZTliZTJjZSIpCisKKyAgICBAcmVxdWlyZXNfYmxha2UyCisgICAgZGVmIHRlc3RfY2FzZV9ibGFrZTJiXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMmInLCBiImFiYyIsCisgICAgICAgICAgImJhODBhNTNmOTgxYzRkMGQ2YTI3OTdiNjlmMTJmNmU5NGMyMTJmMTQ2ODVhYzRiNzRiMTJiYjZmZGJmZmEyZDEiKworICAgICAgICAgICI3ZDg3YzUzOTJhYWI3OTJkYzI1MmQ1ZGU0NTMzY2M5NTE4ZDM4YWE4ZGJmMTkyNWFiOTIzODZlZGQ0MDA5OTIzIikKKworICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ibGFrZTJiX3ZlY3RvcnMoc2VsZik6CisgICAgICAgIGZvciBtc2csIGtleSwgbWQgaW4gcmVhZF92ZWN0b3JzKCdibGFrZTJiJyk6CisgICAgICAgICAgICBrZXkgPSBieXRlcy5mcm9taGV4KGtleSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMmInLCBtc2csIG1kLCBrZXk9a2V5KQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2JsYWtlMnMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmxha2UyKGhhc2hsaWIuYmxha2UycywgOCwgOCwgMzIsIDMyLCAoMTw8NDgpLTEpCisgICAgICAgIGIyc19tZF9sZW4gPSBbMTYsIDIwLCAyOCwgMzJdCisgICAgICAgIGIyc19pbl9sZW4gPSBbMCwgMywgNjQsIDY1LCAyNTUsIDEwMjRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmJsYWtlMl9yZmM3NjkzKGhhc2hsaWIuYmxha2UycywgYjJzX21kX2xlbiwgYjJzX2luX2xlbiksCisgICAgICAgICAgICAiNmE0MTFmMDhjZTI1YWRjZGZiMDJhYmE2NDE0NTFjZWM1M2M1OThiMjRmNGZjNzg3ZmJkYzg4Nzk3ZjRjMWRmZSIpCisKKyAgICBAcmVxdWlyZXNfYmxha2UyCisgICAgZGVmIHRlc3RfY2FzZV9ibGFrZTJzXzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMnMnLCBiIiIsCisgICAgICAgICAgIjY5MjE3YTMwNzk5MDgwOTRlMTExMjFkMDQyMzU0YTdjMWY1NWI2NDgyY2ExYTUxZTFiMjUwZGZkMWVkMGVlZjkiKQorCisgICAgQHJlcXVpcmVzX2JsYWtlMgorICAgIGRlZiB0ZXN0X2Nhc2VfYmxha2Uyc18xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdibGFrZTJzJywgYiJhYmMiLAorICAgICAgICAgICI1MDhjNWU4YzMyN2MxNGUyZTFhNzJiYTM0ZWViNDUyZjM3NDU4YjIwOWVkNjNhMjk0ZDk5OWI0Yzg2Njc1OTgyIikKKworICAgIEByZXF1aXJlc19ibGFrZTIKKyAgICBkZWYgdGVzdF9ibGFrZTJzX3ZlY3RvcnMoc2VsZik6CisgICAgICAgIGZvciBtc2csIGtleSwgbWQgaW4gcmVhZF92ZWN0b3JzKCdibGFrZTJzJyk6CisgICAgICAgICAgICBrZXkgPSBieXRlcy5mcm9taGV4KGtleSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soJ2JsYWtlMnMnLCBtc2csIG1kLCBrZXk9a2V5KQorCiAgICAgZGVmIHRlc3RfZ2lsKHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoaW5ncyB3b3JrIGZpbmUgd2l0aCBhbiBpbnB1dCBsYXJnZXIgdGhhbiB0aGUgc2l6ZSByZXF1aXJlZAogICAgICAgICAjIGZvciBtdWx0aXRocmVhZGVkIG9wZXJhdGlvbiAod2hpY2ggaXMgaGFyZHdpcmVkIHRvIDIwNDgpLgpAQCAtNDQ3LDYgKzYzNywxMiBAQAogICAgICAgICAoYidwYXNzXDB3b3JkJywgYidzYVwwbHQnLCA0MDk2LCAxNiksCiAgICAgXQogCisgICAgc2NyeXB0X3Rlc3RfdmVjdG9ycyA9IFsKKyAgICAgICAgKGInJywgYicnLCAxNiwgMSwgMSwgdW5oZXhsaWZ5KCc3N2Q2NTc2MjM4NjU3YjIwM2IxOWNhNDJjMThhMDQ5N2YxNmI0ODQ0ZTMwNzRhZThkZmRmZmEzZmVkZTIxNDQyZmNkMDA2OWRlZDA5NDhmODMyNmE3NTNhMGZjODFmMTdlOGQzZTBmYjJlMGQzNjI4Y2YzNWUyMGMzOGQxODkwNicpKSwKKyAgICAgICAgKGIncGFzc3dvcmQnLCBiJ05hQ2wnLCAxMDI0LCA4LCAxNiwgdW5oZXhsaWZ5KCdmZGJhYmUxYzlkMzQ3MjAwNzg1NmU3MTkwZDAxZTlmZTdjNmFkN2NiYzgyMzc4MzBlNzczNzY2MzRiMzczMTYyMmVhZjMwZDkyZTIyYTM4ODZmZjEwOTI3OWQ5ODMwZGFjNzI3YWZiOTRhODNlZTZkODM2MGNiZGZhMmNjMDY0MCcpKSwKKyAgICAgICAgKGIncGxlYXNlbGV0bWVpbicsIGInU29kaXVtQ2hsb3JpZGUnLCAxNjM4NCwgOCwgMSwgdW5oZXhsaWZ5KCc3MDIzYmRjYjNhZmQ3MzQ4NDYxYzA2Y2Q4MWZkMzhlYmZkYThmYmJhOTA0ZjhlM2VhOWI1NDNmNjU0NWRhMWYyZDU0MzI5NTU2MTNmMGZjZjYyZDQ5NzA1MjQyYTlhZjllNjFlODVkYzBkNjUxZTQwZGZjZjAxN2I0NTU3NTg4NycpKSwKKyAgIF0KKwogICAgIHBia2RmMl9yZXN1bHRzID0gewogICAgICAgICAic2hhMSI6IFsKICAgICAgICAgICAgICMgb2ZmaWNpYWwgdGVzdCB2ZWN0b3JzIGZyb20gUkZDIDYwNzAKQEAgLTUyNiw1ICs3MjIsNDUgQEAKICAgICAgICAgc2VsZi5fdGVzdF9wYmtkZjJfaG1hYyhjX2hhc2hsaWIucGJrZGYyX2htYWMpCiAKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoY19oYXNobGliLCAnc2NyeXB0JyksCisgICAgICAgICAgICAgICAgICAgICAnICAgdGVzdCByZXF1aXJlcyBPcGVuU1NMID4gMS4xJykKKyAgICBkZWYgdGVzdF9zY3J5cHQoc2VsZik6CisgICAgICAgIGZvciBwYXNzd29yZCwgc2FsdCwgbiwgciwgcCwgZXhwZWN0ZWQgaW4gc2VsZi5zY3J5cHRfdGVzdF92ZWN0b3JzOgorICAgICAgICAgICAgcmVzdWx0ID0gaGFzaGxpYi5zY3J5cHQocGFzc3dvcmQsIHNhbHQ9c2FsdCwgbj1uLCByPXIsIHA9cCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgICAgICAjIHRoaXMgdmFsdWVzIHNob3VsZCB3b3JrCisgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49Miwgcj04LCBwPTEpCisgICAgICAgICMgcGFzc3dvcmQgYW5kIHNhbHQgbXVzdCBiZSBieXRlcy1saWtlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KCdwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9MSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9J3NhbHQnLCBuPTIsIHI9OCwgcD0xKQorICAgICAgICAjIHJlcXVpcmUga2V5d29yZCBhcmdzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBoYXNobGliLnNjcnlwdChiJ3Bhc3N3b3JkJywgYidzYWx0JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIDIsIDgsIDEsIHNhbHQ9YidzYWx0JykKKyAgICAgICAgZm9yIG4gaW4gWy0xLCAwLCAxLCBOb25lXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49biwgcj04LCBwPTEpCisgICAgICAgIGZvciByIGluIFstMSwgMCwgTm9uZV06CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yLCBUeXBlRXJyb3IpKToKKyAgICAgICAgICAgICAgICBoYXNobGliLnNjcnlwdChiJ3Bhc3N3b3JkJywgc2FsdD1iJ3NhbHQnLCBuPTIsIHI9ciwgcD0xKQorICAgICAgICBmb3IgcCBpbiBbLTEsIDAsIE5vbmVdOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciwgVHlwZUVycm9yKSk6CisgICAgICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9cCkKKyAgICAgICAgZm9yIG1heG1lbSBpbiBbLTEsIE5vbmVdOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciwgVHlwZUVycm9yKSk6CisgICAgICAgICAgICAgICAgaGFzaGxpYi5zY3J5cHQoYidwYXNzd29yZCcsIHNhbHQ9YidzYWx0Jywgbj0yLCByPTgsIHA9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhtZW09bWF4bWVtKQorICAgICAgICBmb3IgZGtsZW4gaW4gWy0xLCBOb25lXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgICAgIGhhc2hsaWIuc2NyeXB0KGIncGFzc3dvcmQnLCBzYWx0PWInc2FsdCcsIG49Miwgcj04LCBwPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGtsZW49ZGtsZW4pCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IGI3ZTgyNTkuLjJmOGM2NDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtMSw2ICsxLDUgQEAKICIiIlVuaXR0ZXN0cyBmb3IgaGVhcHEuIiIiCiAKLWltcG9ydCBzeXMKIGltcG9ydCByYW5kb20KIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2htYWMucHkgYi9MaWIvdGVzdC90ZXN0X2htYWMucHkKaW5kZXggOTg4MjZiNS4uMDY3ZTEzZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9obWFjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQpAQCAtMyw3ICszLDYgQEAKIGltcG9ydCBoYXNobGliCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogZGVmIGlnbm9yZV93YXJuaW5nKGZ1bmMpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CmluZGV4IDExNDIwYjIuLmE3ZjUzZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgaHRtbC5wYXJzZXIKIGltcG9ydCBwcHJpbnQKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRXZlbnRDb2xsZWN0b3IoaHRtbC5wYXJzZXIuSFRNTFBhcnNlcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggZjQ1ZTM1Mi4uMzU5ZTBiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMzE0LDYgKzMxNCwxMzQgQEAKICAgICAgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIobmFtZSwgdmFsdWUpCiAKIAorY2xhc3MgVHJhbnNmZXJFbmNvZGluZ1Rlc3QoVGVzdENhc2UpOgorICAgIGV4cGVjdGVkX2JvZHkgPSBiIkl0J3MganVzdCBhIGZsZXNoIHdvdW5kIgorCisgICAgZGVmIHRlc3RfZW5kaGVhZGVyc19jaHVua2VkKHNlbGYpOgorICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoYicnKQorICAgICAgICBjb25uLnB1dHJlcXVlc3QoJ1BPU1QnLCAnLycpCisgICAgICAgIGNvbm4uZW5kaGVhZGVycyhzZWxmLl9tYWtlX2JvZHkoKSwgZW5jb2RlX2NodW5rZWQ9VHJ1ZSkKKworICAgICAgICBfLCBfLCBib2R5ID0gc2VsZi5fcGFyc2VfcmVxdWVzdChjb25uLnNvY2suZGF0YSkKKyAgICAgICAgYm9keSA9IHNlbGYuX3BhcnNlX2NodW5rZWQoYm9keSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib2R5LCBzZWxmLmV4cGVjdGVkX2JvZHkpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9oZWFkZXJzKHNlbGYpOgorICAgICAgICAjIGV4cGxpY2l0IGNodW5rZWQKKyAgICAgICAgY29ubiA9IGNsaWVudC5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KGInJykKKyAgICAgICAgIyB0aGlzIHNob3VsZG4ndCBhY3R1YWxseSBiZSBhdXRvbWF0aWNhbGx5IGNodW5rLWVuY29kZWQgYmVjYXVzZSB0aGUKKyAgICAgICAgIyBjYWxsaW5nIGNvZGUgaGFzIGV4cGxpY2l0bHkgc3RhdGVkIHRoYXQgaXQncyB0YWtpbmcgY2FyZSBvZiBpdAorICAgICAgICBjb25uLnJlcXVlc3QoCisgICAgICAgICAgICAnUE9TVCcsICcvJywgc2VsZi5fbWFrZV9ib2R5KCksIHsnVHJhbnNmZXItRW5jb2RpbmcnOiAnY2h1bmtlZCd9KQorCisgICAgICAgIF8sIGhlYWRlcnMsIGJvZHkgPSBzZWxmLl9wYXJzZV9yZXF1ZXN0KGNvbm4uc29jay5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdjb250ZW50LWxlbmd0aCcsIFtrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVycy5rZXlzKCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10sICdjaHVua2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib2R5LCBzZWxmLmV4cGVjdGVkX2JvZHkpCisKKyAgICAgICAgIyBleHBsaWNpdCBjaHVua2VkLCBzdHJpbmcgYm9keQorICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoYicnKQorICAgICAgICBjb25uLnJlcXVlc3QoCisgICAgICAgICAgICAnUE9TVCcsICcvJywgc2VsZi5leHBlY3RlZF9ib2R5LmRlY29kZSgnbGF0aW4tMScpLAorICAgICAgICAgICAgeydUcmFuc2Zlci1FbmNvZGluZyc6ICdjaHVua2VkJ30pCisKKyAgICAgICAgXywgaGVhZGVycywgYm9keSA9IHNlbGYuX3BhcnNlX3JlcXVlc3QoY29ubi5zb2NrLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2NvbnRlbnQtbGVuZ3RoJywgW2subG93ZXIoKSBmb3IgayBpbiBoZWFkZXJzLmtleXMoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snVHJhbnNmZXItRW5jb2RpbmcnXSwgJ2NodW5rZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvZHksIHNlbGYuZXhwZWN0ZWRfYm9keSkKKworICAgICAgICAjIFVzZXItc3BlY2lmaWVkIFRFLCBidXQgcmVxdWVzdCgpIGRvZXMgdGhlIGNodW5rIGVuY29kaW5nCisgICAgICAgIGNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChiJycpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywKKyAgICAgICAgICAgIGhlYWRlcnM9eydUcmFuc2Zlci1FbmNvZGluZyc6ICdnemlwLCBjaHVua2VkJ30sCisgICAgICAgICAgICBlbmNvZGVfY2h1bmtlZD1UcnVlLAorICAgICAgICAgICAgYm9keT1zZWxmLl9tYWtlX2JvZHkoKSkKKyAgICAgICAgXywgaGVhZGVycywgYm9keSA9IHNlbGYuX3BhcnNlX3JlcXVlc3QoY29ubi5zb2NrLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2NvbnRlbnQtbGVuZ3RoJywgW2subG93ZXIoKSBmb3IgayBpbiBoZWFkZXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWydUcmFuc2Zlci1FbmNvZGluZyddLCAnZ3ppcCwgY2h1bmtlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fcGFyc2VfY2h1bmtlZChib2R5KSwgc2VsZi5leHBlY3RlZF9ib2R5KQorCisgICAgZGVmIHRlc3RfcmVxdWVzdChzZWxmKToKKyAgICAgICAgZm9yIGVtcHR5X2xpbmVzIGluIChGYWxzZSwgVHJ1ZSwpOgorICAgICAgICAgICAgY29ubiA9IGNsaWVudC5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChiJycpCisgICAgICAgICAgICBjb25uLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgJ1BPU1QnLCAnLycsIHNlbGYuX21ha2VfYm9keShlbXB0eV9saW5lcz1lbXB0eV9saW5lcykpCisKKyAgICAgICAgICAgIF8sIGhlYWRlcnMsIGJvZHkgPSBzZWxmLl9wYXJzZV9yZXF1ZXN0KGNvbm4uc29jay5kYXRhKQorICAgICAgICAgICAgYm9keSA9IHNlbGYuX3BhcnNlX2NodW5rZWQoYm9keSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9keSwgc2VsZi5leHBlY3RlZF9ib2R5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWydUcmFuc2Zlci1FbmNvZGluZyddLCAnY2h1bmtlZCcpCisKKyAgICAgICAgICAgICMgQ29udGVudC1MZW5ndGggYW5kIFRyYW5zZmVyLUVuY29kaW5nIFNIT1VMRCBub3QgYmUgc2VudCBpbiB0aGUKKyAgICAgICAgICAgICMgc2FtZSByZXF1ZXN0CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdjb250ZW50LWxlbmd0aCcsIFtrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVyc10pCisKKyAgICBkZWYgdGVzdF9lbXB0eV9ib2R5KHNlbGYpOgorICAgICAgICAjIFplcm8tbGVuZ3RoIGl0ZXJhYmxlIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgYW55IG90aGVyIGl0ZXJhYmxlCisgICAgICAgIGNvbm4gPSBjbGllbnQuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChiJycpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywgKCkpCisgICAgICAgIF8sIGhlYWRlcnMsIGJvZHkgPSBzZWxmLl9wYXJzZV9yZXF1ZXN0KGNvbm4uc29jay5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ1RyYW5zZmVyLUVuY29kaW5nJ10sICdjaHVua2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignY29udGVudC1sZW5ndGgnLCBbay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvZHksIGIiMFxyXG5cclxuIikKKworICAgIGRlZiBfbWFrZV9ib2R5KHNlbGYsIGVtcHR5X2xpbmVzPUZhbHNlKToKKyAgICAgICAgbGluZXMgPSBzZWxmLmV4cGVjdGVkX2JvZHkuc3BsaXQoYicgJykKKyAgICAgICAgZm9yIGlkeCwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgIyBmb3IgdGVzdGluZyBoYW5kbGluZyBlbXB0eSBsaW5lcworICAgICAgICAgICAgaWYgZW1wdHlfbGluZXMgYW5kIGlkeCAlIDI6CisgICAgICAgICAgICAgICAgeWllbGQgYicnCisgICAgICAgICAgICBpZiBpZHggPCBsZW4obGluZXMpIC0gMToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lICsgYicgJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgX3BhcnNlX3JlcXVlc3Qoc2VsZiwgZGF0YSk6CisgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdChiJ1xyXG4nKQorICAgICAgICByZXF1ZXN0ID0gbGluZXNbMF0KKyAgICAgICAgaGVhZGVycyA9IHt9CisgICAgICAgIG4gPSAxCisgICAgICAgIHdoaWxlIG4gPCBsZW4obGluZXMpIGFuZCBsZW4obGluZXNbbl0pID4gMDoKKyAgICAgICAgICAgIGtleSwgdmFsID0gbGluZXNbbl0uc3BsaXQoYic6JykKKyAgICAgICAgICAgIGtleSA9IGtleS5kZWNvZGUoJ2xhdGluLTEnKS5zdHJpcCgpCisgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWwuZGVjb2RlKCdsYXRpbi0xJykuc3RyaXAoKQorICAgICAgICAgICAgbiArPSAxCisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QsIGhlYWRlcnMsIGInXHJcbicuam9pbihsaW5lc1tuICsgMTpdKQorCisgICAgZGVmIF9wYXJzZV9jaHVua2VkKHNlbGYsIGRhdGEpOgorICAgICAgICBib2R5ID0gW10KKyAgICAgICAgdHJhaWxlcnMgPSB7fQorICAgICAgICBuID0gMAorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoYidcclxuJykKKyAgICAgICAgIyBwYXJzZSBib2R5CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzaXplLCBjaHVuayA9IGxpbmVzW246bisyXQorICAgICAgICAgICAgc2l6ZSA9IGludChzaXplLCAxNikKKworICAgICAgICAgICAgaWYgc2l6ZSA9PSAwOgorICAgICAgICAgICAgICAgIG4gKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgbGVuKGNodW5rKSkKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kKGNodW5rKQorCisgICAgICAgICAgICBuICs9IDIKKyAgICAgICAgICAgICMgd2UgL3Nob3VsZC8gaGl0IHRoZSBlbmQgY2h1bmssIGJ1dCBjaGVjayBhZ2FpbnN0IHRoZSBzaXplIG9mCisgICAgICAgICAgICAjIGxpbmVzIHNvIHdlJ3JlIG5vdCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIHNob3VsZCB3ZSBnZXQKKyAgICAgICAgICAgICMgbWFsZm9ybWVkIGRhdGEKKyAgICAgICAgICAgIGlmIG4gPiBsZW4obGluZXMpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKGJvZHkpCisKKwogY2xhc3MgQmFzaWNUZXN0KFRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9zdGF0dXNfbGluZXMoc2VsZik6CiAgICAgICAgICMgVGVzdCBIVFRQIHN0YXR1cyBsaW5lcwpAQCAtNTM0LDcgKzY2Miw5IEBACiAKICAgICBkZWYgdGVzdF9zZW5kX2ZpbGUoc2VsZik6CiAgICAgICAgIGV4cGVjdGVkID0gKGInR0VUIC9mb28gSFRUUC8xLjFcclxuSG9zdDogZXhhbXBsZS5jb21cclxuJwotICAgICAgICAgICAgICAgICAgICBiJ0FjY2VwdC1FbmNvZGluZzogaWRlbnRpdHlcclxuQ29udGVudC1MZW5ndGg6JykKKyAgICAgICAgICAgICAgICAgICAgYidBY2NlcHQtRW5jb2Rpbmc6IGlkZW50aXR5XHJcbicKKyAgICAgICAgICAgICAgICAgICAgYidUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4nCisgICAgICAgICAgICAgICAgICAgIGInXHJcbicpCiAKICAgICAgICAgd2l0aCBvcGVuKF9fZmlsZV9fLCAncmInKSBhcyBib2R5OgogICAgICAgICAgICAgY29ubiA9IGNsaWVudC5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQpAQCAtNTY0LDExICs2OTQsMTEgQEAKICAgICAgICAgICAgIHlpZWxkIE5vbmUKICAgICAgICAgICAgIHlpZWxkICdkYXRhX3R3bycKIAotICAgICAgICBjbGFzcyBVcGRhdGluZ0ZpbGUoKToKKyAgICAgICAgY2xhc3MgVXBkYXRpbmdGaWxlKGlvLlRleHRJT0Jhc2UpOgogICAgICAgICAgICAgbW9kZSA9ICdyJwogICAgICAgICAgICAgZCA9IGRhdGEoKQogICAgICAgICAgICAgZGVmIHJlYWQoc2VsZiwgYmxvY2tzaXplPS0xKToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kLl9fbmV4dF9fKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLmQpCiAKICAgICAgICAgZXhwZWN0ZWQgPSBiJ2RhdGEnCiAKQEAgLTk0MCw2ICsxMDcwLDcgQEAKIAogICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW5fc2VydmVyKQogICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGhyZWFkLmpvaW4sIGZsb2F0KDEpKQogICAgICAgICBjb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCpzZXJ2LmdldHNvY2tuYW1lKCkpCiAgICAgICAgIGNvbm4ucmVxdWVzdCgiQ09OTkVDVCIsICJkdW1teToxMjM0IikKICAgICAgICAgcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKCkKQEAgLTk1Myw3ICsxMDg0LDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlKCkKICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQotICAgICAgICAgICAgdGhyZWFkLmpvaW4oKQorICAgICAgICB0aHJlYWQuam9pbigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBiInByb3hpZWQgZGF0YVxuIikKIAogY2xhc3MgRXh0ZW5kZWRSZWFkVGVzdChUZXN0Q2FzZSk6CkBAIC0xNTQ1LDYgKzE2NzYsMjYgQEAKICAgICAgICAgbWVzc2FnZSA9IGNsaWVudC5wYXJzZV9oZWFkZXJzKGYpCiAgICAgICAgIHJldHVybiBtZXNzYWdlLCBmCiAKKyAgICBkZWYgdGVzdF9saXN0X2JvZHkoc2VsZik6CisgICAgICAgICMgTm90ZSB0aGF0IG5vIGNvbnRlbnQtbGVuZ3RoIGlzIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmb3IKKyAgICAgICAgIyBhbiBpdGVyYWJsZS4gIFRoZSByZXF1ZXN0IHdpbGwgZmFsbCBiYWNrIHRvIHNlbmQgY2h1bmtlZAorICAgICAgICAjIHRyYW5zZmVyIGVuY29kaW5nLgorICAgICAgICBjYXNlcyA9ICgKKyAgICAgICAgICAgIChbYidmb28nLCBiJ2JhciddLCBiJzNcclxuZm9vXHJcbjNcclxuYmFyXHJcbjBcclxuXHJcbicpLAorICAgICAgICAgICAgKChiJ2ZvbycsIGInYmFyJyksIGInM1xyXG5mb29cclxuM1xyXG5iYXJcclxuMFxyXG5cclxuJyksCisgICAgICAgICkKKyAgICAgICAgZm9yIGJvZHksIGV4cGVjdGVkIGluIGNhc2VzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYm9keSk6CisgICAgICAgICAgICAgICAgc2VsZi5jb25uID0gY2xpZW50LkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgICAgICAgICAgc2VsZi5jb25uLnNvY2sgPSBzZWxmLnNvY2sgPSBGYWtlU29ja2V0KCcnKQorCisgICAgICAgICAgICAgICAgc2VsZi5jb25uLnJlcXVlc3QoJ1BVVCcsICcvdXJsJywgYm9keSkKKyAgICAgICAgICAgICAgICBtc2csIGYgPSBzZWxmLmdldF9oZWFkZXJzX2FuZF9mcCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQ29udGVudC1UeXBlJywgbXNnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0NvbnRlbnQtTGVuZ3RoJywgbXNnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldCgnVHJhbnNmZXItRW5jb2RpbmcnKSwgJ2NodW5rZWQnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGYucmVhZCgpKQorCiAgICAgZGVmIHRlc3RfbWFudWFsX2NvbnRlbnRfbGVuZ3RoKHNlbGYpOgogICAgICAgICAjIFNldCBhbiBpbmNvcnJlY3QgY29udGVudC1sZW5ndGggc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoYXQKICAgICAgICAgIyBpdCB3aWxsIG5vdCBiZSBvdmVyLXJpZGRlbiBieSB0aGUgbGlicmFyeS4KQEAgLTE1NzgsNyArMTcyOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjUiLCBtZXNzYWdlLmdldCgiY29udGVudC1sZW5ndGgiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2JvZHlceGMxJywgZi5yZWFkKCkpCiAKLSAgICBkZWYgdGVzdF9maWxlX2JvZHkoc2VsZik6CisgICAgZGVmIHRlc3RfdGV4dF9maWxlX2JvZHkoc2VsZik6CiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgInciKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZSgiYm9keSIpCkBAIC0xNTg3LDggKzE3MzgsMTEgQEAKICAgICAgICAgICAgIG1lc3NhZ2UsIGYgPSBzZWxmLmdldF9oZWFkZXJzX2FuZF9mcCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXh0L3BsYWluIiwgbWVzc2FnZS5nZXRfY29udGVudF90eXBlKCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtZXNzYWdlLmdldF9jaGFyc2V0KCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI0IiwgbWVzc2FnZS5nZXQoImNvbnRlbnQtbGVuZ3RoIikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYm9keScsIGYucmVhZCgpKQorICAgICAgICAgICAgIyBObyBjb250ZW50LWxlbmd0aCB3aWxsIGJlIGRldGVybWluZWQgZm9yIGZpbGVzOyB0aGUgYm9keQorICAgICAgICAgICAgIyB3aWxsIGJlIHNlbnQgdXNpbmcgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBpbnN0ZWFkLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobWVzc2FnZS5nZXQoImNvbnRlbnQtbGVuZ3RoIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJjaHVua2VkIiwgbWVzc2FnZS5nZXQoInRyYW5zZmVyLWVuY29kaW5nIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInNFxyXG5ib2R5XHJcbjBcclxuXHJcbicsIGYucmVhZCgpKQogCiAgICAgZGVmIHRlc3RfYmluYXJ5X2ZpbGVfYm9keShzZWxmKToKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKQEAgLTE1OTksOCArMTc1Myw5IEBACiAgICAgICAgICAgICBtZXNzYWdlLCBmID0gc2VsZi5nZXRfaGVhZGVyc19hbmRfZnAoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidGV4dC9wbGFpbiIsIG1lc3NhZ2UuZ2V0X2NvbnRlbnRfdHlwZSgpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobWVzc2FnZS5nZXRfY2hhcnNldCgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNSIsIG1lc3NhZ2UuZ2V0KCJjb250ZW50LWxlbmd0aCIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2JvZHlceGMxJywgZi5yZWFkKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJjaHVua2VkIiwgbWVzc2FnZS5nZXQoIlRyYW5zZmVyLUVuY29kaW5nIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJDb250ZW50LUxlbmd0aCIsIG1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInNVxyXG5ib2R5XHhjMVxyXG4wXHJcblxyXG4nLCBmLnJlYWQoKSkKIAogCiBjbGFzcyBIVFRQUmVzcG9uc2VUZXN0KFRlc3RDYXNlKToKQEAgLTE3MTEsMTMgKzE4NjYsNSBAQAogICAgICAgICBzZWxmLmFzc2VydEluKCdoZWFkZXI6IHt9Jy5mb3JtYXQoZXhwZWN0ZWRfaGVhZGVyKSwgbGluZXMpCiAKIAotQHN1cHBvcnQucmVhcF90aHJlYWRzCi1kZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoSGVhZGVyVGVzdHMsIE9mZmxpbmVUZXN0LCBCYXNpY1Rlc3QsIFRpbWVvdXRUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQU1Rlc3QsIFJlcXVlc3RCb2R5VGVzdCwgU291cmNlQWRkcmVzc1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSFRUUFJlc3BvbnNlVGVzdCwgRXh0ZW5kZWRSZWFkVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFJlYWRUZXN0Q2h1bmtlZCwgVHVubmVsVGVzdHMpCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9tYWluKCkKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKaW5kZXggNzJlNmUwOC4uNzUwNDRjYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgaHRtbAogaW1wb3J0IGh0dHAuY2xpZW50CiBpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKIGltcG9ydCB1bml0dGVzdApAQCAtMTg5LDcgKzE5MCw3IEBACiAgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLk5PVF9JTVBMRU1FTlRFRCkKIAotICAgIGRlZiB0ZXN0X2hlYWRfa2VlcF9hbGl2ZShzZWxmKToKKyAgICBkZWYgdGVzdF9oZWFkZXJfa2VlcF9hbGl2ZShzZWxmKToKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdIVFRQLzEuMScKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5wdXRoZWFkZXIoJ0Nvbm5lY3Rpb24nLCAna2VlcC1hbGl2ZScpCkBAIC0zODgsNyArMzg5LDcgQEAKICAgICAgICAgcXVvdGVkbmFtZSA9IHVybGxpYi5wYXJzZS5xdW90ZShmaWxlbmFtZSwgZXJyb3JzPSdzdXJyb2dhdGVwYXNzJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2hyZWY9IiVzIicgJSBxdW90ZWRuYW1lKQogICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJyksIGJvZHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oKCc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJz4lczwnICUgaHRtbC5lc2NhcGUoZmlsZW5hbWUsIHF1b3RlPUZhbHNlKSkKICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKGVuYywgJ3N1cnJvZ2F0ZWVzY2FwZScpLCBib2R5KQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLmJhc2VfdXJsICsgJy8nICsgcXVvdGVkbmFtZSkKICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSywKQEAgLTQ2Niw2ICs0NjcsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5nZXRoZWFkZXIoIkxvY2F0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZW1wZGlyX25hbWUgKyAiLz9oaT0xIikKIAorICAgIGRlZiB0ZXN0X2h0bWxfZXNjYXBlX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9ICc8dGVzdCY+LnR4dCcKKyAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCBmaWxlbmFtZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuKGZ1bGxwYXRoLCAndycpLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnQ2FuIG5vdCBjcmVhdGUgZmlsZSAlcyBvbiBjdXJyZW50IGZpbGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbScgJSBmaWxlbmFtZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLmJhc2VfdXJsICsgJy8nKQorICAgICAgICAgICAgYm9keSA9IHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuT0spCisgICAgICAgICAgICBlbmMgPSByZXNwb25zZS5oZWFkZXJzLmdldF9jb250ZW50X2NoYXJzZXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGZ1bGxwYXRoKSAgIyBhdm9pZCBhZmZlY3RpbmcgdGVzdF91bmRlY29kYWJsZV9maWxlbmFtZQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGVuYykKKyAgICAgICAgaHRtbF90ZXh0ID0gJz4lczwnICUgaHRtbC5lc2NhcGUoZmlsZW5hbWUsIHF1b3RlPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEluKGh0bWxfdGV4dC5lbmNvZGUoZW5jKSwgYm9keSkKKwogCiBjZ2lfZmlsZTEgPSAiIiJcCiAjISVzCkBAIC05MTYsNyArOTM4LDcgQEAKICAgICAgICAgIyBJc3N1ZSAjNjc5MTogc2FtZSBmb3IgaGVhZGVycwogICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KAogICAgICAgICAgICAgYidHRVQgLyBIVFRQLzEuMVxyXG5YLUZvbzogYmFyJyArIGIncicgKiA2NTUzNyArIGInXHJcblxyXG4nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXSwgYidIVFRQLzEuMSA0MDAgTGluZSB0b28gbG9uZ1xyXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXSwgYidIVFRQLzEuMSA0MzEgTGluZSB0b28gbG9uZ1xyXG4nKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaGFuZGxlci5nZXRfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5yZXF1ZXN0bGluZSwgJ0dFVCAvIEhUVFAvMS4xJykKIApAQCAtOTI3LDYgKzk0OSwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaGFuZGxlci5nZXRfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5yZXF1ZXN0bGluZSwgJ0dFVCAvIEhUVFAvMS4xJykKIAorICAgIGRlZiB0ZXN0X2h0bWxfZXNjYXBlX29uX2Vycm9yKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KAorICAgICAgICAgICAgYic8c2NyaXB0PmFsZXJ0KCJoZWxsbyIpPC9zY3JpcHQ+IC8gSFRUUC8xLjEnKQorICAgICAgICByZXN1bHQgPSBiJycuam9pbihyZXN1bHQpCisgICAgICAgIHRleHQgPSAnPHNjcmlwdD5hbGVydCgiaGVsbG8iKTwvc2NyaXB0PicKKyAgICAgICAgc2VsZi5hc3NlcnRJbihodG1sLmVzY2FwZSh0ZXh0LCBxdW90ZT1GYWxzZSkuZW5jb2RlKCdhc2NpaScpLCByZXN1bHQpCisKICAgICBkZWYgdGVzdF9jbG9zZV9jb25uZWN0aW9uKHNlbGYpOgogICAgICAgICAjIGhhbmRsZV9vbmVfcmVxdWVzdCgpIHNob3VsZCBiZSByZXBlYXRlZGx5IGNhbGxlZCB1bnRpbAogICAgICAgICAjIGl0IHNldHMgY2xvc2VfY29ubmVjdGlvbgpAQCAtOTQyLDYgKzk3MSwxOSBAQAogICAgICAgICBzZWxmLmhhbmRsZXIuaGFuZGxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgY2xvc2VfdmFsdWVzKQogCisgICAgZGVmIHRlc3RfZGF0ZV90aW1lX3N0cmluZyhzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgIyB0aGlzIGlzIHRoZSBvbGQgY29kZSB0aGF0IGZvcm1hdHMgdGhlIHRpbWVzdGFtcAorICAgICAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB3ZCwgeSwgeiA9IHRpbWUuZ210aW1lKG5vdykKKyAgICAgICAgZXhwZWN0ZWQgPSAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLndlZWtkYXluYW1lW3dkXSwKKyAgICAgICAgICAgIGRheSwKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5tb250aG5hbWVbbW9udGhdLAorICAgICAgICAgICAgeWVhciwgaGgsIG1tLCBzcworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLmRhdGVfdGltZV9zdHJpbmcodGltZXN0YW1wPW5vdyksIGV4cGVjdGVkKQorCisKIGNsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiIgVGVzdCB1cmwgcGFyc2luZyAiIiIKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lkbGUucHkgYi9MaWIvdGVzdC90ZXN0X2lkbGUucHkKaW5kZXggMTQxZTg5ZS4uZGEwNWRhNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pZGxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaWRsZS5weQpAQCAtMSwxNiArMSwyMyBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBpbXBvcnRfbW9kdWxlCiAKLSMgU2tpcCB0ZXN0IGlmIF90aHJlYWQgb3IgX3RraW50ZXIgd2Fzbid0IGJ1aWx0IG9yIGlkbGVsaWIgd2FzIGRlbGV0ZWQuCisjIFNraXAgdGVzdCBpZiBfdGhyZWFkIG9yIF90a2ludGVyIHdhc24ndCBidWlsdCwgaWYgaWRsZWxpYiBpcyBtaXNzaW5nLAorIyBvciBpZiB0Y2wvdGsgaXMgbm90IHRoZSA4LjUrIG5lZWRlZCBmb3IgdHRrIHdpZGdldHMuCiBpbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKSAgIyBpbXBvcnRlZCBieSBQeVNoZWxsLCBpbXBvcnRzIF90aHJlYWQKIHRrID0gaW1wb3J0X21vZHVsZSgndGtpbnRlcicpICAjIGltcG9ydHMgX3RraW50ZXIKLWlkbGV0ZXN0ID0gaW1wb3J0X21vZHVsZSgnaWRsZWxpYi5pZGxlX3Rlc3QnKQoraWYgdGsuVGtWZXJzaW9uIDwgOC41OgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJJRExFIHJlcXVpcmVzIHRrIDguNSBvciBsYXRlci4iKQoraWRsZWxpYiA9IGltcG9ydF9tb2R1bGUoJ2lkbGVsaWInKQogCi0jIFdpdGhvdXQgdGVzdF9tYWluIHByZXNlbnQsIHJlZ3J0ZXN0LnJ1bnRlc3RfaW5uZXIgKGxpbmUxMjE5KSBjYWxscwotIyB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGlzX21vZHVsZSkgd2hpY2ggY2FsbHMKLSMgbG9hZF90ZXN0cygpIGlmIGl0IGZpbmRzIGl0LiAoVW5pdHRlc3QubWFpbiBkb2VzIHRoZSBzYW1lLikKLWxvYWRfdGVzdHMgPSBpZGxldGVzdC5sb2FkX3Rlc3RzCisjIEJlZm9yZSB0ZXN0IGltcG9ydHMsIHRlbGwgSURMRSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgZW52aXJvbm1lbnQuCitpZGxlbGliLnRlc3RpbmcgPSBUcnVlCisKKyMgdW5pdHRlc3QubWFpbiBhbmQgdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0LnJ1bnRlc3RfaW5uZXIKKyMgY2FsbCBsb2FkX3Rlc3RzLCB3aGVuIHByZXNlbnQsIHRvIGRpc2NvdmVyIHRlc3RzIHRvIHJ1bi4KK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QgaW1wb3J0IGxvYWRfdGVzdHMKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorICAgIHRrLk5vRGVmYXVsdFJvb3QoKQorICAgIHVuaXR0ZXN0Lm1haW4oZXhpdD1GYWxzZSkKKyAgICB0ay5fc3VwcG9ydF9kZWZhdWx0X3Jvb3QgPSAxCisgICAgdGsuX2RlZmF1bHRfcm9vdCA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQppbmRleCAwNzE1N2Y1Li44ZTQ5OTBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CkBAIC0yNDMsNiArMjQzLDU1IEBACiAgICAgICAgICAgICBjbGllbnQuc2h1dGRvd24oKQogCiAgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X2JyYWNrZXRfZmxhZ3Moc2VsZik6CisKKyAgICAgICAgIyBUaGlzIHZpb2xhdGVzIFJGQyAzNTAxLCB3aGljaCBkaXNhbGxvd3MgJ10nIGNoYXJhY3RlcnMgaW4gdGFnIG5hbWVzLAorICAgICAgICAjIGJ1dCBpbWFwbGliIGhhcyBhbGxvd2VkIHByb2R1Y2luZyBzdWNoIHRhZ3MgZm9yZXZlciwgb3RoZXIgcHJvZ3JhbXMKKyAgICAgICAgIyBhbHNvIHByb2R1Y2UgdGhlbSAoZWc6IE90aGVySW5ib3gncyBPcmdhbml6ZXIgYXBwIGFzIG9mIDIwMTQwNzE2KSwKKyAgICAgICAgIyBhbmQgR21haWwsIGZvciBleGFtcGxlLCBhY2NlcHRzIHRoZW0gYW5kIHByb2R1Y2VzIHRoZW0uICBTbyB3ZQorICAgICAgICAjIHN1cHBvcnQgdGhlbS4gIFNlZSBpc3N1ZSAjMjE4MTUuCisKKyAgICAgICAgY2xhc3MgQnJhY2tldEZsYWdIYW5kbGVyKFNpbXBsZUlNQVBIYW5kbGVyKToKKworICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWdzID0gWydBbnN3ZXJlZCcsICdGbGFnZ2VkJywgJ0RlbGV0ZWQnLCAnU2VlbicsICdEcmFmdCddCisgICAgICAgICAgICAgICAgc3VwZXIoKS5oYW5kbGUoKQorCisgICAgICAgICAgICBkZWYgY21kX0FVVEhFTlRJQ0FURShzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGV4dGxpbmUoJysnKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnJlc3BvbnNlID0geWllbGQKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RhZ2dlZCh0YWcsICdPSycsICdGQUtFQVVUSCBzdWNjZXNzZnVsJykKKworICAgICAgICAgICAgZGVmIGNtZF9TRUxFQ1Qoc2VsZiwgdGFnLCBhcmdzKToKKyAgICAgICAgICAgICAgICBmbGFnX21zZyA9ICcgXFwnLmpvaW4oc2VsZi5mbGFncykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoKCcqIEZMQUdTICglcyknICUgZmxhZ19tc2cpLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoYicqIDIgRVhJU1RTJykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoYicqIDAgUkVDRU5UJykKKyAgICAgICAgICAgICAgICBtc2cgPSAoJyogT0sgW1BFUk1BTkVOVEZMQUdTICVzIFxcKildIEZsYWdzIHBlcm1pdHRlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICAlIGZsYWdfbXNnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShtc2cuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGFnZ2VkKHRhZywgJ09LJywgJ1tSRUFELVdSSVRFXSBTRUxFQ1QgY29tcGxldGVkLicpCisKKyAgICAgICAgICAgIGRlZiBjbWRfU1RPUkUoc2VsZiwgdGFnLCBhcmdzKToKKyAgICAgICAgICAgICAgICBuZXdfZmxhZ3MgPSBhcmdzWzJdLnN0cmlwKCcoJykuc3RyaXAoJyknKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgc2VsZi5mbGFncy5leHRlbmQobmV3X2ZsYWdzKQorICAgICAgICAgICAgICAgIGZsYWdzX21zZyA9ICcoRkxBR1MgKCVzKSknICUgJyBcXCcuam9pbihzZWxmLmZsYWdzKQorICAgICAgICAgICAgICAgIG1zZyA9ICcqICVzIEZFVENIICVzJyAlIChhcmdzWzBdLCBmbGFnc19tc2cpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKG1zZy5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90YWdnZWQodGFnLCAnT0snLCAnU1RPUkUgY29tcGxldGVkLicpCisKKyAgICAgICAgd2l0aCBzZWxmLnJlYXBlZF9wYWlyKEJyYWNrZXRGbGFnSGFuZGxlcikgYXMgKHNlcnZlciwgY2xpZW50KToKKyAgICAgICAgICAgIGNvZGUsIGRhdGEgPSBjbGllbnQuYXV0aGVudGljYXRlKCdNWUFVVEgnLCBsYW1iZGEgeDogYidmYWtlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZSwgJ09LJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnJlc3BvbnNlLCBiJ1ptRnJaUT09XHJcbicpCisgICAgICAgICAgICBjbGllbnQuc2VsZWN0KCd0ZXN0JykKKyAgICAgICAgICAgIHR5cCwgW2RhdGFdID0gY2xpZW50LnN0b3JlKGInMScsICIrRkxBR1MiLCAiW3Rlc3RdIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidbdGVzdF0nLCBkYXRhKQorICAgICAgICAgICAgY2xpZW50LnNlbGVjdCgndGVzdCcpCisgICAgICAgICAgICB0eXAsIFtkYXRhXSA9IGNsaWVudC5yZXNwb25zZSgnUEVSTUFORU5URkxBR1MnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1t0ZXN0XScsIGRhdGEpCisKKyAgICBAcmVhcF90aHJlYWRzCiAgICAgZGVmIHRlc3RfaXNzdWU1OTQ5KHNlbGYpOgogCiAgICAgICAgIGNsYXNzIEVPRkhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKaW5kZXggZWU5ZWUxYS4uNGVjZTM2NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKQEAgLTYsMTMgKzYsMTIgQEAKIGltcG9ydCBpbXBvcnRsaWIudXRpbAogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICBpbXBvcnQgaW1wCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKaW5kZXggYzExMmNhNy4uMGRkOWM4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CkBAIC0xLDUgKzEsNCBAQAogZnJvbSBpbXBvcnRsaWIgaW1wb3J0IF9ib290c3RyYXBfZXh0ZXJuYWwKLWltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTksOCArOCw2IEBACiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCiAKLSMgWFhYIGZpbmRfc3BlYyB0ZXN0cwotCiBAdW5pdHRlc3Quc2tpcElmKHV0aWwuRVhURU5TSU9OUy5maWxlbmFtZSBpcyBOb25lLCAnX3Rlc3RjYXBpIG5vdCBhdmFpbGFibGUnKQogQHV0aWwuY2FzZV9pbnNlbnNpdGl2ZV90ZXN0cwogY2xhc3MgRXh0ZW5zaW9uTW9kdWxlQ2FzZVNlbnNpdGl2aXR5VGVzdCh1dGlsLkNBU0VPS1Rlc3RCYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weQppbmRleCA3MWJmNjdmLi5jOWI0YTM3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfZmluZGVyLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIAotIyBYWFggZmluZF9zcGVjIHRlc3RzCiAKIGNsYXNzIEZpbmRlclRlc3RzKGFiYy5GaW5kZXJUZXN0cyk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weQppbmRleCA4ZjRiOGJiLi5hNGI1YTY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfcGF0aF9ob29rLnB5CkBAIC0yLDggKzIsNiBAQAogCiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCi1pbXBvcnQgY29sbGVjdGlvbnMKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weQppbmRleCA2MDNjN2Q3Li4yOWVjZmYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZnJvemVuL3Rlc3RfbG9hZGVyLnB5CkBAIC0zLDggKzMsNiBAQAogCiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCi0KLWltcG9ydCBzeXMKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQKIGltcG9ydCB0eXBlcwogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkKaW5kZXggYzdkM2EyYS4uN2Y2NDU0OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weQpAQCAtNSw2ICs1LDcgQEAKIAogIiIiCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncwogZnJvbSAuLiBpbXBvcnQgdXRpbAogCiAKQEAgLTMzLDMxICszNCw1MCBAQAogCiAgICAgIiIiCiAKLSAgICBkZWYgdGVzdF91c2luZ19fX3BhY2thZ2VfXyhzZWxmKToKLSAgICAgICAgIyBbX19wYWNrYWdlX19dCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgZ2xvYmFsc18pOgogICAgICAgICB3aXRoIHNlbGYubW9ja19tb2R1bGVzKCdwa2cuX19pbml0X18nLCAncGtnLmZha2UnKSBhcyBpbXBvcnRlcjoKICAgICAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUobWV0YV9wYXRoPVtpbXBvcnRlcl0pOgogICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygncGtnLmZha2UnKQogICAgICAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuX19pbXBvcnRfXygnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscz17J19fcGFja2FnZV9fJzogJ3BrZy5mYWtlJ30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0PVsnYXR0ciddLCBsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPWdsb2JhbHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIG1vZHVsZQorCisgICAgZGVmIHRlc3RfdXNpbmdfX19wYWNrYWdlX18oc2VsZik6CisgICAgICAgICMgW19fcGFja2FnZV9fXQorICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZSd9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCiAKLSAgICBkZWYgdGVzdF91c2luZ19fX25hbWVfXyhzZWxmLCBwYWNrYWdlX2FzX05vbmU9RmFsc2UpOgorICAgIGRlZiB0ZXN0X3VzaW5nX19fbmFtZV9fKHNlbGYpOgogICAgICAgICAjIFtfX25hbWVfX10KLSAgICAgICAgZ2xvYmFsc18gPSB7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW119Ci0gICAgICAgIGlmIHBhY2thZ2VfYXNfTm9uZToKLSAgICAgICAgICAgIGdsb2JhbHNfWydfX3BhY2thZ2VfXyddID0gTm9uZQotICAgICAgICB3aXRoIHNlbGYubW9ja19tb2R1bGVzKCdwa2cuX19pbml0X18nLCAncGtnLmZha2UnKSBhcyBpbXBvcnRlcjoKLSAgICAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUobWV0YV9wYXRoPVtpbXBvcnRlcl0pOgotICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygncGtnLmZha2UnKQotICAgICAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuX19pbXBvcnRfXygnJywgZ2xvYmFscz0gZ2xvYmFsc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19uYW1lX18nOiAncGtnLmZha2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYXRoX18nOiBbXX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3dhcm5fd2hlbl91c2luZ19fX25hbWVfXyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKEltcG9ydFdhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19uYW1lX18nOiAncGtnLmZha2UnLCAnX19wYXRoX18nOiBbXX0pCiAKICAgICBkZWYgdGVzdF9Ob25lX2FzX19fcGFja2FnZV9fKHNlbGYpOgogICAgICAgICAjIFtOb25lXQotICAgICAgICBzZWxmLnRlc3RfdXNpbmdfX19uYW1lX18ocGFja2FnZV9hc19Ob25lPVRydWUpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7CisgICAgICAgICAgICAgICAgJ19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW10sICdfX3BhY2thZ2VfXyc6IE5vbmUgfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorCisgICAgZGVmIHRlc3Rfc3BlY19mYWxsYmFjayhzZWxmKToKKyAgICAgICAgIyBJZiBfX3BhY2thZ2VfXyBpc24ndCBkZWZpbmVkLCBmYWxsIGJhY2sgb24gX19zcGVjX18ucGFyZW50LgorICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3NwZWNfXyc6IEZha2VTcGVjKCdwa2cuZmFrZScpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorCisgICAgZGVmIHRlc3Rfd2Fybl93aGVuX3BhY2thZ2VfYW5kX3NwZWNfZGlzYWdyZWUoc2VsZik6CisgICAgICAgICMgUmFpc2UgYW4gSW1wb3J0V2FybmluZyBpZiBfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhJbXBvcnRXYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0X21vZHVsZSh7J19fcGFja2FnZV9fJzogJ3BrZy5mYWtlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fc3BlY19fJzogRmFrZVNwZWMoJ3BrZy5mYWtlZmFrZScpfSkKIAogICAgIGRlZiB0ZXN0X2JhZF9fcGFja2FnZV9fKHNlbGYpOgogICAgICAgICBnbG9iYWxzID0geydfX3BhY2thZ2VfXyc6ICc8bm90IHJlYWw+J30KQEAgLTcwLDYgKzkwLDExIEBACiAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJycsIGdsb2JhbHMsIHt9LCBbJ3JlbGltcG9ydCddLCAxKQogCiAKK2NsYXNzIEZha2VTcGVjOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorCisKIGNsYXNzIFVzaW5nX19wYWNrYWdlX19QRVAzMDIoVXNpbmdfX3BhY2thZ2VfXyk6CiAgICAgbW9ja19tb2R1bGVzID0gdXRpbC5tb2NrX21vZHVsZXMKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X21ldGFfcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9tZXRhX3BhdGgucHkKaW5kZXggYzQ1MmNkZC4uNWE0MWU4OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X21ldGFfcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfbWV0YV9wYXRoLnB5CkBAIC03Niw3ICs3Niw2IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKG1vZF9uYW1lKQogICAgICAgICAgICAgICAgIGFzc2VydCBsZW4obG9nKSA9PSAxCiAgICAgICAgICAgICAgICAgYXJncyA9IGxvZ1swXVswXQotICAgICAgICAgICAgICAgIGt3YXJncyA9IGxvZ1swXVsxXQogICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgYWxsIGFyZ3VtZW50cyBhcmUgcG9zaXRpb25hbC4KICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3NbMF0sIG1vZF9uYW1lKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGFyZ3NbMV0pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkKaW5kZXggMzc1NWI4NC4uMjQzOTYwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYWNrYWdlcy5weQpAQCAtMSw3ICsxLDYgQEAKIGZyb20gLi4gaW1wb3J0IHV0aWwKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGltcG9ydGxpYgogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQppbmRleCBiMzJhODc2Li43YWEyNmIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKICAgICAiIiJUZXN0cyBmb3IgUGF0aEZpbmRlci4iIiIKIAorICAgIGZpbmQgPSBOb25lCisgICAgY2hlY2tfZm91bmQgPSBOb25lCisKICAgICBkZWYgdGVzdF9mYWlsdXJlKHNlbGYpOgogICAgICAgICAjIFRlc3QgTm9uZSByZXR1cm5lZCB1cG9uIG5vdCBmaW5kaW5nIGEgc3VpdGFibGUgbG9hZGVyLgogICAgICAgICBtb2R1bGUgPSAnPHRlc3QgbW9kdWxlPicKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZSgpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5maW5kKG1vZHVsZSkpCiAKICAgICBkZWYgdGVzdF9zeXNfcGF0aChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgc3lzLnBhdGggaXMgdXNlZCB3aGVuICdwYXRoJyBpcyBOb25lLgpAQCAtMzAsOCArMzMsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF0pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZvdW5kKGZvdW5kLCBpbXBvcnRlcikKIAogICAgIGRlZiB0ZXN0X3BhdGgoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0ICdwYXRoJyBpcyB1c2VkIHdoZW4gc2V0LgpAQCAtNDAsOCArNDMsOCBAQAogICAgICAgICBwYXRoID0gJzx0ZXN0IHBhdGg+JwogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUsIFtwYXRoXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSwgW3BhdGhdKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAKICAgICBkZWYgdGVzdF9lbXB0eV9saXN0KHNlbGYpOgogICAgICAgICAjIEFuIGVtcHR5IGxpc3Qgc2hvdWxkIG5vdCBjb3VudCBhcyBhc2tpbmcgZm9yIHN5cy5wYXRoLgpAQCAtNTAsNyArNTMsNyBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoX2ltcG9ydGVyX2NhY2hlPXtwYXRoOiBpbXBvcnRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF0pOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnbW9kdWxlJywgW10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5maW5kKCdtb2R1bGUnLCBbXSkpCiAKICAgICBkZWYgdGVzdF9wYXRoX2hvb2tzKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBzeXMucGF0aF9ob29rcyBpcyB1c2VkLgpAQCAtNjAsOCArNjMsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgaG9vayA9IHV0aWwubW9ja19wYXRoX2hvb2socGF0aCwgaW1wb3J0ZXI9aW1wb3J0ZXIpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9ob29rcz1baG9va10pOgotICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZShtb2R1bGUsIFtwYXRoXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSwgW3BhdGhdKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHBhdGgsIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoXSwgaW1wb3J0ZXIpCiAKQEAgLTczLDcgKzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoPVtwYXRoX2VudHJ5XSk6CiAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgogICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfbW9kdWxlKCdvcycpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZCgnb3MnKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2VudHJ5XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh3Wy0xXS5jYXRlZ29yeSwgSW1wb3J0V2FybmluZykpCkBAIC04NSw4ICs4OCw4IEBACiAgICAgICAgIGltcG9ydGVyID0gdXRpbC5tb2NrX3NwZWMobW9kdWxlKQogICAgICAgICBob29rID0gdXRpbC5tb2NrX3BhdGhfaG9vayhvcy5nZXRjd2QoKSwgaW1wb3J0ZXI9aW1wb3J0ZXIpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bcGF0aF0sIHBhdGhfaG9va3M9W2hvb2tdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsb2FkZXIsIGltcG9ydGVyKQorICAgICAgICAgICAgZm91bmQgPSBzZWxmLmZpbmQobW9kdWxlKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG9zLmdldGN3ZCgpLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKIAogICAgIGRlZiB0ZXN0X05vbmVfb25fc3lzX3BhdGgoc2VsZik6CkBAIC0xODIsMTUgKzE4NSw1MCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJ3doYXRldmVyJykpCiAKIAorY2xhc3MgRmluZE1vZHVsZVRlc3RzKEZpbmRlclRlc3RzKToKKyAgICBkZWYgZmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGNoZWNrX2ZvdW5kKHNlbGYsIGZvdW5kLCBpbXBvcnRlcik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZm91bmQsIGltcG9ydGVyKQogCiAKLShGcm96ZW5fRmluZGVyVGVzdHMsCi0gU291cmNlX0ZpbmRlclRlc3RzCi0gKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRlclRlc3RzLCBpbXBvcnRsaWI9aW1wb3J0bGliLCBtYWNoaW5lcnk9bWFjaGluZXJ5KQorKEZyb3plbl9GaW5kTW9kdWxlVGVzdHMsCisgU291cmNlX0ZpbmRNb2R1bGVUZXN0cworKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRNb2R1bGVUZXN0cywgaW1wb3J0bGliPWltcG9ydGxpYiwgbWFjaGluZXJ5PW1hY2hpbmVyeSkKKworCitjbGFzcyBGaW5kU3BlY1Rlc3RzKEZpbmRlclRlc3RzKToKKyAgICBkZWYgZmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjaGVja19mb3VuZChzZWxmLCBmb3VuZCwgaW1wb3J0ZXIpOgorICAgICAgICBzZWxmLmFzc2VydElzKGZvdW5kLmxvYWRlciwgaW1wb3J0ZXIpCisKKworKEZyb3plbl9GaW5kU3BlY1Rlc3RzLAorIFNvdXJjZV9GaW5kU3BlY1Rlc3RzCisgKSA9IHV0aWwudGVzdF9ib3RoKEZpbmRTcGVjVGVzdHMsIGltcG9ydGxpYj1pbXBvcnRsaWIsIG1hY2hpbmVyeT1tYWNoaW5lcnkpCiAKIAogY2xhc3MgUGF0aEVudHJ5RmluZGVyVGVzdHM6CiAKKyAgICBkZWYgdGVzdF9maW5kZXJfd2l0aF9mYWlsaW5nX2ZpbmRfc3BlYyhzZWxmKToKKyAgICAgICAgIyBQYXRoRW50cnlGaW5kZXIgd2l0aCBmaW5kX21vZHVsZSgpIGRlZmluZWQgc2hvdWxkIHdvcmsuCisgICAgICAgICMgSXNzdWUgIzIwNzYzLgorICAgICAgICBjbGFzcyBGaW5kZXI6CisgICAgICAgICAgICBwYXRoX2xvY2F0aW9uID0gJ3Rlc3RfZmluZGVyX3dpdGhfZmluZF9tb2R1bGUnCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgcGF0aCAhPSBzZWxmLnBhdGhfbG9jYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBmaW5kX21vZHVsZShmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bRmluZGVyLnBhdGhfbG9jYXRpb25dK3N5cy5wYXRoWzpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaG9va3M9W0ZpbmRlcl0pOgorICAgICAgICAgICAgc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX3NwZWMoJ2ltcG9ydGxpYicpCisKICAgICBkZWYgdGVzdF9maW5kZXJfd2l0aF9mYWlsaW5nX2ZpbmRfbW9kdWxlKHNlbGYpOgogICAgICAgICAjIFBhdGhFbnRyeUZpbmRlciB3aXRoIGZpbmRfbW9kdWxlKCkgZGVmaW5lZCBzaG91bGQgd29yay4KICAgICAgICAgIyBJc3N1ZSAjMjA3NjMuCkBAIC0yMDcsNyArMjQ1LDcgQEAKIAogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W0ZpbmRlci5wYXRoX2xvY2F0aW9uXStzeXMucGF0aFs6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzPVtGaW5kZXJdKToKLSAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCdpbXBvcnRsaWInKQorICAgICAgICAgICAgc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnaW1wb3J0bGliJykKIAogCiAoRnJvemVuX1BFRlRlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQppbmRleCAzYmI4MTlmLi44YTk1YTMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weQpAQCAtMSw3ICsxLDggQEAKICIiIlRlc3QgcmVsYXRpdmUgaW1wb3J0cyAoUEVQIDMyOCkuIiIiCiBmcm9tIC4uIGltcG9ydCB1dGlsCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworCiAKIGNsYXNzIFJlbGF0aXZlSW1wb3J0czoKIApAQCAtNjUsOSArNjYsMTEgQEAKICAgICAgICAgICAgICAgICB1bmNhY2hlX25hbWVzLmFwcGVuZChuYW1lWzotbGVuKCcuX19pbml0X18nKV0pCiAgICAgICAgIHdpdGggdXRpbC5tb2NrX3NwZWMoKmNyZWF0ZSkgYXMgaW1wb3J0ZXI6CiAgICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKLSAgICAgICAgICAgICAgICBmb3IgZ2xvYmFsXyBpbiBnbG9iYWxzXzoKLSAgICAgICAgICAgICAgICAgICAgd2l0aCB1dGlsLnVuY2FjaGUoKnVuY2FjaGVfbmFtZXMpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2xvYmFsXykKKyAgICAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgZm9yIGdsb2JhbF8gaW4gZ2xvYmFsc186CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHV0aWwudW5jYWNoZSgqdW5jYWNoZV9uYW1lcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZ2xvYmFsXykKIAogCiAgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fbW9kdWxlKHNlbGYpOgpAQCAtMjA0LDExICsyMDcsMTggQEAKIAogICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19nbG9iYWxzKHNlbGYpOgogICAgICAgICAjIE5vIGdsb2JhbHMgZm9yIGEgcmVsYXRpdmUgaW1wb3J0IGlzIGFuIGVycm9yLgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKLSAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnc3lzJywgbGV2ZWw9MSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdzeXMnLCBsZXZlbD0xKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0X25vX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdhJywgeydfX3BhY2thZ2VfXyc6ICcnLCAnX19zcGVjX18nOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD0xKQogCiAgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0X25vX3BhY2thZ2VfZXhpc3RzX2Fic29sdXRlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3N5cycsIHsnX19wYWNrYWdlX18nOiAnJywgJ19fc3BlY19fJzogTm9uZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9yZWdydGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZTExZi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9yZWdydGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSIiIlJ1biBQeXRob24ncyBzdGFuZGFyZCB0ZXN0IHN1aXRlIHVzaW5nIGltcG9ydGxpYi5fX2ltcG9ydF9fLgotCi1UZXN0cyBrbm93biB0byBmYWlsIGJlY2F1c2Ugb2YgYXNzdW1wdGlvbnMgdGhhdCBpbXBvcnRsaWIgKHByb3Blcmx5KQotaW52YWxpZGF0ZXMgYXJlIGF1dG9tYXRpY2FsbHkgc2tpcHBlZCBpZiB0aGUgZW50aXJlIHRlc3Qgc3VpdGUgaXMgcnVuLgotT3RoZXJ3aXNlIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyB2YWxpZCBmb3IgdGVzdC5yZWdydGVzdCBhcmUgYWxzbyB2YWxpZCBmb3IKLXRoaXMgc2NyaXB0LgotCi0iIiIKLWltcG9ydCBpbXBvcnRsaWIKLWltcG9ydCBzeXMKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBfX2J1aWx0aW5zX18uX19pbXBvcnRfXyA9IGltcG9ydGxpYi5fX2ltcG9ydF9fCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQotCi0gICAgcmVncnRlc3QubWFpbihxdWlldD1UcnVlLCB2ZXJib3NlMj1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKaW5kZXggMzRiODZjZC4uMTJjZTBjYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CkBAIC01LDcgKzUsNiBAQAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQgYXMgdGVzdF9zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQppbmRleCA3M2Y0YzYyLi5hMTUxMTQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9maWxlX2xvYWRlci5weQpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAjIFBFUCAzMDIKICAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICAgICBtb2QgPSBsb2FkZXIubG9hZF9tb2R1bGUoJ190ZW1wJykgIyBYWFgKKyAgICAgICAgICAgICAgICBtb2QgPSBsb2FkZXIubG9hZF9tb2R1bGUoJ190ZW1wJykKICAgICAgICAgICAgICMgU2FuaXR5IGNoZWNrcy4KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLl9fY2FjaGVkX18sIGNvbXBpbGVkKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QueCwgNSkKQEAgLTI0NSwxMiArMjQ1LDcgQEAKIGNsYXNzIEJhZEJ5dGVjb2RlVGVzdDoKIAogICAgIGRlZiBpbXBvcnRfKHNlbGYsIGZpbGUsIG1vZHVsZV9uYW1lKToKLSAgICAgICAgbG9hZGVyID0gc2VsZi5sb2FkZXIobW9kdWxlX25hbWUsIGZpbGUpCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgIyBYWFggQ2hhbmdlIHRvIHVzZSBleGVjX21vZHVsZSgpLgotICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKG1vZHVsZV9uYW1lKQotICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZV9uYW1lLCBzeXMubW9kdWxlcykKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogCiAgICAgZGVmIG1hbmlwdWxhdGVfYnl0ZWNvZGUoc2VsZiwgbmFtZSwgbWFwcGluZywgbWFuaXB1bGF0b3IsICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsX3NvdXJjZT1GYWxzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkKaW5kZXggZTZhMjQxNS4uNzk1ZDQzNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3BhdGhfaG9vay5weQpAQCAtMTYsMTAgKzE2LDE5IEBACiAgICAgZGVmIHRlc3Rfc3VjY2VzcyhzZWxmKToKICAgICAgICAgd2l0aCB1dGlsLmNyZWF0ZV9tb2R1bGVzKCdkdW1teScpIGFzIG1hcHBpbmc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKG1hcHBpbmdbJy5yb290J10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfbW9kdWxlJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluZF9zcGVjJykpCisKKyAgICBkZWYgdGVzdF9zdWNjZXNzX2xlZ2FjeShzZWxmKToKKyAgICAgICAgd2l0aCB1dGlsLmNyZWF0ZV9tb2R1bGVzKCdkdW1teScpIGFzIG1hcHBpbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKG1hcHBpbmdbJy5yb290J10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfbW9kdWxlJykpCiAKICAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgVGhlIGVtcHR5IHN0cmluZyByZXByZXNlbnRzIHRoZSBjd2QuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYucGF0aF9ob29rKCkoJycpLCAnZmluZF9zcGVjJykpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmdfbGVnYWN5KHNlbGYpOgorICAgICAgICAjIFRoZSBlbXB0eSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgY3dkLgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKCcnKSwgJ2ZpbmRfbW9kdWxlJykpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5CmluZGV4IDFlMDc3MWIuLjk4MDg1NWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9zb3VyY2VfZW5jb2RpbmcucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgY29kZWNzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCByZQotaW1wb3J0IHN5cwogaW1wb3J0IHR5cGVzCiAjIEJlY2F1c2Ugc3lzLnBhdGggZ2V0cyBlc3NlbnRpYWxseSBibGFua2VkLCBuZWVkIHRvIGhhdmUgdW5pY29kZWRhdGEgYWxyZWFkeQogIyBpbXBvcnRlZCBmb3IgdGhlIHBhcnNlciB0byB1c2UuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CmluZGV4IGQ0YmY5MTUuLmM4NjI0ODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYWJjLnB5CkBAIC0yMDcsNiArMjA3LDEwIEBACiAKICAgICBTUExJVCA9IG1ha2VfYWJjX3N1YmNsYXNzZXMoTG9hZGVyKQogCisgICAgZGVmIHRlc3RfY3JlYXRlX21vZHVsZShzZWxmKToKKyAgICAgICAgc3BlYyA9ICdhIHNwZWMnCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuaW5zLmNyZWF0ZV9tb2R1bGUoc3BlYykpCisKICAgICBkZWYgdGVzdF9sb2FkX21vZHVsZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmlucy5sb2FkX21vZHVsZSgnc29tZXRoaW5nJykKQEAgLTUxOSw2ICs1MjMsMTIgQEAKICAgICAgICAgc3VwcG9ydC51bmxvYWQoc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5sb2FkLCBzZWxmLm1vZHVsZV9uYW1lKQogCisgICAgZGVmIGxvYWQoc2VsZiwgbG9hZGVyKToKKyAgICAgICAgc3BlYyA9IHNlbGYudXRpbC5zcGVjX2Zyb21fbG9hZGVyKHNlbGYubW9kdWxlX25hbWUsIGxvYWRlcikKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbml0Ll9ib290c3RyYXAuX2xvYWRfdW5sb2NrZWQoc3BlYykKKwogICAgIGRlZiBtb2NrX2dldF9jb2RlKHNlbGYpOgogICAgICAgICByZXR1cm4gbW9jay5wYXRjaC5vYmplY3Qoc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MsICdnZXRfY29kZScpCiAKQEAgLTUyOCw5ICs1MzgsNyBAQAogICAgICAgICAgICAgbW9ja2VkX2dldF9jb2RlLnNpZGVfZWZmZWN0ID0gSW1wb3J0RXJyb3IKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgICAgIGxvYWRlciA9IHNlbGYuSW5zcGVjdExvYWRlclN1YmNsYXNzKCkKLSAgICAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWQobG9hZGVyKQogCiAgICAgZGVmIHRlc3RfZ2V0X2NvZGVfTm9uZShzZWxmKToKICAgICAgICAgIyBJZiBnZXRfY29kZSgpIHJldHVybnMgTm9uZSwgcmFpc2UgSW1wb3J0RXJyb3IuCkBAIC01MzgsNyArNTQ2LDcgQEAKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5yZXR1cm5fdmFsdWUgPSBOb25lCiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKICAgICAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sb2FkKGxvYWRlcikKIAogICAgIGRlZiB0ZXN0X21vZHVsZV9yZXR1cm5lZChzZWxmKToKICAgICAgICAgIyBUaGUgbG9hZGVkIG1vZHVsZSBzaG91bGQgYmUgcmV0dXJuZWQuCkBAIC01NDYsMTQgKzU1NCwxNiBAQAogICAgICAgICB3aXRoIHNlbGYubW9ja19nZXRfY29kZSgpIGFzIG1vY2tlZF9nZXRfY29kZToKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5yZXR1cm5fdmFsdWUgPSBjb2RlCiAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICBtb2R1bGUgPSBsb2FkZXIubG9hZF9tb2R1bGUoc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYubG9hZChsb2FkZXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZSwgc3lzLm1vZHVsZXNbc2VsZi5tb2R1bGVfbmFtZV0pCiAKIAogKEZyb3plbl9JTExvYWRNb2R1bGVUZXN0cywKICBTb3VyY2VfSUxMb2FkTW9kdWxlVGVzdHMKICApID0gdGVzdF91dGlsLnRlc3RfYm90aChJbnNwZWN0TG9hZGVyTG9hZE1vZHVsZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEluc3BlY3RMb2FkZXJTdWJjbGFzcz1TUExJVF9JTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnNwZWN0TG9hZGVyU3ViY2xhc3M9U1BMSVRfSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdD1pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWw9dXRpbCkKIAogCiAjIyMjIyBFeGVjdXRpb25Mb2FkZXIgY29uY3JldGUgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQppbmRleCA2YmMzYzU2Li5iMGE5NGFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FwaS5weQpAQCAtOTksOSArOTksNyBAQAogCiBjbGFzcyBGaW5kTG9hZGVyVGVzdHM6CiAKLSAgICBjbGFzcyBGYWtlTWV0YUZpbmRlcjoKLSAgICAgICAgQHN0YXRpY21ldGhvZAotICAgICAgICBkZWYgZmluZF9tb2R1bGUobmFtZSwgcGF0aD1Ob25lKTogcmV0dXJuIG5hbWUsIHBhdGgKKyAgICBGYWtlTWV0YUZpbmRlciA9IE5vbmUKIAogICAgIGRlZiB0ZXN0X3N5c19tb2R1bGVzKHNlbGYpOgogICAgICAgICAjIElmIGEgbW9kdWxlIHdpdGggX19sb2FkZXJfXyBpcyBpbiBzeXMubW9kdWxlcywgdGhlbiByZXR1cm4gaXQuCkBAIC0xNzEsOSArMTY5LDMwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmluaXQuZmluZF9sb2FkZXIoJ25ldmVyZ29pbmd0b2ZpbmR0aGlzbW9kdWxlJykpCiAKIAotKEZyb3plbl9GaW5kTG9hZGVyVGVzdHMsCi0gU291cmNlX0ZpbmRMb2FkZXJUZXN0cwotICkgPSB0ZXN0X3V0aWwudGVzdF9ib3RoKEZpbmRMb2FkZXJUZXN0cywgaW5pdD1pbml0KQorY2xhc3MgRmluZExvYWRlclBFUDQ1MVRlc3RzKEZpbmRMb2FkZXJUZXN0cyk6CisKKyAgICBjbGFzcyBGYWtlTWV0YUZpbmRlcjoKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZmluZF9zcGVjKG5hbWUsIHBhdGg9Tm9uZSwgdGFyZ2V0PU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIG1hY2hpbmVyeVsnU291cmNlJ10uTW9kdWxlU3BlYyhuYW1lLCAobmFtZSwgcGF0aCkpCisKKworKEZyb3plbl9GaW5kTG9hZGVyUEVQNDUxVGVzdHMsCisgU291cmNlX0ZpbmRMb2FkZXJQRVA0NTFUZXN0cworICkgPSB0ZXN0X3V0aWwudGVzdF9ib3RoKEZpbmRMb2FkZXJQRVA0NTFUZXN0cywgaW5pdD1pbml0KQorCisKK2NsYXNzIEZpbmRMb2FkZXJQRVAzMDJUZXN0cyhGaW5kTG9hZGVyVGVzdHMpOgorCisgICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGZpbmRfbW9kdWxlKG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gbmFtZSwgcGF0aAorCisKKyhGcm96ZW5fRmluZExvYWRlclBFUDMwMlRlc3RzLAorIFNvdXJjZV9GaW5kTG9hZGVyUEVQMzAyVGVzdHMKKyApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyUEVQMzAyVGVzdHMsIGluaXQ9aW5pdCkKIAogCiBjbGFzcyBSZWxvYWRUZXN0czoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weQppbmRleCBjYzM4M2MyLi5mZmQ4ZGM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sYXp5LnB5CkBAIC02Niw2ICs2Niw4IEBACiAgICAgICAgIHNwZWMgPSB1dGlsLnNwZWNfZnJvbV9sb2FkZXIoVGVzdGluZ0ltcG9ydGVyLm1vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuTGF6eUxvYWRlcihsb2FkZXIpKQogICAgICAgICBtb2R1bGUgPSBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kdWxlID0gdHlwZXMuTW9kdWxlVHlwZShUZXN0aW5nSW1wb3J0ZXIubW9kdWxlX25hbWUpCiAgICAgICAgIG1vZHVsZS5fX3NwZWNfXyA9IHNwZWMKICAgICAgICAgbW9kdWxlLl9fbG9hZGVyX18gPSBzcGVjLmxvYWRlcgogICAgICAgICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weQppbmRleCBkZjBhZjEyLi5iMmFhZGZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbG9ja3MucHkKQEAgLTMsNyArMyw2IEBACiBpbml0ID0gdGVzdF91dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYicpCiAKIGltcG9ydCBzeXMKLWltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3ZWFrcmVmCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5CmluZGV4IDY2Mzk2MTIuLmUzN2Q4YTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9uYW1lc3BhY2VfcGtncy5weQpAQCAtMSwxMyArMSwxMCBAQAogaW1wb3J0IGNvbnRleHRsaWIKLWltcG9ydCBpbXBvcnRsaWIuYWJjCi1pbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoraW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnRsaWIgaW1wb3J0IHV0aWwKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogIyBuZWVkZWQgdGVzdHM6CiAjCkBAIC03MSw2ICs2OCw3IEBACiAgICAgICAgICMgVE9ETzogd2lsbCB3ZSBldmVyIHdhbnQgdG8gcGFzcyBleGNfaW5mbyB0byBfX2V4aXRfXz8KICAgICAgICAgc2VsZi5jdHguX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKIAorCiBjbGFzcyBTaW5nbGVOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKICAgICBwYXRocyA9IFsncG9ydGlvbjEnXQogCkBAIC04Nyw3ICs4NSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmb28pLCAiPG1vZHVsZSAnZm9vJyAobmFtZXNwYWNlKT4iKQogCiAKLWNsYXNzIER5bmFtaWNQYXRoZU5hbWVzcGFjZVBhY2thZ2UoTmFtZXNwYWNlUGFja2FnZVRlc3QpOgorY2xhc3MgRHluYW1pY1BhdGhOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKICAgICBwYXRocyA9IFsncG9ydGlvbjEnXQogCiAgICAgZGVmIHRlc3RfZHluYW1pY19wYXRoKHNlbGYpOgpAQCAtMjg5LDUgKzI4NywzNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFfdGVzdC5hdHRyLCAnaW4gbW9kdWxlJykKIAogCitjbGFzcyBSZWxvYWRUZXN0cyhOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CisgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KKworICAgIGRlZiB0ZXN0X3NpbXBsZV9wYWNrYWdlKHNlbGYpOgorICAgICAgICBpbXBvcnQgZm9vLm9uZQorICAgICAgICBmb28gPSBpbXBvcnRsaWIucmVsb2FkKGZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28ub25lLmF0dHIsICdwb3J0aW9uMSBmb28gb25lJykKKworICAgIGRlZiB0ZXN0X2NhbnRfaW1wb3J0X290aGVyKHNlbGYpOgorICAgICAgICBpbXBvcnQgZm9vCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKyAgICAgICAgZm9vID0gaW1wb3J0bGliLnJlbG9hZChmb28pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKworICAgIGRlZiB0ZXN0X2R5bmFtaWNfcGF0aChzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvby5vbmUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CisgICAgICAgICAgICBpbXBvcnQgZm9vLnR3bworCisgICAgICAgICMgTm93IG1vZGlmeSBzeXMucGF0aCBhbmQgcmVsb2FkLgorICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKHNlbGYucm9vdCwgJ3BvcnRpb24yJykpCisgICAgICAgIGZvbyA9IGltcG9ydGxpYi5yZWxvYWQoZm9vKQorCisgICAgICAgICMgQW5kIG1ha2Ugc3VyZSBmb28udHdvIGlzIG5vdyBpbXBvcnRhYmxlCisgICAgICAgIGltcG9ydCBmb28udHdvCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLnR3by5hdHRyLCAncG9ydGlvbjIgZm9vIHR3bycpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfdXRpbC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfdXRpbC5weQppbmRleCA2OTQ2NmIyLi40MWNhMzMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3V0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF91dGlsLnB5CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICAgICAgIyBiYWNvbgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdiYWNvbicsIHNlbGYudXRpbC5yZXNvbHZlX25hbWUoJ2JhY29uJywgTm9uZSkpCiAKLSAgICBkZWYgdGVzdF9hYm9zbHV0ZV93aXRoaW5fcGFja2FnZShzZWxmKToKKyAgICBkZWYgdGVzdF9hYnNvbHV0ZV93aXRoaW5fcGFja2FnZShzZWxmKToKICAgICAgICAgIyBiYWNvbiBpbiBzcGFtCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2JhY29uJywgc2VsZi51dGlsLnJlc29sdmVfbmFtZSgnYmFjb24nLCAnc3BhbScpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkKaW5kZXggYzg5M2JjZi4uMDA1YjY4NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF93aW5kb3dzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weQpAQCAtNDAsNyArNDAsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHJvb3QgPSBtYWNoaW5lcnkuV2luZG93c1JlZ2lzdHJ5RmluZGVyLlJFR0lTVFJZX0tFWQogICAgIGtleSA9IHJvb3QuZm9ybWF0KGZ1bGxuYW1lPW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249c3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPSclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICB0cnk6CiAgICAgICAgIHdpdGggdGVtcF9tb2R1bGUobmFtZSwgImEgPSAxIikgYXMgbG9jYXRpb246CiAgICAgICAgICAgICBzdWJrZXkgPSBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIGtleSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3V0aWwucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi91dGlsLnB5CmluZGV4IDQzODk2YzUuLjY0ZTAzOWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3V0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdXRpbC5weQpAQCAtMjY2LDcgKzI2Niw2IEBACiAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGlzX3BhY2thZ2UgPSBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJykKICAgICAgICAgc3BlYyA9IHV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgZnVsbG5hbWUsIG1vZHVsZS5fX2ZpbGVfXywgbG9hZGVyPXNlbGYsCiAgICAgICAgICAgICAgICAgc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnM9Z2V0YXR0cihtb2R1bGUsICdfX3BhdGhfXycsIE5vbmUpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDY3MWUwNWEuLjQ3MjQ0YWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTMwLDYgKzMwLDcgQEAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlciBhcyBtb2QKIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnQgaW1wb3J0IF9yZWFkeV90b19pbXBvcnQKIApAQCAtMzgsNyArMzksNyBAQAogIyBpc21vZHVsZSwgaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24sIGlzdHJhY2ViYWNrLCBpc2ZyYW1lLCBpc2NvZGUsCiAjIGlzYnVpbHRpbiwgaXNyb3V0aW5lLCBpc2dlbmVyYXRvciwgaXNnZW5lcmF0b3JmdW5jdGlvbiwgZ2V0bWVtYmVycywKICMgZ2V0ZG9jLCBnZXRmaWxlLCBnZXRtb2R1bGUsIGdldHNvdXJjZWZpbGUsIGdldGNvbW1lbnRzLCBnZXRzb3VyY2UsCi0jIGdldGNsYXNzdHJlZSwgZ2V0YXJnc3BlYywgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCisjIGdldGNsYXNzdHJlZSwgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCiAjIGN1cnJlbnRmcmFtZSwgc3RhY2ssIHRyYWNlLCBpc2RhdGFkZXNjcmlwdG9yCiAKICMgTk9URTogVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyByZWxhdGluZyB0byBpbnRlcmFjdGlvbiB3aXRoCkBAIC00MDAsNyArNDAxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUobW9kLnNwYW0pKSwgbW9kZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUoZ2l0LmFidXNlKSksIG1vZGZpbGUpCiAgICAgICAgIGZuID0gIl9ub25fZXhpc3RpbmdfZmlsZW5hbWVfdXNlZF9mb3Jfc291cmNlZmlsZV90ZXN0LnB5IgotICAgICAgICBjbyA9IGNvbXBpbGUoIk5vbmUiLCBmbiwgImV4ZWMiKQorICAgICAgICBjbyA9IGNvbXBpbGUoIng9MSIsIGZuLCAiZXhlYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGNvKSwgTm9uZSkKICAgICAgICAgbGluZWNhY2hlLmNhY2hlW2NvLmNvX2ZpbGVuYW1lXSA9ICgxLCBOb25lLCAiTm9uZSIsIGNvLmNvX2ZpbGVuYW1lKQogICAgICAgICB0cnk6CkBAIC0yOTAyLDYgKzI5MDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIgbmFtZScpOgogICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoJyQnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlZBUl9LRVlXT1JEKQogCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBuYW1lJyk6CisgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignLmEnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlZBUl9LRVlXT1JEKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAnY2Fubm90IGhhdmUgZGVmYXVsdCB2YWx1ZXMnKToKICAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKCdhJywgZGVmYXVsdD00MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuVkFSX0tFWVdPUkQpCkBAIC0yOTg1LDYgKzI5OTAsMTcgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ25hbWUgbXVzdCBiZSBhIHN0cicpOgogICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoTm9uZSwga2luZD1pbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkpCiAKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX3BhcmFtZXRlcl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIGluIGFzJyk6CisgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignLjAnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSkKKworICAgICAgICBwYXJhbSA9IGluc3BlY3QuUGFyYW1ldGVyKAorICAgICAgICAgICAgJy4wJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09SX0tFWVdPUkQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0ua2luZCwgaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLm5hbWUsICdpbXBsaWNpdDAnKQorCiAgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX3BhcmFtZXRlcl9pbW11dGFiaWxpdHkoc2VsZik6CiAgICAgICAgIHAgPSBpbnNwZWN0LlBhcmFtZXRlcignc3BhbScsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuS0VZV09SRF9PTkxZKQogCkBAIC0zMjMzLDYgKzMyNDksMTcgQEAKICAgICAgICAgYmEgPSBzaWcuYmluZChhcmdzPTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmEuYXJndW1lbnRzLCB7J2t3YXJncyc6IHsnYXJncyc6IDF9fSkKIAorICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaWduYXR1cmVfYmluZF9pbXBsaWNpdF9hcmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE5NjExOiBnZXRjYWxsYXJncyBzaG91bGQgd29yayB3aXRoIHNldCBjb21wcmVoZW5zaW9ucworICAgICAgICBkZWYgbWFrZV9zZXQoKToKKyAgICAgICAgICAgIHJldHVybiB7eiAqIHogZm9yIHogaW4gcmFuZ2UoNSl9CisgICAgICAgIHNldGNvbXBfY29kZSA9IG1ha2Vfc2V0Ll9fY29kZV9fLmNvX2NvbnN0c1sxXQorICAgICAgICBzZXRjb21wX2Z1bmMgPSB0eXBlcy5GdW5jdGlvblR5cGUoc2V0Y29tcF9jb2RlLCB7fSkKKworICAgICAgICBpdGVyYXRvciA9IGl0ZXIocmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYWxsKHNldGNvbXBfZnVuYywgaXRlcmF0b3IpLCB7MCwgMSwgNCwgOSwgMTZ9KQorCiAKIGNsYXNzIFRlc3RCb3VuZEFyZ3VtZW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX2JvdW5kX2FyZ3VtZW50c191bmhhc2hhYmxlKHNlbGYpOgpAQCAtMzU0MywxNCArMzU3MCwxNCBAQAogCiAgICAgZGVmIHRlc3RfZGV0YWlscyhzZWxmKToKICAgICAgICAgbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ3VuaXR0ZXN0JykKLSAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAnaW5zcGVjdCcsCisgICAgICAgIGFyZ3MgPSBzdXBwb3J0Lm9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soKmFyZ3MsICctbScsICdpbnNwZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5pdHRlc3QnLCAnLS1kZXRhaWxzJykKICAgICAgICAgb3V0cHV0ID0gb3V0LmRlY29kZSgpCiAgICAgICAgICMgSnVzdCBhIHF1aWNrIHNhbml0eSBjaGVjayBvbiB0aGUgb3V0cHV0CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fbmFtZV9fLCBvdXRwdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fZmlsZV9fLCBvdXRwdXQpCi0gICAgICAgIGlmIG5vdCBzeXMuZmxhZ3Mub3B0aW1pemU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZS5fX2NhY2hlZF9fLCBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fY2FjaGVkX18sIG91dHB1dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ludC5weSBiL0xpYi90ZXN0L3Rlc3RfaW50LnB5CmluZGV4IGI2NmM1ZDYuLjg4NDdmNGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW50LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW50LnB5CkBAIC00MzAsMjEgKzQzMCwyNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICAgICAgICAgIG4gPSBpbnQoYmFkX2ludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUobiksIGludCkKIAogICAgICAgICBiYWRfaW50ID0gQmFkSW50MigpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgogICAgICAgICAgICAgbiA9IGludChiYWRfaW50KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShuKSwgaW50KQogCiAgICAgICAgIGJhZF9pbnQgPSBUcnVuY1JldHVybnNCYWRJbnQoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKICAgICAgICAgICAgIG4gPSBpbnQoYmFkX2ludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUobiksIGludCkKIAogICAgICAgICBnb29kX2ludCA9IFRydW5jUmV0dXJuc0ludFN1YmNsYXNzKCkKICAgICAgICAgbiA9IGludChnb29kX2ludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQotICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUobiksIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShuKSwgaW50KQogICAgICAgICBuID0gSW50U3ViY2xhc3MoZ29vZF9pbnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKG4pLCBJbnRTdWJjbGFzcykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CmluZGV4IDUxMTE4ODIuLmM0OGVjM2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pby5weQpAQCAtNDk2LDcgKzQ5NiwxMSBAQAogICAgIGRlZiB0ZXN0X29wZW5faGFuZGxlc19OVUxfY2hhcnMoc2VsZik6CiAgICAgICAgIGZuX3dpdGhfTlVMID0gJ2Zvb1wwYmFyJwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIGZuX3dpdGhfTlVMLCAndycpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgYnl0ZXMoZm5fd2l0aF9OVUwsICdhc2NpaScpLCAndycpCisKKyAgICAgICAgYnl0ZXNfZm4gPSBieXRlcyhmbl93aXRoX05VTCwgJ2FzY2lpJykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIGJ5dGVzX2ZuLCAndycpCiAKICAgICBkZWYgdGVzdF9yYXdfZmlsZV9pbyhzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKSBhcyBmOgpAQCAtODU2LDYgKzg2MCwzMiBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihzdHJlYW0sIG1ldGhvZCkoYnVmZmVyKSwgNSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGJ1ZmZlciksIGIiMTIzNDUiKQogCisgICAgZGVmIHRlc3RfZnNwYXRoX3N1cHBvcnQoc2VsZik6CisgICAgICAgIGNsYXNzIFBhdGhMaWtlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgICAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisgICAgICAgIGRlZiBjaGVja19wYXRoX3N1Y2NlZWRzKHBhdGgpOgorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4ocGF0aCwgInciKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoImVnZ1xuIikKKworICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4ocGF0aCwgInIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJlZ2dcbiIpCisKKyAgICAgICAgY2hlY2tfcGF0aF9zdWNjZWVkcyhQYXRoTGlrZShzdXBwb3J0LlRFU1RGTikpCisgICAgICAgIGNoZWNrX3BhdGhfc3VjY2VlZHMoUGF0aExpa2Uoc3VwcG9ydC5URVNURk4uZW5jb2RlKCd1dGYtOCcpKSkKKworICAgICAgICBiYWRfcGF0aCA9IFBhdGhMaWtlKFR5cGVFcnJvcikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5vcGVuKGJhZF9wYXRoLCAndycpCisKKyAgICAgICAgIyBlbnN1cmUgdGhhdCByZWZjb3VudGluZyBpcyBjb3JyZWN0IHdpdGggc29tZSBlcnJvciBjb25kaXRpb25zCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAncmVhZC93cml0ZS9hcHBlbmQgbW9kZScpOgorICAgICAgICAgICAgc2VsZi5vcGVuKFBhdGhMaWtlKHN1cHBvcnQuVEVTVEZOKSwgJ3J3eGEnKQorCiAKIGNsYXNzIENJT1Rlc3QoSU9UZXN0KToKIApAQCAtMzI0Niw4ICszMjc2LDcgQEAKIAogY2xhc3MgUHlUZXh0SU9XcmFwcGVyVGVzdChUZXh0SU9XcmFwcGVyVGVzdCk6CiAgICAgaW8gPSBweWlvCi0gICAgI3NodXRkb3duX2Vycm9yID0gIkxvb2t1cEVycm9yOiB1bmtub3duIGVuY29kaW5nOiBhc2NpaSIKLSAgICBzaHV0ZG93bl9lcnJvciA9ICJUeXBlRXJyb3I6ICdOb25lVHlwZScgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIKKyAgICBzaHV0ZG93bl9lcnJvciA9ICJMb29rdXBFcnJvcjogdW5rbm93biBlbmNvZGluZzogYXNjaWkiCiAKIAogY2xhc3MgSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pcGFkZHJlc3MucHkgYi9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weQppbmRleCA5NGJmNGNkLi41ZjA4ZjBjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weQpAQCAtMTE3Niw2ICsxMTc2LDcgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLmlwdjZfbmV0d29ya1s1XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJzIwMDE6NjU4OjIyYTpjYWZlOjo1JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2VsZi5pcHY2X25ldHdvcmsuX19nZXRpdGVtX18sIDEgPDwgNjQpCiAKICAgICBkZWYgdGVzdEdldGl0ZW0oc2VsZik6CiAgICAgICAgICMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2lwYWRkci1weS9pc3N1ZXMvZGV0YWlsP2lkPTE1CkBAIC0xMjYyLDcgKzEyNjMsNyBAQAogICAgICAgICBpcDQgPSBpcGFkZHJlc3MuSVB2NEFkZHJlc3MoJzEuMS4xLjMnKQogICAgICAgICBpcDUgPSBpcGFkZHJlc3MuSVB2NEFkZHJlc3MoJzEuMS4xLjQnKQogICAgICAgICBpcDYgPSBpcGFkZHJlc3MuSVB2NEFkZHJlc3MoJzEuMS4xLjAnKQotICAgICAgICAjIGNoZWNrIHRoYXQgYWRkcmVzZXMgYXJlIHN1YnN1bWVkIHByb3Blcmx5LgorICAgICAgICAjIGNoZWNrIHRoYXQgYWRkcmVzc2VzIGFyZSBzdWJzdW1lZCBwcm9wZXJseS4KICAgICAgICAgY29sbGFwc2VkID0gaXBhZGRyZXNzLmNvbGxhcHNlX2FkZHJlc3NlcygKICAgICAgICAgICAgIFtpcDEsIGlwMiwgaXAzLCBpcDQsIGlwNSwgaXA2XSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxhcHNlZCksCkBAIC0xMjc2LDcgKzEyNzcsNyBAQAogICAgICAgICBpcDQgPSBpcGFkZHJlc3MuSVB2NEFkZHJlc3MoJzEuMS4xLjMnKQogICAgICAgICAjaXA1ID0gaXBhZGRyZXNzLklQdjRJbnRlcmZhY2UoJzEuMS4xLjQvMzAnKQogICAgICAgICAjaXA2ID0gaXBhZGRyZXNzLklQdjRJbnRlcmZhY2UoJzEuMS4xLjQvMzAnKQotICAgICAgICAjIGNoZWNrIHRoYXQgYWRkcmVzZXMgYXJlIHN1YnN1bWVkIHByb3Blcmx5LgorICAgICAgICAjIGNoZWNrIHRoYXQgYWRkcmVzc2VzIGFyZSBzdWJzdW1lZCBwcm9wZXJseS4KICAgICAgICAgY29sbGFwc2VkID0gaXBhZGRyZXNzLmNvbGxhcHNlX2FkZHJlc3NlcyhbaXAxLCBpcDIsIGlwMywgaXA0XSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxhcHNlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lwYWRkcmVzcy5JUHY0TmV0d29yaygnMS4xLjEuMC8zMCcpXSkKQEAgLTEyOTAsNyArMTI5MSw3IEBACiAgICAgICAgICMgc3RvcmVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIgYi9jIHdlIHdhbnQgQ29sbGFwc2VBZGRyIHRvIGNhbGwKICAgICAgICAgIyBbXS5zb3J0CiAgICAgICAgIGlwNiA9IGlwYWRkcmVzcy5JUHY0TmV0d29yaygnMS4xLjAuMC8yMicpCi0gICAgICAgICMgY2hlY2sgdGhhdCBhZGRyZXNlcyBhcmUgc3Vic3VtZWQgcHJvcGVybHkuCisgICAgICAgICMgY2hlY2sgdGhhdCBhZGRyZXNzZXMgYXJlIHN1YnN1bWVkIHByb3Blcmx5LgogICAgICAgICBjb2xsYXBzZWQgPSBpcGFkZHJlc3MuY29sbGFwc2VfYWRkcmVzc2VzKFtpcDEsIGlwMiwgaXAzLCBpcDQsIGlwNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2XSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxhcHNlZCksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggYTkxNjcwYi4uNTQyYjI4NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtNTQsNiArNTQsMTQgQEAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CiAgICAgICAgIHJldHVybiBpCiAKK2NsYXNzIERlZmF1bHRJdGVyQ2xhc3M6CisgICAgcGFzcworCitjbGFzcyBOb0l0ZXJDbGFzczoKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBpCisgICAgX19pdGVyX18gPSBOb25lCisKICMgTWFpbiB0ZXN0IHN1aXRlCiAKIGNsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTk5NSw2ICsxMDAzLDEwIEBACiAgICAgZGVmIHRlc3RfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZik6CiAgICAgICAgIGNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIGl0ZXIsIFNlcXVlbmNlQ2xhc3MsICgwLCkpCiAKKyAgICBkZWYgdGVzdF9lcnJvcl9pdGVyKHNlbGYpOgorICAgICAgICBmb3IgdHlwIGluIChEZWZhdWx0SXRlckNsYXNzLCBOb0l0ZXJDbGFzcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl0ZXIsIHR5cCgpKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKaW5kZXggMTUyZjVmYy4uNDFjOTc1MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQpAQCAtNDIsNyArNDIsNiBAQAogIiIiCiAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcmVwZWF0CiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQogZnJvbSBvcGVyYXRvciBpbXBvcnQgbGVuZ3RoX2hpbnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKaW5kZXggZjk0MDg1Mi4uOTQ1YzU4ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKQEAgLTQsNyArNCw2IEBACiBpbXBvcnQgd2Vha3JlZgogZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCiBmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24KLWltcG9ydCBzeXMKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHJhbmRvbQogaW1wb3J0IGNvcHkKQEAgLTYxMyw2ICs2MTIsNTYgQEAKICAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CiAgICAgICAgICAgICBzZWxmLnBpY2tsZXRlc3QocHJvdG8sIGN5Y2xlKCdhYmMnKSkKIAorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICMgdGVzdCB3aXRoIHBhcnRpYWwgY29uc3VtZWQgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgIGl0ID0gaXRlcignYWJjZGUnKQorICAgICAgICAgICAgYyA9IGN5Y2xlKGl0KQorICAgICAgICAgICAgXyA9IFtuZXh0KGMpIGZvciBpIGluIHJhbmdlKDIpXSAgICAgICMgY29uc3VtZSAyIG9mIDUgaW5wdXRzCisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKGMsIHByb3RvKQorICAgICAgICAgICAgZCA9IHBpY2tsZS5sb2FkcyhwKSAgICAgICAgICAgICAgICAgICMgcmVidWlsZCB0aGUgY3ljbGUgb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGQpLCBsaXN0KCdjZGVhYmNkZWFiY2RlYWJjZGVhYicpKQorCisgICAgICAgICAgICAjIHRlc3Qgd2l0aCBjb21wbGV0ZWx5IGNvbnN1bWVkIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICBpdCA9IGl0ZXIoJ2FiY2RlJykKKyAgICAgICAgICAgIGMgPSBjeWNsZShpdCkKKyAgICAgICAgICAgIF8gPSBbbmV4dChjKSBmb3IgaSBpbiByYW5nZSg3KV0gICAgICAjIGNvbnN1bWUgNyBvZiA1IGlucHV0cworICAgICAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhjLCBwcm90bykKKyAgICAgICAgICAgIGQgPSBwaWNrbGUubG9hZHMocCkgICAgICAgICAgICAgICAgICAjIHJlYnVpbGQgdGhlIGN5Y2xlIG9iamVjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBkKSwgbGlzdCgnY2RlYWJjZGVhYmNkZWFiY2RlYWInKSkKKworICAgIGRlZiB0ZXN0X2N5Y2xlX3NldHN0YXRlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSBib3RoIG1vZGVzIGZvciByZXN0b3Jpbmcgc3RhdGUKKworICAgICAgICAjIE1vZGUgMCBpcyBlZmZpY2llbnQuICBJdCB1c2VzIGFuIGluY29tcGxldGVseSBjb25zdW1lZCBpbnB1dAorICAgICAgICAjIGl0ZXJhdG9yIHRvIGJ1aWxkIGEgY3ljbGUgb2JqZWN0IGFuZCB0aGVuIHBhc3NlcyBpbiBzdGF0ZSB3aXRoCisgICAgICAgICMgYSBsaXN0IG9mIHByZXZpb3VzbHkgY29uc3VtZWQgdmFsdWVzLiAgVGhlcmUgaXMgbm8gZGF0YQorICAgICAgICAjIG92ZXJsYXAgYmV0d2VlbiB0aGUgdHdvLgorICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICBjLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjJyksIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGMpLCBsaXN0KCdkZWZnYWJjZGVmZ2FiY2RlZmdhYicpKQorCisgICAgICAgICMgTW9kZSAxIGlzIGluZWZmaWNpZW50LiAgSXQgc3RhcnRzIHdpdGggYSBjeWNsZSBvYmplY3QgYnVpbHQKKyAgICAgICAgIyBmcm9tIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiBhIHBhcnRpYWwKKyAgICAgICAgIyBjeWNsZSBhbmQgdGhlbiBwYXNzZXMgaW4gc3RhdGUgd2l0aCBhbGwgb2YgdGhlIHByZXZpb3VzbHkKKyAgICAgICAgIyBzZWVuIHZhbHVlcyAodGhpcyBvdmVybGFwcyB2YWx1ZXMgaW5jbHVkZWQgaW4gdGhlIGl0ZXJhdG9yKS4KKyAgICAgICAgYyA9IGN5Y2xlKCdkZWZnJykKKyAgICAgICAgYy5fX3NldHN0YXRlX18oKGxpc3QoJ2FiY2RlZmcnKSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgYyksIGxpc3QoJ2RlZmdhYmNkZWZnYWJjZGVmZ2FiJykpCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0c3RhdGUgbmVlZHMgdG8gYmUgYSB0dXBsZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yKToKKyAgICAgICAgICAgIGN5Y2xlKCdkZWZnJykuX19zZXRzdGF0ZV9fKFtsaXN0KCdhYmNkZWZnJyksIDBdKQorCisgICAgICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBzZXRzdGF0ZSB0dXBsZSBtdXN0IGJlIGEgbGlzdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICAgICAgYy5fX3NldHN0YXRlX18oKGRpY3QuZnJvbWtleXMoJ2RlZmcnKSwgMCkpCisgICAgICAgICAgICB0YWtlKDIwLCBjKQorCisgICAgICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBzZXRzdGF0ZSB0dXBsZSBtdXN0IGJlIGEgbGlzdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjeWNsZSgnZGVmZycpLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjZGVmZycpLCAneCcpKQorCiAgICAgZGVmIHRlc3RfZ3JvdXBieShzZWxmKToKICAgICAgICAgIyBDaGVjayB3aGV0aGVyIGl0IGFjY2VwdHMgYXJndW1lbnRzIGNvcnJlY3RseQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBsaXN0KGdyb3VwYnkoW10pKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfanNvbi9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3RfanNvbi9fX2luaXRfXy5weQppbmRleCAwODA3ZTZmLi5iYWMzNzBkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2pzb24vX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5CkBAIC0xLDUgKzEsNCBAQAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQganNvbgogaW1wb3J0IGRvY3Rlc3QKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9qc29uL3Rlc3RfZmFpbC5weSBiL0xpYi90ZXN0L3Rlc3RfanNvbi90ZXN0X2ZhaWwucHkKaW5kZXggOTVmZjViOC4uNzkxMDUyMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9qc29uL3Rlc3RfZmFpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5CkBAIC0xLDUgKzEsNCBAQAogZnJvbSB0ZXN0LnRlc3RfanNvbiBpbXBvcnQgUHlUZXN0LCBDVGVzdAotaW1wb3J0IHJlCiAKICMgMjAwNy0xMC0wNQogSlNPTkRPQ1MgPSBbCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2txdWV1ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CmluZGV4IGY4MjIwMjQuLjlmNDk4ODYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CkBAIC01LDcgKzUsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5IGIvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKaW5kZXggNDdlMmVkZC4uMzc1ZDljNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKQEAgLTMsNiArMyw4IEBACiBpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0b2tlbml6ZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIApAQCAtMTAsOCArMTIsNiBAQAogTk9ORVhJU1RFTlRfRklMRU5BTUUgPSBGSUxFTkFNRSArICcubWlzc2luZycKIElOVkFMSURfTkFNRSA9ICchQCQpKCFAI18xJwogRU1QVFkgPSAnJwotVEVTVFMgPSAnaW5zcGVjdF9mb2RkZXIgaW5zcGVjdF9mb2RkZXIyIG1hcHBpbmdfdGVzdHMnCi1URVNUUyA9IFRFU1RTLnNwbGl0KCkKIFRFU1RfUEFUSCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKIE1PRFVMRVMgPSAibGluZWNhY2hlIGFiYyIuc3BsaXQoKQogTU9EVUxFX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUoRklMRU5BTUUpCkBAIC0zNyw2ICszNyw2NSBAQAogICAgIHJldHVybiAzJycnICMgTm8gZW5kaW5nIG5ld2xpbmUKIAogCitjbGFzcyBUZW1wRmlsZToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisgICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmZpbGVfbmFtZSA9IGZwLm5hbWUKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZmlsZV9ieXRlX3N0cmluZykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZpbGVfbmFtZSkKKworCitjbGFzcyBHZXRMaW5lVGVzdHNHb29kRGF0YShUZW1wRmlsZSk6CisgICAgIyBmaWxlX2xpc3QgICA9IFsnbGlzdFxuJywgJ29mXG4nLCAnZ29vZFxuJywgJ3N0cmluZ3NcbiddCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZV9ieXRlX3N0cmluZyA9ICcnLmpvaW4oc2VsZi5maWxlX2xpc3QpLmVuY29kZSgndXRmLTgnKQorICAgICAgICBzdXBlcigpLnNldFVwKCkKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggdG9rZW5pemUub3BlbihzZWxmLmZpbGVfbmFtZSkgYXMgZnA6CisgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGZwKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSAnXG4nCisKKyAgICAgICAgICAgICAgICBjYWNoZWRfbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKHNlbGYuZmlsZV9uYW1lLCBpbmRleCArIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBjYWNoZWRfbGluZSkKKworICAgIGRlZiB0ZXN0X2dldGxpbmVzKHNlbGYpOgorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgc2VsZi5maWxlX2xpc3QpCisKKworY2xhc3MgR2V0TGluZVRlc3RzQmFkRGF0YShUZW1wRmlsZSk6CisgICAgIyBmaWxlX2J5dGVfc3RyaW5nID0gYidCYWQgZGF0YSBnb2VzIGhlcmUnCisKKyAgICBkZWYgdGVzdF9nZXRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoU3ludGF4RXJyb3IsIFVuaWNvZGVEZWNvZGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lLCBzZWxmLmZpbGVfbmFtZSwgMSkKKworICAgIGRlZiB0ZXN0X2dldGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoU3ludGF4RXJyb3IsIFVuaWNvZGVEZWNvZGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcywgc2VsZi5maWxlX25hbWUpCisKKworY2xhc3MgRW1wdHlGaWxlKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gW10KKworCitjbGFzcyBTaW5nbGVFbXB0eUxpbmUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbJ1xuJ10KKworCitjbGFzcyBHb29kVW5pY29kZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFsnw6FcbicsICdiXG4nLCAnYWJjZGVmXG4nLCAnw6HDocOhw6HDoVxuJ10KKworCitjbGFzcyBCYWRVbmljb2RlKEdldExpbmVUZXN0c0JhZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2J5dGVfc3RyaW5nID0gYidceDgwYWJjJworCisKIGNsYXNzIExpbmVDYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CkBAIC01MywxMyArMTEyLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKEVNUFRZLCAxKSwgRU1QVFkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0bGluZShJTlZBTElEX05BTUUsIDEpLCBFTVBUWSkKIAotICAgICAgICAjIENoZWNrIHdoZXRoZXIgbGluZXMgY29ycmVzcG9uZCB0byB0aG9zZSBmcm9tIGZpbGUgaXRlcmF0aW9uCi0gICAgICAgIGZvciBlbnRyeSBpbiBURVNUUzoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFU1RfUEFUSCwgZW50cnkpICsgJy5weScKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZmlsZToKLSAgICAgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGZpbGUpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoZmlsZW5hbWUsIGluZGV4ICsgMSkpCi0KICAgICAgICAgIyBDaGVjayBtb2R1bGUgbG9hZGluZwogICAgICAgICBmb3IgZW50cnkgaW4gTU9EVUxFUzoKICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKE1PRFVMRV9QQVRILCBlbnRyeSkgKyAnLnB5JwpAQCAtODAsMTIgKzEzMiwxMyBAQAogCiAgICAgZGVmIHRlc3RfY2xlYXJjYWNoZShzZWxmKToKICAgICAgICAgY2FjaGVkID0gW10KLSAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JworICAgICAgICBmb3IgZW50cnkgaW4gTU9EVUxFUzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKE1PRFVMRV9QQVRILCBlbnRyeSkgKyAnLnB5JwogICAgICAgICAgICAgY2FjaGVkLmFwcGVuZChmaWxlbmFtZSkKICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCAxKQogCiAgICAgICAgICMgQXJlIGFsbCBmaWxlcyBjYWNoZWQ/CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2FjaGVkLCBbXSkKICAgICAgICAgY2FjaGVkX2VtcHR5ID0gW2ZuIGZvciBmbiBpbiBjYWNoZWQgaWYgZm4gbm90IGluIGxpbmVjYWNoZS5jYWNoZV0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZWRfZW1wdHksIFtdKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xpc3QucHkgYi9MaWIvdGVzdC90ZXN0X2xpc3QucHkKaW5kZXggOGY4MmFiNS4uYWVlNjJkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9saXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCBzeXMKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgbGlzdF90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBsaXN0X3Rlc3RzCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CmluZGV4IGNiNmE2MjguLmZmMDAxMmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBjb2RlY3MKIGltcG9ydCBjb25maWdwYXJzZXIKIGltcG9ydCBkYXRldGltZQoraW1wb3J0IHBhdGhsaWIKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBpbwogaW1wb3J0IGdjCkBAIC0zMDgsNiArMzA5LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nZ2luZy5nZXRMZXZlbE5hbWUoJ0lORk8nKSwgbG9nZ2luZy5JTkZPKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ2dpbmcuZ2V0TGV2ZWxOYW1lKGxvZ2dpbmcuSU5GTyksICdJTkZPJykKIAorICAgIGRlZiB0ZXN0X2lzc3VlMjc5MzUoc2VsZik6CisgICAgICAgIGZhdGFsID0gbG9nZ2luZy5nZXRMZXZlbE5hbWUoJ0ZBVEFMJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYXRhbCwgbG9nZ2luZy5GQVRBTCkKKwogY2xhc3MgQmFzaWNGaWx0ZXJUZXN0KEJhc2VUZXN0KToKIAogICAgICIiIlRlc3QgdGhlIGJ1bmRsZWQgRmlsdGVyIGNsYXNzLiIiIgpAQCAtNTc1LDYgKzU4MCwyOSBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGguc2hvdWxkRmx1c2gocikpCiAgICAgICAgIGguY2xvc2UoKQogCisgICAgZGVmIHRlc3RfcGF0aF9vYmplY3RzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IFBhdGggb2JqZWN0cyBhcmUgYWNjZXB0ZWQgYXMgZmlsZW5hbWUgYXJndW1lbnRzIHRvIGhhbmRsZXJzLgorCisgICAgICAgIFNlZSBJc3N1ZSAjMjc0OTMuCisgICAgICAgICIiIgorICAgICAgICBmZCwgZm4gPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIG9zLnVubGluayhmbikKKyAgICAgICAgcGZuID0gcGF0aGxpYi5QYXRoKGZuKQorICAgICAgICBjYXNlcyA9ICgKKyAgICAgICAgICAgICAgICAgICAgKGxvZ2dpbmcuRmlsZUhhbmRsZXIsIChwZm4sICd3JykpLAorICAgICAgICAgICAgICAgICAgICAobG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyLCAocGZuLCAnYScpKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvZ2dpbmcuaGFuZGxlcnMuVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyLCAocGZuLCAnaCcpKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2xpbnV4JywgJ2RhcndpbicpOgorICAgICAgICAgICAgY2FzZXMgKz0gKChsb2dnaW5nLmhhbmRsZXJzLldhdGNoZWRGaWxlSGFuZGxlciwgKHBmbiwgJ3cnKSksKQorICAgICAgICBmb3IgY2xzLCBhcmdzIGluIGNhc2VzOgorICAgICAgICAgICAgaCA9IGNscygqYXJncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmbikpCisgICAgICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhmbikKKwogICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAnbnQnLCAnV2F0Y2hlZEZpbGVIYW5kbGVyIG5vdCBhcHByb3ByaWF0ZSBmb3IgV2luZG93cy4nKQogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiAgICAgZGVmIHRlc3RfcmFjZShzZWxmKToKQEAgLTk1OCw3ICs5ODYsNyBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgQmFzZVRlc3Quc2V0VXAoc2VsZikKICAgICAgICAgc2VsZi5tZW1faGRsciA9IGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcigxMCwgbG9nZ2luZy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJvb3RfaGRscikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJvb3RfaGRscikKICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ21lbScpCiAgICAgICAgIHNlbGYubWVtX2xvZ2dlci5wcm9wYWdhdGUgPSAwCiAgICAgICAgIHNlbGYubWVtX2xvZ2dlci5hZGRIYW5kbGVyKHNlbGYubWVtX2hkbHIpCkBAIC05OTUsNiArMTAyMywzNiBAQAogICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQogCisgICAgZGVmIHRlc3RfZmx1c2hfb25fY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgdGhlIGZsdXNoLW9uLWNsb3NlIGNvbmZpZ3VyYXRpb24gd29ya3MgYXMgZXhwZWN0ZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5yZW1vdmVIYW5kbGVyKHNlbGYubWVtX2hkbHIpCisgICAgICAgICMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gZmx1c2ggb24gY2xvc2UuIENoZWNrIHRoYXQgaXQgaGFwcGVucy4KKyAgICAgICAgc2VsZi5tZW1faGRsci5jbG9zZSgpCisgICAgICAgIGxpbmVzID0gWworICAgICAgICAgICAgKCdERUJVRycsICcxJyksCisgICAgICAgICAgICAoJ0lORk8nLCAnMicpLAorICAgICAgICBdCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgIyBOb3cgY29uZmlndXJlIGZvciBmbHVzaGluZyBub3QgdG8gYmUgZG9uZSBvbiBjbG9zZS4KKyAgICAgICAgc2VsZi5tZW1faGRsciA9IGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcigxMCwgbG9nZ2luZy5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucm9vdF9oZGxyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuYWRkSGFuZGxlcihzZWxmLm1lbV9oZGxyKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKSAgIyBubyBjaGFuZ2UKKyAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKSAgIyBubyBjaGFuZ2UKKyAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5tZW1faGRscikKKyAgICAgICAgc2VsZi5tZW1faGRsci5jbG9zZSgpCisgICAgICAgICMgYXNzZXJ0IHRoYXQgbm8gbmV3IGxpbmVzIGhhdmUgYmVlbiBhZGRlZAorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpICAjIG5vIGNoYW5nZQorCiAKIGNsYXNzIEV4Y2VwdGlvbkZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcik6CiAgICAgIiIiQSBzcGVjaWFsIGV4Y2VwdGlvbiBmb3JtYXR0ZXIuIiIiCkBAIC00MTYxLDYgKzQyMTksMTcgQEAKICAgICAgICAgbXNnID0gJ1JlY29yZCBub3QgZm91bmQgaW4gZXZlbnQgbG9nLCB3ZW50IGJhY2sgJWQgcmVjb3JkcycgJSBHT19CQUNLCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgbXNnPW1zZykKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydsb2dUaHJlYWRzJywgJ2xvZ011bHRpcHJvY2Vzc2luZycsCisgICAgICAgICAgICAgICAgICAgICAnbG9nUHJvY2Vzc2VzJywgJ2N1cnJlbnRmcmFtZScsCisgICAgICAgICAgICAgICAgICAgICAnUGVyY2VudFN0eWxlJywgJ1N0ckZvcm1hdFN0eWxlJywgJ1N0cmluZ1RlbXBsYXRlU3R5bGUnLAorICAgICAgICAgICAgICAgICAgICAgJ0ZpbHRlcmVyJywgJ1BsYWNlSG9sZGVyJywgJ01hbmFnZXInLCAnUm9vdExvZ2dlcicsCisgICAgICAgICAgICAgICAgICAgICAncm9vdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGxvZ2dpbmcsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogIyBTZXQgdGhlIGxvY2FsZSB0byB0aGUgcGxhdGZvcm0tZGVwZW5kZW50IGRlZmF1bHQuICBJIGhhdmUgbm8gaWRlYQogIyB3aHkgdGhlIHRlc3QgZG9lcyB0aGlzLCBidXQgaW4gYW55IGNhc2Ugd2Ugc2F2ZSB0aGUgY3VycmVudCBsb2NhbGUKICMgZmlyc3QgYW5kIHJlc3RvcmUgaXQgYXQgdGhlIGVuZC4KQEAgLTQxNzcsNyArNDI0Niw4IEBACiAgICAgICAgIFJvdGF0aW5nRmlsZUhhbmRsZXJUZXN0LCAgTGFzdFJlc29ydFRlc3QsIExvZ1JlY29yZFRlc3QsCiAgICAgICAgIEV4Y2VwdGlvblRlc3QsIFN5c0xvZ0hhbmRsZXJUZXN0LCBIVFRQSGFuZGxlclRlc3QsCiAgICAgICAgIE5URXZlbnRMb2dIYW5kbGVyVGVzdCwgVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyVGVzdCwKLSAgICAgICAgVW5peFNvY2tldEhhbmRsZXJUZXN0LCBVbml4RGF0YWdyYW1IYW5kbGVyVGVzdCwgVW5peFN5c0xvZ0hhbmRsZXJUZXN0KQorICAgICAgICBVbml4U29ja2V0SGFuZGxlclRlc3QsIFVuaXhEYXRhZ3JhbUhhbmRsZXJUZXN0LCBVbml4U3lzTG9nSGFuZGxlclRlc3QsCisgICAgICAgIE1pc2NUZXN0Q2FzZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CmluZGV4IDRiMmQ4MWMuLjRjYzRiMDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKQEAgLTY4OSw2ICs2ODksMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgaW50LCBmbG9hdCgnLWluZicpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIGZsb2F0KCduYW4nKSkKIAorICAgIGRlZiB0ZXN0X21vZF9kaXZpc2lvbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBfID0gMSAlIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzICUgMTAsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEzICUgMTAsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTMgJSAtMTAsIC03KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMyAlIC0xMCwgLTMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIDQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyICUgNCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIC00LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAlIC00LCAwKQorCiAgICAgZGVmIHRlc3RfdHJ1ZV9kaXZpc2lvbihzZWxmKToKICAgICAgICAgaHVnZSA9IDEgPDwgNDAwMDAKICAgICAgICAgbWh1Z2UgPSAtaHVnZQpAQCAtNzIzLDYgKzczNywyNSBAQAogICAgICAgICBmb3IgemVybyBpbiBbImh1Z2UgLyAwIiwgIm1odWdlIC8gMCJdOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGV2YWwsIHplcm8sIG5hbWVzcGFjZSkKIAorICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIF8gPSAxIC8vIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIgLy8gMywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyIC8vIC0zLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAzLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAtMywgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMSAvLyAtMywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTEgLy8gMywgLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEgLy8gLTMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExIC8vIDMsIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIgLy8gLTMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyIC8vIDMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyIC8vIC0zLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAvLyAzLCA0KQorCiAgICAgZGVmIGNoZWNrX3RydWVkaXYoc2VsZiwgYSwgYiwgc2tpcF9zbWFsbD1UcnVlKToKICAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBvZiBhL2IgaXMgY29ycmVjdGx5IHJvdW5kZWQsIGJ5CiAgICAgICAgIGNvbXBhcmluZyBpdCB3aXRoIGEgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgY29ycmVjdGx5CkBAIC04NDUsNiArODc4LDIxIEBACiAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoLXgsIHkpCiAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoLXgsIC15KQogCisgICAgZGVmIHRlc3RfbHNoaWZ0X29mX3plcm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCA8PCAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAgPDwgMTAsIDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAwIDw8IC0xCisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9odWdlX2xzaGlmdF9vZl96ZXJvKHNlbGYpOgorICAgICAgICAjIFNob3VsZG4ndCB0cnkgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIGh1Z2Ugc2hpZnQuIFNlZSBpc3N1ZSAjMjc4NzAuCisgICAgICAgICMgT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSBoYXZlIGEgZGlmZmVyZW50IGJvdW5kYXJ5IGZvciBvdmVyZmxvdywKKyAgICAgICAgIyBvciBub3QgcmFpc2UgYXQgYWxsLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAgPDwgc3lzLm1heHNpemUsIDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICAwIDw8IChzeXMubWF4c2l6ZSArIDEpCisKICAgICBkZWYgdGVzdF9zbWFsbF9pbnRzKHNlbGYpOgogICAgICAgICBmb3IgaSBpbiByYW5nZSgtNSwgMjU3KToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaSwgaSArIDApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKaW5kZXggODBiZWM3YS4uMDY5OGZmNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCBtYWNwYXRoCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIHRlc3RfZ2VuZXJpY3BhdGgKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9nZW5lcmljcGF0aAogaW1wb3J0IHVuaXR0ZXN0CiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CmluZGV4IDA5OTFmNzQuLmFlYWJkYmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKQEAgLTcsMTcgKzcsMTIgQEAKIGltcG9ydCBlbWFpbC5tZXNzYWdlCiBpbXBvcnQgcmUKIGltcG9ydCBpbwotaW1wb3J0IHNodXRpbAogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgbWFpbGJveAogaW1wb3J0IGdsb2IKLXRyeToKLSAgICBpbXBvcnQgZmNudGwKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCiAKIAogY2xhc3MgVGVzdEJhc2U6CkBAIC0yMjczLDEyICsyMjY4LDE4IEBACiAiIiIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsibGluZXNlcCIsICJmY250bCJ9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG1haWxib3gsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gKFRlc3RNYWlsYm94U3VwZXJjbGFzcywgVGVzdE1haWxkaXIsIFRlc3RNYm94LCBUZXN0TU1ERiwgVGVzdE1ILAogICAgICAgICAgICAgIFRlc3RCYWJ5bCwgVGVzdE1lc3NhZ2UsIFRlc3RNYWlsZGlyTWVzc2FnZSwgVGVzdE1ib3hNZXNzYWdlLAogICAgICAgICAgICAgIFRlc3RNSE1lc3NhZ2UsIFRlc3RCYWJ5bE1lc3NhZ2UsIFRlc3RNTURGTWVzc2FnZSwKICAgICAgICAgICAgICBUZXN0TWVzc2FnZUNvbnZlcnNpb24sIFRlc3RQcm94eUZpbGUsIFRlc3RQYXJ0aWFsRmlsZSwKLSAgICAgICAgICAgICBNYWlsZGlyVGVzdENhc2UsIFRlc3RGYWtlTWFpbEJveCkKKyAgICAgICAgICAgICBNYWlsZGlyVGVzdENhc2UsIFRlc3RGYWtlTWFpbEJveCwgTWlzY1Rlc3RDYXNlKQogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKICAgICBzdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkgYi9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkKaW5kZXggMjJiMmZjYy4uNjIzZmFkYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGNhcC5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBtYWlsY2FwCiBpbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZXN0LnN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKaW5kZXggYzdkZWY5YS4uYjM3OGZmZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQpAQCAtMTM1LDYgKzEzNSwxMyBAQAogICAgICAgICBmb3IgY29uc3RydWN0b3IgaW4gKHNldCwgZnJvemVuc2V0KToKICAgICAgICAgICAgIHNlbGYuaGVscGVyKGNvbnN0cnVjdG9yKHNlbGYuZC5rZXlzKCkpKQogCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZW1wdHlfZnJvemVuc2V0X3NpbmdsZXRvbihzZWxmKToKKyAgICAgICAgIyBtYXJzaGFsLmxvYWRzKCkgbXVzdCByZXVzZSB0aGUgZW1wdHkgZnJvemVuc2V0IHNpbmdsZXRvbgorICAgICAgICBvYmogPSBmcm96ZW5zZXQoKQorICAgICAgICBvYmoyID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKG9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob2JqMiwgb2JqKQorCiAKIGNsYXNzIEJ1ZmZlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlLCBIZWxwZXJNaXhpbik6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQppbmRleCBhMzc5YTZhLi5lYWE0MWJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CkBAIC03LDE0ICs3LDE1IEBACiBpbXBvcnQgbWF0aAogaW1wb3J0IG9zCiBpbXBvcnQgcGxhdGZvcm0KLWltcG9ydCBzeXMKIGltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKIAogZXBzID0gMUUtMDUKIE5BTiA9IGZsb2F0KCduYW4nKQogSU5GID0gZmxvYXQoJ2luZicpCiBOSU5GID0gZmxvYXQoJy1pbmYnKQorRkxPQVRfTUFYID0gc3lzLmZsb2F0X2luZm8ubWF4CiAKICMgZGV0ZWN0IGV2aWRlbmNlIG9mIGRvdWJsZS1yb3VuZGluZzogZnN1bSBpcyBub3QgYWx3YXlzIGNvcnJlY3RseQogIyByb3VuZGVkIG9uIG1hY2hpbmVzIHRoYXQgc3VmZmVyIGZyb20gZG91YmxlIHJvdW5kaW5nLgpAQCAtMzAsNiArMzEsNyBAQAogbWF0aF90ZXN0Y2FzZXMgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICdtYXRoX3Rlc3RjYXNlcy50eHQnKQogdGVzdF9maWxlID0gb3MucGF0aC5qb2luKHRlc3RfZGlyLCAnY21hdGhfdGVzdGNhc2VzLnR4dCcpCiAKKwogZGVmIHRvX3VscHMoeCk6CiAgICAgIiIiQ29udmVydCBhIG5vbi1OYU4gZmxvYXQgeCB0byBhbiBpbnRlZ2VyLCBpbiBzdWNoIGEgd2F5IHRoYXQKICAgICBhZGphY2VudCBmbG9hdHMgYXJlIGNvbnZlcnRlZCB0byBhZGphY2VudCBpbnRlZ2Vycy4gIFRoZW4KQEAgLTM3LDI1ICszOSwzOSBAQAogICAgIGZsb2F0cy4KIAogICAgIFRoZSByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgbWFrZSBzZW5zZSBvbiBwbGF0Zm9ybXMKLSAgICB3aGVyZSBDIGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGluIElFRUUgNzU0IGJpbmFyeTY0IGZvcm1hdC4KKyAgICB3aGVyZSBuYXRpdmUgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgaW4gSUVFRSA3NTQgYmluYXJ5NjQgZm9ybWF0LgogCisgICAgTm90ZTogMC4wIGFuZCAtMC4wIGFyZSBjb252ZXJ0ZWQgdG8gMCBhbmQgLTEsIHJlc3BlY3RpdmVseS4KICAgICAiIiIKICAgICBuID0gc3RydWN0LnVucGFjaygnPHEnLCBzdHJ1Y3QucGFjaygnPGQnLCB4KSlbMF0KICAgICBpZiBuIDwgMDoKICAgICAgICAgbiA9IH4obisyKio2MykKICAgICByZXR1cm4gbgogCi1kZWYgdWxwc19jaGVjayhleHBlY3RlZCwgZ290LCB1bHBzPTIwKToKLSAgICAiIiJHaXZlbiBub24tTmFOIGZsb2F0cyBgZXhwZWN0ZWRgIGFuZCBgZ290YCwKLSAgICBjaGVjayB0aGF0IHRoZXkncmUgZXF1YWwgdG8gd2l0aGluIHRoZSBnaXZlbiBudW1iZXIgb2YgdWxwcy4KIAotICAgIFJldHVybnMgTm9uZSBvbiBzdWNjZXNzIGFuZCBhbiBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUuIiIiCitkZWYgdWxwKHgpOgorICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBhCisgICAgZmxvYXQgeCwgc3VjaCB0aGF0IHRoZSBmaXJzdCBmbG9hdCBiaWdnZXIgdGhhbiB4IGlzIHgrdWxwKHgpLgorICAgIFRoZW4sIGdpdmVuIGFuIGV4cGVjdGVkIHJlc3VsdCB4IGFuZCBhIHRvbGVyYW5jZSBvZiBuIHVscHMsCisgICAgdGhlIHJlc3VsdCB5IHNob3VsZCBiZSBzdWNoIHRoYXQgYWJzKHkteCkgPD0gbiAqIHVscCh4KS4KKyAgICBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IG1ha2Ugc2Vuc2Ugb24gcGxhdGZvcm1zCisgICAgd2hlcmUgbmF0aXZlIGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGluIElFRUUgNzU0IGJpbmFyeTY0IGZvcm1hdC4KKyAgICAiIiIKKyAgICB4ID0gYWJzKGZsb2F0KHgpKQorICAgIGlmIG1hdGguaXNuYW4oeCkgb3IgbWF0aC5pc2luZih4KToKKyAgICAgICAgcmV0dXJuIHgKIAotICAgIHVscHNfZXJyb3IgPSB0b191bHBzKGdvdCkgLSB0b191bHBzKGV4cGVjdGVkKQotICAgIGlmIGFicyh1bHBzX2Vycm9yKSA8PSB1bHBzOgotICAgICAgICByZXR1cm4gTm9uZQotICAgIHJldHVybiAiZXJyb3IgPSB7fSB1bHBzOyBwZXJtaXR0ZWQgZXJyb3IgPSB7fSB1bHBzIi5mb3JtYXQodWxwc19lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVscHMpCisgICAgIyBGaW5kIG5leHQgZmxvYXQgdXAgZnJvbSB4LgorICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCc8cScsIHN0cnVjdC5wYWNrKCc8ZCcsIHgpKVswXQorICAgIHhfbmV4dCA9IHN0cnVjdC51bnBhY2soJzxkJywgc3RydWN0LnBhY2soJzxxJywgbiArIDEpKVswXQorICAgIGlmIG1hdGguaXNpbmYoeF9uZXh0KToKKyAgICAgICAgIyBDb3JuZXIgY2FzZTogeCB3YXMgdGhlIGxhcmdlc3QgZmluaXRlIGZsb2F0LiBUaGVuIGl0J3MKKyAgICAgICAgIyBub3QgYW4gZXhhY3QgcG93ZXIgb2YgdHdvLCBzbyB3ZSBjYW4gdGFrZSB0aGUgZGlmZmVyZW5jZQorICAgICAgICAjIGJldHdlZW4geCBhbmQgdGhlIHByZXZpb3VzIGZsb2F0LgorICAgICAgICB4X3ByZXYgPSBzdHJ1Y3QudW5wYWNrKCc8ZCcsIHN0cnVjdC5wYWNrKCc8cScsIG4gLSAxKSlbMF0KKyAgICAgICAgcmV0dXJuIHggLSB4X3ByZXYKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4geF9uZXh0IC0geAogCiAjIEhlcmUncyBhIHB1cmUgUHl0aG9uIHZlcnNpb24gb2YgdGhlIG1hdGguZmFjdG9yaWFsIGFsZ29yaXRobSwgZm9yCiAjIGRvY3VtZW50YXRpb24gYW5kIGNvbXBhcmlzb24gcHVycG9zZXMuCkBAIC0xMDcsMjQgKzEyMywyMyBAQAogICAgICAgICBvdXRlciAqPSBpbm5lcgogICAgIHJldHVybiBvdXRlciA8PCAobiAtIGNvdW50X3NldF9iaXRzKG4pKQogCi1kZWYgYWNjX2NoZWNrKGV4cGVjdGVkLCBnb3QsIHJlbF9lcnI9MmUtMTUsIGFic19lcnIgPSA1ZS0zMjMpOgotICAgICIiIkRldGVybWluZSB3aGV0aGVyIG5vbi1OYU4gZmxvYXRzIGEgYW5kIGIgYXJlIGVxdWFsIHRvIHdpdGhpbiBhCi0gICAgKHNtYWxsKSByb3VuZGluZyBlcnJvci4gIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgcmVsX2VyciBhbmQKLSAgICBhYnNfZXJyIGFyZSBjaG9zZW4gdG8gYmUgc3VpdGFibGUgZm9yIHBsYXRmb3JtcyB3aGVyZSBhIGZsb2F0IGlzCi0gICAgcmVwcmVzZW50ZWQgYnkgYW4gSUVFRSA3NTQgZG91YmxlLiAgVGhleSBhbGxvdyBhbiBlcnJvciBvZiBiZXR3ZWVuCi0gICAgOSBhbmQgMTkgdWxwcy4iIiIKK2RlZiB1bHBfYWJzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIHVscF90b2wsIGFic190b2wpOgorICAgICIiIkdpdmVuIGZpbml0ZSBmbG9hdHMgYGV4cGVjdGVkYCBhbmQgYGdvdGAsIGNoZWNrIHRoYXQgdGhleSdyZQorICAgIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gd2l0aGluIHRoZSBnaXZlbiBudW1iZXIgb2YgdWxwcyBvciB0aGUKKyAgICBnaXZlbiBhYnNvbHV0ZSB0b2xlcmFuY2UsIHdoaWNoZXZlciBpcyBiaWdnZXIuCiAKLSAgICAjIG5lZWQgdG8gc3BlY2lhbCBjYXNlIGluZmluaXRpZXMsIHNpbmNlIGluZiAtIGluZiBnaXZlcyBuYW4KLSAgICBpZiBtYXRoLmlzaW5mKGV4cGVjdGVkKSBhbmQgZ290ID09IGV4cGVjdGVkOgorICAgIFJldHVybnMgTm9uZSBvbiBzdWNjZXNzIGFuZCBhbiBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUuCisgICAgIiIiCisgICAgdWxwX2Vycm9yID0gYWJzKHRvX3VscHMoZXhwZWN0ZWQpIC0gdG9fdWxwcyhnb3QpKQorICAgIGFic19lcnJvciA9IGFicyhleHBlY3RlZCAtIGdvdCkKKworICAgICMgU3VjY2VlZCBpZiBlaXRoZXIgYWJzX2Vycm9yIDw9IGFic190b2wgb3IgdWxwX2Vycm9yIDw9IHVscF90b2wuCisgICAgaWYgYWJzX2Vycm9yIDw9IGFic190b2wgb3IgdWxwX2Vycm9yIDw9IHVscF90b2w6CiAgICAgICAgIHJldHVybiBOb25lCi0KLSAgICBlcnJvciA9IGdvdCAtIGV4cGVjdGVkCi0KLSAgICBwZXJtaXR0ZWRfZXJyb3IgPSBtYXgoYWJzX2VyciwgcmVsX2VyciAqIGFicyhleHBlY3RlZCkpCi0gICAgaWYgYWJzKGVycm9yKSA8IHBlcm1pdHRlZF9lcnJvcjoKLSAgICAgICAgcmV0dXJuIE5vbmUKLSAgICByZXR1cm4gImVycm9yID0ge307IHBlcm1pdHRlZCBlcnJvciA9IHt9Ii5mb3JtYXQoZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZF9lcnJvcikKKyAgICBlbHNlOgorICAgICAgICBmbXQgPSAoImVycm9yID0gezouM2d9ICh7OmR9IHVscHMpOyAiCisgICAgICAgICAgICAgICAicGVybWl0dGVkIGVycm9yID0gezouM2d9IG9yIHs6ZH0gdWxwcyIpCisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KGFic19lcnJvciwgdWxwX2Vycm9yLCBhYnNfdG9sLCB1bHBfdG9sKQogCiBkZWYgcGFyc2VfbXRlc3RmaWxlKGZuYW1lKToKICAgICAiIiJQYXJzZSBhIGZpbGUgd2l0aCB0ZXN0IHZhbHVlcwpAQCAtMTUxLDYgKzE2Niw3IEBACiAKICAgICAgICAgICAgIHlpZWxkIChpZCwgZm4sIGZsb2F0KGFyZyksIGZsb2F0KGV4cCksIGZsYWdzKQogCisKIGRlZiBwYXJzZV90ZXN0ZmlsZShmbmFtZSk6CiAgICAgIiIiUGFyc2UgYSBmaWxlIHdpdGggdGVzdCB2YWx1ZXMKIApAQCAtMTcyLDggKzE4OCw1MyBAQAogICAgICAgICAgICAgeWllbGQgKGlkLCBmbiwKICAgICAgICAgICAgICAgICAgICBmbG9hdChhcmdfcmVhbCksIGZsb2F0KGFyZ19pbWFnKSwKICAgICAgICAgICAgICAgICAgICBmbG9hdChleHBfcmVhbCksIGZsb2F0KGV4cF9pbWFnKSwKLSAgICAgICAgICAgICAgICAgICBmbGFncwotICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgIGZsYWdzKQorCisKK2RlZiByZXN1bHRfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwX3RvbD01LCBhYnNfdG9sPTAuMCk6CisgICAgIyBDb21tb24gbG9naWMgb2YgTWF0aFRlc3RzLihmdGVzdCwgdGVzdF90ZXN0Y2FzZXMsIHRlc3RfbXRlc3RjYXNlcykKKyAgICAiIiJDb21wYXJlIGFyZ3VtZW50cyBleHBlY3RlZCBhbmQgZ290LCBhcyBmbG9hdHMsIGlmIGVpdGhlcgorICAgIGlzIGEgZmxvYXQsIHVzaW5nIGEgdG9sZXJhbmNlIGV4cHJlc3NlZCBpbiBtdWx0aXBsZXMgb2YKKyAgICB1bHAoZXhwZWN0ZWQpIG9yIGFic29sdXRlbHkgKGlmIGdpdmVuIGFuZCBncmVhdGVyKS4KKworICAgIEFzIGEgY29udmVuaWVuY2UsIHdoZW4gbmVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0LCBhbmQgZm9yCisgICAgbm9uLWZpbml0ZSBmbG9hdHMsIGV4YWN0IGVxdWFsaXR5IGlzIGRlbWFuZGVkLiBBbHNvLCBuYW49PW5hbgorICAgIGFzIGZhciBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbmNlcm5lZC4KKworICAgIFJldHVybnMgTm9uZSBvbiBzdWNjZXNzIGFuZCBhbiBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmUuCisgICAgIiIiCisKKyAgICAjIENoZWNrIGV4YWN0bHkgZXF1YWwgKGFwcGxpZXMgYWxzbyB0byBzdHJpbmdzIHJlcHJlc2VudGluZyBleGNlcHRpb25zKQorICAgIGlmIGdvdCA9PSBleHBlY3RlZDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZhaWx1cmUgPSAibm90IGVxdWFsIgorCisgICAgIyBUdXJuIG1peGVkIGZsb2F0IGFuZCBpbnQgY29tcGFyaXNvbiAoZS5nLiBmbG9vcigpKSB0byBhbGwtZmxvYXQKKyAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCBmbG9hdCkgYW5kIGlzaW5zdGFuY2UoZ290LCBpbnQpOgorICAgICAgICBnb3QgPSBmbG9hdChnb3QpCisgICAgZWxpZiBpc2luc3RhbmNlKGdvdCwgZmxvYXQpIGFuZCBpc2luc3RhbmNlKGV4cGVjdGVkLCBpbnQpOgorICAgICAgICBleHBlY3RlZCA9IGZsb2F0KGV4cGVjdGVkKQorCisgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgZmxvYXQpIGFuZCBpc2luc3RhbmNlKGdvdCwgZmxvYXQpOgorICAgICAgICBpZiBtYXRoLmlzbmFuKGV4cGVjdGVkKSBhbmQgbWF0aC5pc25hbihnb3QpOgorICAgICAgICAgICAgIyBQYXNzLCBzaW5jZSBib3RoIG5hbgorICAgICAgICAgICAgZmFpbHVyZSA9IE5vbmUKKyAgICAgICAgZWxpZiBtYXRoLmlzaW5mKGV4cGVjdGVkKSBvciBtYXRoLmlzaW5mKGdvdCk6CisgICAgICAgICAgICAjIFdlIGFscmVhZHkga25vdyB0aGV5J3JlIG5vdCBlcXVhbCwgZHJvcCB0aHJvdWdoIHRvIGZhaWx1cmUKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQm90aCBhcmUgZmluaXRlIGZsb2F0cyAobm93KS4gQXJlIHRoZXkgY2xvc2UgZW5vdWdoPworICAgICAgICAgICAgZmFpbHVyZSA9IHVscF9hYnNfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwX3RvbCwgYWJzX3RvbCkKKworICAgICMgYXJndW1lbnRzIGFyZSBub3QgZXF1YWwsIGFuZCBpZiBudW1lcmljLCBhcmUgdG9vIGZhciBhcGFydAorICAgIGlmIGZhaWx1cmUgaXMgbm90IE5vbmU6CisgICAgICAgIGZhaWxfZm10ID0gImV4cGVjdGVkIHshcn0sIGdvdCB7IXJ9IgorICAgICAgICBmYWlsX21zZyA9IGZhaWxfZm10LmZvcm1hdChleHBlY3RlZCwgZ290KQorICAgICAgICBmYWlsX21zZyArPSAnICh7fSknLmZvcm1hdChmYWlsdXJlKQorICAgICAgICByZXR1cm4gZmFpbF9tc2cKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQogCiAjIENsYXNzIHByb3ZpZGluZyBhbiBfX2luZGV4X18gbWV0aG9kLgogY2xhc3MgTXlJbmRleGFibGUob2JqZWN0KToKQEAgLTE4NSwxOCArMjQ2LDI0IEBACiAKIGNsYXNzIE1hdGhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBkZWYgZnRlc3Qoc2VsZiwgbmFtZSwgdmFsdWUsIGV4cGVjdGVkKToKLSAgICAgICAgaWYgYWJzKHZhbHVlLWV4cGVjdGVkKSA+IGVwczoKLSAgICAgICAgICAgICMgVXNlICVyIGluc3RlYWQgb2YgJWYgc28gdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICMgZGlzcGxheXMgZnVsbCBwcmVjaXNpb24uIE90aGVyd2lzZSBkaXNjcmVwYW5jaWVzCi0gICAgICAgICAgICAjIGluIHRoZSBsYXN0IGZldyBiaXRzIHdpbGwgbGVhZCB0byB2ZXJ5IGNvbmZ1c2luZwotICAgICAgICAgICAgIyBlcnJvciBtZXNzYWdlcwotICAgICAgICAgICAgc2VsZi5mYWlsKCclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInICUKLSAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgdmFsdWUsIGV4cGVjdGVkKSkKKyAgICBkZWYgZnRlc3Qoc2VsZiwgbmFtZSwgZ290LCBleHBlY3RlZCwgdWxwX3RvbD01LCBhYnNfdG9sPTAuMCk6CisgICAgICAgICIiIkNvbXBhcmUgYXJndW1lbnRzIGV4cGVjdGVkIGFuZCBnb3QsIGFzIGZsb2F0cywgaWYgZWl0aGVyCisgICAgICAgIGlzIGEgZmxvYXQsIHVzaW5nIGEgdG9sZXJhbmNlIGV4cHJlc3NlZCBpbiBtdWx0aXBsZXMgb2YKKyAgICAgICAgdWxwKGV4cGVjdGVkKSBvciBhYnNvbHV0ZWx5LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKworICAgICAgICBBcyBhIGNvbnZlbmllbmNlLCB3aGVuIG5laXRoZXIgYXJndW1lbnQgaXMgYSBmbG9hdCwgYW5kIGZvcgorICAgICAgICBub24tZmluaXRlIGZsb2F0cywgZXhhY3QgZXF1YWxpdHkgaXMgZGVtYW5kZWQuIEFsc28sIG5hbj09bmFuCisgICAgICAgIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICBmYWlsdXJlID0gcmVzdWx0X2NoZWNrKGV4cGVjdGVkLCBnb3QsIHVscF90b2wsIGFic190b2wpCisgICAgICAgIGlmIGZhaWx1cmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmZhaWwoInt9OiB7fSIuZm9ybWF0KG5hbWUsIGZhaWx1cmUpKQogCiAgICAgZGVmIHRlc3RDb25zdGFudHMoc2VsZik6Ci0gICAgICAgIHNlbGYuZnRlc3QoJ3BpJywgbWF0aC5waSwgMy4xNDE1OTI2KQotICAgICAgICBzZWxmLmZ0ZXN0KCdlJywgbWF0aC5lLCAyLjcxODI4MTgpCisgICAgICAgICMgUmVmOiBBYnJhbW93aXR6ICYgU3RlZ3VuIChEb3ZlciwgMTk2NSkKKyAgICAgICAgc2VsZi5mdGVzdCgncGknLCBtYXRoLnBpLCAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MykKKyAgICAgICAgc2VsZi5mdGVzdCgnZScsIG1hdGguZSwgMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50YXUsIDIqbWF0aC5waSkKIAogICAgIGRlZiB0ZXN0QWNvcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFjb3MpCkBAIC0yMDUsNiArMjcyLDggQEAKICAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygxKScsIG1hdGguYWNvcygxKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvcywgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCAxICsgZXBzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIC0xIC0gZXBzKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFjb3MoTkFOKSkpCiAKICAgICBkZWYgdGVzdEFjb3NoKHNlbGYpOgpAQCAtMjI0LDYgKzI5Myw4IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW4oMSknLCBtYXRoLmFzaW4oMSksIG1hdGgucGkvMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXNpbiwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCAxICsgZXBzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIC0xIC0gZXBzKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFzaW4oTkFOKSkpCiAKICAgICBkZWYgdGVzdEFzaW5oKHNlbGYpOgpAQCAtMzc4LDkgKzQ0OSw5IEBACiAKICAgICBkZWYgdGVzdENvcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvcykKLSAgICAgICAgc2VsZi5mdGVzdCgnY29zKC1waS8yKScsIG1hdGguY29zKC1tYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoLXBpLzIpJywgbWF0aC5jb3MoLW1hdGgucGkvMiksIDAsIGFic190b2w9dWxwKDEpKQogICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoMCknLCBtYXRoLmNvcygwKSwgMSkKLSAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCwgYWJzX3RvbD11bHAoMSkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2NvcyhwaSknLCBtYXRoLmNvcyhtYXRoLnBpKSwgLTEpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zKElORikpKQpAQCAtNDAzLDYgKzQ3NCw3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMocGkpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkpLCAxODAuMCkKICAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaS8yKScsIG1hdGguZGVncmVlcyhtYXRoLnBpLzIpLCA5MC4wKQogICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKC1waS80KScsIG1hdGguZGVncmVlcygtbWF0aC5waS80KSwgLTQ1LjApCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMoMCknLCBtYXRoLmRlZ3JlZXMoMCksIDApCiAKICAgICBkZWYgdGVzdEV4cChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmV4cCkKQEAgLTQxMiw2ICs0ODQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZXhwKElORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmV4cChOSU5GKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZXhwKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmV4cCwgMTAwMDAwMCkKIAogICAgIGRlZiB0ZXN0RmFicyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZhYnMpCkBAIC02NTQsNiArNzI3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KElORiwgTkFOKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoTkFOLCBOSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoTklORiwgTkFOKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmh5cG90LCBGTE9BVF9NQVgsIEZMT0FUX01BWCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5oeXBvdCgxLjAsIE5BTikpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KE5BTiwgLTIuMCkpKQogCkBAIC03MDcsOCArNzgxLDEwIEBACiAKICAgICBkZWYgdGVzdExvZzFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nMXApCi0gICAgICAgIG49IDIqKjkwCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWF0aC5sb2cxcChuKSwgbWF0aC5sb2cxcChmbG9hdChuKSkpCisgICAgICAgIGZvciBuIGluIFsyLCAyKio5MCwgMioqMzAwXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWF0aC5sb2cxcChuKSwgbWF0aC5sb2cxcChmbG9hdChuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nMXAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nMXAoSU5GKSwgSU5GKQogCiAgICAgQHJlcXVpcmVzX0lFRUVfNzU0CiAgICAgZGVmIHRlc3RMb2cyKHNlbGYpOgpAQCAtOTIyLDYgKzk5OCw3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoMTgwKScsIG1hdGgucmFkaWFucygxODApLCBtYXRoLnBpKQogICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKDkwKScsIG1hdGgucmFkaWFucyg5MCksIG1hdGgucGkvMikKICAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygtNDUpJywgbWF0aC5yYWRpYW5zKC00NSksIC1tYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoMCknLCBtYXRoLnJhZGlhbnMoMCksIDApCiAKICAgICBkZWYgdGVzdFNpbihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnNpbikKQEAgLTk1MSw2ICsxMDI4LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnc3FydCgxKScsIG1hdGguc3FydCgxKSwgMSkKICAgICAgICAgc2VsZi5mdGVzdCgnc3FydCg0KScsIG1hdGguc3FydCg0KSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnNxcnQoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNxcnQsIC0xKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNxcnQsIE5JTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc3FydChOQU4pKSkKIApAQCAtOTcwLDcgKzEwNDgsOCBAQAogICAgIGRlZiB0ZXN0VGFuaChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbmgpCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMCknLCBtYXRoLnRhbmgoMCksIDApCi0gICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMSkrdGFuaCgtMSknLCBtYXRoLnRhbmgoMSkrbWF0aC50YW5oKC0xKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgxKSt0YW5oKC0xKScsIG1hdGgudGFuaCgxKSttYXRoLnRhbmgoLTEpLCAwLAorICAgICAgICAgICAgICAgICAgIGFic190b2w9dWxwKDEpKQogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKGluZiknLCBtYXRoLnRhbmgoSU5GKSwgMSkKICAgICAgICAgc2VsZi5mdGVzdCgndGFuaCgtaW5mKScsIG1hdGgudGFuaChOSU5GKSwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgudGFuaChOQU4pKSkKQEAgLTEwMjAsNyArMTA5OSw4IEBACiAKICAgICBkZWYgdGVzdElzbmFuKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgibmFuIikpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgiaW5mIikqIDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oZmxvYXQoIi1uYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSAqIDAuKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigwLikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigxLikpCkBAIC0xMDg0LDMwICsxMTY0LDY0IEBACiAKICAgICBAcmVxdWlyZXNfSUVFRV83NTQKICAgICBkZWYgdGVzdF90ZXN0ZmlsZShzZWxmKToKKyAgICAgICAgIyBTb21lIHRlc3RzIG5lZWQgdG8gYmUgc2tpcHBlZCBvbiBhbmNpZW50IE9TIFggdmVyc2lvbnMuCisgICAgICAgICMgU2VlIGlzc3VlICMyNzk1My4KKyAgICAgICAgU0tJUF9PTl9USUdFUiA9IHsndGFuMDA2NCd9CisKKyAgICAgICAgb3N4X3ZlcnNpb24gPSBOb25lCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHZlcnNpb25fdHh0ID0gcGxhdGZvcm0ubWFjX3ZlcigpWzBdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3N4X3ZlcnNpb24gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uX3R4dC5zcGxpdCgnLicpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmYWlsX2ZtdCA9ICJ7fToge30oeyFyfSk6IHt9IgorCisgICAgICAgIGZhaWx1cmVzID0gW10KICAgICAgICAgZm9yIGlkLCBmbiwgYXIsIGFpLCBlciwgZWksIGZsYWdzIGluIHBhcnNlX3Rlc3RmaWxlKHRlc3RfZmlsZSk6Ci0gICAgICAgICAgICAjIFNraXAgaWYgZWl0aGVyIHRoZSBpbnB1dCBvciByZXN1bHQgaXMgY29tcGxleCwgb3IgaWYKLSAgICAgICAgICAgICMgZmxhZ3MgaXMgbm9uZW1wdHkKLSAgICAgICAgICAgIGlmIGFpICE9IDAuIG9yIGVpICE9IDAuIG9yIGZsYWdzOgorICAgICAgICAgICAgIyBTa2lwIGlmIGVpdGhlciB0aGUgaW5wdXQgb3IgcmVzdWx0IGlzIGNvbXBsZXgKKyAgICAgICAgICAgIGlmIGFpICE9IDAuMCBvciBlaSAhPSAwLjA6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIGZuIGluIFsncmVjdCcsICdwb2xhciddOgogICAgICAgICAgICAgICAgICMgbm8gcmVhbCB2ZXJzaW9ucyBvZiByZWN0LCBwb2xhcgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIFNraXAgY2VydGFpbiB0ZXN0cyBvbiBPUyBYIDEwLjQuCisgICAgICAgICAgICBpZiBvc3hfdmVyc2lvbiBpcyBub3QgTm9uZSBhbmQgb3N4X3ZlcnNpb24gPCAoMTAsIDUpOgorICAgICAgICAgICAgICAgIGlmIGlkIGluIFNLSVBfT05fVElHRVI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKG1hdGgsIGZuKQorCisgICAgICAgICAgICBpZiAnaW52YWxpZCcgaW4gZmxhZ3Mgb3IgJ2RpdmlkZS1ieS16ZXJvJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBlciA9ICdWYWx1ZUVycm9yJworICAgICAgICAgICAgZWxpZiAnb3ZlcmZsb3cnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGVyID0gJ092ZXJmbG93RXJyb3InCisKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKGFyKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoKCJVbmV4cGVjdGVkIFZhbHVlRXJyb3I6ICVzXG4gICAgICAgICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHRlc3QgJXM6JXMoJXIpXG4iKSAlIChleGMuYXJnc1swXSwgaWQsIGZuLCBhcikpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKG1lc3NhZ2UpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAnVmFsdWVFcnJvcicKICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoIlVuZXhwZWN0ZWQgT3ZlcmZsb3dFcnJvciBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ICVzOiVzKCVyKVxuIiAlIChpZCwgZm4sIGFyKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwobWVzc2FnZSkKLSAgICAgICAgICAgIHNlbGYuZnRlc3QoIiVzOiVzKCVyKSIgJSAoaWQsIGZuLCBhciksIHJlc3VsdCwgZXIpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ092ZXJmbG93RXJyb3InCisKKyAgICAgICAgICAgICMgRGVmYXVsdCB0b2xlcmFuY2VzCisgICAgICAgICAgICB1bHBfdG9sLCBhYnNfdG9sID0gNSwgMC4wCisKKyAgICAgICAgICAgIGZhaWx1cmUgPSByZXN1bHRfY2hlY2soZXIsIHJlc3VsdCwgdWxwX3RvbCwgYWJzX3RvbCkKKyAgICAgICAgICAgIGlmIGZhaWx1cmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBtc2cgPSBmYWlsX2ZtdC5mb3JtYXQoaWQsIGZuLCBhciwgZmFpbHVyZSkKKyAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChtc2cpCisKKyAgICAgICAgaWYgZmFpbHVyZXM6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0ZhaWx1cmVzIGluIHRlc3RfdGVzdGZpbGU6XG4gICcgKworICAgICAgICAgICAgICAgICAgICAgICdcbiAgJy5qb2luKGZhaWx1cmVzKSkKIAogICAgIEByZXF1aXJlc19JRUVFXzc1NAogICAgIGRlZiB0ZXN0X210ZXN0ZmlsZShzZWxmKToKLSAgICAgICAgZmFpbF9mbXQgPSAie306e30oeyFyfSk6IGV4cGVjdGVkIHshcn0sIGdvdCB7IXJ9IgorICAgICAgICBmYWlsX2ZtdCA9ICJ7fToge30oeyFyfSk6IHt9IgogCiAgICAgICAgIGZhaWx1cmVzID0gW10KICAgICAgICAgZm9yIGlkLCBmbiwgYXJnLCBleHBlY3RlZCwgZmxhZ3MgaW4gcGFyc2VfbXRlc3RmaWxlKG1hdGhfdGVzdGNhc2VzKToKQEAgLTExMjUsNDEgKzEyMzksNDggQEAKICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAgICAgIGdvdCA9ICdPdmVyZmxvd0Vycm9yJwogCi0gICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gTm9uZQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShnb3QsIGZsb2F0KSBhbmQgaXNpbnN0YW5jZShleHBlY3RlZCwgZmxvYXQpOgotICAgICAgICAgICAgICAgIGlmIG1hdGguaXNuYW4oZXhwZWN0ZWQpIGFuZCBtYXRoLmlzbmFuKGdvdCk6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgbm90IG1hdGguaXNuYW4oZXhwZWN0ZWQpIGFuZCBub3QgbWF0aC5pc25hbihnb3QpOgotICAgICAgICAgICAgICAgICAgICBpZiBmbiA9PSAnbGdhbW1hJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgdXNlIGEgd2Vha2VyIGFjY3VyYWN5IHRlc3QgZm9yIGxnYW1tYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICMgbGdhbW1hIG9ubHkgYWNoaWV2ZXMgYW4gYWJzb2x1dGUgZXJyb3Igb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICMgYSBmZXcgbXVsdGlwbGVzIG9mIHRoZSBtYWNoaW5lIGFjY3VyYWN5LCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmFsLgotICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lfZmFpbHVyZSA9IGFjY19jaGVjayhleHBlY3RlZCwgZ290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfZXJyID0gNWUtMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19lcnIgPSA1ZS0xNSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBmbiA9PSAnZXJmYyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIGVyZmMgaGFzIGxlc3MtdGhhbi1pZGVhbCBhY2N1cmFjeSBmb3IgbGFyZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzICh4IH4gMjUgb3Igc28pLCBtYWlubHkgZHVlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciBpbnZvbHZlZCBpbiBjb21wdXRpbmcgZXhwKC14KngpLgotICAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggV291bGQgYmUgYmV0dGVyIHRvIHdlYWtlbiB0aGlzIHRlc3Qgb25seQotICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgbGFyZ2UgeCwgaW5zdGVhZCBvZiBmb3IgYWxsIHguCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gdWxwc19jaGVjayhleHBlY3RlZCwgZ290LCAyMDAwKQorICAgICAgICAgICAgIyBEZWZhdWx0IHRvbGVyYW5jZXMKKyAgICAgICAgICAgIHVscF90b2wsIGFic190b2wgPSA1LCAwLjAKIAotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lfZmFpbHVyZSA9IHVscHNfY2hlY2soZXhwZWN0ZWQsIGdvdCwgMjApCi0gICAgICAgICAgICAgICAgICAgIGlmIGFjY3VyYWN5X2ZhaWx1cmUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIEV4Y2VwdGlvbnMgdG8gdGhlIGRlZmF1bHRzCisgICAgICAgICAgICBpZiBmbiA9PSAnZ2FtbWEnOgorICAgICAgICAgICAgICAgICMgRXhwZXJpbWVudGFsIHJlc3VsdHMgb24gb25lIHBsYXRmb3JtIGdhdmUKKyAgICAgICAgICAgICAgICAjIGFuIGFjY3VyYWN5IG9mIDw9IDEwIHVscHMgYWNyb3NzIHRoZSBlbnRpcmUgZmxvYXQKKyAgICAgICAgICAgICAgICAjIGRvbWFpbi4gV2Ugd2Vha2VuIHRoYXQgdG8gcmVxdWlyZSAyMCB1bHAgYWNjdXJhY3kuCisgICAgICAgICAgICAgICAgdWxwX3RvbCA9IDIwCiAKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZ290LCBzdHIpIGFuZCBpc2luc3RhbmNlKGV4cGVjdGVkLCBzdHIpOgotICAgICAgICAgICAgICAgIGlmIGdvdCA9PSBleHBlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgZm4gPT0gJ2xnYW1tYSc6CisgICAgICAgICAgICAgICAgIyB3ZSB1c2UgYSB3ZWFrZXIgYWNjdXJhY3kgdGVzdCBmb3IgbGdhbW1hOworICAgICAgICAgICAgICAgICMgbGdhbW1hIG9ubHkgYWNoaWV2ZXMgYW4gYWJzb2x1dGUgZXJyb3Igb2YKKyAgICAgICAgICAgICAgICAjIGEgZmV3IG11bHRpcGxlcyBvZiB0aGUgbWFjaGluZSBhY2N1cmFjeSwgaW4KKyAgICAgICAgICAgICAgICAjIGdlbmVyYWwuCisgICAgICAgICAgICAgICAgYWJzX3RvbCA9IDFlLTE1CiAKLSAgICAgICAgICAgIGZhaWxfbXNnID0gZmFpbF9mbXQuZm9ybWF0KGlkLCBmbiwgYXJnLCBleHBlY3RlZCwgZ290KQotICAgICAgICAgICAgaWYgYWNjdXJhY3lfZmFpbHVyZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBmYWlsX21zZyArPSAnICh7fSknLmZvcm1hdChhY2N1cmFjeV9mYWlsdXJlKQotICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKGZhaWxfbXNnKQorICAgICAgICAgICAgZWxpZiBmbiA9PSAnZXJmYycgYW5kIGFyZyA+PSAwLjA6CisgICAgICAgICAgICAgICAgIyBlcmZjIGhhcyBsZXNzLXRoYW4taWRlYWwgYWNjdXJhY3kgZm9yIGxhcmdlCisgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgKHggfiAyNSBvciBzbyksIG1haW5seSBkdWUgdG8gdGhlCisgICAgICAgICAgICAgICAgIyBlcnJvciBpbnZvbHZlZCBpbiBjb21wdXRpbmcgZXhwKC14KngpLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIE9ic2VydmVkIGJldHdlZW4gQ1B5dGhvbiBhbmQgbXBtYXRoIGF0IDI1IGRwOgorICAgICAgICAgICAgICAgICMgICAgICAgeCA8ICAwIDogZXJyIDw9IDIgdWxwCisgICAgICAgICAgICAgICAgIyAgMCA8PSB4IDwgIDEgOiBlcnIgPD0gMTAgdWxwCisgICAgICAgICAgICAgICAgIyAgMSA8PSB4IDwgMTAgOiBlcnIgPD0gMTAwIHVscAorICAgICAgICAgICAgICAgICMgMTAgPD0geCA8IDIwIDogZXJyIDw9IDMwMCB1bHAKKyAgICAgICAgICAgICAgICAjIDIwIDw9IHggICAgICA6IDwgNjAwIHVscAorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICBpZiBhcmcgPCAxLjA6CisgICAgICAgICAgICAgICAgICAgIHVscF90b2wgPSAxMAorICAgICAgICAgICAgICAgIGVsaWYgYXJnIDwgMTAuMDoKKyAgICAgICAgICAgICAgICAgICAgdWxwX3RvbCA9IDEwMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHVscF90b2wgPSAxMDAwCisKKyAgICAgICAgICAgIGZhaWx1cmUgPSByZXN1bHRfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwX3RvbCwgYWJzX3RvbCkKKyAgICAgICAgICAgIGlmIGZhaWx1cmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBtc2cgPSBmYWlsX2ZtdC5mb3JtYXQoaWQsIGZuLCBhcmcsIGZhaWx1cmUpCisgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQobXNnKQogCiAgICAgICAgIGlmIGZhaWx1cmVzOgogICAgICAgICAgICAgc2VsZi5mYWlsKCdGYWlsdXJlcyBpbiB0ZXN0X210ZXN0ZmlsZTpcbiAgJyArCkBAIC0xMjcyLDcgKzEzOTMsOCBAQAogCiAgICAgICAgIGRlY2ltYWxfZXhhbXBsZXMgPSBbKERlY2ltYWwoJzEuMDAwMDAwMDEnKSwgRGVjaW1hbCgnMS4wJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWNpbWFsKCcxLjAwMDAwMDAxZS0yMCcpLCBEZWNpbWFsKCcxLjBlLTIwJykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWNpbWFsKCcxLjAwMDAwMDAxZS0xMDAnKSwgRGVjaW1hbCgnMS4wZS0xMDAnKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlY2ltYWwoJzEuMDAwMDAwMDFlLTEwMCcpLCBEZWNpbWFsKCcxLjBlLTEwMCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVjaW1hbCgnMS4wMDAwMDAwMWUyMCcpLCBEZWNpbWFsKCcxLjBlMjAnKSldCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxsQ2xvc2UoZGVjaW1hbF9leGFtcGxlcywgcmVsX3RvbD0xZS04KQogICAgICAgICBzZWxmLmFzc2VydEFsbE5vdENsb3NlKGRlY2ltYWxfZXhhbXBsZXMsIHJlbF90b2w9MWUtOSkKIApAQCAtMTI4MCw4ICsxNDAyLDEwIEBACiAgICAgICAgICMgdGVzdCB3aXRoIEZyYWN0aW9uIHZhbHVlcwogICAgICAgICBmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24KIAotICAgICAgICAjIGNvdWxkIHVzZSBzb21lIG1vcmUgZXhhbXBsZXMgaGVyZSEKLSAgICAgICAgZnJhY3Rpb25fZXhhbXBsZXMgPSBbKEZyYWN0aW9uKDEsIDEwMDAwMDAwMCkgKyAxLCBGcmFjdGlvbigxKSldCisgICAgICAgIGZyYWN0aW9uX2V4YW1wbGVzID0gWworICAgICAgICAgICAgKEZyYWN0aW9uKDEsIDEwMDAwMDAwMCkgKyAxLCBGcmFjdGlvbigxKSksCisgICAgICAgICAgICAoRnJhY3Rpb24oMTAwMDAwMDAxKSwgRnJhY3Rpb24oMTAwMDAwMDAwKSksCisgICAgICAgICAgICAoRnJhY3Rpb24oMTAqKjggKyAxLCAxMCoqMjgpLCBGcmFjdGlvbigxLCAxMCoqMjApKV0KICAgICAgICAgc2VsZi5hc3NlcnRBbGxDbG9zZShmcmFjdGlvbl9leGFtcGxlcywgcmVsX3RvbD0xZS04KQogICAgICAgICBzZWxmLmFzc2VydEFsbE5vdENsb3NlKGZyYWN0aW9uX2V4YW1wbGVzLCByZWxfdG9sPTFlLTkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWV0YWNsYXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9tZXRhY2xhc3MucHkKaW5kZXggZTZmZTIwYS4uNGRiNzkyZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tZXRhY2xhc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tZXRhY2xhc3MucHkKQEAgLTE4MCw3ICsxODAsNyBAQAogICAgIG1ldGE6IEMgKCkKICAgICBuczogWygnX19tb2R1bGVfXycsICd0ZXN0LnRlc3RfbWV0YWNsYXNzJyksICgnX19xdWFsbmFtZV9fJywgJ0MnKSwgKCdhJywgNDIpLCAoJ2InLCAyNCldCiAgICAga3c6IFtdCi0gICAgPj4+IHR5cGUoQykgaXMgZGljdAorICAgID4+PiB0eXBlKEMpIGlzIHR5cGVzLl9EZWZhdWx0Q2xhc3NOYW1lc3BhY2VUeXBlCiAgICAgVHJ1ZQogICAgID4+PiBwcmludChzb3J0ZWQoQy5pdGVtcygpKSkKICAgICBbKCdfX21vZHVsZV9fJywgJ3Rlc3QudGVzdF9tZXRhY2xhc3MnKSwgKCdfX3F1YWxuYW1lX18nLCAnQycpLCAoJ2EnLCA0MiksICgnYicsIDI0KV0KQEAgLTIxMSw4ICsyMTEsMTEgQEAKIAogVGhlIGRlZmF1bHQgbWV0YWNsYXNzIG11c3QgZGVmaW5lIGEgX19wcmVwYXJlX18oKSBtZXRob2QuCiAKLSAgICA+Pj4gdHlwZS5fX3ByZXBhcmVfXygpCi0gICAge30KKyAgICA+Pj4gbnMgPSB0eXBlLl9fcHJlcGFyZV9fKCkKKyAgICA+Pj4gdHlwZShucykgaXMgdHlwZXMuX0RlZmF1bHRDbGFzc05hbWVzcGFjZVR5cGUKKyAgICBUcnVlCisgICAgPj4+IGxpc3QobnMpID09IFtdCisgICAgVHJ1ZQogICAgID4+PgogCiBNYWtlIHN1cmUgaXQgd29ya3Mgd2l0aCBzdWJjbGFzc2luZy4KQEAgLTI0OCw3ICsyNTEsOSBAQAogCiAiIiIKIAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcwogCiAjIFRyYWNlIGZ1bmN0aW9uIGludHJvZHVjZXMgX19sb2NhbHNfXyB3aGljaCBjYXVzZXMgdmFyaW91cyB0ZXN0cyB0byBmYWlsLgogaWYgaGFzYXR0cihzeXMsICdnZXR0cmFjZScpIGFuZCBzeXMuZ2V0dHJhY2UoKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKaW5kZXggNjg1NjU5My4uNGUyYzkwOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKQEAgLTEwMSw1ICsxMDEsMTEgQEAKICAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJpbWFnZS5qcGciKSwgKCJpbWFnZS9qcGVnIiwgTm9uZSkpCiAgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiaW1hZ2UucG5nIiksICgiaW1hZ2UvcG5nIiwgTm9uZSkpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG1pbWV0eXBlcykKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5IGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CmluZGV4IGIzNjVkODQuLmJiYjQwNzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKQEAgLTcxMyw2ICs3MTMsMTQgQEAKICAgICAgICAgZ2NfY29sbGVjdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMod3IoKSwgTm9uZSkKIAorICAgIGRlZiB0ZXN0X3dyaXRlX3JldHVybmluZ190aGVfbnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4oc2VsZik6CisgICAgICAgIG1tID0gbW1hcC5tbWFwKC0xLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiIiIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIieCIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIieXoiKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiInB5dGhvbiIpLCA2KQorCisKIGNsYXNzIExhcmdlTW1hcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXNpbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKaW5kZXggOGVmMzM0Zi4uZjY1NmY3MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKQEAgLTEsNiArMSw1IEBACiAiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gbXNpbGliICIiIgogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgb3MKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBpbXBvcnRfbW9kdWxlCiBtc2lsaWIgPSBpbXBvcnRfbW9kdWxlKCdtc2lsaWInKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCA4ZDdhMjEzLi4wMWExY2QzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTUsNyArNSw3IEBACiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTgotaW1wb3J0IHVuaXR0ZXN0LCBpbywgY29kZWNzLCBzeXMsIG9zCitpbXBvcnQgdW5pdHRlc3QsIGlvLCBjb2RlY3MsIHN5cwogaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYwogCiBBTExfQ0pLRU5DT0RJTkdTID0gWwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcucHkKaW5kZXggNTIyNzNlYS4uMmUxNWNkOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19tYWluX2hhbmRsaW5nLnB5CkBAIC02LDcgKzYsNiBAQAogCiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQotaW1wb3J0IHppcGltcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKQEAgLTE1LDcgKzE0LDcgQEAKIAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgKAogICAgIG1ha2VfcGtnLCBtYWtlX3NjcmlwdCwgbWFrZV96aXBfcGtnLCBtYWtlX3ppcF9zY3JpcHQsCi0gICAgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlLCBzcGF3bl9weXRob24sIGtpbGxfcHl0aG9uKQorICAgIGFzc2VydF9weXRob25fb2spCiAKICMgTG9vayB1cCB3aGljaCBzdGFydCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGVzdAogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9uaXMucHkgYi9MaWIvdGVzdC90ZXN0X25pcy5weQppbmRleCAzODdhNGU3Li4yMTA3NGM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25pcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X25pcy5weQpAQCAtMSw2ICsxLDUgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiAKICMgU2tpcCB0ZXN0IGlmIG5pcyBtb2R1bGUgZG9lcyBub3QgZXhpc3QuCiBuaXMgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoJ25pcycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKaW5kZXggMzBmYTYxMi4uNWI1OTBlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQpAQCAtMyw3ICszLDYgQEAKIAogZnJvbSBodHRwLmNsaWVudCBpbXBvcnQgSFRUUEV4Y2VwdGlvbgogaW1wb3J0IHN5cwotaW1wb3J0IG9zCiBmcm9tIHVuaWNvZGVkYXRhIGltcG9ydCBub3JtYWxpemUsIHVuaWRhdGFfdmVyc2lvbgogCiBURVNUREFUQUZJTEUgPSAiTm9ybWFsaXphdGlvblRlc3QudHh0IgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9udHBhdGgucHkgYi9MaWIvdGVzdC90ZXN0X250cGF0aC5weQppbmRleCA1ODBmMjAzLi45MGVkYjZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X250cGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X250cGF0aC5weQpAQCAtNDUyLDUgKzQ1Miw4OCBAQAogICAgIGF0dHJpYnV0ZXMgPSBbJ3JlbHBhdGgnLCAnc3BsaXR1bmMnXQogCiAKK2NsYXNzIFBhdGhMaWtlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgcGF0aCA9IG50cGF0aAorCisgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPScnKToKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGF0aCwgQmFzZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX25hbWUgPSBzdXBwb3J0LlRFU1RGTi5sb3dlcigpCisgICAgICAgIHNlbGYuZmlsZV9wYXRoID0gc2VsZi5QYXRoTGlrZShzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZV9uYW1lLCAneGInLCAwKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZShiInRlc3RfbnRwYXRoLlBhdGhMaWtlVGVzdHMiKQorCisgICAgZGVmIGFzc2VydFBhdGhFcXVhbChzZWxmLCBmdW5jKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHNlbGYuZmlsZV9wYXRoKSwgZnVuYyhzZWxmLmZpbGVfbmFtZSkpCisKKyAgICBkZWYgdGVzdF9wYXRoX25vcm1jYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgubm9ybWNhc2UpCisKKyAgICBkZWYgdGVzdF9wYXRoX2lzYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguaXNhYnMpCisKKyAgICBkZWYgdGVzdF9wYXRoX2pvaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRoLmpvaW4oJ2EnLCBzZWxmLlBhdGhMaWtlKCdiJyksICdjJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoLmpvaW4oJ2EnLCAnYicsICdjJykpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguc3BsaXQpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguc3BsaXRleHQpCisKKyAgICBkZWYgdGVzdF9wYXRoX3NwbGl0ZHJpdmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5zcGxpdGRyaXZlKQorCisgICAgZGVmIHRlc3RfcGF0aF9iYXNlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmJhc2VuYW1lKQorCisgICAgZGVmIHRlc3RfcGF0aF9kaXJuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguZGlybmFtZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNsaW5rKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguaXNsaW5rKQorCisgICAgZGVmIHRlc3RfcGF0aF9sZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgubGV4aXN0cykKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNtb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmlzbW91bnQpCisKKyAgICBkZWYgdGVzdF9wYXRoX2V4cGFuZHVzZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5leHBhbmR1c2VyKQorCisgICAgZGVmIHRlc3RfcGF0aF9leHBhbmR2YXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguZXhwYW5kdmFycykKKworICAgIGRlZiB0ZXN0X3BhdGhfbm9ybXBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5ub3JtcGF0aCkKKworICAgIGRlZiB0ZXN0X3BhdGhfYWJzcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmFic3BhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX3JlYWxwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgucmVhbHBhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX3JlbHBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5yZWxwYXRoKQorCisgICAgZGVmIHRlc3RfcGF0aF9jb21tb25wYXRoKHNlbGYpOgorICAgICAgICBjb21tb25fcGF0aCA9IHNlbGYucGF0aC5jb21tb25wYXRoKFtzZWxmLmZpbGVfcGF0aCwgc2VsZi5maWxlX25hbWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1vbl9wYXRoLCBzZWxmLmZpbGVfbmFtZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfaXNkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5pc2RpcikKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weSBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKaW5kZXggYjViYTk3Ni4uNjI1NDA5MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CkBAIC0xMjAsNjMgKzEyMCw2MyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFkZCgzLCA0KSA9PSA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmFkZCgzLCA0KSwgNykKIAogICAgIGRlZiB0ZXN0X2JpdHdpc2VfYW5kKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYW5kXygweGYsIDB4YSkgPT0gMHhhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpLCAweGEpCiAKICAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJykgPT0gJ3B5dGhvbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pID09IFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXExKFs1LCA2XSksIFNlcTEoWzddKSkgPT0gWzUsIDYsIDddKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSA9PSBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJyksICdweXRob24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSksIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpLCBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSwgWzUsIDYsIDddKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgMTMsIDI5KQogCiAgICAgZGVmIHRlc3RfY291bnRPZihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDUpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSwgMCkKIAogICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgYSA9IFs0LCAzLCAyLCAxXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsaXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbGl0ZW0oYSwgMSkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gWzQsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFs0LCAyLCAxXSkKIAogICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5mbG9vcmRpdig1LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmZsb29yZGl2KDUsIDIpLCAyKQogCiAgICAgZGVmIHRlc3RfdHJ1ZWRpdihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1ZWRpdiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnRydWVkaXYoNSwgMikgPT0gMi41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnRydWVkaXYoNSwgMiksIDIuNSkKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgYSA9IHJhbmdlKDEwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdldGl0ZW0oYSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5nZXRpdGVtKGEsIDIpLCAyKQogCiAgICAgZGVmIHRlc3RfaW5kZXhPZihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmluZGV4T2YoWzQsIDMsIDIsIDFdLCAzKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmluZGV4T2YoWzQsIDMsIDIsIDFdLCAzKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZiwgWzQsIDMsIDIsIDFdLCAwKQogCiAgICAgZGVmIHRlc3RfaW52ZXJ0KHNlbGYpOgpAQCAtMTg5LDIxICsxODksMjEgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIE5vbmUsIDQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDEpID09IDEwKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubHNoaWZ0KDUsIDEpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5sc2hpZnQoNSwgMCksIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgMiwgLTEpCiAKICAgICBkZWYgdGVzdF9tb2Qoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kLCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm1vZCg1LCAyKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm1vZCg1LCAyKSwgMSkKIAogICAgIGRlZiB0ZXN0X211bChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tdWwoNSwgMikgPT0gMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubXVsKDUsIDIpLCAxMCkKIAogICAgIGRlZiB0ZXN0X21hdG11bChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSA9PSAweGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSwgMHhmKQogCiAgICAgZGVmIHRlc3RfcG9zKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yNTAsOCArMjUwLDggQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIE5vbmUsIDQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDEpID09IDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMCkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5yc2hpZnQoNSwgMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IucnNoaWZ0KDUsIDApLCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIDIsIC0xKQogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CkBAIC0yNjYsMTUgKzI2NiwxNSBAQAogICAgICAgICBhID0gbGlzdChyYW5nZSgzKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXRpdGVtKGEsIDAsIDIpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFsyLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMiwgMSwgMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIDQsIDIpCiAKICAgICBkZWYgdGVzdF9zdWIoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc3ViKDUsIDIpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3Iuc3ViKDUsIDIpLCAzKQogCiAgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTI5Miw3ICsyOTIsNyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IueG9yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvciwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnhvcigweGIsIDB4YykgPT0gMHg3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnhvcigweGIsIDB4YyksIDB4NykKIAogICAgIGRlZiB0ZXN0X2lzKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQppbmRleCA3NjIxYzI0Li45MWEwMzE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKQEAgLTE2LDYgKzE2LDcgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKK2ltcG9ydCBvcHRwYXJzZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRpb24sIE9wdGlvbiwgXAogICAgICBUaXRsZWRIZWxwRm9ybWF0dGVyLCBPcHRpb25QYXJzZXIsIE9wdGlvbkdyb3VwLCBcCiAgICAgIFNVUFBSRVNTX1VTQUdFLCBPcHRpb25FcnJvciwgT3B0aW9uQ29uZmxpY3RFcnJvciwgXApAQCAtMTY1MCw2ICsxNjUxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLWw6IGludmFsaWQgaW50ZWdlciB2YWx1ZTogJzB4MTJ4JyIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnY2hlY2tfYnVpbHRpbicsICdBbWJpZ3VvdXNPcHRpb25FcnJvcicsICdOT19ERUZBVUxUJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgb3B0cGFyc2UsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CmluZGV4IDkwMWQ0YjIuLjZmYmMxYjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CkBAIC0yOTgsOSArMjk4LDExIEBACiAgICAgICAgICMgZG8gbm90IHNhdmUgaW5zdGFuY2UgZGljdGlvbmFyeSBpZiBub3QgbmVlZGVkCiAgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvZC5fX2RpY3RfXywgZGljdCkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob2QuX19yZWR1Y2VfXygpWzJdKQogICAgICAgICBvZC54ID0gMTAKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUob2QuX19yZWR1Y2VfXygpWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLl9fZGljdF9fWyd4J10sIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLl9fcmVkdWNlX18oKVsyXSwgeyd4JzogMTB9KQogCiAgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKICAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CkBAIC00MDMsNiArNDA1LDE0IEBACiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QoKipkKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc3lzLmdldHNpemVvZihvZCksIHN5cy5nZXRzaXplb2YoZCkpCiAKKyAgICBkZWYgdGVzdF92aWV3cyhzZWxmKToKKyAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CisgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDI4NgorICAgICAgICBzID0gJ3RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgYSBsYXp5IGRvZyB5ZXN0ZXJkYXkgYmVmb3JlIGRhd24nLnNwbGl0KCkKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdC5mcm9ta2V5cyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLmtleXMoKSwgZGljdChvZCkua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLml0ZW1zKCksIGRpY3Qob2QpLml0ZW1zKCkpCisKICAgICBkZWYgdGVzdF9vdmVycmlkZV91cGRhdGUoc2VsZik6CiAgICAgICAgIE9yZGVyZWREaWN0ID0gc2VsZi5PcmRlcmVkRGljdAogICAgICAgICAjIFZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHVwZGF0ZSgpIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggODc0ZjllNC4uNTIwNTY3MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC0xNSw3ICsxNSw2IEBACiBpbXBvcnQgbW1hcAogaW1wb3J0IG9zCiBpbXBvcnQgcGlja2xlCi1pbXBvcnQgcGxhdGZvcm0KIGltcG9ydCByZQogaW1wb3J0IHNodXRpbAogaW1wb3J0IHNpZ25hbApAQCAtNjUsNiArNjQsOCBAQAogICAgIElOVF9NQVggPSBQWV9TU0laRV9UX01BWCA9IHN5cy5tYXhzaXplCiAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB1bml4X3NoZWxsCisKIAogcm9vdF9pbl9wb3NpeCA9IEZhbHNlCiBpZiBoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpOgpAQCAtODIsNiArODMsNDMgQEAKICMgSXNzdWUgIzE0MTEwOiBTb21lIHRlc3RzIGZhaWwgb24gRnJlZUJTRCBpZiB0aGUgdXNlciBpcyBpbiB0aGUgd2hlZWwgZ3JvdXAuCiBIQVZFX1dIRUVMX0dST1VQID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSBhbmQgb3MuZ2V0Z2lkKCkgPT0gMAogCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKG1zZ19yZWdleCwgcXVpZXQ9RmFsc2UpOgorICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygobXNnX3JlZ2V4LCBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1xdWlldCk6CisgICAgICAgIHlpZWxkCisKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBieXRlc19maWxlbmFtZV93YXJuKGV4cGVjdGVkKToKKyAgICBtc2cgPSAnVGhlIFdpbmRvd3MgYnl0ZXMgQVBJIGhhcyBiZWVuIGRlcHJlY2F0ZWQnCisgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncyhtc2csIHF1aWV0PW5vdCBleHBlY3RlZCk6CisgICAgICAgICAgICB5aWVsZAorICAgIGVsc2U6CisgICAgICAgIHlpZWxkCisKKworY2xhc3MgX1BhdGhMaWtlKG9zLlBhdGhMaWtlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPSIiKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5wYXRoKQorCisgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXRoLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYucGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisKK2RlZiBjcmVhdGVfZmlsZShmaWxlbmFtZSwgY29udGVudD1iJ2NvbnRlbnQnKToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ4YiIsIDApIGFzIGZwOgorICAgICAgICBmcC53cml0ZShjb250ZW50KQorCisKICMgVGVzdHMgY3JlYXRpbmcgVEVTVEZOCiBjbGFzcyBGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE0MCw5ICsxNzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBJTlRfTUFYIDwgUFlfU1NJWkVfVF9NQVgiKQogICAgIEBzdXBwb3J0LmJpZ21lbXRlc3Qoc2l6ZT1JTlRfTUFYICsgMTAsIG1lbXVzZT0xLCBkcnlfcnVuPUZhbHNlKQogICAgIGRlZiB0ZXN0X2xhcmdlX3JlYWQoc2VsZiwgc2l6ZSk6Ci0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShiJ3Rlc3QnKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYid0ZXN0JykKIAogICAgICAgICAjIElzc3VlICMyMTkzMjogTWFrZSBzdXJlIHRoYXQgb3MucmVhZCgpIGRvZXMgbm90IHJhaXNlIGFuCiAgICAgICAgICMgT3ZlcmZsb3dFcnJvciBmb3Igc2l6ZSBsYXJnZXIgdGhhbiBJTlRfTUFYCkBAIC0xOTksMTEgKzIzNiwxMiBAQAogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgVEVTVEZOMiA9IHN1cHBvcnQuVEVTVEZOICsgIi4yIgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICd3JykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoIjEiKQotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgiMiIpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIFRFU1RGTjIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgVEVTVEZOMikKKworICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYiIxIikKKyAgICAgICAgY3JlYXRlX2ZpbGUoVEVTVEZOMiwgYiIyIikKKwogICAgICAgICBvcy5yZXBsYWNlKHN1cHBvcnQuVEVTVEZOLCBURVNURk4yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhGaWxlTm90Rm91bmRFcnJvciwgb3Muc3RhdCwgc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAncicpIGFzIGY6CkBAIC0yMjYsMTUgKzI2NCw5IEBACiAjIFRlc3QgYXR0cmlidXRlcyBvbiByZXR1cm4gdmFsdWVzIGZyb20gb3MuKnN0YXQqIGZhbWlseS4KIGNsYXNzIFN0YXRBdHRyaWJ1dGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBvcy5ta2RpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5mbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlRFU1RGTiwgImYxIikKLSAgICAgICAgZiA9IG9wZW4oc2VsZi5mbmFtZSwgJ3diJykKLSAgICAgICAgZi53cml0ZShiIkFCQyIpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBvcy51bmxpbmsoc2VsZi5mbmFtZSkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuZm5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZm5hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZm5hbWUsIGIiQUJDIikKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzdGF0JyksICd0ZXN0IG5lZWRzIG9zLnN0YXQoKScpCiAgICAgZGVmIGNoZWNrX3N0YXRfYXR0cmlidXRlcyhzZWxmLCBmbmFtZSk6CkBAIC0zMTAsOCArMzQyLDcgQEAKICAgICAgICAgICAgIGZuYW1lID0gc2VsZi5mbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IGVuY29kZSAlYSBmb3IgdGhlIGZpbGVzeXN0ZW0iICUgc2VsZi5mbmFtZSkKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKGZuYW1lKQogCiAgICAgZGVmIHRlc3Rfc3RhdF9yZXN1bHRfcGlja2xlKHNlbGYpOgpAQCAtNDI2LDcgKzQ1NywxMSBAQAogICAgICAgICAgICAgMCkKIAogICAgICAgICAjIHRlc3QgZGlyZWN0b3J5IHN0X2ZpbGVfYXR0cmlidXRlcyAoRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZIHNldCkKLSAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZGlybmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgImRpciIKKyAgICAgICAgb3MubWtkaXIoZGlybmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJtZGlyLCBkaXJuYW1lKQorCisgICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoZGlybmFtZSkKICAgICAgICAgc2VsZi5jaGVja19maWxlX2F0dHJpYnV0ZXMocmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgcmVzdWx0LnN0X2ZpbGVfYXR0cmlidXRlcyAmIHN0YXQuRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZLApAQCAtNDQwLDE5ICs0NzUsMTQgQEAKIAogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYuZGlybmFtZSkKICAgICAgICAgb3MubWtkaXIoc2VsZi5kaXJuYW1lKQotICAgICAgICB3aXRoIG9wZW4oc2VsZi5mbmFtZSwgJ3diJykgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShiIkFCQyIpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZm5hbWUpCiAKICAgICAgICAgZGVmIHJlc3RvcmVfZmxvYXRfdGltZXMoc3RhdGUpOgotICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncygnc3RhdF9mbG9hdF90aW1lcycpOgogICAgICAgICAgICAgICAgIG9zLnN0YXRfZmxvYXRfdGltZXMoc3RhdGUpCiAKICAgICAgICAgIyBlbnN1cmUgdGhhdCBzdF9hdGltZSBhbmQgc3RfbXRpbWUgYXJlIGZsb2F0Ci0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgIHdpdGggaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKCdzdGF0X2Zsb2F0X3RpbWVzJyk6CiAgICAgICAgICAgICBvbGRfZmxvYXRfdGltZXMgPSBvcy5zdGF0X2Zsb2F0X3RpbWVzKC0xKQogICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfZmxvYXRfdGltZXMsIG9sZF9mbG9hdF90aW1lcykKIApAQCAtNTQ0LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIHN1cHBvcnQgZm9yIHV0aW1lIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuIikKICAgICBkZWYgdGVzdF91dGltZV9mZChzZWxmKToKICAgICAgICAgZGVmIHNldF90aW1lKGZpbGVuYW1lLCBucyk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICAjIHVzZSBhIGZpbGUgZGVzY3JpcHRvciB0byB0ZXN0IGZ1dGltZW5zKHRpbWVzcGVjKQogICAgICAgICAgICAgICAgICMgb3IgZnV0aW1lcyh0aW1ldmFsKQogICAgICAgICAgICAgICAgIG9zLnV0aW1lKGZwLmZpbGVubygpLCBucz1ucykKQEAgLTY1NiwxOCArNjg2LDIwIEBACiAgICAgICAgIHJldHVybiBvcy5lbnZpcm9uCiAKICAgICAjIEJ1ZyAxMTEwNDc4Ci0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5leGlzdHMoJy9iaW4vc2gnKSwgJ3JlcXVpcmVzIC9iaW4vc2gnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHVuaXhfc2hlbGwgYW5kIG9zLnBhdGguZXhpc3RzKHVuaXhfc2hlbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBhIHNoZWxsJykKICAgICBkZWYgdGVzdF91cGRhdGUyKHNlbGYpOgogICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKICAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoSEVMTE89IldvcmxkIikKLSAgICAgICAgd2l0aCBvcy5wb3BlbigiL2Jpbi9zaCAtYyAnZWNobyAkSEVMTE8nIikgYXMgcG9wZW46CisgICAgICAgIHdpdGggb3MucG9wZW4oIiVzIC1jICdlY2hvICRIRUxMTyciICUgdW5peF9zaGVsbCkgYXMgcG9wZW46CiAgICAgICAgICAgICB2YWx1ZSA9IHBvcGVuLnJlYWQoKS5zdHJpcCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAiV29ybGQiKQogCi0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5leGlzdHMoJy9iaW4vc2gnKSwgJ3JlcXVpcmVzIC9iaW4vc2gnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHVuaXhfc2hlbGwgYW5kIG9zLnBhdGguZXhpc3RzKHVuaXhfc2hlbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBhIHNoZWxsJykKICAgICBkZWYgdGVzdF9vc19wb3Blbl9pdGVyKHNlbGYpOgotICAgICAgICB3aXRoIG9zLnBvcGVuKAotICAgICAgICAgICAgIi9iaW4vc2ggLWMgJ2VjaG8gXCJsaW5lMVxubGluZTJcbmxpbmUzXCInIikgYXMgcG9wZW46CisgICAgICAgIHdpdGggb3MucG9wZW4oIiVzIC1jICdlY2hvIFwibGluZTFcbmxpbmUyXG5saW5lM1wiJyIKKyAgICAgICAgICAgICAgICAgICAgICAlIHVuaXhfc2hlbGwpIGFzIHBvcGVuOgogICAgICAgICAgICAgaXQgPSBpdGVyKHBvcGVuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgImxpbmUxXG4iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgImxpbmUyXG4iKQpAQCAtNzk4LDYgKzgzMCw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIGpvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzdXBwb3J0LlRFU1RGTikKIAogICAgICAgICAjIEJ1aWxkOgogICAgICAgICAjICAgICBURVNURk4vCkBAIC04MzAsOSArODYzLDggQEAKICAgICAgICAgb3MubWFrZWRpcnModDJfcGF0aCkKIAogICAgICAgICBmb3IgcGF0aCBpbiB0bXAxX3BhdGgsIHRtcDJfcGF0aCwgdG1wM19wYXRoLCB0bXA0X3BhdGg6Ci0gICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCi0gICAgICAgICAgICBmLndyaXRlKCJJJ20gIiArIHBhdGggKyAiIGFuZCBwcm91ZCBvZiBpdC4gIEJsYW1lIHRlc3Rfb3MuXG4iKQotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIngiKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIkknbSAiICsgcGF0aCArICIgYW5kIHByb3VkIG9mIGl0LiAgQmxhbWUgdGVzdF9vcy5cbiIpCiAKICAgICAgICAgaWYgc3VwcG9ydC5jYW5fc3ltbGluaygpOgogICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLmFic3BhdGgodDJfcGF0aCksIHNlbGYubGlua19wYXRoKQpAQCAtODU3LDEwICs4ODksMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMiArIGZsaXBwZWRdLCAoc2VsZi5zdWIxMV9wYXRoLCBbXSwgW10pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFszIC0gMiAqIGZsaXBwZWRdLCBzZWxmLnN1YjJfdHJlZSkKIAotICAgIGRlZiB0ZXN0X3dhbGtfcHJ1bmUoc2VsZik6CisgICAgZGVmIHRlc3Rfd2Fsa19wcnVuZShzZWxmLCB3YWxrX3BhdGg9Tm9uZSk6CisgICAgICAgIGlmIHdhbGtfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgd2Fsa19wYXRoID0gc2VsZi53YWxrX3BhdGgKICAgICAgICAgIyBQcnVuZSB0aGUgc2VhcmNoLgogICAgICAgICBhbGwgPSBbXQotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gc2VsZi53YWxrKHNlbGYud2Fsa19wYXRoKToKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIHNlbGYud2Fsayh3YWxrX3BhdGgpOgogICAgICAgICAgICAgYWxsLmFwcGVuZCgocm9vdCwgZGlycywgZmlsZXMpKQogICAgICAgICAgICAgIyBEb24ndCBkZXNjZW5kIGludG8gU1VCMS4KICAgICAgICAgICAgIGlmICdTVUIxJyBpbiBkaXJzOgpAQCAtODY5LDE2ICs5MDMsMTkgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi53YWxrX3BhdGgsIFsiU1VCMiJdLCBbInRtcDEiXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cih3YWxrX3BhdGgpLCBbIlNVQjIiXSwgWyJ0bXAxIl0pKQogCiAgICAgICAgIGFsbFsxXVstMV0uc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzFdLCBzZWxmLnN1YjJfdHJlZSkKIAorICAgIGRlZiB0ZXN0X2ZpbGVfbGlrZV9wYXRoKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd2Fsa19wcnVuZShfUGF0aExpa2Uoc2VsZi53YWxrX3BhdGgpKQorCiAgICAgZGVmIHRlc3Rfd2Fsa19ib3R0b21fdXAoc2VsZik6CiAgICAgICAgICMgV2FsayBib3R0b20tdXAuCiAgICAgICAgIGFsbCA9IGxpc3Qoc2VsZi53YWxrKHNlbGYud2Fsa19wYXRoLCB0b3Bkb3duPUZhbHNlKSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0LCBhbGwpCiAgICAgICAgICMgV2UgY2FuJ3Qga25vdyB3aGljaCBvcmRlciBTVUIxIGFuZCBTVUIyIHdpbGwgYXBwZWFyIGluLgogICAgICAgICAjIE5vdCBmbGlwcGVkOiAgU1VCMTEsIFNVQjEsIFNVQjIsIFRFU1RGTgogICAgICAgICAjICAgICBmbGlwcGVkOiAgU1VCMiwgU1VCMTEsIFNVQjEsIFRFU1RGTgpAQCAtOTA4LDIyICs5NDUsNiBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgZm9sbG93IHN5bWxpbmsgd2l0aCBmb2xsb3dsaW5rcz1UcnVlIikKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgIyBUZWFyIGV2ZXJ5dGhpbmcgZG93bi4gIFRoaXMgaXMgYSBkZWNlbnQgdXNlIGZvciBib3R0b20tdXAgb24KLSAgICAgICAgIyBXaW5kb3dzLCB3aGljaCBkb2Vzbid0IGhhdmUgYSByZWN1cnNpdmUgZGVsZXRlIGNvbW1hbmQuICBUaGUKLSAgICAgICAgIyAobm90IHNvKSBzdWJ0bGV0eSBpcyB0aGF0IHJtZGlyIHdpbGwgZmFpbCB1bmxlc3MgdGhlIGRpcidzCi0gICAgICAgICMga2lkcyBhcmUgcmVtb3ZlZCBmaXJzdCwgc28gYm90dG9tIHVwIGlzIGVzc2VudGlhbC4KLSAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3VwcG9ydC5URVNURk4sIHRvcGRvd249RmFsc2UpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhkaXJuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGlybmFtZSkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0KICAgICBkZWYgdGVzdF93YWxrX2JhZF9kaXIoc2VsZik6CiAgICAgICAgICMgV2FsayB0b3AtZG93bi4KICAgICAgICAgZXJyb3JzID0gW10KQEAgLTEwMDYsMjcgKzEwMjcsMTMgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNsb3NlLCBuZXdmZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdmZCwgbWluZmQpCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICMgY2xlYW51cAotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMsIHJvb3RmZCBpbiBvcy5md2FsayhzdXBwb3J0LlRFU1RGTiwgdG9wZG93bj1GYWxzZSk6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSwgZGlyX2ZkPXJvb3RmZCkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KG5hbWUsIGRpcl9mZD1yb290ZmQsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKLSAgICAgICAgICAgICAgICBpZiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotCiBjbGFzcyBCeXRlc1dhbGtUZXN0cyhXYWxrVGVzdHMpOgogICAgICIiIlRlc3RzIGZvciBvcy53YWxrKCkgd2l0aCBieXRlcy4iIiIKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cGVyKCkuc2V0VXAoKQogICAgICAgICBzZWxmLnN0YWNrID0gY29udGV4dGxpYi5FeGl0U3RhY2soKQogICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6Ci0gICAgICAgICAgICBzZWxmLnN0YWNrLmVudGVyX2NvbnRleHQod2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKSkKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5zdGFjay5lbnRlcl9jb250ZXh0KGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnN0YWNrLmNsb3NlKCkKQEAgLTEyMDMsOCArMTIxMCw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpKQogICAgICAgICBvcy5yZW1vdmVkaXJzKGRpcmIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZGlyYikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhkaXJhKSkKQEAgLTEyMTUsOCArMTIyMSw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpOgogICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhkaXJiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZGlyYikpCkBAIC0xMjI2LDcgKzEyMzEsNyBAQAogCiBjbGFzcyBEZXZOdWxsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Rldm51bGwoc2VsZik6Ci0gICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAnd2InKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3diJywgMCkgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYidoZWxsbycpCiAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICdyYicpIGFzIGY6CkBAIC0xMjQzLDYgKzEyNDgsNyBAQAogCiAgICAgZGVmIHRlc3RfdXJhbmRvbV92YWx1ZShzZWxmKToKICAgICAgICAgZGF0YTEgPSBvcy51cmFuZG9tKDE2KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGF0YTEsIGJ5dGVzKQogICAgICAgICBkYXRhMiA9IG9zLnVyYW5kb20oMTYpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YTEsIGRhdGEyKQogCkBAIC0xMjYzLDYgKzEyNjksMzcgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhMSwgZGF0YTIpCiAKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldHJhbmRvbScpLCAnbmVlZCBvcy5nZXRyYW5kb20oKScpCitjbGFzcyBHZXRSYW5kb21UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZ2V0cmFuZG9tX3R5cGUoc2VsZik6CisgICAgICAgIGRhdGEgPSBvcy5nZXRyYW5kb20oMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkYXRhLCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGF0YSksIDE2KQorCisgICAgZGVmIHRlc3RfZ2V0cmFuZG9tMChzZWxmKToKKyAgICAgICAgZW1wdHkgPSBvcy5nZXRyYW5kb20oMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbXB0eSwgYicnKQorCisgICAgZGVmIHRlc3RfZ2V0cmFuZG9tX3JhbmRvbShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob3MsICdHUk5EX1JBTkRPTScpKQorCisgICAgICAgICMgRG9uJ3QgdGVzdCBvcy5nZXRyYW5kb20oMSwgb3MuR1JORF9SQU5ET00pIHRvIG5vdCBjb25zdW1lIHRoZSByYXJlCisgICAgICAgICMgcmVzb3VyY2UgL2Rldi9yYW5kb20KKworICAgIGRlZiB0ZXN0X2dldHJhbmRvbV9ub25ibG9jayhzZWxmKToKKyAgICAgICAgIyBUaGUgY2FsbCBtdXN0IG5vdCBmYWlsLiBDaGVjayBhbHNvIHRoYXQgdGhlIGZsYWcgZXhpc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmdldHJhbmRvbSgxLCBvcy5HUk5EX05PTkJMT0NLKQorICAgICAgICBleGNlcHQgQmxvY2tpbmdJT0Vycm9yOgorICAgICAgICAgICAgIyBTeXN0ZW0gdXJhbmRvbSBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nZXRyYW5kb21fdmFsdWUoc2VsZik6CisgICAgICAgIGRhdGExID0gb3MuZ2V0cmFuZG9tKDE2KQorICAgICAgICBkYXRhMiA9IG9zLmdldHJhbmRvbSgxNikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhMSwgZGF0YTIpCisKKwogIyBvcy51cmFuZG9tKCkgZG9lc24ndCB1c2UgYSBmaWxlIGRlc2NyaXB0b3Igd2hlbiBpdCBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZQogIyBnZXRlbnRyb3B5KCkgZnVuY3Rpb24sIHRoZSBnZXRyYW5kb20oKSBmdW5jdGlvbiBvciB0aGUgZ2V0cmFuZG9tKCkgc3lzY2FsbAogT1NfVVJBTkRPTV9ET05UX1VTRV9GRCA9ICgKQEAgLTEzMTMsOSArMTM1MCw5IEBACiAgICAgZGVmIHRlc3RfdXJhbmRvbV9mZF9yZW9wZW5lZChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjMjEyMDc6IHVyYW5kb20oKSBzaG91bGQgZGV0ZWN0IGl0cyBmZCB0byAvZGV2L3VyYW5kb20KICAgICAgICAgIyBjaGFuZ2VkIHRvIHNvbWV0aGluZyBlbHNlLCBhbmQgcmVvcGVuIGl0LgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICd3YicpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGIieCIgKiAyNTYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYiJ4IiAqIDI1NikKKwogICAgICAgICBjb2RlID0gIiIiaWYgMToKICAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICAgaW1wb3J0IHN5cwpAQCAtMTQ0NCw2ICsxNDgxLDE4IEBACiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQogY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN0YXQoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIGV4aXN0cyA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGV4aXN0cyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmlsZSAlcyBtdXN0IG5vdCBleGlzdDsgb3Muc3RhdCBmYWlsZWQgd2l0aCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAlIChzdXBwb3J0LlRFU1RGTiwgZXhjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmlsZSAlcyBtdXN0IG5vdCBleGlzdCIgJSBzdXBwb3J0LlRFU1RGTikKKwogICAgIGRlZiB0ZXN0X3JlbmFtZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MucmVuYW1lLCBzdXBwb3J0LlRFU1RGTiwgc3VwcG9ydC5URVNURk4rIi5iYWsiKQogCkBAIC0xNDU0LDEyICsxNTAzLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLmNoZGlyLCBzdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X21rZGlyKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgInciKQotICAgICAgICB0cnk6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAieCIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5ta2Rpciwgc3VwcG9ydC5URVNURk4pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIG9zLnVubGluayhzdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X3V0aW1lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy51dGltZSwgc3VwcG9ydC5URVNURk4sIE5vbmUpCkBAIC0xNDY3LDYgKzE1MTQsNyBAQAogICAgIGRlZiB0ZXN0X2NobW9kKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5jaG1vZCwgc3VwcG9ydC5URVNURk4sIDApCiAKKwogY2xhc3MgVGVzdEludmFsaWRGRCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgc2luZ2xlcyA9IFsiZmNoZGlyIiwgImR1cCIsICJmZG9wZW4iLCAiZmRhdGFzeW5jIiwgImZzdGF0IiwKICAgICAgICAgICAgICAgICJmc3RhdHZmcyIsICJmc3luYyIsICJ0Y2dldHBncnAiLCAidHR5bmFtZSJdCkBAIC0xNTc4LDExICsxNjI2LDkgQEAKICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZSkKIAogICAgIGRlZiBfdGVzdF9saW5rKHNlbGYsIGZpbGUxLCBmaWxlMik6Ci0gICAgICAgIHdpdGggb3BlbihmaWxlMSwgInciKSBhcyBmMToKLSAgICAgICAgICAgIGYxLndyaXRlKCJ0ZXN0IikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCiAKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSk6CiAgICAgICAgICAgICBvcy5saW5rKGZpbGUxLCBmaWxlMikKICAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAiciIpIGFzIGYxLCBvcGVuKGZpbGUyLCAiciIpIGFzIGYyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguc2FtZW9wZW5maWxlKGYxLmZpbGVubygpLCBmMi5maWxlbm8oKSkpCkBAIC0xODc0LDEwICsxOTIwLDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIoc3VwcG9ydC5URVNURk4pKSwKICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRfcGF0aHMpCisKICAgICAgICAgIyBieXRlcwotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpLAotICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSksCisgICAgICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQogCiAgICAgZGVmIHRlc3RfbGlzdGRpcl9leHRlbmRlZF9wYXRoKHNlbGYpOgogICAgICAgICAiIiJUZXN0IHdoZW4gdGhlIHBhdGggc3RhcnRzIHdpdGggJ1xcXFw/XFwnLiIiIgpAQCAtMTg4NywxMSArMTkzNSwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKHBhdGgpKSwKICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRfcGF0aHMpCisKICAgICAgICAgIyBieXRlcwotICAgICAgICBwYXRoID0gYidcXFxcP1xcJyArIG9zLmZzZW5jb2RlKG9zLnBhdGguYWJzcGF0aChzdXBwb3J0LlRFU1RGTikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIocGF0aCkpLAotICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgorICAgICAgICAgICAgcGF0aCA9IGInXFxcXD9cXCcgKyBvcy5mc2VuY29kZShvcy5wYXRoLmFic3BhdGgoc3VwcG9ydC5URVNURk4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIocGF0aCkpLAorICAgICAgICAgICAgICAgICAgICBbb3MuZnNlbmNvZGUocGF0aCkgZm9yIHBhdGggaW4gc2VsZi5jcmVhdGVkX3BhdGhzXSkKIAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKQEAgLTE5NjYsNTEgKzIwMTYsNDUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5sc3RhdChsaW5rKSwgb3Muc3RhdChsaW5rKSkKIAogICAgICAgICBieXRlc19saW5rID0gb3MuZnNlbmNvZGUobGluaykKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChieXRlc19saW5rKSwgb3Muc3RhdCh0YXJnZXQpKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9zLmxzdGF0KGJ5dGVzX2xpbmspLCBvcy5zdGF0KGJ5dGVzX2xpbmspKQogCiAgICAgZGVmIHRlc3RfMTIwODQoc2VsZik6CiAgICAgICAgIGxldmVsMSA9IG9zLnBhdGguYWJzcGF0aChzdXBwb3J0LlRFU1RGTikKICAgICAgICAgbGV2ZWwyID0gb3MucGF0aC5qb2luKGxldmVsMSwgImxldmVsMiIpCiAgICAgICAgIGxldmVsMyA9IG9zLnBhdGguam9pbihsZXZlbDIsICJsZXZlbDMiKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIGxldmVsMSkKKworICAgICAgICBvcy5ta2RpcihsZXZlbDEpCisgICAgICAgIG9zLm1rZGlyKGxldmVsMikKKyAgICAgICAgb3MubWtkaXIobGV2ZWwzKQorCisgICAgICAgIGZpbGUxID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihsZXZlbDEsICJmaWxlMSIpKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlMSkKKworICAgICAgICBvcmlnX2RpciA9IG9zLmdldGN3ZCgpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMSkKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMikKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMykKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMikKKyAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4obGV2ZWwyLCAibGluayIpCisgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGgucmVscGF0aChmaWxlMSksICJsaW5rIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImxpbmsiLCBvcy5saXN0ZGlyKG9zLmdldGN3ZCgpKSkKIAotICAgICAgICAgICAgZmlsZTEgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGxldmVsMSwgImZpbGUxIikpCisgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSB0aGUgc2FtZSBkaXIgYXMgdGhlIGxpbmsKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksIG9zLnN0YXQoImxpbmsiKSkKIAotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAidyIpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZi53cml0ZSgiZmlsZTEiKQorICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYmVsb3cgdGhlIGxpbmsKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKIAotICAgICAgICAgICAgb3JpZ19kaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMikKLSAgICAgICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKGxldmVsMiwgImxpbmsiKQotICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5yZWxwYXRoKGZpbGUxKSwgImxpbmsiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImxpbmsiLCBvcy5saXN0ZGlyKG9zLmdldGN3ZCgpKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIHRoZSBzYW1lIGRpciBhcyB0aGUgbGluawotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksIG9zLnN0YXQoImxpbmsiKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGJlbG93IHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwxKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCi0KLSAgICAgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBhYm92ZSB0aGUgbGluawotICAgICAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihvcmlnX2RpcikKLSAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgotICAgICAgICAgICAgc2VsZi5mYWlsKGVycikKKyAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGFib3ZlIHRoZSBsaW5rCisgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUoZmlsZTEpCi0gICAgICAgICAgICBzaHV0aWwucm10cmVlKGxldmVsMSkKKyAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdfZGlyKQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQpAQCAtMjExOSw3ICsyMTYzLDggQEAKIAogICAgIGRlZiB0ZXN0X3dhaXRwaWQoc2VsZik6CiAgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsICdwYXNzJ10KLSAgICAgICAgcGlkID0gb3Muc3Bhd252KG9zLlBfTk9XQUlULCBhcmdzWzBdLCBhcmdzKQorICAgICAgICAjIEFkZCBhbiBpbXBsaWNpdCB0ZXN0IGZvciBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIoKS4KKyAgICAgICAgcGlkID0gb3Muc3Bhd252KG9zLlBfTk9XQUlULCBfUGF0aExpa2UoYXJnc1swXSksIGFyZ3MpCiAgICAgICAgIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgKHBpZCwgMCkpCiAKQEAgLTIxNDYsOCArMjE5MSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5ld19wcmlvID0gb3MuZ2V0cHJpb3JpdHkob3MuUFJJT19QUk9DRVNTLCBvcy5nZXRwaWQoKSkKICAgICAgICAgICAgIGlmIGJhc2UgPj0gMTkgYW5kIG5ld19wcmlvIDw9IDE5OgotICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KAotICAgICAgInVuYWJsZSB0byByZWxpYWJseSB0ZXN0IHNldHByaW9yaXR5IGF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ1bmFibGUgdG8gcmVsaWFibHkgdGVzdCBzZXRwcmlvcml0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19wcmlvLCBiYXNlICsgMSkKICAgICAgICAgZmluYWxseToKQEAgLTIyNTcsOCArMjMwMiw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLmtleSA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShjbHMuREFUQSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGNscy5EQVRBKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKQEAgLTI0MDgsMTAgKzI0NTIsMTEgQEAKICAgICBkZWYgdGVzdF90cmFpbGVycyhzZWxmKToKICAgICAgICAgVEVTVEZOMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCiAgICAgICAgIGZpbGVfZGF0YSA9IGIiYWJjZGVmIgotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoZmlsZV9kYXRhKQotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJylhcyBmOgotICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgVEVTVEZOMikKKworICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIFRFU1RGTjIpCisgICAgICAgIGNyZWF0ZV9maWxlKFRFU1RGTjIsIGZpbGVfZGF0YSkKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgIG9zLnNlbmRmaWxlKHNlbGYuc29ja25vLCBmLmZpbGVubygpLCAwLCBsZW4oZmlsZV9kYXRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXJzPVtiIjEyMzQiXSkKICAgICAgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKQEAgLTI0MzQsMzUgKzI0NzksMzcgQEAKIGRlZiBzdXBwb3J0c19leHRlbmRlZF9hdHRyaWJ1dGVzKCk6CiAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzZXR4YXR0ciIpOgogICAgICAgICByZXR1cm4gRmFsc2UKKwogICAgIHRyeToKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAieGIiLCAwKSBhcyBmcDoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBvcy5zZXR4YXR0cihmcC5maWxlbm8oKSwgYiJ1c2VyLnRlc3QiLCBiIiIpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICBmaW5hbGx5OgogICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAjIEtlcm5lbHMgPCAyLjYuMzkgZG9uJ3QgcmVzcGVjdCBzZXR4YXR0ciBmbGFncy4KLSAgICBrZXJuZWxfdmVyc2lvbiA9IHBsYXRmb3JtLnJlbGVhc2UoKQotICAgIG0gPSByZS5tYXRjaCgiMi42LihcZHsxLDJ9KSIsIGtlcm5lbF92ZXJzaW9uKQotICAgIHJldHVybiBtIGlzIE5vbmUgb3IgaW50KG0uZ3JvdXAoMSkpID49IDM5CisKKyAgICByZXR1cm4gVHJ1ZQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnRzX2V4dGVuZGVkX2F0dHJpYnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICJubyBub24tYnJva2VuIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdXBwb3J0IikKKyMgS2VybmVscyA8IDIuNi4zOSBkb24ndCByZXNwZWN0IHNldHhhdHRyIGZsYWdzLgorQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigyLCA2LCAzOSkKIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLQogICAgIGRlZiBfY2hlY2tfeGF0dHJzX3N0cihzZWxmLCBzLCBnZXR4YXR0ciwgc2V0eGF0dHIsIHJlbW92ZXhhdHRyLCBsaXN0eGF0dHIsICoqa3dhcmdzKToKICAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgotICAgICAgICBvcGVuKGZuLCAid2IiKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm4pCisgICAgICAgIGNyZWF0ZV9maWxlKGZuKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICBpbml0X3hhdHRyID0gbGlzdHhhdHRyKGZuKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5pdF94YXR0ciwgbGlzdCkKKwogICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksIGIiIiwgKiprd2FyZ3MpCiAgICAgICAgIHhhdHRyID0gc2V0KGluaXRfeGF0dHIpCiAgICAgICAgIHhhdHRyLmFkZCgidXNlci50ZXN0IikKQEAgLTI0NzAsMTkgKzI1MTcsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgYiJ1c2VyLnRlc3QiLCAqKmt3YXJncyksIGIiIikKICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImhlbGxvIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0eGF0dHIoZm4sIGIidXNlci50ZXN0IiwgKiprd2FyZ3MpLCBiImhlbGxvIikKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImJ5ZSIsIG9zLlhBVFRSX0NSRUFURSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FRVhJU1QpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiYnllIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9EQVRBKQorCiAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiZm9vIiwgb3MuWEFUVFJfQ1JFQVRFLCAqKmt3YXJncykKICAgICAgICAgeGF0dHIuYWRkKCJ1c2VyLnRlc3QyIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHhhdHRyKQogICAgICAgICByZW1vdmV4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICB4YXR0ci5yZW1vdmUoInVzZXIudGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxpc3R4YXR0cihmbikpLCB4YXR0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgcygidXNlci50ZXN0MiIpLCAqKmt3YXJncyksIGIiZm9vIikKQEAgLTI0OTUsMTEgKzI1NDcsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHNldChpbml0X3hhdHRyKSB8IHNldChtYW55KSkKIAogICAgIGRlZiBfY2hlY2tfeGF0dHJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIGRlZiBtYWtlX2J5dGVzKHMpOgotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKHMsICJhc2NpaSIpCiAgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRyc19zdHIoc3RyLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG1ha2VfYnl0ZXMsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG9zLmZzZW5jb2RlLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja194YXR0cnMob3MuZ2V0eGF0dHIsIG9zLnNldHhhdHRyLCBvcy5yZW1vdmV4YXR0ciwKQEAgLTI1MTQsMTAgKzI1NjYsMTAgQEAKICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAicmIiKSBhcyBmcDoKICAgICAgICAgICAgICAgICByZXR1cm4gb3MuZ2V0eGF0dHIoZnAuZmlsZW5vKCksICphcmdzKQogICAgICAgICBkZWYgc2V0eGF0dHIocGF0aCwgKmFyZ3MpOgotICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIsIDApIGFzIGZwOgogICAgICAgICAgICAgICAgIG9zLnNldHhhdHRyKGZwLmZpbGVubygpLCAqYXJncykKICAgICAgICAgZGVmIHJlbW92ZXhhdHRyKHBhdGgsICphcmdzKToKLSAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvcy5yZW1vdmV4YXR0cihmcC5maWxlbm8oKSwgKmFyZ3MpCiAgICAgICAgIGRlZiBsaXN0eGF0dHIocGF0aCwgKmFyZ3MpOgogICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGZwOgpAQCAtMjUzMCwzNiArMjU4MiwzOSBAQAogICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWQoc2VsZik6CiAgICAgICAgIGltcG9ydCBudAogICAgICAgICBmaWxlbmFtZSA9IG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImVycm9yIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgZm9yIGZ1bmMsICphcmdzIGluICgKLSAgICAgICAgICAgICAgICAobnQuX2dldGZ1bGxwYXRobmFtZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChudC5faXNkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MuYWNjZXNzLCBmaWxlbmFtZSwgb3MuUl9PSyksCi0gICAgICAgICAgICAgICAgKG9zLmNoZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmNobW9kLCBmaWxlbmFtZSwgMG83NzcpLAotICAgICAgICAgICAgICAgIChvcy5nZXRjd2RiLCksCi0gICAgICAgICAgICAgICAgKG9zLmxpbmssIGZpbGVuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmxpc3RkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubHN0YXQsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubWtkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Mub3BlbiwgZmlsZW5hbWUsIG9zLk9fUkRPTkxZKSwKLSAgICAgICAgICAgICAgICAob3MucmVuYW1lLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5ybWRpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5zdGFydGZpbGUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Muc3RhdCwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy51bmxpbmssIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MudXRpbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGVwcmVjYXRpb25XYXJuaW5nLCBmdW5jLCAqYXJncykKKyAgICAgICAgZm9yIGZ1bmMsICphcmdzIGluICgKKyAgICAgICAgICAgIChudC5fZ2V0ZnVsbHBhdGhuYW1lLCBmaWxlbmFtZSksCisgICAgICAgICAgICAobnQuX2lzZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MuYWNjZXNzLCBmaWxlbmFtZSwgb3MuUl9PSyksCisgICAgICAgICAgICAob3MuY2hkaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5jaG1vZCwgZmlsZW5hbWUsIDBvNzc3KSwKKyAgICAgICAgICAgIChvcy5nZXRjd2RiLCksCisgICAgICAgICAgICAob3MubGluaywgZmlsZW5hbWUsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5saXN0ZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MubHN0YXQsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5ta2RpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLm9wZW4sIGZpbGVuYW1lLCBvcy5PX1JET05MWSksCisgICAgICAgICAgICAob3MucmVuYW1lLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnJtZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Muc3RhcnRmaWxlLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Muc3RhdCwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnVubGluaywgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnV0aW1lLCBmaWxlbmFtZSksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBPU0Vycm9yLCB3ZSBvbmx5IGNhcmUgYWJvdXQgRGVwcmVjYXRpb25XYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHBhc3MKIAogICAgIEBzdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKICAgICBkZWYgdGVzdF9zeW1saW5rKHNlbGYpOgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorCiAgICAgICAgIGZpbGVuYW1lID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZXJyb3IiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rLCBmaWxlbmFtZSwgZmlsZW5hbWUpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoZmlsZW5hbWUsIGZpbGVuYW1lKQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRfdGVybWluYWxfc2l6ZScpLCAicmVxdWlyZXMgb3MuZ2V0X3Rlcm1pbmFsX3NpemUiKQpAQCAtMjYyNCw2ICsyNjc5LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGVuY29kZWQgPSBvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikKICAgICAgICAgc2VsZi5ieXRlc19maWxlbmFtZXMuYXBwZW5kKGVuY29kZWQpCisgICAgICAgIHNlbGYuYnl0ZXNfZmlsZW5hbWVzLmFwcGVuZChieXRlYXJyYXkoZW5jb2RlZCkpCiAgICAgICAgIHNlbGYuYnl0ZXNfZmlsZW5hbWVzLmFwcGVuZChtZW1vcnl2aWV3KGVuY29kZWQpKQogCiAgICAgICAgIHNlbGYuZmlsZW5hbWVzID0gc2VsZi5ieXRlc19maWxlbmFtZXMgKyBzZWxmLnVuaWNvZGVfZmlsZW5hbWVzCkBAIC0yNjk3LDcgKzI3NTMsMTQgQEAKICAgICAgICAgZm9yIGZpbGVuYW1lcywgZnVuYywgKmZ1bmNfYXJncyBpbiBmdW5jczoKICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGZ1bmMobmFtZSwgKmZ1bmNfYXJncykKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhuYW1lLCAqZnVuY19hcmdzKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jKG5hbWUsICpmdW5jX2FyZ3MpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICdzaG91bGQgYmUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jKG5hbWUsICpmdW5jX2FyZ3MpCiAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGVyci5maWxlbmFtZSwgbmFtZSkKICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMjc5Nyw2ICsyODYwLDYzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZ2V0X2luaGVyaXRhYmxlKHNsYXZlX2ZkKSwgRmFsc2UpCiAKIAorY2xhc3MgUGF0aFRDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyB0dXBsZXMgb2YgKGZ1bmN0aW9uIG5hbWUsIGFsbG93cyBmZCBhcmd1bWVudHMsIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvCisgICAgIyBmdW5jdGlvbiwgY2xlYW51cCBmdW5jdGlvbikKKyAgICBmdW5jdGlvbnMgPSBbCisgICAgICAgICgnc3RhdCcsIFRydWUsICgpLCBOb25lKSwKKyAgICAgICAgKCdsc3RhdCcsIEZhbHNlLCAoKSwgTm9uZSksCisgICAgICAgICgnYWNjZXNzJywgRmFsc2UsIChvcy5GX09LLCksIE5vbmUpLAorICAgICAgICAoJ2NoZmxhZ3MnLCBGYWxzZSwgKDAsKSwgTm9uZSksCisgICAgICAgICgnbGNoZmxhZ3MnLCBGYWxzZSwgKDAsKSwgTm9uZSksCisgICAgICAgICgnb3BlbicsIEZhbHNlLCAoMCwpLCBnZXRhdHRyKG9zLCAnY2xvc2UnLCBOb25lKSksCisgICAgXQorCisgICAgZGVmIHRlc3RfcGF0aF90X2NvbnZlcnRlcihzZWxmKToKKyAgICAgICAgc3RyX2ZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgYnl0ZXNfZnNwYXRoID0gYnl0ZXNfZmlsZW5hbWUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBieXRlc19maWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOLmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgYnl0ZXNfZnNwYXRoID0gX1BhdGhMaWtlKGJ5dGVzX2ZpbGVuYW1lKQorICAgICAgICBmZCA9IG9zLm9wZW4oX1BhdGhMaWtlKHN0cl9maWxlbmFtZSksIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgZmQpCisKKyAgICAgICAgaW50X2ZzcGF0aCA9IF9QYXRoTGlrZShmZCkKKyAgICAgICAgc3RyX2ZzcGF0aCA9IF9QYXRoTGlrZShzdHJfZmlsZW5hbWUpCisKKyAgICAgICAgZm9yIG5hbWUsIGFsbG93X2ZkLCBleHRyYV9hcmdzLCBjbGVhbnVwX2ZuIGluIHNlbGYuZnVuY3Rpb25zOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFtZT1uYW1lKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZuID0gZ2V0YXR0cihvcywgbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiAoc3RyX2ZpbGVuYW1lLCBieXRlc19maWxlbmFtZSwgc3RyX2ZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfZnNwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFtZT1uYW1lLCBwYXRoPXBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocGF0aCwgKmV4dHJhX2FyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbGVhbnVwX2ZuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfZm4ocmVzdWx0KQorCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLCAnc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMnKToKKyAgICAgICAgICAgICAgICAgICAgZm4oaW50X2ZzcGF0aCwgKmV4dHJhX2FyZ3MpCisKKyAgICAgICAgICAgICAgICBpZiBhbGxvd19mZDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4oZmQsICpleHRyYV9hcmdzKSAgIyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xlYW51cF9mbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfZm4ocmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29zLlBhdGhMaWtlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBmbihmZCwgKmV4dHJhX2FyZ3MpCisKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldF9ibG9ja2luZycpLAogICAgICAgICAgICAgICAgICAgICAgJ25lZWRzIG9zLmdldF9ibG9ja2luZygpIGFuZCBvcy5zZXRfYmxvY2tpbmcoKScpCiBjbGFzcyBCbG9ja2luZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI4MjAsMTUgKzI5NDAsMTggQEAKIAogCiBjbGFzcyBUZXN0U2NhbmRpcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZyA9IHN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZworCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmJ5dGVzX3BhdGggPSBvcy5mc2VuY29kZShzZWxmLnBhdGgpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi5wYXRoKQogICAgICAgICBvcy5ta2RpcihzZWxmLnBhdGgpCiAKICAgICBkZWYgY3JlYXRlX2ZpbGUoc2VsZiwgbmFtZT0iZmlsZS50eHQiKToKLSAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYidweXRob24nKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ3B5dGhvbicpCiAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgZGVmIGdldF9lbnRyaWVzKHNlbGYsIG5hbWVzKToKQEAgLTI4NTEsNiArMjk3NCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQxLCBzdGF0MikKIAogICAgIGRlZiBjaGVja19lbnRyeShzZWxmLCBlbnRyeSwgbmFtZSwgaXNfZGlyLCBpc19maWxlLCBpc19zeW1saW5rKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LCBvcy5EaXJFbnRyeSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5uYW1lLCBuYW1lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnBhdGgsIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lmlub2RlKCksCkBAIC0yOTE2LDE1ICszMDQwLDE2IEBACiAgICAgICAgICAgICBzZWxmLmNoZWNrX2VudHJ5KGVudHJ5LCAnc3ltbGlua19maWxlLnR4dCcsIEZhbHNlLCBUcnVlLCBUcnVlKQogCiAgICAgZGVmIGdldF9lbnRyeShzZWxmLCBuYW1lKToKLSAgICAgICAgZW50cmllcyA9IGxpc3Qob3Muc2NhbmRpcihzZWxmLnBhdGgpKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIocGF0aCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVudHJpZXMpLCAxKQogCiAgICAgICAgIGVudHJ5ID0gZW50cmllc1swXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lm5hbWUsIG5hbWUpCiAgICAgICAgIHJldHVybiBlbnRyeQogCi0gICAgZGVmIGNyZWF0ZV9maWxlX2VudHJ5KHNlbGYpOgotICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUoKQorICAgIGRlZiBjcmVhdGVfZmlsZV9lbnRyeShzZWxmLCBuYW1lPSdmaWxlLnR4dCcpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUobmFtZT1uYW1lKQogICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnkob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAKICAgICBkZWYgdGVzdF9jdXJyZW50X2RpcmVjdG9yeShzZWxmKToKQEAgLTI5NDUsNiArMzA3MCwxOSBAQAogICAgICAgICBlbnRyeSA9IHNlbGYuY3JlYXRlX2ZpbGVfZW50cnkoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZW50cnkpLCAiPERpckVudHJ5ICdmaWxlLnR4dCc+IikKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5mc3BhdGgoZW50cnkpLCBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnZmlsZS50eHQnKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAibnQiLCAidGVzdCByZXF1aXJlcyBieXRlcyBwYXRoIHN1cHBvcnQiKQorICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbF9ieXRlcyhzZWxmKToKKyAgICAgICAgYnl0ZXNfZmlsZW5hbWUgPSBvcy5mc2VuY29kZSgnYnl0ZXNmaWxlLnR4dCcpCisgICAgICAgIGJ5dGVzX2VudHJ5ID0gc2VsZi5jcmVhdGVfZmlsZV9lbnRyeShuYW1lPWJ5dGVzX2ZpbGVuYW1lKQorICAgICAgICBmc3BhdGggPSBvcy5mc3BhdGgoYnl0ZXNfZW50cnkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmc3BhdGgsIGJ5dGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MuZnNlbmNvZGUoc2VsZi5wYXRoKSxieXRlc19maWxlbmFtZSkpCisKICAgICBkZWYgdGVzdF9yZW1vdmVkX2RpcihzZWxmKToKICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdkaXInKQogCkBAIC0zMDEwLDcgKzMxNDgsOCBAQAogICAgIGRlZiB0ZXN0X2J5dGVzKHNlbGYpOgogICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLnNjYW5kaXIoYnl0ZXMpIG11c3QgcmFpc2UgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9zLnNjYW5kaXIsIGInLicpCisgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQpAQCAtMzA0Miw2ICszMTgxLDExMiBAQAogICAgICAgICBmb3Igb2JqIGluIFsxMjM0LCAxLjIzNCwge30sIFtdXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3Muc2NhbmRpciwgb2JqKQogCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgaXRlcmF0b3IgPSBvcy5zY2FuZGlyKHNlbGYucGF0aCkKKyAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgaXRlcmF0b3IuY2xvc2UoKQorICAgICAgICAjIG11bHRpcGxlIGNsb3NlcworICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBvcy5zY2FuZGlyKHNlbGYucGF0aCkgYXMgaXRlcmF0b3I6CisgICAgICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfcmVzb3VyY2Vfd2FybmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoUmVzb3VyY2VXYXJuaW5nKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorICAgICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgIyBleGhhdXN0ZWQgaXRlcmF0b3IKKyAgICAgICAgaXRlcmF0b3IgPSBvcy5zY2FuZGlyKHNlbGYucGF0aCkKKyAgICAgICAgbGlzdChpdGVyYXRvcikKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisKK2NsYXNzIFRlc3RQRVA1MTkodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBBYnN0cmFjdGVkIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHRlc3QgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAjIGlmIGEgQyB2ZXJzaW9uIGlzIHByb3ZpZGVkLgorICAgIGZzcGF0aCA9IHN0YXRpY21ldGhvZChvcy5mc3BhdGgpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5fYnl0ZXMoc2VsZik6CisgICAgICAgIGZvciBiIGluIGInaGVsbG8nLCBiJ2dvb2RieWUnLCBiJ3NvbWUvcGF0aC9hbmQvZmlsZSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYuZnNwYXRoKGIpKQorCisgICAgZGVmIHRlc3RfcmV0dXJuX3N0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gJ2hlbGxvJywgJ2dvb2RieWUnLCAnc29tZS9wYXRoL2FuZC9maWxlJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2VsZi5mc3BhdGgocykpCisKKyAgICBkZWYgdGVzdF9mc2VuY29kZV9mc2RlY29kZShzZWxmKToKKyAgICAgICAgZm9yIHAgaW4gInBhdGgvbGlrZS9vYmplY3QiLCBiInBhdGgvbGlrZS9vYmplY3QiOgorICAgICAgICAgICAgcGF0aGxpa2UgPSBfUGF0aExpa2UocCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBzZWxmLmZzcGF0aChwYXRobGlrZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIicGF0aC9saWtlL29iamVjdCIsIG9zLmZzZW5jb2RlKHBhdGhsaWtlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInBhdGgvbGlrZS9vYmplY3QiLCBvcy5mc2RlY29kZShwYXRobGlrZSkpCisKKyAgICBkZWYgdGVzdF9wYXRobGlrZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnI2ZlZWx0aGVnaWwnLCBzZWxmLmZzcGF0aChfUGF0aExpa2UoJyNmZWVsdGhlZ2lsJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhfUGF0aExpa2UsIG9zLlBhdGhMaWtlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoX1BhdGhMaWtlKCksIG9zLlBhdGhMaWtlKSkKKworICAgIGRlZiB0ZXN0X2dhcmJhZ2VfaW5fZXhjZXB0aW9uX291dChzZWxmKToKKyAgICAgICAgdmFwb3IgPSB0eXBlKCdibGFoJywgKCksIHt9KQorICAgICAgICBmb3IgbyBpbiBpbnQsIHR5cGUsIG9zLCB2YXBvcigpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZzcGF0aCwgbykKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnNwYXRoKQorCisgICAgZGVmIHRlc3RfYmFkX3BhdGhsaWtlKHNlbGYpOgorICAgICAgICAjIF9fZnNwYXRoX18gcmV0dXJucyBhIHZhbHVlIG90aGVyIHRoYW4gc3RyIG9yIGJ5dGVzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnNwYXRoLCBfUGF0aExpa2UoNDIpKQorICAgICAgICAjIF9fZnNwYXRoX18gYXR0cmlidXRlIHRoYXQgaXMgbm90IGNhbGxhYmxlLgorICAgICAgICBjID0gdHlwZSgnZm9vJywgKCksIHt9KQorICAgICAgICBjLl9fZnNwYXRoX18gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgsIGMoKSkKKyAgICAgICAgIyBfX2ZzcGF0aF9fIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLmZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX1BhdGhMaWtlKFplcm9EaXZpc2lvbkVycm9yKCkpKQorCisjIE9ubHkgdGVzdCBpZiB0aGUgQyB2ZXJzaW9uIGlzIHByb3ZpZGVkLCBvdGhlcndpc2UgVGVzdFBFUDUxOSBhbHJlYWR5IHRlc3RlZAorIyB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24uCitpZiBoYXNhdHRyKG9zLCAiX2ZzcGF0aCIpOgorICAgIGNsYXNzIFRlc3RQRVA1MTlQdXJlUHl0aG9uKFRlc3RQRVA1MTkpOgorCisgICAgICAgICIiIkV4cGxpY2l0bHkgdGVzdCB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2Ygb3MuZnNwYXRoKCkuIiIiCisKKyAgICAgICAgZnNwYXRoID0gc3RhdGljbWV0aG9kKG9zLl9mc3BhdGgpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKaW5kZXggYWI2NTc3Zi4uZTJhNDJmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgcGFyc2VyCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBzeXMKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHN0cnVjdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC02MzMsMTIgKzYzMiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICc8c3ludGF4LXRyZWU+JykKICAgICAgICAgY29kZSA9IHN0LmNvbXBpbGUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICc8c3ludGF4LXRyZWU+JykKLSAgICAgICAgZm9yIGZpbGVuYW1lIGluICgnZmlsZS5weScsIGInZmlsZS5weScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWFycmF5KGInZmlsZS5weScpLCBtZW1vcnl2aWV3KGInZmlsZS5weScpKToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluICdmaWxlLnB5JywgYidmaWxlLnB5JzoKICAgICAgICAgICAgIGNvZGUgPSBwYXJzZXIuY29tcGlsZXN0KHN0LCBmaWxlbmFtZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJ2ZpbGUucHknKQogICAgICAgICAgICAgY29kZSA9IHN0LmNvbXBpbGUoZmlsZW5hbWUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICdmaWxlLnB5JykKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGJ5dGVhcnJheShiJ2ZpbGUucHknKSwgbWVtb3J5dmlldyhiJ2ZpbGUucHknKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgIGNvZGUgPSBwYXJzZXIuY29tcGlsZXN0KHN0LCBmaWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZS5jb19maWxlbmFtZSwgJ2ZpbGUucHknKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgY29kZSA9IHN0LmNvbXBpbGUoZmlsZW5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUuY29fZmlsZW5hbWUsICdmaWxlLnB5JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwYXJzZXIuY29tcGlsZXN0LCBzdCwgbGlzdChiJ2ZpbGUucHknKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdC5jb21waWxlLCBsaXN0KGInZmlsZS5weScpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKaW5kZXggZmE5NmQ5Zi4uMmYyYmEzYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQpAQCAtMTkwLDEzICsxOTAsMTggQEAKICAgICAgICAgUCA9IHNlbGYuY2xzCiAgICAgICAgIHAgPSBQKCdhJykKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHAsIFApCisgICAgICAgIGNsYXNzIFBhdGhMaWtlOgorICAgICAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJhL2IvYyIKICAgICAgICAgUCgnYScsICdiJywgJ2MnKQogICAgICAgICBQKCcvYScsICdiJywgJ2MnKQogICAgICAgICBQKCdhL2IvYycpCiAgICAgICAgIFAoJy9hL2IvYycpCisgICAgICAgIFAoUGF0aExpa2UoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQKFAoJ2EnKSksIFAoJ2EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQKFAoJ2EnKSwgJ2InKSwgUCgnYS9iJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUChQKCdhJyksIFAoJ2InKSksIFAoJ2EvYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpLCBQKCdiJyksIFAoJ2MnKSksIFAoUGF0aExpa2UoKSkpCiAKICAgICBkZWYgX2NoZWNrX3N0cl9zdWJjbGFzcyhzZWxmLCAqYXJncyk6CiAgICAgICAgICMgSXNzdWUgIzIxMTI3OiBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gY29uc3RydWN0IGEgUHVyZVBhdGggb2JqZWN0CkBAIC0zODQsNiArMzg5LDEyIEBACiAgICAgICAgIHBhcnRzID0gcC5wYXJ0cwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnRzLCAoc2VwLCAnYScsICdiJykpCiAKKyAgICBkZWYgdGVzdF9mc3BhdGhfY29tbW9uKHNlbGYpOgorICAgICAgICBQID0gc2VsZi5jbHMKKyAgICAgICAgcCA9IFAoJ2EvYicpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cihwLl9fZnNwYXRoX18oKSwgKCdhL2InLCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cihvcy5mc3BhdGgocCksICgnYS9iJywpKQorCiAgICAgZGVmIHRlc3RfZXF1aXZhbGVuY2VzKHNlbGYpOgogICAgICAgICBmb3IgaywgdHVwbGVzIGluIHNlbGYuZXF1aXZhbGVuY2VzLml0ZW1zKCk6CiAgICAgICAgICAgICBjYW5vbiA9IGsucmVwbGFjZSgnLycsIHNlbGYuc2VwKQpAQCAtMTQ3NCwxMyArMTQ4NSwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChwLmdsb2IoImRpckEvLi4vZmlsZSoiKSksIHsgUChCQVNFLCAiZGlyQS8uLi9maWxlQSIpIH0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHAuZ2xvYigiLi4veHl6enkiKSksIHNldCgpKQogCi0gICAgZGVmIF9jaGVja19yZXNvbHZlX3JlbGF0aXZlKHNlbGYsIHAsIGV4cGVjdGVkKToKKworICAgIGRlZiBfY2hlY2tfcmVzb2x2ZShzZWxmLCBwLCBleHBlY3RlZCk6CiAgICAgICAgIHEgPSBwLnJlc29sdmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEsIGV4cGVjdGVkKQogCi0gICAgZGVmIF9jaGVja19yZXNvbHZlX2Fic29sdXRlKHNlbGYsIHAsIGV4cGVjdGVkKToKLSAgICAgICAgcSA9IHAucmVzb2x2ZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgZXhwZWN0ZWQpCisgICAgIyB0aGlzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGJvdGggcmVsYXRpdmUgYW5kIGFic29sdXRlIHJlc29sdXRpb25zCisgICAgX2NoZWNrX3Jlc29sdmVfcmVsYXRpdmUgPSBfY2hlY2tfcmVzb2x2ZV9hYnNvbHV0ZSA9IF9jaGVja19yZXNvbHZlCiAKICAgICBAd2l0aF9zeW1saW5rcwogICAgIGRlZiB0ZXN0X3Jlc29sdmVfY29tbW9uKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZGIucHkgYi9MaWIvdGVzdC90ZXN0X3BkYi5weQppbmRleCA0NWJhNWE5Li5hNjNjY2Q4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BkYi5weQpAQCAtNTU4LDcgKzU1OCw2IEBACiAKIGRlZiBwZGJfaW52b2tlKG1ldGhvZCwgYXJnKToKICAgICAiIiJSdW4gcGRiLm1ldGhvZChhcmcpLiIiIgotICAgIGltcG9ydCBwZGIKICAgICBnZXRhdHRyKHBkYi5QZGIobm9zaWdpbnQ9VHJ1ZSksIG1ldGhvZCkoYXJnKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKaW5kZXggNDFlNTA5MS4uYjAzMzY0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTEsOSArMSw4IEBACiBpbXBvcnQgZGlzCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKLWZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAotZnJvbSBtYXRoIGltcG9ydCBjb3B5c2lnbgogCiBmcm9tIHRlc3QuYnl0ZWNvZGVfaGVscGVyIGltcG9ydCBCeXRlY29kZVRlc3RDYXNlCiAKQEAgLTMwLDIyICsyOSwyNSBAQAogCiAgICAgZGVmIHRlc3RfZ2xvYmFsX2FzX2NvbnN0YW50KHNlbGYpOgogICAgICAgICAjIExPQURfR0xPQkFMIE5vbmUvVHJ1ZS9GYWxzZSAgLS0+ICBMT0FEX0NPTlNUIE5vbmUvVHJ1ZS9GYWxzZQotICAgICAgICBkZWYgZih4KToKLSAgICAgICAgICAgIE5vbmUKLSAgICAgICAgICAgIE5vbmUKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHggPSBOb25lCisgICAgICAgICAgICB4ID0gTm9uZQogICAgICAgICAgICAgcmV0dXJuIHgKLSAgICAgICAgZGVmIGcoeCk6Ci0gICAgICAgICAgICBUcnVlCisgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICB4ID0gVHJ1ZQogICAgICAgICAgICAgcmV0dXJuIHgKLSAgICAgICAgZGVmIGgoeCk6Ci0gICAgICAgICAgICBGYWxzZQorICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgeCA9IEZhbHNlCiAgICAgICAgICAgICByZXR1cm4geAorCiAgICAgICAgIGZvciBmdW5jLCBlbGVtIGluICgoZiwgTm9uZSksIChnLCBUcnVlKSwgKGgsIEZhbHNlKSk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluQnl0ZWNvZGUoZnVuYywgJ0xPQURfR0xPQkFMJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5CeXRlY29kZShmdW5jLCAnTE9BRF9DT05TVCcsIGVsZW0pCisKICAgICAgICAgZGVmIGYoKToKICAgICAgICAgICAgICdBZGRpbmcgYSBkb2NzdHJpbmcgbWFkZSB0aGlzIHRlc3QgZmFpbCBpbiBQeTIuNS4wJwogICAgICAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgICAgICBzZWxmLmFzc2VydE5vdEluQnl0ZWNvZGUoZiwgJ0xPQURfR0xPQkFMJykKICAgICAgICAgc2VsZi5hc3NlcnRJbkJ5dGVjb2RlKGYsICdMT0FEX0NPTlNUJywgTm9uZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDI0Ny5weQppbmRleCBhYjVmNDE4OS4uYzE3Y2VlZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKQEAgLTEsNSArMSw1IEBACiAiIiIKLVRlc3Qgc3VpdGUgdG8gY2hlY2sgY29tcGlsYW5jZSB3aXRoIFBFUCAyNDcsIHRoZSBzdGFuZGFyZCBBUEkKK1Rlc3Qgc3VpdGUgdG8gY2hlY2sgY29tcGxpYW5jZSB3aXRoIFBFUCAyNDcsIHRoZSBzdGFuZGFyZCBBUEkKIGZvciBoYXNoaW5nIGFsZ29yaXRobXMKICIiIgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkKaW5kZXggN2IwZDQ2NS4uODY0OTU5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAzMTUxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVwMzE1MS5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgZXJybm8KIGZyb20gZXJybm8gaW1wb3J0IEVFWElTVApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCA3Yzk4YzQ2Li4yN2Q1MTRmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGJ1aWx0aW5zCi1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCBvcwogZnJvbSBwbGF0Zm9ybSBpbXBvcnQgc3lzdGVtIGFzIHBsYXRmb3JtX3N5c3RlbQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CmluZGV4IGQ0NjdkNTIuLjA1MjAzZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0zNCw4ICszNCw2IEBACiAKICAgICB1bnBpY2tsZXIgPSBwaWNrbGUuX1VucGlja2xlcgogICAgIGJhZF9zdGFja19lcnJvcnMgPSAoSW5kZXhFcnJvciwpCi0gICAgYmFkX21hcmtfZXJyb3JzID0gKEluZGV4RXJyb3IsIHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKQogICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvciwgSW5kZXhFcnJvciwgSW1wb3J0RXJyb3IpCkBAIC03MCw4ICs2OCw2IEBACiAgICAgcGlja2xlciA9IHBpY2tsZS5fUGlja2xlcgogICAgIHVucGlja2xlciA9IHBpY2tsZS5fVW5waWNrbGVyCiAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yKQotICAgIGJhZF9tYXJrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBFT0ZFcnJvcikKICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXJyb3IsIEluZGV4RXJyb3IsIEltcG9ydEVycm9yKQpAQCAtMTQzLDkgKzEzOSw3IEBACiAgICAgY2xhc3MgQ1VucGlja2xlclRlc3RzKFB5VW5waWNrbGVyVGVzdHMpOgogICAgICAgICB1bnBpY2tsZXIgPSBfcGlja2xlLlVucGlja2xlcgogICAgICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsKQotICAgICAgICBiYWRfbWFya19lcnJvcnMgPSAoRU9GRXJyb3IsKQotICAgICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yKQorICAgICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsKQogCiAgICAgY2xhc3MgQ1BpY2tsZXJUZXN0cyhQeVBpY2tsZXJUZXN0cyk6CiAgICAgICAgIHBpY2tsZXIgPSBfcGlja2xlLlBpY2tsZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CmluZGV4IGJiZTY4NzUuLjg2YmViZmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQpAQCAtMSw5ICsxLDkgQEAKLWltcG9ydCBzdHJ1Y3QKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBwaWNrbGV0b29scwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZVRlc3RzCiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzCitpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgT3B0aW1pemVkUGlja2xlVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cywgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cyk6CiAKQEAgLTU5LDggKzU5LDQwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocGlja2xlLkJJTlBVVCwgcGlja2xlZDIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYnl0ZXNfdHlwZXMnLAorICAgICAgICAgICAgICAgICAgICAgJ1VQX1RPX05FV0xJTkUnLCAnVEFLRU5fRlJPTV9BUkdVTUVOVDEnLAorICAgICAgICAgICAgICAgICAgICAgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0JywgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0VScsCisgICAgICAgICAgICAgICAgICAgICAnVEFLRU5fRlJPTV9BUkdVTUVOVDhVJywgJ0FyZ3VtZW50RGVzY3JpcHRvcicsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91aW50MScsICdyZWFkX3VpbnQyJywgJ3JlYWRfaW50NCcsICdyZWFkX3VpbnQ0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VpbnQ4JywgJ3JlYWRfc3RyaW5nbmwnLCAncmVhZF9zdHJpbmdubF9ub2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3JlYWRfc3RyaW5nMScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmc0JywgJ3JlYWRfYnl0ZXMxJywgJ3JlYWRfYnl0ZXM0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2J5dGVzOCcsICdyZWFkX3VuaWNvZGVzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91bmljb2Rlc3RyaW5nMScsICdyZWFkX3VuaWNvZGVzdHJpbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VuaWNvZGVzdHJpbmc4JywgJ3JlYWRfZGVjaW1hbG5sX3Nob3J0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2RlY2ltYWxubF9sb25nJywgJ3JlYWRfZmxvYXRubCcsICdyZWFkX2Zsb2F0OCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9sb25nMScsICdyZWFkX2xvbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICd1aW50MScsICd1aW50MicsICdpbnQ0JywgJ3VpbnQ0JywgJ3VpbnQ4JywgJ3N0cmluZ25sJywKKyAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdubF9ub2VzY2FwZScsICdzdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3N0cmluZzEnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZzQnLCAnYnl0ZXMxJywgJ2J5dGVzNCcsICdieXRlczgnLAorICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVzdHJpbmdubCcsICd1bmljb2Rlc3RyaW5nMScsICd1bmljb2Rlc3RyaW5nNCcsCisgICAgICAgICAgICAgICAgICAgICAndW5pY29kZXN0cmluZzgnLCAnZGVjaW1hbG5sX3Nob3J0JywgJ2RlY2ltYWxubF9sb25nJywKKyAgICAgICAgICAgICAgICAgICAgICdmbG9hdG5sJywgJ2Zsb2F0OCcsICdsb25nMScsICdsb25nNCcsCisgICAgICAgICAgICAgICAgICAgICAnU3RhY2tPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5aW50JywgJ3B5bG9uZycsICdweWludGVnZXJfb3JfYm9vbCcsICdweWJvb2wnLCAncHlmbG9hdCcsCisgICAgICAgICAgICAgICAgICAgICAncHlieXRlc19vcl9zdHInLCAncHlzdHJpbmcnLCAncHlieXRlcycsICdweXVuaWNvZGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5bm9uZScsICdweXR1cGxlJywgJ3B5bGlzdCcsICdweWRpY3QnLCAncHlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5ZnJvemVuc2V0JywgJ2FueW9iamVjdCcsICdtYXJrb2JqZWN0JywgJ3N0YWNrc2xpY2UnLAorICAgICAgICAgICAgICAgICAgICAgJ09wY29kZUluZm8nLCAnb3Bjb2RlcycsICdjb2RlMm9wJywKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgcGlja2xldG9vbHMsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE9wdGltaXplZFBpY2tsZVRlc3RzKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE1pc2NUZXN0Q2FzZSkKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHBpY2tsZXRvb2xzKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3BpcGVzLnB5CmluZGV4IDZhN2I0NWYuLmFkMDFkMDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waXBlcy5weQpAQCAtMiw2ICsyLDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN0cmluZwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIHVubGluaywgcmVhcF9jaGlsZHJlbgogCiBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CkBAIC0xOCw2ICsxOSw4IEBACiAgICAgICAgICAgICB1bmxpbmsoZikKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTEoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCiAgICAgICAgIHQuYXBwZW5kKHNfY29tbWFuZCwgcGlwZXMuU1RESU5fU1RET1VUKQogICAgICAgICBmID0gdC5vcGVuKFRFU1RGTiwgJ3cnKQpAQCAtMjcsNiArMzAsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ0hFTExPIFdPUkxEICMxJykKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTIoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoJ2hlbGxvIHdvcmxkICMyJykKICAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKQEAgLTM2LDYgKzQxLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMicpCiAKICAgICBkZWYgdGVzdFNpbXBsZVBpcGUzKHNlbGYpOgorICAgICAgICBpZiBzaHV0aWwud2hpY2goJ3RyJykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3RyIGlzIG5vdCBhdmFpbGFibGUnKQogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMicpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkKaW5kZXggOWQyMDM1NC4uYWUyYWExYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wa2d1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtndXRpbC5weQpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoWzBdCiAKICAgICBkZWYgdGVzdF9nZXRkYXRhX3BlcDMwMihzZWxmKToKLSAgICAgICAgIyBVc2UgYSBkdW1teSBpbXBvcnRlci9sb2FkZXIKKyAgICAgICAgIyBVc2UgYSBkdW1teSBmaW5kZXIvbG9hZGVyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGtndXRpbC5nZXRfZGF0YSgnZm9vJywgJ2R1bW15JyksICJIZWxsbywgd29ybGQhIikKICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydmb28nXQogCkBAIC00MTMsNiArNDEzLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHBrZ3V0aWwuZ2V0X2xvYWRlcigidGVzdC5zdXBwb3J0IikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoX19uYW1lX18gPT0gJ19fbWFpbl9fJywgJ25vdCBjb21wYXRpYmxlIHdpdGggX19tYWluX18nKQogICAgIGRlZiB0ZXN0X2dldF9sb2FkZXJfaGFuZGxlc19taXNzaW5nX2xvYWRlcl9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgIGdsb2JhbCBfX2xvYWRlcl9fCiAgICAgICAgIHRoaXNfbG9hZGVyID0gX19sb2FkZXJfXwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKaW5kZXggMTYxMTRmOS4uNjBmZjkxOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5CkBAIC03LDcgKzcsNiBAQAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGJpbmFzY2lpCiBpbXBvcnQgY29sbGVjdGlvbnMKLWltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogCkBAIC01MjcsOCArNTI2LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VyLCBpbl9kYXRhKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7IlBsaXN0Rm9ybWF0IiwgIlBMSVNUSEVBREVSIn0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgcGxpc3RsaWIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RQbGlzdGxpYiwgVGVzdFBsaXN0bGliRGVwcmVjYXRlZCkKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UGxpc3RsaWIsIFRlc3RQbGlzdGxpYkRlcHJlY2F0ZWQsIE1pc2NUZXN0Q2FzZSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQppbmRleCBiY2VlYjkzLi43Yjk2MDZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQpAQCAtOCw3ICs4LDYgQEAKIGltcG9ydCBhc3luY2hhdAogaW1wb3J0IHNvY2tldAogaW1wb3J0IG9zCi1pbXBvcnQgdGltZQogaW1wb3J0IGVycm5vCiAKIGZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlLCBza2lwVW5sZXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCAyYTU5YzM4Li5kMmY1OGJhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTExLDcgKzExLDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgcHdkCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTM5OCw3ICszOTcsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQoZnAuZmlsZW5vKCkpKQogCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciwgbm90JywKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgZmxvYXQoZnAuZmlsZW5vKCkpKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZnAuY2xvc2UoKQpAQCAtNDA4LDE2ICs0MDcsMTggQEAKICAgICBkZWYgdGVzdF9zdGF0KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RhdChzdXBwb3J0LlRFU1RGTikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KGJ5dGVhcnJheShvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikpKSkKIAorICAgICAgICBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciwgbm90JywKKyAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBieXRlYXJyYXkob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgJ2NhblwndCBzcGVjaWZ5IE5vbmUgZm9yIHBhdGggYXJndW1lbnQnLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciwgbm90JywKICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMgb3IgaW50ZWdlciwgbm90JywKKyAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHN0cmluZywgYnl0ZXMsIG9zLlBhdGhMaWtlIG9yIGludGVnZXIsIG5vdCcsCiAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgbGlzdChzdXBwb3J0LlRFU1RGTikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciwgbm90JywKICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBsaXN0KG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnbWtmaWZvJyksICJkb24ndCBoYXZlIG1rZmlmbygpIikKQEAgLTg2Myw5ICs4NjQsOSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMSwgczIpCiAgICAgICAgICAgICBzMiA9IHBvc2l4LnN0YXQoc3VwcG9ydC5URVNURk4sIGRpcl9mZD1Ob25lKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMSwgczIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciBvciBOb25lLCBub3QnLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPXBvc2l4LmdldGN3ZCgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciwgbm90JywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIgb3IgTm9uZSwgbm90JywKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgc3VwcG9ydC5URVNURk4sIGRpcl9mZD1mbG9hdChmKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9MTAqKjIwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQppbmRleCAwNzgzYzM2Li44YTFlMzNiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQpAQCAtNTk2LDUgKzU5Niw4NSBAQAogICAgIGF0dHJpYnV0ZXMgPSBbJ3JlbHBhdGgnLCAnc2FtZWZpbGUnLCAnc2FtZW9wZW5maWxlJywgJ3NhbWVzdGF0J10KIAogCitjbGFzcyBQYXRoTGlrZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHBhdGggPSBwb3NpeHBhdGgKKworICAgIGNsYXNzIFBhdGhMaWtlOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD0nJyk6CisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnBhdGgsIEJhc2VFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYucGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gc3VwcG9ydC5URVNURk4ubG93ZXIoKQorICAgICAgICBzZWxmLmZpbGVfcGF0aCA9IHNlbGYuUGF0aExpa2Uoc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5maWxlX25hbWUpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVfbmFtZSwgJ3hiJywgMCkgYXMgZmlsZToKKyAgICAgICAgICAgIGZpbGUud3JpdGUoYiJ0ZXN0X3Bvc2l4cGF0aC5QYXRoTGlrZVRlc3RzIikKKworICAgIGRlZiBhc3NlcnRQYXRoRXF1YWwoc2VsZiwgZnVuYyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhzZWxmLmZpbGVfcGF0aCksIGZ1bmMoc2VsZi5maWxlX25hbWUpKQorCisgICAgZGVmIHRlc3RfcGF0aF9ub3JtY2FzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLm5vcm1jYXNlKQorCisgICAgZGVmIHRlc3RfcGF0aF9pc2FicyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmlzYWJzKQorCisgICAgZGVmIHRlc3RfcGF0aF9qb2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aC5qb2luKCdhJywgc2VsZi5QYXRoTGlrZSgnYicpLCAnYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aC5qb2luKCdhJywgJ2InLCAnYycpKQorCisgICAgZGVmIHRlc3RfcGF0aF9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLnNwbGl0KQorCisgICAgZGVmIHRlc3RfcGF0aF9zcGxpdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLnNwbGl0ZXh0KQorCisgICAgZGVmIHRlc3RfcGF0aF9zcGxpdGRyaXZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguc3BsaXRkcml2ZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfYmFzZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5iYXNlbmFtZSkKKworICAgIGRlZiB0ZXN0X3BhdGhfZGlybmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmRpcm5hbWUpCisKKyAgICBkZWYgdGVzdF9wYXRoX2lzbGluayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmlzbGluaykKKworICAgIGRlZiB0ZXN0X3BhdGhfbGV4aXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmxleGlzdHMpCisKKyAgICBkZWYgdGVzdF9wYXRoX2lzbW91bnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5pc21vdW50KQorCisgICAgZGVmIHRlc3RfcGF0aF9leHBhbmR1c2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGguZXhwYW5kdXNlcikKKworICAgIGRlZiB0ZXN0X3BhdGhfZXhwYW5kdmFycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLmV4cGFuZHZhcnMpCisKKyAgICBkZWYgdGVzdF9wYXRoX25vcm1wYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgubm9ybXBhdGgpCisKKyAgICBkZWYgdGVzdF9wYXRoX2Fic3BhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGF0aEVxdWFsKHNlbGYucGF0aC5hYnNwYXRoKQorCisgICAgZGVmIHRlc3RfcGF0aF9yZWFscGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXRoRXF1YWwoc2VsZi5wYXRoLnJlYWxwYXRoKQorCisgICAgZGVmIHRlc3RfcGF0aF9yZWxwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhdGhFcXVhbChzZWxmLnBhdGgucmVscGF0aCkKKworICAgIGRlZiB0ZXN0X3BhdGhfY29tbW9ucGF0aChzZWxmKToKKyAgICAgICAgY29tbW9uX3BhdGggPSBzZWxmLnBhdGguY29tbW9ucGF0aChbc2VsZi5maWxlX3BhdGgsIHNlbGYuZmlsZV9uYW1lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tb25fcGF0aCwgc2VsZi5maWxlX25hbWUpCisKKwogaWYgX19uYW1lX189PSJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvdy5weSBiL0xpYi90ZXN0L3Rlc3RfcG93LnB5CmluZGV4IDZmZWFjNDAuLmNlOTlmZTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG93LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG93LnB5CkBAIC0xLDQgKzEsNCBAQAotaW1wb3J0IHRlc3Quc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiBjbGFzcyBQb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wdHkucHkgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQppbmRleCBlZjVlOTllLi4xNWY4OGU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQpAQCAtMjc3LDcgKzI3Nyw2IEBACiAgICAgICAgIHNvY2tldHBhaXIgPSBzZWxmLl9zb2NrZXRwYWlyKCkKICAgICAgICAgbWFzdGVycyA9IFtzLmZpbGVubygpIGZvciBzIGluIHNvY2tldHBhaXJdCiAKLSAgICAgICAgb3MuY2xvc2UobWFzdGVyc1sxXSkKICAgICAgICAgc29ja2V0cGFpclsxXS5jbG9zZSgpCiAgICAgICAgIG9zLmNsb3NlKHdyaXRlX3RvX3N0ZGluX2ZkKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkgYi9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkKaW5kZXggMTkzMmM2Yi4uM2Q4OWUzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdWxsZG9tLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHVsbGRvbS5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBpbwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgeG1sLnNheAogCiBmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBBdHRyaWJ1dGVzSW1wbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQppbmRleCA2ZmZiYmJkLi4wNmMxMGMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgICMgVGhlc2Ugd2VyZSBvbmNlIGFib3V0IHRoZSAxMCBsb25nZXN0IG1vZHVsZXMKICAgICAgICAgY20oJ3JhbmRvbScsIGlnbm9yZT0oJ1JhbmRvbScsKSkgICMgZnJvbSBfcmFuZG9tIGltcG9ydCBSYW5kb20gYXMgQ29yZUdlbmVyYXRvcgogICAgICAgICBjbSgnY2dpJywgaWdub3JlPSgnbG9nJywpKSAgICAgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKLSAgICAgICAgY20oJ3BpY2tsZScpCisgICAgICAgIGNtKCdwaWNrbGUnLCBpZ25vcmU9KCdwYXJ0aWFsJywpKQogICAgICAgICBjbSgnYWlmYycsIGlnbm9yZT0oJ29wZW5mcCcsICdfYWlmY19wYXJhbXMnKSkgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKICAgICAgICAgY20oJ3NyZV9wYXJzZScsIGlnbm9yZT0oJ2R1bXAnLCAnZ3JvdXBzJykpICMgZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqOyBwcm9wZXJ0eQogICAgICAgICBjbSgncGRiJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CmluZGV4IGFlZTk3OWIuLjUyNzIzNGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQpAQCAtNDI3LDYgKzQyNyw3IEBACiAgICAgICAgIGV4cGVjdGVkX2h0bWwgPSBleHBlY3RlZF9odG1sX3BhdHRlcm4gJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAobW9kX3VybCwgbW9kX2ZpbGUsIGRvY19sb2MpICsKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2h0bWxfZGF0YV9kb2NzdHJpbmdzKQorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZF9odG1sKQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKQEAgLTQ3MywxMyArNDc0LDE4IEBACiAgICAgZGVmIHRlc3Rfbm9uX3N0cl9uYW1lKHNlbGYpOgogICAgICAgICAjIGlzc3VlMTQ2MzgKICAgICAgICAgIyBUcmVhdCBpbGxlZ2FsIChub24tc3RyKSBuYW1lIGxpa2Ugbm8gbmFtZQorICAgICAgICAjIERlZmluaXRpb24gb3JkZXIgaXMgc2V0IHRvIE5vbmUgc28gaXQgbG9va3MgdGhlIHNhbWUgaW4gYm90aAorICAgICAgICAjIGNhc2VzLgogICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19kZWZpbml0aW9uX29yZGVyX18gPSBOb25lCiAgICAgICAgICAgICBfX25hbWVfXyA9IDQyCiAgICAgICAgIGNsYXNzIEI6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGFkb2MgPSBweWRvYy5yZW5kZXJfZG9jKEEoKSkKICAgICAgICAgYmRvYyA9IHB5ZG9jLnJlbmRlcl9kb2MoQigpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkb2MucmVwbGFjZSgiQSIsICJCIiksIGJkb2MpCisgICAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKKyAgICAgICAgZXhwZWN0ZWQgPSBhZG9jLnJlcGxhY2UoIkEiLCAiQiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmRvYywgZXhwZWN0ZWQpCiAKICAgICBkZWYgdGVzdF9ub3RfaGVyZShzZWxmKToKICAgICAgICAgbWlzc2luZ19tb2R1bGUgPSAidGVzdC5pX2FtX25vdF9oZXJlIgpAQCAtNjM4LDggKzY0NCw5IEBACiAgICAgICAgIGRlbCBleHBlY3RlZFsnX19kb2NfXyddCiAgICAgICAgIGRlbCBleHBlY3RlZFsnX19jbGFzc19fJ10KICAgICAgICAgIyBpbnNwZWN0IHJlc29sdmVzIGRlc2NyaXB0b3JzIG9uIHR5cGUgaW50byBtZXRob2RzLCBidXQgdmFycyBkb2Vzbid0LAotICAgICAgICAjIHNvIHdlIG5lZWQgdG8gdXBkYXRlIF9fc3ViY2xhc3Nob29rX18uCisgICAgICAgICMgc28gd2UgbmVlZCB0byB1cGRhdGUgX19zdWJjbGFzc2hvb2tfXyBhbmQgX19pbml0X3N1YmNsYXNzX18uCiAgICAgICAgIGV4cGVjdGVkWydfX3N1YmNsYXNzaG9va19fJ10gPSBUZXN0Q2xhc3MuX19zdWJjbGFzc2hvb2tfXworICAgICAgICBleHBlY3RlZFsnX19pbml0X3N1YmNsYXNzX18nXSA9IFRlc3RDbGFzcy5fX2luaXRfc3ViY2xhc3NfXwogCiAgICAgICAgIG1ldGhvZHMgPSBweWRvYy5hbGxtZXRob2RzKFRlc3RDbGFzcykKICAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwobWV0aG9kcywgZXhwZWN0ZWQpCkBAIC04NTUsNiArODYyLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZ2V0X3N1bW1hcnlfbGluZSh0LndyYXApLAogICAgICAgICAgICAgIndyYXAodGV4dCkgbWV0aG9kIG9mIHRleHR3cmFwLlRleHRXcmFwcGVyIGluc3RhbmNlIikKIAorICAgIGRlZiB0ZXN0X2ZpZWxkX29yZGVyX2Zvcl9uYW1lZF90dXBsZXMoc2VsZik6CisgICAgICAgIFBlcnNvbiA9IG5hbWVkdHVwbGUoJ1BlcnNvbicsIFsnbmlja25hbWUnLCAnZmlyc3RuYW1lJywgJ2FnZWdyb3VwJ10pCisgICAgICAgIHMgPSBweWRvYy5yZW5kZXJfZG9jKFBlcnNvbikKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHMuaW5kZXgoJ25pY2tuYW1lJyksIHMuaW5kZXgoJ2ZpcnN0bmFtZScpKQorICAgICAgICBzZWxmLmFzc2VydExlc3Mocy5pbmRleCgnZmlyc3RuYW1lJyksIHMuaW5kZXgoJ2FnZWdyb3VwJykpCisKKyAgICAgICAgY2xhc3MgTm9uSXRlcmFibGVGaWVsZHM6CisgICAgICAgICAgICBfZmllbGRzID0gTm9uZQorCisgICAgICAgIGNsYXNzIE5vbkhhc2hhYmxlRmllbGRzOgorICAgICAgICAgICAgX2ZpZWxkcyA9IFtbXV0KKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGVzZSBkb2Vzbid0IGZhaWwKKyAgICAgICAgcHlkb2MucmVuZGVyX2RvYyhOb25JdGVyYWJsZUZpZWxkcykKKyAgICAgICAgcHlkb2MucmVuZGVyX2RvYyhOb25IYXNoYWJsZUZpZWxkcykKKwogICAgIEByZXF1aXJlc19kb2NzdHJpbmdzCiAgICAgZGVmIHRlc3RfYm91bmRfYnVpbHRpbl9tZXRob2Qoc2VsZik6CiAgICAgICAgIHMgPSBTdHJpbmdJTygpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weSBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CmluZGV4IDdjYWMwMTMuLjcxNTU0NGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CkBAIC0xLDYgKzEsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKLWltcG9ydCBzeXMsIG9zLCBpbywgc3VicHJvY2VzcworaW1wb3J0IHN5cywgaW8sIHN1YnByb2Nlc3MKIGltcG9ydCBxdW9wcmkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JhbmdlLnB5IGIvTGliL3Rlc3QvdGVzdF9yYW5nZS5weQppbmRleCAxMDZjNzMyLi5lMDNiNTcwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JhbmdlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkKQEAgLTEsNiArMSw2IEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBidWlsdC1pbiBmdW5jdGlvbnMKIAotaW1wb3J0IHRlc3Quc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IGl0ZXJ0b29scwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKaW5kZXggN2E3NDE0MS4uMjRhMDYwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hyKDkpK2NocigxMCkrY2hyKDExKStjaHIoMTMpK2NocigxMikrY2hyKDcpK2Nocig4KSkpCiAgICAgICAgIGZvciBjIGluICdjZGVoaWprbG1vcHFzdXd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yKToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ2EnLCAnXFwnICsgYywgJ2EnKSwgJ1xcJyArIGMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ15ccyonLCAnWCcsICd0ZXN0JyksICdYdGVzdCcpCkBAIC00MTQsMTkgKzQxNCwzMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYmMnKS5ncm91cHMoKSwgKCdiJywgTm9uZSwgJ2InLCAnYycpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYmMnKS5ncm91cHMoIiIpLCAoJ2InLCAiIiwgJ2InLCAnYycpKQogCi0gICAgICAgICMgQSBzaW5nbGUgZ3JvdXAKLSAgICAgICAgbSA9IHJlLm1hdGNoKCcoYSknLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMCksICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEpLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgxLCAxKSwgKCdhJywgJ2EnKSkKLQogICAgICAgICBwYXQgPSByZS5jb21waWxlKCcoPzooP1A8YTE+YSl8KD9QPGIyPmIpKSg/UDxjMz5jKT8nKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYScpLmdyb3VwKDEsIDIsIDMpLCAoJ2EnLCBOb25lLCBOb25lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2InKS5ncm91cCgnYTEnLCAnYjInLCAnYzMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2InLCBOb25lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2FjJykuZ3JvdXAoMSwgJ2IyJywgMyksICgnYScsIE5vbmUsICdjJykpCiAKKyAgICBkZWYgdGVzdF9ncm91cChzZWxmKToKKyAgICAgICAgY2xhc3MgSW5kZXg6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorICAgICAgICAjIEEgc2luZ2xlIGdyb3VwCisgICAgICAgIG0gPSByZS5tYXRjaCgnKGEpKGIpJywgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKCksICdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cChJbmRleCgxKSksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsIDE8PDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsIEluZGV4KDE8PDEwMDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCAneCcpCisgICAgICAgICMgTXVsdGlwbGUgZ3JvdXBzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgyLCAxKSwgKCdiJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKEluZGV4KDIpLCBJbmRleCgxKSksICgnYicsICdhJykpCisKICAgICBkZWYgdGVzdF9yZV9mdWxsbWF0Y2goc2VsZik6CiAgICAgICAgICMgSXNzdWUgMTYyMDM6IFByb3Bvc2FsOiBhZGQgcmUuZnVsbG1hdGNoKCkgbWV0aG9kLgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZ1bGxtYXRjaChyImEiLCAiYSIpLnNwYW4oKSwgKDAsIDEpKQpAQCAtNjMzLDE0ICs2NDcsMTAgQEAKICAgICAgICAgcmUucHVyZ2UoKSAgIyBmb3Igd2FybmluZ3MKICAgICAgICAgZm9yIGMgaW4gJ2NlZ2hpamtsbW9wcXl6Q0VGR0hJSktMTU5PUFFSVFZYWSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5mdWxsbWF0Y2goJ1xcJWMnICUgYywgYykuZ3JvdXAoKSwgYykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goJ1xcJWMnICUgYywgJ2EnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJ1xcJWMnICUgYykKICAgICAgICAgZm9yIGMgaW4gJ2NlZ2hpamtsbW9wcXl6QUJDRUZHSElKS0xNTk9QUVJUVlhZWic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5mdWxsbWF0Y2goJ1tcXCVjXScgJSBjLCBjKS5ncm91cCgpLCBjKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgnW1xcJWNdJyAlIGMsICdhJykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICdbXFwlY10nICUgYykKIAogICAgIGRlZiB0ZXN0X3N0cmluZ19ib3VuZGFyaWVzKHNlbGYpOgogICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTA3MTMKQEAgLTk5MywxMCArMTAwMyw4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiXHglMDJ4IiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJceCUwMngwIiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pK2IiMCIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIlx4JTAyeHoiICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkrYiJ6IikpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlx1MTIzNCIsIGIndTEyMzQnKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXFUwMDAxMjM0NSIsIGInVTAwMDEyMzQ1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJcdTEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgYnIiXFUwMDAxMjM0NSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcMCIsIGIiXDAwMCIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXDA4IiwgYiJcMDAwOCIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXDAxIiwgYiJcMDAxIikpCkBAIC0xMDE4LDEwICsxMDI2LDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJbXHglMDJ4XSIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiW1x4JTAyeDBdIiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJbXHglMDJ4el0iICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkpKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJbXHUxMjM0XSIsIGIndScpKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJbXFUwMDAxMjM0NV0iLCBiJ1UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIGJyIltcdTEyMzRdIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIGJyIltcVTAwMDEyMzQ1XSIpCiAgICAgICAgIHNlbGYuY2hlY2tQYXR0ZXJuRXJyb3IoYnIiW1w1NjddIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ29jdGFsIGVzY2FwZSB2YWx1ZSBcNTY3IG91dHNpZGUgb2YgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIncmFuZ2UgMC0wbzM3NycsIDEpCkBAIC0xMzYzLDEyICsxMzY5LDEyIEBACiAgICAgICAgIGlmIGJsZXR0ZXI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwYXQubWF0Y2goYmxldHRlcikpCiAgICAgICAgICMgSW5jb21wYXRpYmlsaXRpZXMKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsICcnLCByZS5MT0NBTEUpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCAnKD9MKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJycsIHJlLkxPQ0FMRSB8IHJlLkFTQ0lJKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgYicoP0wpJywgcmUuQVNDSUkpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJyg/YSknLCByZS5MT0NBTEUpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJyg/YUwpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgJycsIHJlLkxPQ0FMRSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgJyg/TCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJycsIHJlLkxPQ0FMRSB8IHJlLkFTQ0lJKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJyg/TCknLCByZS5BU0NJSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYicoP2EpJywgcmUuTE9DQUxFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJyg/YUwpJykKIAogICAgIGRlZiB0ZXN0X2J1Z182NTA5KHNlbGYpOgogICAgICAgICAjIFJlcGxhY2VtZW50IHN0cmluZ3Mgb2YgYm90aCB0eXBlcyBtdXN0IHBhcnNlIHByb3Blcmx5LgpAQCAtMTQxOSwxMyArMTQyNSw2IEBACiAgICAgICAgICMgVGVzdCBiZWhhdmlvdXIgd2hlbiBub3QgZ2l2ZW4gYSBzdHJpbmcgb3IgcGF0dGVybiBhcyBwYXJhbWV0ZXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZS5jb21waWxlLCAwKQogCi0gICAgZGVmIHRlc3RfYnVnXzEzODk5KHNlbGYpOgotICAgICAgICAjIElzc3VlICMxMzg5OTogcmUgcGF0dGVybiByIltcQV0iIHNob3VsZCB3b3JrIGxpa2UgIkEiIGJ1dCBtYXRjaGVzCi0gICAgICAgICMgbm90aGluZy4gRGl0dG8gQiBhbmQgWi4KLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwocidbXEFcQlxiXENcWl0nLCAnQUJcYkNaJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQScsICdCJywgJ1xiJywgJ0MnLCAnWiddKQotCiAgICAgQGJpZ21lbXRlc3Qoc2l6ZT1fMkcsIG1lbXVzZT0xKQogICAgIGRlZiB0ZXN0X2xhcmdlX3NlYXJjaChzZWxmLCBzaXplKToKICAgICAgICAgIyBJc3N1ZSAjMTAxODI6IGluZGljZXMgd2VyZSAzMi1iaXQtdHJ1bmNhdGVkLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKaW5kZXggMmM3M2RmMi4uMDZhOTE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5CkBAIC0xMjEsNiArMTIxLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVSTT0neHRlcm0tMjU2Y29sb3InKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgYicnKQogCisgICAgYXV0b19oaXN0b3J5X3NjcmlwdCA9ICIiIlwKK2ltcG9ydCByZWFkbGluZQorcmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeSh7fSkKK2lucHV0KCkKK3ByaW50KCJIaXN0b3J5IGxlbmd0aDoiLCByZWFkbGluZS5nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCgpKQorIiIiCisKKyAgICBkZWYgdGVzdF9hdXRvX2hpc3RvcnlfZW5hYmxlZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gcnVuX3B0eShzZWxmLmF1dG9faGlzdG9yeV9zY3JpcHQuZm9ybWF0KFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEluKGIiSGlzdG9yeSBsZW5ndGg6IDFcclxuIiwgb3V0cHV0KQorCisgICAgZGVmIHRlc3RfYXV0b19oaXN0b3J5X2Rpc2FibGVkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBydW5fcHR5KHNlbGYuYXV0b19oaXN0b3J5X3NjcmlwdC5mb3JtYXQoRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEluKGIiSGlzdG9yeSBsZW5ndGg6IDBcclxuIiwgb3V0cHV0KQorCiAgICAgZGVmIHRlc3Rfbm9uYXNjaWkoc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlYWRsaW5lLmFkZF9oaXN0b3J5KCJceEVCXHhFRiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQppbmRleCBhMzk4YTRmLi5kYzE1NDYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKQEAgLTEsMjEgKzEsNDggQEAKICIiIgogVGVzdHMgb2YgcmVncnRlc3QucHkuCisKK05vdGU6IHRlc3RfcmVncnRlc3QgY2Fubm90IGJlIHJ1biB0d2ljZSBpbiBwYXJhbGxlbC4KICIiIgogCi1pbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBjb250ZXh0bGliCiBpbXBvcnQgZmF1bHRoYW5kbGVyCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgaW8KIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QsIHN1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgbGlicmVncnRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK1B5X0RFQlVHID0gaGFzYXR0cihzeXMsICdnZXRvYmplY3RzJykKK1JPT1RfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsICcuLicpCitST09UX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKFJPT1RfRElSKSkKKworVEVTVF9JTlRFUlJVUFRFRCA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICBmcm9tIHNpZ25hbCBpbXBvcnQgU0lHSU5UCisgICAgdHJ5OgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcmFpc2Vfc2lnbmFsCisgICAgICAgIHJhaXNlX3NpZ25hbChTSUdJTlQpCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQorICAgICIiIikKKwogCiBjbGFzcyBQYXJzZUFyZ3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICAiIiJUZXN0IHJlZ3J0ZXN0J3MgYXJndW1lbnQgcGFyc2luZy4iIiIKKyAgICAiIiIKKyAgICBUZXN0IHJlZ3J0ZXN0J3MgYXJndW1lbnQgcGFyc2luZywgZnVuY3Rpb24gX3BhcnNlX2FyZ3MoKS4KKyAgICAiIiIKIAogICAgIGRlZiBjaGVja0Vycm9yKHNlbGYsIGFyZ3MsIG1zZyk6CiAgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRlcnIoKSBhcyBlcnIsIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgotICAgICAgICAgICAgcmVncnRlc3QuX3BhcnNlX2FyZ3MoYXJncykKKyAgICAgICAgICAgIGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKGFyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obXNnLCBlcnIuZ2V0dmFsdWUoKSkKIAogICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CkBAIC0yMyw4MiArNTAsODIgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgogICAgICAgICAgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXQsIFwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgotICAgICAgICAgICAgICAgICAgICByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICAgICAgbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUnVuIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLicsIG91dC5nZXR2YWx1ZSgpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIoKSByZXF1aXJlZCIpCiAgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGltZW91dCcsICc0LjInXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGltZW91dCcsICc0LjInXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50aW1lb3V0LCA0LjIpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tdGltZW91dCddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10aW1lb3V0JywgJ2ZvbyddLCAnaW52YWxpZCBmbG9hdCB2YWx1ZScpCiAKICAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS13YWl0J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXdhaXQnXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLndhaXQpCiAKICAgICBkZWYgdGVzdF9zbGF2ZWFyZ3Moc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXNsYXZlYXJncycsICdbW10sIHt9XSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zbGF2ZWFyZ3MnLCAnW1tdLCB7fV0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zbGF2ZWFyZ3MsICdbW10sIHt9XScpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tc2xhdmVhcmdzJ10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3Rfc3RhcnQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1TJywgJy0tc3RhcnQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zdGFydCwgJ2ZvbycpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3ZlcmJvc2Uoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdiddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXYnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAxKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXZ2diddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXZ2diddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDMpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDEpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSAqIDMpCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSAqIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMykKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZTIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy13JywgJy0tdmVyYm9zZTInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy52ZXJib3NlMikKIAogICAgIGRlZiB0ZXN0X3ZlcmJvc2UzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctVycsICctLXZlcmJvc2UzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMudmVyYm9zZTMpCiAKICAgICBkZWYgdGVzdF9xdWlldChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXEnLCAnLS1xdWlldCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3Nsb3coc2VsZik6Ci0gICAgICAgIGZvciBvcHQgaW4gJy1vJywgJy0tc2xvdyc6CisgICAgICAgIGZvciBvcHQgaW4gJy1vJywgJy0tc2xvd2VzdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnByaW50X3Nsb3cpCiAKICAgICBkZWYgdGVzdF9oZWFkZXIoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLWhlYWRlciddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1oZWFkZXInXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmhlYWRlcikKIAogICAgIGRlZiB0ZXN0X3JhbmRvbWl6ZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXInLCAnLS1yYW5kb21pemUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5yYW5kb21pemUpCiAKICAgICBkZWYgdGVzdF9yYW5kc2VlZChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcmFuZHNlZWQnLCAnMTIzNDUnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcmFuZHNlZWQnLCAnMTIzNDUnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5yYW5kb21fc2VlZCwgMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5yYW5kb21pemUpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tcmFuZHNlZWQnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCkBAIC0xMDcsNyArMTM0LDcgQEAKICAgICBkZWYgdGVzdF9mcm9tZmlsZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLWYnLCAnLS1mcm9tZmlsZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmZyb21maWxlLCAnZm9vJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJywgJy1zJ10sICJkb24ndCBnbyB0b2dldGhlciIpCkBAIC0xMTUsNDIgKzE0Miw0MiBAQAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy14JywgJy0tZXhjbHVkZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmV4Y2x1ZGUpCiAKICAgICBkZWYgdGVzdF9zaW5nbGUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1zJywgJy0tc2luZ2xlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuc2luZ2xlKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnLWYnLCAnZm9vJ10sICJkb24ndCBnbyB0b2dldGhlciIpCiAKICAgICBkZWYgdGVzdF9tYXRjaChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW0nLCAnLS1tYXRjaCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdwYXR0ZXJuJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAncGF0dGVybiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMubWF0Y2hfdGVzdHMsICdwYXR0ZXJuJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfZmFpbGZhc3Qoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1HJywgJy0tZmFpbGZhc3QnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLXYnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctdiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5mYWlsZmFzdCkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctVyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy1XJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZhaWxmYXN0KQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJy1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XJykKIAogICAgIGRlZiB0ZXN0X3VzZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXUnLCAnLS11c2UnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5ldHdvcmsnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbmV0d29yayddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX3Jlc291cmNlcywgWydndWknLCAnbmV0d29yayddKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxub25lLG5ldHdvcmsnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbm9uZSxuZXR3b3JrJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBbJ25ldHdvcmsnXSkKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QocmVncnRlc3QuUkVTT1VSQ0VfTkFNRVMpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0KGxpYnJlZ3J0ZXN0LlJFU09VUkNFX05BTUVTKQogICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJlbW92ZSgnZ3VpJykKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdhbGwsLWd1aSddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2FsbCwtZ3VpJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBleHBlY3RlZCkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJ10sICdpbnZhbGlkIHJlc291cmNlJykKQEAgLTE1OCwzMSArMTg1LDMxIEBACiAgICAgZGVmIHRlc3RfbWVtbGltaXQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1NJywgJy0tbWVtbGltaXQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNEcnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc0RyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMubWVtbGltaXQsICc0RycpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3Rlc3RkaXIoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRlc3RkaXInLCAnZm9vJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRlc3RkaXInLCAnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudGVzdGRpciwgb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsICdmb28nKSkKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10ZXN0ZGlyJ10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfcnVubGVha3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1MJywgJy0tcnVubGVha3MnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5ydW5sZWFrcykKIAogICAgIGRlZiB0ZXN0X2h1bnRybGVha3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1SJywgJy0taHVudHJsZWFrcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6J10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDUsIDQsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjonXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDYsIDQsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOjMnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6MyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDUsIDMsICdyZWZsb2cudHh0JykpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjozOmxlYWtzLmxvZyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6MzpsZWFrcy5sb2cnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmh1bnRybGVha3MsICg2LCAzLCAnbGVha3MubG9nJykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzYnXSwKQEAgLTE5MywyNCArMjIwLDIzIEBACiAgICAgZGVmIHRlc3RfbXVsdGlwcm9jZXNzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctaicsICctLW11bHRpcHJvY2Vzcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcyJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMiddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX21wLCAyKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgaW50IHZhbHVlJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLVQnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLWwnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKLSAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJzInLCAnLU0nLCAnNEcnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKIAogICAgIGRlZiB0ZXN0X2NvdmVyYWdlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctVCcsICctLWNvdmVyYWdlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMudHJhY2UpCiAKICAgICBkZWYgdGVzdF9jb3ZlcmRpcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUQnLCAnLS1jb3ZlcmRpcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmNvdmVyZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsICdmb28nKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQpAQCAtMjE4LDEzICsyNDQsMTMgQEAKICAgICBkZWYgdGVzdF9ub2NvdmVyZGlyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctTicsICctLW5vY292ZXJkaXInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG5zLmNvdmVyZGlyKQogCiAgICAgZGVmIHRlc3RfdGhyZXNob2xkKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdCcsICctLXRocmVzaG9sZCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcxMDAwJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMTAwMCddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudGhyZXNob2xkLCAxMDAwKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgaW50IHZhbHVlJykKQEAgLTIzMiwxMyArMjU4LDE2IEBACiAgICAgZGVmIHRlc3Rfbm93aW5kb3dzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbicsICctLW5vd2luZG93cyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRlcnIoaW8uU3RyaW5nSU8oKSkgYXMgc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5ub3dpbmRvd3MpCisgICAgICAgICAgICAgICAgZXJyID0gc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd0aGUgLS1ub3dpbmRvd3MgKC1uKSBvcHRpb24gaXMgZGVwcmVjYXRlZCcsIGVycikKIAogICAgIGRlZiB0ZXN0X2ZvcmV2ZXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1GJywgJy0tZm9yZXZlcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZvcmV2ZXIpCiAKIApAQCAtMjQ2LDMwICsyNzUsNTE5IEBACiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0teHh4J10sICd1c2FnZTonKQogCiAgICAgZGVmIHRlc3RfbG9uZ19vcHRpb25fX3BhcnRpYWwoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWknXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF90d29fb3B0aW9ucyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnLS1leGNsdWRlJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJy0tZXhjbHVkZSddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmV4Y2x1ZGUpCiAKICAgICBkZWYgdGVzdF9vcHRpb25fd2l0aF9lbXB0eV9zdHJpbmdfdmFsdWUoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXN0YXJ0JywgJyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zdGFydCcsICcnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5zdGFydCwgJycpCiAKICAgICBkZWYgdGVzdF9hcmcoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWydmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJ2ZvbyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmFyZ3MsIFsnZm9vJ10pCiAKICAgICBkZWYgdGVzdF9vcHRpb25fYW5kX2FyZyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnZm9vJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJ2ZvbyddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5hcmdzLCBbJ2ZvbyddKQogCiAKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgVEVTVF9VTklRVUVfSUQgPSAxCisgICAgVEVTVE5BTUVfUFJFRklYID0gJ3Rlc3RfcmVncnRlc3RfJworICAgIFRFU1ROQU1FX1JFR0VYID0gcid0ZXN0X1thLXpBLVowLTlfXSsnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVzdGRpciA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKworICAgICAgICBzZWxmLnRtcHRlc3RkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzZWxmLnRtcHRlc3RkaXIpCisKKyAgICBkZWYgY3JlYXRlX3Rlc3Qoc2VsZiwgbmFtZT1Ob25lLCBjb2RlPScnKToKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBuYW1lID0gJ25vb3AlcycgJSBCYXNlVGVzdENhc2UuVEVTVF9VTklRVUVfSUQKKyAgICAgICAgICAgIEJhc2VUZXN0Q2FzZS5URVNUX1VOSVFVRV9JRCArPSAxCisKKyAgICAgICAgIyB0ZXN0X3JlZ3J0ZXN0IGNhbm5vdCBiZSBydW4gdHdpY2UgaW4gcGFyYWxsZWwgYmVjYXVzZQorICAgICAgICAjIG9mIHNldFVwKCkgYW5kIGNyZWF0ZV90ZXN0KCkKKyAgICAgICAgbmFtZSA9IHNlbGYuVEVTVE5BTUVfUFJFRklYICsgbmFtZQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudG1wdGVzdGRpciwgbmFtZSArICcucHknKQorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgcGF0aCkKKyAgICAgICAgIyBVc2UgJ3gnIG1vZGUgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IG92ZXJyaWRlIGV4aXN0aW5nIHRlc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAneCcsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKGNvZGUpCisgICAgICAgIGV4Y2VwdCBQZXJtaXNzaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgbm90IHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3Qgd3JpdGUgJXM6ICVzIiAlIChwYXRoLCBleGMpKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiByZWdleF9zZWFyY2goc2VsZiwgcmVnZXgsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHJlZ2V4LCBvdXRwdXQsIHJlLk1VTFRJTElORSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBub3QgZm91bmQgaW4gJXIiICUgKHJlZ2V4LCBvdXRwdXQpKQorICAgICAgICByZXR1cm4gbWF0Y2gKKworICAgIGRlZiBjaGVja19saW5lKHNlbGYsIG91dHB1dCwgcmVnZXgpOgorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocideJyArIHJlZ2V4LCByZS5NVUxUSUxJTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0cHV0LCByZWdleCkKKworICAgIGRlZiBwYXJzZV9leGVjdXRlZF90ZXN0cyhzZWxmLCBvdXRwdXQpOgorICAgICAgICByZWdleCA9IChyJ15bMC05XSs6WzAtOV0rOlswLTldKyBcWyAqWzAtOV0rKD86LyAqWzAtOV0rKT9cXSAoJXMpJworICAgICAgICAgICAgICAgICAlIHNlbGYuVEVTVE5BTUVfUkVHRVgpCisgICAgICAgIHBhcnNlciA9IHJlLmZpbmRpdGVyKHJlZ2V4LCBvdXRwdXQsIHJlLk1VTFRJTElORSkKKyAgICAgICAgcmV0dXJuIGxpc3QobWF0Y2guZ3JvdXAoMSkgZm9yIG1hdGNoIGluIHBhcnNlcikKKworICAgIGRlZiBjaGVja19leGVjdXRlZF90ZXN0cyhzZWxmLCBvdXRwdXQsIHRlc3RzLCBza2lwcGVkPSgpLCBmYWlsZWQ9KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQ9KCksIHJhbmRvbWl6ZT1GYWxzZSwgaW50ZXJydXB0ZWQ9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBzdHIpOgorICAgICAgICAgICAgdGVzdHMgPSBbdGVzdHNdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2tpcHBlZCwgc3RyKToKKyAgICAgICAgICAgIHNraXBwZWQgPSBbc2tpcHBlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsZWQsIHN0cik6CisgICAgICAgICAgICBmYWlsZWQgPSBbZmFpbGVkXQorICAgICAgICBpZiBpc2luc3RhbmNlKG9taXR0ZWQsIHN0cik6CisgICAgICAgICAgICBvbWl0dGVkID0gW29taXR0ZWRdCisgICAgICAgIG50ZXN0ID0gbGVuKHRlc3RzKQorICAgICAgICBuc2tpcHBlZCA9IGxlbihza2lwcGVkKQorICAgICAgICBuZmFpbGVkID0gbGVuKGZhaWxlZCkKKyAgICAgICAgbm9taXR0ZWQgPSBsZW4ob21pdHRlZCkKKworICAgICAgICBleGVjdXRlZCA9IHNlbGYucGFyc2VfZXhlY3V0ZWRfdGVzdHMob3V0cHV0KQorICAgICAgICBpZiByYW5kb21pemU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChleGVjdXRlZCksIHNldCh0ZXN0cyksIG91dHB1dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhlY3V0ZWQsIHRlc3RzLCBvdXRwdXQpCisKKyAgICAgICAgZGVmIHBsdXJhbChjb3VudCk6CisgICAgICAgICAgICByZXR1cm4gJ3MnIGlmIGNvdW50ICE9IDEgZWxzZSAnJworCisgICAgICAgIGRlZiBsaXN0X3JlZ2V4KGxpbmVfZm9ybWF0LCB0ZXN0cyk6CisgICAgICAgICAgICBjb3VudCA9IGxlbih0ZXN0cykKKyAgICAgICAgICAgIG5hbWVzID0gJyAnLmpvaW4oc29ydGVkKHRlc3RzKSkKKyAgICAgICAgICAgIHJlZ2V4ID0gbGluZV9mb3JtYXQgJSAoY291bnQsIHBsdXJhbChjb3VudCkpCisgICAgICAgICAgICByZWdleCA9IHInJXM6XG4gICAgJXMkJyAlIChyZWdleCwgbmFtZXMpCisgICAgICAgICAgICByZXR1cm4gcmVnZXgKKworICAgICAgICBpZiBza2lwcGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgc2tpcHBlZCcsIHNraXBwZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICByZWdleCA9IGxpc3RfcmVnZXgoJyVzIHRlc3QlcyBmYWlsZWQnLCBmYWlsZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBvbWl0dGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgb21pdHRlZCcsIG9taXR0ZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBnb29kID0gbnRlc3QgLSBuc2tpcHBlZCAtIG5mYWlsZWQgLSBub21pdHRlZAorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgcmVnZXggPSByJyVzIHRlc3QlcyBPS1wuJCcgJSAoZ29vZCwgcGx1cmFsKGdvb2QpKQorICAgICAgICAgICAgaWYgbm90IHNraXBwZWQgYW5kIG5vdCBmYWlsZWQgYW5kIGdvb2QgPiAxOgorICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0FsbCAlcycgJSByZWdleAorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULicpCisKKyAgICAgICAgaWYgbmZhaWxlZDoKKyAgICAgICAgICAgIHJlc3VsdCA9ICdGQUlMVVJFJworICAgICAgICBlbGlmIGludGVycnVwdGVkOgorICAgICAgICAgICAgcmVzdWx0ID0gJ0lOVEVSUlVQVEVEJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gJ1NVQ0NFU1MnCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsICdUZXN0cyByZXN1bHQ6ICVzJyAlIHJlc3VsdCkKKworICAgIGRlZiBwYXJzZV9yYW5kb21fc2VlZChzZWxmLCBvdXRwdXQpOgorICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVXNpbmcgcmFuZG9tIHNlZWQgKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHJhbmRzZWVkID0gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSByYW5kc2VlZCA8PSAxMDAwMDAwMCwgcmFuZHNlZWQpCisgICAgICAgIHJldHVybiByYW5kc2VlZAorCisgICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGFyZ3MsIGlucHV0PU5vbmUsIGV4aXRjb2RlPTAsICoqa3cpOgorICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICBpbnB1dCA9ICcnCisgICAgICAgIGlmICdzdGRlcnInIG5vdCBpbiBrdzoKKyAgICAgICAgICAgIGt3WydzdGRlcnInXSA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5ydW4oYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9aW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprdykKKyAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlICE9IGV4aXRjb2RlOgorICAgICAgICAgICAgbXNnID0gKCJDb21tYW5kICVzIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAlc1xuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAic3Rkb3V0OlxuIgorICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAiJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgJSAoc3RyKGFyZ3MpLCBwcm9jLnJldHVybmNvZGUsIHByb2Muc3Rkb3V0KSkKKyAgICAgICAgICAgIGlmIHByb2Muc3RkZXJyOgorICAgICAgICAgICAgICAgIG1zZyArPSAoIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0ZGVycjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgcHJvYy5zdGRlcnIpCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorICAgICAgICByZXR1cm4gcHJvYworCisKKyAgICBkZWYgcnVuX3B5dGhvbihzZWxmLCBhcmdzLCAqKmt3KToKKyAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctSScsICphcmdzXQorICAgICAgICBwcm9jID0gc2VsZi5ydW5fY29tbWFuZChhcmdzLCAqKmt3KQorICAgICAgICByZXR1cm4gcHJvYy5zdGRvdXQKKworCitjbGFzcyBQcm9ncmFtc1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB2YXJpb3VzIHdheXMgdG8gcnVuIHRoZSBQeXRob24gdGVzdCBzdWl0ZS4gVXNlIG9wdGlvbnMgY2xvc2UKKyAgICB0byBvcHRpb25zIHVzZWQgb24gdGhlIGJ1aWxkYm90LgorICAgICIiIgorCisgICAgTlRFU1QgPSA0CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorCisgICAgICAgICMgQ3JlYXRlIE5URVNUIHRlc3RzIGRvaW5nIG5vdGhpbmcKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGluZGV4IGluIHJhbmdlKHNlbGYuTlRFU1QpXQorCisgICAgICAgIHNlbGYucHl0aG9uX2FyZ3MgPSBbJy1XZCcsICctRScsICctYmInXQorICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MgPSBbJy11YWxsJywgJy1yd1cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdGVzdGRpcj0lcycgJSBzZWxmLnRtcHRlc3RkaXJdCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIHNlbGYucmVncnRlc3RfYXJncy5leHRlbmQoKCctLXRpbWVvdXQnLCAnMzYwMCcsICctajQnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MuYXBwZW5kKCctbicpCisKKyAgICBkZWYgY2hlY2tfb3V0cHV0KHNlbGYsIG91dHB1dCk6CisgICAgICAgIHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgc2VsZi50ZXN0cywgcmFuZG9taXplPVRydWUpCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYsIGFyZ3MpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9weXRob24oYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQob3V0cHV0KQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIExpYi90ZXN0L3JlZ3J0ZXN0LnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkaXIsICdyZWdydGVzdC5weScpCisKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QucmVncnRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QucmVncnRlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QuYXV0b3Rlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QuYXV0b3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fdGVzdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0CisgICAgICAgIGNvZGUgPSAnZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdCcKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1jJywgY29kZSwKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBMaWIvdGVzdC9hdXRvdGVzdC5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGlyLCAnYXV0b3Rlc3QucHknKQorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCBzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdydW5fdGVzdHMucHkgc2NyaXB0IGlzIG5vdCBpbnN0YWxsZWQnKQorICAgIGRlZiB0ZXN0X3Rvb2xzX3NjcmlwdF9ydW5fdGVzdHMoc2VsZik6CisgICAgICAgICMgVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAnVG9vbHMnLCAnc2NyaXB0cycsICdydW5fdGVzdHMucHknKQorICAgICAgICBhcmdzID0gW3NjcmlwdCwgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgcnVuX2JhdGNoKHNlbGYsICphcmdzKToKKyAgICAgICAgcHJvYyA9IHNlbGYucnVuX2NvbW1hbmQoYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQocHJvYy5zdGRvdXQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuYmF0IHNjcmlwdCBpcyBub3QgaW5zdGFsbGVkJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfdG9vbHNfYnVpbGRib3RfdGVzdChzZWxmKToKKyAgICAgICAgIyBUb29sc1xidWlsZGJvdFx0ZXN0LmJhdAorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdUb29scycsICdidWlsZGJvdCcsICd0ZXN0LmJhdCcpCisgICAgICAgIHRlc3RfYXJncyA9IFsnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpcl0KKyAgICAgICAgaWYgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0gPT0gJzY0Yml0JzoKKyAgICAgICAgICAgIHRlc3RfYXJncy5hcHBlbmQoJy14NjQnKSAgICMgNjQtYml0IGJ1aWxkCisgICAgICAgIGlmIG5vdCBQeV9ERUJVRzoKKyAgICAgICAgICAgIHRlc3RfYXJncy5hcHBlbmQoJytkJykgICAgICMgUmVsZWFzZSBidWlsZCwgdXNlIHB5dGhvbi5leGUKKyAgICAgICAgc2VsZi5ydW5fYmF0Y2goc2NyaXB0LCAqdGVzdF9hcmdzLCAqc2VsZi50ZXN0cykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAnV2luZG93cyBvbmx5JykKKyAgICBkZWYgdGVzdF9wY2J1aWxkX3J0KHNlbGYpOgorICAgICAgICAjIFBDYnVpbGRccnQuYmF0CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgcidQQ2J1aWxkXHJ0LmJhdCcpCisgICAgICAgIHJ0X2FyZ3MgPSBbIi1xIl0gICAgICAgICAgICAgIyBRdWljaywgZG9uJ3QgcnVuIHRlc3RzIHR3aWNlCisgICAgICAgIGlmIHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdID09ICc2NGJpdCc6CisgICAgICAgICAgICBydF9hcmdzLmFwcGVuZCgnLXg2NCcpICAgIyA2NC1iaXQgYnVpbGQKKyAgICAgICAgaWYgUHlfREVCVUc6CisgICAgICAgICAgICBydF9hcmdzLmFwcGVuZCgnLWQnKSAgICAgIyBEZWJ1ZyBidWlsZCwgdXNlIHB5dGhvbl9kLmV4ZQorICAgICAgICBzZWxmLnJ1bl9iYXRjaChzY3JpcHQsICpydF9hcmdzLCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0cykKKworCitjbGFzcyBBcmdzVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IGFyZ3VtZW50cyBvZiB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUuCisgICAgIiIiCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYsICp0ZXN0YXJncywgKiprdyk6CisgICAgICAgIGNtZGFyZ3MgPSBbJy1tJywgJ3Rlc3QnLCAnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpciwgKnRlc3RhcmdzXQorICAgICAgICByZXR1cm4gc2VsZi5ydW5fcHl0aG9uKGNtZGFyZ3MsICoqa3cpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3Rlc3Qoc2VsZik6CisgICAgICAgICMgdGVzdCBhIGZhaWxpbmcgdGVzdAorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisKKyAgICAgICAgICAgIGNsYXNzIEZhaWxpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9mYWlsaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJ1ZyIpCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdF9vayA9IHNlbGYuY3JlYXRlX3Rlc3QoJ29rJykKKyAgICAgICAgdGVzdF9mYWlsaW5nID0gc2VsZi5jcmVhdGVfdGVzdCgnZmFpbGluZycsIGNvZGU9Y29kZSkKKyAgICAgICAgdGVzdHMgPSBbdGVzdF9vaywgdGVzdF9mYWlsaW5nXQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCp0ZXN0cywgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzLCBmYWlsZWQ9dGVzdF9mYWlsaW5nKQorCisgICAgZGVmIHRlc3RfcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICAjIHRlc3QgLXUgY29tbWFuZCBsaW5lIG9wdGlvbgorICAgICAgICB0ZXN0cyA9IHt9CisgICAgICAgIGZvciByZXNvdXJjZSBpbiAoJ2F1ZGlvJywgJ25ldHdvcmsnKToKKyAgICAgICAgICAgIGNvZGUgPSAnZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0XG5zdXBwb3J0LnJlcXVpcmVzKCVyKScgJSByZXNvdXJjZQorICAgICAgICAgICAgdGVzdHNbcmVzb3VyY2VdID0gc2VsZi5jcmVhdGVfdGVzdChyZXNvdXJjZSwgY29kZSkKKyAgICAgICAgdGVzdF9uYW1lcyA9IHNvcnRlZCh0ZXN0cy52YWx1ZXMoKSkKKworICAgICAgICAjIC11IGFsbDogMiByZXNvdXJjZXMgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXUnLCAnYWxsJywgKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzKQorCisgICAgICAgICMgLXUgYXVkaW86IDEgcmVzb3VyY2UgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXVhdWRpbycsICp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkPXRlc3RzWyduZXR3b3JrJ10pCisKKyAgICAgICAgIyBubyBvcHRpb246IDAgcmVzb3VyY2VzIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQ9dGVzdF9uYW1lcykKKworICAgIGRlZiB0ZXN0X3JhbmRvbShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC1yIGFuZCAtLXJhbmRzZWVkIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgICAgICAgY29kZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgICAgIHByaW50KCJURVNUUkFORE9NOiAlcyIgJSByYW5kb20ucmFuZGludCgxLCAxMDAwKSkKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgncmFuZG9tJywgY29kZSkKKworICAgICAgICAjIGZpcnN0IHJ1biB0byBnZXQgdGhlIG91dHB1dCB3aXRoIHRoZSByYW5kb20gc2VlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXInLCB0ZXN0KQorICAgICAgICByYW5kc2VlZCA9IHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVEVTVFJBTkRPTTogKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHRlc3RfcmFuZG9tID0gaW50KG1hdGNoLmdyb3VwKDEpKQorCisgICAgICAgICMgdHJ5IHRvIHJlcHJvZHVjZSB3aXRoIHRoZSByYW5kb20gc2VlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLXInLCAnLS1yYW5kc2VlZD0lcycgJSByYW5kc2VlZCwgdGVzdCkKKyAgICAgICAgcmFuZHNlZWQyID0gc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZHNlZWQyLCByYW5kc2VlZCkKKworICAgICAgICBtYXRjaCA9IHNlbGYucmVnZXhfc2VhcmNoKHInVEVTVFJBTkRPTTogKFswLTldKyknLCBvdXRwdXQpCisgICAgICAgIHRlc3RfcmFuZG9tMiA9IGludChtYXRjaC5ncm91cCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X3JhbmRvbTIsIHRlc3RfcmFuZG9tKQorCisgICAgZGVmIHRlc3RfZnJvbWZpbGUoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWZyb21maWxlCisgICAgICAgIHRlc3RzID0gW3NlbGYuY3JlYXRlX3Rlc3QoKSBmb3IgaW5kZXggaW4gcmFuZ2UoNSldCisKKyAgICAgICAgIyBXcml0ZSB0aGUgbGlzdCBvZiBmaWxlcyB1c2luZyBhIGZvcm1hdCBzaW1pbGFyIHRvIHJlZ3J0ZXN0IG91dHB1dDoKKyAgICAgICAgIyBbMS8yXSB0ZXN0XzEKKyAgICAgICAgIyBbMi8yXSB0ZXN0XzIKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgICMgdGVzdCBmb3JtYXQgJzA6MDA6MDAgWzIvN10gdGVzdF9vcGNvZGVzIC0tIHRlc3RfZ3JhbW1hciB0b29rIDAgc2VjJworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBwcmV2aW91cyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgorICAgICAgICAgICAgICAgIGxpbmUgPSAoIjAwOjAwOiUwMmkgWyVzLyVzXSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKGluZGV4LCBpbmRleCwgbGVuKHRlc3RzKSwgbmFtZSkpCisgICAgICAgICAgICAgICAgaWYgcHJldmlvdXM6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gIiAtLSAlcyB0b29rIDAgc2VjIiAlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZmlsZT1mcCkKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IG5hbWUKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICAgICAgIyB0ZXN0IGZvcm1hdCAnWzIvN10gdGVzdF9vcGNvZGVzJworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKHRlc3RzLCAxKToKKyAgICAgICAgICAgICAgICBwcmludCgiWyVzLyVzXSAlcyIgJSAoaW5kZXgsIGxlbih0ZXN0cyksIG5hbWUpLCBmaWxlPWZwKQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWZyb21maWxlJywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cykKKworICAgICAgICAjIHRlc3QgZm9ybWF0ICd0ZXN0X29wY29kZXMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHRlc3RzOgorICAgICAgICAgICAgICAgIHByaW50KG5hbWUsIGZpbGU9ZnApCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZnJvbWZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZWQoc2VsZik6CisgICAgICAgIGNvZGUgPSBURVNUX0lOVEVSUlVQVEVECisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdzaWdpbnQnLCBjb2RlPWNvZGUpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0LCBvbWl0dGVkPXRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQ9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3Nsb3dlc3Qoc2VsZik6CisgICAgICAgICMgdGVzdCAtLXNsb3dlc3QKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSgzKV0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tc2xvd2VzdCIsICp0ZXN0cykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJyg/Oi0gJXM6IC4qXG4peyVzfScKKyAgICAgICAgICAgICAgICAgJSAoc2VsZi5URVNUTkFNRV9SRUdFWCwgbGVuKHRlc3RzKSkpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3Rfc2xvd19pbnRlcnJ1cHRlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjUzNzM6IHRlc3QgLS1zbG93ZXN0IHdpdGggYW4gaW50ZXJydXB0ZWQgdGVzdAorICAgICAgICBjb2RlID0gVEVTVF9JTlRFUlJVUFRFRAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgic2lnaW50IiwgY29kZT1jb2RlKQorCisgICAgICAgIGZvciBtdWx0aXByb2Nlc3NpbmcgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGlmIG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgICAgICBhcmdzID0gKCItLXNsb3dlc3QiLCAiLWoyIiwgdGVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXJncyA9ICgiLS1zbG93ZXN0IiwgdGVzdCkKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCphcmdzLCBleGl0Y29kZT0xKQorICAgICAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQ9dGVzdCwgaW50ZXJydXB0ZWQ9VHJ1ZSkKKworICAgICAgICAgICAgcmVnZXggPSAoJzEwIHNsb3dlc3QgdGVzdHM6XG4nKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tY292ZXJhZ2UKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2NvdmVyYWdlJykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tY292ZXJhZ2UiLCB0ZXN0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdKQorICAgICAgICByZWdleCA9ICgnbGluZXMgK2NvdiUgK21vZHVsZSArXChwYXRoXClcbicKKyAgICAgICAgICAgICAgICAgJyg/OiAqWzAtOV0rICpbMC05XXsxLDJ9JSAqW14gXSsgK1woW14pXStcKSspKycpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3Rfd2FpdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0td2FpdAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnd2FpdCcpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCItLXdhaXQiLCB0ZXN0LCBpbnB1dD0na2V5JykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgJ1ByZXNzIGFueSBrZXkgdG8gY29udGludWUnKQorCisgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tZm9yZXZlcgorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IGJ1aWx0aW5zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRm9yZXZlclRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSBzdGF0ZSBpbiB0aGUgYnVpbHRpbnMgbW9kdWxlLCBiZWNhdXNlIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIGlzIHJlbG9hZCBhdCBlYWNoIHJ1bgorICAgICAgICAgICAgICAgICAgICBpZiAnUlVOJyBpbiBidWlsdGlucy5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBidWlsdGlucy5fX2RpY3RfX1snUlVOJ10gPj0gMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZhaWwgYXQgdGhlIDNyZCBydW5zIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSA9IDEKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnZm9yZXZlcicsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZm9yZXZlcicsIHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0qMywgZmFpbGVkPXRlc3QpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgYSBkZWJ1ZyBidWlsZCcpCisgICAgZGVmIHRlc3RfaHVudHJsZWFrc19mZF9sZWFrKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1odW50cmxlYWtzIGZvciBmaWxlIGRlc2NyaXB0b3IgbGVhaworICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgIyBJc3N1ZSAjMjUzMDY6IERpc2FibGUgcG9wdXBzIGFuZCBsb2dzIHRvIHN0ZGVyciBvbiBhc3NlcnRpb24KKyAgICAgICAgICAgICMgZmFpbHVyZXMgaW4gTVNDUlQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICAjIG5vIFdpbmRvd3MsIG8gcmVsZWFzZSBidWlsZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gW21zdmNydC5DUlRfV0FSTiwgbXN2Y3J0LkNSVF9FUlJPUiwgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgICAgICAgICBjbGFzcyBGRExlYWtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9sZWFrKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4oX19maWxlX18sIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgICAgICAgICAjIGJ1ZzogbmV2ZXIgY2xvZXMgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdodW50cmxlYWtzJywgY29kZT1jb2RlKQorCisgICAgICAgIGZpbGVuYW1lID0gJ3JlZmxvZy50eHQnCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWh1bnRybGVha3MnLCAnMzozOicsIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRjb2RlPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIFt0ZXN0XSwgZmFpbGVkPXRlc3QpCisKKyAgICAgICAgbGluZSA9ICdiZWdpbm5pbmcgNiByZXBldGl0aW9uc1xuMTIzNDU2XG4uLi4uLi5cbicKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmUuZXNjYXBlKGxpbmUpKQorCisgICAgICAgIGxpbmUyID0gJyVzIGxlYWtlZCBbMSwgMSwgMV0gZmlsZSBkZXNjcmlwdG9ycywgc3VtPTNcbicgJSB0ZXN0CisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlLmVzY2FwZShsaW5lMikpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIHJlZmxvZyA9IGZwLnJlYWQoKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXRjb3VudHMnKToKKyAgICAgICAgICAgICAgICAjIFR5cGVzIGFyZSBpbW1wb3J0YWwgaWYgQ09VTlRfQUxMT0NTIGlzIGRlZmluZWQKKyAgICAgICAgICAgICAgICByZWZsb2cgPSByZWZsb2cuc3BsaXRsaW5lcyhUcnVlKVstMV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmbG9nLCBsaW5lMikKKworICAgIGRlZiB0ZXN0X2xpc3RfdGVzdHMoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWxpc3QtdGVzdHMKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpIGluIHJhbmdlKDUpXQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1saXN0LXRlc3RzJywgKnRlc3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5yc3RyaXAoKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQppbmRleCAxNTgyY2FhLi41ODcyOWE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CkBAIC0yNTMsNiArMjUzLDMxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICE9IGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDwgYikKIAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9tZXNzYWdlKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBOb25lLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogTm9uZSA8IDQyLCByIic8JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPiBOb25lLCByIic+JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPCBOb25lLCByIic8JyAuKiBvZiAnc3RyJyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPj0gNjY2LCByIic+PScgLiogb2YgJ3N0cicgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8PSBOb25lLCByIic8PScgLiogb2YgJ2ludCcgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyID49IE5vbmUsIHIiJz49JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBbXSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdsaXN0JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogKCkgPiBbXSwgciInPicgLiogb2YgJ3R1cGxlJyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lID49IE5vbmUsIHIiJz49JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBTcGFtKCkgPCA0MiwgciInPCcgLiogb2YgJ1NwYW0nIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBTcGFtKCksIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnU3BhbSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8PSBTcGFtKCksIHIiJzw9JyAuKiBvZiAnU3BhbScgYW5kICdTcGFtJyIpLAorICAgICAgICBdCisgICAgICAgIGZvciBpLCB0ZXN0IGluIGVudW1lcmF0ZSh0ZXN0cyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIHRlc3RbMV0pOgorICAgICAgICAgICAgICAgICAgICB0ZXN0WzBdKCkKKworCiBjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kaWN0cyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CmluZGV4IDg1M2U3NzMuLjBkYzEwODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQpAQCAtMSwxMSArMSwxMiBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdW5pdHRlc3QubW9jaworZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAogaW1wb3J0IGJ1aWx0aW5zCiBpbXBvcnQgcmxjb21wbGV0ZXIKIAogY2xhc3MgQ29tcGxldGVNZToKICAgICAiIiIgVHJpdmlhbCBjbGFzcyB1c2VkIGluIHRlc3Rpbmcgcmxjb21wbGV0ZXIuQ29tcGxldGVyLiAiIiIKICAgICBzcGFtID0gMQorICAgIF9oYW0gPSAyCiAKIAogY2xhc3MgVGVzdFJsY29tcGxldGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTUyLDE4ICs1MywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnc3RyLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ3R1cGxlLmZvb3NwYW1lZ2cnKSwgW10pCisgICAgICAgIGV4cGVjdGVkID0gc29ydGVkKHsnTm9uZS4lcyVzJyAlICh4LCAnKCcgaWYgeCAhPSAnX19kb2NfXycgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIGRpcihOb25lKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGRjb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdOb25lLicpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuXycpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuX18nKSwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB0ZXN0IHdpdGggYSBjdXN0b21pemVkIG5hbWVzcGFjZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5zcCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5zcGFtJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZW1lLmVnZycpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLm1ybygnLCAnQ29tcGxldGVNZS5zcGFtJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLl8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUuX2hhbSddKQorICAgICAgICBtYXRjaGVzID0gc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLl9fJykKKyAgICAgICAgZm9yIHggaW4gbWF0Y2hlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LnN0YXJ0c3dpdGgoJ0NvbXBsZXRlTWUuX18nKSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25hbWVfXycsIG1hdGNoZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0NvbXBsZXRlTWUuX19uZXdfXygnLCBtYXRjaGVzKQogCi0gICAgICAgIENvbXBsZXRlTWUubWUgPSBDb21wbGV0ZU1lCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLm1lLm1lLnNwYW0nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ2VnZy5zJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQorICAgICAgICB3aXRoIHBhdGNoLm9iamVjdChDb21wbGV0ZU1lLCAibWUiLCBDb21wbGV0ZU1lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5tZS5tZS5zcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ2VnZy5zJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZWdnLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCiAKICAgICBkZWYgdGVzdF9leGNlc3NpdmVfZ2V0YXR0cihzZWxmKToKICAgICAgICAgIyBFbnN1cmUgZ2V0YXR0cigpIGlzIGludm9rZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIGF0dHJpYnV0ZQpAQCAtNzgsMTQgKzkzLDI3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdmLmInLCAwKSwgJ2YuYmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNhbGxzLCAxKQogCisgICAgZGVmIHRlc3RfdW5jcmVhdGVkX2F0dHIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlcyBsaWtlIHByb3BlcnRpZXMgYW5kIHNsb3RzIHNob3VsZCBiZSBjb21wbGV0ZWQgZXZlbiB3aGVuCisgICAgICAgICMgdGhleSBoYXZlbid0IGJlZW4gY3JlYXRlZCBvbiBhbiBpbnN0YW5jZQorICAgICAgICBjbGFzcyBGb286CisgICAgICAgICAgICBfX3Nsb3RzX18gPSAoImJhciIsKQorICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoZGljdChmPUZvbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuJywgMCksICdmLmJhcicpCisKICAgICBAdW5pdHRlc3QubW9jay5wYXRjaCgncmxjb21wbGV0ZXIuX3JlYWRsaW5lX2F2YWlsYWJsZScsIEZhbHNlKQogICAgIGRlZiB0ZXN0X2NvbXBsZXRlKHNlbGYpOgogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnJywgMCksICdcdCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMCksICdhbmQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhbicsIDApLCAnYW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FzJywgMiksICdhc3NlcnQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3BhJywgMCksICdwYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ0ZhJywgMCksICdGYWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDApLCAnZWxpZiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZWwnLCAxKSwgJ2Vsc2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHInLCAwKSwgJ3RyeTonKQogCiAgICAgZGVmIHRlc3RfZHVwbGljYXRlX2dsb2JhbHMoc2VsZik6CiAgICAgICAgIG5hbWVzcGFjZSA9IHsKQEAgLTk4LDkgKzEyNiwxMCBAQAogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIobmFtZXNwYWNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmFsc2UnLCAwKSwgJ0ZhbHNlJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDEpKSAgIyBObyBkdXBsaWNhdGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCcpCisgICAgICAgICMgU3BhY2Ugb3IgY29sb24gYWRkZWQgZHVlIHRvIGJlaW5nIGEgcmVzZXJ2ZWQga2V5d29yZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXNzZXJ0JywgMCksICdhc3NlcnQgJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5OicpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMSkpCiAgICAgICAgICMgTm8gb3BlbmluZyBicmFja2V0ICIoIiBiZWNhdXNlIHdlIG92ZXJyb2RlIHRoZSBidWlsdC1pbiBjbGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnbWVtb3J5dmlldycsIDApLCAnbWVtb3J5dmlldycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQppbmRleCBkMDEyNjZmLi43NmY0ZjdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKQEAgLTEsOCArMSw3IEBACiBpbXBvcnQgaW8KIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5yb2JvdHBhcnNlcgotZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IFVSTEVycm9yLCBIVFRQRXJyb3IKLWZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgogdHJ5OgpAQCAtMTIsNyArMTEsOCBAQAogCiAKIGNsYXNzIFJvYm90VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleD1Ob25lLCBwYXJzZXI9Tm9uZSwgdXJsPU5vbmUsIGdvb2Q9Tm9uZSwgYWdlbnQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLAorICAgICAgICAgICAgICAgICBhZ2VudD1Ob25lLCByZXF1ZXN0X3JhdGU9Tm9uZSwgY3Jhd2xfZGVsYXk9Tm9uZSk6CiAgICAgICAgICMgd29ya2Fyb3VuZCB0byBtYWtlIHVuaXR0ZXN0IGRpc2NvdmVyeSB3b3JrIChzZWUgIzE3MDY2KQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmRleCwgaW50KToKICAgICAgICAgICAgIHJldHVybgpAQCAtMjUsNiArMjUsOCBAQAogICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgICBzZWxmLmdvb2QgPSBnb29kCiAgICAgICAgIHNlbGYuYWdlbnQgPSBhZ2VudAorICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZSA9IHJlcXVlc3RfcmF0ZQorICAgICAgICBzZWxmLmNyYXdsX2RlbGF5ID0gY3Jhd2xfZGVsYXkKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudXJsLCB0dXBsZSk6CkBAIC0zNCw2ICszNiwxOCBAQAogICAgICAgICAgICAgYWdlbnQgPSBzZWxmLmFnZW50CiAgICAgICAgIGlmIHNlbGYuZ29vZDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmNyYXdsX2RlbGF5KGFnZW50KSwgc2VsZi5jcmF3bF9kZWxheSkKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhY3R1YWwgdmFsdWVzIGZvciByZXF1ZXN0IHJhdGUKKyAgICAgICAgICAgIGlmIHNlbGYucmVxdWVzdF9yYXRlIGFuZCBzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkucmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlLnJlcXVlc3RzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkuc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUuc2Vjb25kcworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KSwgc2VsZi5yZXF1ZXN0X3JhdGUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKIApAQCAtNDMsMTUgKzU3LDE3IEBACiB0ZXN0cyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCiAKIGRlZiBSb2JvdFRlc3QoaW5kZXgsIHJvYm90c190eHQsIGdvb2RfdXJscywgYmFkX3VybHMsCi0gICAgICAgICAgICAgIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CisgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CiAKICAgICBsaW5lcyA9IGlvLlN0cmluZ0lPKHJvYm90c190eHQpLnJlYWRsaW5lcygpCiAgICAgcGFyc2VyID0gdXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCiAgICAgcGFyc2VyLnBhcnNlKGxpbmVzKQogICAgIGZvciB1cmwgaW4gZ29vZF91cmxzOgotICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAxLCBhZ2VudCkpCisgICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50LAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpKQogICAgIGZvciB1cmwgaW4gYmFkX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDAsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAKICMgRXhhbXBsZXMgZnJvbSBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvd2Mvbm9yb2JvdHMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCkBAIC02NSwxNCArODEsMTggQEAKIAogZ29vZCA9IFsnLycsJy90ZXN0Lmh0bWwnXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy90bXAveHh4JywnL2Zvby5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUKK2NyYXdsX2RlbGF5ID0gTm9uZQogCi1Sb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMi4KIGRvYyA9ICIiIgogIyByb2JvdHMudHh0IGZvciBodHRwOi8vd3d3LmV4YW1wbGUuY29tLwogCiBVc2VyLWFnZW50OiAqCitDcmF3bC1kZWxheTogMQorUmVxdWVzdC1yYXRlOiAzLzE1CiBEaXNhbGxvdzogL2N5YmVyd29ybGQvbWFwLyAjIFRoaXMgaXMgYW4gaW5maW5pdGUgdmlydHVhbCBVUkwgc3BhY2UKIAogIyBDeWJlcm1hcHBlciBrbm93cyB3aGVyZSB0byBnby4KQEAgLTgzLDggKzEwMywxMCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCcsKCdjeWJlcm1hcHBlcicsJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJyldCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgVGhlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVxdWFsIHRvIE5vbmUgc2luY2UgdGhleQorY3Jhd2xfZGVsYXkgPSBOb25lICAgIyBkb24ndCBhcHBseSB0byB0aGUgY3liZXJtYXBwZXIgdXNlciBhZ2VudAogCi1Sb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMy4KIGRvYyA9ICIiIgpAQCAtOTUsMTQgKzExNywxOCBAQAogCiBnb29kID0gW10KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnLCcvJywnL3RtcC8nXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy1yZmMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCiAjIDQuCiBkb2MgPSAiIiIKIFVzZXItYWdlbnQ6IGZpZ3RyZWUKK0NyYXdsLWRlbGF5OiAzCitSZXF1ZXN0LXJhdGU6IDkvMzAKIERpc2FsbG93OiAvdG1wCiBEaXNhbGxvdzogL2ElM2NkLmh0bWwKIERpc2FsbG93OiAvYSUyZmIuaHRtbApAQCAtMTE1LDggKzE0MSwxNyBAQAogICAgICAgICcvfmpvZS9pbmRleC5odG1sJwogICAgICAgIF0KIAotUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCAnZmlndHJlZScpCi1Sb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsICdGaWdUcmVlIFJvYm90IGxpYnd3dy1wZXJsLzUuMDQnKQorcmVxdWVzdF9yYXRlID0gbmFtZWR0dXBsZSgncmVxX3JhdGUnLCAncmVxdWVzdHMgc2Vjb25kcycpCityZXF1ZXN0X3JhdGUucmVxdWVzdHMgPSA5CityZXF1ZXN0X3JhdGUuc2Vjb25kcyA9IDMwCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZV9iYWQgPSBOb25lICAjIG5vdCBhY3R1YWxseSB0ZXN0ZWQsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHBhcnNlIGl0CitjcmF3bF9kZWxheV9iYWQgPSBOb25lICAjIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisKKworUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5LCAnZmlndHJlZScgKQorUm9ib3RUZXN0KDUsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGVfYmFkLCBjcmF3bF9kZWxheV9iYWQsCisgICAgICAgICAgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCiAKICMgNi4KIGRvYyA9ICIiIgpAQCAtMTI1LDE0ICsxNjAsMTggQEAKIERpc2FsbG93OiAvYSUzQ2QuaHRtbAogRGlzYWxsb3c6IC9hL2IuaHRtbAogRGlzYWxsb3c6IC8lN2Vqb2UvaW5kZXguaHRtbAorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvdG1wJyxdICMgWEZBSUw6ICcvYSUyZmIuaHRtbCcKIGJhZCA9IFsnL3RtcC8nLCcvdG1wL2EuaHRtbCcsCiAgICAgICAgJy9hJTNjZC5odG1sJywnL2ElM0NkLmh0bWwnLCIvYS9iLmh0bWwiLAogICAgICAgICcvJTdFam9lL2luZGV4Lmh0bWwnXQorY3Jhd2xfZGVsYXkgPSAzCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIHNpbmNlIHJlcXVlc3QgcmF0ZSBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBOb25lCiAKLVJvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyBGcm9tIGJ1ZyByZXBvcnQgIzUyMzA0MQogCkBAIC0xNDAsMTIgKzE3OSwxNiBAQAogZG9jID0gIiIiCiBVc2VyLUFnZW50OiAqCiBEaXNhbGxvdzogLy4KK0NyYXdsLWRlbGF5OiBwZWFycwogIiIiCiAKIGdvb2QgPSBbJy9mb28uaHRtbCddCi1iYWQgPSBbXSAjIEJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKK2JhZCA9IFtdICAjIGJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKIAotUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkKQorY3Jhd2xfZGVsYXkgPSBOb25lICAjIHNpbmNlIGNyYXdsIGRlbGF5IGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUKKworUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlKQogCiAjIEZyb20gR29vZ2xlOiBodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC93ZWJtYXN0ZXJzL2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW5zd2VyPTQwMzY0CiAKQEAgLTE1NCwxMiArMTk3LDE1IEBACiBVc2VyLWFnZW50OiBHb29nbGVib3QKIEFsbG93OiAvZm9sZGVyMS9teWZpbGUuaHRtbAogRGlzYWxsb3c6IC9mb2xkZXIxLworUmVxdWVzdC1yYXRlOiB3aGFsZS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQorY3Jhd2xfZGVsYXkgPSBOb25lCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIGludmFsaWQgc3ludGF4LCByZXR1cm4gbm9uZQogCi1Sb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDgsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlLCBhZ2VudD0iR29vZ2xlYm90IikKIAogIyA5LiAgVGhpcyBmaWxlIGlzIGluY29ycmVjdCBiZWNhdXNlICJHb29nbGVib3QiIGlzIGEgc3Vic3RyaW5nIG9mCiAjICAgICAiR29vZ2xlYm90LU1vYmlsZSIsIHNvIHRlc3QgMTAgd29ya3MganVzdCBsaWtlIHRlc3QgOS4KQEAgLTE3NCwxMiArMjIwLDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDksIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAjIDExLiAgR2V0IHRoZSBvcmRlciBjb3JyZWN0LgogZG9jID0gIiIiCkBAIC0xOTMsMTIgKzIzOSwxMiBAQAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDExLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogYmFkID0gW10KIAotUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAKICMgMTMuICBHb29nbGUgYWxzbyBnb3QgdGhlIG9yZGVyIHdyb25nIGluICM4LiAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUKQEAgLTIxMiw3ICsyNTgsNyBAQAogZ29vZCA9IFsnL2ZvbGRlcjEvbXlmaWxlLmh0bWwnXQogYmFkID0gWycvZm9sZGVyMS9hbm90aGVyZmlsZS5odG1sJ10KIAotUm9ib3RUZXN0KDEzLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Imdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iZ29vZ2xlYm90IikKIAogCiAjIDE0LiBGb3IgaXNzdWUgIzYzMjUgKHF1ZXJ5IHN0cmluZyBzdXBwb3J0KQpAQCAtMjI0LDcgKzI3MCw3IEBACiBnb29kID0gWycvc29tZS9wYXRoJ10KIGJhZCA9IFsnL3NvbWUvcGF0aD9uYW1lPXZhbHVlJ10KIAotUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNCwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTUuIEZvciBpc3N1ZSAjNDEwOCAob2JleSBmaXJzdCAqIGVudHJ5KQogZG9jID0gIiIiCkBAIC0yMzgsNyArMjg0LDcgQEAKIGdvb2QgPSBbJy9hbm90aGVyL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoJ10KIAotUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTYuIEVtcHR5IHF1ZXJ5IChpc3N1ZSAjMTc0MDMpLiBOb3JtYWxpemluZyB0aGUgdXJsIGZpcnN0LgogZG9jID0gIiIiCkBAIC0yNTAsNyArMjk2LDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGg/J10KIGJhZCA9IFsnL2Fub3RoZXIvcGF0aD8nXQogCi1Sb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogCiBjbGFzcyBSb2JvdEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5IGIvTGliL3Rlc3QvdGVzdF9zY2hlZC5weQppbmRleCBmZThlNzg1Li5mODZmNTk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NoZWQucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgc2NoZWQKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsMTIzIEBACisiIiJUZXN0IHRoZSBzZWNyZXRzIG1vZHVsZS4KKworQXMgbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGluIHNlY3JldHMgYXJlIHRoaW4gd3JhcHBlcnMgYXJvdW5kIGZ1bmN0aW9ucworZGVmaW5lZCBlbHNld2hlcmUsIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGVtIGV4aGF1c3RpdmVseS4KKyIiIgorCisKK2ltcG9ydCBzZWNyZXRzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJpbmcKKworCisjID09PSBVbml0IHRlc3RzID09PQorCitjbGFzcyBDb21wYXJlX0RpZ2VzdF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0IGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfZXF1YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wYXJlX2RpZ2VzdCBmdW5jdGlvbmFsaXR5IHdpdGggZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgZm9yIHMgaW4gKCJhIiwgImJjZCIsICJ4eXoxMjMiKToKKyAgICAgICAgICAgIGEgPSBzKjEwMAorICAgICAgICAgICAgYiA9IHMqMTAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEuZW5jb2RlKCd1dGYtOCcpLCBiLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICBkZWYgdGVzdF91bmVxdWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29tcGFyZV9kaWdlc3QgZnVuY3Rpb25hbGl0eSB3aXRoIHVuZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoYiJhYmMiLCBiImFiY2QiKSkKKyAgICAgICAgZm9yIHMgaW4gKCJ4IiwgIm1uIiwgImExYjJjMyIpOgorICAgICAgICAgICAgYSA9IHMqMTAwICsgInEiCisgICAgICAgICAgICBiID0gcyoxMDAgKyAiayIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLmVuY29kZSgndXRmLTgnKSwgYi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgZGVmIHRlc3RfYmFkX3R5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjb21wYXJlX2RpZ2VzdCByYWlzZXMgd2l0aCBtaXhlZCB0eXBlcy4KKyAgICAgICAgYSA9ICdhYmNkZScKKyAgICAgICAgYiA9IGEuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGEsIHN0cikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYiwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VjcmV0cy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0LCBiLCBhKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgY29tcGFyZV9kaWdlc3QgcmV0dXJucyBhIGJvb2wuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjIiksIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAieHl6IiksIGJvb2wpCisKKworY2xhc3MgUmFuZG9tX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHdyYXBwZXJzIGFyb3VuZCBTeXN0ZW1SYW5kb20gbWV0aG9kcy4iIiIKKworICAgIGRlZiB0ZXN0X3JhbmRiaXRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJpdHMuCisgICAgICAgIGVycm1zZyA9ICJyYW5kYml0cyglZCkgcmV0dXJuZWQgJWQiCisgICAgICAgIGZvciBudW1iaXRzIGluICgzLCAxMiwgMzApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICAgICAgbiA9IHNlY3JldHMucmFuZGJpdHMobnVtYml0cykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBuIDwgMioqbnVtYml0cywgZXJybXNnICUgKG51bWJpdHMsIG4pKQorCisgICAgZGVmIHRlc3RfY2hvaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2hvaWNlLgorICAgICAgICBpdGVtcyA9IFsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0XQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jaG9pY2UoaXRlbXMpIGluIGl0ZW1zKQorCisgICAgZGVmIHRlc3RfcmFuZGJlbG93KHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJlbG93LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCAxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlY3JldHMucmFuZGJlbG93KGkpLCByYW5nZShpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VjcmV0cy5yYW5kYmVsb3csIDApCisKKworY2xhc3MgVG9rZW5fVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdG9rZW4gZnVuY3Rpb25zLiIiIgorCisgICAgZGVmIHRlc3RfdG9rZW5fZGVmYXVsdHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRva2VuXyogZnVuY3Rpb25zIGhhbmRsZSBkZWZhdWx0IHNpemUgY29ycmVjdGx5LgorICAgICAgICBmb3IgZnVuYyBpbiAoc2VjcmV0cy50b2tlbl9ieXRlcywgc2VjcmV0cy50b2tlbl9oZXgsCisgICAgICAgICAgICAgICAgICAgICBzZWNyZXRzLnRva2VuX3VybHNhZmUpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBuYW1lID0gZnVuYy5fX25hbWVfXworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoTm9uZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBOb25lIiAlIG5hbWUpCisgICAgICAgIHNpemUgPSBzZWNyZXRzLkRFRkFVTFRfRU5UUk9QWQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKE5vbmUpKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VjcmV0cy50b2tlbl9oZXgoTm9uZSkpLCAyKnNpemUpCisKKyAgICBkZWYgdGVzdF90b2tlbl9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2J5dGVzLgorICAgICAgICBmb3IgbiBpbiAoMSwgOCwgMTcsIDEwMCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLnRva2VuX2J5dGVzKG4pLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKG4pKSwgbikKKworICAgIGRlZiB0ZXN0X3Rva2VuX2hleChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2hleC4KKyAgICAgICAgZm9yIG4gaW4gKDEsIDEyLCAyNSwgOTApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzID0gc2VjcmV0cy50b2tlbl9oZXgobikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAyKm4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIHN0cmluZy5oZXhkaWdpdHMgZm9yIGMgaW4gcykpCisKKyAgICBkZWYgdGVzdF90b2tlbl91cmxzYWZlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5fdXJsc2FmZS4KKyAgICAgICAgbGVnYWwgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnLV8nCisgICAgICAgIGZvciBuIGluICgxLCAxMSwgMjgsIDc2KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcyA9IHNlY3JldHMudG9rZW5fdXJsc2FmZShuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIGxlZ2FsIGZvciBjIGluIHMpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDFhNDllZGYuLjQ5YWJmYjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC02LDEwICs2LDExIEBACiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZSwgc2h1ZmZsZQotaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBzdHJpbmcKIAogY2xhc3MgUGFzc1RocnUoRXhjZXB0aW9uKToKICAgICBwYXNzCkBAIC03MTQsNiArNzE1LDI4IEBACiAgICAgICAgICAgICBhZGRoYXNodmFsdWUoaGFzaChmcm96ZW5zZXQoW2UgZm9yIGUsIG0gaW4gZWxlbW1hc2tzIGlmIG0maV0pKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaGFzaHZhbHVlcyksIDIqKm4pCiAKKyAgICAgICAgZGVmIGxldHRlcl9yYW5nZShuKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuYXNjaWlfbGV0dGVyc1s6bl0KKworICAgICAgICBkZWYgemZfcmFuZ2Uobik6CisgICAgICAgICAgICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NldC10aGVvcmV0aWNfZGVmaW5pdGlvbl9vZl9uYXR1cmFsX251bWJlcnMKKyAgICAgICAgICAgIG51bXMgPSBbZnJvemVuc2V0KCldCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuLTEpOgorICAgICAgICAgICAgICAgIG51bSA9IGZyb3plbnNldChudW1zKQorICAgICAgICAgICAgICAgIG51bXMuYXBwZW5kKG51bSkKKyAgICAgICAgICAgIHJldHVybiBudW1zWzpuXQorCisgICAgICAgIGRlZiBwb3dlcnNldChzKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzKSsxKToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIG1hcChmcm96ZW5zZXQsIGl0ZXJ0b29scy5jb21iaW5hdGlvbnMocywgaSkpCisKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMTgpOgorICAgICAgICAgICAgdCA9IDIgKiogbgorICAgICAgICAgICAgbWFzayA9IHQgLSAxCisgICAgICAgICAgICBmb3IgbnVtcyBpbiAocmFuZ2UsIGxldHRlcl9yYW5nZSwgemZfcmFuZ2UpOgorICAgICAgICAgICAgICAgIHUgPSBsZW4oe2ggJiBtYXNrIGZvciBoIGluIG1hcChoYXNoLCBwb3dlcnNldChudW1zKG4pKSl9KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcig0KnUsIHQpCisKIGNsYXNzIEZyb3plblNldFN1YmNsYXNzKGZyb3plbnNldCk6CiAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NobGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9zaGxleC5weQppbmRleCA1NWI1MzNkLi4zOTM2Yzk3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NobGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2hsZXgucHkKQEAgLTE3MywxNiArMTczLDExNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRhdGFbaV1bMF0sIGwsIHNlbGYuZGF0YVtpXVsxOl0pKQogCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdEFtcGVyc2FuZEFuZFBpcGUoc2VsZik6CisgICAgICAgICIiIlRlc3QgaGFuZGxpbmcgb2Ygc3ludGF4IHNwbGl0dGluZyBvZiAmLCB8IiIiCisgICAgICAgICMgQ291bGQgdGFrZSB0aGVzZSBmb3JtczogJiYsICYsIHwmLCA7JiwgOzsmCisgICAgICAgICMgb2YgY291cnNlLCB0aGUgc2FtZSBhcHBsaWVzIHRvIHwgYW5kIHx8CisgICAgICAgICMgdGhlc2Ugc2hvdWxkIGFsbCBwYXJzZSB0byB0aGUgc2FtZSBvdXRwdXQKKyAgICAgICAgZm9yIGRlbGltaXRlciBpbiAoJyYmJywgJyYnLCAnfCYnLCAnOyYnLCAnOzsmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3x8JywgJ3wnLCAnJnwnLCAnO3wnLCAnOzt8Jyk6CisgICAgICAgICAgICBzcmMgPSBbJ2VjaG8gaGkgJXMgZWNobyBieWUnICUgZGVsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICdlY2hvIGhpJXNlY2hvIGJ5ZScgJSBkZWxpbWl0ZXJdCisgICAgICAgICAgICByZWYgPSBbJ2VjaG8nLCAnaGknLCBkZWxpbWl0ZXIsICdlY2hvJywgJ2J5ZSddCisgICAgICAgICAgICBmb3Igc3MgaW4gc3JjOgorICAgICAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdFNlbWljb2xvbihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBoYW5kbGluZyBvZiBzeW50YXggc3BsaXR0aW5nIG9mIDsiIiIKKyAgICAgICAgIyBDb3VsZCB0YWtlIHRoZXNlIGZvcm1zOiA7LCA7OywgOyYsIDs7JgorICAgICAgICAjIHRoZXNlIHNob3VsZCBhbGwgcGFyc2UgdG8gdGhlIHNhbWUgb3V0cHV0CisgICAgICAgIGZvciBkZWxpbWl0ZXIgaW4gKCc7JywgJzs7JywgJzsmJywgJzs7JicpOgorICAgICAgICAgICAgc3JjID0gWydlY2hvIGhpICVzIGVjaG8gYnllJyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzIGVjaG8gYnllJyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzZWNobyBieWUnICUgZGVsaW1pdGVyXQorICAgICAgICAgICAgcmVmID0gWydlY2hvJywgJ2hpJywgZGVsaW1pdGVyLCAnZWNobycsICdieWUnXQorICAgICAgICAgICAgZm9yIHNzIGluIHNyYzoKKyAgICAgICAgICAgICAgICBzID0gc2hsZXguc2hsZXgoc3MsIHB1bmN0dWF0aW9uX2NoYXJzPVRydWUpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmLCByZXN1bHQsICJXaGlsZSBzcGxpdHRpbmcgJyVzJyIgJSBzcykKKworICAgIGRlZiB0ZXN0U3ludGF4U3BsaXRSZWRpcmVjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBoYW5kbGluZyBvZiBzeW50YXggc3BsaXR0aW5nIG9mID4iIiIKKyAgICAgICAgIyBvZiBjb3Vyc2UsIHRoZSBzYW1lIGFwcGxpZXMgdG8gPCwgfAorICAgICAgICAjIHRoZXNlIHNob3VsZCBhbGwgcGFyc2UgdG8gdGhlIHNhbWUgb3V0cHV0CisgICAgICAgIGZvciBkZWxpbWl0ZXIgaW4gKCc8JywgJ3wnKToKKyAgICAgICAgICAgIHNyYyA9IFsnZWNobyBoaSAlcyBvdXQnICUgZGVsaW1pdGVyLAorICAgICAgICAgICAgICAgICAgICdlY2hvIGhpJXMgb3V0JyAlIGRlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgICAnZWNobyBoaSVzb3V0JyAlIGRlbGltaXRlcl0KKyAgICAgICAgICAgIHJlZiA9IFsnZWNobycsICdoaScsIGRlbGltaXRlciwgJ291dCddCisgICAgICAgICAgICBmb3Igc3MgaW4gc3JjOgorICAgICAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RTeW50YXhTcGxpdFBhcmVuKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGhhbmRsaW5nIG9mIHN5bnRheCBzcGxpdHRpbmcgb2YgKCkiIiIKKyAgICAgICAgIyB0aGVzZSBzaG91bGQgYWxsIHBhcnNlIHRvIHRoZSBzYW1lIG91dHB1dAorICAgICAgICBzcmMgPSBbJyggZWNobyBoaSApJywKKyAgICAgICAgICAgICAgICcoZWNobyBoaSknXQorICAgICAgICByZWYgPSBbJygnLCAnZWNobycsICdoaScsICcpJ10KKyAgICAgICAgZm9yIHNzIGluIHNyYzoKKyAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleChzcywgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGxpc3QocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmLCByZXN1bHQsICJXaGlsZSBzcGxpdHRpbmcgJyVzJyIgJSBzcykKKworICAgIGRlZiB0ZXN0U3ludGF4U3BsaXRDdXN0b20oc2VsZik6CisgICAgICAgICIiIlRlc3QgaGFuZGxpbmcgb2Ygc3ludGF4IHNwbGl0dGluZyB3aXRoIGN1c3RvbSBjaGFycyIiIgorICAgICAgICByZWYgPSBbJ34vYScsICcmJywgJyYnLCAnYi1jJywgJy0tY29sb3I9YXV0bycsICd8fCcsICdkJywgJyoucHk/J10KKyAgICAgICAgc3MgPSAifi9hICYmIGItYyAtLWNvbG9yPWF1dG8gfHwgZCAqLnB5PyIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KHNzLCBwdW5jdHVhdGlvbl9jaGFycz0ifCIpCisgICAgICAgIHJlc3VsdCA9IGxpc3QocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWYsIHJlc3VsdCwgIldoaWxlIHNwbGl0dGluZyAnJXMnIiAlIHNzKQorCisgICAgZGVmIHRlc3RUb2tlblR5cGVzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgdG9rZW5zIGFyZSBzcGxpdCB3aXRoIHR5cGVzIGFzIGV4cGVjdGVkLiIiIgorICAgICAgICBmb3Igc291cmNlLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYSAmJiBiIHx8IGMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsICdhJyksICgnJiYnLCAnYycpLCAoJ2InLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnfHwnLCAnYycpLCAoJ2MnLCAnYScpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgcyA9IHNobGV4LnNobGV4KHNvdXJjZSwgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKKyAgICAgICAgICAgIG9ic2VydmVkID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdCA9IHMuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBpZiB0ID09IHMuZW9mOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHRbMF0gaW4gcy5wdW5jdHVhdGlvbl9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgdHQgPSAnYycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0dCA9ICdhJworICAgICAgICAgICAgICAgIG9ic2VydmVkLmFwcGVuZCgodCwgdHQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYnNlcnZlZCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdFB1bmN0dWF0aW9uSW5Xb3JkQ2hhcnMoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbnkgcHVuY3R1YXRpb24gY2hhcnMgYXJlIHJlbW92ZWQgZnJvbSB3b3JkY2hhcnMiIiIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhX2JfX2MnLCBwdW5jdHVhdGlvbl9jaGFycz0nXycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ18nLCBzLndvcmRjaGFycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMpLCBbJ2EnLCAnXycsICdiJywgJ19fJywgJ2MnXSkKKworICAgIGRlZiB0ZXN0UHVuY3R1YXRpb25XaXRoV2hpdGVzcGFjZVNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgd2l0aCB3aGl0ZXNwYWNlX3NwbGl0LCBiZWhhdmlvdXIgaXMgYXMgZXhwZWN0ZWQiIiIKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhICAmJiBiICB8fCAgYycsIHB1bmN0dWF0aW9uX2NoYXJzPScmJykKKyAgICAgICAgIyB3aGl0ZXNwYWNlX3NwbGl0IGlzIEZhbHNlLCBzbyBzcGxpdHRpbmcgd2lsbCBiZSBiYXNlZCBvbgorICAgICAgICAjIHB1bmN0dWF0aW9uX2NoYXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzKSwgWydhJywgJyYmJywgJ2InLCAnfCcsICd8JywgJ2MnXSkKKyAgICAgICAgcyA9IHNobGV4LnNobGV4KCdhICAmJiBiICB8fCAgYycsIHB1bmN0dWF0aW9uX2NoYXJzPScmJykKKyAgICAgICAgcy53aGl0ZXNwYWNlX3NwbGl0ID0gVHJ1ZQorICAgICAgICAjIHdoaXRlc3BhY2Vfc3BsaXQgaXMgVHJ1ZSwgc28gc3BsaXR0aW5nIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgICAgIyB3aGl0ZSBzcGFjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocyksIFsnYScsICcmJicsICdiJywgJ3x8JywgJ2MnXSkKKwogICAgIGRlZiB0ZXN0RW1wdHlTdHJpbmdIYW5kbGluZyhzZWxmKToKICAgICAgICAgIiIiVGVzdCB0aGF0IHBhcnNpbmcgb2YgZW1wdHkgc3RyaW5ncyBpcyBjb3JyZWN0bHkgaGFuZGxlZC4iIiIKICAgICAgICAgIyBzZWUgSXNzdWUgIzIxOTk5CiAgICAgICAgIGV4cGVjdGVkID0gWycnLCAnKScsICdhYmMnXQotCi0gICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcG9zaXg9VHJ1ZSkKLSAgICAgICAgc2xpc3QgPSBsaXN0KHMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpc3QsIGV4cGVjdGVkKQorICAgICAgICBmb3IgcHVuY3QgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcG9zaXg9VHJ1ZSwgcHVuY3R1YXRpb25fY2hhcnM9cHVuY3QpCisgICAgICAgICAgICBzbGlzdCA9IGxpc3QocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpc3QsIGV4cGVjdGVkKQogICAgICAgICBleHBlY3RlZCA9IFsiJyciLCAnKScsICdhYmMnXQotICAgICAgICBzID0gc2hsZXguc2hsZXgoIicnKWFiYyIpCisgICAgICAgIHMgPSBzaGxleC5zaGxleCgiJycpYWJjIiwgcHVuY3R1YXRpb25fY2hhcnM9VHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMpLCBleHBlY3RlZCkKIAogICAgIGRlZiB0ZXN0UXVvdGUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CmluZGV4IDFkNWUwMWEuLjkwYTMxZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CkBAIC0xMzA2LDEwICsxMzA2LDEwIEBACiAgICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUpCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvcik6Ci0gICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsIHVzZXI9J25vbi1leGlzaW5nIHVzZXJuYW1lJykKKyAgICAgICAgICAgIHNodXRpbC5jaG93bihmaWxlbmFtZSwgdXNlcj0nbm9uLWV4aXN0aW5nIHVzZXJuYW1lJykKIAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yKToKLSAgICAgICAgICAgIHNodXRpbC5jaG93bihmaWxlbmFtZSwgZ3JvdXA9J25vbi1leGlzaW5nIGdyb3VwbmFtZScpCisgICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsIGdyb3VwPSdub24tZXhpc3RpbmcgZ3JvdXBuYW1lJykKIAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBzaHV0aWwuY2hvd24oZmlsZW5hbWUsIGInc3BhbScpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CmluZGV4IDFiODBmZjAuLmFiNDJlZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CkBAIC0yMiwyOSArMjIsNiBAQAogICAgIF90ZXN0Y2FwaSA9IE5vbmUKIAogCi1jbGFzcyBIYW5kbGVyQkNhbGxlZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1kZWYgZXhpdF9zdWJwcm9jZXNzKCk6Ci0gICAgIiIiVXNlIG9zLl9leGl0KDApIHRvIGV4aXQgdGhlIGN1cnJlbnQgc3VicHJvY2Vzcy4KLQotICAgIE90aGVyd2lzZSwgdGhlIHRlc3QgY2F0Y2hlcyB0aGUgU3lzdGVtRXhpdCBhbmQgY29udGludWVzIGV4ZWN1dGluZwotICAgIGluIHBhcmFsbGVsIHdpdGggdGhlIG9yaWdpbmFsIHRlc3QsIHNvIHlvdSB3aW5kIHVwIHdpdGggYW4KLSAgICBleHBvbmVudGlhbCBudW1iZXIgb2YgdGVzdHMgcnVubmluZyBjb25jdXJyZW50bHkuCi0gICAgIiIiCi0gICAgb3MuX2V4aXQoMCkKLQotCi1kZWYgaWdub3JpbmdfZWludHIoX19mdW5jLCAqYXJncywgKiprd2FyZ3MpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIF9fZnVuYygqYXJncywgKiprd2FyZ3MpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIHJldHVybiBOb25lCi0KLQogY2xhc3MgR2VuZXJpY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEB1bml0dGVzdC5za2lwSWYodGhyZWFkaW5nIGlzIE5vbmUsICJ0ZXN0IG5lZWRzIHRocmVhZGluZyBtb2R1bGUiKQpAQCAtNjMsMTQ1ICs0MCw2IEBACiAKIAogQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKLWNsYXNzIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBNQVhfRFVSQVRJT04gPSAyMCAgICMgRW50aXJlIHRlc3Qgc2hvdWxkIGxhc3QgYXQgbW9zdCAyMCBzZWMuCi0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudXNpbmdfZ2MgPSBnYy5pc2VuYWJsZWQoKQotICAgICAgICBnYy5kaXNhYmxlKCkKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi51c2luZ19nYzoKLSAgICAgICAgICAgIGdjLmVuYWJsZSgpCi0KLSAgICBkZWYgZm9ybWF0X2ZyYW1lKHNlbGYsIGZyYW1lLCBsaW1pdD1Ob25lKToKLSAgICAgICAgcmV0dXJuICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9zdGFjayhmcmFtZSwgbGltaXQ9bGltaXQpKQotCi0gICAgZGVmIGhhbmRsZXJBKHNlbGYsIHNpZ251bSwgZnJhbWUpOgotICAgICAgICBzZWxmLmFfY2FsbGVkID0gVHJ1ZQotCi0gICAgZGVmIGhhbmRsZXJCKHNlbGYsIHNpZ251bSwgZnJhbWUpOgotICAgICAgICBzZWxmLmJfY2FsbGVkID0gVHJ1ZQotICAgICAgICByYWlzZSBIYW5kbGVyQkNhbGxlZChzaWdudW0sIHNlbGYuZm9ybWF0X2ZyYW1lKGZyYW1lKSkKLQotICAgIGRlZiB3YWl0KHNlbGYsIGNoaWxkKToKLSAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgdG8gZmluaXNoLCBpZ25vcmluZyBFSU5UUi4iIiIKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBjaGlsZC53YWl0KCkKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLQotICAgIGRlZiBydW5fdGVzdChzZWxmKToKLSAgICAgICAgIyBJbnN0YWxsIGhhbmRsZXJzLiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gYSBzdWItcHJvY2Vzcywgc28gd2UKLSAgICAgICAgIyBkb24ndCB3b3JyeSBhYm91dCByZS1zZXR0aW5nIHRoZSBkZWZhdWx0IGhhbmRsZXJzLgotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuaGFuZGxlckEpCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNlbGYuaGFuZGxlckIpCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjIsIHNpZ25hbC5TSUdfSUdOKQotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKLQotICAgICAgICAjIFZhcmlhYmxlcyB0aGUgc2lnbmFscyB3aWxsIG1vZGlmeToKLSAgICAgICAgc2VsZi5hX2NhbGxlZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuYl9jYWxsZWQgPSBGYWxzZQotCi0gICAgICAgICMgTGV0IHRoZSBzdWItcHJvY2Vzc2VzIGtub3cgd2hvIHRvIHNlbmQgc2lnbmFscyB0by4KLSAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKLQotICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctSFVQJywgc3RyKHBpZCldKQotICAgICAgICBpZiBjaGlsZDoKLSAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFfY2FsbGVkOgotICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkgICMgR2l2ZSB0aGUgc2lnbmFsIHRpbWUgdG8gYmUgZGVsaXZlcmVkLgotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hX2NhbGxlZCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmJfY2FsbGVkKQotICAgICAgICBzZWxmLmFfY2FsbGVkID0gRmFsc2UKLQotICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2lnbmFsIGlzbid0IGRlbGl2ZXJlZCB3aGlsZSB0aGUgcHJldmlvdXMKLSAgICAgICAgIyBQb3BlbiBvYmplY3QgaXMgYmVpbmcgZGVzdHJveWVkLCBiZWNhdXNlIF9fZGVsX18gc3dhbGxvd3MKLSAgICAgICAgIyBleGNlcHRpb25zLgotICAgICAgICBkZWwgY2hpbGQKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY2hpbGQgPSBzdWJwcm9jZXNzLlBvcGVuKFsna2lsbCcsICctVVNSMScsIHN0cihwaWQpXSkKLSAgICAgICAgICAgICMgVGhpcyB3YWl0IHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgc2lnbmFsJ3MgZXhjZXB0aW9uLgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKQotICAgICAgICAgICAgdGltZS5zbGVlcCgxKSAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBiZSBkZWxpdmVyZWQuCi0gICAgICAgICAgICBzZWxmLmZhaWwoJ0hhbmRsZXJCQ2FsbGVkIGV4Y2VwdGlvbiBub3QgcmFpc2VkJykKLSAgICAgICAgZXhjZXB0IEhhbmRsZXJCQ2FsbGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYl9jYWxsZWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYV9jYWxsZWQpCi0KLSAgICAgICAgY2hpbGQgPSBpZ25vcmluZ19laW50cihzdWJwcm9jZXNzLlBvcGVuLCBbJ2tpbGwnLCAnLVVTUjInLCBzdHIocGlkKV0pCi0gICAgICAgIGlmIGNoaWxkOgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKSAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW4uCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCi0gICAgICAgICAgICAjIFRoZSByYWNlIGNvbmRpdGlvbiBpbiBwYXVzZSBkb2Vzbid0IG1hdHRlciBpbiB0aGlzIGNhc2UsCi0gICAgICAgICAgICAjIHNpbmNlIGFsYXJtIGlzIGdvaW5nIHRvIHJhaXNlIGEgS2V5Ym9hcmRFeGNlcHRpb24sIHdoaWNoCi0gICAgICAgICAgICAjIHdpbGwgc2tpcCB0aGUgY2FsbC4KLSAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCi0gICAgICAgICAgICAjIEJ1dCBpZiBhbm90aGVyIHNpZ25hbCBhcnJpdmVzIGJlZm9yZSB0aGUgYWxhcm0sIHBhdXNlCi0gICAgICAgICAgICAjIG1heSByZXR1cm4gZWFybHkuCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgc2VsZi5mYWlsKCJTb21lIG90aGVyIGV4Y2VwdGlvbiB3b2tlIHVzIGZyb20gcGF1c2U6ICVzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgicGF1c2UgcmV0dXJuZWQgb2YgaXRzIG93biBhY2NvcmQsIGFuZCB0aGUgc2lnbmFsIgotICAgICAgICAgICAgICAgICAgICAgICIgZGlkbid0IGFycml2ZSBhZnRlciBhbm90aGVyIHNlY29uZC4iKQotCi0gICAgIyBJc3N1ZSAzODY0LCB1bmtub3duIGlmIHRoaXMgYWZmZWN0cyBlYXJsaWVyIHZlcnNpb25zIG9mIGZyZWVic2QgYWxzbwotICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtPT0nZnJlZWJzZDYnLAotICAgICAgICAnaW50ZXIgcHJvY2VzcyBzaWduYWxzIG5vdCByZWxpYWJsZSAoZG8gbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSAnCi0gICAgICAgICdvbiBmcmVlYnNkNicpCi0gICAgZGVmIHRlc3RfbWFpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIHNwYXducyBhIGNoaWxkIHByb2Nlc3MgdG8gaW5zdWxhdGUgdGhlIG1haW4KLSAgICAgICAgIyB0ZXN0LXJ1bm5pbmcgcHJvY2VzcyBmcm9tIGFsbCB0aGUgc2lnbmFscy4gSXQgdGhlbgotICAgICAgICAjIGNvbW11bmljYXRlcyB3aXRoIHRoYXQgY2hpbGQgcHJvY2VzcyBvdmVyIGEgcGlwZSBhbmQKLSAgICAgICAgIyByZS1yYWlzZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGV4Y2VwdGlvbnMgdGhlIGNoaWxkCi0gICAgICAgICMgcmFpc2VzLiBUaGUgcmVhbCB3b3JrIGhhcHBlbnMgaW4gc2VsZi5ydW5fdGVzdCgpLgotICAgICAgICBvc19kb25lX3IsIG9zX2RvbmVfdyA9IG9zLnBpcGUoKQotICAgICAgICB3aXRoIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfciwgJ3JiJykpIGFzIGRvbmVfciwgXAotICAgICAgICAgICAgIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfdywgJ3diJykpIGFzIGRvbmVfdzoKLSAgICAgICAgICAgIGNoaWxkID0gb3MuZm9yaygpCi0gICAgICAgICAgICBpZiBjaGlsZCA9PSAwOgotICAgICAgICAgICAgICAgICMgSW4gdGhlIGNoaWxkIHByb2Nlc3M7IHJ1biB0aGUgdGVzdCBhbmQgcmVwb3J0IHJlc3VsdHMKLSAgICAgICAgICAgICAgICAjIHRocm91Z2ggdGhlIHBpcGUuCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBkb25lX3IuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAjIEhhdmUgdG8gY2xvc2UgZG9uZV93IGFnYWluIGhlcmUgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAjIGV4aXRfc3VicHJvY2VzcygpIHdpbGwgc2tpcCB0aGUgZW5jbG9zaW5nIHdpdGggYmxvY2suCi0gICAgICAgICAgICAgICAgICAgIHdpdGggY2xvc2luZyhkb25lX3cpOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKHRyYWNlYmFjay5mb3JtYXRfZXhjKCksIGRvbmVfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXAoTm9uZSwgZG9uZV93KQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1VoIG9oLCByYWlzZWQgZnJvbSBwaWNrbGUuJykKLSAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCi0gICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgZXhpdF9zdWJwcm9jZXNzKCkKLQotICAgICAgICAgICAgZG9uZV93LmNsb3NlKCkKLSAgICAgICAgICAgICMgQmxvY2sgZm9yIHVwIHRvIE1BWF9EVVJBVElPTiBzZWNvbmRzIGZvciB0aGUgdGVzdCB0byBmaW5pc2guCi0gICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbZG9uZV9yXSwgW10sIFtdLCBzZWxmLk1BWF9EVVJBVElPTikKLSAgICAgICAgICAgIGlmIGRvbmVfciBpbiByOgotICAgICAgICAgICAgICAgIHRiID0gcGlja2xlLmxvYWQoZG9uZV9yKQotICAgICAgICAgICAgICAgIGlmIHRiOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwodGIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG9zLmtpbGwoY2hpbGQsIHNpZ25hbC5TSUdLSUxMKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnVGVzdCBkZWFkbG9ja2VkIGFmdGVyICVkIHNlY29uZHMuJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTUFYX0RVUkFUSU9OKQotCi0KLUB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCiBjbGFzcyBQb3NpeFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdHJpdmlhbF9zaWduYWxfaGFuZGxlcihzZWxmLCAqYXJncyk6CiAgICAgICAgIHBhc3MKQEAgLTIyNCw2ICs2MiwxNSBAQAogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIGh1cCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdIVVApLCBodXApCiAKKyAgICAjIElzc3VlIDM4NjQsIHVua25vd24gaWYgdGhpcyBhZmZlY3RzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZnJlZWJzZCBhbHNvCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCisgICAgICAgICdpbnRlciBwcm9jZXNzIHNpZ25hbHMgbm90IHJlbGlhYmxlIChkbyBub3QgbWl4IHdlbGwgd2l0aCB0aHJlYWRpbmcpICcKKyAgICAgICAgJ29uIGZyZWVic2Q2JykKKyAgICBkZWYgdGVzdF9pbnRlcnByb2Nlc3Nfc2lnbmFsKHNlbGYpOgorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3NpZ25hbGludGVycHJvY3Rlc3Rlci5weScpCisgICAgICAgIGFzc2VydF9weXRob25fb2soc2NyaXB0KQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luZG93cyBzcGVjaWZpYyIpCiBjbGFzcyBXaW5kb3dzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CmluZGV4IGRhMjBhM2QuLmY2OTg5MjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBkZWYgdGVzdF9pbml0X3BhdGhpbmZvKHNlbGYpOgogICAgICAgICBkaXJfc2V0ID0gc2l0ZS5faW5pdF9wYXRoaW5mbygpCiAgICAgICAgIGZvciBlbnRyeSBpbiBbc2l0ZS5tYWtlcGF0aChwYXRoKVsxXSBmb3IgcGF0aCBpbiBzeXMucGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBhbmQgb3MucGF0aC5pc2RpcihwYXRoKV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmV4aXN0cyhwYXRoKV06CiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVudHJ5LCBkaXJfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZnJvbSBzeXMucGF0aCBub3QgZm91bmQgaW4gc2V0IHJldHVybmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IF9pbml0X3BhdGhpbmZvKCk6ICVzIiAlIChlbnRyeSwgZGlyX3NldCkpCkBAIC0yNDMsMTMgKzI0MywxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDIpCiAgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJy9MaWJyYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzFdLCB3YW50ZWQpCiAgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgICMgT1MgWCBub24tZnJhbXdld29yayBidWlsZHMsIExpbnV4LCBGcmVlQlNELCBldGMKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAxKQotICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdweXRob24nICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbiVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgd2FudGVkKQogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zbXRwZC5weSBiL0xpYi90ZXN0L3Rlc3Rfc210cGQucHkKaW5kZXggODhkYmZkZi4uM2VlYmU5NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbXRwZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5CkBAIC01MywxMCArNTMsNiBAQAogICAgICAgICB3cml0ZV9saW5lKGInREFUQScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHdyaXRlX2xpbmUsIGInc3BhbVxyXG4uXHJcbicpCiAKLSAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9kZWZhdWx0X3dhcm5zKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQotCiAgICAgZGVmIHRlc3RfZGVjb2RlX2RhdGFfYW5kX2VuYWJsZV9TTVRQVVRGOF9yYWlzZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAogICAgICAgICAgICAgVmFsdWVFcnJvciwKQEAgLTEwOCwxMCArMTA0LDkgQEAKICAgICAgICAgICAgICAiIiIpKQogCiAgICAgZGVmIHRlc3RfcHJvY2Vzc19tZXNzYWdlX3dpdGhfZGVjb2RlX2RhdGFfZmFsc2Uoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLkRlYnVnZ2luZ1NlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gc210cGQuRGVidWdnaW5nU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSkKICAgICAgICAgY29ubiwgYWRkciA9IHNlcnZlci5hY2NlcHQoKQotICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkcikKICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIHM6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZGF0YShjaGFubmVsLCBiJ0Zyb206IHRlc3RcblxuaFx4YzNceGE5bGxvXHhmZlxuJykKICAgICAgICAgc3Rkb3V0ID0gcy5nZXR2YWx1ZSgpCkBAIC0xNzUsMTMgKzE3MCwxMSBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydC5JUFY2X0VOQUJMRUQsICJJUHY2IG5vdCBlbmFibGVkIikKICAgICBkZWYgdGVzdF9zb2NrZXRfdXNlc19JUHY2KHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1R2NiwgMCksIChzdXBwb3J0LkhPU1QsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1R2NiwgMCksIChzdXBwb3J0LkhPU1QsIDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zb2NrZXQuZmFtaWx5LCBzb2NrZXQuQUZfSU5FVDYpCiAKICAgICBkZWYgdGVzdF9zb2NrZXRfdXNlc19JUHY0KHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoc3VwcG9ydC5IT1NUdjYsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoc3VwcG9ydC5IT1NUdjYsIDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zb2NrZXQuZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKIAogCkBAIC0yMDQsMTggKzE5NywxOCBAQAogICAgICAgICBjaGFubmVsLmhhbmRsZV9yZWFkKCkKIAogICAgIGRlZiB0ZXN0X3BhcmFtc19yZWplY3RlZChzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidNQUlMIGZyb206IDxmb29AZXhhbXBsZS5jb20+IHNpemU9MjAnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidSQ1BUIHRvOiA8Zm9vQGV4YW1wbGUuY29tPiBmb289YmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFubmVsLnNvY2tldC5sYXN0LCBzZWxmLmVycm9yX3Jlc3BvbnNlKQogCiAgICAgZGVmIHRlc3Rfbm90aGluZ19hY2NlcHRlZChzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidNQUlMIGZyb206IDxmb29AZXhhbXBsZS5jb20+IHNpemU9MjAnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidSQ1BUIHRvOiA8Zm9vQGV4YW1wbGUuY29tPicpCkBAIC0yNTcsOSArMjUwLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFubmVsLnNvY2tldC5sYXN0LCBiJzI1MCBPS1xyXG4nKQogCiAgICAgZGVmIHRlc3Rfd2l0aF9kZWNvZGVfZGF0YV9mYWxzZShzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBmb3IgbGluZSBpbiBbCiAgICAgICAgICAgICBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCBTTVRQVVRGOCcsCkBAIC03NjUsMTMgKzc1OCw2IEBACiAgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIERlcHJlY2F0aW9uV2FybmluZykpOgogICAgICAgICAgICAgc2VsZi5jaGFubmVsLl9TTVRQQ2hhbm5lbF9fYWRkciA9ICdzcGFtJwogCi0gICAgZGVmIHRlc3RfZGVjb2RlX2RhdGFfZGVmYXVsdF93YXJuaW5nKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlcnZlciA9IER1bW15U2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSkKLSAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQotCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzdXBwb3J0LklQVjZfRU5BQkxFRCwgIklQdjYgbm90IGVuYWJsZWQiKQogY2xhc3MgU01UUERDaGFubmVsSVB2NlRlc3QoU01UUERDaGFubmVsVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtODQ1LDEyICs4MzEsOSBAQAogICAgICAgICBzbXRwZC5zb2NrZXQgPSBhc3luY29yZS5zb2NrZXQgPSBtb2NrX3NvY2tldAogICAgICAgICBzZWxmLm9sZF9kZWJ1Z3N0cmVhbSA9IHNtdHBkLkRFQlVHU1RSRUFNCiAgICAgICAgIHNlbGYuZGVidWcgPSBzbXRwZC5ERUJVR1NUUkVBTSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgIyBTZXQgZGVjb2RlX2RhdGEgdG8gRmFsc2UKLSAgICAgICAgc2VsZi5jaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VsZi5zZXJ2ZXIsIGNvbm4sIGFkZHIsCi0gICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlbGYuY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlbGYuc2VydmVyLCBjb25uLCBhZGRyKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoKQpAQCAtMTAxNSw1ICs5OTgsMTYgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZShiJ3Rlc3RcclxuLicpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2hhbm5lbC5zb2NrZXQubGFzdFswOjNdLCBiJzI1MCcpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsKKyAgICAgICAgICAgICJwcm9ncmFtIiwgIkRldm51bGwiLCAiREVCVUdTVFJFQU0iLCAiTkVXTElORSIsICJDT01NQVNQQUNFIiwKKyAgICAgICAgICAgICJEQVRBX1NJWkVfREVGQVVMVCIsICJ1c2FnZSIsICJPcHRpb25zIiwgInBhcnNlYXJncyIsCisKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBzbXRwZCwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCA0YjA0N2VlLi5iMzYzMmU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTMsNyArMTMsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgYXJyYXkKLWltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IGNvbnRleHRsaWIKIGZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKIGltcG9ydCBzaWduYWwKQEAgLTY2LDEwICs2NSwyMiBAQAogICAgICAgICBzLmNsb3NlKCkKICAgICByZXR1cm4gVHJ1ZQogCitkZWYgX2hhdmVfc29ja2V0X2FsZygpOgorICAgICIiIkNoZWNrIHdoZXRoZXIgQUZfQUxHIHNvY2tldHMgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIGhvc3QuIiIiCisgICAgdHJ5OgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfQUxHLCBzb2NrZXQuU09DS19TRVFQQUNLRVQsIDApCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgT1NFcnJvcik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHMuY2xvc2UoKQorICAgIHJldHVybiBUcnVlCisKIEhBVkVfU09DS0VUX0NBTiA9IF9oYXZlX3NvY2tldF9jYW4oKQogCiBIQVZFX1NPQ0tFVF9SRFMgPSBfaGF2ZV9zb2NrZXRfcmRzKCkKIAorSEFWRV9TT0NLRVRfQUxHID0gX2hhdmVfc29ja2V0X2FsZygpCisKICMgU2l6ZSBpbiBieXRlcyBvZiB0aGUgaW50IHR5cGUKIFNJWkVPRl9JTlQgPSBhcnJheS5hcnJheSgiaSIpLml0ZW1zaXplCiAKQEAgLTExNjEsNiArMTE3MiwxNyBAQAogICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc29jay5zZW5kLCBiInNwYW0iKQogCisgICAgZGVmIHRlc3RDbG9zZUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrZXQuc29ja2V0KGZpbGVubz1zb2NrLmZpbGVubygpKS5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgICAgICAjIFdpbnNvY2sgYXBwYXJlbnRseSByYWlzZXMgRU5PVFNPQ0sKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXJyLmVycm5vLCAoZXJybm8uRUJBREYsIGVycm5vLkVOT1RTT0NLKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2xvc2UoKSBzaG91bGQgcmFpc2UgRUJBREYvRU5PVFNPQ0siKQorCiAgICAgZGVmIHRlc3ROZXdBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3RpbmcgLmZhbWlseSwgLnR5cGUgYW5kIC5wcm90b2NvbAogCkBAIC0xMjA3LDYgKzEyMjksMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5pb2N0bCwgLTEsIE5vbmUpCiAgICAgICAgIHMuaW9jdGwoc29ja2V0LlNJT19LRUVQQUxJVkVfVkFMUywgKDEsIDEwMCwgMTAwKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwgIldpbmRvd3Mgc3BlY2lmaWMiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdMb29wYmFjayBmYXN0IHBhdGggc3VwcG9ydCByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0JykKKyAgICBkZWYgdGVzdF9zaW9fbG9vcGJhY2tfZmFzdF9wYXRoKHNlbGYpOgorICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzLmlvY3RsKHNvY2tldC5TSU9fTE9PUEJBQ0tfRkFTVF9QQVRILCBUcnVlKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBXU0FFT1BOT1RTVVBQID0gMTAwNDUKKyAgICAgICAgICAgIGlmIGV4Yy53aW5lcnJvciA9PSBXU0FFT1BOT1RTVVBQOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNJT19MT09QQkFDS19GQVNUX1BBVEggaXMgZGVmaW5lZCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgaW1wbGVtZW50ZWQgaW4gdGhpcyBXaW5kb3dzIHZlcnNpb24iKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLmlvY3RsLCBzb2NrZXQuU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCwgTm9uZSkKKwogICAgIGRlZiB0ZXN0R2V0YWRkcmluZm8oc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbygnbG9jYWxob3N0JywgODApCkBAIC0yODIzLDYgKzI4NjEsNyBAQAogICAgICAgICAgICAgbmJ5dGVzID0gc2VsZi5zZW5kbXNnVG9TZXJ2ZXIoW21zZ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmJ5dGVzLCBsZW4obXNnKSkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iLCAic2VlIGlzc3VlICMyNDcyNSIpCiAgICAgZGVmIHRlc3RGRFBhc3NFbXB0eShzZWxmKToKICAgICAgICAgIyBUcnkgdG8gcGFzcyBhbiBlbXB0eSBGRCBhcnJheS4gIENhbiByZWNlaXZlIGVpdGhlciBubyBhcnJheQogICAgICAgICAjIG9yIGFuIGVtcHR5IGFycmF5LgpAQCAtNTI5OSw2ICs1MzM4LDE3NyBAQAogICAgICAgICByZXR1cm4gZ2V0YXR0cihzb2NrLCAiX3NlbmRmaWxlX3VzZV9zZW5kZmlsZSIpCiAKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFWRV9TT0NLRVRfQUxHLCAnQUZfQUxHIHJlcXVpcmVkJykKK2NsYXNzIExpbnV4S2VybmVsQ3J5cHRvQVBJKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIHRlc3RzIGZvciBBRl9BTEcKKyAgICBkZWYgY3JlYXRlX2FsZyhzZWxmLCB0eXAsIG5hbWUpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfQUxHLCBzb2NrZXQuU09DS19TRVFQQUNLRVQsIDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suYmluZCgodHlwLCBuYW1lKSkKKyAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yIGFzIGU6CisgICAgICAgICAgICAjIHR5cGUgLyBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3Qoc3RyKGUpLCB0eXAsIG5hbWUpCisgICAgICAgIHJldHVybiBzb2NrCisKKyAgICBkZWYgdGVzdF9zaGEyNTYoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gYnl0ZXMuZnJvbWhleCgiYmE3ODE2YmY4ZjAxY2ZlYTQxNDE0MGRlNWRhZTIyMjNiMDAzNjFhMzk2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWQiKQorICAgICAgICB3aXRoIHNlbGYuY3JlYXRlX2FsZygnaGFzaCcsICdzaGEyNTYnKSBhcyBhbGdvOgorICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRhbGwoYiJhYmMiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3AucmVjdig1MTIpLCBleHBlY3RlZCkKKworICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmQoYidhJywgc29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmQoYidiJywgc29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmQoYidjJywgc29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmQoYicnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3AucmVjdig1MTIpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2htYWNfc2hhMShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBieXRlcy5mcm9taGV4KCJlZmZjZGY2YWU1ZWIyZmEyZDI3NDE2ZDVmMTg0ZGY5YzI1OWE3Yzc5IikKKyAgICAgICAgd2l0aCBzZWxmLmNyZWF0ZV9hbGcoJ2hhc2gnLCAnaG1hYyhzaGExKScpIGFzIGFsZ286CisgICAgICAgICAgICBhbGdvLnNldHNvY2tvcHQoc29ja2V0LlNPTF9BTEcsIHNvY2tldC5BTEdfU0VUX0tFWSwgYiJKZWZlIikKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBvcC5zZW5kYWxsKGIid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcC5yZWN2KDUxMiksIGV4cGVjdGVkKQorCisgICAgQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigzLCAxOSkKKyAgICBkZWYgdGVzdF9hZXNfY2JjKHNlbGYpOgorICAgICAgICBrZXkgPSBieXRlcy5mcm9taGV4KCcwNmE5MjE0MDM2YjhhMTViNTEyZTAzZDUzNDEyMDAwNicpCisgICAgICAgIGl2ID0gYnl0ZXMuZnJvbWhleCgnM2RhZmJhNDI5ZDllYjQzMGI0MjJkYTgwMmM5ZmFjNDEnKQorICAgICAgICBtc2cgPSBiIlNpbmdsZSBibG9jayBtc2ciCisgICAgICAgIGNpcGhlcnRleHQgPSBieXRlcy5mcm9taGV4KCdlMzUzNzc5YzEwNzlhZWI4MjcwODk0MmRiZTc3MTgxYScpCisgICAgICAgIG1zZ2xlbiA9IGxlbihtc2cpCisgICAgICAgIHdpdGggc2VsZi5jcmVhdGVfYWxnKCdza2NpcGhlcicsICdjYmMoYWVzKScpIGFzIGFsZ286CisgICAgICAgICAgICBhbGdvLnNldHNvY2tvcHQoc29ja2V0LlNPTF9BTEcsIHNvY2tldC5BTEdfU0VUX0tFWSwga2V5KQorICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcob3A9c29ja2V0LkFMR19PUF9FTkNSWVBULCBpdj1pdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPXNvY2tldC5NU0dfTU9SRSkKKyAgICAgICAgICAgICAgICBvcC5zZW5kYWxsKG1zZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wLnJlY3YobXNnbGVuKSwgY2lwaGVydGV4dCkKKworICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcoW2NpcGhlcnRleHRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3A9c29ja2V0LkFMR19PUF9ERUNSWVBULCBpdj1pdikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wLnJlY3YobXNnbGVuKSwgbXNnKQorCisgICAgICAgICAgICAjIGxvbmcgbWVzc2FnZQorICAgICAgICAgICAgbXVsdGlwbGllciA9IDEwMjQKKyAgICAgICAgICAgIGxvbmdtc2cgPSBbbXNnXSAqIG11bHRpcGxpZXIKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBvcC5zZW5kbXNnX2FmYWxnKGxvbmdtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcD1zb2NrZXQuQUxHX09QX0VOQ1JZUFQsIGl2PWl2KQorICAgICAgICAgICAgICAgIGVuYyA9IG9wLnJlY3YobXNnbGVuICogbXVsdGlwbGllcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVuYyksIG1zZ2xlbiAqIG11bHRpcGxpZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZW5jWzptc2dsZW5dLCBjaXBoZXJ0ZXh0KQorCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgb3Auc2VuZG1zZ19hZmFsZyhbZW5jXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wPXNvY2tldC5BTEdfT1BfREVDUllQVCwgaXY9aXYpCisgICAgICAgICAgICAgICAgZGVjID0gb3AucmVjdihtc2dsZW4gKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGVjKSwgbXNnbGVuICogbXVsdGlwbGllcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLCBtc2cgKiBtdWx0aXBsaWVyKQorCisgICAgQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigzLCAxOSkKKyAgICBkZWYgdGVzdF9hZWFkX2Flc19nY20oc2VsZik6CisgICAgICAgIGtleSA9IGJ5dGVzLmZyb21oZXgoJ2M5MzljYzEzMzk3YzFkMzdkZTZhZTBlMWNiN2M0MjNjJykKKyAgICAgICAgaXYgPSBieXRlcy5mcm9taGV4KCdiM2Q4Y2MwMTdjYmI4OWIzOWUwZjY3ZTInKQorICAgICAgICBwbGFpbiA9IGJ5dGVzLmZyb21oZXgoJ2MzYjNjNDFmMTEzYTMxYjczZDlhNWNkNDMyMTAzMDY5JykKKyAgICAgICAgYXNzb2MgPSBieXRlcy5mcm9taGV4KCcyNDgyNTYwMmJkMTJhOTg0ZTAwOTJkM2U0NDhlZGE1ZicpCisgICAgICAgIGV4cGVjdGVkX2N0ID0gYnl0ZXMuZnJvbWhleCgnOTNmZTdkOWU5YmZkMTAzNDhhNTYwNmU1Y2FmYTczNTQnKQorICAgICAgICBleHBlY3RlZF90YWcgPSBieXRlcy5mcm9taGV4KCcwMDMyYTFkYzg1ZjFjOTc4NjkyNWEyZTcxZDgyNzJkZCcpCisKKyAgICAgICAgdGFnbGVuID0gbGVuKGV4cGVjdGVkX3RhZykKKyAgICAgICAgYXNzb2NsZW4gPSBsZW4oYXNzb2MpCisKKyAgICAgICAgd2l0aCBzZWxmLmNyZWF0ZV9hbGcoJ2FlYWQnLCAnZ2NtKGFlcyknKSBhcyBhbGdvOgorICAgICAgICAgICAgYWxnby5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfQUxHLCBzb2NrZXQuQUxHX1NFVF9LRVksIGtleSkKKyAgICAgICAgICAgIGFsZ28uc2V0c29ja29wdChzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfQUVBRF9BVVRIU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCB0YWdsZW4pCisKKyAgICAgICAgICAgICMgc2VuZCBhc3NvYywgcGxhaW4gYW5kIHRhZyBidWZmZXIgaW4gc2VwYXJhdGUgc3RlcHMKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBvcC5zZW5kbXNnX2FmYWxnKG9wPXNvY2tldC5BTEdfT1BfRU5DUllQVCwgaXY9aXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2xlbj1hc3NvY2xlbiwgZmxhZ3M9c29ja2V0Lk1TR19NT1JFKQorICAgICAgICAgICAgICAgIG9wLnNlbmRhbGwoYXNzb2MsIHNvY2tldC5NU0dfTU9SRSkKKyAgICAgICAgICAgICAgICBvcC5zZW5kYWxsKHBsYWluLCBzb2NrZXQuTVNHX01PUkUpCisgICAgICAgICAgICAgICAgb3Auc2VuZGFsbChiJ1x4MDAnICogdGFnbGVuKQorICAgICAgICAgICAgICAgIHJlcyA9IG9wLnJlY3YoYXNzb2NsZW4gKyBsZW4ocGxhaW4pICsgdGFnbGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfY3QsIHJlc1thc3NvY2xlbjotdGFnbGVuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3RhZywgcmVzWy10YWdsZW46XSkKKworICAgICAgICAgICAgIyBub3cgd2l0aCBtc2cKKyAgICAgICAgICAgIG9wLCBfID0gYWxnby5hY2NlcHQoKQorICAgICAgICAgICAgd2l0aCBvcDoKKyAgICAgICAgICAgICAgICBtc2cgPSBhc3NvYyArIHBsYWluICsgYidceDAwJyAqIHRhZ2xlbgorICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcoW21zZ10sIG9wPXNvY2tldC5BTEdfT1BfRU5DUllQVCwgaXY9aXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2xlbj1hc3NvY2xlbikKKyAgICAgICAgICAgICAgICByZXMgPSBvcC5yZWN2KGFzc29jbGVuICsgbGVuKHBsYWluKSArIHRhZ2xlbikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2N0LCByZXNbYXNzb2NsZW46LXRhZ2xlbl0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF90YWcsIHJlc1stdGFnbGVuOl0pCisKKyAgICAgICAgICAgICMgY3JlYXRlIGFuYyBkYXRhIG1hbnVhbGx5CisgICAgICAgICAgICBwYWNrX3VpbnQzMiA9IHN0cnVjdC5TdHJ1Y3QoJ0knKS5wYWNrCisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgbXNnID0gYXNzb2MgKyBwbGFpbiArIGInXHgwMCcgKiB0YWdsZW4KKyAgICAgICAgICAgICAgICBvcC5zZW5kbXNnKAorICAgICAgICAgICAgICAgICAgICBbbXNnXSwKKyAgICAgICAgICAgICAgICAgICAgKFtzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfT1AsIHBhY2tfdWludDMyKHNvY2tldC5BTEdfT1BfRU5DUllQVCldLAorICAgICAgICAgICAgICAgICAgICAgW3NvY2tldC5TT0xfQUxHLCBzb2NrZXQuQUxHX1NFVF9JViwgcGFja191aW50MzIobGVuKGl2KSkgKyBpdl0sCisgICAgICAgICAgICAgICAgICAgICBbc29ja2V0LlNPTF9BTEcsIHNvY2tldC5BTEdfU0VUX0FFQURfQVNTT0NMRU4sIHBhY2tfdWludDMyKGFzc29jbGVuKV0sCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmVzID0gb3AucmVjdihsZW4obXNnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2N0LCByZXNbYXNzb2NsZW46LXRhZ2xlbl0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF90YWcsIHJlc1stdGFnbGVuOl0pCisKKyAgICAgICAgICAgICMgZGVjcnlwdCBhbmQgdmVyaWZ5CisgICAgICAgICAgICBvcCwgXyA9IGFsZ28uYWNjZXB0KCkKKyAgICAgICAgICAgIHdpdGggb3A6CisgICAgICAgICAgICAgICAgbXNnID0gYXNzb2MgKyBleHBlY3RlZF9jdCArIGV4cGVjdGVkX3RhZworICAgICAgICAgICAgICAgIG9wLnNlbmRtc2dfYWZhbGcoW21zZ10sIG9wPXNvY2tldC5BTEdfT1BfREVDUllQVCwgaXY9aXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2xlbj1hc3NvY2xlbikKKyAgICAgICAgICAgICAgICByZXMgPSBvcC5yZWN2KGxlbihtc2cpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhaW4sIHJlc1thc3NvY2xlbjotdGFnbGVuXSkKKworICAgIEBzdXBwb3J0LnJlcXVpcmVzX2xpbnV4X3ZlcnNpb24oMywgMTkpCisgICAgZGVmIHRlc3RfZHJiZ19wcl9zaGEyNTYoc2VsZik6CisgICAgICAgICMgZGV0ZXJtaW5pc3RpYyByYW5kb20gYml0IGdlbmVyYXRvciwgcHJlZGljdGlvbiByZXNpc3RhbmNlLCBzaGEyNTYKKyAgICAgICAgd2l0aCBzZWxmLmNyZWF0ZV9hbGcoJ3JuZycsICdkcmJnX3ByX3NoYTI1NicpIGFzIGFsZ286CisgICAgICAgICAgICBleHRyYV9zZWVkID0gb3MudXJhbmRvbSgzMikKKyAgICAgICAgICAgIGFsZ28uc2V0c29ja29wdChzb2NrZXQuU09MX0FMRywgc29ja2V0LkFMR19TRVRfS0VZLCBleHRyYV9zZWVkKQorICAgICAgICAgICAgb3AsIF8gPSBhbGdvLmFjY2VwdCgpCisgICAgICAgICAgICB3aXRoIG9wOgorICAgICAgICAgICAgICAgIHJuID0gb3AucmVjdigzMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihybiksIDMyKQorCisgICAgZGVmIHRlc3Rfc2VuZG1zZ19hZmFsZ19hcmdzKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfQUxHLCBzb2NrZXQuU09DS19TRVFQQUNLRVQsIDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNvY2suc2VuZG1zZ19hZmFsZygpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc29jay5zZW5kbXNnX2FmYWxnKG9wPU5vbmUpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc29jay5zZW5kbXNnX2FmYWxnKDEpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc29jay5zZW5kbXNnX2FmYWxnKG9wPXNvY2tldC5BTEdfT1BfRU5DUllQVCwgYXNzb2NsZW49Tm9uZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzb2NrLnNlbmRtc2dfYWZhbGcob3A9c29ja2V0LkFMR19PUF9FTkNSWVBULCBhc3NvY2xlbj0tMSkKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gW0dlbmVyYWxNb2R1bGVUZXN0cywgQmFzaWNUQ1BUZXN0LCBUQ1BDbG9zZXJUZXN0LCBUQ1BUaW1lb3V0VGVzdCwKICAgICAgICAgICAgICBUZXN0RXhjZXB0aW9ucywgQnVmZmVySU9UZXN0LCBCYXNpY1RDUFRlc3QyLCBCYXNpY1VEUFRlc3QsIFVEUFRpbWVvdXRUZXN0IF0KQEAgLTUzMjUsNiArNTUzNSw3IEBACiAgICAgdGVzdHMuZXh0ZW5kKFtUSVBDVGVzdCwgVElQQ1RocmVhZGFibGVUZXN0XSkKICAgICB0ZXN0cy5leHRlbmQoW0Jhc2ljQ0FOVGVzdCwgQ0FOVGVzdF0pCiAgICAgdGVzdHMuZXh0ZW5kKFtCYXNpY1JEU1Rlc3QsIFJEU1Rlc3RdKQorICAgIHRlc3RzLmFwcGVuZChMaW51eEtlcm5lbENyeXB0b0FQSSkKICAgICB0ZXN0cy5leHRlbmQoWwogICAgICAgICBDbXNnTWFjcm9UZXN0cywKICAgICAgICAgU2VuZG1zZ1VEUFRlc3QsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CmluZGV4IDBkMGY4NmYuLjNmNGRmYTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CkBAIC0zLDEyICszLDExIEBACiAiIiIKIAogaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBpbwogaW1wb3J0IG9zCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgZXJybm8KIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc29ja2V0c2VydmVyCkBAIC00Niw3ICs0NSw3IEBACiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aW1lZCBvdXQgb24gJXIiICUgKHNvY2ssKSkKIAotaWYgSEFWRV9VTklYX1NPQ0tFVFM6CitpZiBIQVZFX1VOSVhfU09DS0VUUyBhbmQgSEFWRV9GT1JLSU5HOgogICAgIGNsYXNzIEZvcmtpbmdVbml4U3RyZWFtU2VydmVyKHNvY2tldHNlcnZlci5Gb3JraW5nTWl4SW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlVuaXhTdHJlYW1TZXJ2ZXIpOgogICAgICAgICBwYXNzCkBAIC01OCw2ICs1Nyw3IEBACiAKIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiBkZWYgc2ltcGxlX3N1YnByb2Nlc3ModGVzdGNhc2UpOgorICAgICIiIlRlc3RzIHRoYXQgYSBjdXN0b20gY2hpbGQgcHJvY2VzcyBpcyBub3Qgd2FpdGVkIG9uIChJc3N1ZSAxNTQwMzg2KSIiIgogICAgIHBpZCA9IG9zLmZvcmsoKQogICAgIGlmIHBpZCA9PSAwOgogICAgICAgICAjIERvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbjsgaXQgd291bGQgYmUgY2F1Z2h0IGJ5IHRoZSB0ZXN0IGhhcm5lc3MuCkBAIC0xMDMsNyArMTAzLDYgQEAKICAgICAgICAgY2xhc3MgTXlTZXJ2ZXIoc3ZyY2xzKToKICAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKICAgICAgICAgICAgICAgICByYWlzZQogCiAgICAgICAgIGNsYXNzIE15SGFuZGxlcihoZGxyYmFzZSk6CkBAIC0yNzksNiArMjc4LDE4MiBAQAogICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcikKIAorICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBzZXJ2ZXIuc29ja2V0LmZpbGVubygpKQorCisKK2NsYXNzIEVycm9ySGFuZGxlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgc2VydmVycyBwYXNzIG5vcm1hbCBleGNlcHRpb25zIGZyb20gdGhlIGhhbmRsZXIgdG8KKyAgICBoYW5kbGVfZXJyb3IoKSwgYW5kIHRoYXQgZXhpdGluZyBleGNlcHRpb25zIGxpa2UgU3lzdGVtRXhpdCBhbmQKKyAgICBLZXlib2FyZEludGVycnVwdCBhcmUgbm90IHBhc3NlZC4iIiIKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdC5zdXBwb3J0LnVubGluayh0ZXN0LnN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3Rfc3luY19oYW5kbGVkKHNlbGYpOgorICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKFZhbHVlRXJyb3IpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N5bmNfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X3RocmVhZGluZ19oYW5kbGVkKHNlbGYpOgorICAgICAgICBUaHJlYWRpbmdFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF90aHJlYWRpbmdfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIFRocmVhZGluZ0Vycm9yVGVzdFNlcnZlcihTeXN0ZW1FeGl0KQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPUZhbHNlKQorCisgICAgQHJlcXVpcmVzX2ZvcmtpbmcKKyAgICBkZWYgdGVzdF9mb3JraW5nX2hhbmRsZWQoc2VsZik6CisgICAgICAgIEZvcmtpbmdFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgQHJlcXVpcmVzX2ZvcmtpbmcKKyAgICBkZWYgdGVzdF9mb3JraW5nX25vdF9oYW5kbGVkKHNlbGYpOgorICAgICAgICBGb3JraW5nRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0KHNlbGYsIGhhbmRsZWQpOgorICAgICAgICB3aXRoIG9wZW4odGVzdC5zdXBwb3J0LlRFU1RGTikgYXMgbG9nOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSAnSGFuZGxlciBjYWxsZWRcbicgKyAnRXJyb3IgaGFuZGxlZFxuJyAqIGhhbmRsZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLnJlYWQoKSwgZXhwZWN0ZWQpCisKKworY2xhc3MgQmFzZUVycm9yVGVzdFNlcnZlcihzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5leGNlcHRpb24gPSBleGNlcHRpb24KKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygoSE9TVCwgMCksIEJhZEhhbmRsZXIpCisgICAgICAgIHdpdGggc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKHNlbGYuc2VydmVyX2FkZHJlc3MpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgc2VsZi53YWl0X2RvbmUoKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOLCAnYScpIGFzIGxvZzoKKyAgICAgICAgICAgIGxvZy53cml0ZSgnRXJyb3IgaGFuZGxlZFxuJykKKworICAgIGRlZiB3YWl0X2RvbmUoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBCYWRIYW5kbGVyKHNvY2tldHNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOLCAnYScpIGFzIGxvZzoKKyAgICAgICAgICAgIGxvZy53cml0ZSgnSGFuZGxlciBjYWxsZWRcbicpCisgICAgICAgIHJhaXNlIHNlbGYuc2VydmVyLmV4Y2VwdGlvbignVGVzdCBlcnJvcicpCisKKworY2xhc3MgVGhyZWFkaW5nRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5UaHJlYWRpbmdNaXhJbiwKKyAgICAgICAgQmFzZUVycm9yVGVzdFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpwb3MsICoqa3cpOgorICAgICAgICBzZWxmLmRvbmUgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCpwb3MsICoqa3cpCisKKyAgICBkZWYgc2h1dGRvd25fcmVxdWVzdChzZWxmLCAqcG9zLCAqKmt3KToKKyAgICAgICAgc3VwZXIoKS5zaHV0ZG93bl9yZXF1ZXN0KCpwb3MsICoqa3cpCisgICAgICAgIHNlbGYuZG9uZS5zZXQoKQorCisgICAgZGVmIHdhaXRfZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5kb25lLndhaXQoKQorCisKK2lmIEhBVkVfRk9SS0lORzoKKyAgICBjbGFzcyBGb3JraW5nRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5Gb3JraW5nTWl4SW4sIEJhc2VFcnJvclRlc3RTZXJ2ZXIpOgorICAgICAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICAgICAgW2NoaWxkXSA9IHNlbGYuYWN0aXZlX2NoaWxkcmVuCisgICAgICAgICAgICBvcy53YWl0cGlkKGNoaWxkLCAwKQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uY2xlYXIoKQorCisKK2NsYXNzIFNvY2tldFdyaXRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgY2xhc3MgSGFuZGxlcihzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci53ZmlsZSA9IHNlbGYud2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci53ZmlsZV9maWxlbm8gPSBzZWxmLndmaWxlLmZpbGVubygpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVxdWVzdF9maWxlbm8gPSBzZWxmLnJlcXVlc3QuZmlsZW5vKCkKKworICAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAwKSwgSGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlcnZlci5zZXJ2ZXJfY2xvc2UpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KAorICAgICAgICAgICAgc2VydmVyLmFkZHJlc3NfZmFtaWx5LCBzb2NrZXQuU09DS19TVFJFQU0sIHNvY2tldC5JUFBST1RPX1RDUCkKKyAgICAgICAgd2l0aCBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlcnZlci5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgc2VydmVyLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlcnZlci53ZmlsZSwgaW8uQnVmZmVyZWRJT0Jhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLndmaWxlX2ZpbGVubywgc2VydmVyLnJlcXVlc3RfZmlsZW5vKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgd2ZpbGUud3JpdGUoKSBzZW5kcyBkYXRhIGltbWVkaWF0ZWx5LCBhbmQgdGhhdCBpdCBkb2VzCisgICAgICAgICMgbm90IHRydW5jYXRlIHNlbmRzIHdoZW4gaW50ZXJydXB0ZWQgYnkgYSBVbml4IHNpZ25hbAorICAgICAgICBwdGhyZWFkX2tpbGwgPSB0ZXN0LnN1cHBvcnQuZ2V0X2F0dHJpYnV0ZShzaWduYWwsICdwdGhyZWFkX2tpbGwnKQorCisgICAgICAgIGNsYXNzIEhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VudDEgPSBzZWxmLndmaWxlLndyaXRlKGInd3JpdGUgZGF0YVxuJykKKyAgICAgICAgICAgICAgICAjIFNob3VsZCBiZSBzZW50IGltbWVkaWF0ZWx5LCB3aXRob3V0IHJlcXVpcmluZyBmbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVjZWl2ZWQgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBiaWdfY2h1bmsgPSBieXRlcyh0ZXN0LnN1cHBvcnQuU09DS19NQVhfU0laRSkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5zZW50MiA9IHNlbGYud2ZpbGUud3JpdGUoYmlnX2NodW5rKQorCisgICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIDApLCBIYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLnNlcnZlcl9jbG9zZSkKKyAgICAgICAgaW50ZXJydXB0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgICAgIGRlZiBzaWduYWxfaGFuZGxlcihzaWdudW0sIGZyYW1lKToKKyAgICAgICAgICAgIGludGVycnVwdGVkLnNldCgpCisKKyAgICAgICAgb3JpZ2luYWwgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzaWduYWxfaGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNpZ25hbC5zaWduYWwsIHNpZ25hbC5TSUdVU1IxLCBvcmlnaW5hbCkKKyAgICAgICAgcmVzcG9uc2UxID0gTm9uZQorICAgICAgICByZWNlaXZlZDIgPSBOb25lCisgICAgICAgIG1haW5fdGhyZWFkID0gdGhyZWFkaW5nLmdldF9pZGVudCgpCisKKyAgICAgICAgZGVmIHJ1bl9jbGllbnQoKToKKyAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNlcnZlci5hZGRyZXNzX2ZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNLAorICAgICAgICAgICAgICAgIHNvY2tldC5JUFBST1RPX1RDUCkKKyAgICAgICAgICAgIHdpdGggcywgcy5tYWtlZmlsZSgncmInKSBhcyByZWFkZXI6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHNlcnZlci5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgICAgICAgICBub25sb2NhbCByZXNwb25zZTEKKyAgICAgICAgICAgICAgICByZXNwb25zZTEgPSByZWFkZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHMuc2VuZGFsbChiJ2NsaWVudCByZXNwb25zZVxuJykKKworICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKDEwMCkKKyAgICAgICAgICAgICAgICAjIFRoZSBtYWluIHRocmVhZCBzaG91bGQgbm93IGJlIGJsb2NraW5nIGluIGEgc2VuZCgpIHN5c2NhbGwuCisgICAgICAgICAgICAgICAgIyBCdXQgaW4gdGhlb3J5LCBpdCBjb3VsZCBnZXQgaW50ZXJydXB0ZWQgYnkgb3RoZXIgc2lnbmFscywKKyAgICAgICAgICAgICAgICAjIGFuZCB0aGVuIHJldHJpZWQuIFNvIGtlZXAgc2VuZGluZyB0aGUgc2lnbmFsIGluIGEgbG9vcCwgaW4KKyAgICAgICAgICAgICAgICAjIGNhc2UgYW4gZWFybGllciBzaWduYWwgaGFwcGVucyB0byBiZSBkZWxpdmVyZWQgYXQgYW4KKyAgICAgICAgICAgICAgICAjIGluY29udmVuaWVudCBtb21lbnQuCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9raWxsKG1haW5fdGhyZWFkLCBzaWduYWwuU0lHVVNSMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaW50ZXJydXB0ZWQud2FpdCh0aW1lb3V0PWZsb2F0KDEpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbm9ubG9jYWwgcmVjZWl2ZWQyCisgICAgICAgICAgICAgICAgcmVjZWl2ZWQyID0gbGVuKHJlYWRlci5yZWFkKCkpCisKKyAgICAgICAgYmFja2dyb3VuZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1bl9jbGllbnQpCisgICAgICAgIGJhY2tncm91bmQuc3RhcnQoKQorICAgICAgICBzZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBiYWNrZ3JvdW5kLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zZW50MSwgbGVuKHJlc3BvbnNlMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UxLCBiJ3dyaXRlIGRhdGFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnJlY2VpdmVkLCBiJ2NsaWVudCByZXNwb25zZVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIuc2VudDIsIHRlc3Quc3VwcG9ydC5TT0NLX01BWF9TSVpFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY2VpdmVkMiwgdGVzdC5zdXBwb3J0LlNPQ0tfTUFYX1NJWkUgLSAxMDApCisKIAogY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CmluZGV4IGE1ZDBlYmYuLjk4Y2NhYjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvcnQucHkKQEAgLTEsNiArMSw1IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCByYW5kb20KLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IGNtcF90b19rZXkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zcHdkLnB5IGIvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CmluZGV4IGJlYTdhYjEuLmU4OTNmM2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Nwd2QucHkKQEAgLTU2LDUgKzU2LDIwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwd2QuZ2V0c3BuYW0sIGJ5dGVzX25hbWUpCiAKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldGV1aWQnKSBhbmQgb3MuZ2V0ZXVpZCgpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAnbm9uLXJvb3QgdXNlciByZXF1aXJlZCcpCitjbGFzcyBUZXN0U3B3ZE5vblJvb3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZ2V0c3BuYW1fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBuYW1lID0gJ2JpbicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQZXJtaXNzaW9uRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgIHNwd2QuZ2V0c3BuYW0obmFtZSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInNwd2QgZW50cnkgJXIgZG9lc24ndCBleGlzdDogJXMiICUgKG5hbWUsIGV4YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAnW0Vycm5vIDEzXSBQZXJtaXNzaW9uIGRlbmllZCcpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKaW5kZXggMGY0ZmFhMC4uZDhkNTNhZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKQEAgLTIxLDYgKzIxLDEzIEBACiAKIHNzbCA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgic3NsIikKIAordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfaGF2ZV90aHJlYWRzID0gRmFsc2UKK2Vsc2U6CisgICAgX2hhdmVfdGhyZWFkcyA9IFRydWUKKwogUFJPVE9DT0xTID0gc29ydGVkKHNzbC5fUFJPVE9DT0xfTkFNRVMpCiBIT1NUID0gc3VwcG9ydC5IT1NUCiBJU19MSUJSRVNTTCA9IHNzbC5PUEVOU1NMX1ZFUlNJT04uc3RhcnRzd2l0aCgnTGlicmVTU0wnKQpAQCAtNTYsMTIgKzYzLDEyIEBACiAjIFR3byBrZXlzIGFuZCBjZXJ0cyBzaWduZWQgYnkgdGhlIHNhbWUgQ0EgKGZvciBTTkkgdGVzdHMpCiBTSUdORURfQ0VSVEZJTEUgPSBkYXRhX2ZpbGUoImtleWNlcnQzLnBlbSIpCiBTSUdORURfQ0VSVEZJTEUyID0gZGF0YV9maWxlKCJrZXljZXJ0NC5wZW0iKQotU0lHTklOR19DQSA9IGRhdGFfZmlsZSgicHljYWNlcnQucGVtIikKKyMgU2FtZSBjZXJ0aWZpY2F0ZSBhcyBweWNhY2VydC5wZW0sIGJ1dCB3aXRob3V0IGV4dHJhIHRleHQgaW4gZmlsZQorU0lHTklOR19DQSA9IGRhdGFfZmlsZSgiY2FwYXRoIiwgImNlZmYxNzEwLjAiKQogIyBjZXJ0IHdpdGggYWxsIGtpbmRzIG9mIHN1YmplY3QgYWx0IG5hbWVzCiBBTExTQU5GSUxFID0gZGF0YV9maWxlKCJhbGxzYW5zLnBlbSIpCiAKIFJFTU9URV9IT1NUID0gInNlbGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0IgotUkVNT1RFX1JPT1RfQ0VSVCA9IGRhdGFfZmlsZSgic2VsZnNpZ25lZF9weXRob250ZXN0ZG90bmV0LnBlbSIpCiAKIEVNUFRZQ0VSVCA9IGRhdGFfZmlsZSgibnVsbGNlcnQucGVtIikKIEJBRENFUlQgPSBkYXRhX2ZpbGUoImJhZGNlcnQucGVtIikKQEAgLTM1NCw3ICszNjEsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHNzKQogICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCIiLCBSZXNvdXJjZVdhcm5pbmcpKToKICAgICAgICAgICAgIGRlbCBzcwotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cigpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCiAKICAgICBkZWYgdGVzdF93cmFwcGVkX3VuY29ubmVjdGVkKHNlbGYpOgogICAgICAgICAjIE1ldGhvZHMgb24gYW4gdW5jb25uZWN0ZWQgU1NMU29ja2V0IHByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwKQEAgLTgwOSw2ICs4MTYsMjIgQEAKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfb2soIkZlYiAgOSAwMDowMDowMCAyMDA3IEdNVCIsIDExNzA5NzkyMDAuMCkKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfZmFpbChsb2NhbF9mZWJydWFyeV9uYW1lKCkgKyAiICA5IDAwOjAwOjAwIDIwMDcgR01UIikKIAorICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuY2xvc2UpCisgICAgICAgIHBvcnQgPSBzdXBwb3J0LmJpbmRfcG9ydChzZXJ2ZXIpICAjIFJlc2VydmUgcG9ydCBidXQgZG9uJ3QgbGlzdGVuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKEhPU1QsIHBvcnQpKQorICAgICAgICAjIElzc3VlICMxOTkxOTogV2luZG93cyBtYWNoaW5lcyBvciBWTXMgaG9zdGVkIG9uIFdpbmRvd3MKKyAgICAgICAgIyBtYWNoaW5lcyBzb21ldGltZXMgcmV0dXJuIEVXT1VMREJMT0NLLgorICAgICAgICBlcnJvcnMgPSAoCisgICAgICAgICAgICBlcnJuby5FQ09OTlJFRlVTRUQsIGVycm5vLkVIT1NUVU5SRUFDSCwgZXJybm8uRVRJTUVET1VULAorICAgICAgICAgICAgZXJybm8uRVdPVUxEQkxPQ0ssCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgZXJyb3JzKQorCiAKIGNsYXNzIENvbnRleHRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTgzNCw2ICs4NTcsMTQgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgIk5vIGNpcGhlciBjYW4gYmUgc2VsZWN0ZWQiKToKICAgICAgICAgICAgIGN0eC5zZXRfY2lwaGVycygiXiQ6LDs/Kidkb3JvdGh5eCIpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgxLCAwLCAyLCAwLCAwKSwgJ09wZW5TU0wgdG9vIG9sZCcpCisgICAgZGVmIHRlc3RfZ2V0X2NpcGhlcnMoc2VsZik6CisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgY3R4LnNldF9jaXBoZXJzKCdBRVNHQ00nKQorICAgICAgICBuYW1lcyA9IHNldChkWyduYW1lJ10gZm9yIGQgaW4gY3R4LmdldF9jaXBoZXJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0FFUzI1Ni1HQ00tU0hBMzg0JywgbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0FFUzEyOC1HQ00tU0hBMjU2JywgbmFtZXMpCisKICAgICBAc2tpcF9pZl9icm9rZW5fdWJ1bnR1X3NzbAogICAgIGRlZiB0ZXN0X29wdGlvbnMoc2VsZik6CiAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9UTFN2MSkKQEAgLTEzOTcsMTQwICsxNDI4LDEwMyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpby53cml0ZSwgMSkKIAogCi1jbGFzcyBOZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CitAdW5pdHRlc3Quc2tpcFVubGVzcyhfaGF2ZV90aHJlYWRzLCAiTmVlZHMgdGhyZWFkaW5nIG1vZHVsZSIpCitjbGFzcyBTaW1wbGVCYWNrZ3JvdW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdHMgdGhhdCBjb25uZWN0IHRvIGEgc2ltcGxlIHNlcnZlciBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihTSUdORURfQ0VSVEZJTEUpCisgICAgICAgIHNlbGYuc2VydmVyX2FkZHIgPSAoSE9TVCwgc2VydmVyLnBvcnQpCisgICAgICAgIHNlcnZlci5fX2VudGVyX18oKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLl9fZXhpdF9fLCBOb25lLCBOb25lLCBOb25lKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGhhdmUgbm8gdmVyaWZpY2F0aW9uIGNlcnRzCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIHRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgZGVmIHRlc3RfY29ubmVjdF9mYWlsKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cy4gQ29ubmVjdGlvbgorICAgICAgICAjIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuIGluZGVwZW5kZW50CisgICAgICAgICMgdGVzdCBtZXRob2QuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogY2hlY2sgY29ubmVjdF9leCgpIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHMuY29ubmVjdF9leChzZWxmLnNlcnZlcl9hZGRyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKIAogICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogbm9uLWJsb2NraW5nIGNvbm5lY3RfZXgoKSBzaG91bGQgYWxsb3cgaGFuZHNoYWtlCiAgICAgICAgICMgdG8gcHJvY2VlZCBhZnRlciB0aGUgc29ja2V0IGdldHMgcmVhZHkuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICMgRVdPVUxEQkxPQ0sgdW5kZXIgV2luZG93cywgRUlOUFJPR1JFU1MgZWxzZXdoZXJlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10sIDUuMCkKKyAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCisgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoMCwgZXJybm8uRUlOUFJPR1JFU1MsIGVycm5vLkVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50V3JpdGVFcnJvcjoKICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCi0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF90aW1lb3V0X2Nvbm5lY3RfZXgoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzEyMDY1OiBvbiBhIHRpbWVvdXQsIGNvbm5lY3RfZXgoKSBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbAotICAgICAgICAjIGVycm5vIChtaW1pY2tpbmcgdGhlIGJlaGF2aW91ciBvZiBub24tU1NMIHNvY2tldHMpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9UkVNT1RFX1JPT1RfQ0VSVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgaWYgcmMgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoZXJybm8uRUFHQUlOLCBlcnJuby5FV09VTERCTE9DSykpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQotCi0gICAgZGVmIHRlc3RfY29ubmVjdF9leF9lcnJvcihzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDQpKQotICAgICAgICAgICAgICAgICMgSXNzdWUgIzE5OTE5OiBXaW5kb3dzIG1hY2hpbmVzIG9yIFZNcyBob3N0ZWQgb24gV2luZG93cwotICAgICAgICAgICAgICAgICMgbWFjaGluZXMgc29tZXRpbWVzIHJldHVybiBFV09VTERCTE9DSy4KLSAgICAgICAgICAgICAgICBlcnJvcnMgPSAoCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVDT05OUkVGVVNFRCwgZXJybm8uRUhPU1RVTlJFQUNILCBlcnJuby5FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVXT1VMREJMT0NLLAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCBlcnJvcnMpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIFNTTCBlc3RhYmxpc2hlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHQoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgIyBTYW1lIGFzIHRlc3RfY29ubmVjdCwgYnV0IHdpdGggYSBzZXBhcmF0ZWx5IGNyZWF0ZWQgY29udGV4dAotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIHNlcnZlciBob3N0bmFtZQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPVJFTU9URV9IT1NUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoUkVNT1RFX1JPT1RfQ0VSVCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgU2FtZSBhcyB0ZXN0X2Nvbm5lY3QsIGJ1dCB3aXRoIGEgc2VwYXJhdGVseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgIyBTYW1lIHdpdGggYSBzZXJ2ZXIgaG9zdG5hbWUKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPSJkdW1teSIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgIyBUaGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0CisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU0lHTklOR19DQSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorCisgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHRfZmFpbChzZWxmKToKKyAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMuIENvbm5lY3Rpb24KKyAgICAgICAgIyBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbiBpbmRlcGVuZGVudAorICAgICAgICAjIHRlc3QgbWV0aG9kLgorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0LCBzZWxmLnNlcnZlcl9hZGRyKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYXBhdGgoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHNlcnZlciBjZXJ0aWZpY2F0ZXMgdXNpbmcgdGhlIGBjYXBhdGhgIGFyZ3VtZW50CkBAIC0xNTM4LDE5OCArMTUzMiwxMzAgQEAKICAgICAgICAgIyBPcGVuU1NMIDAuOS44biBhbmQgMS4wLjAsIGFzIGEgcmVzdWx0IHRoZSBjYXBhdGggZGlyZWN0b3J5IG11c3QKICAgICAgICAgIyBjb250YWluIGJvdGggdmVyc2lvbnMgb2YgZWFjaCBjZXJ0aWZpY2F0ZSAoc2FtZSBjb250ZW50LCBkaWZmZXJlbnQKICAgICAgICAgIyBmaWxlbmFtZSkgZm9yIHRoaXMgdGVzdCB0byBiZSBwb3J0YWJsZSBhY3Jvc3MgT3BlblNTTCByZWxlYXNlcy4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50CisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYWRhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggb3BlbihSRU1PVEVfUk9PVF9DRVJUKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4oU0lHTklOR19DQSkgYXMgZjoKICAgICAgICAgICAgIHBlbSA9IGYucmVhZCgpCiAgICAgICAgIGRlciA9IHNzbC5QRU1fY2VydF90b19ERVJfY2VydChwZW0pCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1wZW0pCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWRhdGE9cGVtKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKLSAgICAgICAgICAgICMgc2FtZSB3aXRoIERFUgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1kZXIpCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgIyBzYW1lIHdpdGggREVSCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPWRlcikKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICJudCIsICJDYW4ndCB1c2UgYSBzb2NrZXQgYXMgYSBmaWxlIHVuZGVyIFdpbmRvd3MiKQogICAgIGRlZiB0ZXN0X21ha2VmaWxlX2Nsb3NlKHNlbGYpOgogICAgICAgICAjIElzc3VlICM1MjM4OiBjcmVhdGluZyBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtYWtlZmlsZSgpIHNob3VsZG4ndAogICAgICAgICAjIGRlbGF5IGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgInJlYWwgc29ja2V0IiAoaGVyZSB0ZXN0ZWQgd2l0aCBpdHMKICAgICAgICAgIyBmaWxlIGRlc2NyaXB0b3IsIGhlbmNlIHNraXBwaW5nIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc3MuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBmZCA9IHNzLmZpbGVubygpCi0gICAgICAgICAgICBmID0gc3MubWFrZWZpbGUoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoZSBmZCBpcyBzdGlsbCBvcGVuCisgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKKyAgICAgICAgZiA9IHNzLm1ha2VmaWxlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgb3MucmVhZChmZCwgMCkKKyAgICAgICAgIyBDbG9zaW5nIHRoZSBTU0wgc29ja2V0IHNob3VsZCBjbG9zZSB0aGUgZmQgdG9vCisgICAgICAgIHNzLmNsb3NlKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgZToKICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KLSAgICAgICAgICAgIHNzLmNsb3NlKCkKLSAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgotICAgICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUJBREYpCiAKICAgICBkZWYgdGVzdF9ub25fYmxvY2tpbmdfaGFuZHNoYWtlKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKLSAgICAgICAgICAgIGNvdW50ID0gMAotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFJlYWRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5OZWVkZWQgJWQgY2FsbHMgdG8gZG9faGFuZHNoYWtlKCkgdG8gZXN0YWJsaXNoIHNlc3Npb24uXG4iICUgY291bnQpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHMuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NdLCBbXSwgW10pCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuTmVlZGVkICVkIGNhbGxzIHRvIGRvX2hhbmRzaGFrZSgpIHRvIGVzdGFibGlzaCBzZXNzaW9uLlxuIiAlIGNvdW50KQogCiAgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmKToKLSAgICAgICAgZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKLSAgICAgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoaG9zdCk6Ci0gICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIG5vdCBwZW06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgKnNlbGYuc2VydmVyX2FkZHIsIGNlcnQ9U0lHTklOR19DQSkKIAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIHg6Ci0gICAgICAgICAgICAgICAgICAgICNzaG91bGQgZmFpbAotICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIlc1xuIiAlIHgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJHb3Qgc2VydmVyIGNlcnRpZmljYXRlICVzIGZvciAlczolcyEiICUgKHBlbSwgaG9zdCwgcG9ydCkpCi0KLSAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Y2VydCkKLSAgICAgICAgICAgICAgICBpZiBub3QgcGVtOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCi0KLSAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShSRU1PVEVfSE9TVCwgNDQzLCBSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICBpZiBzdXBwb3J0LklQVjZfRU5BQkxFRDoKLSAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwoc2VsZik6CisgICAgICAgICMgQ29ubmVjdGlvbiBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbgorICAgICAgICAjIGluZGVwZW5kZW50IHRlc3QgbWV0aG9kCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAqc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6Ci0gICAgICAgIHJlbW90ZSA9IChSRU1PVEVfSE9TVCwgNDQzKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHJlbW90ZVswXSk6Ci0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJBTEwiKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgIyBFcnJvciBjaGVja2luZyBjYW4gaGFwcGVuIGF0IGluc3RhbnRpYXRpb24gb3Igd2hlbiBjb25uZWN0aW5nCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgotICAgICAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKLSAgICAgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKLSAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKLQotICAgIGRlZiB0ZXN0X2FsZ29yaXRobXMoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzg0ODQ6IGFsbCBhbGdvcml0aG1zIHNob3VsZCBiZSBhdmFpbGFibGUgd2hlbiB2ZXJpZnlpbmcgYQotICAgICAgICAjIGNlcnRpZmljYXRlLgotICAgICAgICAjIFNIQTI1NiB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuOAotICAgICAgICBpZiBzc2wuT1BFTlNTTF9WRVJTSU9OX0lORk8gPCAoMCwgOSwgOCwgMCwgMTUpOgotICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0hBMjU2IG5vdCBhdmFpbGFibGUgb24gJXIiICUgc3NsLk9QRU5TU0xfVkVSU0lPTikKLSAgICAgICAgIyBzaGEyNTYudGJzLWludGVybmV0LmNvbSBuZWVkcyBTTkkgdG8gdXNlIHRoZSBjb3JyZWN0IGNlcnRpZmljYXRlCi0gICAgICAgIGlmIG5vdCBzc2wuSEFTX1NOSToKLSAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNOSSBuZWVkZWQgZm9yIHRoaXMgdGVzdCIpCi0gICAgICAgICMgaHR0cHM6Ly9zaGEyLmhib2Vjay5kZS8gd2FzIHVzZWQgdW50aWwgMjAxMS0wMS0wOCAobm8gcm91dGUgdG8gaG9zdCkKLSAgICAgICAgcmVtb3RlID0gKCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIsIDQ0MykKLSAgICAgICAgc2hhMjU2X2NlcnQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgInNoYTI1Ni5wZW0iKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2hhMjU2X2NlcnQpCi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9InNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIikKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5DaXBoZXIgd2l0aCAlciBpcyAlclxuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW90ZSwgcy5jaXBoZXIoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNlcnRpZmljYXRlIGlzOlxuJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHMuZ2V0cGVlcmNlcnQoKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkFMTCIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAjIEVycm9yIGNoZWNraW5nIGNhbiBoYXBwZW4gYXQgaW5zdGFudGlhdGlvbiBvciB3aGVuIGNvbm5lY3RpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgIk5vIGNpcGhlciBjYW4gYmUgc2VsZWN0ZWQiKToKKyAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iXiQ6LDs/Kidkb3JvdGh5eCIpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9nZXRfY2FfY2VydHNfY2FwYXRoKHNlbGYpOgogICAgICAgICAjIGNhcGF0aCBjZXJ0cyBhcmUgbG9hZGVkIG9uIHJlcXVlc3QKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhcGF0aD1DQVBBVEgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQogCiAgICAgQG5lZWRzX3NuaQogICAgIGRlZiB0ZXN0X2NvbnRleHRfc2V0Z2V0KHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGNvbnRleHQgb2YgYSBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSByZXBsYWNlZC4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4MiA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKLSAgICAgICAgICAgICAgICBzcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDIpCi0KLQotY2xhc3MgTmV0d29ya2VkQklPVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICBjdHgyID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKKyAgICAgICAgICAgIHNzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgxKQorICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgyKQogCiAgICAgZGVmIHNzbF9pb19sb29wKHNlbGYsIHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgIyBBIHNpbXBsZSBJTyBsb29wLiBDYWxsIGZ1bmMoKmFyZ3MpIGRlcGVuZGluZyBvbiB0aGUgZXJyb3Igd2UgZ2V0CkBAIC0xNzY1LDY0ICsxNjkxLDEyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjb3VudCwgZnVuYy5fX25hbWVfXykpCiAgICAgICAgIHJldHVybiByZXQKIAotICAgIGRlZiB0ZXN0X2hhbmRzaGFrZShzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHNvY2suY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgY3R4LmNoZWNrX2hvc3RuYW1lID0gVHJ1ZQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UsIFJFTU9URV9IT1NUKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQotICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnVud3JhcCkKLSAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgotICAgICAgICAgICAgICAgICMgc2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQgcHJvYmFibHkgc2h1dHMgZG93biB0aGUgVENQCi0gICAgICAgICAgICAgICAgIyBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCBhbmQKLSAgICAgICAgICAgICAgICAjIHRoaXMgaXMgcmVwb3J0ZWQgYXMgU1NMX0VSUk9SX1NZU0NBTEwKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzc2wuU1NMRXJyb3IsIHNzbG9iai53cml0ZSwgYidmb28nKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9yZWFkX3dyaXRlX2RhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCi0gICAgICAgICAgICBzb2NrLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIG91dGdvaW5nID0gc3NsLk1lbW9yeUJJTygpCi0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfTk9ORQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UpCi0gICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKLSAgICAgICAgICAgIHJlcSA9IGInR0VUIC8gSFRUUC8xLjBcclxuXHJcbicKLSAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoud3JpdGUsIHJlcSkKLSAgICAgICAgICAgIGJ1ZiA9IHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoucmVhZCwgMTAyNCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo1XSwgYidIVFRQLycpCisgICAgZGVmIHRlc3RfYmlvX2hhbmRzaGFrZShzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBzb2NrLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTSUdOSU5HX0NBKQorICAgICAgICBjdHguY2hlY2tfaG9zdG5hbWUgPSBUcnVlCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlLCAnbG9jYWxob3N0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNzbG9iai5nZXRfY2hhbm5lbF9iaW5kaW5nKCd0bHMtdW5pcXVlJykpCisgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoudW53cmFwKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgorICAgICAgICAgICAgIyBJZiB0aGUgc2VydmVyIHNodXRzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhCisgICAgICAgICAgICAjIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCB0aGlzIGlzIHJlcG9ydGVkIGFzIFNTTF9FUlJPUl9TWVNDQUxMCisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNzbC5TU0xFcnJvciwgc3Nsb2JqLndyaXRlLCBiJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9iaW9fcmVhZF93cml0ZV9kYXRhKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKKyAgICAgICAgcmVxID0gYidGT09cbicKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai53cml0ZSwgcmVxKQorICAgICAgICBidWYgPSBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnJlYWQsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBiJ2Zvb1xuJykKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai51bndyYXApCiAKIAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBfaGF2ZV90aHJlYWRzID0gRmFsc2UKLWVsc2U6Ci0gICAgX2hhdmVfdGhyZWFkcyA9IFRydWUKK2NsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKKyAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKKyAgICAgICAgICAgIGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuSVBWNl9FTkFCTEVELCAnTmVlZHMgSVB2NicpCisgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9pcHY2KHNlbGYpOgorICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCdpcHY2Lmdvb2dsZS5jb20nKToKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorCisgICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCisgICAgICAgICMgY2VydGlmaWNhdGUuCisgICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44CisgICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQorICAgICAgICAjIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIG5lZWRzIFNOSSB0byB1c2UgdGhlIGNvcnJlY3QgY2VydGlmaWNhdGUKKyAgICAgICAgaWYgbm90IHNzbC5IQVNfU05JOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU05JIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IikKKyAgICAgICAgIyBodHRwczovL3NoYTIuaGJvZWNrLmRlLyB3YXMgdXNlZCB1bnRpbCAyMDExLTAxLTA4IChubyByb3V0ZSB0byBob3N0KQorICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQorICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIik6CisgICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzaGEyNTZfY2VydCkKKyAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT0ic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbkNpcGhlciB3aXRoICVyIGlzICVyXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3RlLCBzLmNpcGhlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ2VydGlmaWNhdGUgaXM6XG4lc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQocy5nZXRwZWVyY2VydCgpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKworZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUodGVzdCwgaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKKyAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCkpCisgICAgaWYgbm90IHBlbToKKyAgICAgICAgdGVzdC5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gJXM6JXMhIiAlIChob3N0LCBwb3J0KSkKKworICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwgY2FfY2VydHM9Y2VydCkKKyAgICBpZiBub3QgcGVtOgorICAgICAgICB0ZXN0LmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQorICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCisKK2RlZiBfdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwodGVzdCwgaG9zdCwgcG9ydCk6CisgICAgdHJ5OgorICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksIGNhX2NlcnRzPUNFUlRGSUxFKQorICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgeDoKKyAgICAgICAgI3Nob3VsZCBmYWlsCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzXG4iICUgeCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0LmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yICVzOiVzISIgJSAocGVtLCBob3N0LCBwb3J0KSkKKworCitpZiBfaGF2ZV90aHJlYWRzOgogICAgIGZyb20gdGVzdC5zc2xfc2VydmVycyBpbXBvcnQgbWFrZV9odHRwc19zZXJ2ZXIKIAogICAgIGNsYXNzIFRocmVhZGVkRWNob1NlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTE5MTAsNiArMTkwMCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN0cmlwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW9mLCBzbyBxdWl0IHRoaXMgaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzZWxmLnNzbGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYW55IHRlc3RzIHNodXQgdGhlIFRDUCBjb25uZWN0aW9uIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFuIFNTTCBzaHV0ZG93bi4gVGhpcyBjYXVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bndyYXAoKSB0byByYWlzZSBPU0Vycm9yIHdpdGggZXJybm89MCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc3RyaXBwZWQgPT0gYidvdmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNvbm5lY3Rpb25jaGF0dHk6CkBAIC0yNzQ3LDEyICsyNzQ2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBhZGRyID0gcy5yZWN2ZnJvbV9pbnRvKGIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiWzpjb3VudF0KIAotICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCisgICAgICAgICAgICAgICAgIyAobmFtZSwgbWV0aG9kLCBleHBlY3Qgc3VjY2Vzcz8sICphcmdzLCByZXR1cm4gdmFsdWUgZnVuYykKICAgICAgICAgICAgICAgICBzZW5kX21ldGhvZHMgPSBbCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZCcsIHMuc2VuZCwgVHJ1ZSwgW10pLAotICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZGFsbCcsIHMuc2VuZGFsbCwgVHJ1ZSwgW10pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmQnLCBzLnNlbmQsIFRydWUsIFtdLCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSwgbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSwgbGFtYmRhIHg6IE5vbmUpLAogICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIHdoZXRoZXIgdG8gZXhwZWN0IHN1Y2Nlc3MsICphcmdzKQogICAgICAgICAgICAgICAgIHJlY3ZfbWV0aG9kcyA9IFsKICAgICAgICAgICAgICAgICAgICAgKCdyZWN2Jywgcy5yZWN2LCBUcnVlLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICgncmVjdmZyb20nLCBzLnJlY3Zmcm9tLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCkBAIC0yNzYxLDEwICsyNzYxLDEzIEBACiAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgIGRhdGFfcHJlZml4ID0gIlBSRUZJWF8iCiAKLSAgICAgICAgICAgICAgICBmb3IgbWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzIGluIHNlbmRfbWV0aG9kczoKKyAgICAgICAgICAgICAgICBmb3IgKG1ldGhfbmFtZSwgc2VuZF9tZXRoLCBleHBlY3Rfc3VjY2VzcywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWxfbWV0aCkgaW4gc2VuZF9tZXRob2RzOgogICAgICAgICAgICAgICAgICAgICBpbmRhdGEgPSAoZGF0YV9wcmVmaXggKyBtZXRoX25hbWUpLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGgoaW5kYXRhLCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbmRfbWV0aChpbmRhdGEsICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gInNlbmRpbmcgd2l0aCB7fSIuZm9ybWF0KG1ldGhfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCByZXRfdmFsX21ldGgoaW5kYXRhKSwgbXNnPW1zZykKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEgPSBzLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCkBAIC0zNDI0LDE4ICszNDI3LDIwIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICBmb3IgZmlsZW5hbWUgaW4gWwotICAgICAgICBDRVJURklMRSwgUkVNT1RFX1JPT1RfQ0VSVCwgQllURVNfQ0VSVEZJTEUsCisgICAgICAgIENFUlRGSUxFLCBCWVRFU19DRVJURklMRSwKICAgICAgICAgT05MWUNFUlQsIE9OTFlLRVksIEJZVEVTX09OTFlDRVJULCBCWVRFU19PTkxZS0VZLAogICAgICAgICBTSUdORURfQ0VSVEZJTEUsIFNJR05FRF9DRVJURklMRTIsIFNJR05JTkdfQ0EsCiAgICAgICAgIEJBRENFUlQsIEJBREtFWSwgRU1QVFlDRVJUXToKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgIHJhaXNlIHN1cHBvcnQuVGVzdEZhaWxlZCgiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBmaWxlICVyIiAlIGZpbGVuYW1lKQogCi0gICAgdGVzdHMgPSBbQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0c10KKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0cywKKyAgICAgICAgU2ltcGxlQmFja2dyb3VuZFRlc3RzLAorICAgIF0KIAogICAgIGlmIHN1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgnbmV0d29yaycpOgogICAgICAgICB0ZXN0cy5hcHBlbmQoTmV0d29ya2VkVGVzdHMpCi0gICAgICAgIHRlc3RzLmFwcGVuZChOZXR3b3JrZWRCSU9UZXN0cykKIAogICAgIGlmIF9oYXZlX3RocmVhZHM6CiAgICAgICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CmluZGV4IDAwODlhZTguLjZjYWM3MDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKQEAgLTIxLDYgKzIxLDEwIEBACiAKICMgPT09IEhlbHBlciBmdW5jdGlvbnMgYW5kIGNsYXNzID09PQogCitkZWYgc2lnbih4KToKKyAgICAiIiJSZXR1cm4gLTEuMCBmb3IgbmVnYXRpdmVzLCBpbmNsdWRpbmcgLTAuMCwgb3RoZXJ3aXNlICsxLjAuIiIiCisgICAgcmV0dXJuIG1hdGguY29weXNpZ24oMSwgeCkKKwogZGVmIF9uYW5fZXF1YWwoYSwgYik6CiAgICAgIiIiUmV0dXJuIFRydWUgaWYgYSBhbmQgYiBhcmUgYm90aCB0aGUgc2FtZSBraW5kIG9mIE5BTi4KIApAQCAtMjY0LDYgKzI2OCwxMyBAQAogIyA9PT0gVGVzdCB0aGUgaGVscGVycyA9PT0KICMgPT09PT09PT09PT09PT09PT09PT09PT09CiAKK2NsYXNzIFRlc3RTaWduKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIGhlbHBlciBmdW5jdGlvbiBzaWduKCkgd29ya3MgY29ycmVjdGx5LiIiIgorICAgIGRlZiB0ZXN0WmVyb2VzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBzaWduZWQgemVyb2VzIHJlcG9ydCB0aGVpciBzaWduIGNvcnJlY3RseS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduKDAuMCksICsxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ24oLTAuMCksIC0xKQorCiAKICMgLS0tIFRlc3RzIGZvciBhcHByb3hfZXF1YWwgLS0tCiAKQEAgLTY1OSw3ICs2NzAsNyBAQAogICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCiAgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PTyBhbmQgYWJvdmUiKQogICAgIGRlZiB0ZXN0X2RvY190ZXN0cyhzZWxmKToKLSAgICAgICAgZmFpbGVkLCB0cmllZCA9IGRvY3Rlc3QudGVzdG1vZChzdGF0aXN0aWNzKQorICAgICAgICBmYWlsZWQsIHRyaWVkID0gZG9jdGVzdC50ZXN0bW9kKHN0YXRpc3RpY3MsIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih0cmllZCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYWlsZWQsIDApCiAKQEAgLTcwMiw5ICs3MTMsOSBAQAogICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CiAgICAgICAgIEQgPSBEZWNpbWFsCiAgICAgICAgIF9leGFjdF9yYXRpbyA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjAuMTI1IikpLCAoMTI1LCAxMDAwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMTIuMzQ1IikpLCAoMTIzNDUsIDEwMDApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9leGFjdF9yYXRpbyhEKCItMS45OCIpKSwgKC0xOTgsIDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjAuMTI1IikpLCAoMSwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjEyLjM0NSIpKSwgKDI0NjksIDIwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIi0xLjk4IikpLCAoLTk5LCA1MCkpCiAKICAgICBkZWYgdGVzdF9pbmYoc2VsZik6CiAgICAgICAgIElORiA9IGZsb2F0KCJJTkYiKQpAQCAtNzQzLDE4ICs3NTQsMTggQEAKIAogCiBjbGFzcyBEZWNpbWFsVG9SYXRpb1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVGVzdCBfZGVjaW1hbF90b19yYXRpbyBwcml2YXRlIGZ1bmN0aW9uLgorICAgICMgVGVzdCBfZXhhY3RfcmF0aW8gcHJpdmF0ZSBmdW5jdGlvbi4KIAogICAgIGRlZiB0ZXN0X2luZmluaXR5KHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBJTkZzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgaW5mID0gRGVjaW1hbCgnSU5GJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKGluZiksIChpbmYsIE5vbmUpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oLWluZiksICgtaW5mLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhpbmYpLCAoaW5mLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9leGFjdF9yYXRpbygtaW5mKSwgKC1pbmYsIE5vbmUpKQogCiAgICAgZGVmIHRlc3RfbmFuKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBOQU5zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgZm9yIG5hbiBpbiAoRGVjaW1hbCgnTkFOJyksIERlY2ltYWwoJ3NOQU4nKSk6Ci0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8obmFuKQorICAgICAgICAgICAgbnVtLCBkZW4gPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhuYW4pCiAgICAgICAgICAgICAjIEJlY2F1c2UgTkFOcyBhbHdheXMgY29tcGFyZSBub24tZXF1YWwsIHdlIGNhbm5vdCB1c2UgYXNzZXJ0RXF1YWwuCiAgICAgICAgICAgICAjIE5vciBjYW4gd2UgdXNlIGFuIGlkZW50aXR5IHRlc3QsIGFzIHdlIGRvbid0IGd1YXJhbnRlZSBhbnl0aGluZwogICAgICAgICAgICAgIyBhYm91dCB0aGUgb2JqZWN0IGlkZW50aXR5LgpAQCAtNzY3LDMwICs3NzgsMzAgQEAKICAgICAgICAgZm9yIGQgaW4gbnVtYmVyczoKICAgICAgICAgICAgICMgRmlyc3QgdGVzdCBwb3NpdGl2ZSBkZWNpbWFscy4KICAgICAgICAgICAgIGFzc2VydCBkID4gMAotICAgICAgICAgICAgbnVtLCBkZW4gPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKGQpCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKGQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChudW0sIDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZGVuLCAwKQogICAgICAgICAgICAgIyBUaGVuIHRlc3QgbmVnYXRpdmUgZGVjaW1hbHMuCi0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oLWQpCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKC1kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobnVtLCAwKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGRlbiwgMCkKIAogICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2V4cG9uZW50KHNlbGYpOgogICAgICAgICAjIFRlc3QgcmVzdWx0IHdoZW4gdGhlIGV4cG9uZW50IGlzIG5lZ2F0aXZlLgotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIwLjEyMzQiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTIzNCwgMTAwMDApKQorICAgICAgICB0ID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oRGVjaW1hbCgiMC4xMjM0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgKDYxNywgNTAwMCkpCiAKICAgICBkZWYgdGVzdF9wb3NpdGl2ZV9leHBvbmVudChzZWxmKToKICAgICAgICAgIyBUZXN0IHJlc3VsdHMgd2hlbiB0aGUgZXhwb25lbnQgaXMgcG9zaXRpdmUuCi0gICAgICAgIHQgPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjEuMjM0ZTciKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjEuMjM0ZTciKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTIzNDAwMDAsIDEpKQogCiAgICAgZGVmIHRlc3RfcmVncmVzc2lvbl8yMDUzNihzZWxmKToKICAgICAgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDIwNTM2LgogICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1MzYKLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMWUyIikpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIxZTIiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTAwLCAxKSkKLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMS40N2U1IikpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIxLjQ3ZTUiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTQ3MDAwLCAxKSkKIAogCkBAIC05NzEsNiArOTgyLDMwMSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9uYW5fZXF1YWwoeCwgbmFuKSkKIAogCitjbGFzcyBGYWlsTmVnVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBfZmFpbF9uZWcgcHJpdmF0ZSBmdW5jdGlvbi4iIiIKKworICAgIGRlZiB0ZXN0X3Bhc3NfdGhyb3VnaChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQuCisgICAgICAgIHZhbHVlcyA9IFsxLCAyLjAsIEZyYWN0aW9uKDMpLCBEZWNpbWFsKDQpXQorICAgICAgICBuZXcgPSBsaXN0KHN0YXRpc3RpY3MuX2ZhaWxfbmVnKHZhbHVlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBuZXcpCisKKyAgICBkZWYgdGVzdF9uZWdhdGl2ZXNfcmFpc2Uoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IG5lZ2F0aXZlcyByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgIGZvciB4IGluIFsxLCAyLjAsIEZyYWN0aW9uKDMpLCBEZWNpbWFsKDQpXToKKyAgICAgICAgICAgIHNlcSA9IFsteF0KKyAgICAgICAgICAgIGl0ID0gc3RhdGlzdGljcy5fZmFpbF9uZWcoc2VxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RhdGlzdGljcy5TdGF0aXN0aWNzRXJyb3IsIG5leHQsIGl0KQorCisgICAgZGVmIHRlc3RfZXJyb3JfbXNnKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhIGdpdmVuIGVycm9yIG1lc3NhZ2UgaXMgdXNlZC4KKyAgICAgICAgbXNnID0gImJhZG5lc3MgIyVkIiAlIHJhbmRvbS5yYW5kaW50KDEwMDAwLCA5OTk5OSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dChzdGF0aXN0aWNzLl9mYWlsX25lZyhbLTFdLCBtc2cpKQorICAgICAgICBleGNlcHQgc3RhdGlzdGljcy5TdGF0aXN0aWNzRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGVycm1zZyA9IGUuYXJnc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24sIGJ1dCBpdCBkaWRuJ3QgaGFwcGVuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJtc2csIG1zZykKKworCitjbGFzcyBUZXN0X1Byb2R1Y3QoTnVtZXJpY1Rlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBwcml2YXRlIF9wcm9kdWN0IGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgZGF0YSA9IFsxLCAyLCA1LCA3LCA5XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX3Byb2R1Y3QoZGF0YSksICgwLCA2MzApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX3Byb2R1Y3QoZGF0YSoxMDApLCAoMCwgNjMwKioxMDApKQorCisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICBkYXRhID0gWzEuMCwgMi4wLCA0LjAsIDguMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9wcm9kdWN0KGRhdGEpLCAoOCwgMC4yNSkpCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHdpdGggZmxvYXRzIHRoYXQgb3ZlcmZsb3cuCisgICAgICAgIGRhdGEgPSBbMWUzMDBdKjUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9wcm9kdWN0KGRhdGEpLCAoNTk4MCwgMC42OTI4Mjg3OTUxMjgzMTkzKSkKKworICAgIGRlZiB0ZXN0X2ZyYWN0aW9ucyhzZWxmKToKKyAgICAgICAgRiA9IEZyYWN0aW9uCisgICAgICAgIGRhdGEgPSBbRigxNCwgMjMpLCBGKDY5LCAxKSwgRig2NjUsIDUyOSksIEYoMjk5LCAxMDUpLCBGKDE2ODMsIDM5KV0KKyAgICAgICAgZXhwLCBtYW50ID0gc3RhdGlzdGljcy5fcHJvZHVjdChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYW50LCBGKDIqMyo3KjExKjE3KjE5LCAyMykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1hbnQsIEYpKQorICAgICAgICAjIE1peGVkIEZyYWN0aW9uIGFuZCBpbnQuCisgICAgICAgIGRhdGEgPSBbMywgMjUsIEYoMiwgMTUpXQorICAgICAgICBleHAsIG1hbnQgPSBzdGF0aXN0aWNzLl9wcm9kdWN0KGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hbnQsIEYoMTApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtYW50LCBGKSkKKworICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CisgICAgICAgIEQgPSBEZWNpbWFsCisgICAgICAgIGRhdGEgPSBbRCgnMjQuNScpLCBEKCcxNy42JyksIEQoJzAuMDI1JyksIEQoJzEuMycpXQorICAgICAgICBleHBlY3RlZCA9IEQoJzE0LjAxNDAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5fcHJvZHVjdChkYXRhKSwgKDAsIGV4cGVjdGVkKSkKKworICAgIGRlZiB0ZXN0X21peGVkX2RlY2ltYWxfZmxvYXQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IG1peGVkIERlY2ltYWwgYW5kIGZsb2F0IHJhaXNlcy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGF0aXN0aWNzLl9wcm9kdWN0LCBbMS4wLCBEZWNpbWFsKDEpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGF0aXN0aWNzLl9wcm9kdWN0LCBbRGVjaW1hbCgxKSwgMS4wXSkKKworCitAdW5pdHRlc3Quc2tpcElmKFRydWUsICJGSVhNRTogdGVzdHMga25vd24gdG8gZmFpbCwgc2VlIGlzc3VlICMyNzE4MSIpCitjbGFzcyBUZXN0X050aF9Sb290KE51bWVyaWNUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcHJpdmF0ZSBfbnRoX3Jvb3QgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubnJvb3QgPSBzdGF0aXN0aWNzLl9udGhfcm9vdAorCisgICAgIyAtLS0gU3BlY2lhbCB2YWx1ZXMgKGluZmluaXRpZXMsIE5BTnMsIHplcm9lcykgLS0tCisKKyAgICBkZWYgdGVzdF9mbG9hdF9OQU4oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSByb290IG9mIGEgZmxvYXQgTkFOIGlzIGEgZmxvYXQgTkFOLgorICAgICAgICBOQU4gPSBmbG9hdCgnbmFuJykKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMiwgOSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYubnJvb3QoTkFOLCBuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF9kZWNpbWFsX1FOQU4oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgIGJlaGF2aW91ciB3aGVuIHRha2luZyB0aGUgcm9vdCBvZiBhIERlY2ltYWwgcXVpZXQgTkFOLgorICAgICAgICBOQU4gPSBkZWNpbWFsLkRlY2ltYWwoJ25hbicpCisgICAgICAgIHdpdGggZGVjaW1hbC5sb2NhbGNvbnRleHQoKSBhcyBjdHg6CisgICAgICAgICAgICBjdHgudHJhcHNbZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uXSA9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRlY2ltYWwuSW52YWxpZE9wZXJhdGlvbiwgc2VsZi5ucm9vdCwgTkFOLCA1KQorICAgICAgICAgICAgY3R4LnRyYXBzW2RlY2ltYWwuSW52YWxpZE9wZXJhdGlvbl0gPSAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5ucm9vdChOQU4sIDUpLmlzX3FuYW4oKSkKKworICAgIGRlZiB0ZXN0X2RlY2ltYWxfU05BTihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGFraW5nIHRoZSByb290IG9mIGEgRGVjaW1hbCBzTkFOIGFsd2F5cyByYWlzZXMuCisgICAgICAgIHNOQU4gPSBkZWNpbWFsLkRlY2ltYWwoJ3NuYW4nKQorICAgICAgICB3aXRoIGRlY2ltYWwubG9jYWxjb250ZXh0KCkgYXMgY3R4OgorICAgICAgICAgICAgY3R4LnRyYXBzW2RlY2ltYWwuSW52YWxpZE9wZXJhdGlvbl0gPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkZWNpbWFsLkludmFsaWRPcGVyYXRpb24sIHNlbGYubnJvb3QsIHNOQU4sIDUpCisgICAgICAgICAgICBjdHgudHJhcHNbZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uXSA9IDAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRlY2ltYWwuSW52YWxpZE9wZXJhdGlvbiwgc2VsZi5ucm9vdCwgc05BTiwgNSkKKworICAgIGRlZiB0ZXN0X2luZihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIHJvb3Qgb2YgaW5maW5pdHkgaXMgaW5maW5pdHkuCisgICAgICAgIGZvciBJTkYgaW4gKGZsb2F0KCdpbmYnKSwgZGVjaW1hbC5EZWNpbWFsKCdpbmYnKSk6CisgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgyLCA5KToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4sIGluZj1JTkYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoSU5GLCBuKSwgSU5GKQorCisgICAgIyBGSVhNRTogbmVlZCB0byBjaGVjayBEZWNpbWFsIHplcm9lcyB0b28uCisgICAgZGVmIHRlc3RfemVybyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIHJvb3Qgb2YgKzAuMCBpcyArMC4wLgorICAgICAgICBmb3IgbiBpbiByYW5nZSgyLCAxMSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYubnJvb3QoKzAuMCwgbikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMC4wKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbihyZXN1bHQpLCArMSkKKworICAgICMgRklYTUU6IG5lZWQgdG8gY2hlY2sgRGVjaW1hbCB6ZXJvZXMgdG9vLgorICAgIGRlZiB0ZXN0X25lZ196ZXJvKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgcm9vdCBvZiAtMC4wIGlzIC0wLjAuCisgICAgICAgIGZvciBuIGluIHJhbmdlKDIsIDExKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5ucm9vdCgtMC4wLCBuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAwLjApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduKHJlc3VsdCksIC0xKQorCisgICAgIyAtLS0gVGVzdCByZXR1cm4gdHlwZXMgLS0tCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0X3R5cGUoc2VsZiwgeCwgbiwgb3V0dHlwZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLm5yb290KHgsIG4pLCBvdXR0eXBlKQorICAgICAgICBjbGFzcyBNeVN1YmNsYXNzKHR5cGUoeCkpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5ucm9vdChNeVN1YmNsYXNzKHgpLCBuKSwgb3V0dHlwZSkKKworICAgIGRlZiB0ZXN0RGVjaW1hbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgRGVjaW1hbCBhcmd1bWVudHMgcmV0dXJuIERlY2ltYWwgcmVzdWx0cy4KKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHRfdHlwZShkZWNpbWFsLkRlY2ltYWwoJzMzLjMnKSwgMywgZGVjaW1hbC5EZWNpbWFsKQorCisgICAgZGVmIHRlc3RGbG9hdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgb3RoZXIgYXJndW1lbnRzIHJldHVybiBmbG9hdCByZXN1bHRzLgorICAgICAgICBmb3IgeCBpbiAoMC4yLCBGcmFjdGlvbigxMSwgNyksIDkxKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0X3R5cGUoeCwgNiwgZmxvYXQpCisKKyAgICAjIC0tLSBUZXN0IGJhZCBpbnB1dCAtLS0KKworICAgIGRlZiB0ZXN0QmFkT3JkZXJUeXBlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgbnJvb3QgcmFpc2VzIGNvcnJlY3RseSB3aGVuIG4gaGFzIHRoZSB3cm9uZyB0eXBlLgorICAgICAgICBmb3IgbiBpbiAoNS4wLCAyaiwgTm9uZSwgJ3gnLCBiJ3gnLCBbXSwge30sIHNldCgpLCBzaWduKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm5yb290LCAyLjUsIG4pCisKKyAgICBkZWYgdGVzdEJhZE9yZGVyVmFsdWVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBucm9vdCByYWlzZXMgY29ycmVjdGx5IHdoZW4gbiBoYXMgYSB3cm9uZyB2YWx1ZS4KKyAgICAgICAgZm9yIG4gaW4gKDEsIDAsIC0xLCAtMiwgLTg3KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5ucm9vdCwgMi41LCBuKQorCisgICAgZGVmIHRlc3RCYWRUeXBlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgbnJvb3QgcmFpc2VzIGNvcnJlY3RseSB3aGVuIHggaGFzIHRoZSB3cm9uZyB0eXBlLgorICAgICAgICBmb3IgeCBpbiAoTm9uZSwgJ3gnLCBiJ3gnLCBbXSwge30sIHNldCgpLCBzaWduKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm5yb290LCB4LCAzKQorCisgICAgZGVmIHRlc3ROZWdhdGl2ZUVycm9yKHNlbGYpOgorICAgICAgICAjIFRlc3QgbmVnYXRpdmUgeCByYWlzZXMgY29ycmVjdGx5LgorICAgICAgICB4ID0gcmFuZG9tLnVuaWZvcm0oLTIwLjAsIC0wLjEpCisgICAgICAgIGFzc2VydCB4IDwgMAorICAgICAgICBmb3IgbiBpbiByYW5nZSgzLCA3KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHg9eCwgbj1uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm5yb290LCB4LCBuKQorICAgICAgICAjIEFuZCBEZWNpbWFsLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm5yb290LCBEZWNpbWFsKC0yNyksIDMpCisKKyAgICAjIC0tLSBUZXN0IHRoYXQgbnJvb3QgaXMgbmV2ZXIgd29yc2UgdGhhbiBjYWxsaW5nIG1hdGgucG93KCkgLS0tCisKKyAgICBkZWYgY2hlY2tfZXJyb3JfaXNfbm9fd29yc2Uoc2VsZiwgeCwgbik6CisgICAgICAgIHkgPSBtYXRoLnBvdyh4LCBuKQorICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh4PXgsIG49biwgeT15KToKKyAgICAgICAgICAgIGVycjEgPSBhYnMoc2VsZi5ucm9vdCh5LCBuKSAtIHgpCisgICAgICAgICAgICBlcnIyID0gYWJzKG1hdGgucG93KHksIDEuMC9uKSAtIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChlcnIxLCBlcnIyKQorCisgICAgZGVmIHRlc3RDb21wYXJlV2l0aFBvd1NtYWxsKHNlbGYpOgorICAgICAgICAjIENvbXBhcmUgbnJvb3Qgd2l0aCBwb3cgZm9yIHNtYWxsIHZhbHVlcyBvZiB4LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMDApOgorICAgICAgICAgICAgeCA9IHJhbmRvbS51bmlmb3JtKDFlLTksIDEuMC0xZS05KQorICAgICAgICAgICAgbiA9IHJhbmRvbS5jaG9pY2UocmFuZ2UoMiwgMTYpKQorICAgICAgICAgICAgc2VsZi5jaGVja19lcnJvcl9pc19ub193b3JzZSh4LCBuKQorCisgICAgZGVmIHRlc3RDb21wYXJlV2l0aFBvd01lZGl1bShzZWxmKToKKyAgICAgICAgIyBDb21wYXJlIG5yb290IHdpdGggcG93IGZvciBtZWRpdW0tc2l6ZWQgdmFsdWVzIG9mIHguCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgICAgICB4ID0gcmFuZG9tLnVuaWZvcm0oMS4wLCAxMDAuMCkKKyAgICAgICAgICAgIG4gPSByYW5kb20uY2hvaWNlKHJhbmdlKDIsIDE2KSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZXJyb3JfaXNfbm9fd29yc2UoeCwgbikKKworICAgIGRlZiB0ZXN0Q29tcGFyZVdpdGhQb3dMYXJnZShzZWxmKToKKyAgICAgICAgIyBDb21wYXJlIG5yb290IHdpdGggcG93IGZvciBsYXJnaXNoIHZhbHVlcyBvZiB4LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMDApOgorICAgICAgICAgICAgeCA9IHJhbmRvbS51bmlmb3JtKDEwMC4wLCAxMDAwMC4wKQorICAgICAgICAgICAgbiA9IHJhbmRvbS5jaG9pY2UocmFuZ2UoMiwgMTYpKQorICAgICAgICAgICAgc2VsZi5jaGVja19lcnJvcl9pc19ub193b3JzZSh4LCBuKQorCisgICAgZGVmIHRlc3RDb21wYXJlV2l0aFBvd0h1Z2Uoc2VsZik6CisgICAgICAgICMgQ29tcGFyZSBucm9vdCB3aXRoIHBvdyBmb3IgaHVnZSB2YWx1ZXMgb2YgeC4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjAwKToKKyAgICAgICAgICAgIHggPSByYW5kb20udW5pZm9ybSgxZTIwLCAxZTUwKQorICAgICAgICAgICAgIyBXZSByZXN0cmljdCB0aGUgb3JkZXIgaGVyZSB0byBhdm9pZCBhbiBPdmVyZmxvdyBlcnJvci4KKyAgICAgICAgICAgIG4gPSByYW5kb20uY2hvaWNlKHJhbmdlKDIsIDcpKQorICAgICAgICAgICAgc2VsZi5jaGVja19lcnJvcl9pc19ub193b3JzZSh4LCBuKQorCisgICAgIyAtLS0gVGVzdCBmb3IgbnVtZXJpY2FsbHkgY29ycmVjdCBhbnN3ZXJzIC0tLQorCisgICAgZGVmIHRlc3RFeGFjdFBvd2VycyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgc21hbGwgaW50ZWdlciBwb3dlcnMgYXJlIGNhbGN1bGF0ZWQgZXhhY3RseS4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgNTEpOgorICAgICAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMiwgMTYpOgorICAgICAgICAgICAgICAgIGlmIChpLCBuKSA9PSAoMzUsIDEzKToKKyAgICAgICAgICAgICAgICAgICAgIyBTZWUgdGVzdEV4cGVjdGVkRmFpbHVyZTM1cDEzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoaT1pLCBuPW4pOgorICAgICAgICAgICAgICAgICAgICB4ID0gaSoqbgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoeCwgbiksIGkpCisKKyAgICBkZWYgdGVzdEV4cGVjdGVkRmFpbHVyZTM1cDEzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGV4cGVjdGVkIGZhaWx1cmUgMzUqKjEzIGlzIGFsbW9zdCBleGFjdC4KKyAgICAgICAgeCA9IDM1KioxMworICAgICAgICBlcnIgPSBhYnMoc2VsZi5ucm9vdCh4LCAxMykgLSAzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoZXJyLCAwLjAwMDAwMDAwMSkKKworICAgIGRlZiB0ZXN0T25lKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgcm9vdCBvZiAxLjAgaXMgMS4wLgorICAgICAgICBmb3IgbiBpbiByYW5nZSgyLCAxMSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdCgxLjAsIG4pLCAxLjApCisKKyAgICBkZWYgdGVzdEZyYWN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgRnJhY3Rpb24gcmVzdWx0cy4KKyAgICAgICAgeCA9IEZyYWN0aW9uKDg5LCA3NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KHgqKjEyLCAxMiksIGZsb2F0KHgpKQorCisgICAgZGVmIHRlc3RJbnQoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnQgcmVzdWx0cy4KKyAgICAgICAgeCA9IDI3NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoeCoqMjQsIDI0KSwgeCkKKworICAgIGRlZiB0ZXN0QmlnSW50KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBpbnRzIHRvbyBiaWcgdG8gY29udmVydCB0byBmbG9hdHMgd29yay4KKyAgICAgICAgYmlnbnVtID0gMTAqKjIwICAjIFRoYXQncyBub3QgdGhhdCBiaWcuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KGJpZ251bSoqMjgwLCAyODApLCBiaWdudW0pCisgICAgICAgICMgQ2FuIHdlIG1ha2UgaXQgYmlnZ2VyPworICAgICAgICBodWdlbnVtID0gYmlnbnVtKio1MAorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRvbyBiaWcgdG8gY29udmVydCB0byBhIGZsb2F0LgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5ID0gZmxvYXQoaHVnZW51bSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignaHVnZW51bSBpcyBub3QgYmlnIGVub3VnaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdChodWdlbnVtLCA1MCksIGZsb2F0KGJpZ251bSkpCisKKyAgICBkZWYgdGVzdERlY2ltYWwoc2VsZik6CisgICAgICAgICMgVGVzdCBEZWNpbWFsIHJlc3VsdHMuCisgICAgICAgIGZvciBzIGluICczLjc1OSA2NC4wMjcgNTIzNC4zMzgnLnNwbGl0KCk6CisgICAgICAgICAgICB4ID0gZGVjaW1hbC5EZWNpbWFsKHMpCisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh4PXgpOgorICAgICAgICAgICAgICAgIGEgPSBzZWxmLm5yb290KHgqKjUsIDUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCB4KQorICAgICAgICAgICAgICAgIGEgPSBzZWxmLm5yb290KHgqKjE3LCAxNykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHgpCisKKyAgICBkZWYgdGVzdEZsb2F0KHNlbGYpOgorICAgICAgICAjIFRlc3QgZmxvYXQgcmVzdWx0cy4KKyAgICAgICAgZm9yIHggaW4gKDMuMDRlLTE2LCAxOC4yNSwgNDYxLjMsIDEuOWUxNyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh4PXgpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucm9vdCh4KiozLCAzKSwgeCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnJvb3QoeCoqOCwgOCksIHgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5yb290KHgqKjExLCAxMSksIHgpCisKKworY2xhc3MgVGVzdF9OdGhSb290X05TKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGludGVybmFscyBvZiB0aGUgbnRoX3Jvb3QgZnVuY3Rpb24sIGhpZGRlbiBpbiBfbnJvb3RfTlMuIiIiCisKKyAgICBkZWYgdGVzdF9jbGFzc19jYW5ub3RfYmVfaW5zdGFudGlhdGVkKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBfbnJvb3RfTlMgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KKyAgICAgICAgIyBJdCBzaG91bGQgYmUgYSBuYW1lc3BhY2UsIGxpa2UgaW4gQysrIG9yIEMjLCBidXQgUHl0aG9uCisgICAgICAgICMgbGFja3MgdGhhdCBmZWF0dXJlIGFuZCBzbyB3ZSBoYXZlIHRvIG1ha2UgZG8gd2l0aCBhIGNsYXNzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXRpc3RpY3MuX25yb290X05TKQorCisKICMgPT09IFRlc3RzIGZvciBwdWJsaWMgZnVuY3Rpb25zID09PQogCiBjbGFzcyBVbml2YXJpYXRlQ29tbW9uTWl4aW46CkBAIC0xMDgyLDEzICsxMzg4LDEzIEBACiAgICAgTm90IGFsbCB0ZXN0cyB0byBkbyB3aXRoIHR5cGVzIG5lZWQgZ28gaW4gdGhpcyBjbGFzcy4gT25seSB0aG9zZSB0aGF0CiAgICAgcmVseSBvbiB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzYW1lIHR5cGUgYXMgaXRzIGlucHV0IGRhdGEuCiAgICAgIiIiCi0gICAgZGVmIHRlc3RfdHlwZXNfY29uc2VydmVkKHNlbGYpOgotICAgICAgICAjIFRlc3QgdGhhdCBmdW5jdGlvbnMga2VlcHMgdGhlIHNhbWUgdHlwZSBhcyB0aGVpciBkYXRhIHBvaW50cy4KLSAgICAgICAgIyAoRXhjbHVkZXMgbWl4ZWQgZGF0YSB0eXBlcy4pIFRoaXMgb25seSB0ZXN0cyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuCi0gICAgICAgICMgcmVzdWx0LCBub3QgdGhlIHZhbHVlLgorICAgIGRlZiBwcmVwYXJlX3R5cGVzX2Zvcl9jb25zZXJ2YXRpb25fdGVzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0eXBlcyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gYmUgY29uc2VydmVkLiIiIgogICAgICAgICBjbGFzcyBNeUZsb2F0KGZsb2F0KToKICAgICAgICAgICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoc3VwZXIoKS5fX3RydWVkaXZfXyhvdGhlcikpCisgICAgICAgICAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzdXBlcigpLl9fcnRydWVkaXZfXyhvdGhlcikpCiAgICAgICAgICAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoc3VwZXIoKS5fX3N1Yl9fKG90aGVyKSkKICAgICAgICAgICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlcik6CkBAIC0xMDk4LDkgKzE0MDQsMTQgQEAKICAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzdXBlcigpLl9fYWRkX18ob3RoZXIpKQogICAgICAgICAgICAgX19yYWRkX18gPSBfX2FkZF9fCisgICAgICAgIHJldHVybiAoZmxvYXQsIERlY2ltYWwsIEZyYWN0aW9uLCBNeUZsb2F0KQogCisgICAgZGVmIHRlc3RfdHlwZXNfY29uc2VydmVkKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBmdW5jdGlvbnMga2VlcHMgdGhlIHNhbWUgdHlwZSBhcyB0aGVpciBkYXRhIHBvaW50cy4KKyAgICAgICAgIyAoRXhjbHVkZXMgbWl4ZWQgZGF0YSB0eXBlcy4pIFRoaXMgb25seSB0ZXN0cyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuCisgICAgICAgICMgcmVzdWx0LCBub3QgdGhlIHZhbHVlLgogICAgICAgICBkYXRhID0gc2VsZi5wcmVwYXJlX2RhdGEoKQotICAgICAgICBmb3Iga2luZCBpbiAoZmxvYXQsIERlY2ltYWwsIEZyYWN0aW9uLCBNeUZsb2F0KToKKyAgICAgICAgZm9yIGtpbmQgaW4gc2VsZi5wcmVwYXJlX3R5cGVzX2Zvcl9jb25zZXJ2YXRpb25fdGVzdCgpOgogICAgICAgICAgICAgZCA9IFtraW5kKHgpIGZvciB4IGluIGRhdGFdCiAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZ1bmMoZCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyZXN1bHQpLCBraW5kKQpAQCAtMTI3NSwxMiArMTU4NiwxNiBAQAogICAgICAgICBmb3IgeCBpbiAoMjMsIDQyLjUsIDEuM2UxNSwgRnJhY3Rpb24oMTUsIDE5KSwgRGVjaW1hbCgnMC4yOCcpKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKFt4XSksIHgpCiAKKyAgICBkZWYgcHJlcGFyZV92YWx1ZXNfZm9yX3JlcGVhdGVkX3NpbmdsZV90ZXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gKDMuNSwgMTcsIDIuNWUxNSwgRnJhY3Rpb24oNjEsIDY3KSwgRGVjaW1hbCgnNC45NzEyJykpCisKICAgICBkZWYgdGVzdF9yZXBlYXRlZF9zaW5nbGVfdmFsdWUoc2VsZik6CiAgICAgICAgICMgVGhlIGF2ZXJhZ2Ugb2YgYSBzaW5nbGUgcmVwZWF0ZWQgdmFsdWUgaXMgdGhlIHZhbHVlIGl0c2VsZi4KLSAgICAgICAgZm9yIHggaW4gKDMuNSwgMTcsIDIuNWUxNSwgRnJhY3Rpb24oNjEsIDY3KSwgRGVjaW1hbCgnNC45NzEyJykpOgorICAgICAgICBmb3IgeCBpbiBzZWxmLnByZXBhcmVfdmFsdWVzX2Zvcl9yZXBlYXRlZF9zaW5nbGVfdGVzdCgpOgogICAgICAgICAgICAgZm9yIGNvdW50IGluICgyLCA1LCAxMCwgMjApOgotICAgICAgICAgICAgICAgIGRhdGEgPSBbeF0qY291bnQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhKSwgeCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh4PXgsIGNvdW50PWNvdW50KToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFt4XSpjb3VudAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhKSwgeCkKIAogCiBjbGFzcyBUZXN0TWVhbihOdW1lcmljVGVzdENhc2UsIEF2ZXJhZ2VNaXhpbiwgVW5pdmFyaWF0ZVR5cGVNaXhpbik6CkBAIC0xMzA0LDcgKzE2MTksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhKSwgMjIuMDE1NjI1KQogCiAgICAgZGVmIHRlc3RfZGVjaW1hbHMoc2VsZik6Ci0gICAgICAgICMgVGVzdCBtZWFuIHdpdGggaW50cy4KKyAgICAgICAgIyBUZXN0IG1lYW4gd2l0aCBEZWNpbWFscy4KICAgICAgICAgRCA9IERlY2ltYWwKICAgICAgICAgZGF0YSA9IFtEKCIxLjYzNCIpLCBEKCIyLjUxNyIpLCBEKCIzLjkxMiIpLCBEKCI0LjA3MiIpLCBEKCI1LjgxMyIpXQogICAgICAgICByYW5kb20uc2h1ZmZsZShkYXRhKQpAQCAtMTM3OSw2ICsxNjk0LDk0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MubWVhbihbdGlueV0qbiksIHRpbnkpCiAKIAorY2xhc3MgVGVzdEhhcm1vbmljTWVhbihOdW1lcmljVGVzdENhc2UsIEF2ZXJhZ2VNaXhpbiwgVW5pdmFyaWF0ZVR5cGVNaXhpbik6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZ1bmMgPSBzdGF0aXN0aWNzLmhhcm1vbmljX21lYW4KKworICAgIGRlZiBwcmVwYXJlX2RhdGEoc2VsZik6CisgICAgICAgICMgT3ZlcnJpZGUgbWl4aW4gbWV0aG9kLgorICAgICAgICB2YWx1ZXMgPSBzdXBlcigpLnByZXBhcmVfZGF0YSgpCisgICAgICAgIHZhbHVlcy5yZW1vdmUoMCkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIHByZXBhcmVfdmFsdWVzX2Zvcl9yZXBlYXRlZF9zaW5nbGVfdGVzdChzZWxmKToKKyAgICAgICAgIyBPdmVycmlkZSBtaXhpbiBtZXRob2QuCisgICAgICAgIHJldHVybiAoMy41LCAxNywgMi41ZTE1LCBGcmFjdGlvbig2MSwgNjcpLCBEZWNpbWFsKCc0LjEyNScpKQorCisgICAgZGVmIHRlc3RfemVybyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgaGFybW9uaWMgbWVhbiByZXR1cm5zIHplcm8gd2hlbiBnaXZlbiB6ZXJvLgorICAgICAgICB2YWx1ZXMgPSBbMSwgMCwgMl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmModmFsdWVzKSwgMCkKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2Vycm9yKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBoYXJtb25pYyBtZWFuIHJhaXNlcyB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgdmFsdWUuCisgICAgICAgIGV4YyA9IHN0YXRpc3RpY3MuU3RhdGlzdGljc0Vycm9yCisgICAgICAgIGZvciB2YWx1ZXMgaW4gKFstMV0sIFsxLCAtMiwgM10pOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QodmFsdWVzPXZhbHVlcyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXhjLCBzZWxmLmZ1bmMsIHZhbHVlcykKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgICMgVGVzdCBoYXJtb25pYyBtZWFuIHdpdGggaW50cy4KKyAgICAgICAgZGF0YSA9IFsyLCA0LCA0LCA4LCAxNiwgMTZdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCA2KjQvNSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0c19leGFjdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcm1vbmljIG1lYW4gd2l0aCBzb21lIGNhcmVmdWxseSBjaG9zZW4gZmxvYXRzLgorICAgICAgICBkYXRhID0gWzEvOCwgMS80LCAxLzQsIDEvMiwgMS8yXQorICAgICAgICByYW5kb20uc2h1ZmZsZShkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhkYXRhKSwgMS80KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZnVuYyhbMC4yNSwgMC41LCAxLjAsIDEuMF0pLCAwLjUpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25fbGlzdHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGhhcm1vbmljIG1lYW4oW3hdKSByZXR1cm5zIChhcHByb3hpbWF0ZWx5KSB4LgorICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCAxMDEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoW3hdKSwgeCkKKworICAgIGRlZiB0ZXN0X2RlY2ltYWxzX2V4YWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFybW9uaWMgbWVhbiB3aXRoIHNvbWUgY2FyZWZ1bGx5IGNob3NlbiBEZWNpbWFscy4KKyAgICAgICAgRCA9IERlY2ltYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoW0QoMTUpLCBEKDMwKSwgRCg2MCksIEQoNjApXSksIEQoMzApKQorICAgICAgICBkYXRhID0gW0QoIjAuMDUiKSwgRCgiMC4xMCIpLCBEKCIwLjIwIiksIEQoIjAuMjAiKV0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoZGF0YSksIEQoIjAuMTAiKSkKKyAgICAgICAgZGF0YSA9IFtEKCIxLjY4IiksIEQoIjAuMzIiKSwgRCgiNS45NCIpLCBEKCIyLjc1IildCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCBEKDY2NTI4KS83MDcyMykKKworICAgIGRlZiB0ZXN0X2ZyYWN0aW9ucyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcm1vbmljIG1lYW4gd2l0aCBGcmFjdGlvbnMuCisgICAgICAgIEYgPSBGcmFjdGlvbgorICAgICAgICBkYXRhID0gW0YoMSwgMiksIEYoMiwgMyksIEYoMywgNCksIEYoNCwgNSksIEYoNSwgNiksIEYoNiwgNyksIEYoNywgOCldCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEpLCBGKDcqNDIwLCA0MDI5KSkKKworICAgIGRlZiB0ZXN0X2luZihzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcm1vbmljIG1lYW4gd2l0aCBpbmZpbml0eS4KKyAgICAgICAgdmFsdWVzID0gWzIuMCwgZmxvYXQoJ2luZicpLCAxLjBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKHZhbHVlcyksIDIuMCkKKworICAgIGRlZiB0ZXN0X25hbihzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcm1vbmljIG1lYW4gd2l0aCBOQU5zLgorICAgICAgICB2YWx1ZXMgPSBbMi4wLCBmbG9hdCgnbmFuJyksIDEuMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oc2VsZi5mdW5jKHZhbHVlcykpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbHlfZGF0YV9wb2ludHMoc2VsZik6CisgICAgICAgICMgVGVzdCBtdWx0aXBseWluZyBldmVyeSBkYXRhIHBvaW50IGJ5IGEgY29uc3RhbnQuCisgICAgICAgIGMgPSAxMTEKKyAgICAgICAgZGF0YSA9IFszLjQsIDQuNSwgNC45LCA2LjcsIDYuOCwgNy4yLCA4LjAsIDguMSwgOS40XQorICAgICAgICBleHBlY3RlZCA9IHNlbGYuZnVuYyhkYXRhKSpjCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZnVuYyhbeCpjIGZvciB4IGluIGRhdGFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9kb3VibGVkX2RhdGEoc2VsZik6CisgICAgICAgICMgSGFybW9uaWMgbWVhbiBvZiBbYSxiLi4uel0gc2hvdWxkIGJlIHNhbWUgYXMgZm9yIFthLGEsYixiLi4ueix6XS4KKyAgICAgICAgZGF0YSA9IFtyYW5kb20udW5pZm9ybSgxLCA1KSBmb3IgXyBpbiByYW5nZSgxMDAwKV0KKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLmZ1bmMoZGF0YSkKKyAgICAgICAgYWN0dWFsID0gc2VsZi5mdW5jKGRhdGEqMikKKyAgICAgICAgc2VsZi5hc3NlcnRBcHByb3hFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisKIGNsYXNzIFRlc3RNZWRpYW4oTnVtZXJpY1Rlc3RDYXNlLCBBdmVyYWdlTWl4aW4pOgogICAgICMgQ29tbW9uIHRlc3RzIGZvciBtZWRpYW4gYW5kIGFsbCBtZWRpYW4uKiBmdW5jdGlvbnMuCiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTYwMCw2ICsyMDAzLDIyIEBACiAgICAgICAgIGRhdGEgPSBbMjIwLCAyMjAsIDI0MCwgMjYwLCAyNjAsIDI2MCwgMjYwLCAyODAsIDI4MCwgMzAwLCAzMjAsIDM0MF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZ1bmMoZGF0YSwgMjApLCAyNjUuMCkKIAorICAgIGRlZiB0ZXN0X2RhdGFfdHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgIyBUZXN0IG1lZGlhbl9ncm91cGVkIHdpdGggc3RyLCBieXRlcyBkYXRhIHR5cGVzIGZvciBkYXRhIGFuZCBpbnRlcnZhbAorICAgICAgICBkYXRhID0gWyIiLCAiIiwgIiJdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mdW5jLCBkYXRhKQorICAgICAgICAjLS0tCisgICAgICAgIGRhdGEgPSBbYiIiLCBiIiIsIGIiIl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmZ1bmMsIGRhdGEpCisgICAgICAgICMtLS0KKyAgICAgICAgZGF0YSA9IFsxLCAyLCAzXQorICAgICAgICBpbnRlcnZhbCA9ICIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mdW5jLCBkYXRhLCBpbnRlcnZhbCkKKyAgICAgICAgIy0tLQorICAgICAgICBkYXRhID0gWzEsIDIsIDNdCisgICAgICAgIGludGVydmFsID0gYiIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mdW5jLCBkYXRhLCBpbnRlcnZhbCkKKwogCiBjbGFzcyBUZXN0TW9kZShOdW1lcmljVGVzdENhc2UsIEF2ZXJhZ2VNaXhpbiwgVW5pdmFyaWF0ZVR5cGVNaXhpbik6CiAgICAgIyBUZXN0IGNhc2VzIGZvciB0aGUgZGlzY3JldGUgdmVyc2lvbiBvZiBtb2RlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKaW5kZXggODUxMjZlNi4uOGM4Zjk3YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CkBAIC01LDcgKzUsNiBAQAogaW1wb3J0IGxvY2FsZQogaW1wb3J0IHJlCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZSBhcyBkYXRldGltZV9kYXRlCiAKQEAgLTE1Myw4ICsxNTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIHVzaW5nICclcyc7IGdyb3VwICdhJyA9ICclcycsIGdyb3VwICdiJyA9ICVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChmb3VuZC5zdHJpbmcsIGZvdW5kLnJlLnBhdHRlcm4sIGZvdW5kLmdyb3VwKCdhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmdyb3VwKCdiJykpKQotICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsJ0EnLCdiJywnQicsJ2MnLCdkJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywnUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdVJywndycsJ1cnLCd4JywnWCcsJ3knLCdZJywnWicsJyUnKToKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0cnLCdIJywnSScsJ2onLCdtJywnTScsJ3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsJ3UnLCdVJywnVicsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CiAgICAgICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKCIlIiArIGRpcmVjdGl2ZSkKICAgICAgICAgICAgIGZvdW5kID0gY29tcGlsZWQubWF0Y2godGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiTWF0Y2hpbmcgZmFpbGVkIG9uICclcycgdXNpbmcgJyVzJyByZWdleCIgJQpAQCAtMjE5LDYgKzIxOCwyNiBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiclcycgZGlkIG5vdCByYWlzZSBWYWx1ZUVycm9yIiAlIGJhZF9mb3JtYXQpCiAKKyAgICAgICAgIyBBbWJpZ3VvdXMgb3IgaW5jb21wbGV0ZSBjYXNlcyB1c2luZyBJU08geWVhci93ZWVrL3dlZWtkYXkgZGlyZWN0aXZlcworICAgICAgICAjIDEuIElTTyB3ZWVrICglVikgaXMgc3BlY2lmaWVkLCBidXQgdGhlIHllYXIgaXMgc3BlY2lmaWVkIHdpdGggJVkKKyAgICAgICAgIyBpbnN0ZWFkIG9mICVHCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUwIiwgIiVZICVWIikKKyAgICAgICAgIyAyLiBJU08geWVhciAoJUcpIGFuZCBJU08gd2VlayAoJVYpIGFyZSBzcGVjaWZpZWQsIGJ1dCB3ZWVrZGF5IGlzIG5vdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MSIsICIlRyAlViIpCisgICAgICAgICMgMy4gSVNPIHllYXIgKCVHKSBhbmQgd2Vla2RheSBhcmUgc3BlY2lmaWVkLCBidXQgSVNPIHdlZWsgKCVWKSBpcyBub3QKKyAgICAgICAgZm9yIHcgaW4gKCdBJywgJ2EnLCAndycsICd1Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTEiLCIlRyAle30iLmZvcm1hdCh3KSkKKyAgICAgICAgIyA0LiBJU08geWVhciBpcyBzcGVjaWZpZWQgYWxvbmUgKGUuZy4gdGltZS5zdHJwdGltZSgnMjAxNScsICclRycpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMjAxNSIsICIlRyIpCisgICAgICAgICMgNS4gSnVsaWFuL29yZGluYWwgZGF5ICglaikgaXMgc3BlY2lmaWVkIHdpdGggJUcsIGJ1dCBub3QgJVkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgMjU2IiwgIiVHICVqIikKKworCiAgICAgZGVmIHRlc3Rfc3RycHRpbWVfZXhjZXB0aW9uX2NvbnRleHQoc2VsZik6CiAgICAgICAgICMgY2hlY2sgdGhhdCB0aGlzIGRvZXNuJ3QgY2hhaW4gZXhjZXB0aW9ucyBuZWVkbGVzc2x5IChzZWUgIzE3NTcyKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGU6CkBAIC0yOTAsNyArMzA5LDcgQEAKIAogICAgIGRlZiB0ZXN0X3dlZWtkYXkoc2VsZik6CiAgICAgICAgICMgVGVzdCB3ZWVrZGF5IGRpcmVjdGl2ZXMKLSAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ0EnLCAnYScsICd3Jyk6CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdBJywgJ2EnLCAndycsICd1Jyk6CiAgICAgICAgICAgICBzZWxmLmhlbHBlcihkaXJlY3RpdmUsNikKIAogICAgIGRlZiB0ZXN0X2p1bGlhbihzZWxmKToKQEAgLTQ1NywxNiArNDc2LDIwIEBACiAgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gaW5mZXIgZGF0ZSBpZiBnaXZlbiB5ZWFyLCB3ZWVrIG9mIHllYXIgKCVVIG9yICVXKQogICAgICAgICAjIGFuZCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgZGVmIHRlc3RfaGVscGVyKHltZF90dXBsZSwgdGVzdF9yZWFzb24pOgotICAgICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ1cnLCAnVScpOgotICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJSVZICUlJXMgJSV3IiAlIGRpcmVjdGl2ZQotICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCi0gICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKLSAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LCBmb3JtYXRfc3RyaW5nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSB0ZXN0IGZhaWxlZCB3LyAnJXMnOiAlcyAhPSAlcyAoJXMgIT0gJXMpIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfcmVhc29uLCBkaXJlY3RpdmUsIHN0cnBfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs3XSwgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkpCisgICAgICAgICAgICBmb3IgeWVhcl93ZWVrX2Zvcm1hdCBpbiAoJyVZICVXJywgJyVZICVVJywgJyVHICVWJyk6CisgICAgICAgICAgICAgICAgZm9yIHdlZWtkYXlfZm9ybWF0IGluICgnJXcnLCAnJXUnLCAnJWEnLCAnJUEnKToKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZyA9IHllYXJfd2Vla19mb3JtYXQgKyAnICcgKyB3ZWVrZGF5X2Zvcm1hdAorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0X3JlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT15bWRfdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD1mb3JtYXRfc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX2lucHV0ID0gZHRfZGF0ZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiJXI6ICVzICE9ICVzIiAlIChzdHJwX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdF9kYXRlLnRpbWV0dXBsZSgpWzddKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwgbXNnKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMyksICJ3ZWVrIDAiKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgOCksICJjb21tb24gY2FzZSIpCiAgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAxMyksICJkYXkgb24gU3VuZGF5IikKQEAgLTQ5OCwzMyArNTIxLDQ4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh2YWx1ZSwgZm9ybWF0KVs6LTFdLCBleHBlY3RlZCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAwJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDI4LCAwLCAwLCAwLCA2LCAzNjIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMCcsICclWSAlVyAldycsIDIwMTUsIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMScsICclRyAlViAldScsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzYzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDEnLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2MykKICAgICAgICAgY2hlY2soJzIwMTUgMCAxJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMicsICclRyAlViAldScsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQogICAgICAgICBjaGVjaygnMjAxNSAwIDInLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAyJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjQpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMycsICclRyAlViAldScsIDIwMTQsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY1KQogICAgICAgICBjaGVjaygnMjAxNSAwIDMnLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMTUgMCAzJywgJyVZICVXICV3JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjUpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNCcsICclRyAlViAldScsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVSAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVyAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNScsICclRyAlViAldScsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVSAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVyAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNicsICclRyAlViAldScsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVSAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVyAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNycsICclRyAlViAldScsIDIwMTUsIDEsIDQsIDAsIDAsIDAsIDYsIDQpCiAKICAgICAgICAgY2hlY2soJzIwMDkgMCAwJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDI4LCAwLCAwLCAwLCA2LCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMCcsICclWSAlVyAldycsIDIwMDksIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMScsICclRyAlViAldScsIDIwMDgsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzY0KQogICAgICAgICBjaGVjaygnMjAwOSAwIDEnLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMDkgMCAxJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjQpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMicsICclRyAlViAldScsIDIwMDgsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY1KQogICAgICAgICBjaGVjaygnMjAwOSAwIDInLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMDkgMCAyJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjUpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgMycsICclRyAlViAldScsIDIwMDgsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY2KQogICAgICAgICBjaGVjaygnMjAwOSAwIDMnLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NikKICAgICAgICAgY2hlY2soJzIwMDkgMCAzJywgJyVZICVXICV3JywgMjAwOCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjYpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNCcsICclRyAlViAldScsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNCcsICclWSAlVSAldycsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNCcsICclWSAlVyAldycsIDIwMDksIDEsIDEsIDAsIDAsIDAsIDMsIDEpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNScsICclRyAlViAldScsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNScsICclWSAlVSAldycsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNScsICclWSAlVyAldycsIDIwMDksIDEsIDIsIDAsIDAsIDAsIDQsIDIpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNicsICclRyAlViAldScsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNicsICclWSAlVSAldycsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgNicsICclWSAlVyAldycsIDIwMDksIDEsIDMsIDAsIDAsIDAsIDUsIDMpCisgICAgICAgIGNoZWNrKCcyMDA5IDEgNycsICclRyAlViAldScsIDIwMDksIDEsIDQsIDAsIDAsIDAsIDYsIDQpCisKIAogY2xhc3MgQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCB0aGF0IGNhY2hpbmcgd29ya3MgcHJvcGVybHkuIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CmluZGV4IGVmYmRiZmMuLjRkOWQ2MDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CkBAIC0xLDUgKzEsNiBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgYWJjCiBpbXBvcnQgYXJyYXkKK2ltcG9ydCBtYXRoCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN0cnVjdApAQCAtMTUsMjIgKzE2LDEwIEBACiBkZWYgaXRlcl9pbnRlZ2VyX2Zvcm1hdHMoYnl0ZW9yZGVycz1ieXRlb3JkZXJzKToKICAgICBmb3IgY29kZSBpbiBpbnRlZ2VyX2NvZGVzOgogICAgICAgICBmb3IgYnl0ZW9yZGVyIGluIGJ5dGVvcmRlcnM6Ci0gICAgICAgICAgICBpZiAoYnl0ZW9yZGVyIGluICgnJywgJ0AnKSBhbmQgY29kZSBpbiAoJ3EnLCAnUScpIGFuZAotICAgICAgICAgICAgICAgIG5vdCBIQVZFX0xPTkdfTE9ORyk6Ci0gICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIChieXRlb3JkZXIgbm90IGluICgnJywgJ0AnKSBhbmQgY29kZSBpbiAoJ24nLCAnTicpKToKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgeWllbGQgY29kZSwgYnl0ZW9yZGVyCiAKLSMgTmF0aXZlICdxJyBwYWNraW5nIGlzbid0IGF2YWlsYWJsZSBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgQwotIyBsb25nIGxvbmcgdHlwZS4KLXRyeToKLSAgICBzdHJ1Y3QucGFjaygncScsIDUpCi1leGNlcHQgc3RydWN0LmVycm9yOgotICAgIEhBVkVfTE9OR19MT05HID0gRmFsc2UKLWVsc2U6Ci0gICAgSEFWRV9MT05HX0xPTkcgPSBUcnVlCi0KIGRlZiBzdHJpbmdfcmV2ZXJzZShzKToKICAgICByZXR1cm4gc1s6Oi0xXQogCkBAIC0xNTgsOSArMTQ3LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgZXhwZWN0ZWRfc2l6ZVtjb2RlXSkKIAogICAgICAgICAjIG5hdGl2ZSBpbnRlZ2VyIHNpemVzCi0gICAgICAgIG5hdGl2ZV9wYWlycyA9ICdiQicsICdoSCcsICdpSScsICdsTCcsICduTicKLSAgICAgICAgaWYgSEFWRV9MT05HX0xPTkc6Ci0gICAgICAgICAgICBuYXRpdmVfcGFpcnMgKz0gJ3FRJywKKyAgICAgICAgbmF0aXZlX3BhaXJzID0gJ2JCJywgJ2hIJywgJ2lJJywgJ2xMJywgJ25OJywgJ3FRJwogICAgICAgICBmb3IgZm9ybWF0X3BhaXIgaW4gbmF0aXZlX3BhaXJzOgogICAgICAgICAgICAgZm9yIGJ5dGVvcmRlciBpbiAnJywgJ0AnOgogICAgICAgICAgICAgICAgIHNpZ25lZF9zaXplID0gc3RydWN0LmNhbGNzaXplKGJ5dGVvcmRlciArIGZvcm1hdF9wYWlyWzBdKQpAQCAtMTczLDkgKzE2MCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDQsIHN0cnVjdC5jYWxjc2l6ZSgnbCcpKQogICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ2gnKSwgc3RydWN0LmNhbGNzaXplKCdpJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnaScpLCBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSkKLSAgICAgICAgaWYgSEFWRV9MT05HX0xPTkc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCg4LCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnbCcpLCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoOCwgc3RydWN0LmNhbGNzaXplKCdxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnbCcpLCBzdHJ1Y3QuY2FsY3NpemUoJ3EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoc3RydWN0LmNhbGNzaXplKCduJyksIHN0cnVjdC5jYWxjc2l6ZSgnaScpKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ24nKSwgc3RydWN0LmNhbGNzaXplKCdQJykpCiAKQEAgLTM2Niw4ICszNTIsNiBAQAogICAgICAgICAjIFNGIGJ1ZyA3MDU4MzYuICAiPGYiIGFuZCAiPmYiIGhhZCBhIHNldmVyZSByb3VuZGluZyBidWcsIHdoZXJlIGEgY2FycnkKICAgICAgICAgIyBmcm9tIHRoZSBsb3ctb3JkZXIgZGlzY2FyZGVkIGJpdHMgY291bGQgcHJvcGFnYXRlIGludG8gdGhlIGV4cG9uZW50CiAgICAgICAgICMgZmllbGQsIGNhdXNpbmcgdGhlIHJlc3VsdCB0byBiZSB3cm9uZyBieSBhIGZhY3RvciBvZiAyLgotICAgICAgICBpbXBvcnQgbWF0aAotCiAgICAgICAgIGZvciBiYXNlIGluIHJhbmdlKDEsIDMzKToKICAgICAgICAgICAgICMgc21hbGxlciA8LSBsYXJnZXN0IHJlcHJlc2VudGFibGUgZmxvYXQgbGVzcyB0aGFuIGJhc2UuCiAgICAgICAgICAgICBkZWx0YSA9IDAuNQpAQCAtNjU5LDYgKzY0MywxMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgaXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGl0KQogCisgICAgZGVmIHRlc3RfaGFsZl9mbG9hdChzZWxmKToKKyAgICAgICAgIyBMaXR0bGUtZW5kaWFuIGV4YW1wbGVzIGZyb206CisgICAgICAgICMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYWxmX3ByZWNpc2lvbl9mbG9hdGluZy1wb2ludF9mb3JtYXQKKyAgICAgICAgZm9ybWF0X2JpdHNfZmxvYXRfX2NsZWFuUm91bmR0cmlwX2xpc3QgPSBbCisgICAgICAgICAgICAoYidceDAwXHgzYycsIDEuMCksCisgICAgICAgICAgICAoYidceDAwXHhjMCcsIC0yLjApLAorICAgICAgICAgICAgKGInXHhmZlx4N2InLCA2NTUwNC4wKSwgIyAgKG1heCBoYWxmIHByZWNpc2lvbikKKyAgICAgICAgICAgIChiJ1x4MDBceDA0JywgMioqLTE0KSwgIyB+PSA2LjEwMzUyICogMTAqKi01IChtaW4gcG9zIG5vcm1hbCkKKyAgICAgICAgICAgIChiJ1x4MDFceDAwJywgMioqLTI0KSwgIyB+PSA1Ljk2MDQ2ICogMTAqKi04IChtaW4gcG9zIHN1Ym5vcm1hbCkKKyAgICAgICAgICAgIChiJ1x4MDBceDAwJywgMC4wKSwKKyAgICAgICAgICAgIChiJ1x4MDBceDgwJywgLTAuMCksCisgICAgICAgICAgICAoYidceDAwXHg3YycsIGZsb2F0KCcraW5mJykpLAorICAgICAgICAgICAgKGInXHgwMFx4ZmMnLCBmbG9hdCgnLWluZicpKSwKKyAgICAgICAgICAgIChiJ1x4NTVceDM1JywgMC4zMzMyNTE5NTMxMjUpLCAjIH49IDEvMworICAgICAgICBdCisKKyAgICAgICAgZm9yIGxlX2JpdHMsIGYgaW4gZm9ybWF0X2JpdHNfZmxvYXRfX2NsZWFuUm91bmR0cmlwX2xpc3Q6CisgICAgICAgICAgICBiZV9iaXRzID0gbGVfYml0c1s6Oi0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBzdHJ1Y3QudW5wYWNrKCc8ZScsIGxlX2JpdHMpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZV9iaXRzLCBzdHJ1Y3QucGFjaygnPGUnLCBmKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgc3RydWN0LnVucGFjaygnPmUnLCBiZV9iaXRzKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmVfYml0cywgc3RydWN0LnBhY2soJz5lJywgZikpCisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgc3RydWN0LnVucGFjaygnZScsIGxlX2JpdHMpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVfYml0cywgc3RydWN0LnBhY2soJ2UnLCBmKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBzdHJ1Y3QudW5wYWNrKCdlJywgYmVfYml0cylbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiZV9iaXRzLCBzdHJ1Y3QucGFjaygnZScsIGYpKQorCisgICAgICAgICMgQ2hlY2sgZm9yIE5hTiBoYW5kbGluZzoKKyAgICAgICAgZm9ybWF0X2JpdHNfX25hbl9saXN0ID0gWworICAgICAgICAgICAgKCc8ZScsIGInXHgwMVx4ZmMnKSwKKyAgICAgICAgICAgICgnPGUnLCBiJ1x4MDBceGZlJyksCisgICAgICAgICAgICAoJzxlJywgYidceGZmXHhmZicpLAorICAgICAgICAgICAgKCc8ZScsIGInXHgwMVx4N2MnKSwKKyAgICAgICAgICAgICgnPGUnLCBiJ1x4MDBceDdlJyksCisgICAgICAgICAgICAoJzxlJywgYidceGZmXHg3ZicpLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIGZvcm1hdGNvZGUsIGJpdHMgaW4gZm9ybWF0X2JpdHNfX25hbl9saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oc3RydWN0LnVucGFjaygnPGUnLCBiaXRzKVswXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihzdHJ1Y3QudW5wYWNrKCc+ZScsIGJpdHNbOjotMV0pWzBdKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgcGFja2luZyBwcm9kdWNlcyBhIGJpdCBwYXR0ZXJuIHJlcHJlc2VudGluZyBhIHF1aWV0IE5hTjoKKyAgICAgICAgIyBhbGwgZXhwb25lbnQgYml0cyBhbmQgdGhlIG1zYiBvZiB0aGUgZnJhY3Rpb24gc2hvdWxkIGFsbCBiZSAxLgorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygnPGUnLCBtYXRoLm5hbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWNrZWRbMV0gJiAweDdlLCAweDdlKQorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygnPGUnLCAtbWF0aC5uYW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFja2VkWzFdICYgMHg3ZSwgMHg3ZSkKKworICAgICAgICAjIENoZWNrcyBmb3Igcm91bmQtdG8tZXZlbiBiZWhhdmlvcgorICAgICAgICBmb3JtYXRfYml0c19mbG9hdF9fcm91bmRpbmdfbGlzdCA9IFsKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4MDBceDAxJywgMi4wKiotMjUgKyAyLjAqKi0zNSksICMgUm91bmRzIHRvIG1pbmltdW0gc3Vibm9ybWFsCisgICAgICAgICAgICAoJz5lJywgYidceDAwXHgwMCcsIDIuMCoqLTI1KSwgIyBVbmRlcmZsb3dzIHRvIHplcm8gKG5lYXJlc3QgZXZlbiBtb2RlKQorICAgICAgICAgICAgKCc+ZScsIGInXHgwMFx4MDAnLCAyLjAqKi0yNiksICMgVW5kZXJmbG93cyB0byB6ZXJvCisgICAgICAgICAgICAoJz5lJywgYidceDAzXHhmZicsIDIuMCoqLTE0IC0gMi4wKiotMjQpLCAjIExhcmdlc3Qgc3Vibm9ybWFsLgorICAgICAgICAgICAgKCc+ZScsIGInXHgwM1x4ZmYnLCAyLjAqKi0xNCAtIDIuMCoqLTI1IC0gMi4wKiotNjUpLAorICAgICAgICAgICAgKCc+ZScsIGInXHgwNFx4MDAnLCAyLjAqKi0xNCAtIDIuMCoqLTI1KSwKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4MDRceDAwJywgMi4wKiotMTQpLCAjIFNtYWxsZXN0IG5vcm1hbC4KKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAxJywgMS4wKzIuMCoqLTExICsgMi4wKiotMTYpLCAjIHJvdW5kcyB0byAxLjArMioqKC0xMCkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAwJywgMS4wKzIuMCoqLTExKSwgIyByb3VuZHMgdG8gMS4wIChuZWFyZXN0IGV2ZW4gbW9kZSkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4M2NceDAwJywgMS4wKzIuMCoqLTEyKSwgIyByb3VuZHMgdG8gMS4wCisgICAgICAgICAgICAoJz5lJywgYidceDdiXHhmZicsIDY1NTA0KSwgIyBsYXJnZXN0IG5vcm1hbAorICAgICAgICAgICAgKCc+ZScsIGInXHg3Ylx4ZmYnLCA2NTUxOSksICMgcm91bmRzIHRvIDY1NTA0CisgICAgICAgICAgICAoJz5lJywgYidceDgwXHgwMScsIC0yLjAqKi0yNSAtIDIuMCoqLTM1KSwgIyBSb3VuZHMgdG8gbWluaW11bSBzdWJub3JtYWwKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4ODBceDAwJywgLTIuMCoqLTI1KSwgIyBVbmRlcmZsb3dzIHRvIHplcm8gKG5lYXJlc3QgZXZlbiBtb2RlKQorICAgICAgICAgICAgKCc+ZScsIGInXHg4MFx4MDAnLCAtMi4wKiotMjYpLCAjIFVuZGVyZmxvd3MgdG8gemVybworICAgICAgICAgICAgKCc+ZScsIGInXHhiY1x4MDEnLCAtMS4wLTIuMCoqLTExIC0gMi4wKiotMTYpLCAjIHJvdW5kcyB0byAxLjArMioqKC0xMCkKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4YmNceDAwJywgLTEuMC0yLjAqKi0xMSksICMgcm91bmRzIHRvIDEuMCAobmVhcmVzdCBldmVuIG1vZGUpCisgICAgICAgICAgICAoJz5lJywgYidceGJjXHgwMCcsIC0xLjAtMi4wKiotMTIpLCAjIHJvdW5kcyB0byAxLjAKKyAgICAgICAgICAgICgnPmUnLCBiJ1x4ZmJceGZmJywgLTY1NTE5KSwgIyByb3VuZHMgdG8gNjU1MDQKKyAgICAgICAgXQorCisgICAgICAgIGZvciBmb3JtYXRjb2RlLCBiaXRzLCBmIGluIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ19saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaXRzLCBzdHJ1Y3QucGFjayhmb3JtYXRjb2RlLCBmKSkKKworICAgICAgICAjIFRoaXMgb3ZlcmZsb3dzLCBhbmQgc28gcmFpc2VzIGFuIGVycm9yCisgICAgICAgIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ0Vycm9yX2xpc3QgPSBbCisgICAgICAgICAgICAjIFZhbHVlcyB0aGF0IHJvdW5kIHRvIGluZmluaXR5LgorICAgICAgICAgICAgKCc+ZScsIDY1NTIwLjApLAorICAgICAgICAgICAgKCc+ZScsIDY1NTM2LjApLAorICAgICAgICAgICAgKCc+ZScsIDFlMzAwKSwKKyAgICAgICAgICAgICgnPmUnLCAtNjU1MjAuMCksCisgICAgICAgICAgICAoJz5lJywgLTY1NTM2LjApLAorICAgICAgICAgICAgKCc+ZScsIC0xZTMwMCksCisgICAgICAgICAgICAoJzxlJywgNjU1MjAuMCksCisgICAgICAgICAgICAoJzxlJywgNjU1MzYuMCksCisgICAgICAgICAgICAoJzxlJywgMWUzMDApLAorICAgICAgICAgICAgKCc8ZScsIC02NTUyMC4wKSwKKyAgICAgICAgICAgICgnPGUnLCAtNjU1MzYuMCksCisgICAgICAgICAgICAoJzxlJywgLTFlMzAwKSwKKyAgICAgICAgXQorCisgICAgICAgIGZvciBmb3JtYXRjb2RlLCBmIGluIGZvcm1hdF9iaXRzX2Zsb2F0X19yb3VuZGluZ0Vycm9yX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzdHJ1Y3QucGFjaywgZm9ybWF0Y29kZSwgZikKKworICAgICAgICAjIERvdWJsZSByb3VuZGluZworICAgICAgICBmb3JtYXRfYml0c19mbG9hdF9fZG91YmxlUm91bmRpbmdFcnJvcl9saXN0ID0gWworICAgICAgICAgICAgKCc+ZScsIGInXHg2N1x4ZmYnLCAweDFmZmRmZmZmZmYgKiAyKiotMjYpLCAjIHNob3VsZCBiZSAyMDQ3LCBpZiBkb3VibGUtcm91bmRlZCA2ND4zMj4xNiwgYmVjb21lcyAyMDQ4CisgICAgICAgIF0KKworICAgICAgICBmb3IgZm9ybWF0Y29kZSwgYml0cywgZiBpbiBmb3JtYXRfYml0c19mbG9hdF9fZG91YmxlUm91bmRpbmdFcnJvcl9saXN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaXRzLCBzdHJ1Y3QucGFjayhmb3JtYXRjb2RlLCBmKSkKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJjbGFzc2luaXQucHkgYi9MaWIvdGVzdC90ZXN0X3N1YmNsYXNzaW5pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTZkZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zdWJjbGFzc2luaXQucHkKQEAgLTAsMCArMSwyNDQgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygpCisgICAgICAgICAgICAgICAgY2xzLmluaXRpYWxpemVkID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShBLmluaXRpYWxpemVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQi5pbml0aWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2luaXRfc3ViY2xhc3NfZGljdChzZWxmKToKKyAgICAgICAgY2xhc3MgQShkaWN0KToKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygpCisgICAgICAgICAgICAgICAgY2xzLmluaXRpYWxpemVkID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShBLmluaXRpYWxpemVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQi5pbml0aWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2luaXRfc3ViY2xhc3Nfa3dhcmdzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGNscy5rd2FyZ3MgPSBrd2FyZ3MKKworICAgICAgICBjbGFzcyBCKEEsIHg9Myk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCLmt3YXJncywgZGljdCh4PTMpKQorCisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzc19lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfaW5pdF9zdWJjbGFzc193cm9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsIHdoYXRldmVyKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pbml0X3N1YmNsYXNzX3NraXBwZWQoc2VsZik6CisgICAgICAgIGNsYXNzIEJhc2VXaXRoSW5pdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgIGNscy5pbml0aWFsaXplZCA9IGNscworCisgICAgICAgIGNsYXNzIEJhc2VXaXRob3V0SW5pdChCYXNlV2l0aEluaXQpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEEoQmFzZVdpdGhvdXRJbml0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydElzKEEuaW5pdGlhbGl6ZWQsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoQmFzZVdpdGhvdXRJbml0LmluaXRpYWxpemVkLCBCYXNlV2l0aG91dEluaXQpCisKKyAgICBkZWYgdGVzdF9pbml0X3N1YmNsYXNzX2RpYW1vbmQoc2VsZik6CisgICAgICAgIGNsYXNzIEJhc2U6CisgICAgICAgICAgICBkZWYgX19pbml0X3N1YmNsYXNzX18oY2xzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKKyAgICAgICAgICAgICAgICBjbHMuY2FsbHMgPSBbXQorCisgICAgICAgIGNsYXNzIExlZnQoQmFzZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgTWlkZGxlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgbWlkZGxlLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKKyAgICAgICAgICAgICAgICBjbHMuY2FsbHMgKz0gW21pZGRsZV0KKworICAgICAgICBjbGFzcyBSaWdodChCYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsIHJpZ2h0PSJyaWdodCIsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQorICAgICAgICAgICAgICAgIGNscy5jYWxscyArPSBbcmlnaHRdCisKKyAgICAgICAgY2xhc3MgQShMZWZ0LCBNaWRkbGUsIFJpZ2h0LCBtaWRkbGU9Im1pZGRsZSIpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQS5jYWxscywgWyJyaWdodCIsICJtaWRkbGUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMZWZ0LmNhbGxzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSaWdodC5jYWxscywgW10pCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYub3duZXIgPSBvd25lcgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZCA9IERlc2NyaXB0b3IoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQS5kLm5hbWUsICJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhBLmQub3duZXIsIEEpCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZV9tZXRhY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBucyk6CisgICAgICAgICAgICAgICAgcmV0ID0gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LmQubmFtZSwgImQiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocmV0LmQub3duZXIsIHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGNsYXNzIERlc2NyaXB0b3I6CisgICAgICAgICAgICBkZWYgX19zZXRfbmFtZV9fKHNlbGYsIG93bmVyLCBuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLm93bmVyID0gb3duZXIKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgY2xhc3MgQShtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBkID0gRGVzY3JpcHRvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQSwgMCkKKworICAgIGRlZiB0ZXN0X3NldF9uYW1lX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBEZXNjcmlwdG9yOgorICAgICAgICAgICAgZGVmIF9fc2V0X25hbWVfXyhzZWxmLCBvd25lciwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkID0gRGVzY3JpcHRvcigpCisKKyAgICBkZWYgdGVzdF9zZXRfbmFtZV93cm9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZCA9IERlc2NyaXB0b3IoKQorCisgICAgZGVmIHRlc3Rfc2V0X25hbWVfaW5pdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcjoKKyAgICAgICAgICAgIGRlZiBfX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYub3duZXIgPSBvd25lcgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbnMpOgorICAgICAgICAgICAgICAgIHNlbGYgPSBzdXBlcigpLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbnMpCisgICAgICAgICAgICAgICAgc2VsZi5tZXRhX293bmVyID0gc2VsZi5vd25lcgorICAgICAgICAgICAgICAgIHNlbGYubWV0YV9uYW1lID0gc2VsZi5uYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscyk6CisgICAgICAgICAgICAgICAgY2xzLm93bmVyID0gY2xzLmQub3duZXIKKyAgICAgICAgICAgICAgICBjbHMubmFtZSA9IGNscy5kLm5hbWUKKworICAgICAgICBjbGFzcyBCKEEsIG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIGQgPSBEZXNjcmlwdG9yKCkKKworICAgICAgICBzZWxmLmFzc2VydElzKEIub3duZXIsIEIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQi5uYW1lLCAnZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoQi5tZXRhX293bmVyLCBCKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIubmFtZSwgJ2QnKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdHlwZXMubmV3X2NsYXNzKCJNeUNsYXNzIiwgKG9iamVjdCwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QobWV0YWNsYXNzPU15TWV0YSwgb3RoZXJhcmc9MSkpCisgICAgICAgIHR5cGVzLnByZXBhcmVfY2xhc3MoIk15Q2xhc3MiLCAob2JqZWN0LCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdChtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKSkKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgb3RoZXJhcmcpOgorICAgICAgICAgICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NeU1ldGEsIG90aGVyYXJnPTEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgc2VsZi5vdGhlcmFyZyA9IG90aGVyYXJnCisKKyAgICAgICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TXlNZXRhLCBvdGhlcmFyZz0xKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15Q2xhc3Mub3RoZXJhcmcsIDEpCisKKyAgICBkZWYgdGVzdF9lcnJvcnNfY2hhbmdlZF9wZXA0ODcoc2VsZik6CisgICAgICAgICMgVGhlc2UgdGVzdHMgZmFpbGVkIGJlZm9yZSBQeXRob24gMy42LCBQRVAgNDg3CisgICAgICAgIGNsYXNzIE15TWV0YSh0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKCkuX19uZXdfXyhjbHMsIG5hbWU9bmFtZSwgYmFzZXM9YmFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0PW5hbWVzcGFjZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NeU1ldGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNeU1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsIG90aGVyYXJnKToKKyAgICAgICAgICAgICAgICBzZWxmID0gc3VwZXIoKS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICBzZWxmLm90aGVyYXJnID0gb3RoZXJhcmcKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU15TWV0YSwgb3RoZXJhcmc9MSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNeUNsYXNzLm90aGVyYXJnLCAxKQorCisgICAgZGVmIHRlc3RfdHlwZShzZWxmKToKKyAgICAgICAgdCA9IHR5cGUoJ05ld0NsYXNzJywgKG9iamVjdCwpLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHQsIHR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX25hbWVfXywgJ05ld0NsYXNzJykKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0eXBlKG5hbWU9J05ld0NsYXNzJywgYmFzZXM9KG9iamVjdCwpLCBkaWN0PXt9KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggNGI0MDliNy4uMmJmYjY5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMSwyMCArMSwxNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgc2NyaXB0X2hlbHBlcgogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHNpZ25hbAogaW1wb3J0IGlvCi1pbXBvcnQgbG9jYWxlCiBpbXBvcnQgb3MKIGltcG9ydCBlcnJubwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGltZQotaW1wb3J0IHJlCiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgc3lzY29uZmlnCi1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBnYwpAQCAtNDQ4LDggKzQ0NCw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoIm9yYW5nZSIpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJvcmFuZ2UiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJvcmFuZ2UiKQogCiAgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVkZXMoc2VsZik6CiAgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgpAQCAtNDc5LDggKzQ3NSw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoInN0cmF3YmVycnkiKSddLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZGVyci5yZWFkKCksIGIic3RyYXdiZXJyeSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRlcnIucmVhZCgpLCBiInN0cmF3YmVycnkiKQogCiAgICAgZGVmIHRlc3Rfc3RkZXJyX2ZpbGVkZXMoc2VsZik6CiAgICAgICAgICMgc3RkZXJyIGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgpAQCAtNTM1LDggKzUzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZGVyci53cml0ZSgib3JhbmdlIiknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlb3JhbmdlIikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIiYXBwbGVvcmFuZ2UiKQogCiAgICAgZGVmIHRlc3Rfc3Rkb3V0X3N0ZGVycl9maWxlKHNlbGYpOgogICAgICAgICAjIGNhcHR1cmUgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIHNhbWUgb3BlbiBmaWxlCkBAIC02ODYsNyArNjgyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsICJiYW5hbmEiKQogICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyci5lbmNvZGUoKSwgYiJwaW5lYXBwbGVcbnBlYXJcbiIpCiAKLSAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV90aW1lb3V0X2xhcmdlX291cHV0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX3RpbWVvdXRfbGFyZ2Vfb3V0cHV0KHNlbGYpOgogICAgICAgICAjIFRlc3QgYW4gZXhwaXJpbmcgdGltZW91dCB3aGlsZSB0aGUgY2hpbGQgaXMgb3V0cHV0dGluZyBsb3RzIG9mIGRhdGEuCiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zLHRpbWU7JwpAQCAtNzk0LDE4ICs3OTAsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9MSkKLSAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTFcbiIpCi0gICAgICAgIHAuc3RkaW4uZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWRsaW5lKCksICJsaW5lMVxuIikKLSAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTNcbiIpCi0gICAgICAgIHAuc3RkaW4uY2xvc2UoKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZGxpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTJcbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCg2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTNcbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lNFxubGluZTVcbmxpbmU2XG5saW5lN1xubGluZTgiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lMVxuIikKKyAgICAgICAgICAgIHAuc3RkaW4uZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLCAibGluZTFcbiIpCisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lM1xuIikKKyAgICAgICAgICAgIHAuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTJcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lM1xuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTRcbmxpbmU1XG5saW5lNlxubGluZTdcbmxpbmU4IikKIAogICAgIGRlZiB0ZXN0X3VuaXZlcnNhbF9uZXdsaW5lc19jb21tdW5pY2F0ZShzZWxmKToKICAgICAgICAgIyB1bml2ZXJzYWwgbmV3bGluZXMgdGhyb3VnaCBjb21tdW5pY2F0ZSgpCkBAIC0xNDMxLDYgKzE0MjgsMjcgQEAKICAgICAgICAgICAgIHAud2FpdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXAucmV0dXJuY29kZSwgc2lnbmFsLlNJR0FCUlQpCiAKKyAgICBkZWYgdGVzdF9DYWxsZWRQcm9jZXNzRXJyb3Jfc3RyX3NpZ25hbChzZWxmKToKKyAgICAgICAgZXJyID0gc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoLWludChzaWduYWwuU0lHQUJSVCksICJmYWtlIGNtZCIpCisgICAgICAgIGVycm9yX3N0cmluZyA9IHN0cihlcnIpCisgICAgICAgICMgV2UncmUgcmVseWluZyBvbiB0aGUgcmVwcigpIG9mIHRoZSBzaWduYWwuU2lnbmFscyBpbnRlbnVtIHRvIHByb3ZpZGUKKyAgICAgICAgIyB0aGUgd29yZCBzaWduYWwsIHRoZSBzaWduYWwgbmFtZSBhbmQgdGhlIG51bWVyaWMgdmFsdWUuCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInNpZ25hbCIsIGVycm9yX3N0cmluZy5sb3dlcigpKQorICAgICAgICAjIFdlJ3JlIG5vdCBiZWluZyBzcGVjaWZpYyBhYm91dCB0aGUgc2lnbmFsIG5hbWUgYXMgc29tZSBzaWduYWxzIGhhdmUKKyAgICAgICAgIyBtdWx0aXBsZSBuYW1lcyBhbmQgd2hpY2ggbmFtZSBpcyByZXZlYWxlZCBjYW4gdmFyeS4KKyAgICAgICAgc2VsZi5hc3NlcnRJbigiU0lHIiwgZXJyb3Jfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEluKHN0cihzaWduYWwuU0lHQUJSVCksIGVycm9yX3N0cmluZykKKworICAgIGRlZiB0ZXN0X0NhbGxlZFByb2Nlc3NFcnJvcl9zdHJfdW5rbm93bl9zaWduYWwoc2VsZik6CisgICAgICAgIGVyciA9IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKC05ODc2NTQzLCAiZmFrZSBjbWQiKQorICAgICAgICBlcnJvcl9zdHJpbmcgPSBzdHIoZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKCJ1bmtub3duIHNpZ25hbCA5ODc2NTQzLiIsIGVycm9yX3N0cmluZykKKworICAgIGRlZiB0ZXN0X0NhbGxlZFByb2Nlc3NFcnJvcl9zdHJfbm9uX3plcm8oc2VsZik6CisgICAgICAgIGVyciA9IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKDIsICJmYWtlIGNtZCIpCisgICAgICAgIGVycm9yX3N0cmluZyA9IHN0cihlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5vbi16ZXJvIGV4aXQgc3RhdHVzIDIuIiwgZXJyb3Jfc3RyaW5nKQorCiAgICAgZGVmIHRlc3RfcHJlZXhlYyhzZWxmKToKICAgICAgICAgIyBESVNDTEFJTUVSOiBTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpcyAqbm90KiBhIGdvb2QgdXNlCiAgICAgICAgICMgb2YgYSBwcmVleGVjX2ZuLiAgVGhpcyBpcyBtZXJlbHkgYSB0ZXN0LgpAQCAtMTQzOSw4ICsxNDU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKG9zLmdldGVudigiRlJVSVQiKSknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbj1sYW1iZGE6IG9zLnB1dGVudigiRlJVSVQiLCAiYXBwbGUiKSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlIikKIAogICAgIGRlZiB0ZXN0X3ByZWV4ZWNfZXhjZXB0aW9uKHNlbGYpOgogICAgICAgICBkZWYgcmFpc2VfaXQoKToKQEAgLTE1NjEsNyArMTU3OSw3IEBACiAgICAgICAgIGZkLCBmbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAjIHJlb3BlbiBpbiB0ZXh0IG1vZGUKICAgICAgICAgd2l0aCBvcGVuKGZkLCAidyIsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgZm9iajoKLSAgICAgICAgICAgIGZvYmoud3JpdGUoIiMhL2Jpbi9zaFxuIikKKyAgICAgICAgICAgIGZvYmoud3JpdGUoIiMhJXNcbiIgJSBzdXBwb3J0LnVuaXhfc2hlbGwpCiAgICAgICAgICAgICBmb2JqLndyaXRlKCJleGVjICclcycgLWMgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSdcbiIgJQogICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSkKICAgICAgICAgb3MuY2htb2QoZm5hbWUsIDBvNzAwKQpAQCAtMTU4OCw4ICsxNjA2LDggQEAKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJlY2hvICRGUlVJVCJdLCBzaGVsbD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcChiIiBcdFxyXG5cZiIpLCBiImFwcGxlIikKIAogICAgIGRlZiB0ZXN0X3NoZWxsX3N0cmluZyhzZWxmKToKICAgICAgICAgIyBSdW4gY29tbWFuZCB0aHJvdWdoIHRoZSBzaGVsbCAoc3RyaW5nKQpAQCAtMTU5OCwxNSArMTYxNiwxNSBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigiZWNobyAkRlJVSVQiLCBzaGVsbD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcChiIiBcdFxyXG5cZiIpLCBiImFwcGxlIikKIAogICAgIGRlZiB0ZXN0X2NhbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCBvbiBVTklYCiAgICAgICAgIGZkLCBmbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQogICAgICAgICAjIHJlb3BlbiBpbiB0ZXh0IG1vZGUKICAgICAgICAgd2l0aCBvcGVuKGZkLCAidyIsIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIikgYXMgZm9iajoKLSAgICAgICAgICAgIGZvYmoud3JpdGUoIiMhL2Jpbi9zaFxuIikKKyAgICAgICAgICAgIGZvYmoud3JpdGUoIiMhJXNcbiIgJSBzdXBwb3J0LnVuaXhfc2hlbGwpCiAgICAgICAgICAgICBmb2JqLndyaXRlKCJleGVjICclcycgLWMgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSdcbiIgJQogICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSkKICAgICAgICAgb3MuY2htb2QoZm5hbWUsIDBvNzAwKQpAQCAtMTYzMSw4ICsxNjQ5LDggQEAKICAgICAgICAgZm9yIHNoIGluIHNoZWxsczoKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJlY2hvICQwIiwgZXhlY3V0YWJsZT1zaCwgc2hlbGw9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCBieXRlcyhzaCwgJ2FzY2lpJykpCisgICAgICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoKSwgYnl0ZXMoc2gsICdhc2NpaScpKQogCiAgICAgZGVmIF9raWxsX3Byb2Nlc3Moc2VsZiwgbWV0aG9kLCAqYXJncyk6CiAgICAgICAgICMgRG8gbm90IGluaGVyaXQgZmlsZSBoYW5kbGVzIGZyb20gdGhlIHBhcmVudC4KQEAgLTIyOTAsNyArMjMwOCw5IEBACiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKICAgICAgICAgaWRlbnQgPSBpZChwKQogICAgICAgICBwaWQgPSBwLnBpZAotICAgICAgICBkZWwgcAorICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSZXNvdXJjZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHAgPSBOb25lCisKICAgICAgICAgIyBjaGVjayB0aGF0IHAgaXMgaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdAogICAgICAgICBzZWxmLmFzc2VydEluKGlkZW50LCBbaWQobykgZm9yIG8gaW4gc3VicHJvY2Vzcy5fYWN0aXZlXSkKIApAQCAtMjMwOSw3ICsyMzI5LDkgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQogICAgICAgICBpZGVudCA9IGlkKHApCiAgICAgICAgIHBpZCA9IHAucGlkCi0gICAgICAgIGRlbCBwCisgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJlc291cmNlV2FybmluZykpOgorICAgICAgICAgICAgcCA9IE5vbmUKKwogICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0tJTEwpCiAgICAgICAgICMgY2hlY2sgdGhhdCBwIGlzIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3QKICAgICAgICAgc2VsZi5hc3NlcnRJbihpZGVudCwgW2lkKG8pIGZvciBvIGluIHN1YnByb2Nlc3MuX2FjdGl2ZV0pCkBAIC0yNTAxLDggKzI1MjMsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbInNldCJdLCBzaGVsbD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQogCiAgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzdHJpbmcpCkBAIC0yNTExLDggKzI1MzMsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic2V0Iiwgc2hlbGw9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKIAogICAgIGRlZiB0ZXN0X2NhbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCBvbiBXaW5kb3dzCkBAIC0yNTMxLDE2ICsyNTUzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQotICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQotICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KLSAgICAgICAgcC5zdGRvdXQucmVhZCgxKQotICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCi0gICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQotICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQotICAgICAgICByZXR1cm5jb2RlID0gcC53YWl0KCkKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgorICAgICAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQorICAgICAgICAgICAgcmV0dXJuY29kZSA9IHAud2FpdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmV0dXJuY29kZSwgMCkKIAogICAgIGRlZiBfa2lsbF9kZWFkX3Byb2Nlc3Moc2VsZiwgbWV0aG9kLCAqYXJncyk6CkBAIC0yNTUzLDE5ICsyNTczLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQotICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQotICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KLSAgICAgICAgcC5zdGRvdXQucmVhZCgxKQotICAgICAgICAjIFRoZSBwcm9jZXNzIHNob3VsZCBlbmQgYWZ0ZXIgdGhpcwotICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgICMgVGhpcyBzaG91bGRuJ3QgcmFpc2UgZXZlbiB0aG91Z2ggdGhlIGNoaWxkIGlzIG5vdyBkZWFkCi0gICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKLSAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCi0gICAgICAgIHJjID0gcC53YWl0KCkKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgorICAgICAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICAgICAgIyBUaGUgcHJvY2VzcyBzaG91bGQgZW5kIGFmdGVyIHRoaXMKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgcmFpc2UgZXZlbiB0aG91Z2ggdGhlIGNoaWxkIGlzIG5vdyBkZWFkCisgICAgICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCisgICAgICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCisgICAgICAgICAgICByYyA9IHAud2FpdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQyKQogCiAgICAgZGVmIHRlc3Rfc2VuZF9zaWduYWwoc2VsZik6CkBAIC0yNjA4LDggKzI2MjYsNyBAQAogCiAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgogICAgICAgICAiIiJFbnN1cmUgdGhhdCBfX2FsbF9fIGlzIHBvcHVsYXRlZCBwcm9wZXJseS4iIiIKLSAgICAgICAgIyBTVEFSVFVQSU5GTyBhZGRlZCB0byBfX2FsbF9fIGluIDMuNgotICAgICAgICBpbnRlbnRpb25hbGx5X2V4Y2x1ZGVkID0geyJsaXN0MmNtZGxpbmUiLCAiU1RBUlRVUElORk8iLCAiSGFuZGxlIn0KKyAgICAgICAgaW50ZW50aW9uYWxseV9leGNsdWRlZCA9IHsibGlzdDJjbWRsaW5lIiwgIkhhbmRsZSJ9CiAgICAgICAgIGV4cG9ydGVkID0gc2V0KHN1YnByb2Nlc3MuX19hbGxfXykKICAgICAgICAgcG9zc2libGVfZXhwb3J0cyA9IHNldCgpCiAgICAgICAgIGltcG9ydCB0eXBlcwpAQCAtMjY1NCwxMSArMjY3MSwxMSBAQAogICAgIGRlZiB3aXRoX3NwYWNlcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICBrd2FyZ3NbJ3N0ZG91dCddID0gc3VicHJvY2Vzcy5QSVBFCiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgIHAuc3Rkb3V0LnJlYWQgKCkuZGVjb2RlKCJtYmNzIiksCi0gICAgICAgICAgIjIgWyVyLCAnYWIgY2QnXSIgJSBzZWxmLmZuYW1lCi0gICAgICAgICkKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgcC5zdGRvdXQucmVhZCAoKS5kZWNvZGUoIm1iY3MiKSwKKyAgICAgICAgICAgICAgIjIgWyVyLCAnYWIgY2QnXSIgJSBzZWxmLmZuYW1lCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmdfd2l0aF9zcGFjZXMoc2VsZik6CiAgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IHdpdGggc3BhY2VzIG9uIFdpbmRvd3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VuYXUucHkgYi9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5CmluZGV4IDBmNDEzNGUuLmJjMWY0NmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VuYXUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQpAQCAtMSw0ICsxLDMgQEAKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4KIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBhdWRpb3Rlc3RzCiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggMmMwMDQxNy4uMjY5ZDliZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtOSwxMyArOSwxMSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIFRFU1RGTiA9IHN1cHBvcnQuVEVTVEZOCi1URVNURElSTiA9IG9zLnBhdGguYmFzZW5hbWUodGVtcGZpbGUubWtkdGVtcChkaXI9Jy4nKSkKIAogCiBjbGFzcyBUZXN0U3VwcG9ydCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCi0gICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQogICAgIHRlYXJEb3duID0gc2V0VXAKIAogICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGUoc2VsZik6CkBAIC00OCw2ICs0NiwxMCBAQAogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCiAKICAgICBkZWYgdGVzdF9ybXRyZWUoc2VsZik6CisgICAgICAgIFRFU1RESVJOID0gb3MucGF0aC5iYXNlbmFtZSh0ZW1wZmlsZS5ta2R0ZW1wKGRpcj0nLicpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIFRFU1RESVJOKQorICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKKwogICAgICAgICBvcy5ta2RpcihURVNURElSTikKICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKFRFU1RESVJOLCBURVNURElSTikpCiAgICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQpAQCAtMjI4LDcgKzIzMCw4IEBACiAKICAgICBkZWYgdGVzdF9jaGVja19zeW50YXhfZXJyb3Ioc2VsZik6CiAgICAgICAgIHN1cHBvcnQuY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJkZWYgY2xhc3MiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc3VwcG9ydC5jaGVja19zeW50YXhfZXJyb3IsIHNlbGYsICIxIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAieD0xIikKIAogICAgIGRlZiB0ZXN0X0NsZWFuSW1wb3J0KHNlbGYpOgogICAgICAgICBpbXBvcnQgaW1wb3J0bGliCkBAIC0zMTIsNiArMzE1LDI4IEBACiAgICAgICAgICAgICAgICAgc2VsZi5PdGhlckNsYXNzLCBzZWxmLlJlZkNsYXNzLCBpZ25vcmU9aWdub3JlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldCgpLCBtaXNzaW5nX2l0ZW1zKQogCisgICAgZGVmIHRlc3RfY2hlY2tfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsndGVtcGRpcid9CisgICAgICAgIGJsYWNrbGlzdCA9IHsndGVtcGxhdGUnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgICAgICAgZXh0cmEgPSB7J1RleHRUZXN0UmVzdWx0JywgJ2luc3RhbGxIYW5kbGVyJ30KKyAgICAgICAgYmxhY2tsaXN0ID0geydsb2FkX3Rlc3RzJywgIlRlc3RQcm9ncmFtIiwgIkJhc2VUZXN0U3VpdGUifQorCisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInVuaXR0ZXN0LnJlc3VsdCIsICJ1bml0dGVzdC5jYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5zdWl0ZSIsICJ1bml0dGVzdC5sb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaXR0ZXN0Lm1haW4iLCAidW5pdHRlc3QucnVubmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5zaWduYWxzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBzdXBwb3J0LmNoZWNrX19hbGxfXywgc2VsZiwgdW5pdHRlc3QpCisKICAgICAjIFhYWCAtZm9sbG93cyBhIGxpc3Qgb2YgdW50ZXN0ZWQgQVBJCiAgICAgIyBtYWtlX2xlZ2FjeV9weWMKICAgICAjIGlzX3Jlc291cmNlX2VuYWJsZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5IGIvTGliL3Rlc3QvdGVzdF9zeW1ib2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzMDZmNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5CkBAIC0wLDAgKzEsNTQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdWJwcm9jZXNzCisKKworU1lNQk9MX0ZJTEUgICAgICAgICAgICAgID0gc3VwcG9ydC5maW5kZmlsZSgnc3ltYm9sLnB5JykKK0dSQU1NQVJfRklMRSAgICAgICAgICAgICA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLicsICcuLicsICdJbmNsdWRlJywgJ2dyYW1pbml0LmgnKQorVEVTVF9QWV9GSUxFICAgICAgICAgICAgID0gJ3N5bWJvbF90ZXN0LnB5JworCisKK2NsYXNzIFRlc3RTeW1ib2xHZW5lcmF0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfY29weV9maWxlX3dpdGhvdXRfZ2VuZXJhdGVkX3N5bWJvbHMoc2VsZiwgc291cmNlX2ZpbGUsIGRlc3RfZmlsZSk6CisgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSkgYXMgZnA6CisgICAgICAgICAgICBsaW5lcyA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHdpdGggb3BlbihkZXN0X2ZpbGUsICd3JykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZWxpbmVzKGxpbmVzWzpsaW5lcy5pbmRleCgiIy0tc3RhcnQgY29uc3RhbnRzLS1cbiIpICsgMV0pCisgICAgICAgICAgICBmcC53cml0ZWxpbmVzKGxpbmVzW2xpbmVzLmluZGV4KCIjLS1lbmQgY29uc3RhbnRzLS1cbiIpOl0pCisKKyAgICBkZWYgX2dlbmVyYXRlX3N5bWJvbHMoc2VsZiwgZ3JhbW1hcl9maWxlLCB0YXJnZXRfc3ltYm9sX3B5X2ZpbGUpOgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU1CT0xfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9zeW1ib2xfcHlfZmlsZV0sIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHN0ZGVyciA9IHByb2MuY29tbXVuaWNhdGUoKVsxXQorICAgICAgICByZXR1cm4gcHJvYy5yZXR1cm5jb2RlLCBzdGRlcnIKKworICAgIGRlZiBjb21wYXJlX2ZpbGVzKHNlbGYsIGZpbGUxLCBmaWxlMik6CisgICAgICAgIHdpdGggb3BlbihmaWxlMSkgYXMgZnA6CisgICAgICAgICAgICBsaW5lczEgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICB3aXRoIG9wZW4oZmlsZTIpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMyID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lczEsIGxpbmVzMikKKworICAgIEB1bml0dGVzdC5za2lwSWYobm90IG9zLnBhdGguZXhpc3RzKEdSQU1NQVJfRklMRSksCisgICAgICAgICAgICAgICAgICAgICAndGVzdCBvbmx5IHdvcmtzIGZyb20gc291cmNlIGJ1aWxkIGRpcmVjdG9yeScpCisgICAgZGVmIHRlc3RfcmVhbF9ncmFtbWFyX2FuZF9zeW1ib2xfZmlsZShzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBvdXRwdXQpCisKKyAgICAgICAgc2VsZi5fY29weV9maWxlX3dpdGhvdXRfZ2VuZXJhdGVkX3N5bWJvbHMoU1lNQk9MX0ZJTEUsIG91dHB1dCkKKworICAgICAgICBleGl0Y29kZSwgc3RkZXJyID0gc2VsZi5fZ2VuZXJhdGVfc3ltYm9scyhHUkFNTUFSX0ZJTEUsIG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleGl0Y29kZSkKKworICAgICAgICBzZWxmLmNvbXBhcmVfZmlsZXMoU1lNQk9MX0ZJTEUsIG91dHB1dCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKaW5kZXggYzVkN2ZhYy4uYmY5OTUwNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CkBAIC0xNTgsOSArMTU4LDExIEBACiAgICAgICAgIGNoZWNrZmlsZW5hbWUoImRlZiBmKHgpOiBmb28pKCIpICAjIHBhcnNlLXRpbWUKICAgICAgICAgY2hlY2tmaWxlbmFtZSgiZGVmIGYoeCk6IGdsb2JhbCB4IikgICMgc3ltdGFibGUtYnVpbGQtdGltZQogICAgICAgICBzeW10YWJsZS5zeW10YWJsZSgicGFzcyIsIGIic3BhbSIsICJleGVjIikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKSwgXAorICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBzeW10YWJsZS5zeW10YWJsZSgicGFzcyIsIGJ5dGVhcnJheShiInNwYW0iKSwgImV4ZWMiKQotICAgICAgICBzeW10YWJsZS5zeW10YWJsZSgicGFzcyIsIG1lbW9yeXZpZXcoYiJzcGFtIiksICJleGVjIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzeW10YWJsZS5zeW10YWJsZSgicGFzcyIsIG1lbW9yeXZpZXcoYiJzcGFtIiksICJleGVjIikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgc3ltdGFibGUuc3ltdGFibGUoInBhc3MiLCBsaXN0KGIic3BhbSIpLCAiZXhlYyIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggODNmNDlmNi4uZjQ3YmRmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTM1LDE0ICszNSw2IEBACiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGtleXdvcmQKIAotSXQncyBhIHN5bnRheCBlcnJvciB0byBhc3NpZ24gdG8gdGhlIGVtcHR5IHR1cGxlLiAgV2h5IGlzbid0IGl0IGFuCi1lcnJvciB0byBhc3NpZ24gdG8gdGhlIGVtcHR5IGxpc3Q/ICBJdCB3aWxsIGFsd2F5cyByYWlzZSBzb21lIGVycm9yIGF0Ci1ydW50aW1lLgotCi0+Pj4gKCkgPSAxCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci1TeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvICgpCi0KID4+PiBmKCkgPSAxCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKQEAgLTQ5MywxMCArNDg1LDYgQEAKICAgIC4uLgogU3ludGF4RXJyb3I6IGtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWQKIAotPj4+IGRlbCAoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGNhbid0IGRlbGV0ZSAoKQotCiA+Pj4gezEsIDIsIDN9ID0gNDIKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCA0NDM1ZDY5Li4zMTMxZjM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMTA4NCw3ICsxMDg0LDcgQEAKICAgICAgICAgY2hlY2soKDEsMiwzKSwgdnNpemUoJycpICsgMypzZWxmLlApCiAgICAgICAgICMgdHlwZQogICAgICAgICAjIHN0YXRpYyB0eXBlOiBQeVR5cGVPYmplY3QKLSAgICAgICAgZm10ID0gJ1AybjE1UGw0UG45UG4xMVBJUCcKKyAgICAgICAgZm10ID0gJ1AybjE1UGw0UG45UG4xMVBJUFAnCiAgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAnZ2V0Y291bnRzJyk6CiAgICAgICAgICAgICBmbXQgKz0gJzNuMlAnCiAgICAgICAgIHMgPSB2c2l6ZShmbXQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5CmluZGV4IDUwOWJjM2UuLjI1YzU4MzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5CkBAIC0zMzgsOCArMzM4LDggQEAKIAogICAgIGRlZiB0ZXN0XzE0X29ubGluZXJfaWYoc2VsZik6CiAgICAgICAgIGRlZiBvbmxpbmVycygpOgotICAgICAgICAgICAgaWYgVHJ1ZTogRmFsc2UKLSAgICAgICAgICAgIGVsc2U6IFRydWUKKyAgICAgICAgICAgIGlmIFRydWU6IHg9RmFsc2UKKyAgICAgICAgICAgIGVsc2U6IHg9VHJ1ZQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgc2VsZi5ydW5fYW5kX2NvbXBhcmUoCiAgICAgICAgICAgICBvbmxpbmVycywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCBhYmZiMzRkLi5kNzc4NWNlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0yMDc0LDYgKzIwNzQsMjQgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKICAgICAgICAgICAgIHRhcmZpbGUuaXRuKDB4MTAwMDAwMDAwMDAsIDYsIHRhcmZpbGUuR05VX0ZPUk1BVCkKIAorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geyd2ZXJzaW9uJywgJ2dycCcsICdwd2QnLCAnc3ltbGlua19leGNlcHRpb24nLAorICAgICAgICAgICAgICAgICAgICAgJ05VTCcsICdCTE9DS1NJWkUnLCAnUkVDT1JEU0laRScsICdHTlVfTUFHSUMnLAorICAgICAgICAgICAgICAgICAgICAgJ1BPU0lYX01BR0lDJywgJ0xFTkdUSF9OQU1FJywgJ0xFTkdUSF9MSU5LJywKKyAgICAgICAgICAgICAgICAgICAgICdMRU5HVEhfUFJFRklYJywgJ1JFR1RZUEUnLCAnQVJFR1RZUEUnLCAnTE5LVFlQRScsCisgICAgICAgICAgICAgICAgICAgICAnU1lNVFlQRScsICdDSFJUWVBFJywgJ0JMS1RZUEUnLCAnRElSVFlQRScsICdGSUZPVFlQRScsCisgICAgICAgICAgICAgICAgICAgICAnQ09OVFRZUEUnLCAnR05VVFlQRV9MT05HTkFNRScsICdHTlVUWVBFX0xPTkdMSU5LJywKKyAgICAgICAgICAgICAgICAgICAgICdHTlVUWVBFX1NQQVJTRScsICdYSERUWVBFJywgJ1hHTFRZUEUnLCAnU09MQVJJU19YSERUWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdTVVBQT1JURURfVFlQRVMnLCAnUkVHVUxBUl9UWVBFUycsICdHTlVfVFlQRVMnLAorICAgICAgICAgICAgICAgICAgICAgJ1BBWF9GSUVMRFMnLCAnUEFYX05BTUVfRklFTERTJywgJ1BBWF9OVU1CRVJfRklFTERTJywKKyAgICAgICAgICAgICAgICAgICAgICdzdG4nLCAnbnRzJywgJ250aScsICdpdG4nLCAnY2FsY19jaGtzdW1zJywgJ2NvcHlmaWxlb2JqJywKKyAgICAgICAgICAgICAgICAgICAgICdmaWxlbW9kZScsCisgICAgICAgICAgICAgICAgICAgICAnRW1wdHlIZWFkZXJFcnJvcicsICdUcnVuY2F0ZWRIZWFkZXJFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAnRU9GSGVhZGVyRXJyb3InLCAnSW52YWxpZEhlYWRlckVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICdTdWJzZXF1ZW50SGVhZGVyRXJyb3InLCAnRXhGaWxlT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICdtYWluJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgdGFyZmlsZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKwogCiBjbGFzcyBDb21tYW5kTGluZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CmluZGV4IDhlMjE5ZjQuLjUxZDgyZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CkBAIC0xLDcgKzEsNiBAQAogaW1wb3J0IHNvY2tldAogaW1wb3J0IHNlbGVjdG9ycwogaW1wb3J0IHRlbG5ldGxpYgotaW1wb3J0IHRpbWUKIGltcG9ydCBjb250ZXh0bGliCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydApAQCAtNDIsNiArNDEsMTEgQEAKICAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCiAgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKIAorICAgIGRlZiB0ZXN0Q29udGV4dE1hbmFnZXIoc2VsZik6CisgICAgICAgIHdpdGggdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpIGFzIHRuOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUodG4uZ2V0X3NvY2tldCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh0bi5nZXRfc29ja2V0KCkpCisKICAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQppbmRleCBiNjMwNTA5Li44NDVlN2Q0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQpAQCAtOCw3ICs4LDYgQEAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogCiBpbXBvcnQgcmFuZG9tCi1pbXBvcnQgcmUKIGltcG9ydCBzeXMKIF90aHJlYWQgPSBpbXBvcnRfbW9kdWxlKCdfdGhyZWFkJykKIHRocmVhZGluZyA9IGltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCkBAIC0xOSw2ICsxOCw3IEBACiBpbXBvcnQgc3VicHJvY2VzcwogCiBmcm9tIHRlc3QgaW1wb3J0IGxvY2tfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKICMgQmV0d2VlbiBmb3JrKCkgYW5kIGV4ZWMoKSwgb25seSBhc3luYy1zYWZlIGZ1bmN0aW9ucyBhcmUgYWxsb3dlZCAoaXNzdWVzCkBAIC0xMTE3LDUgKzExMTcsMTIgQEAKIGNsYXNzIEJhcnJpZXJUZXN0cyhsb2NrX3Rlc3RzLkJhcnJpZXJUZXN0cyk6CiAgICAgYmFycmllcnR5cGUgPSBzdGF0aWNtZXRob2QodGhyZWFkaW5nLkJhcnJpZXIpCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsiVGhyZWFkRXJyb3IifQorICAgICAgICBibGFja2xpc3QgPSB7J2N1cnJlbnRUaHJlYWQnLCAnYWN0aXZlQ291bnQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB0aHJlYWRpbmcsICgndGhyZWFkaW5nJywgJ190aHJlYWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKaW5kZXggNzZiODk0ZS4uZjIyNDIxMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMSw2ICsxLDggQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IGRlY2ltYWwKIGltcG9ydCBlbnVtCiBpbXBvcnQgbG9jYWxlCitpbXBvcnQgbWF0aAogaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3lzY29uZmlnCkBAIC0yMSwxNyArMjMsMjcgQEAKIFRJTUVfTUFYWUVBUiA9ICgxIDw8IDggKiBTSVpFT0ZfSU5UIC0gMSkgLSAxCiBUSU1FX01JTllFQVIgPSAtVElNRV9NQVhZRUFSIC0gMQogCitTRUNfVE9fVVMgPSAxMCAqKiA2CiBVU19UT19OUyA9IDEwICoqIDMKIE1TX1RPX05TID0gMTAgKiogNgogU0VDX1RPX05TID0gMTAgKiogOQorTlNfVE9fU0VDID0gMTAgKiogOQogCiBjbGFzcyBfUHlUaW1lKGVudW0uSW50RW51bSk6CiAgICAgIyBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKQogICAgIFJPVU5EX0ZMT09SID0gMAogICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKICAgICBST1VORF9DRUlMSU5HID0gMQorICAgICMgUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIKKyAgICBST1VORF9IQUxGX0VWRU4gPSAyCiAKLUFMTF9ST1VORElOR19NRVRIT0RTID0gKF9QeVRpbWUuUk9VTkRfRkxPT1IsIF9QeVRpbWUuUk9VTkRfQ0VJTElORykKKyMgUm91bmRpbmcgbW9kZXMgc3VwcG9ydGVkIGJ5IFB5VGltZQorUk9VTkRJTkdfTU9ERVMgPSAoCisgICAgIyAoUHlUaW1lIHJvdW5kaW5nIG1ldGhvZCwgZGVjaW1hbCByb3VuZGluZyBtZXRob2QpCisgICAgKF9QeVRpbWUuUk9VTkRfRkxPT1IsIGRlY2ltYWwuUk9VTkRfRkxPT1IpLAorICAgIChfUHlUaW1lLlJPVU5EX0NFSUxJTkcsIGRlY2ltYWwuUk9VTkRfQ0VJTElORyksCisgICAgKF9QeVRpbWUuUk9VTkRfSEFMRl9FVkVOLCBkZWNpbWFsLlJPVU5EX0hBTEZfRVZFTiksCispCiAKIAogY2xhc3MgVGltZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTYwNyw3OSArNjE5LDYgQEAKIAogCiBjbGFzcyBUZXN0UHl0aW1lKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuaW52YWxpZF92YWx1ZXMgPSAoCi0gICAgICAgICAgICAtKDIgKiogMTAwKSwgMiAqKiAxMDAsCi0gICAgICAgICAgICAtKDIuMCAqKiAxMDAuMCksIDIuMCAqKiAxMDAuMCwKLSAgICAgICAgKQotCi0gICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5Ci0gICAgZGVmIHRlc3RfdGltZV90KHNlbGYpOgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lX3QKLSAgICAgICAgZm9yIG9iaiwgdGltZV90LCBybmQgaW4gKAotICAgICAgICAgICAgIyBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKQotICAgICAgICAgICAgKDAsIDAsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAtMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMCwgLTEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjksIC0yLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjAsIDEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuOSwgMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpCi0gICAgICAgICAgICAoMCwgMCwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMCwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuOSwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS4wLCAxLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuOSwgMiwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aW1lX29iamVjdF90b190aW1lX3Qob2JqLCBybmQpLCB0aW1lX3QpCi0KLSAgICAgICAgcm5kID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBmb3IgaW52YWxpZCBpbiBzZWxmLmludmFsaWRfdmFsdWVzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dGltZV9vYmplY3RfdG9fdGltZV90LCBpbnZhbGlkLCBybmQpCi0KLSAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKLSAgICBkZWYgdGVzdF90aW1lc3BlYyhzZWxmKToKLSAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMKLSAgICAgICAgZm9yIG9iaiwgdGltZXNwZWMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCi0gICAgICAgICAgICAoMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMCwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMWUtOSwgKDAsIDEpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxZS0xMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMWUtOSwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMWUtMTAsICgtMSwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMiwgKC0yLCA4MDAwMDAwMDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgwLjk5OTk5OTk5OTksICgwLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTAsICgxLCAxMjM0NTY3ODkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTksICgxLCAxMjM0NTY3ODkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkwLCAoLTIsIDg3NjU0MzIxMSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTEsICgtMiwgODc2NTQzMjEwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpCi0gICAgICAgICAgICAoMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjAsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMWUtOSwgKDAsIDEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDFlLTEwLCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTFlLTksICgtMSwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtMTAsICgwLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4yLCAoLTIsIDgwMDAwMDAwMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMC45OTk5OTk5OTk5LCAoMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS4xMjM0NTY3ODkwLCAoMSwgMTIzNDU2NzkwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTksICgxLCAxMjM0NTY3OTApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTAsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkxLCAoLTIsIDg3NjU0MzIxMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzcGVjPXRpbWVzcGVjKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMob2JqLCBybmQpLCB0aW1lc3BlYykKLQotICAgICAgICBybmQgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIGZvciBpbnZhbGlkIGluIHNlbGYuaW52YWxpZF92YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aW1lX29iamVjdF90b190aW1lc3BlYywgaW52YWxpZCwgcm5kKQotCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGltZS5fU1RSVUNUX1RNX0lURU1TID09IDExLCAibmVlZHMgdG1fem9uZSBzdXBwb3J0IikKICAgICBkZWYgdGVzdF9sb2NhbHRpbWVfdGltZXpvbmUoc2VsZik6CiAKQEAgLTczNCwyNjYgKzY3MywyOTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJcyhsdC50bV96b25lLCBOb25lKQogCiAKLUB1bml0dGVzdC5za2lwVW5sZXNzKF90ZXN0Y2FwaSBpcyBub3QgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICduZWVkIHRoZSBfdGVzdGNhcGkgbW9kdWxlJykKLWNsYXNzIFRlc3RQeVRpbWVfdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitAdW5pdHRlc3Quc2tpcElmKF90ZXN0Y2FwaSBpcyBOb25lLCAnbmVlZCB0aGUgX3Rlc3RjYXBpIG1vZHVsZScpCitjbGFzcyBDUHlUaW1lVGVzdENhc2U6CisgICAgIiIiCisgICAgQmFzZSBjbGFzcyB0byB0ZXN0IHRoZSBDIF9QeVRpbWVfdCBBUEkuCisgICAgIiIiCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFNJWkVPRl9USU1FX1QKKyAgICAgICAgYml0cyA9IFNJWkVPRl9USU1FX1QgKiA4IC0gMQorICAgICAgICBzZWxmLnRpbWVfdF9taW4gPSAtMiAqKiBiaXRzCisgICAgICAgIHNlbGYudGltZV90X21heCA9IDIgKiogYml0cyAtIDEKKworICAgIGRlZiB0aW1lX3RfZmlsdGVyKHNlbGYsIHNlY29uZHMpOgorICAgICAgICByZXR1cm4gKHNlbGYudGltZV90X21pbiA8PSBzZWNvbmRzIDw9IHNlbGYudGltZV90X21heCkKKworICAgIGRlZiBfcm91bmRpbmdfdmFsdWVzKHNlbGYsIHVzZV9mbG9hdCk6CisgICAgICAgICJCdWlsZCB0aW1lc3RhbXBzIHVzZWQgdG8gdGVzdCByb3VuZGluZy4iCisKKyAgICAgICAgdW5pdHMgPSBbMSwgVVNfVE9fTlMsIE1TX1RPX05TLCBTRUNfVE9fTlNdCisgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICMgcGljb3NlY29uZHMgYXJlIG9ubHkgdGVzdGVkIHRvIHB5dGltZV9jb252ZXJ0ZXIgYWNjZXB0aW5nIGZsb2F0cworICAgICAgICAgICAgdW5pdHMuYXBwZW5kKDFlLTMpCisKKyAgICAgICAgdmFsdWVzID0gKAorICAgICAgICAgICAgIyBzbWFsbCB2YWx1ZXMKKyAgICAgICAgICAgIDEsIDIsIDUsIDcsIDEyMywgNDU2LCAxMjM0LAorICAgICAgICAgICAgIyAxMF5rIC0gMQorICAgICAgICAgICAgOSwKKyAgICAgICAgICAgIDk5LAorICAgICAgICAgICAgOTk5LAorICAgICAgICAgICAgOTk5OSwKKyAgICAgICAgICAgIDk5OTk5LAorICAgICAgICAgICAgOTk5OTk5LAorICAgICAgICAgICAgIyB0ZXN0IGhhbGYgZXZlbiByb3VuZGluZyBuZWFyIDAuNSwgMS41LCAyLjUsIDMuNSwgNC41CisgICAgICAgICAgICA0OTksIDUwMCwgNTAxLAorICAgICAgICAgICAgMTQ5OSwgMTUwMCwgMTUwMSwKKyAgICAgICAgICAgIDI1MDAsCisgICAgICAgICAgICAzNTAwLAorICAgICAgICAgICAgNDUwMCwKKyAgICAgICAgKQorCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSBbMF0KKyAgICAgICAgZm9yIHVuaXQgaW4gdW5pdHM6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgIG5zID0gdmFsdWUgKiB1bml0CisgICAgICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorICAgICAgICBmb3IgcG93MiBpbiAoMCwgNSwgMTAsIDE1LCAyMiwgMjMsIDI0LCAzMCwgMzMpOgorICAgICAgICAgICAgbnMgPSAoMiAqKiBwb3cyKSAqIFNFQ19UT19OUworICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKAorICAgICAgICAgICAgICAgIC1ucy0xLCAtbnMsIC1ucysxLAorICAgICAgICAgICAgICAgIG5zLTEsIG5zLCBucysxCisgICAgICAgICAgICApKQorICAgICAgICBmb3Igc2Vjb25kcyBpbiAoX3Rlc3RjYXBpLklOVF9NSU4sIF90ZXN0Y2FwaS5JTlRfTUFYKToKKyAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuYXBwZW5kKHNlY29uZHMgKiBTRUNfVE9fTlMpCisgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICMgbnVtYmVycyB3aXRoIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uIGluIElFRUUgNzU0IChiYXNlIDIpCisgICAgICAgICAgICBmb3IgcG93MiBpbiAoMywgNywgMTAsIDE1KToKKyAgICAgICAgICAgICAgICBucyA9IDIuMCAqKiAoLXBvdzIpCisgICAgICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorCisgICAgICAgICMgc2Vjb25kcyBjbG9zZSB0byBfUHlUaW1lX3QgdHlwZSBsaW1pdAorICAgICAgICBucyA9ICgyICoqIDYzIC8vIFNFQ19UT19OUykgKiBTRUNfVE9fTlMKKyAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorCisgICAgICAgIHJldHVybiBuc190aW1lc3RhbXBzCisKKyAgICBkZWYgX2NoZWNrX3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZmxvYXQsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisKKyAgICAgICAgZGVmIGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpOgorICAgICAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgICAgIHVuaXRfdG9fbnMgPSBTRUNfVE9fTlMgLyBmbG9hdCh1bml0X3RvX3NlYykKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbbnMgLyB1bml0X3RvX25zIGZvciBucyBpbiBuc190aW1lc3RhbXBzXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bml0X3RvX25zID0gU0VDX1RPX05TIC8vIHVuaXRfdG9fc2VjCisgICAgICAgICAgICAgICAgdmFsdWVzID0gW25zIC8vIHVuaXRfdG9fbnMgZm9yIG5zIGluIG5zX3RpbWVzdGFtcHNdCisKKyAgICAgICAgICAgIGlmIHZhbHVlX2ZpbHRlcjoKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmaWx0ZXIodmFsdWVfZmlsdGVyLCB2YWx1ZXMpCisKKyAgICAgICAgICAgICMgcmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHNvcnQKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoc2V0KHZhbHVlcykpCisKKyAgICAgICAgIyB0ZXN0IHJvdW5kaW5nCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSBzZWxmLl9yb3VuZGluZ192YWx1ZXModXNlX2Zsb2F0KQorICAgICAgICB2YWxpZF92YWx1ZXMgPSBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKQorICAgICAgICBmb3IgdGltZV9ybmQsIGRlY2ltYWxfcm5kIGluIFJPVU5ESU5HX01PREVTIDoKKyAgICAgICAgICAgIGNvbnRleHQgPSBkZWNpbWFsLmdldGNvbnRleHQoKQorICAgICAgICAgICAgY29udGV4dC5yb3VuZGluZyA9IGRlY2ltYWxfcm5kCisKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgICAgICAgZGVidWdfaW5mbyA9IHsndmFsdWUnOiB2YWx1ZSwgJ3JvdW5kaW5nJzogZGVjaW1hbF9ybmR9CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBweXRpbWVfY29udmVydGVyKHZhbHVlLCB0aW1lX3JuZCkKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9mdW5jKHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIG9uIHRpbWVzdGFtcCBjb252ZXJzaW9uOiAlcyIgJSBkZWJ1Z19pbmZvKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvKQorCisgICAgICAgICMgdGVzdCBvdmVyZmxvdworICAgICAgICBucyA9IHNlbGYuT1ZFUkZMT1dfU0VDT05EUyAqIFNFQ19UT19OUworICAgICAgICBuc190aW1lc3RhbXBzID0gKC1ucywgbnMpCisgICAgICAgIG92ZXJmbG93X3ZhbHVlcyA9IGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpCisgICAgICAgIGZvciB0aW1lX3JuZCwgXyBpbiBST1VORElOR19NT0RFUyA6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gb3ZlcmZsb3dfdmFsdWVzOgorICAgICAgICAgICAgICAgIGRlYnVnX2luZm8gPSB7J3ZhbHVlJzogdmFsdWUsICdyb3VuZGluZyc6IHRpbWVfcm5kfQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbXNnPWRlYnVnX2luZm8pOgorICAgICAgICAgICAgICAgICAgICBweXRpbWVfY29udmVydGVyKHZhbHVlLCB0aW1lX3JuZCkKKworICAgIGRlZiBjaGVja19pbnRfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdG9fc2VjPTEsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcm91bmRpbmcocHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXIpCisKKyAgICBkZWYgY2hlY2tfZmxvYXRfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90b19zZWM9MSwgdmFsdWVfZmlsdGVyPU5vbmUpOgorICAgICAgICBzZWxmLl9jaGVja19yb3VuZGluZyhweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlLCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyKQorCisgICAgZGVmIGRlY2ltYWxfcm91bmQoc2VsZiwgeCk6CisgICAgICAgIGQgPSBkZWNpbWFsLkRlY2ltYWwoeCkKKyAgICAgICAgZCA9IGQucXVhbnRpemUoMSkKKyAgICAgICAgcmV0dXJuIGludChkKQorCisKK2NsYXNzIFRlc3RDUHlUaW1lKENQeVRpbWVUZXN0Q2FzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdGhlIEMgX1B5VGltZV90IEFQSS4KKyAgICAiIiIKKyAgICAjIF9QeVRpbWVfdCBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgIE9WRVJGTE9XX1NFQ09ORFMgPSBtYXRoLmNlaWwoKDIqKjYzICsgMSkgLyBTRUNfVE9fTlMpCisKICAgICBkZWYgdGVzdF9Gcm9tU2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Gcm9tU2Vjb25kcwotICAgICAgICBmb3Igc2Vjb25kcyBpbiAoMCwgMywgLTQ1NiwgX3Rlc3RjYXBpLklOVF9NQVgsIF90ZXN0Y2FwaS5JTlRfTUlOKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHNlY29uZHM9c2Vjb25kcyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHMoc2Vjb25kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICogU0VDX1RPX05TKQorCisgICAgICAgICMgUHlUaW1lX0Zyb21TZWNvbmRzKCkgZXhwZWN0cyBhIEMgaW50LCByZWplY3QgdmFsdWVzIG91dCBvZiByYW5nZQorICAgICAgICBkZWYgY19pbnRfZmlsdGVyKHNlY3MpOgorICAgICAgICAgICAgcmV0dXJuIChfdGVzdGNhcGkuSU5UX01JTiA8PSBzZWNzIDw9IF90ZXN0Y2FwaS5JTlRfTUFYKQorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBzZWNzLCBybmQ6IFB5VGltZV9Gcm9tU2Vjb25kcyhzZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MgKiBTRUNfVE9fTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1jX2ludF9maWx0ZXIpCiAKICAgICBkZWYgdGVzdF9Gcm9tU2Vjb25kc09iamVjdChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdAogCi0gICAgICAgICMgQ29udmVyc2lvbiBnaXZpbmcgdGhlIHNhbWUgcmVzdWx0IGZvciBhbGwgcm91bmRpbmcgbWV0aG9kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG9iaiwgdHMgaW4gKAotICAgICAgICAgICAgICAgICMgaW50ZWdlcnMKLSAgICAgICAgICAgICAgICAoMCwgMCksCi0gICAgICAgICAgICAgICAgKDEsIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC0zLCAtMyAqIFNFQ19UT19OUyksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKAorICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0LAorICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MgKiBTRUNfVE9fTlMpCiAKLSAgICAgICAgICAgICAgICAjIGZsb2F0OiBzdWJzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDAuMCwgMCksCi0gICAgICAgICAgICAgICAgKDFlLTksIDEpLAotICAgICAgICAgICAgICAgICgxZS02LCAxMCAqKiAzKSwKLSAgICAgICAgICAgICAgICAoMWUtMywgMTAgKiogNiksCi0KLSAgICAgICAgICAgICAgICAjIGZsb2F0OiBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIuMCwgMiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKDEyMy4wLCAxMjMgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtNy4wLCAtNyAqIFNFQ19UT19OUyksCi0KLSAgICAgICAgICAgICAgICAjIG5hbm9zZWNvbmQgYXJlIGtlcHQgZm9yIHZhbHVlIDw9IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyMiAtIDFlLTksICA0MTk0MzAzOTk5OTk5OTk5KSwKLSAgICAgICAgICAgICAgICAoMioqMjIsICAgICAgICAgNDE5NDMwNDAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjIyICsgMWUtOSwgIDQxOTQzMDQwMDAwMDAwMDEpLAotICAgICAgICAgICAgICAgICgyKioyMyAtIDFlLTksICA4Mzg4NjA3OTk5OTk5OTk5KSwKLSAgICAgICAgICAgICAgICAoMioqMjMsICAgICAgICAgODM4ODYwODAwMDAwMDAwMCksCi0KLSAgICAgICAgICAgICAgICAjIHN0YXJ0IGxvc2luZyBwcmVjaXNpb24gZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjIzICsgMWUtOSwgIDgzODg2MDgwMDAwMDAwMDIpLAotCi0gICAgICAgICAgICAgICAgIyBuYW5vc2Vjb25kcyBhcmUgbG9zdCBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjQgLSAxZS05LCAxNjc3NzIxNTk5OTk5OTk5OCksCi0gICAgICAgICAgICAgICAgKDIqKjI0LCAgICAgICAgMTY3NzcyMTYwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNCArIDFlLTksIDE2Nzc3MjE2MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgLSAxZS05LCAzMzU1NDQzMjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1ICAgICAgICwgMzM1NTQ0MzIwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSArIDFlLTksIDMzNTU0NDMyMDAwMDAwMDAwKSwKLQotICAgICAgICAgICAgICAgICMgY2xvc2UgdG8gMl42MyBuYW5vc2Vjb25kcyAoX1B5VGltZV90IGxpbWl0KQotICAgICAgICAgICAgICAgICg5MjIzMzcyMDM2LCA5MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoOTIyMzM3MjAzNi4wLCA5MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTkyMjMzNzIwMzYsIC05MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTkyMjMzNzIwMzYuMCwgLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzdGFtcD10cyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KG9iaiwgcm5kKSwgdHMpCi0KLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yKToKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KDkyMjMzNzIwMzcsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KDkyMjMzNzIwMzcuMCwgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoLTkyMjMzNzIwMzcsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KC05MjIzMzcyMDM3LjAsIHJuZCkKLQotICAgICAgICAjIENvbnZlcnNpb24gZ2l2aW5nIGRpZmZlcmVudCByZXN1bHRzIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbWV0aG9kCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBvYmosIHRzLCBybmQgaW4gKAotICAgICAgICAgICAgIyBjbG9zZSB0byB6ZXJvCi0gICAgICAgICAgICAoIDFlLTEwLCAgMCwgRkxPT1IpLAotICAgICAgICAgICAgKCAxZS0xMCwgIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS0xMCwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMWUtMTAsICAwLCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyB0ZXN0IHJvdW5kaW5nIG9mIHRoZSBsYXN0IG5hbm9zZWNvbmQKLSAgICAgICAgICAgICggMS4xMjM0NTY3ODk5LCAgMTEyMzQ1Njc4OSwgRkxPT1IpLAotICAgICAgICAgICAgKCAxLjEyMzQ1Njc4OTksICAxMTIzNDU2NzkwLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODk5LCAtMTEyMzQ1Njc5MCwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTksIC0xMTIzNDU2Nzg5LCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyBjbG9zZSB0byAxIHNlY29uZAotICAgICAgICAgICAgKCAwLjk5OTk5OTk5OTksICAgOTk5OTk5OTk5LCBGTE9PUiksCi0gICAgICAgICAgICAoIDAuOTk5OTk5OTk5OSwgIDEwMDAwMDAwMDAsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0wLjk5OTk5OTk5OTksIC0xMDAwMDAwMDAwLCBGTE9PUiksCi0gICAgICAgICAgICAoLTAuOTk5OTk5OTk5OSwgIC05OTk5OTk5OTksIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob2JqPW9iaiwgcm91bmQ9cm5kLCB0aW1lc3RhbXA9dHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KG9iaiwgcm5kKSwgdHMpCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcoCisgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QsCisgICAgICAgICAgICBsYW1iZGEgbnM6IHNlbGYuZGVjaW1hbF9yb3VuZChucyAqIFNFQ19UT19OUykpCiAKICAgICBkZWYgdGVzdF9Bc1NlY29uZHNEb3VibGUoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNTZWNvbmRzRG91YmxlCiAKLSAgICAgICAgZm9yIG5hbm9zZWNvbmRzLCBzZWNvbmRzIGluICgKLSAgICAgICAgICAgICMgbmVhciAxIG5hbm9zZWNvbmQKLSAgICAgICAgICAgICggMCwgIDAuMCksCi0gICAgICAgICAgICAoIDEsICAxZS05KSwKLSAgICAgICAgICAgICgtMSwgLTFlLTkpLAorICAgICAgICBkZWYgZmxvYXRfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIGlmIGFicyhucykgJSBTRUNfVE9fTlMgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQobnMgLy8gU0VDX1RPX05TKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQobnMpIC8gU0VDX1RPX05TCiAKLSAgICAgICAgICAgICMgbmVhciAxIHNlY29uZAotICAgICAgICAgICAgKFNFQ19UT19OUyArIDEsIDEuMCArIDFlLTkpLAotICAgICAgICAgICAgKFNFQ19UT19OUywgICAgIDEuMCksCi0gICAgICAgICAgICAoU0VDX1RPX05TIC0gMSwgMS4wIC0gMWUtOSksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBucywgcm5kOiBQeVRpbWVfQXNTZWNvbmRzRG91YmxlKG5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgICAgICMgYSBmZXcgc2Vjb25kcwotICAgICAgICAgICAgKDEyMyAqIFNFQ19UT19OUywgMTIzLjApLAotICAgICAgICAgICAgKC01NjcgKiBTRUNfVE9fTlMsIC01NjcuMCksCisgICAgZGVmIGNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihzZWxmLCBkZW5vbWluYXRvcik6CisgICAgICAgIGRlbm9tID0gZGVjaW1hbC5EZWNpbWFsKGRlbm9taW5hdG9yKQogCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmQgYXJlIGtlcHQgZm9yIHZhbHVlIDw9IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDQxOTQzMDM5OTk5OTk5OTksIDIqKjIyIC0gMWUtOSksCi0gICAgICAgICAgICAoNDE5NDMwNDAwMDAwMDAwMCwgMioqMjIpLAotICAgICAgICAgICAgKDQxOTQzMDQwMDAwMDAwMDEsIDIqKjIyICsgMWUtOSksCisgICAgICAgIGRlZiBjb252ZXJ0ZXIodmFsdWUpOgorICAgICAgICAgICAgZCA9IGRlY2ltYWwuRGVjaW1hbCh2YWx1ZSkgLyBkZW5vbQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjaW1hbF9yb3VuZChkKQogCi0gICAgICAgICAgICAjIHN0YXJ0IGxvc2luZyBwcmVjaXNpb24gZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoODM4ODYwODAwMDAwMDAwMiwgMioqMjMgKyAxZS05KSwKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcgogCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzIGFyZSBsb3N0IGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDE2Nzc3MjE1OTk5OTk5OTk4LCAyKioyNCAtIDFlLTkpLAotICAgICAgICAgICAgKDE2Nzc3MjE1OTk5OTk5OTk5LCAyKioyNCAtIDFlLTkpLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAwLCAyKioyNCAgICAgICApLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAxLCAyKioyNCAgICAgICApLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAyLCAyKioyNCArIDJlLTkpLAotCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDAsIDIqKjI1ICAgICAgICksCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDIsIDIqKjI1ICAgICAgICksCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDQsIDIqKjI1ICsgNGUtOSksCi0KLSAgICAgICAgICAgICMgY2xvc2UgdG8gMl42MyBuYW5vc2Vjb25kcyAoX1B5VGltZV90IGxpbWl0KQotICAgICAgICAgICAgKDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMsIDkyMjMzNzIwMzYuMCksCi0gICAgICAgICAgICAoLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMsIC05MjIzMzcyMDM2LjApLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bmFub3NlY29uZHMsIHNlY29uZHM9c2Vjb25kcyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNTZWNvbmRzRG91YmxlKG5hbm9zZWNvbmRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMpCi0KLSAgICBkZWYgdGVzdF90aW1ldmFsKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzVGltZXZhbChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1RpbWV2YWwKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgKDAsICgwLCAwKSksCi0gICAgICAgICAgICAgICAgKDEwMDAsICgwLCAxKSksCi0gICAgICAgICAgICAgICAgKC0xMDAwLCAoLTEsIDk5OTk5OSkpLAogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsICgyLCAwKSksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAoLTMsIDApKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXZhbChucywgcm5kKSwgdHYpCisgICAgICAgIHVzX2NvbnZlcnRlciA9IHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKFVTX1RPX05TKQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgdHYsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgKDAsIDApLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgKDAsIDEpLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCA5OTk5OTkpLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsICgwLCAwKSwgQ0VJTElORyksCisgICAgICAgIGRlZiB0aW1ldmFsX2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICB1cyA9IHVzX2NvbnZlcnRlcihucykKKyAgICAgICAgICAgIHJldHVybiBkaXZtb2QodXMsIFNFQ19UT19VUykKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0NTY3MDAxLCAoMSwgMjM0NTY3KSwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQ1NjcwMDEsICgxLCAyMzQ1NjgpLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNDU2NzAwMSwgKC0yLCA3NjU0MzIpLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQ1NjcwMDEsICgtMiwgNzY1NDMzKSwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWV2YWwobnMsIHJuZCksIHR2KQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBMT05HX01JTiwgTE9OR19NQVgKKworICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCB0aW1ldmFsLnR2X3NlYyB0eXBlIGlzIGEgQyBsb25nCisgICAgICAgICAgICBkZWYgc2Vjb25kc19maWx0ZXIoc2Vjcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfTUlOIDw9IHNlY3MgPD0gTE9OR19NQVgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY29uZHNfZmlsdGVyID0gc2VsZi50aW1lX3RfZmlsdGVyCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzVGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhbF9jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlY29uZHNfZmlsdGVyKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihfdGVzdGNhcGksICdQeVRpbWVfQXNUaW1lc3BlYycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICduZWVkIF90ZXN0Y2FwaS5QeVRpbWVfQXNUaW1lc3BlYycpCi0gICAgZGVmIHRlc3RfdGltZXNwZWMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNUaW1lc3BlYyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1RpbWVzcGVjCi0gICAgICAgIGZvciBucywgdHMgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDAsICgwLCAwKSksCi0gICAgICAgICAgICAoMSwgKDAsIDEpKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCA5OTk5OTk5OTkpKSwKIAotICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgKDIsIDApKSwKLSAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgKC0zLCAwKSksCisgICAgICAgIGRlZiB0aW1lc3BlY19jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgcmV0dXJuIGRpdm1vZChucywgU0VDX1RPX05TKQogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQ1Njc4OTAsICgxLCAyMzQ1Njc4OTApKSwKLSAgICAgICAgICAgICgtMTIzNDU2Nzg5MCwgKC0yLCA3NjU0MzIxMTApKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1lc3BlYz10cyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1lc3BlYyhucyksIHRzKQorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgbnMsIHJuZDogUHlUaW1lX0FzVGltZXNwZWMobnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3BlY19jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKIAotICAgIGRlZiB0ZXN0X21pbGxpc2Vjb25kcyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc01pbGxpc2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc01pbGxpc2Vjb25kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIE1TX1RPX05TLCAxKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBNU19UT19OUywgLTIpLAogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsIDIwMDApLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgLTMwMDApLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWxsaXNlY29uZHMobnMsIHJuZCksIHR2KQorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNNaWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKE1TX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgbXMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgMCwgRkxPT1IpLAotICAgICAgICAgICAgKDEsIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAwLCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0ICogTVNfVE9fTlMgKyAxLCAxMjM0LCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNCAqIE1TX1RPX05TICsgMSwgMTIzNSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQgKiBNU19UT19OUyAtIDEsIC0xMjM1LCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQgKiBNU19UT19OUyAtIDEsIC0xMjM0LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCBtaWxsaXNlY29uZHM9bXMsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWxsaXNlY29uZHMobnMsIHJuZCksIG1zKQotCi0gICAgZGVmIHRlc3RfbWljcm9zZWNvbmRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzTWljcm9zZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzTWljcm9zZWNvbmRzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pY3Jvc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogVVNfVE9fTlMsIDEpLAotICAgICAgICAgICAgICAgICgtMiAqIFVTX1RPX05TLCAtMiksCiAKLSAgICAgICAgICAgICAgICAjIG1pbGxpc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogTVNfVE9fTlMsIDEwMDApLAotICAgICAgICAgICAgICAgICgtMiAqIE1TX1RPX05TLCAtMjAwMCksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc01pY3Jvc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoVVNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgMjAwMDAwMCksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAtMzAwMDAwMCksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pY3Jvc2Vjb25kcyhucywgcm5kKSwgdHYpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCBtcywgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAwLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsIDAsIENFSUxJTkcpLAorY2xhc3MgVGVzdE9sZFB5VGltZShDUHlUaW1lVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHRoZSBvbGQgQyBfUHlUaW1lX3QgQVBJOiBfUHlUaW1lX09iamVjdFRvWFhYKCkgZnVuY3Rpb25zLgorICAgICIiIgogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQgKiBVU19UT19OUyArIDEsIDEyMzQsIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0ICogVVNfVE9fTlMgKyAxLCAxMjM1LCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNCAqIFVTX1RPX05TIC0gMSwgLTEyMzUsIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNCAqIFVTX1RPX05TIC0gMSwgLTEyMzQsIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIG1pbGxpc2Vjb25kcz1tcywgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pY3Jvc2Vjb25kcyhucywgcm5kKSwgbXMpCisgICAgIyB0aW1lX3QgaXMgYSAzMi1iaXQgb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IDIgKiogNjQKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1lX3Qoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdAorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVjaW1hbF9yb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgZGVmIGNyZWF0ZV9jb252ZXJ0ZXIoc2VsZiwgc2VjX3RvX3VuaXQpOgorICAgICAgICBkZWYgY29udmVydGVyKHNlY3MpOgorICAgICAgICAgICAgZmxvYXRwYXJ0LCBpbnRwYXJ0ID0gbWF0aC5tb2RmKHNlY3MpCisgICAgICAgICAgICBpbnRwYXJ0ID0gaW50KGludHBhcnQpCisgICAgICAgICAgICBmbG9hdHBhcnQgKj0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgIGZsb2F0cGFydCA9IHNlbGYuZGVjaW1hbF9yb3VuZChmbG9hdHBhcnQpCisgICAgICAgICAgICBpZiBmbG9hdHBhcnQgPCAwOgorICAgICAgICAgICAgICAgIGZsb2F0cGFydCArPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgICAgIGludHBhcnQgLT0gMQorICAgICAgICAgICAgZWxpZiBmbG9hdHBhcnQgPj0gc2VjX3RvX3VuaXQ6CisgICAgICAgICAgICAgICAgZmxvYXRwYXJ0IC09IHNlY190b191bml0CisgICAgICAgICAgICAgICAgaW50cGFydCArPSAxCisgICAgICAgICAgICByZXR1cm4gKGludHBhcnQsIGZsb2F0cGFydCkKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcgorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWV2YWwoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiAoc2VjcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfY29udmVydGVyKFNFQ19UT19VUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1lc3BlYyhzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2VjczogKHNlY3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9jb252ZXJ0ZXIoU0VDX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWVpdC5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZWl0LnB5CmluZGV4IDJkYjNjMWIuLjFhOTVlMjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZWl0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZWl0LnB5CkBAIC0zNTQsNiArMzU0LDI4IEBACiAgICAgICAgICAgICBzID0gc2VsZi5ydW5fbWFpbihzd2l0Y2hlcz1bJy1uMScsICcxLzAnXSkKICAgICAgICAgc2VsZi5hc3NlcnRfZXhjX3N0cmluZyhlcnJvcl9zdHJpbmdpby5nZXR2YWx1ZSgpLCAnWmVyb0RpdmlzaW9uRXJyb3InKQogCisgICAgZGVmIGF1dG9yYW5nZShzZWxmLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgdGltZXIgPSBGYWtlVGltZXIoc2Vjb25kc19wZXJfaW5jcmVtZW50PTAuMDAxKQorICAgICAgICB0ID0gdGltZWl0LlRpbWVyKHN0bXQ9c2VsZi5mYWtlX3N0bXQsIHNldHVwPXNlbGYuZmFrZV9zZXR1cCwgdGltZXI9dGltZXIpCisgICAgICAgIHJldHVybiB0LmF1dG9yYW5nZShjYWxsYmFjaykKKworICAgIGRlZiB0ZXN0X2F1dG9yYW5nZShzZWxmKToKKyAgICAgICAgbnVtX2xvb3BzLCB0aW1lX3Rha2VuID0gc2VsZi5hdXRvcmFuZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bV9sb29wcywgMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lX3Rha2VuLCAxLjApCisKKyAgICBkZWYgdGVzdF9hdXRvcmFuZ2Vfd2l0aF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgZGVmIGNhbGxiYWNrKGEsIGIpOgorICAgICAgICAgICAgcHJpbnQoInt9IHs6LjNmfSIuZm9ybWF0KGEsIGIpKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHM6CisgICAgICAgICAgICBudW1fbG9vcHMsIHRpbWVfdGFrZW4gPSBzZWxmLmF1dG9yYW5nZShjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fbG9vcHMsIDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZV90YWtlbiwgMS4wKQorICAgICAgICBleHBlY3RlZCA9ICgnMTAgMC4wMTBcbicKKyAgICAgICAgICAgICAgICAgICAgJzEwMCAwLjEwMFxuJworICAgICAgICAgICAgICAgICAgICAnMTAwMCAxLjAwMFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksIGV4cGVjdGVkKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5IGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQppbmRleCAzYjE3Y2E2Li45MDQzOGU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKQEAgLTI0LDggKzI0LDcgQEAKICAgICAgICAgICAgIGlmIHR5cGUgPT0gRU5ETUFSS0VSOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICB0eXBlID0gdG9rX25hbWVbdHlwZV0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAlKHR5cGUpLTEwLjEwcyAlKHRva2VuKS0xMy4xM3IgJShzdGFydClzICUoZW5kKXMiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzKCkpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYiICAgIHt0eXBlOjEwfSB7dG9rZW4hcjoxM30ge3N0YXJ0fSB7ZW5kfSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFsiICAgIEVOQ09ESU5HICAgJ3V0Zi04JyAgICAgICAoMCwgMCkgKDAsIDApIl0gKwogICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkKQEAgLTEzMiwxOCArMTMxLDE4IEBACiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAweGZmZmZmZmZmZmZmIiwgIiIiXAogICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKLSAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmYgKDEsIDQpICgxLCAxNykKKyAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmZmJyAoMSwgNCkgKDEsIDE3KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IDEyMzE0MTI0MjE1MTI1MTYxNjExMCIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCi0gICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxICgxLCA0KSAoMSwgMjUpCisgICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxMjUxNjE2MTEwJyAoMSwgNCkgKDEsIDI1KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IC0xNTkyMTU5MDIxNTAxMjU5MSIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCiAgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKLSAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAgKDEsIDUpICgxLCAyMikKKyAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAxMjU5MScgKDEsIDUpICgxLCAyMikKICAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKQEAgLTMwNyw2ICszMDYsNTAgQEAKICAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCiAgICAgU1RSSU5HICAgICAnUkIiYWJjIicgICAgICgxLCAzMCkgKDEsIDM3KQogICAgICIiIikKKyAgICAgICAgIyBDaGVjayAwLCAxLCBhbmQgMiBjaGFyYWN0ZXIgc3RyaW5nIHByZWZpeGVzLgorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInImFcCitkZVwKK2ZnIicsICIiIlwKKyAgICBTVFJJTkcgICAgICciYVxcXFxcXG5kZVxcXFxcXG5mZyJcJyAoMSwgMCkgKDMsIDMpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSJhXAorZGUiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3UiYVxcXFxcXG5kZSJcJyAgKDEsIDApICgyLCAzKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3JiImFcCitkIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdyYiJhXFxcXFxcbmQiXCcgICgxLCAwKSAoMiwgMikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUociciIiJhXAorYiIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSIiImFcCitiIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3VcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIncmIiIiJhXAorYlwKK2MiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAncmIiXCIiYVxcXFxcXG5iXFxcXFxcbmMiXCIiJyAoMSwgMCkgKDMsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmImFiYyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmMiJyAgICAgICgxLCAwKSAoMSwgNikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2ZSImF7Yn1jIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmUiJhe2J9YyInICAgKDEsIDApICgxLCA5KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZiIiImFiYyIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmXCJcIlwiYWJjXCJcIlwiJyAgKDEsIDApICgxLCAxMCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmNcXFxcXFxuZGVmIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ1JmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnUmYiYWJjXFxcXFxcbmRlZiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mdW5jdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgiZGVmIGQyMihhLCBiLCBjPTIsIGQ9MiwgKmspOiBwYXNzIiwgIiIiXApAQCAtNTA1LDcgKzU0OCw3IEBACiAgICAgICAgICMgTWV0aG9kcwogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJAc3RhdGljbWV0aG9kXG5kZWYgZm9vKHgseSk6IHBhc3MiLCAiIiJcCiAgICAgT1AgICAgICAgICAnQCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKLSAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QgKDEsIDEpICgxLCAxMykKKyAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QnICgxLCAxKSAoMSwgMTMpCiAgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgMTMpICgxLCAxNCkKICAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDIsIDApICgyLCAzKQogICAgIE5BTUUgICAgICAgJ2ZvbycgICAgICAgICAoMiwgNCkgKDIsIDcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy9fX2luaXRfXy5weQppbmRleCAwNGM4NzI2Li40ZDBmY2EzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvX19pbml0X18ucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBpbXBvcnRsaWIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoCiAKIGJhc2VwYXRoID0gb3MucGF0aC5kaXJuYW1lKCAgICAgICAgICAgICAgICAgIyA8c3JjL2luc3RhbGwgZGlyPgogICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZSggICAgICAgICAgICAgICAgIyBMaWIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKaW5kZXggMGMyOTRlYy4uOTQ4OWVkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKQEAgLTIsMTIgKzIsMTEgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKIGltcG9ydCB0ZW1wZmlsZQogCi1mcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nLCBpbXBvcnRfdG9vbAorZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKIAogc2tpcF9pZl9taXNzaW5nKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9tZDVzdW0ucHkKaW5kZXggMTMwNTI5NS4uZmI1NjViNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfbWQ1c3VtLnB5CkBAIC0xLDEyICsxLDExIEBACiAiIiJUZXN0cyBmb3IgdGhlIG1kNXN1bSBzY3JpcHQgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiAKLWZyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBzY3JpcHRzZGlyLCBpbXBvcnRfdG9vbCwgc2tpcF9pZl9taXNzaW5nCitmcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weQppbmRleCAwOTFmYTZhLi4yN2NiZmUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfcGRlcHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3BkZXBzLnB5CkBAIC0xLDEyICsxLDEwIEBACiAiIiJUZXN0cyBmb3IgdGhlIHBkZXBzIHNjcmlwdCBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRlbXBmaWxlCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAotZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNjcmlwdHNkaXIsIHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKK2Zyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBza2lwX2lmX21pc3NpbmcsIGltcG9ydF90b29sCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKaW5kZXggNzM0YmJjMi4uNTE3ZjI2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKQEAgLTEzNCw2ICsxMzQsMTEgQEAKIGNsYXNzIFVucGFyc2VUZXN0Q2FzZShBU1RUZXN0Q2FzZSk6CiAgICAgIyBUZXN0cyBmb3Igc3BlY2lmaWMgYnVncyBmb3VuZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHVucGFyc2UKIAorICAgIGRlZiB0ZXN0X2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTE4MAorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7MH0iKjN9JyIiIikKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2Yie3l9IiozfSciIiIpCisKICAgICBkZWYgdGVzdF9kZWxfc3RhdGVtZW50KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcCgiZGVsIHgsIHksIHoiKQogCkBAIC0yNzksNiArMjg0LDE1IEBACiAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgIGlmIHRlc3Quc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgICAgIHByaW50KCdUZXN0aW5nICVzJyAlIGZpbGVuYW1lKQorCisgICAgICAgICAgICAjIGl0J3MgdmVyeSBtdWNoIGEgaGFjayB0aGF0IEknbSBza2lwcGluZyB0aGVzZSBmaWxlcywgYnV0CisgICAgICAgICAgICAjICBJIGNhbid0IGZpZ3VyZSBvdXQgd2h5IHRoZXkgZmFpbC4gSSdsbCBmaXggaXQgd2hlbiBJCisgICAgICAgICAgICAjICBhZGRyZXNzIGlzc3VlICMyNzk0OC4KKyAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpIGluICgndGVzdF9mc3RyaW5nLnB5JywgJ3Rlc3RfdHJhY2ViYWNrLnB5Jyk6CisgICAgICAgICAgICAgICAgaWYgdGVzdC5zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KGYnU2tpcHBpbmcge2ZpbGVuYW1lfTogc2VlIGlzc3VlIDI3OTIxJykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCiAgICAgICAgICAgICBzb3VyY2UgPSByZWFkX3B5ZmlsZShmaWxlbmFtZSkKICAgICAgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHNvdXJjZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKaW5kZXggMDNkZmY4NC4uMWQ4OTRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CkBAIC0xLDExICsxLDExIEBACiBpbXBvcnQgb3MKLWltcG9ydCBpbwogaW1wb3J0IHN5cwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcm10cmVlLCB1bmxpbmssIGNhcHR1cmVkX3N0ZG91dAorZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiBpbXBvcnQgdW5pdHRlc3QKIAogaW1wb3J0IHRyYWNlCi1mcm9tIHRyYWNlIGltcG9ydCBDb3ZlcmFnZVJlc3VsdHMsIFRyYWNlCitmcm9tIHRyYWNlIGltcG9ydCBUcmFjZQogCiBmcm9tIHRlc3QudHJhY2VkbW9kdWxlcyBpbXBvcnQgdGVzdG1vZAogCkBAIC0zNjUsNTEgKzM2NSwyNyBAQAogICAgICAgICAjIE1hdGNoZWQgYmVmb3JlLgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaWdub3JlLm5hbWVzKGpuKCdiYXInLCAnYmF6LnB5JyksICdiYXonKSkKIAorY2xhc3MgVGVzdENvbW1hbmRMaW5lKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotY2xhc3MgVGVzdERlcHJlY2F0ZWRNZXRob2RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mYWlsdXJlcyhzZWxmKToKKyAgICAgICAgX2Vycm9ycyA9ICgKKyAgICAgICAgICAgIChiJ2ZpbGVuYW1lIGlzIG1pc3Npbmc6IHJlcXVpcmVkIHdpdGggdGhlIG1haW4gb3B0aW9ucycsICctbCcsICctVCcpLAorICAgICAgICAgICAgKGInY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCknLCAnLWxjJyksCisgICAgICAgICAgICAoYidhcmd1bWVudCAtUi8tLW5vLXJlcG9ydDogbm90IGFsbG93ZWQgd2l0aCBhcmd1bWVudCAtci8tLXJlcG9ydCcsICctclInKSwKKyAgICAgICAgICAgIChiJ211c3Qgc3BlY2lmeSBvbmUgb2YgLS10cmFjZSwgLS1jb3VudCwgLS1yZXBvcnQsIC0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMnLCAnLWcnKSwKKyAgICAgICAgICAgIChiJy1yLy0tcmVwb3J0IHJlcXVpcmVzIC1mLy0tZmlsZScsICctcicpLAorICAgICAgICAgICAgKGInLS1zdW1tYXJ5IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0JywgJy1zVCcpLAorICAgICAgICAgICAgKGIndW5yZWNvZ25pemVkIGFyZ3VtZW50czogLXknLCAnLXknKSkKKyAgICAgICAgZm9yIG1lc3NhZ2UsICphcmdzIGluIF9lcnJvcnM6CisgICAgICAgICAgICAqXywgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctbScsICd0cmFjZScsICphcmdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtZXNzYWdlLCBzdGRlcnIpCiAKLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX3VzYWdlKHNlbGYpOgotICAgICAgICBzaW8gPSBpby5TdHJpbmdJTygpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UudXNhZ2Uoc2lvKQotICAgICAgICBzZWxmLmFzc2VydEluKCdVc2FnZTonLCBzaW8uZ2V0dmFsdWUoKSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfSWdub3JlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLklnbm9yZSgpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX21vZG5hbWUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic3BhbSIsIHRyYWNlLm1vZG5hbWUoInNwYW0iKSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZnVsbG1vZG5hbWUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic3BhbSIsIHRyYWNlLmZ1bGxtb2RuYW1lKCJzcGFtIikpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfbGluZXNfZnJvbV9jb2RlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIGRlZiBmb28oKToKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICB0cmFjZS5maW5kX2xpbmVzX2Zyb21fY29kZShmb28uX19jb2RlX18sIFsiZWdncyJdKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2xpbmVzKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIGRlZiBmb28oKToKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICB0cmFjZS5maW5kX2xpbmVzKGZvby5fX2NvZGVfXywgWyJlZ2dzIl0pCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfc3RyaW5ncyhzZWxmKToKKyAgICBkZWYgdGVzdF9saXN0ZnVuY3NfZmxhZ19zdWNjZXNzKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGZkOgogICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHVubGluaywgVEVTVEZOKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLmZpbmRfc3RyaW5ncyhmZC5uYW1lKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhzZWxmKToKLSAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmZDoKLSAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmZC5uYW1lKQotCisgICAgICAgICAgICBmZC53cml0ZSgiYSA9IDFcbiIpCisgICAgICAgICAgICBzdGF0dXMsIHN0ZG91dCwgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAndHJhY2UnLCAnLWwnLCBURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInZnVuY3Rpb25zIGNhbGxlZDonLCBzdGRvdXQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IDU0OWQ4ZDEuLmZjN2U2Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0xMjksMTIgKzEyOSwxMiBAQAogICAgICAgICBkZWYgZG9fdGVzdChmaXJzdGxpbmVzLCBtZXNzYWdlLCBjaGFyc2V0LCBsaW5lbm8pOgogICAgICAgICAgICAgIyBSYWlzZSB0aGUgbWVzc2FnZSBpbiBhIHN1YnByb2Nlc3MsIGFuZCBjYXRjaCB0aGUgb3V0cHV0CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3BlbihURVNURk4sICJ3IiwgZW5jb2Rpbmc9Y2hhcnNldCkKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIiIiezB9aWYgMToKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjazsKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd7MX0nKQotICAgICAgICAgICAgICAgICAgICAiIiIuZm9ybWF0KGZpcnN0bGluZXMsIG1lc3NhZ2UpKQotICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciLCBlbmNvZGluZz1jaGFyc2V0KSBhcyBvdXRwdXQ6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgiIiJ7MH1pZiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignezF9JykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIi5mb3JtYXQoZmlyc3RsaW5lcywgbWVzc2FnZSkpCisKICAgICAgICAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsIFRFU1RGTl0sCiAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKICAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQpAQCAtMTc1LDggKzE3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHRleHQsIGNoYXJzZXQsIDUpCiAgICAgICAgICAgICBkb190ZXN0KCIgXHRcZlxuIyBjb2Rpbmc6IHswfVxuIi5mb3JtYXQoY2hhcnNldCksCiAgICAgICAgICAgICAgICAgICAgIHRleHQsIGNoYXJzZXQsIDUpCi0gICAgICAgICMgSXNzdWUgIzE4OTYwOiBjb2Rpbmcgc3BlYyBzaG91bGQgaGFzIG5vIGVmZmVjdAotICAgICAgICBkb190ZXN0KCIwXG4jIGNvZGluZzogR0JLXG4iLCAiaFx4ZTkgaG8iLCAndXRmLTgnLCA1KQorICAgICAgICAjIElzc3VlICMxODk2MDogY29kaW5nIHNwZWMgc2hvdWxkIGhhdmUgbm8gZWZmZWN0CisgICAgICAgIGRvX3Rlc3QoIng9MFxuIyBjb2Rpbmc6IEdCS1xuIiwgImhceGU5IGhvIiwgJ3V0Zi04JywgNSkKIAogICAgIEBzdXBwb3J0LnJlcXVpcmVzX3R5cGVfY29sbGVjdGluZwogICAgIGRlZiB0ZXN0X3ByaW50X3RyYWNlYmFja19hdF9leGl0KHNlbGYpOgpAQCAtMzAzLDYgKzMwMywxMzcgQEAKICAgICAgICAgICAgICcgICAgdHJhY2ViYWNrLnByaW50X3N0YWNrKCknLAogICAgICAgICBdKQogCisgICAgIyBpc3N1ZSAyNjgyMyAtIFNocmluayByZWN1cnNpdmUgdHJhY2ViYWNrcworICAgIGRlZiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5KHNlbGYsIHJlbmRlcl9leGMpOgorICAgICAgICAjIEFsd2F5cyBzaG93IGZ1bGwgZGlmZnMgd2hlbiB0aGlzIHRlc3QgZmFpbHMKKyAgICAgICAgIyBOb3RlIHRoYXQgcmVhcnJhbmdpbmcgdGhpbmdzIG1heSByZXF1aXJlIGFkanVzdGluZworICAgICAgICAjIHRoZSByZWxhdGl2ZSBsaW5lIG51bWJlcnMgaW4gdGhlIGV4cGVjdGVkIHRyYWNlYmFja3MKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorCisgICAgICAgICMgQ2hlY2sgaGl0dGluZyB0aGUgcmVjdXJzaW9uIGxpbWl0CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmKCkKKworICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgc3RkZXJyX2Y6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBleGNlcHQgUmVjdXJzaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHJlbmRlcl9leGMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIHJlY3Vyc2lvbiBvY2N1cnJlZCIpCisKKyAgICAgICAgbGluZW5vX2YgPSBmLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIHJlc3VsdF9mID0gKAorICAgICAgICAgICAgJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrNX0sIGluIF9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXknJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2YrMX0sIGluIGYnJ1xuJworICAgICAgICAgICAgJyAgICBmKClcbicKKyAgICAgICAgICAgICMgWFhYOiBUaGUgZm9sbG93aW5nIGxpbmUgY2hhbmdlcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdGVzdHMKKyAgICAgICAgICAgICMgYXJlIHJ1biB0aHJvdWdoIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBvciB3aXRoIC1tCisgICAgICAgICAgICAjIEl0IGFsc28gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gKHN0YWNrIHNpemUpCisgICAgICAgICAgICAjIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBjYXJlIGFib3V0IGV4YWN0bmVzcyBoZXJlLCBzbyB3ZSB1c2UgcmVnZXgKKyAgICAgICAgICAgIHInICBcW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgKFxkKykgbW9yZSB0aW1lc1xdJyAnXG4nCisgICAgICAgICAgICAnUmVjdXJzaW9uRXJyb3I6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkXG4nCisgICAgICAgICkKKworICAgICAgICBleHBlY3RlZCA9IHJlc3VsdF9mLnNwbGl0bGluZXMoKQorICAgICAgICBhY3R1YWwgPSBzdGRlcnJfZi5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKQorCisgICAgICAgICMgQ2hlY2sgdGhlIG91dHB1dCB0ZXh0IG1hdGNoZXMgZXhwZWN0YXRpb25zCisgICAgICAgICMgMm5kIGxhc3QgbGluZSBjb250YWlucyB0aGUgcmVwZXRpdGlvbiBjb3VudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbFs6LTJdLCBleHBlY3RlZFs6LTJdKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGFjdHVhbFstMl0sIGV4cGVjdGVkWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxbLTFdLCBleHBlY3RlZFstMV0pCisKKyAgICAgICAgIyBDaGVjayB0aGUgcmVjdXJzaW9uIGNvdW50IGlzIHJvdWdobHkgYXMgZXhwZWN0ZWQKKyAgICAgICAgcmVjX2xpbWl0ID0gc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihpbnQocmUuc2VhcmNoKHIiXGQrIiwgYWN0dWFsWy0yXSkuZ3JvdXAoKSksIHJhbmdlKHJlY19saW1pdC01MCwgcmVjX2xpbWl0KSkKKworICAgICAgICAjIENoZWNrIGEga25vd24gKGxpbWl0ZWQpIG51bWJlciBvZiByZWN1cnNpdmUgaW52b2NhdGlvbnMKKyAgICAgICAgZGVmIGcoY291bnQ9MTApOgorICAgICAgICAgICAgaWYgY291bnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGcoY291bnQtMSkKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKworICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgc3RkZXJyX2c6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgcmVuZGVyX2V4YygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gdmFsdWUgZXJyb3Igd2FzIHJhaXNlZCIpCisKKyAgICAgICAgbGluZW5vX2cgPSBnLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIHJlc3VsdF9nID0gKAorICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9fZysyfSwgaW4gZycnXG4nCisgICAgICAgICAgICAnICAgIHJldHVybiBnKGNvdW50LTEpXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19nKzJ9LCBpbiBnJydcbicKKyAgICAgICAgICAgICcgICAgcmV0dXJuIGcoY291bnQtMSlcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2crMn0sIGluIGcnJ1xuJworICAgICAgICAgICAgJyAgICByZXR1cm4gZyhjb3VudC0xKVxuJworICAgICAgICAgICAgJyAgW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQgNiBtb3JlIHRpbWVzXVxuJworICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9fZyszfSwgaW4gZycnXG4nCisgICAgICAgICAgICAnICAgIHJhaXNlIFZhbHVlRXJyb3JcbicKKyAgICAgICAgICAgICdWYWx1ZUVycm9yXG4nCisgICAgICAgICkKKyAgICAgICAgdGJfbGluZSA9ICgKKyAgICAgICAgICAgICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19nKzd9LCBpbiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5JydcbicKKyAgICAgICAgICAgICcgICAgZygpXG4nCisgICAgICAgICkKKyAgICAgICAgZXhwZWN0ZWQgPSAodGJfbGluZSArIHJlc3VsdF9nKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgYWN0dWFsID0gc3RkZXJyX2cuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgICAgICMgQ2hlY2sgMiBkaWZmZXJlbnQgcmVwZXRpdGl2ZSBzZWN0aW9ucworICAgICAgICBkZWYgaChjb3VudD0xMCk6CisgICAgICAgICAgICBpZiBjb3VudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaChjb3VudC0xKQorICAgICAgICAgICAgZygpCisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHN0ZGVycl9oOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGgoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHJlbmRlcl9leGMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIHZhbHVlIGVycm9yIHdhcyByYWlzZWQiKQorCisgICAgICAgIGxpbmVub19oID0gaC5fX2NvZGVfXy5jb19maXJzdGxpbmVubworICAgICAgICByZXN1bHRfaCA9ICgKKyAgICAgICAgICAgICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzd9LCBpbiBfY2hlY2tfcmVjdXJzaXZlX3RyYWNlYmFja19kaXNwbGF5JydcbicKKyAgICAgICAgICAgICcgICAgaCgpXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzJ9LCBpbiBoJydcbicKKyAgICAgICAgICAgICcgICAgcmV0dXJuIGgoY291bnQtMSlcbicKKyAgICAgICAgICAgIGYnICBGaWxlICJ7X19maWxlX199IiwgbGluZSB7bGluZW5vX2grMn0sIGluIGgnJ1xuJworICAgICAgICAgICAgJyAgICByZXR1cm4gaChjb3VudC0xKVxuJworICAgICAgICAgICAgZicgIEZpbGUgIntfX2ZpbGVfX30iLCBsaW5lIHtsaW5lbm9faCsyfSwgaW4gaCcnXG4nCisgICAgICAgICAgICAnICAgIHJldHVybiBoKGNvdW50LTEpXG4nCisgICAgICAgICAgICAnICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCA2IG1vcmUgdGltZXNdXG4nCisgICAgICAgICAgICBmJyAgRmlsZSAie19fZmlsZV9ffSIsIGxpbmUge2xpbmVub19oKzN9LCBpbiBoJydcbicKKyAgICAgICAgICAgICcgICAgZygpXG4nCisgICAgICAgICkKKyAgICAgICAgZXhwZWN0ZWQgPSAocmVzdWx0X2ggKyByZXN1bHRfZykuc3BsaXRsaW5lcygpCisgICAgICAgIGFjdHVhbCA9IHN0ZGVycl9oLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV90cmFjZWJhY2tfcHl0aG9uKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXkodHJhY2ViYWNrLnByaW50X2V4YykKKworICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfdHJhY2ViYWNrX2NweXRob25faW50ZXJuYWwoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBleGNlcHRpb25fcHJpbnQKKyAgICAgICAgZGVmIHJlbmRlcl9leGMoKToKKyAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBleGNlcHRpb25fcHJpbnQoZXhjX3ZhbHVlKQorICAgICAgICBzZWxmLl9jaGVja19yZWN1cnNpdmVfdHJhY2ViYWNrX2Rpc3BsYXkocmVuZGVyX2V4YykKKwogICAgIGRlZiB0ZXN0X2Zvcm1hdF9zdGFjayhzZWxmKToKICAgICAgICAgZGVmIGZtdCgpOgogICAgICAgICAgICAgcmV0dXJuIHRyYWNlYmFjay5mb3JtYXRfc3RhY2soKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkKaW5kZXggZGE4OWE5YS4uNzkwYWI3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5CkBAIC0xMSw5ICsxMSwxNSBAQAogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IF90ZXN0Y2FwaQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF90ZXN0Y2FwaSA9IE5vbmUKKwogCiBFTVBUWV9TVFJJTkdfU0laRSA9IHN5cy5nZXRzaXplb2YoYicnKQogCisKIGRlZiBnZXRfZnJhbWVzKG5mcmFtZSwgbGluZW5vX2RlbHRhKToKICAgICBmcmFtZXMgPSBbXQogICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQpAQCAtMzcsMjggKzQzLDMxIEBACiBkZWYgY3JlYXRlX3NuYXBzaG90cygpOgogICAgIHRyYWNlYmFja19saW1pdCA9IDIKIAorICAgICMgX3RyYWNlbWFsbG9jLl9nZXRfdHJhY2VzKCkgcmV0dXJucyBhIGxpc3Qgb2YgKGRvbWFpbiwgc2l6ZSwKKyAgICAjIHRyYWNlYmFja19mcmFtZXMpIHR1cGxlcy4gdHJhY2ViYWNrX2ZyYW1lcyBpcyBhIHR1cGxlIG9mIChmaWxlbmFtZSwKKyAgICAjIGxpbmVfbnVtYmVyKSB0dXBsZXMuCiAgICAgcmF3X3RyYWNlcyA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKIAotICAgICAgICAoNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKICAgICBdCiAgICAgc25hcHNob3QgPSB0cmFjZW1hbGxvYy5TbmFwc2hvdChyYXdfdHJhY2VzLCB0cmFjZWJhY2tfbGltaXQpCiAKICAgICByYXdfdHJhY2VzMiA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg0MDAsICgoJ2MucHknLCA1NzgpLCkpLAorICAgICAgICAoNCwgNDAwLCAoKCdjLnB5JywgNTc4KSwpKSwKICAgICBdCiAgICAgc25hcHNob3QyID0gdHJhY2VtYWxsb2MuU25hcHNob3QocmF3X3RyYWNlczIsIHRyYWNlYmFja19saW1pdCkKIApAQCAtMTI2LDcgKzEzNSw3IEBACiAKICAgICBkZWYgZmluZF90cmFjZShzZWxmLCB0cmFjZXMsIHRyYWNlYmFjayk6CiAgICAgICAgIGZvciB0cmFjZSBpbiB0cmFjZXM6Ci0gICAgICAgICAgICBpZiB0cmFjZVsxXSA9PSB0cmFjZWJhY2suX2ZyYW1lczoKKyAgICAgICAgICAgIGlmIHRyYWNlWzJdID09IHRyYWNlYmFjay5fZnJhbWVzOgogICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZQogCiAgICAgICAgIHNlbGYuZmFpbCgidHJhY2Ugbm90IGZvdW5kIikKQEAgLTE0MCw3ICsxNDksNyBAQAogICAgICAgICB0cmFjZSA9IHNlbGYuZmluZF90cmFjZSh0cmFjZXMsIG9ial90cmFjZWJhY2spCiAKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRyYWNlLCB0dXBsZSkKLSAgICAgICAgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIG9ial9zaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlYmFjaywgb2JqX3RyYWNlYmFjay5fZnJhbWVzKQogCkBAIC0xNjcsOSArMTc2LDggQEAKIAogICAgICAgICB0cmFjZTEgPSBzZWxmLmZpbmRfdHJhY2UodHJhY2VzLCBvYmoxX3RyYWNlYmFjaykKICAgICAgICAgdHJhY2UyID0gc2VsZi5maW5kX3RyYWNlKHRyYWNlcywgb2JqMl90cmFjZWJhY2spCi0gICAgICAgIHNpemUxLCB0cmFjZWJhY2sxID0gdHJhY2UxCi0gICAgICAgIHNpemUyLCB0cmFjZWJhY2syID0gdHJhY2UyCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2ViYWNrMiwgdHJhY2ViYWNrMSkKKyAgICAgICAgZG9tYWluMSwgc2l6ZTEsIHRyYWNlYmFjazEgPSB0cmFjZTEKKyAgICAgICAgZG9tYWluMiwgc2l6ZTIsIHRyYWNlYmFjazIgPSB0cmFjZTIKICAgICAgICAgc2VsZi5hc3NlcnRJcyh0cmFjZWJhY2syLCB0cmFjZWJhY2sxKQogCiAgICAgZGVmIHRlc3RfZ2V0X3RyYWNlZF9tZW1vcnkoc2VsZik6CkBAIC0yOTIsNyArMzAwLDcgQEAKICAgICBtYXhEaWZmID0gNDAwMAogCiAgICAgZGVmIHRlc3RfY3JlYXRlX3NuYXBzaG90KHNlbGYpOgotICAgICAgICByYXdfdHJhY2VzID0gWyg1LCAoKCdhLnB5JywgMiksKSldCisgICAgICAgIHJhd190cmFjZXMgPSBbKDAsIDUsICgoJ2EucHknLCAyKSwpKV0KIAogICAgICAgICB3aXRoIGNvbnRleHRsaWIuRXhpdFN0YWNrKCkgYXMgc3RhY2s6CiAgICAgICAgICAgICBzdGFjay5lbnRlcl9jb250ZXh0KHBhdGNoLm9iamVjdCh0cmFjZW1hbGxvYywgJ2lzX3RyYWNpbmcnLApAQCAtMzIyLDExICszMzAsMTEgQEAKICAgICAgICAgIyBleGNsdWRlIGIucHkKICAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWwotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICg3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCiAgICAgICAgIF0pCiAKICAgICAgICAgIyBmaWx0ZXJfdHJhY2VzKCkgbXVzdCBub3QgdG91Y2ggdGhlIG9yaWdpbmFsIHNuYXBzaG90CkBAIC0zMzUsMTAgKzM0MywxMCBAQAogICAgICAgICAjIG9ubHkgaW5jbHVkZSB0d28gbGluZXMgb2YgYS5weQogICAgICAgICBzbmFwc2hvdDQgPSBzbmFwc2hvdDMuZmlsdGVyX3RyYWNlcygoZmlsdGVyMiwgZmlsdGVyMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3Q0LnRyYWNlcy5fdHJhY2VzLCBbCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKICAgICAgICAgXSkKIAogICAgICAgICAjIE5vIGZpbHRlcjoganVzdCBkdXBsaWNhdGUgdGhlIHNuYXBzaG90CkBAIC0zNDksNiArMzU3LDU0IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzLCBmaWx0ZXIxKQogCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW4oc2VsZik6CisgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKKyAgICAgICAgZmlsdGVyMSA9IHRyYWNlbWFsbG9jLkZpbHRlcihGYWxzZSwgImEucHkiLCBkb21haW49MSkKKyAgICAgICAgZmlsdGVyMiA9IHRyYWNlbWFsbG9jLkZpbHRlcihUcnVlLCAiYS5weSIsIGRvbWFpbj0xKQorCisgICAgICAgIG9yaWdpbmFsX3RyYWNlcyA9IGxpc3Qoc25hcHNob3QudHJhY2VzLl90cmFjZXMpCisKKyAgICAgICAgIyBleGNsdWRlIGEucHkgb2YgZG9tYWluIDEKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAxCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW5fZmlsdGVyKHNlbGYpOgorICAgICAgICBzbmFwc2hvdCwgc25hcHNob3QyID0gY3JlYXRlX3NuYXBzaG90cygpCisgICAgICAgIGZpbHRlcjEgPSB0cmFjZW1hbGxvYy5Eb21haW5GaWx0ZXIoRmFsc2UsIGRvbWFpbj0zKQorICAgICAgICBmaWx0ZXIyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIGRvbWFpbj0zKQorCisgICAgICAgICMgZXhjbHVkZSBkb21haW4gMgorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAyCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgXSkKKwogICAgIGRlZiB0ZXN0X3NuYXBzaG90X2dyb3VwX2J5X2xpbmUoc2VsZik6CiAgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKICAgICAgICAgdGJfMCA9IHRyYWNlYmFja19saW5lbm8oJzx1bmtub3duPicsIDApCkBAIC04MTYsMTIgKzg3MiwxMjEgQEAKICAgICAgICAgYXNzZXJ0X3B5dGhvbl9vaygnLVgnLCAndHJhY2VtYWxsb2MnLCAnLWMnLCBjb2RlKQogCiAKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIF90ZXN0Y2FwaScpCitjbGFzcyBUZXN0Q0FQSSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbWF4RGlmZiA9IDgwICogMjAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgdHJhY2VtYWxsb2MuaXNfdHJhY2luZygpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidHJhY2VtYWxsb2MgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgdGVzdCIpCisKKyAgICAgICAgc2VsZi5kb21haW4gPSA1CisgICAgICAgIHNlbGYuc2l6ZSA9IDEyMworICAgICAgICBzZWxmLm9iaiA9IGFsbG9jYXRlX2J5dGVzKHNlbGYuc2l6ZSlbMF0KKworICAgICAgICAjIGZvciB0aGUgdHlwZSAib2JqZWN0IiwgaWQob2JqKSBpcyB0aGUgYWRkcmVzcyBvZiBpdHMgbWVtb3J5IGJsb2NrLgorICAgICAgICAjIFRoaXMgdHlwZSBpcyBub3QgdHJhY2tlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICAgICAgc2VsZi5wdHIgPSBpZChzZWxmLm9iaikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICBkZWYgZ2V0X3RyYWNlYmFjayhzZWxmKToKKyAgICAgICAgZnJhbWVzID0gX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorICAgICAgICBpZiBmcmFtZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgdHJhY2soc2VsZiwgcmVsZWFzZV9naWw9RmFsc2UsIG5mcmFtZT0xKToKKyAgICAgICAgZnJhbWVzID0gZ2V0X2ZyYW1lcyhuZnJhbWUsIDIpCisgICAgICAgIF90ZXN0Y2FwaS50cmFjZW1hbGxvY190cmFjayhzZWxmLmRvbWFpbiwgc2VsZi5wdHIsIHNlbGYuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfZ2lsKQorICAgICAgICByZXR1cm4gZnJhbWVzCisKKyAgICBkZWYgdW50cmFjayhzZWxmKToKKyAgICAgICAgX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX3VudHJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorCisgICAgZGVmIGdldF90cmFjZWRfbWVtb3J5KHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgdHJhY2VkIHNpemUgaW4gdGhlIGRvbWFpbgorICAgICAgICBzbmFwc2hvdCA9IHRyYWNlbWFsbG9jLnRha2Vfc25hcHNob3QoKQorICAgICAgICBkb21haW5fZmlsdGVyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIHNlbGYuZG9tYWluKQorICAgICAgICBzbmFwc2hvdCA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoW2RvbWFpbl9maWx0ZXJdKQorICAgICAgICByZXR1cm4gc3VtKHRyYWNlLnNpemUgZm9yIHRyYWNlIGluIHNuYXBzaG90LnRyYWNlcykKKworICAgIGRlZiBjaGVja190cmFjayhzZWxmLCByZWxlYXNlX2dpbCk6CisgICAgICAgIG5mcmFtZSA9IDUKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQobmZyYW1lKQorCisgICAgICAgIHNpemUgPSB0cmFjZW1hbGxvYy5nZXRfdHJhY2VkX21lbW9yeSgpWzBdCisKKyAgICAgICAgZnJhbWVzID0gc2VsZi50cmFjayhyZWxlYXNlX2dpbCwgbmZyYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlYmFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jLlRyYWNlYmFjayhmcmFtZXMpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCBzZWxmLnNpemUpCisKKyAgICBkZWYgdGVzdF90cmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190cmFjayhGYWxzZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19UcmFjaygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMCisgICAgICAgICMgd29ya3MgdG9vCisgICAgICAgIHNlbGYuY2hlY2tfdHJhY2soVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX2FscmVhZHlfdHJhY2tlZChzZWxmKToKKyAgICAgICAgbmZyYW1lID0gNQorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydChuZnJhbWUpCisKKyAgICAgICAgIyB0cmFjayBhIGZpcnN0IHRpbWUKKyAgICAgICAgc2VsZi50cmFjaygpCisKKyAgICAgICAgIyBjYWxsaW5nIF9QeVRyYWNlTWFsbG9jX1RyYWNrKCkgbXVzdCByZW1vdmUgdGhlIG9sZCB0cmFjZSBhbmQgYWRkCisgICAgICAgICMgYSBuZXcgdHJhY2Ugd2l0aCB0aGUgbmV3IHRyYWNlYmFjaworICAgICAgICBmcmFtZXMgPSBzZWxmLnRyYWNrKG5mcmFtZT1uZnJhbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2ViYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykpCisKKyAgICBkZWYgdGVzdF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisKKyAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlZF9tZW1vcnkoKSwgc2VsZi5zaXplKQorCisgICAgICAgICMgdW50cmFjayBtdXN0IHJlbW92ZSB0aGUgdHJhY2UKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5nZXRfdHJhY2ViYWNrKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCAwKQorCisgICAgICAgICMgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKCkgbXVsdGlwbGUgdGltZXMgbXVzdCBub3QgY3Jhc2gKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKworICAgIGRlZiB0ZXN0X3N0b3BfdHJhY2soc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorCisgICAgZGVmIHRlc3Rfc3RvcF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisgICAgICAgIHNlbGYudHJhY2soKQorCisgICAgICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnVudHJhY2soKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgVGVzdFRyYWNlbWFsbG9jRW5hYmxlZCwKICAgICAgICAgVGVzdFNuYXBzaG90LAogICAgICAgICBUZXN0RmlsdGVycywKICAgICAgICAgVGVzdENvbW1hbmRMaW5lLAorICAgICAgICBUZXN0Q0FQSSwKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5IGIvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQppbmRleCA0OTBlNzIzLi40NjI2NjVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKQEAgLTEsNCArMSwzIEBACi1pbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5IGIvTGliL3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkKaW5kZXggNTY2ZmM5ZC4uNzU0MGE0MzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CkBAIC0xLDQgKzEsMyBAQAotaW1wb3J0IG9zCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogIyBTa2lwIHRoaXMgdGVzdCBpZiBfdGtpbnRlciBkb2VzIG5vdCBleGlzdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CmluZGV4IDVlNzQxMTUuLmU1ZTExMGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtODI1LDYgKzgyNSwyOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMueSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLnosIDIpCiAKKyAgICBkZWYgdGVzdF9uZXdfY2xhc3NfZGVmb3JkZXIoc2VsZik6CisgICAgICAgIEMgPSB0eXBlcy5uZXdfY2xhc3MoIkMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19kZWZpbml0aW9uX29yZGVyX18sIHR1cGxlKCkpCisKKyAgICAgICAgTWV0YSA9IHNlbGYuTWV0YQorICAgICAgICBkZWYgZnVuYyhucyk6CisgICAgICAgICAgICBuc1sieCJdID0gMAorICAgICAgICBEID0gdHlwZXMubmV3X2NsYXNzKCJEIiwgKCksIHsibWV0YWNsYXNzIjogTWV0YSwgInoiOiAyfSwgZnVuYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fZGVmaW5pdGlvbl9vcmRlcl9fLCAoJ3knLCAneicsICd4JykpCisKKyAgICAgICAgZGVmIGZ1bmMobnMpOgorICAgICAgICAgICAgbnNbIl9fZGVmaW5pdGlvbl9vcmRlcl9fIl0gPSBOb25lCisgICAgICAgICAgICBuc1sieCJdID0gMAorICAgICAgICBEID0gdHlwZXMubmV3X2NsYXNzKCJEIiwgKCksIHsibWV0YWNsYXNzIjogTWV0YSwgInoiOiAyfSwgZnVuYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fZGVmaW5pdGlvbl9vcmRlcl9fLCBOb25lKQorCisgICAgICAgIGRlZiBmdW5jKG5zKToKKyAgICAgICAgICAgIG5zWyJfX2RlZmluaXRpb25fb3JkZXJfXyJdID0gKCdhJywgJ2InLCAnYycpCisgICAgICAgICAgICBuc1sieCJdID0gMAorICAgICAgICBEID0gdHlwZXMubmV3X2NsYXNzKCJEIiwgKCksIHsibWV0YWNsYXNzIjogTWV0YSwgInoiOiAyfSwgZnVuYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fZGVmaW5pdGlvbl9vcmRlcl9fLCAoJ2EnLCAnYicsICdjJykpCisKICAgICAjIE1hbnkgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgZGVyaXZlZCBmcm9tIHRlc3RfZGVzY3IucHkKICAgICBkZWYgdGVzdF9wcmVwYXJlX2NsYXNzKHNlbGYpOgogICAgICAgICAjIEJhc2ljIHRlc3Qgb2YgbWV0YWNsYXNzIGRlcml2YXRpb24KQEAgLTEwMDAsNiArMTAyMiwyNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBYID0gdHlwZXMubmV3X2NsYXNzKCJYIiwgKGludCgpLCBDKSkKIAorICAgIGRlZiB0ZXN0X29uZV9hcmd1bWVudF90eXBlKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9tZXNzYWdlID0gJ3R5cGUuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgMyBhcmd1bWVudHMgKDEgZ2l2ZW4pJworCisgICAgICAgICMgT25seSB0eXBlIGl0c2VsZiBjYW4gdXNlIHRoZSBvbmUtYXJndW1lbnQgZm9ybSAoIzI3MTU3KQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoNSksIGludCkKKworICAgICAgICBjbGFzcyBNKHR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBNKDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksIGV4cGVjdGVkX21lc3NhZ2UpCisKKyAgICAgICAgY2xhc3MgTih0eXBlLCBtZXRhY2xhc3M9TSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIE4oNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgZXhwZWN0ZWRfbWVzc2FnZSkKKwogCiBjbGFzcyBTaW1wbGVOYW1lc3BhY2VUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCBhMzhlN2IxLi43OGY5NjY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC05ODYsNiArOTg2LDE5IEBACiAgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGludC5fX2Zvcm1hdF9fKHNlbGYgKiAyLCBmb3JtYXRfc3BlYykKIAorICAgICAgICBjbGFzcyBNOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ00oJyArIHNlbGYueCArICcpJworICAgICAgICAgICAgX19zdHJfXyA9IE5vbmUKKworICAgICAgICBjbGFzcyBOOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ04oJyArIHNlbGYueCArICcpJworICAgICAgICAgICAgX19mb3JtYXRfXyA9IE5vbmUKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmZvcm1hdCgpLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJy5mb3JtYXQoKSwgJ2FiYycpCkBAIC0xMjAwLDYgKzEyMTMsMTYgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIweHs6MHs6ZH1YfSIuZm9ybWF0KDB4MCwxNiksICIweDAwMDAwMDAwMDAwMDAwMDAiKQogCisgICAgICAgICMgQmxvY2tpbmcgZmFsbGJhY2sKKyAgICAgICAgbSA9IE0oJ2RhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7IXJ9Ii5mb3JtYXQobSksICdNKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAieyFzfSIuZm9ybWF0LCBtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJ7fSIuZm9ybWF0LCBtKQorICAgICAgICBuID0gTignZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInshcn0iLmZvcm1hdChuKSwgJ04oZGF0YSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7IXN9Ii5mb3JtYXQobiksICdOKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAie30iLmZvcm1hdCwgbikKKwogICAgIGRlZiB0ZXN0X2Zvcm1hdF9tYXAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuZm9ybWF0X21hcCh7fSksICcnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhJy5mb3JtYXRfbWFwKHt9KSwgJ2EnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bnBhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3VucGFjay5weQppbmRleCBkMWNjYjM4Li4zZmNiMThmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VucGFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VucGFjay5weQpAQCAtMTE3LDYgKzExNywyNyBAQAogICAgICAgLi4uCiAgICAgdGVzdC50ZXN0X3VucGFjay5Cb3pvRXJyb3IKIAorQWxsb3cgdW5wYWNraW5nIGVtcHR5IGl0ZXJhYmxlcworCisgICAgPj4+ICgpID0gW10KKyAgICA+Pj4gW10gPSAoKQorICAgID4+PiBbXSA9IFtdCisgICAgPj4+ICgpID0gKCkKKworVW5wYWNraW5nIG5vbi1pdGVyYWJsZXMgc2hvdWxkIHJhaXNlIFR5cGVFcnJvcgorCisgICAgPj4+ICgpID0gNDIKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6ICdpbnQnIG9iamVjdCBpcyBub3QgaXRlcmFibGUKKworVW5wYWNraW5nIHRvIGFuIGVtcHR5IGl0ZXJhYmxlIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yCisKKyAgICA+Pj4gKCkgPSBbNDJdCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogdG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgMCkKKwogIiIiCiAKIF9fdGVzdF9fID0geydkb2N0ZXN0cycgOiBkb2N0ZXN0c30KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5wYWNrX2V4LnB5IGIvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKaW5kZXggNzQzNDZiNC4uNmJlOGY1NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKQEAgLTM1Nyw3ICszNTcsNiBAQAogX190ZXN0X18gPSB7J2RvY3Rlc3RzJyA6IGRvY3Rlc3RzfQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9RmFsc2UpOgotICAgIGltcG9ydCBzeXMKICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdW5wYWNrX2V4CiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3VucGFja19leCwgdmVyYm9zZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKaW5kZXggYzI2YzUyYS4uMjQ3NTk4YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKQEAgLTEsNCArMSw0IEBACi0iIiJSZWdyZXNzc2lvbiB0ZXN0cyBmb3Igd2hhdCB3YXMgaW4gUHl0aG9uIDIncyAidXJsbGliIiBtb2R1bGUiIiIKKyIiIlJlZ3Jlc3Npb24gdGVzdHMgZm9yIHdoYXQgd2FzIGluIFB5dGhvbiAyJ3MgInVybGxpYiIgbW9kdWxlIiIiCiAKIGltcG9ydCB1cmxsaWIucGFyc2UKIGltcG9ydCB1cmxsaWIucmVxdWVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IGVkYTdjY2MuLjM0MzI5ZjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTcsNiArNyw4IEBACiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgYXJyYXkKIGltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKIAogaW1wb3J0IHVybGxpYi5yZXF1ZXN0CiAjIFRoZSBwcm94eSBieXBhc3MgbWV0aG9kIGltcG9ydGVkIGJlbG93IGhhcyBsb2dpYyBzcGVjaWZpYyB0byB0aGUgT1NYCkBAIC0zMzUsNyArMzM3LDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzLmNsZWFyKCkKIAotICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSk6CisgICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCAqLAorICAgICAgICAgICAgICAgIGVuY29kZV9jaHVua2VkPUZhbHNlKToKICAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKICAgICAgICAgc2VsZi5zZWxlY3RvciA9IHVybAogICAgICAgICBpZiBoZWFkZXJzIGlzIG5vdCBOb25lOgpAQCAtMzQzLDYgKzM0Niw3IEBACiAgICAgICAgIHNlbGYucmVxX2hlYWRlcnMuc29ydCgpCiAgICAgICAgIGlmIGJvZHk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBib2R5CisgICAgICAgIHNlbGYuZW5jb2RlX2NodW5rZWQgPSBlbmNvZGVfY2h1bmtlZAogICAgICAgICBpZiBzZWxmLnJhaXNlX29uX2VuZGhlYWRlcnM6CiAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKCkKIApAQCAtOTA4LDQxICs5MTIsMTEwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCAiYmF6IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJTcGFtIl0sICJmb28iKQogCi0gICAgICAgICMgQ2hlY2sgaXRlcmFibGUgYm9keSBzdXBwb3J0Ci0gICAgICAgIGRlZiBpdGVyYWJsZV9ib2R5KCk6Ci0gICAgICAgICAgICB5aWVsZCBiIm9uZSIKLSAgICAgICAgICAgIHlpZWxkIGIidHdvIgotICAgICAgICAgICAgeWllbGQgYiJ0aHJlZSIKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfZmlsZShzZWxmKToKKyAgICAgICAgIyBBIHJlZ3VsYXIgZmlsZSAtIGNodW5rZWQgZW5jb2RpbmcgaXMgdXNlZCB1bmxlc3MgQ29udGVudCBMZW5ndGggaXMKKyAgICAgICAgIyBhbHJlYWR5IHNldC4KIAotICAgICAgICBmb3IgaGVhZGVycyBpbiB7fSwgeyJDb250ZW50LUxlbmd0aCI6IDExfToKLSAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBpdGVyYWJsZV9ib2R5KCksIGhlYWRlcnMpCi0gICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKLSAgICAgICAgICAgICAgICAjIEhhdmluZyBhbiBpdGVyYWJsZSBib2R5IHdpdGhvdXQgYSBDb250ZW50LUxlbmd0aCBzaG91bGQKLSAgICAgICAgICAgICAgICAjIHJhaXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGguZG9fcmVxdWVzdF8sIHJlcSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgIGggPSB1cmxsaWIucmVxdWVzdC5BYnN0cmFjdEhUVFBIYW5kbGVyKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCiAKLSAgICAgICAgIyBBIGZpbGUgb2JqZWN0LgotICAgICAgICAjIFRlc3Qgb25seSBDb250ZW50LUxlbmd0aCBhdHRyaWJ1dGUgb2YgcmVxdWVzdC4KKyAgICAgICAgZmlsZV9vYmogPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndytiJywgZGVsZXRlPUZhbHNlKQorICAgICAgICBmaWxlX3BhdGggPSBmaWxlX29iai5uYW1lCisgICAgICAgIGZpbGVfb2JqLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnVubGluaywgZmlsZV9wYXRoKQogCisgICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICJyYiIpIGFzIGY6CisgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIiwgZiwge30pCisgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgICAgIHRlID0gbmV3cmVxLmdldF9oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGUsICJjaHVua2VkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3cmVxLmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBmLCB7IkNvbnRlbnQtTGVuZ3RoIjogMzB9KQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChuZXdyZXEuZ2V0X2hlYWRlcignQ29udGVudC1sZW5ndGgnKSksIDMwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdyZXEuaGFzX2hlYWRlcigiVHJhbnNmZXItZW5jb2RpbmciKSkKKworICAgIGRlZiB0ZXN0X2h0dHBfYm9keV9maWxlb2JqKHNlbGYpOgorICAgICAgICAjIEEgZmlsZSBvYmplY3QgLSBjaHVua2VkIGVuY29kaW5nIGlzIHVzZWQKKyAgICAgICAgIyB1bmxlc3MgQ29udGVudCBMZW5ndGggaXMgYWxyZWFkeSBzZXQuCisgICAgICAgICMgKE5vdGUgdGhhdCB0aGVyZSBhcmUgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXMgdG8gYSByZWd1bGFyCisgICAgICAgICMgZmlsZSwgdGhhdCBpcyB3aHkgd2UgYXJlIHRlc3RpbmcgYm90aCBjYXNlcy4pCisKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKICAgICAgICAgZmlsZV9vYmogPSBpby5CeXRlc0lPKCkKLSAgICAgICAgZmlsZV9vYmoud3JpdGUoYiJTb21ldGhpbmdcblNvbWV0aGluZ1xuU29tZXRoaW5nXG4iKQogCi0gICAgICAgIGZvciBoZWFkZXJzIGluIHt9LCB7IkNvbnRlbnQtTGVuZ3RoIjogMzB9OgotICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIGZpbGVfb2JqLCBoZWFkZXJzKQotICAgICAgICAgICAgaWYgbm90IGhlYWRlcnM6Ci0gICAgICAgICAgICAgICAgIyBIYXZpbmcgYW4gaXRlcmFibGUgYm9keSB3aXRob3V0IGEgQ29udGVudC1MZW5ndGggc2hvdWxkCi0gICAgICAgICAgICAgICAgIyByYWlzZSBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBoLmRvX3JlcXVlc3RfLCByZXEpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpKSwgMzApCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBmaWxlX29iaiwge30pCisgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaGVhZGVyKCdUcmFuc2Zlci1lbmNvZGluZycpLCAnY2h1bmtlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3cmVxLmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpCisKKyAgICAgICAgaGVhZGVycyA9IHsiQ29udGVudC1MZW5ndGgiOiAzMH0KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIGZpbGVfb2JqLCBoZWFkZXJzKQorICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobmV3cmVxLmdldF9oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpLCAzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdyZXEuaGFzX2hlYWRlcigiVHJhbnNmZXItZW5jb2RpbmciKSkKIAogICAgICAgICBmaWxlX29iai5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfcGlwZShzZWxmKToKKyAgICAgICAgIyBBIGZpbGUgcmVhZGluZyBmcm9tIGEgcGlwZS4KKyAgICAgICAgIyBBIHBpcGUgY2Fubm90IGJlIHNlZWsnZWQuICBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZQorICAgICAgICAjIGNvbnRlbnQgbGVuZ3RoIHVwIGZyb250LiAgVGh1cywgZG9fcmVxdWVzdF8oKSBzaG91bGQgZmFsbAorICAgICAgICAjIGJhY2sgdG8gVHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZC4KKworICAgICAgICBoID0gdXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgciJwYXNzIl0KKyAgICAgICAgZm9yIGhlYWRlcnMgaW4ge30sIHsiQ29udGVudC1MZW5ndGgiOiAzMH06CisgICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKSBhcyBwcm9jOgorICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBwcm9jLnN0ZG91dCwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hlYWRlcignQ29udGVudC1sZW5ndGgnKSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hlYWRlcignVHJhbnNmZXItZW5jb2RpbmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmtlZCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobmV3cmVxLmdldF9oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwKQorCisgICAgZGVmIHRlc3RfaHR0cF9ib2R5X2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICAjIEdlbmVyaWMgaXRlcmFibGUuICBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZW50CisgICAgICAgICMgbGVuZ3RoIHVwIGZyb250LiAgRmFsbCBiYWNrIHRvIFRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQuCisKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICBkZWYgaXRlcmFibGVfYm9keSgpOgorICAgICAgICAgICAgeWllbGQgYiJvbmUiCisKKyAgICAgICAgZm9yIGhlYWRlcnMgaW4ge30sIHsiQ29udGVudC1MZW5ndGgiOiAxMX06CisgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIiwgaXRlcmFibGVfYm9keSgpLCBoZWFkZXJzKQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgICAgICBpZiBub3QgaGVhZGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3cmVxLmdldF9oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmtlZCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG5ld3JlcS5nZXRfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpKSwgMTEpCisKKyAgICBkZWYgdGVzdF9odHRwX2JvZHlfZW1wdHlfc2VxKHNlbGYpOgorICAgICAgICAjIFplcm8tbGVuZ3RoIGl0ZXJhYmxlIGJvZHkgc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgaXRlcmFibGUKKyAgICAgICAgaCA9IHVybGxpYi5yZXF1ZXN0LkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorICAgICAgICByZXEgPSBoLmRvX3JlcXVlc3RfKFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIlRyYW5zZmVyLWVuY29kaW5nIiksICJjaHVua2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXEuaGFzX2hlYWRlcigiQ29udGVudC1sZW5ndGgiKSkKKworICAgIGRlZiB0ZXN0X2h0dHBfYm9keV9hcnJheShzZWxmKToKICAgICAgICAgIyBhcnJheS5hcnJheSBJdGVyYWJsZSAtIENvbnRlbnQgTGVuZ3RoIGlzIGNhbGN1bGF0ZWQKIAorICAgICAgICBoID0gdXJsbGliLnJlcXVlc3QuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCiAgICAgICAgIGl0ZXJhYmxlX2FycmF5ID0gYXJyYXkuYXJyYXkoIkkiLFsxLDIsMyw0XSkKIAogICAgICAgICBmb3IgaGVhZGVycyBpbiB7fSwgeyJDb250ZW50LUxlbmd0aCI6IDE2fToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQppbmRleCBjOGIzN2VlLi5lOTU2NGZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CkBAIC0yODksMTIgKzI4OSwxMiBAQAogICAgICAgICBkZWYgaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJldHVybiBCYXNpY0F1dGhIYW5kbGVyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBMb29wYmFja0h0dHBTZXJ2ZXJUaHJlYWQoaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnNlcnZlci5zdG9wKQogICAgICAgICBzZWxmLnNlcnZlcl91cmwgPSAnaHR0cDovLzEyNy4wLjAuMTolcycgJSBzZWxmLnNlcnZlci5wb3J0CiAgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQogICAgICAgICBzdXBlcihCYXNpY0F1dGhUZXN0cywgc2VsZikudGVhckRvd24oKQogCiAgICAgZGVmIHRlc3RfYmFzaWNfYXV0aF9zdWNjZXNzKHNlbGYpOgpAQCAtNDM4LDE3ICs0MzgsMTMgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwZXIoVGVzdFVybG9wZW4sIHNlbGYpLnNldFVwKCkKLSAgICAgICAgIyBJZ25vcmUgcHJveGllcyBmb3IgbG9jYWxob3N0IHRlc3RzLgotICAgICAgICBzZWxmLm9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwotICAgICAgICBzZWxmLnNlcnZlciA9IE5vbmUKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi5zZXJ2ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKLSAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCi0gICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNlbGYub2xkX2Vudmlyb24pCi0gICAgICAgIHN1cGVyKFRlc3RVcmxvcGVuLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgICMgSWdub3JlIHByb3hpZXMgZm9yIGxvY2FsaG9zdCB0ZXN0cy4KKyAgICAgICAgZGVmIHJlc3RvcmVfZW52aXJvbihvbGRfZW52aXJvbik6CisgICAgICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgICAgIG9zLmVudmlyb24udXBkYXRlKG9sZF9lbnZpcm9uKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9lbnZpcm9uLCBvcy5lbnZpcm9uLmNvcHkoKSkKKyAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwogCiAgICAgZGVmIHVybG9wZW4oc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgbCA9IFtdCkBAIC00NjksNiArNDY1LDcgQEAKICAgICAgICAgaGFuZGxlciA9IEdldFJlcXVlc3RIYW5kbGVyKHJlc3BvbnNlcykKIAogICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChoYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5zZXJ2ZXIuc3RvcCkKICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQogICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS53YWl0KCkKICAgICAgICAgcG9ydCA9IHNlbGYuc2VydmVyLnBvcnQKQEAgLTU5Miw3ICs1ODksOCBAQAogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQogICAgICAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KCJodHRwOi8vbG9jYWxob3N0OiVzLyIgJSBoYW5kbGVyLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IlJhbmdlIjogImJ5dGVzPTIwLTM5In0pCi0gICAgICAgIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKQorICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKToKKyAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWRbIlJhbmdlIl0sICJieXRlcz0yMC0zOSIpCiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTYwOCwyMiArNjA2LDIxIEBACiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCisgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgIHdpdGggb3Blbl91cmw6CiAgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugb2YgZW1haWwubWVzc2FnZS5NZXNzYWdlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAicGxhaW4iKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbmZvX29iaiwgZW1haWwubWVzc2FnZS5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldF9jb250ZW50X3N1YnR5cGUoKSwgInBsYWluIikKIAogICAgIGRlZiB0ZXN0X2dldHVybChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgc2FtZSBVUkwgYXMgb3BlbmVkIGlzIHJldHVybmVkIGJ5IGdldHVybC4KICAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKCkKICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKLSAgICAgICAgdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKKyAgICAgICAgd2l0aCBvcGVuX3VybDoKKyAgICAgICAgICAgIHVybCA9IG9wZW5fdXJsLmdldHVybCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsLCAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCiAKICAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IGI4MTE5MzAuLjk0OTcxNmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC00LDcgKzQsNiBAQAogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBzb2NrZXQKIGltcG9ydCB1cmxsaWIucmVxdWVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgZW1haWwubWVzc2FnZQogaW1wb3J0IHRpbWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CmluZGV4IDgyOTk5N2YuLjkxNjVkNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtNjA1LDI5ICs2MDUsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKIAotICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgaXMgcmV0dXJuZWQgYXMgTm9uZQorICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgcmFpc2VzIFZhbHVlRXJyb3IKICAgICAgICAgdXJsID0gYiJIVFRQOi8vV1dXLlBZVEhPTi5PUkc6NjU1MzYvZG9jLyNmcmFnIgogICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAib3V0IG9mIHJhbmdlIik6CisgICAgICAgICAgICBwLnBvcnQKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6Ci0gICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgICMgT25jZSBhZ2FpbiwgcmVwZWF0IG91cnNlbHZlcyB0byB0ZXN0IGJ5dGVzCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBpbnZhbGlkIHBvcnRzLiIiIgorICAgICAgICBmb3IgYnl0ZXMgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZvciBwYXJzZSBpbiAodXJsbGliLnBhcnNlLnVybHNwbGl0LCB1cmxsaWIucGFyc2UudXJscGFyc2UpOgorICAgICAgICAgICAgICAgIGZvciBwb3J0IGluICgiZm9vIiwgIjEuNSIsICItMSIsICIweDEwIik6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGJ5dGVzPWJ5dGVzLCBwYXJzZT1wYXJzZSwgcG9ydD1wb3J0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9ICJ3d3cuZXhhbXBsZS5uZXQ6IiArIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICJodHRwOi8vIiArIG5ldGxvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwYXJzZSh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCBuZXRsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc193aXRob3V0X25ldGxvYyhzZWxmKToKICAgICAgICAgIyBUaGlzIGV4YW1wbGUgaXMgc3RyYWlnaHQgZnJvbSBSRkMgMzI2MS4gIEl0IGxvb2tzIGxpa2UgaXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CmluZGV4IDgzNTdmOGIuLjY2MmM3ZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMSw2ICsxLDYgQEAKICMgQ2hlY2sgZXZlcnkgcGF0aCB0aHJvdWdoIGV2ZXJ5IG1ldGhvZCBvZiBVc2VyRGljdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIG1hcHBpbmdfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY29sbGVjdGlvbnMKIApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KG9uZT0xLCB0d289MiksIGQyKQogICAgICAgICAjIGl0ZW0gc2VxdWVuY2UgY29uc3RydWN0b3IKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9Wygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQogICAgICAgICAjIGJvdGggdG9nZXRoZXIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildLCB0d289MywgdGhyZWU9NSksIGQzKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWygnZGljdCcsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb2xsZWN0aW9ucy5Vc2VyRGljdCh7fSwgZGljdD1Ob25lKS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgTm9uZSldKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9eydhJzogNDJ9KS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29sbGVjdGlvbnMuVXNlckRpY3QsIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKaW5kZXggZjkyZTRkMy4uOGRlNmMxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CkBAIC0xLDcgKzEsNyBAQAogIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJMaXN0CiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJMaXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIGxpc3RfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbGlzdF90ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIFVzZXJMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CmluZGV4IDliYzhlZGQuLjcxNTI4MjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKQEAgLTEsOSArMSw4IEBACiAjIFVzZXJTdHJpbmcgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGJ1aWx0aW4gc3RyaW5nIHR5cGUuCiAjIFVzZXJTdHJpbmcgaW5zdGFuY2VzIHNob3VsZCBiZWhhdmUgc2ltaWxhciB0byBidWlsdGluIHN0cmluZyBvYmplY3RzLgogCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN0cmluZ190ZXN0cwogCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyU3RyaW5nCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXUucHkgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CmluZGV4IDI1ZmZmYmYuLmFkMmYyYzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91dS5weQpAQCAtOCw3ICs4LDYgQEAKIAogaW1wb3J0IHN5cywgb3MKIGltcG9ydCB1dQotZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IGlvCiAKIHBsYWludGV4dCA9IGIiVGhlIHNtb290aC1zY2FsZWQgcHl0aG9uIGNyZXB0IG92ZXIgdGhlIHNsZWVwaW5nIGRvZ1xuIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF92ZW52LnB5IGIvTGliL3Rlc3QvdGVzdF92ZW52LnB5CmluZGV4IGQyYzk4NmUuLmY0YWQ3YzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdmVudi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ZlbnYucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IChjYXB0dXJlZF9zdGRvdXQsIGNhcHR1cmVkX3N0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuX3N5bWxpbmssIEVudmlyb25tZW50VmFyR3VhcmQsIHJtdHJlZSkKLWltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdmVudgogCkBAIC0zMSwxOCArMzAsMTcgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKK3RyeToKKyAgICBpbXBvcnQgY3R5cGVzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY3R5cGVzID0gTm9uZQorCiBza2lwSW5WZW52ID0gdW5pdHRlc3Quc2tpcElmKHN5cy5wcmVmaXggIT0gc3lzLmJhc2VfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBub3QgYXBwcm9wcmlhdGUgaW4gYSB2ZW52JykKIAotIyBvcy5wYXRoLmV4aXN0cygnbnVsJykgaXMgRmFsc2U6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDU0MQotaWYgb3MuZGV2bnVsbC5sb3dlcigpID09ICdudWwnOgotICAgIGZhaWxzT25XaW5kb3dzID0gdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCi1lbHNlOgotICAgIGRlZiBmYWlsc09uV2luZG93cyhmKToKLSAgICAgICAgcmV0dXJuIGYKLQogY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIHZlbnYgdGVzdHMuIiIiCisgICAgbWF4RGlmZiA9IDgwICogNTAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5lbnZfZGlyID0gb3MucGF0aC5yZWFscGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKCkpCkBAIC01Miw3ICs1MCw3IEBACiAgICAgICAgICAgICBzZWxmLmluY2x1ZGUgPSAnSW5jbHVkZScKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYmluZGlyID0gJ2JpbicKLSAgICAgICAgICAgIHNlbGYubGliID0gKCdsaWInLCAncHl0aG9uJXMnICUgc3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgc2VsZi5saWIgPSAoJ2xpYicsICdweXRob24lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZSA9ICdpbmNsdWRlJwogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICdfX1BZVkVOVl9MQVVOQ0hFUl9fJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLmVudmlyb25bJ19fUFlWRU5WX0xBVU5DSEVSX18nXQpAQCAtMTE2LDYgKzExNCwxNyBAQAogICAgICAgICAgICAgcHJpbnQoJyAgICAlcicgJSBvcy5saXN0ZGlyKGJkKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZuKSwgJ0ZpbGUgJXIgc2hvdWxkIGV4aXN0LicgJSBmbikKIAorICAgIGRlZiB0ZXN0X3Byb21wdChzZWxmKToKKyAgICAgICAgZW52X25hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuZW52X2RpcilbMV0KKworICAgICAgICBidWlsZGVyID0gdmVudi5FbnZCdWlsZGVyKCkKKyAgICAgICAgY29udGV4dCA9IGJ1aWxkZXIuZW5zdXJlX2RpcmVjdG9yaWVzKHNlbGYuZW52X2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZXh0LnByb21wdCwgJyglcykgJyAlIGVudl9uYW1lKQorCisgICAgICAgIGJ1aWxkZXIgPSB2ZW52LkVudkJ1aWxkZXIocHJvbXB0PSdNeSBwcm9tcHQnKQorICAgICAgICBjb250ZXh0ID0gYnVpbGRlci5lbnN1cmVfZGlyZWN0b3JpZXMoc2VsZi5lbnZfZGlyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRleHQucHJvbXB0LCAnKE15IHByb21wdCkgJykKKwogICAgIEBza2lwSW5WZW52CiAgICAgZGVmIHRlc3RfcHJlZml4ZXMoc2VsZik6CiAgICAgICAgICIiIgpAQCAtMzEzLDIwICszMjIsMjcgQEAKICAgICAgICAgc2VsZi5ydW5fd2l0aF9jYXB0dXJlKHZlbnYuY3JlYXRlLCBzZWxmLmVudl9kaXIsIHdpdGhfcGlwPUZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydF9waXBfbm90X2luc3RhbGxlZCgpCiAKLSAgICBAZmFpbHNPbldpbmRvd3MKLSAgICBkZWYgdGVzdF9kZXZudWxsX2V4aXN0c19hbmRfaXNfZW1wdHkoc2VsZik6CisgICAgZGVmIHRlc3RfZGV2bnVsbChzZWxmKToKICAgICAgICAgIyBGaXggZm9yIGlzc3VlICMyMDA1MyB1c2VzIG9zLmRldm51bGwgdG8gZm9yY2UgYSBjb25maWcgZmlsZSB0bwogICAgICAgICAjIGFwcGVhciBlbXB0eS4gSG93ZXZlciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1NDEgbWVhbnMKICAgICAgICAgIyB0aGF0IGRvZXNuJ3QgY3VycmVudGx5IHdvcmsgcHJvcGVybHkgb24gV2luZG93cy4gT25jZSB0aGF0IGlzCiAgICAgICAgICMgZml4ZWQsIHRoZSAid2luX2xvY2F0aW9uIiBwYXJ0IG9mIHRlc3Rfd2l0aF9waXAgc2hvdWxkIGJlIHJlc3RvcmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5kZXZudWxsKSkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICJyYiIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIiIpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjA1NDE6IG9zLnBhdGguZXhpc3RzKCdudWwnKSBpcyBGYWxzZSBvbiBXaW5kb3dzCisgICAgICAgIGlmIG9zLmRldm51bGwubG93ZXIoKSA9PSAnbnVsJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisKKwogICAgICMgUmVxdWVzdGluZyBwaXAgZmFpbHMgd2l0aG91dCBTU0wgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxOTc0NCkKICAgICBAdW5pdHRlc3Quc2tpcElmKHNzbCBpcyBOb25lLCBlbnN1cmVwaXAuX01JU1NJTkdfU1NMX01FU1NBR0UpCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnc29tZSBkZXBlbmRlbmNpZXMgb2YgcGlwIGltcG9ydCB0aHJlYWRpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIG1vZHVsZSB1bmNvbmRpdGlvbmFsbHknKQorICAgICMgSXNzdWUgIzI2NjEwOiBwaXAvcGVwNDI1dGFncy5weSByZXF1aXJlcyBjdHlwZXMKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhjdHlwZXMsICdwaXAgcmVxdWlyZXMgY3R5cGVzJykKICAgICBkZWYgdGVzdF93aXRoX3BpcChzZWxmKToKICAgICAgICAgcm10cmVlKHNlbGYuZW52X2RpcikKICAgICAgICAgd2l0aCBFbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52dmFyczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5CmluZGV4IDg0YTZmYjUuLmMxMWVlNDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weQpAQCAtMiw3ICsyLDkgQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBvcwogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCkBAIC03MjAsNiArNzIyLDE3IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLmdldHZhbHVlKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbih0ZXh0LCByZXN1bHQpCiAKKyAgICBkZWYgdGVzdF9zaG93d2Fybm1zZ19taXNzaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBfc2hvd3dhcm5tc2coKSBtaXNzaW5nIGlzIG9rYXkuCisgICAgICAgIHRleHQgPSAnZGVsIF9zaG93d2Fybm1zZyB0ZXN0JworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuX3Nob3d3YXJubXNnCisgICAgICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGV4dCwgcmVzdWx0KQorCiAgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbm90X2NhbGxhYmxlKHNlbGYpOgogICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CiAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCkBAIC04MjEsMTIgKzgzNCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX29iamVjdCwgZXhwZWN0ZWRfZmlsZV9saW5lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSkKIAorCiBjbGFzcyBDV2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCiAKIGNsYXNzIFB5V2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBweV93YXJuaW5ncwogCisgICAgZGVmIHRlc3RfdHJhY2VtYWxsb2Moc2VsZik6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUodGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgICAgIGRlZiBmdW5jKCk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKF9fZmlsZV9fKQorICAgICAgICAgICAgICAgICAgICAjIEVtaXQgUmVzb3VyY2VXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIGYgPSBOb25lCisKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICIiIikpCisKKyAgICAgICAgcmVzID0gYXNzZXJ0X3B5dGhvbl9vaygnLVdkJywgJy1YJywgJ3RyYWNlbWFsbG9jPTInLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzdGRlcnIgPSByZXMuZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisgICAgICAgICMgbm9ybWFsaXplIG5ld2xpbmVzCisgICAgICAgIHN0ZGVyciA9ICdcbicuam9pbihzdGRlcnIuc3BsaXRsaW5lcygpKQorICAgICAgICBzdGRlcnIgPSByZS5zdWIoJzwuKj4nLCAnPC4uLj4nLCBzdGRlcnIpCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KCcnJworICAgICAgICAgICAge2ZuYW1lfTo1OiBSZXNvdXJjZVdhcm5pbmc6IHVuY2xvc2VkIGZpbGUgPC4uLj4KKyAgICAgICAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgICAgIE9iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgICAgICAgICBGaWxlICJ7Zm5hbWV9IiwgbGluZW5vIDMKKyAgICAgICAgICAgICAgICBmID0gb3BlbihfX2ZpbGVfXykKKyAgICAgICAgICAgICAgRmlsZSAie2ZuYW1lfSIsIGxpbmVubyA3CisgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICcnJykKKyAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5mb3JtYXQoZm5hbWU9c3VwcG9ydC5URVNURk4pLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsIGV4cGVjdGVkKQorCiAKIGNsYXNzIENhdGNoV2FybmluZ1Rlc3RzKEJhc2VUZXN0KToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5IGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CmluZGV4IDNlZmY3NzMuLjg2NjZmNzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTEsNiArMSw2IEBACi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCiBpbXBvcnQgc3lzCiBpbXBvcnQgd2F2ZQpAQCAtMTAzLDUgKzEwMywxMSBAQAogICAgICAgICBmcmFtZXMgPSBieXRlc3dhcChmcmFtZXMsIDQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnV0FWRV9GT1JNQVRfUENNJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgd2F2ZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5CmluZGV4IDljZTY3MmIuLjY5MWI5NWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkKQEAgLTEsMTMgKzEsNiBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5LCByZWYsIFdlYWtTZXQKLWltcG9ydCBvcGVyYXRvcgotaW1wb3J0IGNvcHkKK2Zyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAogaW1wb3J0IHN0cmluZwotaW1wb3J0IG9zCi1mcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCi1pbXBvcnQgc3lzCi1pbXBvcnQgd2FybmluZ3MKLWltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgVXNlclN0cmluZyBhcyB1c3RyCiBpbXBvcnQgZ2MKIGltcG9ydCBjb250ZXh0bGliCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnJlZy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CmluZGV4IDJjNGFjMDguLmQ2NDJiMTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CkBAIC0zNyw2ICszNyw3IEBACiAKIHRlc3RfZGF0YSA9IFsKICAgICAoIkludCBWYWx1ZSIsICAgICA0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19EV09SRCksCisgICAgKCJRd29yZCBWYWx1ZSIsICAgMHgxMTIyMzM0NDU1NjY3Nzg4LCAgICAgICAgICAgICAgICAgICAgICBSRUdfUVdPUkQpLAogICAgICgiU3RyaW5nIFZhbCIsICAgICJBIHN0cmluZyB2YWx1ZSIsICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1NaKSwKICAgICAoIlN0cmluZ0V4cGFuZCIsICAiVGhlIHBhdGggaXMgJXBhdGglIiwgICAgICAgICAgICAgICAgICAgIFJFR19FWFBBTkRfU1opLAogICAgICgiTXVsdGktc3RyaW5nIiwgIFsiTG90cyIsICJvZiIsICJzdHJpbmciLCAidmFsdWVzIl0sICAgICAgUkVHX01VTFRJX1NaKSwKQEAgLTE2OCw3ICsxNjksNyBAQAogICAgICAgICBEZWxldGVLZXkoa2V5LCBzdWJrZXlzdHIpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBTaG91bGRudCBiZSBhYmxlIHRvIGRlbGV0ZSBpdCB0d2ljZSEKKyAgICAgICAgICAgICMgU2hvdWxkbid0IGJlIGFibGUgdG8gZGVsZXRlIGl0IHR3aWNlIQogICAgICAgICAgICAgRGVsZXRlS2V5KGtleSwgc3Via2V5c3RyKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJEZWxldGluZyB0aGUga2V5IHR3aWNlIHN1Y2NlZWRlZCIpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKaW5kZXggNGE4YWI3ZC4uMTc5ZTA2OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CkBAIC01MSw2ICs1MSwxMCBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAsIDIwMDAsIDEwMCk6CiAgICAgICAgICAgICBzYWZlX0JlZXAoaSwgNzUpCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfQmVlcChkdXJhdGlvbj03NSwgZnJlcXVlbmN5PTIwMDApCisKKwogY2xhc3MgTWVzc2FnZUJlZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKQEAgLTc2LDYgKzgwLDkgQEAKICAgICBkZWYgdGVzdF9xdWVzdGlvbihzZWxmKToKICAgICAgICAgc2FmZV9NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09OUVVFU1RJT04pCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfTWVzc2FnZUJlZXAodHlwZT13aW5zb3VuZC5NQl9PSykKKwogCiBjbGFzcyBQbGF5U291bmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtODcsNiArOTQsMjUgQEAKICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKICAgICAgICAgICAgICJub25lIiwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX01FTU9SWQogICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kLCBiImJhZCIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kLCAiYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX01FTU9SWSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5QbGF5U291bmQsIDEsIDApCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIHNhZmVfUGxheVNvdW5kKGZsYWdzPXdpbnNvdW5kLlNORF9BTElBUywgc291bmQ9IlN5c3RlbUV4aXQiKQorCisgICAgZGVmIHRlc3Rfc25kX21lbW9yeShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuZmluZGZpbGUoJ3BsdWNrLXBjbTgud2F2JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyPSdhdWRpb2RhdGEnKSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIGF1ZGlvX2RhdGEgPSBmLnJlYWQoKQorICAgICAgICBzYWZlX1BsYXlTb3VuZChhdWRpb19kYXRhLCB3aW5zb3VuZC5TTkRfTUVNT1JZKQorICAgICAgICBhdWRpb19kYXRhID0gYnl0ZWFycmF5KGF1ZGlvX2RhdGEpCisgICAgICAgIHNhZmVfUGxheVNvdW5kKGF1ZGlvX2RhdGEsIHdpbnNvdW5kLlNORF9NRU1PUlkpCisKKyAgICBkZWYgdGVzdF9zbmRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZuID0gc3VwcG9ydC5maW5kZmlsZSgncGx1Y2stcGNtOC53YXYnLCBzdWJkaXI9J2F1ZGlvZGF0YScpCisgICAgICAgIHNhZmVfUGxheVNvdW5kKGZuLCB3aW5zb3VuZC5TTkRfRklMRU5BTUUgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUKQogCiAgICAgZGVmIHRlc3RfYWxpYXNlcyhzZWxmKToKICAgICAgICAgYWxpYXNlcyA9IFsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQppbmRleCBlOGQ3ODliLi5lMjQ3ZmY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CkBAIC0xNDAsMTEgKzE0MCw2IEBACiAgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChOb25lKTpcbicKICAgICAgICAgICAgICcgIHBhc3MnKQogCi0gICAgZGVmIHRlc3RBc3NpZ25tZW50VG9FbXB0eVR1cGxlRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCi0gICAgICAgICAgICAnd2l0aCBtb2NrIGFzICgpOlxuJwotICAgICAgICAgICAgJyAgcGFzcycpCi0KICAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb1R1cGxlT25seUNvbnRhaW5pbmdOb25lRXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoJ3dpdGggbW9jayBhcyBOb25lLDpcbiAgcGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCkBAIC00NTQsNyArNDQ5LDcgQEAKICAgICAgICAgICAgIHdpdGggY20oKToKICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQogCiAgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKQEAgLTQ4Miw3ICs0NzcsNyBAQAogICAgICAgICAgICAgd2l0aCBjbSgpOgogICAgICAgICAgICAgICAgIHJhaXNlIG5leHQoaXRlcihbXSkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCiAKICAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCBiYzFkZDE0Li42ZTU0NjI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtOTEsOCArOTEsNiBAQAogCiAKIGNsYXNzIE1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVE9ETzogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCByaWQgb2YgdGhlIGdsb2JhbCBtb2R1bGUgdmFycwotCiAgICAgZGVmIHRlc3Rfc2FuaXR5KHNlbGYpOgogICAgICAgICAjIEltcG9ydCBzYW5pdHkuCiAKQEAgLTEwMCw2ICs5OCwxMCBAQAogICAgICAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKICAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIG5hbWVzID0gKCJ4bWwuZXRyZWUuRWxlbWVudFRyZWUiLCAiX2VsZW1lbnR0cmVlIikKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgRVQsIG5hbWVzLCBibGFja2xpc3Q9KCJIVE1MX0VNUFRZIiwpKQorCiAKIGRlZiBzZXJpYWxpemUoZWxlbSwgdG9fc3RyaW5nPVRydWUsIGVuY29kaW5nPSd1bmljb2RlJywgKipvcHRpb25zKToKICAgICBpZiBlbmNvZGluZyAhPSAndW5pY29kZSc6CkBAIC0xODIsMTAgKzE4NCwxMiBAQAogCiAgICAgICAgIGRlZiBjaGVja19lbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEVULmlzZWxlbWVudChlbGVtZW50KSwgbXNnPSJub3QgYW4gZWxlbWVudCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGFnIiksIG1zZz0ibm8gdGFnIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIiksIG1zZz0ibm8gYXR0cmliIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGV4dCIpLCBtc2c9Im5vIHRleHQgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIiksIG1zZz0ibm8gdGFpbCBtZW1iZXIiKQorICAgICAgICAgICAgZGlyZWxlbSA9IGRpcihlbGVtZW50KQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gJ3RhZycsICdhdHRyaWInLCAndGV4dCcsICd0YWlsJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nbm8gJXMgbWVtYmVyJyAlIGF0dHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdHRyLCBkaXJlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdubyAlcyB2aXNpYmxlIGJ5IGRpcicgJSBhdHRyKQogCiAgICAgICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWcpCiAgICAgICAgICAgICBjaGVja19tYXBwaW5nKGVsZW1lbnQuYXR0cmliKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKaW5kZXggOTZiNDQ2ZS4uODdmM2YyNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CkBAIC0xLDUgKzEsNSBAQAogIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCi1pbXBvcnQgc3lzLCBzdHJ1Y3QKK2ltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9mcmVzaF9tb2R1bGUKIGltcG9ydCB0eXBlcwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5jYWxjc2l6ZSgnOFAnKSkKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUsIHRlc3RfeG1sX2V0cmVlX2MKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfeG1sX2V0cmVlCiAKICAgICAjIFJ1biB0aGUgdGVzdHMgc3BlY2lmaWMgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24KICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggMDJkOWY1Yy4uMDc3M2E4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTksNyArOSw2IEBACiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCBodHRwLCBodHRwLnNlcnZlcgogaW1wb3J0IHNvY2tldAotaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbwogaW1wb3J0IGNvbnRleHRsaWIKQEAgLTExNDcsNyArMTE0Niw2IEBACiAgICAgIiIiQSB2YXJpYXRpb24gb24gc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSB3aGljaCBnaXZlcyBhIHRleHQgc3RyZWFtCiAgICAgaGF2aW5nIGEgYGJ1ZmZlcmAgYXR0cmlidXRlLgogICAgICIiIgotICAgIGltcG9ydCBpbwogICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKGlvLkJ5dGVzSU8oKSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5CmluZGV4IGI2MGI4MmYuLmFlMGEyOGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjX25ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbHJwY19uZXQucHkKQEAgLTEsNyArMSw0IEBACiBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi1pbXBvcnQgZXJybm8KLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQppbmRleCBkMjc4ZTA2Li5lZjNjM2Q4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CkBAIC0xLDggKzEsOCBAQAogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBpbwogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKK2ltcG9ydCBwb3NpeHBhdGgKIGltcG9ydCB0aW1lCiBpbXBvcnQgc3RydWN0CiBpbXBvcnQgemlwZmlsZQpAQCAtMzgsMTAgKzM4LDYgQEAKICAgICAgICAgeWllbGQgZgogICAgICAgICB0ZXN0LmFzc2VydEZhbHNlKGYuY2xvc2VkKQogCi1kZWYgb3BlblUoemlwZnAsIGZuKToKLSAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnJywgRGVwcmVjYXRpb25XYXJuaW5nKSk6Ci0gICAgICAgIHJldHVybiB6aXBmcC5vcGVuKGZuLCAnclUnKQotCiBjbGFzcyBBYnN0cmFjdFRlc3RzV2l0aFNvdXJjZUZpbGU6CiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKQEAgLTYxLDYgKzU3LDkgQEAKICAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIubmFtZSIpCiAgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKCd3cml0dGVuLW9wZW4tdycsIG1vZGU9J3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUobGluZSkKIAogICAgIGRlZiB6aXBfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CiAgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCkBAIC03Niw3ICs3NSw3IEBACiAgICAgICAgICAgICB6aXBmcC5wcmludGRpcihmaWxlPWZwKQogICAgICAgICAgICAgZGlyZWN0b3J5ID0gZnAuZ2V0dmFsdWUoKQogICAgICAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDUpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0ZpbGUgTmFtZScsIGxpbmVzWzBdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignTW9kaWZpZWQnLCBsaW5lc1swXSkKQEAgLTkwLDIzICs4OSwyNSBAQAogCiAgICAgICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAogICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIndyaXR0ZW4tb3Blbi13IiwgbmFtZXMpCiAKICAgICAgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKICAgICAgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQogICAgICAgICAgICAgbmFtZXMgPSBbaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvc10KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgNCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigid3JpdHRlbi1vcGVuLXciLCBuYW1lcykKICAgICAgICAgICAgIGZvciBpIGluIGluZm9zOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQogCiAgICAgICAgICAgICAjIGNoZWNrIGdldGluZm8KLSAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiLCAid3JpdHRlbi1vcGVuLXciKToKICAgICAgICAgICAgICAgICBpbmZvID0gemlwZnAuZ2V0aW5mbyhubSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZW5hbWUsIG5tKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQpAQCAtMzcyLDE0ICszNzMsMTggQEAKICAgICB0ZXN0X2xvd19jb21wcmVzc2lvbiA9IE5vbmUKIAogICAgIGRlZiB6aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd3JpdGVzdHIgY3JlYXRlcyBmaWxlcyB3aXRoIG1vZGUgMDYwMCwKLSAgICAgICAgIyB3aGVuIGl0IGlzIHBhc3NlZCBhIG5hbWUgcmF0aGVyIHRoYW4gYSBaaXBJbmZvIGluc3RhbmNlLgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdyaXRlc3RyIGFuZCBvcGVuKC4uLiBtb2RlPSd3JykgY3JlYXRlIGZpbGVzIHdpdGgKKyAgICAgICAgIyBtb2RlIDA2MDAsIHdoZW4gdGhleSBhcmUgcGFzc2VkIGEgbmFtZSByYXRoZXIgdGhhbiBhIFppcEluZm8KKyAgICAgICAgIyBpbnN0YW5jZS4KIAogICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgogICAgICAgICAgICAgemluZm8gPSB6aXBmcC5nZXRpbmZvKCdzdHJmaWxlJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemluZm8uZXh0ZXJuYWxfYXR0ciwgMG82MDAgPDwgMTYpCiAKKyAgICAgICAgICAgIHppbmZvMiA9IHppcGZwLmdldGluZm8oJ3dyaXR0ZW4tb3Blbi13JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemluZm8yLmV4dGVybmFsX2F0dHIsIDBvNjAwIDw8IDE2KQorCiAgICAgZGVmIHRlc3Rfd3JpdGVzdHJfcGVybWlzc2lvbnMoc2VsZik6CiAgICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKICAgICAgICAgICAgIHNlbGYuemlwX3Rlc3Rfd3JpdGVzdHJfcGVybWlzc2lvbnMoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQpAQCAtNDUxLDYgKzQ1NiwxMCBAQAogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZnA6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGZwLndyaXRlLCBURVNURk4pCiAKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgbW9kZT0iciIpIGFzIHppcGZwOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgIHppcGZwLm9wZW4oVEVTVEZOLCBtb2RlPSd3JykKKwogICAgIGRlZiB0ZXN0X2FkZF9maWxlX2JlZm9yZV8xOTgwKHNlbGYpOgogICAgICAgICAjIFNldCBhdGltZSBhbmQgbXRpbWUgdG8gMTk3MC0wMS0wMQogICAgICAgICBvcy51dGltZShURVNURk4sICgwLCAwKSkKQEAgLTEwMjIsMzIgKzEwMzEsNiBAQAogICAgICAgICAgICAgICAgIGRhdGEgKz0gemlwZnAucmVhZChpbmZvKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihkYXRhLCB7YiJmb29iYXIiLCBiImJhcmZvbyJ9KQogCi0gICAgZGVmIHRlc3RfdW5pdmVyc2FsX2RlcHJlY2F0aW9uKHNlbGYpOgotICAgICAgICBmID0gaW8uQnl0ZXNJTygpCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IikgYXMgemlwZnA6Ci0gICAgICAgICAgICB6aXBmcC53cml0ZXN0cignc3BhbS50eHQnLCBiJ2FiYWJhZ2FsYW1hZ2EnKQotCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3IgbW9kZSBpbiAnVScsICdyVSc6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICAgICAgICAgIHppcG9wZW4gPSB6aXBmcC5vcGVuKCdzcGFtLnR4dCcsIG1vZGUpCi0gICAgICAgICAgICAgICAgemlwb3Blbi5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF91bml2ZXJzYWxfcmVhZGFoZWFkcyhzZWxmKToKLSAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQotCi0gICAgICAgIGRhdGEgPSBiJ2FcclxuJyAqIDE2ICogMTAyNAotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6Ci0gICAgICAgICAgICB6aXBmcC53cml0ZXN0cihURVNURk4sIGRhdGEpCi0KLSAgICAgICAgZGF0YTIgPSBiJycKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgJ3InKSBhcyB6aXBmcCwgXAotICAgICAgICAgICAgIG9wZW5VKHppcGZwLCBURVNURk4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiB6aXBvcGVuOgotICAgICAgICAgICAgICAgIGRhdGEyICs9IGxpbmUKLQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGRhdGEyLnJlcGxhY2UoYidcbicsIGInXHJcbicpKQotCiAgICAgZGVmIHRlc3Rfd3JpdGVzdHJfZXh0ZW5kZWRfbG9jYWxfaGVhZGVyX2lzc3VlMTIwMihzZWxmKToKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnKSBhcyBvcmlnX3ppcDoKICAgICAgICAgICAgIGZvciBkYXRhIGluICdhYmNkZWZnaGlqa2xtbm9wJzoKQEAgLTEyNTUsOSArMTIzOCwxMiBAQAogICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKIAogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgotICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCisgICAgICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCiAgICAgICAgICAgICB6aXBmLnJlYWQoImZvby50eHQiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLm9wZW4sICJmb28udHh0IiwgInEiKQorICAgICAgICAgICAgIyB1bml2ZXJzYWwgbmV3bGluZXMgc3VwcG9ydCBpcyByZW1vdmVkCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAiVSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAiclUiKQogCiAgICAgZGVmIHRlc3RfcmVhZDAoc2VsZik6CiAgICAgICAgICIiIkNoZWNrIHRoYXQgY2FsbGluZyByZWFkKDApIG9uIGEgWmlwRXh0RmlsZSBvYmplY3QgcmV0dXJucyBhbiBlbXB0eQpAQCAtMTQyOCw2ICsxNDE0LDM1IEBACiAgICAgICAgICAgICAjIHRlc3R6aXAgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgY29ycnVwdCBmaWxlLCBvciBOb25lCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh6aXBmLnRlc3R6aXAoKSkKIAorICAgIGRlZiB0ZXN0X29wZW5fY29uZmxpY3RpbmdfaGFuZGxlcyhzZWxmKToKKyAgICAgICAgIyBJdCdzIG9ubHkgcG9zc2libGUgdG8gb3BlbiBvbmUgd3JpdGFibGUgZmlsZSBoYW5kbGUgYXQgYSB0aW1lCisgICAgICAgIG1zZzEgPSBiIkl0J3MgZnVuIHRvIGNoYXJ0ZXIgYW4gYWNjb3VudGFudCEiCisgICAgICAgIG1zZzIgPSBiIkFuZCBzYWlsIHRoZSB3aWRlIGFjY291bnRhbnQgc2VhIgorICAgICAgICBtc2czID0gYiJUbyBmaW5kLCBleHBsb3JlIHRoZSBmdW5kcyBvZmZzaG9yZSIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignZm9vJywgbW9kZT0ndycpIGFzIHcyOgorICAgICAgICAgICAgICAgIHcyLndyaXRlKG1zZzEpCisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignYmFyJywgbW9kZT0ndycpIGFzIHcxOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5vcGVuKCdoYW5kbGUnLCBtb2RlPSd3JykKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHppcGYub3BlbignZm9vJywgbW9kZT0ncicpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCdzdHInLCAnYWJjZGUnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi53cml0ZShfX2ZpbGVfXywgJ2ZpbGUnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgdzEud3JpdGUobXNnMikKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdiYXonLCBtb2RlPSd3JykgYXMgdzI6CisgICAgICAgICAgICAgICAgdzIud3JpdGUobXNnMykKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnZm9vJyksIG1zZzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnYmFyJyksIG1zZzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnYmF6JyksIG1zZzMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYubmFtZWxpc3QoKSwgWydmb28nLCAnYmFyJywgJ2JheiddKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOKQogICAgICAgICB1bmxpbmsoVEVTVEZOMikKQEAgLTE3NjEsNiArMTc3NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycpIGFzIHpvcGVuOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6b3Blbi5yZWFkKCksIGInMjIyJykKIAorICAgIGRlZiB0ZXN0X29wZW5fd3JpdGUoc2VsZik6CisgICAgICAgIGZvciB3cmFwcGVyIGluIChsYW1iZGEgZjogZiksIFRlbGxhYmxlLCBVbnNlZWthYmxlOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qod3JhcHBlcj13cmFwcGVyKToKKyAgICAgICAgICAgICAgICBmID0gaW8uQnl0ZXNJTygpCisgICAgICAgICAgICAgICAgZi53cml0ZShiJ2FiYycpCisgICAgICAgICAgICAgICAgYmYgPSBpby5CdWZmZXJlZFdyaXRlcihmKQorICAgICAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHdyYXBwZXIoYmYpLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnLCAndycpIGFzIHpvcGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgem9wZW4ud3JpdGUoYicxMTEnKQorICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycsICd3JykgYXMgem9wZW46CisgICAgICAgICAgICAgICAgICAgICAgICB6b3Blbi53cml0ZShiJzIyMicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKClbOjVdLCBiJ2FiY1BLJykKKyAgICAgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmKSBhcyB6aXBmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnb25lcycpLCBiJzExMScpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCd0d29zJyksIGInMjIyJykKKwogCiBAcmVxdWlyZXNfemxpYgogY2xhc3MgVGVzdHNXaXRoTXVsdGlwbGVPcGVucyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xODcxLDYgKzE5MDIsMTkgQEAKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoZi5maWxlbm8oKSwgMTAwKQogCisgICAgZGVmIHRlc3Rfd3JpdGVfd2hpbGVfcmVhZGluZyhzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoJ29uZXMnLCBzZWxmLmRhdGExKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAnYScsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmOgorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnLCAncicpIGFzIHIxOgorICAgICAgICAgICAgICAgIGRhdGExID0gcjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ3R3b3MnLCAndycpIGFzIHcxOgorICAgICAgICAgICAgICAgICAgICB3MS53cml0ZShzZWxmLmRhdGEyKQorICAgICAgICAgICAgICAgIGRhdGExICs9IHIxLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGExLCBzZWxmLmRhdGExKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLnJlYWQoJ3R3b3MnKSwgc2VsZi5kYXRhMikKKwogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgdW5saW5rKFRFU1RGTjIpCiAKQEAgLTE5NDAsMTM3ICsxOTg0LDE5IEBACiAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQogCiAKLWNsYXNzIEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzOgotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5saW5lX2dlbiA9IFtieXRlcygiVGVzdCBvZiB6aXBmaWxlIGxpbmUgJWQuIiAlIGksICJhc2NpaSIpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShGSVhFRFRFU1RfU0laRSldCi0gICAgICAgIGNscy5zZXBzID0gKGInXHInLCBiJ1xyXG4nLCBiJ1xuJykKLSAgICAgICAgY2xzLmFyY2RhdGEgPSB7fQotICAgICAgICBmb3IgbiwgcyBpbiBlbnVtZXJhdGUoY2xzLnNlcHMpOgotICAgICAgICAgICAgY2xzLmFyY2RhdGFbc10gPSBzLmpvaW4oY2xzLmxpbmVfZ2VuKSArIHMKK2NsYXNzIFppcEluZm9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICB6aSA9IHppcGZpbGUuWmlwSW5mby5mcm9tX2ZpbGUoX19maWxlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmJhc2VuYW1lKHppLmZpbGVuYW1lKSwgJ3Rlc3RfemlwZmlsZS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemkuaXNfZGlyKCkpCiAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXJjZmlsZXMgPSB7fQotICAgICAgICBmb3IgbiwgcyBpbiBlbnVtZXJhdGUoc2VsZi5zZXBzKToKLSAgICAgICAgICAgIHNlbGYuYXJjZmlsZXNbc10gPSAnJXMtJWQnICUgKFRFU1RGTiwgbikKLSAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmFyY2ZpbGVzW3NdLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5hcmNkYXRhW3NdKQotCi0gICAgZGVmIG1ha2VfdGVzdF9hcmNoaXZlKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYuYXJjZmlsZXMudmFsdWVzKCk6Ci0gICAgICAgICAgICAgICAgemlwZnAud3JpdGUoZm4sIGZuKQotCi0gICAgZGVmIHJlYWRfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAgICAgemlwZGF0YSA9IGZwLnJlYWQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hcmNkYXRhW3NlcF0sIHppcGRhdGEpCi0KLSAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJlYWRfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lX3JlYWRfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyB6aXBvcGVuOgotICAgICAgICAgICAgICAgICAgICBkYXRhID0gYicnCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWFkID0gemlwb3Blbi5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSByZWFkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWQoNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKLQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLmFyY2RhdGFbYidcbiddKQotCi0gICAgZGVmIHRlc3RfcmVhZGxpbmVfcmVhZChzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZV9yZWFkX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiByZWFkbGluZV90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lZGF0YSA9IHppcG9wZW4ucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lZGF0YSwgbGluZSArIGInXG4nKQotCi0gICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZGxpbmVfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICB6aXBsaW5lcyA9IGZwLnJlYWRsaW5lcygpCi0gICAgICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIHppcGxpbmVzKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZGxpbmVzX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiBpdGVybGluZXNfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIGZwKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArIGInXG4nKQotCi0gICAgZGVmIHRlc3RfaXRlcmxpbmVzKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLml0ZXJsaW5lc190ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgIHVubGluayhmbikKLSAgICAgICAgdW5saW5rKFRFU1RGTikKLSAgICAgICAgdW5saW5rKFRFU1RGTjIpCi0KLQotY2xhc3MgU3RvcmVkVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX1NUT1JFRAotCi1AcmVxdWlyZXNfemxpYgotY2xhc3MgRGVmbGF0ZVVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfREVGTEFURUQKLQotQHJlcXVpcmVzX2J6MgotY2xhc3MgQnppcDJVbml2ZXJzYWxOZXdsaW5lVGVzdHMoQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9CWklQMgotCi1AcmVxdWlyZXNfbHptYQotY2xhc3MgTHptYVVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfTFpNQQorICAgIGRlZiB0ZXN0X2Zyb21fZGlyKHNlbGYpOgorICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisgICAgICAgIHppID0gemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZShkaXJwYXRoLCAnc3RkbGliX3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5maWxlbmFtZSwgJ3N0ZGxpYl90ZXN0cy8nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemkuaXNfZGlyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuY29tcHJlc3NfdHlwZSwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmZpbGVfc2l6ZSwgMCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKaW5kZXggOGU1ZTEyZC4uYTI0ODJkNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKICAgICAgICAgZmlsZXMgPSB7cGFja2RpciArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCiAgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKLSAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgICJzcGFtIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KIAogICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQogICAgICAgICB0cnk6CkBAIC00MTIsNiArNDEzLDE0IEBACiAgICAgICAgICAgICB6aSA9IHppcGltcG9ydC56aXBpbXBvcnRlcihURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuYXJjaGl2ZSwgVEVNUF9aSVApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UoVEVTVFBBQ0spLCBUcnVlKQorCisgICAgICAgICAgICBmaW5kX21vZCA9IHppLmZpbmRfbW9kdWxlKCdzcGFtJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbmRfbW9kLmlzX3BhY2thZ2UoJ3NwYW0nKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2QubG9hZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX21vZC5nZXRfZmlsZW5hbWUoJ3NwYW0nKSwgbG9hZF9tb2QuX19maWxlX18pCisKICAgICAgICAgICAgIG1vZCA9IHppLmxvYWRfbW9kdWxlKFRFU1RQQUNLKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUoVEVTVFBBQ0spLCBtb2QuX19maWxlX18pCiAKQEAgLTQ3MSw2ICs0ODAsMTYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgemkuaXNfcGFja2FnZShURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9EKSwgRmFsc2UpCiAKKyAgICAgICAgICAgIHBrZ19wYXRoID0gVEVNUF9aSVAgKyBvcy5zZXAgKyBwYWNrZGlyICsgVEVTVFBBQ0syCisgICAgICAgICAgICB6aTIgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGtnX3BhdGgpCisgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQgPSB6aTIuZmluZF9tb2R1bGUoVEVTVE1PRCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kX2RvdHRlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaW5kX21vZF9kb3R0ZWQsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemkyLmlzX3BhY2thZ2UoVEVTVE1PRCkpCisgICAgICAgICAgICBsb2FkX21vZCA9IGZpbmRfbW9kX2RvdHRlZC5sb2FkX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQuZ2V0X2ZpbGVuYW1lKFRFU1RNT0QpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kX3BhdGggPSBURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9ECiAgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZHVsZV9wYXRoX3RvX2RvdHRlZF9uYW1lKG1vZF9wYXRoKQogICAgICAgICAgICAgbW9kID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobW9kX25hbWUpCkBAIC02MTAsOCArNjI5LDEwIEBACiAKICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKGZpbGVuYW1lKQogICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIob3MuZnNlbmNvZGUoZmlsZW5hbWUpKQotICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoYnl0ZWFycmF5KG9zLmZzZW5jb2RlKGZpbGVuYW1lKSkpCi0gICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihtZW1vcnl2aWV3KG9zLmZzZW5jb2RlKGZpbGVuYW1lKSkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyKGJ5dGVhcnJheShvcy5mc2VuY29kZShmaWxlbmFtZSkpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihtZW1vcnl2aWV3KG9zLmZzZW5jb2RlKGZpbGVuYW1lKSkpCiAKIAogQHN1cHBvcnQucmVxdWlyZXNfemxpYgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKaW5kZXggNTkxMzYyMi4uODRkNTI2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CkBAIC0xMiw3ICsxMiw2IEBACiBpbXBvcnQgZG9jdGVzdAogaW1wb3J0IGluc3BlY3QKIGltcG9ydCBsaW5lY2FjaGUKLWltcG9ydCBwZGIKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgKHNwYXduX3B5dGhvbiwga2lsbF9weXRob24sIGFzc2VydF9weXRob25fb2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9zY3JpcHQsIG1ha2VfemlwX3NjcmlwdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCA2ZmVhODkzLi4yMDE3NGQ4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0xNjQsNiArMTY0LDE2IEBACiAgICAgICAgIHggPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIEhBTUxFVF9TQ0VORSkKIAorICAgIGRlZiB0ZXN0X2tleXdvcmRzKHNlbGYpOgorICAgICAgICB4ID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUsIGxldmVsPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgpLCBIQU1MRVRfU0NFTkUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHpsaWIuY29tcHJlc3MoZGF0YT1IQU1MRVRfU0NFTkUsIGxldmVsPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiaXRzPXpsaWIuTUFYX1dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplPXpsaWIuREVGX0JVRl9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIQU1MRVRfU0NFTkUpCisKICAgICBkZWYgdGVzdF9zcGVlY2gxMjgoc2VsZik6CiAgICAgICAgICMgY29tcHJlc3MgbW9yZSBkYXRhCiAgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiAxMjgKQEAgLTIzNCw2ICsyNDQsMjcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkY28udW5jb25zdW1lZF90YWlsLCBieXRlcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkY28udW51c2VkX2RhdGEsIGJ5dGVzKQogCisgICAgZGVmIHRlc3Rfa2V5d29yZHMoc2VsZik6CisgICAgICAgIGxldmVsID0gMgorICAgICAgICBtZXRob2QgPSB6bGliLkRFRkxBVEVECisgICAgICAgIHdiaXRzID0gLTEyCisgICAgICAgIG1lbUxldmVsID0gOQorICAgICAgICBzdHJhdGVneSA9IHpsaWIuWl9GSUxURVJFRAorICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmoobGV2ZWw9bGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q9bWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JpdHM9d2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1MZXZlbD1tZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5PXN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemRpY3Q9YiIiKQorICAgICAgICBkbyA9IHpsaWIuZGVjb21wcmVzc29iaih3Yml0cz13Yml0cywgemRpY3Q9YiIiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjby5jb21wcmVzcyhkYXRhPUhBTUxFVF9TQ0VORSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZG8uZGVjb21wcmVzcyhkYXRhPXpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKSkKKyAgICAgICAgeCA9IGNvLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkgKyBjby5mbHVzaCgpCisgICAgICAgIHkgPSBkby5kZWNvbXByZXNzKHgsIG1heF9sZW5ndGg9bGVuKEhBTUxFVF9TQ0VORSkpICsgZG8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhBTUxFVF9TQ0VORSwgeSkKKwogICAgIGRlZiB0ZXN0X2NvbXByZXNzb3B0aW9ucyhzZWxmKToKICAgICAgICAgIyBzcGVjaWZ5IGxvdHMgb2Ygb3B0aW9ucyB0byBjb21wcmVzc29iaigpCiAgICAgICAgIGxldmVsID0gMgpAQCAtMjQ5LDEwICsyODAsNiBAQAogICAgICAgICB5MiA9IGRjby5mbHVzaCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSEFNTEVUX1NDRU5FLCB5MSArIHkyKQogCi0gICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgc2hvdWxkIGFsc28gYmUgc3VwcG9ydGVkCi0gICAgICAgIHpsaWIuY29tcHJlc3NvYmoobGV2ZWw9bGV2ZWwsIG1ldGhvZD1tZXRob2QsIHdiaXRzPXdiaXRzLAotICAgICAgICAgICAgbWVtTGV2ZWw9bWVtTGV2ZWwsIHN0cmF0ZWd5PXN0cmF0ZWd5LCB6ZGljdD1iIiIpCi0KICAgICBkZWYgdGVzdF9jb21wcmVzc2luY3JlbWVudGFsKHNlbGYpOgogICAgICAgICAjIGNvbXByZXNzIG9iamVjdCBpbiBzdGVwcywgZGVjb21wcmVzcyBvYmplY3QgYXMgb25lLXNob3QKICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORSAqIDEyOApkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggMDZiN2I5Yi4uNDgyOWZmNCAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC0yMiw5ICsyMiwxMSBAQAogIyB3aXRoIHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLCB3aGljaCBkb2Vzbid0IHByb3ZpZGUgdGhlIG9sZAogIyBKYXZhIGluc3BpcmVkIG5hbWVzLgogCi1fX2FsbF9fID0gWydhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRfdGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCi0gICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsICdCYXJyaWVyJywKLSAgICAgICAgICAgJ1RpbWVyJywgJ1RocmVhZEVycm9yJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCitfX2FsbF9fID0gWydnZXRfaWRlbnQnLCAnYWN0aXZlX2NvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50X3RocmVhZCcsCisgICAgICAgICAgICdlbnVtZXJhdGUnLCAnbWFpbl90aHJlYWQnLCAnVElNRU9VVF9NQVgnLAorICAgICAgICAgICAnRXZlbnQnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdUaHJlYWQnLAorICAgICAgICAgICAnQmFycmllcicsICdCcm9rZW5CYXJyaWVyRXJyb3InLCAnVGltZXInLCAnVGhyZWFkRXJyb3InLAorICAgICAgICAgICAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KIAogIyBSZW5hbWUgc29tZSBzdHVmZiBzbyAiZnJvbSB0aHJlYWRpbmcgaW1wb3J0ICoiIGlzIHNhZmUKIF9zdGFydF9uZXdfdGhyZWFkID0gX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkCmRpZmYgLS1naXQgYS9MaWIvdGltZWl0LnB5IGIvTGliL3RpbWVpdC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDJkZTg4ZjcuLjI3NzBlZmEKLS0tIGEvTGliL3RpbWVpdC5weQorKysgYi9MaWIvdGltZWl0LnB5CkBAIC0yMDcsNiArMjA3LDI2IEBACiAgICAgICAgICAgICByLmFwcGVuZCh0KQogICAgICAgICByZXR1cm4gcgogCisgICAgZGVmIGF1dG9yYW5nZShzZWxmLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgbG9vcHMgc28gdGhhdCB0b3RhbCB0aW1lID49IDAuMi4KKworICAgICAgICBDYWxscyB0aGUgdGltZWl0IG1ldGhvZCB3aXRoICpudW1iZXIqIHNldCB0byBzdWNjZXNzaXZlIHBvd2VycyBvZgorICAgICAgICB0ZW4gKDEwLCAxMDAsIDEwMDAsIC4uLikgdXAgdG8gYSBtYXhpbXVtIG9mIG9uZSBiaWxsaW9uLCB1bnRpbAorICAgICAgICB0aGUgdGltZSB0YWtlbiBpcyBhdCBsZWFzdCAwLjIgc2Vjb25kLCBvciB0aGUgbWF4aW11bSBpcyByZWFjaGVkLgorICAgICAgICBSZXR1cm5zIGBgKG51bWJlciwgdGltZV90YWtlbilgYC4KKworICAgICAgICBJZiAqY2FsbGJhY2sqIGlzIGdpdmVuIGFuZCBpcyBub3QgTm9uZSwgaXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgZWFjaCB0cmlhbCB3aXRoIHR3byBhcmd1bWVudHM6IGBgY2FsbGJhY2sobnVtYmVyLCB0aW1lX3Rha2VuKWBgLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgbnVtYmVyID0gMTAqKmkKKyAgICAgICAgICAgIHRpbWVfdGFrZW4gPSBzZWxmLnRpbWVpdChudW1iZXIpCisgICAgICAgICAgICBpZiBjYWxsYmFjazoKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhudW1iZXIsIHRpbWVfdGFrZW4pCisgICAgICAgICAgICBpZiB0aW1lX3Rha2VuID49IDAuMjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gKG51bWJlciwgdGltZV90YWtlbikKKwogZGVmIHRpbWVpdChzdG10PSJwYXNzIiwgc2V0dXA9InBhc3MiLCB0aW1lcj1kZWZhdWx0X3RpbWVyLAogICAgICAgICAgICBudW1iZXI9ZGVmYXVsdF9udW1iZXIsIGdsb2JhbHM9Tm9uZSk6CiAgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCB0aW1laXQgbWV0aG9kLiIiIgpAQCAtMjk1LDE3ICszMTUsMTYgQEAKICAgICB0ID0gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKQogICAgIGlmIG51bWJlciA9PSAwOgogICAgICAgICAjIGRldGVybWluZSBudW1iZXIgc28gdGhhdCAwLjIgPD0gdG90YWwgdGltZSA8IDIuMAotICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAxMCk6Ci0gICAgICAgICAgICBudW1iZXIgPSAxMCoqaQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHggPSB0LnRpbWVpdChudW1iZXIpCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgdC5wcmludF9leGMoKQotICAgICAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgIHByaW50KCIlZCBsb29wcyAtPiAlLipnIHNlY3MiICUgKG51bWJlciwgcHJlY2lzaW9uLCB4KSkKLSAgICAgICAgICAgIGlmIHggPj0gMC4yOgotICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGNhbGxiYWNrID0gTm9uZQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgZGVmIGNhbGxiYWNrKG51bWJlciwgdGltZV90YWtlbik6CisgICAgICAgICAgICAgICAgbXNnID0gIntudW19IGxvb3BzIC0+IHtzZWNzOi57cHJlY31nfSBzZWNzIgorICAgICAgICAgICAgICAgIHByaW50KG1zZy5mb3JtYXQobnVtPW51bWJlciwgc2Vjcz10aW1lX3Rha2VuLCBwcmVjPXByZWNpc2lvbikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51bWJlciwgXyA9IHQuYXV0b3JhbmdlKGNhbGxiYWNrKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0LnByaW50X2V4YygpCisgICAgICAgICAgICByZXR1cm4gMQogICAgIHRyeToKICAgICAgICAgciA9IHQucmVwZWF0KHJlcGVhdCwgbnVtYmVyKQogICAgIGV4Y2VwdDoKQEAgLTMxNywyMCArMzM2LDI2IEBACiAgICAgcHJpbnQoIiVkIGxvb3BzLCIgJSBudW1iZXIsIGVuZD0nICcpCiAgICAgdXNlYyA9IGJlc3QgKiAxZTYgLyBudW1iZXIKICAgICBpZiB0aW1lX3VuaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnICVzIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWMvdW5pdHNbdGltZV91bml0XSwgdGltZV91bml0KSkKKyAgICAgICAgc2NhbGUgPSB1bml0c1t0aW1lX3VuaXRdCiAgICAgZWxzZToKLSAgICAgICAgaWYgdXNlYyA8IDEwMDA6Ci0gICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyB1c2VjIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwgdXNlYykpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtc2VjID0gdXNlYyAvIDEwMDAKLSAgICAgICAgICAgIGlmIG1zZWMgPCAxMDAwOgotICAgICAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIG1zZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sIG1zZWMpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWMgPSBtc2VjIC8gMTAwMAotICAgICAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIHNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCBzZWMpKQorICAgICAgICBzY2FsZXMgPSBbKHNjYWxlLCB1bml0KSBmb3IgdW5pdCwgc2NhbGUgaW4gdW5pdHMuaXRlbXMoKV0KKyAgICAgICAgc2NhbGVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICBmb3Igc2NhbGUsIHRpbWVfdW5pdCBpbiBzY2FsZXM6CisgICAgICAgICAgICBpZiB1c2VjID49IHNjYWxlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgJXMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjL3NjYWxlLCB0aW1lX3VuaXQpKQorICAgIGJlc3QgPSBtaW4ocikKKyAgICB1c2VjID0gYmVzdCAqIDFlNiAvIG51bWJlcgorICAgIHdvcnN0ID0gbWF4KHIpCisgICAgaWYgd29yc3QgPj0gYmVzdCAqIDQ6CisgICAgICAgIHVzZWMgPSB3b3JzdCAqIDFlNiAvIG51bWJlcgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3Mud2Fybl9leHBsaWNpdCgKKyAgICAgICAgICAgICJUaGUgdGVzdCByZXN1bHRzIGFyZSBsaWtlbHkgdW5yZWxpYWJsZS4gVGhlIHdvcnN0XG4iCisgICAgICAgICAgICAidGltZSAoJS4qZyAlcykgd2FzIG1vcmUgdGhhbiBmb3VyIHRpbWVzIHNsb3dlciB0aGFuIHRoZSBiZXN0IHRpbWUuIiAlCisgICAgICAgICAgICAocHJlY2lzaW9uLCB1c2VjL3NjYWxlLCB0aW1lX3VuaXQpLAorICAgICAgICAgICAgIFVzZXJXYXJuaW5nLCAnJywgMCkKICAgICByZXR1cm4gTm9uZQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvX19pbml0X18ucHkgYi9MaWIvdGtpbnRlci9fX2luaXRfXy5weQppbmRleCA1NWJmYjdmLi45OWFkMmE3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9fX2luaXRfXy5weQorKysgYi9MaWIvdGtpbnRlci9fX2luaXRfXy5weQpAQCAtMzAsNiArMzAsNyBAQAogdGsubWFpbmxvb3AoKQogIiIiCiAKK2ltcG9ydCBlbnVtCiBpbXBvcnQgc3lzCiAKIGltcG9ydCBfdGtpbnRlciAjIElmIHRoaXMgZmFpbHMgeW91ciBQeXRob24gbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciBUawpAQCAtMTMyLDYgKzEzMyw1MCBAQAogICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQogICAgIHJldHVybiBkaWN0CiAKKworY2xhc3MgRXZlbnRUeXBlKHN0ciwgZW51bS5FbnVtKToKKyAgICBLZXlQcmVzcyA9ICcyJworICAgIEtleSA9IEtleVByZXNzLAorICAgIEtleVJlbGVhc2UgPSAnMycKKyAgICBCdXR0b25QcmVzcyA9ICc0JworICAgIEJ1dHRvbiA9IEJ1dHRvblByZXNzLAorICAgIEJ1dHRvblJlbGVhc2UgPSAnNScKKyAgICBNb3Rpb24gPSAnNicKKyAgICBFbnRlciA9ICc3JworICAgIExlYXZlID0gJzgnCisgICAgRm9jdXNJbiA9ICc5JworICAgIEZvY3VzT3V0ID0gJzEwJworICAgIEtleW1hcCA9ICcxMScgICAgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgRXhwb3NlID0gJzEyJworICAgIEdyYXBoaWNzRXhwb3NlID0gJzEzJyAgICMgdW5kb2N1bWVudGVkCisgICAgTm9FeHBvc2UgPSAnMTQnICAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBWaXNpYmlsaXR5ID0gJzE1JworICAgIENyZWF0ZSA9ICcxNicKKyAgICBEZXN0cm95ID0gJzE3JworICAgIFVubWFwID0gJzE4JworICAgIE1hcCA9ICcxOScKKyAgICBNYXBSZXF1ZXN0ID0gJzIwJworICAgIFJlcGFyZW50ID0gJzIxJworICAgIENvbmZpZ3VyZSA9ICcyMicKKyAgICBDb25maWd1cmVSZXF1ZXN0ID0gJzIzJworICAgIEdyYXZpdHkgPSAnMjQnCisgICAgUmVzaXplUmVxdWVzdCA9ICcyNScKKyAgICBDaXJjdWxhdGUgPSAnMjYnCisgICAgQ2lyY3VsYXRlUmVxdWVzdCA9ICcyNycKKyAgICBQcm9wZXJ0eSA9ICcyOCcKKyAgICBTZWxlY3Rpb25DbGVhciA9ICcyOScgICAjIHVuZG9jdW1lbnRlZAorICAgIFNlbGVjdGlvblJlcXVlc3QgPSAnMzAnICMgdW5kb2N1bWVudGVkCisgICAgU2VsZWN0aW9uID0gJzMxJyAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBDb2xvcm1hcCA9ICczMicKKyAgICBDbGllbnRNZXNzYWdlID0gJzMzJyAgICAjIHVuZG9jdW1lbnRlZAorICAgIE1hcHBpbmcgPSAnMzQnICAgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgVmlydHVhbEV2ZW50ID0gJzM1JywgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBBY3RpdmF0ZSA9ICczNicsCisgICAgRGVhY3RpdmF0ZSA9ICczNycsCisgICAgTW91c2VXaGVlbCA9ICczOCcsCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKwogY2xhc3MgRXZlbnQ6CiAgICAgIiIiQ29udGFpbmVyIGZvciB0aGUgcHJvcGVydGllcyBvZiBhbiBldmVudC4KIApAQCAtMTc0LDcgKzIxOSw0MyBAQAogICAgIHdpZGdldCAtIHdpZGdldCBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQKICAgICBkZWx0YSAtIGRlbHRhIG9mIHdoZWVsIG1vdmVtZW50IChNb3VzZVdoZWVsKQogICAgICIiIgotICAgIHBhc3MKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGF0dHJzID0ge2s6IHYgZm9yIGssIHYgaW4gc2VsZi5fX2RpY3RfXy5pdGVtcygpIGlmIHYgIT0gJz8/J30KKyAgICAgICAgaWYgbm90IHNlbGYuY2hhcjoKKyAgICAgICAgICAgIGRlbCBhdHRyc1snY2hhciddCisgICAgICAgIGVsaWYgc2VsZi5jaGFyICE9ICc/Pyc6CisgICAgICAgICAgICBhdHRyc1snY2hhciddID0gcmVwcihzZWxmLmNoYXIpCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYsICdzZW5kX2V2ZW50JywgVHJ1ZSk6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ3NlbmRfZXZlbnQnXQorICAgICAgICBpZiBzZWxmLnN0YXRlID09IDA6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ3N0YXRlJ10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuc3RhdGUsIGludCk6CisgICAgICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGUKKyAgICAgICAgICAgIG1vZHMgPSAoJ1NoaWZ0JywgJ0xvY2snLCAnQ29udHJvbCcsCisgICAgICAgICAgICAgICAgICAgICdNb2QxJywgJ01vZDInLCAnTW9kMycsICdNb2Q0JywgJ01vZDUnLAorICAgICAgICAgICAgICAgICAgICAnQnV0dG9uMScsICdCdXR0b24yJywgJ0J1dHRvbjMnLCAnQnV0dG9uNCcsICdCdXR0b241JykKKyAgICAgICAgICAgIHMgPSBbXQorICAgICAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKG1vZHMpOgorICAgICAgICAgICAgICAgIGlmIHN0YXRlICYgKDEgPDwgaSk6CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKG4pCisgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlICYgfigoMTw8IGxlbihtb2RzKSkgLSAxKQorICAgICAgICAgICAgaWYgc3RhdGUgb3Igbm90IHM6CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoaGV4KHN0YXRlKSkKKyAgICAgICAgICAgIGF0dHJzWydzdGF0ZSddID0gJ3wnLmpvaW4ocykKKyAgICAgICAgaWYgc2VsZi5kZWx0YSA9PSAwOgorICAgICAgICAgICAgZGVsIGF0dHJzWydkZWx0YSddCisgICAgICAgICMgd2lkZ2V0IHVzdWFsbHkgaXMga25vd24KKyAgICAgICAgIyBzZXJpYWwgYW5kIHRpbWUgYXJlIG5vdCB2ZXJ5IGludGVyZXN0aW5nCisgICAgICAgICMga2V5c3ltX251bSBkdXBsaWNhdGVzIGtleXN5bQorICAgICAgICAjIHhfcm9vdCBhbmQgeV9yb290IG1vc3RseSBkdXBsaWNhdGUgeCBhbmQgeQorICAgICAgICBrZXlzID0gKCdzZW5kX2V2ZW50JywKKyAgICAgICAgICAgICAgICAnc3RhdGUnLCAna2V5c3ltJywgJ2tleWNvZGUnLCAnY2hhcicsCisgICAgICAgICAgICAgICAgJ251bScsICdkZWx0YScsICdmb2N1cycsCisgICAgICAgICAgICAgICAgJ3gnLCAneScsICd3aWR0aCcsICdoZWlnaHQnKQorICAgICAgICByZXR1cm4gJzwlcyBldmVudCVzPicgJSAoCisgICAgICAgICAgICBzZWxmLnR5cGUsCisgICAgICAgICAgICAnJy5qb2luKCcgJXM9JXMnICUgKGssIGF0dHJzW2tdKSBmb3IgayBpbiBrZXlzIGlmIGsgaW4gYXR0cnMpCisgICAgICAgICkKIAogX3N1cHBvcnRfZGVmYXVsdF9yb290ID0gMQogX2RlZmF1bHRfcm9vdCA9IE5vbmUKQEAgLTI2MiwxNSArMzQzLDggQEAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdmFsdWUgb2YgdmFyaWFibGUuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl90ay5nbG9iYWxnZXR2YXIoc2VsZi5fbmFtZSkKLSAgICBkZWYgdHJhY2VfdmFyaWFibGUoc2VsZiwgbW9kZSwgY2FsbGJhY2spOgotICAgICAgICAiIiJEZWZpbmUgYSB0cmFjZSBjYWxsYmFjayBmb3IgdGhlIHZhcmlhYmxlLgogCi0gICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KLSAgICAgICAgQ0FMTEJBQ0sgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuCi0gICAgICAgIHRoZSB2YXJpYWJsZSBpcyByZWFkLCB3cml0dGVuIG9yIHVuZGVmaW5lZC4KLQotICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgotICAgICAgICAiIiIKKyAgICBkZWYgX3JlZ2lzdGVyKHNlbGYsIGNhbGxiYWNrKToKICAgICAgICAgZiA9IENhbGxXcmFwcGVyKGNhbGxiYWNrLCBOb25lLCBzZWxmLl9yb290KS5fX2NhbGxfXwogICAgICAgICBjYm5hbWUgPSByZXByKGlkKGYpKQogICAgICAgICB0cnk6CkBAIC0yODUsMTggKzM1OSwzMyBAQAogICAgICAgICBpZiBzZWxmLl90Y2xDb21tYW5kcyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMgPSBbXQogICAgICAgICBzZWxmLl90Y2xDb21tYW5kcy5hcHBlbmQoY2JuYW1lKQotICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2YXJpYWJsZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKICAgICAgICAgcmV0dXJuIGNibmFtZQotICAgIHRyYWNlID0gdHJhY2VfdmFyaWFibGUKLSAgICBkZWYgdHJhY2VfdmRlbGV0ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgorCisgICAgZGVmIHRyYWNlX2FkZChzZWxmLCBtb2RlLCBjYWxsYmFjayk6CisgICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCisKKyAgICAgICAgTW9kZSBpcyBvbmUgb2YgInJlYWQiLCAid3JpdGUiLCAidW5zZXQiLCBvciBhIGxpc3Qgb3IgdHVwbGUgb2YKKyAgICAgICAgc3VjaCBzdHJpbmdzLgorICAgICAgICBDYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHZhcmlhYmxlIGlzCisgICAgICAgIHJlYWQsIHdyaXR0ZW4gb3IgdW5zZXQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjay4KKyAgICAgICAgIiIiCisgICAgICAgIGNibmFtZSA9IHNlbGYuX3JlZ2lzdGVyKGNhbGxiYWNrKQorICAgICAgICBzZWxmLl90ay5jYWxsKCd0cmFjZScsICdhZGQnLCAndmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25hbWUsIG1vZGUsIChjYm5hbWUsKSkKKyAgICAgICAgcmV0dXJuIGNibmFtZQorCisgICAgZGVmIHRyYWNlX3JlbW92ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgogICAgICAgICAiIiJEZWxldGUgdGhlIHRyYWNlIGNhbGxiYWNrIGZvciBhIHZhcmlhYmxlLgogCi0gICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KLSAgICAgICAgQ0JOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX3ZhcmlhYmxlIG9yIHRyYWNlLgorICAgICAgICBNb2RlIGlzIG9uZSBvZiAicmVhZCIsICJ3cml0ZSIsICJ1bnNldCIgb3IgYSBsaXN0IG9yIHR1cGxlIG9mCisgICAgICAgIHN1Y2ggc3RyaW5ncy4gIE11c3QgYmUgc2FtZSBhcyB3ZXJlIHNwZWNpZmllZCBpbiB0cmFjZV9hZGQoKS4KKyAgICAgICAgY2JuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX2FkZCgpLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmRlbGV0ZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKLSAgICAgICAgY2JuYW1lID0gc2VsZi5fdGsuc3BsaXRsaXN0KGNibmFtZSlbMF0KLSAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfdmluZm8oKToKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgndHJhY2UnLCAncmVtb3ZlJywgJ3ZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIGZvciBtLCBjYSBpbiBzZWxmLnRyYWNlX2luZm8oKToKICAgICAgICAgICAgIGlmIHNlbGYuX3RrLnNwbGl0bGlzdChjYSlbMF0gPT0gY2JuYW1lOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGVsc2U6CkBAIC0zMDUsMTAgKzM5NCw2NCBAQAogICAgICAgICAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLnJlbW92ZShjYm5hbWUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgZGVmIHRyYWNlX3ZpbmZvKHNlbGYpOgorCisgICAgZGVmIHRyYWNlX2luZm8oc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIHNwbGl0bGlzdCA9IHNlbGYuX3RrLnNwbGl0bGlzdAorICAgICAgICByZXR1cm4gWyhzcGxpdGxpc3QoayksIHYpIGZvciBrLCB2IGluIG1hcChzcGxpdGxpc3QsCisgICAgICAgICAgICBzcGxpdGxpc3Qoc2VsZi5fdGsuY2FsbCgndHJhY2UnLCAnaW5mbycsICd2YXJpYWJsZScsIHNlbGYuX25hbWUpKSldCisKKyAgICBkZWYgdHJhY2VfdmFyaWFibGUoc2VsZiwgbW9kZSwgY2FsbGJhY2spOgorICAgICAgICAiIiJEZWZpbmUgYSB0cmFjZSBjYWxsYmFjayBmb3IgdGhlIHZhcmlhYmxlLgorCisgICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KKyAgICAgICAgQ0FMTEJBQ0sgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuCisgICAgICAgIHRoZSB2YXJpYWJsZSBpcyByZWFkLCB3cml0dGVuIG9yIHVuZGVmaW5lZC4KKworICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgorCisgICAgICAgIFRoaXMgZGVwcmVjYXRlZCBtZXRob2Qgd3JhcHMgYSBkZXByZWNhdGVkIFRjbCBtZXRob2QgdGhhdCB3aWxsCisgICAgICAgIGxpa2VseSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBVc2UgdHJhY2VfYWRkKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZhcmlhYmxlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICByZXR1cm4gY2JuYW1lCisKKyAgICB0cmFjZSA9IHRyYWNlX3ZhcmlhYmxlCisKKyAgICBkZWYgdHJhY2VfdmRlbGV0ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgorICAgICAgICAiIiJEZWxldGUgdGhlIHRyYWNlIGNhbGxiYWNrIGZvciBhIHZhcmlhYmxlLgorCisgICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KKyAgICAgICAgQ0JOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX3ZhcmlhYmxlIG9yIHRyYWNlLgorCisgICAgICAgIFRoaXMgZGVwcmVjYXRlZCBtZXRob2Qgd3JhcHMgYSBkZXByZWNhdGVkIFRjbCBtZXRob2QgdGhhdCB3aWxsCisgICAgICAgIGxpa2VseSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBVc2UgdHJhY2VfcmVtb3ZlKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmRlbGV0ZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fdGsuc3BsaXRsaXN0KGNibmFtZSlbMF0KKyAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfaW5mbygpOgorICAgICAgICAgICAgaWYgc2VsZi5fdGsuc3BsaXRsaXN0KGNhKVswXSA9PSBjYm5hbWU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RrLmRlbGV0ZWNvbW1hbmQoY2JuYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLnJlbW92ZShjYm5hbWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdHJhY2VfdmluZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9pbmZvKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKICAgICAgICAgcmV0dXJuIFtzZWxmLl90ay5zcGxpdGxpc3QoeCkgZm9yIHggaW4gc2VsZi5fdGsuc3BsaXRsaXN0KAogICAgICAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmluZm8iLCBzZWxmLl9uYW1lKSldCisKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgIiIiQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKD09KS4KIApAQCAtNDI2LDYgKzU2OSw5IEBACiAKICAgICBCYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgbWV0aG9kcyBjb21tb24gZm9yIGludGVyaW9yIHdpZGdldHMuIiIiCiAKKyAgICAjIHVzZWQgZm9yIGdlbmVyYXRpbmcgY2hpbGQgd2lkZ2V0IG5hbWVzCisgICAgX2xhc3RfY2hpbGRfaWRzID0gTm9uZQorCiAgICAgIyBYWFggZm9udCBjb21tYW5kPwogICAgIF90Y2xDb21tYW5kcyA9IE5vbmUKICAgICBkZWYgZGVzdHJveShzZWxmKToKQEAgLTQ3MywxMiArNjE5LDYgQEAKICAgICAgICAgZGlzYWJsZWRGb3JlZ3JvdW5kLCBpbnNlcnRCYWNrZ3JvdW5kLCB0cm91Z2hDb2xvci4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKCgndGtfc2V0UGFsZXR0ZScsKQogICAgICAgICAgICAgICArIF9mbGF0dGVuKGFyZ3MpICsgX2ZsYXR0ZW4obGlzdChrdy5pdGVtcygpKSkpCi0gICAgZGVmIHRrX21lbnVCYXIoc2VsZiwgKmFyZ3MpOgotICAgICAgICAiIiJEbyBub3QgdXNlLiBOZWVkZWQgaW4gVGsgMy42IGFuZCBlYXJsaWVyLiIiIgotICAgICAgICAjIG9ic29sZXRlIHNpbmNlIFRrIDQuMAotICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3Mud2FybigndGtfbWVudUJhcigpIGRvZXMgbm90aGluZyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuNicsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgZGVmIHdhaXRfdmFyaWFibGUoc2VsZiwgbmFtZT0nUFlfVkFSJyk6CiAgICAgICAgICIiIldhaXQgdW50aWwgdGhlIHZhcmlhYmxlIGlzIG1vZGlmaWVkLgogCkBAIC04NTAsOCArOTkwLDcgQEAKICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaGVpZ2h0Jywgc2VsZi5fdykpCiAgICAgZGVmIHdpbmZvX2lkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gaWRlbnRpZmllciBJRCBmb3IgdGhpcyB3aWRnZXQuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmdldGludCgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSkKKyAgICAgICAgcmV0dXJuIGludChzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2lkJywgc2VsZi5fdyksIDApCiAgICAgZGVmIHdpbmZvX2ludGVycHMoc2VsZiwgZGlzcGxheW9mPTApOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgYWxsIFRjbCBpbnRlcnByZXRlcnMgZm9yIHRoaXMgZGlzcGxheS4iIiIKICAgICAgICAgYXJncyA9ICgnd2luZm8nLCAnaW50ZXJwcycpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikKQEAgLTk3MSwxOCArMTExMCwxNiBAQAogICAgIGRlZiB3aW5mb192aXN1YWxpZChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBYIGlkZW50aWZpZXIgZm9yIHRoZSB2aXN1YWwgZm9yIHRoaXMgd2lkZ2V0LiIiIgogICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxpZCcsIHNlbGYuX3cpCi0gICAgZGVmIHdpbmZvX3Zpc3VhbHNhdmFpbGFibGUoc2VsZiwgaW5jbHVkZWlkcz0wKToKKyAgICBkZWYgd2luZm9fdmlzdWFsc2F2YWlsYWJsZShzZWxmLCBpbmNsdWRlaWRzPUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmlzdWFscyBhdmFpbGFibGUgZm9yIHRoZSBzY3JlZW4KICAgICAgICAgb2YgdGhpcyB3aWRnZXQuCiAKICAgICAgICAgRWFjaCBpdGVtIGluIHRoZSBsaXN0IGNvbnNpc3RzIG9mIGEgdmlzdWFsIG5hbWUgKHNlZSB3aW5mb192aXN1YWwpLCBhCi0gICAgICAgIGRlcHRoIGFuZCBpZiBJTkNMVURFSURTPTEgaXMgZ2l2ZW4gYWxzbyB0aGUgWCBpZGVudGlmaWVyLiIiIgotICAgICAgICBkYXRhID0gc2VsZi50ay5zcGxpdCgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndmlzdWFsc2F2YWlsYWJsZScsIHNlbGYuX3csCi0gICAgICAgICAgICAgICAgICAgICBpbmNsdWRlaWRzIGFuZCAnaW5jbHVkZWlkcycgb3IgTm9uZSkpCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKLSAgICAgICAgICAgIGRhdGEgPSBbc2VsZi50ay5zcGxpdChkYXRhKV0KLSAgICAgICAgcmV0dXJuIFtzZWxmLl9fd2luZm9fcGFyc2VpdGVtKHgpIGZvciB4IGluICBkYXRhXQorICAgICAgICBkZXB0aCBhbmQgaWYgaW5jbHVkZWlkcyBpcyB0cnVlIGlzIGdpdmVuIGFsc28gdGhlIFggaWRlbnRpZmllci4iIiIKKyAgICAgICAgZGF0YSA9IHNlbGYudGsuY2FsbCgnd2luZm8nLCAndmlzdWFsc2F2YWlsYWJsZScsIHNlbGYuX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVpZHMnIGlmIGluY2x1ZGVpZHMgZWxzZSBOb25lKQorICAgICAgICBkYXRhID0gW3NlbGYudGsuc3BsaXRsaXN0KHgpIGZvciB4IGluIHNlbGYudGsuc3BsaXRsaXN0KGRhdGEpXQorICAgICAgICByZXR1cm4gW3NlbGYuX193aW5mb19wYXJzZWl0ZW0oeCkgZm9yIHggaW4gZGF0YV0KICAgICBkZWYgX193aW5mb19wYXJzZWl0ZW0oc2VsZiwgdCk6CiAgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgICAgICByZXR1cm4gdFs6MV0gKyB0dXBsZShtYXAoc2VsZi5fX3dpbmZvX2dldGludCwgdFsxOl0pKQpAQCAtMTI4Myw3ICsxNDIwLDEwIEBACiAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjogcGFzcwogICAgICAgICBlLmtleXN5bSA9IEsKICAgICAgICAgZS5rZXlzeW1fbnVtID0gZ2V0aW50X2V2ZW50KE4pCi0gICAgICAgIGUudHlwZSA9IFQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZS50eXBlID0gRXZlbnRUeXBlKFQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgZS50eXBlID0gVAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBlLndpZGdldCA9IHNlbGYuX25hbWV0b3dpZGdldChXKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC0xODkzLDkgKzIwMzMsNiBAQAogICAgICAgICBpZiB0Y2xfdmVyc2lvbiAhPSBfdGtpbnRlci5UQ0xfVkVSU0lPTjoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidGNsLmggdmVyc2lvbiAoJXMpIGRvZXNuJ3QgbWF0Y2ggbGlidGNsLmEgdmVyc2lvbiAoJXMpIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoX3RraW50ZXIuVENMX1ZFUlNJT04sIHRjbF92ZXJzaW9uKSkKLSAgICAgICAgaWYgVGtWZXJzaW9uIDwgNC4wOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJUayA0LjAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkOyBmb3VuZCBUayAlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cihUa1ZlcnNpb24pKQogICAgICAgICAjIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIHRrZXJyb3IgYW5kIGV4aXQgY29tbWFuZHMKICAgICAgICAgIyBXZSBuZWVkIHRvIGlubGluZSBwYXJ0cyBvZiBfcmVnaXN0ZXIgaGVyZSwgXyByZWdpc3RlcgogICAgICAgICAjIHdvdWxkIHJlZ2lzdGVyIGRpZmZlcmVudGx5LW5hbWVkIGNvbW1hbmRzLgpAQCAtMjExOCw3ICsyMjU1LDE1IEBACiAgICAgICAgICAgICBuYW1lID0gY25mWyduYW1lJ10KICAgICAgICAgICAgIGRlbCBjbmZbJ25hbWUnXQogICAgICAgICBpZiBub3QgbmFtZToKLSAgICAgICAgICAgIG5hbWUgPSByZXByKGlkKHNlbGYpKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKKyAgICAgICAgICAgIGlmIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzID0ge30KKyAgICAgICAgICAgIGNvdW50ID0gbWFzdGVyLl9sYXN0X2NoaWxkX2lkcy5nZXQobmFtZSwgMCkgKyAxCisgICAgICAgICAgICBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzW25hbWVdID0gY291bnQKKyAgICAgICAgICAgIGlmIGNvdW50ID09IDE6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdgJXMnICUgKG5hbWUsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lID0gJ2AlcyVkJyAlIChuYW1lLCBjb3VudCkKICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgaWYgbWFzdGVyLl93PT0nLic6CiAgICAgICAgICAgICBzZWxmLl93ID0gJy4nICsgbmFtZQpAQCAtMjcxNCwxMiArMjg1OSw2IEBACiAgICAgZGVmIHRrX3BvcHVwKHNlbGYsIHgsIHksIGVudHJ5PSIiKToKICAgICAgICAgIiIiUG9zdCB0aGUgbWVudSBhdCBwb3NpdGlvbiBYLFkgd2l0aCBlbnRyeSBFTlRSWS4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKCd0a19wb3B1cCcsIHNlbGYuX3csIHgsIHksIGVudHJ5KQotICAgIGRlZiB0a19iaW5kRm9yVHJhdmVyc2FsKHNlbGYpOgotICAgICAgICAjIG9ic29sZXRlIHNpbmNlIFRrIDQuMAotICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3Mud2FybigndGtfYmluZEZvclRyYXZlcnNhbCgpIGRvZXMgbm90aGluZyBhbmQgJwotICAgICAgICAgICAgICAgICAgICAgICd3aWxsIGJlIHJlbW92ZWQgaW4gMy42JywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICBkZWYgYWN0aXZhdGUoc2VsZiwgaW5kZXgpOgogICAgICAgICAiIiJBY3RpdmF0ZSBlbnRyeSBhdCBJTkRFWC4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhY3RpdmF0ZScsIGluZGV4KQpAQCAtMzM0Miw5ICszNDgxLDYgQEAKICAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICBJbWFnZS5fbGFzdF9pZCArPSAxCiAgICAgICAgICAgICBuYW1lID0gInB5aW1hZ2UlciIgJSAoSW1hZ2UuX2xhc3RfaWQsKSAjIHRrIGl0c2VsZiB3b3VsZCB1c2UgaW1hZ2U8eD4KLSAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIHN5c3RlbXMgd2hlcmUgaWQoeCkKLSAgICAgICAgICAgICMgY2FuIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciwgc3VjaCBhcyBMaW51eC9tNjhrOgotICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAnLSc6IG5hbWUgPSAnXycgKyBuYW1lWzE6XQogICAgICAgICBpZiBrdyBhbmQgY25mOiBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQogICAgICAgICBlbGlmIGt3OiBjbmYgPSBrdwogICAgICAgICBvcHRpb25zID0gKCkKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weSBiL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weQppbmRleCBkMjY4OGRiLi4xZTc1Y2FlIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9jb21tb25kaWFsb2cucHkKKysrIGIvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5CkBAIC0xNSwxMSArMTUsNiBAQAogICAgIGNvbW1hbmQgID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKm9wdGlvbnMpOgotCi0gICAgICAgICMgRklYTUU6IHNob3VsZCB0aGlzIGJlIHBsYWNlZCBvbiB0aGUgbW9kdWxlIGxldmVsIGluc3RlYWQ/Ci0gICAgICAgIGlmIFRrVmVyc2lvbiA8IDQuMjoKLSAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yKCJ0aGlzIG1vZHVsZSByZXF1aXJlcyBUayA0LjIgb3IgbmV3ZXIiKQotCiAgICAgICAgIHNlbGYubWFzdGVyICA9IG1hc3RlcgogICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCiAgICAgICAgIGlmIG5vdCBtYXN0ZXIgYW5kIG9wdGlvbnMuZ2V0KCdwYXJlbnQnKToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL2RpYWxvZy5weSBiL0xpYi90a2ludGVyL2RpYWxvZy5weQppbmRleCBiZTA4NWFiLi5mNjFjNWY3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9kaWFsb2cucHkKKysrIGIvTGliL3RraW50ZXIvZGlhbG9nLnB5CkBAIC0zLDEwICszLDcgQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgogZnJvbSB0a2ludGVyIGltcG9ydCBfY25mbWVyZ2UKIAotaWYgVGtWZXJzaW9uIDw9IDMuNjoKLSAgICBESUFMT0dfSUNPTiA9ICd3YXJuaW5nJwotZWxzZToKLSAgICBESUFMT0dfSUNPTiA9ICdxdWVzdGhlYWQnCitESUFMT0dfSUNPTiA9ICdxdWVzdGhlYWQnCiAKIAogY2xhc3MgRGlhbG9nKFdpZGdldCk6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkKaW5kZXggZGJlNWU4OC4uMzNkYzU0YSAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC9ydW50a3Rlc3RzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weQpAQCAtNyw4ICs3LDYgQEAKICIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCB1bml0dGVzdAogaW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IHRlc3Quc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkKaW5kZXggODVlZTJjNy4uOWRjMWUzNyAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9taXNjLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weQpAQCAtMTIsNiArMTIsMTQgQEAKICAgICAgICAgZiA9IHRraW50ZXIuRnJhbWUodCwgbmFtZT0nY2hpbGQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZiksICc8dGtpbnRlci5GcmFtZSBvYmplY3QgLnRvcC5jaGlsZD4nKQogCisgICAgZGVmIHRlc3RfZ2VuZXJhdGVkX25hbWVzKHNlbGYpOgorICAgICAgICB0ID0gdGtpbnRlci5Ub3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIGYgPSB0a2ludGVyLkZyYW1lKHQpCisgICAgICAgIGYyID0gdGtpbnRlci5GcmFtZSh0KQorICAgICAgICBiID0gdGtpbnRlci5CdXR0b24oZjIpCisgICAgICAgIGZvciBuYW1lIGluIHN0cihiKS5zcGxpdCgnLicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuYW1lLmlzaWRlbnRpZmllcigpLCBtc2c9cmVwcihuYW1lKSkKKwogICAgIGRlZiB0ZXN0X3RrX3NldFBhbGV0dGUoc2VsZik6CiAgICAgICAgIHJvb3QgPSBzZWxmLnJvb3QKICAgICAgICAgcm9vdC50a19zZXRQYWxldHRlKCdibGFjaycpCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3ZhcmlhYmxlcy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CmluZGV4IDFmNzQ0NTMuLjQ0ODU4MTcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CkBAIC04Nyw3ICs4Nyw4IEBACiAgICAgICAgIHYuc2V0KCJ2YWx1ZSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2LnNpZGVfZWZmZWN0KQogCi0gICAgZGVmIHRlc3RfdHJhY2Uoc2VsZik6CisgICAgZGVmIHRlc3RfdHJhY2Vfb2xkKHNlbGYpOgorICAgICAgICAjIE9sZCBpbnRlcmZhY2UKICAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCkKICAgICAgICAgdm5hbWUgPSBzdHIodikKICAgICAgICAgdHJhY2UgPSBbXQpAQCAtMTM2LDYgKzEzNyw1NSBAQAogICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd1JyldKQogCisgICAgZGVmIHRlc3RfdHJhY2Uoc2VsZik6CisgICAgICAgIHYgPSBWYXJpYWJsZShzZWxmLnJvb3QpCisgICAgICAgIHZuYW1lID0gc3RyKHYpCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVmIHJlYWRfdHJhY2VyKCphcmdzKToKKyAgICAgICAgICAgIHRyYWNlLmFwcGVuZCgoJ3JlYWQnLCkgKyBhcmdzKQorICAgICAgICBkZWYgd3JpdGVfdHJhY2VyKCphcmdzKToKKyAgICAgICAgICAgIHRyYWNlLmFwcGVuZCgoJ3dyaXRlJywpICsgYXJncykKKyAgICAgICAgdHIxID0gdi50cmFjZV9hZGQoJ3JlYWQnLCByZWFkX3RyYWNlcikKKyAgICAgICAgdHIyID0gdi50cmFjZV9hZGQoWyd3cml0ZScsICd1bnNldCddLCB3cml0ZV90cmFjZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHYudHJhY2VfaW5mbygpKSwgWworICAgICAgICAgICAgICAgICAgICAgICAgICgoJ3JlYWQnLCksIHRyMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgnd3JpdGUnLCAndW5zZXQnKSwgdHIyKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFtdKQorCisgICAgICAgIHYuc2V0KCdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd3cml0ZScpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIHYuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygncmVhZCcsIHZuYW1lLCAnJywgJ3JlYWQnKV0pCisKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICBpbmZvID0gc29ydGVkKHYudHJhY2VfaW5mbygpKQorICAgICAgICB2LnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB0cjEpICAjIFdyb25nIG1vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBpbmZvKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yKToKKyAgICAgICAgICAgIHYudHJhY2VfcmVtb3ZlKCdyZWFkJywgJ3NwYW0nKSAgIyBXcm9uZyBjb21tYW5kIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBpbmZvKQorICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFsoJ3JlYWQnLCB2bmFtZSwgJycsICdyZWFkJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgdi50cmFjZV9yZW1vdmUoJ3JlYWQnLCB0cjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi50cmFjZV9pbmZvKCksIFsoKCd3cml0ZScsICd1bnNldCcpLCB0cjIpXSkKKyAgICAgICAgdi5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGRlbCB3cml0ZV90cmFjZXIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHYuc2V0KCdlZ2dzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd3cml0ZScpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGRlbCB2CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3Vuc2V0JyldKQorCiAKIGNsYXNzIFRlc3RTdHJpbmdWYXIoVGVzdEJhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKaW5kZXggYzkyNGQ1NS4uODFiNTJlYSAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQpAQCAtOTEsOSArOTEsMTAgQEAKICAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldFsndXNlJ10sICcnKQogICAgICAgICBwYXJlbnQgPSBzZWxmLmNyZWF0ZShjb250YWluZXI9VHJ1ZSkKLSAgICAgICAgd2lkID0gcGFyZW50LndpbmZvX2lkKCkKLSAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKHVzZT13aWQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHdpZGdldDJbJ3VzZSddKSwgd2lkKQorICAgICAgICB3aWQgPSBoZXgocGFyZW50LndpbmZvX2lkKCkpCisgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHdpZD13aWQpOgorICAgICAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKHVzZT13aWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldDJbJ3VzZSddLCB3aWQpCiAKIAogQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKaW5kZXggYzY4YTY1MC4uYTFiN2NkZiAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQorKysgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CkBAIC0xLDYgKzEsNSBAQAogIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGtpbnRlcgogZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKIAogY2xhc3MgTW9ja1RrQXBwOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCA4YmQyMmQwLi4yNjc2NmE4IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQorKysgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQpAQCAtMTQ4Nyw2ICsxNDg3LDcgQEAKIAogCiAgICAgZGVmIHRlc3Rfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHYuc2VsZWN0aW9uLCAnc3BhbScpCiAgICAgICAgICMgaXRlbSAnbm9uZScgZG9lc24ndCBleGlzdAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0a2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNlbGVjdGlvbl9zZXQsICdub25lJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5zZWxlY3Rpb25fYWRkLCAnbm9uZScpCkBAIC0xNTAwLDI1ICsxNTAxLDMxIEBACiAgICAgICAgIGMzID0gc2VsZi50di5pbnNlcnQoaXRlbTEsICdlbmQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3NldCgoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGMxLCBpdGVtMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMiwpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKGMxLCBpdGVtMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGMyLCBpdGVtMikpCiAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZChpdGVtMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBjMiwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChpdGVtMSwgYzEsIGMyLCBpdGVtMikpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fcmVtb3ZlKChpdGVtMSwgYzMpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoaXRlbTEsIGMzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgYzIsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fcmVtb3ZlKGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgoYzEsIGMzKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKGMxLCBjMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywpKQogCiAgICAgICAgIHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgaWQ9J3dpdGggc3BhY2VzJykKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KCd3aXRoIHNwYWNlcycpCkBAIC0xNTM2LDYgKzE1NDMsNDAgQEAKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGInYnl0ZXNceGUyXHg4Mlx4YWMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgnYnl0ZXNceGUyXHg4Mlx4YWMnLCkpCiAKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoKSkKKworICAgICAgICAjIE9sZCBpbnRlcmZhY2UKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoKGMxLCBpdGVtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKGl0ZW0xLCBjMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgoYzEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA3KToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnRGVwcmVjYXRlZCBBUEkgb2YgVHJlZXZpZXcuc2VsZWN0aW9uKCkgc2hvdWxkIGJlIHJlbW92ZWQnKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdzZXQnLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbignYWRkJywgKGMxLCBpdGVtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdyZW1vdmUnLCAoaXRlbTEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbigndG9nZ2xlJywgKGMxLCBjMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCBpdGVtMikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZi50di5zZWxlY3Rpb24oTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxlY3Rpb24sIChjMywgaXRlbTIpKQogCiAgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnR2Wydjb2x1bW5zJ10gPSBbJ0EnLCAnQiddCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90aXgucHkgYi9MaWIvdGtpbnRlci90aXgucHkKaW5kZXggODkxMTNmZC4uMDQ0NjVhYSAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGl4LnB5CisrKyBiL0xpYi90a2ludGVyL3RpeC5weQpAQCAtMzEsMTAgKzMxLDYgQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgogZnJvbSB0a2ludGVyIGltcG9ydCBfY25mbWVyZ2UKIAotIyBXQVJOSU5HIC0gVGtWZXJzaW9uIGlzIGEgbGltaXRlZCBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi1pZiBUa1ZlcnNpb24gPCAzLjk5OToKLSAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyB2ZXJzaW9uIG9mIFRpeC5weSByZXF1aXJlcyBUayA0LjAgb3IgaGlnaGVyIikKLQogaW1wb3J0IF90a2ludGVyICMgSWYgdGhpcyBmYWlscyB5b3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrCiAKICMgU29tZSBtb3JlIGNvbnN0YW50cyAoZm9yIGNvbnNpc3RlbmN5IHdpdGggVGtpbnRlcikKQEAgLTExMTEsNyArMTEwNyw3IEBACiAKICAgICBkZWYgcGFnZXMoc2VsZik6CiAgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKLSAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhZ2VzJykpCiAgICAgICAgIHJldCA9IFtdCiAgICAgICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgICAgICAgcmV0LmFwcGVuZChzZWxmLnN1YndpZGdldCh4KSkKQEAgLTExNTcsNyArMTE1Myw3IEBACiAKICAgICBkZWYgcGFnZXMoc2VsZik6CiAgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKLSAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhZ2VzJykpCiAgICAgICAgIHJldCA9IFtdCiAgICAgICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgICAgICAgcmV0LmFwcGVuZChzZWxmLnN1YndpZGdldCh4KSkKQEAgLTE1ODAsOCArMTU3Niw3IEBACiAgICAgICAgICcnJ1JldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdob3NlIHN0YXR1cyBtYXRjaGVzIHN0YXR1cy4gSWYgc3RhdHVzIGlzCiAgICAgIG5vdCBzcGVjaWZpZWQsIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSAib24iIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkLgogICAgICBNb2RlIGNhbiBiZSBvbiwgb2ZmLCBkZWZhdWx0JycnCi0gICAgICAgIGMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0c2VsZWN0aW9uJywgbW9kZSkpCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChjKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRzZWxlY3Rpb24nLCBtb2RlKSkKIAogICAgIGRlZiBnZXRzdGF0dXMoc2VsZiwgZW50cnlwYXRoKToKICAgICAgICAgJycnUmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgZW50cnlQYXRoLicnJwpAQCAtMTkwMiw3ICsxODk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScsICdjb2x1bW4nLCBpbmRleCwKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScsICdjb2x1bW4nLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoe30sIGt3KSkpCiAKICAgICBkZWYgc2l6ZV9yb3coc2VsZiwgaW5kZXgsICoqa3cpOgpAQCAtMTkyNyw3ICsxOTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCiAgICAgICAgICAgICAgICAgICAgIHNlbGYsICdzaXplJywgJ3JvdycsIGluZGV4LCAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKIAogICAgIGRlZiB1bnNldChzZWxmLCB4LCB5KToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3R0ay5weSBiL0xpYi90a2ludGVyL3R0ay5weQppbmRleCBmNGE2ZDhjLi5jNDc0ZTYwIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90dGsucHkKKysrIGIvTGliL3RraW50ZXIvdHRrLnB5CkBAIC0yOCw2ICsyOCw4IEBACiBpbXBvcnQgdGtpbnRlcgogZnJvbSB0a2ludGVyIGltcG9ydCBfZmxhdHRlbiwgX2pvaW4sIF9zdHJpbmdpZnksIF9zcGxpdGRpY3QKIAorX3NlbnRpbmVsID0gb2JqZWN0KCkKKwogIyBWZXJpZnkgaWYgVGsgaXMgbmV3IGVub3VnaCB0byBub3QgbmVlZCB0aGUgVGlsZSBwYWNrYWdlCiBfUkVRVUlSRV9USUxFID0gVHJ1ZSBpZiB0a2ludGVyLlRrVmVyc2lvbiA8IDguNSBlbHNlIEZhbHNlCiAKQEAgLTM4MSw3ICszODMsOSBAQAogICAgICAgICBhIHNlcXVlbmNlIGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24uIiIiCiAgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W3F1ZXJ5X29wdF0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX25hbWUsICJjb25maWd1cmUiLCBzdHlsZSkKKyAgICAgICAgcmVzdWx0ID0gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl9uYW1lLCAiY29uZmlndXJlIiwgc3R5bGUpCisgICAgICAgIGlmIHJlc3VsdCBvciBxdWVyeV9vcHQ6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAKIAogICAgIGRlZiBtYXAoc2VsZiwgc3R5bGUsIHF1ZXJ5X29wdD1Ob25lLCAqKmt3KToKQEAgLTQ2NiwxMiArNDcwLDE0IEBACiAKICAgICBkZWYgZWxlbWVudF9uYW1lcyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHRoZW1lLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikpCisgICAgICAgIHJldHVybiB0dXBsZShuLmxzdHJpcCgnLScpIGZvciBuIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikpKQogCiAKICAgICBkZWYgZWxlbWVudF9vcHRpb25zKHNlbGYsIGVsZW1lbnRuYW1lKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRuYW1lJ3Mgb3B0aW9ucy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpKQorICAgICAgICByZXR1cm4gdHVwbGUoby5sc3RyaXAoJy0nKSBmb3IgbyBpbiBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpKSkKIAogCiAgICAgZGVmIHRoZW1lX2NyZWF0ZShzZWxmLCB0aGVtZW5hbWUsIHBhcmVudD1Ob25lLCBzZXR0aW5ncz1Ob25lKToKQEAgLTEzOTAsMzEgKzEzOTYsNTMgQEAKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZWUiLCBpdGVtKQogCiAKLSAgICBkZWYgc2VsZWN0aW9uKHNlbGYsIHNlbG9wPU5vbmUsIGl0ZW1zPU5vbmUpOgotICAgICAgICAiIiJJZiBzZWxvcCBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHNlbGVjdGVkIGl0ZW1zLiIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zLCAoc3RyLCBieXRlcykpOgotICAgICAgICAgICAgaXRlbXMgPSAoaXRlbXMsKQorICAgIGRlZiBzZWxlY3Rpb24oc2VsZiwgc2Vsb3A9X3NlbnRpbmVsLCBpdGVtcz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgdHVwbGUgb2Ygc2VsZWN0ZWQgaXRlbXMuIiIiCisgICAgICAgIGlmIHNlbG9wIGlzIF9zZW50aW5lbDoKKyAgICAgICAgICAgIHNlbG9wID0gTm9uZQorICAgICAgICBlbGlmIHNlbG9wIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoZSBzZWxvcD1Ob25lIGFyZ3VtZW50IG9mIHNlbGVjdGlvbigpIGlzIGRlcHJlY2F0ZWQgIgorICAgICAgICAgICAgICAgICJhbmQgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjciLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMykKKyAgICAgICAgZWxpZiBzZWxvcCBpbiAoJ3NldCcsICdhZGQnLCAncmVtb3ZlJywgJ3RvZ2dsZScpOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJUaGUgc2Vsb3AgYXJndW1lbnQgb2Ygc2VsZWN0aW9uKCkgaXMgZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgImFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNywgIgorICAgICAgICAgICAgICAgICJ1c2Ugc2VsZWN0aW9uXyVzKCkgaW5zdGVhZCIgJSAoc2Vsb3AsKSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdGlvbicpCiAgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlbGVjdGlvbiIsIHNlbG9wLCBpdGVtcykpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiaXRlbXMgYmVjb21lcyB0aGUgbmV3IHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInNldCIsIGl0ZW1zKQorICAgIGRlZiBfc2VsZWN0aW9uKHNlbGYsIHNlbG9wLCBpdGVtcyk6CisgICAgICAgIGlmIGxlbihpdGVtcykgPT0gMSBhbmQgaXNpbnN0YW5jZShpdGVtc1swXSwgKHR1cGxlLCBsaXN0KSk6CisgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zWzBdCisKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZWxlY3Rpb24iLCBzZWxvcCwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fYWRkKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIHRoZSBzZWxlY3Rpb24uIiIiCi0gICAgICAgIHNlbGYuc2VsZWN0aW9uKCJhZGQiLCBpdGVtcykKKyAgICBkZWYgc2VsZWN0aW9uX3NldChzZWxmLCAqaXRlbXMpOgorICAgICAgICAiIiJUaGUgc3BlY2lmaWVkIGl0ZW1zIGJlY29tZXMgdGhlIG5ldyBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigic2V0IiwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fcmVtb3ZlKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInJlbW92ZSIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fYWRkKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIkFkZCBhbGwgb2YgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc2VsZWN0aW9uLiIiIgorICAgICAgICBzZWxmLl9zZWxlY3Rpb24oImFkZCIsIGl0ZW1zKQogCiAKLSAgICBkZWYgc2VsZWN0aW9uX3RvZ2dsZShzZWxmLCBpdGVtcyk6Ci0gICAgICAgICIiIlRvZ2dsZSB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggaXRlbSBpbiBpdGVtcy4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInRvZ2dsZSIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fcmVtb3ZlKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlJlbW92ZSBhbGwgb2YgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigicmVtb3ZlIiwgaXRlbXMpCisKKworICAgIGRlZiBzZWxlY3Rpb25fdG9nZ2xlKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlRvZ2dsZSB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggc3BlY2lmaWVkIGl0ZW0uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigidG9nZ2xlIiwgaXRlbXMpCiAKIAogICAgIGRlZiBzZXQoc2VsZiwgaXRlbSwgY29sdW1uPU5vbmUsIHZhbHVlPU5vbmUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rva2VuaXplLnB5IGIvTGliL3Rva2VuaXplLnB5CmluZGV4IGIxZDBjODMuLmVjNzllYzggMTAwNjQ0Ci0tLSBhL0xpYi90b2tlbml6ZS5weQorKysgYi9MaWIvdG9rZW5pemUucHkKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSBpbyBpbXBvcnQgVGV4dElPV3JhcHBlcgogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCitpbXBvcnQgaXRlcnRvb2xzIGFzIF9pdGVydG9vbHMKIGltcG9ydCByZQogaW1wb3J0IHN5cwogZnJvbSB0b2tlbiBpbXBvcnQgKgpAQCAtMTMxLDcgKzEzMiwyOCBAQAogSW1hZ251bWJlciA9IGdyb3VwKHInWzAtOV0rW2pKXScsIEZsb2F0bnVtYmVyICsgcidbakpdJykKIE51bWJlciA9IGdyb3VwKEltYWdudW1iZXIsIEZsb2F0bnVtYmVyLCBJbnRudW1iZXIpCiAKLVN0cmluZ1ByZWZpeCA9IHInKD86W2JCXVtyUl0/fFtyUl1bYkJdP3xbdVVdKT8nCisjIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nLCBwbHVzIGFsbCBvZiB0aGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLgorZGVmIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgIyBUaGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLiBPbmx5IGNvbnRhaW4gdGhlIGxvd2VyIGNhc2UgdmVyc2lvbnMsCisgICAgIyAgYW5kIGRvbid0IGNvbnRhaW4gYW55IHBlcm11YXRpb25zIChpbmNsdWRlICdmcicsIGJ1dCBub3QKKyAgICAjICAncmYnKS4gVGhlIHZhcmlvdXMgcGVybXV0YXRpb25zIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgIF92YWxpZF9zdHJpbmdfcHJlZml4ZXMgPSBbJ2InLCAncicsICd1JywgJ2YnLCAnYnInLCAnZnInXQorICAgICMgaWYgd2UgYWRkIGJpbmFyeSBmLXN0cmluZ3MsIGFkZDogWydmYicsICdmYnInXQorICAgIHJlc3VsdCA9IHNldChbJyddKQorICAgIGZvciBwcmVmaXggaW4gX3ZhbGlkX3N0cmluZ19wcmVmaXhlczoKKyAgICAgICAgZm9yIHQgaW4gX2l0ZXJ0b29scy5wZXJtdXRhdGlvbnMocHJlZml4KToKKyAgICAgICAgICAgICMgY3JlYXRlIGEgbGlzdCB3aXRoIHVwcGVyIGFuZCBsb3dlciB2ZXJzaW9ucyBvZiBlYWNoCisgICAgICAgICAgICAjICBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGZvciB1IGluIF9pdGVydG9vbHMucHJvZHVjdCgqWyhjLCBjLnVwcGVyKCkpIGZvciBjIGluIHRdKToKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCcnLmpvaW4odSkpCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgX2NvbXBpbGUoZXhwcik6CisgICAgcmV0dXJuIHJlLmNvbXBpbGUoZXhwciwgcmUuVU5JQ09ERSkKKworIyBOb3RlIHRoYXQgc2luY2UgX2FsbF9zdHJpbmdfcHJlZml4ZXMgaW5jbHVkZXMgdGhlIGVtcHR5IHN0cmluZywKKyMgIFN0cmluZ1ByZWZpeCBjYW4gYmUgdGhlIGVtcHR5IHN0cmluZyAobWFraW5nIGl0IG9wdGlvbmFsKS4KK1N0cmluZ1ByZWZpeCA9IGdyb3VwKCpfYWxsX3N0cmluZ19wcmVmaXhlcygpKQogCiAjIFRhaWwgZW5kIG9mICcgc3RyaW5nLgogU2luZ2xlID0gciJbXidcXF0qKD86XFwuW14nXFxdKikqJyIKQEAgLTE2OSw1MCArMTkxLDI1IEBACiBQc2V1ZG9FeHRyYXMgPSBncm91cChyJ1xcXHI/XG58XFonLCBDb21tZW50LCBUcmlwbGUpCiBQc2V1ZG9Ub2tlbiA9IFdoaXRlc3BhY2UgKyBncm91cChQc2V1ZG9FeHRyYXMsIE51bWJlciwgRnVubnksIENvbnRTdHIsIE5hbWUpCiAKLWRlZiBfY29tcGlsZShleHByKToKLSAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorIyBGb3IgYSBnaXZlbiBzdHJpbmcgcHJlZml4IHBsdXMgcXVvdGVzLCBlbmRwYXRzIG1hcHMgaXQgdG8gYSByZWdleAorIyAgdG8gbWF0Y2ggdGhlIHJlbWFpbmRlciBvZiB0aGF0IHN0cmluZy4gX3ByZWZpeCBjYW4gYmUgZW1wdHksIGZvcgorIyAgYSBub3JtYWwgc2luZ2xlIG9yIHRyaXBsZSBxdW90ZWQgc3RyaW5nICh3aXRoIG5vIHByZWZpeCkuCitlbmRwYXRzID0ge30KK2ZvciBfcHJlZml4IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZW5kcGF0c1tfcHJlZml4ICsgIiciXSA9IFNpbmdsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICciJ10gPSBEb3VibGUKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJycnIl0gPSBTaW5nbGUzCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyIiIiddID0gRG91YmxlMwogCi1lbmRwYXRzID0geyInIjogU2luZ2xlLCAnIic6IERvdWJsZSwKLSAgICAgICAgICAgIicnJyI6IFNpbmdsZTMsICciIiInOiBEb3VibGUzLAotICAgICAgICAgICAicicnJyI6IFNpbmdsZTMsICdyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImInJyciOiBTaW5nbGUzLCAnYiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJSJycnIjogU2luZ2xlMywgJ1IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQicnJyI6IFNpbmdsZTMsICdCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJyJycnIjogU2luZ2xlMywgJ2JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJSJycnIjogU2luZ2xlMywgJ2JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJyJycnIjogU2luZ2xlMywgJ0JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJSJycnIjogU2luZ2xlMywgJ0JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJiJycnIjogU2luZ2xlMywgJ3JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJiJycnIjogU2luZ2xlMywgJ1JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJCJycnIjogU2luZ2xlMywgJ3JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJCJycnIjogU2luZ2xlMywgJ1JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInUnJyciOiBTaW5nbGUzLCAndSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJVJycnIjogU2luZ2xlMywgJ1UiIiInOiBEb3VibGUzLAotICAgICAgICAgICAncic6IE5vbmUsICdSJzogTm9uZSwgJ2InOiBOb25lLCAnQic6IE5vbmUsCi0gICAgICAgICAgICd1JzogTm9uZSwgJ1UnOiBOb25lfQotCi10cmlwbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJycnIiwgJyIiIicsCi0gICAgICAgICAgInInJyciLCAnciIiIicsICJSJycnIiwgJ1IiIiInLAotICAgICAgICAgICJiJycnIiwgJ2IiIiInLCAiQicnJyIsICdCIiIiJywKLSAgICAgICAgICAiYnInJyciLCAnYnIiIiInLCAiQnInJyciLCAnQnIiIiInLAotICAgICAgICAgICJiUicnJyIsICdiUiIiIicsICJCUicnJyIsICdCUiIiIicsCi0gICAgICAgICAgInJiJycnIiwgJ3JiIiIiJywgInJCJycnIiwgJ3JCIiIiJywKLSAgICAgICAgICAiUmInJyciLCAnUmIiIiInLCAiUkInJyciLCAnUkIiIiInLAotICAgICAgICAgICJ1JycnIiwgJ3UiIiInLCAiVScnJyIsICdVIiIiJywKLSAgICAgICAgICApOgotICAgIHRyaXBsZV9xdW90ZWRbdF0gPSB0Ci1zaW5nbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJyIsICciJywKLSAgICAgICAgICAiciciLCAnciInLCAiUiciLCAnUiInLAotICAgICAgICAgICJiJyIsICdiIicsICJCJyIsICdCIicsCi0gICAgICAgICAgImJyJyIsICdiciInLCAiQnInIiwgJ0JyIicsCi0gICAgICAgICAgImJSJyIsICdiUiInLCAiQlInIiwgJ0JSIicgLAotICAgICAgICAgICJyYiciLCAncmIiJywgInJCJyIsICdyQiInLAotICAgICAgICAgICJSYiciLCAnUmIiJywgIlJCJyIsICdSQiInICwKLSAgICAgICAgICAidSciLCAndSInLCAiVSciLCAnVSInLAotICAgICAgICAgICk6Ci0gICAgc2luZ2xlX3F1b3RlZFt0XSA9IHQKKyMgQSBzZXQgb2YgYWxsIG9mIHRoZSBzaW5nbGUgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5nIHByZWZpeGVzLAorIyAgaW5jbHVkaW5nIHRoZSBvcGVuaW5nIHF1b3Rlcy4KK3NpbmdsZV9xdW90ZWQgPSBzZXQoKQordHJpcGxlX3F1b3RlZCA9IHNldCgpCitmb3IgdCBpbiBfYWxsX3N0cmluZ19wcmVmaXhlcygpOgorICAgIGZvciB1IGluICh0ICsgJyInLCB0ICsgIiciKToKKyAgICAgICAgc2luZ2xlX3F1b3RlZC5hZGQodSkKKyAgICBmb3IgdSBpbiAodCArICciIiInLCB0ICsgIicnJyIpOgorICAgICAgICB0cmlwbGVfcXVvdGVkLmFkZCh1KQogCiB0YWJzaXplID0gOAogCkBAIC02MjYsNiArNjIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YXNoZWQKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoZWQgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhDT01NRU5ULCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gaW4gdHJpcGxlX3F1b3RlZDoKICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSwgcG9zKQpAQCAtNjM4LDE5ICs2MzYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBsaW5lW3N0YXJ0Ol0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvciBcCi0gICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQ6CisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHVwIHRvIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZSB0b2tlbiB0byBzZWUgaWYKKyAgICAgICAgICAgICAgICAjICB0aGV5J3JlIGluIHRoZSBzaW5nbGVfcXVvdGVkIHNldC4gSWYgc28sIHRoZXkgc3RhcnQKKyAgICAgICAgICAgICAgICAjICBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAjIFdlJ3JlIHVzaW5nIHRoZSBmaXJzdCAzLCBiZWNhdXNlIHdlJ3JlIGxvb2tpbmcgZm9yCisgICAgICAgICAgICAgICAgIyAgInJiJyIgKGZvciBleGFtcGxlKSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRva2VuLiBJZgorICAgICAgICAgICAgICAgICMgIHdlIHN3aXRjaCB0byBsb25nZXIgcHJlZml4ZXMsIHRoaXMgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgICAgICAjICBhZGp1c3RlZC4KKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCBpbml0aWFsID09IHRva2VuWzoxXS4KKyAgICAgICAgICAgICAgICAjIEFsc28gbm90ZSB0aGF0IHNpbmdsZSBxdW90ZSBjaGVja2luZyBtdXN0IGNvbWUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAjICB0cmlwbGUgcXVvdGUgY2hlY2tpbmcgKGFib3ZlKS4KKyAgICAgICAgICAgICAgICBlbGlmIChpbml0aWFsIGluIHNpbmdsZV9xdW90ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICB0b2tlbls6Ml0gaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzozXSBpbiBzaW5nbGVfcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bLTFdID09ICdcbic6ICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCA9IChsbnVtLCBzdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzW2luaXRpYWxdIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0c1t0b2tlblsxXV0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzJdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQWdhaW4sIHVzaW5nIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgdG9rZW4uIFRoaXMgaXMgbG9va2luZyBmb3IgdGhlIG1hdGNoaW5nIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgIyAgcmVnZXggZm9yIHRoZSBjb3JyZWN0IHR5cGUgb2YgcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGNoYXJhY3Rlci4gU28gaXQncyByZWFsbHkgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGVuZHBhdHNbIiciXSBvciBlbmRwYXRzWyciJ10sIGJ5IHRyeWluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIyAgc2tpcCBzdHJpbmcgcHJlZml4IGNoYXJhY3RlcnMsIGlmIGFueS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzLmdldChpbml0aWFsKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzFdKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gbGluZVtzdGFydDpdLCAxCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JkaW5hcnkgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBUb2tlbkluZm8oU1RSSU5HLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbC5pc2lkZW50aWZpZXIoKTogICAgICAgICAgICAgICAjIG9yZGluYXJ5IG5hbWUKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4gaW4gKCdhc3luYycsICdhd2FpdCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXN5bmNfZGVmOgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlLnB5IGIvTGliL3RyYWNlLnB5CmluZGV4IGYxMDgyNjYuLmFlMTU0NjEgMTAwNzU1Ci0tLSBhL0xpYi90cmFjZS5weQorKysgYi9MaWIvdHJhY2UucHkKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBjb3ZlcmRpcj0iL3RtcCIpCiAiIiIKIF9fYWxsX18gPSBbJ1RyYWNlJywgJ0NvdmVyYWdlUmVzdWx0cyddCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBvcwogaW1wb3J0IHJlCkBAIC01OCw3ICs1OSw2IEBACiBpbXBvcnQgZ2MKIGltcG9ydCBkaXMKIGltcG9ydCBwaWNrbGUKLWZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4gYXMgX3dhcm4KIGZyb20gdGltZSBpbXBvcnQgbW9ub3RvbmljIGFzIF90aW1lCiAKIHRyeToKQEAgLTc3LDUxICs3Nyw2IEBACiAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQogICAgICAgICB0aHJlYWRpbmcuc2V0dHJhY2UoTm9uZSkKIAotZGVmIF91c2FnZShvdXRmaWxlKToKLSAgICBvdXRmaWxlLndyaXRlKCIiIlVzYWdlOiAlcyBbT1BUSU9OU10gPGZpbGU+IFtBUkdTXQotCi1NZXRhLW9wdGlvbnM6Ci0tLWhlbHAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgdGhlbiBleGl0LgotLS12ZXJzaW9uICAgICAgICAgICAgIE91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIHRoZW4gZXhpdC4KLQotT3RoZXJ3aXNlLCBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIG9wdGlvbnMgbXVzdCBiZSBnaXZlbjoKLS10LCAtLXRyYWNlICAgICAgICAgICBQcmludCBlYWNoIGxpbmUgdG8gc3lzLnN0ZG91dCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0tYywgLS1jb3VudCAgICAgICAgICAgQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgdGhlIGNvdW50cyB0byA8bW9kdWxlPi5jb3ZlciBmb3IgZWFjaAotICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBleGVjdXRlZCwgaW4gdGhlIG1vZHVsZSdzIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyBgLS1jb3ZlcmRpcicsIGAtLWZpbGUnLCBgLS1uby1yZXBvcnQnIGJlbG93LgotLWwsIC0tbGlzdGZ1bmNzICAgICAgIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgIG9uY2UgYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIHN5cy5zdGRvdXQgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy4KLS1ULCAtLXRyYWNrY2FsbHMgICAgICBLZWVwIHRyYWNrIG9mIGNhbGxlci9jYWxsZWQgcGFpcnMgYW5kIHdyaXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4KLS1yLCAtLXJlcG9ydCAgICAgICAgICBHZW5lcmF0ZSBhIHJlcG9ydCBmcm9tIGEgY291bnRzIGZpbGU7IGRvIG5vdCBleGVjdXRlCi0gICAgICAgICAgICAgICAgICAgICAgYW55IGNvZGUuICBgLS1maWxlJyBtdXN0IHNwZWNpZnkgdGhlIHJlc3VsdHMgZmlsZSB0bwotICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIHdoaWNoIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4KLSAgICAgICAgICAgICAgICAgICAgICB3aXRoIGAtLWNvdW50IC0tZmlsZT1GSUxFJy4KLQotTW9kaWZpZXJzOgotLWYsIC0tZmlsZT08ZmlsZT4gICAgIEZpbGUgdG8gYWNjdW11bGF0ZSBjb3VudHMgb3ZlciBzZXZlcmFsIHJ1bnMuCi0tUiwgLS1uby1yZXBvcnQgICAgICAgRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY3VtdWxhdGUgb3ZlciBzZXZlcmFsIHJ1bnMuCi0tQywgLS1jb3ZlcmRpcj08ZGlyPiAgRGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgZmlsZXMuICBUaGUgY292ZXJhZ2UKLSAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgZm9yIDxwYWNrYWdlPi48bW9kdWxlPiBpcyB3cml0dGVuIHRvIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICA8ZGlyPi88cGFja2FnZT4vPG1vZHVsZT4uY292ZXIuCi0tbSwgLS1taXNzaW5nICAgICAgICAgQW5ub3RhdGUgZXhlY3V0YWJsZSBsaW5lcyB0aGF0IHdlcmUgbm90IGV4ZWN1dGVkCi0gICAgICAgICAgICAgICAgICAgICAgd2l0aCAnPj4+Pj4+ICcuCi0tcywgLS1zdW1tYXJ5ICAgICAgICAgV3JpdGUgYSBicmllZiBzdW1tYXJ5IG9uIHN0ZG91dCBmb3IgZWFjaCBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgIChDYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydC4pCi0tZywgLS10aW1pbmcgICAgICAgICAgUHJlZml4IGVhY2ggbGluZSB3aXRoIHRoZSB0aW1lIHNpbmNlIHRoZSBwcm9ncmFtIHN0YXJ0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIHdoaWxlIHRyYWNpbmcuCi0KLUZpbHRlcnMsIG1heSBiZSByZXBlYXRlZCBtdWx0aXBsZSB0aW1lczoKLS0taWdub3JlLW1vZHVsZT08bW9kPiBJZ25vcmUgdGhlIGdpdmVuIG1vZHVsZShzKSBhbmQgaXRzIHN1Ym1vZHVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAoaWYgaXQgaXMgYSBwYWNrYWdlKS4gIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgbGlzdCBvZiBtb2R1bGUgbmFtZXMKLS0taWdub3JlLWRpcj08ZGlyPiAgICBJZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAobXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjYW4gYmUgam9pbmVkIGJ5IG9zLnBhdGhzZXApLgotIiIiICUgc3lzLmFyZ3ZbMF0pCi0KIFBSQUdNQV9OT0NPVkVSID0gIiNwcmFnbWEgTk8gQ09WRVIiCiAKICMgU2ltcGxlIHJ4IHRvIGZpbmQgbGluZXMgd2l0aCBubyBjb2RlLgpAQCAtMjY1LDcgKzIyMCwxMyBAQAogCiAgICAgZGVmIHdyaXRlX3Jlc3VsdHMoc2VsZiwgc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9RmFsc2UsIGNvdmVyZGlyPU5vbmUpOgogICAgICAgICAiIiIKLSAgICAgICAgQHBhcmFtIGNvdmVyZGlyCisgICAgICAgIFdyaXRlIHRoZSBjb3ZlcmFnZSByZXN1bHRzLgorCisgICAgICAgIDpwYXJhbSBzaG93X21pc3Npbmc6IFNob3cgbGluZXMgdGhhdCBoYWQgbm8gaGl0cy4KKyAgICAgICAgOnBhcmFtIHN1bW1hcnk6IEluY2x1ZGUgY292ZXJhZ2Ugc3VtbWFyeSBwZXIgbW9kdWxlLgorICAgICAgICA6cGFyYW0gY292ZXJkaXI6IElmIE5vbmUsIHRoZSByZXN1bHRzIG9mIGVhY2ggbW9kdWxlIGFyZSBwbGFjZWQgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuY2FsbGVkZnVuY3M6CiAgICAgICAgICAgICBwcmludCgpCkBAIC02NDcsMjEwICs2MDgsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkZnVuY3M9c2VsZi5fY2FsbGVkZnVuY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycz1zZWxmLl9jYWxsZXJzKQogCi1kZWYgX2Vycl9leGl0KG1zZyk6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQotICAgIHN5cy5leGl0KDEpCitkZWYgbWFpbigpOgogCi1kZWYgbWFpbihhcmd2PU5vbmUpOgotICAgIGltcG9ydCBnZXRvcHQKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywgdmVyc2lvbj0ndHJhY2UgMi4wJykKIAotICAgIGlmIGFyZ3YgaXMgTm9uZToKLSAgICAgICAgYXJndiA9IHN5cy5hcmd2CisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTWFpbiBvcHRpb25zJywKKyAgICAgICAgICAgICdPbmUgb2YgdGhlc2UgKG9yIC0tcmVwb3J0KSBtdXN0IGJlIGdpdmVuJykKKworICAgIGdycC5hZGRfYXJndW1lbnQoJy1jJywgJy0tY291bnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQgYW5kIHdyaXRlICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBjb3VudHMgdG8gPG1vZHVsZT4uY292ZXIgZm9yIGVhY2ggbW9kdWxlIGV4ZWN1dGVkLCBpbiAnCisgICAgICAgICAgICAgICAgICd0aGUgbW9kdWxlXCdzIGRpcmVjdG9yeS4gU2VlIGFsc28gLS1jb3ZlcmRpciwgLS1maWxlLCAnCisgICAgICAgICAgICAgICAgICctLW5vLXJlcG9ydCBiZWxvdy4nKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy10JywgJy0tdHJhY2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nUHJpbnQgZWFjaCBsaW5lIHRvIHN5cy5zdGRvdXQgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctbCcsICctLWxpc3RmdW5jcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdLZWVwIHRyYWNrIG9mIHdoaWNoIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSAnCisgICAgICAgICAgICAgICAgICdhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4gJworICAgICAgICAgICAgICAgICAnQ2Fubm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgLS10cmFjZSBvciAtLWNvdW50LicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLVQnLCAnLS10cmFja2NhbGxzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0tlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gJworICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4nKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTW9kaWZpZXJzJykKKworICAgIF9ncnAgPSBncnAuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgX2dycC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmVwb3J0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0dlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG9lcyBub3QgZXhlY3V0ZSBhbnkgJworICAgICAgICAgICAgICAgICAnY29kZS4gLS1maWxlIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvIHJlYWQsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ211c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4gd2l0aCAtLWNvdW50ICcKKyAgICAgICAgICAgICAgICAgJy0tZmlsZT1GSUxFJykKKyAgICBfZ3JwLmFkZF9hcmd1bWVudCgnLVInLCAnLS1uby1yZXBvcnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuICcKKyAgICAgICAgICAgICAgICAgJ1VzZWZ1bCBpZiB5b3Ugd2FudCB0byBhY2N1bXVsYXRlIG92ZXIgc2V2ZXJhbCBydW5zLicpCisKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZicsICctLWZpbGUnLAorICAgICAgICAgICAgaGVscD0nRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLUMnLCAnLS1jb3ZlcmRpcicsCisgICAgICAgICAgICBoZWxwPSdEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcyBnby4gVGhlIGNvdmVyYWdlIHJlcG9ydCAnCisgICAgICAgICAgICAgICAgICdmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IHdpbGwgYmUgd3JpdHRlbiB0byBmaWxlICcKKyAgICAgICAgICAgICAgICAgJzxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3ZlcicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1taXNzaW5nJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0Fubm90YXRlIGV4ZWN1dGFibGUgbGluZXMgdGhhdCB3ZXJlIG5vdCBleGVjdXRlZCB3aXRoICcKKyAgICAgICAgICAgICAgICAgJyI+Pj4+Pj4gIicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zdW1tYXJ5JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J1dyaXRlIGEgYnJpZWYgc3VtbWFyeSBmb3IgZWFjaCBmaWxlIHRvIHN5cy5zdGRvdXQuICcKKyAgICAgICAgICAgICAgICAgJ0NhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0JykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZycsICctLXRpbWluZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4gJworICAgICAgICAgICAgICAgICAnT25seSB1c2VkIHdoaWxlIHRyYWNpbmcnKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnRmlsdGVycycsCisgICAgICAgICAgICAnQ2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtbW9kdWxlJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBnaXZlbiBtb2R1bGUocykgYW5kIGl0cyBzdWJtb2R1bGVzJworICAgICAgICAgICAgICAgICAnKGlmIGl0IGlzIGEgcGFja2FnZSkuIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgJworICAgICAgICAgICAgICAgICAnbW9kdWxlIG5hbWVzLicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtZGlyJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgJworICAgICAgICAgICAgICAgICAnKG11bHRpcGxlIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGVuYW1lJywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgaGVscD0nZmlsZSB0byBydW4gYXMgbWFpbiBwcm9ncmFtJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmd1bWVudHMnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0nKQorCisgICAgb3B0cyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdHMuaWdub3JlX2RpcjoKKyAgICAgICAgcmVsX3BhdGggPSAnbGliJywgJ3B5dGhvbnswLm1ham9yfS57MC5taW5vcn0nLmZvcm1hdChzeXMudmVyc2lvbl9pbmZvKQorICAgICAgICBfcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgKnJlbF9wYXRoKQorICAgICAgICBfZXhlY19wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfZXhlY19wcmVmaXgsICpyZWxfcGF0aCkKKworICAgIGRlZiBwYXJzZV9pZ25vcmVfZGlyKHMpOgorICAgICAgICBzID0gb3MucGF0aC5leHBhbmR1c2VyKG9zLnBhdGguZXhwYW5kdmFycyhzKSkKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnJHByZWZpeCcsIF9wcmVmaXgpLnJlcGxhY2UoJyRleGVjX3ByZWZpeCcsIF9leGVjX3ByZWZpeCkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgocykKKworICAgIG9wdHMuaWdub3JlX21vZHVsZSA9IFttb2Quc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBvcHRzLmlnbm9yZV9tb2R1bGUgZm9yIG1vZCBpbiBpLnNwbGl0KCcsJyldCisgICAgb3B0cy5pZ25vcmVfZGlyID0gW3BhcnNlX2lnbm9yZV9kaXIocykKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gb3B0cy5pZ25vcmVfZGlyIGZvciBzIGluIGkuc3BsaXQob3MucGF0aHNlcCldCisKKyAgICBpZiBvcHRzLnJlcG9ydDoKKyAgICAgICAgaWYgbm90IG9wdHMuZmlsZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcignLXIvLS1yZXBvcnQgcmVxdWlyZXMgLWYvLS1maWxlJykKKyAgICAgICAgcmVzdWx0cyA9IENvdmVyYWdlUmVzdWx0cyhpbmZpbGU9b3B0cy5maWxlLCBvdXRmaWxlPW9wdHMuZmlsZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhvcHRzLm1pc3NpbmcsIG9wdHMuc3VtbWFyeSwgb3B0cy5jb3ZlcmRpcikKKworICAgIGlmIG5vdCBhbnkoW29wdHMudHJhY2UsIG9wdHMuY291bnQsIG9wdHMubGlzdGZ1bmNzLCBvcHRzLnRyYWNrY2FsbHNdKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCdtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAnCisgICAgICAgICAgICAgICAgICAgICAnLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscycpCisKKyAgICBpZiBvcHRzLmxpc3RmdW5jcyBhbmQgKG9wdHMuY291bnQgb3Igb3B0cy50cmFjZSk6CisgICAgICAgIHBhcnNlci5lcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCknKQorCisgICAgaWYgb3B0cy5zdW1tYXJ5IGFuZCBub3Qgb3B0cy5jb3VudDoKKyAgICAgICAgcGFyc2VyLmVycm9yKCctLXN1bW1hcnkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnKQorCisgICAgaWYgb3B0cy5maWxlbmFtZSBpcyBOb25lOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ2ZpbGVuYW1lIGlzIG1pc3Npbmc6IHJlcXVpcmVkIHdpdGggdGhlIG1haW4gb3B0aW9ucycpCisKKyAgICBzeXMuYXJndiA9IG9wdHMuZmlsZW5hbWUsICpvcHRzLmFyZ3VtZW50cworICAgIHN5cy5wYXRoWzBdID0gb3MucGF0aC5kaXJuYW1lKG9wdHMuZmlsZW5hbWUpCisKKyAgICB0ID0gVHJhY2Uob3B0cy5jb3VudCwgb3B0cy50cmFjZSwgY291bnRmdW5jcz1vcHRzLmxpc3RmdW5jcywKKyAgICAgICAgICAgICAgY291bnRjYWxsZXJzPW9wdHMudHJhY2tjYWxscywgaWdub3JlbW9kcz1vcHRzLmlnbm9yZV9tb2R1bGUsCisgICAgICAgICAgICAgIGlnbm9yZWRpcnM9b3B0cy5pZ25vcmVfZGlyLCBpbmZpbGU9b3B0cy5maWxlLAorICAgICAgICAgICAgICBvdXRmaWxlPW9wdHMuZmlsZSwgdGltaW5nPW9wdHMudGltaW5nKQogICAgIHRyeToKLSAgICAgICAgb3B0cywgcHJvZ19hcmd2ID0gZ2V0b3B0LmdldG9wdChhcmd2WzE6XSwgInRjclJmOmQ6bXNDOmxUZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxwIiwgInZlcnNpb24iLCAidHJhY2UiLCAiY291bnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwb3J0IiwgIm5vLXJlcG9ydCIsICJzdW1tYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU9IiwgIm1pc3NpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlLW1vZHVsZT0iLCAiaWdub3JlLWRpcj0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY292ZXJkaXI9IiwgImxpc3RmdW5jcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja2NhbGxzIiwgInRpbWluZyJdKQorICAgICAgICB3aXRoIG9wZW4ob3B0cy5maWxlbmFtZSkgYXMgZnA6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIG9wdHMuZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgIyB0cnkgdG8gZW11bGF0ZSBfX21haW5fXyBuYW1lc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICdfX2ZpbGVfXyc6IG9wdHMuZmlsZW5hbWUsCisgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAorICAgICAgICAgICAgJ19fcGFja2FnZV9fJzogTm9uZSwKKyAgICAgICAgICAgICdfX2NhY2hlZF9fJzogTm9uZSwKKyAgICAgICAgfQorICAgICAgICB0LnJ1bmN0eChjb2RlLCBnbG9icywgZ2xvYnMpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICBzeXMuZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcwogCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlc1xuIiAlIChzeXMuYXJndlswXSwgbXNnKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVHJ5IGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSBzeXMuYXJndlswXSkKLSAgICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXN1bHRzID0gdC5yZXN1bHRzKCkKIAotICAgIHRyYWNlID0gMAotICAgIGNvdW50ID0gMAotICAgIHJlcG9ydCA9IDAKLSAgICBub19yZXBvcnQgPSAwCi0gICAgY291bnRzX2ZpbGUgPSBOb25lCi0gICAgbWlzc2luZyA9IDAKLSAgICBpZ25vcmVfbW9kdWxlcyA9IFtdCi0gICAgaWdub3JlX2RpcnMgPSBbXQotICAgIGNvdmVyZGlyID0gTm9uZQotICAgIHN1bW1hcnkgPSAwCi0gICAgbGlzdGZ1bmNzID0gRmFsc2UKLSAgICBjb3VudGNhbGxlcnMgPSBGYWxzZQotICAgIHRpbWluZyA9IEZhbHNlCi0KLSAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0ID09ICItLWhlbHAiOgotICAgICAgICAgICAgX3VzYWdlKHN5cy5zdGRvdXQpCi0gICAgICAgICAgICBzeXMuZXhpdCgwKQotCi0gICAgICAgIGlmIG9wdCA9PSAiLS12ZXJzaW9uIjoKLSAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInRyYWNlIDIuMFxuIikKLSAgICAgICAgICAgIHN5cy5leGl0KDApCi0KLSAgICAgICAgaWYgb3B0ID09ICItVCIgb3Igb3B0ID09ICItLXRyYWNrY2FsbHMiOgotICAgICAgICAgICAgY291bnRjYWxsZXJzID0gVHJ1ZQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1sIiBvciBvcHQgPT0gIi0tbGlzdGZ1bmNzIjoKLSAgICAgICAgICAgIGxpc3RmdW5jcyA9IFRydWUKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItZyIgb3Igb3B0ID09ICItLXRpbWluZyI6Ci0gICAgICAgICAgICB0aW1pbmcgPSBUcnVlCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXQiIG9yIG9wdCA9PSAiLS10cmFjZSI6Ci0gICAgICAgICAgICB0cmFjZSA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItYyIgb3Igb3B0ID09ICItLWNvdW50IjoKLSAgICAgICAgICAgIGNvdW50ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1yIiBvciBvcHQgPT0gIi0tcmVwb3J0IjoKLSAgICAgICAgICAgIHJlcG9ydCA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItUiIgb3Igb3B0ID09ICItLW5vLXJlcG9ydCI6Ci0gICAgICAgICAgICBub19yZXBvcnQgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLWYiIG9yIG9wdCA9PSAiLS1maWxlIjoKLSAgICAgICAgICAgIGNvdW50c19maWxlID0gdmFsCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLW0iIG9yIG9wdCA9PSAiLS1taXNzaW5nIjoKLSAgICAgICAgICAgIG1pc3NpbmcgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLUMiIG9yIG9wdCA9PSAiLS1jb3ZlcmRpciI6Ci0gICAgICAgICAgICBjb3ZlcmRpciA9IHZhbAotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1zIiBvciBvcHQgPT0gIi0tc3VtbWFyeSI6Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLW1vZHVsZSI6Ci0gICAgICAgICAgICBmb3IgbW9kIGluIHZhbC5zcGxpdCgiLCIpOgotICAgICAgICAgICAgICAgIGlnbm9yZV9tb2R1bGVzLmFwcGVuZChtb2Quc3RyaXAoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItLWlnbm9yZS1kaXIiOgotICAgICAgICAgICAgZm9yIHMgaW4gdmFsLnNwbGl0KG9zLnBhdGhzZXApOgotICAgICAgICAgICAgICAgIHMgPSBvcy5wYXRoLmV4cGFuZHZhcnMocykKLSAgICAgICAgICAgICAgICAjIHNob3VsZCBJIGFsc28gY2FsbCBleHBhbmR1c2VyPyAoYWZ0ZXIgYWxsLCBjb3VsZCB1c2UgJEhPTUUpCi0KLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkcHJlZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzeXMuYmFzZV9wcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkZXhlY19wcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5iYXNlX2V4ZWNfcHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSkpCi0gICAgICAgICAgICAgICAgcyA9IG9zLnBhdGgubm9ybXBhdGgocykKLSAgICAgICAgICAgICAgICBpZ25vcmVfZGlycy5hcHBlbmQocykKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgYXNzZXJ0IDAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCi0KLSAgICBpZiBsaXN0ZnVuY3MgYW5kIChjb3VudCBvciB0cmFjZSk6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCkiKQotCi0gICAgaWYgbm90IChjb3VudCBvciB0cmFjZSBvciByZXBvcnQgb3IgbGlzdGZ1bmNzIG9yIGNvdW50Y2FsbGVycyk6Ci0gICAgICAgIF9lcnJfZXhpdCgibXVzdCBzcGVjaWZ5IG9uZSBvZiAtLXRyYWNlLCAtLWNvdW50LCAtLXJlcG9ydCwgIgotICAgICAgICAgICAgICAgICAgIi0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub19yZXBvcnQ6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlcG9ydCBhbmQgLS1uby1yZXBvcnQiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub3QgY291bnRzX2ZpbGU6Ci0gICAgICAgIF9lcnJfZXhpdCgiLS1yZXBvcnQgcmVxdWlyZXMgYSAtLWZpbGUiKQotCi0gICAgaWYgbm9fcmVwb3J0IGFuZCBsZW4ocHJvZ19hcmd2KSA9PSAwOgotICAgICAgICBfZXJyX2V4aXQoIm1pc3NpbmcgbmFtZSBvZiBmaWxlIHRvIHJ1biIpCi0KLSAgICAjIGV2ZXJ5dGhpbmcgaXMgcmVhZHkKLSAgICBpZiByZXBvcnQ6Ci0gICAgICAgIHJlc3VsdHMgPSBDb3ZlcmFnZVJlc3VsdHMoaW5maWxlPWNvdW50c19maWxlLCBvdXRmaWxlPWNvdW50c19maWxlKQotICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLSAgICBlbHNlOgotICAgICAgICBzeXMuYXJndiA9IHByb2dfYXJndgotICAgICAgICBwcm9nbmFtZSA9IHByb2dfYXJndlswXQotICAgICAgICBzeXMucGF0aFswXSA9IG9zLnBhdGguc3BsaXQocHJvZ25hbWUpWzBdCi0KLSAgICAgICAgdCA9IFRyYWNlKGNvdW50LCB0cmFjZSwgY291bnRmdW5jcz1saXN0ZnVuY3MsCi0gICAgICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9Y291bnRjYWxsZXJzLCBpZ25vcmVtb2RzPWlnbm9yZV9tb2R1bGVzLAotICAgICAgICAgICAgICAgICAgaWdub3JlZGlycz1pZ25vcmVfZGlycywgaW5maWxlPWNvdW50c19maWxlLAotICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1jb3VudHNfZmlsZSwgdGltaW5nPXRpbWluZykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIHByb2duYW1lLCAnZXhlYycpCi0gICAgICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgICAgICAgICBnbG9icyA9IHsKLSAgICAgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKLSAgICAgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAotICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCi0gICAgICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdC5ydW5jdHgoY29kZSwgZ2xvYnMsIGdsb2JzKQotICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBfZXJyX2V4aXQoIkNhbm5vdCBydW4gZmlsZSAlciBiZWNhdXNlOiAlcyIgJSAoc3lzLmFyZ3ZbMF0sIGVycikpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIHJlc3VsdHMgPSB0LnJlc3VsdHMoKQotCi0gICAgICAgIGlmIG5vdCBub19yZXBvcnQ6Ci0gICAgICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLQotIyAgRGVwcmVjYXRlZCBBUEkKLWRlZiB1c2FnZShvdXRmaWxlKToKLSAgICBfd2FybigiVGhlIHRyYWNlLnVzYWdlKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgX3VzYWdlKG91dGZpbGUpCi0KLWNsYXNzIElnbm9yZShfSWdub3JlKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlcz1Ob25lLCBkaXJzPU5vbmUpOgotICAgICAgICBfd2FybigiVGhlIGNsYXNzIHRyYWNlLklnbm9yZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIF9JZ25vcmUuX19pbml0X18oc2VsZiwgbW9kdWxlcywgZGlycykKLQotZGVmIG1vZG5hbWUocGF0aCk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5tb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9tb2RuYW1lKHBhdGgpCi0KLWRlZiBmdWxsbW9kbmFtZShwYXRoKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZ1bGxtb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9mdWxsbW9kbmFtZShwYXRoKQotCi1kZWYgZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzX2Zyb21fY29kZSgpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3RycykKLQotZGVmIGZpbmRfbGluZXMoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2xpbmVzKGNvZGUsIHN0cnMpCi0KLWRlZiBmaW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgotICAgIF93YXJuKCJUaGUgdHJhY2UuZmluZF9zdHJpbmdzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpCi0KLWRlZiBmaW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2V4ZWN1dGFibGVfbGluZW5vcygpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpCisgICAgaWYgbm90IG9wdHMubm9fcmVwb3J0OgorICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMob3B0cy5taXNzaW5nLCBvcHRzLnN1bW1hcnksIG9wdHMuY292ZXJkaXIpCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggYTJlYjUzOS4uYTE1YjgxOCAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC0zODUsOSArMzg1LDMwIEBACiAgICAgICAgIHJlc3VsdGluZyBsaXN0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGZyYW1lIGZyb20gdGhlIHN0YWNrLgogICAgICAgICBFYWNoIHN0cmluZyBlbmRzIGluIGEgbmV3bGluZTsgdGhlIHN0cmluZ3MgbWF5IGNvbnRhaW4gaW50ZXJuYWwKICAgICAgICAgbmV3bGluZXMgYXMgd2VsbCwgZm9yIHRob3NlIGl0ZW1zIHdpdGggc291cmNlIHRleHQgbGluZXMuCisKKyAgICAgICAgRm9yIGxvbmcgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGZyYW1lIGFuZCBsaW5lLCB0aGUgZmlyc3QgZmV3CisgICAgICAgIHJlcGV0aXRpb25zIGFyZSBzaG93biwgZm9sbG93ZWQgYnkgYSBzdW1tYXJ5IGxpbmUgc3RhdGluZyB0aGUgZXhhY3QKKyAgICAgICAgbnVtYmVyIG9mIGZ1cnRoZXIgcmVwZXRpdGlvbnMuCiAgICAgICAgICIiIgogICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBsYXN0X2ZpbGUgPSBOb25lCisgICAgICAgIGxhc3RfbGluZSA9IE5vbmUKKyAgICAgICAgbGFzdF9uYW1lID0gTm9uZQorICAgICAgICBjb3VudCA9IDAKICAgICAgICAgZm9yIGZyYW1lIGluIHNlbGY6CisgICAgICAgICAgICBpZiAobGFzdF9maWxlIGlzIG5vdCBOb25lIGFuZCBsYXN0X2ZpbGUgPT0gZnJhbWUuZmlsZW5hbWUgYW5kCisgICAgICAgICAgICAgICAgbGFzdF9saW5lIGlzIG5vdCBOb25lIGFuZCBsYXN0X2xpbmUgPT0gZnJhbWUubGluZW5vIGFuZAorICAgICAgICAgICAgICAgIGxhc3RfbmFtZSBpcyBub3QgTm9uZSBhbmQgbGFzdF9uYW1lID09IGZyYW1lLm5hbWUpOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY291bnQgPiAzOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYnICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCB7Y291bnQtM30gbW9yZSB0aW1lc10nKydcbicpCisgICAgICAgICAgICAgICAgbGFzdF9maWxlID0gZnJhbWUuZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBsYXN0X2xpbmUgPSBmcmFtZS5saW5lbm8KKyAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSBmcmFtZS5uYW1lCisgICAgICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBpZiBjb3VudCA+PSAzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICByb3cgPSBbXQogICAgICAgICAgICAgcm93LmFwcGVuZCgnICBGaWxlICJ7fSIsIGxpbmUge30sIGluIHt9XG4nLmZvcm1hdCgKICAgICAgICAgICAgICAgICBmcmFtZS5maWxlbmFtZSwgZnJhbWUubGluZW5vLCBmcmFtZS5uYW1lKSkKQEAgLTM5Nyw2ICs0MTgsOCBAQAogICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzb3J0ZWQoZnJhbWUubG9jYWxzLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgICAgICByb3cuYXBwZW5kKCcgICAge25hbWV9ID0ge3ZhbHVlfVxuJy5mb3JtYXQobmFtZT1uYW1lLCB2YWx1ZT12YWx1ZSkpCiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcnLmpvaW4ocm93KSkKKyAgICAgICAgaWYgY291bnQgPiAzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmJyAgW1ByZXZpb3VzIGxpbmUgcmVwZWF0ZWQge2NvdW50LTN9IG1vcmUgdGltZXNdJysnXG4nKQogICAgICAgICByZXR1cm4gcmVzdWx0CiAKIApAQCAtNDg3LDEwICs1MTAsOSBAQAogICAgICAgICAgICAgc2VsZi5fbG9hZF9saW5lcygpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZnJvbV9leGNlcHRpb24oc2VsZiwgZXhjLCAqYXJncywgKiprd2FyZ3MpOgorICAgIGRlZiBmcm9tX2V4Y2VwdGlvbihjbHMsIGV4YywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgIiIiQ3JlYXRlIGEgVHJhY2ViYWNrRXhjZXB0aW9uIGZyb20gYW4gZXhjZXB0aW9uLiIiIgotICAgICAgICByZXR1cm4gVHJhY2ViYWNrRXhjZXB0aW9uKAotICAgICAgICAgICAgdHlwZShleGMpLCBleGMsIGV4Yy5fX3RyYWNlYmFja19fLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBjbHModHlwZShleGMpLCBleGMsIGV4Yy5fX3RyYWNlYmFja19fLCAqYXJncywgKiprd2FyZ3MpCiAKICAgICBkZWYgX2xvYWRfbGluZXMoc2VsZik6CiAgICAgICAgICIiIlByaXZhdGUgQVBJLiBmb3JjZSBhbGwgbGluZXMgaW4gdGhlIHN0YWNrIHRvIGJlIGxvYWRlZC4iIiIKZGlmZiAtLWdpdCBhL0xpYi90cmFjZW1hbGxvYy5weSBiL0xpYi90cmFjZW1hbGxvYy5weQppbmRleCA2Mjg4ZGE4Li43NWIzOTE4IDEwMDY0NAotLS0gYS9MaWIvdHJhY2VtYWxsb2MucHkKKysrIGIvTGliL3RyYWNlbWFsbG9jLnB5CkBAIC0yNDQsMTcgKzI0NCwyMSBAQAogICAgIF9fc2xvdHNfXyA9ICgiX3RyYWNlIiwpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhY2UpOgotICAgICAgICAjIHRyYWNlIGlzIGEgdHVwbGU6IChzaXplLCB0cmFjZWJhY2spLCBzZWUgVHJhY2ViYWNrIGNvbnN0cnVjdG9yCi0gICAgICAgICMgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNlYmFjayB0dXBsZQorICAgICAgICAjIHRyYWNlIGlzIGEgdHVwbGU6IChkb21haW46IGludCwgc2l6ZTogaW50LCB0cmFjZWJhY2s6IHR1cGxlKS4KKyAgICAgICAgIyBTZWUgVHJhY2ViYWNrIGNvbnN0cnVjdG9yIGZvciB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjZWJhY2sgdHVwbGUuCiAgICAgICAgIHNlbGYuX3RyYWNlID0gdHJhY2UKIAogICAgIEBwcm9wZXJ0eQotICAgIGRlZiBzaXplKHNlbGYpOgorICAgIGRlZiBkb21haW4oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl90cmFjZVswXQogCiAgICAgQHByb3BlcnR5CisgICAgZGVmIHNpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFjZVsxXQorCisgICAgQHByb3BlcnR5CiAgICAgZGVmIHRyYWNlYmFjayhzZWxmKToKLSAgICAgICAgcmV0dXJuIFRyYWNlYmFjayhzZWxmLl90cmFjZVsxXSkKKyAgICAgICAgcmV0dXJuIFRyYWNlYmFjayhzZWxmLl90cmFjZVsyXSkKIAogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICByZXR1cm4gKHNlbGYuX3RyYWNlID09IG90aGVyLl90cmFjZSkKQEAgLTI2Niw4ICsyNzAsOCBAQAogICAgICAgICByZXR1cm4gIiVzOiAlcyIgJSAoc2VsZi50cmFjZWJhY2ssIF9mb3JtYXRfc2l6ZShzZWxmLnNpemUsIEZhbHNlKSkKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICgiPFRyYWNlIHNpemU9JXMsIHRyYWNlYmFjaz0lcj4iCi0gICAgICAgICAgICAgICAgJSAoX2Zvcm1hdF9zaXplKHNlbGYuc2l6ZSwgRmFsc2UpLCBzZWxmLnRyYWNlYmFjaykpCisgICAgICAgIHJldHVybiAoIjxUcmFjZSBkb21haW49JXMgc2l6ZT0lcywgdHJhY2ViYWNrPSVyPiIKKyAgICAgICAgICAgICAgICAlIChzZWxmLmRvbWFpbiwgX2Zvcm1hdF9zaXplKHNlbGYuc2l6ZSwgRmFsc2UpLCBzZWxmLnRyYWNlYmFjaykpCiAKIAogY2xhc3MgX1RyYWNlcyhTZXF1ZW5jZSk6CkBAIC0zMDIsMTkgKzMwNiwyOSBAQAogICAgIHJldHVybiBmaWxlbmFtZQogCiAKLWNsYXNzIEZpbHRlcjoKK2NsYXNzIEJhc2VGaWx0ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluY2x1c2l2ZSk6CisgICAgICAgIHNlbGYuaW5jbHVzaXZlID0gaW5jbHVzaXZlCisKKyAgICBkZWYgX21hdGNoKHNlbGYsIHRyYWNlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIEZpbHRlcihCYXNlRmlsdGVyKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5jbHVzaXZlLCBmaWxlbmFtZV9wYXR0ZXJuLAotICAgICAgICAgICAgICAgICBsaW5lbm89Tm9uZSwgYWxsX2ZyYW1lcz1GYWxzZSk6CisgICAgICAgICAgICAgICAgIGxpbmVubz1Ob25lLCBhbGxfZnJhbWVzPUZhbHNlLCBkb21haW49Tm9uZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oaW5jbHVzaXZlKQogICAgICAgICBzZWxmLmluY2x1c2l2ZSA9IGluY2x1c2l2ZQogICAgICAgICBzZWxmLl9maWxlbmFtZV9wYXR0ZXJuID0gX25vcm1hbGl6ZV9maWxlbmFtZShmaWxlbmFtZV9wYXR0ZXJuKQogICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubwogICAgICAgICBzZWxmLmFsbF9mcmFtZXMgPSBhbGxfZnJhbWVzCisgICAgICAgIHNlbGYuZG9tYWluID0gZG9tYWluCiAKICAgICBAcHJvcGVydHkKICAgICBkZWYgZmlsZW5hbWVfcGF0dGVybihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4KIAotICAgIGRlZiBfX21hdGNoX2ZyYW1lKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgIGRlZiBfbWF0Y2hfZnJhbWVfaW1wbChzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKICAgICAgICAgZmlsZW5hbWUgPSBfbm9ybWFsaXplX2ZpbGVuYW1lKGZpbGVuYW1lKQogICAgICAgICBpZiBub3QgZm5tYXRjaC5mbm1hdGNoKGZpbGVuYW1lLCBzZWxmLl9maWxlbmFtZV9wYXR0ZXJuKToKICAgICAgICAgICAgIHJldHVybiBGYWxzZQpAQCAtMzI0LDExICszMzgsMTEgQEAKICAgICAgICAgICAgIHJldHVybiAobGluZW5vID09IHNlbGYubGluZW5vKQogCiAgICAgZGVmIF9tYXRjaF9mcmFtZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX19tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKSBeIChub3Qgc2VsZi5pbmNsdXNpdmUpCisgICAgICAgIHJldHVybiBzZWxmLl9tYXRjaF9mcmFtZV9pbXBsKGZpbGVuYW1lLCBsaW5lbm8pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKIAogICAgIGRlZiBfbWF0Y2hfdHJhY2ViYWNrKHNlbGYsIHRyYWNlYmFjayk6CiAgICAgICAgIGlmIHNlbGYuYWxsX2ZyYW1lczoKLSAgICAgICAgICAgIGlmIGFueShzZWxmLl9fbWF0Y2hfZnJhbWUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgICAgIGlmIGFueShzZWxmLl9tYXRjaF9mcmFtZV9pbXBsKGZpbGVuYW1lLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8gaW4gdHJhY2ViYWNrKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmNsdXNpdmUKICAgICAgICAgICAgIGVsc2U6CkBAIC0zMzcsNiArMzUxLDMwIEBACiAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vID0gdHJhY2ViYWNrWzBdCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWF0Y2hfZnJhbWUoZmlsZW5hbWUsIGxpbmVubykKIAorICAgIGRlZiBfbWF0Y2goc2VsZiwgdHJhY2UpOgorICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlYmFjayA9IHRyYWNlCisgICAgICAgIHJlcyA9IHNlbGYuX21hdGNoX3RyYWNlYmFjayh0cmFjZWJhY2spCisgICAgICAgIGlmIHNlbGYuZG9tYWluIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5pbmNsdXNpdmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyBhbmQgKGRvbWFpbiA9PSBzZWxmLmRvbWFpbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyBvciAoZG9tYWluICE9IHNlbGYuZG9tYWluKQorICAgICAgICByZXR1cm4gcmVzCisKKworY2xhc3MgRG9tYWluRmlsdGVyKEJhc2VGaWx0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmNsdXNpdmUsIGRvbWFpbik6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oaW5jbHVzaXZlKQorICAgICAgICBzZWxmLl9kb21haW4gPSBkb21haW4KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkb21haW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kb21haW4KKworICAgIGRlZiBfbWF0Y2goc2VsZiwgdHJhY2UpOgorICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlYmFjayA9IHRyYWNlCisgICAgICAgIHJldHVybiAoZG9tYWluID09IHNlbGYuZG9tYWluKSBeIChub3Qgc2VsZi5pbmNsdXNpdmUpCisKIAogY2xhc3MgU25hcHNob3Q6CiAgICAgIiIiCkBAIC0zNjUsMTMgKzQwMywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkKGZwKQogCiAgICAgZGVmIF9maWx0ZXJfdHJhY2Uoc2VsZiwgaW5jbHVkZV9maWx0ZXJzLCBleGNsdWRlX2ZpbHRlcnMsIHRyYWNlKToKLSAgICAgICAgdHJhY2ViYWNrID0gdHJhY2VbMV0KICAgICAgICAgaWYgaW5jbHVkZV9maWx0ZXJzOgotICAgICAgICAgICAgaWYgbm90IGFueSh0cmFjZV9maWx0ZXIuX21hdGNoX3RyYWNlYmFjayh0cmFjZWJhY2spCisgICAgICAgICAgICBpZiBub3QgYW55KHRyYWNlX2ZpbHRlci5fbWF0Y2godHJhY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZV9maWx0ZXIgaW4gaW5jbHVkZV9maWx0ZXJzKToKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgaWYgZXhjbHVkZV9maWx0ZXJzOgotICAgICAgICAgICAgaWYgYW55KG5vdCB0cmFjZV9maWx0ZXIuX21hdGNoX3RyYWNlYmFjayh0cmFjZWJhY2spCisgICAgICAgICAgICBpZiBhbnkobm90IHRyYWNlX2ZpbHRlci5fbWF0Y2godHJhY2UpCiAgICAgICAgICAgICAgICAgICAgZm9yIHRyYWNlX2ZpbHRlciBpbiBleGNsdWRlX2ZpbHRlcnMpOgogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQpAQCAtMzc5LDggKzQxNiw4IEBACiAgICAgZGVmIGZpbHRlcl90cmFjZXMoc2VsZiwgZmlsdGVycyk6CiAgICAgICAgICIiIgogICAgICAgICBDcmVhdGUgYSBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGZpbHRlcmVkIHRyYWNlcyBzZXF1ZW5jZSwgZmlsdGVycwotICAgICAgICBpcyBhIGxpc3Qgb2YgRmlsdGVyIGluc3RhbmNlcy4gIElmIGZpbHRlcnMgaXMgYW4gZW1wdHkgbGlzdCwgcmV0dXJuIGEKLSAgICAgICAgbmV3IFNuYXBzaG90IGluc3RhbmNlIHdpdGggYSBjb3B5IG9mIHRoZSB0cmFjZXMuCisgICAgICAgIGlzIGEgbGlzdCBvZiBGaWx0ZXIgb3IgRG9tYWluRmlsdGVyIGluc3RhbmNlcy4gIElmIGZpbHRlcnMgaXMgYW4gZW1wdHkKKyAgICAgICAgbGlzdCwgcmV0dXJuIGEgbmV3IFNuYXBzaG90IGluc3RhbmNlIHdpdGggYSBjb3B5IG9mIHRoZSB0cmFjZXMuCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWx0ZXJzLCBJdGVyYWJsZSk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImZpbHRlcnMgbXVzdCBiZSBhIGxpc3Qgb2YgZmlsdGVycywgbm90ICVzIgpAQCAtNDEyLDcgKzQ0OSw3IEBACiAgICAgICAgIHRyYWNlYmFja3MgPSB7fQogICAgICAgICBpZiBub3QgY3VtdWxhdGl2ZToKICAgICAgICAgICAgIGZvciB0cmFjZSBpbiBzZWxmLnRyYWNlcy5fdHJhY2VzOgotICAgICAgICAgICAgICAgIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCisgICAgICAgICAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrc1t0cmFjZV90cmFjZWJhY2tdCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgpAQCAtNDMzLDcgKzQ3MCw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIGN1bXVsYXRpdmUgc3RhdGlzdGljcwogICAgICAgICAgICAgZm9yIHRyYWNlIGluIHNlbGYudHJhY2VzLl90cmFjZXM6Ci0gICAgICAgICAgICAgICAgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCiAgICAgICAgICAgICAgICAgZm9yIGZyYW1lIGluIHRyYWNlX3RyYWNlYmFjazoKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrc1tmcmFtZV0KZGlmZiAtLWdpdCBhL0xpYi90dXJ0bGVkZW1vL19fbWFpbl9fLnB5IGIvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkKaW5kZXggNzExZDBhYi4uMGE1ODMzMiAxMDA2NDQKLS0tIGEvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkKKysrIGIvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkKQEAgLTg5LDEzICs4OSwxMiBAQAogaW1wb3J0IG9zCiAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCi1mcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgotZnJvbSBpZGxlbGliLnRleHRWaWV3IGltcG9ydCB2aWV3X3RleHQKK2Zyb20gaWRsZWxpYi5jb2xvcml6ZXIgaW1wb3J0IENvbG9yRGVsZWdhdG9yLCBjb2xvcl9jb25maWcKK2Zyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCitmcm9tIGlkbGVsaWIudGV4dHZpZXcgaW1wb3J0IHZpZXdfdGV4dAogZnJvbSB0dXJ0bGVkZW1vIGltcG9ydCBfX2RvY19fIGFzIGFib3V0X3R1cnRsZWRlbW8KIAogaW1wb3J0IHR1cnRsZQotaW1wb3J0IHRpbWUKIAogZGVtb19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKIGRhcndpbiA9IHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJwpkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vYnl0ZWRlc2lnbi5weSBiL0xpYi90dXJ0bGVkZW1vL2J5dGVkZXNpZ24ucHkKaW5kZXggNjRiMWQ3ZC4uYjNiMDk1YiAxMDA3NTUKLS0tIGEvTGliL3R1cnRsZWRlbW8vYnl0ZWRlc2lnbi5weQorKysgYi9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5CkBAIC0yMiw3ICsyMiw2IEBACiBtb2RlIGFzIGZhc3QgYXMgcG9zc2libGUuCiAiIiIKIAotaW1wb3J0IG1hdGgKIGZyb20gdHVydGxlIGltcG9ydCBUdXJ0bGUsIG1haW5sb29wCiBmcm9tIHRpbWUgaW1wb3J0IGNsb2NrCiAKZGlmZiAtLWdpdCBhL0xpYi90dXJ0bGVkZW1vL3BsYW5ldF9hbmRfbW9vbi5weSBiL0xpYi90dXJ0bGVkZW1vL3BsYW5ldF9hbmRfbW9vbi5weQppbmRleCAyNmFiZmRiLi4wMjFmZjk5IDEwMDc1NQotLS0gYS9MaWIvdHVydGxlZGVtby9wbGFuZXRfYW5kX21vb24ucHkKKysrIGIvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5CkBAIC0xOCw3ICsxOCw2IEBACiAKICIiIgogZnJvbSB0dXJ0bGUgaW1wb3J0IFNoYXBlLCBUdXJ0bGUsIG1haW5sb29wLCBWZWMyRCBhcyBWZWMKLWZyb20gdGltZSBpbXBvcnQgc2xlZXAKIAogRyA9IDgKIApkaWZmIC0tZ2l0IGEvTGliL3R5cGVzLnB5IGIvTGliL3R5cGVzLnB5CmluZGV4IDQ4ODkxY2QuLmNjMDkzY2IgMTAwNjQ0Ci0tLSBhL0xpYi90eXBlcy5weQorKysgYi9MaWIvdHlwZXMucHkKQEAgLTI1LDggKzI1LDExIEBACiBfYy5jbG9zZSgpICAjIFByZXZlbnQgUmVzb3VyY2VXYXJuaW5nCiAKIGNsYXNzIF9DOgorICAgIF9uc1R5cGUgPSB0eXBlKGxvY2FscygpKQogICAgIGRlZiBfbShzZWxmKTogcGFzcwogTWV0aG9kVHlwZSA9IHR5cGUoX0MoKS5fbSkKKyMgSW4gQ1B5dGhvbiwgdGhpcyBzaG91bGQgZW5kIHVwIGFzIE9yZGVyZWREaWN0LgorX0RlZmF1bHRDbGFzc05hbWVzcGFjZVR5cGUgPSBfQy5fbnNUeXBlCiAKIEJ1aWx0aW5GdW5jdGlvblR5cGUgPSB0eXBlKGxlbikKIEJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZQpAQCAtODUsNyArODgsNyBAQAogICAgIGlmIGhhc2F0dHIobWV0YSwgJ19fcHJlcGFyZV9fJyk6CiAgICAgICAgIG5zID0gbWV0YS5fX3ByZXBhcmVfXyhuYW1lLCBiYXNlcywgKiprd2RzKQogICAgIGVsc2U6Ci0gICAgICAgIG5zID0ge30KKyAgICAgICAgbnMgPSBfRGVmYXVsdENsYXNzTmFtZXNwYWNlVHlwZSgpCiAgICAgcmV0dXJuIG1ldGEsIG5zLCBrd2RzCiAKIGRlZiBfY2FsY3VsYXRlX21ldGEobWV0YSwgYmFzZXMpOgpkaWZmIC0tZ2l0IGEvTGliL3R5cGluZy5weSBiL0xpYi90eXBpbmcucHkKaW5kZXggNTU3M2ExZi4uNWY0NTFiMCAxMDA2NDQKLS0tIGEvTGliL3R5cGluZy5weQorKysgYi9MaWIvdHlwaW5nLnB5CkBAIC0xMzAxLDYgKzEzMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobm90IGF0dHIuc3RhcnRzd2l0aCgnX2FiY18nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyICE9ICdfX2Fic3RyYWN0bWV0aG9kc19fJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyICE9ICdfaXNfcHJvdG9jb2wnIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19fZGVmaW5pdGlvbl9vcmRlcl9fJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyICE9ICdfX2RpY3RfXycgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciAhPSAnX19hcmdzX18nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgIT0gJ19fc2xvdHNfXycgYW5kCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvbW9jay5weSBiL0xpYi91bml0dGVzdC9tb2NrLnB5CmluZGV4IDY2OTg5MGEuLmVhYTljM2QgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC9tb2NrLnB5CisrKyBiL0xpYi91bml0dGVzdC9tb2NrLnB5CkBAIC02MCwxOCArNjAsNiBAQAogICAgICkKIAogCi1jbGFzcyBfc2xvdHRlZChvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnYSddCi0KLQotIyBEbyBub3QgdXNlIHRoaXMgdHVwbGUuICBJdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCBhcyBhIHB1YmxpYyBBUEkuCi0jIEl0IHdpbGwgYmUgcmVtb3ZlZC4gIEl0IGhhcyBubyBvYnZpb3VzIHNpZ25zIG9mIHVzZXJzIG9uIGdpdGh1Yi4KLURlc2NyaXB0b3JUeXBlcyA9ICgKLSAgICB0eXBlKF9zbG90dGVkLmEpLAotICAgIHByb3BlcnR5LAotKQotCi0KIGRlZiBfZ2V0X3NpZ25hdHVyZV9vYmplY3QoZnVuYywgYXNfaW5zdGFuY2UsIGVhdF9zZWxmKToKICAgICAiIiIKICAgICBHaXZlbiBhbiBhcmJpdHJhcnksIHBvc3NpYmx5IGNhbGxhYmxlIG9iamVjdCwgdHJ5IHRvIGNyZWF0ZSBhIHN1aXRhYmxlCkBAIC01MjUsNyArNTEzLDcgQEAKICAgICBzaWRlX2VmZmVjdCA9IHByb3BlcnR5KF9fZ2V0X3NpZGVfZWZmZWN0LCBfX3NldF9zaWRlX2VmZmVjdCkKIAogCi0gICAgZGVmIHJlc2V0X21vY2soc2VsZiwgdmlzaXRlZD1Ob25lKToKKyAgICBkZWYgcmVzZXRfbW9jayhzZWxmLCAgdmlzaXRlZD1Ob25lLCosIHJldHVybl92YWx1ZT1GYWxzZSwgc2lkZV9lZmZlY3Q9RmFsc2UpOgogICAgICAgICAiUmVzdG9yZSB0aGUgbW9jayBvYmplY3QgdG8gaXRzIGluaXRpYWwgc3RhdGUuIgogICAgICAgICBpZiB2aXNpdGVkIGlzIE5vbmU6CiAgICAgICAgICAgICB2aXNpdGVkID0gW10KQEAgLTU0MCw2ICs1MjgsMTEgQEAKICAgICAgICAgc2VsZi5jYWxsX2FyZ3NfbGlzdCA9IF9DYWxsTGlzdCgpCiAgICAgICAgIHNlbGYubWV0aG9kX2NhbGxzID0gX0NhbGxMaXN0KCkKIAorICAgICAgICBpZiByZXR1cm5fdmFsdWU6CisgICAgICAgICAgICBzZWxmLl9tb2NrX3JldHVybl92YWx1ZSA9IERFRkFVTFQKKyAgICAgICAgaWYgc2lkZV9lZmZlY3Q6CisgICAgICAgICAgICBzZWxmLl9tb2NrX3NpZGVfZWZmZWN0ID0gTm9uZQorCiAgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9tb2NrX2NoaWxkcmVuLnZhbHVlcygpOgogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgX1NwZWNTdGF0ZSk6CiAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTc3NCw2ICs3NjcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAoc2VsZi5fbW9ja19uYW1lIG9yICdtb2NrJywgc2VsZi5jYWxsX2NvdW50KSkKICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKIAorICAgIGRlZiBhc3NlcnRfY2FsbGVkKF9tb2NrX3NlbGYpOgorICAgICAgICAiIiJhc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYgPSBfbW9ja19zZWxmCisgICAgICAgIGlmIHNlbGYuY2FsbF9jb3VudCA9PSAwOgorICAgICAgICAgICAgbXNnID0gKCJFeHBlY3RlZCAnJXMnIHRvIGhhdmUgYmVlbiBjYWxsZWQuIiAlCisgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9ja19uYW1lIG9yICdtb2NrJykKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKKworICAgIGRlZiBhc3NlcnRfY2FsbGVkX29uY2UoX21vY2tfc2VsZik6CisgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgb25seSBvbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IF9tb2NrX3NlbGYKKyAgICAgICAgaWYgbm90IHNlbGYuY2FsbF9jb3VudCA9PSAxOgorICAgICAgICAgICAgbXNnID0gKCJFeHBlY3RlZCAnJXMnIHRvIGhhdmUgYmVlbiBjYWxsZWQgb25jZS4gQ2FsbGVkICVzIHRpbWVzLiIgJQorICAgICAgICAgICAgICAgICAgIChzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snLCBzZWxmLmNhbGxfY291bnQpKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQorCiAgICAgZGVmIGFzc2VydF9jYWxsZWRfd2l0aChfbW9ja19zZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJhc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCiAKQEAgLTgyMiw3ICs4MzMsNyBAQAogICAgICAgICAgICAgaWYgZXhwZWN0ZWQgbm90IGluIGFsbF9jYWxsczoKICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgJ0NhbGxzIG5vdCBmb3VuZC5cbkV4cGVjdGVkOiAlclxuJwotICAgICAgICAgICAgICAgICAgICAnQWN0dWFsOiAlcicgJSAoY2FsbHMsIHNlbGYubW9ja19jYWxscykKKyAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbDogJXInICUgKF9DYWxsTGlzdChjYWxscyksIHNlbGYubW9ja19jYWxscykKICAgICAgICAgICAgICAgICApIGZyb20gY2F1c2UKICAgICAgICAgICAgIHJldHVybgogCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2Rpc2NvdmVyeS5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5CmluZGV4IDhmNDAxN2YuLjE5OTZhOGUgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5CkBAIC0zNDksNyArMzQ5LDcgQEAKICAgICAgICAgc3VpdGUgPSBsaXN0KGxvYWRlci5fZmluZF90ZXN0cyhhYnNwYXRoKCcvZm9vJyksICd0ZXN0Ki5weScpKQogCiAgICAgICAgICMgV2Ugc2hvdWxkIGhhdmUgbG9hZGVkIHRlc3RzIGZyb20gYm90aCBteV9wYWNrYWdlIGFuZAotICAgICAgICAjIG15X3BhY2FrZ2UudGVzdF9tb2R1bGUsIGFuZCBhbHNvIHJ1biB0aGUgbG9hZF90ZXN0cyBob29rIGluIGJvdGguCisgICAgICAgICMgbXlfcGFja2FnZS50ZXN0X21vZHVsZSwgYW5kIGFsc28gcnVuIHRoZSBsb2FkX3Rlc3RzIGhvb2sgaW4gYm90aC4KICAgICAgICAgIyAobm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBuZXN0ZWQgVGVzdFN1aXRlcy4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgW1snbXlfcGFja2FnZSBsb2FkX3Rlc3RzJywgW10sCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svc3VwcG9ydC5weQppbmRleCBmNDczODc5Li4yMDU0MzFhIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3N1cHBvcnQucHkKQEAgLTEsNSArMSwzIEBACi1pbXBvcnQgc3lzCi0KIGRlZiBpc19pbnN0YW5jZShvYmosIGtsYXNzKToKICAgICAiIiJWZXJzaW9uIG9mIGlzX2luc3RhbmNlIHRoYXQgZG9lc24ndCBhY2Nlc3MgX19jbGFzc19fIiIiCiAgICAgcmV0dXJuIGlzc3ViY2xhc3ModHlwZShvYmopLCBrbGFzcykKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RjYWxsYWJsZS5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RjYWxsYWJsZS5weQppbmRleCA1MzkwYTRlLi5hZjFjZTdlIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0Y2FsbGFibGUucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdGNhbGxhYmxlLnB5CkBAIC0yNyw3ICsyNyw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1vY2suX19jbGFzc19fLl9fbmFtZV9fLCByZXByKG1vY2spKQogCiAKLSAgICBkZWYgdGVzdF9oZWlyYXJjaHkoc2VsZik6CisgICAgZGVmIHRlc3RfaGllcmFyY2h5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhNYWdpY01vY2ssIE1vY2spKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhOb25DYWxsYWJsZU1hZ2ljTW9jaywgTm9uQ2FsbGFibGVNb2NrKSkKIApkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkKaW5kZXggYmI5Yjk1Ni4uMjQ1NjliNSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bWFnaWNtZXRob2RzLnB5CkBAIC0xLDUgKzEsNCBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgaW5zcGVjdAogaW1wb3J0IHN5cwogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNb2NrLCBNYWdpY01vY2ssIF9tYWdpY3MKIApkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQppbmRleCA1ZjgyYjgyLi5iMDdhN2NjIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQpAQCAtMTIzOSw2ICsxMjM5LDI3IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfbm90X2NhbGxlZCgpCiAKKyAgICBkZWYgdGVzdF9hc3NlcnRfY2FsbGVkKHNlbGYpOgorICAgICAgICBtID0gTW9jaygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkKCkKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisKKyAgICBkZWYgdGVzdF9hc3NlcnRfY2FsbGVkX29uY2Uoc2VsZik6CisgICAgICAgIG0gPSBNb2NrKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWRfb25jZSgpCisKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorCiAgICAgI0lzc3VlMjEyNTYgcHJpbnRvdXQgb2Yga2V5d29yZCBhcmdzIHNob3VsZCBiZSBpbiBkZXRlcm1pbmlzdGljIG9yZGVyCiAgICAgZGVmIHRlc3Rfc29ydGVkX2NhbGxfc2lnbmF0dXJlKHNlbGYpOgogICAgICAgICBtID0gTW9jaygpCkBAIC0xMjU2LDYgKzEyNzcsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm1ldGhvZF9jYWxsc1swXSwgYykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm1ldGhvZF9jYWxsc1sxXSwgaSkKIAorICAgIGRlZiB0ZXN0X3Jlc2V0X3JldHVybl9zaWRlZWZmZWN0KHNlbGYpOgorICAgICAgICBtID0gTW9jayhyZXR1cm5fdmFsdWU9MTAsIHNpZGVfZWZmZWN0PVsyLDNdKQorICAgICAgICBtLnJlc2V0X21vY2socmV0dXJuX3ZhbHVlPVRydWUsIHNpZGVfZWZmZWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLnJldHVybl92YWx1ZSwgTW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVzZXRfcmV0dXJuKHNlbGYpOgorICAgICAgICBtID0gTW9jayhyZXR1cm5fdmFsdWU9MTAsIHNpZGVfZWZmZWN0PVsyLDNdKQorICAgICAgICBtLnJlc2V0X21vY2socmV0dXJuX3ZhbHVlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLnJldHVybl92YWx1ZSwgTW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVzZXRfc2lkZWVmZmVjdChzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHNpZGVfZWZmZWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXR1cm5fdmFsdWUsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc2lkZV9lZmZlY3QsIE5vbmUpCisKICAgICBkZWYgdGVzdF9tb2NrX2FkZF9zcGVjKHNlbGYpOgogICAgICAgICBjbGFzcyBfT25lKG9iamVjdCk6CiAgICAgICAgICAgICBvbmUgPSAxCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkKaW5kZXggZGZjZTM2OS4uMmUwYzA4ZiAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RwYXRjaC5weQpAQCAtMTAsOSArMTAsOSBAQAogZnJvbSB1bml0dGVzdC50ZXN0LnRlc3Rtb2NrLnN1cHBvcnQgaW1wb3J0IFNvbWVDbGFzcywgaXNfaW5zdGFuY2UKIAogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCAoCi0gICAgTm9uQ2FsbGFibGVNb2NrLCBDYWxsYWJsZU1peGluLCBwYXRjaCwgc2VudGluZWwsCisgICAgTm9uQ2FsbGFibGVNb2NrLCBDYWxsYWJsZU1peGluLCBzZW50aW5lbCwKICAgICBNYWdpY01vY2ssIE1vY2ssIE5vbkNhbGxhYmxlTWFnaWNNb2NrLCBwYXRjaCwgX3BhdGNoLAotICAgIERFRkFVTFQsIGNhbGwsIF9nZXRfdGFyZ2V0LCBfcGF0Y2gKKyAgICBERUZBVUxULCBjYWxsLCBfZ2V0X3RhcmdldAogKQogCiAKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIvcGFyc2UucHkgYi9MaWIvdXJsbGliL3BhcnNlLnB5CmluZGV4IDRkN2ZjZWMuLjk5YTY5NzcgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIvcGFyc2UucHkKKysrIGIvTGliL3VybGxpYi9wYXJzZS5weQpAQCAtMTU2LDkgKzE1Niw4IEBACiAgICAgICAgIHBvcnQgPSBzZWxmLl9ob3N0aW5mb1sxXQogICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcG9ydCA9IGludChwb3J0LCAxMCkKLSAgICAgICAgICAgICMgUmV0dXJuIE5vbmUgb24gYW4gaWxsZWdhbCBwb3J0CiAgICAgICAgICAgICBpZiBub3QgKCAwIDw9IHBvcnQgPD0gNjU1MzUpOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUG9ydCBvdXQgb2YgcmFuZ2UgMC02NTUzNSIpCiAgICAgICAgIHJldHVybiBwb3J0CiAKIApAQCAtMjI1LDggKzIyNCw3MSBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogCiBfRGVmcmFnUmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ0RlZnJhZ1Jlc3VsdCcsICd1cmwgZnJhZ21lbnQnKQotX1NwbGl0UmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ1NwbGl0UmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBxdWVyeSBmcmFnbWVudCcpCi1fUGFyc2VSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgnUGFyc2VSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHBhcmFtcyBxdWVyeSBmcmFnbWVudCcpCitfU3BsaXRSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgKKyAgICAnU3BsaXRSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHF1ZXJ5IGZyYWdtZW50JykKK19QYXJzZVJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKAorICAgICdQYXJzZVJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcGFyYW1zIHF1ZXJ5IGZyYWdtZW50JykKKworX0RlZnJhZ1Jlc3VsdEJhc2UuX19kb2NfXyA9ICIiIgorRGVmcmFnUmVzdWx0KHVybCwgZnJhZ21lbnQpCisKK0EgMi10dXBsZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmwgd2l0aG91dCBmcmFnbWVudCBpZGVudGlmaWVyIGFuZCB0aGUgZnJhZ21lbnQKK2lkZW50aWZpZXIgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudC4KKyIiIgorCitfRGVmcmFnUmVzdWx0QmFzZS51cmwuX19kb2NfXyA9ICIiIlRoZSBVUkwgd2l0aCBubyBmcmFnbWVudCBpZGVudGlmaWVyLiIiIgorCitfRGVmcmFnUmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fID0gIiIiCitGcmFnbWVudCBpZGVudGlmaWVyIHNlcGFyYXRlZCBmcm9tIFVSTCwgdGhhdCBhbGxvd3MgaW5kaXJlY3QgaWRlbnRpZmljYXRpb24gb2YgYQorc2Vjb25kYXJ5IHJlc291cmNlIGJ5IHJlZmVyZW5jZSB0byBhIHByaW1hcnkgcmVzb3VyY2UgYW5kIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcKK2luZm9ybWF0aW9uLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UuX19kb2NfXyA9ICIiIgorU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKKworQSA1LXR1cGxlIHRoYXQgY29udGFpbnMgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIGEgVVJMLiBTaW1pbGFyIHRvCitQYXJzZVJlc3VsdCwgYnV0IGRvZXMgbm90IHNwbGl0IHBhcmFtcy4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fID0gIiIiU3BlY2lmaWVzIFVSTCBzY2hlbWUgZm9yIHRoZSByZXF1ZXN0LiIiIgorCitfU3BsaXRSZXN1bHRCYXNlLm5ldGxvYy5fX2RvY19fID0gIiIiCitOZXR3b3JrIGxvY2F0aW9uIHdoZXJlIHRoZSByZXF1ZXN0IGlzIG1hZGUgdG8uCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5wYXRoLl9fZG9jX18gPSAiIiIKK1RoZSBoaWVyYXJjaGljYWwgcGF0aCwgc3VjaCBhcyB0aGUgcGF0aCB0byBhIGZpbGUgdG8gZG93bmxvYWQuCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fID0gIiIiCitUaGUgcXVlcnkgY29tcG9uZW50LCB0aGF0IGNvbnRhaW5zIG5vbi1oaWVyYXJjaGljYWwgZGF0YSwgdGhhdCBhbG9uZyB3aXRoIGRhdGEKK2luIHBhdGggY29tcG9uZW50LCBpZGVudGlmaWVzIGEgcmVzb3VyY2UgaW4gdGhlIHNjb3BlIG9mIFVSSSdzIHNjaGVtZSBhbmQKK25ldHdvcmsgbG9jYXRpb24uCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fID0gIiIiCitGcmFnbWVudCBpZGVudGlmaWVyLCB0aGF0IGFsbG93cyBpbmRpcmVjdCBpZGVudGlmaWNhdGlvbiBvZiBhIHNlY29uZGFyeSByZXNvdXJjZQorYnkgcmVmZXJlbmNlIHRvIGEgcHJpbWFyeSByZXNvdXJjZSBhbmQgYWRkaXRpb25hbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK1BhcnNlUmVzdWx0KHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsICBxdWVyeSwgZnJhZ21lbnQpCisKK0EgNi10dXBsZSB0aGF0IGNvbnRhaW5zIGNvbXBvbmVudHMgb2YgYSBwYXJzZWQgVVJMLgorIiIiCisKK19QYXJzZVJlc3VsdEJhc2Uuc2NoZW1lLl9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLm5ldGxvYy5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5wYXRoLl9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnBhdGguX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5wYXJhbXMuX19kb2NfXyA9ICIiIgorUGFyYW1ldGVycyBmb3IgbGFzdCBwYXRoIGVsZW1lbnQgdXNlZCB0byBkZXJlZmVyZW5jZSB0aGUgVVJJIGluIG9yZGVyIHRvIHByb3ZpZGUKK2FjY2VzcyB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG9uIHRoZSByZXNvdXJjZS4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLnF1ZXJ5Ll9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnF1ZXJ5Ll9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXworCiAKICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGlhcyBfTmV0bG9jUmVzdWx0TWl4aW5TdHIKICMgUmVzdWx0QmFzZSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgZG9jdW1lbnRlZCBBUEksIGJ1dCBpdCBpcwpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9yZXF1ZXN0LnB5IGIvTGliL3VybGxpYi9yZXF1ZXN0LnB5CmluZGV4IDNiZTMyN2QuLjMwYmY2ZTAgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIvcmVxdWVzdC5weQorKysgYi9MaWIvdXJsbGliL3JlcXVlc3QucHkKQEAgLTEzNCwxMSArMTM0LDY4IEBACiBdCiAKICMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50Ci1fX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQorX192ZXJzaW9uX18gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIAogX29wZW5lciA9IE5vbmUKIGRlZiB1cmxvcGVuKHVybCwgZGF0YT1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICosIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkZWZhdWx0PUZhbHNlLCBjb250ZXh0PU5vbmUpOgorICAgICcnJ09wZW4gdGhlIFVSTCB1cmwsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBSZXF1ZXN0IG9iamVjdC4KKworICAgICpkYXRhKiBtdXN0IGJlIGFuIG9iamVjdCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzZW50IHRvCisgICAgdGhlIHNlcnZlciwgb3IgTm9uZSBpZiBubyBzdWNoIGRhdGEgaXMgbmVlZGVkLiAgU2VlIFJlcXVlc3QgZm9yCisgICAgZGV0YWlscy4KKworICAgIHVybGxpYi5yZXF1ZXN0IG1vZHVsZSB1c2VzIEhUVFAvMS4xIGFuZCBpbmNsdWRlcyBhICJDb25uZWN0aW9uOmNsb3NlIgorICAgIGhlYWRlciBpbiBpdHMgSFRUUCByZXF1ZXN0cy4KKworICAgIFRoZSBvcHRpb25hbCAqdGltZW91dCogcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IKKyAgICBibG9ja2luZyBvcGVyYXRpb25zIGxpa2UgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuIFRoaXMgb25seSB3b3JrcyBmb3IgSFRUUCwKKyAgICBIVFRQUyBhbmQgRlRQIGNvbm5lY3Rpb25zLgorCisgICAgSWYgKmNvbnRleHQqIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBhIHNzbC5TU0xDb250ZXh0IGluc3RhbmNlIGRlc2NyaWJpbmcKKyAgICB0aGUgdmFyaW91cyBTU0wgb3B0aW9ucy4gU2VlIEhUVFBTQ29ubmVjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgVGhlIG9wdGlvbmFsICpjYWZpbGUqIGFuZCAqY2FwYXRoKiBwYXJhbWV0ZXJzIHNwZWNpZnkgYSBzZXQgb2YgdHJ1c3RlZCBDQQorICAgIGNlcnRpZmljYXRlcyBmb3IgSFRUUFMgcmVxdWVzdHMuIGNhZmlsZSBzaG91bGQgcG9pbnQgdG8gYSBzaW5nbGUgZmlsZQorICAgIGNvbnRhaW5pbmcgYSBidW5kbGUgb2YgQ0EgY2VydGlmaWNhdGVzLCB3aGVyZWFzIGNhcGF0aCBzaG91bGQgcG9pbnQgdG8gYQorICAgIGRpcmVjdG9yeSBvZiBoYXNoZWQgY2VydGlmaWNhdGUgZmlsZXMuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICAgc3NsLlNTTENvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKCkuCisKKyAgICBUaGUgKmNhZGVmYXVsdCogcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIG9iamVjdCB3aGljaCBjYW4gd29yayBhcyBhIGNvbnRleHQKKyAgICBtYW5hZ2VyIGFuZCBoYXMgbWV0aG9kcyBzdWNoIGFzCisKKyAgICAqIGdldHVybCgpIC0gcmV0dXJuIHRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHJldHJpZXZlZCwgY29tbW9ubHkgdXNlZCB0bworICAgICAgZGV0ZXJtaW5lIGlmIGEgcmVkaXJlY3Qgd2FzIGZvbGxvd2VkCisKKyAgICAqIGluZm8oKSAtIHJldHVybiB0aGUgbWV0YS1pbmZvcm1hdGlvbiBvZiB0aGUgcGFnZSwgc3VjaCBhcyBoZWFkZXJzLCBpbiB0aGUKKyAgICAgIGZvcm0gb2YgYW4gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygpIGluc3RhbmNlIChzZWUgUXVpY2sgUmVmZXJlbmNlIHRvCisgICAgICBIVFRQIEhlYWRlcnMpCisKKyAgICAqIGdldGNvZGUoKSAtIHJldHVybiB0aGUgSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuICBSYWlzZXMgVVJMRXJyb3IKKyAgICAgIG9uIGVycm9ycy4KKworICAgIEZvciBIVFRQIGFuZCBIVFRQUyBVUkxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBodHRwLmNsaWVudC5IVFRQUmVzcG9uc2UKKyAgICBvYmplY3Qgc2xpZ2h0bHkgbW9kaWZpZWQuIEluIGFkZGl0aW9uIHRvIHRoZSB0aHJlZSBuZXcgbWV0aG9kcyBhYm92ZSwgdGhlCisgICAgbXNnIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgcmVhc29uIGF0dHJpYnV0ZSAtLS0KKyAgICB0aGUgcmVhc29uIHBocmFzZSByZXR1cm5lZCBieSB0aGUgc2VydmVyIC0tLSBpbnN0ZWFkIG9mIHRoZSByZXNwb25zZQorICAgIGhlYWRlcnMgYXMgaXQgaXMgc3BlY2lmaWVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBIVFRQUmVzcG9uc2UuCisKKyAgICBGb3IgRlRQLCBmaWxlLCBhbmQgZGF0YSBVUkxzIGFuZCByZXF1ZXN0cyBleHBsaWNpdGx5IGhhbmRsZWQgYnkgbGVnYWN5CisgICAgVVJMb3BlbmVyIGFuZCBGYW5jeVVSTG9wZW5lciBjbGFzc2VzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYQorICAgIHVybGxpYi5yZXNwb25zZS5hZGRpbmZvdXJsIG9iamVjdC4KKworICAgIE5vdGUgdGhhdCBOb25lIG1heSBiZSByZXR1cm5lZCBpZiBubyBoYW5kbGVyIGhhbmRsZXMgdGhlIHJlcXVlc3QgKHRob3VnaAorICAgIHRoZSBkZWZhdWx0IGluc3RhbGxlZCBnbG9iYWwgT3BlbmVyRGlyZWN0b3IgdXNlcyBVbmtub3duSGFuZGxlciB0byBlbnN1cmUKKyAgICB0aGlzIG5ldmVyIGhhcHBlbnMpLgorCisgICAgSW4gYWRkaXRpb24sIGlmIHByb3h5IHNldHRpbmdzIGFyZSBkZXRlY3RlZCAoZm9yIGV4YW1wbGUsIHdoZW4gYSAqX3Byb3h5CisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSBodHRwX3Byb3h5IGlzIHNldCksIFByb3h5SGFuZGxlciBpcyBkZWZhdWx0CisgICAgaW5zdGFsbGVkIGFuZCBtYWtlcyBzdXJlIHRoZSByZXF1ZXN0cyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBwcm94eS4KKworICAgICcnJwogICAgIGdsb2JhbCBfb3BlbmVyCiAgICAgaWYgY2FmaWxlIG9yIGNhcGF0aCBvciBjYWRlZmF1bHQ6CiAgICAgICAgIGlmIGNvbnRleHQgaXMgbm90IE5vbmU6CkBAIC0xMTcwLDYgKzEyMjcsMTEgQEAKICAgICBkZWYgc2V0X2h0dHBfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CiAgICAgICAgIHNlbGYuX2RlYnVnbGV2ZWwgPSBsZXZlbAogCisgICAgZGVmIF9nZXRfY29udGVudF9sZW5ndGgoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgIHJldHVybiBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbi5fZ2V0X2NvbnRlbnRfbGVuZ3RoKAorICAgICAgICAgICAgcmVxdWVzdC5kYXRhLAorICAgICAgICAgICAgcmVxdWVzdC5nZXRfbWV0aG9kKCkpCisKICAgICBkZWYgZG9fcmVxdWVzdF8oc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIGhvc3QgPSByZXF1ZXN0Lmhvc3QKICAgICAgICAgaWYgbm90IGhvc3Q6CkBAIC0xMTc4LDI0ICsxMjQwLDIyIEBACiAgICAgICAgIGlmIHJlcXVlc3QuZGF0YSBpcyBub3QgTm9uZTogICMgUE9TVAogICAgICAgICAgICAgZGF0YSA9IHJlcXVlc3QuZGF0YQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgotICAgICAgICAgICAgICAgIG1zZyA9ICJQT1NUIGRhdGEgc2hvdWxkIGJlIGJ5dGVzIG9yIGFuIGl0ZXJhYmxlIG9mIGJ5dGVzLiAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAiSXQgY2Fubm90IGJlIG9mIHR5cGUgc3RyLiIKKyAgICAgICAgICAgICAgICBtc2cgPSAiUE9TVCBkYXRhIHNob3VsZCBiZSBieXRlcywgYW4gaXRlcmFibGUgb2YgYnl0ZXMsICIgXAorICAgICAgICAgICAgICAgICAgICAgICJvciBhIGZpbGUgb2JqZWN0LiBJdCBjYW5ub3QgYmUgb2YgdHlwZSBzdHIuIgogICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihtc2cpCiAgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LXR5cGUnKToKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAnQ29udGVudC10eXBlJywKICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCi0gICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgbXYgPSBtZW1vcnl2aWV3KGRhdGEpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDb250ZW50LUxlbmd0aCBzaG91bGQgYmUgc3BlY2lmaWVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBpdGVyYWJsZSBkYXRhIG9mIHR5cGUgJXIgJXIiICUgKHR5cGUoZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpKQorICAgICAgICAgICAgaWYgKG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJykpOgorICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoID0gc2VsZi5fZ2V0X2NvbnRlbnRfbGVuZ3RoKHJlcXVlc3QpCisgICAgICAgICAgICAgICAgaWYgY29udGVudF9sZW5ndGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtbGVuZ3RoJywgc3RyKGNvbnRlbnRfbGVuZ3RoKSkKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCcsICclZCcgJSAobGVuKG12KSAqIG12Lml0ZW1zaXplKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNmZXItZW5jb2RpbmcnLCAnY2h1bmtlZCcpCiAKICAgICAgICAgc2VsX2hvc3QgPSBob3N0CiAgICAgICAgIGlmIHJlcXVlc3QuaGFzX3Byb3h5KCk6CkBAIC0xMjUxLDcgKzEzMTEsOCBAQAogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBoLnJlcXVlc3QocmVxLmdldF9tZXRob2QoKSwgcmVxLnNlbGVjdG9yLCByZXEuZGF0YSwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBoLnJlcXVlc3QocmVxLmdldF9tZXRob2QoKSwgcmVxLnNlbGVjdG9yLCByZXEuZGF0YSwgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2NodW5rZWQ9cmVxLmhhc19oZWFkZXIoJ1RyYW5zZmVyLWVuY29kaW5nJykpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6ICMgdGltZW91dCBlcnJvcgogICAgICAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKGVycikKICAgICAgICAgICAgIHIgPSBoLmdldHJlc3BvbnNlKCkKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkgYi9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CmluZGV4IDhiNjlmZDkuLjg1YWRkMTYgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQpAQCAtMTAsNyArMTAsOSBAQAogICAgIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy9ub3JvYm90cy1yZmMudHh0CiAiIiIKIAotaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHVybGxpYi5wYXJzZQoraW1wb3J0IHVybGxpYi5yZXF1ZXN0CiAKIF9fYWxsX18gPSBbIlJvYm90RmlsZVBhcnNlciJdCiAKQEAgLTEyMCwxMCArMTIyLDI5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5ydWxlbGluZXMuYXBwZW5kKFJ1bGVMaW5lKGxpbmVbMV0sIFRydWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJjcmF3bC1kZWxheSI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlZm9yZSB0cnlpbmcgdG8gY29udmVydCB0byBpbnQgd2UgbmVlZCB0byBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHN1cmUgdGhhdCByb2JvdHMudHh0IGhhcyB2YWxpZCBzeW50YXggb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGl0IHdpbGwgY3Jhc2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVbMV0uc3RyaXAoKS5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGVsYXkgPSBpbnQobGluZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAicmVxdWVzdC1yYXRlIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMgPSBsaW5lWzFdLnNwbGl0KCcvJykKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYWxsIHZhbHVlcyBhcmUgc2FuZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihudW1iZXJzKSA9PSAyIGFuZCBudW1iZXJzWzBdLnN0cmlwKCkuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG51bWJlcnNbMV0uc3RyaXAoKS5pc2RpZ2l0KCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9yYXRlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgncmVxX3JhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWVzdHMgc2Vjb25kcycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVxX3JhdGUgPSByZXFfcmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlLnJlcXVlc3RzID0gaW50KG51bWJlcnNbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVxX3JhdGUuc2Vjb25kcyA9IGludChudW1iZXJzWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyCiAgICAgICAgIGlmIHN0YXRlID09IDI6CiAgICAgICAgICAgICBzZWxmLl9hZGRfZW50cnkoZW50cnkpCiAKLQogICAgIGRlZiBjYW5fZmV0Y2goc2VsZiwgdXNlcmFnZW50LCB1cmwpOgogICAgICAgICAiIiJ1c2luZyB0aGUgcGFyc2VkIHJvYm90cy50eHQgZGVjaWRlIGlmIHVzZXJhZ2VudCBjYW4gZmV0Y2ggdXJsIiIiCiAgICAgICAgIGlmIHNlbGYuZGlzYWxsb3dfYWxsOgpAQCAtMTUzLDYgKzE3NCwxOCBAQAogICAgICAgICAjIGFnZW50IG5vdCBmb3VuZCA9PT4gYWNjZXNzIGdyYW50ZWQKICAgICAgICAgcmV0dXJuIFRydWUKIAorICAgIGRlZiBjcmF3bF9kZWxheShzZWxmLCB1c2VyYWdlbnQpOgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyaWVzOgorICAgICAgICAgICAgaWYgZW50cnkuYXBwbGllc190byh1c2VyYWdlbnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5kZWxheQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJlcXVlc3RfcmF0ZShzZWxmLCB1c2VyYWdlbnQpOgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyaWVzOgorICAgICAgICAgICAgaWYgZW50cnkuYXBwbGllc190byh1c2VyYWdlbnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5yZXFfcmF0ZQorICAgICAgICByZXR1cm4gTm9uZQorCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldHVybiAnJy5qb2luKFtzdHIoZW50cnkpICsgIlxuIiBmb3IgZW50cnkgaW4gc2VsZi5lbnRyaWVzXSkKIApAQCAtMTgwLDYgKzIxMyw4IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBzZWxmLnVzZXJhZ2VudHMgPSBbXQogICAgICAgICBzZWxmLnJ1bGVsaW5lcyA9IFtdCisgICAgICAgIHNlbGYuZGVsYXkgPSBOb25lCisgICAgICAgIHNlbGYucmVxX3JhdGUgPSBOb25lCiAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0ID0gW10KZGlmZiAtLWdpdCBhL0xpYi91dWlkLnB5IGIvTGliL3V1aWQucHkKaW5kZXggZTk2ZTdlMC4uMjAwYzgwMCAxMDA2NDQKLS0tIGEvTGliL3V1aWQucHkKKysrIGIvTGliL3V1aWQucHkKQEAgLTQ4Nyw3ICs0ODcsNiBAQAogICAgICMgQXNzdW1lIHRoYXQgdGhlIHV1aWRfZ2VuZXJhdGUgZnVuY3Rpb25zIGFyZSBicm9rZW4gZnJvbSAxMC41IG9ud2FyZCwKICAgICAjIHRoZSB0ZXN0IGNhbiBiZSBhZGp1c3RlZCB3aGVuIGEgbGF0ZXIgdmVyc2lvbiBpcyBmaXhlZC4KICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6Ci0gICAgICAgIGltcG9ydCBvcwogICAgICAgICBpZiBpbnQob3MudW5hbWUoKS5yZWxlYXNlLnNwbGl0KCcuJylbMF0pID49IDk6CiAgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lID0gTm9uZQogCmRpZmYgLS1naXQgYS9MaWIvdmVudi9fX2luaXRfXy5weSBiL0xpYi92ZW52L19faW5pdF9fLnB5CmluZGV4IDc0MjQ1YWIuLjBhMDk0ZTMgMTAwNjQ0Ci0tLSBhL0xpYi92ZW52L19faW5pdF9fLnB5CisrKyBiL0xpYi92ZW52L19faW5pdF9fLnB5CkBAIC0zLDI4ICszLDYgQEAKIAogQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgVmluYXkgU2FqaXAuCiBMaWNlbnNlZCB0byB0aGUgUFNGIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgotCi11c2FnZTogcHl0aG9uIC1tIHZlbnYgWy1oXSBbLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlc10gWy0tc3ltbGlua3NdIFstLWNsZWFyXQotICAgICAgICAgICAgWy0tdXBncmFkZV0KLSAgICAgICAgICAgIEVOVl9ESVIgW0VOVl9ESVIgLi4uXQotCi1DcmVhdGVzIHZpcnR1YWwgUHl0aG9uIGVudmlyb25tZW50cyBpbiBvbmUgb3IgbW9yZSB0YXJnZXQgZGlyZWN0b3JpZXMuCi0KLXBvc2l0aW9uYWwgYXJndW1lbnRzOgotICBFTlZfRElSICAgICAgICAgICAgICAgQSBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBlbnZpcm9ubWVudCBpbi4KLQotb3B0aW9uYWwgYXJndW1lbnRzOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBHaXZlIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50IGFjY2VzcyB0byB0aGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXRlLXBhY2thZ2VzIGRpci4KLSAgLS1zeW1saW5rcyAgICAgICAgICAgIEF0dGVtcHQgdG8gc3ltbGluayByYXRoZXIgdGhhbiBjb3B5LgotICAtLWNsZWFyICAgICAgICAgICAgICAgRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgotICAtLXVwZ3JhZGUgICAgICAgICAgICAgVXBncmFkZSB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IHRvIHVzZSB0aGlzIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIFB5dGhvbiwgYXNzdW1pbmcgUHl0aG9uIGhhcyBiZWVuIHVwZ3JhZGVkIGluLXBsYWNlLgotICAtLXdpdGhvdXQtcGlwICAgICAgICAgU2tpcHMgaW5zdGFsbGluZyBvciB1cGdyYWRpbmcgcGlwIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCAocGlwIGlzIGJvb3RzdHJhcHBlZCBieSBkZWZhdWx0KQogIiIiCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCkBAIC01OCwxNSArMzYsMTcgQEAKICAgICA6cGFyYW0gdXBncmFkZTogSWYgVHJ1ZSwgdXBncmFkZSBhbiBleGlzdGluZyB2aXJ0dWFsIGVudmlyb25tZW50LgogICAgIDpwYXJhbSB3aXRoX3BpcDogSWYgVHJ1ZSwgZW5zdXJlIHBpcCBpcyBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwKICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50CisgICAgOnBhcmFtIHByb21wdDogQWx0ZXJuYXRpdmUgdGVybWluYWwgcHJlZml4IGZvciB0aGUgZW52aXJvbm1lbnQuCiAgICAgIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgc3lzdGVtX3NpdGVfcGFja2FnZXM9RmFsc2UsIGNsZWFyPUZhbHNlLAotICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgdXBncmFkZT1GYWxzZSwgd2l0aF9waXA9RmFsc2UpOgorICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgdXBncmFkZT1GYWxzZSwgd2l0aF9waXA9RmFsc2UsIHByb21wdD1Ob25lKToKICAgICAgICAgc2VsZi5zeXN0ZW1fc2l0ZV9wYWNrYWdlcyA9IHN5c3RlbV9zaXRlX3BhY2thZ2VzCiAgICAgICAgIHNlbGYuY2xlYXIgPSBjbGVhcgogICAgICAgICBzZWxmLnN5bWxpbmtzID0gc3ltbGlua3MKICAgICAgICAgc2VsZi51cGdyYWRlID0gdXBncmFkZQogICAgICAgICBzZWxmLndpdGhfcGlwID0gd2l0aF9waXAKKyAgICAgICAgc2VsZi5wcm9tcHQgPSBwcm9tcHQKIAogICAgIGRlZiBjcmVhdGUoc2VsZiwgZW52X2Rpcik6CiAgICAgICAgICIiIgpAQCAtMTEyLDcgKzkyLDggQEAKICAgICAgICAgY29udGV4dCA9IHR5cGVzLlNpbXBsZU5hbWVzcGFjZSgpCiAgICAgICAgIGNvbnRleHQuZW52X2RpciA9IGVudl9kaXIKICAgICAgICAgY29udGV4dC5lbnZfbmFtZSA9IG9zLnBhdGguc3BsaXQoZW52X2RpcilbMV0KLSAgICAgICAgY29udGV4dC5wcm9tcHQgPSAnKCVzKSAnICUgY29udGV4dC5lbnZfbmFtZQorICAgICAgICBwcm9tcHQgPSBzZWxmLnByb21wdCBpZiBzZWxmLnByb21wdCBpcyBub3QgTm9uZSBlbHNlIGNvbnRleHQuZW52X25hbWUKKyAgICAgICAgY29udGV4dC5wcm9tcHQgPSAnKCVzKSAnICUgcHJvbXB0CiAgICAgICAgIGNyZWF0ZV9pZl9uZWVkZWQoZW52X2RpcikKICAgICAgICAgZW52ID0gb3MuZW52aXJvbgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICdfX1BZVkVOVl9MQVVOQ0hFUl9fJyBpbiBlbnY6CkBAIC0zNDgsMjYgKzMyOSwxMSBAQAogCiAKIGRlZiBjcmVhdGUoZW52X2Rpciwgc3lzdGVtX3NpdGVfcGFja2FnZXM9RmFsc2UsIGNsZWFyPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgd2l0aF9waXA9RmFsc2UpOgotICAgICIiIgotICAgIENyZWF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYSBkaXJlY3RvcnkuCi0KLSAgICBCeSBkZWZhdWx0LCBtYWtlcyB0aGUgc3lzdGVtIChnbG9iYWwpIHNpdGUtcGFja2FnZXMgZGlyICp1biphdmFpbGFibGUgdG8KLSAgICB0aGUgY3JlYXRlZCBlbnZpcm9ubWVudCwgYW5kIHVzZXMgY29weWluZyByYXRoZXIgdGhhbiBzeW1saW5raW5nIGZvciBmaWxlcwotICAgIG9idGFpbmVkIGZyb20gdGhlIHNvdXJjZSBQeXRob24gaW5zdGFsbGF0aW9uLgotCi0gICAgOnBhcmFtIGVudl9kaXI6IFRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIGNyZWF0ZSBhbiBlbnZpcm9ubWVudCBpbi4KLSAgICA6cGFyYW0gc3lzdGVtX3NpdGVfcGFja2FnZXM6IElmIFRydWUsIHRoZSBzeXN0ZW0gKGdsb2JhbCkgc2l0ZS1wYWNrYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyIGlzIGF2YWlsYWJsZSB0byB0aGUgZW52aXJvbm1lbnQuCi0gICAgOnBhcmFtIGNsZWFyOiBJZiBUcnVlLCBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYKLSAgICAgICAgICAgICAgICAgIGl0IGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCi0gICAgOnBhcmFtIHN5bWxpbmtzOiBJZiBUcnVlLCBhdHRlbXB0IHRvIHN5bWxpbmsgcmF0aGVyIHRoYW4gY29weSBmaWxlcyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGVudmlyb25tZW50LgotICAgIDpwYXJhbSB3aXRoX3BpcDogSWYgVHJ1ZSwgZW5zdXJlIHBpcCBpcyBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Ci0gICAgIiIiCisgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzPUZhbHNlLCB3aXRoX3BpcD1GYWxzZSwgcHJvbXB0PU5vbmUpOgorICAgICIiIkNyZWF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYSBkaXJlY3RvcnkuIiIiCiAgICAgYnVpbGRlciA9IEVudkJ1aWxkZXIoc3lzdGVtX3NpdGVfcGFja2FnZXM9c3lzdGVtX3NpdGVfcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXI9Y2xlYXIsIHN5bWxpbmtzPXN5bWxpbmtzLCB3aXRoX3BpcD13aXRoX3BpcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcj1jbGVhciwgc3ltbGlua3M9c3ltbGlua3MsIHdpdGhfcGlwPXdpdGhfcGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdD1wcm9tcHQpCiAgICAgYnVpbGRlci5jcmVhdGUoZW52X2RpcikKIAogZGVmIG1haW4oYXJncz1Ob25lKToKQEAgLTQyNyw2ICszOTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1NraXBzIGluc3RhbGxpbmcgb3IgdXBncmFkaW5nIHBpcCBpbiB0aGUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpcnR1YWwgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J5IGRlZmF1bHQpJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9tcHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1Byb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHByb21wdCBwcmVmaXggZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzIGVudmlyb25tZW50LicpCiAgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQogICAgICAgICBpZiBvcHRpb25zLnVwZ3JhZGUgYW5kIG9wdGlvbnMuY2xlYXI6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd5b3UgY2Fubm90IHN1cHBseSAtLXVwZ3JhZGUgYW5kIC0tY2xlYXIgdG9nZXRoZXIuJykKQEAgLTQzNCw3ICs0MDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcj1vcHRpb25zLmNsZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1vcHRpb25zLnN5bWxpbmtzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGdyYWRlPW9wdGlvbnMudXBncmFkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aF9waXA9b3B0aW9ucy53aXRoX3BpcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aF9waXA9b3B0aW9ucy53aXRoX3BpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0PW9wdGlvbnMucHJvbXB0KQogICAgICAgICBmb3IgZCBpbiBvcHRpb25zLmRpcnM6CiAgICAgICAgICAgICBidWlsZGVyLmNyZWF0ZShkKQogCmRpZmYgLS1naXQgYS9MaWIvdmVudi9zY3JpcHRzL3Bvc2l4L2FjdGl2YXRlIGIvTGliL3ZlbnYvc2NyaXB0cy9wb3NpeC9hY3RpdmF0ZQppbmRleCA3YmJmZmQ5Li5jNzhhNGVmIDEwMDY0NAotLS0gYS9MaWIvdmVudi9zY3JpcHRzL3Bvc2l4L2FjdGl2YXRlCisrKyBiL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBmaQogfQogCi0jIHVuc2V0IGlycmVsYXZlbnQgdmFyaWFibGVzCisjIHVuc2V0IGlycmVsZXZhbnQgdmFyaWFibGVzCiBkZWFjdGl2YXRlIG5vbmRlc3RydWN0aXZlCiAKIFZJUlRVQUxfRU5WPSJfX1ZFTlZfRElSX18iCmRpZmYgLS1naXQgYS9MaWIvdmVudi9zY3JpcHRzL3Bvc2l4L2FjdGl2YXRlLmNzaCBiL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUuY3NoCmluZGV4IDk5ZDc5ZTAuLmIwYzcwMjggMTAwNjQ0Ci0tLSBhL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUuY3NoCisrKyBiL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUuY3NoCkBAIC01LDcgKzUsNyBAQAogCiBhbGlhcyBkZWFjdGl2YXRlICd0ZXN0ICQ/X09MRF9WSVJUVUFMX1BBVEggIT0gMCAmJiBzZXRlbnYgUEFUSCAiJF9PTERfVklSVFVBTF9QQVRIIiAmJiB1bnNldCBfT0xEX1ZJUlRVQUxfUEFUSDsgcmVoYXNoOyB0ZXN0ICQ/X09MRF9WSVJUVUFMX1BST01QVCAhPSAwICYmIHNldCBwcm9tcHQ9IiRfT0xEX1ZJUlRVQUxfUFJPTVBUIiAmJiB1bnNldCBfT0xEX1ZJUlRVQUxfUFJPTVBUOyB1bnNldGVudiBWSVJUVUFMX0VOVjsgdGVzdCAiXCE6KiIgIT0gIm5vbmRlc3RydWN0aXZlIiAmJiB1bmFsaWFzIGRlYWN0aXZhdGUnCiAKLSMgVW5zZXQgaXJyZWxhdmVudCB2YXJpYWJsZXMuCisjIFVuc2V0IGlycmVsZXZhbnQgdmFyaWFibGVzLgogZGVhY3RpdmF0ZSBub25kZXN0cnVjdGl2ZQogCiBzZXRlbnYgVklSVFVBTF9FTlYgIl9fVkVOVl9ESVJfXyIKZGlmZiAtLWdpdCBhL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUuZmlzaCBiL0xpYi92ZW52L3NjcmlwdHMvcG9zaXgvYWN0aXZhdGUuZmlzaAppbmRleCA0NTM5MWFhLi5jYTk4NDY2IDEwMDY0NAotLS0gYS9MaWIvdmVudi9zY3JpcHRzL3Bvc2l4L2FjdGl2YXRlLmZpc2gKKysrIGIvTGliL3ZlbnYvc2NyaXB0cy9wb3NpeC9hY3RpdmF0ZS5maXNoCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgZW5kCiBlbmQKIAotIyB1bnNldCBpcnJlbGF2ZW50IHZhcmlhYmxlcworIyB1bnNldCBpcnJlbGV2YW50IHZhcmlhYmxlcwogZGVhY3RpdmF0ZSBub25kZXN0cnVjdGl2ZQogCiBzZXQgLWd4IFZJUlRVQUxfRU5WICJfX1ZFTlZfRElSX18iCmRpZmYgLS1naXQgYS9MaWIvd2FybmluZ3MucHkgYi9MaWIvd2FybmluZ3MucHkKaW5kZXggYzY2MzFmYy4uMmI0MDdmZiAxMDA2NDQKLS0tIGEvTGliL3dhcm5pbmdzLnB5CisrKyBiL0xpYi93YXJuaW5ncy5weQpAQCAtMiwzOSArMiwxMTIgQEAKIAogaW1wb3J0IHN5cwogCisKIF9fYWxsX18gPSBbIndhcm4iLCAid2Fybl9leHBsaWNpdCIsICJzaG93d2FybmluZyIsCiAgICAgICAgICAgICJmb3JtYXR3YXJuaW5nIiwgImZpbHRlcndhcm5pbmdzIiwgInNpbXBsZWZpbHRlciIsCiAgICAgICAgICAgICJyZXNldHdhcm5pbmdzIiwgImNhdGNoX3dhcm5pbmdzIl0KIAotCiBkZWYgc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgICAiIiJIb29rIHRvIHdyaXRlIGEgd2FybmluZyB0byBhIGZpbGU7IHJlcGxhY2UgaWYgeW91IGxpa2UuIiIiCi0gICAgaWYgZmlsZSBpcyBOb25lOgotICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgotICAgICAgICBpZiBmaWxlIGlzIE5vbmU6Ci0gICAgICAgICAgICAjIHN5cy5zdGRlcnIgaXMgTm9uZSB3aGVuIHJ1biB3aXRoIHB5dGhvbncuZXhlIC0gd2FybmluZ3MgZ2V0IGxvc3QKLSAgICAgICAgICAgIHJldHVybgotICAgIHRyeToKLSAgICAgICAgZmlsZS53cml0ZShmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lKQorICAgIF9zaG93d2Fybm1zZ19pbXBsKG1zZykKIAogZGVmIGZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CiAgICAgIiIiRnVuY3Rpb24gdG8gZm9ybWF0IGEgd2FybmluZyB0aGUgc3RhbmRhcmQgd2F5LiIiIgotICAgIHMgPSAgIiVzOiVzOiAlczogJXNcbiIgJSAoZmlsZW5hbWUsIGxpbmVubywgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCi0gICAgaWYgbGluZSBpcyBOb25lOgorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBOb25lLCBsaW5lKQorICAgIHJldHVybiBfZm9ybWF0d2Fybm1zZ19pbXBsKG1zZykKKworZGVmIF9zaG93d2Fybm1zZ19pbXBsKG1zZyk6CisgICAgZmlsZSA9IG1zZy5maWxlCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICAjIHN5cy5zdGRlcnIgaXMgTm9uZSB3aGVuIHJ1biB3aXRoIHB5dGhvbncuZXhlOgorICAgICAgICAgICAgIyB3YXJuaW5ncyBnZXQgbG9zdAorICAgICAgICAgICAgcmV0dXJuCisgICAgdGV4dCA9IF9mb3JtYXR3YXJubXNnKG1zZykKKyAgICB0cnk6CisgICAgICAgIGZpbGUud3JpdGUodGV4dCkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KKyAgICAgICAgcGFzcworCitkZWYgX2Zvcm1hdHdhcm5tc2dfaW1wbChtc2cpOgorICAgIHMgPSAgKCIlczolczogJXM6ICVzXG4iCisgICAgICAgICAgJSAobXNnLmZpbGVuYW1lLCBtc2cubGluZW5vLCBtc2cuY2F0ZWdvcnkuX19uYW1lX18sCisgICAgICAgICAgICAgbXNnLm1lc3NhZ2UpKQorCisgICAgaWYgbXNnLmxpbmUgaXMgTm9uZToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGxpbmVjYWNoZQotICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUobXNnLmZpbGVuYW1lLCBtc2cubGluZW5vKQogICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgIyBXaGVuIGEgd2FybmluZyBpcyBsb2dnZWQgZHVyaW5nIFB5dGhvbiBzaHV0ZG93biwgbGluZWNhY2hlCiAgICAgICAgICAgICAjIGFuZCB0aGUgaW1wb3J0IG1hY2hpbmVyeSBkb24ndCB3b3JrIGFueW1vcmUKICAgICAgICAgICAgIGxpbmUgPSBOb25lCisgICAgICAgICAgICBsaW5lY2FjaGUgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgbGluZSA9IG1zZy5saW5lCiAgICAgaWYgbGluZToKICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICBzICs9ICIgICVzXG4iICUgbGluZQorCisgICAgaWYgbXNnLnNvdXJjZSBpcyBub3QgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlbWFsbG9jCisgICAgICAgICAgICB0YiA9IHRyYWNlbWFsbG9jLmdldF9vYmplY3RfdHJhY2ViYWNrKG1zZy5zb3VyY2UpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAjIFdoZW4gYSB3YXJuaW5nIGlzIGxvZ2dlZCBkdXJpbmcgUHl0aG9uIHNodXRkb3duLCB0cmFjZW1hbGxvYworICAgICAgICAgICAgIyBhbmQgdGhlIGltcG9ydCBtYWNoaW5lcnkgZG9uJ3Qgd29yayBhbnltb3JlCisgICAgICAgICAgICB0YiA9IE5vbmUKKworICAgICAgICBpZiB0YiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHMgKz0gJ09iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuJworICAgICAgICAgICAgZm9yIGZyYW1lIGluIHRiOgorICAgICAgICAgICAgICAgIHMgKz0gKCcgIEZpbGUgIiVzIiwgbGluZW5vICVzXG4nCisgICAgICAgICAgICAgICAgICAgICAgJSAoZnJhbWUuZmlsZW5hbWUsIGZyYW1lLmxpbmVubykpCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVjYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmcmFtZS5maWxlbmFtZSwgZnJhbWUubGluZW5vKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgcyArPSAnICAgICVzXG4nICUgbGluZQogICAgIHJldHVybiBzCiAKKyMgS2VlcCBhIHJlZmVyZW5jZSB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gd2FzIHJlcGxhY2VkCitfc2hvd3dhcm5pbmcgPSBzaG93d2FybmluZworCitkZWYgX3Nob3d3YXJubXNnKG1zZyk6CisgICAgIiIiSG9vayB0byB3cml0ZSBhIHdhcm5pbmcgdG8gYSBmaWxlOyByZXBsYWNlIGlmIHlvdSBsaWtlLiIiIgorICAgIHNob3d3YXJuaW5nID0gZ2xvYmFscygpLmdldCgnc2hvd3dhcm5pbmcnLCBfc2hvd3dhcm5pbmcpCisgICAgaWYgc2hvd3dhcm5pbmcgaXMgbm90IF9zaG93d2FybmluZzoKKyAgICAgICAgIyB3YXJuaW5ncy5zaG93d2FybmluZygpIHdhcyByZXBsYWNlZAorICAgICAgICBpZiBub3QgY2FsbGFibGUoc2hvd3dhcm5pbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvciBtZXRob2QiKQorCisgICAgICAgIHNob3d3YXJuaW5nKG1zZy5tZXNzYWdlLCBtc2cuY2F0ZWdvcnksIG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgbXNnLmZpbGUsIG1zZy5saW5lKQorICAgICAgICByZXR1cm4KKyAgICBfc2hvd3dhcm5tc2dfaW1wbChtc2cpCisKKyMgS2VlcCBhIHJlZmVyZW5jZSB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gd2FzIHJlcGxhY2VkCitfZm9ybWF0d2FybmluZyA9IGZvcm1hdHdhcm5pbmcKKworZGVmIF9mb3JtYXR3YXJubXNnKG1zZyk6CisgICAgIiIiRnVuY3Rpb24gdG8gZm9ybWF0IGEgd2FybmluZyB0aGUgc3RhbmRhcmQgd2F5LiIiIgorICAgIGZvcm1hdHdhcm5pbmcgPSBnbG9iYWxzKCkuZ2V0KCdmb3JtYXR3YXJuaW5nJywgX2Zvcm1hdHdhcm5pbmcpCisgICAgaWYgZm9ybWF0d2FybmluZyBpcyBub3QgX2Zvcm1hdHdhcm5pbmc6CisgICAgICAgICMgd2FybmluZ3MuZm9ybWF0d2FybmluZygpIHdhcyByZXBsYWNlZAorICAgICAgICByZXR1cm4gZm9ybWF0d2FybmluZyhtc2cubWVzc2FnZSwgbXNnLmNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8sIGxpbmU9bXNnLmxpbmUpCisgICAgcmV0dXJuIF9mb3JtYXR3YXJubXNnX2ltcGwobXNnKQorCiBkZWYgZmlsdGVyd2FybmluZ3MoYWN0aW9uLCBtZXNzYWdlPSIiLCBjYXRlZ29yeT1XYXJuaW5nLCBtb2R1bGU9IiIsIGxpbmVubz0wLAogICAgICAgICAgICAgICAgICAgIGFwcGVuZD1GYWxzZSk6CiAgICAgIiIiSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGxpc3Qgb2Ygd2FybmluZ3MgZmlsdGVycyAoYXQgdGhlIGZyb250KS4KQEAgLTE4NSw3ICsyNTgsNyBAQAogCiAKICMgQ29kZSB0eXBpY2FsbHkgcmVwbGFjZWQgYnkgX3dhcm5pbmdzCi1kZWYgd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpOgorZGVmIHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xLCBzb3VyY2U9Tm9uZSk6CiAgICAgIiIiSXNzdWUgYSB3YXJuaW5nLCBvciBtYXliZSBpZ25vcmUgaXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLiIiIgogICAgICMgQ2hlY2sgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGEgV2FybmluZyBvYmplY3QKICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIFdhcm5pbmcpOgpAQCAtMjM1LDEwICszMDgsMTEgQEAKICAgICAgICAgICAgIGZpbGVuYW1lID0gbW9kdWxlCiAgICAgcmVnaXN0cnkgPSBnbG9iYWxzLnNldGRlZmF1bHQoIl9fd2FybmluZ3JlZ2lzdHJ5X18iLCB7fSkKICAgICB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgZ2xvYmFscykKKyAgICAgICAgICAgICAgICAgIGdsb2JhbHMsIHNvdXJjZSkKIAogZGVmIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CisgICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1Ob25lKToKICAgICBsaW5lbm8gPSBpbnQobGluZW5vKQogICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgICBtb2R1bGUgPSBmaWxlbmFtZSBvciAiPHVua25vd24+IgpAQCAtMzAzLDIyICszNzcsMTggQEAKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGFjdGlvbiAoJXIpIGluIHdhcm5pbmdzLmZpbHRlcnM6XG4gJXMiICUKICAgICAgICAgICAgICAgKGFjdGlvbiwgaXRlbSkpCi0gICAgaWYgbm90IGNhbGxhYmxlKHNob3d3YXJuaW5nKToKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9yIG1ldGhvZCIpCiAgICAgIyBQcmludCBtZXNzYWdlIGFuZCBjb250ZXh0Ci0gICAgc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgbXNnID0gV2FybmluZ01lc3NhZ2UobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIHNvdXJjZSkKKyAgICBfc2hvd3dhcm5tc2cobXNnKQogCiAKIGNsYXNzIFdhcm5pbmdNZXNzYWdlKG9iamVjdCk6CiAKLSAgICAiIiJIb2xkcyB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlIHNob3d3YXJuaW5nKCkgY2FsbC4iIiIKLQogICAgIF9XQVJOSU5HX0RFVEFJTFMgPSAoIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAiZmlsZW5hbWUiLCAibGluZW5vIiwgImZpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUiLCAic291cmNlIikKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICBsaW5lPU5vbmUpOgorICAgICAgICAgICAgICAgICBsaW5lPU5vbmUsIHNvdXJjZT1Ob25lKToKICAgICAgICAgbG9jYWxfdmFsdWVzID0gbG9jYWxzKCkKICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fV0FSTklOR19ERVRBSUxTOgogICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBsb2NhbF92YWx1ZXNbYXR0cl0pCkBAIC0zNzYsMTEgKzQ0NiwxMiBAQAogICAgICAgICBzZWxmLl9tb2R1bGUuZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnNbOl0KICAgICAgICAgc2VsZi5fbW9kdWxlLl9maWx0ZXJzX211dGF0ZWQoKQogICAgICAgICBzZWxmLl9zaG93d2FybmluZyA9IHNlbGYuX21vZHVsZS5zaG93d2FybmluZworICAgICAgICBzZWxmLl9zaG93d2Fybm1zZyA9IHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cKICAgICAgICAgaWYgc2VsZi5fcmVjb3JkOgogICAgICAgICAgICAgbG9nID0gW10KLSAgICAgICAgICAgIGRlZiBzaG93d2FybmluZygqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoV2FybmluZ01lc3NhZ2UoKmFyZ3MsICoqa3dhcmdzKSkKLSAgICAgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNob3d3YXJuaW5nCisgICAgICAgICAgICBkZWYgc2hvd2Fybm1zZyhtc2cpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQobXNnKQorICAgICAgICAgICAgc2VsZi5fbW9kdWxlLl9zaG93d2Fybm1zZyA9IHNob3dhcm5tc2cKICAgICAgICAgICAgIHJldHVybiBsb2cKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBOb25lCkBAIC0zOTEsNiArNDYyLDcgQEAKICAgICAgICAgc2VsZi5fbW9kdWxlLmZpbHRlcnMgPSBzZWxmLl9maWx0ZXJzCiAgICAgICAgIHNlbGYuX21vZHVsZS5fZmlsdGVyc19tdXRhdGVkKCkKICAgICAgICAgc2VsZi5fbW9kdWxlLnNob3d3YXJuaW5nID0gc2VsZi5fc2hvd3dhcm5pbmcKKyAgICAgICAgc2VsZi5fbW9kdWxlLl9zaG93d2Fybm1zZyA9IHNlbGYuX3Nob3d3YXJubXNnCiAKIAogIyBmaWx0ZXJzIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgZmlsdGVyIDUtdHVwbGVzCmRpZmYgLS1naXQgYS9MaWIvd2F2ZS5weSBiL0xpYi93YXZlLnB5CmluZGV4IDhhMTAxZTMuLmY3MWY3ZTUgMTAwNjQ0Ci0tLSBhL0xpYi93YXZlLnB5CisrKyBiL0xpYi93YXZlLnB5CkBAIC03Myw3ICs3Myw3IEBACiAKIGltcG9ydCBidWlsdGlucwogCi1fX2FsbF9fID0gWyJvcGVuIiwgIm9wZW5mcCIsICJFcnJvciJdCitfX2FsbF9fID0gWyJvcGVuIiwgIm9wZW5mcCIsICJFcnJvciIsICJXYXZlX3JlYWQiLCAiV2F2ZV93cml0ZSJdCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weSBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKaW5kZXggN2ZkZGJlOC4uZjcxNTYzYSAxMDA2NDQKLS0tIGEvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQorKysgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CkBAIC0xMSw3ICsxMSw2IEBACiAiIiIKIAogZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgotZnJvbSBpbyBpbXBvcnQgQnVmZmVyZWRXcml0ZXIKIGltcG9ydCBzeXMKIGltcG9ydCB1cmxsaWIucGFyc2UKIGZyb20gd3NnaXJlZi5oYW5kbGVycyBpbXBvcnQgU2ltcGxlSGFuZGxlcgpAQCAtMTI3LDE3ICsxMjYsMTEgQEAKICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VfcmVxdWVzdCgpOiAjIEFuIGVycm9yIGNvZGUgaGFzIGJlZW4gc2VudCwganVzdCBleGl0CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAjIEF2b2lkIHBhc3NpbmcgdGhlIHJhdyBmaWxlIG9iamVjdCB3ZmlsZSwgd2hpY2ggY2FuIGRvIHBhcnRpYWwKLSAgICAgICAgIyB3cml0ZXMgKElzc3VlIDI0MjkxKQotICAgICAgICBzdGRvdXQgPSBCdWZmZXJlZFdyaXRlcihzZWxmLndmaWxlKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBoYW5kbGVyID0gU2VydmVySGFuZGxlcigKLSAgICAgICAgICAgICAgICBzZWxmLnJmaWxlLCBzdGRvdXQsIHNlbGYuZ2V0X3N0ZGVycigpLCBzZWxmLmdldF9lbnZpcm9uKCkKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIGhhbmRsZXIucmVxdWVzdF9oYW5kbGVyID0gc2VsZiAgICAgICMgYmFja3BvaW50ZXIgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgIGhhbmRsZXIucnVuKHNlbGYuc2VydmVyLmdldF9hcHAoKSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHN0ZG91dC5kZXRhY2goKQorICAgICAgICBoYW5kbGVyID0gU2VydmVySGFuZGxlcigKKyAgICAgICAgICAgIHNlbGYucmZpbGUsIHNlbGYud2ZpbGUsIHNlbGYuZ2V0X3N0ZGVycigpLCBzZWxmLmdldF9lbnZpcm9uKCkKKyAgICAgICAgKQorICAgICAgICBoYW5kbGVyLnJlcXVlc3RfaGFuZGxlciA9IHNlbGYgICAgICAjIGJhY2twb2ludGVyIGZvciBsb2dnaW5nCisgICAgICAgIGhhbmRsZXIucnVuKHNlbGYuc2VydmVyLmdldF9hcHAoKSkKIAogCiAKQEAgLTE2MywxMCArMTU2LDkgQEAKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQotICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKLSAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iKQotICAgIGltcG9ydCB3ZWJicm93c2VyCi0gICAgd2ViYnJvd3Nlci5vcGVuKCdodHRwOi8vbG9jYWxob3N0OjgwMDAveHl6P2FiYycpCi0gICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKSAgIyBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0Ci0gICAgaHR0cGQuc2VydmVyX2Nsb3NlKCkKKyAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKKyAgICAgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICAgICAgd2ViYnJvd3Nlci5vcGVuKCdodHRwOi8vbG9jYWxob3N0OjgwMDAveHl6P2FiYycpCisgICAgICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdApkaWZmIC0tZ2l0IGEvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKaW5kZXggNmQxYjBhYi4uNjdiN2YyYiAxMDA2NDQKLS0tIGEvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQorKysgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CkBAIC04NSw3ICs4NSw3IEBACiAgICAgIlRyZWVCdWlsZGVyIiwKICAgICAiVkVSU0lPTiIsCiAgICAgIlhNTCIsICJYTUxJRCIsCi0gICAgIlhNTFBhcnNlciIsCisgICAgIlhNTFBhcnNlciIsICJYTUxQdWxsUGFyc2VyIiwKICAgICAicmVnaXN0ZXJfbmFtZXNwYWNlIiwKICAgICBdCiAKQEAgLTk1LDYgKzk1LDcgQEAKIGltcG9ydCByZQogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgaW8KK2ltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbnRleHRsaWIKIAogZnJvbSAuIGltcG9ydCBFbGVtZW50UGF0aApAQCAtMTIwMCwxNiArMTIwMSwzNyBAQAogICAgIFJldHVybnMgYW4gaXRlcmF0b3IgcHJvdmlkaW5nIChldmVudCwgZWxlbSkgcGFpcnMuCiAKICAgICAiIiIKKyAgICAjIFVzZSB0aGUgaW50ZXJuYWwsIHVuZG9jdW1lbnRlZCBfcGFyc2VyIGFyZ3VtZW50IGZvciBub3c7IFdoZW4gdGhlCisgICAgIyBwYXJzZXIgYXJndW1lbnQgb2YgaXRlcnBhcnNlIGlzIHJlbW92ZWQsIHRoaXMgY2FuIGJlIGtpbGxlZC4KKyAgICBwdWxscGFyc2VyID0gWE1MUHVsbFBhcnNlcihldmVudHM9ZXZlbnRzLCBfcGFyc2VyPXBhcnNlcikKKyAgICBkZWYgaXRlcmF0b3IoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHB1bGxwYXJzZXIucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgICAgICMgbG9hZCBldmVudCBidWZmZXIKKyAgICAgICAgICAgICAgICBkYXRhID0gc291cmNlLnJlYWQoMTYgKiAxMDI0KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHB1bGxwYXJzZXIuZmVlZChkYXRhKQorICAgICAgICAgICAgcm9vdCA9IHB1bGxwYXJzZXIuX2Nsb3NlX2FuZF9yZXR1cm5fcm9vdCgpCisgICAgICAgICAgICB5aWVsZCBmcm9tIHB1bGxwYXJzZXIucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgaXQucm9vdCA9IHJvb3QKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGNsb3NlX3NvdXJjZToKKyAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQorCisgICAgY2xhc3MgSXRlclBhcnNlSXRlcmF0b3IoY29sbGVjdGlvbnMuSXRlcmF0b3IpOgorICAgICAgICBfX25leHRfXyA9IGl0ZXJhdG9yKCkuX19uZXh0X18KKyAgICBpdCA9IEl0ZXJQYXJzZUl0ZXJhdG9yKCkKKyAgICBpdC5yb290ID0gTm9uZQorICAgIGRlbCBpdGVyYXRvciwgSXRlclBhcnNlSXRlcmF0b3IKKwogICAgIGNsb3NlX3NvdXJjZSA9IEZhbHNlCiAgICAgaWYgbm90IGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgogICAgICAgICBzb3VyY2UgPSBvcGVuKHNvdXJjZSwgInJiIikKICAgICAgICAgY2xvc2Vfc291cmNlID0gVHJ1ZQotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIF9JdGVyUGFyc2VJdGVyYXRvcihzb3VyY2UsIGV2ZW50cywgcGFyc2VyLCBjbG9zZV9zb3VyY2UpCi0gICAgZXhjZXB0OgotICAgICAgICBpZiBjbG9zZV9zb3VyY2U6Ci0gICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQotICAgICAgICByYWlzZQorCisgICAgcmV0dXJuIGl0CiAKIAogY2xhc3MgWE1MUHVsbFBhcnNlcjoKQEAgLTEyMTksOSArMTI0MSw3IEBACiAgICAgICAgICMgdXBvbiBpbiB1c2VyIGNvZGUuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTc3NDEgZm9yIG1vcmUgZGV0YWlscy4KIAotICAgICAgICAjIF9lbGVtZW50dHJlZS5jIGV4cGVjdHMgYSBsaXN0LCBub3QgYSBkZXF1ZQotICAgICAgICBzZWxmLl9ldmVudHNfcXVldWUgPSBbXQotICAgICAgICBzZWxmLl9pbmRleCA9IDAKKyAgICAgICAgc2VsZi5fZXZlbnRzX3F1ZXVlID0gY29sbGVjdGlvbnMuZGVxdWUoKQogICAgICAgICBzZWxmLl9wYXJzZXIgPSBfcGFyc2VyIG9yIFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKICAgICAgICAgIyB3aXJlIHVwIHRoZSBwYXJzZXIgZm9yIGV2ZW50IHJlcG9ydGluZwogICAgICAgICBpZiBldmVudHMgaXMgTm9uZToKQEAgLTEyNTksNjQgKzEyNzksMTQgQEAKICAgICAgICAgcmV0cmlldmVkIGZyb20gdGhlIGl0ZXJhdG9yLgogICAgICAgICAiIiIKICAgICAgICAgZXZlbnRzID0gc2VsZi5fZXZlbnRzX3F1ZXVlCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICBpbmRleCA9IHNlbGYuX2luZGV4Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudHNbc2VsZi5faW5kZXhdCi0gICAgICAgICAgICAgICAgIyBBdm9pZCByZXRhaW5pbmcgcmVmZXJlbmNlcyB0byBwYXN0IGV2ZW50cwotICAgICAgICAgICAgICAgIGV2ZW50c1tzZWxmLl9pbmRleF0gPSBOb25lCi0gICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaW5kZXggKz0gMQotICAgICAgICAgICAgIyBDb21wYWN0IHRoZSBsaXN0IGluIGEgTygxKSBhbW9ydGl6ZWQgZmFzaGlvbgotICAgICAgICAgICAgIyBBcyBub3RlZCBhYm92ZSwgX2VsZW1lbnRyZWUuYyBuZWVkcyBhIGxpc3QsIG5vdCBhIGRlcXVlCi0gICAgICAgICAgICBpZiBpbmRleCAqIDIgPj0gbGVuKGV2ZW50cyk6Ci0gICAgICAgICAgICAgICAgZXZlbnRzWzppbmRleF0gPSBbXQotICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ID0gMAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCA9IGluZGV4CisgICAgICAgIHdoaWxlIGV2ZW50czoKKyAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRzLnBvcGxlZnQoKQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgRXhjZXB0aW9uKToKICAgICAgICAgICAgICAgICByYWlzZSBldmVudAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB5aWVsZCBldmVudAogCiAKLWNsYXNzIF9JdGVyUGFyc2VJdGVyYXRvcjoKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGV2ZW50cywgcGFyc2VyLCBjbG9zZV9zb3VyY2U9RmFsc2UpOgotICAgICAgICAjIFVzZSB0aGUgaW50ZXJuYWwsIHVuZG9jdW1lbnRlZCBfcGFyc2VyIGFyZ3VtZW50IGZvciBub3c7IFdoZW4gdGhlCi0gICAgICAgICMgcGFyc2VyIGFyZ3VtZW50IG9mIGl0ZXJwYXJzZSBpcyByZW1vdmVkLCB0aGlzIGNhbiBiZSBraWxsZWQuCi0gICAgICAgIHNlbGYuX3BhcnNlciA9IFhNTFB1bGxQYXJzZXIoZXZlbnRzPWV2ZW50cywgX3BhcnNlcj1wYXJzZXIpCi0gICAgICAgIHNlbGYuX2ZpbGUgPSBzb3VyY2UKLSAgICAgICAgc2VsZi5fY2xvc2VfZmlsZSA9IGNsb3NlX3NvdXJjZQotICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLl9yb290ID0gTm9uZQotCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBzZWxmLl9wYXJzZXIucmVhZF9ldmVudHMoKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5fcGFyc2VyLl9wYXJzZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAjIGxvYWQgZXZlbnQgYnVmZmVyCi0gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZCgxNiAqIDEwMjQpCi0gICAgICAgICAgICAgICAgaWYgZGF0YToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VyLmZlZWQoZGF0YSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9yb290ID0gc2VsZi5fcGFyc2VyLl9jbG9zZV9hbmRfcmV0dXJuX3Jvb3QoKQotICAgICAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdAotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlOgotICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgaWYgc2VsZi5fY2xvc2VfZmlsZToKLSAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQotICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLQogZGVmIFhNTCh0ZXh0LCBwYXJzZXI9Tm9uZSk6CiAgICAgIiIiUGFyc2UgWE1MIGRvY3VtZW50IGZyb20gc3RyaW5nIGNvbnN0YW50LgogCmRpZmYgLS1naXQgYS9MaWIveG1scnBjL2NsaWVudC5weSBiL0xpYi94bWxycGMvY2xpZW50LnB5CmluZGV4IGJiZjllZTYuLjU4MWEzYjkgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGMvY2xpZW50LnB5CisrKyBiL0xpYi94bWxycGMvY2xpZW50LnB5CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICByZXR1cm4gcy5yZXBsYWNlKCI+IiwgIiZndDsiLCkKIAogIyB1c2VkIGluIFVzZXItQWdlbnQgaGVhZGVyIHNlbnQKLV9fdmVyc2lvbl9fID0gc3lzLnZlcnNpb25bOjNdCitfX3ZlcnNpb25fXyA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogCiAjIHhtbHJwYyBpbnRlZ2VyIGxpbWl0cwogTUFYSU5UID0gIDIqKjMxLTEKZGlmZiAtLWdpdCBhL0xpYi94bWxycGMvc2VydmVyLnB5IGIvTGliL3htbHJwYy9zZXJ2ZXIucHkKaW5kZXggNzgxNzY5My4uODQ5YmZkZCAxMDA2NDQKLS0tIGEvTGliL3htbHJwYy9zZXJ2ZXIucHkKKysrIGIvTGliL3htbHJwYy9zZXJ2ZXIucHkKQEAgLTk3MSwxNiArOTcxLDE1IEBACiAgICAgICAgICAgICBkZWYgZ2V0Q3VycmVudFRpbWUoKToKICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKIAotICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQotICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKLSAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQotICAgIHByaW50KCdJdCBpcyBhZHZpc2FibGUgdG8gcnVuIHRoaXMgZXhhbXBsZSBzZXJ2ZXIgd2l0aGluIGEgc2VjdXJlLCBjbG9zZWQgbmV0d29yay4nKQotICAgIHRyeToKLSAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCi0gICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpIGFzIHNlcnZlcjoKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQorICAgICAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQorICAgICAgICBwcmludCgnSXQgaXMgYWR2aXNhYmxlIHRvIHJ1biB0aGlzIGV4YW1wbGUgc2VydmVyIHdpdGhpbiBhIHNlY3VyZSwgY2xvc2VkIG5ldHdvcmsuJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCmRpZmYgLS1naXQgYS9MaWIvemlwZmlsZS5weSBiL0xpYi96aXBmaWxlLnB5CmluZGV4IDU2YTI0NzkuLjhkZDA2NGEgMTAwNjQ0Ci0tLSBhL0xpYi96aXBmaWxlLnB5CisrKyBiL0xpYi96aXBmaWxlLnB5CkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyBmaWxlbW9kZT0lcicgJSBzdGF0LmZpbGVtb2RlKGhpKSkKICAgICAgICAgaWYgbG86CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgZXh0ZXJuYWxfYXR0cj0lI3gnICUgbG8pCi0gICAgICAgIGlzZGlyID0gc2VsZi5maWxlbmFtZVstMTpdID09ICcvJworICAgICAgICBpc2RpciA9IHNlbGYuaXNfZGlyKCkKICAgICAgICAgaWYgbm90IGlzZGlyIG9yIHNlbGYuZmlsZV9zaXplOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIGZpbGVfc2l6ZT0lcicgJSBzZWxmLmZpbGVfc2l6ZSkKICAgICAgICAgaWYgKChub3QgaXNkaXIgb3Igc2VsZi5jb21wcmVzc19zaXplKSBhbmQKQEAgLTQ2OSw2ICs0NjksNDIgQEAKIAogICAgICAgICAgICAgZXh0cmEgPSBleHRyYVtsbis0Ol0KIAorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2ZpbGUoY2xzLCBmaWxlbmFtZSwgYXJjbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGFuIGFwcHJvcHJpYXRlIFppcEluZm8gZm9yIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgICAgICBmaWxlbmFtZSBzaG91bGQgYmUgdGhlIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgICAgICBhcmNuYW1lIGlzIHRoZSBuYW1lIHdoaWNoIGl0IHdpbGwgaGF2ZSB3aXRoaW4gdGhlIGFyY2hpdmUgKGJ5IGRlZmF1bHQsCisgICAgICAgIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBmaWxlbmFtZSwgYnV0IHdpdGhvdXQgYSBkcml2ZSBsZXR0ZXIgYW5kIHdpdGgKKyAgICAgICAgbGVhZGluZyBwYXRoIHNlcGFyYXRvcnMgcmVtb3ZlZCkuCisgICAgICAgICIiIgorICAgICAgICBzdCA9IG9zLnN0YXQoZmlsZW5hbWUpCisgICAgICAgIGlzZGlyID0gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCisgICAgICAgIG10aW1lID0gdGltZS5sb2NhbHRpbWUoc3Quc3RfbXRpbWUpCisgICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KKyAgICAgICAgIyBDcmVhdGUgWmlwSW5mbyBpbnN0YW5jZSB0byBzdG9yZSBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGFyY25hbWUgPSBmaWxlbmFtZQorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSlbMV0pCisgICAgICAgIHdoaWxlIGFyY25hbWVbMF0gaW4gKG9zLnNlcCwgb3MuYWx0c2VwKToKKyAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQorICAgICAgICBpZiBpc2RpcjoKKyAgICAgICAgICAgIGFyY25hbWUgKz0gJy8nCisgICAgICAgIHppbmZvID0gY2xzKGFyY25hbWUsIGRhdGVfdGltZSkKKyAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IChzdC5zdF9tb2RlICYgMHhGRkZGKSA8PCAxNiAgIyBVbml4IGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCisgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyIHw9IDB4MTAgICMgTVMtRE9TIGRpcmVjdG9yeSBmbGFnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCisKKyAgICAgICAgcmV0dXJuIHppbmZvCisKKyAgICBkZWYgaXNfZGlyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGlzIGFyY2hpdmUgbWVtYmVyIGlzIGEgZGlyZWN0b3J5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZVstMV0gPT0gJy8nCisKIAogY2xhc3MgX1ppcERlY3J5cHRlcjoKICAgICAiIiJDbGFzcyB0byBoYW5kbGUgZGVjcnlwdGlvbiBvZiBmaWxlcyBzdG9yZWQgd2l0aGluIGEgWklQIGFyY2hpdmUuCkBAIC02NTEsMTQgKzY4NywxOSBAQAogCiAKIGNsYXNzIF9TaGFyZWRGaWxlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBwb3MsIGNsb3NlLCBsb2NrKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgcG9zLCBjbG9zZSwgbG9jaywgd3JpdGluZyk6CiAgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCiAgICAgICAgIHNlbGYuX3BvcyA9IHBvcwogICAgICAgICBzZWxmLl9jbG9zZSA9IGNsb3NlCiAgICAgICAgIHNlbGYuX2xvY2sgPSBsb2NrCisgICAgICAgIHNlbGYuX3dyaXRpbmcgPSB3cml0aW5nCiAKICAgICBkZWYgcmVhZChzZWxmLCBuPS0xKToKICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGluZygpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3QgcmVhZCBmcm9tIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaXMgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBvbiBpdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSB3cml0aW5nIGhhbmRsZSBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQuIikKICAgICAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9wb3MpCiAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKG4pCiAgICAgICAgICAgICBzZWxmLl9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQpAQCAtNzAyLDkgKzc0Myw2IEBACiAgICAgIyBSZWFkIGZyb20gY29tcHJlc3NlZCBmaWxlcyBpbiA0ayBibG9ja3MuCiAgICAgTUlOX1JFQURfU0laRSA9IDQwOTYKIAotICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCi0gICAgUEFUVEVSTiA9IHJlLmNvbXBpbGUoYnInXig/UDxjaHVuaz5bXlxyXG5dKyl8KD9QPG5ld2xpbmU+XG58XHJcbj8pJykKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBtb2RlLCB6aXBpbmZvLCBkZWNyeXB0ZXI9Tm9uZSwKICAgICAgICAgICAgICAgICAgY2xvc2VfZmlsZW9iaj1GYWxzZSk6CiAgICAgICAgIHNlbGYuX2ZpbGVvYmogPSBmaWxlb2JqCkBAIC03MjEsNyArNzU5LDYgQEAKICAgICAgICAgc2VsZi5fcmVhZGJ1ZmZlciA9IGInJwogICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCiAKLSAgICAgICAgc2VsZi5fdW5pdmVyc2FsID0gJ1UnIGluIG1vZGUKICAgICAgICAgc2VsZi5uZXdsaW5lcyA9IE5vbmUKIAogICAgICAgICAjIEFkanVzdCByZWFkIHNpemUgZm9yIGVuY3J5cHRlZCBmaWxlcyBzaW5jZSB0aGUgZmlyc3QgMTIgYnl0ZXMKQEAgLTc1OCw3ICs3OTUsNyBAQAogICAgICAgICBJZiBsaW1pdCBpcyBzcGVjaWZpZWQsIGF0IG1vc3QgbGltaXQgYnl0ZXMgd2lsbCBiZSByZWFkLgogICAgICAgICAiIiIKIAotICAgICAgICBpZiBub3Qgc2VsZi5fdW5pdmVyc2FsIGFuZCBsaW1pdCA8IDA6CisgICAgICAgIGlmIGxpbWl0IDwgMDoKICAgICAgICAgICAgICMgU2hvcnRjdXQgY29tbW9uIGNhc2UgLSBuZXdsaW5lIGZvdW5kIGluIGJ1ZmZlci4KICAgICAgICAgICAgIGkgPSBzZWxmLl9yZWFkYnVmZmVyLmZpbmQoYidcbicsIHNlbGYuX29mZnNldCkgKyAxCiAgICAgICAgICAgICBpZiBpID4gMDoKQEAgLTc2Niw0MSArODAzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgPSBpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKIAotICAgICAgICBpZiBub3Qgc2VsZi5fdW5pdmVyc2FsOgotICAgICAgICAgICAgcmV0dXJuIGlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRsaW5lKHNlbGYsIGxpbWl0KQotCi0gICAgICAgIGxpbmUgPSBiJycKLSAgICAgICAgd2hpbGUgbGltaXQgPCAwIG9yIGxlbihsaW5lKSA8IGxpbWl0OgotICAgICAgICAgICAgcmVhZGFoZWFkID0gc2VsZi5wZWVrKDIpCi0gICAgICAgICAgICBpZiByZWFkYWhlYWQgPT0gYicnOgotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCi0KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFRoZSBwYXR0ZXJuIHJldHVybnMgZWl0aGVyIGEgbGluZSBjaHVuayBvciBhIG5ld2xpbmUsIGJ1dCBub3QKLSAgICAgICAgICAgICMgYm90aC4gQ29tYmluZWQgd2l0aCBwZWVrKDIpLCB3ZSBhcmUgYXNzdXJlZCB0aGF0IHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgIyAnXHJcbicgaXMgYWx3YXlzIHJldHJpZXZlZCBjb21wbGV0ZWx5IGFuZCBuZXZlciBzcGxpdCBpbnRvCi0gICAgICAgICAgICAjIHNlcGFyYXRlIG5ld2xpbmVzIC0gJ1xyJywgJ1xuJyBkdWUgdG8gY29pbmNpZGVudGFsIHJlYWRhaGVhZHMuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBtYXRjaCA9IHNlbGYuUEFUVEVSTi5zZWFyY2gocmVhZGFoZWFkKQotICAgICAgICAgICAgbmV3bGluZSA9IG1hdGNoLmdyb3VwKCduZXdsaW5lJykKLSAgICAgICAgICAgIGlmIG5ld2xpbmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5uZXdsaW5lcyBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzID0gW10KLSAgICAgICAgICAgICAgICBpZiBuZXdsaW5lIG5vdCBpbiBzZWxmLm5ld2xpbmVzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzLmFwcGVuZChuZXdsaW5lKQotICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4obmV3bGluZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZSArIGInXG4nCi0KLSAgICAgICAgICAgIGNodW5rID0gbWF0Y2guZ3JvdXAoJ2NodW5rJykKLSAgICAgICAgICAgIGlmIGxpbWl0ID49IDA6Ci0gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVua1s6IGxpbWl0IC0gbGVuKGxpbmUpXQotCi0gICAgICAgICAgICBzZWxmLl9vZmZzZXQgKz0gbGVuKGNodW5rKQotICAgICAgICAgICAgbGluZSArPSBjaHVuawotCi0gICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIHJldHVybiBpby5CdWZmZXJlZElPQmFzZS5yZWFkbGluZShzZWxmLCBsaW1pdCkKIAogICAgIGRlZiBwZWVrKHNlbGYsIG49MSk6CiAgICAgICAgICIiIlJldHVybnMgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHBvc2l0aW9uLiIiIgpAQCAtOTU4LDYgKzk2MSw3NiBAQAogICAgICAgICAgICAgc3VwZXIoKS5jbG9zZSgpCiAKIAorY2xhc3MgX1ppcFdyaXRlRmlsZShpby5CdWZmZXJlZElPQmFzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHpmLCB6aW5mbywgemlwNjQpOgorICAgICAgICBzZWxmLl96aW5mbyA9IHppbmZvCisgICAgICAgIHNlbGYuX3ppcDY0ID0gemlwNjQKKyAgICAgICAgc2VsZi5femlwZmlsZSA9IHpmCisgICAgICAgIHNlbGYuX2NvbXByZXNzb3IgPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKKyAgICAgICAgc2VsZi5fZmlsZV9zaXplID0gMAorICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplID0gMAorICAgICAgICBzZWxmLl9jcmMgPSAwCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2ZpbGVvYmooc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl96aXBmaWxlLmZwCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIG5ieXRlcyA9IGxlbihkYXRhKQorICAgICAgICBzZWxmLl9maWxlX3NpemUgKz0gbmJ5dGVzCisgICAgICAgIHNlbGYuX2NyYyA9IGNyYzMyKGRhdGEsIHNlbGYuX2NyYykKKyAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NvcjoKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb21wcmVzc29yLmNvbXByZXNzKGRhdGEpCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplICs9IGxlbihkYXRhKQorICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKGRhdGEpCisgICAgICAgIHJldHVybiBuYnl0ZXMKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc3VwZXIoKS5jbG9zZSgpCisgICAgICAgICMgRmx1c2ggYW55IGRhdGEgZnJvbSB0aGUgY29tcHJlc3NvciwgYW5kIHVwZGF0ZSBoZWFkZXIgaW5mbworICAgICAgICBpZiBzZWxmLl9jb21wcmVzc29yOgorICAgICAgICAgICAgYnVmID0gc2VsZi5fY29tcHJlc3Nvci5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplICs9IGxlbihidWYpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgICAgIHNlbGYuX3ppbmZvLmNvbXByZXNzX3NpemUgPSBzZWxmLl9jb21wcmVzc19zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl96aW5mby5jb21wcmVzc19zaXplID0gc2VsZi5fZmlsZV9zaXplCisgICAgICAgIHNlbGYuX3ppbmZvLkNSQyA9IHNlbGYuX2NyYworICAgICAgICBzZWxmLl96aW5mby5maWxlX3NpemUgPSBzZWxmLl9maWxlX3NpemUKKworICAgICAgICAjIFdyaXRlIHVwZGF0ZWQgaGVhZGVyIGluZm8KKyAgICAgICAgaWYgc2VsZi5femluZm8uZmxhZ19iaXRzICYgMHgwODoKKyAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKKyAgICAgICAgICAgIGZtdCA9ICc8TFFRJyBpZiBzZWxmLl96aXA2NCBlbHNlICc8TExMJworICAgICAgICAgICAgc2VsZi5fZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHNlbGYuX3ppbmZvLkNSQywKKyAgICAgICAgICAgICAgICBzZWxmLl96aW5mby5jb21wcmVzc19zaXplLCBzZWxmLl96aW5mby5maWxlX3NpemUpKQorICAgICAgICAgICAgc2VsZi5femlwZmlsZS5zdGFydF9kaXIgPSBzZWxmLl9maWxlb2JqLnRlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3ppcDY0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2ZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZpbGUgc2l6ZSB1bmV4cGVjdGVkbHkgZXhjZWVkZWQgWklQNjQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbWl0JykKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ29tcHJlc3NlZCBzaXplIHVuZXhwZWN0ZWRseSBleGNlZWRlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWklQNjQgbGltaXQnKQorICAgICAgICAgICAgIyBTZWVrIGJhY2t3YXJkcyBhbmQgd3JpdGUgZmlsZSBoZWFkZXIgKHdoaWNoIHdpbGwgbm93IGluY2x1ZGUKKyAgICAgICAgICAgICMgY29ycmVjdCBDUkMgYW5kIGZpbGUgc2l6ZXMpCisKKyAgICAgICAgICAgICMgUHJlc2VydmUgY3VycmVudCBwb3NpdGlvbiBpbiBmaWxlCisgICAgICAgICAgICBzZWxmLl96aXBmaWxlLnN0YXJ0X2RpciA9IHNlbGYuX2ZpbGVvYmoudGVsbCgpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLnNlZWsoc2VsZi5femluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmoud3JpdGUoc2VsZi5femluZm8uRmlsZUhlYWRlcihzZWxmLl96aXA2NCkpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLnNlZWsoc2VsZi5femlwZmlsZS5zdGFydF9kaXIpCisKKyAgICAgICAgc2VsZi5femlwZmlsZS5fd3JpdGluZyA9IEZhbHNlCisKKyAgICAgICAgIyBTdWNjZXNzZnVsbHkgd3JpdHRlbjogQWRkIGZpbGUgdG8gb3VyIGNhY2hlcworICAgICAgICBzZWxmLl96aXBmaWxlLmZpbGVsaXN0LmFwcGVuZChzZWxmLl96aW5mbykKKyAgICAgICAgc2VsZi5femlwZmlsZS5OYW1lVG9JbmZvW3NlbGYuX3ppbmZvLmZpbGVuYW1lXSA9IHNlbGYuX3ppbmZvCisKIGNsYXNzIFppcEZpbGU6CiAgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgogCkBAIC0xMDIwLDYgKzEwOTMsNyBAQAogICAgICAgICBzZWxmLl9maWxlUmVmQ250ID0gMQogICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKICAgICAgICAgc2VsZi5fc2Vla2FibGUgPSBUcnVlCisgICAgICAgIHNlbGYuX3dyaXRpbmcgPSBGYWxzZQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIG1vZGUgPT0gJ3InOgpAQCAtMTIzMiwzMCArMTMwNiw1NSBAQAogICAgICAgICB3aXRoIHNlbGYub3BlbihuYW1lLCAiciIsIHB3ZCkgYXMgZnA6CiAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgpCiAKLSAgICBkZWYgb3BlbihzZWxmLCBuYW1lLCBtb2RlPSJyIiwgcHdkPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLiIiIgotICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAiVSIsICJyVSIpOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdvcGVuKCkgcmVxdWlyZXMgbW9kZSAiciIsICJVIiwgb3IgInJVIicpCi0gICAgICAgIGlmICdVJyBpbiBtb2RlOgotICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCInVScgbW9kZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIGRlZiBvcGVuKHNlbGYsIG5hbWUsIG1vZGU9InIiLCBwd2Q9Tm9uZSwgKiwgZm9yY2VfemlwNjQ9RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gZmlsZS1saWtlIG9iamVjdCBmb3IgJ25hbWUnLgorCisgICAgICAgIG5hbWUgaXMgYSBzdHJpbmcgZm9yIHRoZSBmaWxlIG5hbWUgd2l0aGluIHRoZSBaSVAgZmlsZSwgb3IgYSBaaXBJbmZvCisgICAgICAgIG9iamVjdC4KKworICAgICAgICBtb2RlIHNob3VsZCBiZSAncicgdG8gcmVhZCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgWklQIGZpbGUsIG9yICd3JyB0bworICAgICAgICB3cml0ZSB0byBhIGZpbGUgbmV3bHkgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCisKKyAgICAgICAgcHdkIGlzIHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IGZpbGVzIChvbmx5IHVzZWQgZm9yIHJlYWRpbmcpLgorCisgICAgICAgIFdoZW4gd3JpdGluZywgaWYgdGhlIGZpbGUgc2l6ZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSBidXQgbWF5IGV4Y2VlZAorICAgICAgICAyIEdpQiwgcGFzcyBmb3JjZV96aXA2NCB0byB1c2UgdGhlIFpJUDY0IGZvcm1hdCwgd2hpY2ggY2FuIGhhbmRsZSBsYXJnZQorICAgICAgICBmaWxlcy4gIElmIHRoZSBzaXplIGlzIGtub3duIGluIGFkdmFuY2UsIGl0IGlzIGJlc3QgdG8gcGFzcyBhIFppcEluZm8KKyAgICAgICAgaW5zdGFuY2UgZm9yIG5hbWUsIHdpdGggemluZm8uZmlsZV9zaXplIHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1vZGUgbm90IGluIHsiciIsICJ3In06CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ29wZW4oKSByZXF1aXJlcyBtb2RlICJyIiBvciAidyInKQogICAgICAgICBpZiBwd2QgYW5kIG5vdCBpc2luc3RhbmNlKHB3ZCwgYnl0ZXMpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwd2Q6IGV4cGVjdGVkIGJ5dGVzLCBnb3QgJXMiICUgdHlwZShwd2QpKQorICAgICAgICBpZiBwd2QgYW5kIChtb2RlID09ICJ3Iik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwd2QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHJlYWRpbmcgZmlsZXMiKQogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byByZWFkIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKyAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB1c2UgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5mbyBvYmplY3QKICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBaaXBJbmZvKToKICAgICAgICAgICAgICMgJ25hbWUnIGlzIGFscmVhZHkgYW4gaW5mbyBvYmplY3QKICAgICAgICAgICAgIHppbmZvID0gbmFtZQorICAgICAgICBlbGlmIG1vZGUgPT0gJ3cnOgorICAgICAgICAgICAgemluZm8gPSBaaXBJbmZvKG5hbWUpCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBHZXQgaW5mbyBvYmplY3QgZm9yIG5hbWUKICAgICAgICAgICAgIHppbmZvID0gc2VsZi5nZXRpbmZvKG5hbWUpCiAKKyAgICAgICAgaWYgbW9kZSA9PSAndyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3Blbl90b193cml0ZSh6aW5mbywgZm9yY2VfemlwNjQ9Zm9yY2VfemlwNjQpCisKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3QgcmVhZCBmcm9tIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSAiCisgICAgICAgICAgICAgICAgICAgICJpcyBhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGUgd3JpdGluZyBoYW5kbGUgYmVmb3JlIHRyeWluZyB0byByZWFkLiIpCisKKyAgICAgICAgIyBPcGVuIGZvciByZWFkaW5nOgogICAgICAgICBzZWxmLl9maWxlUmVmQ250ICs9IDEKLSAgICAgICAgemVmX2ZpbGUgPSBfU2hhcmVkRmlsZShzZWxmLmZwLCB6aW5mby5oZWFkZXJfb2Zmc2V0LCBzZWxmLl9mcGNsb3NlLCBzZWxmLl9sb2NrKQorICAgICAgICB6ZWZfZmlsZSA9IF9TaGFyZWRGaWxlKHNlbGYuZnAsIHppbmZvLmhlYWRlcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnBjbG9zZSwgc2VsZi5fbG9jaywgbGFtYmRhOiBzZWxmLl93cml0aW5nKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIFNraXAgdGhlIGZpbGUgaGVhZGVyOgogICAgICAgICAgICAgZmhlYWRlciA9IHplZl9maWxlLnJlYWQoc2l6ZUZpbGVIZWFkZXIpCkBAIC0xMzIwLDYgKzE0MTksNDkgQEAKICAgICAgICAgICAgIHplZl9maWxlLmNsb3NlKCkKICAgICAgICAgICAgIHJhaXNlCiAKKyAgICBkZWYgX29wZW5fdG9fd3JpdGUoc2VsZiwgemluZm8sIGZvcmNlX3ppcDY0PUZhbHNlKToKKyAgICAgICAgaWYgZm9yY2VfemlwNjQgYW5kIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiZm9yY2VfemlwNjQgaXMgVHJ1ZSwgYnV0IGFsbG93WmlwNjQgd2FzIEZhbHNlIHdoZW4gb3BlbmluZyAiCisgICAgICAgICAgICAgICAgInRoZSBaSVAgZmlsZS4iCisgICAgICAgICAgICApCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbid0IHdyaXRlIHRvIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFub3RoZXIgd3JpdGUgaGFuZGxlIG9wZW4gb24gaXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhlIGZpcnN0IGhhbmRsZSBiZWZvcmUgb3BlbmluZyBhbm90aGVyLiIpCisKKyAgICAgICAgIyBTaXplcyBhbmQgQ1JDIGFyZSBvdmVyd3JpdHRlbiB3aXRoIGNvcnJlY3QgZGF0YSBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaWxlCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHppbmZvLCAnZmlsZV9zaXplJyk6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCisgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSAwCisgICAgICAgIHppbmZvLkNSQyA9IDAKKworICAgICAgICB6aW5mby5mbGFnX2JpdHMgPSAweDAwCisgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0xaTUE6CisgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgorICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDIKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDgKKworICAgICAgICBpZiBub3QgemluZm8uZXh0ZXJuYWxfYXR0cjoKKyAgICAgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAwbzYwMCA8PCAxNiAgIyBwZXJtaXNzaW9uczogP3J3LS0tLS0tLQorCisgICAgICAgICMgQ29tcHJlc3NlZCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZQorICAgICAgICB6aXA2NCA9IHNlbGYuX2FsbG93WmlwNjQgYW5kIFwKKyAgICAgICAgICAgICAgICAoZm9yY2VfemlwNjQgb3IgemluZm8uZmlsZV9zaXplICogMS4wNSA+IFpJUDY0X0xJTUlUKQorCisgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQorICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkKKworICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKKworICAgICAgICBzZWxmLl93cml0aW5nID0gVHJ1ZQorICAgICAgICByZXR1cm4gX1ppcFdyaXRlRmlsZShzZWxmLCB6aW5mbywgemlwNjQpCisKICAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9Tm9uZSwgcHdkPU5vbmUpOgogICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCiAgICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CkBAIC0xMzg5LDcgKzE1MzEsNyBAQAogICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgogICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQogCi0gICAgICAgIGlmIG1lbWJlci5maWxlbmFtZVstMV0gPT0gJy8nOgorICAgICAgICBpZiBtZW1iZXIuaXNfZGlyKCk6CiAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0YXJnZXRwYXRoKToKICAgICAgICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoKQogICAgICAgICAgICAgcmV0dXJuIHRhcmdldHBhdGgKQEAgLTE0MjksMTAzICsxNTcxLDQxIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHRvIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgdG8gWklQIGFyY2hpdmUgd2hpbGUgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBleGlzdHMiCisgICAgICAgICAgICApCiAKLSAgICAgICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQotICAgICAgICBpc2RpciA9IHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQotICAgICAgICBtdGltZSA9IHRpbWUubG9jYWx0aW1lKHN0LnN0X210aW1lKQotICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCi0gICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgotICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBhcmNuYW1lID0gZmlsZW5hbWUKLSAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdKQotICAgICAgICB3aGlsZSBhcmNuYW1lWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6Ci0gICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KLSAgICAgICAgaWYgaXNkaXI6Ci0gICAgICAgICAgICBhcmNuYW1lICs9ICcvJwotICAgICAgICB6aW5mbyA9IFppcEluZm8oYXJjbmFtZSwgZGF0ZV90aW1lKQotICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gKHN0WzBdICYgMHhGRkZGKSA8PCAxNiAgICAgICMgVW5peCBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IFpJUF9TVE9SRUQKLSAgICAgICAgZWxpZiBjb21wcmVzc190eXBlIGlzIE5vbmU6Ci0gICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICB6aW5mbyA9IFppcEluZm8uZnJvbV9maWxlKGZpbGVuYW1lLCBhcmNuYW1lKQorCisgICAgICAgIGlmIHppbmZvLmlzX2RpcigpOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisgICAgICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCiAKLSAgICAgICAgemluZm8uZmlsZV9zaXplID0gc3Quc3Rfc2l6ZQotICAgICAgICB6aW5mby5mbGFnX2JpdHMgPSAweDAwCi0gICAgICAgIHdpdGggc2VsZi5fbG9jazoKLSAgICAgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKLSAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBieXRlcwotICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKKyAgICAgICAgaWYgemluZm8uaXNfZGlyKCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2Vla2FibGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKKyAgICAgICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKICAgICAgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgotICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCisgICAgICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCiAKLSAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCiAKLSAgICAgICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAotICAgICAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyIHw9IDB4MTAgICMgTVMtRE9TIGRpcmVjdG9yeSBmbGFnCiAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCiAgICAgICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKEZhbHNlKSkKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgICAgIGNtcHIgPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zZWVrYWJsZToKLSAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwOAotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAjIE11c3Qgb3ZlcndyaXRlIENSQyBhbmQgc2l6ZXMgd2l0aCBjb3JyZWN0IGRhdGEgbGF0ZXIKLSAgICAgICAgICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgPSAwCi0gICAgICAgICAgICAgICAgIyBDb21wcmVzc2VkIHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplCi0gICAgICAgICAgICAgICAgemlwNjQgPSBzZWxmLl9hbGxvd1ppcDY0IGFuZCBcCi0gICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSAqIDEuMDUgPiBaSVA2NF9MSU1JVAotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMAotICAgICAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWQoMTAyNCAqIDgpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSBmaWxlX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgICAgICBDUkMgPSBjcmMzMihidWYsIENSQykKLSAgICAgICAgICAgICAgICAgICAgaWYgY21wcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGNtcHIuY29tcHJlc3MoYnVmKQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGJ1ZikKLSAgICAgICAgICAgIGlmIGNtcHI6Ci0gICAgICAgICAgICAgICAgYnVmID0gY21wci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgKyBsZW4oYnVmKQotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoYnVmKQotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBmaWxlX3NpemUKLSAgICAgICAgICAgIHppbmZvLkNSQyA9IENSQwotICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gZmlsZV9zaXplCi0gICAgICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgotICAgICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKLSAgICAgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgemlwNjQgZWxzZSAnPExMTCcKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplKSkKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIG5vdCB6aXA2NCBhbmQgc2VsZi5fYWxsb3daaXA2NDoKLSAgICAgICAgICAgICAgICAgICAgaWYgZmlsZV9zaXplID4gWklQNjRfTElNSVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZpbGUgc2l6ZSBoYXMgaW5jcmVhc2VkIGR1cmluZyBjb21wcmVzc2luZycpCi0gICAgICAgICAgICAgICAgICAgIGlmIGNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignQ29tcHJlc3NlZCBzaXplIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplJykKLSAgICAgICAgICAgICAgICAjIFNlZWsgYmFja3dhcmRzIGFuZCB3cml0ZSBmaWxlIGhlYWRlciAod2hpY2ggd2lsbCBub3cgaW5jbHVkZQotICAgICAgICAgICAgICAgICMgY29ycmVjdCBDUkMgYW5kIGZpbGUgc2l6ZXMpCi0gICAgICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKSAjIFByZXNlcnZlIGN1cnJlbnQgcG9zaXRpb24gaW4gZmlsZQotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0KQotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQotICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCi0gICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgc3JjLCBzZWxmLm9wZW4oemluZm8sICd3JykgYXMgZGVzdDoKKyAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc3JjLCBkZXN0LCAxMDI0KjgpCiAKICAgICBkZWYgd3JpdGVzdHIoc2VsZiwgemluZm9fb3JfYXJjbmFtZSwgZGF0YSwgY29tcHJlc3NfdHlwZT1Ob25lKToKICAgICAgICAgIiIiV3JpdGUgYSBmaWxlIGludG8gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgaXMgJ2RhdGEnLCB3aGljaApAQCAtMTU1MCw0NSArMTYzMCwxOCBAQAogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB0byBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHdyaXRlIHRvIFpJUCBhcmNoaXZlIHdoaWxlIGFuIG9wZW4gd3JpdGluZyBoYW5kbGUgZXhpc3RzLiIKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKIAogICAgICAgICB6aW5mby5maWxlX3NpemUgPSBsZW4oZGF0YSkgICAgICAgICAgICAjIFVuY29tcHJlc3NlZCBzaXplCiAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKLSAgICAgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKLSAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBkYXRhCi0gICAgICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCi0gICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgZGF0YQotICAgICAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQotICAgICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKLSAgICAgICAgICAgICAgICAjIENvbXByZXNzZWQgZGF0YSBpbmNsdWRlcyBhbiBlbmQtb2Ytc3RyZWFtIChFT1MpIG1hcmtlcgotICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCi0KLSAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCi0gICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCi0gICAgICAgICAgICB6aW5mby5DUkMgPSBjcmMzMihkYXRhKSAgICAgICAjIENSQy0zMiBjaGVja3N1bQotICAgICAgICAgICAgY28gPSBfZ2V0X2NvbXByZXNzb3IoemluZm8uY29tcHJlc3NfdHlwZSkKLSAgICAgICAgICAgIGlmIGNvOgotICAgICAgICAgICAgICAgIGRhdGEgPSBjby5jb21wcmVzcyhkYXRhKSArIGNvLmZsdXNoKCkKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gbGVuKGRhdGEpICAgICMgQ29tcHJlc3NlZCBzaXplCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSB6aW5mby5maWxlX3NpemUKLSAgICAgICAgICAgIHppcDY0ID0gemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgXAotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVAotICAgICAgICAgICAgaWYgemlwNjQgYW5kIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgotICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiRmlsZXNpemUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zIikKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKGRhdGEpCi0gICAgICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgotICAgICAgICAgICAgICAgICMgV3JpdGUgQ1JDIGFuZCBmaWxlIHNpemVzIGFmdGVyIHRoZSBmaWxlIGRhdGEKLSAgICAgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgemlwNjQgZWxzZSAnPExMTCcKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplKSkKLSAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCi0gICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHppbmZvLCBtb2RlPSd3JykgYXMgZGVzdDoKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlKGRhdGEpCiAKICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgIiIiQ2FsbCB0aGUgImNsb3NlKCkiIG1ldGhvZCBpbiBjYXNlIHRoZSB1c2VyIGZvcmdvdC4iIiIKQEAgLTE2MDAsNiArMTY1MywxMSBAQAogICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KIAorICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCBjbG9zZSB0aGUgWklQIGZpbGUgd2hpbGUgdGhlcmUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSB3cml0aW5nIGhhbmRsZSBiZWZvcmUgY2xvc2luZyB0aGUgemlwLiIpCisKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICgndycsICd4JywgJ2EnKSBhbmQgc2VsZi5fZGlkTW9kaWZ5OiAjIHdyaXRlIGVuZGluZyByZWNvcmRzCiAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weSBiL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKaW5kZXggZDA5ZGEyZi4uYjBkNDQ0NCAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQorKysgYi9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CkBAIC0yOTksOSArMjk5LDkgQEAKICAgICBpZiBQWVRIT05fMzoKICAgICAgICAgcmVzdWx0LmV4dGVuZChbCiAgICAgICAgICAgZGljdCgKLSAgICAgICAgICAgICAgbmFtZT0iWFogNS4wLjUiLAotICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly90dWthYW5pLm9yZy94ei94ei01LjAuNS50YXIuZ3oiLAotICAgICAgICAgICAgICBjaGVja3N1bT0nMTlkOTI0ZTA2NmI2ZmZmMGJjOWQxOTgxYjRlNTMxOTYnLAorICAgICAgICAgICAgICBuYW1lPSJYWiA1LjIuMiIsCisgICAgICAgICAgICAgIHVybD0iaHR0cDovL3R1a2Fhbmkub3JnL3h6L3h6LTUuMi4yLnRhci5neiIsCisgICAgICAgICAgICAgIGNoZWNrc3VtPSc3Y2Y2YTg1NDRhN2RhZThlODEwNmZkZjdhZGRmYTI4YycsCiAgICAgICAgICAgICAgIGNvbmZpZ3VyZV9wcmU9WwogICAgICAgICAgICAgICAgICAgICAnLS1kaXNhYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcnLAogICAgICAgICAgICAgICBdCkBAIC0zNDQsMTAgKzM0NCwxMSBAQAogICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICApLAogICAgICAgICAgIGRpY3QoCi0gICAgICAgICAgICAgIG5hbWU9IlNRTGl0ZSAzLjguMTEiLAotICAgICAgICAgICAgICB1cmw9Imh0dHBzOi8vd3d3LnNxbGl0ZS5vcmcvMjAxNS9zcWxpdGUtYXV0b2NvbmYtMzA4MTEwMC50YXIuZ3oiLAotICAgICAgICAgICAgICBjaGVja3N1bT0nNzdiNDUxOTI1MTIxMDI4YmVmYmRkYmY0NWVhMmJjNDknLAorICAgICAgICAgICAgICBuYW1lPSJTUUxpdGUgMy4xNC4xIiwKKyAgICAgICAgICAgICAgdXJsPSJodHRwczovL3d3dy5zcWxpdGUub3JnLzIwMTYvc3FsaXRlLWF1dG9jb25mLTMxNDAxMDAudGFyLmd6IiwKKyAgICAgICAgICAgICAgY2hlY2tzdW09JzM2MzRhOTBhM2Y0OTU0MTQ2MmJjYWVkMzQ3NGIyNjg0JywKICAgICAgICAgICAgICAgZXh0cmFfY2ZsYWdzPSgnLU9zICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfRU5BQkxFX0ZUUzUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICctRFNRTElURV9FTkFCTEVfRlRTNCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1EU1FMSVRFX0VOQUJMRV9GVFMzX1BBUkVOVEhFU0lTICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLURTUUxJVEVfRU5BQkxFX1JUUkVFICcKQEAgLTEyNDksNiArMTI1MCw4IEBACiAgICAgICAgIExEVkVSU0lPTiA9IExEVkVSU0lPTi5yZXBsYWNlKCckKFZFUlNJT04pJywgVkVSU0lPTikKICAgICAgICAgTERWRVJTSU9OID0gTERWRVJTSU9OLnJlcGxhY2UoJyQoQUJJRkxBR1MpJywgQUJJRkxBR1MpCiAgICAgICAgIGNvbmZpZ19zdWZmaXggPSAnLScgKyBMRFZFUlNJT04KKyAgICAgICAgaWYgZ2V0VmVyc2lvbk1ham9yTWlub3IoKSA+PSAoMywgNik6CisgICAgICAgICAgICBjb25maWdfc3VmZml4ID0gY29uZmlnX3N1ZmZpeCArICctZGFyd2luJwogICAgIGVsc2U6CiAgICAgICAgIGNvbmZpZ19zdWZmaXggPSAnJyAgICAgICMgUHl0aG9uIDIueAogCkBAIC0xMjc0LDcgKzEyNzcsNyBAQAogICAgIGZwLndyaXRlKGRhdGEpCiAgICAgZnAuY2xvc2UoKQogCi0gICAgIyBmaXggX3N5c2NvbmZpZ2RhdGEgaWYgaXQgZXhpc3RzCisgICAgIyBmaXggX3N5c2NvbmZpZ2RhdGEKICAgICAjCiAgICAgIyBUT0RPOiBtYWtlIHRoaXMgbW9yZSByb2J1c3QhICB0ZXN0X3N5c2NvbmZpZ19tb2R1bGUgb2YKICAgICAjIGRpc3R1dGlscy50ZXN0cy50ZXN0X3N5c2NvbmZpZy5TeXNjb25maWdUZXN0Q2FzZSB0ZXN0cyB0aGF0CkBAIC0xMjg4LDI4ICsxMjkxLDMwIEBACiAgICAgIyBfc3lzY29uZmlnZGF0YS5weSkuCiAKICAgICBpbXBvcnQgcHByaW50Ci0gICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoX3RvX2xpYiwgJ19zeXNjb25maWdkYXRhLnB5JykKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyJykKLSAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQotICAgICAgICBmcC5jbG9zZSgpCi0gICAgICAgICMgY3JlYXRlIGJ1aWxkX3RpbWVfdmFycyBkaWN0Ci0gICAgICAgIGV4ZWMoZGF0YSkKLSAgICAgICAgdmFycyA9IHt9Ci0gICAgICAgIGZvciBrLCB2IGluIGJ1aWxkX3RpbWVfdmFycy5pdGVtcygpOgotICAgICAgICAgICAgaWYgdHlwZSh2KSA9PSB0eXBlKCcnKToKLSAgICAgICAgICAgICAgICBmb3IgcCBpbiAoaW5jbHVkZV9wYXRoLCBsaWJfcGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJyAnICsgcCwgJycpCi0gICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UocCArICcgJywgJycpCi0gICAgICAgICAgICB2YXJzW2tdID0gdgorICAgIGlmIGdldFZlcnNpb25NYWpvck1pbm9yKCkgPj0gKDMsIDYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfdG9fbGliLCAncGxhdC1kYXJ3aW4nLCAnX3N5c2NvbmZpZ2RhdGFfbS5weScpCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoX3RvX2xpYiwgJ19zeXNjb25maWdkYXRhLnB5JykKKyAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICBmcC5jbG9zZSgpCisgICAgIyBjcmVhdGUgYnVpbGRfdGltZV92YXJzIGRpY3QKKyAgICBleGVjKGRhdGEpCisgICAgdmFycyA9IHt9CisgICAgZm9yIGssIHYgaW4gYnVpbGRfdGltZV92YXJzLml0ZW1zKCk6CisgICAgICAgIGlmIHR5cGUodikgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBmb3IgcCBpbiAoaW5jbHVkZV9wYXRoLCBsaWJfcGF0aCk6CisgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnICcgKyBwLCAnJykKKyAgICAgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKHAgKyAnICcsICcnKQorICAgICAgICB2YXJzW2tdID0gdgogCi0gICAgICAgIGZwID0gb3BlbihwYXRoLCAndycpCi0gICAgICAgICMgZHVwbGljYXRlZCBmcm9tIHN5c2NvbmZpZy5fZ2VuZXJhdGVfcG9zaXhfdmFycygpCi0gICAgICAgIGZwLndyaXRlKCcjIHN5c3RlbSBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBhbmQgdXNlZCBieScKLSAgICAgICAgICAgICAgICAgICAgJyB0aGUgc3lzY29uZmlnIG1vZHVsZVxuJykKLSAgICAgICAgZnAud3JpdGUoJ2J1aWxkX3RpbWVfdmFycyA9ICcpCi0gICAgICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWZwKQotICAgICAgICBmcC5jbG9zZSgpCisgICAgZnAgPSBvcGVuKHBhdGgsICd3JykKKyAgICAjIGR1cGxpY2F0ZWQgZnJvbSBzeXNjb25maWcuX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKQorICAgIGZwLndyaXRlKCcjIHN5c3RlbSBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBhbmQgdXNlZCBieScKKyAgICAgICAgICAgICAgICAnIHRoZSBzeXNjb25maWcgbW9kdWxlXG4nKQorICAgIGZwLndyaXRlKCdidWlsZF90aW1lX3ZhcnMgPSAnKQorICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWZwKQorICAgIGZwLmNsb3NlKCkKIAogICAgICMgQWRkIHN5bWxpbmtzIGluIC91c3IvbG9jYWwvYmluLCB1c2luZyByZWxhdGl2ZSBsaW5rcwogICAgIHVzcl9sb2NhbF9iaW4gPSBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ3VzcicsICdsb2NhbCcsICdiaW4nKQpkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmIGIvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmCmluZGV4IDY1ZTNmMTQuLjFhZjI0NTEgMTAwNjQ0Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnJ0ZgorKysgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS5ydGYKQEAgLTEsMjkgKzEsMjUgQEAKLXtccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGNvY29hcnRmMTM0OFxjb2NvYXN1YnJ0ZjE3MAore1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYxNDA0XGNvY29hc3VicnRmNDYwCiB7XGZvbnR0YmxcZjBcZnN3aXNzXGZjaGFyc2V0MCBIZWx2ZXRpY2E7XGYxXGZtb2Rlcm5cZmNoYXJzZXQwIENvdXJpZXJOZXdQU01UO30KIHtcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KIFxtYXJnbDE0NDBcbWFyZ3IxNDQwXHZpZXd3MTMzODBcdmlld2gxNDYwMFx2aWV3a2luZDAKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsXHBhcnRpZ2h0ZW5mYWN0b3IwCiAKIFxmMFxmczI0IFxjZjAgVGhpcyBwYWNrYWdlIHdpbGwgaW5zdGFsbCBQeXRob24gJEZVTExfVkVSU0lPTiBmb3IgTWFjIE9TIFggJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBmb3IgdGhlIGZvbGxvd2luZyBhcmNoaXRlY3R1cmUocyk6ICRBUkNISVRFQ1RVUkVTLlwKIFwKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAorXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsXHBhcnRpZ2h0ZW5mYWN0b3IwCiAKIFxiIFxjZjAgXHVsIFx1bGMwIFdoaWNoIGluc3RhbGxlciB2YXJpYW50IHNob3VsZCBJIHVzZT8KIFxiMCBcdWxub25lIFwKIFwKLVB5dGhvbi5vcmcgcHJvdmlkZXMgdHdvIGluc3RhbGxlciB2YXJpYW50cyBmb3IgZG93bmxvYWQ6IG9uZSB0aGF0IGluc3RhbGxzIGEgCitGb3IgdGhlIGluaXRpYWwgYWxwaGEgcmVsZWFzZXMgb2YgUHl0aG9uIDMuNiwgUHl0aG9uLm9yZyBwcm92aWRlcyBvbmx5IG9uZSBpbnN0YWxsZXIgdmFyaWFudCBmb3IgZG93bmxvYWQ6IG9uZSB0aGF0IGluc3RhbGxzIGEgCiBcaSA2NC1iaXQvMzItYml0IEludGVsCiBcaTAgIFB5dGhvbiBjYXBhYmxlIG9mIHJ1bm5pbmcgb24gCiBcaSBNYWMgT1MgWCAxMC42IChTbm93IExlb3BhcmQpCi1caTAgIG9yIGxhdGVyOyBhbmQgb25lIHRoYXQgaW5zdGFsbHMgYSAKLVxpIDMyLWJpdC1vbmx5IChJbnRlbCBhbmQgUFBDKQotXGkwICBQeXRob24gY2FwYWJsZSBvZiBydW5uaW5nIG9uIAotXGkgTWFjIE9TIFggMTAuNSAoTGVvcGFyZCkKLVxpMCAgb3IgbGF0ZXIuICBUaGlzIFJlYWRNZSB3YXMgaW5zdGFsbGVkIHdpdGggdGhlIAorXGkwICBvciBsYXRlci4gIFRoaXMgd2lsbCBjaGFuZ2UgcHJpb3IgdG8gdGhlIGJldGEgcmVsZWFzZXMgb2YgMy42LjAuICBUaGlzIFJlYWRNZSB3YXMgaW5zdGFsbGVkIHdpdGggdGhlIAogXGkgJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAotXGkwICB2YXJpYW50LiAgVW5sZXNzIHlvdSBhcmUgaW5zdGFsbGluZyB0byBhbiAxMC41IHN5c3RlbSBvciB5b3UgbmVlZCB0byBidWlsZCBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gcnVuIG9uIDEwLjUgc3lzdGVtcywgdXNlIHRoZSAxMC42IHZhcmlhbnQgaWYgcG9zc2libGUuICBUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gZnVuY3Rpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBzdGFydGluZyB3aXRoIDEwLjYgYW5kIHlvdSBtYXkgc2VlIGJldHRlciBwZXJmb3JtYW5jZSB1c2luZyA2NC1iaXQgbW9kZS4gIEJ5IGRlZmF1bHQsIFB5dGhvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIGluIDY0LWJpdCBtb2RlIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIGl0LiAgQWxzbyBzZWUgCitcaTAgIHZhcmlhbnQuICBCeSBkZWZhdWx0LCBQeXRob24gd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biBpbiA2NC1iaXQgbW9kZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBpdC4gIEFsc28gc2VlIAogXGkgQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBPcGVuU1NMCi1caTAgIGJlbG93LiAgVGhlIFB5dGhvbnMgaW5zdGFsbGVkIGJ5IHRoZXNlIGluc3RhbGxlcnMgYXJlIGJ1aWx0IHdpdGggcHJpdmF0ZSBjb3BpZXMgb2Ygc29tZSB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIHdpdGggb3IgbmV3ZXIgdGhhbiB0aG9zZSBpbiBPUyBYIGl0c2VsZi4gIFRoZSBsaXN0IG9mIHRoZXNlIGxpYnJhcmllcyB2YXJpZXMgYnkgaW5zdGFsbGVyIHZhcmlhbnQgYW5kIGlzIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlIExpY2Vuc2UucnRmIGZpbGUuCitcaTAgIGJlbG93LiAgVGhlIFB5dGhvbnMgaW5zdGFsbGVkIGJ5IHRoaXMgaW5zdGFsbGVyIGlzIGJ1aWx0IHdpdGggcHJpdmF0ZSBjb3BpZXMgb2Ygc29tZSB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIHdpdGggb3IgbmV3ZXIgdGhhbiB0aG9zZSBpbiBPUyBYIGl0c2VsZi4gIFRoZSBsaXN0IG9mIHRoZXNlIGxpYnJhcmllcyB2YXJpZXMgYnkgaW5zdGFsbGVyIHZhcmlhbnQgYW5kIGlzIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlIExpY2Vuc2UucnRmIGZpbGUuCiBcYiBcdWwgXAogXAogVXBkYXRlIHlvdXIgdmVyc2lvbiBvZiBUY2wvVGsgdG8gdXNlIElETEUgb3Igb3RoZXIgVGsgYXBwbGljYXRpb25zCkBAIC0zMywxMyArMjksMTMgQEAKIFxpIFRjbC9UawogXGkwICBmcmFtZXdvcmtzLiAgVmlzaXQge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9tYWMvdGNsdGsvIn19e1xmbGRyc2x0IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvbWFjL3RjbHRrL319IGZvciBjdXJyZW50IGluZm9ybWF0aW9uIGFib3V0IHN1cHBvcnRlZCBhbmQgcmVjb21tZW5kZWQgdmVyc2lvbnMgb2YgCiBcaSBUY2wvVGsKLVxpMCAgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24gYW5kIG9mIE1hYyBPUyBYLlwKK1xpMCAgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24gYW5kIG9mIE1hYyBPUyBYLiAgRm9yIHRoZSBpbml0aWFsIGFscGhhIHJlbGVhc2VzIG9mIFB5dGhvbiAzLjYsIHRoZSBpbnN0YWxsZXIgaXMgbGlua2VkIHdpdGggVGNsL1RrIDguNTsgdGhpcyB3aWxsIGNoYW5nZSBwcmlvciB0byB0aGUgYmV0YSByZWxlYXNlcyBvZiAzLjYuMC5cCiAKIFxiIFx1bCBcCiBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIE9wZW5TU0xcCiAKIFxiMCBcdWxub25lIFwKLVB5dGhvbiAzLjUgaW5jbHVkZXMgYSBudW1iZXIgb2YgbmV0d29yayBzZWN1cml0eSBlbmhhbmNlbWVudHMgdGhhdCB3ZXJlIHJlbGVhc2VkIGluIFB5dGhvbiAzLjQuMyBhbmQgUHl0aG9uIDIuNy4xMC4gIHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0NzYvIn19e1xmbGRyc2x0IFBFUCA0NzZ9fSBjaGFuZ2VzIHNldmVyYWwgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzLCBsaWtlIAorUHl0aG9uIDMuNiBpbmNsdWRlcyBhIG51bWJlciBvZiBuZXR3b3JrIHNlY3VyaXR5IGVuaGFuY2VtZW50cyB0aGF0IHdlcmUgcmVsZWFzZWQgaW4gUHl0aG9uIDMuNC4zIGFuZCBQeXRob24gMi43LjEwLiAge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3Ni8ifX17XGZsZHJzbHQgUEVQIDQ3Nn19IGNoYW5nZXMgc2V2ZXJhbCBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZXMsIGxpa2UgCiBcaSBodHRwbGliCiBcaTAgLCAKIFxpIHVybGxpYgpAQCAtNTEsNTYgKzQ3LDMzIEBACiBcaSBzZWN1cml0eQogXGkwICBjb21tYW5kIGxpbmUgdXRpbGl0eS5cCiBcCi1Gb3IgT1MgWCAxMC41LCBBcHBsZSBwcm92aWRlcyAKLVxpIE9wZW5TU0wgMC45LjcKLVxpMCAgbGlicmFyaWVzLiAgVGhpcyB2ZXJzaW9uIG9mIEFwcGxlJ3MgT3BlblNTTCAKLVxiIGRvZXMgbm90Ci1cYjAgIHVzZSB0aGUgY2VydGlmaWNhdGVzIGZyb20gdGhlIHN5c3RlbSBzZWN1cml0eSBmcmFtZXdvcmssIGV2ZW4gd2hlbiB1c2VkIG9uIG5ld2VyIHZlcnNpb25zIG9mIE9TIFguICBJbnN0ZWFkIGl0IGNvbnN1bHRzIGEgdHJhZGl0aW9uYWwgT3BlblNTTCBjb25jYXRlbmF0ZWQgY2VydGlmaWNhdGUgZmlsZSAoCi1caSBjYWZpbGUKLVxpMCApIG9yIGNlcnRpZmljYXRlIGRpcmVjdG9yeSAoCi1caSBjYXBhdGgKLVxpMCApLCBsb2NhdGVkIGluIAotXGYxIC9TeXN0ZW0vTGlicmFyeS9PcGVuU1NMCi1cZjAgLiAgVGhlc2UgZGlyZWN0b3JpZXMgYXJlIHR5cGljYWxseSBlbXB0eSBhbmQgbm90IG1hbmFnZWQgYnkgT1MgWDsgeW91IG11c3QgbWFuYWdlIHRoZW0geW91cnNlbGYgb3Igc3VwcGx5IHlvdXIgb3duIFNTTCBjb250ZXh0cy4gIE9wZW5TU0wgMC45LjcgaXMgb2Jzb2xldGUgYnkgY3VycmVudCBzZWN1cml0eSBzdGFuZGFyZHMsIGxhY2tpbmcgYSBudW1iZXIgb2YgaW1wb3J0YW50IGZlYXR1cmVzIGZvdW5kIGluIGxhdGVyIHZlcnNpb25zLiAgQW1vbmcgdGhlIHByb2JsZW1zIHRoaXMgY2F1c2VzIGlzIHRoZSBpbmFiaWxpdHkgdG8gdmVyaWZ5IGhpZ2hlci1zZWN1cml0eSBjZXJ0aWZpY2F0ZXMgbm93IHVzZWQgYnkgcHl0aG9uLm9yZyBzZXJ2aWNlcywgaW5jbHVkaW5nIAotXGkgdHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkifX17XGZsZHJzbHQgaGUgUHl0aG9uIFBhY2thZ2UgSW5kZXgsIFB5UEl9fQotXGkwIC4gIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgdGhlIAotXGkgMTAuNSsgMzItYml0LW9ubHkgcHl0aG9uLm9yZyB2YXJpYW50Ci1caTAgIGlzIGxpbmtlZCB3aXRoIGEgcHJpdmF0ZSBjb3B5IG9mIAotXGkgT3BlblNTTCAxLjAuMgotXGkwIDsgaXQgY29uc3VsdHMgdGhlIHNhbWUgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnksIAotXGYxIC9TeXN0ZW0vTGlicmFyeS9PcGVuU1NMCi1cZjAgLiAgIEFzIGJlZm9yZSwgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IHRvIG1hbmFnZSBjZXJ0aWZpY2F0ZXMgeW91cnNlbGYgd2hlbiB5b3UgdXNlIHRoaXMgUHl0aG9uIHZhcmlhbnQgYW5kLCB3aXRoIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBub3cgZW5hYmxlZCBieSBkZWZhdWx0LCB5b3UgbWF5IG5vdyBuZWVkIHRvIHRha2UgYWRkaXRpb25hbCBzdGVwcyB0byBlbnN1cmUgeW91ciBQeXRob24gcHJvZ3JhbXMgaGF2ZSBhY2Nlc3MgdG8gQ0EgY2VydGlmaWNhdGVzIHlvdSB0cnVzdC4gIElmIHlvdSB1c2UgdGhpcyBQeXRob24gdmFyaWFudCB0byBidWlsZCBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucyB3aXRoIHRoaXJkLXBhcnR5IHRvb2xzIGxpa2Uge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9weTJhcHAvIn19e1xmbGRyc2x0IAotXGYxIHB5MmFwcH19LCB5b3UgbWF5IG5vdyBuZWVkIHRvIGJ1bmRsZSBDQSBjZXJ0aWZpY2F0ZXMgaW4gdGhlbSBvciBvdGhlcndpc2Ugc3VwcGx5IG5vbi1kZWZhdWx0IFNTTCBjb250ZXh0cy5cCi1cCiBGb3IgT1MgWCAxMC42KywgQXBwbGUgYWxzbyBwcm92aWRlcyAKIFxpIE9wZW5TU0wKIFxpMCAgCiBcaSAwLjkuOCBsaWJyYXJpZXMKIFxpMCAuICBBcHBsZSdzIDAuOS44IHZlcnNpb24gaW5jbHVkZXMgYW4gaW1wb3J0YW50IGFkZGl0aW9uYWwgZmVhdHVyZTogaWYgYSBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgdmVyaWZpZWQgdXNpbmcgdGhlIG1hbnVhbGx5IGFkbWluaXN0ZXJlZCBjZXJ0aWZpY2F0ZXMgaW4gCiBcZjEgL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wKLVxmMCAsIHRoZSBjZXJ0aWZpY2F0ZXMgbWFuYWdlZCBieSB0aGUgc3lzdGVtIHNlY3VyaXR5IGZyYW1ld29yayBJbiB0aGUgdXNlciBhbmQgc3lzdGVtIGtleWNoYWlucyBhcmUgYWxzbyBjb25zdWx0ZWQgKHVzaW5nIEFwcGxlIHByaXZhdGUgQVBJcykuICBGb3IgdGhpcyByZWFzb24sIHRoZSAKK1xmMCAsIHRoZSBjZXJ0aWZpY2F0ZXMgbWFuYWdlZCBieSB0aGUgc3lzdGVtIHNlY3VyaXR5IGZyYW1ld29yayBJbiB0aGUgdXNlciBhbmQgc3lzdGVtIGtleWNoYWlucyBhcmUgYWxzbyBjb25zdWx0ZWQgKHVzaW5nIEFwcGxlIHByaXZhdGUgQVBJcykuICBGb3IgdGhlIGluaXRpYWwgYWxwaGEgcmVsZWFzZXMgb2YgUHl0aG9uIDMuNiwgdGhlIAogXGkgNjQtYml0LzMyLWJpdCAxMC42KyBweXRob24ub3JnIHZhcmlhbnQKLVxpMCAgY29udGludWVzIHRvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIEFwcGxlJ3MgT3BlblNTTCAwLjkuOCBzaW5jZSBpdCB3YXMgZmVsdCB0aGF0IHRoZSBsb3NzIG9mIHRoZSBzeXN0ZW0tcHJvdmlkZWQgY2VydGlmaWNhdGVzIGFuZCBtYW5hZ2VtZW50IHRvb2xzIG91dHdlaWdocyB0aGUgYWRkaXRpb25hbCBzZWN1cml0eSBmZWF0dXJlcyBwcm92aWRlZCBieSBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLiAgVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzIG9mIHRoZSBweXRob24ub3JnIGluc3RhbGxlcnMgYXMgQXBwbGUgaGFzIGRlcHJlY2F0ZWQgdXNlIG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQgT3BlblNTTCBsaWJyYXJpZXMuICBJZiB5b3UgZG8gbmVlZCBmZWF0dXJlcyBmcm9tIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wsIHRoZXJlIGFyZSB0aGlyZC1wYXJ0eSBPcGVuU1NMIHdyYXBwZXIgcGFja2FnZXMgYXZhaWxhYmxlIHRocm91Z2ggCitcaTAgIGNvbnRpbnVlcyB0byBiZSBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBBcHBsZSdzIE9wZW5TU0wgMC45Ljggc2luY2UgaXQgd2FzIGZlbHQgdGhhdCB0aGUgbG9zcyBvZiB0aGUgc3lzdGVtLXByb3ZpZGVkIGNlcnRpZmljYXRlcyBhbmQgbWFuYWdlbWVudCB0b29scyBvdXR3ZWlnaHMgdGhlIGFkZGl0aW9uYWwgc2VjdXJpdHkgZmVhdHVyZXMgcHJvdmlkZWQgYnkgbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTC4gIFRoaXMgd2lsbCBjaGFuZ2UgcHJpb3IgdG8gdGhlIGJldGEgcmVsZWFzZXMgb2YgMy42LjAgYXMgQXBwbGUgaGFzIGRlcHJlY2F0ZWQgdXNlIG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQgT3BlblNTTCBsaWJyYXJpZXMuICBJZiB5b3UgZG8gbmVlZCBmZWF0dXJlcyBmcm9tIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wsIHRoZXJlIGFyZSB0aGlyZC1wYXJ0eSBPcGVuU1NMIHdyYXBwZXIgcGFja2FnZXMgYXZhaWxhYmxlIHRocm91Z2ggCiBcaSBQeVBJCiBcaTAgLlwKIFwKIFRoZSBidW5kbGVkIAogXGYxIHBpcAotXGYwICBpbmNsdWRlZCB3aXRoIHRoZSBQeXRob24gMy41IGluc3RhbGxlcnMgaGFzIGl0cyBvd24gZGVmYXVsdCBjZXJ0aWZpY2F0ZSBzdG9yZSBmb3IgdmVyaWZ5aW5nIGRvd25sb2FkIGNvbm5lY3Rpb25zLlwKK1xmMCAgaW5jbHVkZWQgd2l0aCB0aGUgUHl0aG9uIDMuNiBpbnN0YWxsZXJzIGhhcyBpdHMgb3duIGRlZmF1bHQgY2VydGlmaWNhdGUgc3RvcmUgZm9yIHZlcmlmeWluZyBkb3dubG9hZCBjb25uZWN0aW9ucy5cCiBcCiAKIFxiIFx1bCBPdGhlciBjaGFuZ2VzXAogCiBcYjAgXHVsbm9uZSBcCi1ccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWwKLVxjZjAgRm9yIG90aGVyIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlLCBzZWUgdGhlIAorRm9yIG90aGVyIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlLCBzZWUgdGhlIAogXGkgV2hhdCdzIG5ldwogXGkwICBzZWN0aW9uIGluIHRoZSB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2RvYy8ifX17XGZsZHJzbHQgRG9jdW1lbnRhdGlvbiBTZXR9fSBmb3IgdGhpcyByZWxlYXNlIGFuZCBpdHMgCiBcaSBSZWxlYXNlIE5vdGVzCiBcaTAgIGxpbmsgYXQge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZHMvIn19e1xmbGRyc2x0IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWRzL319LlwKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAogCi1cYiBcY2YwIFx1bCBcCitcYiBcdWwgXAogUHl0aG9uIDMgYW5kIFB5dGhvbiAyIENvLWV4aXN0ZW5jZVwKIAogXGIwIFx1bG5vbmUgXApkaWZmIC0tZ2l0IGEvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5IGIvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5CmluZGV4IDk4Njc2MGQuLjU5OTRjMTggMTAwNjQ0Ci0tLSBhL01hYy9JRExFL0lETEUuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9pZGxlbWFpbi5weQorKysgYi9NYWMvSURMRS9JRExFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvaWRsZW1haW4ucHkKQEAgLTY4LDYgKzY4LDYgQEAKICAgICAgICAgYnJlYWsKIAogIyBOb3cgaXQgaXMgc2FmZSB0byBpbXBvcnQgaWRsZWxpYi4KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgbWFpbgogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9QeXRob25MYXVuY2hlci9NeUFwcERlbGVnYXRlLm0gYi9NYWMvUHl0aG9uTGF1bmNoZXIvTXlBcHBEZWxlZ2F0ZS5tCmluZGV4IGU3NWZiMDYuLjI1Nzc5YTIgMTAwNjQ0Ci0tLSBhL01hYy9QeXRob25MYXVuY2hlci9NeUFwcERlbGVnYXRlLm0KKysrIGIvTWFjL1B5dGhvbkxhdW5jaGVyL015QXBwRGVsZWdhdGUubQpAQCAtMzQsNyArMzQsNyBAQAogLSAoQk9PTClzaG91bGRTaG93VUkKIHsKICAgICAvLyBpZiB0aGlzIGNhbGwgY29tZXMgYmVmb3JlIGFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOiB3ZQotICAgIC8vIHNob3VsZCB0ZXJtaW5hdGUgaW1tZWRlYXRlbHkgYWZ0ZXIgc3RhcnRpbmcgdGhlIHNjcmlwdC4KKyAgICAvLyBzaG91bGQgdGVybWluYXRlIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0aW5nIHRoZSBzY3JpcHQuCiAgICAgaWYgKCFpbml0aWFsX2FjdGlvbl9kb25lKQogICAgICAgICBzaG91bGRfdGVybWluYXRlID0gWUVTOwogICAgIGluaXRpYWxfYWN0aW9uX2RvbmUgPSBZRVM7CmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggZjA3YzI4Mi4uODBmMTE5MSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtMTA5LDYgKzEwOSw3IEBACiAKICMgTXVsdGlhcmNoIGRpcmVjdG9yeSAobWF5IGJlIGVtcHR5KQogTVVMVElBUkNIPQlATVVMVElBUkNIQAorTVVMVElBUkNIX0NQUEZMQUdTID0gQE1VTFRJQVJDSF9DUFBGTEFHU0AKIAogIyBJbnN0YWxsIHByZWZpeCBmb3IgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzCiBwcmVmaXg9CQlAcHJlZml4QApAQCAtMjgwLDE4ICsyODEsNiBAQAogIyBQYXJzZXIKIFBHRU49CQlQYXJzZXIvcGdlbiQoRVhFKQogCi1QU1JDUz0JCVwKLQkJUGFyc2VyL2FjY2VsZXIuYyBcCi0JCVBhcnNlci9ncmFtbWFyMS5jIFwKLQkJUGFyc2VyL2xpc3Rub2RlLmMgXAotCQlQYXJzZXIvbm9kZS5jIFwKLQkJUGFyc2VyL3BhcnNlci5jIFwKLQkJUGFyc2VyL2JpdHNldC5jIFwKLQkJUGFyc2VyL21ldGFncmFtbWFyLmMgXAotCQlQYXJzZXIvZmlyc3RzZXRzLmMgXAotCQlQYXJzZXIvZ3JhbW1hci5jIFwKLQkJUGFyc2VyL3BnZW4uYwotCiBQT0JKUz0JCVwKIAkJUGFyc2VyL2FjY2VsZXIubyBcCiAJCVBhcnNlci9ncmFtbWFyMS5vIFwKQEAgLTMwNiwxNiArMjk1LDYgQEAKIAogUEFSU0VSX09CSlM9CSQoUE9CSlMpIFBhcnNlci9teXJlYWRsaW5lLm8gUGFyc2VyL3BhcnNldG9rLm8gUGFyc2VyL3Rva2VuaXplci5vCiAKLVBHU1JDUz0JCVwKLQkJT2JqZWN0cy9vYm1hbGxvYy5jIFwKLQkJUHl0aG9uL2R5bmFtaWNfYW5ub3RhdGlvbnMuYyBcCi0JCVB5dGhvbi9teXNucHJpbnRmLmMgXAotCQlQeXRob24vcHljdHlwZS5jIFwKLQkJUGFyc2VyL3Rva2VuaXplcl9wZ2VuLmMgXAotCQlQYXJzZXIvcHJpbnRncmFtbWFyLmMgXAotCQlQYXJzZXIvcGFyc2V0b2tfcGdlbi5jIFwKLQkJUGFyc2VyL3BnZW5tYWluLmMKLQogUEdPQkpTPQkJXAogCQlPYmplY3RzL29ibWFsbG9jLm8gXAogCQlQeXRob24vZHluYW1pY19hbm5vdGF0aW9ucy5vIFwKQEAgLTMzMSw3ICszMTAsNiBAQAogCQkkKHNyY2RpcikvSW5jbHVkZS9wYXJzZXRvay5oIFwKIAkJJChzcmNkaXIpL1BhcnNlci90b2tlbml6ZXIuaAogCi1QR0VOU1JDUz0JJChQU1JDUykgJChQR1NSQ1MpCiBQR0VOT0JKUz0JJChQT0JKUykgJChQR09CSlMpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC01NjMsNyArNTQxLDcgQEAKICMgUnVuICJBcmd1bWVudCBDbGluaWMiIG92ZXIgYWxsIHNvdXJjZSBmaWxlcwogIyAoZGVwZW5kcyBvbiBweXRob24gaGF2aW5nIGFscmVhZHkgYmVlbiBidWlsdCkKIC5QSE9OWT1jbGluaWMKLWNsaW5pYzogJChCVUlMRFBZVEhPTikKK2NsaW5pYzogJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJzX2ltcGwuYwogCSQoUlVOU0hBUkVEKSAkKFBZVEhPTl9GT1JfQlVJTEQpIC4vVG9vbHMvY2xpbmljL2NsaW5pYy5weSAtLW1ha2UKIAogIyBCdWlsZCB0aGUgaW50ZXJwcmV0ZXIKQEAgLTU3MSw3ICs1NDksNyBAQAogCSQoTElOS0NDKSAkKFBZX0xERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgLW8gJEAgUHJvZ3JhbXMvcHl0aG9uLm8gJChCTERMSUJSQVJZKSAkKExJQlMpICQoTU9ETElCUykgJChTWVNMSUJTKSAkKExETEFTVCkKIAogcGxhdGZvcm06ICQoQlVJTERQWVRIT04pIHB5YnVpbGRkaXIudHh0Ci0JJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLWMgJ2ltcG9ydCBzeXMgOyBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtIDsgcHJpbnQoZ2V0X3BsYXRmb3JtKCkrIi0iK3N5cy52ZXJzaW9uWzA6M10pJyA+cGxhdGZvcm0KKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCgiJXMtJWQuJWQiICUgKGdldF9wbGF0Zm9ybSgpLCAqc3lzLnZlcnNpb25faW5mb1s6Ml0pKScgPnBsYXRmb3JtCiAKICMgQ3JlYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIHN5c2NvbmZpZyBidWlsZC10aW1lIGRhdGEgdGhlcmUuCiAjIHB5YnVpbGRkaXIudHh0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBkaXIgYW5kIGlzIHVzZWQgZm9yCkBAIC01OTMsNiArNTcxLDExIEBACiBNb2R1bGVzL19tYXRoLm86IE1vZHVsZXMvX21hdGguYyBNb2R1bGVzL19tYXRoLmgKIAkkKENDKSAtYyAkKENDU0hBUkVEKSAkKFBZX0NPUkVfQ0ZMQUdTKSAtbyAkQCAkPAogCisjIGJsYWtlMnMgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBibGFrZTJiCiskKHNyY2RpcikvTW9kdWxlcy9fYmxha2UyL2JsYWtlMnNfaW1wbC5jOiAkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmJfaW1wbC5jICQoc3JjZGlyKS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYjJzLnB5CisJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgJChzcmNkaXIpL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJiMnMucHkKKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2RpcikvVG9vbHMvY2xpbmljL2NsaW5pYy5weSAtZiAkQAorCiAjIEJ1aWxkIHRoZSBzaGFyZWQgbW9kdWxlcwogIyBVbmRlciBHTlUgbWFrZSwgTUFLRUZMQUdTIGFyZSBzb3J0ZWQgYW5kIG5vcm1hbGl6ZWQ7IHRoZSAncycgZm9yCiAjIC1zLCAtLXNpbGVudCBvciAtLXF1aWV0IGlzIGFsd2F5cyB0aGUgZmlyc3QgY2hhci4KQEAgLTYwNiw2ICs1ODksNyBAQAogCQlfVENMVEtfSU5DTFVERVM9JyQoVENMVEtfSU5DTFVERVMpJyBfVENMVEtfTElCUz0nJChUQ0xUS19MSUJTKScgXAogCQkkKFBZVEhPTl9GT1JfQlVJTEQpICQoc3JjZGlyKS9zZXR1cC5weSAkJHF1aWV0IGJ1aWxkCiAKKwogIyBCdWlsZCBzdGF0aWMgbGlicmFyeQogIyBhdm9pZCBsb25nIGNvbW1hbmQgbGluZXMsIHNhbWUgYXMgTElCUkFSWV9PQkpTCiAkKExJQlJBUlkpOiAkKExJQlJBUllfT0JKUykKQEAgLTc4MCw2ICs3NjQsNyBAQAogUHl0aG9uL3N5c21vZHVsZS5vOiAkKHNyY2RpcikvUHl0aG9uL3N5c21vZHVsZS5jIE1ha2VmaWxlCiAJJChDQykgLWMgJChQWV9DT1JFX0NGTEFHUykgXAogCQktREFCSUZMQUdTPSciJChBQklGTEFHUykiJyBcCisJCSQoTVVMVElBUkNIX0NQUEZMQUdTKSBcCiAJCS1vICRAICQoc3JjZGlyKS9QeXRob24vc3lzbW9kdWxlLmMKIAogJChJT19PQkpTKTogJChJT19IKQpAQCAtOTI4LDYgKzkxMyw3IEBACiAJCSQoc3JjZGlyKS9JbmNsdWRlL29iamltcGwuaCBcCiAJCSQoT1BDT0RFX0gpIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvb3NkZWZzLmggXAorCQkkKHNyY2RpcikvSW5jbHVkZS9vc21vZHVsZS5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGF0Y2hsZXZlbC5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGdlbi5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGdlbmhlYWRlcnMuaCBcCkBAIC05NzcsNyArOTYzLDcgQEAKIFRFU1RPUFRTPQkkKEVYVFJBVEVTVE9QVFMpCiBURVNUUFlUSE9OPQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAkKFRFU1RQWVRIT05PUFRTKQogVEVTVFJVTk5FUj0JJChURVNUUFlUSE9OKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKLVRFU1RUSU1FT1VUPQkzNjAwCitURVNUVElNRU9VVD0JOTAwCiAKICMgUnVuIGEgYmFzaWMgc2V0IG9mIHJlZ3Jlc3Npb24gdGVzdHMuCiAjIFRoaXMgZXhjbHVkZXMgc29tZSB0ZXN0cyB0aGF0IGFyZSBwYXJ0aWN1bGFybHkgcmVzb3VyY2UtaW50ZW5zaXZlLgpAQCAtMTAxNSw3ICsxMDAxLDcgQEAKIAkJLUBpZiB3aGljaCBweWJ1aWxkYm90LmlkZW50aWZ5ID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCiAJCQlweWJ1aWxkYm90LmlkZW50aWZ5ICJDQz0nJChDQyknIiAiQ1hYPSckKENYWCknIjsgXAogCQlmaQotCQkkKFRFU1RSVU5ORVIpIC1qIDEgLXUgYWxsIC1XIC0tdGltZW91dD0kKFRFU1RUSU1FT1VUKSAkKFRFU1RPUFRTKQorCQkkKFRFU1RSVU5ORVIpIC1qIDEgLXUgYWxsIC1XIC0tc2xvd2VzdCAtLXRpbWVvdXQ9JChURVNUVElNRU9VVCkgJChURVNUT1BUUykKIAogUVVJQ0tURVNUT1BUUz0JJChURVNUT1BUUykgLXggdGVzdF9zdWJwcm9jZXNzIHRlc3RfaW8gdGVzdF9saWIydG8zIFwKIAkJdGVzdF9tdWx0aWJ5dGVjb2RlYyB0ZXN0X3VybGxpYjJfbG9jYWxuZXQgdGVzdF9pdGVydG9vbHMgXApAQCAtMTE3OCw2ICsxMTY0LDcgQEAKIAkJdGVzdC9jamtlbmNvZGluZ3MgdGVzdC9kZWNpbWFsdGVzdGRhdGEgdGVzdC94bWx0ZXN0ZGF0YSBcCiAJCXRlc3QvZWludHJkYXRhIFwKIAkJdGVzdC9pbWdoZHJkYXRhIFwKKwkJdGVzdC9saWJyZWdydGVzdCBcCiAJCXRlc3Qvc3VicHJvY2Vzc2RhdGEgdGVzdC9zbmRoZHJkYXRhIHRlc3Qvc3VwcG9ydCBcCiAJCXRlc3QvdHJhY2VkbW9kdWxlcyB0ZXN0L2VuY29kZWRfbW9kdWxlcyBcCiAJCXRlc3QvdGVzdF9pbXBvcnQgXApAQCAtMTI0Nyw3ICsxMjM0LDcgQEAKIAkJZWxzZQl0cnVlOyBcCiAJCWZpOyBcCiAJZG9uZQotCUBmb3IgaSBpbiAkKHNyY2RpcikvTGliLyoucHkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGEucHk7IFwKKwlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5OyBcCiAJZG8gXAogCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCiAJCQkkKElOU1RBTExfU0NSSVBUKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKQEAgLTEyODIsNiArMTI2OSwxMCBAQAogCQkJZXNhYzsgXAogCQlkb25lOyBcCiAJZG9uZQorCSQoSU5TVEFMTF9EQVRBKSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YV8kKEFCSUZMQUdTKS5weSBcCisJCSQoREVTVERJUikkKExJQkRFU1QpLyQoUExBVERJUik7IFwKKwllY2hvICQoSU5TVEFMTF9EQVRBKSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YV8kKEFCSUZMQUdTKS5weSBcCisJCSQoTElCREVTVCkvJChQTEFURElSKQogCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTElDRU5TRSAkKERFU1RESVIpJChMSUJERVNUKS9MSUNFTlNFLnR4dAogCWlmIHRlc3QgLWQgJChERVNURElSKSQoTElCREVTVCkvZGlzdHV0aWxzL3Rlc3RzOyB0aGVuIFwKIAkJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9Nb2R1bGVzL3h4bW9kdWxlLmMgXApAQCAtMTMyMCwxMyArMTMxMSwxOSBAQAogCQkkKFBZVEhPTl9GT1JfQlVJTEQpIC1tIGxpYjJ0bzMucGdlbjIuZHJpdmVyICQoREVTVERJUikkKExJQkRFU1QpL2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIudHh0CiAKICMgQ3JlYXRlIHRoZSBQTEFURElSIHNvdXJjZSBkaXJlY3RvcnksIGlmIG9uZSB3YXNuJ3QgZGlzdHJpYnV0ZWQuLgorIyBGb3IgbXVsdGlhcmNoIHRhcmdldHMsIHVzZSB0aGUgcGxhdC1saW51eC9yZWdlbiBzY3JpcHQuCiAkKHNyY2RpcikvTGliLyQoUExBVERJUik6CiAJbWtkaXIgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCi0JY3AgJChzcmNkaXIpL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuCisJaWYgWyAtbiAiJChNVUxUSUFSQ0gpIiBdOyB0aGVuIFwKKwkgIGNwICQoc3JjZGlyKS9MaWIvcGxhdC1saW51eC9yZWdlbiAkKHNyY2RpcikvTGliLyQoUExBVERJUikvcmVnZW47IFwKKwllbHNlIFwKKwkgIGNwICQoc3JjZGlyKS9MaWIvcGxhdC1nZW5lcmljL3JlZ2VuICQoc3JjZGlyKS9MaWIvJChQTEFURElSKS9yZWdlbjsgXAorCWZpOyBcCiAJZXhwb3J0IFBBVEg7IFBBVEg9ImBwd2RgOiQkUEFUSCI7IFwKIAlleHBvcnQgUFlUSE9OUEFUSDsgUFlUSE9OUEFUSD0iYHB3ZGAvTGliIjsgXAogCWV4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIOyBEWUxEX0ZSQU1FV09SS19QQVRIPSJgcHdkYCI7IFwKIAlleHBvcnQgRVhFOyBFWEU9IiQoQlVJTERFWEUpIjsgXAorCWV4cG9ydCBDQzsgQ0M9IiQoQ0MpIjsgXAogCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBleHBvcnQgTVVMVElBUkNIOyBNVUxUSUFSQ0g9JChNVUxUSUFSQ0gpOyBmaTsgXAogCWV4cG9ydCBQWVRIT05fRk9SX0JVSUxEOyBcCiAJaWYgWyAiJChCVUlMRF9HTlVfVFlQRSkiID0gIiQoSE9TVF9HTlVfVFlQRSkiIF07IHRoZW4gXApAQCAtMTMzNCw2ICsxMzMxLDcgQEAKIAllbHNlIFwKIAkgIFBZVEhPTl9GT1JfQlVJTEQ9IiQoUFlUSE9OX0ZPUl9CVUlMRCkiOyBcCiAJZmk7IFwKKwlleHBvcnQgSDJQWTsgSDJQWT0iJCRQWVRIT05fRk9SX0JVSUxEICQoYWJzX3NyY2RpcikvVG9vbHMvc2NyaXB0cy9oMnB5LnB5IjsgXAogCWNkICQoc3JjZGlyKS9MaWIvJChQTEFURElSKTsgJChSVU5TSEFSRUQpIC4vcmVnZW4KIAogcHl0aG9uLWNvbmZpZzogJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbiBNaXNjL3B5dGhvbi1jb25maWcuc2gKQEAgLTE0MzIsNyArMTQzMCw3IEBACiAJCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCiAJCS0taW5zdGFsbC1wbGF0bGliPSQoREVTVFNIQVJFRCkgXAogCQktLXJvb3Q9JChERVNURElSKS8KLQktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGEucHkKKwktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkKIAktcm0gLXIgJChERVNURElSKSQoREVTVFNIQVJFRCkvX19weWNhY2hlX18KIAogIyBIZXJlIGFyZSBhIGNvdXBsZSBvZiB0YXJnZXRzIGZvciBNYWNPU1ggYWdhaW4sIHRvIGluc3RhbGwgYSBmdWxsCkBAIC0xNDc4LDEwICsxNDc2LDEwIEBACiAjIEluc3RhbGwgYSBudW1iZXIgb2Ygc3ltbGlua3MgdG8ga2VlcCBzb2Z0d2FyZSB0aGF0IGV4cGVjdHMgYSBub3JtYWwgdW5peAogIyBpbnN0YWxsICh3aGljaCBpbmNsdWRlcyBweXRob24tY29uZmlnKSBoYXBweS4KIGZyYW1ld29ya2luc3RhbGxtYWNsaWI6Ci0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChMRFZFUlNJT04pLmEiCi0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChMRFZFUlNJT04pLmR5bGliIgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoVkVSU0lPTikuYSIKLQkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikvY29uZmlnLSQoTERWRVJTSU9OKS9saWJweXRob24kKFZFUlNJT04pLmR5bGliIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5hIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKFZFUlNJT04pLmEiCisJJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChMSUJQTCkvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKIAkkKExOKSAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKIAkkKExOKSAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCiAKQEAgLTE2MTEsNiArMTYwOSw5IEBACiAJLXJtIC1yZiBidWlsZCBwbGF0Zm9ybQogCS1ybSAtcmYgJChQWVRIT05GUkFNRVdPUktESVIpCiAJLXJtIC1mIHB5dGhvbi1jb25maWcucHkgcHl0aG9uLWNvbmZpZworCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBcCisJICBybSAtcmYgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpOyBcCisJZmkKIAogIyBNYWtlIHRoaW5ncyBleHRyYSBjbGVhbiwgYmVmb3JlIG1ha2luZyBhIGRpc3RyaWJ1dGlvbjoKICMgcmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMsIGV2ZW4gTWFrZWZpbGVbLnByZV0KZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCAyODA4MDMwLi44NWE0NzZjIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0xNTQsNiArMTU0LDcgQEAKIFBhdWwgQm9kZGllCiBNYXR0aGV3IEJvZWRpY2tlcgogUm9iaW4gQm9lcmRpamsKK05pa29sYXkgQm9nb3ljaGV2CiBEYXZpZCBCb2xlbgogV291dGVyIEJvbHN0ZXJsZWUKIEdhd2FpbiBCb2x0b24KQEAgLTI0MCw2ICsyNDEsNyBAQAogTWljaGFlbCBDZXRydWxvCiBEYXZlIENoYW1iZXJzCiBQYXNjYWwgQ2hhbWJvbgorTmljaG9sYXMgQ2hhbW1hcwogSm9obiBDaGFuZGxlcgogSHllLVNoaWsgQ2hhbmcKIEplZmZyZXkgQ2hhbmcKQEAgLTMwNCwxNSArMzA2LDE4IEBACiBEYXZpZCBDb3VybmFwZWF1CiBKdWxpZW4gQ291cnRlYXUKIFN0ZXZlIENvdXNpbnMKK0ZyYW5jaXNjbyBDb3V6bwogQWxleCBDb3ZlbnRyeQogTWF0dGhldyBEaXhvbiBDb3dsZXMKIFJ5YW4gQ295bmVyCiBDaHJpc3RvcGhlciBBLiBDcmFpZwogSmVyZW15IENyYXZlbgogTGF1cmEgQ3JlaWdodG9uCitUeWxlciBDcm9tcHRvbgogU2ltb24gQ3Jvc3MKIEZlbGlwZSBDcnV6CiBEcmV3IENzaWxsYWcKK0FsZXNzYW5kcm8gQ3VjY2kKIEpvYXF1aW4gQ3VlbmNhIEFiZWxhCiBKb2huIEN1Z2luaQogVG9tIEN1bGxpdG9uCkBAIC0zNTYsNiArMzYxLDcgQEAKIFl2ZXMgRGlvbm5lCiBEYW5pZWwgRGl0dG1hcgogSm9zaXAgRGpvbG9uZ2EKK1dhbHRlciBEw7Zyd2FsZAogSmFyb21pciBEb2xlY2VrCiBJc21haWwgRG9ubWV6CiBSb2JlcnQgRG9ub2h1ZQpAQCAtMzgzLDcgKzM4OSw2IEBACiBLYXJtZW4gRHlrc3RyYQogSm9zaXAgRHpvbG9uZ2EKIE1heGltIER6dW1hbmVua28KLVdhbHRlciBEw7Zyd2FsZAogSGFucyBFY2thcmR0CiBSb2RvbHBobyBFY2toYXJkdAogVWxyaWNoIEVja2hhcmR0CkBAIC01NDEsNiArNTQ2LDcgQEAKIExhcnMgR3VzdMOkYmVsCiBUaG9tYXMgR8O8dHRsZXIKIEpvbmFzIEguCitKb3NlcGggSGFja21hbgogQmFycnkgSGFkZG93CiBQaGlsaXBwIEhhZ2VtZWlzdGVyCiBQYXVsIHRlbiBIYWdlbgpAQCAtNzc4LDYgKzc4NCw3IEBACiBNYXJrbyBLb2h0YWxhCiBWYWpyYXNreSBLb2sKIEd1aWRvIEtvbGxlcmllCitKYWNlayBLb8WCb2R6aWVqCiBKYWNlayBLb25pZWN6bnkKIEFya2FkeSBLb3BseWFyb3YKIFBldGVyIEEuIEtvcmVuCkBAIC03ODksNiArNzk2LDcgQEAKIEplcnp5IEtvemVyYQogTWFrc2ltIEtvenlhcmNodWsKIFN0ZWZhbiBLcmFoCitSb2xmIEtyYWhsCiBCb2IgS3JhcwogU2ViYXN0aWFuIEtyZWZ0CiBIb2xnZXIgS3Jla2VsCkBAIC04MjEsNiArODI5LDcgQEAKIFRpbm8gTGFuZ2UKIEdsZW5uIExhbmdmb3JkCiBBbmRyZXcgTGFuZ21lYWQKK1dvbGZnYW5nIExhbmduZXIKIERldGxlZiBMYW5uZXJ0CiBTb3JlbiBMYXJzZW4KIEFtb3MgTGF0dGVpZXIKQEAgLTg4MiwyNCArODkxLDI3IEBACiBHcmVnb3IgTGluZ2wKIEV2ZXJldHQgTGlwbWFuCiBNaXJrbyBMaXNzCitBbGV4YW5kZXIgTGl1CiBOaWNrIExvY2t3b29kCiBTdGVwaGFuaWUgTG9ja3dvb2QKK01hcnRpbiB2b24gTMO2d2lzCiBIdWdvIExvcGVzIFRhdmFyZXMKIEd1aWxsZXJtbyBMw7NwZXotQW5nbGFkYQogQW5uZSBMb3JkCitBbGV4IExvcmRUaG9yc2VuCiBUb20gTG9yZWRvCiBKdXN0aW4gTG92ZQogTmVkIEphY2tzb24gTG92ZWx5CiBQZXRlciBMb3ZldHQKIENoYWxtZXIgTG93ZQogSmFzb24gTG93ZQotTWFydGluIHZvbiBMw7Z3aXMKIFRvbnkgTG93bmRzCiBSYXkgTG95emFnYQogS2FuZy1IYW8gKEtlbm55KSBMdQogTHVrYXMgTHVlZwogTG9yZW4gTHVrZQogRnJlZHJpayBMdW5kaAorTWlrZSBMdW5keQogWmhvbmd5dWUgTHVvCiBNYXJrIEx1dHoKIFRhcmFzIEx5YXB1bgpAQCAtOTkwLDYgKzEwMDIsNyBAQAogSmFzb24gVi4gTWlsbGVyCiBKYXkgVC4gTWlsbGVyCiBLYXRpZSBNaWxsZXIKK09yZW4gTWlsbWFuCiBSb21hbiBNaWxuZXIKIEp1bGllbiBNaW90dGUKIEFuZHJpaSBWLiBNaXNoa292c2t5aQpAQCAtMTEzOSw5ICsxMTUyLDExIEBACiBHZW9mZiBQaGlsYnJpY2sKIEdhdnJpZSBQaGlsaXBzb24KIEFkcmlhbiBQaGlsbGlwcworRHVzdHkgUGhpbGxpcHMKIENocmlzdG9waGVyIEouIFBob2VuaXgKIEphbWVzIFBpY2tlcmluZwogTmVhbGUgUGlja2V0dAorU3RldmUgUGllcmN5CiBKaW0gU3QuIFBpZXJyZQogRGFuIFBpZXJzb24KIE1hcnRpam4gUGlldGVycwpAQCAtMTE5Miw2ICsxMjA3LDcgQEAKIEplZmYgUmFtbmFuaQogVmFycHUgUmFudGFsYQogQnJvZGllIFJhbworUsOpbWkgUmFtcGluCiBTZW5rbyBSYXNpYwogQW50dGkgUmFzaW5lbgogTmlrb2xhdXMgUmF0aApAQCAtMTI0Miw2ICsxMjU4LDcgQEAKIEtldmluIFJvZGdlcnMKIFNlYW4gUm9kbWFuCiBHaWFtcGFvbG8gUm9kb2xhCitNYXVybyBTLiBNLiBSb2RyaWd1ZXMKIEVsc29uIFJvZHJpZ3VlegogQWRpIFJvaWJhbgogTHVpcyBSb2phcwpAQCAtMTI4NCw2ICsxMzAxLDcgQEAKIENvbnN0YW50aW5hIFMuCiBQYXRyaWNrIFNhYmluCiBTw6liYXN0aWVuIFNhYmzDqQorQW1pdCBTYWhhCiBTdW1hbiBTYWhhCiBIYWppbWUgU2FpdG91CiBHZW9yZ2UgU2Fra2lzCkBAIC0xMzkwLDYgKzE0MDgsNyBAQAogUm95IFNtaXRoCiBSeWFuIFNtaXRoLVJvYmVydHMKIFJhZmFsIFNtb3RyenlrCitKb3NoIFNuaWRlcgogRXJpYyBTbm93CiBEaXJrIFNvZWRlCiBOaXIgU29mZmVyCkBAIC0xNDE3LDExICsxNDM2LDEzIEBACiBNYXJlayBTdGVwbmlvd3NraQogQmFydWNoIFN0ZXJpbgogQ2hyaXMgU3Rlcm4KK0VsaSBTdGV2ZW5zCiBBbGV4IFN0ZXdhcnQKIFZpY3RvciBTdGlubmVyCiBSaWNoYXJkIFN0b2FrbGV5CiBQZXRlciBTdG9laHIKIENhc3BlciBTdG9lbAorRGFuaWVsIFN0b2tlcwogTWljaGFlbCBTdG9uZQogU2VyaGl5IFN0b3JjaGFrYQogS2VuIFN0b3gKQEAgLTE0NDYsNiArMTQ2Nyw3IEBACiBKb2huIFN6YWttZWlzdGVyCiBBbWlyIFN6ZWtlbHkKIE1hY2llaiBTenVsaWsKK0pvZWwgVGFkZGVpCiBBcmZyZXZlciBGcmVodGVzIFRhaWZlcnNhciBBcmFoZXNpcwogSGlkZWFraSBUYWthaGFzaGkKIFRha2FzZSBBcmloaXJvCkBAIC0xNDU3LDggKzE0NzksMTAgQEAKIENocmlzdGlhbiBUYW56ZXIKIFN0ZXZlbiBUYXNjaHVrCiBBbXkgVGF5bG9yCitKdWxpYW4gVGF5bG9yCiBNb250eSBUYXlsb3IKIEFuYXRvbHkgVGVjaHRvbmlrCitNYXJ0aW4gVGVpY2htYW5uCiBHdXN0YXZvIFRlbXBsZQogTWlraGFpbCBUZXJla2hvdgogVmljdG9yIFRlcnLDs24KQEAgLTE2MzksNiArMTY2Myw3IEBACiBBbGFrc2hlbmRyYSBZYWRhdgogSGlyb2thenUgWWFtYW1vdG8KIEthLVBpbmcgWWVlCitDaGkgSHN1YW4gWWVuCiBKYXNvbiBZZW8KIEV1bmdKdW4gWWkKIEJvYiBZb2Rsb3dza2kKQEAgLTE2NjcsNCArMTY5MiwzIEBACiBEb3VnIFpvbmdrZXIKIFBldGVyIMOFc3RyYW5kCiBldmlsemVybwotQ2hpIEhzdWFuIFllbgpkaWZmIC0tZ2l0IGEvTWlzYy9ISVNUT1JZIGIvTWlzYy9ISVNUT1JZCmluZGV4IDk4ZTkwNDEuLjU5OTVkM2EgMTAwNjQ0Ci0tLSBhL01pc2MvSElTVE9SWQorKysgYi9NaXNjL0hJU1RPUlkKQEAgLTExMzEsNyArMTEzMSw3IEBACiAgIGFuZCBodHRwLmNsaWVudC4gUGF0Y2ggYnkgRXVuZ0p1biBZaS4KIAogLSBJc3N1ZSAjMTQ3Nzc6IHRraW50ZXIgbWF5IHJldHVybiB1bmRlY29kZWQgVVRGLTggYnl0ZXMgYXMgYSBzdHJpbmcgd2hlbgotICBhY2Nlc3NpbmcgdGhlIFRrIGNsaXBib2FyZC4gIE1vZGlmeSBjbGlwYm9hZF9nZXQoKSB0byBmaXJzdCByZXF1ZXN0IHR5cGUKKyAgYWNjZXNzaW5nIHRoZSBUayBjbGlwYm9hcmQuICBNb2RpZnkgY2xpcGJvYXJkX2dldCgpIHRvIGZpcnN0IHJlcXVlc3QgdHlwZQogICBVVEY4X1NUUklORyB3aGVuIG5vIHNwZWNpZmljIHR5cGUgaXMgcmVxdWVzdGVkIGluIGFuIFgxMSB3aW5kb3dpbmcKICAgZW52aXJvbm1lbnQsIGZhbGxpbmcgYmFjayB0byB0aGUgY3VycmVudCBkZWZhdWx0IHR5cGUgU1RSSU5HIGlmIHRoYXQgZmFpbHMuCiAgIE9yaWdpbmFsIHBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgpAQCAtNTY5Myw3ICs1NjkzLDcgQEAKICAgZm9yIHJlYWRpbmcpLgogCiAtIGhhc2hsaWIgaGFzIHR3byBuZXcgY29uc3RhbnQgYXR0cmlidXRlczogYWxnb3JpdGhtc19ndWFyYW50ZWVkIGFuZAotICBhbGdvcml0aG1zX2F2YWlhYmxlIHRoYXQgcmVzcGVjdGl2ZWx5IGxpc3QgdGhlIG5hbWVzIG9mIGhhc2ggYWxnb3JpdGhtcworICBhbGdvcml0aG1zX2F2YWlsYWJsZSB0aGF0IHJlc3BlY3RpdmVseSBsaXN0IHRoZSBuYW1lcyBvZiBoYXNoIGFsZ29yaXRobXMKICAgZ3VhcmFudGVlZCB0byBleGlzdCBpbiBhbGwgUHl0aG9uIGltcGxlbWVudGF0aW9ucyBhbmQgdGhlIG5hbWVzIG9mIGhhc2gKICAgYWxnb3JpdGhtcyBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KIApAQCAtNzM0NCw3ICs3MzQ0LDcgQEAKIC0gSXNzdWUgIzI4NDY6IEFkZCBzdXBwb3J0IGZvciBnemlwLkd6aXBGaWxlIHJlYWRpbmcgemVyby1wYWRkZWQgZmlsZXMuICBQYXRjaAogICBieSBCcmlhbiBDdXJ0aW4uCiAKLS0gSXNzdWUgIzc2ODE6IFVzZSBmbG9vciBkaXZpc2lvbiBpbiBhcHByb3BpYXRlIHBsYWNlcyBpbiB0aGUgd2F2ZSBtb2R1bGUuCistIElzc3VlICM3NjgxOiBVc2UgZmxvb3IgZGl2aXNpb24gaW4gYXBwcm9wcmlhdGUgcGxhY2VzIGluIHRoZSB3YXZlIG1vZHVsZS4KIAogLSBJc3N1ZSAjNTM3MjogRHJvcCB0aGUgcmV1c2Ugb2YgLm8gZmlsZXMgaW4gRGlzdHV0aWxzJyBjY29tcGlsZXIgKHNpbmNlCiAgIEV4dGVuc2lvbiBleHRyYSBvcHRpb25zIG1heSBjaGFuZ2UgdGhlIG91dHB1dCB3aXRob3V0IGNoYW5naW5nIHRoZSAuYwpAQCAtMTA5MjEsNyArMTA5MjEsNyBAQAogCiAtIFN1cHBvcnQgZm9yIEJlT1MgYW5kIEF0aGVPUyB3YXMgcmVtb3ZlZCAoYWNjb3JkaW5nIHRvIFBFUCAxMSkuCiAKLS0gU3VwcG9ydCBmb3IgUmlzY09TLCBJcml4LCBUcnU2NCB3YXMgcmVtb3ZlZCAoYWxsZWRnZWRseSkuCistIFN1cHBvcnQgZm9yIFJpc2NPUywgSXJpeCwgVHJ1NjQgd2FzIHJlbW92ZWQgKGFsbGVnZWRseSkuCiAKIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQpAQCAtMTI5MTIsNyArMTI5MTIsNyBAQAogLSBCdWcgIzk0NzkwNjogQW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2FsZW5kYXIKICAgbW9kdWxlLiBJdCdzIHBvc3NpYmxlIHRvIGdlbmVyYXRlIEhUTUwgY2FsZW5kYXIgbm93IGFuZCB0aGUgbW9kdWxlIGNhbiBiZQogICBjYWxsZWQgYXMgYSBzY3JpcHQgKGUuZy4gdmlhIGBgcHl0aG9uIC1tY2FsZW5kYXJgYCkuIExvY2FsaXplZCBtb250aCBhbmQKLSAgd2Vla2RheSBuYW1lcyBjYW4gYmUgb3VwdXQgKGV2ZW4gaWYgYW4gZXhvdGljIGVuY29kaW5nIGlzIHVzZWQpIHVzaW5nCisgIHdlZWtkYXkgbmFtZXMgY2FuIGJlIG91dHB1dCAoZXZlbiBpZiBhbiBleG90aWMgZW5jb2RpbmcgaXMgdXNlZCkgdXNpbmcKICAgc3BlY2lhbCBjbGFzc2VzIHRoYXQgdXNlIHVuaWNvZGUuCiAKIEJ1aWxkCkBAIC0xMzI5NSw3ICsxMzI5NSw3IEBACiAgIGBgVHJ1ZWBgIGZvciBgYCE9YGAsIGFuZCByYWlzZXMgYGBUeXBlRXJyb3JgYCBmb3Igb3RoZXIgY29tcGFyaXNvbgogICBvcGVyYXRvcnMuICBCZWNhdXNlIGRhdGV0aW1lIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgY29tcGFyaW5nIG9ubHkgdGhlCiAgIGJhc2UgY2xhc3MgKGRhdGUpIG1lbWJlcnMgY2FuIHN0aWxsIGJlIGRvbmUsIGlmIHRoYXQncyBkZXNpcmVkLCBieQotICBmb3JjaW5nIHVzaW5nIG9mIHRoZSBhcHByb3ByYXRlIGRhdGUgbWV0aG9kOyBlLmcuLAorICBmb3JjaW5nIHVzaW5nIG9mIHRoZSBhcHByb3ByaWF0ZSBkYXRlIG1ldGhvZDsgZS5nLiwKICAgYGBhX2RhdGUuX19lcV9fKGFfZGF0ZXRpbWUpYGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgeWVhciwgbW9udGgKICAgYW5kIGRheSBtZW1iZXJzIG9mIGBgYV9kYXRlYGAgYW5kIGBgYV9kYXRldGltZWBgIGFyZSBlcXVhbC4KIApAQCAtMjM3NzAsNyArMjM3NzAsNyBAQAogCiAtIGNvcHkucHk6IE1ha2Ugc3VyZSB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSBfX2dldGluaXRhcmdzX18oKSBhcmUKIGtlcHQgYWxpdmUgKGluIHRoZSBtZW1vKSB0byBhdm9pZCBhIGNlcnRhaW4ga2luZCBvZiBuYXN0eSBjcmFzaC4gIChOb3QKLWVhc2lseSByZXByb2R1Y2FibGUgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGxhdGVyIGNhbGwgdG8KK2Vhc2lseSByZXByb2R1Y2libGUgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGxhdGVyIGNhbGwgdG8KIF9fZ2V0aW5pdGFyZ3NfXygpIHRvIHJldHVybiBhIHR1cGxlIHRoYXQgaGFwcGVucyB0byBiZSBhbGxvY2F0ZWQgYXQKIHRoZSBzYW1lIGFkZHJlc3MuKQogCkBAIC0yNzQwMiw3ICsyNzQwMiw3IEBACiBUaGVyZSBpcyBub3cgYSBzY3JpcHQgdG8gcGF0Y2ggTWFrZWZpbGUgYW5kIGNvbmZpZy5jIHRvIGFkZCBhIG5ldwogb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlOiBBZGRtb2R1bGUuc2guICBSZWFkIHRoZSBzY3JpcHQgYmVmb3JlIHVzaW5nIQogCi1Vc2VpbmcgQWRkbW9kdWxlLnNoLCBhbGwgb3B0aW9uYWwgbW9kdWxlcyBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgYXQKK1VzaW5nIEFkZG1vZHVsZS5zaCwgYWxsIG9wdGlvbmFsIG1vZHVsZXMgY2FuIG5vdyBiZSBjb25maWd1cmVkIGF0CiBjb21waWxlIHRpbWUgdXNpbmcgQ29uZmlndXJlLnB5LCBzbyB0aGVyZSBhcmUgbm8gbW9kdWxlcyBsZWZ0IHRoYXQKIHJlcXVpcmUgZHluYW1pYyBsb2FkaW5nLgogCkBAIC0yNzgzMyw5ICsyNzgzMyw5IEBACiAKIFNVTkFVRElPREVWOiBzeW1ib2xpYyBjb25zdGFudCBkZWZpbml0aW9ucyBmb3Igc3VuYXVkaW9kZWYgKHN1biBvbmx5KQogCi1TVjogc3ltYm9saWMgY29uc3RhdCBkZWZpbml0aW9ucyBmb3Igc3YgKHNnaSBvbmx5KQorU1Y6IHN5bWJvbGljIGNvbnN0YW50IGRlZmluaXRpb25zIGZvciBzdiAoc2dpIG9ubHkpCiAKLUNEOiBzeW1ib2xpYyBjb25zdGF0IGRlZmluaXRpb25zIGZvciBjZCAoc2dpIG9ubHkpCitDRDogc3ltYm9saWMgY29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIGNkIChzZ2kgb25seSkKIAogCiBOZXcgZGVtb3MKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCA3YzYyYTE1Li5iMmE4NjgwIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0yLDE2ICsyLDQ3IEBACiBQeXRob24gTmV3cwogKysrKysrKysrKysKIAotV2hhdCdzIE5ldyBpbiBQeXRob24gMy41LjMgcmVsZWFzZSBjYW5kaWRhdGUgMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBiZXRhIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZWxlYXNlIGRhdGU6IFRCQQorKlJlbGVhc2UgZGF0ZTogWFhYWC1YWC1YWCoKIAogQ29yZSBhbmQgQnVpbHRpbnMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKIC0gSXNzdWUgIzI2MzA3OiBUaGUgcHJvZmlsZS1vcHQgYnVpbGQgbm93IGFwcGx5cyBQR08gdG8gdGhlIGJ1aWx0LWluIG1vZHVsZXMuCiAKKy0gSXNzdWUgIzI3MDc4OiBBZGRlZCBCVUlMRF9TVFJJTkcgb3Bjb2RlLiAgT3B0aW1pemVkIGYtc3RyaW5ncyBldmFsdWF0aW9uLgorCistIElzc3VlICMxNzg4NDogUHl0aG9uIG5vdyByZXF1aXJlcyBzeXN0ZW1zIHdpdGggaW50dHlwZXMuaCBhbmQgc3RkaW50LmgKKworLSBJc3N1ZSAjMjc5NjE6IFJlcXVpcmUgcGxhdGZvcm1zIHRvIHN1cHBvcnQgYGBsb25nIGxvbmdgYC4gUHl0aG9uIGhhc24ndAorICBjb21waWxlZCB3aXRob3V0IGBgbG9uZyBsb25nYGAgZm9yIHllYXJzLCBzbyB0aGlzIGlzIGJhc2ljYWxseSBhIGZvcm1hbGl0eS4KKworLSBJc3N1ZSAjMjczNTU6IFJlbW92ZWQgc3VwcG9ydCBmb3IgV2luZG93cyBDRS4gIEl0IHdhcyBuZXZlciBmaW5pc2hlZCwKKyAgYW5kIFdpbmRvd3MgQ0UgaXMgbm8gbG9uZ2VyIGEgcmVsZXZhbnQgcGxhdGZvcm0gZm9yIFB5dGhvbi4KKworLSBJc3N1ZSAjMjc5MjE6IERpc2FsbG93IGJhY2tzbGFzaGVzIGluIGYtc3RyaW5ncy4gVGhpcyBpcyBhIHRlbXBvcmFyeQorICByZXN0cmljdGlvbjogaW4gYmV0YSAyLCBiYWNrc2xhc2hlcyB3aWxsIG9ubHkgYmUgZGlzYWxsb3dlZCBpbnNpZGUKKyAgdGhlIGJyYWNlcyAod2hlcmUgdGhlIGV4cHJlc3Npb25zIGFyZSkuIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UKKyAgZnJvbSB0aGUgMy42IGFscGhhIHJlbGVhc2VzLgorCistIEltcGxlbWVudCB0aGUgZnJhbWUgZXZhbHVhdGlvbiBwYXJ0IG9mIFBFUCA1MjMuCisKKy0gSXNzdWUgIzI3ODcwOiBBIGxlZnQgc2hpZnQgb2YgemVybyBieSBhIGxhcmdlIGludGVnZXIgbm8gbG9uZ2VyIGF0dGVtcHRzCisgIHRvIGFsbG9jYXRlIGxhcmdlIGFtb3VudHMgb2YgbWVtb3J5LgorCistIElzc3VlICMyNTQwMjogSW4gaW50LXRvLWRlY2ltYWwtc3RyaW5nIGNvbnZlcnNpb24sIGltcHJvdmUgdGhlIGVzdGltYXRlCisgIG9mIHRoZSBpbnRlcm1lZGlhdGUgbWVtb3J5IHJlcXVpcmVkLCBhbmQgcmVtb3ZlIGFuIHVubmVjZXNzYXJpbHkgc3RyaWN0CisgIG92ZXJmbG93IGNoZWNrLiBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNzIxNDogSW4gbG9uZ19pbnZlcnQsIGJlIG1vcmUgY2FyZWZ1bCBhYm91dCBtb2RpZnlpbmcgb2JqZWN0CisgIHJldHVybmVkIGJ5IGxvbmdfYWRkLCBhbmQgcmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGNoZWNrIGZvciBzbWFsbCBsb25ncy4KKyAgVGhhbmtzIE9yZW4gTWlsbWFuIGZvciBhbmFseXNpcyBhbmQgcGF0Y2guCisKKy0gSXNzdWUgIzI3NTA2OiBTdXBwb3J0IHBhc3NpbmcgdGhlIGJ5dGVzL2J5dGVhcnJheS50cmFuc2xhdGUoKSAiZGVsZXRlIgorICBhcmd1bWVudCBieSBrZXl3b3JkLgorCiAtIElzc3VlICMyNzgxMjogUHJvcGVybHkgY2xlYXIgb3V0IGEgZ2VuZXJhdG9yJ3MgZnJhbWUncyBiYWNrcmVmZXJlbmNlIHRvIHRoZQogICBnZW5lcmF0b3IgdG8gcHJldmVudCBjcmFzaGVzIGluIGZyYW1lLmNsZWFyKCkuCiAKQEAgLTIyLDYgKzUzLDIyIEBACiAgIGFmdGVyIHVzZSBvZiAnZGVmJyBpbiBfUHlTdGF0ZV9BZGRNb2R1bGUoKS4KICAgSW5pdGlhbCBwYXRjaCBieSBDaHJpc3RpYW4gSGVpbWVzLgogCistIElzc3VlICMyNzc5MjogVGhlIG1vZHVsbyBvcGVyYXRpb24gYXBwbGllZCB0byBgYGJvb2xgYCBhbmQgb3RoZXIKKyAgYGBpbnRgYCBzdWJjbGFzc2VzIG5vdyBhbHdheXMgcmV0dXJucyBhbiBgYGludGBgLiBQcmV2aW91c2x5CisgIHRoZSByZXR1cm4gdHlwZSBkZXBlbmRlZCBvbiB0aGUgaW5wdXQgdmFsdWVzLiBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjY5ODQ6IGludCgpIG5vdyBhbHdheXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBleGFjdCBpbnQuCisKKy0gSXNzdWUgIzI1NjA0OiBGaXggYSBtaW5vciBidWcgaW4gaW50ZWdlciB0cnVlIGRpdmlzaW9uOyB0aGlzIGJ1ZyBjb3VsZAorICBwb3RlbnRpYWxseSBoYXZlIGNhdXNlZCBvZmYtYnktb25lLXVscCByZXN1bHRzIG9uIHBsYXRmb3JtcyB3aXRoCisgIHVucmVsaWFibGUgbGRleHAgaW1wbGVtZW50YXRpb25zLgorCistIElzc3VlICMyNDI1NDogTWFrZSBjbGFzcyBkZWZpbml0aW9uIG5hbWVzcGFjZSBvcmRlcmVkIGJ5IGRlZmF1bHQuCisKKy0gSXNzdWUgIzI3NjYyOiBGaXggYW4gb3ZlcmZsb3cgY2hlY2sgaW4gYGBMaXN0X05ld2BgOiB0aGUgb3JpZ2luYWwgY29kZSB3YXMKKyAgY2hlY2tpbmcgYWdhaW5zdCBgYFB5X1NJWkVfTUFYYGAgaW5zdGVhZCBvZiB0aGUgY29ycmVjdCB1cHBlciBib3VuZCBvZgorICBgYFB5X1NTSVpFX1RfTUFYYGAuIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCiAtIElzc3VlICMyNzc4MjogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbXBvcnQgbm93IGNvcnJlY3RseSBhbGxvd3MgdGhlCiAgIGBgbV9tZXRob2RzYGAgZmllbGQgdG8gYmUgdXNlZCB0byBhZGQgbW9kdWxlIGxldmVsIGZ1bmN0aW9ucyB0byBpbnN0YW5jZXMKICAgb2Ygbm9uLW1vZHVsZSB0eXBlcyByZXR1cm5lZCBmcm9tIGBgUHlfY3JlYXRlX21vZGBgLiBQYXRjaCBieSBYaWFuZyBaaGFuZy4KQEAgLTM0LDQ1ICs4MSw2OSBAQAogICBydW5weS5ydW5fbW9kdWxlKCkgaXMgZm91bmQgaW4gc3lzLm1vZHVsZXMgYWZ0ZXIgcGFyZW50IHBhY2thZ2VzIGFyZQogICBpbXBvcnRlZCwgYnV0IGJlZm9yZSB0aGUgc3VibW9kdWxlIGlzIGV4ZWN1dGVkLgogCistIElzc3VlICMyNzE1NzogTWFrZSBvbmx5IHR5cGUoKSBpdHNlbGYgYWNjZXB0IHRoZSBvbmUtYXJndW1lbnQgZm9ybS4KKyAgUGF0Y2ggYnkgRXJ5ayBTdW4gYW5kIEVtYW51ZWwgQmFycnkuCisKIC0gSXNzdWUgIzI3NTU4OiBGaXggYSBTeXN0ZW1FcnJvciBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgInJhaXNlIiBzdGF0ZW1lbnQuCiAgIEluIGEgYnJhbmQgbmV3IHRocmVhZCwgcmFpc2UgYSBSdW50aW1lRXJyb3Igc2luY2UgdGhlcmUgaXMgbm8gYWN0aXZlCiAgIGV4Y2VwdGlvbiB0byByZXJhaXNlLiBQYXRjaCB3cml0dGVuIGJ5IFhpYW5nIFpoYW5nLgogCi0tIElzc3VlICMyNzQxOTogU3RhbmRhcmQgX19pbXBvcnRfXygpIG5vIGxvbmdlciBsb29rIHVwICJfX2ltcG9ydF9fIiBpbiBnbG9iYWxzCi0gIG9yIGJ1aWx0aW5zIGZvciBpbXBvcnRpbmcgc3VibW9kdWxlcyBvciAiZnJvbSBpbXBvcnQiLiAgRml4ZWQgaGFuZGxpbmcgYW4KLSAgZXJyb3Igb2Ygbm9uLXN0cmluZyBwYWNrYWdlIG5hbWUuCi0KLS0gSXNzdWUgIzI3MDgzOiBSZXNwZWN0IHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgdW5kZXIgV2luZG93cy4KLQotLSBJc3N1ZSAjMjc1MTQ6IE1ha2UgaGF2aW5nIHRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcyBhIFN5bnRheEVycm9yCi0gIGluc3RlYWQgb2YgU3lzdGVtRXJyb3IuCi0KLS0gSXNzdWUgIzI3NDczOiBGaXhlZCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93IGluIGJ5dGVzIGFuZCBieXRlYXJyYXkKLSAgY29uY2F0ZW5hdGlvbnMuICBQYXRjaCBieSBYaWFuZyBaaGFuZy4KLQotLSBJc3N1ZSAjMjc1MDc6IEFkZCBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrIGluIGJ5dGVhcnJheS5leHRlbmQoKS4gIFBhdGNoIGJ5Ci0gIFhpYW5nIFpoYW5nLgotCi0tIElzc3VlICMyNzU4MTogRG9uJ3QgcmVseSBvbiB3cmFwcGluZyBmb3Igb3ZlcmZsb3cgY2hlY2sgaW4KLSAgUHlTZXF1ZW5jZV9UdXBsZSgpLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCi0KLS0gSXNzdWUgIzI3NDQzOiBfX2xlbmd0aF9oaW50X18oKSBvZiBieXRlYXJyYXkgaXRlcmF0b3JzIG5vIGxvbmdlciByZXR1cm4gYQotICBuZWdhdGl2ZSBpbnRlZ2VyIGZvciBhIHJlc2l6ZWQgYnl0ZWFycmF5LgotCiBMaWJyYXJ5CiAtLS0tLS0tCiAKKy0gSXNzdWUgIzI3Nzc2OiBUaGUgOmZ1bmM6YG9zLnVyYW5kb21gIGZ1bmN0aW9uIGRvZXMgbm93IGJsb2NrIG9uIExpbnV4IDMuMTcKKyAgYW5kIG5ld2VyIHVudGlsIHRoZSBzeXN0ZW0gdXJhbmRvbSBlbnRyb3B5IHBvb2wgaXMgaW5pdGlhbGl6ZWQgdG8gaW5jcmVhc2UKKyAgdGhlIHNlY3VyaXR5LiBUaGlzIGNoYW5nZSBpcyBwYXJ0IG9mIHRoZSA6cGVwOmA1MjRgLgorCistIElzc3VlICMyNzc3ODogRXhwb3NlIHRoZSBMaW51eCBgYGdldHJhbmRvbSgpYGAgc3lzY2FsbCBhcyBhIG5ldworICA6ZnVuYzpgb3MuZ2V0cmFuZG9tYCBmdW5jdGlvbi4gVGhpcyBjaGFuZ2UgaXMgcGFydCBvZiB0aGUgOnBlcDpgNTI0YC4KKwogLSBJc3N1ZSAjMjc2OTE6IEZpeCBzc2wgbW9kdWxlJ3MgcGFyc2luZyBvZiBHRU5fUklEIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZQogICBmaWVsZHMgaW4gWC41MDkgY2VydHMuCiAKKy0gSXNzdWUgIzI1NzYxOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgYWJvdXQgdHJ1bmNhdGVkIHBpY2tsZSBkYXRhIGluCisgIEMgaW1wbGVtZW50YXRpb24gb2YgdW5waWNrbGVyLiAgVW5waWNrbGluZ0Vycm9yIGlzIG5vdyByYWlzZWQgaW5zdGVhZCBvZgorICBBdHRyaWJ1dGVFcnJvciBhbmQgVmFsdWVFcnJvciBpbiBzb21lIGNhc2VzLgorCistIElzc3VlICMyNjc5ODogQWRkIEJMQUtFMiAoYmxha2UyYiBhbmQgYmxha2UycykgdG8gaGFzaGxpYi4KKworLSBJc3N1ZSAjMjU1OTY6IE9wdGltaXplZCBnbG9iKCkgYW5kIGlnbG9iKCkgZnVuY3Rpb25zIGluIHRoZQorICBnbG9iIG1vZHVsZTsgdGhleSBhcmUgbm93IGFib3V0IDMtLTYgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNzkyODogQWRkIHNjcnlwdCAocGFzc3dvcmQtYmFzZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24pIHRvCisgIGhhc2hsaWIgbW9kdWxlIChyZXF1aXJlcyBPcGVuU1NMIDEuMS4wKS4KKwogLSBJc3N1ZSAjMjc4NTA6IFJlbW92ZSAzREVTIGZyb20gc3NsIG1vZHVsZSdzIGRlZmF1bHQgY2lwaGVyIGxpc3QgdG8gY291bnRlcgogICBtZWFzdXJlIHN3ZWV0MzIgYXR0YWNrIChDVkUtMjAxNi0yMTgzKS4KIAogLSBJc3N1ZSAjMjc3NjY6IEFkZCBDaGFDaGEyMCBQb2x5MTMwNSB0byBzc2wgbW9kdWxlJ3MgZGVmYXVsdCBjaXBlciBsaXN0LgogICAoUmVxdWlyZWQgT3BlblNTTCAxLjEuMCBvciBMaWJyZVNTTCkuCiAKKy0gSXNzdWUgIzI1Mzg3OiBDaGVjayByZXR1cm4gdmFsdWUgb2Ygd2luc291bmQuTWVzc2FnZUJlZXAuCisKKy0gSXNzdWUgIzI3ODY2OiBBZGQgU1NMQ29udGV4dC5nZXRfY2lwaGVycygpIG1ldGhvZCB0byBnZXQgYSBsaXN0IG9mIGFsbAorICBlbmFibGVkIGNpcGhlcnMuCisKKy0gSXNzdWUgIzI3NzQ0OiBBZGQgQUZfQUxHIChMaW51eCBLZXJuZWwgY3J5cHRvKSB0byBzb2NrZXQgbW9kdWxlLgorCiAtIElzc3VlICMyNjQ3MDogUG9ydCBzc2wgYW5kIGhhc2hsaWIgbW9kdWxlIHRvIE9wZW5TU0wgMS4xLjAuCiAKKy0gSXNzdWUgIzExNjIwOiBGaXggc3VwcG9ydCBmb3IgU05EX01FTU9SWSBpbiB3aW5zb3VuZC5QbGF5U291bmQuICBCYXNlZCBvbiBhCisgIHBhdGNoIGJ5IFRpbSBMZXNoZXIuCisKKy0gSXNzdWUgIzExNzM0OiBBZGQgc3VwcG9ydCBmb3IgSUVFRSA3NTQgaGFsZi1wcmVjaXNpb24gZmxvYXRzIHRvIHRoZQorICBzdHJ1Y3QgbW9kdWxlLiBCYXNlZCBvbiBhIHBhdGNoIGJ5IEVsaSBTdGV2ZW5zLgorCistIElzc3VlICMyNzkxOTogRGVwcmVjYXRlZCBgYGV4dHJhX3BhdGhgYCBkaXN0cmlidXRpb24gb3B0aW9uIGluIGRpc3R1dGlscworICBwYWNrYWdpbmcuCisKKy0gSXNzdWUgIzIzMjI5OiBBZGQgbmV3IGBgY21hdGhgYCBjb25zdGFudHM6IGBgY21hdGguaW5mYGAgYW5kIGBgY21hdGgubmFuYGAgdG8KKyAgbWF0Y2ggYGBtYXRoLmluZmBgIGFuZCBgYG1hdGgubmFuYGAsIGFuZCBhbHNvIGBgY21hdGguaW5mamBgIGFuZAorICBgYGNtYXRoLm5hbmpgYCB0byBtYXRjaCB0aGUgZm9ybWF0IHVzZWQgYnkgY29tcGxleCByZXByLgorCistIElzc3VlICMyNzg0MjogVGhlIGNzdi5EaWN0UmVhZGVyIG5vdyByZXR1cm5zIHJvd3Mgb2YgdHlwZSBPcmRlcmVkRGljdC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIEhvbGRlbi4pCisKIC0gUmVtb3ZlIHN1cHBvcnQgZm9yIHBhc3NpbmcgYSBmaWxlIGRlc2NyaXB0b3IgdG8gb3MuYWNjZXNzLiBJdCBuZXZlciB3b3JrZWQgYnV0CiAgIHByZXZpb3VzbHkgZGlkbid0IHJhaXNlLgogCkBAIC05NCwyNSArMTY1LDE5NCBAQAogLSBJc3N1ZSAjMTA1MTM6IEZpeCBhIHJlZ3Jlc3Npb24gaW4gQ29ubmVjdGlvbi5jb21taXQoKS4gIFN0YXRlbWVudHMgc2hvdWxkCiAgIG5vdCBiZSByZXNldCBhZnRlciBhIGNvbW1pdC4KIAorLSBJc3N1ZSAjMTIzMTk6IENodW5rZWQgdHJhbnNmZXIgZW5jb2Rpbmcgc3VwcG9ydCBhZGRlZCB0bworICBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbiByZXF1ZXN0cy4gIFRoZQorICB1cmxsaWIucmVxdWVzdC5BYnN0cmFjdEhUVFBIYW5kbGVyIGNsYXNzIGRvZXMgbm90IGVuZm9yY2UgYSBDb250ZW50LUxlbmd0aAorICBoZWFkZXIgYW55IG1vcmUuICBJZiBhIEhUVFAgcmVxdWVzdCBoYXMgYSBmaWxlIG9yIGl0ZXJhYmxlIGJvZHksIGJ1dCBubworICBDb250ZW50LUxlbmd0aCBoZWFkZXIsIHRoZSBsaWJyYXJ5IG5vdyBmYWxscyBiYWNrIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyLQorICBlbmNvZGluZy4KKwogLSBBIG5ldyB2ZXJzaW9uIG9mIHR5cGluZy5weSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vdHlwaW5nOgogICAtIENvbGxlY3Rpb24gKG9ubHkgZm9yIDMuNikgKElzc3VlICMyNzU5OCkKICAgLSBBZGQgRnJvemVuU2V0IHRvIF9fYWxsX18gKHVwc3RyZWFtICMyNjEpCiAgIC0gZml4IGNyYXNoIGluIF9nZXRfdHlwZV92YXJzKCkgKHVwc3RyZWFtICMyNTkpCiAgIC0gUmVtb3ZlIHRoZSBkaWN0IGNvbnN0cmFpbnQgaW4gRm9yd2FyZFJlZi5fZXZhbF90eXBlICh1cHN0cmVhbSAjMjUyKQogCistIElzc3VlICMyNzgzMjogTWFrZSBgYF9ub3JtYWxpemVgYCBwYXJhbWV0ZXIgdG8gYGBGcmFjdGlvbmBgIGNvbnN0dWN0b3IKKyAga2V5d29yZC1vbmx5LCBzbyB0aGF0IGBgRnJhY3Rpb24oMiwgMywgNClgYCBub3cgcmFpc2VzIGBgVHlwZUVycm9yYGAuCisKIC0gSXNzdWUgIzI3NTM5OiBGaXggdW5ub3JtYWxpc2VkIGBgRnJhY3Rpb24uX19wb3dfX2BgIHJlc3VsdCBpbiB0aGUgY2FzZQogICBvZiBuZWdhdGl2ZSBleHBvbmVudCBhbmQgbmVnYXRpdmUgYmFzZS4KIAogLSBJc3N1ZSAjMjE3MTg6IGN1cnNvci5kZXNjcmlwdGlvbiBpcyBub3cgYXZhaWxhYmxlIGZvciBxdWVyaWVzIHVzaW5nIENURXMuCiAKKy0gSXNzdWUgIzI3ODE5OiBJbiBkaXN0dXRpbHMgc2Rpc3RzLCBzaW1wbHkgcHJvZHVjZSB0aGUgImd6dGFyIiAoZ3ppcHBlZCB0YXIKKyAgZm9ybWF0KSBkaXN0cmlidXRpb25zIG9uIGFsbCBwbGF0Zm9ybXMgdW5sZXNzICJmb3JtYXRzIiBpcyBzdXBwbGllZC4KKwogLSBJc3N1ZSAjMjQ2NjogcG9zaXhwYXRoLmlzbW91bnQgbm93IGNvcnJlY3RseSByZWNvZ25pemVzIG1vdW50IHBvaW50cyB3aGljaAogICB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzLgogCistIElzc3VlICM5OTk4OiBPbiBMaW51eCwgY3R5cGVzLnV0aWwuZmluZF9saWJyYXJ5IG5vdyBsb29rcyBpbiBMRF9MSUJSQVJZX1BBVEgKKyAgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCisKKy0gSXNzdWUgIzI3NTczOiBleGl0IG1lc3NhZ2UgZm9yIGNvZGUuaW50ZXJhY3QgaXMgbm93IGNvbmZpZ3VyYWJsZS4KKworQyBBUEkKKy0tLS0tCisKKy0gSXNzdWUgIzI2MDI3OiBBZGQgc3VwcG9ydCBmb3IgcGF0aC1saWtlIG9iamVjdHMgaW4gUHlVbmljb2RlX0ZTQ29udmVydGVyKCkuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMyNzQyNzogQWRkaXRpb25hbCB0ZXN0cyBmb3IgdGhlIG1hdGggbW9kdWxlLiBQYXRjaCBieSBGcmFuY2lzY28gQ291em8uCisKKy0gSXNzdWUgIzI3OTUzOiBTa2lwIG1hdGggYW5kIGNtYXRoIHRlc3RzIHRoYXQgZmFpbCBvbiBPUyBYIDEwLjQgZHVlIHRvIGEKKyAgcG9vciBsaWJtIGltcGxlbWVudGF0aW9uIG9mIHRhbi4KKworLSBJc3N1ZSAjMjYwNDA6IEltcHJvdmUgdGVzdF9tYXRoIGFuZCB0ZXN0X2NtYXRoIGNvdmVyYWdlIGFuZCByaWdvdXIuIFBhdGNoIGJ5CisgIEplZmYgQWxsZW4uCisKKy0gSXNzdWUgIzI3Nzg3OiBDYWxsIGdjLmNvbGxlY3QoKSBiZWZvcmUgY2hlY2tpbmcgZWFjaCB0ZXN0IGZvciAiZGFuZ2xpbmcKKyAgdGhyZWFkcyIsIHNpbmNlIHRoZSBkYW5nbGluZyB0aHJlYWRzIGFyZSB3ZWFrIHJlZmVyZW5jZXMuCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyNzkxNzogU2V0IHBsYXRmb3JtIHRyaXBsZXRzIGZvciBBbmRyb2lkIGJ1aWxkcy4KKworLSBJc3N1ZSAjMjU4MjU6IFVwZGF0ZSByZWZlcmVuY2VzIHRvIHRoZSAkKExJQlBMKSBpbnN0YWxsYXRpb24gcGF0aCBvbiBBSVguCisgIFRoaXMgcGF0aCB3YXMgY2hhbmdlZCBpbiAzLjJhNC4KKworLSBVcGRhdGUgT1MgWCBpbnN0YWxsZXIgdG8gdXNlIFNRTGl0ZSAzLjE0LjEgYW5kIFhaIDUuMi4yLgorCistIElzc3VlICMyMTEyMjogRml4IExUTyBidWlsZHMgb24gT1MgWC4KKworV2luZG93cworLS0tLS0tLQorCistIElzc3VlICMyNzk4MjogVGhlIGZ1bmN0aW9ucyBvZiB0aGUgd2luc291bmQgbW9kdWxlIG5vdyBhY2NlcHQga2V5d29yZAorICBhcmd1bWVudHMuCisKKy0gSXNzdWUgIzIwMzY2OiBCdWlsZCBmdWxsIHRleHQgc2VhcmNoIHN1cHBvcnQgaW50byBTUUxpdGUgb24gV2luZG93cy4KKworLSBJc3N1ZSAjMjc3NTY6IEFkZHMgbmV3IGljb25zIGZvciBQeXRob24gZmlsZXMgYW5kIHByb2Nlc3NlcyBvbiBXaW5kb3dzLgorICBEZXNpZ25zIGJ5IENoZXJyeSBXYW5nLgorCistIElzc3VlICMyNzg4MzogVXBkYXRlIHNxbGl0ZSB0byAzLjE0LjEuMCBvbiBXaW5kb3dzLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAxNi0wOC0xNSoKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI3NzA0OiBPcHRpbWl6ZWQgY3JlYXRpbmcgYnl0ZXMgYW5kIGJ5dGVhcnJheSBmcm9tIGJ5dGUtbGlrZSBvYmplY3RzCisgIGFuZCBpdGVyYWJsZXMuICBTcGVlZCB1cCB0byAzIHRpbWVzIGZvciBzaG9ydCBvYmplY3RzLiAgT3JpZ2luYWwgcGF0Y2ggYnkKKyAgTmFva2kgSW5hZGEuCisKKy0gSXNzdWUgIzI2ODIzOiBMYXJnZSBzZWN0aW9ucyBvZiByZXBlYXRlZCBsaW5lcyBpbiB0cmFjZWJhY2tzIGFyZSBub3cKKyAgYWJicmV2aWF0ZWQgYXMgIltQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudH0gbW9yZSB0aW1lc10iIGJ5IHRoZSBidWlsdGluCisgIHRyYWNlYmFjayByZW5kZXJpbmcuIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI3NTc0OiBEZWNyZWFzZWQgYW4gb3ZlcmhlYWQgb2YgcGFyc2luZyBrZXl3b3JkIGFyZ3VtZW50cyBpbiBmdW5jdGlvbnMKKyAgaW1wbGVtZW50ZWQgd2l0aCB1c2luZyBBcmd1bWVudCBDbGluaWMuCisKKy0gSXNzdWUgIzIyNTU3OiBOb3cgaW1wb3J0aW5nIGFscmVhZHkgaW1wb3J0ZWQgbW9kdWxlcyBpcyB1cCB0byAyLjUgdGltZXMKKyAgZmFzdGVyLgorCistIElzc3VlICMxNzU5NjogSW5jbHVkZSA8d2luY3J5cHQuaD4gdG8gaGVscCB3aXRoIE1pbiBHVyBidWlsZGluZy4KKworLSBJc3N1ZSAjMTc1OTk6IE9uIFdpbmRvd3MsIHJlbmFtZSB0aGUgcHJpdmF0ZWx5IGRlZmluZWQgUkVQQVJTRV9EQVRBX0JVRkZFUgorICBzdHJ1Y3R1cmUgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgZGVmaW5pdGlvbiBmcm9tIE1pbiBHVy4KKworLSBJc3N1ZSAjMjc1MDc6IEFkZCBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrIGluIGJ5dGVhcnJheS5leHRlbmQoKS4gIFBhdGNoIGJ5CisgIFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNzU4MTogRG9uJ3QgcmVseSBvbiB3cmFwcGluZyBmb3Igb3ZlcmZsb3cgY2hlY2sgaW4KKyAgUHlTZXF1ZW5jZV9UdXBsZSgpLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzE2MjE6IEF2b2lkIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGluIGxpc3QgYW5kIHR1cGxlIG9wZXJhdGlvbnMuCisgIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNzQxOTogU3RhbmRhcmQgX19pbXBvcnRfXygpIG5vIGxvbmdlciBsb29rIHVwICJfX2ltcG9ydF9fIiBpbiBnbG9iYWxzCisgIG9yIGJ1aWx0aW5zIGZvciBpbXBvcnRpbmcgc3VibW9kdWxlcyBvciAiZnJvbSBpbXBvcnQiLiAgRml4ZWQgYSBjcmFzaCBpZgorICByYWlzZSBhIHdhcm5pbmcgYWJvdXQgdW5hYmxpbmcgdG8gcmVzb2x2ZSBwYWNrYWdlIGZyb20gX19zcGVjX18gb3IKKyAgX19wYWNrYWdlX18uCisKKy0gSXNzdWUgIzI3MDgzOiBSZXNwZWN0IHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgdW5kZXIgV2luZG93cy4KKworLSBJc3N1ZSAjMjc1MTQ6IE1ha2UgaGF2aW5nIHRvbyBtYW55IHN0YXRpY2FsbHkgbmVzdGVkIGJsb2NrcyBhIFN5bnRheEVycm9yCisgIGluc3RlYWQgb2YgU3lzdGVtRXJyb3IuCisKKy0gSXNzdWUgIzI3MzY2OiBJbXBsZW1lbnRlZCBQRVAgNDg3IChTaW1wbGVyIGN1c3RvbWl6YXRpb24gb2YgY2xhc3MgY3JlYXRpb24pLgorICBVcG9uIHN1YmNsYXNzaW5nLCB0aGUgX19pbml0X3N1YmNsYXNzX18gY2xhc3NtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBiYXNlCisgIGNsYXNzLiBEZXNjcmlwdG9ycyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBfX3NldF9uYW1lX18gYWZ0ZXIgY2xhc3MgY3JlYXRpb24uCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjYwMjcsICMyNzUyNDogQWRkIFBFUCA1MTkvX19mc3BhdGhfXygpIHN1cHBvcnQgdG8gdGhlIG9zIGFuZCBvcy5wYXRoCisgIG1vZHVsZXMuIEluY2x1ZGVzIGNvZGUgZnJvbSBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjc1OTg6IEFkZCBDb2xsZWN0aW9ucyB0byBjb2xsZWN0aW9ucy5hYmMuCisgIFBhdGNoIGJ5IEl2YW4gTGV2a2l2c2t5aSwgZG9jcyBieSBOZWlsIEdpcmRoYXIuCisKKy0gSXNzdWUgIzI1OTU4OiBTdXBwb3J0ICJhbnRpLXJlZ2lzdHJhdGlvbiIgb2Ygc3BlY2lhbCBtZXRob2RzIGZyb20KKyAgdmFyaW91cyBBQkNzLCBsaWtlIF9faGFzaF9fLCBfX2l0ZXJfXyBvciBfX2xlbl9fLiAgQWxsIHRoZXNlIChhbmQKKyAgc2V2ZXJhbCBtb3JlKSBjYW4gYmUgc2V0IHRvIE5vbmUgaW4gYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgYW5kIHRoZQorICBiZWhhdmlvciB3aWxsIGJlIGFzIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQgYXQgYWxsLgorICAoUHJldmlvdXNseSwgdGhpcyBtZWNoYW5pc20gZXhpc3RlZCBvbmx5IGZvciBfX2hhc2hfXywgdG8gbWFrZQorICBtdXRhYmxlIGNsYXNzZXMgdW5oYXNoYWJsZS4pICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFuZHJldyBCYXJuZXJ0IGFuZAorICBJdmFuIExldmtpdnNreWkuCisKKy0gSXNzdWUgIzE2NzY0OiBTdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzIHRvIHpsaWIuZGVjb21wcmVzcygpLiAgUGF0Y2ggYnkKKyAgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI3NzM2OiBQcmV2ZW50IHNlZ2ZhdWx0IGFmdGVyIGludGVycHJldGVyIHJlLWluaXRpYWxpemF0aW9uIGR1ZQorICB0byByZWYgY291bnQgcHJvYmxlbSBpbnRyb2R1Y2VkIGluIGNvZGUgZm9yIElzc3VlICMyNzAzOCBpbiAzLjYuMGEzLgorICBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjU2Mjg6ICBUaGUgKnZlcmJvc2UqIGFuZCAqcmVuYW1lKiBwYXJhbWV0ZXJzIGZvcgorICBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlIGFyZSBub3cga2V5d29yZC1vbmx5LgorCistIElzc3VlICMxMjM0NTogQWRkIG1hdGhlbWF0aWNhbCBjb25zdGFudCB0YXUgdG8gbWF0aCBhbmQgY21hdGguIFNlZSBhbHNvCisgIFBFUCA2MjguCisKKy0gSXNzdWUgIzI2ODIzOiB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmZvcm1hdCBub3cgYWJicmV2aWF0ZXMgbGFyZ2Ugc2VjdGlvbnMgb2YKKyAgcmVwZWF0ZWQgbGluZXMgYXMgIltQcmV2aW91cyBsaW5lIHJlcGVhdGVkIHtjb3VudH0gbW9yZSB0aW1lc10iICh0aGlzIGNoYW5nZQorICB0aGVuIGZ1cnRoZXIgYWZmZWN0cyBvdGhlciB0cmFjZWJhY2sgZGlzcGxheSBvcGVyYXRpb25zIGluIHRoZSBtb2R1bGUpLiBQYXRjaAorICBieSBFbWFudWVsIEJhcnJ5LgorCistIElzc3VlICMyNzY2NDogQWRkIHRvIGNvbmN1cnJlbnQuZnV0dXJlcy50aHJlYWQuVGhyZWFkUG9vbEV4ZWN1dG9yKCkKKyAgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBhIHRocmVhZCBuYW1lIHByZWZpeC4KKworLSBJc3N1ZSAjMjcxODE6IEFkZCBnZW9tZXRyaWNfbWVhbiBhbmQgaGFybW9uaWNfbWVhbiB0byBzdGF0aXN0aWNzIG1vZHVsZS4KKworLSBJc3N1ZSAjMjc1NzM6IGNvZGUuaW50ZXJhY3Qgbm93IHByaW50cyBhbiBtZXNzYWdlIHdoZW4gZXhpdGluZy4KKworLSBJc3N1ZSAjNjQyMjogQWRkIGF1dG9yYW5nZSBtZXRob2QgdG8gdGltZWl0LlRpbWVyIG9iamVjdHMuCisKIC0gSXNzdWUgIzI3NzczOiBDb3JyZWN0IHNvbWUgbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzIHNlcnZlcl9ob3N0bmFtZSBpbgogICBfc3NsLndyYXBfc29ja2V0KCkuCiAKIC0gSXNzdWUgIzI2NzUwOiB1bml0dGVzdC5tb2NrLmNyZWF0ZV9hdXRvc3BlYygpIG5vdyB3b3JrcyBwcm9wZXJseSBmb3IKLSAgc3ViY2xhc3NlcyBvZiBwcm9wZXJ0eSgpIGFuZCBvdGhlciBkYXRhIGRlc2NyaXB0b3JzLgorICBzdWJjbGFzc2VzIG9mIHByb3BlcnR5KCkgYW5kIG90aGVyIGRhdGEgZGVzY3JpcHRvcnMuICBSZW1vdmVzIHRoZSBuZXZlcgorICBwdWJsaWNseSB1c2VkLCBuZXZlciBkb2N1bWVudGVkIHVuaXR0ZXN0Lm1vY2suRGVzY3JpcHRvclR5cGVzIHR1cGxlLgorCistIElzc3VlICMyNjc1NDogVW5kb2N1bWVudGVkIHN1cHBvcnQgb2YgZ2VuZXJhbCBieXRlcy1saWtlIG9iamVjdHMKKyAgYXMgcGF0aCBpbiBjb21waWxlKCkgYW5kIHNpbWlsYXIgZnVuY3Rpb25zIGlzIG5vdyBkZXByZWNhdGVkLgorCistIElzc3VlICMyNjgwMDogVW5kb2N1bWVudGVkIHN1cHBvcnQgb2YgZ2VuZXJhbCBieXRlcy1saWtlIG9iamVjdHMKKyAgYXMgcGF0aHMgaW4gb3MgZnVuY3Rpb25zIGlzIG5vdyBkZXByZWNhdGVkLgorCistIElzc3VlICMyNjk4MTogQWRkIF9vcmRlcl8gY29tcGF0aWJpbGl0eSBzaGltIHRvIGVudW0uRW51bSBmb3IKKyAgUHl0aG9uIDIvMyBjb2RlIGJhc2VzLgorCistIElzc3VlICMyNzY2MTogQWRkZWQgdHppbmZvIGtleXdvcmQgYXJndW1lbnQgdG8gZGF0ZXRpbWUuY29tYmluZS4KIAogLSBJbiB0aGUgY3Vyc2VzIG1vZHVsZSwgcmFpc2UgYW4gZXJyb3IgaWYgd2luZG93LmdldHN0cigpIG9yIHdpbmRvdy5pbnN0cigpIGlzCiAgIHBhc3NlZCBhIG5lZ2F0aXZlIHZhbHVlLgpAQCAtMTMxLDYgKzM3MSw5IEBACiAgIEhUVFBfUFJPWFkgdmFyaWFibGUgd2hlbiBSRVFVRVNUX01FVEhPRCBlbnZpcm9ubWVudCBpcyBzZXQsIHdoaWNoIGluZGljYXRlcwogICB0aGF0IHRoZSBzY3JpcHQgaXMgaW4gQ0dJIG1vZGUuCiAKKy0gSXNzdWUgIzcwNjM6IFJlbW92ZSBkZWFkIGNvZGUgZnJvbSB0aGUgImFycmF5IiBtb2R1bGUncyBzbGljZSBoYW5kbGluZy4KKyAgUGF0Y2ggYnkgQ2h1Y2suCisKIC0gSXNzdWUgIzI3NjU2OiBEbyBub3QgYXNzdW1lIHNjaGVkLmggZGVmaW5lcyBhbnkgU0NIRURfKiBjb25zdGFudHMuCiAKIC0gSXNzdWUgIzI3MTMwOiBJbiB0aGUgInpsaWIiIG1vZHVsZSwgZml4IGhhbmRsaW5nIG9mIGxhcmdlIGJ1ZmZlcnMKQEAgLTEzOCw2ICszODEsMTUgQEAKICAgd2VyZSBsaW1pdGVkIHRvIDQgR2lCLCBhbmQgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucyBkaWQgbm90CiAgIHByb3Blcmx5IGhhbmRsZSByZXN1bHRzIG9mIDQgR2lCLgogCistIElzc3VlICMyNDc3MzogSW1wbGVtZW50ZWQgUEVQIDQ5NSAoTG9jYWwgVGltZSBEaXNhbWJpZ3VhdGlvbikuCisKKy0gRXhwb3NlIHRoZSBFUE9MTEVYQ0xVU0lWRSBjb25zdGFudCAod2hlbiBpdCBpcyBkZWZpbmVkKSBpbiB0aGUgc2VsZWN0IG1vZHVsZS4KKworLSBJc3N1ZSAjMjc1Njc6IEV4cG9zZSB0aGUgRVBPTExSREhVUCBhbmQgUE9MTFJESFVQIGNvbnN0YW50cyBpbiB0aGUgc2VsZWN0CisgIG1vZHVsZS4KKworLSBJc3N1ZSAjMTYyMTogQXZvaWQgc2lnbmVkIGludCBuZWdhdGlvbiBvdmVyZmxvdyBpbiB0aGUgImF1ZGlvb3AiIG1vZHVsZS4KKwogLSBJc3N1ZSAjMjc1MzM6IFJlbGVhc2UgR0lMIGluIG50Ll9pc2RpcgogCiAtIElzc3VlICMxNzcxMTogRml4ZWQgdW5waWNrbGluZyBieSB0aGUgcGVyc2lzdGVudCBJRCB3aXRoIHByb3RvY29sIDAuCkBAIC0xNDUsNiArMzk3LDExMyBAQAogCiAtIElzc3VlICMyNzUyMjogQXZvaWQgYW4gdW5pbnRlbnRpb25hbCByZWZlcmVuY2UgY3ljbGUgaW4gZW1haWwuZmVlZHBhcnNlci4KIAorLSBJc3N1ZSAjMjc1MTI6IEZpeCBhIHNlZ2ZhdWx0IHdoZW4gb3MuZnNwYXRoKCkgY2FsbGVkIGFuIF9fZnNwYXRoX18oKSBtZXRob2QKKyAgdGhhdCByYWlzZWQgYW4gZXhjZXB0aW9uLiBQYXRjaCBieSBYaWFuZyBaaGFuZy4KKworSURMRQorLS0tLQorCistIElzc3VlICMyNzcxNDogdGV4dF90ZXh0dmlldyBhbmQgdGVzdF9hdXRvY29tcGxldGUgbm93IHBhc3Mgd2hlbiByZS1ydW4KKyAgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gIFRoaXMgb2NjdXJzIHdoZW4gdGVzdF9pZGxlIGZhaWxzIHdoZW4gcnVuIHdpdGggdGhlCisgIC13IG9wdGlvbiBidXQgd2l0aG91dCAtam4uICBGaXggd2FybmluZyBmcm9tIHRlc3RfY29uZmlnLgorCistIElzc3VlICMyNzYyMTogUHV0IHF1ZXJ5IHJlc3BvbnNlIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMgaW4gdGhlIHF1ZXJ5CisgIGJveCBpdHNlbGYgaW5zdGVhZCBvZiBpbiBhIHNlcGFyYXRlIG1hc3NhZ2Vib3guICBSZWRvIHRlc3RzIHRvIG1hdGNoLgorICBBZGQgTWFjIE9TWCByZWZpbmVtZW50cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjc2MjA6IEVzY2FwZSBrZXkgbm93IGNsb3NlcyBRdWVyeSBib3ggYXMgY2FuY2VsbGVkLgorCistIElzc3VlICMyNzYwOTogSURMRTogdGFiIGFmdGVyIGluaXRpYWwgd2hpdGVzcGFjZSBzaG91bGQgdGFiLCBub3QKKyAgYXV0b2NvbXBsZXRlLiBUaGlzIGZpeGVzIHByb2JsZW0gd2l0aCB3cml0aW5nIGRvY3N0cmluZ3MgYXQgbGVhc3QKKyAgdHdpY2UgaW5kZW50ZWQuCisKKy0gSXNzdWUgIzI3NjA5OiBFeHBsaWNpdGx5IHJldHVybiBOb25lIHdoZW4gdGhlcmUgYXJlIGFsc28gbm9uLU5vbmUKKyAgcmV0dXJucy4gSW4gYSBmZXcgY2FzZXMsIHJldmVyc2UgYSBjb25kaXRpb24gYW5kIGVsaW1pbmF0ZSBhIHJldHVybi4KKworLSBJc3N1ZSAjMjU1MDc6IElETEUgbm8gbG9uZ2VyIHJ1bnMgYnVnZ3kgY29kZSBiZWNhdXNlIG9mIGl0cyB0a2ludGVyIGltcG9ydHMuCisgIFVzZXJzIG11c3QgaW5jbHVkZSB0aGUgc2FtZSBpbXBvcnRzIHJlcXVpcmVkIHRvIHJ1biBkaXJlY3RseSBpbiBQeXRob24uCisKKy0gSXNzdWUgIzI3MTczOiBBZGQgJ0lETEUgTW9kZXJuIFVuaXgnIHRvIHRoZSBidWlsdC1pbiBrZXkgc2V0cy4KKyAgTWFrZSB0aGUgZGVmYXVsdCBrZXkgc2V0IGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0uCisgIEFkZCB0ZXN0cyBmb3IgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBtb2R1bGUuCisKKy0gSXNzdWUgIzI3NDUyOiBhZGQgbGluZSBjb3VudGVyIGFuZCBjcmMgdG8gSURMRSBjb25maWdIYW5kbGVyIHRlc3QgZHVtcC4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1ODA1OiBTa2lwIGEgdGVzdCBpbiB0ZXN0X3BrZ3V0aWwgYXMgbmVlZGVkIHRoYXQgZG9lc24ndCB3b3JrIHdoZW4KKyAgYGBfX25hbWVfXyA9PSBfX21haW5fX2BgLiBQYXRjaCBieSBTaWxlbnRHaG9zdC4KKworLSBJc3N1ZSAjMjc0NzI6IEFkZCB0ZXN0LnN1cHBvcnQudW5peF9zaGVsbCBhcyB0aGUgcGF0aCB0byB0aGUgZGVmYXVsdCBzaGVsbC4KKworLSBJc3N1ZSAjMjczNjk6IEluIHRlc3RfcHlleHBhdCwgYXZvaWQgdGVzdGluZyBhbiBlcnJvciBtZXNzYWdlIGRldGFpbCB0aGF0CisgIGNoYW5nZWQgaW4gRXhwYXQgMi4yLjAuCisKKy0gSXNzdWUgIzI3NTk0OiBQcmV2ZW50IGFzc2VydGlvbiBlcnJvciB3aGVuIHJ1bm5pbmcgdGVzdF9hc3Qgd2l0aCBjb3ZlcmFnZQorICBlbmFibGVkOiBlbnN1cmUgY29kZSBvYmplY3QgaGFzIGEgdmFsaWQgZmlyc3QgbGluZSBudW1iZXIuCisgIFBhdGNoIHN1Z2dlc3RlZCBieSBJdmFuIExldmtpdnNreWkuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjc2NDc6IFVwZGF0ZSBidW5kbGVkIFRjbC9UayB0byA4LjYuNi4KKworLSBJc3N1ZSAjMjc2MTA6IEFkZHMgUEVQIDUxNCBtZXRhZGF0YSB0byBXaW5kb3dzIGluc3RhbGxlcgorCistIElzc3VlICMyNzQ2OTogQWRkcyBhIHNoZWxsIGV4dGVuc2lvbiB0byB0aGUgbGF1bmNoZXIgc28gdGhhdCBkcmFnIGFuZCBkcm9wCisgIHdvcmtzIGNvcnJlY3RseS4KKworLSBJc3N1ZSAjMjczMDk6IEVuYWJsZXMgcHJvcGVyIFdpbmRvd3Mgc3R5bGVzIGluIHB5dGhvblt3XS5leGUgbWFuaWZlc3QuCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyNzcxMzogU3VwcHJlc3Mgc3B1cmlvdXMgYnVpbGQgd2FybmluZ3Mgd2hlbiB1cGRhdGluZyBpbXBvcnRsaWIncworICBib290c3RyYXAgZmlsZXMuICBQYXRjaCBieSBYaWFuZyBaaGFuZworCistIElzc3VlICMyNTgyNTogQ29ycmVjdCB0aGUgcmVmZXJlbmNlcyB0byBNb2R1bGVzL3B5dGhvbi5leHAsIHdoaWNoIGlzCisgIHJlcXVpcmVkIG9uIEFJWC4gIFRoZSByZWZlcmVuY2VzIHdlcmUgYWNjaWRlbnRhbGx5IGNoYW5nZWQgaW4gMy41LjBhMS4KKworLSBJc3N1ZSAjMjc0NTM6IENQUCBpbnZvY2F0aW9uIGluIGNvbmZpZ3VyZSBtdXN0IHVzZSBDUFBGTEFHUy4gUGF0Y2ggYnkKKyAgQ2hpIEhzdWFuIFllbi4KKworLSBJc3N1ZSAjMjc2NDE6IFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBpbnNlcnRzIGNvbW1lbnRzIGludG8gdGhlIG1ha2VmaWxlCisgIHRvIHByZXZlbnQgdGhlIHBnZW4gYW5kIF9mcmVlemVfaW1wb3J0bGliIGV4ZWN1dGFibGVzIGZyb20gYmVpbmcgY3Jvc3MtCisgIGNvbXBpbGVkLgorCistIElzc3VlICMyNjY2MjogU2V0IFBZVEhPTl9GT1JfR0VOIGluIGNvbmZpZ3VyZSBhcyB0aGUgUHl0aG9uIHByb2dyYW0gdG8gYmUKKyAgdXNlZCBmb3IgZmlsZSBnZW5lcmF0aW9uIGR1cmluZyB0aGUgYnVpbGQuCisKKy0gSXNzdWUgIzEwOTEwOiBBdm9pZCBDKysgY29tcGlsYXRpb24gZXJyb3JzIG9uIEZyZWVCU0QgYW5kIE9TIFguCisgIEFsc28gdXBkYXRlIEZyZWVkQlNEIHZlcnNpb24gY2hlY2tzIGZvciB0aGUgb3JpZ2luYWwgY3R5cGUgVVRGLTggd29ya2Fyb3VuZC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBhbHBoYSAzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwMTYtMDctMTEqCisKK0NvcmUgYW5kIEJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIElzc3VlICMyNzQ3MzogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBieXRlcyBhbmQgYnl0ZWFycmF5CisgIGNvbmNhdGVuYXRpb25zLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzIzMDM0OiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIENPVU5UX0FMTE9DUywKKyAgU0hPV19BTExPQ19DT1VOVCBvciBTSE9XX1RSQUNLX0NPVU5UIG1hY3JvcyBpcyBub3cgb2ZmIGJ5ICBkZWZhdWx0LiAgSXQgY2FuCisgIGJlIHJlLWVuYWJsZWQgdXNpbmcgdGhlICItWCBzaG93YWxsb2Njb3VudCIgb3B0aW9uLiAgSXQgbm93IG91dHB1dHMgdG8gc3RkZXJyCisgIGluc3RlYWQgb2Ygc3Rkb3V0LgorCistIElzc3VlICMyNzQ0MzogX19sZW5ndGhfaGludF9fKCkgb2YgYnl0ZWFycmF5IGl0ZXJhdG9ycyBubyBsb25nZXIgcmV0dXJuIGEKKyAgbmVnYXRpdmUgaW50ZWdlciBmb3IgYSByZXNpemVkIGJ5dGVhcnJheS4KKworLSBJc3N1ZSAjMjcwMDc6IFRoZSBmcm9taGV4KCkgY2xhc3MgbWV0aG9kcyBvZiBieXRlcyBhbmQgYnl0ZWFycmF5IHN1YmNsYXNzZXMKKyAgbm93IHJldHVybiBhbiBpbnN0YW5jZSBvZiBjb3JyZXNwb25kaW5nIHN1YmNsYXNzLgorCitMaWJyYXJ5CistLS0tLS0tCisKIC0gSXNzdWUgIzI2ODQ0OiBGaXggZXJyb3IgbWVzc2FnZSBmb3IgaW1wLmZpbmRfbW9kdWxlKCkgdG8gcmVmZXIgdG8gJ3BhdGgnCiAgIGluc3RlYWQgb2YgJ25hbWUnLiBQYXRjaCBieSBMZXYgTWF4aW1vdi4KIApAQCAtMTU1LDIyICs1MTQsNTQgQEAKICAgY29uZmlybWluZyB0aGUgbmV0c2NhcGUgY29va2llIGZvcm1hdCBhbmQgbWFraW5nIGl0IGNvbnNpc3RlbnQgd2l0aAogICBkb2N1bWVudGF0aW9uLgogCi0tIElzc3VlICMyNjY2NDogRml4IGFjdGl2YXRlLmZpc2ggYnkgcmVtb3ZpbmcgbWlzLXVzZSBvZiBgYCRgYC4KKy0gSXNzdWUgIzIxNzA4OiBEZXByZWNhdGVkIGRibS5kdW1iIGJlaGF2aW9yIHRoYXQgZGlmZmVycyBmcm9tIGNvbW1vbiBkYm0KKyAgYmVoYXZpb3I6IGNyZWF0aW5nIGEgZGF0YWJhc2UgaW4gJ3InIGFuZCAndycgbW9kZXMgYW5kIG1vZGlmeWluZyBhIGRhdGFiYXNlCisgIGluICdyJyBtb2RlLgogCi0tIElzc3VlICMyMjExNTogRml4ZWQgdHJhY2luZyBUa2ludGVyIHZhcmlhYmxlczogdHJhY2VfdmRlbGV0ZSgpIHdpdGggd3JvbmcKLSAgbW9kZSBubyBsb25nZXIgYnJlYWsgdHJhY2luZywgdHJhY2VfdmluZm8oKSBub3cgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mCi0gIHBhaXJzIG9mIHN0cmluZ3MsIHRyYWNpbmcgaW4gdGhlICJ1IiBtb2RlIG5vdyB3b3Jrcy4KKy0gSXNzdWUgIzI2NzIxOiBDaGFuZ2UgdGhlIHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlci53ZmlsZSBhdHRyaWJ1dGUKKyAgdG8gaW1wbGVtZW50IEJ1ZmZlcmVkSU9CYXNlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgd3JpdGUoKSBtZXRob2Qgbm8gbG9uZ2VyCisgIGRvZXMgcGFydGlhbCB3cml0ZXMuCiAKLS0gRml4IGEgc2NvcGluZyBpc3N1ZSBpbiBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyIHdoaWNoIHRyaWdnZXJlZCBhbgotICBVbmJvdW5kTG9jYWxFcnJvciB3aGVuIGxhenktbG9hZGluZyBhIG1vZHVsZSB0aGF0IHdhcyBhbHJlYWR5IHB1dCBpbnRvCi0gIHN5cy5tb2R1bGVzLgorLSBJc3N1ZSAjMjIxMTU6IEFkZGVkIG1ldGhvZHMgdHJhY2VfYWRkLCB0cmFjZV9yZW1vdmUgYW5kIHRyYWNlX2luZm8gaW4gdGhlCisgIHRraW50ZXIuVmFyaWFibGUgY2xhc3MuICBUaGV5IHJlcGxhY2Ugb2xkIG1ldGhvZHMgdHJhY2VfdmFyaWFibGUsIHRyYWNlLAorICB0cmFjZV92ZGVsZXRlIGFuZCB0cmFjZV92aW5mbyB0aGF0IHVzZSBvYnNvbGV0ZSBUY2wgY29tbWFuZHMgYW5kIG1pZ2h0CisgIG5vdCB3b3JrIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBUY2wuICBGaXhlZCBvbGQgdHJhY2luZyBtZXRob2RzOgorICB0cmFjZV92ZGVsZXRlKCkgd2l0aCB3cm9uZyBtb2RlIG5vIGxvbmdlciBicmVhayB0cmFjaW5nLCB0cmFjZV92aW5mbygpIG5vdworICBhbHdheXMgcmV0dXJucyBhIGxpc3Qgb2YgcGFpcnMgb2Ygc3RyaW5ncywgdHJhY2luZyBpbiB0aGUgInUiIG1vZGUgbm93IHdvcmtzLgorCistIElzc3VlICMyNjI0MzogT25seSB0aGUgbGV2ZWwgYXJndW1lbnQgdG8gemxpYi5jb21wcmVzcygpIGlzIGtleXdvcmQgYXJndW1lbnQKKyAgbm93LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHBvc2l0aW9uYWwtb25seS4KKworLSBJc3N1ZSAjMjcwMzg6IEV4cG9zZSB0aGUgRGlyRW50cnkgdHlwZSBhcyBvcy5EaXJFbnRyeS4gQ29kZSBwYXRjaCBieQorICBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjcxODY6IFVwZGF0ZSBvcy5mc3BhdGgoKS9QeU9TX0ZTUGF0aCgpIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgX19mc3BhdGhfXygpIHRvIGJlIGVpdGhlciBzdHIgb3IgYnl0ZXMuCisKKy0gSXNzdWUgIzE4NzI2OiBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBvZiB0aGUgZHVtcCgpLCBkdW1wcygpLAorICBsb2FkKCkgYW5kIGxvYWRzKCkgZnVuY3Rpb25zIGFuZCBKU09ORW5jb2RlciBhbmQgSlNPTkRlY29kZXIgY2xhc3MKKyAgY29uc3RydWN0b3JzIGluIHRoZSBqc29uIG1vZHVsZSBhcmUgbm93IGtleXdvcmQtb25seS4KKworLSBJc3N1ZSAjMjczMTk6IE1ldGhvZHMgc2VsZWN0aW9uX3NldCgpLCBzZWxlY3Rpb25fYWRkKCksIHNlbGVjdGlvbl9yZW1vdmUoKQorICBhbmQgc2VsZWN0aW9uX3RvZ2dsZSgpIG9mIHR0ay5UcmVlVmlldyBub3cgYWxsb3cgcGFzc2luZyBtdWx0aXBsZSBpdGVtcyBhcworICBtdWx0aXBsZSBhcmd1bWVudHMgaW5zdGVhZCBvZiBwYXNzaW5nIHRoZW0gYXMgYSB0dXBsZS4gIERlcHJlY2F0ZWQKKyAgdW5kb2N1bWVudGVkIGFiaWxpdHkgb2YgY2FsbGluZyB0aGUgc2VsZWN0aW9uKCkgbWV0aG9kIHdpdGggYXJndW1lbnRzLgogCiAtIElzc3VlICMyNzA3OTogRml4ZWQgY3Vyc2VzLmFzY2lpIGZ1bmN0aW9ucyBpc2JsYW5rKCksIGlzY250cmwoKSBhbmQgaXNwdW5jdCgpLgogCistIElzc3VlICMyNzI5NDogTnVtZXJpY2FsIHN0YXRlIGluIHRoZSByZXByIGZvciBUa2ludGVyIGV2ZW50IG9iamVjdHMgaXMgbm93CisgIHJlcHJlc2VudGVkIGFzIGEgY29tYmluYXRpb24gb2Yga25vd24gZmxhZ3MuCisKKy0gSXNzdWUgIzI3MTc3OiBNYXRjaCBvYmplY3RzIGluIHRoZSByZSBtb2R1bGUgbm93IHN1cHBvcnQgaW5kZXgtbGlrZSBvYmplY3RzCisgIGFzIGdyb3VwIGluZGljZXMuICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEplcm9lbiBEZW1leWVyIGFuZCBYaWFuZyBaaGFuZy4KKwogLSBJc3N1ZSAjMjY3NTQ6IFNvbWUgZnVuY3Rpb25zIChjb21waWxlKCkgZXRjKSBhY2NlcHRlZCBhIGZpbGVuYW1lIGFyZ3VtZW50CiAgIGVuY29kZWQgYXMgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGUtbGlrZSBvYmplY3RzCiAgIGFyZSBhY2NlcHRlZC4KIAorLSBJc3N1ZSAjMjY1MzY6IHNvY2tldC5pb2N0bCBub3cgc3VwcG9ydHMgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSC4gUGF0Y2ggYnkKKyAgRGFuaWVsIFN0b2tlcy4KKwogLSBJc3N1ZSAjMjcwNDg6IFByZXZlbnRzIGRpc3R1dGlscyBmYWlsaW5nIG9uIFdpbmRvd3Mgd2hlbiBlbnZpcm9ubWVudAogICB2YXJpYWJsZXMgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycwogCkBAIC0xODksOSArNTgwLDE1IEBACiAgIExpbnV4LiAgVHJ1bmNhdGUgc2l6ZSB0byBJTlRfTUFYIGFuZCBsb29wIHVudGlsIHdlIGNvbGxlY3RlZCBlbm91Z2ggcmFuZG9tCiAgIGJ5dGVzLCBpbnN0ZWFkIG9mIGNhc3RpbmcgYSBkaXJlY3RseSBQeV9zc2l6ZV90IHRvIGludC4KIAorLSBJc3N1ZSAjMTY4NjQ6IHNxbGl0ZTMuQ3Vyc29yLmxhc3Ryb3dpZCBub3cgc3VwcG9ydHMgUkVQTEFDRSBzdGF0ZW1lbnQuCisgIEluaXRpYWwgcGF0Y2ggYnkgQWxleCBMb3JkVGhvcnNlbi4KKwogLSBJc3N1ZSAjMjYzODY6IEZpeGVkIHR0ay5UcmVlVmlldyBzZWxlY3Rpb24gb3BlcmF0aW9ucyB3aXRoIGl0ZW0gaWQncwogICBjb250YWluaW5nIHNwYWNlcy4KIAorLSBJc3N1ZSAjODYzNzogSG9ub3IgYSBwYWdlciBzZXQgYnkgdGhlIGVudiB2YXIgTUFOUEFHRVIgKGluIHByZWZlcmVuY2UgdG8KKyAgb25lIHNldCBieSB0aGUgZW52IHZhciBQQUdFUikuCisKIC0gW1NlY3VyaXR5XSBJc3N1ZSAjMjI2MzY6IEF2b2lkIHNoZWxsIGluamVjdGlvbiBwcm9ibGVtcyB3aXRoCiAgIGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSgpLgogCkBAIC0xOTksNDMgKzU5Niw2OSBAQAogICBsb2NhbGUgZW5jb2RpbmcsIGFuZCBmaXggZ2V0X2JlZ2lkeCgpIGFuZCBnZXRfZW5kaWR4KCkgdG8gcmV0dXJuIGNvZGUgcG9pbnQKICAgaW5kZXhlcy4KIAotLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmguCi0KIC0gSXNzdWUgIzI3MzkyOiBBZGQgbG9vcC5jb25uZWN0X2FjY2VwdGVkX3NvY2tldCgpLgogICBQYXRjaCBieSBKaW0gRnVsdG9uLgogCiBJRExFCiAtLS0tCiAKLS0gSXNzdWUgIzI3NzE0OiB0ZXh0X3RleHR2aWV3IGFuZCB0ZXN0X2F1dG9jb21wbGV0ZSBub3cgcGFzcyB3aGVuIHJlLXJ1bgotICBpbiB0aGUgc2FtZSBwcm9jZXNzLiAgVGhpcyBvY2N1cnMgd2hlbiB0ZXN0X2lkbGUgZmFpbHMgd2hlbiBydW4gd2l0aCB0aGUKLSAgLXcgb3B0aW9uIGJ1dCB3aXRob3V0IC1qbi4gIEZpeCB3YXJuaW5nIGZyb20gdGVzdF9jb25maWcuCistIElzc3VlICMyNzQ3NzogSURMRSBzZWFyY2ggZGlhbG9ncyBub3cgdXNlIHR0ayB3aWRnZXRzLgogCi0tIElzc3VlICMyNTUwNzogSURMRSBubyBsb25nZXIgcnVucyBidWdneSBjb2RlIGJlY2F1c2Ugb2YgaXRzIHRraW50ZXIgaW1wb3J0cy4KLSAgVXNlcnMgbXVzdCBpbmNsdWRlIHRoZSBzYW1lIGltcG9ydHMgcmVxdWlyZWQgdG8gcnVuIGRpcmVjdGx5IGluIFB5dGhvbi4KKy0gSXNzdWUgIzI3MTczOiBBZGQgJ0lETEUgTW9kZXJuIFVuaXgnIHRvIHRoZSBidWlsdC1pbiBrZXkgc2V0cy4KKyAgTWFrZSB0aGUgZGVmYXVsdCBrZXkgc2V0IGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0uCisgIEFkZCB0ZXN0cyBmb3IgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBtb2R1bGUuCisKKy0gSXNzdWUgIzI3NDUyOiBtYWtlIGNvbW1hbmQgbGluZSAiaWRsZS10ZXN0PiBweXRob24gdGVzdF9oZWxwLnB5IiB3b3JrLgorICBfX2ZpbGVfXyBpcyByZWxhdGl2ZSB3aGVuIHB5dGhvbiBpcyBzdGFydGVkIGluIHRoZSBmaWxlJ3MgZGlyZWN0b3J5LgogCiAtIElzc3VlICMyNzQ1MjogYWRkIGxpbmUgY291bnRlciBhbmQgY3JjIHRvIElETEUgY29uZmlnSGFuZGxlciB0ZXN0IGR1bXAuCiAKKy0gSXNzdWUgIzI3MzgwOiBJRExFOiBhZGQgcXVlcnkucHkgd2l0aCBiYXNlIFF1ZXJ5IGRpYWxvZyBhbmQgdHRrIHdpZGdldHMuCisgIE1vZHVsZSBoYWQgc3ViY2xhc3NlcyBTZWN0aW9uTmFtZSwgTW9kdWxlTmFtZSwgYW5kIEhlbHBTb3VyY2UsIHdoaWNoIGFyZQorICB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHVzZXJzIGJ5IGNvbmZpZ2RpYWxvZyBhbmQgZmlsZSA9PkxvYWQgTW9kdWxlLgorICBFYWNoIHN1YmNsYXNzIGhhcyBpdHcgb3duIHZhbGlkaXR5IGNoZWNrcy4gIFVzaW5nIE1vZHVsZU5hbWUgYWxsb3dzIHVzZXJzCisgIHRvIGVkaXQgYmFkIG1vZHVsZSBuYW1lcyBpbnN0ZWFkIG9mIHN0YXJ0aW5nIG92ZXIuCisgIEFkZCB0ZXN0cyBhbmQgZGVsZXRlIHRoZSB0d28gZmlsZXMgY29tYmluZWQgaW50byB0aGUgbmV3IG9uZS4KKworLSBJc3N1ZSAjMjczNzI6IFRlc3RfaWRsZSBubyBsb25nZXIgY2hhbmdlcyB0aGUgbG9jYWxlLgorCiAtIElzc3VlICMyNzM2NTogQWxsb3cgbm9uLWFzY2lpIGNoYXJzIGluIElETEUgTkVXUy50eHQsIGZvciBjb250cmlidXRvciBuYW1lcy4KIAogLSBJc3N1ZSAjMjcyNDU6IElETEU6IENsZWFubHkgZGVsZXRlIGN1c3RvbSB0aGVtZXMgYW5kIGtleSBiaW5kaW5ncy4KICAgUHJldmlvdXNseSwgd2hlbiBJRExFIHdhcyBzdGFydGVkIGZyb20gYSBjb25zb2xlIG9yIGJ5IGltcG9ydCwgYSBjYXNjYWRlCiAgIG9mIHdhcm5pbmdzIHdhcyBlbWl0dGVkLiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KIAorLSBJc3N1ZSAjMjQxMzc6IFJ1biBJRExFLCB0ZXN0X2lkbGUsIGFuZCBodGVzdCB3aXRoIHRraW50ZXIgZGVmYXVsdCByb290CisgIGRpc2FibGVkLiAgRml4IGNvZGUgYW5kIHRlc3RzIHRoYXQgZmFpbCB3aXRoIHRoaXMgcmVzdHJpY3Rpb24uICBGaXggaHRlc3RzIHRvCisgIG5vdCBjcmVhdGUgYSBzZWNvbmQgYW5kIHJlZHVuZGFudCByb290IGFuZCBtYWlubG9vcC4KKworLSBJc3N1ZSAjMjczMTA6IEZpeCBJRExFLmFwcCBmYWlsdXJlIHRvIGxhdW5jaCBvbiBPUyBYIGR1ZSB0byB2ZXN0aWdpYWwgaW1wb3J0LgorCiBDIEFQSQogLS0tLS0KIAogLSBJc3N1ZSAjMjY3NTQ6IFB5VW5pY29kZV9GU0RlY29kZXIoKSBhY2NlcHRlZCBhIGZpbGVuYW1lIGFyZ3VtZW50IGVuY29kZWQgYXMKLSAgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGVzLWxpa2Ugb2JqZWN0cyBhcmUgYWNjZXB0ZWQuCisgIGFuIGl0ZXJhYmxlIG9mIGludGVnZXJzLiBOb3cgb25seSBzdHJpbmdzIGFuZCBieXRlLWxpa2Ugb2JqZWN0cyBhcmUgYWNjZXB0ZWQuCiAKLVRlc3RzCitCdWlsZAogLS0tLS0KIAotLSBJc3N1ZSAjMjc3ODc6IENhbGwgZ2MuY29sbGVjdCgpIGJlZm9yZSBjaGVja2luZyBlYWNoIHRlc3QgZm9yICJkYW5nbGluZwotICB0aHJlYWRzIiwgc2luY2UgdGhlIGRhbmdsaW5nIHRocmVhZHMgYXJlIHdlYWsgcmVmZXJlbmNlcy4KKy0gSXNzdWUgIzI3NDQyOiBFeHBvc2UgdGhlIEFuZHJvaWQgQVBJIGxldmVsIHRoYXQgcHl0aG9uIHdhcyBidWlsdCBhZ2FpbnN0LCBpbgorICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCkgYXMgJ0FORFJPSURfQVBJX0xFVkVMJy4KIAotLSBJc3N1ZSAjMjczNjk6IEluIHRlc3RfcHlleHBhdCwgYXZvaWQgdGVzdGluZyBhbiBlcnJvciBtZXNzYWdlIGRldGFpbCB0aGF0Ci0gIGNoYW5nZWQgaW4gRXhwYXQgMi4yLjAuCistIElzc3VlICMyNzQzNDogVGhlIGludGVycHJldGVyIHRoYXQgcnVucyB0aGUgY3Jvc3MtYnVpbGQsIGZvdW5kIGluIFBBVEgsIG11c3QKKyAgbm93IGJlIG9mIHRoZSBzYW1lIGZlYXR1cmUgdmVyc2lvbiAoZS5nLiAzLjYpIGFzIHRoZSBzb3VyY2UgYmVpbmcgYnVpbHQuCisKKy0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJoLgorCistIElzc3VlICMyMzk2ODogUmVuYW1lIHRoZSBwbGF0Zm9ybSBkaXJlY3RvcnkgZnJvbSBwbGF0LSQoTUFDSERFUCkgdG8KKyAgcGxhdC0kKFBMQVRGT1JNX1RSSVBMRVQpLgorICBSZW5hbWUgdGhlIGNvbmZpZyBkaXJlY3RvcnkgKExJQlBMKSBmcm9tIGNvbmZpZy0kKExEVkVSU0lPTikgdG8KKyAgY29uZmlnLSQoTERWRVJTSU9OKS0kKFBMQVRGT1JNX1RSSVBMRVQpLgorICBJbnN0YWxsIHRoZSBwbGF0Zm9ybSBzcGVjaWZjIF9zeXNjb25maWdkYXRhIG1vZHVsZSBpbnRvIHRoZSBwbGF0Zm9ybQorICBkaXJlY3RvcnkgYW5kIHJlbmFtZSBpdCB0byBpbmNsdWRlIHRoZSBBQklGTEFHUy4KKworLSBEb24ndCB1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgZm9yIEdOVS9IdXJkLgogCiBUb29scy9EZW1vcwogLS0tLS0tLS0tLS0KQEAgLTI0NSw3MSArNjY4LDMyMiBAQAogCiAtIElzc3VlICMyNzQxODogRml4ZWQgVG9vbHMvaW1wb3J0YmVuY2gvaW1wb3J0YmVuY2gucHkuCiAKLVdpbmRvd3MKLS0tLS0tLS0KK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMjc0Njk6IEFkZHMgYSBzaGVsbCBleHRlbnNpb24gdG8gdGhlIGxhdW5jaGVyIHNvIHRoYXQgZHJhZyBhbmQgZHJvcAotICB3b3JrcyBjb3JyZWN0bHkuCi0KLS0gSXNzdWUgIzI3MzA5OiBFbmFibGVkIHByb3BlciBXaW5kb3dzIHN0eWxlcyBpbiBweXRob25bd10uZXhlIG1hbmlmZXN0LgotCi1CdWlsZAotLS0tLS0KLQotLSBJc3N1ZSAjMjc3MTM6IFN1cHByZXNzIHNwdXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXBkYXRpbmcgaW1wb3J0bGliJ3MKLSAgYm9vdHN0cmFwIGZpbGVzLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcKLQotLSBJc3N1ZSAjMjU4MjU6IENvcnJlY3QgdGhlIHJlZmVyZW5jZXMgdG8gTW9kdWxlcy9weXRob24uZXhwIGFuZCBsZF9zb19haXgsCi0gIHdoaWNoIGFyZSByZXF1aXJlZCBvbiBBSVguICBUaGlzIHVwZGF0ZXMgcmVmZXJlbmNlcyB0byBhbiBpbnN0YWxsYXRpb24gcGF0aAotICB0aGF0IHdhcyBjaGFuZ2VkIGluIDMuMmE0LCBhbmQgdW5kb2VzIGNoYW5nZWQgcmVmZXJlbmNlcyB0byB0aGUgYnVpbGQgdHJlZQotICB0aGF0IHdlcmUgbWFkZSBpbiAzLjUuMGExLgotCi0tIElzc3VlICMyNzQ1MzogQ1BQIGludm9jYXRpb24gaW4gY29uZmlndXJlIG11c3QgdXNlIENQUEZMQUdTLiBQYXRjaCBieQotICBDaGkgSHN1YW4gWWVuLgotCi0tIElzc3VlICMyNzY0MTogVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGluc2VydHMgY29tbWVudHMgaW50byB0aGUgbWFrZWZpbGUKLSAgdG8gcHJldmVudCB0aGUgcGdlbiBhbmQgX2ZyZWV6ZV9pbXBvcnRsaWIgZXhlY3V0YWJsZXMgZnJvbSBiZWluZyBjcm9zcy0KLSAgY29tcGlsZWQuCi0KLS0gSXNzdWUgIzI2NjYyOiBTZXQgUFlUSE9OX0ZPUl9HRU4gaW4gY29uZmlndXJlIGFzIHRoZSBQeXRob24gcHJvZ3JhbSB0byBiZQotICB1c2VkIGZvciBmaWxlIGdlbmVyYXRpb24gZHVyaW5nIHRoZSBidWlsZC4KLQotLSBJc3N1ZSAjMTA5MTA6IEF2b2lkIEMrKyBjb21waWxhdGlvbiBlcnJvcnMgb24gRnJlZUJTRCBhbmQgT1MgWC4KLSAgQWxzbyB1cGRhdGUgRnJlZWRCU0QgdmVyc2lvbiBjaGVja3MgZm9yIHRoZSBvcmlnaW5hbCBjdHlwZSBVVEYtOCB3b3JrYXJvdW5kLgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlbGVhc2UgZGF0ZTogMjAxNi0wNi0yNgotCi1Db3JlIGFuZCBCdWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmguCistIElzc3VlICMyNzI4NTogVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGUgZGVwcmVjYXRpb24gb2YgYGBweXZlbnZgYAorICBhbmQgbm9ybWFsaXplIG9uIHRoZSB0ZXJtICJ2aXJ0dWFsIGVudmlyb25tZW50Ii4gUGF0Y2ggYnkgU3RldmUgUGllcmN5LgogCiBUZXN0cwogLS0tLS0KIAotLSBJc3N1ZSAjMjY4Njc6IFVidW50dSdzIG9wZW5zc2wgT1BfTk9fU1NMdjMgaXMgZm9yY2VkIG9uIGJ5IGRlZmF1bHQ7IGZpeCB0ZXN0LgotCi1JRExFCi0tLS0tCi0KLS0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgaW4gaWRsZWxpYi9ORVdTLnR4dCAtIG1pbmltYWwgcGFydCBmb3IgMy41LjIuCistIElzc3VlICMyNzAyNzogQWRkZWQgdGVzdC5zdXBwb3J0LmlzX2FuZHJvaWQgdGhhdCBpcyBUcnVlIHdoZW4gdGhpcyBpcyBhbgorICBBbmRyb2lkIGJ1aWxkLgogCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTIKKypSZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTMqCiAKIENvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCistIElzc3VlICMyNzA5NTogU2ltcGxpZmllZCBNQUtFX0ZVTkNUSU9OIGFuZCByZW1vdmVkIE1BS0VfQ0xPU1VSRSBvcGNvZGVzLgorICBQYXRjaCBieSBEZW11ciBSdW1lZC4KKworLSBJc3N1ZSAjMjcxOTA6IFJhaXNlIE5vdFN1cHBvcnRlZEVycm9yIGlmIHNxbGl0ZTMgaXMgb2xkZXIgdGhhbiAzLjMuMS4KKyAgUGF0Y2ggYnkgRGF2ZSBTYXd5ZXIuCisKKy0gSXNzdWUgIzI3Mjg2OiBGaXhlZCBjb21waWxpbmcgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlLiAgQ2FsbGluZworICBmdW5jdGlvbiB3aXRoIGdlbmVyYWxpemVkIHVucGFja2luZyAoUEVQIDQ0OCkgYW5kIGNvbmZsaWN0aW5nIGtleXdvcmQgbmFtZXMKKyAgY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorCistIElzc3VlICMyNzE0MDogQWRkZWQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcGVuKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKIC0gSXNzdWUgIzI3MDY2OiBGaXhlZCBTeXN0ZW1FcnJvciBpZiBhIGN1c3RvbSBvcGVuZXIgKGZvciBvcGVuKCkpIHJldHVybnMgYQogICBuZWdhdGl2ZSBudW1iZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbi4KIAorLSBJc3N1ZSAjMjY5ODM6IGZsb2F0KCkgbm93IGFsd2F5cyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZXhhY3QgZmxvYXQuCisgIFRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGVtaXR0ZWQgaWYgX19mbG9hdF9fIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKKyAgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQuICBJbiBhIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gdGhpcyBjYW4KKyAgYmUgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzI3MDk3OiBQeXRob24gaW50ZXJwcmV0ZXIgaXMgbm93IGFib3V0IDclIGZhc3RlciBkdWUgdG8gb3B0aW1pemVkCisgIGluc3RydWN0aW9uIGRlY29kaW5nLiAgQmFzZWQgb24gcGF0Y2ggYnkgRGVtdXIgUnVtZWQuCisKKy0gSXNzdWUgIzI2NjQ3OiBQeXRob24gaW50ZXJwcmV0ZXIgbm93IHVzZXMgMTYtYml0IHdvcmRjb2RlIGluc3RlYWQgb2YgYnl0ZWNvZGUuCisgIFBhdGNoIGJ5IERlbXVyIFJ1bWVkLgorCistIElzc3VlICMyMzI3NTogQWxsb3cgYXNzaWduaW5nIHRvIGFuIGVtcHR5IHRhcmdldCBsaXN0IGluIHJvdW5kIGJyYWNrZXRzOgorICAoKSA9IGl0ZXJhYmxlLgorCistIElzc3VlICMyNzI0MzogVXBkYXRlIHRoZSBfX2FpdGVyX18gcHJvdG9jb2w6IGluc3RlYWQgb2YgcmV0dXJuaW5nCisgIGFuIGF3YWl0YWJsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvciwgdGhlIGFzeW5jaHJvbm91cworICBpdGVyYXRvciBzaG91bGQgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBEb2luZyB0aGUgZm9ybWVyIHdpbGwgdHJpZ2dlciBhCisgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcuCisKKworTGlicmFyeQorLS0tLS0tLQorCistIENvbW1lbnQgb3V0IHNvY2tldCAoU09fUkVVU0VQT1JUKSBhbmQgcG9zaXggKE9fU0hMT0NLLCBPX0VYTE9DSykgY29uc3RhbnRzCisgIGV4cG9zZWQgb24gdGhlIEFQSSB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIG9uIEdOVS9IdXJkLiBUaGV5IHdvdWxkIG5vdAorICB3b3JrIGF0IHJ1bnRpbWUgYW55d2F5LgorCistIElzc3VlICMyNTQ1NTogRml4ZWQgY3Jhc2hlcyBpbiByZXByIG9mIHJlY3Vyc2l2ZSBFbGVtZW50VHJlZS5FbGVtZW50IGFuZAorICBmdW5jdG9vbHMucGFydGlhbCBvYmplY3RzLgorCistIElzc3VlICMyNzI5NDogSW1wcm92ZWQgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzLgorCistIElzc3VlICMyMDUwODogSW1wcm92ZSBleGNlcHRpb24gbWVzc2FnZSBvZiBJUHZ7NCw2fU5ldHdvcmsuX19nZXRpdGVtX18uCisgIFBhdGNoIGJ5IEdhcmV0aCBSZWVzLgorCistIFtTZWN1cml0eV0gSXNzdWUgIzI2NTU2OiBVcGRhdGUgZXhwYXQgdG8gMi4xLjEsIGZpeGVzIENWRS0yMDE1LTEyODMuCisKKy0gW1NlY3VyaXR5XSBGaXggVExTIHN0cmlwcGluZyB2dWxuZXJhYmlsaXR5IGluIHNtdHBsaWIsIENWRS0yMDE2LTA3NzIuCisgIFJlcG9ydGVkIGJ5IFRlYW0gT3N0c3Ryb20uCisKKy0gSXNzdWUgIzIxMzg2OiBJbXBsZW1lbnQgbWlzc2luZyBJUHY0QWRkcmVzcy5pc19nbG9iYWwgcHJvcGVydHkuICBJdCB3YXMKKyAgZG9jdW1lbnRlZCBzaW5jZSAwN2E1NjEwYmFlOWQuICBJbml0aWFsIHBhdGNoIGJ5IFJvZ2VyIEx1ZXRoaS4KKworLSBJc3N1ZSAjMjcwMjk6IFJlbW92ZWQgZGVwcmVjYXRlZCBzdXBwb3J0IG9mIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGZyb20KKyAgWmlwRmlsZS5vcGVuKCkuCisKKy0gSXNzdWUgIzI3MDMwOiBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgaW4KKyAgcmVndWxhciBleHByZXNzaW9ucyBub3cgYXJlIGVycm9ycy4gIFRoZSByZS5MT0NBTEUgZmxhZyBub3cgY2FuIGJlIHVzZWQKKyAgb25seSB3aXRoIGJ5dGVzIHBhdHRlcm5zLgorCistIElzc3VlICMyNzE4NjogQWRkIG9zLlBhdGhMaWtlIHN1cHBvcnQgdG8gRGlyRW50cnkgKHBhcnQgb2YgUEVQIDUxOSkuCisgIEluaXRpYWwgcGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzIwOTAwOiBkaXN0dXRpbHMgcmVnaXN0ZXIgY29tbWFuZCBub3cgZGVjb2RlcyBIVFRQIHJlc3BvbnNlcworICBjb3JyZWN0bHkuICBJbml0aWFsIHBhdGNoIGJ5IGluZ3JpZC4KKworLSBJc3N1ZSAjMjcxODY6IEFkZCBvcy5QYXRoTGlrZSBzdXBwb3J0IHRvIHBhdGhsaWIsIHJlbW92aW5nIGl0cyBwcm92aXNpb25hbAorICBzdGF0dXMgKHBhcnQgb2YgUEVQIDUxOSkuIEluaXRpYWwgcGF0Y2ggYnkgRHVzdHkgUGhpbGxpcHMuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcy5mc2VuY29kZSgpIGFuZAorICBvcy5mc2RlY29kZSgpIChwYXJ0IG9mIFBFUCA1MTkpLgorCistIElzc3VlICMyNzE4NjogSW50cm9kdWNlIG9zLlBhdGhMaWtlIGFuZCBvcy5mc3BhdGgoKSAocGFydCBvZiBQRVAgNTE5KS4KKworLSBBIG5ldyB2ZXJzaW9uIG9mIHR5cGluZy5weSBwcm92aWRlcyBzZXZlcmFsIG5ldyBjbGFzc2VzIGFuZAorICBmZWF0dXJlczogQG92ZXJsb2FkIG91dHNpZGUgc3R1YnMsIFJldmVyc2libGUsIERlZmF1bHREaWN0LCBUZXh0LAorICBDb250ZXh0TWFuYWdlciwgVHlwZVtdLCBOZXdUeXBlKCksIFRZUEVfQ0hFQ0tJTkcsIGFuZCBudW1lcm91cyBidWcKKyAgZml4ZXMgKG5vdGUgdGhhdCBzb21lIG9mIHRoZSBuZXcgZmVhdHVyZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4KKyAgbXlweSBvciBvdGhlciBzdGF0aWMgYW5hbHl6ZXJzKS4gIEFsc28gY2xhc3NlcyBmb3IgUEVQIDQ5MgorICAoQXdhaXRhYmxlLCBBc3luY0l0ZXJhYmxlLCBBc3luY0l0ZXJhdG9yKSBoYXZlIGJlZW4gYWRkZWQgKGluIGZhY3QKKyAgdGhleSBtYWRlIGl0IGludG8gMy41LjEgYnV0IHdlcmUgbmV2ZXIgbWVudGlvbmVkKS4KKworLSBJc3N1ZSAjMjU3Mzg6IFN0b3AgaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlci5zZW5kX2Vycm9yKCkgZnJvbQorICBzZW5kaW5nIGEgbWVzc2FnZSBib2R5IGZvciAyMDUgUmVzZXQgQ29udGVudC4gIEFsc28sIGRvbid0IHNlbmQgQ29udGVudAorICBoZWFkZXIgZmllbGRzIGluIHJlc3BvbnNlcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5LiAgUGF0Y2ggYnkgU3VzdW11CisgIEtvc2hpYmEuCisKKy0gSXNzdWUgIzIxMzEzOiBGaXggdGhlICJwbGF0Zm9ybSIgbW9kdWxlIHRvIHRvbGVyYXRlIHdoZW4gc3lzLnZlcnNpb24KKyAgY29udGFpbnMgdHJ1bmNhdGVkIGJ1aWxkIGluZm9ybWF0aW9uLgorCistIFtTZWN1cml0eV0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscworICBgYGdldHJhbmRvbSgpYGAgd2l0aCBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZworICBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaAorICB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KKworLSBJc3N1ZSAjMjM4ODM6IEFkZGVkIG1pc3NpbmcgQVBJcyB0byBfX2FsbF9fIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXMKKyAgZm9yIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogY2dpLCBtYWlsYm94LCBtaW1ldHlwZXMsIHBsaXN0bGliIGFuZCBzbXRwZC4KKyAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLgorCistIElzc3VlICMyNzE2NDogSW4gdGhlIHpsaWIgbW9kdWxlLCBhbGxvdyBkZWNvbXByZXNzaW5nIHJhdyBEZWZsYXRlIHN0cmVhbXMKKyAgd2l0aCBhIHByZWRlZmluZWQgemRpY3QuICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjQyOTE6IEZpeCB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIuV1NHSVJlcXVlc3RIYW5kbGVyIHRvIGNvbXBsZXRlbHkKKyAgd3JpdGUgZGF0YSB0byB0aGUgY2xpZW50LiAgUHJldmlvdXNseSBpdCBjb3VsZCBkbyBwYXJ0aWFsIHdyaXRlcyBhbmQKKyAgdHJ1bmNhdGUgZGF0YS4gIEFsc28sIHdzZ2lyZWYuaGFuZGxlci5TZXJ2ZXJIYW5kbGVyIGNhbiBub3cgaGFuZGxlIHN0ZG91dAorICBkb2luZyBwYXJ0aWFsIHdyaXRlcywgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjEyNzI6IFVzZSBfc3lzY29uZmlnZGF0YS5weSB0byBpbml0aWFsaXplIGRpc3R1dGlscy5zeXNjb25maWcuCisKKy0gSXNzdWUgIzE5NjExOiA6bW9kOmBpbnNwZWN0YCBub3cgcmVwb3J0cyB0aGUgaW1wbGljaXQgYGAuMGBgIHBhcmFtZXRlcnMKKyAgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgY29tcHJlaGVuc2lvbiBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gc2NvcGVzCisgIGFzIGlmIHRoZXkgd2VyZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyBjYWxsZWQgYGBpbXBsaWNpdDBgYC4KKyAgUGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcworICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQorICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KKworLSBzaWduYWwsIHNvY2tldCwgYW5kIHNzbCBtb2R1bGUgSW50RW51bSBjb25zdGFudCBuYW1lIGxvb2t1cHMgbm93IHJldHVybiBhCisgIGNvbnNpc3RlbnQgbmFtZSBmb3IgdmFsdWVzIGhhdmluZyBtdWx0aXBsZSBuYW1lcy4gIEV4OiBzaWduYWwuU2lnbmFscyg2KQorICBub3cgcmVmZXJzIHRvIGl0c2VsZiBhcyBzaWduYWwuU0lHQUxSTSByYXRoZXIgdGhhbiBmbGlwcGluZyBiZXR3ZWVuIHRoYXQKKyAgYW5kIHNpZ25hbC5TSUdJT1QgYmFzZWQgb24gdGhlIGludGVycHJldGVyJ3MgaGFzaCByYW5kb21pemF0aW9uIHNlZWQuCisKKy0gSXNzdWUgIzI3MTY3OiBDbGFyaWZ5IHRoZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBlcnJvciBtZXNzYWdlIHRleHQKKyAgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVkIGR1ZSB0byBhIHNpZ25hbC4KKworLSBJc3N1ZSAjMjU5MzE6IERvbid0IGRlZmluZSBzb2NrZXRzZXJ2ZXIuRm9ya2luZyogbmFtZXMgb24gcGxhdGZvcm1zIHN1Y2gKKyAgYXMgV2luZG93cyB0aGF0IGRvIG5vdCBzdXBwb3J0IG9zLmZvcmsoKS4KKworLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KKyAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzI2NTI2OiBSZXBsYWNlIGN1c3RvbSBwYXJzZSB0cmVlIHZhbGlkYXRpb24gaW4gdGhlIHBhcnNlcgorICBtb2R1bGUgd2l0aCBhIHNpbXBsZSBERkEgdmFsaWRhdG9yLgorCistIElzc3VlICMyNzExNDogRml4IFNTTENvbnRleHQuX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyB3aXRoCisgIFBlcm1pc3Npb25FcnJvcgorCistIElzc3VlICMxODM4MzogQXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIGZpbHRlcnMgd2hlbiB1c2luZyBmaWx0ZXJ3YXJuaW5ncworICBhbmQgc2ltcGxlZmlsdGVyLiAgQmFzZWQgb24gcGF0Y2ggYnkgQWxleCBTaGtvcC4KKworLSBJc3N1ZSAjMjMwMjY6IHdpbnJlZy5RdWVyeVZhbHVlRXgoKSBub3cgcmV0dXJuIGFuIGludGVnZXIgZm9yIFJFR19RV09SRCB0eXBlLgorCistIElzc3VlICMyNjc0MTogc3VicHJvY2Vzcy5Qb3BlbiBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisKKy0gSXNzdWUgIzI3MDU2OiBPcHRpbWl6ZSBwaWNrbGUubG9hZCgpIGFuZCBwaWNrbGUubG9hZHMoKSwgdXAgdG8gMTAlIGZhc3RlcgorICB0byBkZXNlcmlhbGl6ZSBhIGxvdCBvZiBzbWFsbCBvYmplY3RzLgorCistIElzc3VlICMyMTI3MTogTmV3IGtleXdvcmQgb25seSBwYXJhbWV0ZXJzIGluIHJlc2V0X21vY2sgY2FsbC4KKworSURMRQorLS0tLQorCistIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgorICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKKyAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ3NTA6IFN3aXRjaCBhbGwgc2Nyb2xsYmFycyBpbiBJRExFIHRvIHR0ayB2ZXJzaW9ucy4KKyAgV2hlcmUgbmVlZGVkLCBtaW5pbWFsIHRlc3RzIGFyZSBhZGRlZCB0byBjb3ZlciBjaGFuZ2VzLgorCistIElzc3VlICMyNDc1OTogSURMRSByZXF1aXJlcyB0ayA4LjUgYW5kIGF2YWlsYWJpbGl0eSB0dGsgd2lkZ2V0cy4KKyAgRGVsZXRlIG5vdyB1bm5lZWRlZCB0ayB2ZXJzaW9uIHRlc3RzIGFuZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucy4KKyAgQWRkIHRlc3QgZm9yIElETEUgc3ludGF4IGNvbG9yaXpvZXIuCisKKy0gSXNzdWUgIzI3MjM5OiBpZGxlbGliLm1hY29zeC5pc1h5elRrIGZ1bmN0aW9ucyBpbml0aWFsaXplIGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMjcyNjI6IG1vdmUgQXF1YSB1bmJpbmRpbmcgY29kZSwgd2hpY2ggZW5hYmxlIGNvbnRleHQgbWVudXMsIHRvIG1heG9zeC4KKworLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5CisgIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgorICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KKyAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgorICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dAorCistIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCisgIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCisKKy0gSXNzdWUgIzI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiDigJhgaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTmDigJkgaXMgdGhlIHNhbWUgYXMKKyAg4oCYYGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldYOKAmQorICAzLiBBZnRlciDigJhgb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncylg4oCZLAorICDigJhgb2Iua2V5cygpID09IGxpc3Qob2Iub2JqZWN0LmtleXMpYOKAmS4KKyAgNC4gSW4gbWFjb3NjLCBydW5uaW5nQXNPU1hBUFAgPT0gaXNBcXVhVGs7IGlkQ2FyYm9uQXF1YVRrID09IGlzQ2FyYm9uVGsKKworLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KKyAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI0MjI1OiBSZW5hbWUgbWFueSBgaWRsZWxpYi8qLnB5YCBhbmQgYGlkbGVfdGVzdC90ZXN0XyoucHlgIGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCistIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KKyAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KKworLSBJc3N1ZSAjMjE5Mzk6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcGVyY29sYXRvci4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMyMTY3NjogQWRkIHRlc3QgZm9yIElETEUncyByZXBsYWNlIGRpYWxvZy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgorICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KKworLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciB1bmRvIGRlbGVnYXRvci4gIFBhdGNoIG1vc3RseSBieQorICBTYWltYWRoYXYgSGVibGlrYXIgLgorCistIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KKworLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTY0ODQ6IENoYW5nZSB0aGUgZGVmYXVsdCBQWVRIT05ET0NTIFVSTCB0byAiaHR0cHM6IiwgYW5kIGZpeCB0aGUKKyAgcmVzdWx0aW5nIGxpbmtzIHRvIHVzZSBsb3dlcmNhc2UuICBQYXRjaCBieSBTZWFuIFJvZG1hbiwgdGVzdCBieSBLYXVzaGlrCisgIE5hZGlrdWRpdGkuCisKKy0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCisKKy0gSXNzdWUgIzIyNTU4OiBBZGQgcmVtYWluaW5nIGRvYyBsaW5rcyB0byBzb3VyY2UgY29kZSBmb3IgUHl0aG9uLWNvZGVkIG1vZHVsZXMuCisgIFBhdGNoIGJ5IFlvbmkgTGF2aS4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1Mjg1OiByZWdydGVzdCBub3cgdXNlcyBzdWJwcm9jZXNzZXMgd2hlbiB0aGUgLWoxIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgaXMgdXNlZDogZWFjaCB0ZXN0IGZpbGUgcnVucyBpbiBhIGZyZXNoIGNoaWxkIHByb2Nlc3MuIEJlZm9yZSwgdGhlIC1qMSBvcHRpb24KKyAgd2FzIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI1Mjg1OiBUb29scy9idWlsZGJvdC90ZXN0LmJhdCBzY3JpcHQgbm93IHVzZXMgLWoxIGJ5IGRlZmF1bHQgdG8gcnVuCisgIGVhY2ggdGVzdCBmaWxlIGluIGZyZXNoIGNoaWxkIHByb2Nlc3MuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjcwNjQ6IFRoZSBweS5leGUgbGF1bmNoZXIgbm93IGRlZmF1bHRzIHRvIFB5dGhvbiAzLgorICBUaGUgV2luZG93cyBsYXVuY2hlciBgYHB5LmV4ZWBgIG5vIGxvbmdlciBwcmVmZXJzIGFuIGluc3RhbGxlZAorICBQeXRob24gMiB2ZXJzaW9uIG92ZXIgUHl0aG9uIDMgYnkgZGVmYXVsdCB3aGVuIHVzZWQgaW50ZXJhY3RpdmVseS4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKKyAgYnkgWGF2aWVyIGRlIEdheWUuCisKKy0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKKyAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yaC4KKworTWlzYworLS0tLQorCistIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQorICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjcxODY6IEFkZCB0aGUgUHlPU19GU1BhdGgoKSBmdW5jdGlvbiAocGFydCBvZiBQRVAgNTE5KS4KKworLSBJc3N1ZSAjMjYyODI6IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBzdXBwb3J0cyBwb3NpdGlvbmFsLW9ubHkKKyAgcGFyYW1ldGVycy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI2MjgyOiBBcmd1bWVudCBDbGluaWMgbm93IHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBhbmQga2V5d29yZAorICBwYXJhbWV0ZXJzIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTYtMDUtMTYKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKIC0gSXNzdWUgIzIwMDQxOiBGaXhlZCBUeXBlRXJyb3Igd2hlbiBmcmFtZS5mX3RyYWNlIGlzIHNldCB0byBOb25lLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIApAQCAtMzE4LDExICs5OTIsMTcgQEAKIAogLSBJc3N1ZSAjMjY5OTE6IEZpeCBwb3NzaWJsZSByZWZsZWFrIHdoZW4gY3JlYXRpbmcgYSBmdW5jdGlvbiB3aXRoIGFubm90YXRpb25zLgogCi0tIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIFBhdGNoIGJ5Ci0gIEpvZSBKZXZuaWsuCistIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIEJhc2VkIG9uCisgIHBhdGNoIGJ5IEpvZSBKZXZuaWsuCiAKIC0gSXNzdWUgIzIzNjQwOiBpbnQuZnJvbV9ieXRlcygpIG5vIGxvbmdlciBieXBhc3NlcyBjb25zdHJ1Y3RvcnMgZm9yIHN1YmNsYXNzZXMuCiAKKy0gSXNzdWUgIzI3MDA1OiBPcHRpbWl6ZWQgdGhlIGZsb2F0LmZyb21oZXgoKSBjbGFzcyBtZXRob2QgZm9yIGV4YWN0IGZsb2F0LgorICBJdCBpcyBub3cgMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzE4NTMxOiBTaW5nbGUgdmFyLWtleXdvcmQgYXJndW1lbnQgb2YgZGljdCBzdWJ0eXBlIHdhcyBwYXNzZWQKKyAgdW5zY2F0aGVkIHRvIHRoZSBDLWRlZmluZWQgZnVuY3Rpb24uICBOb3cgaXQgaXMgY29udmVydGVkIHRvIGV4YWN0IGRpY3QuCisKIC0gSXNzdWUgIzI2ODExOiBnYy5nZXRfb2JqZWN0cygpIG5vIGxvbmdlciBjb250YWlucyBhIGJyb2tlbiB0dXBsZSB3aXRoIE5VTEwKICAgcG9pbnRlci4KIApAQCAtMzMyLDExICsxMDEyLDI2IEBACiAgIGludGVycG9sYXRpb24gaW4gLnB5cGlyYyBmaWxlcywgbWF0Y2hpbmcgYmVoYXZpb3IgaW4gUHl0aG9uCiAgIDIuNyBhbmQgU2V0dXB0b29scyAxOS4wLgogCistIElzc3VlICMyNjI0OTogTWVtb3J5IGZ1bmN0aW9ucyBvZiB0aGUgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCBkb21haW4KKyAgKDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gKSBub3cgdXNlIHRoZSA6cmVmOmBweW1hbGxvYyBhbGxvY2F0b3IgPHB5bWFsbG9jPmAKKyAgcmF0aGVyIHRoYW4gc3lzdGVtIDpjOmZ1bmM6YG1hbGxvY2AuIEFwcGxpY2F0aW9ucyBjYWxsaW5nCisgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2Agd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgY2FuIG5vdyBjcmFzaDogdXNlCisgIGBgUFlUSE9OTUFMTE9DPWRlYnVnYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdmFsaWRhdGUgdGhlIHVzYWdlIG9mIG1lbW9yeQorICBhbGxvY2F0b3JzIGluIHlvdXIgYXBwbGljYXRpb24uCisKKy0gSXNzdWUgIzI2ODAyOiBPcHRpbWl6ZSBmdW5jdGlvbiBjYWxscyBvbmx5IHVzaW5nIHVucGFja2luZyBsaWtlCisgIGBgZnVuYygqdHVwbGUpYGAgKG5vIG90aGVyIHBvc2l0aW9uYWwgYXJndW1lbnQsIG5vIGtleXdvcmQpOiBhdm9pZCBjb3B5aW5nCisgIHRoZSB0dXBsZS4gUGF0Y2ggd3JpdHRlbiBieSBKb2UgSmV2bmlrLgorCiAtIElzc3VlICMyNjY1OTogTWFrZSB0aGUgYnVpbHRpbiBzbGljZSB0eXBlIHN1cHBvcnQgY3ljbGUgY29sbGVjdGlvbi4KIAogLSBJc3N1ZSAjMjY3MTg6IHN1cGVyLl9faW5pdF9fIG5vIGxvbmdlciBsZWFrcyBtZW1vcnkgaWYgY2FsbGVkIG11bHRpcGxlIHRpbWVzLgogICBOT1RFOiBBIGRpcmVjdCBjYWxsIG9mIHN1cGVyLl9faW5pdF9fIGlzIG5vdCBlbmRvcnNlZCEKIAorLSBJc3N1ZSAjMjcxMzg6IEZpeCB0aGUgZG9jIGNvbW1lbnQgZm9yIEZpbGVGaW5kZXIuZmluZF9zcGVjKCkuCisKKy0gSXNzdWUgIzI3MTQ3OiBNZW50aW9uIFBFUCA0MjAgaW4gdGhlIGltcG9ydGxpYiBkb2NzLgorCiAtIElzc3VlICMyNTMzOTogUFlUSE9OSU9FTkNPRElORyBub3cgaGFzIHByaW9yaXR5IG92ZXIgbG9jYWxlIGluIHNldHRpbmcgdGhlCiAgIGVycm9yIGhhbmRsZXIgZm9yIHN0ZGluIGFuZCBzdGRvdXQuCiAKQEAgLTM0NSw5ICsxMDQwLDQxIEBACiAgIGJ5dGVhcnJheSwgbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBPcmRlcmVkRGljdCwgY29ycmVzcG9uZGluZwogICB2aWV3cyBhbmQgb3Muc2NhbmRpcigpIGl0ZXJhdG9yLgogCistIElzc3VlICMyNjU3NDogT3B0aW1pemUgYGBieXRlcy5yZXBsYWNlKGInJywgYicuJylgYCBhbmQKKyAgYGBieXRlYXJyYXkucmVwbGFjZShiJycsIGInLicpYGAuIFBhdGNoIHdyaXR0ZW4gYnkgSm9zaCBTbmlkZXIuCisKIC0gSXNzdWUgIzI2NTgxOiBJZiBjb2RpbmcgY29va2llIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcyBvbiBhIGxpbmUgaW4KICAgUHl0aG9uIHNvdXJjZSBjb2RlIGZpbGUsIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyB0YWtlbiB0byBhY2NvdW50LgogCistIElzc3VlICMxOTcxMTogQWRkIHRlc3RzIGZvciByZWxvYWRpbmcgbmFtZXNwYWNlIHBhY2thZ2VzLgorCistIElzc3VlICMyMTA5OTogU3dpdGNoIGFwcGxpY2FibGUgaW1wb3J0bGliIHRlc3RzIHRvIHVzZSBQRVAgNDUxIEFQSS4KKworLSBJc3N1ZSAjMjY1NjM6IERlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBub3cgcmFpc2UgYSBmYXRhbAorICBlcnJvciBpZiBmdW5jdGlvbnMgb2YgdGhlIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgZmFtaWx5IGFyZSBjYWxsZWQgd2l0aG91dAorICBob2xkaW5nIHRoZSBHSUwuCisKKy0gSXNzdWUgIzI2NTY0OiBPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBub3cgdXNlCisgIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlIHRvIGdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcworICBhbGxvY2F0ZWQuCisKKy0gSXNzdWUgIzI2NTU4OiBUaGUgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IKKyAgOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCBub3cgZGV0ZWN0IHdoZW4gZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aG91dAorICBob2xkaW5nIHRoZSBHSUwuCisKKy0gSXNzdWUgIzI2NTE2OiBBZGQgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBzZXQgdGhlCisgIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rcy4KKworLSBJc3N1ZSAjMjY1MTY6IFRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGNhbiBub3cgYWxzbyBiZQorICB1c2VkIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisKKy0gSXNzdWUgIzI2NTE2OiBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DU1RBVFNgIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBub3cKKyAgYWxzbyBiZSB1c2VkIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuIEl0IG5vdyBoYXMgbm8gZWZmZWN0IGlmCisgIHNldCB0byBhbiBlbXB0eSBzdHJpbmcuCisKKy0gSXNzdWUgIzI2NTE2OiBJbiBkZWJ1ZyBtb2RlLCBkZWJ1ZyBob29rcyBhcmUgbm93IGFsc28gaW5zdGFsbGVkIG9uIFB5dGhvbgorICBtZW1vcnkgYWxsb2NhdG9ycyB3aGVuIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGhvdXQgcHltYWxsb2MuCisKIC0gSXNzdWUgIzI2NDY0OiBGaXggc3RyLnRyYW5zbGF0ZSgpIHdoZW4gc3RyaW5nIGlzIEFTQ0lJIGFuZCBmaXJzdCByZXBsYWNlbWVudHMKICAgcmVtb3ZlcyBjaGFyYWN0ZXIsIGJ1dCBuZXh0IHJlcGxhY2VtZW50IHVzZXMgYSBub24tQVNDSUkgY2hhcmFjdGVyIG9yIGEKICAgc3RyaW5nIGxvbmdlciB0aGFuIDEgY2hhcmFjdGVyLiBSZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuNS4wLgpAQCAtMzYwLDExICsxMDg3LDM3IEBACiAtIElzc3VlICMyNjMwMjogQ29ycmVjdCBiZWhhdmlvciB0byByZWplY3QgY29tbWEgYXMgYSBsZWdhbCBjaGFyYWN0ZXIgZm9yCiAgIGNvb2tpZSBuYW1lcy4KIAorLSBJc3N1ZSAjMjYxMzY6IFVwZ3JhZGUgdGhlIHdhcm5pbmcgd2hlbiBhIGdlbmVyYXRvciByYWlzZXMgU3RvcEl0ZXJhdGlvbgorICBmcm9tIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgdG8gRGVwcmVjYXRpb25XYXJuaW5nLiAgUGF0Y2ggYnkgQW5pc2gKKyAgU2hhaC4KKworLSBJc3N1ZSAjMjYyMDQ6IFRoZSBjb21waWxlciBub3cgaWdub3JlcyBhbGwgY29uc3RhbnQgc3RhdGVtZW50czogYnl0ZXMsIHN0ciwKKyAgaW50LCBmbG9hdCwgY29tcGxleCwgbmFtZSBjb25zdGFudHMgKE5vbmUsIEZhbHNlLCBUcnVlKSwgRWxsaXBzaXMKKyAgYW5kIGFzdC5Db25zdGFudDsgbm90IG9ubHkgc3RyIGFuZCBpbnQuIEZvciBleGFtcGxlLCBgYDEuMGBgIGlzIG5vdyBpZ25vcmVkCisgIGluIGBgZGVmIGYoKTogMS4wYGAuCisKIC0gSXNzdWUgIzQ4MDY6IEF2b2lkIG1hc2tpbmcgdGhlIG9yaWdpbmFsIFR5cGVFcnJvciBleGNlcHRpb24gd2hlbiB1c2luZyBzdGFyCiAgICgqKSB1bnBhY2tpbmcgaW4gZnVuY3Rpb24gY2FsbHMuICBCYXNlZCBvbiBwYXRjaCBieSBIYWdlbiBGw7xyc3RlbmF1IGFuZAogICBEYW5pZWwgVXJiYW4uCiAKLS0gSXNzdWUgIzI3MTM4OiBGaXggdGhlIGRvYyBjb21tZW50IGZvciBGaWxlRmluZGVyLmZpbmRfc3BlYygpLgorLSBJc3N1ZSAjMjYxNDY6IEFkZCBhIG5ldyBraW5kIG9mIEFTVCBub2RlOiBgYGFzdC5Db25zdGFudGBgLiBJdCBjYW4gYmUgdXNlZAorICBieSBleHRlcm5hbCBBU1Qgb3B0aW1pemVycywgYnV0IHRoZSBjb21waWxlciBkb2VzIG5vdCBlbWl0IGRpcmVjdGx5IHN1Y2gKKyAgbm9kZS4KKworLSBJc3N1ZSAjMjM2MDE6ICBTcGVkLXVwIGFsbG9jYXRpb24gb2YgZGljdCBrZXkgb2JqZWN0cyBieSB1c2luZyBQeXRob24ncworICBzbWFsbCBvYmplY3QgYWxsb2NhdG9yLiAgKENvbnRyaWJ1dGVkIGJ5IEp1bGlhbiBUYXlsb3IuKQorCistIElzc3VlICMxODAxODogSW1wb3J0IHJhaXNlcyBJbXBvcnRFcnJvciBpbnN0ZWFkIG9mIFN5c3RlbUVycm9yIGlmIGEgcmVsYXRpdmUKKyAgaW1wb3J0IGlzIGF0dGVtcHRlZCB3aXRob3V0IGEga25vd24gcGFyZW50IHBhY2thZ2UuCisKKy0gSXNzdWUgIzI1ODQzOiBXaGVuIGNvbXBpbGluZyBjb2RlLCBkb24ndCBtZXJnZSBjb25zdGFudHMgaWYgdGhleSBhcmUgZXF1YWwKKyAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBgYGYxLCBmMiA9IGxhbWJkYTogMSwgbGFtYmRhOiAxLjBgYAorICBpcyBub3cgY29ycmVjdGx5IGNvbXBpbGVkIHRvIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zOiBgYGYxKClgYCByZXR1cm5zIGBgMWBgCisgIChgYGludGBgKSBhbmQgYGBmMigpYGAgcmV0dXJucyBgYDEuMGBgIChgYGZsb2F0YGApLCBldmVuIGlmIGBgMWBgIGFuZCBgYDEuMGBgCisgIGFyZSBlcXVhbC4KKworLSBJc3N1ZSAjMjYxMDc6IFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cworICBjaGFuZ2VzIHRvIHN1cHBvcnQgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuCiAKIC0gSXNzdWUgIzI2MTU0OiBBZGQgYSBuZXcgcHJpdmF0ZSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBmdW5jdGlvbiB0byBnZXQKICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZSwgYnV0IGRvbid0IGlzc3VlIGEgZmF0YWwgZXJyb3IgaWYgaXQgaXMgTlVMTC4KQEAgLTM3MywxNSArMTEyNiw4IEBACiAgIFB5dGhvbiAzLjUuMSB0byBoaWRlIHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhdG9taWMgQyB0eXBlcywgdG8gYXZvaWQKICAgY29tcGlsZXIgaXNzdWVzLgogCi0tIElzc3VlICMyNjE5NDogIERlcXVlLmluc2VydCgpIGdhdmUgb2RkIHJlc3VsdHMgZm9yIGJvdW5kZWQgZGVxdWVzIHRoYXQgaGFkCi0gIHJlYWNoZWQgdGhlaXIgbWF4aW11bSBzaXplLiAgTm93IGFuIEluZGV4RXJyb3Igd2lsbCBiZSByYWlzZWQgd2hlbiBhdHRlbXB0aW5nCi0gIHRvIGluc2VydCBpbnRvIGEgZnVsbCBkZXF1ZS4KLQotLSBJc3N1ZSAjMjU4NDM6IFdoZW4gY29tcGlsaW5nIGNvZGUsIGRvbid0IG1lcmdlIGNvbnN0YW50cyBpZiB0aGV5IGFyZSBlcXVhbAotICBidXQgaGF2ZSBhIGRpZmZlcmVudCB0eXBlcy4gRm9yIGV4YW1wbGUsIGBgZjEsIGYyID0gbGFtYmRhOiAxLCBsYW1iZGE6IDEuMGBgCi0gIGlzIG5vdyBjb3JyZWN0bHkgY29tcGlsZWQgdG8gdHdvIGRpZmZlcmVudCBmdW5jdGlvbnM6IGBgZjEoKWBgIHJldHVybnMgYGAxYGAKLSAgKGBgaW50YGApIGFuZCBgYGYyKClgYCByZXR1cm5zIGBgMS4wYGAgKGBgaW50YGApLCBldmVuIGlmIGBgMWBgIGFuZCBgYDEuMGBgCi0gIGFyZSBlcXVhbC4KKy0gSXNzdWUgIzI1NzkxOiBJZiBfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQgb3IgaWYgbmVpdGhlciBfX3BhY2thZ2VfXyBvcgorICBfX3NwZWNfXyBhcmUgZGVmaW5lZCB0aGVuIEltcG9ydFdhcm5pbmcgaXMgcmFpc2VkLgogCiAtIElzc3VlICMyMjk5NTogW1VQREFURV0gQ29tbWVudCBvdXQgdGhlIG9uZSBvZiB0aGUgcGlja2xlYWJpbGl0eSB0ZXN0cyBpbgogICBfUHlPYmplY3RfR2V0U3RhdGUoKSBkdWUgdG8gcmVncmVzc2lvbnMgb2JzZXJ2ZWQgaW4gQ3l0aG9uLWJhc2VkIHByb2plY3RzLgpAQCAtNDA4LDcgKzExNTQsMTAgQEAKIC0gSXNzdWUgIzI1NzA5OiBGaXhlZCBwcm9ibGVtIHdpdGggaW4tcGxhY2Ugc3RyaW5nIGNvbmNhdGVuYXRpb24gYW5kIHV0Zi04CiAgIGNhY2hlLgogCi0tIElzc3VlICMyNzE0NzogTWVudGlvbiBQRVAgNDIwIGluIHRoZSBpbXBvcnRsaWIgZG9jcy4KKy0gSXNzdWUgIzUzMTk6IE5ldyBQeV9GaW5hbGl6ZUV4KCkgQVBJIGFsbG93aW5nIFB5dGhvbiB0byBzZXQgYW4gZXhpdCBzdGF0dXMKKyAgb2YgMTIwIG9uIGZhaWx1cmUgdG8gZmx1c2ggYnVmZmVyZWQgc3RyZWFtcy4KKworLSBJc3N1ZSAjMjU0ODU6IHRlbG5ldGxpYi5UZWxuZXQgaXMgbm93IGEgY29udGV4dCBtYW5hZ2VyLgogCiAtIElzc3VlICMyNDA5NzogRml4ZWQgY3Jhc2ggaW4gb2JqZWN0Ll9fcmVkdWNlX18oKSBpZiBzbG90IG5hbWUgaXMgZnJlZWQgaW5zaWRlCiAgIF9fZ2V0YXR0cl9fLgpAQCAtNDE3LDYgKzExNjYsODggQEAKICAgX19ieXRlc19fLCBfX3RydW5jX18sIGFuZCBfX2Zsb2F0X18gcmV0dXJuaW5nIGluc3RhbmNlcyBvZiBzdWJjbGFzc2VzIG9mCiAgIGJ5dGVzLCBpbnQsIGFuZCBmbG9hdCB0byBzdWJjbGFzc2VzIG9mIGJ5dGVzLCBpbnQsIGFuZCBmbG9hdCBjb3JyZXNwb25kaW5nbHkuCiAKKy0gSXNzdWUgIzI1NjMwOiBGaXggYSBwb3NzaWJsZSBzZWdmYXVsdCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZyBpbiBmdW5jdGlvbnMKKyAgdGhhdCBhY2NlcHQgZmlsZXN5c3RlbSBwYXRocy4KKworLSBJc3N1ZSAjMjM1NjQ6IEZpeGVkIGEgcGFydGlhbGx5IGJyb2tlbiBzYW5pdHkgY2hlY2sgaW4gdGhlIF9wb3NpeHN1YnByb2Nlc3MKKyAgaW50ZXJuYWxzIHJlZ2FyZGluZyBob3cgZmRzX3RvX3Bhc3Mgd2VyZSBwYXNzZWQgdG8gdGhlIGNoaWxkLiAgVGhlIGJ1ZyBoYWQKKyAgbm8gYWN0dWFsIGltcGFjdCBhcyBzdWJwcm9jZXNzLnB5IGFscmVhZHkgYXZvaWRlZCBpdC4KKworLSBJc3N1ZSAjMjUzODg6IEZpeGVkIHRva2VuaXplciBjcmFzaCB3aGVuIHByb2Nlc3NpbmcgdW5kZWNvZGFibGUgc291cmNlIGNvZGUKKyAgd2l0aCBhIG51bGwgYnl0ZS4KKworLSBJc3N1ZSAjMjU0NjI6IFRoZSBoYXNoIG9mIHRoZSBrZXkgbm93IGlzIGNhbGN1bGF0ZWQgb25seSBvbmNlIGluIG1vc3QKKyAgb3BlcmF0aW9ucyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0LgorCistIElzc3VlICMyMjk5NTogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBfX3JlZHVjZV9fIGFuZCBfX3JlZHVjZV9leF9fIG5vdworICByZWplY3RzIGJ1aWx0aW4gdHlwZXMgd2l0aCBub3QgZGVmaW5lZCBfX25ld19fLgorCistIElzc3VlICMyNDgwMjogQXZvaWQgYnVmZmVyIG92ZXJyZWFkcyB3aGVuIGludCgpLCBmbG9hdCgpLCBjb21waWxlKCksIGV4ZWMoKQorICBhbmQgZXZhbCgpIGFyZSBwYXNzZWQgYnl0ZXMtbGlrZSBvYmplY3RzLiAgVGhlc2Ugb2JqZWN0cyBhcmUgbm90CisgIG5lY2Vzc2FyaWx5IHRlcm1pbmF0ZWQgYnkgYSBudWxsIGJ5dGUsIGJ1dCB0aGUgZnVuY3Rpb25zIGFzc3VtZWQgdGhleSB3ZXJlLgorCistIElzc3VlICMyNTU1NTogRml4IHBhcnNlciBhbmQgQVNUOiBmaWxsIGxpbmVubyBhbmQgY29sX29mZnNldCBvZiAiYXJnIiBub2RlCisgIHdoZW4gY29tcGlsaW5nIEFTVCBmcm9tIFB5dGhvbiBvYmplY3RzLgorCistIElzc3VlICMyNDcyNjogRml4ZWQgYSBjcmFzaCBhbmQgbGVha2luZyBOVUxMIGluIHJlcHIoKSBvZiBPcmRlcmVkRGljdCB0aGF0CisgIHdhcyBtdXRhdGVkIGJ5IGRpcmVjdCBjYWxscyBvZiBkaWN0IG1ldGhvZHMuCisKKy0gSXNzdWUgIzI1NDQ5OiBJdGVyYXRpbmcgT3JkZXJlZERpY3Qgd2l0aCBrZXlzIHdpdGggdW5zdGFibGUgaGFzaCBub3cgcmFpc2VzCisgIEtleUVycm9yIGluIEMgaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgaW4gUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCistIElzc3VlICMyNTM5NTogRml4ZWQgY3Jhc2ggd2hlbiBoaWdobHkgbmVzdGVkIE9yZGVyZWREaWN0IHN0cnVjdHVyZXMgd2VyZQorICBnYXJiYWdlIGNvbGxlY3RlZC4KKworLSBJc3N1ZSAjMjU0MDE6IE9wdGltaXplIGJ5dGVzLmZyb21oZXgoKSBhbmQgYnl0ZWFycmF5LmZyb21oZXgoKTogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLgorCistIElzc3VlICMyNTM5OTogT3B0aW1pemUgYnl0ZWFycmF5ICUgYXJncyB1c2luZyB0aGUgbmV3IHByaXZhdGUgX1B5Qnl0ZXNXcml0ZXIKKyAgQVBJLiBGb3JtYXR0aW5nIGlzIG5vdyBiZXR3ZWVuIDIuNSBhbmQgNSB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1Mjc0OiBzeXMuc2V0cmVjdXJzaW9ubGltaXQoKSBub3cgcmFpc2VzIGEgUmVjdXJzaW9uRXJyb3IgaWYgdGhlIG5ldworICByZWN1cnNpb24gbGltaXQgaXMgdG9vIGxvdyBkZXBlbmRpbmcgYXQgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLiBNb2RpZnkKKyAgYWxzbyB0aGUgImxvd2VyLXdhdGVyIG1hcmsiIGZvcm11bGEgdG8gbWFrZSBpdCBtb25vdG9uaWMuIFRoaXMgbWFyayBpcyB1c2VkCisgIHRvIGRlY2lkZSB3aGVuIHRoZSBvdmVyZmxvd2VkIGZsYWcgb2YgdGhlIHRocmVhZCBzdGF0ZSBpcyByZXNldC4KKworLSBJc3N1ZSAjMjQ0MDI6IEZpeCBpbnB1dCgpIHRvIHByb21wdCB0byB0aGUgcmVkaXJlY3RlZCBzdGRvdXQgd2hlbgorICBzeXMuc3Rkb3V0LmZpbGVubygpIGZhaWxzLgorCistIElzc3VlICMyNTM0OTogT3B0aW1pemUgYnl0ZXMgJSBhcmdzIHVzaW5nIHRoZSBuZXcgcHJpdmF0ZSBfUHlCeXRlc1dyaXRlciBBUEkuCisgIEZvcm1hdHRpbmcgaXMgbm93IHVwIHRvIDIgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNDgwNjogUHJldmVudCBidWlsdGluIHR5cGVzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIHN1YmNsYXNzZWQgZnJvbQorICBiZWluZyBzdWJjbGFzc2VkIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuCisKKy0gSXNzdWUgIzI1MzAxOiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IKKyAgaGFuZGxlcnM6IGBgaWdub3JlYGAsIGBgcmVwbGFjZWBgIGFuZCBgYHN1cnJvZ2F0ZWVzY2FwZWBgLgorCistIElzc3VlICMyNDg0ODogRml4ZWQgYSBudW1iZXIgb2YgYnVncyBpbiBVVEYtNyBkZWNvZGluZyBvZiBtaXNmb3JtZWQgZGF0YS4KKworLSBJc3N1ZSAjMjUyNjc6IFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvcgorICBoYW5kbGVyczogYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAsIGBgc3Vycm9nYXRlZXNjYXBlYGAsIGBgc3Vycm9nYXRlcGFzc2BgLgorICBQYXRjaCBjby13cml0dGVuIHdpdGggU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjUyODA6IEltcG9ydCB0cmFjZSBtZXNzYWdlcyBlbWl0dGVkIGluIHZlcmJvc2UgKC12KSBtb2RlIGFyZSBubworICBsb25nZXIgZm9ybWF0dGVkIHR3aWNlLgorCistIElzc3VlICMyNTIyNzogT3B0aW1pemUgQVNDSUkgYW5kIGxhdGluMSBlbmNvZGVycyB3aXRoIHRoZSBgYHN1cnJvZ2F0ZWVzY2FwZWBgCisgIGVycm9yIGhhbmRsZXI6IHRoZSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdC4gSW5pdGlhbCBwYXRjaAorICB3cml0dGVuIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzI1MDAzOiBPbiBTb2xhcmlzIDExLjMgb3IgbmV3ZXIsIG9zLnVyYW5kb20oKSBub3cgdXNlcyB0aGUKKyAgZ2V0cmFuZG9tKCkgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZ2V0ZW50cm9weSgpIGZ1bmN0aW9uLiBUaGUgZ2V0ZW50cm9weSgpCisgIGZ1bmN0aW9uIGlzIGJsb2NraW5nIHRvIGdlbmVyYXRlIHZlcnkgZ29vZCBxdWFsaXR5IGVudHJvcHksIG9zLnVyYW5kb20oKQorICBkb2Vzbid0IG5lZWQgc3VjaCBoaWdoLXF1YWxpdHkgZW50cm9weS4KKworLSBJc3N1ZSAjOTIzMjogTW9kaWZ5IFB5dGhvbidzIGdyYW1tYXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWFzIGluIHRoZQorICBhcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uICBGb3IgZXhhbXBsZSwgImRlZiBmKFwqLCBhID0KKyAgMywpOiBwYXNzIiBpcyBub3cgbGVnYWwuIFBhdGNoIGZyb20gTWFyayBEaWNraW5zb24uCisKKy0gSXNzdWUgIzI0OTY1OiBJbXBsZW1lbnQgUEVQIDQ5OCAiTGl0ZXJhbCBTdHJpbmcgSW50ZXJwb2xhdGlvbiIuIFRoaXMKKyAgYWxsb3dzIHlvdSB0byBlbWJlZCBleHByZXNzaW9ucyBpbnNpZGUgZi1zdHJpbmdzLCB3aGljaCBhcmUKKyAgY29udmVydGVkIHRvIG5vcm1hbCBzdHJpbmdzIGF0IHJ1biB0aW1lLiBHaXZlbiB4PTMsIHRoZW4KKyAgZid2YWx1ZT17eH0nID09ICd2YWx1ZT0zJy4gUGF0Y2ggYnkgRXJpYyBWLiBTbWl0aC4KKwogLSBJc3N1ZSAjMjY0Nzg6IEZpeCBzZW1hbnRpYyBidWdzIHdoZW4gdXNpbmcgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIGRpY3Rpb25hcnkKICAgdmlld3MgYW5kIHR1cGxlcy4KIApAQCAtNDI1LDc5ICsxMjU2LDI3IEBACiAKIC0gSXNzdWUgIzI1NjYwOiBGaXggVEFCIGtleSBiZWhhdmlvdXIgaW4gUkVQTCB3aXRoIHJlYWRsaW5lLgogCistIElzc3VlICMyNjI4ODogT3B0aW1pemUgUHlMb25nX0FzRG91YmxlLgorCistIElzc3VlcyAjMjYyODkgYW5kICMyNjMxNTogT3B0aW1pemUgZmxvb3IgYW5kIG1vZHVsbyBkaXZpc2lvbiBmb3IKKyAgc2luZ2xlLWRpZ2l0IGxvbmdzLiAgTWljcm9iZW5jaG1hcmtzIHNob3cgMi0yLjV4IGltcHJvdmVtZW50LiAgQnVpbHQtaW4KKyAgJ2Rpdm1vZCcgZnVuY3Rpb24gaXMgbm93IGFsc28gfjEwJSBmYXN0ZXIuCisKIC0gSXNzdWUgIzI1ODg3OiBSYWlzZSBhIFJ1bnRpbWVFcnJvciB3aGVuIGEgY29yb3V0aW5lIG9iamVjdCBpcyBhd2FpdGVkCiAgIG1vcmUgdGhhbiBvbmNlLgogCi0tIElzc3VlICMyNzI0MzogVXBkYXRlIHRoZSBfX2FpdGVyX18gcHJvdG9jb2w6IGluc3RlYWQgb2YgcmV0dXJuaW5nCi0gIGFuIGF3YWl0YWJsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvciwgdGhlIGFzeW5jaHJvbm91cwotICBpdGVyYXRvciBzaG91bGQgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBEb2luZyB0aGUgZm9ybWVyIHdpbGwgdHJpZ2dlciBhCi0gIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcuCi0KLQogTGlicmFyeQogLS0tLS0tLQogCi0tIFtTZWN1cml0eV0gSXNzdWUgIzI2NTU2OiBVcGRhdGUgZXhwYXQgdG8gMi4xLjEsIGZpeGVzIENWRS0yMDE1LTEyODMuCi0KLS0gW1NlY3VyaXR5XSBGaXggVExTIHN0cmlwcGluZyB2dWxuZXJhYmlsaXR5IGluIHNtdHBsaWIsIENWRS0yMDE2LTA3NzIuCi0gIFJlcG9ydGVkIGJ5IFRlYW0gT3N0c3Ryb20KLQotLSBJc3N1ZSAjMjEzODY6IEltcGxlbWVudCBtaXNzaW5nIElQdjRBZGRyZXNzLmlzX2dsb2JhbCBwcm9wZXJ0eS4gIEl0IHdhcwotICBkb2N1bWVudGVkIHNpbmNlIDA3YTU2MTBiYWU5ZC4gIEluaXRpYWwgcGF0Y2ggYnkgUm9nZXIgTHVldGhpLgotCi0tIElzc3VlICMyMDkwMDogZGlzdHV0aWxzIHJlZ2lzdGVyIGNvbW1hbmQgbm93IGRlY29kZXMgSFRUUCByZXNwb25zZXMKLSAgY29ycmVjdGx5LiAgSW5pdGlhbCBwYXRjaCBieSBpbmdyaWQuCi0KLS0gQSBuZXcgdmVyc2lvbiBvZiB0eXBpbmcucHkgcHJvdmlkZXMgc2V2ZXJhbCBuZXcgY2xhc3NlcyBhbmQKLSAgZmVhdHVyZXM6IEBvdmVybG9hZCBvdXRzaWRlIHN0dWJzLCBSZXZlcnNpYmxlLCBEZWZhdWx0RGljdCwgVGV4dCwKLSAgQ29udGV4dE1hbmFnZXIsIFR5cGVbXSwgTmV3VHlwZSgpLCBUWVBFX0NIRUNLSU5HLCBhbmQgbnVtZXJvdXMgYnVnCi0gIGZpeGVzIChub3RlIHRoYXQgc29tZSBvZiB0aGUgbmV3IGZlYXR1cmVzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkIGluCi0gIG15cHkgb3Igb3RoZXIgc3RhdGljIGFuYWx5emVycykuICBBbHNvIGNsYXNzZXMgZm9yIFBFUCA0OTIKLSAgKEF3YWl0YWJsZSwgQXN5bmNJdGVyYWJsZSwgQXN5bmNJdGVyYXRvcikgaGF2ZSBiZWVuIGFkZGVkIChpbiBmYWN0Ci0gIHRoZXkgbWFkZSBpdCBpbnRvIDMuNS4xIGJ1dCB3ZXJlIG5ldmVyIG1lbnRpb25lZCkuCi0KLS0gSXNzdWUgIzI1NzM4OiBTdG9wIGh0dHAuc2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIuc2VuZF9lcnJvcigpIGZyb20KLSAgc2VuZGluZyBhIG1lc3NhZ2UgYm9keSBmb3IgMjA1IFJlc2V0IENvbnRlbnQuICBBbHNvLCBkb24ndCBzZW5kIENvbnRlbnQKLSAgaGVhZGVyIGZpZWxkcyBpbiByZXNwb25zZXMgdGhhdCBkb24ndCBoYXZlIGEgYm9keS4gIFBhdGNoIGJ5IFN1c3VtdQotICBLb3NoaWJhLgotCi0tIElzc3VlICMyMTMxMzogRml4IHRoZSAicGxhdGZvcm0iIG1vZHVsZSB0byB0b2xlcmF0ZSB3aGVuIHN5cy52ZXJzaW9uCi0gIGNvbnRhaW5zIHRydW5jYXRlZCBidWlsZCBpbmZvcm1hdGlvbi4KLQotLSBbU2VjdXJpdHldIElzc3VlICMyNjgzOTogT24gTGludXgsIDpmdW5jOmBvcy51cmFuZG9tYCBub3cgY2FsbHMKLSAgYGBnZXRyYW5kb20oKWBgIHdpdGggYGBHUk5EX05PTkJMT0NLYGAgdG8gZmFsbCBiYWNrIG9uIHJlYWRpbmcKLSAgYGAvZGV2L3VyYW5kb21gYCBpZiB0aGUgdXJhbmRvbSBlbnRyb3B5IHBvb2wgaXMgbm90IGluaXRpYWxpemVkIHlldC4gUGF0Y2gKLSAgd3JpdHRlbiBieSBDb2xtIEJ1Y2tsZXkuCi0KLS0gSXNzdWUgIzI3MTY0OiBJbiB0aGUgemxpYiBtb2R1bGUsIGFsbG93IGRlY29tcHJlc3NpbmcgcmF3IERlZmxhdGUgc3RyZWFtcwotICB3aXRoIGEgcHJlZGVmaW5lZCB6ZGljdC4gIEJhc2VkIG9uIHBhdGNoIGJ5IFhpYW5nIFpoYW5nLgotCi0tIElzc3VlICMyNDI5MTogRml4IHdzZ2lyZWYuc2ltcGxlX3NlcnZlci5XU0dJUmVxdWVzdEhhbmRsZXIgdG8gY29tcGxldGVseQotICB3cml0ZSBkYXRhIHRvIHRoZSBjbGllbnQuICBQcmV2aW91c2x5IGl0IGNvdWxkIGRvIHBhcnRpYWwgd3JpdGVzIGFuZAotICB0cnVuY2F0ZSBkYXRhLiAgQWxzbywgd3NnaXJlZi5oYW5kbGVyLlNlcnZlckhhbmRsZXIgY2FuIG5vdyBoYW5kbGUgc3Rkb3V0Ci0gIGRvaW5nIHBhcnRpYWwgd3JpdGVzLCBidXQgdGhpcyBpcyBkZXByZWNhdGVkLgotCi0tIElzc3VlICMyNjgwOTogQWRkIGBgX19hbGxfX2BgIHRvIDptb2Q6YHN0cmluZ2AuICBQYXRjaCBieSBFbWFudWVsIEJhcnJ5LgotCi0tIElzc3VlICMyNjM3Mzogc3VicHJvY2Vzcy5Qb3Blbi5jb21tdW5pY2F0ZSBub3cgY29ycmVjdGx5IGlnbm9yZXMKLSAgQnJva2VuUGlwZUVycm9yIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZGllcyBiZWZvcmUgLmNvbW11bmljYXRlKCkKLSAgaXMgY2FsbGVkIGluIG1vcmUvYWxsIGNpcmN1bXN0YW5jZXMuCi0KLS0gSXNzdWUgIzIxNzc2OiBkaXN0dXRpbHMudXBsb2FkIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBIVFRQRXJyb3IuCi0gIEluaXRpYWwgcGF0Y2ggYnkgQ2xhdWRpdSBQb3BhLgotCi0tIElzc3VlICMyNzExNDogRml4IFNTTENvbnRleHQuX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyB3aXRoCi0gIFBlcm1pc3Npb25FcnJvcgotCi0tIElzc3VlICMxODM4MzogQXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIGZpbHRlcnMgd2hlbiB1c2luZyBmaWx0ZXJ3YXJuaW5ncwotICBhbmQgc2ltcGxlZmlsdGVyLiAgQmFzZWQgb24gcGF0Y2ggYnkgQWxleCBTaGtvcC4KLQogLSBJc3N1ZSAjMjcwNTc6IEZpeCBvcy5zZXRfaW5oZXJpdGFibGUoKSBvbiBBbmRyb2lkLCBpb2N0bCgpIGlzIGJsb2NrZWQgYnkKICAgU0VMaW51eCBhbmQgZmFpbHMgd2l0aCBFQUNDRVNTLiBUaGUgZnVuY3Rpb24gbm93IGZhbGxzIGJhY2sgdG8gZmNudGwoKS4KICAgUGF0Y2ggd3JpdHRlbiBieSBNaWNoYcWCIEJlZG5hcnNraS4KIAogLSBJc3N1ZSAjMjcwMTQ6IEZpeCBpbmZpbml0ZSByZWN1cnNpb24gdXNpbmcgdHlwaW5nLnB5LiAgVGhhbmtzIHRvIEthbGxlIFR1dXJlIQogCistIElzc3VlICMyNzAzMTogUmVtb3ZlZCBkdW1teSBtZXRob2RzIGluIFRraW50ZXIgd2lkZ2V0IGNsYXNzZXM6IHRrX21lbnVCYXIoKQorICBhbmQgdGtfYmluZEZvclRyYXZlcnNhbCgpLgorCiAtIElzc3VlICMxNDEzMjogRml4IHVybGxpYi5yZXF1ZXN0IHJlZGlyZWN0IGhhbmRsaW5nIHdoZW4gdGhlIHRhcmdldCBvbmx5IGhhcwogICBhIHF1ZXJ5IHN0cmluZy4gIE9yaWdpbmFsIGZpeCBieSBKw6FuIEphbmVjaC4KIApAQCAtNTA3LDYgKzEyODYsMTggQEAKICAgdG8gYmUgQVNDSUktZW5jb2RhYmxlLCBvdGhlcndpc2UgYSBVbmljb2RlRW5jb2RlRXJyb3IgaXMgcmFpc2VkLiAgQmFzZWQgb24KICAgcGF0Y2ggYnkgQ2hyaXN0aWFuIEhlaW1lcy4KIAorLSBJc3N1ZSAjMjcwMzM6IFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBkZWNvZGVfZGF0YSBwYXJhbWV0ZXIgZm9yCisgIHNtdHBkLlNNVFBDaGFubmVsIGFuZCBzbXRwZC5TTVRQU2VydmVyIGNvbnN0cnVjdG9ycyBpcyBjaGFuZ2VkIHRvIEZhbHNlLgorCistIElzc3VlICMyNzAzNDogUmVtb3ZlZCBkZXByZWNhdGVkIGNsYXNzIGFzeW5jaGF0LmZpZm8uCisKKy0gSXNzdWUgIzI2ODcwOiBBZGRlZCByZWFkbGluZS5zZXRfYXV0b19oaXN0b3J5KCksIHdoaWNoIGNhbiBzdG9wIGVudHJpZXMKKyAgYmVpbmcgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LiAgQmFzZWQgb24gcGF0Y2ggYnkgVHlsZXIKKyAgQ3JvbXB0b24uCisKKy0gSXNzdWUgIzI2MDM5OiB6aXBmaWxlLlppcEZpbGUub3BlbigpIGNhbiBub3cgYmUgdXNlZCB0byB3cml0ZSBkYXRhIGludG8gYSBaSVAKKyAgZmlsZSwgYXMgd2VsbCBhcyBmb3IgZXh0cmFjdGluZyBkYXRhLiAgUGF0Y2ggYnkgVGhvbWFzIEtsdXl2ZXIuCisKIC0gSXNzdWUgIzI2ODkyOiBIb25vciBkZWJ1Z2xldmVsIGZsYWcgaW4gdXJsbGliLnJlcXVlc3QuSFRUUEhhbmRsZXIuIFBhdGNoCiAgIGNvbnRyaWJ1dGVkIGJ5IENoaSBIc3VhbiBZZW4uCiAKQEAgLTUyMSw2ICsxMzEyLDE0IEBACiAtIElzc3VlICMyNjk3NzogUmVtb3ZlZCB1bm5lY2Vzc2FyeSwgYW5kIGlnbm9yZWQsIGNhbGwgdG8gc3VtIG9mIHNxdWFyZXMgaGVscGVyCiAgIGluIHN0YXRpc3RpY3MucHZhcmlhbmNlLgogCistIElzc3VlICMyNjAwMjogVXNlIGJpc2VjdCBpbiBzdGF0aXN0aWNzLm1lZGlhbiBpbnN0ZWFkIG9mIGEgbGluZWFyIHNlYXJjaC4KKyAgUGF0Y2ggYnkgVXBlbmRyYSBLdW1hLgorCistIElzc3VlICMyNTk3NDogTWFrZSB1c2Ugb2YgbmV3IERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpIG1ldGhvZCBpbiBzdGF0aXN0aWNzCisgIG1vZHVsZS4gUGF0Y2ggYnkgU3RlZmFuIEtyYWguCisKKy0gSXNzdWUgIzI2OTk2OiBBZGQgc2VjcmV0cyBtb2R1bGUgYXMgZGVzY3JpYmVkIGluIFBFUCA1MDYuCisKIC0gSXNzdWUgIzI2ODgxOiBUaGUgbW9kdWxlZmluZGVyIG1vZHVsZSBub3cgc3VwcG9ydHMgZXh0ZW5kZWQgb3Bjb2RlIGFyZ3VtZW50cy4KIAogLSBJc3N1ZSAjMjM4MTU6IEZpeGVkIGNyYXNoZXMgcmVsYXRlZCB0byBkaXJlY3RseSBjcmVhdGVkIGluc3RhbmNlcyBvZiB0eXBlcyBpbgpAQCAtNTMyLDYgKzEzMzEsMTEgQEAKIC0gSXNzdWUgIzI2ODczOiB4bWxycGMgbm93IHJhaXNlcyBSZXNwb25zZUVycm9yIG9uIHVuc3VwcG9ydGVkIHR5cGUgdGFncwogICBpbnN0ZWFkIG9mIHNpbGVudGx5IHJldHVybiBpbmNvcnJlY3QgcmVzdWx0LgogCistIElzc3VlICMyNjkxNTogIFRoZSBfX2NvbnRhaW5zX18gbWV0aG9kcyBpbiB0aGUgY29sbGVjdGlvbnMgQUJDcyBub3cgY2hlY2sKKyAgZm9yIGlkZW50aXR5IGJlZm9yZSBjaGVja2luZyBlcXVhbGl0eS4gIFRoaXMgYmV0dGVyIG1hdGNoZXMgdGhlIGJlaGF2aW9yCisgIG9mIHRoZSBjb25jcmV0ZSBjbGFzc2VzLCBhbGxvd3Mgc2Vuc2libGUgaGFuZGxpbmcgb2YgTmFOcywgYW5kIG1ha2VzIGl0CisgIGVhc2llciB0byByZWFzb24gYWJvdXQgY29udGFpbmVyIGludmFyaWFudHMuCisKIC0gSXNzdWUgIzI2NzExOiBGaXhlZCB0aGUgY29tcGFyaXNvbiBvZiBwbGlzdGxpYi5EYXRhIHdpdGggb3RoZXIgdHlwZXMuCiAKIC0gSXNzdWUgIzI0MTE0OiBGaXggYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBpbiBgY3R5cGVzLnV0aWxgLgpAQCAtNTQ1LDYgKzEzNDksMTIgQEAKICAgbmFtZXMgdGhhdCBoYXBwZW4gdG8gaGF2ZSBhIGJ5cGFzc2VkIGhvc3RuYW1lIGFzIGEgc3VmZml4LiAgUGF0Y2ggYnkgWGlhbmcKICAgWmhhbmcuCiAKKy0gSXNzdWUgIzI0OTAyOiBQcmludCBzZXJ2ZXIgVVJMIG9uIGh0dHAuc2VydmVyIHN0YXJ0dXAuICBJbml0aWFsIHBhdGNoIGJ5CisgIEZlbGl4IEthaXNlci4KKworLSBJc3N1ZSAjMjU3ODg6IGZpbGVpbnB1dC5ob29rX2VuY29kZWQoKSBub3cgc3VwcG9ydHMgYW4gImVycm9ycyIgYXJndW1lbnQKKyAgZm9yIHBhc3NpbmcgdG8gb3Blbi4gIE9yaWdpbmFsIHBhdGNoIGJ5IEpvc2VwaCBIYWNrbWFuLgorCiAtIElzc3VlICMyNjYzNDogcmVjdXJzaXZlX3JlcHIoKSBub3cgc2V0cyBfX3F1YWxuYW1lX18gb2Ygd3JhcHBlci4gIFBhdGNoIGJ5CiAgIFhpYW5nIFpoYW5nLgogCkBAIC01ODAsMjYgKzEzOTAsNTQgQEAKIC0gSXNzdWUgIzI2NzE3OiBTdG9wIGVuY29kaW5nIExhdGluLTEtaXplZCBXU0dJIHBhdGhzIHdpdGggVVRGLTguICBQYXRjaCBieQogICBBbnRob255IFNvdHRpbGUuCiAKKy0gSXNzdWUgIzI2NzgyOiBBZGQgU1RBUlRVUElORk8gdG8gc3VicHJvY2Vzcy5fX2FsbF9fIG9uIFdpbmRvd3MuCisKKy0gSXNzdWUgIzI2NDA0OiBBZGQgY29udGV4dCBtYW5hZ2VyIHRvIHNvY2tldHNlcnZlci4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NzM1OiBGaXggOmZ1bmM6YG9zLnVyYW5kb21gIG9uIFNvbGFyaXMgMTEuMyBhbmQgbmV3ZXIgd2hlbiByZWFkaW5nCiAgIG1vcmUgdGhhbiAxLDAyNCBieXRlczogY2FsbCBgYGdldHJhbmRvbSgpYGAgbXVsdGlwbGUgdGltZXMgd2l0aCBhIGxpbWl0IG9mCiAgIDEwMjQgYnl0ZXMgcGVyIGNhbGwuCiAKKy0gSXNzdWUgIzI2NTg1OiBFbGltaW5hdGUgaHR0cC5zZXJ2ZXIuX3F1b3RlX2h0bWwoKSBhbmQgdXNlCisgIGh0bWwuZXNjYXBlKHF1b3RlPUZhbHNlKS4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNjY4NTogUmFpc2UgT1NFcnJvciBpZiBjbG9zaW5nIGEgc29ja2V0IGZhaWxzLgorCiAtIElzc3VlICMxNjMyOTogQWRkIC53ZWJtIHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHaWFtcGFvbG8gUm9kb2xhJy4KIAogLSBJc3N1ZSAjMTM5NTI6IEFkZCAuY3N2IHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHZW9mZiBXaWxzb24uCiAKKy0gSXNzdWUgIzI2NTg3OiB0aGUgc2l0ZSBtb2R1bGUgbm93IGFsbG93cyAucHRoIGZpbGVzIHRvIHNwZWNpZnkgZmlsZXMgdG8gYmUKKyAgYWRkZWQgdG8gc3lzLnBhdGggKGUuZy4gemlwIGZpbGVzKS4KKworLSBJc3N1ZSAjMjU2MDk6IEludHJvZHVjZSBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXIgYW5kCisgIHR5cGluZy5Db250ZXh0TWFuYWdlci4KKwogLSBJc3N1ZSAjMjY3MDk6IEZpeGVkIFkyMDM4IHByb2JsZW0gaW4gbG9hZGluZyBiaW5hcnkgUExpc3RzLgogCiAtIElzc3VlICMyMzczNTogSGFuZGxlIHRlcm1pbmFsIHJlc2l6aW5nIHdpdGggUmVhZGxpbmUgNi4zKyBieSBpbnN0YWxsaW5nIG91cgogICBvd24gU0lHV0lOQ0ggaGFuZGxlci4gIFBhdGNoIGJ5IEVyaWMgUHJpY2UuCiAKKy0gSXNzdWUgIzI1OTUxOiBDaGFuZ2UgU1NMU29ja2V0LnNlbmRhbGwoKSB0byByZXR1cm4gTm9uZSwgYXMgZXhwbGljaXRseQorICBkb2N1bWVudGVkIGZvciBwbGFpbiBzb2NrZXQgb2JqZWN0cy4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NTg2OiBJbiBodHRwLnNlcnZlciwgcmVzcG9uZCB3aXRoICI0MTMgUmVxdWVzdCBoZWFkZXIgZmllbGRzIHRvbwogICBsYXJnZSIgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGhlYWRlciBmaWVsZHMgdG8gcGFyc2UsIHJhdGhlciB0aGFuIGtpbGxpbmcKICAgdGhlIGNvbm5lY3Rpb24gYW5kIHJhaXNpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgogCistIElzc3VlICMyNjY3NjogQWRkZWQgbWlzc2luZyBYTUxQdWxsUGFyc2VyIHRvIEVsZW1lbnRUcmVlLl9fYWxsX18uCisKIC0gSXNzdWUgIzIyODU0OiBDaGFuZ2UgQnVmZmVyZWRSZWFkZXIud3JpdGFibGUoKSBhbmQKICAgQnVmZmVyZWRXcml0ZXIucmVhZGFibGUoKSB0byBhbHdheXMgcmV0dXJuIEZhbHNlLgogCistIElzc3VlICMyNjQ5MjogRXhoYXVzdGVkIGl0ZXJhdG9yIG9mIGFycmF5LmFycmF5IG5vdyBjb25mb3JtcyB3aXRoIHRoZSBiZWhhdmlvcgorICBvZiBpdGVyYXRvcnMgb2Ygb3RoZXIgbXV0YWJsZSBzZXF1ZW5jZXM6IGl0IGxlZnRzIGV4aGF1c3RlZCBldmVuIGlmIGl0ZXJhdGVkCisgIGFycmF5IGlzIGV4dGVuZGVkLgorCistIElzc3VlICMyNjY0MTogZG9jdGVzdC5Eb2NGaWxlVGVzdCBhbmQgZG9jdGVzdC50ZXN0ZmlsZSgpIG5vdyBzdXBwb3J0CisgIHBhY2thZ2VzIChtb2R1bGUgc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBkaXJlY3RvcmllcykgZm9yIHRoZSBwYWNrYWdlCisgIHBhcmFtZXRlci4KKwogLSBJc3N1ZSAjMjUxOTU6IEZpeCBhIHJlZ3Jlc3Npb24gaW4gbW9jay5NYWdpY01vY2suIF9DYWxsIGlzIGEgc3ViY2xhc3Mgb2YKICAgdHVwbGUgKGNoYW5nZXNldCAzNjAzYmFlNjNjMTMgb25seSB3b3JrcyBmb3IgY2xhc3Nlcykgc28gd2UgbmVlZCB0bwogICBpbXBsZW1lbnQgX19uZV9fIG91cnNlbHZlcy4gIFBhdGNoIGJ5IEFuZHJldyBQbHVtbWVyLgpAQCAtNjEyLDE2ICsxNDUwLDQ1IEBACiAKIC0gSXNzdWUgIzI2NjE2OiBGaXhlZCBhIGJ1ZyBpbiBkYXRldGltZS5hc3RpbWV6b25lKCkgbWV0aG9kLgogCi0tIElzc3VlICMyMTkyNTogOmZ1bmM6YHdhcm5pbmdzLmZvcm1hdHdhcm5pbmdgIG5vdyBjYXRjaGVzIGV4Y2VwdGlvbnMgb24KLSAgYGBsaW5lY2FjaGUuZ2V0bGluZSguLi4pYGAgdG8gYmUgYWJsZSB0byBsb2cgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBlbWl0dGVkCi0gIGxhdGUgZHVyaW5nIHRoZSBQeXRob24gc2h1dGRvd24gcHJvY2Vzcy4KKy0gSXNzdWUgIzI2NjM3OiBUaGUgOm1vZDpgaW1wb3J0bGliYCBtb2R1bGUgbm93IGVtaXRzIGFuIDpleGM6YEltcG9ydEVycm9yYAorICByYXRoZXIgdGhhbiBhIDpleGM6YFR5cGVFcnJvcmAgaWYgOmZ1bmM6YF9faW1wb3J0X19gIGlzIHRyaWVkIGR1cmluZyB0aGUKKyAgUHl0aG9uIHNodXRkb3duIHByb2Nlc3MgYnV0IDpkYXRhOmBzeXMucGF0aGAgaXMgYWxyZWFkeSBjbGVhcmVkIChzZXQgdG8KKyAgYGBOb25lYGApLgorCistIElzc3VlICMyMTkyNTogOmZ1bmM6YHdhcm5pbmdzLmZvcm1hdHdhcm5pbmdgIG5vdyBjYXRjaGVzIGV4Y2VwdGlvbnMgd2hlbgorICBjYWxsaW5nIDpmdW5jOmBsaW5lY2FjaGUuZ2V0bGluZWAgYW5kCisgIDpmdW5jOmB0cmFjZW1hbGxvYy5nZXRfb2JqZWN0X3RyYWNlYmFja2AgdG8gYmUgYWJsZSB0byBsb2cKKyAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBlbWl0dGVkIGxhdGUgZHVyaW5nIHRoZSBQeXRob24gc2h1dGRvd24gcHJvY2Vzcy4KKworLSBJc3N1ZSAjMjM4NDg6IE9uIFdpbmRvd3MsIGZhdWx0aGFuZGxlci5lbmFibGUoKSBub3cgYWxzbyBpbnN0YWxscyBhbgorICBleGNlcHRpb24gaGFuZGxlciB0byBkdW1wIHRoZSB0cmFjZWJhY2sgb2YgYWxsIFB5dGhvbiB0aHJlYWRzIG9uIGFueSBXaW5kb3dzCisgIGV4Y2VwdGlvbiwgbm90IG9ubHkgb24gVU5JWCBzaWduYWxzIChTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQpLgorCistIElzc3VlICMyNjUzMDogQWRkIEMgZnVuY3Rpb25zIDpjOmZ1bmM6YF9QeVRyYWNlTWFsbG9jX1RyYWNrYCBhbmQKKyAgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfVW50cmFja2AgdG8gdHJhY2sgbWVtb3J5IGJsb2NrcyB1c2luZyB0aGUKKyAgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZS4gQWRkIDpjOmZ1bmM6YF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFja2AgdG8gZ2V0CisgIHRoZSB0cmFjZWJhY2sgb2YgYW4gb2JqZWN0LgorCistIElzc3VlICMyNjU4ODogVGhlIF90cmFjZW1hbGxvYyBub3cgc3VwcG9ydHMgdHJhY2luZyBtZW1vcnkgYWxsb2NhdGlvbnMgb2YKKyAgbXVsdGlwbGUgYWRkcmVzcyBzcGFjZXMgKGRvbWFpbnMpLgogCiAtIElzc3VlICMyNDI2NjogQ3RybCtDIGR1cmluZyBSZWFkbGluZSBoaXN0b3J5IHNlYXJjaCBub3cgY2FuY2VscyB0aGUgc2VhcmNoCiAgIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFJlYWRsaW5lIDcuCiAKKy0gSXNzdWUgIzI2NTkwOiBJbXBsZW1lbnQgYSBzYWZlIGZpbmFsaXplciBmb3IgdGhlIF9zb2NrZXQuc29ja2V0IHR5cGUuIEl0IG5vdworICByZWxlYXNlcyB0aGUgR0lMIHRvIGNsb3NlIHRoZSBzb2NrZXQuCisKKy0gSXNzdWUgIzE4Nzg3OiBzcHdkLmdldHNwbmFtKCkgbm93IHJhaXNlcyBhIFBlcm1pc3Npb25FcnJvciBpZiB0aGUgdXNlcgorICBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KKwogLSBJc3N1ZSAjMjY1NjA6IEF2b2lkIHBvdGVudGlhbCBWYWx1ZUVycm9yIGluIEJhc2VIYW5kbGVyLnN0YXJ0X3Jlc3BvbnNlLgogICBJbml0aWFsIHBhdGNoIGJ5IFBldGVyIEluZ2xlc2J5LgogCistIElzc3VlICMyNjU2NzogQWRkIGEgbmV3IGZ1bmN0aW9uIDpjOmZ1bmM6YFB5RXJyX1Jlc291cmNlV2FybmluZ2AgZnVuY3Rpb24gdG8KKyAgcGFzcyB0aGUgZGVzdHJveWVkIG9iamVjdC4gQWRkIGEgKnNvdXJjZSogYXR0cmlidXRlIHRvCisgIDpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgLiBBZGQgd2FybmluZ3MuX3Nob3d3YXJubXNnKCkgd2hpY2ggdXNlcworICB0cmFjZW1hbGxvYyB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBzb3VyY2Ugb2JqZWN0IHdhcyBhbGxvY2F0ZWQuCisKIC0gW1NlY3VyaXR5XSBJc3N1ZSAjMjYzMTM6IHNzbC5weSBfbG9hZF93aW5kb3dzX3N0b3JlX2NlcnRzIGZhaWxzIGlmIHdpbmRvd3MKICAgY2VydCBzdG9yZSBpcyBlbXB0eS4gUGF0Y2ggYnkgQmFqaS4KIApAQCAtNjQzLDI0ICsxNTEwLDM5IEBACiAtIElzc3VlICMyMzcxODogRml4ZWQgcGFyc2luZyB0aW1lIGluIHdlZWsgMCBiZWZvcmUgSmFuIDEuICBPcmlnaW5hbCBwYXRjaCBieQogICBUYW3DoXMgQmVuY2UgR2VkYWkuCiAKKy0gSXNzdWUgIzI2MzIzOiBBZGQgTW9jay5hc3NlcnRfY2FsbGVkKCkgYW5kIE1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgbWV0aG9kcyB0byB1bml0dGVzdC5tb2NrLiBQYXRjaCB3cml0dGVuIGJ5IEFtaXQgU2FoYS4KKwogLSBJc3N1ZSAjMjA1ODk6IEludm9raW5nIFBhdGgub3duZXIoKSBhbmQgUGF0aC5ncm91cCgpIG9uIFdpbmRvd3Mgbm93IHJhaXNlCiAgIE5vdEltcGxlbWVudGVkRXJyb3IgaW5zdGVhZCBvZiBJbXBvcnRFcnJvci4KIAogLSBJc3N1ZSAjMjYxNzc6IEZpeGVkIHRoZSBrZXlzKCkgbWV0aG9kIGZvciBDYW52YXMgYW5kIFNjcm9sbGJhciB3aWRnZXRzLgogCi0tIElzc3VlICMxNTA2ODogR290IHJpZCBvZiBleGNlc3NpdmUgYnVmZmVyaW5nIGluIHRoZSBmaWxlaW5wdXQgbW9kdWxlLgotICBUaGUgYnVmc2l6ZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCistIElzc3VlICMxNTA2ODogR290IHJpZCBvZiBleGNlc3NpdmUgYnVmZmVyaW5nIGluIGZpbGVpbnB1dC4KKyAgVGhlIGJ1ZnNpemUgcGFyYW1ldGVyIGlzIG5vdyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLgorCistIElzc3VlICMxOTQ3NTogQWRkZWQgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGltZXNwZWMgdG8gdGhlIGRhdGV0aW1lCisgIGlzb2Zvcm1hdCgpIG1ldGhvZCB0byBjaG9vc2UgdGhlIHByZWNpc2lvbiBvZiB0aGUgdGltZSBjb21wb25lbnQuCiAKIC0gSXNzdWUgIzIyMDI6IEZpeCBVbmJvdW5kTG9jYWxFcnJvciBpbgogICBBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyLmdldF9hbGdvcml0aG1faW1wbHMuICBJbml0aWFsIHBhdGNoIGJ5IE1hdGhpZXUKICAgRHVwdXkuCiAKKy0gSXNzdWUgIzI2MTY3OiBNaW5pbWl6ZWQgb3ZlcmhlYWQgaW4gY29weS5jb3B5KCkgYW5kIGNvcHkuZGVlcGNvcHkoKS4KKyAgT3B0aW1pemVkIGNvcHlpbmcgYW5kIGRlZXBjb3B5aW5nIGJ5dGVhcnJheXMsIE5vdEltcGxlbWVudGVkLCBzbGljZXMsCisgIHNob3J0IGxpc3RzLCB0dXBsZXMsIGRpY3RzLCBzZXRzLgorCiAtIElzc3VlICMyNTcxODogRml4ZWQgcGlja2xpbmcgYW5kIGNvcHlpbmcgdGhlIGFjY3VtdWxhdGUoKSBpdGVyYXRvciB3aXRoCiAgIHRvdGFsIGlzIE5vbmUuCiAKIC0gSXNzdWUgIzI2NDc1OiBGaXhlZCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciByZWd1bGFyIGV4cHJlc3Npb25zIHdpdGggdGhlICg/eCkKICAgZmxhZy4KIAorLSBJc3N1ZSAjMjY0ODI6IEFsbG93ZWQgcGlja2xpbmcgcmVjdXJzaXZlIGRlcXVldWVzLgorCistIElzc3VlICMyNjMzNTogTWFrZSBtbWFwLndyaXRlKCkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBsaWtlCisgIG90aGVyIHdyaXRlIG1ldGhvZHMuICBQYXRjaCBieSBKYWt1YiBTdGFzaWFrLgorCiAtIElzc3VlICMyNjQ1NzogRml4ZWQgdGhlIHN1Ym5ldHMoKSBtZXRob2RzIGluIElQIG5ldHdvcmsgY2xhc3NlcyBmb3IgdGhlIGNhc2UKICAgd2hlbiByZXN1bHRpbmcgcHJlZml4IGxlbmd0aCBpcyBlcXVhbCB0byBtYXhpbWFsIHByZWZpeCBsZW5ndGguCiAgIEJhc2VkIG9uIHBhdGNoIGJ5IFhpYW5nIFpoYW5nLgpAQCAtNjc3LDcgKzE1NTksNyBAQAogCiAtIElzc3VlICMyNjE4NjogUmVtb3ZlIGFuIGludmFsaWQgdHlwZSBjaGVjayBpbiBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyLgogCi0tIElzc3VlICMyNjM2NzogaW1wb3J0bGliLl9faW1wb3J0X18oKSByYWlzZXMgU3lzdGVtRXJyb3IgbGlrZQorLSBJc3N1ZSAjMjYzNjc6IGltcG9ydGxpYi5fX2ltcG9ydF9fKCkgcmFpc2VzIEltcG9ydEVycm9yIGxpa2UKICAgYnVpbHRpbnMuX19pbXBvcnRfXygpIHdoZW4gYGBsZXZlbGBgIGlzIHNwZWNpZmllZCBidXQgd2l0aG91dCBhbiBhY2NvbXBhbnlpbmcKICAgcGFja2FnZSBzcGVjaWZpZWQuCiAKQEAgLTY4NSwxOSArMTU2NywzOSBAQAogICB0aGUgY29ubmVjdGVkIHNvY2tldCkgd2hlbiB2ZXJpZnlfcmVxdWVzdCgpIHJldHVybnMgZmFsc2UuICBQYXRjaCBieSBBdml2CiAgIFBhbGl2b2RhLgogCistIElzc3VlICMyMzQzMDogQ2hhbmdlIHRoZSBzb2NrZXRzZXJ2ZXIgbW9kdWxlIHRvIG9ubHkgY2F0Y2ggZXhjZXB0aW9ucworICByYWlzZWQgZnJvbSBhIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFyZSBkZXJpdmVkIGZyb20gRXhjZXB0aW9uIChpbnN0ZWFkIG9mCisgIEJhc2VFeGNlcHRpb24pLiAgVGhlcmVmb3JlIFN5c3RlbUV4aXQgYW5kIEtleWJvYXJkSW50ZXJydXB0IG5vIGxvbmdlcgorICB0cmlnZ2VyIHRoZSBoYW5kbGVfZXJyb3IoKSBtZXRob2QsIGFuZCB3aWxsIG5vdyB0byBzdG9wIGEgc2luZ2xlLXRocmVhZGVkCisgIHNlcnZlci4KKwogLSBbU2VjdXJpdHldIElzc3VlICMyNTkzOTogT24gV2luZG93cyBvcGVuIHRoZSBjZXJ0IHN0b3JlIHJlYWRvbmx5IGluCiAgIHNzbC5lbnVtX2NlcnRpZmljYXRlcy4KIAogLSBJc3N1ZSAjMjU5OTU6IG9zLndhbGsoKSBubyBsb25nZXIgdXNlcyBGRHMgcHJvcG9ydGlvbmFsIHRvIHRoZSB0cmVlIGRlcHRoLgogCistIElzc3VlICMyNTk5NDogQWRkZWQgdGhlIGNsb3NlKCkgbWV0aG9kIGFuZCB0aGUgc3VwcG9ydCBvZiB0aGUgY29udGV4dCBtYW5hZ2VyCisgIHByb3RvY29sIGZvciB0aGUgb3Muc2NhbmRpcigpIGl0ZXJhdG9yLgorCistIElzc3VlICMyMzk5MjogbXVsdGlwcm9jZXNzaW5nOiBtYWtlIE1hcFJlc3VsdCBub3QgZmFpbC1mYXN0IHVwb24gZXhjZXB0aW9uLgorCistIElzc3VlICMyNjI0MzogU3VwcG9ydCBrZXl3b3JkIGFyZ3VtZW50cyB0byB6bGliLmNvbXByZXNzKCkuICBQYXRjaCBieSBBdml2CisgIFBhbGl2b2RhLgorCiAtIElzc3VlICMyNjExNzogVGhlIG9zLnNjYW5kaXIoKSBpdGVyYXRvciBub3cgY2xvc2VzIGZpbGUgZGVzY3JpcHRvciBub3Qgb25seQogICB3aGVuIHRoZSBpdGVyYXRpb24gaXMgZmluaXNoZWQsIGJ1dCB3aGVuIGl0IHdhcyBmYWlsZWQgd2l0aCBlcnJvci4KIAorLSBJc3N1ZSAjMjU5NDk6IF9fZGljdF9fIGZvciBhbiBPcmRlcmVkRGljdCBpbnN0YW5jZSBpcyBub3cgY3JlYXRlZCBvbmx5IHdoZW4KKyAgbmVlZGVkLgorCiAtIElzc3VlICMyNTkxMTogUmVzdG9yZWQgc3VwcG9ydCBvZiBieXRlcyBwYXRocyBpbiBvcy53YWxrKCkgb24gV2luZG93cy4KIAogLSBJc3N1ZSAjMjYwNDU6IEFkZCBVVEYtOCBzdWdnZXN0aW9uIHRvIGVycm9yIG1lc3NhZ2Ugd2hlbiBwb3N0aW5nIGEKICAgbm9uLUxhdGluLTEgc3RyaW5nIHdpdGggaHR0cC5jbGllbnQuCiAKKy0gSXNzdWUgIzI2MDM5OiBBZGRlZCB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKCkgYW5kIHppcGluZm8uWmlwSW5mby5pc19kaXIoKS4KKyAgUGF0Y2ggYnkgVGhvbWFzIEtsdXl2ZXIuCisKIC0gSXNzdWUgIzEyOTIzOiBSZXNldCBGYW5jeVVSTG9wZW5lcidzIHJlZGlyZWN0IGNvdW50ZXIgZXZlbiBpZiB0aGVyZSBpcyBhbgogICBleGNlcHRpb24uICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEJyaWFuIEJyYXppbCBhbmQgRGFuaWVsIFJvY2NvLgogCkBAIC03MTgsNiArMTYyMCwxMCBAQAogICBnZXRob3N0YnluYW1lX2V4KCkgZnVuY3Rpb25zIG9mIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBkZWNvZGUgdGhlIGhvc3RuYW1lCiAgIGZyb20gdGhlIEFOU0kgY29kZSBwYWdlIHJhdGhlciB0aGFuIFVURi04LgogCistIElzc3VlICMyNjA5OTogVGhlIHNpdGUgbW9kdWxlIG5vdyB3cml0ZXMgYW4gZXJyb3IgaW50byBzdGRlcnIgaWYKKyAgc2l0ZWN1c3RvbWl6ZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIGJ1dCBleGVjdXRpbmcgdGhlIG1vZHVsZSByYWlzZSBhbgorICBJbXBvcnRFcnJvci4gU2FtZSBjaGFuZ2UgZm9yIHVzZXJjdXN0b21pemUuCisKIC0gSXNzdWUgIzI2MTQ3OiB4bWxycGMgbm93IHdvcmtzIHdpdGggc3RyaW5ncyBub3QgZW5jb2RhYmxlIHdpdGggdXNlZAogICBub24tVVRGLTggZW5jb2RpbmcuCiAKQEAgLTcyOCwxMyArMTYzNCwyMSBAQAogLSBJc3N1ZSAjMjYwMTM6IEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCBicm9rZW4gcHJvdG9jb2wgMiBwaWNrbGVzIGNyZWF0ZWQKICAgaW4gb2xkIFB5dGhvbiAzIHZlcnNpb25zICgzLjQuMyBhbmQgbG93ZXIpLgogCistIElzc3VlICMyNjEyOTogRGVwcmVjYXRlZCBhY2NlcHRpbmcgbm9uLWludGVnZXJzIGluIGdycC5nZXRncmdpZCgpLgorCiAtIElzc3VlICMyNTg1MDogVXNlIGNyb3NzLWNvbXBpbGF0aW9uIGJ5IGRlZmF1bHQgZm9yIDY0LWJpdCBXaW5kb3dzLgogCi0tIElzc3VlICMxNzYzMzogSW1wcm92ZSB6aXBpbXBvcnQncyBzdXBwb3J0IGZvciBuYW1lc3BhY2UgcGFja2FnZXMuCistIElzc3VlICMyNTgyMjogQWRkIGRvY3N0cmluZ3MgdG8gdGhlIGZpZWxkcyBvZiB1cmxsaWIucGFyc2UgcmVzdWx0cy4KKyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU3dhdGkgSmFpc3dhbC4KKworLSBJc3N1ZSAjMjI2NDI6IENvbnZlcnQgdHJhY2UgbW9kdWxlIG9wdGlvbiBwYXJzaW5nIG1lY2hhbmlzbSB0byBhcmdwYXJzZS4KKyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2lsZW50R2hvc3QuCiAKIC0gSXNzdWUgIzI0NzA1OiBGaXggc3lzY29uZmlnLl9wYXJzZV9tYWtlZmlsZSBub3QgZXhwYW5kaW5nICR7fSB2YXJzCiAgIGFwcGVhcmluZyBiZWZvcmUgJCgpIHZhcnMuCiAKKy0gSXNzdWUgIzI2MDY5OiBSZW1vdmUgdGhlIGRlcHJlY2F0ZWQgYXBpcyBpbiB0aGUgdHJhY2UgbW9kdWxlLgorCiAtIElzc3VlICMyMjEzODogRml4IG1vY2sucGF0Y2ggYmVoYXZpb3Igd2hlbiBwYXRjaGluZyBkZXNjcmlwdG9ycy4gUmVzdG9yZQogICBvcmlnaW5hbCB2YWx1ZXMgYWZ0ZXIgcGF0Y2hpbmcuIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNlYW4gTWNDdWxseS4KIApAQCAtNzQ3LDEzICsxNjYxLDI4IEBACiAtIElzc3VlICMyNDEyMDogSWdub3JlIFBlcm1pc3Npb25FcnJvciB3aGVuIHRyYXZlcnNpbmcgYSB0cmVlIHdpdGgKICAgcGF0aGxpYi5QYXRoLltyXWdsb2IoKS4gIFBhdGNoIGJ5IFVscmljaCBQZXRyaS4KIAorLSBJc3N1ZSAjMjE4MTU6IEFjY2VwdCBdIGNoYXJhY3RlcnMgaW4gdGhlIGRhdGEgcG9ydGlvbiBvZiBpbWFwIHJlc3BvbnNlcywKKyAgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBmbGFncyB3aXRoIHNxdWFyZSBicmFja2V0cyBhY2NlcHRlZCBhbmQgcHJvZHVjZWQKKyAgYnkgc2VydmVycyBzdWNoIGFzIGdtYWlsLgorCiAtIElzc3VlICMyNTQ0NzogZmlsZWlucHV0IG5vdyB1c2VzIHN5cy5zdGRpbiBhcy1pcyBpZiBpdCBkb2VzIG5vdCBoYXZlIGEKICAgYnVmZmVyIGF0dHJpYnV0ZSAocmVzdG9yZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCiAKKy0gSXNzdWUgIzI1OTcxOiBPcHRpbWl6ZWQgY3JlYXRpbmcgRnJhY3Rpb25zIGZyb20gZmxvYXRzIGJ5IDIgdGltZXMgYW5kIGZyb20KKyAgRGVjaW1hbHMgYnkgMyB0aW1lcy4KKworLSBJc3N1ZSAjMjU4MDI6IERvY3VtZW50IGFzIGRlcHJlY2F0ZWQgdGhlIHJlbWFpbmluZyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGUoKS4KKworLSBJc3N1ZSAjMjU5Mjg6IEFkZCBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8oKS4KKwogLSBJc3N1ZSAjMjU0NDc6IENvcHlpbmcgdGhlIGxydV9jYWNoZSgpIHdyYXBwZXIgb2JqZWN0IG5vdyBhbHdheXMgd29ya3MsCi0gIGluZGVwZW5kZWRseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG9iamVjdCAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbAorICBpbmRlcGVuZGVudGx5IGZyb20gdGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsCiAgIG9iamVjdCB1bmNoYW5nZWQpLgogCistIElzc3VlICMyNTc2ODogSGF2ZSB0aGUgZnVuY3Rpb25zIGluIGNvbXBpbGVhbGwgcmV0dXJuIGJvb2xlYW5zIGluc3RlYWQgb2YKKyAgaW50cyBhbmQgYWRkIHByb3BlciBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0cyBmb3IgdGhlIHJldHVybiB2YWx1ZXMuCisKIC0gSXNzdWUgIzI0MTAzOiBGaXhlZCBwb3NzaWJsZSB1c2UgYWZ0ZXIgZnJlZSBpbiBFbGVtZW50VHJlZS5YTUxQdWxsUGFyc2VyLgogCiAtIElzc3VlICMyNTg2MDogb3MuZndhbGsoKSBubyBsb25nZXIgc2tpcHMgcmVtYWluaW5nIGRpcmVjdG9yaWVzIHdoZW4gZXJyb3IKQEAgLTc2MSw4ICsxNjkwLDIyIEBACiAKIC0gSXNzdWUgIzI1OTE0OiBGaXhlZCBhbmQgc2ltcGxpZmllZCBPcmRlcmVkRGljdC5fX3NpemVvZl9fLgogCistIElzc3VlICMyNTg2OTogT3B0aW1pemVkIGRlZXBjb3B5aW5nIEVsZW1lbnRUcmVlOyBpdCBpcyBub3cgMjAgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNTg3MzogT3B0aW1pemVkIGl0ZXJhdGluZyBFbGVtZW50VHJlZS4gIEl0ZXJhdGluZyBlbGVtZW50cworICBFbGVtZW50Lml0ZXIoKSBpcyBub3cgNDAlIGZhc3RlciwgaXRlcmF0aW5nIHRleHQgRWxlbWVudC5pdGVydGV4dCgpCisgIGlzIG5vdyB1cCB0byAyLjUgdGltZXMgZmFzdGVyLgorCiAtIElzc3VlICMyNTkwMjogRml4ZWQgdmFyaW91cyByZWZjb3VudCBpc3N1ZXMgaW4gRWxlbWVudFRyZWUgaXRlcmF0aW9uLgogCistIElzc3VlICMyMjIyNzogVGhlIFRhckZpbGUgaXRlcmF0b3IgaXMgcmVpbXBsZW1lbnRlZCB1c2luZyBnZW5lcmF0b3IuCisgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc2ltcGxlciB0aGF0IHVzaW5nIGNsYXNzLgorCistIElzc3VlICMyNTYzODogT3B0aW1pemVkIEVsZW1lbnRUcmVlLml0ZXJwYXJzZSgpOyBpdCBpcyBub3cgMnggZmFzdGVyLgorICBPcHRpbWl6ZWQgRWxlbWVudFRyZWUgcGFyc2luZzsgaXQgaXMgbm93IDEwJSBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1NzYxOiBJbXByb3ZlZCBkZXRlY3RpbmcgZXJyb3JzIGluIGJyb2tlbiBwaWNrbGUgZGF0YS4KKwogLSBJc3N1ZSAjMjU3MTc6IFJlc3RvcmUgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiB0b2xlcmF0aW5nIG1vc3QgZnN0YXQoKQogICBlcnJvcnMgd2hlbiBvcGVuaW5nIGZpbGVzLiAgVGhpcyB3YXMgYSByZWdyZXNzaW9uIGluIDMuNWExLCBhbmQgc3RvcHBlZAogICBhbm9ueW1vdXMgdGVtcG9yYXJ5IGZpbGVzIGZyb20gd29ya2luZyBpbiBzcGVjaWFsIGNhc2VzLgpAQCAtNzc0LDYgKzE3MTcsOSBAQAogLSBJc3N1ZSAjMjU3NjQ6IEluIHRoZSBzdWJwcm9jZXNzIG1vZHVsZSwgcHJlc2VydmUgYW55IGV4Y2VwdGlvbiBjYXVzZWQgYnkKICAgZm9yaygpIGZhaWx1cmUgd2hlbiBwcmVleGVjX2ZuIGlzIHVzZWQuCiAKKy0gSXNzdWUgIzI1NzcxOiBUd2VhayB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgZm9yIGltcG9ydGxpYi51dGlsLnJlc29sdmVfbmFtZSgpCisgIHdoZW4gJ3BhY2thZ2UnIGlzbid0IHNwZWNpZmllZCBidXQgbmVjZXNzYXJ5LgorCiAtIElzc3VlICM2NDc4OiBfc3RycHRpbWUncyByZWdleHAgY2FjaGUgbm93IGlzIHJlc2V0IGFmdGVyIGNoYW5naW5nIHRpbWV6b25lCiAgIHdpdGggdGltZS50enNldCgpLgogCkBAIC03OTUsNiArMTc0MSw5IEBACiAtIElzc3VlICMxMDEzMTogRml4ZWQgZGVlcCBjb3B5aW5nIG9mIG1pbmlkb20gZG9jdW1lbnRzLiAgQmFzZWQgb24gcGF0Y2gKICAgYnkgTWFyaWFuIEdhbmlzaW4uCiAKKy0gSXNzdWUgIzc5OTA6IGRpcigpIG9uIEVsZW1lbnRUcmVlLkVsZW1lbnQgbm93IGxpc3RzIHByb3BlcnRpZXM6ICJ0YWciLAorICAidGV4dCIsICJ0YWlsIiBhbmQgImF0dHJpYiIuICBPcmlnaW5hbCBwYXRjaCBieSBTYW50b3NvIFdpamF5YS4KKwogLSBJc3N1ZSAjMjU3MjU6IEZpeGVkIGEgcmVmZXJlbmNlIGxlYWsgaW4gcGlja2xlLmxvYWRzKCkgd2hlbiB1bnBpY2tsaW5nCiAgIGludmFsaWQgZGF0YSBpbmNsdWRpbmcgdHVwbGUgaW5zdHJ1Y3Rpb25zLgogCkBAIC04MTAsNiArMTc1OSwyMDMgQEAKIC0gSXNzdWUgIzI1NjI0OiBaaXBGaWxlIG5vdyBhbHdheXMgd3JpdGVzIGEgWklQX1NUT1JFRCBoZWFkZXIgZm9yIGRpcmVjdG9yeQogICBlbnRyaWVzLiAgUGF0Y2ggYnkgRGluZ3l1YW4gV2FuZy4KIAorLSBJc3N1ZSAjMjU2MjY6IENoYW5nZSB0aHJlZSB6bGliIGZ1bmN0aW9ucyB0byBhY2NlcHQgc2l6ZXMgdGhhdCBmaXQgaW4KKyAgUHlfc3NpemVfdCwgYnV0IGludGVybmFsbHkgY2FwIHRob3NlIHNpemVzIHRvIFVJTlRfTUFYLiAgVGhpcyByZXNvbHZlcyBhCisgIHJlZ3Jlc3Npb24gaW4gMy41IHdoZXJlIEd6aXBGaWxlLnJlYWQoKSBmYWlsZWQgdG8gcmVhZCBjaHVua3MgbGFyZ2VyIHRoYW4gMgorICBvciA0IEdpQi4gIFRoZSBjaGFuZ2UgYWZmZWN0cyB0aGUgemxpYi5EZWNvbXByZXNzLmRlY29tcHJlc3MoKSBtYXhfbGVuZ3RoCisgIHBhcmFtZXRlciwgdGhlIHpsaWIuZGVjb21wcmVzcygpIGJ1ZnNpemUgcGFyYW1ldGVyLCBhbmQgdGhlCisgIHpsaWIuRGVjb21wcmVzcy5mbHVzaCgpIGxlbmd0aCBwYXJhbWV0ZXIuCisKKy0gSXNzdWUgIzI1NTgzOiBBdm9pZCBpbmNvcnJlY3QgZXJyb3JzIHJhaXNlZCBieSBvcy5tYWtlZGlycyhleGlzdF9vaz1UcnVlKQorICB3aGVuIHRoZSBPUyBnaXZlcyBwcmlvcml0eSB0byBlcnJvcnMgc3VjaCBhcyBFQUNDRVMgb3ZlciBFRVhJU1QuCisKKy0gSXNzdWUgIzI1NTkzOiBDaGFuZ2Ugc2VtYW50aWNzIG9mIEV2ZW50TG9vcC5zdG9wKCkgaW4gYXN5bmNpby4KKworLSBJc3N1ZSAjNjk3MzogV2hlbiB3ZSBrbm93IGEgc3VicHJvY2Vzcy5Qb3BlbiBwcm9jZXNzIGhhcyBkaWVkLCBkbworICBub3QgYWxsb3cgdGhlIHNlbmRfc2lnbmFsKCksIHRlcm1pbmF0ZSgpLCBvciBraWxsKCkgbWV0aG9kcyB0byBkbworICBhbnl0aGluZyBhcyB0aGV5IGNvdWxkIHBvdGVudGlhbGx5IHNpZ25hbCBhIGRpZmZlcmVudCBwcm9jZXNzLgorCistIElzc3VlICMyMzg4MzogQWRkZWQgbWlzc2luZyBBUElzIHRvIF9fYWxsX18gdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJcworICBmb3IgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBjYWxlbmRhciwgY3N2LCBlbnVtLCBmaWxlaW5wdXQsIGZ0cGxpYiwgbG9nZ2luZywKKyAgb3B0cGFyc2UsIHRhcmZpbGUsIHRocmVhZGluZyBhbmQgd2F2ZS4gIEFsc28gYWRkZWQgYQorICB0ZXN0LnN1cHBvcnQuY2hlY2tfX2FsbF9fKCkgaGVscGVyLiAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLCBNYXVybworICBTLiBNLiBSb2RyaWd1ZXMgYW5kIEpvZWwgVGFkZGVpLgorCistIElzc3VlICMyNTU5MDogSW4gdGhlIFJlYWRsaW5lIGNvbXBsZXRlciwgb25seSBjYWxsIGdldGF0dHIoKSBvbmNlIHBlcgorICBhdHRyaWJ1dGUuICBBbHNvIGNvbXBsZXRlIG5hbWVzIG9mIGF0dHJpYnV0ZXMgc3VjaCBhcyBwcm9wZXJ0aWVzIGFuZCBzbG90cworICB3aGljaCBhcmUgbGlzdGVkIGJ5IGRpcigpIGJ1dCBub3QgeWV0IGNyZWF0ZWQgb24gYW4gaW5zdGFuY2UuCisKKy0gSXNzdWUgIzI1NDk4OiBGaXggYSBjcmFzaCB3aGVuIGdhcmJhZ2UtY29sbGVjdGluZyBjdHlwZXMgb2JqZWN0cyBjcmVhdGVkCisgIGJ5IHdyYXBwaW5nIGEgbWVtb3J5dmlldy4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBtYWRlIGluIDMuNWExLiAgQmFzZWQKKyAgb24gcGF0Y2ggYnkgRXJ5a3N1bi4KKworLSBJc3N1ZSAjMjU1ODQ6IEFkZGVkICJlc2NhcGUiIHRvIHRoZSBfX2FsbF9fIGxpc3QgaW4gdGhlIGdsb2IgbW9kdWxlLgorCistIElzc3VlICMyNTU4NDogRml4ZWQgcmVjdXJzaXZlIGdsb2IoKSB3aXRoIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggJ1wqXConLgorCistIElzc3VlICMyNTQ0NjogRml4IHJlZ3Jlc3Npb24gaW4gc210cGxpYidzIEFVVEggTE9HSU4gc3VwcG9ydC4KKworLSBJc3N1ZSAjMTgwMTA6IEZpeCB0aGUgcHlkb2Mgd2ViIHNlcnZlcidzIG1vZHVsZSBzZWFyY2ggZnVuY3Rpb24gdG8gaGFuZGxlCisgIGV4Y2VwdGlvbnMgZnJvbSBpbXBvcnRpbmcgcGFja2FnZXMuCisKKy0gSXNzdWUgIzI1NTU0OiBHb3QgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcuCisKKy0gSXNzdWUgIzE4OTczOiBDb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9mIHRoZSBjYWxlbmRhciBtb2R1bGUgbm93IHVzZXMgYXJncGFyc2UKKyAgaW5zdGVhZCBvZiBvcHRwYXJzZS4KKworLSBJc3N1ZSAjMjU1MTA6IGZpbGVpbnB1dC5GaWxlSW5wdXQucmVhZGxpbmUoKSBub3cgcmV0dXJucyBiJycgaW5zdGVhZCBvZiAnJworICBhdCB0aGUgZW5kIGlmIHRoZSBGaWxlSW5wdXQgd2FzIG9wZW5lZCB3aXRoIGJpbmFyeSBtb2RlLgorICBQYXRjaCBieSBSeW9zdWtlIEl0by4KKworLSBJc3N1ZSAjMjU1MDM6IEZpeGVkIGluc3BlY3QuZ2V0ZG9jKCkgZm9yIGluaGVyaXRlZCBkb2NzdHJpbmdzIG9mIHByb3BlcnRpZXMuCisgIE9yaWdpbmFsIHBhdGNoIGJ5IEpvaG4gTWFyayBWYW5kZW5iZXJnLgorCistIElzc3VlICMyNTUxNTogQWx3YXlzIHVzZSBvcy51cmFuZG9tIGFzIGEgc291cmNlIG9mIHJhbmRvbW5lc3MgaW4gdXVpZC51dWlkNC4KKworLSBJc3N1ZSAjMjE4Mjc6IEZpeGVkIHRleHR3cmFwLmRlZGVudCgpIGZvciB0aGUgY2FzZSB3aGVuIGxhcmdlc3QgY29tbW9uCisgIHdoaXRlc3BhY2UgaXMgYSBzdWJzdHJpbmcgb2Ygc21hbGxlc3QgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBCYXNlZCBvbiBwYXRjaCBieSBSb2JlcnQgTGkuCisKKy0gSXNzdWUgIzI1NDQ3OiBUaGUgbHJ1X2NhY2hlKCkgd3JhcHBlciBvYmplY3RzIG5vdyBjYW4gYmUgY29waWVkIGFuZCBwaWNrbGVkCisgIChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIG9iamVjdCB1bmNoYW5nZWQpLgorCistIElzc3VlICMyNTM5MDogdHlwaW5nOiBEb24ndCBjcmFzaCBvbiBVbmlvbltzdHIsIFBhdHRlcm5dLgorCistIElzc3VlICMyNTQ0MTogYXN5bmNpbzogUmFpc2UgZXJyb3IgZnJvbSBkcmFpbigpIHdoZW4gc29ja2V0IGlzIGNsb3NlZC4KKworLSBJc3N1ZSAjMjU0MTA6IENsZWFuZWQgdXAgYW5kIGZpeGVkIG1pbm9yIGJ1Z3MgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZgorICBPcmRlcmVkRGljdC4KKworLSBJc3N1ZSAjMjU0MTE6IEltcHJvdmVkIFVuaWNvZGUgc3VwcG9ydCBpbiBTTVRQSGFuZGxlciB0aHJvdWdoIGJldHRlciB1c2Ugb2YKKyAgdGhlIGVtYWlsIHBhY2thZ2UuIFRoYW5rcyB0byB1c2VyIHNpbW9uMDQgZm9yIHRoZSBwYXRjaC4KKworLSBNb3ZlIHRoZSBpbXAgbW9kdWxlIGZyb20gYSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4KKworLSBJc3N1ZSAjMjU0MDc6IFJlbW92ZSBtZW50aW9ucyBvZiB0aGUgZm9ybWF0dGVyIG1vZHVsZSBiZWluZyByZW1vdmVkIGluCisgIFB5dGhvbiAzLjYuCisKKy0gSXNzdWUgIzI1NDA2OiBGaXhlZCBhIGJ1ZyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0Lm1vdmVfdG9fZW5kKCkKKyAgdGhhdCBjYXVzZWQgc2VnbWVudGF0aW9uIGZhdWx0IG9yIGhhbmcgaW4gaXRlcmF0aW5nIGFmdGVyIG1vdmluZyBzZXZlcmFsCisgIGl0ZW1zIHRvIHRoZSBzdGFydCBvZiBvcmRlcmVkIGRpY3QuCisKKy0gSXNzdWUgIzI1MzgyOiBwaWNrbGV0b29scy5kaXMoKSBub3cgb3V0cHV0cyBpbXBsaWNpdCBtZW1vIGluZGV4IGZvciB0aGUKKyAgTUVNT0laRSBvcGNvZGUuCisKKy0gSXNzdWUgIzI1MzU3OiBBZGQgYW4gb3B0aW9uYWwgbmV3bGluZSBwYXJhbWVyIHRvIGJpbmFzY2lpLmIyYV9iYXNlNjQoKS4KKyAgYmFzZTY0LmI2NGVuY29kZSgpIHVzZXMgaXQgdG8gYXZvaWQgYSBtZW1vcnkgY29weS4KKworLSBJc3N1ZSAjMjQxNjQ6IE9iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cywKKyAgY2FuIG5vdyBiZSBwaWNrbGVkIHVzaW5nIHBpY2tsZSBwcm90b2NvbHMgb2xkZXIgdGhhbiBwcm90b2NvbCB2ZXJzaW9uIDQuCisKKy0gSXNzdWUgIzI1MzY0OiB6aXBmaWxlIG5vdyB3b3JrcyBpbiB0aHJlYWRzIGRpc2FibGVkIGJ1aWxkcy4KKworLSBJc3N1ZSAjMjUzMjg6IHNtdHBkJ3MgU01UUENoYW5uZWwgbm93IGNvcnJlY3RseSByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGJvdGgKKyAgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBhcmUgc2V0IHRvIHRydWUuCisKKy0gSXNzdWUgIzE2MDk5OiBSb2JvdEZpbGVQYXJzZXIgbm93IHN1cHBvcnRzIENyYXdsLWRlbGF5IGFuZCBSZXF1ZXN0LXJhdGUKKyAgZXh0ZW5zaW9ucy4gIFBhdGNoIGJ5IE5pa29sYXkgQm9nb3ljaGV2LgorCistIElzc3VlICMyNTMxNjogZGlzdHV0aWxzIHJhaXNlcyBPU0Vycm9yIGluc3RlYWQgb2YgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorICB3aGVuIE1TVkMgaXMgbm90IGluc3RhbGxlZC4KKworLSBJc3N1ZSAjMjUzODA6IEZpeGVkIHByb3RvY29sIGZvciB0aGUgU1RBQ0tfR0xPQkFMIG9wY29kZSBpbgorICBwaWNrbGV0b29scy5vcGNvZGVzLgorCistIElzc3VlICMyMzk3MjogVXBkYXRlcyBhc3luY2lvIGRhdGFncmFtIGNyZWF0ZSBtZXRob2QgYWxsb3dpbmcgcmV1c2Vwb3J0CisgIGFuZCByZXVzZWFkZHIgc29ja2V0IG9wdGlvbnMgdG8gYmUgc2V0IHByaW9yIHRvIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgTWlycm9yaW5nIHRoZSBleGlzdGluZyBhc3luY2lvIGNyZWF0ZV9zZXJ2ZXIgbWV0aG9kIHRoZSByZXVzZWFkZHIgb3B0aW9uCisgIGZvciBkYXRhZ3JhbSBzb2NrZXRzIGRlZmF1bHRzIHRvIFRydWUgaWYgdGhlIE8vUyBpcyAncG9zaXgnIChleGNlcHQgaWYgdGhlCisgIHBsYXRmb3JtIGlzIEN5Z3dpbikuIFBhdGNoIGJ5IENocmlzIExhd3MuCisKKy0gSXNzdWUgIzI1MzA0OiBBZGQgYXN5bmNpby5ydW5fY29yb3V0aW5lX3RocmVhZHNhZmUoKS4gIFRoaXMgbGV0cyB5b3UKKyAgc3VibWl0IGEgY29yb3V0aW5lIHRvIGEgbG9vcCBmcm9tIGFub3RoZXIgdGhyZWFkLCByZXR1cm5pbmcgYQorICBjb25jdXJyZW50LmZ1dHVyZXMuRnV0dXJlLiAgQnkgVmluY2VudCBNaWNoZWwuCisKKy0gSXNzdWUgIzI1MjMyOiBGaXggQ0dJUmVxdWVzdEhhbmRsZXIgdG8gc3BsaXQgdGhlIHF1ZXJ5IGZyb20gdGhlIFVSTCBhdCB0aGUKKyAgZmlyc3QgcXVlc3Rpb24gbWFyayAoPykgcmF0aGVyIHRoYW4gdGhlIGxhc3QuIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI0NjU3OiBQcmV2ZW50IENHSVJlcXVlc3RIYW5kbGVyIGZyb20gY29sbGFwc2luZyBzbGFzaGVzIGluIHRoZQorICBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwgYXMgaWYgaXQgd2VyZSBhIHBhdGguIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI1Mjg3OiBEb24ndCBhZGQgY3J5cHQuTUVUSE9EX0NSWVBUIHRvIGNyeXB0Lm1ldGhvZHMgaWYgaXQncyBub3QKKyAgc3VwcG9ydGVkLiBDaGVjayBpZiBpdCBpcyBzdXBwb3J0ZWQsIGl0IG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIE9wZW5CU0QgZm9yCisgIGV4YW1wbGUuCisKKy0gSXNzdWUgIzIzNjAwOiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby5mcm9tdXRjKCkgd2FzIHJldHVybmluZworICB3cm9uZyByZXN1bHRzIGluIHNvbWUgY2FzZXMuCisKKy0gSXNzdWUgIzI1MjAzOiBGYWlsZWQgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcl9kZWxpbXMoKSBubyBsb25nZXIgbGVmdCB0aGUKKyAgbW9kdWxlIGluIGluY29uc2lzdGVudCBzdGF0ZS4KKworLSBJc3N1ZSAjMjUwMTE6IHJsY29tcGxldGVyIG5vdyBvbWl0cyBwcml2YXRlIGFuZCBzcGVjaWFsIGF0dHJpYnV0ZSBuYW1lcyB1bmxlc3MKKyAgdGhlIHByZWZpeCBzdGFydHMgd2l0aCB1bmRlcnNjb3Jlcy4KKworLSBJc3N1ZSAjMjUyMDk6IHJsY29tcGxldGVyIG5vdyBjYW4gYWRkIGEgc3BhY2Ugb3IgYSBjb2xvbiBhZnRlciBjb21wbGV0ZWQKKyAga2V5d29yZC4KKworLSBJc3N1ZSAjMjIyNDE6IHRpbWV6b25lLnV0YyBuYW1lIGlzIG5vdyBwbGFpbiAnVVRDJywgbm90ICdVVEMtMDA6MDAnLgorCistIElzc3VlICMyMzUxNzogZnJvbXRpbWVzdGFtcCgpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgbWV0aG9kcyBvZgorICBkYXRldGltZS5kYXRldGltZSBub3cgcm91bmQgbWljcm9zZWNvbmRzIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvCisgIG5lYXJlc3QgZXZlbiBpbnRlZ2VyIChST1VORF9IQUxGX0VWRU4pLCBhcyByb3VuZChmbG9hdCksIGluc3RlYWQgb2Ygcm91bmRpbmcKKyAgdG93YXJkcyAtSW5maW5pdHkgKFJPVU5EX0ZMT09SKS4KKworLSBJc3N1ZSAjMjM1NTI6IFRpbWVpdCBub3cgd2FybnMgd2hlbiB0aGVyZSBpcyBzdWJzdGFudGlhbCAoNHgpIHZhcmlhbmNlCisgIGJldHdlZW4gYmVzdCBhbmQgd29yc3QgdGltZXMuIFBhdGNoIGZyb20gU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ2MzM6IHNpdGUtcGFja2FnZXMvUkVBRE1FIC0+IFJFQURNRS50eHQuCisKKy0gSXNzdWUgIzI0ODc5OiBoZWxwKCkgYW5kIHB5ZG9jIGNhbiBub3cgbGlzdCBuYW1lZCB0dXBsZSBmaWVsZHMgaW4gdGhlCisgIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5LiAgVGhlIG9yZGVyaW5nIGlzCisgIGRldGVybWluZWQgYnkgdGhlIF9maWVsZHMgYXR0cmlidXRlIGlmIHByZXNlbnQuCisKKy0gSXNzdWUgIzI0ODc0OiBJbXByb3ZlIHNwZWVkIG9mIGl0ZXJ0b29scy5jeWNsZSgpIGFuZCBtYWtlIGl0cworICBwaWNrbGUgbW9yZSBjb21wYWN0LgorCistIEZpeCBjcmFzaCBpbiBpdGVydG9vbHMuY3ljbGUuX19zZXRzdGF0ZV9fKCkgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgd2Fzbid0CisgIGEgbGlzdC4KKworLSBJc3N1ZSAjMjAwNTk6IHVybGxpYi5wYXJzZSByYWlzZXMgVmFsdWVFcnJvciBvbiBhbGwgaW52YWxpZCBwb3J0cy4KKyAgUGF0Y2ggYnkgTWFydGluIFBhbnRlci4KKworLSBJc3N1ZSAjMjQzNjA6IEltcHJvdmUgX19yZXByX18gb2YgYXJncGFyc2UuTmFtZXNwYWNlKCkgZm9yIGludmFsaWQKKyAgaWRlbnRpZmllcnMuICBQYXRjaCBieSBNYXR0aGlhcyBCdXNzb25uaWVyLgorCistIElzc3VlICMyMzQyNjogcnVuX3NldHVwIHdhcyBicm9rZW4gaW4gZGlzdHV0aWxzLgorICBQYXRjaCBmcm9tIEFsZXhhbmRlciBCZWxvcG9sc2t5LgorCistIElzc3VlICMxMzkzODogMnRvMyBjb252ZXJ0cyBTdHJpbmdUeXBlcyB0byBhIHR1cGxlLiBQYXRjaCBmcm9tIE1hcmsgSGFtbW9uZC4KKworLSBJc3N1ZSAjMjA5MTogb3BlbigpIGFjY2VwdGVkIGEgJ1UnIG1vZGUgc3RyaW5nIGNvbnRhaW5pbmcgJysnLCBidXQgJ1UnIGNhbgorICBvbmx5IGJlIHVzZWQgd2l0aCAncicuIFBhdGNoIGZyb20gSmVmZiBCYWxvZ2ggYW5kIEpvaG4gTydDb25ub3IuCisKKy0gSXNzdWUgIzg1ODU6IGltcHJvdmVkIHRlc3RzIGZvciB6aXBpbXBvcnRlcjIuIFBhdGNoIGZyb20gTWFyayBMYXdyZW5jZS4KKworLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCisgIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCisKKy0gSXNzdWUgIzI0NDI2OiBGYXN0IHNlYXJjaGluZyBvcHRpbWl6YXRpb24gaW4gcmVndWxhciBleHByZXNzaW9ucyBub3cgd29ya3MKKyAgZm9yIHBhdHRlcm5zIHRoYXQgc3RhcnRzIHdpdGggY2FwdHVyaW5nIGdyb3Vwcy4gIEZhc3Qgc2VhcmNoaW5nIG9wdGltaXphdGlvbgorICBub3cgY2FuJ3QgYmUgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgorCistIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCisgIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCisKKy0gSXNzdWUgIzEzMjQ4OiBSZW1vdmUgZGVwcmVjYXRlZCBpbnNwZWN0LmdldG1vZHVsZWluZm8gZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI1NTc4OiBGaXggKGFub3RoZXIpIG1lbW9yeSBsZWFrIGluIFNTTFNvY2tldC5nZXRwZWVyY2VyKCkuCisKKy0gSXNzdWUgIzI1NTMwOiBEaXNhYmxlIHRoZSB2dWxuZXJhYmxlIFNTTHYzIHByb3RvY29sIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZworICBzc2wuU1NMQ29udGV4dC4KKworLSBJc3N1ZSAjMjU1Njk6IEZpeCBtZW1vcnkgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKS4KKworLSBJc3N1ZSAjMjU0NzE6IFNvY2tldHMgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKSBzaG91bGRuJ3QgYXBwZWFyIHRvIGJlCisgIG5vbmJsb2NraW5nLgorCistIElzc3VlICMyNTMxOTogV2hlbiB0aHJlYWRpbmcuRXZlbnQgaXMgcmVpbml0aWFsaXplZCwgdGhlIHVuZGVybHlpbmcgY29uZGl0aW9uCisgIHNob3VsZCB1c2UgYSByZWd1bGFyIGxvY2sgcmF0aGVyIHRoYW4gYSByZWN1cnNpdmUgbG9jay4KKwogLSBTa2lwIGdldGFkZHJpbmZvIGlmIGhvc3QgaXMgYWxyZWFkeSByZXNvbHZlZC4KICAgUGF0Y2ggYnkgQS4gSmVzc2UgSmlyeXUgRGF2aXMuCiAKQEAgLTgyOSw1MyArMTk3NSw5IEBACiAKIC0gSXNzdWUgIzI3MDQxOiBhc3luY2lvOiBBZGQgbG9vcC5jcmVhdGVfZnV0dXJlIG1ldGhvZAogCi0tIElzc3VlICMyNzIyMzogYXN5bmNpbzogRml4IF9yZWFkX3JlYWR5IGFuZCBfd3JpdGVfcmVhZHkgdG8gcmVzcGVjdAotICBfY29ubl9sb3N0LgotICBQYXRjaCBieSDFgXVrYXN6IExhbmdhLgotCi0tIElzc3VlICMyMjk3MDogYXN5bmNpbzogRml4IGluY29uc2lzdGVuY3kgY2FuY2VsbGluZyBDb25kaXRpb24ud2FpdC4KLSAgUGF0Y2ggYnkgRGF2aWQgQ29sZXMuCi0KIElETEUKIC0tLS0KIAotLSBJc3N1ZSAjNTEyNDogUGFzdGUgd2l0aCB0ZXh0IHNlbGVjdGVkIG5vdyByZXBsYWNlcyB0aGUgc2VsZWN0aW9uIG9uIFgxMS4KLSAgVGhpcyBtYXRjaGVzIGhvdyBwYXN0ZSB3b3JrcyBvbiBXaW5kb3dzLCBNYWMsIG1vc3QgbW9kZXJuIExpbnV4IGFwcHMsCi0gIGFuZCB0dGsgd2lkZ2V0cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCi0KLS0gSXNzdWUgIzI0NzU5OiBNYWtlIGNsZWFyIGluIGlkbGVsaWIuaWRsZV90ZXN0Ll9faW5pdF9fIHRoYXQgdGhlIGRpcmVjdG9yeQotICBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdC50ZXN0X2lkbGUgYW5kIHRvb2wgZm9yIG1haW50YWluZXJzLgotCi0tIElzc3VlICMyNzE5NjogU3RvcCAnVGhlbWVDaGFuZ2VkJyB3YXJuaW5ncyB3aGVuIHJ1bm5pbmcgSURMRSB0ZXN0cy4KLSAgVGhlc2UgcGVyc2lzdGVkIGFmdGVyIG90aGVyIHdhcm5pbmdzIHdlcmUgc3VwcHJlc3NlZCBpbiAjMjA1NjcuCi0gIEFwcGx5IFNlcmhpeSBTdG9yY2hha2EncyB1cGRhdGVfaWRsZXRhc2tzIHNvbHV0aW9uIHRvIGZvdXIgdGVzdCBmaWxlcy4KLSAgUmVjb3JkIHRoaXMgYWRkaXRpb25hbCBhZHZpY2UgaW4gaWRsZV90ZXN0L1JFQURNRS50eHQKLQotLSBJc3N1ZSAjMjA1Njc6IFJldmlzZSBpZGxlX3Rlc3QvUkVBRE1FLnR4dCB3aXRoIGFkdmljZSBhYm91dCBhdm9pZGluZwotICB0ayB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gdGVzdHMuICBBcHBseSBhZHZpY2UgdG8gc2V2ZXJhbCBJRExFIHRlc3RzLgotCi0tIElzc3VlICMyNzExNzogTWFrZSBjb2xvcml6ZXIgaHRlc3QgYW5kIHR1cnRsZWRlbW8gd29yayB3aXRoIGRhcmsgdGhlbWVzLgotICBNb3ZlIGNvZGUgZm9yIGNvbmZpZ3VyaW5nIHRleHQgd2lkZ2V0IGNvbG9ycyB0byBhIG5ldyBmdW5jdGlvbi4KLQotLSBJc3N1ZSAjMjY2NzM6IFdoZW4gdGsgcmVwb3J0cyBmb250IHNpemUgYXMgMCwgY2hhbmdlIHRvIHNpemUgMTAuCi0gIFN1Y2ggZm9udHMgb24gTGludXggcHJldmVudGVkIHRoZSBjb25maWd1cmF0aW9uIGRpYWxvZyBmcm9tIG9wZW5pbmcuCi0KLS0gSXNzdWUgIzIxOTM5OiBBZGQgdGVzdCBmb3IgSURMRSdzIHBlcmNvbGF0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KLQotLSBJc3N1ZSAjMjE2NzY6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcmVwbGFjZSBkaWFsb2cuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KLQotLSBJc3N1ZSAjMTg0MTA6IEFkZCB0ZXN0IGZvciBJRExFJ3Mgc2VhcmNoIGRpYWxvZy4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgV2VzdGxleSBNYXJ0w61uZXouCi0KLS0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgSURMRSdzIHVuZG8gZGVsZWdhdG9yLgotICBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIgLgotCi0tIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KLQotLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCi0KIC0gSXNzdWUgIzIwNjQwOiBBZGQgdGVzdHMgZm9yIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQuCiAgIFBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KIApAQCAtODg5LDExICsxOTkxLDEwMyBAQAogICBNQVJLIGluIFJFQURNRS50eHQgYW5kIG9wZW4gdGhpcyBhbmQgTkVXUy50eHQgd2l0aCAnYXNjaWknLgogICBSZS1lbmNvZGUgQ1JFRElUUy50eHQgdG8gdXRmLTggYW5kIG9wZW4gaXQgd2l0aCAndXRmLTgnLgogCistIElzc3VlICMxNTM0ODogU3RvcCB0aGUgZGVidWdnZXIgZW5naW5lIChub3JtYWxseSBpbiBhIHVzZXIgcHJvY2VzcykKKyAgYmVmb3JlIGNsb3NpbmcgdGhlIGRlYnVnZ2VyIHdpbmRvdyAocnVubmluZyBpbiB0aGUgSURMRSBwcm9jZXNzKS4KKyAgVGhpcyBwcmV2ZW50cyB0aGUgUnVudGltZUVycm9ycyB0aGF0IHdlcmUgYmVpbmcgY2F1Z2h0IGFuZCBpZ25vcmVkLgorCistIElzc3VlICMyNDQ1NTogUHJldmVudCBJRExFIGZyb20gaGFuZ2luZyB3aGVuIGEpIGNsb3NpbmcgdGhlIHNoZWxsIHdoaWxlIHRoZQorICBkZWJ1Z2dlciBpcyBhY3RpdmUgKDE1MzQ3KTsgYikgY2xvc2luZyB0aGUgZGVidWdnZXIgd2l0aCB0aGUgW1hdIGJ1dHRvbgorICAoMTUzNDgpOyBhbmQgYykgYWN0aXZhdGluZyB0aGUgZGVidWdnZXIgd2hlbiBhbHJlYWR5IGFjdGl2ZSAoMjQ0NTUpLgorICBUaGUgcGF0Y2ggYnkgTWFyayBSb3NlbWFuIGRvZXMgdGhpcyBieSBtYWtpbmcgdHdvIGNoYW5nZXMuCisgIDEuIFN1c3BlbmQgYW5kIHJlc3VtZSB0aGUgZ3VpLmludGVyYWN0aW9uIG1ldGhvZCB3aXRoIHRoZSB0Y2wgdndhaXQKKyAgbWVjaGFuaXNtIGludGVuZGVkIGZvciB0aGlzIHB1cnBvc2UgKGluc3RlYWQgb2Ygcm9vdC5tYWlubG9vcCAmIC5xdWl0KS4KKyAgMi4gSW4gZ3VpLnJ1biwgYWxsb3cgYW55IGV4aXN0aW5nIGludGVyYWN0aW9uIHRvIHRlcm1pbmF0ZSBmaXJzdC4KKworLSBDaGFuZ2UgJ1RoZSBwcm9ncmFtJyB0byAnWW91ciBwcm9ncmFtJyBpbiBhbiBJRExFICdraWxsIHByb2dyYW0/JyBtZXNzYWdlCisgIHRvIG1ha2UgaXQgY2xlYXJlciB0aGF0IHRoZSBwcm9ncmFtIHJlZmVycmVkIHRvIGlzIHRoZSBjdXJyZW50bHkgcnVubmluZworICB1c2VyIHByb2dyYW0sIG5vdCBJRExFIGl0c2VsZi4KKworLSBJc3N1ZSAjMjQ3NTA6IEltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIElETEUgZWRpdG9yIHdpbmRvdyBzdGF0dXMgYmFyLgorICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MzEzOiBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIG5ldyBidWlsdC1pbiB0ZXh0IGNvbG9yIHRoZW1lcyB0byBiZXR0ZXIKKyAgYWRkcmVzcyB0aGUgY29tcGF0aWJpbGl0eSBwcm9ibGVtIGludHJvZHVjZWQgYnkgdGhlIGFkZGl0aW9uIG9mIElETEUgRGFyay4KKyAgQ29uc2lzdGVudGx5IHVzZSB0aGUgcmV2aXNlZCBpZGxlQ29uZi5DdXJyZW50VGhlbWUgZXZlcnl3aGVyZSBpbiBpZGxlbGliLgorCistIElzc3VlICMyNDc4MjogRXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gaXMgbm93IGEgdGFiIGluIHRoZSBJRExFIFByZWZlcmVuY2VzCisgIGRpYWxvZyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGRpYWxvZy4gIFRoZSBmb3JtZXIgdGFicyBhcmUgbm93IGEgc29ydGVkCisgIGxpc3QuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzIyNzI2OiBSZS1hY3RpdmF0ZSB0aGUgY29uZmlnIGRpYWxvZyBoZWxwIGJ1dHRvbiB3aXRoIHNvbWUgY29udGVudAorICBhYm91dCB0aGUgb3RoZXIgYnV0dG9ucyBhbmQgdGhlIG5ldyBJRExFIERhcmsgdGhlbWUuCisKKy0gSXNzdWUgIzI0ODIwOiBJRExFIG5vdyBoYXMgYW4gJ0lETEUgRGFyaycgYnVpbHQtaW4gdGV4dCBjb2xvciB0aGVtZS4KKyAgSXQgaXMgbW9yZSBvciBsZXNzIElETEUgQ2xhc3NpYyBpbnZlcnRlZCwgd2l0aCBhIGNvYmFsdCBibHVlIGJhY2tncm91bmQuCisgIFN0cmluZ3MsIGNvbW1lbnRzLCBrZXl3b3JkcywgLi4uIGFyZSBzdGlsbCBncmVlbiwgcmVkLCBvcmFuZ2UsIC4uLiAuCisgIFRvIHVzZSBpdCB3aXRoIElETEVzIHJlbGVhc2VkIGJlZm9yZSBOb3ZlbWJlciAyMDE1LCBoaXQgdGhlCisgICdTYXZlIGFzIE5ldyBDdXN0b20gVGhlbWUnIGJ1dHRvbiBhbmQgZW50ZXIgYSBuZXcgbmFtZSwKKyAgc3VjaCBhcyAnQ3VzdG9tIERhcmsnLiAgVGhlIGN1c3RvbSB0aGVtZSB3aWxsIHdvcmsgd2l0aCBhbnkgSURMRQorICByZWxlYXNlLCBhbmQgY2FuIGJlIG1vZGlmaWVkLgorCistIElzc3VlICMyNTIyNDogUkVBRE1FLnR4dCBpcyBub3cgYW4gaWRsZWxpYiBpbmRleCBmb3IgSURMRSBkZXZlbG9wZXJzIGFuZAorICBjdXJpb3VzIHVzZXJzLiAgVGhlIHByZXZpb3VzIHVzZXIgY29udGVudCBpcyBub3cgaW4gdGhlIElETEUgZG9jIGNoYXB0ZXIuCisgICdJRExFJyBub3cgbWVhbnMgJ0ludGVncmF0ZWQgRGV2ZWxvcG1lbnQgYW5kIExlYXJuaW5nIEVudmlyb25tZW50Jy4KKworLSBJc3N1ZSAjMjQ4MjA6IFVzZXJzIGNhbiBub3cgc2V0IGJyZWFrcG9pbnQgY29sb3JzIGluCisgIFNldHRpbmdzIC0+IEN1c3RvbSBIaWdobGlnaHRpbmcuICBPcmlnaW5hbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0OTcyOiBJbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZCBub3cgbWF0Y2hlcyBhY3RpdmUgc2VsZWN0aW9uCisgIGJhY2tncm91bmQsIGFzIGNvbmZpZ3VyZWQgYnkgdXNlcnMsIG9uIGFsbCBzeXN0ZW1zLiAgRm91bmQgaXRlbXMgYXJlIG5vdworICBhbHdheXMgaGlnaGxpZ2h0ZWQgb24gV2luZG93cy4gIEluaXRpYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDU3MDogSWRsZTogbWFrZSBjYWxsdGlwIGFuZCBjb21wbGV0aW9uIGJveGVzIGFwcGVhciBvbiBNYWNzCisgIGFmZmVjdGVkIGJ5IGEgdGsgcmVncmVzc2lvbi4gIEluaXRpYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDk4ODogSWRsZSBTY3JvbGxlZExpc3QgY29udGV4dCBtZW51cyAodXNlZCBpbiBkZWJ1Z2dlcikKKyAgbm93IHdvcmsgb24gTWFjIEFxdWEuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0ODAxOiBNYWtlIHJpZ2h0LWNsaWNrIGZvciBjb250ZXh0IG1lbnUgd29yayBvbiBNYWMgQXF1YS4KKyAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTE3MzogQXNzb2NpYXRlIHRraW50ZXIgbWVzc2FnZWJveGVzIHdpdGggYSBzcGVjaWZpYyB3aWRnZXQuCisgIEZvciBNYWMgT1NYLCBtYWtlIHRoZW0gYSAnc2hlZXQnLiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTE5ODogRW5oYW5jZSB0aGUgaW5pdGlhbCBodG1sIHZpZXdlciBub3cgdXNlZCBmb3IgSWRsZSBIZWxwLgorICAqIFByb3Blcmx5IGluZGVudCBmaXhlZC1waXRjaCB0ZXh0IChwYXRjaCBieSBNYXJrIFJvc2VtYW4pLgorICAqIEdpdmUgY29kZSBzbmlwcGV0IGEgdmVyeSBTcGhpbngtbGlrZSBsaWdodCBibHVlaXNoLWdyYXkgYmFja2dyb3VuZC4KKyAgKiBSZS11c2UgaW5pdGlhbCB3aWR0aCBhbmQgaGVpZ2h0IHNldCBieSB1c2VycyBmb3Igc2hlbGwgYW5kIGVkaXRvci4KKyAgKiBXaGVuIHRoZSBUYWJsZSBvZiBDb250ZW50cyAoVE9DKSBtZW51IGlzIHVzZWQsIHB1dCB0aGUgc2VjdGlvbiBoZWFkZXIKKyAgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLgorCistIElzc3VlICMyNTIyNTogQ29uZGVuc2UgYW5kIHJld3JpdGUgSWRsZSBkb2Mgc2VjdGlvbiBvbiB0ZXh0IGNvbG9ycy4KKworLSBJc3N1ZSAjMjE5OTU6IEV4cGxhaW4gc29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElETEUgYW5kIGNvbnNvbGUgUHl0aG9uLgorCistIElzc3VlICMyMjgyMDogRXhwbGFpbiBuZWVkIGZvciAqcHJpbnQqIHdoZW4gcnVubmluZyBmaWxlIGZyb20gSWRsZSBlZGl0b3IuCisKKy0gSXNzdWUgIzI1MjI0OiBEb2M6IGF1Z21lbnQgSWRsZSBmZWF0dXJlIGxpc3QgYW5kIG5vLXN1YnByb2Nlc3Mgc2VjdGlvbi4KKworLSBJc3N1ZSAjMjUyMTk6IFVwZGF0ZSBkb2MgZm9yIElkbGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgIFNvbWUgd2VyZSBtaXNzaW5nIGFuZCBub3RlcyB3ZXJlIG5vdCBjb3JyZWN0LgorCistIElzc3VlICMyNDg2MTogTW9zdCBvZiBpZGxlbGliIGlzIHByaXZhdGUgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgorICBVc2UgaWRsZWliLmlkbGUuKiB0byBzdGFydCBJZGxlLiBTZWUgaWRsZWxpYi5fX2luaXRfXy5fX2RvY19fLgorCistIElzc3VlICMyNTE5OTogSWRsZTogYWRkIHN5bmNocm9uaXphdGlvbiBjb21tZW50cyBmb3IgZnV0dXJlIG1haW50YWluZXJzLgorCistIElzc3VlICMxNjg5MzogUmVwbGFjZSBoZWxwLnR4dCB3aXRoIGhlbHAuaHRtbCBmb3IgSWRsZSBkb2MgZGlzcGxheS4KKyAgVGhlIG5ldyBpZGxlbGliL2hlbHAuaHRtbCBpcyByc3RyaXBwZWQgRG9jL2J1aWxkL2h0bWwvbGlicmFyeS9pZGxlLmh0bWwuCisgIEl0IGxvb2tzIGJldHRlciB0aGFuIGhlbHAudHh0IGFuZCB3aWxsIGJldHRlciBkb2N1bWVudCBJZGxlIGFzIHJlbGVhc2VkLgorICBUaGUgdGtpbnRlciBodG1sIHZpZXdlciB0aGF0IHdvcmtzIGZvciB0aGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9zZSBSb3NlbWFuLgorICBUaGUgbm93IHVudXNlZCBFZGl0b3JXaW5kb3cuSGVscERpYWxvZyBjbGFzcyBhbmQgaGVsdC50eHQgZmlsZSBhcmUgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjQxOTk6IERlcHJlY2F0ZSB1bnVzZWQgaWRsZWxpYi5pZGxldmVyIHdpdGggcG9zc2libGUgcmVtb3ZhbCBpbiAzLjYuCisKKy0gSXNzdWUgIzI0NzkwOiBSZW1vdmUgZXh0cmFuZW91cyBjb2RlICh3aGljaCBhbHNvIGNyZWF0ZSAyICYgMyBjb25mbGljdHMpLgorCiBEb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tCiAKLS0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCi0KIC0gSXNzdWUgIzI2NzM2OiBVc2VkIEhUVFBTIGZvciBleHRlcm5hbCBsaW5rcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpZiBwb3NzaWJsZS4KIAogLSBJc3N1ZSAjNjk1MzogUmV3b3JrIHRoZSBSZWFkbGluZSBtb2R1bGUgZG9jdW1lbnRhdGlvbiB0byBncm91cCByZWxhdGVkCkBAIC05MDIsOCArMjA5Niw4IEBACiAKIC0gSXNzdWUgIzIzNjA2OiBBZGRzIG5vdGUgdG8gY3R5cGVzIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIGNkbGwubXN2Y3J0LgogCi0tIElzc3VlICMyNTUwMDogRml4IGRvY3VtZW50YXRpb24gdG8gbm90IGNsYWltIHRoYXQgX19pbXBvcnRfXyBpcyBzZWFyY2hlZCBmb3IKLSAgaW4gdGhlIGdsb2JhbCBzY29wZS4KKy0gSXNzdWUgIzI0OTUyOiBDbGFyaWZ5IHRoZSBkZWZhdWx0IHNpemUgYXJndW1lbnQgb2Ygc3RhY2tfc2l6ZSgpIGluCisgIHRoZSAidGhyZWFkaW5nIiBhbmQgIl90aHJlYWQiIG1vZHVsZXMuIFBhdGNoIGZyb20gTWF0dGlwLgogCiAtIElzc3VlICMyNjAxNDogVXBkYXRlIDMueCBwYWNrYWdpbmcgZG9jdW1lbnRhdGlvbjoKICAgKiAiU2VlIGFsc28iIGxpbmtzIHRvIHRoZSBuZXcgZG9jcyBhcmUgbm93IHByb3ZpZGVkIGluIHRoZSBsZWdhY3kgcGFnZXMKQEAgLTkxNSw2ICsyMTA5LDkgQEAKIC0gSXNzdWUgIzIxOTE2OiBBZGRlZCB0ZXN0cyBmb3IgdGhlIHR1cnRsZSBtb2R1bGUuICBQYXRjaCBieSBpbmdyaWQsCiAgIEdyZWdvcnkgTG95c2UgYW5kIEplbGxlIFppamxzdHJhLgogCistIElzc3VlICMyNjI5NTogV2hlbiB1c2luZyAicHl0aG9uMyAtbSB0ZXN0IC0tdGVzdGRpcj1URVNURElSIiwgcmVncnRlc3QKKyAgZG9lc24ndCBhZGQgInRlc3QuIiBwcmVmaXggdG8gdGVzdCBtb2R1bGUgbmFtZXMuCisKIC0gSXNzdWUgIzI2NTIzOiBUaGUgbXVsdGlwcm9jZXNzaW5nIHRocmVhZCBwb29sIChtdWx0aXByb2Nlc3NpbmcuZHVtbXkuUG9vbCkKICAgd2FzIHVudGVzdGVkLgogCkBAIC05MjMsMzEgKzIxMjAsNTAgQEAKIC0gSXNzdWUgIzI2MzI1OiBBZGRlZCB0ZXN0LnN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpIHRvIGNoZWNrIHRoYXQKICAgbm8gUmVzb3VyY2VXYXJuaW5nIGlzIGVtaXR0ZWQuCiAKLS0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldC4gIFRoaXMKKy0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBpdHMgaW50ZXJuYWwgbG9jYWwgc2VydmVyIG1vcmUuICBUaGlzCiAgIGF2b2lkcyByZWx5aW5nIG9uIHN2bi5weXRob24ub3JnLCB3aGljaCByZWNlbnRseSBjaGFuZ2VkIHJvb3QgY2VydGlmaWNhdGUuCiAKIC0gSXNzdWUgIzI1NjE2OiBUZXN0cyBmb3IgT3JkZXJlZERpY3QgYXJlIGV4dHJhY3RlZCBmcm9tIHRlc3RfY29sbGVjdGlvbnMKICAgaW50byBzZXBhcmF0ZSBmaWxlIHRlc3Rfb3JkZXJlZF9kaWN0LgogCistIElzc3VlICMyNTQ0OTogQWRkZWQgdGVzdHMgZm9yIE9yZGVyZWREaWN0IHN1YmNsYXNzZXMuCisKKy0gSXNzdWUgIzI1MTg4OiBBZGQgLVAvLS1wZ28gdG8gdGVzdC5yZWdydGVzdCB0byBzdXBwcmVzcyBlcnJvciBvdXRwdXQgd2hlbgorICBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciB0aGUgcHVycG9zZXMgb2YgYSBQR08gYnVpbGQuIEluaXRpYWwgcGF0Y2ggYnkKKyAgQWxlY3NhbmRydSBQYXRyYXNjdS4KKworLSBJc3N1ZSAjMjI4MDY6IEFkZCBgYHB5dGhvbiAtbSB0ZXN0IC0tbGlzdC10ZXN0c2BgIGNvbW1hbmQgdG8gbGlzdCB0ZXN0cy4KKworLSBJc3N1ZSAjMTgxNzQ6IGBgcHl0aG9uIC1tIHRlc3QgLS1odW50cmxlYWtzIC4uLmBgIG5vdyBhbHNvIGNoZWNrcyBmb3IgbGVhayBvZgorICBmaWxlIGRlc2NyaXB0b3JzLiBQYXRjaCB3cml0dGVuIGJ5IFJpY2hhcmQgT3Vka2Vyay4KKworLSBJc3N1ZSAjMjUyNjA6IEZpeCBgYHB5dGhvbiAtbSB0ZXN0IC0tY292ZXJhZ2VgYCBvbiBXaW5kb3dzLiBSZW1vdmUgdGhlCisgIGxpc3Qgb2YgaWdub3JlZCBkaXJlY3Rvcmllcy4KKworLSBgYFBDYnVpbGRccnQuYmF0YGAgbm93IGFjY2VwdHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcGFzcyBhbG9uZworICB0byByZWdydGVzdC5weS4gIFByZXZpb3VzbHkgdGhlcmUgd2FzIGEgbGltaXQgb2YgOS4KKwogLSBJc3N1ZSAjMjY1ODM6IFNraXAgdGVzdF90aW1lc3RhbXBfb3ZlcmZsb3cgaW4gdGVzdF9pbXBvcnQgaWYgYnl0ZWNvZGUKICAgZmlsZXMgY2Fubm90IGJlIHdyaXR0ZW4uCiAKIEJ1aWxkCiAtLS0tLQogCistIElzc3VlICMyMTI3NzogRG9uJ3QgdHJ5IHRvIGxpbmsgX2N0eXBlcyB3aXRoIGEgZmZpX2NvbnZlbmllbmNlIGxpYnJhcnkuCisKIC0gSXNzdWUgIzI2ODg0OiBGaXggbGlua2luZyBleHRlbnNpb24gbW9kdWxlcyBmb3IgY3Jvc3MgYnVpbGRzLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIAorLSBJc3N1ZSAjMjY5MzI6IEZpeGVkIHN1cHBvcnQgb2YgUlRMRF8qIGNvbnN0YW50cyBkZWZpbmVkIGFzIGVudW0gdmFsdWVzLAorICBub3QgdmlhIG1hY3JvcyAoaW4gcGFydGljdWxhciBvbiBBbmRyb2lkKS4gIFBhdGNoIGJ5IENoaSBIc3VhbiBZZW4uCisKIC0gSXNzdWUgIzIyMzU5OiBEaXNhYmxlIHRoZSBydWxlcyBmb3IgcnVubmluZyBfZnJlZXplX2ltcG9ydGxpYiBhbmQgcGdlbiB3aGVuCiAgIGNyb3NzLWNvbXBpbGluZy4gIFRoZSBvdXRwdXQgb2YgdGhlc2UgcHJvZ3JhbXMgaXMgbm9ybWFsbHkgc2F2ZWQgd2l0aCB0aGUKICAgc291cmNlIGNvZGUgYW55d2F5LCBhbmQgaXMgc3RpbGwgcmVnZW5lcmF0ZWQgd2hlbiBkb2luZyBhIG5hdGl2ZSBidWlsZC4KICAgUGF0Y2ggYnkgWGF2aWVyIGRlIEdheWUuCiAKLS0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKLSAgYnkgWGF2aWVyIGRlIEdheWUuCi0KIC0gSXNzdWUgIzIxNjY4OiBMaW5rIGF1ZGlvb3AsIF9kYXRldGltZSwgX2N0eXBlc190ZXN0IG1vZHVsZXMgdG8gbGlibSwKLSAgZXhjZXB0IG9uIE1hYyBPUyBYLiBQYXRjaCB3cml0dGVuIGJ5IFhhdmllciBkZSBHYXllLgorICBleGNlcHQgb24gTWFjIE9TIFguIFBhdGNoIHdyaXR0ZW4gYnkgQ2hpIEhzdWFuIFllbi4KIAogLSBJc3N1ZSAjMjU3MDI6IEEgLS13aXRoLWx0byBjb25maWd1cmUgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRoYXQgd2lsbAogICBlbmFibGUgbGluayB0aW1lIG9wdGltaXphdGlvbnMgYXQgYnVpbGQgdGltZSBkdXJpbmcgYSBtYWtlIHByb2ZpbGUtb3B0LgpAQCAtOTY2LDIyICsyMTgyLDI0IEBACiAKIC0gSXNzdWUgIzI2NDY1OiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJnLgogCi0tIElzc3VlICMyNDQyMTogQ29tcGlsZSBNb2R1bGVzL19tYXRoLmMgb25jZSwgYmVmb3JlIGJ1aWxkaW5nIGV4dGVuc2lvbnMuCi0gIFByZXZpb3VzbHkgaXQgY291bGQgZmFpbCB0byBjb21waWxlIHByb3Blcmx5IGlmIHRoZSBtYXRoIGFuZCBjbWF0aCBidWlsZHMKLSAgd2VyZSBjb25jdXJyZW50LgotCiAtIElzc3VlICMyNTM0ODogQWRkZWQgYGAtLXBnb2BgIGFuZCBgYC0tcGdvLWpvYmBgIGFyZ3VtZW50cyB0bwogICBgYFBDYnVpbGRcYnVpbGQuYmF0YGAgZm9yIGJ1aWxkaW5nIHdpdGggUHJvZmlsZS1HdWlkZWQgT3B0aW1pemF0aW9uLiAgVGhlCi0gIG9sZCBgYFBDYnVpbGRcYnVpbGRfcGdvLmJhdGBgIHNjcmlwdCBpcyBub3cgZGVwcmVjYXRlZCwgYW5kIHNpbXBseSBjYWxscwotICBgYFBDYnVpbGRcYnVpbGQuYmF0IC0tcGdvICUqYGAuCisgIG9sZCBgYFBDYnVpbGRcYnVpbGRfcGdvLmJhdGBgIHNjcmlwdCBpcyByZW1vdmVkLgogCiAtIElzc3VlICMyNTgyNzogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpdGggSUNDIHRvIGBgY29uZmlndXJlYGAsIGluY2x1ZGluZwogICBhIG5ldyBgYC0td2l0aC1pY2NgYCBmbGFnLgogCiAtIElzc3VlICMyNTY5NjogRml4IGluc3RhbGxhdGlvbiBvZiBQeXRob24gb24gVU5JWCB3aXRoIG1ha2UgLWo5LgogCi0tIElzc3VlICMyNjkzMDogVXBkYXRlIE9TIFggMTAuNSsgMzItYml0LW9ubHkgaW5zdGFsbGVyIHRvIGJ1aWxkCi0gIGFuZCBsaW5rIHdpdGggT3BlblNTTCAxLjAuMmguCistIElzc3VlICMyNDk4NjogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGJ1aWxkIFB5dGhvbiBvbiBXaW5kb3dzIHdpdGhvdXQgZXJyb3JzCisgIHdoZW4gZXh0ZXJuYWwgbGlicmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlLgorCistIElzc3VlICMyNDQyMTogQ29tcGlsZSBNb2R1bGVzL19tYXRoLmMgb25jZSwgYmVmb3JlIGJ1aWxkaW5nIGV4dGVuc2lvbnMuCisgIFByZXZpb3VzbHkgaXQgY291bGQgZmFpbCB0byBjb21waWxlIHByb3Blcmx5IGlmIHRoZSBtYXRoIGFuZCBjbWF0aCBidWlsZHMKKyAgd2VyZSBjb25jdXJyZW50LgorCistIElzc3VlICMyNjQ2NTogVXBkYXRlIE9TIFggMTAuNSsgMzItYml0LW9ubHkgaW5zdGFsbGVyIHRvIGJ1aWxkCisgIGFuZCBsaW5rIHdpdGggT3BlblNTTCAxLjAuMmcuCiAKIC0gSXNzdWUgIzI2MjY4OiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJmLgogCkBAIC0xMDA4LDYgKzIyMjYsOCBAQAogLSBJc3N1ZSAjMjYwNjU6IEV4Y2x1ZGVzIHZlbnYgZnJvbSBsaWJyYXJ5IHdoZW4gZ2VuZXJhdGluZyBlbWJlZGRhYmxlCiAgIGRpc3Ryby4KIAorLSBJc3N1ZSAjMjUwMjI6IFJlbW92ZWQgdmVyeSBvdXRkYXRlZCBQQy9leGFtcGxlX250LyBkaXJlY3RvcnkuCisKIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQogCkBAIC0xMDI0LDExICsyMjQ0LDIxIEBACiAKIC0gSXNzdWUgIzI2MzE2OiBGaXggdmFyaWFibGUgbmFtZSB0eXBvIGluIEFyZ3VtZW50IENsaW5pYy4KIAotTWlzYwotLS0tLQorLSBJc3N1ZSAjMjU0NDA6IEZpeCBvdXRwdXQgb2YgcHl0aG9uLWNvbmZpZyAtLWV4dGVuc2lvbi1zdWZmaXguCiAKLS0gSXNzdWUgIzE3NTAwLCBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9weXRob25kb3RvcmcvaXNzdWVzLzk0NTogUmVtb3ZlCi0gIHVudXNlZCBhbmQgb3V0ZGF0ZWQgaWNvbnMuCistIElzc3VlICMyNTE1NDogVGhlIHB5dmVudiBzY3JpcHQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YKKyAgYHB5dGhvbjMgLW0gdmVudmAuCisKK0MgQVBJCistLS0tLQorCistIElzc3VlICMyNjMxMjogU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZCBpbiBhbGwgcHJvZ3JhbW1pbmcgYnVncyB3aXRoIHVzaW5nCisgIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpLiAgUnVudGltZUVycm9yIGRpZCByYWlzZWQgYmVmb3JlIGluIHNvbWUKKyAgcHJvZ3JhbW1pbmcgYnVncy4KKworLSBJc3N1ZSAjMjYxOTg6IFZhbHVlRXJyb3IgaXMgbm93IHJhaXNlZCBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBidWZmZXIKKyAgb3ZlcmZsb3cgaW4gcGFyc2luZyAiZXMjIiBhbmQgImV0IyIgZm9ybWF0IHVuaXRzLiAgU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZAorICBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBwcm9ncmFtbWljYWwgZXJyb3IgaW4gcGFyc2luZyBmb3JtYXQgc3RyaW5nLgogCiAKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4xIGZpbmFsPwpAQCAtMTQ1MCw5ICsyNjgwLDYgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMjI1NTg6IEFkZCByZW1haW5pbmcgZG9jIGxpbmtzIHRvIHNvdXJjZSBjb2RlIGZvciBQeXRob24tY29kZWQgbW9kdWxlcy4KLSAgUGF0Y2ggYnkgWW9uaSBMYXZpLgotCiAtIElzc3VlICMxMjA2NzogUmV3cml0ZSBDb21wYXJpc29ucyBzZWN0aW9uIGluIHRoZSBFeHByZXNzaW9ucyBjaGFwdGVyIG9mIHRoZQogICBsYW5ndWFnZSByZWZlcmVuY2UuIFNvbWUgb2YgdGhlIGRldGFpbHMgb2YgY29tcGFyaW5nIG1peGVkIHR5cGVzIHdlcmUKICAgaW5jb3JyZWN0IG9yIGFtYmlndW91cy4gTm90SW1wbGVtZW50ZWQgaXMgb25seSByZWxldmFudCBhdCBhIGxvd2VyIGxldmVsCkBAIC0xNzgyLDEyICszMDA5LDYgQEAKIAogLSBJc3N1ZSAjMjQ2MzE6IEZpeGVkIHJlZ3Jlc3Npb24gaW4gdGhlIHRpbWVpdCBtb2R1bGUgd2l0aCBtdWx0aWxpbmUgc2V0dXAuCiAKLS0gSXNzdWUgIzE4NjIyOiB1bml0dGVzdC5tb2NrLm1vY2tfb3BlbigpLnJlc2V0X21vY2sgd291bGQgcmVjdXJzZSBpbmZpbml0ZWx5LgotICBQYXRjaCBmcm9tIE5pY29sYSBQYWx1bWJvIGFuZCBMYXVyZW50IERlIEJ1eXN0LgotCi0tIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCi0gIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCi0KIC0gSXNzdWUgIzI0NjA4OiBjaHVuay5DaHVuay5yZWFkKCkgbm93IGFsd2F5cyByZXR1cm5zIGJ5dGVzLCBub3Qgc3RyLgogCiAtIElzc3VlICMxODY4NDogRml4ZWQgcmVhZGluZyBvdXQgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcmUgbW9kdWxlLgpAQCAtMTc5OCw2ICszMDE5LDkgQEAKIC0gSXNzdWUgIzE1MDE0OiBTTVRQLmF1dGgoKSBhbmQgU01UUC5sb2dpbigpIG5vdyBzdXBwb3J0IFJGQyA0OTU0J3Mgb3B0aW9uYWwKICAgaW5pdGlhbC1yZXNwb25zZSBhcmd1bWVudCB0byB0aGUgU01UUCBBVVRIIGNvbW1hbmQuCiAKKy0gSXNzdWUgIzY1NDk6IFJlbW92ZSBoeXBoZW4gZnJvbSB0dGsuU3R5bGUoKS5lbGVtZW50IG9wdGlvbnMuICBPbmx5IHJldHVybiByZXN1bHQKKyAgZnJvbSB0dGsuU3R5bGUoKS5jb25maWd1cmUgaWYgYSByZXN1bHQgd2FzIGdlbmVyYXRlZCBvciBhIHF1ZXJ5IHN1Ym1pdHRlZC4KKwogLSBJc3N1ZSAjMjQ2Njk6IEZpeCBpbnNwZWN0LmdldHNvdXJjZSgpIGZvciAnYXN5bmMgZGVmJyBmdW5jdGlvbnMuCiAgIFBhdGNoIGJ5IEthaSBHcm9uZXIuCiAKQEAgLTE4MDksNyArMzAzMyw2IEBACiAtIElzc3VlICMyNDYwMzogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIGFuZCBPUyBYIDEwLjUgaW5zdGFsbGVyIHRvIHVzZSBPcGVuU1NMCiAgIDEuMC4yZC4KIAotCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMCBiZXRhIDM/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE5NzAsNiArMzE5Myw5IEBACiAtIElzc3VlICMyNDI2ODogUEVQIDQ4OTogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbi4KICAgUGF0Y2ggYnkgUGV0ciBWaWt0b3Jpbi4KIAorLSBJc3N1ZSAjMjMzNTk6IE9wdGltaXplIHNldCBvYmplY3QgaW50ZXJuYWxzIGJ5IHNwZWNpYWxpemluZyB0aGUKKyAgaGFzaCB0YWJsZSBzZWFyY2ggaW50byBhIGxvb2t1cCBmdW5jdGlvbiBhbmQgYW4gaW5zZXJ0IGZ1bmN0aW9uLgorCiAtIElzc3VlICMyMzk1NTogQWRkIHB5dmVudi5jZmcgb3B0aW9uIHRvIHN1cHByZXNzIHJlZ2lzdHJ5L2Vudmlyb25tZW50CiAgIGxvb2t1cCBmb3IgZ2VuZXJhdGluZyBzeXMucGF0aCBvbiBXaW5kb3dzLgogCkBAIC0yMDkwLDggKzMzMTYsOCBAQAogLSBJc3N1ZSAjMTMyMjogcGxhdGZvcm0uZGlzdCgpIGFuZCBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb24oKSBmdW5jdGlvbnMgYXJlCiAgIG5vdyBkZXByZWNhdGVkLiAgSW5pdGlhbCBwYXRjaCBieSBWYWpyYXNreSBLb2suCiAKLS0gSXNzdWUgIzIyNDg2OiBBZGRlZCB0aGUgbWF0aC5nY2QoKSBmdW5jdGlvbi4gIFRoZSBmcmFjdGlvbnMuZ2NkKCkgZnVuY3Rpb24KLSAgbm93IGlzIGRlcHJlY2F0ZWQuICBCYXNlZCBvbiBwYXRjaCBieSBNYXJrIERpY2tpbnNvbi4KKy0gSXNzdWUgIzIyNDg2OiBBZGRlZCB0aGUgbWF0aC5nY2QoKSBmdW5jdGlvbi4gIFRoZSBmcmFjdGlvbnMuZ2NkKCkgZnVuY3Rpb24gbm93IGlzCisgIGRlcHJlY2F0ZWQuICBCYXNlZCBvbiBwYXRjaCBieSBNYXJrIERpY2tpbnNvbi4KIAogLSBJc3N1ZSAjMjQwNjQ6IFByb3BlcnR5KCkgZG9jc3RyaW5ncyBhcmUgbm93IHdyaXRlYWJsZS4KICAgKFBhdGNoIGJ5IEJlcmtlciBQZWtzYWcuKQpAQCAtMjUxMiw4ICszNzM4LDggQEAKICAgd3JpdGVyIGZhaWxlZCBpbiBCdWZmZXJlZFJXUGFpci5jbG9zZSgpLgogCiAtIElzc3VlICMyMzYyMjogVW5rbm93biBlc2NhcGVzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBjb25zaXN0IG9mIGBgJ1wnYGAKLSAgYW5kIEFTQ0lJIGxldHRlciBub3cgcmFpc2UgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCB3aWxsIGJlIGZvcmJpZGRlbiBpbgotICBQeXRob24gMy42LgorICBhbmQgYW4gQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuCisgIGluIFB5dGhvbiAzLjYuCiAKIC0gSXNzdWUgIzIzNjcxOiBzdHJpbmcuVGVtcGxhdGUgbm93IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSAic2VsZiIgcGFyYW1ldGVyIGFzCiAgIGEga2V5d29yZCBhcmd1bWVudC4gIHN0cmluZy5Gb3JtYXR0ZXIgbm93IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSAic2VsZiIgYW5kCkBAIC00NTYxLDcgKzU3ODcsNyBAQAogCiAtIElzc3VlICMyMjEyMDogRm9yIGZ1bmN0aW9ucyB1c2luZyBhbiB1bnNpZ25lZCBpbnRlZ2VyIHJldHVybiBjb252ZXJ0ZXIsCiAgIEFyZ3VtZW50IENsaW5pYyBub3cgZ2VuZXJhdGVzIGEgY2FzdCB0byB0aGF0IHR5cGUgZm9yIHRoZSBjb21wYXJpc29uCi0gIHRvIC0xIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIChUaGlzIHN1cHJlc3NlcyBhIGNvbXBpbGF0aW9uIHdhcm5pbmcuKQorICB0byAtMSBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICAoVGhpcyBzdXBwcmVzc2VzIGEgY29tcGlsYXRpb24gd2FybmluZy4pCiAKIC0gSXNzdWUgIzE4OTc0OiBUb29scy9zY3JpcHRzL2RpZmYucHkgbm93IHVzZXMgYXJncGFyc2UgaW5zdGVhZCBvZiBvcHRwYXJzZS4KIApAQCAtNTY2MSw3ICs2ODg3LDcgQEAKIAogLSBJc3N1ZSAjMTk0NjY6IENsZWFyIHRoZSBmcmFtZXMgb2YgZGFlbW9uIHRocmVhZHMgZWFybGllciBkdXJpbmcgdGhlCiAgIFB5dGhvbiBzaHV0ZG93biB0byBjYWxsIG9iamVjdHMgZGVzdHJ1Y3RvcnMuIFNvICJ1bmNsb3NlZCBmaWxlIiByZXNvdXJjZQotICB3YXJuaW5ncyBhcmUgbm93IGNvcnJldGx5IGVtaXR0ZWQgZm9yIGRhZW1vbiB0aHJlYWRzLgorICB3YXJuaW5ncyBhcmUgbm93IGNvcnJlY3RseSBlbWl0dGVkIGZvciBkYWVtb24gdGhyZWFkcy4KIAogLSBJc3N1ZSAjMTk1MTQ6IERlZHVwbGljYXRlIHNvbWUgX1B5X0lERU5USUZJRVIgZGVjbGFyYXRpb25zLgogICBQYXRjaCBieSBBbmRyZWkgRG9yaWFuIER1bWEuCkBAIC02NTkxLDcgKzc4MTcsNyBAQAogCiAtIElzc3VlICMxODcwOTogRml4IENWRS0yMDEzLTQyMzguIFRoZSBTU0wgbW9kdWxlIG5vdyBoYW5kbGVzIE5VTEwgYnl0ZXMKICAgaW5zaWRlIHN1YmplY3RBbHROYW1lIGNvcnJlY3RseS4gRm9ybWVybHkgdGhlIG1vZHVsZSBoYXMgdXNlZCBPcGVuU1NMJ3MKLSAgR0VORVJBTF9OQU1FX3ByaW50KCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50aW9uIG9mIEFTTi4xCisgIEdFTkVSQUxfTkFNRV9wcmludCgpIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIEFTTi4xCiAgIHN0cmluZ3MgZm9yIGBgcmZjODIyTmFtZWBgIChlbWFpbCksIGBgZE5TTmFtZWBgIChETlMpIGFuZAogICBgYHVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXJgYCAoVVJJKS4KIApAQCAtNjY4NCw3ICs3OTEwLDcgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMTg3NDM6IEZpeCByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGFudCAiU3RyaW5nSU8iIG1vZHVsZS4KKy0gSXNzdWUgIzE4NzQzOiBGaXggcmVmZXJlbmNlcyB0byBub24tZXhpc3RlbnQgIlN0cmluZ0lPIiBtb2R1bGUuCiAKIC0gSXNzdWUgIzE4NzgzOiBSZW1vdmVkIGV4aXN0aW5nIG1lbnRpb25zIG9mIFB5dGhvbiBsb25nIHR5cGUgaW4gZG9jc3RyaW5ncywKICAgZXJyb3IgbWVzc2FnZXMgYW5kIGNvbW1lbnRzLgpAQCAtNzYyMyw3ICs4ODQ5LDcgQEAKICAgc3BlY2lmaWNhbGx5IGFkZHJlc3NlcyBhIHN0YWNrIG1pc2FsaWdubWVudCBpc3N1ZSBvbiB4ODYgYW5kIGlzc3VlcyBvbgogICBzb21lIG1vcmUgcmVjZW50IHBsYXRmb3Jtcy4KIAotLSBJc3N1ZSAjODg2MjogRml4ZWQgY3Vyc2VzIGNsZWFudXAgd2hlbiBnZXRrZXkgaXMgaW50ZXJycHV0ZWQgYnkgYSBzaWduYWwuCistIElzc3VlICM4ODYyOiBGaXhlZCBjdXJzZXMgY2xlYW51cCB3aGVuIGdldGtleSBpcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KIAogLSBJc3N1ZSAjMTc0NDM6IGltYXBsaWIuSU1BUDRfc3RyZWFtIHdhcyB1c2luZyB0aGUgZGVmYXVsdCB1bmJ1ZmZlcmVkIElPCiAgIGluIHN1YnByb2Nlc3MsIGJ1dCB0aGUgaW1hcCBjb2RlIGFzc3VtZXMgYnVmZmVyZWQgSU8uICBJbiBQeXRob24yIHRoaXMKZGlmZiAtLWdpdCBhL01pc2MvUkVBRE1FLnZhbGdyaW5kIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKaW5kZXggYjVhOWEzMi4uOTA4ZjEzNyAxMDA2NDQKLS0tIGEvTWlzYy9SRUFETUUudmFsZ3JpbmQKKysrIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKQEAgLTIsNiArMiw5IEBACiBQeXRob24uICBWYWxncmluZCBpcyB1c2VkIHBlcmlvZGljYWxseSBieSBQeXRob24gZGV2ZWxvcGVycyB0byB0cnkKIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbWVtb3J5IGxlYWtzIG9yIGludmFsaWQgbWVtb3J5IHJlYWRzL3dyaXRlcy4KIAorVVBEQVRFOiBQeXRob24gMy42IG5vdyBzdXBwb3J0cyBQWVRIT05NQUxMT0M9bWFsbG9jIGVudmlyb25tZW50IHZhcmlhYmxlIHdoaWNoCitjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIG1hbGxvYygpIGFsbG9jYXRvciBvZiB0aGUgQyBsaWJyYXJ5LgorCiBJZiB5b3UgZG9uJ3Qgd2FudCB0byByZWFkIGFib3V0IHRoZSBkZXRhaWxzIG9mIHVzaW5nIFZhbGdyaW5kLCB0aGVyZQogYXJlIHN0aWxsIHR3byB0aGluZ3MgeW91IG11c3QgZG8gdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLiAgRmlyc3QsCiB5b3UgbXVzdCB1c2UgYSBzdXBwcmVzc2lvbnMgZmlsZS4gIE9uZSBpcyBzdXBwbGllZCBpbgpkaWZmIC0tZ2l0IGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dCBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKaW5kZXggMzAwNDE3NC4uNGI2NzNmZCAxMDA2NDQKLS0tIGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAorKysgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CkBAIC02NSw5ICs2NSw5IEBACiAgICAgc2ltcGx5IGJ5IHZpcnR1ZSBvZiBiZWluZyBpbiB0aGUgbGlzdC4KIAogZW52dmFyIFBZVEhPTkRVTVBSRUZTCi0gICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBQeV9GaW5hbGl6ZSgpIGFycmFuZ2VzIHRvIHByaW50IGEgbGlzdCBvZiBhbGwKKyAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIFB5X0ZpbmFsaXplRXgoKSBhcnJhbmdlcyB0byBwcmludCBhIGxpc3Qgb2YgYWxsCiAgICAgc3RpbGwtbGl2ZSBoZWFwIG9iamVjdHMuICBUaGlzIGlzIHByaW50ZWQgdHdpY2UsIGluIGRpZmZlcmVudCBmb3JtYXRzLAotICAgIGJlZm9yZSBhbmQgYWZ0ZXIgUHlfRmluYWxpemUgaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKKyAgICBiZWZvcmUgYW5kIGFmdGVyIFB5X0ZpbmFsaXplRXggaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKICAgICBmaXJzdCBvdXRwdXQgYmxvY2sgcHJvZHVjZXMgdGhlIHJlcHIoKSBvZiBlYWNoIG9iamVjdCBzbyBpcyBtb3JlCiAgICAgaW5mb3JtYXRpdmU7IGhvd2V2ZXIsIGEgbG90IG9mIHN0dWZmIGRlc3RpbmVkIHRvIGRpZSBpcyBzdGlsbCBhbGl2ZSB0aGVuLgogICAgIFRoZSBzZWNvbmQgb3V0cHV0IGJsb2NrIGlzIG11Y2ggaGFyZGVyIHRvIHdvcmsgd2l0aCAocmVwcigpIGNhbid0IGJlIGludm9rZWQKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBlbnZ2YXIgUFlUSE9OTUFMTE9DU1RBVFMKICAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIGEgcmVwb3J0IG9mIHB5bWFsbG9jIHN1bW1hcnkgc3RhdGlzdGljcyBpcyBwcmludGVkIHRvCi0gICAgc3RkZXJyIHdoZW5ldmVyIGEgbmV3IGFyZW5hIGlzIGFsbG9jYXRlZCwgYW5kIGFsc28gYnkgUHlfRmluYWxpemUoKS4KKyAgICBzdGRlcnIgd2hlbmV2ZXIgYSBuZXcgYXJlbmEgaXMgYWxsb2NhdGVkLCBhbmQgYWxzbyBieSBQeV9GaW5hbGl6ZUV4KCkuCiAKIENoYW5nZWQgaW4gMi41OiAgVGhlIG51bWJlciBvZiBleHRyYSBieXRlcyBhbGxvY2F0ZWQgaXMgNCpzaXplb2Yoc2l6ZV90KS4KIEJlZm9yZSBpdCB3YXMgMTYgb24gYWxsIGJveGVzLCByZWZsZWN0aW5nIHRoYXQgUHl0aG9uIGNvdWxkbid0IG1ha2UgdXNlIG9mCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgKi8KICAgICBpbnQgdHBfbWF4YWxsb2M7CiAKLUFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBjb2RlIGtlZXBzIHRoZXNlIGNvdW50cyB1cCB0byBkYXRlLiAgUHlfRmluYWxpemUoKQorQWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGNvZGUga2VlcHMgdGhlc2UgY291bnRzIHVwIHRvIGRhdGUuICBQeV9GaW5hbGl6ZUV4KCkKIGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgaW5mbyByZXR1cm5lZCBieSBzeXMuZ2V0Y291bnRzKCkgKHNlZSBiZWxvdyksIGFsb25nCiB3aXRoIGFzc29ydGVkIG90aGVyIHNwZWNpYWwgYWxsb2NhdGlvbiBjb3VudHMgKGxpa2UgdGhlIG51bWJlciBvZiB0dXBsZQogYWxsb2NhdGlvbnMgc2F0aXNmaWVkIGJ5IGEgdHVwbGUgZnJlZS1saXN0LCB0aGUgbnVtYmVyIG9mIDEtY2hhcmFjdGVyIHN0cmluZ3MKZGlmZiAtLWdpdCBhL01pc2MvY292ZXJpdHlfbW9kZWwuYyBiL01pc2MvY292ZXJpdHlfbW9kZWwuYwppbmRleCA0ODg2MDRjLi5kMTdjNjA3IDEwMDY0NAotLS0gYS9NaXNjL2NvdmVyaXR5X21vZGVsLmMKKysrIGIvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjZGVmaW5lIGFzc2VydChvcCkgLyogZW1wdHkgKi8KIHR5cGVkZWYgaW50IHNkaWdpdDsKIHR5cGVkZWYgbG9uZyBQeV9zc2l6ZV90OwotdHlwZWRlZiBsb25nIGxvbmcgUFlfTE9OR19MT05HOwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3Y2hhcl90OwogdHlwZWRlZiBzdHJ1Y3Qge30gUHlPYmplY3Q7CiB0eXBlZGVmIHN0cnVjdCB7fSBncmFtbWFyOwpAQCAtNjMsNyArNjIsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIH0KIAotUHlPYmplY3QgKlB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HIGl2YWwpCitQeU9iamVjdCAqUHlMb25nX0Zyb21Mb25nTG9uZyhsb25nIGxvbmcgaXZhbCkKIHsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKWl2YWwpOwogfQpAQCAtOTQsNyArOTMsNyBAQAogfQogCiAvKiBQYXJzZXIvcGdlbm1haW4uYyAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSkKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgZ3JhbW1hciAqZzsKICAgICBfX2NvdmVyaXR5X3RhaW50ZWRfZGF0YV9zaW5rX18oZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwppbmRleCAwMmI1NWQxLi4yMmRkYmYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwpAQCAtMTIsNyArMTIsOCBAQAogaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CkBAIC0xMTUsNyArMTE2LDggQEAKIGludGVybmFsX2Jpc2VjdF9sZWZ0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYjJzLnB5IGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmIycy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWNmMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMmIycy5weQpAQCAtMCwwICsxLDQ5IEBACisjIS91c3IvYmluL3B5dGhvbjMKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworSEVSRSA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorQkxBS0UyID0gb3MucGF0aC5qb2luKEhFUkUsICdpbXBsJykKKworUFVCTElDX1NFQVJDSCA9IHJlLmNvbXBpbGUocidcIGludCAoYmxha2UyW2JzXXA/W2Etel9dKilcKCcpCisKKworZGVmIGdldGZpbGVzKCk6CisgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihCTEFLRTIpOgorICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKEJMQUtFMiwgbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUobmFtZSk6CisgICAgICAgICAgICB5aWVsZCBuYW1lCisKKworZGVmIGZpbmRfcHVibGljKCk6CisgICAgcHVibGljX2Z1bmNzID0gc2V0KCkKKyAgICBmb3IgbmFtZSBpbiBnZXRmaWxlcygpOgorICAgICAgICB3aXRoIG9wZW4obmFtZSkgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgIyBmaW5kIHB1YmxpYyBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICBtbyA9IFBVQkxJQ19TRUFSQ0guc2VhcmNoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbW86CisgICAgICAgICAgICAgICAgICAgIHB1YmxpY19mdW5jcy5hZGQobW8uZ3JvdXAoMSkpCisKKyAgICBmb3IgZiBpbiBzb3J0ZWQocHVibGljX2Z1bmNzKToKKyAgICAgICAgcHJpbnQoJyNkZWZpbmUgezA6PDE4fSBQeUJsYWtlMl97MH0nLmZvcm1hdChmKSkKKworICAgIHJldHVybiBwdWJsaWNfZnVuY3MKKworCitkZWYgbWFpbigpOgorICAgIGxpbmVzID0gW10KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKEhFUkUsICdibGFrZTJiX2ltcGwuYycpKSBhcyBmOgorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnYmxha2UyYicsICdibGFrZTJzJykKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ0JMQUtFMmInLCAnQkxBS0UycycpCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdCTEFLRTJCJywgJ0JMQUtFMlMnKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihIRVJFLCAnYmxha2Uyc19pbXBsLmMnKSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKCcnLmpvaW4obGluZXMpKQorICAgICMgZmluZF9wdWJsaWMoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYl9pbXBsLmMgYi9Nb2R1bGVzL19ibGFrZTIvYmxha2UyYl9pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2Nzc0NAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJiX2ltcGwuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIFdyaXR0ZW4gaW4gMjAxMyBieSBEbWl0cnkgQ2hlc3RueWtoIDxkbWl0cnlAY29kaW5ncm9ib3RzLmNvbT4KKyAqIE1vZGlmaWVkIGZvciBDUHl0aG9uIGJ5IENocmlzdGlhbiBIZWltZXMgPGNocmlzdGlhbkBweXRob24ub3JnPgorICoKKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhdmUgZGVkaWNhdGVkIGFsbAorICogY29weXJpZ2h0IGFuZCByZWxhdGVkIGFuZCBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyBzb2Z0d2FyZSB0bworICogdGhlIHB1YmxpYyBkb21haW4gd29ybGR3aWRlLiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQKKyAqIGFueSB3YXJyYW50eS4gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCisKKy8qIFdBUk5JTkc6IGF1dG9nZW5lcmF0ZWQgZmlsZSEKKyAqCisgKiBUaGUgYmxha2Uyc19pbXBsLmMgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIGJsYWtlMmJfaW1wbC5jLgorICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXN0cmhleC5oIgorI2lmZGVmIFdJVEhfVEhSRUFECisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vaGFzaGxpYi5oIgorI2luY2x1ZGUgImJsYWtlMm5zLmgiCisKKyNkZWZpbmUgSEFWRV9CTEFLRTJCIDEKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBQeV9MT0NBTF9JTkxJTkUodHlwZSkKKworI2luY2x1ZGUgImltcGwvYmxha2UyLmgiCisjaW5jbHVkZSAiaW1wbC9ibGFrZTItaW1wbC5oIiAvKiBmb3Igc2VjdXJlX3plcm9fbWVtb3J5KCkgYW5kIHN0b3JlNDgoKSAqLworCisjaWZkZWYgQkxBS0UyX1VTRV9TU0UKKyNpbmNsdWRlICJpbXBsL2JsYWtlMmIuYyIKKyNlbHNlCisjaW5jbHVkZSAiaW1wbC9ibGFrZTJiLXJlZi5jIgorI2VuZGlmCisKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBibGFrZTJiX3BhcmFtICAgIHBhcmFtOworICAgIGJsYWtlMmJfc3RhdGUgICAgc3RhdGU7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyNlbmRpZgorfSBCTEFLRTJiT2JqZWN0OworCisjaW5jbHVkZSAiY2xpbmljL2JsYWtlMmJfaW1wbC5jLmgiCisKKy8qW2NsaW5pYyBpbnB1dF0KK21vZHVsZSBfYmxha2UyYgorY2xhc3MgX2JsYWtlMmIuYmxha2UyYiAiQkxBS0UyYk9iamVjdCAqIiAiJlB5Qmxha2UyX0JMQUtFMmJUeXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9Njg5MzM1OGM2NjIyYWVjZl0qLworCisKK3N0YXRpYyBCTEFLRTJiT2JqZWN0ICoKK25ld19CTEFLRTJiT2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICBCTEFLRTJiT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSAoQkxBS0UyYk9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc2VsZjsKK30KKworLypbY2xpbmljIGlucHV0XQorQGNsYXNzbWV0aG9kCitfYmxha2UyYi5ibGFrZTJiLl9fbmV3X18gYXMgcHlfYmxha2UyYl9uZXcKKyAgICBzdHJpbmcgYXMgZGF0YTogb2JqZWN0ID0gTlVMTAorICAgICoKKyAgICBkaWdlc3Rfc2l6ZTogaW50KGNfZGVmYXVsdD0iQkxBS0UyQl9PVVRCWVRFUyIpID0gX2JsYWtlMmIuYmxha2UyYi5NQVhfRElHRVNUX1NJWkUKKyAgICBrZXk6IFB5X2J1ZmZlciA9IE5vbmUKKyAgICBzYWx0OiBQeV9idWZmZXIgPSBOb25lCisgICAgcGVyc29uOiBQeV9idWZmZXIgPSBOb25lCisgICAgZmFub3V0OiBpbnQgPSAxCisgICAgZGVwdGg6IGludCA9IDEKKyAgICBsZWFmX3NpemUgYXMgbGVhZl9zaXplX29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfb2Zmc2V0IGFzIG5vZGVfb2Zmc2V0X29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfZGVwdGg6IGludCA9IDAKKyAgICBpbm5lcl9zaXplOiBpbnQgPSAwCisgICAgbGFzdF9ub2RlOiBib29sID0gRmFsc2UKKworUmV0dXJuIGEgbmV3IEJMQUtFMmIgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NTA2ZDhkODkwZTVmMTNiIGlucHV0PWU0MTU0OGRmYTA4NjYwMzFdKi8KK3sKKyAgICBCTEFLRTJiT2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYnVmOworCisgICAgdW5zaWduZWQgbG9uZyBsZWFmX3NpemUgPSAwOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBub2RlX29mZnNldCA9IDA7CisKKyAgICBzZWxmID0gbmV3X0JMQUtFMmJPYmplY3QodHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFplcm8gcGFyYW1ldGVyIGJsb2NrLiAqLworICAgIG1lbXNldCgmc2VsZi0+cGFyYW0sIDAsIHNpemVvZihzZWxmLT5wYXJhbSkpOworCisgICAgLyogU2V0IGRpZ2VzdCBzaXplLiAqLworICAgIGlmIChkaWdlc3Rfc2l6ZSA8PSAwIHx8IGRpZ2VzdF9zaXplID4gQkxBS0UyQl9PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZGlnZXN0X3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX09VVEJZVEVTKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9zaXplOworCisgICAgLyogU2V0IHNhbHQgcGFyYW1ldGVyLiAqLworICAgIGlmICgoc2FsdC0+b2JqICE9IE5VTEwpICYmIHNhbHQtPmxlbikgeworICAgICAgICBpZiAoc2FsdC0+bGVuID4gQkxBS0UyQl9TQUxUQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHNhbHQgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX1NBTFRCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5zYWx0LCBzYWx0LT5idWYsIHNhbHQtPmxlbik7CisgICAgfQorCisgICAgLyogU2V0IHBlcnNvbmFsaXphdGlvbiBwYXJhbWV0ZXIuICovCisgICAgaWYgKChwZXJzb24tPm9iaiAhPSBOVUxMKSAmJiBwZXJzb24tPmxlbikgeworICAgICAgICBpZiAocGVyc29uLT5sZW4gPiBCTEFLRTJCX1BFUlNPTkFMQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHBlcnNvbiBsZW5ndGggaXMgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIEJMQUtFMkJfUEVSU09OQUxCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5wZXJzb25hbCwgcGVyc29uLT5idWYsIHBlcnNvbi0+bGVuKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdHJlZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChmYW5vdXQgPCAwIHx8IGZhbm91dCA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmFub3V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZmFub3V0ID0gKHVpbnQ4X3QpZmFub3V0OworCisgICAgaWYgKGRlcHRoIDw9IDAgfHwgZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlcHRoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGVwdGggPSAodWludDhfdClkZXB0aDsKKworICAgIGlmIChsZWFmX3NpemVfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbGVhZl9zaXplID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGxlYWZfc2l6ZV9vYmopOworICAgICAgICBpZiAobGVhZl9zaXplID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFmX3NpemUgPiAweEZGRkZGRkZGVSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsZWFmX3NpemUgaXMgdG9vIGxhcmdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHNlbGYtPnBhcmFtLmxlYWZfbGVuZ3RoID0gKHVuc2lnbmVkIGludClsZWFmX3NpemU7CisKKyAgICBpZiAobm9kZV9vZmZzZXRfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZV9vZmZzZXQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG5vZGVfb2Zmc2V0X29iaik7CisgICAgICAgIGlmIChub2RlX29mZnNldCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfQkxBS0UyUworICAgIGlmIChub2RlX29mZnNldCA+IDB4RkZGRkZGRkZGRkZGVUxMKSB7CisgICAgICAgIC8qIG1heGltdW0gMioqNDggLSAxICovCisgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vZGVfb2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgfQorICAgIHN0b3JlNDgoJihzZWxmLT5wYXJhbS5ub2RlX29mZnNldCksIG5vZGVfb2Zmc2V0KTsKKyNlbHNlCisgICAgc2VsZi0+cGFyYW0ubm9kZV9vZmZzZXQgPSBub2RlX29mZnNldDsKKyNlbmRpZgorCisgICAgaWYgKG5vZGVfZGVwdGggPCAwIHx8IG5vZGVfZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIm5vZGVfZGVwdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKworICAgIGlmIChpbm5lcl9zaXplIDwgMCB8fCBpbm5lcl9zaXplID4gQkxBS0UyQl9PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW5uZXJfc2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgaXMgJWQiLAorICAgICAgICAgICAgICAgIEJMQUtFMkJfT1VUQllURVMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5pbm5lcl9sZW5ndGggPSBpbm5lcl9zaXplOworCisgICAgLyogU2V0IGtleSBsZW5ndGguICovCisgICAgaWYgKChrZXktPm9iaiAhPSBOVUxMKSAmJiBrZXktPmxlbikgeworICAgICAgICBpZiAoa2V5LT5sZW4gPiBCTEFLRTJCX0tFWUJZVEVTKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAibWF4aW11bSBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJCX0tFWUJZVEVTKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cGFyYW0ua2V5X2xlbmd0aCA9IGtleS0+bGVuOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgaGFzaCBzdGF0ZS4gKi8KKyAgICBpZiAoYmxha2UyYl9pbml0X3BhcmFtKCZzZWxmLT5zdGF0ZSwgJnNlbGYtPnBhcmFtKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZXJyb3IgaW5pdGlhbGl6aW5nIGhhc2ggc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBTZXQgbGFzdCBub2RlIGZsYWcgKG11c3QgY29tZSBhZnRlciBpbml0aWFsaXphdGlvbikuICovCisgICAgc2VsZi0+c3RhdGUubGFzdF9ub2RlID0gbGFzdF9ub2RlOworCisgICAgLyogUHJvY2VzcyBrZXkgYmxvY2sgaWYgYW55LiAqLworICAgIGlmIChzZWxmLT5wYXJhbS5rZXlfbGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyQl9CTE9DS0JZVEVTXTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgbWVtY3B5KGJsb2NrLCBrZXktPmJ1Ziwga2V5LT5sZW4pOworICAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgc2VjdXJlX3plcm9fbWVtb3J5KGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGluaXRpYWwgZGF0YSBpZiBhbnkuICovCisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1IoZGF0YSwgJmJ1ZiwgZ290byBlcnJvcik7CisKKyAgICAgICAgaWYgKGJ1Zi5sZW4gPj0gSEFTSExJQl9HSUxfTUlOU0laRSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmxha2UyYl91cGRhdGUoJnNlbGYtPnN0YXRlLCBidWYuYnVmLCBidWYubGVuKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgICB9CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKKyAgZXJyb3I6CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2UyYi5ibGFrZTJiLmNvcHkKKworUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM4OWNkMzM1NTBhYjE1NDMgaW5wdXQ9NGM5YzMxOWYxOGYxMDc0N10qLworeworICAgIEJMQUtFMmJPYmplY3QgKmNweTsKKworICAgIGlmICgoY3B5ID0gbmV3X0JMQUtFMmJPYmplY3QoUHlfVFlQRShzZWxmKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBjcHktPnBhcmFtID0gc2VsZi0+cGFyYW07CisgICAgY3B5LT5zdGF0ZSA9IHNlbGYtPnN0YXRlOworICAgIExFQVZFX0hBU0hMSUIoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNweTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2JsYWtlMmIuYmxha2UyYi51cGRhdGUKKworICAgIG9iajogb2JqZWN0CisgICAgLworCitVcGRhdGUgdGhpcyBoYXNoIG9iamVjdCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJiX2JsYWtlMmJfdXBkYXRlKEJMQUtFMmJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTg4OGYwN2M0Y2RkYmU5NCBpbnB1dD0zZWNiOGMxM2VlNDI2MGYyXSovCit7CisgICAgUHlfYnVmZmVyIGJ1ZjsKKworICAgIEdFVF9CVUZGRVJfVklFV19PUl9FUlJPVVQob2JqLCAmYnVmKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYtPmxvY2sgPT0gTlVMTCAmJiBidWYubGVuID49IEhBU0hMSUJfR0lMX01JTlNJWkUpCisgICAgICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICBpZiAoc2VsZi0+bG9jayAhPSBOVUxMKSB7CisgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrLCAxKTsKKyAgICAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrKTsKKyAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIGJsYWtlMmJfdXBkYXRlKCZzZWxmLT5zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbik7CisgICAgfQorI2Vsc2UKKyAgICBibGFrZTJiX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworI2VuZGlmIC8qICFXSVRIX1RIUkVBRCAqLworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19ibGFrZTJiLmJsYWtlMmIuZGlnZXN0CisKK1JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9kaWdlc3RfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIxM2E3OTM2MGQ5ODQ3NDAgaW5wdXQ9YWMyZmE0NjJlYmIxYjljN10qLworeworICAgIHVpbnQ4X3QgZGlnZXN0W0JMQUtFMkJfT1VUQllURVNdOworICAgIGJsYWtlMmJfc3RhdGUgc3RhdGVfY3B5OworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBzdGF0ZV9jcHkgPSBzZWxmLT5zdGF0ZTsKKyAgICBibGFrZTJiX2ZpbmFsKCZzdGF0ZV9jcHksIGRpZ2VzdCwgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKWRpZ2VzdCwKKyAgICAgICAgICAgIHNlbGYtPnBhcmFtLmRpZ2VzdF9sZW5ndGgpOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2UyYi5ibGFrZTJiLmhleGRpZ2VzdAorCitSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmE1MDM2MTE3MTViMjRiZCBpbnB1dD1kNThmMGIyZjM3ODEyZTMzXSovCit7CisgICAgdWludDhfdCBkaWdlc3RbQkxBS0UyQl9PVVRCWVRFU107CisgICAgYmxha2UyYl9zdGF0ZSBzdGF0ZV9jcHk7CisKKyAgICBFTlRFUl9IQVNITElCKHNlbGYpOworICAgIHN0YXRlX2NweSA9IHNlbGYtPnN0YXRlOworICAgIGJsYWtlMmJfZmluYWwoJnN0YXRlX2NweSwgZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKKyAgICBMRUFWRV9IQVNITElCKHNlbGYpOworICAgIHJldHVybiBfUHlfc3RyaGV4KChjb25zdCBjaGFyICopZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKK30KKworCitzdGF0aWMgUHlNZXRob2REZWYgcHlfYmxha2UyYl9tZXRob2RzW10gPSB7CisgICAgX0JMQUtFMkJfQkxBS0UyQl9DT1BZX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfSEVYRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJCX0JMQUtFMkJfVVBEQVRFX01FVEhPRERFRgorICAgIHtOVUxMLCBOVUxMfQorfTsKKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX2dldF9uYW1lKEJMQUtFMmJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJibGFrZTJiIik7Cit9CisKKworCitzdGF0aWMgUHlPYmplY3QgKgorcHlfYmxha2UyYl9nZXRfYmxvY2tfc2l6ZShCTEFLRTJiT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoQkxBS0UyQl9CTE9DS0JZVEVTKTsKK30KKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX2dldF9kaWdlc3Rfc2l6ZShCTEFLRTJiT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7Cit9CisKKworc3RhdGljIFB5R2V0U2V0RGVmIHB5X2JsYWtlMmJfZ2V0c2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpcHlfYmxha2UyYl9nZXRfbmFtZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJibG9ja19zaXplIiwgKGdldHRlcilweV9ibGFrZTJiX2dldF9ibG9ja19zaXplLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRpZ2VzdF9zaXplIiwgKGdldHRlcilweV9ibGFrZTJiX2dldF9kaWdlc3Rfc2l6ZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAge05VTEx9Cit9OworCisKK3N0YXRpYyB2b2lkCitweV9ibGFrZTJiX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCit7CisgICAgQkxBS0UyYk9iamVjdCAqb2JqID0gKEJMQUtFMmJPYmplY3QgKilzZWxmOworCisgICAgLyogVHJ5IG5vdCB0byBsZWF2ZSBzdGF0ZSBpbiBtZW1vcnkuICovCisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCZvYmotPnBhcmFtLCBzaXplb2Yob2JqLT5wYXJhbSkpOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSgmb2JqLT5zdGF0ZSwgc2l6ZW9mKG9iai0+c3RhdGUpKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChvYmotPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKG9iai0+bG9jayk7CisgICAgICAgIG9iai0+bG9jayA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisKK1B5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2JsYWtlMi5ibGFrZTJiIiwgICAgICAgIC8qIHRwX25hbWUgICAgICAgICAgICAqLworICAgIHNpemVvZihCTEFLRTJiT2JqZWN0KSwgICAgLyogdHBfc2l6ZSAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAgICAgICAgKi8KKyAgICBweV9ibGFrZTJiX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICAqLworICAgIHB5X2JsYWtlMmJfbmV3X19kb2NfXywgICAgLyogdHBfZG9jICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgICAgICAgICovCisgICAgcHlfYmxha2UyYl9tZXRob2RzLCAgICAgICAvKiB0cF9tZXRob2RzICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgICAgICAgICAqLworICAgIHB5X2JsYWtlMmJfZ2V0c2V0dGVycywgICAgLyogdHBfZ2V0c2V0ICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAgICAgICAgICAgKi8KKyAgICBweV9ibGFrZTJiX25ldywgICAgICAgICAgIC8qIHRwX25ldyAgICAgICAgICAgICAqLworfTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJtb2R1bGUuYyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEzZDQyCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMm1vZHVsZS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogV3JpdHRlbiBpbiAyMDEzIGJ5IERtaXRyeSBDaGVzdG55a2ggPGRtaXRyeUBjb2Rpbmdyb2JvdHMuY29tPgorICogTW9kaWZpZWQgZm9yIENQeXRob24gYnkgQ2hyaXN0aWFuIEhlaW1lcyA8Y2hyaXN0aWFuQHB5dGhvbi5vcmc+CisgKgorICogVG8gdGhlIGV4dGVudCBwb3NzaWJsZSB1bmRlciBsYXcsIHRoZSBhdXRob3IgaGF2ZSBkZWRpY2F0ZWQgYWxsCisgKiBjb3B5cmlnaHQgYW5kIHJlbGF0ZWQgYW5kIG5laWdoYm9yaW5nIHJpZ2h0cyB0byB0aGlzIHNvZnR3YXJlIHRvCisgKiB0aGUgcHVibGljIGRvbWFpbiB3b3JsZHdpZGUuIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dAorICogYW55IHdhcnJhbnR5LiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisgKi8KKworI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaW5jbHVkZSAiaW1wbC9ibGFrZTIuaCIKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJiVHlwZTsKK2V4dGVybiBQeVR5cGVPYmplY3QgUHlCbGFrZTJfQkxBS0Uyc1R5cGU7CisKKworUHlEb2NfU1RSVkFSKGJsYWtlMm1vZF9fZG9jX18sCisiX2JsYWtlMmIgcHJvdmlkZXMgQkxBS0UyYiBmb3IgaGFzaGxpYlxuIgorKTsKKworCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGJsYWtlMm1vZF9mdW5jdGlvbnNbXSA9IHsKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgYmxha2UyX21vZHVsZSA9IHsKKyAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgIl9ibGFrZTIiLAorICAgIGJsYWtlMm1vZF9fZG9jX18sCisgICAgLTEsCisgICAgYmxha2UybW9kX2Z1bmN0aW9ucywKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCit9OworCisjZGVmaW5lIEFERF9JTlQoZCwgbmFtZSwgdmFsdWUpIGRvIHsgXAorICAgIFB5T2JqZWN0ICp4ID0gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsgXAorICAgIGlmICgheCkgeyBcCisgICAgICAgIFB5X0RFQ1JFRihtKTsgXAorICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIH0gXAorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB4KSA8IDApIHsgXAorICAgICAgICBQeV9ERUNSRUYobSk7IFwKKyAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICB9IFwKKyAgICBQeV9ERUNSRUYoeCk7IFwKK30gd2hpbGUoMCkKKworCitQeU1PRElOSVRfRlVOQworUHlJbml0X19ibGFrZTIodm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKKworICAgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJmJsYWtlMl9tb2R1bGUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQkxBS0UyYiAqLworICAgIFB5X1RZUEUoJlB5Qmxha2UyX0JMQUtFMmJUeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJsYWtlMl9CTEFLRTJiVHlwZSkgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRigmUHlCbGFrZTJfQkxBS0UyYlR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiYmxha2UyYiIsIChQeU9iamVjdCAqKSZQeUJsYWtlMl9CTEFLRTJiVHlwZSk7CisKKyAgICBkID0gUHlCbGFrZTJfQkxBS0UyYlR5cGUudHBfZGljdDsKKyAgICBBRERfSU5UKGQsICJTQUxUX1NJWkUiLCBCTEFLRTJCX1NBTFRCWVRFUyk7CisgICAgQUREX0lOVChkLCAiUEVSU09OX1NJWkUiLCBCTEFLRTJCX1BFUlNPTkFMQllURVMpOworICAgIEFERF9JTlQoZCwgIk1BWF9LRVlfU0laRSIsIEJMQUtFMkJfS0VZQllURVMpOworICAgIEFERF9JTlQoZCwgIk1BWF9ESUdFU1RfU0laRSIsIEJMQUtFMkJfT1VUQllURVMpOworCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMkJfU0FMVF9TSVpFIiwgQkxBS0UyQl9TQUxUQllURVMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCTEFLRTJCX1BFUlNPTl9TSVpFIiwgQkxBS0UyQl9QRVJTT05BTEJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyQl9NQVhfS0VZX1NJWkUiLCBCTEFLRTJCX0tFWUJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyQl9NQVhfRElHRVNUX1NJWkUiLCBCTEFLRTJCX09VVEJZVEVTKTsKKworICAgIC8qIEJMQUtFMnMgKi8KKyAgICBQeV9UWVBFKCZQeUJsYWtlMl9CTEFLRTJzVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlCbGFrZTJfQkxBS0Uyc1R5cGUpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoJlB5Qmxha2UyX0JMQUtFMnNUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImJsYWtlMnMiLCAoUHlPYmplY3QgKikmUHlCbGFrZTJfQkxBS0Uyc1R5cGUpOworCisgICAgZCA9IFB5Qmxha2UyX0JMQUtFMnNUeXBlLnRwX2RpY3Q7CisgICAgQUREX0lOVChkLCAiU0FMVF9TSVpFIiwgQkxBS0UyU19TQUxUQllURVMpOworICAgIEFERF9JTlQoZCwgIlBFUlNPTl9TSVpFIiwgQkxBS0UyU19QRVJTT05BTEJZVEVTKTsKKyAgICBBRERfSU5UKGQsICJNQVhfS0VZX1NJWkUiLCBCTEFLRTJTX0tFWUJZVEVTKTsKKyAgICBBRERfSU5UKGQsICJNQVhfRElHRVNUX1NJWkUiLCBCTEFLRTJTX09VVEJZVEVTKTsKKworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCTEFLRTJTX1NBTFRfU0laRSIsIEJMQUtFMlNfU0FMVEJZVEVTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQkxBS0UyU19QRVJTT05fU0laRSIsIEJMQUtFMlNfUEVSU09OQUxCWVRFUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMlNfTUFYX0tFWV9TSVpFIiwgQkxBS0UyU19LRVlCWVRFUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJMQUtFMlNfTUFYX0RJR0VTVF9TSVpFIiwgQkxBS0UyU19PVVRCWVRFUyk7CisKKyAgICByZXR1cm4gbTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJucy5oIGIvTW9kdWxlcy9fYmxha2UyL2JsYWtlMm5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiY2U4ZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJucy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIFByZWZpeCBhbGwgcHVibGljIGJsYWtlMiBzeW1ib2xzIHdpdGggUHlCbGFrZTJfCisgKi8KKworI2lmbmRlZiBQeV9CTEFLRTJfTlMKKyNkZWZpbmUgUHlfQkxBS0UyX05TCisKKyNkZWZpbmUgYmxha2UyYiAgICAgICAgICAgIFB5Qmxha2UyX2JsYWtlMmIKKyNkZWZpbmUgYmxha2UyYl9jb21wcmVzcyAgIFB5Qmxha2UyX2JsYWtlMmJfY29tcHJlc3MKKyNkZWZpbmUgYmxha2UyYl9maW5hbCAgICAgIFB5Qmxha2UyX2JsYWtlMmJfZmluYWwKKyNkZWZpbmUgYmxha2UyYl9pbml0ICAgICAgIFB5Qmxha2UyX2JsYWtlMmJfaW5pdAorI2RlZmluZSBibGFrZTJiX2luaXRfa2V5ICAgUHlCbGFrZTJfYmxha2UyYl9pbml0X2tleQorI2RlZmluZSBibGFrZTJiX2luaXRfcGFyYW0gUHlCbGFrZTJfYmxha2UyYl9pbml0X3BhcmFtCisjZGVmaW5lIGJsYWtlMmJfdXBkYXRlICAgICBQeUJsYWtlMl9ibGFrZTJiX3VwZGF0ZQorI2RlZmluZSBibGFrZTJicCAgICAgICAgICAgUHlCbGFrZTJfYmxha2UyYnAKKyNkZWZpbmUgYmxha2UyYnBfZmluYWwgICAgIFB5Qmxha2UyX2JsYWtlMmJwX2ZpbmFsCisjZGVmaW5lIGJsYWtlMmJwX2luaXQgICAgICBQeUJsYWtlMl9ibGFrZTJicF9pbml0CisjZGVmaW5lIGJsYWtlMmJwX2luaXRfa2V5ICBQeUJsYWtlMl9ibGFrZTJicF9pbml0X2tleQorI2RlZmluZSBibGFrZTJicF91cGRhdGUgICAgUHlCbGFrZTJfYmxha2UyYnBfdXBkYXRlCisjZGVmaW5lIGJsYWtlMnMgICAgICAgICAgICBQeUJsYWtlMl9ibGFrZTJzCisjZGVmaW5lIGJsYWtlMnNfY29tcHJlc3MgICBQeUJsYWtlMl9ibGFrZTJzX2NvbXByZXNzCisjZGVmaW5lIGJsYWtlMnNfZmluYWwgICAgICBQeUJsYWtlMl9ibGFrZTJzX2ZpbmFsCisjZGVmaW5lIGJsYWtlMnNfaW5pdCAgICAgICBQeUJsYWtlMl9ibGFrZTJzX2luaXQKKyNkZWZpbmUgYmxha2Uyc19pbml0X2tleSAgIFB5Qmxha2UyX2JsYWtlMnNfaW5pdF9rZXkKKyNkZWZpbmUgYmxha2Uyc19pbml0X3BhcmFtIFB5Qmxha2UyX2JsYWtlMnNfaW5pdF9wYXJhbQorI2RlZmluZSBibGFrZTJzX3VwZGF0ZSAgICAgUHlCbGFrZTJfYmxha2Uyc191cGRhdGUKKyNkZWZpbmUgYmxha2Uyc3AgICAgICAgICAgIFB5Qmxha2UyX2JsYWtlMnNwCisjZGVmaW5lIGJsYWtlMnNwX2ZpbmFsICAgICBQeUJsYWtlMl9ibGFrZTJzcF9maW5hbAorI2RlZmluZSBibGFrZTJzcF9pbml0ICAgICAgUHlCbGFrZTJfYmxha2Uyc3BfaW5pdAorI2RlZmluZSBibGFrZTJzcF9pbml0X2tleSAgUHlCbGFrZTJfYmxha2Uyc3BfaW5pdF9rZXkKKyNkZWZpbmUgYmxha2Uyc3BfdXBkYXRlICAgIFB5Qmxha2UyX2JsYWtlMnNwX3VwZGF0ZQorCisjZW5kaWYgLyogUHlfQkxBS0UyX05TICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvYmxha2Uyc19pbXBsLmMgYi9Nb2R1bGVzL19ibGFrZTIvYmxha2Uyc19pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzODI3MAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9ibGFrZTJzX2ltcGwuYwpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIFdyaXR0ZW4gaW4gMjAxMyBieSBEbWl0cnkgQ2hlc3RueWtoIDxkbWl0cnlAY29kaW5ncm9ib3RzLmNvbT4KKyAqIE1vZGlmaWVkIGZvciBDUHl0aG9uIGJ5IENocmlzdGlhbiBIZWltZXMgPGNocmlzdGlhbkBweXRob24ub3JnPgorICoKKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgYXV0aG9yIGhhdmUgZGVkaWNhdGVkIGFsbAorICogY29weXJpZ2h0IGFuZCByZWxhdGVkIGFuZCBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhpcyBzb2Z0d2FyZSB0bworICogdGhlIHB1YmxpYyBkb21haW4gd29ybGR3aWRlLiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQKKyAqIGFueSB3YXJyYW50eS4gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCisKKy8qIFdBUk5JTkc6IGF1dG9nZW5lcmF0ZWQgZmlsZSEKKyAqCisgKiBUaGUgYmxha2Uyc19pbXBsLmMgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIGJsYWtlMnNfaW1wbC5jLgorICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXN0cmhleC5oIgorI2lmZGVmIFdJVEhfVEhSRUFECisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vaGFzaGxpYi5oIgorI2luY2x1ZGUgImJsYWtlMm5zLmgiCisKKyNkZWZpbmUgSEFWRV9CTEFLRTJTIDEKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBQeV9MT0NBTF9JTkxJTkUodHlwZSkKKworI2luY2x1ZGUgImltcGwvYmxha2UyLmgiCisjaW5jbHVkZSAiaW1wbC9ibGFrZTItaW1wbC5oIiAvKiBmb3Igc2VjdXJlX3plcm9fbWVtb3J5KCkgYW5kIHN0b3JlNDgoKSAqLworCisjaWZkZWYgQkxBS0UyX1VTRV9TU0UKKyNpbmNsdWRlICJpbXBsL2JsYWtlMnMuYyIKKyNlbHNlCisjaW5jbHVkZSAiaW1wbC9ibGFrZTJzLXJlZi5jIgorI2VuZGlmCisKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBibGFrZTJzX3BhcmFtICAgIHBhcmFtOworICAgIGJsYWtlMnNfc3RhdGUgICAgc3RhdGU7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyNlbmRpZgorfSBCTEFLRTJzT2JqZWN0OworCisjaW5jbHVkZSAiY2xpbmljL2JsYWtlMnNfaW1wbC5jLmgiCisKKy8qW2NsaW5pYyBpbnB1dF0KK21vZHVsZSBfYmxha2UycworY2xhc3MgX2JsYWtlMnMuYmxha2UycyAiQkxBS0Uyc09iamVjdCAqIiAiJlB5Qmxha2UyX0JMQUtFMnNUeXBlIgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9ZWRiZmNmNzU1N2E2ODVhN10qLworCisKK3N0YXRpYyBCTEFLRTJzT2JqZWN0ICoKK25ld19CTEFLRTJzT2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICBCTEFLRTJzT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSAoQkxBS0Uyc09iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc2VsZjsKK30KKworLypbY2xpbmljIGlucHV0XQorQGNsYXNzbWV0aG9kCitfYmxha2Uycy5ibGFrZTJzLl9fbmV3X18gYXMgcHlfYmxha2Uyc19uZXcKKyAgICBzdHJpbmcgYXMgZGF0YTogb2JqZWN0ID0gTlVMTAorICAgICoKKyAgICBkaWdlc3Rfc2l6ZTogaW50KGNfZGVmYXVsdD0iQkxBS0UyU19PVVRCWVRFUyIpID0gX2JsYWtlMnMuYmxha2Uycy5NQVhfRElHRVNUX1NJWkUKKyAgICBrZXk6IFB5X2J1ZmZlciA9IE5vbmUKKyAgICBzYWx0OiBQeV9idWZmZXIgPSBOb25lCisgICAgcGVyc29uOiBQeV9idWZmZXIgPSBOb25lCisgICAgZmFub3V0OiBpbnQgPSAxCisgICAgZGVwdGg6IGludCA9IDEKKyAgICBsZWFmX3NpemUgYXMgbGVhZl9zaXplX29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfb2Zmc2V0IGFzIG5vZGVfb2Zmc2V0X29iajogb2JqZWN0ID0gTlVMTAorICAgIG5vZGVfZGVwdGg6IGludCA9IDAKKyAgICBpbm5lcl9zaXplOiBpbnQgPSAwCisgICAgbGFzdF9ub2RlOiBib29sID0gRmFsc2UKKworUmV0dXJuIGEgbmV3IEJMQUtFMnMgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZTA2MGIyNThhOGNiZmM2IGlucHV0PTQ1OGNmZGNiM2QwZDQ3ZmZdKi8KK3sKKyAgICBCTEFLRTJzT2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeV9idWZmZXIgYnVmOworCisgICAgdW5zaWduZWQgbG9uZyBsZWFmX3NpemUgPSAwOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBub2RlX29mZnNldCA9IDA7CisKKyAgICBzZWxmID0gbmV3X0JMQUtFMnNPYmplY3QodHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIFplcm8gcGFyYW1ldGVyIGJsb2NrLiAqLworICAgIG1lbXNldCgmc2VsZi0+cGFyYW0sIDAsIHNpemVvZihzZWxmLT5wYXJhbSkpOworCisgICAgLyogU2V0IGRpZ2VzdCBzaXplLiAqLworICAgIGlmIChkaWdlc3Rfc2l6ZSA8PSAwIHx8IGRpZ2VzdF9zaXplID4gQkxBS0UyU19PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZGlnZXN0X3NpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX09VVEJZVEVTKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9zaXplOworCisgICAgLyogU2V0IHNhbHQgcGFyYW1ldGVyLiAqLworICAgIGlmICgoc2FsdC0+b2JqICE9IE5VTEwpICYmIHNhbHQtPmxlbikgeworICAgICAgICBpZiAoc2FsdC0+bGVuID4gQkxBS0UyU19TQUxUQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHNhbHQgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX1NBTFRCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5zYWx0LCBzYWx0LT5idWYsIHNhbHQtPmxlbik7CisgICAgfQorCisgICAgLyogU2V0IHBlcnNvbmFsaXphdGlvbiBwYXJhbWV0ZXIuICovCisgICAgaWYgKChwZXJzb24tPm9iaiAhPSBOVUxMKSAmJiBwZXJzb24tPmxlbikgeworICAgICAgICBpZiAocGVyc29uLT5sZW4gPiBCTEFLRTJTX1BFUlNPTkFMQllURVMpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJtYXhpbXVtIHBlcnNvbiBsZW5ndGggaXMgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIEJMQUtFMlNfUEVSU09OQUxCWVRFUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIG1lbWNweShzZWxmLT5wYXJhbS5wZXJzb25hbCwgcGVyc29uLT5idWYsIHBlcnNvbi0+bGVuKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdHJlZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChmYW5vdXQgPCAwIHx8IGZhbm91dCA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmFub3V0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZmFub3V0ID0gKHVpbnQ4X3QpZmFub3V0OworCisgICAgaWYgKGRlcHRoIDw9IDAgfHwgZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlcHRoIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cGFyYW0uZGVwdGggPSAodWludDhfdClkZXB0aDsKKworICAgIGlmIChsZWFmX3NpemVfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbGVhZl9zaXplID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGxlYWZfc2l6ZV9vYmopOworICAgICAgICBpZiAobGVhZl9zaXplID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChsZWFmX3NpemUgPiAweEZGRkZGRkZGVSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsZWFmX3NpemUgaXMgdG9vIGxhcmdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIHNlbGYtPnBhcmFtLmxlYWZfbGVuZ3RoID0gKHVuc2lnbmVkIGludClsZWFmX3NpemU7CisKKyAgICBpZiAobm9kZV9vZmZzZXRfb2JqICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZV9vZmZzZXQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKG5vZGVfb2Zmc2V0X29iaik7CisgICAgICAgIGlmIChub2RlX29mZnNldCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfQkxBS0UyUworICAgIGlmIChub2RlX29mZnNldCA+IDB4RkZGRkZGRkZGRkZGVUxMKSB7CisgICAgICAgIC8qIG1heGltdW0gMioqNDggLSAxICovCisgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vZGVfb2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgfQorICAgIHN0b3JlNDgoJihzZWxmLT5wYXJhbS5ub2RlX29mZnNldCksIG5vZGVfb2Zmc2V0KTsKKyNlbHNlCisgICAgc2VsZi0+cGFyYW0ubm9kZV9vZmZzZXQgPSBub2RlX29mZnNldDsKKyNlbmRpZgorCisgICAgaWYgKG5vZGVfZGVwdGggPCAwIHx8IG5vZGVfZGVwdGggPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIm5vZGVfZGVwdGggbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5ub2RlX2RlcHRoID0gbm9kZV9kZXB0aDsKKworICAgIGlmIChpbm5lcl9zaXplIDwgMCB8fCBpbm5lcl9zaXplID4gQkxBS0UyU19PVVRCWVRFUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW5uZXJfc2l6ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgaXMgJWQiLAorICAgICAgICAgICAgICAgIEJMQUtFMlNfT1VUQllURVMpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzZWxmLT5wYXJhbS5pbm5lcl9sZW5ndGggPSBpbm5lcl9zaXplOworCisgICAgLyogU2V0IGtleSBsZW5ndGguICovCisgICAgaWYgKChrZXktPm9iaiAhPSBOVUxMKSAmJiBrZXktPmxlbikgeworICAgICAgICBpZiAoa2V5LT5sZW4gPiBCTEFLRTJTX0tFWUJZVEVTKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAibWF4aW11bSBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBCTEFLRTJTX0tFWUJZVEVTKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+cGFyYW0ua2V5X2xlbmd0aCA9IGtleS0+bGVuOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgaGFzaCBzdGF0ZS4gKi8KKyAgICBpZiAoYmxha2Uyc19pbml0X3BhcmFtKCZzZWxmLT5zdGF0ZSwgJnNlbGYtPnBhcmFtKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiZXJyb3IgaW5pdGlhbGl6aW5nIGhhc2ggc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBTZXQgbGFzdCBub2RlIGZsYWcgKG11c3QgY29tZSBhZnRlciBpbml0aWFsaXphdGlvbikuICovCisgICAgc2VsZi0+c3RhdGUubGFzdF9ub2RlID0gbGFzdF9ub2RlOworCisgICAgLyogUHJvY2VzcyBrZXkgYmxvY2sgaWYgYW55LiAqLworICAgIGlmIChzZWxmLT5wYXJhbS5rZXlfbGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyU19CTE9DS0JZVEVTXTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgbWVtY3B5KGJsb2NrLCBrZXktPmJ1Ziwga2V5LT5sZW4pOworICAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgc2VjdXJlX3plcm9fbWVtb3J5KGJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGluaXRpYWwgZGF0YSBpZiBhbnkuICovCisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1IoZGF0YSwgJmJ1ZiwgZ290byBlcnJvcik7CisKKyAgICAgICAgaWYgKGJ1Zi5sZW4gPj0gSEFTSExJQl9HSUxfTUlOU0laRSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmxha2Uyc191cGRhdGUoJnNlbGYtPnN0YXRlLCBidWYuYnVmLCBidWYubGVuKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgICB9CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKKyAgZXJyb3I6CisgICAgaWYgKHNlbGYgIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2Uycy5ibGFrZTJzLmNvcHkKKworUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCBvYmplY3QuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTZjNWJhZGE0MDRiN2FlZDcgaW5wdXQ9Yzg4NThlODg3YWU0YTA3YV0qLworeworICAgIEJMQUtFMnNPYmplY3QgKmNweTsKKworICAgIGlmICgoY3B5ID0gbmV3X0JMQUtFMnNPYmplY3QoUHlfVFlQRShzZWxmKSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBjcHktPnBhcmFtID0gc2VsZi0+cGFyYW07CisgICAgY3B5LT5zdGF0ZSA9IHNlbGYtPnN0YXRlOworICAgIExFQVZFX0hBU0hMSUIoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNweTsKK30KKworLypbY2xpbmljIGlucHV0XQorX2JsYWtlMnMuYmxha2Uycy51cGRhdGUKKworICAgIG9iajogb2JqZWN0CisgICAgLworCitVcGRhdGUgdGhpcyBoYXNoIG9iamVjdCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJzX2JsYWtlMnNfdXBkYXRlKEJMQUtFMnNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmU4NDM4YTFkM2NlZGU4NyBpbnB1dD00N2E0MDhiOWEzY2MwNWM1XSovCit7CisgICAgUHlfYnVmZmVyIGJ1ZjsKKworICAgIEdFVF9CVUZGRVJfVklFV19PUl9FUlJPVVQob2JqLCAmYnVmKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKHNlbGYtPmxvY2sgPT0gTlVMTCAmJiBidWYubGVuID49IEhBU0hMSUJfR0lMX01JTlNJWkUpCisgICAgICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisKKyAgICBpZiAoc2VsZi0+bG9jayAhPSBOVUxMKSB7CisgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrLCAxKTsKKyAgICAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrKTsKKyAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIGJsYWtlMnNfdXBkYXRlKCZzZWxmLT5zdGF0ZSwgYnVmLmJ1ZiwgYnVmLmxlbik7CisgICAgfQorI2Vsc2UKKyAgICBibGFrZTJzX3VwZGF0ZSgmc2VsZi0+c3RhdGUsIGJ1Zi5idWYsIGJ1Zi5sZW4pOworI2VuZGlmIC8qICFXSVRIX1RIUkVBRCAqLworICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1Zik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK19ibGFrZTJzLmJsYWtlMnMuZGlnZXN0CisKK1JldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgc3RyaW5nIG9mIGJpbmFyeSBkYXRhLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19kaWdlc3RfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgwZTgxYTQ4YzZmNzljZjkgaW5wdXQ9ZmViOWEyMjAxMzViZGViYV0qLworeworICAgIHVpbnQ4X3QgZGlnZXN0W0JMQUtFMlNfT1VUQllURVNdOworICAgIGJsYWtlMnNfc3RhdGUgc3RhdGVfY3B5OworCisgICAgRU5URVJfSEFTSExJQihzZWxmKTsKKyAgICBzdGF0ZV9jcHkgPSBzZWxmLT5zdGF0ZTsKKyAgICBibGFrZTJzX2ZpbmFsKCZzdGF0ZV9jcHksIGRpZ2VzdCwgc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7CisgICAgTEVBVkVfSEFTSExJQihzZWxmKTsKKyAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKWRpZ2VzdCwKKyAgICAgICAgICAgIHNlbGYtPnBhcmFtLmRpZ2VzdF9sZW5ndGgpOworfQorCisvKltjbGluaWMgaW5wdXRdCitfYmxha2Uycy5ibGFrZTJzLmhleGRpZ2VzdAorCitSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGI2YzUwMjhjMGEzYzJlNSBpbnB1dD00ZTQ4NzdiOGJkN2FlYTkxXSovCit7CisgICAgdWludDhfdCBkaWdlc3RbQkxBS0UyU19PVVRCWVRFU107CisgICAgYmxha2Uyc19zdGF0ZSBzdGF0ZV9jcHk7CisKKyAgICBFTlRFUl9IQVNITElCKHNlbGYpOworICAgIHN0YXRlX2NweSA9IHNlbGYtPnN0YXRlOworICAgIGJsYWtlMnNfZmluYWwoJnN0YXRlX2NweSwgZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKKyAgICBMRUFWRV9IQVNITElCKHNlbGYpOworICAgIHJldHVybiBfUHlfc3RyaGV4KChjb25zdCBjaGFyICopZGlnZXN0LCBzZWxmLT5wYXJhbS5kaWdlc3RfbGVuZ3RoKTsKK30KKworCitzdGF0aWMgUHlNZXRob2REZWYgcHlfYmxha2Uyc19tZXRob2RzW10gPSB7CisgICAgX0JMQUtFMlNfQkxBS0UyU19DT1BZX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfSEVYRElHRVNUX01FVEhPRERFRgorICAgIF9CTEFLRTJTX0JMQUtFMlNfVVBEQVRFX01FVEhPRERFRgorICAgIHtOVUxMLCBOVUxMfQorfTsKKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX2dldF9uYW1lKEJMQUtFMnNPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJibGFrZTJzIik7Cit9CisKKworCitzdGF0aWMgUHlPYmplY3QgKgorcHlfYmxha2Uyc19nZXRfYmxvY2tfc2l6ZShCTEFLRTJzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoQkxBS0UyU19CTE9DS0JZVEVTKTsKK30KKworCisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX2dldF9kaWdlc3Rfc2l6ZShCTEFLRTJzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoc2VsZi0+cGFyYW0uZGlnZXN0X2xlbmd0aCk7Cit9CisKKworc3RhdGljIFB5R2V0U2V0RGVmIHB5X2JsYWtlMnNfZ2V0c2V0dGVyc1tdID0geworICAgIHsibmFtZSIsIChnZXR0ZXIpcHlfYmxha2Uyc19nZXRfbmFtZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJibG9ja19zaXplIiwgKGdldHRlcilweV9ibGFrZTJzX2dldF9ibG9ja19zaXplLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRpZ2VzdF9zaXplIiwgKGdldHRlcilweV9ibGFrZTJzX2dldF9kaWdlc3Rfc2l6ZSwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAge05VTEx9Cit9OworCisKK3N0YXRpYyB2b2lkCitweV9ibGFrZTJzX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCit7CisgICAgQkxBS0Uyc09iamVjdCAqb2JqID0gKEJMQUtFMnNPYmplY3QgKilzZWxmOworCisgICAgLyogVHJ5IG5vdCB0byBsZWF2ZSBzdGF0ZSBpbiBtZW1vcnkuICovCisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCZvYmotPnBhcmFtLCBzaXplb2Yob2JqLT5wYXJhbSkpOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSgmb2JqLT5zdGF0ZSwgc2l6ZW9mKG9iai0+c3RhdGUpKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChvYmotPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKG9iai0+bG9jayk7CisgICAgICAgIG9iai0+bG9jayA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisKK1B5VHlwZU9iamVjdCBQeUJsYWtlMl9CTEFLRTJzVHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2JsYWtlMi5ibGFrZTJzIiwgICAgICAgIC8qIHRwX25hbWUgICAgICAgICAgICAqLworICAgIHNpemVvZihCTEFLRTJzT2JqZWN0KSwgICAgLyogdHBfc2l6ZSAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAgICAgICAgKi8KKyAgICBweV9ibGFrZTJzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICAqLworICAgIHB5X2JsYWtlMnNfbmV3X19kb2NfXywgICAgLyogdHBfZG9jICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgICAgICAgICovCisgICAgcHlfYmxha2Uyc19tZXRob2RzLCAgICAgICAvKiB0cF9tZXRob2RzICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgICAgICAgICAqLworICAgIHB5X2JsYWtlMnNfZ2V0c2V0dGVycywgICAgLyogdHBfZ2V0c2V0ICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAgICAgICAgICAgKi8KKyAgICBweV9ibGFrZTJzX25ldywgICAgICAgICAgIC8qIHRwX25ldyAgICAgICAgICAgICAqLworfTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2UyYl9pbXBsLmMuaCBiL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2UyYl9pbXBsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWMwNzNhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2NsaW5pYy9ibGFrZTJiX2ltcGwuYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitQeURvY19TVFJWQVIocHlfYmxha2UyYl9uZXdfX2RvY19fLAorImJsYWtlMmIoc3RyaW5nPU5vbmUsICosIGRpZ2VzdF9zaXplPV9ibGFrZTJiLmJsYWtlMmIuTUFYX0RJR0VTVF9TSVpFLFxuIgorIiAgICAgICAga2V5PU5vbmUsIHNhbHQ9Tm9uZSwgcGVyc29uPU5vbmUsIGZhbm91dD0xLCBkZXB0aD0xLFxuIgorIiAgICAgICAgbGVhZl9zaXplPU5vbmUsIG5vZGVfb2Zmc2V0PU5vbmUsIG5vZGVfZGVwdGg9MCwgaW5uZXJfc2l6ZT0wLFxuIgorIiAgICAgICAgbGFzdF9ub2RlPUZhbHNlKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIGEgbmV3IEJMQUtFMmIgaGFzaCBvYmplY3QuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJiX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJkaWdlc3Rfc2l6ZSIsICJrZXkiLCAic2FsdCIsICJwZXJzb24iLCAiZmFub3V0IiwgImRlcHRoIiwgImxlYWZfc2l6ZSIsICJub2RlX29mZnNldCIsICJub2RlX2RlcHRoIiwgImlubmVyX3NpemUiLCAibGFzdF9ub2RlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8kaXkqeSp5KmlpT09paXA6Ymxha2UyYiIsIF9rZXl3b3JkcywgMH07CisgICAgUHlPYmplY3QgKmRhdGEgPSBOVUxMOworICAgIGludCBkaWdlc3Rfc2l6ZSA9IEJMQUtFMkJfT1VUQllURVM7CisgICAgUHlfYnVmZmVyIGtleSA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgc2FsdCA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgcGVyc29uID0ge05VTEwsIE5VTEx9OworICAgIGludCBmYW5vdXQgPSAxOworICAgIGludCBkZXB0aCA9IDE7CisgICAgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmogPSBOVUxMOworICAgIGludCBub2RlX2RlcHRoID0gMDsKKyAgICBpbnQgaW5uZXJfc2l6ZSA9IDA7CisgICAgaW50IGxhc3Rfbm9kZSA9IDA7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZGlnZXN0X3NpemUsICZrZXksICZzYWx0LCAmcGVyc29uLCAmZmFub3V0LCAmZGVwdGgsICZsZWFmX3NpemVfb2JqLCAmbm9kZV9vZmZzZXRfb2JqLCAmbm9kZV9kZXB0aCwgJmlubmVyX3NpemUsICZsYXN0X25vZGUpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gcHlfYmxha2UyYl9uZXdfaW1wbCh0eXBlLCBkYXRhLCBkaWdlc3Rfc2l6ZSwgJmtleSwgJnNhbHQsICZwZXJzb24sIGZhbm91dCwgZGVwdGgsIGxlYWZfc2l6ZV9vYmosIG5vZGVfb2Zmc2V0X29iaiwgbm9kZV9kZXB0aCwgaW5uZXJfc2l6ZSwgbGFzdF9ub2RlKTsKKworZXhpdDoKKyAgICAvKiBDbGVhbnVwIGZvciBrZXkgKi8KKyAgICBpZiAoa2V5Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmtleSk7CisgICAgfQorICAgIC8qIENsZWFudXAgZm9yIHNhbHQgKi8KKyAgICBpZiAoc2FsdC5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzYWx0KTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3IgcGVyc29uICovCisgICAgaWYgKHBlcnNvbi5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZXJzb24pOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK1B5RG9jX1NUUlZBUihfYmxha2UyYl9ibGFrZTJiX2NvcHlfX2RvY19fLAorImNvcHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIG9iamVjdC4iKTsKKworI2RlZmluZSBfQkxBS0UyQl9CTEFLRTJCX0NPUFlfTUVUSE9EREVGICAgIFwKKyAgICB7ImNvcHkiLCAoUHlDRnVuY3Rpb24pX2JsYWtlMmJfYmxha2UyYl9jb3B5LCBNRVRIX05PQVJHUywgX2JsYWtlMmJfYmxha2UyYl9jb3B5X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChCTEFLRTJiT2JqZWN0ICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJiX2JsYWtlMmJfY29weShCTEFLRTJiT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfYmxha2UyYl9ibGFrZTJiX2NvcHlfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlX19kb2NfXywKKyJ1cGRhdGUoJHNlbGYsIG9iaiwgLylcbiIKKyItLVxuIgorIlxuIgorIlVwZGF0ZSB0aGlzIGhhc2ggb2JqZWN0XCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4iKTsKKworI2RlZmluZSBfQkxBS0UyQl9CTEFLRTJCX1VQREFURV9NRVRIT0RERUYgICAgXAorICAgIHsidXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKV9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlLCBNRVRIX08sIF9ibGFrZTJiX2JsYWtlMmJfdXBkYXRlX19kb2NfX30sCisKK1B5RG9jX1NUUlZBUihfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdF9fZG9jX18sCisiZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX0JMQUtFMkJfQkxBS0UyQl9ESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJiX2JsYWtlMmJfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2RpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9kaWdlc3QoQkxBS0UyYk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMmJfYmxha2UyYl9kaWdlc3RfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJiX2JsYWtlMmJfaGV4ZGlnZXN0X19kb2NfXywKKyJoZXhkaWdlc3QoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuIik7CisKKyNkZWZpbmUgX0JMQUtFMkJfQkxBS0UyQl9IRVhESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJiX2JsYWtlMmJfaGV4ZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2UyYl9ibGFrZTJiX2hleGRpZ2VzdF9pbXBsKEJMQUtFMmJPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMmJfYmxha2UyYl9oZXhkaWdlc3QoQkxBS0UyYk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMmJfYmxha2UyYl9oZXhkaWdlc3RfaW1wbChzZWxmKTsKK30KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MzVhNTQ4NTJjOThlNTFjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2Uyc19pbXBsLmMuaCBiL01vZHVsZXMvX2JsYWtlMi9jbGluaWMvYmxha2Uyc19pbXBsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkwOGQzCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2NsaW5pYy9ibGFrZTJzX2ltcGwuYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitQeURvY19TVFJWQVIocHlfYmxha2Uyc19uZXdfX2RvY19fLAorImJsYWtlMnMoc3RyaW5nPU5vbmUsICosIGRpZ2VzdF9zaXplPV9ibGFrZTJzLmJsYWtlMnMuTUFYX0RJR0VTVF9TSVpFLFxuIgorIiAgICAgICAga2V5PU5vbmUsIHNhbHQ9Tm9uZSwgcGVyc29uPU5vbmUsIGZhbm91dD0xLCBkZXB0aD0xLFxuIgorIiAgICAgICAgbGVhZl9zaXplPU5vbmUsIG5vZGVfb2Zmc2V0PU5vbmUsIG5vZGVfZGVwdGg9MCwgaW5uZXJfc2l6ZT0wLFxuIgorIiAgICAgICAgbGFzdF9ub2RlPUZhbHNlKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIGEgbmV3IEJMQUtFMnMgaGFzaCBvYmplY3QuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ld19pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmRhdGEsIGludCBkaWdlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICprZXksIFB5X2J1ZmZlciAqc2FsdCwgUHlfYnVmZmVyICpwZXJzb24sCisgICAgICAgICAgICAgICAgICAgIGludCBmYW5vdXQsIGludCBkZXB0aCwgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmosIGludCBub2RlX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5uZXJfc2l6ZSwgaW50IGxhc3Rfbm9kZSk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitweV9ibGFrZTJzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJkaWdlc3Rfc2l6ZSIsICJrZXkiLCAic2FsdCIsICJwZXJzb24iLCAiZmFub3V0IiwgImRlcHRoIiwgImxlYWZfc2l6ZSIsICJub2RlX29mZnNldCIsICJub2RlX2RlcHRoIiwgImlubmVyX3NpemUiLCAibGFzdF9ub2RlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8kaXkqeSp5KmlpT09paXA6Ymxha2UycyIsIF9rZXl3b3JkcywgMH07CisgICAgUHlPYmplY3QgKmRhdGEgPSBOVUxMOworICAgIGludCBkaWdlc3Rfc2l6ZSA9IEJMQUtFMlNfT1VUQllURVM7CisgICAgUHlfYnVmZmVyIGtleSA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgc2FsdCA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9idWZmZXIgcGVyc29uID0ge05VTEwsIE5VTEx9OworICAgIGludCBmYW5vdXQgPSAxOworICAgIGludCBkZXB0aCA9IDE7CisgICAgUHlPYmplY3QgKmxlYWZfc2l6ZV9vYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpub2RlX29mZnNldF9vYmogPSBOVUxMOworICAgIGludCBub2RlX2RlcHRoID0gMDsKKyAgICBpbnQgaW5uZXJfc2l6ZSA9IDA7CisgICAgaW50IGxhc3Rfbm9kZSA9IDA7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZGlnZXN0X3NpemUsICZrZXksICZzYWx0LCAmcGVyc29uLCAmZmFub3V0LCAmZGVwdGgsICZsZWFmX3NpemVfb2JqLCAmbm9kZV9vZmZzZXRfb2JqLCAmbm9kZV9kZXB0aCwgJmlubmVyX3NpemUsICZsYXN0X25vZGUpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gcHlfYmxha2Uyc19uZXdfaW1wbCh0eXBlLCBkYXRhLCBkaWdlc3Rfc2l6ZSwgJmtleSwgJnNhbHQsICZwZXJzb24sIGZhbm91dCwgZGVwdGgsIGxlYWZfc2l6ZV9vYmosIG5vZGVfb2Zmc2V0X29iaiwgbm9kZV9kZXB0aCwgaW5uZXJfc2l6ZSwgbGFzdF9ub2RlKTsKKworZXhpdDoKKyAgICAvKiBDbGVhbnVwIGZvciBrZXkgKi8KKyAgICBpZiAoa2V5Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmtleSk7CisgICAgfQorICAgIC8qIENsZWFudXAgZm9yIHNhbHQgKi8KKyAgICBpZiAoc2FsdC5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzYWx0KTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3IgcGVyc29uICovCisgICAgaWYgKHBlcnNvbi5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZXJzb24pOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKK1B5RG9jX1NUUlZBUihfYmxha2Uyc19ibGFrZTJzX2NvcHlfX2RvY19fLAorImNvcHkoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIG9iamVjdC4iKTsKKworI2RlZmluZSBfQkxBS0UyU19CTEFLRTJTX0NPUFlfTUVUSE9EREVGICAgIFwKKyAgICB7ImNvcHkiLCAoUHlDRnVuY3Rpb24pX2JsYWtlMnNfYmxha2Uyc19jb3B5LCBNRVRIX05PQVJHUywgX2JsYWtlMnNfYmxha2Uyc19jb3B5X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChCTEFLRTJzT2JqZWN0ICpzZWxmKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19ibGFrZTJzX2JsYWtlMnNfY29weShCTEFLRTJzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqUHlfVU5VU0VEKGlnbm9yZWQpKQoreworICAgIHJldHVybiBfYmxha2Uyc19ibGFrZTJzX2NvcHlfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlX19kb2NfXywKKyJ1cGRhdGUoJHNlbGYsIG9iaiwgLylcbiIKKyItLVxuIgorIlxuIgorIlVwZGF0ZSB0aGlzIGhhc2ggb2JqZWN0XCdzIHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHN0cmluZy4iKTsKKworI2RlZmluZSBfQkxBS0UyU19CTEFLRTJTX1VQREFURV9NRVRIT0RERUYgICAgXAorICAgIHsidXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKV9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlLCBNRVRIX08sIF9ibGFrZTJzX2JsYWtlMnNfdXBkYXRlX19kb2NfX30sCisKK1B5RG9jX1NUUlZBUihfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdF9fZG9jX18sCisiZGlnZXN0KCRzZWxmLCAvKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBkaWdlc3QgdmFsdWUgYXMgYSBzdHJpbmcgb2YgYmluYXJ5IGRhdGEuIik7CisKKyNkZWZpbmUgX0JMQUtFMlNfQkxBS0UyU19ESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJzX2JsYWtlMnNfZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2RpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19kaWdlc3QoQkxBS0Uyc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMnNfYmxha2Uyc19kaWdlc3RfaW1wbChzZWxmKTsKK30KKworUHlEb2NfU1RSVkFSKF9ibGFrZTJzX2JsYWtlMnNfaGV4ZGlnZXN0X19kb2NfXywKKyJoZXhkaWdlc3QoJHNlbGYsIC8pXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMuIik7CisKKyNkZWZpbmUgX0JMQUtFMlNfQkxBS0UyU19IRVhESUdFU1RfTUVUSE9EREVGICAgIFwKKyAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsIF9ibGFrZTJzX2JsYWtlMnNfaGV4ZGlnZXN0X19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitfYmxha2Uyc19ibGFrZTJzX2hleGRpZ2VzdF9pbXBsKEJMQUtFMnNPYmplY3QgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX2JsYWtlMnNfYmxha2Uyc19oZXhkaWdlc3QoQkxBS0Uyc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKlB5X1VOVVNFRChpZ25vcmVkKSkKK3sKKyAgICByZXR1cm4gX2JsYWtlMnNfYmxha2Uyc19oZXhkaWdlc3RfaW1wbChzZWxmKTsKK30KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MzVlYTc5MDNmOWNjZjc2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1jb25maWcuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ1NWIxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLWNvbmZpZy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKworICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMl9DT05GSUdfSF9fCisjZGVmaW5lIF9fQkxBS0UyX0NPTkZJR19IX18KKworLyogVGhlc2UgZG9uJ3Qgd29yayBldmVyeXdoZXJlICovCisjaWYgZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYW1kNjRfXykKKyNkZWZpbmUgSEFWRV9TU0UyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU1NFM19fKQorI2RlZmluZSBIQVZFX1NTU0UzCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU0U0XzFfXykKKyNkZWZpbmUgSEFWRV9TU0U0MQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVZYX18pCisjZGVmaW5lIEhBVkVfQVZYCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19YT1BfXykKKyNkZWZpbmUgSEFWRV9YT1AKKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX0FWWDIKKyNpZm5kZWYgSEFWRV9BVlgKKyNkZWZpbmUgSEFWRV9BVlgKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1hPUAorI2lmbmRlZiBIQVZFX0FWWAorI2RlZmluZSBIQVZFX0FWWAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVZYCisjaWZuZGVmIEhBVkVfU1NFNDEKKyNkZWZpbmUgSEFWRV9TU0U0MQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1NFNDEKKyNpZm5kZWYgSEFWRV9TU1NFMworI2RlZmluZSBIQVZFX1NTU0UzCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TU1NFMworI2RlZmluZSBIQVZFX1NTRTIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9TU0UyKQorI2Vycm9yICJUaGlzIGNvZGUgcmVxdWlyZXMgYXQgbGVhc3QgU1NFMi4iCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMi1pbXBsLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTItaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTNjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTItaW1wbC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJfSU1QTF9IX18KKyNkZWZpbmUgX19CTEFLRTJfSU1QTF9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHVpbnQzMl90KSBsb2FkMzIoIGNvbnN0IHZvaWQgKnNyYyApCit7CisjaWYgZGVmaW5lZChOQVRJVkVfTElUVExFX0VORElBTikKKyAgdWludDMyX3QgdzsKKyAgbWVtY3B5KCZ3LCBzcmMsIHNpemVvZiB3KTsKKyAgcmV0dXJuIHc7CisjZWxzZQorICBjb25zdCB1aW50OF90ICpwID0gKCBjb25zdCB1aW50OF90ICogKXNyYzsKKyAgdWludDMyX3QgdyA9ICpwKys7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgIDg7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgMTY7CisgIHcgfD0gKCB1aW50MzJfdCApKCAqcCsrICkgPDwgMjQ7CisgIHJldHVybiB3OworI2VuZGlmCit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDY0X3QpIGxvYWQ2NCggY29uc3Qgdm9pZCAqc3JjICkKK3sKKyNpZiBkZWZpbmVkKE5BVElWRV9MSVRUTEVfRU5ESUFOKQorICB1aW50NjRfdCB3OworICBtZW1jcHkoJncsIHNyYywgc2l6ZW9mIHcpOworICByZXR1cm4gdzsKKyNlbHNlCisgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoIGNvbnN0IHVpbnQ4X3QgKiApc3JjOworICB1aW50NjRfdCB3ID0gKnArKzsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAgODsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAxNjsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAyNDsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCAzMjsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA0MDsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA0ODsKKyAgdyB8PSAoIHVpbnQ2NF90ICkoICpwKysgKSA8PCA1NjsKKyAgcmV0dXJuIHc7CisjZW5kaWYKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzdG9yZTMyKCB2b2lkICpkc3QsIHVpbnQzMl90IHcgKQoreworI2lmIGRlZmluZWQoTkFUSVZFX0xJVFRMRV9FTkRJQU4pCisgIG1lbWNweShkc3QsICZ3LCBzaXplb2Ygdyk7CisjZWxzZQorICB1aW50OF90ICpwID0gKCB1aW50OF90ICogKWRzdDsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsKKyNlbmRpZgorfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHZvaWQpIHN0b3JlNjQoIHZvaWQgKmRzdCwgdWludDY0X3QgdyApCit7CisjaWYgZGVmaW5lZChOQVRJVkVfTElUVExFX0VORElBTikKKyAgbWVtY3B5KGRzdCwgJncsIHNpemVvZiB3KTsKKyNlbHNlCisgIHVpbnQ4X3QgKnAgPSAoIHVpbnQ4X3QgKiApZHN0OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OyB3ID4+PSA4OworICAqcCsrID0gKCB1aW50OF90ICl3OworI2VuZGlmCit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDY0X3QpIGxvYWQ0OCggY29uc3Qgdm9pZCAqc3JjICkKK3sKKyAgY29uc3QgdWludDhfdCAqcCA9ICggY29uc3QgdWludDhfdCAqIClzcmM7CisgIHVpbnQ2NF90IHcgPSAqcCsrOworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8ICA4OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDE2OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDI0OworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDMyOworICB3IHw9ICggdWludDY0X3QgKSggKnArKyApIDw8IDQwOworICByZXR1cm4gdzsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzdG9yZTQ4KCB2b2lkICpkc3QsIHVpbnQ2NF90IHcgKQoreworICB1aW50OF90ICpwID0gKCB1aW50OF90ICogKWRzdDsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsgdyA+Pj0gODsKKyAgKnArKyA9ICggdWludDhfdCApdzsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh1aW50MzJfdCkgcm90bDMyKCBjb25zdCB1aW50MzJfdCB3LCBjb25zdCB1bnNpZ25lZCBjICkKK3sKKyAgcmV0dXJuICggdyA8PCBjICkgfCAoIHcgPj4gKCAzMiAtIGMgKSApOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKHVpbnQ2NF90KSByb3RsNjQoIGNvbnN0IHVpbnQ2NF90IHcsIGNvbnN0IHVuc2lnbmVkIGMgKQoreworICByZXR1cm4gKCB3IDw8IGMgKSB8ICggdyA+PiAoIDY0IC0gYyApICk7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUodWludDMyX3QpIHJvdHIzMiggY29uc3QgdWludDMyX3QgdywgY29uc3QgdW5zaWduZWQgYyApCit7CisgIHJldHVybiAoIHcgPj4gYyApIHwgKCB3IDw8ICggMzIgLSBjICkgKTsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORSh1aW50NjRfdCkgcm90cjY0KCBjb25zdCB1aW50NjRfdCB3LCBjb25zdCB1bnNpZ25lZCBjICkKK3sKKyAgcmV0dXJuICggdyA+PiBjICkgfCAoIHcgPDwgKCA2NCAtIGMgKSApOworfQorCisvKiBwcmV2ZW50cyBjb21waWxlciBvcHRpbWl6aW5nIG91dCBtZW1zZXQoKSAqLworQkxBS0UyX0xPQ0FMX0lOTElORSh2b2lkKSBzZWN1cmVfemVyb19tZW1vcnkodm9pZCAqdiwgc2l6ZV90IG4pCit7CisgIHN0YXRpYyB2b2lkICooKmNvbnN0IHZvbGF0aWxlIG1lbXNldF92KSh2b2lkICosIGludCwgc2l6ZV90KSA9ICZtZW1zZXQ7CisgIG1lbXNldF92KHYsIDAsIG4pOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlmZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSByZWZlcmVuY2UgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMl9IX18KKyNkZWZpbmUgX19CTEFLRTJfSF9fCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIEJMQUtFMl9OT19JTkxJTkUKKyNkZWZpbmUgQkxBS0UyX0xPQ0FMX0lOTElORSh0eXBlKSBzdGF0aWMgdHlwZQorI2VuZGlmCisKKyNpZm5kZWYgQkxBS0UyX0xPQ0FMX0lOTElORQorI2RlZmluZSBCTEFLRTJfTE9DQUxfSU5MSU5FKHR5cGUpIHN0YXRpYyBpbmxpbmUgdHlwZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworICBlbnVtIGJsYWtlMnNfY29uc3RhbnQKKyAgeworICAgIEJMQUtFMlNfQkxPQ0tCWVRFUyA9IDY0LAorICAgIEJMQUtFMlNfT1VUQllURVMgICA9IDMyLAorICAgIEJMQUtFMlNfS0VZQllURVMgICA9IDMyLAorICAgIEJMQUtFMlNfU0FMVEJZVEVTICA9IDgsCisgICAgQkxBS0UyU19QRVJTT05BTEJZVEVTID0gOAorICB9OworCisgIGVudW0gYmxha2UyYl9jb25zdGFudAorICB7CisgICAgQkxBS0UyQl9CTE9DS0JZVEVTID0gMTI4LAorICAgIEJMQUtFMkJfT1VUQllURVMgICA9IDY0LAorICAgIEJMQUtFMkJfS0VZQllURVMgICA9IDY0LAorICAgIEJMQUtFMkJfU0FMVEJZVEVTICA9IDE2LAorICAgIEJMQUtFMkJfUEVSU09OQUxCWVRFUyA9IDE2CisgIH07CisKKyAgdHlwZWRlZiBzdHJ1Y3QgX19ibGFrZTJzX3N0YXRlCisgIHsKKyAgICB1aW50MzJfdCBoWzhdOworICAgIHVpbnQzMl90IHRbMl07CisgICAgdWludDMyX3QgZlsyXTsKKyAgICB1aW50OF90ICBidWZbMiAqIEJMQUtFMlNfQkxPQ0tCWVRFU107CisgICAgc2l6ZV90ICAgYnVmbGVuOworICAgIHVpbnQ4X3QgIGxhc3Rfbm9kZTsKKyAgfSBibGFrZTJzX3N0YXRlOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYl9zdGF0ZQorICB7CisgICAgdWludDY0X3QgaFs4XTsKKyAgICB1aW50NjRfdCB0WzJdOworICAgIHVpbnQ2NF90IGZbMl07CisgICAgdWludDhfdCAgYnVmWzIgKiBCTEFLRTJCX0JMT0NLQllURVNdOworICAgIHNpemVfdCAgIGJ1ZmxlbjsKKyAgICB1aW50OF90ICBsYXN0X25vZGU7CisgIH0gYmxha2UyYl9zdGF0ZTsKKworICB0eXBlZGVmIHN0cnVjdCBfX2JsYWtlMnNwX3N0YXRlCisgIHsKKyAgICBibGFrZTJzX3N0YXRlIFNbOF1bMV07CisgICAgYmxha2Uyc19zdGF0ZSBSWzFdOworICAgIHVpbnQ4X3QgYnVmWzggKiBCTEFLRTJTX0JMT0NLQllURVNdOworICAgIHNpemVfdCAgYnVmbGVuOworICB9IGJsYWtlMnNwX3N0YXRlOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYnBfc3RhdGUKKyAgeworICAgIGJsYWtlMmJfc3RhdGUgU1s0XVsxXTsKKyAgICBibGFrZTJiX3N0YXRlIFJbMV07CisgICAgdWludDhfdCBidWZbNCAqIEJMQUtFMkJfQkxPQ0tCWVRFU107CisgICAgc2l6ZV90ICBidWZsZW47CisgIH0gYmxha2UyYnBfc3RhdGU7CisKKworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2Uyc19wYXJhbQorICB7CisgICAgdWludDhfdCAgZGlnZXN0X2xlbmd0aDsgLyogMSAqLworICAgIHVpbnQ4X3QgIGtleV9sZW5ndGg7ICAgIC8qIDIgKi8KKyAgICB1aW50OF90ICBmYW5vdXQ7ICAgICAgICAvKiAzICovCisgICAgdWludDhfdCAgZGVwdGg7ICAgICAgICAgLyogNCAqLworICAgIHVpbnQzMl90IGxlYWZfbGVuZ3RoOyAgIC8qIDggKi8KKyAgICB1aW50OF90ICBub2RlX29mZnNldFs2XTsvLyAxNAorICAgIHVpbnQ4X3QgIG5vZGVfZGVwdGg7ICAgIC8qIDE1ICovCisgICAgdWludDhfdCAgaW5uZXJfbGVuZ3RoOyAgLyogMTYgKi8KKyAgICAvKiB1aW50OF90ICByZXNlcnZlZFswXTsgKi8KKyAgICB1aW50OF90ICBzYWx0W0JMQUtFMlNfU0FMVEJZVEVTXTsgLyogMjQgKi8KKyAgICB1aW50OF90ICBwZXJzb25hbFtCTEFLRTJTX1BFUlNPTkFMQllURVNdOyAgLyogMzIgKi8KKyAgfSBibGFrZTJzX3BhcmFtOworCisgIHR5cGVkZWYgc3RydWN0IF9fYmxha2UyYl9wYXJhbQorICB7CisgICAgdWludDhfdCAgZGlnZXN0X2xlbmd0aDsgLyogMSAqLworICAgIHVpbnQ4X3QgIGtleV9sZW5ndGg7ICAgIC8qIDIgKi8KKyAgICB1aW50OF90ICBmYW5vdXQ7ICAgICAgICAvKiAzICovCisgICAgdWludDhfdCAgZGVwdGg7ICAgICAgICAgLyogNCAqLworICAgIHVpbnQzMl90IGxlYWZfbGVuZ3RoOyAgIC8qIDggKi8KKyAgICB1aW50NjRfdCBub2RlX29mZnNldDsgICAvKiAxNiAqLworICAgIHVpbnQ4X3QgIG5vZGVfZGVwdGg7ICAgIC8qIDE3ICovCisgICAgdWludDhfdCAgaW5uZXJfbGVuZ3RoOyAgLyogMTggKi8KKyAgICB1aW50OF90ICByZXNlcnZlZFsxNF07ICAvKiAzMiAqLworICAgIHVpbnQ4X3QgIHNhbHRbQkxBS0UyQl9TQUxUQllURVNdOyAvKiA0OCAqLworICAgIHVpbnQ4X3QgIHBlcnNvbmFsW0JMQUtFMkJfUEVSU09OQUxCWVRFU107ICAvKiA2NCAqLworICB9IGJsYWtlMmJfcGFyYW07CisjcHJhZ21hIHBhY2socG9wKQorCisgIC8qIFN0cmVhbWluZyBBUEkgKi8KKyAgaW50IGJsYWtlMnNfaW5pdCggYmxha2Uyc19zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKTsKKyAgaW50IGJsYWtlMnNfaW5pdF9rZXkoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICk7CisgIGludCBibGFrZTJzX2luaXRfcGFyYW0oIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IGJsYWtlMnNfcGFyYW0gKlAgKTsKKyAgaW50IGJsYWtlMnNfdXBkYXRlKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKTsKKyAgaW50IGJsYWtlMnNfZmluYWwoIGJsYWtlMnNfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKTsKKworICBpbnQgYmxha2UyYl9pbml0KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApOworICBpbnQgYmxha2UyYl9pbml0X2tleSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMmJfaW5pdF9wYXJhbSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgYmxha2UyYl9wYXJhbSAqUCApOworICBpbnQgYmxha2UyYl91cGRhdGUoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApOworICBpbnQgYmxha2UyYl9maW5hbCggYmxha2UyYl9zdGF0ZSAqUywgdWludDhfdCAqb3V0LCB1aW50OF90IG91dGxlbiApOworCisgIGludCBibGFrZTJzcF9pbml0KCBibGFrZTJzcF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKTsKKyAgaW50IGJsYWtlMnNwX2luaXRfa2V5KCBibGFrZTJzcF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMnNwX3VwZGF0ZSggYmxha2Uyc3Bfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApOworICBpbnQgYmxha2Uyc3BfZmluYWwoIGJsYWtlMnNwX3N0YXRlICpTLCB1aW50OF90ICpvdXQsIHVpbnQ4X3Qgb3V0bGVuICk7CisKKyAgaW50IGJsYWtlMmJwX2luaXQoIGJsYWtlMmJwX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApOworICBpbnQgYmxha2UyYnBfaW5pdF9rZXkoIGJsYWtlMmJwX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IGtleWxlbiApOworICBpbnQgYmxha2UyYnBfdXBkYXRlKCBibGFrZTJicF9zdGF0ZSAqUywgY29uc3QgdWludDhfdCAqaW4sIHVpbnQ2NF90IGlubGVuICk7CisgIGludCBibGFrZTJicF9maW5hbCggYmxha2UyYnBfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKTsKKworICAvKiBTaW1wbGUgQVBJICovCisgIGludCBibGFrZTJzKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKTsKKyAgaW50IGJsYWtlMmIoIHVpbnQ4X3QgKm91dCwgY29uc3Qgdm9pZCAqaW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHVpbnQ2NF90IGlubGVuLCB1aW50OF90IGtleWxlbiApOworCisgIGludCBibGFrZTJzcCggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICk7CisgIGludCBibGFrZTJicCggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICk7CisKKyAgc3RhdGljIGlubGluZSBpbnQgYmxha2UyKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQorICB7CisgICAgcmV0dXJuIGJsYWtlMmIoIG91dCwgaW4sIGtleSwgb3V0bGVuLCBpbmxlbiwga2V5bGVuICk7CisgIH0KKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItbG9hZC1zc2UyLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDRhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlMi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMkJfTE9BRF9TU0UyX0hfXworI2RlZmluZSBfX0JMQUtFMkJfTE9BRF9TU0UyX0hfXworCisjZGVmaW5lIExPQURfTVNHXzBfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTIsIG0wKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTQpCisjZGVmaW5lIExPQURfTVNHXzBfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTMsIG0xKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNywgbTUpCisjZGVmaW5lIExPQURfTVNHXzBfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtOCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzBfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTExLCBtOSk7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtMTMpCisjZGVmaW5lIExPQURfTVNHXzFfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTQsIG0xNCk7IGIxID0gX21tX3NldF9lcGk2NHgobTEzLCBtOSkKKyNkZWZpbmUgTE9BRF9NU0dfMV8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTEwKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE1KQorI2RlZmluZSBMT0FEX01TR18xXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0wLCBtMSk7IGIxID0gX21tX3NldF9lcGk2NHgobTUsIG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfMV80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMiwgbTEyKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMywgbTcpCisjZGVmaW5lIExPQURfTVNHXzJfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEyLCBtMTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTUpCisjZGVmaW5lIExPQURfTVNHXzJfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTAsIG04KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTMsIG0yKQorI2RlZmluZSBMT0FEX01TR18yXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtMTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG05LCBtNykKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE0KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTEpCisjZGVmaW5lIExPQURfTVNHXzNfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTMsIG03KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTEsIG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfM18yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMSwgbTkpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNCwgbTEyKQorI2RlZmluZSBMT0FEX01TR18zXzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMik7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtNCkKKyNkZWZpbmUgTE9BRF9NU0dfM180KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG02KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTApCisjZGVmaW5lIExPQURfTVNHXzRfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTUsIG05KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG0yKQorI2RlZmluZSBMT0FEX01TR180XzIoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG03LCBtMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE1LCBtNCkKKyNkZWZpbmUgTE9BRF9NU0dfNF8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTEsIG0xNCk7IGIxID0gX21tX3NldF9lcGk2NHgobTMsIG02KQorI2RlZmluZSBMT0FEX01TR180XzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xMiwgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMywgbTgpCisjZGVmaW5lIExPQURfTVNHXzVfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTYsIG0yKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTApCisjZGVmaW5lIExPQURfTVNHXzVfMihiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtMTEpCisjZGVmaW5lIExPQURfTVNHXzVfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG00KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMSwgbTE1KQorI2RlZmluZSBMT0FEX01TR181XzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMTMpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG05LCBtMTQpCisjZGVmaW5lIExPQURfTVNHXzZfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEsIG0xMik7IGIxID0gX21tX3NldF9lcGk2NHgobTQsIG0xNCkKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTUsIG01KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTAsIG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfNl8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG04LCBtOSkKKyNkZWZpbmUgTE9BRF9NU0dfNl80KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMywgbTcpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMSwgbTIpCisjZGVmaW5lIExPQURfTVNHXzdfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG0xMyk7IGIxID0gX21tX3NldF9lcGk2NHgobTMsIG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfN18yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMTQsIG0xMSk7IGIxID0gX21tX3NldF9lcGk2NHgobTksIG0xKQorI2RlZmluZSBMT0FEX01TR183XzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTUpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtOCkKKyNkZWZpbmUgTE9BRF9NU0dfN180KGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTApOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMCwgbTYpCisjZGVmaW5lIExPQURfTVNHXzhfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTE0LCBtNik7IGIxID0gX21tX3NldF9lcGk2NHgobTAsIG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOSwgbTE1KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTMpCisjZGVmaW5lIExPQURfTVNHXzhfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEzLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMCwgbTEpCisjZGVmaW5lIExPQURfTVNHXzhfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTcsIG0yKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNSwgbTQpCisjZGVmaW5lIExPQURfTVNHXzlfMShiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTgsIG0xMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTEsIG03KQorI2RlZmluZSBMT0FEX01TR185XzIoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG00LCBtMik7IGIxID0gX21tX3NldF9lcGk2NHgobTUsIG02KQorI2RlZmluZSBMT0FEX01TR185XzMoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG05LCBtMTUpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xMywgbTMpCisjZGVmaW5lIExPQURfTVNHXzlfNChiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0wLCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzEwXzEoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtMCk7IGIxID0gX21tX3NldF9lcGk2NHgobTYsIG00KQorI2RlZmluZSBMT0FEX01TR18xMF8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMywgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG03LCBtNSkKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMyhiMCwgYjEpIGIwID0gX21tX3NldF9lcGk2NHgobTEwLCBtOCk7IGIxID0gX21tX3NldF9lcGk2NHgobTE0LCBtMTIpCisjZGVmaW5lIExPQURfTVNHXzEwXzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0xMSwgbTkpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0xNSwgbTEzKQorI2RlZmluZSBMT0FEX01TR18xMV8xKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtNCwgbTE0KTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtMTMsIG05KQorI2RlZmluZSBMT0FEX01TR18xMV8yKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtOCwgbTEwKTsgYjEgPSBfbW1fc2V0X2VwaTY0eChtNiwgbTE1KQorI2RlZmluZSBMT0FEX01TR18xMV8zKGIwLCBiMSkgYjAgPSBfbW1fc2V0X2VwaTY0eChtMCwgbTEpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG01LCBtMTEpCisjZGVmaW5lIExPQURfTVNHXzExXzQoYjAsIGIxKSBiMCA9IF9tbV9zZXRfZXBpNjR4KG0yLCBtMTIpOyBiMSA9IF9tbV9zZXRfZXBpNjR4KG0zLCBtNykKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1sb2FkLXNzZTQxLmggYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLWxvYWQtc3NlNDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmExMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1sb2FkLXNzZTQxLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgICBCTEFLRTIgcmVmZXJlbmNlIHNvdXJjZSBjb2RlIHBhY2thZ2UgLSBvcHRpbWl6ZWQgQyBpbXBsZW1lbnRhdGlvbnMKKyAgCisgICBDb3B5cmlnaHQgMjAxMiwgU2FtdWVsIE5ldmVzIDxzbmV2ZXNAZGVpLnVjLnB0Pi4gIFlvdSBtYXkgdXNlIHRoaXMgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGUgQ0MwLCB0aGUgT3BlblNTTCBMaWNlbmNlLCBvciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlIDIuMCwgYXQKKyAgIHlvdXIgb3B0aW9uLiAgVGhlIHRlcm1zIG9mIHRoZXNlIGxpY2Vuc2VzIGNhbiBiZSBmb3VuZCBhdDoKKyAgCisgICAtIENDMCAxLjAgVW5pdmVyc2FsIDogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wCisgICAtIE9wZW5TU0wgbGljZW5zZSAgIDogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorICAgLSBBcGFjaGUgMi4wICAgICAgICA6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJMQUtFMiBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBmb3VuZCBhdAorICAgaHR0cHM6Ly9ibGFrZTIubmV0LgorKi8KKyNwcmFnbWEgb25jZQorI2lmbmRlZiBfX0JMQUtFMkJfTE9BRF9TU0U0MV9IX18KKyNkZWZpbmUgX19CTEFLRTJCX0xPQURfU1NFNDFfSF9fCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTEpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMiwgbTMpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18wXzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG0wLCBtMSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0yLCBtMyk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzBfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNCwgbTUpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTcpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18xXzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG03LCBtMik7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG00LCBtNik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzFfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTMsIG03LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMV8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9zaHVmZmxlX2VwaTMyKG0wLCBfTU1fU0hVRkZMRSgxLDAsMywyKSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG01LCBtMik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzFfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0xKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9hbGlnbnJfZXBpOChtNiwgbTUsIDgpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtMiwgbTcpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18yXzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG00LCBtMCk7IFwKK2IxID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtNiwgMHhGMCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzJfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYmxlbmRfZXBpMTYobTUsIG0xLCAweEYwKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG00KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtNywgbTMpOyBcCitiMSA9IF9tbV9hbGlnbnJfZXBpOChtMiwgbTAsIDgpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18zXzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG0zLCBtMSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG02LCBtNSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzNfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG0wKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfM18zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9ibGVuZF9lcGkxNihtMSwgbTIsIDB4RjApOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMiwgbTcsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18zXzQoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG0zLCBtNSk7IFwKK2IxID0gX21tX3VucGFja2xvX2VwaTY0KG0wLCBtNCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzRfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG0yKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTEsIG01KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNF8yKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV9ibGVuZF9lcGkxNihtMCwgbTMsIDB4RjApOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMiwgbTcsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR180XzMoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG03LCBtNSwgMHhGMCk7IFwKK2IxID0gX21tX2JsZW5kX2VwaTE2KG0zLCBtMSwgMHhGMCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzRfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYWxpZ25yX2VwaTgobTYsIG0wLCA4KTsgXAorYjEgPSBfbW1fYmxlbmRfZXBpMTYobTQsIG02LCAweEYwKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNV8xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMSwgbTMpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTQpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR181XzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG02LCBtNSk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG01LCBtMSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzVfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYmxlbmRfZXBpMTYobTIsIG0zLCAweEYwKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTcsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNV80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTIpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtNywgbTQsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR182XzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG02LCBtMCwgMHhGMCk7IFwKK2IxID0gX21tX3VucGFja2xvX2VwaTY0KG03LCBtMik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzZfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG03KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTUsIG02LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfNl8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTMpOyBcCitiMSA9IF9tbV9zaHVmZmxlX2VwaTMyKG00LCBfTU1fU0hVRkZMRSgxLDAsMywyKSk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzZfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0xKTsgXAorYjEgPSBfbW1fYmxlbmRfZXBpMTYobTEsIG01LCAweEYwKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2toaV9lcGk2NChtNiwgbTMpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtNiwgbTEsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR183XzIoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2FsaWducl9lcGk4KG03LCBtNSwgOCk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0wLCBtNCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzdfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG03KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG0xKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfN180KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCwgbTIpOyBcCitiMSA9IF9tbV91bnBhY2tsb19lcGk2NChtMywgbTUpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR184XzEoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2xvX2VwaTY0KG0zLCBtNyk7IFwKK2IxID0gX21tX2FsaWducl9lcGk4KG0wLCBtNSwgOCk7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzhfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTcsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTQsIG0xLCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfOF8zKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IG02OyBcCitiMSA9IF9tbV9hbGlnbnJfZXBpOChtNSwgbTAsIDgpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR184XzQoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtMywgMHhGMCk7IFwKK2IxID0gbTI7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzlfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTMsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfOV8yKGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtMSwgbTIpOyBcCitiMSA9IF9tbV9ibGVuZF9lcGkxNihtMywgbTIsIDB4RjApOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR185XzMoYjAsIGIxKSBcCitkbyBcCit7IFwKK2IwID0gX21tX3VucGFja2hpX2VwaTY0KG03LCBtNCk7IFwKK2IxID0gX21tX3VucGFja2hpX2VwaTY0KG0xLCBtNik7IFwKK30gd2hpbGUoMCkKKworCisjZGVmaW5lIExPQURfTVNHXzlfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fYWxpZ25yX2VwaTgobTcsIG01LCA4KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG0wKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTAsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTIsIG0zKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTAsIG0xKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsIG0zKTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTBfNChiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG01KTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTYsIG03KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMShiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTcsIG0yKTsgXAorYjEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTQsIG02KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMihiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTUsIG00KTsgXAorYjEgPSBfbW1fYWxpZ25yX2VwaTgobTMsIG03LCA4KTsgXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgTE9BRF9NU0dfMTFfMyhiMCwgYjEpIFwKK2RvIFwKK3sgXAorYjAgPSBfbW1fc2h1ZmZsZV9lcGkzMihtMCwgX01NX1NIVUZGTEUoMSwwLDMsMikpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtNSwgbTIpOyBcCit9IHdoaWxlKDApCisKKworI2RlZmluZSBMT0FEX01TR18xMV80KGIwLCBiMSkgXAorZG8gXAoreyBcCitiMCA9IF9tbV91bnBhY2tsb19lcGk2NChtNiwgbTEpOyBcCitiMSA9IF9tbV91bnBhY2toaV9lcGk2NChtMywgbTEpOyBcCit9IHdoaWxlKDApCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItcmVmLmMgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLXJlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMTMwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLXJlZi5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gcmVmZXJlbmNlIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYmxha2UyLmgiCisjaW5jbHVkZSAiYmxha2UyLWltcGwuaCIKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGJsYWtlMmJfSVZbOF0gPQoreworICAweDZhMDllNjY3ZjNiY2M5MDhVTEwsIDB4YmI2N2FlODU4NGNhYTczYlVMTCwKKyAgMHgzYzZlZjM3MmZlOTRmODJiVUxMLCAweGE1NGZmNTNhNWYxZDM2ZjFVTEwsCisgIDB4NTEwZTUyN2ZhZGU2ODJkMVVMTCwgMHg5YjA1Njg4YzJiM2U2YzFmVUxMLAorICAweDFmODNkOWFiZmI0MWJkNmJVTEwsIDB4NWJlMGNkMTkxMzdlMjE3OVVMTAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxha2UyYl9zaWdtYVsxMl1bMTZdID0KK3sKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9ICwKKyAgeyAxMSwgIDgsIDEyLCAgMCwgIDUsICAyLCAxNSwgMTMsIDEwLCAxNCwgIDMsICA2LCAgNywgIDEsICA5LCAgNCB9ICwKKyAgeyAgNywgIDksICAzLCAgMSwgMTMsIDEyLCAxMSwgMTQsICAyLCAgNiwgIDUsIDEwLCAgNCwgIDAsIDE1LCAgOCB9ICwKKyAgeyAgOSwgIDAsICA1LCAgNywgIDIsICA0LCAxMCwgMTUsIDE0LCAgMSwgMTEsIDEyLCAgNiwgIDgsICAzLCAxMyB9ICwKKyAgeyAgMiwgMTIsICA2LCAxMCwgIDAsIDExLCAgOCwgIDMsICA0LCAxMywgIDcsICA1LCAxNSwgMTQsICAxLCAgOSB9ICwKKyAgeyAxMiwgIDUsICAxLCAxNSwgMTQsIDEzLCAgNCwgMTAsICAwLCAgNywgIDYsICAzLCAgOSwgIDIsICA4LCAxMSB9ICwKKyAgeyAxMywgMTEsICA3LCAxNCwgMTIsICAxLCAgMywgIDksICA1LCAgMCwgMTUsICA0LCAgOCwgIDYsICAyLCAxMCB9ICwKKyAgeyAgNiwgMTUsIDE0LCAgOSwgMTEsICAzLCAgMCwgIDgsIDEyLCAgMiwgMTMsICA3LCAgMSwgIDQsIDEwLCAgNSB9ICwKKyAgeyAxMCwgIDIsICA4LCAgNCwgIDcsICA2LCAgMSwgIDUsIDE1LCAxMSwgIDksIDE0LCAgMywgMTIsIDEzICwgMCB9ICwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSB9ICwKKyAgeyAxNCwgMTAsICA0LCAgOCwgIDksIDE1LCAxMywgIDYsICAxLCAxMiwgIDAsICAyLCAxMSwgIDcsICA1LCAgMyB9Cit9OworCisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0bm9kZSggYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAtMTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2NsZWFyX2xhc3Rub2RlKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgUy0+ZlsxXSA9IDA7CisgIHJldHVybiAwOworfQorCisvKiBTb21lIGhlbHBlciBmdW5jdGlvbnMsIG5vdCBuZWNlc3NhcmlseSB1c2VmdWwgKi8KK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2lzX2xhc3RibG9jayggY29uc3QgYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIHJldHVybiBTLT5mWzBdICE9IDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9zZXRfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9jbGVhcl9sYXN0YmxvY2soIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2UyYl9jbGVhcl9sYXN0bm9kZSggUyApOworCisgIFMtPmZbMF0gPSAwOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ2NF90IGluYyApCit7CisgIFMtPnRbMF0gKz0gaW5jOworICBTLT50WzFdICs9ICggUy0+dFswXSA8IGluYyApOworICByZXR1cm4gMDsKK30KKworCisKKy8qIFBhcmFtZXRlci1yZWxhdGVkIGZ1bmN0aW9ucyAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2RpZ2VzdF9sZW5ndGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGlnZXN0X2xlbmd0aCApCit7CisgIFAtPmRpZ2VzdF9sZW5ndGggPSBkaWdlc3RfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2Zhbm91dCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBmYW5vdXQgKQoreworICBQLT5mYW5vdXQgPSBmYW5vdXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbWF4X2RlcHRoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRlcHRoICkKK3sKKyAgUC0+ZGVwdGggPSBkZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9sZWFmX2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDMyX3QgbGVhZl9sZW5ndGggKQoreworICBzdG9yZTMyKCAmUC0+bGVhZl9sZW5ndGgsIGxlYWZfbGVuZ3RoICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgc3RvcmU2NCggJlAtPm5vZGVfb2Zmc2V0LCBub2RlX29mZnNldCApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X25vZGVfZGVwdGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3Qgbm9kZV9kZXB0aCApCit7CisgIFAtPm5vZGVfZGVwdGggPSBub2RlX2RlcHRoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2lubmVyX2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBpbm5lcl9sZW5ndGggKQoreworICBQLT5pbm5lcl9sZW5ndGggPSBpbm5lcl9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfc2FsdCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBzYWx0W0JMQUtFMkJfU0FMVEJZVEVTXSApCit7CisgIG1lbWNweSggUC0+c2FsdCwgc2FsdCwgQkxBS0UyQl9TQUxUQllURVMgKTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9wZXJzb25hbCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBwZXJzb25hbFtCTEFLRTJCX1BFUlNPTkFMQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5wZXJzb25hbCwgcGVyc29uYWwsIEJMQUtFMkJfUEVSU09OQUxCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfaW5pdDAoIGJsYWtlMmJfc3RhdGUgKlMgKQoreworICBpbnQgaTsKKyAgbWVtc2V0KCBTLCAwLCBzaXplb2YoIGJsYWtlMmJfc3RhdGUgKSApOworCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKSBTLT5oW2ldID0gYmxha2UyYl9JVltpXTsKKworICByZXR1cm4gMDsKK30KKworLyogaW5pdCB4b3JzIElWIHdpdGggaW5wdXQgcGFyYW1ldGVyIGJsb2NrICovCitpbnQgYmxha2UyYl9pbml0X3BhcmFtKCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCBibGFrZTJiX3BhcmFtICpQICkKK3sKKyAgY29uc3QgdWludDhfdCAqcCA9ICggY29uc3QgdWludDhfdCAqICkoIFAgKTsKKyAgc2l6ZV90IGk7CisKKyAgYmxha2UyYl9pbml0MCggUyApOworCisgIC8qIElWIFhPUiBQYXJhbUJsb2NrICovCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorICAgIFMtPmhbaV0gXj0gbG9hZDY0KCBwICsgc2l6ZW9mKCBTLT5oW2ldICkgKiBpICk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgYmxha2UyYl9pbml0KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApCit7CisgIGJsYWtlMmJfcGFyYW0gUFsxXTsKKworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSAwOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTY0KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICBtZW1zZXQoIFAtPnJlc2VydmVkLCAwLCBzaXplb2YoIFAtPnJlc2VydmVkICkgKTsKKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisgIHJldHVybiBibGFrZTJiX2luaXRfcGFyYW0oIFMsIFAgKTsKK30KKworCitpbnQgYmxha2UyYl9pbml0X2tleSggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4sIGNvbnN0IHZvaWQgKmtleSwgY29uc3QgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJiX3BhcmFtIFBbMV07CisKKyAgaWYgKCAoICFvdXRsZW4gKSB8fCAoIG91dGxlbiA+IEJMQUtFMkJfT1VUQllURVMgKSApIHJldHVybiAtMTsKKworICBpZiAoICFrZXkgfHwgIWtleWxlbiB8fCBrZXlsZW4gPiBCTEFLRTJCX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSBrZXlsZW47CisgIFAtPmZhbm91dCAgICAgICAgPSAxOworICBQLT5kZXB0aCAgICAgICAgID0gMTsKKyAgc3RvcmUzMiggJlAtPmxlYWZfbGVuZ3RoLCAwICk7CisgIHN0b3JlNjQoICZQLT5ub2RlX29mZnNldCwgMCApOworICBQLT5ub2RlX2RlcHRoICAgID0gMDsKKyAgUC0+aW5uZXJfbGVuZ3RoICA9IDA7CisgIG1lbXNldCggUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZiggUC0+cmVzZXJ2ZWQgKSApOworICBtZW1zZXQoIFAtPnNhbHQsICAgICAwLCBzaXplb2YoIFAtPnNhbHQgKSApOworICBtZW1zZXQoIFAtPnBlcnNvbmFsLCAwLCBzaXplb2YoIFAtPnBlcnNvbmFsICkgKTsKKworICBpZiggYmxha2UyYl9pbml0X3BhcmFtKCBTLCBQICkgPCAwICkgcmV0dXJuIC0xOworCisgIHsKKyAgICB1aW50OF90IGJsb2NrW0JMQUtFMkJfQkxPQ0tCWVRFU107CisgICAgbWVtc2V0KCBibG9jaywgMCwgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgbWVtY3B5KCBibG9jaywga2V5LCBrZXlsZW4gKTsKKyAgICBibGFrZTJiX3VwZGF0ZSggUywgYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSggYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOyAvKiBCdXJuIHRoZSBrZXkgZnJvbSBzdGFjayAqLworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsYWtlMmJfY29tcHJlc3MoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgYmxvY2tbQkxBS0UyQl9CTE9DS0JZVEVTXSApCit7CisgIHVpbnQ2NF90IG1bMTZdOworICB1aW50NjRfdCB2WzE2XTsKKyAgaW50IGk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDE2OyArK2kgKQorICAgIG1baV0gPSBsb2FkNjQoIGJsb2NrICsgaSAqIHNpemVvZiggbVtpXSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgdltpXSA9IFMtPmhbaV07CisKKyAgdlsgOF0gPSBibGFrZTJiX0lWWzBdOworICB2WyA5XSA9IGJsYWtlMmJfSVZbMV07CisgIHZbMTBdID0gYmxha2UyYl9JVlsyXTsKKyAgdlsxMV0gPSBibGFrZTJiX0lWWzNdOworICB2WzEyXSA9IFMtPnRbMF0gXiBibGFrZTJiX0lWWzRdOworICB2WzEzXSA9IFMtPnRbMV0gXiBibGFrZTJiX0lWWzVdOworICB2WzE0XSA9IFMtPmZbMF0gXiBibGFrZTJiX0lWWzZdOworICB2WzE1XSA9IFMtPmZbMV0gXiBibGFrZTJiX0lWWzddOworI2RlZmluZSBHKHIsaSxhLGIsYyxkKSBcCisgIGRvIHsgXAorICAgIGEgPSBhICsgYiArIG1bYmxha2UyYl9zaWdtYVtyXVsyKmkrMF1dOyBcCisgICAgZCA9IHJvdHI2NChkIF4gYSwgMzIpOyBcCisgICAgYyA9IGMgKyBkOyBcCisgICAgYiA9IHJvdHI2NChiIF4gYywgMjQpOyBcCisgICAgYSA9IGEgKyBiICsgbVtibGFrZTJiX3NpZ21hW3JdWzIqaSsxXV07IFwKKyAgICBkID0gcm90cjY0KGQgXiBhLCAxNik7IFwKKyAgICBjID0gYyArIGQ7IFwKKyAgICBiID0gcm90cjY0KGIgXiBjLCA2Myk7IFwKKyAgfSB3aGlsZSgwKQorI2RlZmluZSBST1VORChyKSAgXAorICBkbyB7IFwKKyAgICBHKHIsMCx2WyAwXSx2WyA0XSx2WyA4XSx2WzEyXSk7IFwKKyAgICBHKHIsMSx2WyAxXSx2WyA1XSx2WyA5XSx2WzEzXSk7IFwKKyAgICBHKHIsMix2WyAyXSx2WyA2XSx2WzEwXSx2WzE0XSk7IFwKKyAgICBHKHIsMyx2WyAzXSx2WyA3XSx2WzExXSx2WzE1XSk7IFwKKyAgICBHKHIsNCx2WyAwXSx2WyA1XSx2WzEwXSx2WzE1XSk7IFwKKyAgICBHKHIsNSx2WyAxXSx2WyA2XSx2WzExXSx2WzEyXSk7IFwKKyAgICBHKHIsNix2WyAyXSx2WyA3XSx2WyA4XSx2WzEzXSk7IFwKKyAgICBHKHIsNyx2WyAzXSx2WyA0XSx2WyA5XSx2WzE0XSk7IFwKKyAgfSB3aGlsZSgwKQorICBST1VORCggMCApOworICBST1VORCggMSApOworICBST1VORCggMiApOworICBST1VORCggMyApOworICBST1VORCggNCApOworICBST1VORCggNSApOworICBST1VORCggNiApOworICBST1VORCggNyApOworICBST1VORCggOCApOworICBST1VORCggOSApOworICBST1VORCggMTAgKTsKKyAgUk9VTkQoIDExICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSA9IFMtPmhbaV0gXiB2W2ldIF4gdltpICsgOF07CisKKyN1bmRlZiBHCisjdW5kZWYgUk9VTkQKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGlubGVuIG5vdyBpbiBieXRlcyAqLworaW50IGJsYWtlMmJfdXBkYXRlKCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKQoreworICB3aGlsZSggaW5sZW4gPiAwICkKKyAgeworICAgIHNpemVfdCBsZWZ0ID0gUy0+YnVmbGVuOworICAgIHNpemVfdCBmaWxsID0gMiAqIEJMQUtFMkJfQkxPQ0tCWVRFUyAtIGxlZnQ7CisKKyAgICBpZiggaW5sZW4gPiBmaWxsICkKKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBmaWxsICk7IC8qIEZpbGwgYnVmZmVyICovCisgICAgICBTLT5idWZsZW4gKz0gZmlsbDsKKyAgICAgIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgICAgYmxha2UyYl9jb21wcmVzcyggUywgUy0+YnVmICk7IC8qIENvbXByZXNzICovCisgICAgICBtZW1jcHkoIFMtPmJ1ZiwgUy0+YnVmICsgQkxBS0UyQl9CTE9DS0JZVEVTLCBCTEFLRTJCX0JMT0NLQllURVMgKTsgLyogU2hpZnQgYnVmZmVyIGxlZnQgKi8KKyAgICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJCX0JMT0NLQllURVM7CisgICAgICBpbiArPSBmaWxsOworICAgICAgaW5sZW4gLT0gZmlsbDsKKyAgICB9CisgICAgZWxzZSAvKiBpbmxlbiA8PSBmaWxsICovCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgaW5sZW4gKTsKKyAgICAgIFMtPmJ1ZmxlbiArPSBpbmxlbjsgLyogQmUgbGF6eSwgZG8gbm90IGNvbXByZXNzICovCisgICAgICBpbiArPSBpbmxlbjsKKyAgICAgIGlubGVuIC09IGlubGVuOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCisvKiBJcyB0aGlzIGNvcnJlY3Q/ICovCitpbnQgYmxha2UyYl9maW5hbCggYmxha2UyYl9zdGF0ZSAqUywgdWludDhfdCAqb3V0LCB1aW50OF90IG91dGxlbiApCit7CisgIHVpbnQ4X3QgYnVmZmVyW0JMQUtFMkJfT1VUQllURVNdID0gezB9OworICBpbnQgaTsKKworICBpZiggb3V0ID09IE5VTEwgfHwgb3V0bGVuID09IDAgfHwgb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApCisgICAgcmV0dXJuIC0xOworCisgIGlmKCBibGFrZTJiX2lzX2xhc3RibG9jayggUyApICkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYoIFMtPmJ1ZmxlbiA+IEJMQUtFMkJfQkxPQ0tCWVRFUyApCisgIHsKKyAgICBibGFrZTJiX2luY3JlbWVudF9jb3VudGVyKCBTLCBCTEFLRTJCX0JMT0NLQllURVMgKTsKKyAgICBibGFrZTJiX2NvbXByZXNzKCBTLCBTLT5idWYgKTsKKyAgICBTLT5idWZsZW4gLT0gQkxBS0UyQl9CTE9DS0JZVEVTOworICAgIG1lbWNweSggUy0+YnVmLCBTLT5idWYgKyBCTEFLRTJCX0JMT0NLQllURVMsIFMtPmJ1ZmxlbiApOworICB9CisKKyAgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggUywgUy0+YnVmbGVuICk7CisgIGJsYWtlMmJfc2V0X2xhc3RibG9jayggUyApOworICBtZW1zZXQoIFMtPmJ1ZiArIFMtPmJ1ZmxlbiwgMCwgMiAqIEJMQUtFMkJfQkxPQ0tCWVRFUyAtIFMtPmJ1ZmxlbiApOyAvKiBQYWRkaW5nICovCisgIGJsYWtlMmJfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKSAvKiBPdXRwdXQgZnVsbCBoYXNoIHRvIHRlbXAgYnVmZmVyICovCisgICAgc3RvcmU2NCggYnVmZmVyICsgc2l6ZW9mKCBTLT5oW2ldICkgKiBpLCBTLT5oW2ldICk7CisKKyAgbWVtY3B5KCBvdXQsIGJ1ZmZlciwgb3V0bGVuICk7CisgIHJldHVybiAwOworfQorCisvKiBpbmxlbiwgYXQgbGVhc3QsIHNob3VsZCBiZSB1aW50NjRfdC4gT3RoZXJzIGNhbiBiZSBzaXplX3QuICovCitpbnQgYmxha2UyYiggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2UyYl9zdGF0ZSBTWzFdOworCisgIC8qIFZlcmlmeSBwYXJhbWV0ZXJzICovCisgIGlmICggTlVMTCA9PSBpbiAmJiBpbmxlbiA+IDAgKSByZXR1cm4gLTE7CisKKyAgaWYgKCBOVUxMID09IG91dCApIHJldHVybiAtMTsKKworICBpZiggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiggIW91dGxlbiB8fCBvdXRsZW4gPiBCTEFLRTJCX09VVEJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiBCTEFLRTJCX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiAwICkKKyAgeworICAgIGlmKCBibGFrZTJiX2luaXRfa2V5KCBTLCBvdXRsZW4sIGtleSwga2V5bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKCBibGFrZTJiX2luaXQoIFMsIG91dGxlbiApIDwgMCApIHJldHVybiAtMTsKKyAgfQorCisgIGJsYWtlMmJfdXBkYXRlKCBTLCAoIGNvbnN0IHVpbnQ4X3QgKiApaW4sIGlubGVuICk7CisgIGJsYWtlMmJfZmluYWwoIFMsIG91dCwgb3V0bGVuICk7CisgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChTVVBFUkNPUCkKK2ludCBjcnlwdG9faGFzaCggdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBsb25nIGlubGVuICkKK3sKKyAgcmV0dXJuIGJsYWtlMmIoIG91dCwgaW4sIE5VTEwsIEJMQUtFMkJfT1VUQllURVMsIGlubGVuLCAwICk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQkxBS0UyQl9TRUxGVEVTVCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJibGFrZTIta2F0LmgiCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgdWludDhfdCBrZXlbQkxBS0UyQl9LRVlCWVRFU107CisgIHVpbnQ4X3QgYnVmW0tBVF9MRU5HVEhdOworICBzaXplX3QgaTsKKworICBmb3IoIGkgPSAwOyBpIDwgQkxBS0UyQl9LRVlCWVRFUzsgKytpICkKKyAgICBrZXlbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgICAgYnVmW2ldID0gKCB1aW50OF90IClpOworCisgIGZvciggaSA9IDA7IGkgPCBLQVRfTEVOR1RIOyArK2kgKQorICB7CisgICAgdWludDhfdCBoYXNoW0JMQUtFMkJfT1VUQllURVNdOworICAgIGJsYWtlMmIoIGhhc2gsIGJ1Ziwga2V5LCBCTEFLRTJCX09VVEJZVEVTLCBpLCBCTEFLRTJCX0tFWUJZVEVTICk7CisKKyAgICBpZiggMCAhPSBtZW1jbXAoIGhhc2gsIGJsYWtlMmJfa2V5ZWRfa2F0W2ldLCBCTEFLRTJCX09VVEJZVEVTICkgKQorICAgIHsKKyAgICAgIHB1dHMoICJlcnJvciIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBwdXRzKCAib2siICk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItcm91bmQuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmItcm91bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2UyMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2UyYi1yb3VuZC5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJCX1JPVU5EX0hfXworI2RlZmluZSBfX0JMQUtFMkJfUk9VTkRfSF9fCisKKyNkZWZpbmUgTE9BRFUocCkgIF9tbV9sb2FkdV9zaTEyOCggKGNvbnN0IF9fbTEyOGkgKikocCkgKQorI2RlZmluZSBTVE9SRVUocCxyKSBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpICopKHApLCByKQorCisjZGVmaW5lIFRPRihyZWcpIF9tbV9jYXN0c2kxMjhfcHMoKHJlZykpCisjZGVmaW5lIFRPSShyZWcpIF9tbV9jYXN0cHNfc2kxMjgoKHJlZykpCisKKyNkZWZpbmUgTElLRUxZKHgpIF9fYnVpbHRpbl9leHBlY3QoKHgpLDEpCisKKworLyogTWljcm9hcmNoaXRlY3R1cmUtc3BlY2lmaWMgbWFjcm9zICovCisjaWZuZGVmIEhBVkVfWE9QCisjaWZkZWYgSEFWRV9TU1NFMworI2RlZmluZSBfbW1fcm90aV9lcGk2NCh4LCBjKSBcCisgICAgKC0oYykgPT0gMzIpID8gX21tX3NodWZmbGVfZXBpMzIoKHgpLCBfTU1fU0hVRkZMRSgyLDMsMCwxKSkgIFwKKyAgICA6ICgtKGMpID09IDI0KSA/IF9tbV9zaHVmZmxlX2VwaTgoKHgpLCByMjQpIFwKKyAgICA6ICgtKGMpID09IDE2KSA/IF9tbV9zaHVmZmxlX2VwaTgoKHgpLCByMTYpIFwKKyAgICA6ICgtKGMpID09IDYzKSA/IF9tbV94b3Jfc2kxMjgoX21tX3NybGlfZXBpNjQoKHgpLCAtKGMpKSwgX21tX2FkZF9lcGk2NCgoeCksICh4KSkpICBcCisgICAgOiBfbW1feG9yX3NpMTI4KF9tbV9zcmxpX2VwaTY0KCh4KSwgLShjKSksIF9tbV9zbGxpX2VwaTY0KCh4KSwgNjQtKC0oYykpKSkKKyNlbHNlCisjZGVmaW5lIF9tbV9yb3RpX2VwaTY0KHIsIGMpIF9tbV94b3Jfc2kxMjgoX21tX3NybGlfZXBpNjQoIChyKSwgLShjKSApLF9tbV9zbGxpX2VwaTY0KCAociksIDY0LSgtKGMpKSApKQorI2VuZGlmCisjZWxzZQorLyogLi4uICovCisjZW5kaWYKKworCisKKyNkZWZpbmUgRzEocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgsYjAsYjEpIFwKKyAgcm93MWwgPSBfbW1fYWRkX2VwaTY0KF9tbV9hZGRfZXBpNjQocm93MWwsIGIwKSwgcm93MmwpOyBcCisgIHJvdzFoID0gX21tX2FkZF9lcGk2NChfbW1fYWRkX2VwaTY0KHJvdzFoLCBiMSksIHJvdzJoKTsgXAorICBcCisgIHJvdzRsID0gX21tX3hvcl9zaTEyOChyb3c0bCwgcm93MWwpOyBcCisgIHJvdzRoID0gX21tX3hvcl9zaTEyOChyb3c0aCwgcm93MWgpOyBcCisgIFwKKyAgcm93NGwgPSBfbW1fcm90aV9lcGk2NChyb3c0bCwgLTMyKTsgXAorICByb3c0aCA9IF9tbV9yb3RpX2VwaTY0KHJvdzRoLCAtMzIpOyBcCisgIFwKKyAgcm93M2wgPSBfbW1fYWRkX2VwaTY0KHJvdzNsLCByb3c0bCk7IFwKKyAgcm93M2ggPSBfbW1fYWRkX2VwaTY0KHJvdzNoLCByb3c0aCk7IFwKKyAgXAorICByb3cybCA9IF9tbV94b3Jfc2kxMjgocm93MmwsIHJvdzNsKTsgXAorICByb3cyaCA9IF9tbV94b3Jfc2kxMjgocm93MmgsIHJvdzNoKTsgXAorICBcCisgIHJvdzJsID0gX21tX3JvdGlfZXBpNjQocm93MmwsIC0yNCk7IFwKKyAgcm93MmggPSBfbW1fcm90aV9lcGk2NChyb3cyaCwgLTI0KTsgXAorIAorI2RlZmluZSBHMihyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCxiMCxiMSkgXAorICByb3cxbCA9IF9tbV9hZGRfZXBpNjQoX21tX2FkZF9lcGk2NChyb3cxbCwgYjApLCByb3cybCk7IFwKKyAgcm93MWggPSBfbW1fYWRkX2VwaTY0KF9tbV9hZGRfZXBpNjQocm93MWgsIGIxKSwgcm93MmgpOyBcCisgIFwKKyAgcm93NGwgPSBfbW1feG9yX3NpMTI4KHJvdzRsLCByb3cxbCk7IFwKKyAgcm93NGggPSBfbW1feG9yX3NpMTI4KHJvdzRoLCByb3cxaCk7IFwKKyAgXAorICByb3c0bCA9IF9tbV9yb3RpX2VwaTY0KHJvdzRsLCAtMTYpOyBcCisgIHJvdzRoID0gX21tX3JvdGlfZXBpNjQocm93NGgsIC0xNik7IFwKKyAgXAorICByb3czbCA9IF9tbV9hZGRfZXBpNjQocm93M2wsIHJvdzRsKTsgXAorICByb3czaCA9IF9tbV9hZGRfZXBpNjQocm93M2gsIHJvdzRoKTsgXAorICBcCisgIHJvdzJsID0gX21tX3hvcl9zaTEyOChyb3cybCwgcm93M2wpOyBcCisgIHJvdzJoID0gX21tX3hvcl9zaTEyOChyb3cyaCwgcm93M2gpOyBcCisgIFwKKyAgcm93MmwgPSBfbW1fcm90aV9lcGk2NChyb3cybCwgLTYzKTsgXAorICByb3cyaCA9IF9tbV9yb3RpX2VwaTY0KHJvdzJoLCAtNjMpOyBcCisgCisjaWYgZGVmaW5lZChIQVZFX1NTU0UzKQorI2RlZmluZSBESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCkgXAorICB0MCA9IF9tbV9hbGlnbnJfZXBpOChyb3cyaCwgcm93MmwsIDgpOyBcCisgIHQxID0gX21tX2FsaWducl9lcGk4KHJvdzJsLCByb3cyaCwgOCk7IFwKKyAgcm93MmwgPSB0MDsgXAorICByb3cyaCA9IHQxOyBcCisgIFwKKyAgdDAgPSByb3czbDsgXAorICByb3czbCA9IHJvdzNoOyBcCisgIHJvdzNoID0gdDA7ICAgIFwKKyAgXAorICB0MCA9IF9tbV9hbGlnbnJfZXBpOChyb3c0aCwgcm93NGwsIDgpOyBcCisgIHQxID0gX21tX2FsaWducl9lcGk4KHJvdzRsLCByb3c0aCwgOCk7IFwKKyAgcm93NGwgPSB0MTsgXAorICByb3c0aCA9IHQwOworCisjZGVmaW5lIFVORElBR09OQUxJWkUocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgpIFwKKyAgdDAgPSBfbW1fYWxpZ25yX2VwaTgocm93MmwsIHJvdzJoLCA4KTsgXAorICB0MSA9IF9tbV9hbGlnbnJfZXBpOChyb3cyaCwgcm93MmwsIDgpOyBcCisgIHJvdzJsID0gdDA7IFwKKyAgcm93MmggPSB0MTsgXAorICBcCisgIHQwID0gcm93M2w7IFwKKyAgcm93M2wgPSByb3czaDsgXAorICByb3czaCA9IHQwOyBcCisgIFwKKyAgdDAgPSBfbW1fYWxpZ25yX2VwaTgocm93NGwsIHJvdzRoLCA4KTsgXAorICB0MSA9IF9tbV9hbGlnbnJfZXBpOChyb3c0aCwgcm93NGwsIDgpOyBcCisgIHJvdzRsID0gdDE7IFwKKyAgcm93NGggPSB0MDsKKyNlbHNlCisKKyNkZWZpbmUgRElBR09OQUxJWkUocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgpIFwKKyAgdDAgPSByb3c0bDtcCisgIHQxID0gcm93Mmw7XAorICByb3c0bCA9IHJvdzNsO1wKKyAgcm93M2wgPSByb3czaDtcCisgIHJvdzNoID0gcm93NGw7XAorICByb3c0bCA9IF9tbV91bnBhY2toaV9lcGk2NChyb3c0aCwgX21tX3VucGFja2xvX2VwaTY0KHQwLCB0MCkpOyBcCisgIHJvdzRoID0gX21tX3VucGFja2hpX2VwaTY0KHQwLCBfbW1fdW5wYWNrbG9fZXBpNjQocm93NGgsIHJvdzRoKSk7IFwKKyAgcm93MmwgPSBfbW1fdW5wYWNraGlfZXBpNjQocm93MmwsIF9tbV91bnBhY2tsb19lcGk2NChyb3cyaCwgcm93MmgpKTsgXAorICByb3cyaCA9IF9tbV91bnBhY2toaV9lcGk2NChyb3cyaCwgX21tX3VucGFja2xvX2VwaTY0KHQxLCB0MSkpCisKKyNkZWZpbmUgVU5ESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCkgXAorICB0MCA9IHJvdzNsO1wKKyAgcm93M2wgPSByb3czaDtcCisgIHJvdzNoID0gdDA7XAorICB0MCA9IHJvdzJsO1wKKyAgdDEgPSByb3c0bDtcCisgIHJvdzJsID0gX21tX3VucGFja2hpX2VwaTY0KHJvdzJoLCBfbW1fdW5wYWNrbG9fZXBpNjQocm93MmwsIHJvdzJsKSk7IFwKKyAgcm93MmggPSBfbW1fdW5wYWNraGlfZXBpNjQodDAsIF9tbV91bnBhY2tsb19lcGk2NChyb3cyaCwgcm93MmgpKTsgXAorICByb3c0bCA9IF9tbV91bnBhY2toaV9lcGk2NChyb3c0bCwgX21tX3VucGFja2xvX2VwaTY0KHJvdzRoLCByb3c0aCkpOyBcCisgIHJvdzRoID0gX21tX3VucGFja2hpX2VwaTY0KHJvdzRoLCBfbW1fdW5wYWNrbG9fZXBpNjQodDEsIHQxKSkKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfU1NFNDEpCisjaW5jbHVkZSAiYmxha2UyYi1sb2FkLXNzZTQxLmgiCisjZWxzZQorI2luY2x1ZGUgImJsYWtlMmItbG9hZC1zc2UyLmgiCisjZW5kaWYKKworI2RlZmluZSBST1VORChyKSBcCisgIExPQURfTVNHXyAjI3IgIyNfMShiMCwgYjEpOyBcCisgIEcxKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoLGIwLGIxKTsgXAorICBMT0FEX01TR18gIyNyICMjXzIoYjAsIGIxKTsgXAorICBHMihyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCxiMCxiMSk7IFwKKyAgRElBR09OQUxJWkUocm93MWwscm93Mmwscm93M2wscm93NGwscm93MWgscm93Mmgscm93M2gscm93NGgpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfMyhiMCwgYjEpOyBcCisgIEcxKHJvdzFsLHJvdzJsLHJvdzNsLHJvdzRsLHJvdzFoLHJvdzJoLHJvdzNoLHJvdzRoLGIwLGIxKTsgXAorICBMT0FEX01TR18gIyNyICMjXzQoYjAsIGIxKTsgXAorICBHMihyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCxiMCxiMSk7IFwKKyAgVU5ESUFHT05BTElaRShyb3cxbCxyb3cybCxyb3czbCxyb3c0bCxyb3cxaCxyb3cyaCxyb3czaCxyb3c0aCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLmMgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNzlmYQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMmIuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIG9wdGltaXplZCBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsYWtlMi5oIgorI2luY2x1ZGUgImJsYWtlMi1pbXBsLmgiCisKKyNpbmNsdWRlICJibGFrZTItY29uZmlnLmgiCisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPGludHJpbi5oPiAvKiBmb3IgX21tX3NldF9lcGk2NHggKi8KKyNlbmRpZgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2lmIGRlZmluZWQoSEFWRV9TU1NFMykKKyNpbmNsdWRlIDx0bW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9BVlgpCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfWE9QKQorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJibGFrZTJiLXJvdW5kLmgiCisKK3N0YXRpYyBjb25zdCB1aW50NjRfdCBibGFrZTJiX0lWWzhdID0KK3sKKyAgMHg2YTA5ZTY2N2YzYmNjOTA4VUxMLCAweGJiNjdhZTg1ODRjYWE3M2JVTEwsCisgIDB4M2M2ZWYzNzJmZTk0ZjgyYlVMTCwgMHhhNTRmZjUzYTVmMWQzNmYxVUxMLAorICAweDUxMGU1MjdmYWRlNjgyZDFVTEwsIDB4OWIwNTY4OGMyYjNlNmMxZlVMTCwKKyAgMHgxZjgzZDlhYmZiNDFiZDZiVUxMLCAweDViZTBjZDE5MTM3ZTIxNzlVTEwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWtlMmJfc2lnbWFbMTJdWzE2XSA9Cit7CisgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSAsCisgIHsgMTQsIDEwLCAgNCwgIDgsICA5LCAxNSwgMTMsICA2LCAgMSwgMTIsICAwLCAgMiwgMTEsICA3LCAgNSwgIDMgfSAsCisgIHsgMTEsICA4LCAxMiwgIDAsICA1LCAgMiwgMTUsIDEzLCAxMCwgMTQsICAzLCAgNiwgIDcsICAxLCAgOSwgIDQgfSAsCisgIHsgIDcsICA5LCAgMywgIDEsIDEzLCAxMiwgMTEsIDE0LCAgMiwgIDYsICA1LCAxMCwgIDQsICAwLCAxNSwgIDggfSAsCisgIHsgIDksICAwLCAgNSwgIDcsICAyLCAgNCwgMTAsIDE1LCAxNCwgIDEsIDExLCAxMiwgIDYsICA4LCAgMywgMTMgfSAsCisgIHsgIDIsIDEyLCAgNiwgMTAsICAwLCAxMSwgIDgsICAzLCAgNCwgMTMsICA3LCAgNSwgMTUsIDE0LCAgMSwgIDkgfSAsCisgIHsgMTIsICA1LCAgMSwgMTUsIDE0LCAxMywgIDQsIDEwLCAgMCwgIDcsICA2LCAgMywgIDksICAyLCAgOCwgMTEgfSAsCisgIHsgMTMsIDExLCAgNywgMTQsIDEyLCAgMSwgIDMsICA5LCAgNSwgIDAsIDE1LCAgNCwgIDgsICA2LCAgMiwgMTAgfSAsCisgIHsgIDYsIDE1LCAxNCwgIDksIDExLCAgMywgIDAsICA4LCAxMiwgIDIsIDEzLCAgNywgIDEsICA0LCAxMCwgIDUgfSAsCisgIHsgMTAsICAyLCAgOCwgIDQsICA3LCAgNiwgIDEsICA1LCAxNSwgMTEsICA5LCAxNCwgIDMsIDEyLCAxMyAsIDAgfSAsCisgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSAsCisgIHsgMTQsIDEwLCAgNCwgIDgsICA5LCAxNSwgMTMsICA2LCAgMSwgMTIsICAwLCAgMiwgMTEsICA3LCAgNSwgIDMgfQorfTsKKworCisvKiBTb21lIGhlbHBlciBmdW5jdGlvbnMsIG5vdCBuZWNlc3NhcmlseSB1c2VmdWwgKi8KK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3NldF9sYXN0bm9kZSggYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAtMTsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX2NsZWFyX2xhc3Rub2RlKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgUy0+ZlsxXSA9IDA7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9pc19sYXN0YmxvY2soIGNvbnN0IGJsYWtlMmJfc3RhdGUgKlMgKQoreworICByZXR1cm4gUy0+ZlswXSAhPSAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9zZXRfbGFzdGJsb2NrKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMmJfc2V0X2xhc3Rub2RlKCBTICk7CisKKyAgUy0+ZlswXSA9IC0xOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfY2xlYXJfbGFzdGJsb2NrKCBibGFrZTJiX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMmJfY2xlYXJfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfaW5jcmVtZW50X2NvdW50ZXIoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ2NF90IGluYyApCit7CisjaWYgX194ODZfNjRfXworICAvKiBBREQvQURDIGNoYWluICovCisgIF9fdWludDEyOF90IHQgPSAoICggX191aW50MTI4X3QgKVMtPnRbMV0gPDwgNjQgKSB8IFMtPnRbMF07CisgIHQgKz0gaW5jOworICBTLT50WzBdID0gKCB1aW50NjRfdCApKCB0ID4+ICAwICk7CisgIFMtPnRbMV0gPSAoIHVpbnQ2NF90ICkoIHQgPj4gNjQgKTsKKyNlbHNlCisgIFMtPnRbMF0gKz0gaW5jOworICBTLT50WzFdICs9ICggUy0+dFswXSA8IGluYyApOworI2VuZGlmCisgIHJldHVybiAwOworfQorCisKKy8qIFBhcmFtZXRlci1yZWxhdGVkIGZ1bmN0aW9ucyAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2RpZ2VzdF9sZW5ndGgoIGJsYWtlMmJfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGlnZXN0X2xlbmd0aCApCit7CisgIFAtPmRpZ2VzdF9sZW5ndGggPSBkaWdlc3RfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X2Zhbm91dCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBmYW5vdXQgKQoreworICBQLT5mYW5vdXQgPSBmYW5vdXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbWF4X2RlcHRoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRlcHRoICkKK3sKKyAgUC0+ZGVwdGggPSBkZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9sZWFmX2xlbmd0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDMyX3QgbGVhZl9sZW5ndGggKQoreworICBQLT5sZWFmX2xlbmd0aCA9IGxlYWZfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X25vZGVfb2Zmc2V0KCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50NjRfdCBub2RlX29mZnNldCApCit7CisgIFAtPm5vZGVfb2Zmc2V0ID0gbm9kZV9vZmZzZXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfbm9kZV9kZXB0aCggYmxha2UyYl9wYXJhbSAqUCwgY29uc3QgdWludDhfdCBub2RlX2RlcHRoICkKK3sKKyAgUC0+bm9kZV9kZXB0aCA9IG5vZGVfZGVwdGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9wYXJhbV9zZXRfaW5uZXJfbGVuZ3RoKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGlubmVyX2xlbmd0aCApCit7CisgIFAtPmlubmVyX2xlbmd0aCA9IGlubmVyX2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJiX3BhcmFtX3NldF9zYWx0KCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHNhbHRbQkxBS0UyQl9TQUxUQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5zYWx0LCBzYWx0LCBCTEFLRTJCX1NBTFRCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMmJfcGFyYW1fc2V0X3BlcnNvbmFsKCBibGFrZTJiX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHBlcnNvbmFsW0JMQUtFMkJfUEVSU09OQUxCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnBlcnNvbmFsLCBwZXJzb25hbCwgQkxBS0UyQl9QRVJTT05BTEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9pbml0MCggYmxha2UyYl9zdGF0ZSAqUyApCit7CisgIGludCBpOworICBtZW1zZXQoIFMsIDAsIHNpemVvZiggYmxha2UyYl9zdGF0ZSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIFMtPmhbaV0gPSBibGFrZTJiX0lWW2ldOworCisgIHJldHVybiAwOworfQorCisvKiBpbml0IHhvcnMgSVYgd2l0aCBpbnB1dCBwYXJhbWV0ZXIgYmxvY2sgKi8KK2ludCBibGFrZTJiX2luaXRfcGFyYW0oIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IGJsYWtlMmJfcGFyYW0gKlAgKQoreworICAvKmJsYWtlMmJfaW5pdDAoIFMgKTsgKi8KKyAgY29uc3QgdWludDhfdCAqIHYgPSAoIGNvbnN0IHVpbnQ4X3QgKiApKCBibGFrZTJiX0lWICk7CisgIGNvbnN0IHVpbnQ4X3QgKiBwID0gKCBjb25zdCB1aW50OF90ICogKSggUCApOworICB1aW50OF90ICogaCA9ICggdWludDhfdCAqICkoIFMtPmggKTsKKyAgaW50IGk7CisgIC8qIElWIFhPUiBQYXJhbUJsb2NrICovCisgIG1lbXNldCggUywgMCwgc2l6ZW9mKCBibGFrZTJiX3N0YXRlICkgKTsKKworICBmb3IoIGkgPSAwOyBpIDwgQkxBS0UyQl9PVVRCWVRFUzsgKytpICkgaFtpXSA9IHZbaV0gXiBwW2ldOworCisgIHJldHVybiAwOworfQorCisKKy8qIFNvbWUgc29ydCBvZiBkZWZhdWx0IHBhcmFtZXRlciBibG9jayBpbml0aWFsaXphdGlvbiwgZm9yIHNlcXVlbnRpYWwgYmxha2UyYiAqLworaW50IGJsYWtlMmJfaW5pdCggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBvdXRsZW4gKQoreworICBjb25zdCBibGFrZTJiX3BhcmFtIFAgPQorICB7CisgICAgb3V0bGVuLAorICAgIDAsCisgICAgMSwKKyAgICAxLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgezB9LAorICAgIHswfSwKKyAgICB7MH0KKyAgfTsKKworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIHJldHVybiBibGFrZTJiX2luaXRfcGFyYW0oIFMsICZQICk7Cit9CisKK2ludCBibGFrZTJiX2luaXRfa2V5KCBibGFrZTJiX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IGtleWxlbiApCit7CisgIGNvbnN0IGJsYWtlMmJfcGFyYW0gUCA9CisgIHsKKyAgICBvdXRsZW4sCisgICAga2V5bGVuLAorICAgIDEsCisgICAgMSwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIHswfSwKKyAgICB7MH0sCisgICAgezB9CisgIH07CisKKyAgaWYgKCAoICFvdXRsZW4gKSB8fCAoIG91dGxlbiA+IEJMQUtFMkJfT1VUQllURVMgKSApIHJldHVybiAtMTsKKworICBpZiAoICggIWtleWxlbiApIHx8IGtleWxlbiA+IEJMQUtFMkJfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGJsYWtlMmJfaW5pdF9wYXJhbSggUywgJlAgKSA8IDAgKQorICAgIHJldHVybiAwOworCisgIHsKKyAgICB1aW50OF90IGJsb2NrW0JMQUtFMkJfQkxPQ0tCWVRFU107CisgICAgbWVtc2V0KCBibG9jaywgMCwgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgbWVtY3B5KCBibG9jaywga2V5LCBrZXlsZW4gKTsKKyAgICBibGFrZTJiX3VwZGF0ZSggUywgYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOworICAgIHNlY3VyZV96ZXJvX21lbW9yeSggYmxvY2ssIEJMQUtFMkJfQkxPQ0tCWVRFUyApOyAvKiBCdXJuIHRoZSBrZXkgZnJvbSBzdGFjayAqLworICB9CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2UyYl9jb21wcmVzcyggYmxha2UyYl9zdGF0ZSAqUywgY29uc3QgdWludDhfdCBibG9ja1tCTEFLRTJCX0JMT0NLQllURVNdICkKK3sKKyAgX19tMTI4aSByb3cxbCwgcm93MWg7CisgIF9fbTEyOGkgcm93MmwsIHJvdzJoOworICBfX20xMjhpIHJvdzNsLCByb3czaDsKKyAgX19tMTI4aSByb3c0bCwgcm93NGg7CisgIF9fbTEyOGkgYjAsIGIxOworICBfX20xMjhpIHQwLCB0MTsKKyNpZiBkZWZpbmVkKEhBVkVfU1NTRTMpICYmICFkZWZpbmVkKEhBVkVfWE9QKQorICBjb25zdCBfX20xMjhpIHIxNiA9IF9tbV9zZXRyX2VwaTgoIDIsIDMsIDQsIDUsIDYsIDcsIDAsIDEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDgsIDkgKTsKKyAgY29uc3QgX19tMTI4aSByMjQgPSBfbW1fc2V0cl9lcGk4KCAzLCA0LCA1LCA2LCA3LCAwLCAxLCAyLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDgsIDksIDEwICk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfU1NFNDEpCisgIGNvbnN0IF9fbTEyOGkgbTAgPSBMT0FEVSggYmxvY2sgKyAwMCApOworICBjb25zdCBfX20xMjhpIG0xID0gTE9BRFUoIGJsb2NrICsgMTYgKTsKKyAgY29uc3QgX19tMTI4aSBtMiA9IExPQURVKCBibG9jayArIDMyICk7CisgIGNvbnN0IF9fbTEyOGkgbTMgPSBMT0FEVSggYmxvY2sgKyA0OCApOworICBjb25zdCBfX20xMjhpIG00ID0gTE9BRFUoIGJsb2NrICsgNjQgKTsKKyAgY29uc3QgX19tMTI4aSBtNSA9IExPQURVKCBibG9jayArIDgwICk7CisgIGNvbnN0IF9fbTEyOGkgbTYgPSBMT0FEVSggYmxvY2sgKyA5NiApOworICBjb25zdCBfX20xMjhpIG03ID0gTE9BRFUoIGJsb2NrICsgMTEyICk7CisjZWxzZQorICBjb25zdCB1aW50NjRfdCAgbTAgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgMF07CisgIGNvbnN0IHVpbnQ2NF90ICBtMSA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyAxXTsKKyAgY29uc3QgdWludDY0X3QgIG0yID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDJdOworICBjb25zdCB1aW50NjRfdCAgbTMgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgM107CisgIGNvbnN0IHVpbnQ2NF90ICBtNCA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyA0XTsKKyAgY29uc3QgdWludDY0X3QgIG01ID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDVdOworICBjb25zdCB1aW50NjRfdCAgbTYgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgNl07CisgIGNvbnN0IHVpbnQ2NF90ICBtNyA9ICggKCB1aW50NjRfdCAqIClibG9jayApWyA3XTsKKyAgY29uc3QgdWludDY0X3QgIG04ID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbIDhdOworICBjb25zdCB1aW50NjRfdCAgbTkgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsgOV07CisgIGNvbnN0IHVpbnQ2NF90IG0xMCA9ICggKCB1aW50NjRfdCAqIClibG9jayApWzEwXTsKKyAgY29uc3QgdWludDY0X3QgbTExID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbMTFdOworICBjb25zdCB1aW50NjRfdCBtMTIgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsxMl07CisgIGNvbnN0IHVpbnQ2NF90IG0xMyA9ICggKCB1aW50NjRfdCAqIClibG9jayApWzEzXTsKKyAgY29uc3QgdWludDY0X3QgbTE0ID0gKCAoIHVpbnQ2NF90ICogKWJsb2NrIClbMTRdOworICBjb25zdCB1aW50NjRfdCBtMTUgPSAoICggdWludDY0X3QgKiApYmxvY2sgKVsxNV07CisjZW5kaWYKKyAgcm93MWwgPSBMT0FEVSggJlMtPmhbMF0gKTsKKyAgcm93MWggPSBMT0FEVSggJlMtPmhbMl0gKTsKKyAgcm93MmwgPSBMT0FEVSggJlMtPmhbNF0gKTsKKyAgcm93MmggPSBMT0FEVSggJlMtPmhbNl0gKTsKKyAgcm93M2wgPSBMT0FEVSggJmJsYWtlMmJfSVZbMF0gKTsKKyAgcm93M2ggPSBMT0FEVSggJmJsYWtlMmJfSVZbMl0gKTsKKyAgcm93NGwgPSBfbW1feG9yX3NpMTI4KCBMT0FEVSggJmJsYWtlMmJfSVZbNF0gKSwgTE9BRFUoICZTLT50WzBdICkgKTsKKyAgcm93NGggPSBfbW1feG9yX3NpMTI4KCBMT0FEVSggJmJsYWtlMmJfSVZbNl0gKSwgTE9BRFUoICZTLT5mWzBdICkgKTsKKyAgUk9VTkQoIDAgKTsKKyAgUk9VTkQoIDEgKTsKKyAgUk9VTkQoIDIgKTsKKyAgUk9VTkQoIDMgKTsKKyAgUk9VTkQoIDQgKTsKKyAgUk9VTkQoIDUgKTsKKyAgUk9VTkQoIDYgKTsKKyAgUk9VTkQoIDcgKTsKKyAgUk9VTkQoIDggKTsKKyAgUk9VTkQoIDkgKTsKKyAgUk9VTkQoIDEwICk7CisgIFJPVU5EKCAxMSApOworICByb3cxbCA9IF9tbV94b3Jfc2kxMjgoIHJvdzNsLCByb3cxbCApOworICByb3cxaCA9IF9tbV94b3Jfc2kxMjgoIHJvdzNoLCByb3cxaCApOworICBTVE9SRVUoICZTLT5oWzBdLCBfbW1feG9yX3NpMTI4KCBMT0FEVSggJlMtPmhbMF0gKSwgcm93MWwgKSApOworICBTVE9SRVUoICZTLT5oWzJdLCBfbW1feG9yX3NpMTI4KCBMT0FEVSggJlMtPmhbMl0gKSwgcm93MWggKSApOworICByb3cybCA9IF9tbV94b3Jfc2kxMjgoIHJvdzRsLCByb3cybCApOworICByb3cyaCA9IF9tbV94b3Jfc2kxMjgoIHJvdzRoLCByb3cyaCApOworICBTVE9SRVUoICZTLT5oWzRdLCBfbW1feG9yX3NpMTI4KCBMT0FEVSggJlMtPmhbNF0gKSwgcm93MmwgKSApOworICBTVE9SRVUoICZTLT5oWzZdLCBfbW1feG9yX3NpMTI4KCBMT0FEVSggJlMtPmhbNl0gKSwgcm93MmggKSApOworICByZXR1cm4gMDsKK30KKworCitpbnQgYmxha2UyYl91cGRhdGUoIGJsYWtlMmJfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApCit7CisgIHdoaWxlKCBpbmxlbiA+IDAgKQorICB7CisgICAgc2l6ZV90IGxlZnQgPSBTLT5idWZsZW47CisgICAgc2l6ZV90IGZpbGwgPSAyICogQkxBS0UyQl9CTE9DS0JZVEVTIC0gbGVmdDsKKworICAgIGlmKCBpbmxlbiA+IGZpbGwgKQorICAgIHsKKyAgICAgIG1lbWNweSggUy0+YnVmICsgbGVmdCwgaW4sIGZpbGwgKTsgLyogRmlsbCBidWZmZXIgKi8KKyAgICAgIFMtPmJ1ZmxlbiArPSBmaWxsOworICAgICAgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggUywgQkxBS0UyQl9CTE9DS0JZVEVTICk7CisgICAgICBibGFrZTJiX2NvbXByZXNzKCBTLCBTLT5idWYgKTsgLyogQ29tcHJlc3MgKi8KKyAgICAgIG1lbWNweSggUy0+YnVmLCBTLT5idWYgKyBCTEFLRTJCX0JMT0NLQllURVMsIEJMQUtFMkJfQkxPQ0tCWVRFUyApOyAvKiBTaGlmdCBidWZmZXIgbGVmdCAqLworICAgICAgUy0+YnVmbGVuIC09IEJMQUtFMkJfQkxPQ0tCWVRFUzsKKyAgICAgIGluICs9IGZpbGw7CisgICAgICBpbmxlbiAtPSBmaWxsOworICAgIH0KKyAgICBlbHNlIC8qIGlubGVuIDw9IGZpbGwgKi8KKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBpbmxlbiApOworICAgICAgUy0+YnVmbGVuICs9IGlubGVuOyAvKiBCZSBsYXp5LCBkbyBub3QgY29tcHJlc3MgKi8KKyAgICAgIGluICs9IGlubGVuOworICAgICAgaW5sZW4gLT0gaW5sZW47CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGJsYWtlMmJfZmluYWwoIGJsYWtlMmJfc3RhdGUgKlMsIHVpbnQ4X3QgKm91dCwgdWludDhfdCBvdXRsZW4gKQoreworICBpZiggb3V0bGVuID4gQkxBS0UyQl9PVVRCWVRFUyApCisgICAgcmV0dXJuIC0xOworCisgIGlmKCBibGFrZTJiX2lzX2xhc3RibG9jayggUyApICkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYoIFMtPmJ1ZmxlbiA+IEJMQUtFMkJfQkxPQ0tCWVRFUyApCisgIHsKKyAgICBibGFrZTJiX2luY3JlbWVudF9jb3VudGVyKCBTLCBCTEFLRTJCX0JMT0NLQllURVMgKTsKKyAgICBibGFrZTJiX2NvbXByZXNzKCBTLCBTLT5idWYgKTsKKyAgICBTLT5idWZsZW4gLT0gQkxBS0UyQl9CTE9DS0JZVEVTOworICAgIG1lbWNweSggUy0+YnVmLCBTLT5idWYgKyBCTEFLRTJCX0JMT0NLQllURVMsIFMtPmJ1ZmxlbiApOworICB9CisKKyAgYmxha2UyYl9pbmNyZW1lbnRfY291bnRlciggUywgUy0+YnVmbGVuICk7CisgIGJsYWtlMmJfc2V0X2xhc3RibG9jayggUyApOworICBtZW1zZXQoIFMtPmJ1ZiArIFMtPmJ1ZmxlbiwgMCwgMiAqIEJMQUtFMkJfQkxPQ0tCWVRFUyAtIFMtPmJ1ZmxlbiApOyAvKiBQYWRkaW5nICovCisgIGJsYWtlMmJfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworICBtZW1jcHkoIG91dCwgJlMtPmhbMF0sIG91dGxlbiApOworICByZXR1cm4gMDsKK30KKworCitpbnQgYmxha2UyYiggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2UyYl9zdGF0ZSBTWzFdOworCisgIC8qIFZlcmlmeSBwYXJhbWV0ZXJzICovCisgIGlmICggTlVMTCA9PSBpbiAmJiBpbmxlbiA+IDAgKSByZXR1cm4gLTE7CisKKyAgaWYgKCBOVUxMID09IG91dCApIHJldHVybiAtMTsKKworICBpZiggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiggIW91dGxlbiB8fCBvdXRsZW4gPiBCTEFLRTJCX09VVEJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiBCTEFLRTJCX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gKQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMmJfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2UyYl91cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2UyYl9maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2UyYiggb3V0LCBpbiwgTlVMTCwgQkxBS0UyQl9PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJCX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJCX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJCX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyQl9PVVRCWVRFU107CisgICAgYmxha2UyYiggaGFzaCwgYnVmLCBrZXksIEJMQUtFMkJfT1VUQllURVMsIGksIEJMQUtFMkJfS0VZQllURVMgKTsKKworICAgIGlmKCAwICE9IG1lbWNtcCggaGFzaCwgYmxha2UyYl9rZXllZF9rYXRbaV0sIEJMQUtFMkJfT1VUQllURVMgKSApCisgICAgeworICAgICAgcHV0cyggImVycm9yIiApOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHB1dHMoICJvayIgKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXNzZTIuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkZWZhNwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2UyLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIG9wdGltaXplZCBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworI3ByYWdtYSBvbmNlCisjaWZuZGVmIF9fQkxBS0UyU19MT0FEX1NTRTJfSF9fCisjZGVmaW5lIF9fQkxBS0UyU19MT0FEX1NTRTJfSF9fCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNixtNCxtMixtMCkKKyNkZWZpbmUgTE9BRF9NU0dfMF8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNyxtNSxtMyxtMSkKKyNkZWZpbmUgTE9BRF9NU0dfMF8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTQsbTEyLG0xMCxtOCkKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTUsbTEzLG0xMSxtOSkKKyNkZWZpbmUgTE9BRF9NU0dfMV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTMsbTksbTQsbTE0KQorI2RlZmluZSBMT0FEX01TR18xXzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG02LG0xNSxtOCxtMTApCisjZGVmaW5lIExPQURfTVNHXzFfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTUsbTExLG0wLG0xKQorI2RlZmluZSBMT0FEX01TR18xXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0zLG03LG0yLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTUsbTUsbTEyLG0xMSkKKyNkZWZpbmUgTE9BRF9NU0dfMl8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTMsbTIsbTAsbTgpCisjZGVmaW5lIExPQURfTVNHXzJfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTksbTcsbTMsbTEwKQorI2RlZmluZSBMT0FEX01TR18yXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG00LG0xLG02LG0xNCkKKyNkZWZpbmUgTE9BRF9NU0dfM18xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTEsbTEzLG0zLG03KQorI2RlZmluZSBMT0FEX01TR18zXzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xNCxtMTIsbTEsbTkpCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTE1LG00LG01LG0yKQorI2RlZmluZSBMT0FEX01TR18zXzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG0wLG0xMCxtNikKKyNkZWZpbmUgTE9BRF9NU0dfNF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTAsbTIsbTUsbTkpCisjZGVmaW5lIExPQURfTVNHXzRfMihidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTE1LG00LG03LG0wKQorI2RlZmluZSBMT0FEX01TR180XzMoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0zLG02LG0xMSxtMTQpCisjZGVmaW5lIExPQURfTVNHXzRfNChidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTEzLG04LG0xMixtMSkKKyNkZWZpbmUgTE9BRF9NU0dfNV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtOCxtMCxtNixtMikKKyNkZWZpbmUgTE9BRF9NU0dfNV8yKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMyxtMTEsbTEwLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfNV8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMSxtMTUsbTcsbTQpCisjZGVmaW5lIExPQURfTVNHXzVfNChidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTksbTE0LG01LG0xMykKKyNkZWZpbmUgTE9BRF9NU0dfNl8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNCxtMTQsbTEsbTEyKQorI2RlZmluZSBMT0FEX01TR182XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMCxtMTMsbTE1LG01KQorI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG05LG02LG0wKQorI2RlZmluZSBMT0FEX01TR182XzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMSxtMixtMyxtNykKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMyxtMTIsbTcsbTEzKQorI2RlZmluZSBMT0FEX01TR183XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG05LG0xLG0xNCxtMTEpCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTIsbTgsbTE1LG01KQorI2RlZmluZSBMT0FEX01TR183XzQoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG0xMCxtNixtNCxtMCkKKyNkZWZpbmUgTE9BRF9NU0dfOF8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMCxtMTEsbTE0LG02KQorI2RlZmluZSBMT0FEX01TR184XzIoYnVmKSBidWYgPSBfbW1fc2V0X2VwaTMyKG04LG0zLG05LG0xNSkKKyNkZWZpbmUgTE9BRF9NU0dfOF8zKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMTAsbTEsbTEzLG0xMikKKyNkZWZpbmUgTE9BRF9NU0dfOF80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtNSxtNCxtNyxtMikKKyNkZWZpbmUgTE9BRF9NU0dfOV8xKGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMSxtNyxtOCxtMTApCisjZGVmaW5lIExPQURfTVNHXzlfMihidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTUsbTYsbTQsbTIpCisjZGVmaW5lIExPQURfTVNHXzlfMyhidWYpIGJ1ZiA9IF9tbV9zZXRfZXBpMzIobTEzLG0zLG05LG0xNSkKKyNkZWZpbmUgTE9BRF9NU0dfOV80KGJ1ZikgYnVmID0gX21tX3NldF9lcGkzMihtMCxtMTIsbTE0LG0xMSkKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2U0MS5oIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXNzZTQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZjBjZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC1zc2U0MS5oCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJTX0xPQURfU1NFNDFfSF9fCisjZGVmaW5lIF9fQkxBS0UyU19MT0FEX1NTRTQxX0hfXworCisjZGVmaW5lIExPQURfTVNHXzBfMShidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTApLCBUT0YobTEpLCBfTU1fU0hVRkZMRSgyLDAsMiwwKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfMihidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTApLCBUT0YobTEpLCBfTU1fU0hVRkZMRSgzLDEsMywxKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfMyhidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTIpLCBUT0YobTMpLCBfTU1fU0hVRkZMRSgyLDAsMiwwKSkpOworCisjZGVmaW5lIExPQURfTVNHXzBfNChidWYpIFwKK2J1ZiA9IFRPSShfbW1fc2h1ZmZsZV9wcyhUT0YobTIpLCBUT0YobTMpLCBfTU1fU0hVRkZMRSgzLDEsMywxKSkpOworCisjZGVmaW5lIExPQURfTVNHXzFfMShidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0xLCBtMiwgMHgwQyk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgobTMsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCwgdDEsIDB4RjApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwxLDAsMykpOworCisjZGVmaW5lIExPQURfTVNHXzFfMihidWYpIFwKK3QwID0gX21tX3NodWZmbGVfZXBpMzIobTIsX01NX1NIVUZGTEUoMCwwLDIsMCkpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNihtMSxtMywweEMwKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDAsIHQxLCAweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMywwLDEpKTsKKworI2RlZmluZSBMT0FEX01TR18xXzMoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0xLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTIsIHQwLCAweDMwKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYobTAsIHQxLCAweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMywwLDEpKTsKKworI2RlZmluZSBMT0FEX01TR18xXzQoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgobTMsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCwgdDEsIDB4MEMpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwzLDAsMSkpOworCisjZGVmaW5lIExPQURfTVNHXzJfMShidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTMyKG0yLG0zKTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTEsMHgwQyk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLCB0MSwgMHgwRik7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLCBfTU1fU0hVRkZMRSgzLDEsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8yKGJ1ZikgXAordDAgPSBfbW1fdW5wYWNrbG9fZXBpMzIobTIsbTApOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNih0MCwgbTAsIDB4RjApOyBcCit0MiA9IF9tbV9zbGxpX3NpMTI4KG0zLCA4KTsgXAorYnVmID0gX21tX2JsZW5kX2VwaTE2KHQxLCB0MiwgMHhDMCk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8zKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTAsIG0yLCAweDNDKTsgXAordDEgPSBfbW1fc3JsaV9zaTEyOChtMSwgMTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDAzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsKKworI2RlZmluZSBMT0FEX01TR18yXzQoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0zLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTAsIG0xLCAweDMzKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDEsIHQwLCAweEMwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDAsMSwyLDMpKTsKKworI2RlZmluZSBMT0FEX01TR18zXzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3VucGFja2hpX2VwaTMyKHQwLCBtMik7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQxLCBtMywgMHgwQyk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLCBfTU1fU0hVRkZMRSgzLDEsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfM18yKGJ1ZikgXAordDAgPSBfbW1fc2xsaV9zaTEyOChtMiwgOCk7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KG0zLG0wLDB4MEMpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSwgdDAsIDB4QzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMiwwLDEsMykpOworCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0wLG0xLDB4MEYpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNih0MCwgbTMsIDB4QzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MSwgX01NX1NIVUZGTEUoMywwLDEsMikpOworCisjZGVmaW5lIExPQURfTVNHXzNfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0yKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpMzIobTEsbTIpOyBcCitidWYgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDEsdDApOworCisjZGVmaW5lIExPQURfTVNHXzRfMShidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTY0KG0xLG0yKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTAsbTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDMzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMCwxLDMpKTsKKworI2RlZmluZSBMT0FEX01TR180XzIoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGk2NChtMSxtMyk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTY0KG0wLG0xKTsgXAorYnVmID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MzMpOworCisjZGVmaW5lIExPQURfTVNHXzRfMyhidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTY0KG0zLG0xKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpNjQobTIsbTApOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsdDAsMHgzMyk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTAsbTIsMHgwMyk7IFwKK3QxID0gX21tX3NsbGlfc2kxMjgodDAsIDgpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSxtMywweDBGKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDEsMiwwLDMpKTsKKworI2RlZmluZSBMT0FEX01TR181XzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0yKTsgXAorYnVmID0gX21tX3VucGFja2xvX2VwaTY0KHQwLHQxKTsKKworI2RlZmluZSBMT0FEX01TR181XzIoYnVmKSBcCit0MCA9IF9tbV9zcmxpX3NpMTI4KG0yLCA0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTAsbTMsMHgwMyk7IFwKK2J1ZiA9IF9tbV9ibGVuZF9lcGkxNih0MSx0MCwweDNDKTsKKworI2RlZmluZSBMT0FEX01TR181XzMoYnVmKSBcCit0MCA9IF9tbV9ibGVuZF9lcGkxNihtMSxtMCwweDBDKTsgXAordDEgPSBfbW1fc3JsaV9zaTEyOChtMywgNCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MzApOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMSwyLDMsMCkpOworCisjZGVmaW5lIExPQURfTVNHXzVfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTY0KG0xLG0yKTsgXAordDE9IF9tbV9zaHVmZmxlX2VwaTMyKG0zLCBfTU1fU0hVRkZMRSgwLDIsMCwxKSk7IFwKK2J1ZiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDMzKTsKKworI2RlZmluZSBMT0FEX01TR182XzEoYnVmKSBcCit0MCA9IF9tbV9zbGxpX3NpMTI4KG0xLCAxMik7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KG0wLG0zLDB4MzMpOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsdDAsMHhDMCk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTIsMHgzMCk7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTEsIDQpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDAzKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsIF9NTV9TSFVGRkxFKDIsMSwzLDApKTsKKworI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBcCit0MCA9IF9tbV91bnBhY2tsb19lcGk2NChtMCxtMik7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTEsIDQpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMihfbW1fYmxlbmRfZXBpMTYodDAsdDEsMHgwQyksIF9NTV9TSFVGRkxFKDIsMywxLDApKTsKKworI2RlZmluZSBMT0FEX01TR182XzQoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMSxtMik7IFwKK3QxID0gX21tX3VucGFja2hpX2VwaTY0KG0wLHQwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDEsIF9NTV9TSFVGRkxFKDMsMCwxLDIpKTsKKworI2RlZmluZSBMT0FEX01TR183XzEoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMSk7IFwKK3QxID0gX21tX2JsZW5kX2VwaTE2KHQwLG0zLDB4MEYpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MSxfTU1fU0hVRkZMRSgyLDAsMywxKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfN18yKGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTIsbTMsMHgzMCk7IFwKK3QxID0gX21tX3NybGlfc2kxMjgobTAsNCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQwLHQxLDB4MDMpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MiwgX01NX1NIVUZGTEUoMSwwLDIsMykpOworCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTY0KG0wLG0zKTsgXAordDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQobTEsbTIpOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MCx0MSwweDNDKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDIsX01NX1NIVUZGTEUoMCwyLDMsMSkpOworCisjZGVmaW5lIExPQURfTVNHXzdfNChidWYpIFwKK3QwID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0xKTsgXAordDEgPSBfbW1fdW5wYWNraGlfZXBpMzIobTEsbTIpOyBcCitidWYgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDAsdDEpOworCisjZGVmaW5lIExPQURfTVNHXzhfMShidWYpIFwKK3QwID0gX21tX3VucGFja2hpX2VwaTMyKG0xLG0zKTsgXAordDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDAsbTApOyBcCit0MiA9IF9tbV9ibGVuZF9lcGkxNih0MSxtMiwweEMwKTsgXAorYnVmID0gX21tX3NodWZmbGVoaV9lcGkxNih0MixfTU1fU0hVRkZMRSgxLDAsMywyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGJ1ZikgXAordDAgPSBfbW1fdW5wYWNraGlfZXBpMzIobTAsbTMpOyBcCit0MSA9IF9tbV9ibGVuZF9lcGkxNihtMix0MCwweEYwKTsgXAorYnVmID0gX21tX3NodWZmbGVfZXBpMzIodDEsX01NX1NIVUZGTEUoMCwyLDEsMykpOworCisjZGVmaW5lIExPQURfTVNHXzhfMyhidWYpIFwKK3QwID0gX21tX2JsZW5kX2VwaTE2KG0yLG0wLDB4MEMpOyBcCit0MSA9IF9tbV9zbGxpX3NpMTI4KHQwLDQpOyBcCitidWYgPSBfbW1fYmxlbmRfZXBpMTYodDEsbTMsMHgwRik7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTEsbTAsMHgzMCk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQwLF9NTV9TSFVGRkxFKDEsMCwzLDIpKTsKKworI2RlZmluZSBMT0FEX01TR185XzEoYnVmKSBcCit0MCA9IF9tbV9ibGVuZF9lcGkxNihtMCxtMiwweDAzKTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTEsbTIsMHgzMCk7IFwKK3QyID0gX21tX2JsZW5kX2VwaTE2KHQxLHQwLDB4MEYpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MixfTU1fU0hVRkZMRSgxLDMsMCwyKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOV8yKGJ1ZikgXAordDAgPSBfbW1fc2xsaV9zaTEyOChtMCw0KTsgXAordDEgPSBfbW1fYmxlbmRfZXBpMTYobTEsdDAsMHhDMCk7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQxLF9NTV9TSFVGRkxFKDEsMiwwLDMpKTsKKworI2RlZmluZSBMT0FEX01TR185XzMoYnVmKSBcCit0MCA9IF9tbV91bnBhY2toaV9lcGkzMihtMCxtMyk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0yLG0zKTsgXAordDIgPSBfbW1fdW5wYWNraGlfZXBpNjQodDAsdDEpOyBcCitidWYgPSBfbW1fc2h1ZmZsZV9lcGkzMih0MixfTU1fU0hVRkZMRSgzLDAsMiwxKSk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOV80KGJ1ZikgXAordDAgPSBfbW1fYmxlbmRfZXBpMTYobTMsbTIsMHhDMCk7IFwKK3QxID0gX21tX3VucGFja2xvX2VwaTMyKG0wLG0zKTsgXAordDIgPSBfbW1fYmxlbmRfZXBpMTYodDAsdDEsMHgwRik7IFwKK2J1ZiA9IF9tbV9zaHVmZmxlX2VwaTMyKHQyLF9NTV9TSFVGRkxFKDAsMSwyLDMpKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC14b3AuaCBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMtbG9hZC14b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I1ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1sb2FkLXhvcC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICAgQkxBS0UyIHJlZmVyZW5jZSBzb3VyY2UgY29kZSBwYWNrYWdlIC0gb3B0aW1pemVkIEMgaW1wbGVtZW50YXRpb25zCisgIAorICAgQ29weXJpZ2h0IDIwMTIsIFNhbXVlbCBOZXZlcyA8c25ldmVzQGRlaS51Yy5wdD4uICBZb3UgbWF5IHVzZSB0aGlzIHVuZGVyIHRoZQorICAgdGVybXMgb2YgdGhlIENDMCwgdGhlIE9wZW5TU0wgTGljZW5jZSwgb3IgdGhlIEFwYWNoZSBQdWJsaWMgTGljZW5zZSAyLjAsIGF0CisgICB5b3VyIG9wdGlvbi4gIFRoZSB0ZXJtcyBvZiB0aGVzZSBsaWNlbnNlcyBjYW4gYmUgZm91bmQgYXQ6CisgIAorICAgLSBDQzAgMS4wIFVuaXZlcnNhbCA6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMAorICAgLSBPcGVuU1NMIGxpY2Vuc2UgICA6IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyAgIC0gQXBhY2hlIDIuMCAgICAgICAgOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBCTEFLRTIgaGFzaCBmdW5jdGlvbiBjYW4gYmUgZm91bmQgYXQKKyAgIGh0dHBzOi8vYmxha2UyLm5ldC4KKyovCisjcHJhZ21hIG9uY2UKKyNpZm5kZWYgX19CTEFLRTJTX0xPQURfWE9QX0hfXworI2RlZmluZSBfX0JMQUtFMlNfTE9BRF9YT1BfSF9fCisKKyNkZWZpbmUgVE9CKHgpICgoeCkqNCoweDAxMDEwMTAxICsgMHgwMzAyMDEwMCkgLyogLi5vciBub3QgVE9CICovCisKKy8qIEJhc2ljIFZQUEVSTSBlbXVsYXRpb24sIGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisvKnN0YXRpYyBfX20xMjhpIF9tbV9wZXJtX2VwaTgoY29uc3QgX19tMTI4aSBzcmMxLCBjb25zdCBfX20xMjhpIHNyYzIsIGNvbnN0IF9fbTEyOGkgc2VsKQoreworICAgY29uc3QgX19tMTI4aSBzaXh0ZWVuID0gX21tX3NldDFfZXBpOCgxNik7CisgICBjb25zdCBfX20xMjhpIHQwID0gX21tX3NodWZmbGVfZXBpOChzcmMxLCBzZWwpOworICAgY29uc3QgX19tMTI4aSBzMSA9IF9tbV9zaHVmZmxlX2VwaTgoc3JjMiwgX21tX3N1Yl9lcGk4KHNlbCwgc2l4dGVlbikpOworICAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX29yX3NpMTI4KF9tbV9jbXBlcV9lcGk4KHNlbCwgc2l4dGVlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2NtcGd0X2VwaTgoc2VsLCBzaXh0ZWVuKSk7IC8qICg+PTE2KSA9IDB4ZmYgOiAwMCAqLworICAgcmV0dXJuIF9tbV9ibGVuZHZfZXBpOCh0MCwgczEsIG1hc2spOworfSovCisKKyNkZWZpbmUgTE9BRF9NU0dfMF8xKGJ1ZikgXAorYnVmID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQig0KSxUT0IoMiksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzBfMihidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig3KSxUT0IoNSksVE9CKDMpLFRPQigxKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18wXzMoYnVmKSBcCitidWYgPSBfbW1fcGVybV9lcGk4KG0yLCBtMywgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDQpLFRPQigyKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMF80KGJ1ZikgXAorYnVmID0gX21tX3Blcm1fZXBpOChtMiwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDcpLFRPQig1KSxUT0IoMyksVE9CKDEpKSApOworCisjZGVmaW5lIExPQURfTVNHXzFfMShidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMSwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig1KSxUT0IoMCksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoNSksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMV8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMiksVE9CKDApLFRPQig0KSxUT0IoNikpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNyksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18xXzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMCksVE9CKDApLFRPQigxKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzFfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMiksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl8xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDEpLFRPQigwKSxUT0IoNykpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQig3KSxUT0IoMiksVE9CKDQpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18yXzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMiksVE9CKDApLFRPQig0KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDUpLFRPQigyKSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzJfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig3KSxUT0IoMyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNSksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfMl80KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoNCksVE9CKDEpLFRPQig2KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoMiksVE9CKDEpLFRPQig2KSkgKTsKKworI2RlZmluZSBMT0FEX01TR18zXzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDMpLFRPQig3KSkgKTsgXAordDAgPSBfbW1fcGVybV9lcGk4KHQwLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNSksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR18zXzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDEpLFRPQig1KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQig0KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzNfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig0KSxUT0IoNSksVE9CKDIpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfM180KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDApLFRPQigwKSxUT0IoNikpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig0KSxUT0IoMiksVE9CKDYpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR180XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMiksVE9CKDUpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDYpLFRPQigyKSxUT0IoMSksVE9CKDUpKSApOworCisjZGVmaW5lIExPQURfTVNHXzRfMihidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig0KSxUT0IoNyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF8zKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDYpLFRPQigwKSxUT0IoMCkpICk7IFwKK3QwID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNyksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNikpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNF80KGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMiwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDQpLFRPQigwKSxUT0IoMSkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMiksVE9CKDQpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR181XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDYpLFRPQigyKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQigyKSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzVfMihidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoNiksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNV8zKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMSksVE9CKDApLFRPQig3KSxUT0IoNCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNyksVE9CKDEpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR181XzQoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTEsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMCksVE9CKDEpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig2KSxUT0IoMSksVE9CKDUpKSApOworCisjZGVmaW5lIExPQURfTVNHXzZfMShidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQigwKSxUT0IoMSksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDYpLFRPQigxKSxUT0IoNCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfNl8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0xLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDApLFRPQigwKSxUT0IoMSkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNSksVE9CKDcpLFRPQigwKSkgKTsKKworI2RlZmluZSBMT0FEX01TR182XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMCksVE9CKDYpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDQpLFRPQig1KSxUT0IoMSksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzZfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQigyKSxUT0IoMyksVE9CKDcpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNyksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfN18xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDApLFRPQig3KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDAsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNCksVE9CKDEpLFRPQig1KSkgKTsKKworI2RlZmluZSBMT0FEX01TR183XzIoYnVmKSBcCit0MSA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoMSksVE9CKDApLFRPQig3KSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MSwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNiksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzdfMyhidWYpIFwKK3QwID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDIpLFRPQigwKSxUT0IoMCksVE9CKDUpKSApOyBcCit0MCA9IF9tbV9wZXJtX2VwaTgodDAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoNCksVE9CKDEpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNyksVE9CKDApKSApOworCisjZGVmaW5lIExPQURfTVNHXzdfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTEsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQig2KSxUT0IoNCksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNiksVE9CKDIpLFRPQigxKSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8xKGJ1ZikgXAordDAgPSBfbW1fcGVybV9lcGk4KG0wLCBtMSwgX21tX3NldF9lcGkzMihUT0IoMCksVE9CKDApLFRPQigwKSxUT0IoNikpICk7IFwKK3QwID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQig3KSxUT0IoMSksVE9CKDApKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQwLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDIpLFRPQig2KSxUT0IoMCkpICk7CisKKyNkZWZpbmUgTE9BRF9NU0dfOF8yKGJ1ZikgXAordDEgPSBfbW1fcGVybV9lcGk4KG0wLCBtMiwgX21tX3NldF9lcGkzMihUT0IoNCksVE9CKDMpLFRPQig1KSxUT0IoMCkpICk7IFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgodDEsIG0zLCBfbW1fc2V0X2VwaTMyKFRPQigzKSxUT0IoMiksVE9CKDEpLFRPQig3KSkgKTsKKworI2RlZmluZSBMT0FEX01TR184XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQig2KSxUT0IoMSksVE9CKDApLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNSksVE9CKDQpKSApOyBcCisgCisjZGVmaW5lIExPQURfTVNHXzhfNChidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoNCksVE9CKDcpLFRPQigyKSkgKTsKKworI2RlZmluZSBMT0FEX01TR185XzEoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQigxKSxUT0IoNyksVE9CKDApLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDMpLFRPQigyKSxUT0IoNCksVE9CKDYpKSApOworCisjZGVmaW5lIExPQURfTVNHXzlfMihidWYpIFwKK2J1ZiA9IF9tbV9wZXJtX2VwaTgobTAsIG0xLCBfbW1fc2V0X2VwaTMyKFRPQig1KSxUT0IoNiksVE9CKDQpLFRPQigyKSkgKTsKKworI2RlZmluZSBMT0FEX01TR185XzMoYnVmKSBcCit0MCA9IF9tbV9wZXJtX2VwaTgobTAsIG0yLCBfbW1fc2V0X2VwaTMyKFRPQigwKSxUT0IoMyksVE9CKDUpLFRPQigwKSkgKTsgXAorYnVmID0gX21tX3Blcm1fZXBpOCh0MCwgbTMsIF9tbV9zZXRfZXBpMzIoVE9CKDUpLFRPQigyKSxUT0IoMSksVE9CKDcpKSApOworCisjZGVmaW5lIExPQURfTVNHXzlfNChidWYpIFwKK3QxID0gX21tX3Blcm1fZXBpOChtMCwgbTIsIF9tbV9zZXRfZXBpMzIoVE9CKDApLFRPQigwKSxUT0IoMCksVE9CKDcpKSApOyBcCitidWYgPSBfbW1fcGVybV9lcGk4KHQxLCBtMywgX21tX3NldF9lcGkzMihUT0IoMyksVE9CKDQpLFRPQig2KSxUT0IoMCkpICk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLXJlZi5jIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBlOGVmCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yZWYuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIHJlZmVyZW5jZSBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsYWtlMi5oIgorI2luY2x1ZGUgImJsYWtlMi1pbXBsLmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBibGFrZTJzX0lWWzhdID0KK3sKKyAgMHg2QTA5RTY2N1VMLCAweEJCNjdBRTg1VUwsIDB4M0M2RUYzNzJVTCwgMHhBNTRGRjUzQVVMLAorICAweDUxMEU1MjdGVUwsIDB4OUIwNTY4OENVTCwgMHgxRjgzRDlBQlVMLCAweDVCRTBDRDE5VUwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWtlMnNfc2lnbWFbMTBdWzE2XSA9Cit7CisgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSAsCisgIHsgMTQsIDEwLCAgNCwgIDgsICA5LCAxNSwgMTMsICA2LCAgMSwgMTIsICAwLCAgMiwgMTEsICA3LCAgNSwgIDMgfSAsCisgIHsgMTEsICA4LCAxMiwgIDAsICA1LCAgMiwgMTUsIDEzLCAxMCwgMTQsICAzLCAgNiwgIDcsICAxLCAgOSwgIDQgfSAsCisgIHsgIDcsICA5LCAgMywgIDEsIDEzLCAxMiwgMTEsIDE0LCAgMiwgIDYsICA1LCAxMCwgIDQsICAwLCAxNSwgIDggfSAsCisgIHsgIDksICAwLCAgNSwgIDcsICAyLCAgNCwgMTAsIDE1LCAxNCwgIDEsIDExLCAxMiwgIDYsICA4LCAgMywgMTMgfSAsCisgIHsgIDIsIDEyLCAgNiwgMTAsICAwLCAxMSwgIDgsICAzLCAgNCwgMTMsICA3LCAgNSwgMTUsIDE0LCAgMSwgIDkgfSAsCisgIHsgMTIsICA1LCAgMSwgMTUsIDE0LCAxMywgIDQsIDEwLCAgMCwgIDcsICA2LCAgMywgIDksICAyLCAgOCwgMTEgfSAsCisgIHsgMTMsIDExLCAgNywgMTQsIDEyLCAgMSwgIDMsICA5LCAgNSwgIDAsIDE1LCAgNCwgIDgsICA2LCAgMiwgMTAgfSAsCisgIHsgIDYsIDE1LCAxNCwgIDksIDExLCAgMywgIDAsICA4LCAxMiwgIDIsIDEzLCAgNywgIDEsICA0LCAxMCwgIDUgfSAsCisgIHsgMTAsICAyLCAgOCwgIDQsICA3LCAgNiwgIDEsICA1LCAxNSwgMTEsICA5LCAxNCwgIDMsIDEyLCAxMyAsIDAgfSAsCit9OworCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19zZXRfbGFzdG5vZGUoIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBTLT5mWzFdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19jbGVhcl9sYXN0bm9kZSggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIFMtPmZbMV0gPSAwOworICByZXR1cm4gMDsKK30KKworLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLCBub3QgbmVjZXNzYXJpbHkgdXNlZnVsICovCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pc19sYXN0YmxvY2soIGNvbnN0IGJsYWtlMnNfc3RhdGUgKlMgKQoreworICByZXR1cm4gUy0+ZlswXSAhPSAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19zZXRfbGFzdGJsb2NrKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMnNfc2V0X2xhc3Rub2RlKCBTICk7CisKKyAgUy0+ZlswXSA9IC0xOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfY2xlYXJfbGFzdGJsb2NrKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgaWYoIFMtPmxhc3Rfbm9kZSApIGJsYWtlMnNfY2xlYXJfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50MzJfdCBpbmMgKQoreworICBTLT50WzBdICs9IGluYzsKKyAgUy0+dFsxXSArPSAoIFMtPnRbMF0gPCBpbmMgKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFBhcmFtZXRlci1yZWxhdGVkIGZ1bmN0aW9ucyAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X2RpZ2VzdF9sZW5ndGgoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGlnZXN0X2xlbmd0aCApCit7CisgIFAtPmRpZ2VzdF9sZW5ndGggPSBkaWdlc3RfbGVuZ3RoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X2Zhbm91dCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBmYW5vdXQgKQoreworICBQLT5mYW5vdXQgPSBmYW5vdXQ7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbWF4X2RlcHRoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGRlcHRoICkKK3sKKyAgUC0+ZGVwdGggPSBkZXB0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9sZWFmX2xlbmd0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDMyX3QgbGVhZl9sZW5ndGggKQoreworICBzdG9yZTMyKCAmUC0+bGVhZl9sZW5ndGgsIGxlYWZfbGVuZ3RoICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgc3RvcmU0OCggUC0+bm9kZV9vZmZzZXQsIG5vZGVfb2Zmc2V0ICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9kZXB0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBub2RlX2RlcHRoICkKK3sKKyAgUC0+bm9kZV9kZXB0aCA9IG5vZGVfZGVwdGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfaW5uZXJfbGVuZ3RoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGlubmVyX2xlbmd0aCApCit7CisgIFAtPmlubmVyX2xlbmd0aCA9IGlubmVyX2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9zYWx0KCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHNhbHRbQkxBS0UyU19TQUxUQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5zYWx0LCBzYWx0LCBCTEFLRTJTX1NBTFRCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X3BlcnNvbmFsKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHBlcnNvbmFsW0JMQUtFMlNfUEVSU09OQUxCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnBlcnNvbmFsLCBwZXJzb25hbCwgQkxBS0UyU19QRVJTT05BTEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pbml0MCggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIGludCBpOworICBtZW1zZXQoIFMsIDAsIHNpemVvZiggYmxha2Uyc19zdGF0ZSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIFMtPmhbaV0gPSBibGFrZTJzX0lWW2ldOworCisgIHJldHVybiAwOworfQorCisvKiBpbml0MiB4b3JzIElWIHdpdGggaW5wdXQgcGFyYW1ldGVyIGJsb2NrICovCitpbnQgYmxha2Uyc19pbml0X3BhcmFtKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCBibGFrZTJzX3BhcmFtICpQICkKK3sKKyAgY29uc3QgdWludDMyX3QgKnAgPSAoIGNvbnN0IHVpbnQzMl90ICogKSggUCApOworICBzaXplX3QgaTsKKworICBibGFrZTJzX2luaXQwKCBTICk7CisKKyAgLyogSVYgWE9SIFBhcmFtQmxvY2sgKi8KKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSBePSBsb2FkMzIoICZwW2ldICk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogU2VxdWVudGlhbCBibGFrZTJzIGluaXRpYWxpemF0aW9uICovCitpbnQgYmxha2Uyc19pbml0KCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiApCit7CisgIGJsYWtlMnNfcGFyYW0gUFsxXTsKKworICAvKiBNb3ZlIGludGVydmFsIHZlcmlmaWNhdGlvbiBoZXJlPyAqLworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyU19PVVRCWVRFUyApICkgcmV0dXJuIC0xOworCisgIFAtPmRpZ2VzdF9sZW5ndGggPSBvdXRsZW47CisgIFAtPmtleV9sZW5ndGggICAgPSAwOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTQ4KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICAvKiBtZW1zZXQoUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZihQLT5yZXNlcnZlZCkgKTsgKi8KKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisgIHJldHVybiBibGFrZTJzX2luaXRfcGFyYW0oIFMsIFAgKTsKK30KKworaW50IGJsYWtlMnNfaW5pdF9rZXkoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2Uyc19wYXJhbSBQWzFdOworCisgIGlmICggKCAhb3V0bGVuICkgfHwgKCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkgKSByZXR1cm4gLTE7CisKKyAgaWYgKCAha2V5IHx8ICFrZXlsZW4gfHwga2V5bGVuID4gQkxBS0UyU19LRVlCWVRFUyApIHJldHVybiAtMTsKKworICBQLT5kaWdlc3RfbGVuZ3RoID0gb3V0bGVuOworICBQLT5rZXlfbGVuZ3RoICAgID0ga2V5bGVuOworICBQLT5mYW5vdXQgICAgICAgID0gMTsKKyAgUC0+ZGVwdGggICAgICAgICA9IDE7CisgIHN0b3JlMzIoICZQLT5sZWFmX2xlbmd0aCwgMCApOworICBzdG9yZTQ4KCAmUC0+bm9kZV9vZmZzZXQsIDAgKTsKKyAgUC0+bm9kZV9kZXB0aCAgICA9IDA7CisgIFAtPmlubmVyX2xlbmd0aCAgPSAwOworICAvKiBtZW1zZXQoUC0+cmVzZXJ2ZWQsIDAsIHNpemVvZihQLT5yZXNlcnZlZCkgKTsgKi8KKyAgbWVtc2V0KCBQLT5zYWx0LCAgICAgMCwgc2l6ZW9mKCBQLT5zYWx0ICkgKTsKKyAgbWVtc2V0KCBQLT5wZXJzb25hbCwgMCwgc2l6ZW9mKCBQLT5wZXJzb25hbCApICk7CisKKyAgaWYoIGJsYWtlMnNfaW5pdF9wYXJhbSggUywgUCApIDwgMCApIHJldHVybiAtMTsKKworICB7CisgICAgdWludDhfdCBibG9ja1tCTEFLRTJTX0JMT0NLQllURVNdOworICAgIG1lbXNldCggYmxvY2ssIDAsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgIG1lbWNweSggYmxvY2ssIGtleSwga2V5bGVuICk7CisgICAgYmxha2Uyc191cGRhdGUoIFMsIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICBzZWN1cmVfemVyb19tZW1vcnkoIGJsb2NrLCBCTEFLRTJTX0JMT0NLQllURVMgKTsgLyogQnVybiB0aGUga2V5IGZyb20gc3RhY2sgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGFrZTJzX2NvbXByZXNzKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90IGJsb2NrW0JMQUtFMlNfQkxPQ0tCWVRFU10gKQoreworICB1aW50MzJfdCBtWzE2XTsKKyAgdWludDMyX3QgdlsxNl07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCAxNjsgKytpICkKKyAgICBtW2ldID0gbG9hZDMyKCBibG9jayArIGkgKiBzaXplb2YoIG1baV0gKSApOworCisgIGZvciggaSA9IDA7IGkgPCA4OyArK2kgKQorICAgIHZbaV0gPSBTLT5oW2ldOworCisgIHZbIDhdID0gYmxha2Uyc19JVlswXTsKKyAgdlsgOV0gPSBibGFrZTJzX0lWWzFdOworICB2WzEwXSA9IGJsYWtlMnNfSVZbMl07CisgIHZbMTFdID0gYmxha2Uyc19JVlszXTsKKyAgdlsxMl0gPSBTLT50WzBdIF4gYmxha2Uyc19JVls0XTsKKyAgdlsxM10gPSBTLT50WzFdIF4gYmxha2Uyc19JVls1XTsKKyAgdlsxNF0gPSBTLT5mWzBdIF4gYmxha2Uyc19JVls2XTsKKyAgdlsxNV0gPSBTLT5mWzFdIF4gYmxha2Uyc19JVls3XTsKKyNkZWZpbmUgRyhyLGksYSxiLGMsZCkgXAorICBkbyB7IFwKKyAgICBhID0gYSArIGIgKyBtW2JsYWtlMnNfc2lnbWFbcl1bMippKzBdXTsgXAorICAgIGQgPSByb3RyMzIoZCBeIGEsIDE2KTsgXAorICAgIGMgPSBjICsgZDsgXAorICAgIGIgPSByb3RyMzIoYiBeIGMsIDEyKTsgXAorICAgIGEgPSBhICsgYiArIG1bYmxha2Uyc19zaWdtYVtyXVsyKmkrMV1dOyBcCisgICAgZCA9IHJvdHIzMihkIF4gYSwgOCk7IFwKKyAgICBjID0gYyArIGQ7IFwKKyAgICBiID0gcm90cjMyKGIgXiBjLCA3KTsgXAorICB9IHdoaWxlKDApCisjZGVmaW5lIFJPVU5EKHIpICBcCisgIGRvIHsgXAorICAgIEcociwwLHZbIDBdLHZbIDRdLHZbIDhdLHZbMTJdKTsgXAorICAgIEcociwxLHZbIDFdLHZbIDVdLHZbIDldLHZbMTNdKTsgXAorICAgIEcociwyLHZbIDJdLHZbIDZdLHZbMTBdLHZbMTRdKTsgXAorICAgIEcociwzLHZbIDNdLHZbIDddLHZbMTFdLHZbMTVdKTsgXAorICAgIEcociw0LHZbIDBdLHZbIDVdLHZbMTBdLHZbMTVdKTsgXAorICAgIEcociw1LHZbIDFdLHZbIDZdLHZbMTFdLHZbMTJdKTsgXAorICAgIEcociw2LHZbIDJdLHZbIDddLHZbIDhdLHZbMTNdKTsgXAorICAgIEcociw3LHZbIDNdLHZbIDRdLHZbIDldLHZbMTRdKTsgXAorICB9IHdoaWxlKDApCisgIFJPVU5EKCAwICk7CisgIFJPVU5EKCAxICk7CisgIFJPVU5EKCAyICk7CisgIFJPVU5EKCAzICk7CisgIFJPVU5EKCA0ICk7CisgIFJPVU5EKCA1ICk7CisgIFJPVU5EKCA2ICk7CisgIFJPVU5EKCA3ICk7CisgIFJPVU5EKCA4ICk7CisgIFJPVU5EKCA5ICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApCisgICAgUy0+aFtpXSA9IFMtPmhbaV0gXiB2W2ldIF4gdltpICsgOF07CisKKyN1bmRlZiBHCisjdW5kZWYgUk9VTkQKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGJsYWtlMnNfdXBkYXRlKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90ICppbiwgdWludDY0X3QgaW5sZW4gKQoreworICB3aGlsZSggaW5sZW4gPiAwICkKKyAgeworICAgIHNpemVfdCBsZWZ0ID0gUy0+YnVmbGVuOworICAgIHNpemVfdCBmaWxsID0gMiAqIEJMQUtFMlNfQkxPQ0tCWVRFUyAtIGxlZnQ7CisKKyAgICBpZiggaW5sZW4gPiBmaWxsICkKKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBmaWxsICk7IC8qIEZpbGwgYnVmZmVyICovCisgICAgICBTLT5idWZsZW4gKz0gZmlsbDsKKyAgICAgIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgICAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7IC8qIENvbXByZXNzICovCisgICAgICBtZW1jcHkoIFMtPmJ1ZiwgUy0+YnVmICsgQkxBS0UyU19CTE9DS0JZVEVTLCBCTEFLRTJTX0JMT0NLQllURVMgKTsgLyogU2hpZnQgYnVmZmVyIGxlZnQgKi8KKyAgICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJTX0JMT0NLQllURVM7CisgICAgICBpbiArPSBmaWxsOworICAgICAgaW5sZW4gLT0gZmlsbDsKKyAgICB9CisgICAgZWxzZSAvKiBpbmxlbiA8PSBmaWxsICovCisgICAgeworICAgICAgbWVtY3B5KCBTLT5idWYgKyBsZWZ0LCBpbiwgaW5sZW4gKTsKKyAgICAgIFMtPmJ1ZmxlbiArPSBpbmxlbjsgLyogQmUgbGF6eSwgZG8gbm90IGNvbXByZXNzICovCisgICAgICBpbiArPSBpbmxlbjsKKyAgICAgIGlubGVuIC09IGlubGVuOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgYmxha2Uyc19maW5hbCggYmxha2Uyc19zdGF0ZSAqUywgdWludDhfdCAqb3V0LCB1aW50OF90IG91dGxlbiApCit7CisgIHVpbnQ4X3QgYnVmZmVyW0JMQUtFMlNfT1VUQllURVNdID0gezB9OworICBpbnQgaTsKKworICBpZiggb3V0ID09IE5VTEwgfHwgb3V0bGVuID09IDAgfHwgb3V0bGVuID4gQkxBS0UyU19PVVRCWVRFUyApCisgICAgcmV0dXJuIC0xOworCisgIGlmKCBibGFrZTJzX2lzX2xhc3RibG9jayggUyApICkKKyAgICByZXR1cm4gLTE7CisKKworICBpZiggUy0+YnVmbGVuID4gQkxBS0UyU19CTE9DS0JZVEVTICkKKyAgeworICAgIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgIGJsYWtlMnNfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJTX0JMT0NLQllURVM7CisgICAgbWVtY3B5KCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMlNfQkxPQ0tCWVRFUywgUy0+YnVmbGVuICk7CisgIH0KKworICBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBTLCAoIHVpbnQzMl90IClTLT5idWZsZW4gKTsKKyAgYmxha2Uyc19zZXRfbGFzdGJsb2NrKCBTICk7CisgIG1lbXNldCggUy0+YnVmICsgUy0+YnVmbGVuLCAwLCAyICogQkxBS0UyU19CTE9DS0JZVEVTIC0gUy0+YnVmbGVuICk7IC8qIFBhZGRpbmcgKi8KKyAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIC8qIE91dHB1dCBmdWxsIGhhc2ggdG8gdGVtcCBidWZmZXIgKi8KKyAgICBzdG9yZTMyKCBidWZmZXIgKyBzaXplb2YoIFMtPmhbaV0gKSAqIGksIFMtPmhbaV0gKTsKKyAgICAKKyAgbWVtY3B5KCBvdXQsIGJ1ZmZlciwgb3V0bGVuICk7CisgIHJldHVybiAwOworfQorCitpbnQgYmxha2UycyggdWludDhfdCAqb3V0LCBjb25zdCB2b2lkICppbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3QgdWludDY0X3QgaW5sZW4sIHVpbnQ4X3Qga2V5bGVuICkKK3sKKyAgYmxha2Uyc19zdGF0ZSBTWzFdOworCisgIC8qIFZlcmlmeSBwYXJhbWV0ZXJzICovCisgIGlmICggTlVMTCA9PSBpbiAmJiBpbmxlbiA+IDAgKSByZXR1cm4gLTE7CisKKyAgaWYgKCBOVUxMID09IG91dCApIHJldHVybiAtMTsKKworICBpZiAoIE5VTEwgPT0ga2V5ICYmIGtleWxlbiA+IDApIHJldHVybiAtMTsKKworICBpZiggIW91dGxlbiB8fCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiBCTEFLRTJTX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBrZXlsZW4gPiAwICkKKyAgeworICAgIGlmKCBibGFrZTJzX2luaXRfa2V5KCBTLCBvdXRsZW4sIGtleSwga2V5bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKCBibGFrZTJzX2luaXQoIFMsIG91dGxlbiApIDwgMCApIHJldHVybiAtMTsKKyAgfQorCisgIGJsYWtlMnNfdXBkYXRlKCBTLCAoIGNvbnN0IHVpbnQ4X3QgKiApaW4sIGlubGVuICk7CisgIGJsYWtlMnNfZmluYWwoIFMsIG91dCwgb3V0bGVuICk7CisgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChTVVBFUkNPUCkKK2ludCBjcnlwdG9faGFzaCggdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBsb25nIGlubGVuICkKK3sKKyAgcmV0dXJuIGJsYWtlMnMoIG91dCwgaW4sIE5VTEwsIEJMQUtFMlNfT1VUQllURVMsIGlubGVuLCAwICk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQkxBS0UyU19TRUxGVEVTVCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJibGFrZTIta2F0LmgiCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgdWludDhfdCBrZXlbQkxBS0UyU19LRVlCWVRFU107CisgIHVpbnQ4X3QgYnVmW0tBVF9MRU5HVEhdOworICBzaXplX3QgaTsKKworICBmb3IoIGkgPSAwOyBpIDwgQkxBS0UyU19LRVlCWVRFUzsgKytpICkKKyAgICBrZXlbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgICAgYnVmW2ldID0gKCB1aW50OF90IClpOworCisgIGZvciggaSA9IDA7IGkgPCBLQVRfTEVOR1RIOyArK2kgKQorICB7CisgICAgdWludDhfdCBoYXNoW0JMQUtFMlNfT1VUQllURVNdOworICAgIGJsYWtlMnMoIGhhc2gsIGJ1Ziwga2V5LCBCTEFLRTJTX09VVEJZVEVTLCBpLCBCTEFLRTJTX0tFWUJZVEVTICk7CisKKyAgICBpZiggMCAhPSBtZW1jbXAoIGhhc2gsIGJsYWtlMnNfa2V5ZWRfa2F0W2ldLCBCTEFLRTJTX09VVEJZVEVTICkgKQorICAgIHsKKyAgICAgIHB1dHMoICJlcnJvciIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBwdXRzKCAib2siICk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yb3VuZC5oIGIvTW9kdWxlcy9fYmxha2UyL2ltcGwvYmxha2Uycy1yb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzBkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLXJvdW5kLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIG9wdGltaXplZCBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworI3ByYWdtYSBvbmNlCisjaWZuZGVmIF9fQkxBS0UyU19ST1VORF9IX18KKyNkZWZpbmUgX19CTEFLRTJTX1JPVU5EX0hfXworCisjZGVmaW5lIExPQURVKHApICBfbW1fbG9hZHVfc2kxMjgoIChjb25zdCBfX20xMjhpICopKHApICkKKyNkZWZpbmUgU1RPUkVVKHAscikgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSAqKShwKSwgcikKKworI2RlZmluZSBUT0YocmVnKSBfbW1fY2FzdHNpMTI4X3BzKChyZWcpKQorI2RlZmluZSBUT0kocmVnKSBfbW1fY2FzdHBzX3NpMTI4KChyZWcpKQorCisjZGVmaW5lIExJS0VMWSh4KSBfX2J1aWx0aW5fZXhwZWN0KCh4KSwxKQorCisKKy8qIE1pY3JvYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG1hY3JvcyAqLworI2lmbmRlZiBIQVZFX1hPUAorI2lmZGVmIEhBVkVfU1NTRTMKKyNkZWZpbmUgX21tX3JvdGlfZXBpMzIociwgYykgKCBcCisgICAgICAgICAgICAgICAgKDg9PS0oYykpID8gX21tX3NodWZmbGVfZXBpOChyLHI4KSBcCisgICAgICAgICAgICAgIDogKDE2PT0tKGMpKSA/IF9tbV9zaHVmZmxlX2VwaTgocixyMTYpIFwKKyAgICAgICAgICAgICAgOiBfbW1feG9yX3NpMTI4KF9tbV9zcmxpX2VwaTMyKCAociksIC0oYykgKSxfbW1fc2xsaV9lcGkzMiggKHIpLCAzMi0oLShjKSkgKSkgKQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdGlfZXBpMzIociwgYykgX21tX3hvcl9zaTEyOChfbW1fc3JsaV9lcGkzMiggKHIpLCAtKGMpICksX21tX3NsbGlfZXBpMzIoIChyKSwgMzItKC0oYykpICkpCisjZW5kaWYKKyNlbHNlCisvKiAuLi4gKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgRzEocm93MSxyb3cyLHJvdzMscm93NCxidWYpIFwKKyAgcm93MSA9IF9tbV9hZGRfZXBpMzIoIF9tbV9hZGRfZXBpMzIoIHJvdzEsIGJ1ZiksIHJvdzIgKTsgXAorICByb3c0ID0gX21tX3hvcl9zaTEyOCggcm93NCwgcm93MSApOyBcCisgIHJvdzQgPSBfbW1fcm90aV9lcGkzMihyb3c0LCAtMTYpOyBcCisgIHJvdzMgPSBfbW1fYWRkX2VwaTMyKCByb3czLCByb3c0ICk7ICAgXAorICByb3cyID0gX21tX3hvcl9zaTEyOCggcm93Miwgcm93MyApOyBcCisgIHJvdzIgPSBfbW1fcm90aV9lcGkzMihyb3cyLCAtMTIpOworCisjZGVmaW5lIEcyKHJvdzEscm93Mixyb3czLHJvdzQsYnVmKSBcCisgIHJvdzEgPSBfbW1fYWRkX2VwaTMyKCBfbW1fYWRkX2VwaTMyKCByb3cxLCBidWYpLCByb3cyICk7IFwKKyAgcm93NCA9IF9tbV94b3Jfc2kxMjgoIHJvdzQsIHJvdzEgKTsgXAorICByb3c0ID0gX21tX3JvdGlfZXBpMzIocm93NCwgLTgpOyBcCisgIHJvdzMgPSBfbW1fYWRkX2VwaTMyKCByb3czLCByb3c0ICk7ICAgXAorICByb3cyID0gX21tX3hvcl9zaTEyOCggcm93Miwgcm93MyApOyBcCisgIHJvdzIgPSBfbW1fcm90aV9lcGkzMihyb3cyLCAtNyk7CisKKyNkZWZpbmUgRElBR09OQUxJWkUocm93MSxyb3cyLHJvdzMscm93NCkgXAorICByb3c0ID0gX21tX3NodWZmbGVfZXBpMzIoIHJvdzQsIF9NTV9TSFVGRkxFKDIsMSwwLDMpICk7IFwKKyAgcm93MyA9IF9tbV9zaHVmZmxlX2VwaTMyKCByb3czLCBfTU1fU0hVRkZMRSgxLDAsMywyKSApOyBcCisgIHJvdzIgPSBfbW1fc2h1ZmZsZV9lcGkzMiggcm93MiwgX01NX1NIVUZGTEUoMCwzLDIsMSkgKTsKKworI2RlZmluZSBVTkRJQUdPTkFMSVpFKHJvdzEscm93Mixyb3czLHJvdzQpIFwKKyAgcm93NCA9IF9tbV9zaHVmZmxlX2VwaTMyKCByb3c0LCBfTU1fU0hVRkZMRSgwLDMsMiwxKSApOyBcCisgIHJvdzMgPSBfbW1fc2h1ZmZsZV9lcGkzMiggcm93MywgX01NX1NIVUZGTEUoMSwwLDMsMikgKTsgXAorICByb3cyID0gX21tX3NodWZmbGVfZXBpMzIoIHJvdzIsIF9NTV9TSFVGRkxFKDIsMSwwLDMpICk7CisKKyNpZiBkZWZpbmVkKEhBVkVfWE9QKQorI2luY2x1ZGUgImJsYWtlMnMtbG9hZC14b3AuaCIKKyNlbGlmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyNpbmNsdWRlICJibGFrZTJzLWxvYWQtc3NlNDEuaCIKKyNlbHNlCisjaW5jbHVkZSAiYmxha2Uycy1sb2FkLXNzZTIuaCIKKyNlbmRpZgorCisjZGVmaW5lIFJPVU5EKHIpICBcCisgIExPQURfTVNHXyAjI3IgIyNfMShidWYxKTsgXAorICBHMShyb3cxLHJvdzIscm93Myxyb3c0LGJ1ZjEpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfMihidWYyKTsgXAorICBHMihyb3cxLHJvdzIscm93Myxyb3c0LGJ1ZjIpOyBcCisgIERJQUdPTkFMSVpFKHJvdzEscm93Mixyb3czLHJvdzQpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfMyhidWYzKTsgXAorICBHMShyb3cxLHJvdzIscm93Myxyb3c0LGJ1ZjMpOyBcCisgIExPQURfTVNHXyAjI3IgIyNfNChidWY0KTsgXAorICBHMihyb3cxLHJvdzIscm93Myxyb3c0LGJ1ZjQpOyBcCisgIFVORElBR09OQUxJWkUocm93MSxyb3cyLHJvdzMscm93NCk7IFwKKyAKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLmMgYi9Nb2R1bGVzL19ibGFrZTIvaW1wbC9ibGFrZTJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZDY2MgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2JsYWtlMi9pbXBsL2JsYWtlMnMuYwpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAgIEJMQUtFMiByZWZlcmVuY2Ugc291cmNlIGNvZGUgcGFja2FnZSAtIG9wdGltaXplZCBDIGltcGxlbWVudGF0aW9ucworICAKKyAgIENvcHlyaWdodCAyMDEyLCBTYW11ZWwgTmV2ZXMgPHNuZXZlc0BkZWkudWMucHQ+LiAgWW91IG1heSB1c2UgdGhpcyB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBDQzAsIHRoZSBPcGVuU1NMIExpY2VuY2UsIG9yIHRoZSBBcGFjaGUgUHVibGljIExpY2Vuc2UgMi4wLCBhdAorICAgeW91ciBvcHRpb24uICBUaGUgdGVybXMgb2YgdGhlc2UgbGljZW5zZXMgY2FuIGJlIGZvdW5kIGF0OgorICAKKyAgIC0gQ0MwIDEuMCBVbml2ZXJzYWwgOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAKKyAgIC0gT3BlblNTTCBsaWNlbnNlICAgOiBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisgICAtIEFwYWNoZSAyLjAgICAgICAgIDogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQkxBS0UyIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGZvdW5kIGF0CisgICBodHRwczovL2JsYWtlMi5uZXQuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImJsYWtlMi5oIgorI2luY2x1ZGUgImJsYWtlMi1pbXBsLmgiCisKKyNpbmNsdWRlICJibGFrZTItY29uZmlnLmgiCisKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2lmIGRlZmluZWQoSEFWRV9TU1NFMykKKyNpbmNsdWRlIDx0bW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9BVlgpCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBVkVfWE9QKQorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJibGFrZTJzLXJvdW5kLmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBibGFrZTJzX0lWWzhdID0KK3sKKyAgMHg2QTA5RTY2N1VMLCAweEJCNjdBRTg1VUwsIDB4M0M2RUYzNzJVTCwgMHhBNTRGRjUzQVVMLAorICAweDUxMEU1MjdGVUwsIDB4OUIwNTY4OENVTCwgMHgxRjgzRDlBQlVMLCAweDVCRTBDRDE5VUwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJsYWtlMnNfc2lnbWFbMTBdWzE2XSA9Cit7CisgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfSAsCisgIHsgMTQsIDEwLCAgNCwgIDgsICA5LCAxNSwgMTMsICA2LCAgMSwgMTIsICAwLCAgMiwgMTEsICA3LCAgNSwgIDMgfSAsCisgIHsgMTEsICA4LCAxMiwgIDAsICA1LCAgMiwgMTUsIDEzLCAxMCwgMTQsICAzLCAgNiwgIDcsICAxLCAgOSwgIDQgfSAsCisgIHsgIDcsICA5LCAgMywgIDEsIDEzLCAxMiwgMTEsIDE0LCAgMiwgIDYsICA1LCAxMCwgIDQsICAwLCAxNSwgIDggfSAsCisgIHsgIDksICAwLCAgNSwgIDcsICAyLCAgNCwgMTAsIDE1LCAxNCwgIDEsIDExLCAxMiwgIDYsICA4LCAgMywgMTMgfSAsCisgIHsgIDIsIDEyLCAgNiwgMTAsICAwLCAxMSwgIDgsICAzLCAgNCwgMTMsICA3LCAgNSwgMTUsIDE0LCAgMSwgIDkgfSAsCisgIHsgMTIsICA1LCAgMSwgMTUsIDE0LCAxMywgIDQsIDEwLCAgMCwgIDcsICA2LCAgMywgIDksICAyLCAgOCwgMTEgfSAsCisgIHsgMTMsIDExLCAgNywgMTQsIDEyLCAgMSwgIDMsICA5LCAgNSwgIDAsIDE1LCAgNCwgIDgsICA2LCAgMiwgMTAgfSAsCisgIHsgIDYsIDE1LCAxNCwgIDksIDExLCAgMywgIDAsICA4LCAxMiwgIDIsIDEzLCAgNywgIDEsICA0LCAxMCwgIDUgfSAsCisgIHsgMTAsICAyLCAgOCwgIDQsICA3LCAgNiwgIDEsICA1LCAxNSwgMTEsICA5LCAxNCwgIDMsIDEyLCAxMyAsIDAgfSAsCit9OworCisKKy8qIFNvbWUgaGVscGVyIGZ1bmN0aW9ucywgbm90IG5lY2Vzc2FyaWx5IHVzZWZ1bCAqLworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfc2V0X2xhc3Rub2RlKCBibGFrZTJzX3N0YXRlICpTICkKK3sKKyAgUy0+ZlsxXSA9IC0xOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfY2xlYXJfbGFzdG5vZGUoIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBTLT5mWzFdID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX2lzX2xhc3RibG9jayggY29uc3QgYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIHJldHVybiBTLT5mWzBdICE9IDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3NldF9sYXN0YmxvY2soIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2Uyc19zZXRfbGFzdG5vZGUoIFMgKTsKKworICBTLT5mWzBdID0gLTE7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19jbGVhcl9sYXN0YmxvY2soIGJsYWtlMnNfc3RhdGUgKlMgKQoreworICBpZiggUy0+bGFzdF9ub2RlICkgYmxha2Uyc19jbGVhcl9sYXN0bm9kZSggUyApOworCisgIFMtPmZbMF0gPSAwOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQzMl90IGluYyApCit7CisgIHVpbnQ2NF90IHQgPSAoICggdWludDY0X3QgKVMtPnRbMV0gPDwgMzIgKSB8IFMtPnRbMF07CisgIHQgKz0gaW5jOworICBTLT50WzBdID0gKCB1aW50MzJfdCApKCB0ID4+ICAwICk7CisgIFMtPnRbMV0gPSAoIHVpbnQzMl90ICkoIHQgPj4gMzIgKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogUGFyYW1ldGVyLXJlbGF0ZWQgZnVuY3Rpb25zICovCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfZGlnZXN0X2xlbmd0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBkaWdlc3RfbGVuZ3RoICkKK3sKKyAgUC0+ZGlnZXN0X2xlbmd0aCA9IGRpZ2VzdF9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfZmFub3V0KCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGZhbm91dCApCit7CisgIFAtPmZhbm91dCA9IGZhbm91dDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9tYXhfZGVwdGgoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ4X3QgZGVwdGggKQoreworICBQLT5kZXB0aCA9IGRlcHRoOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X2xlYWZfbGVuZ3RoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50MzJfdCBsZWFmX2xlbmd0aCApCit7CisgIFAtPmxlYWZfbGVuZ3RoID0gbGVhZl9sZW5ndGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9vZmZzZXQoIGJsYWtlMnNfcGFyYW0gKlAsIGNvbnN0IHVpbnQ2NF90IG5vZGVfb2Zmc2V0ICkKK3sKKyAgc3RvcmU0OCggUC0+bm9kZV9vZmZzZXQsIG5vZGVfb2Zmc2V0ICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfbm9kZV9kZXB0aCggYmxha2Uyc19wYXJhbSAqUCwgY29uc3QgdWludDhfdCBub2RlX2RlcHRoICkKK3sKKyAgUC0+bm9kZV9kZXB0aCA9IG5vZGVfZGVwdGg7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19wYXJhbV9zZXRfaW5uZXJfbGVuZ3RoKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IGlubmVyX2xlbmd0aCApCit7CisgIFAtPmlubmVyX2xlbmd0aCA9IGlubmVyX2xlbmd0aDsKKyAgcmV0dXJuIDA7Cit9CisKK0JMQUtFMl9MT0NBTF9JTkxJTkUoaW50KSBibGFrZTJzX3BhcmFtX3NldF9zYWx0KCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHNhbHRbQkxBS0UyU19TQUxUQllURVNdICkKK3sKKyAgbWVtY3B5KCBQLT5zYWx0LCBzYWx0LCBCTEFLRTJTX1NBTFRCWVRFUyApOworICByZXR1cm4gMDsKK30KKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfcGFyYW1fc2V0X3BlcnNvbmFsKCBibGFrZTJzX3BhcmFtICpQLCBjb25zdCB1aW50OF90IHBlcnNvbmFsW0JMQUtFMlNfUEVSU09OQUxCWVRFU10gKQoreworICBtZW1jcHkoIFAtPnBlcnNvbmFsLCBwZXJzb25hbCwgQkxBS0UyU19QRVJTT05BTEJZVEVTICk7CisgIHJldHVybiAwOworfQorCitCTEFLRTJfTE9DQUxfSU5MSU5FKGludCkgYmxha2Uyc19pbml0MCggYmxha2Uyc19zdGF0ZSAqUyApCit7CisgIGludCBpOworICBtZW1zZXQoIFMsIDAsIHNpemVvZiggYmxha2Uyc19zdGF0ZSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIFMtPmhbaV0gPSBibGFrZTJzX0lWW2ldOworCisgIHJldHVybiAwOworfQorCisvKiBpbml0MiB4b3JzIElWIHdpdGggaW5wdXQgcGFyYW1ldGVyIGJsb2NrICovCitpbnQgYmxha2Uyc19pbml0X3BhcmFtKCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCBibGFrZTJzX3BhcmFtICpQICkKK3sKKyAgLypibGFrZTJzX2luaXQwKCBTICk7ICovCisgIGNvbnN0IHVpbnQ4X3QgKiB2ID0gKCBjb25zdCB1aW50OF90ICogKSggYmxha2Uyc19JViApOworICBjb25zdCB1aW50OF90ICogcCA9ICggY29uc3QgdWludDhfdCAqICkoIFAgKTsKKyAgdWludDhfdCAqIGggPSAoIHVpbnQ4X3QgKiApKCBTLT5oICk7CisgIGludCBpOworICAvKiBJViBYT1IgUGFyYW1CbG9jayAqLworICBtZW1zZXQoIFMsIDAsIHNpemVvZiggYmxha2Uyc19zdGF0ZSApICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEJMQUtFMlNfT1VUQllURVM7ICsraSApIGhbaV0gPSB2W2ldIF4gcFtpXTsKKworICByZXR1cm4gMDsKK30KKworCisvKiBTb21lIHNvcnQgb2YgZGVmYXVsdCBwYXJhbWV0ZXIgYmxvY2sgaW5pdGlhbGl6YXRpb24sIGZvciBzZXF1ZW50aWFsIGJsYWtlMnMgKi8KK2ludCBibGFrZTJzX2luaXQoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuICkKK3sKKyAgY29uc3QgYmxha2Uyc19wYXJhbSBQID0KKyAgeworICAgIG91dGxlbiwKKyAgICAwLAorICAgIDEsCisgICAgMSwKKyAgICAwLAorICAgIHswfSwKKyAgICAwLAorICAgIDAsCisgICAgezB9LAorICAgIHswfQorICB9OworICAvKiBNb3ZlIGludGVydmFsIHZlcmlmaWNhdGlvbiBoZXJlPyAqLworICBpZiAoICggIW91dGxlbiApIHx8ICggb3V0bGVuID4gQkxBS0UyU19PVVRCWVRFUyApICkgcmV0dXJuIC0xOworICByZXR1cm4gYmxha2Uyc19pbml0X3BhcmFtKCBTLCAmUCApOworfQorCisKK2ludCBibGFrZTJzX2luaXRfa2V5KCBibGFrZTJzX3N0YXRlICpTLCBjb25zdCB1aW50OF90IG91dGxlbiwgY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB1aW50OF90IGtleWxlbiApCit7CisgIGNvbnN0IGJsYWtlMnNfcGFyYW0gUCA9CisgIHsKKyAgICBvdXRsZW4sCisgICAga2V5bGVuLAorICAgIDEsCisgICAgMSwKKyAgICAwLAorICAgIHswfSwKKyAgICAwLAorICAgIDAsCisgICAgezB9LAorICAgIHswfQorICB9OworCisgIC8qIE1vdmUgaW50ZXJ2YWwgdmVyaWZpY2F0aW9uIGhlcmU/ICovCisgIGlmICggKCAhb3V0bGVuICkgfHwgKCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkgKSByZXR1cm4gLTE7CisKKyAgaWYgKCAoICFrZXkgKSB8fCAoICFrZXlsZW4gKSB8fCBrZXlsZW4gPiBCTEFLRTJTX0tFWUJZVEVTICkgcmV0dXJuIC0xOworCisgIGlmKCBibGFrZTJzX2luaXRfcGFyYW0oIFMsICZQICkgPCAwICkKKyAgICByZXR1cm4gLTE7CisKKyAgeworICAgIHVpbnQ4X3QgYmxvY2tbQkxBS0UyU19CTE9DS0JZVEVTXTsKKyAgICBtZW1zZXQoIGJsb2NrLCAwLCBCTEFLRTJTX0JMT0NLQllURVMgKTsKKyAgICBtZW1jcHkoIGJsb2NrLCBrZXksIGtleWxlbiApOworICAgIGJsYWtlMnNfdXBkYXRlKCBTLCBibG9jaywgQkxBS0UyU19CTE9DS0JZVEVTICk7CisgICAgc2VjdXJlX3plcm9fbWVtb3J5KCBibG9jaywgQkxBS0UyU19CTE9DS0JZVEVTICk7IC8qIEJ1cm4gdGhlIGtleSBmcm9tIHN0YWNrICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworQkxBS0UyX0xPQ0FMX0lOTElORShpbnQpIGJsYWtlMnNfY29tcHJlc3MoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgYmxvY2tbQkxBS0UyU19CTE9DS0JZVEVTXSApCit7CisgIF9fbTEyOGkgcm93MSwgcm93Miwgcm93Mywgcm93NDsKKyAgX19tMTI4aSBidWYxLCBidWYyLCBidWYzLCBidWY0OworI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyAgX19tMTI4aSB0MCwgdDE7CisjaWYgIWRlZmluZWQoSEFWRV9YT1ApCisgIF9fbTEyOGkgdDI7CisjZW5kaWYKKyNlbmRpZgorICBfX20xMjhpIGZmMCwgZmYxOworI2lmIGRlZmluZWQoSEFWRV9TU1NFMykgJiYgIWRlZmluZWQoSEFWRV9YT1ApCisgIGNvbnN0IF9fbTEyOGkgcjggPSBfbW1fc2V0X2VwaTgoIDEyLCAxNSwgMTQsIDEzLCA4LCAxMSwgMTAsIDksIDQsIDcsIDYsIDUsIDAsIDMsIDIsIDEgKTsKKyAgY29uc3QgX19tMTI4aSByMTYgPSBfbW1fc2V0X2VwaTgoIDEzLCAxMiwgMTUsIDE0LCA5LCA4LCAxMSwgMTAsIDUsIDQsIDcsIDYsIDEsIDAsIDMsIDIgKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9TU0U0MSkKKyAgY29uc3QgX19tMTI4aSBtMCA9IExPQURVKCBibG9jayArICAwMCApOworICBjb25zdCBfX20xMjhpIG0xID0gTE9BRFUoIGJsb2NrICsgIDE2ICk7CisgIGNvbnN0IF9fbTEyOGkgbTIgPSBMT0FEVSggYmxvY2sgKyAgMzIgKTsKKyAgY29uc3QgX19tMTI4aSBtMyA9IExPQURVKCBibG9jayArICA0OCApOworI2Vsc2UKKyAgY29uc3QgdWludDMyX3QgIG0wID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDBdOworICBjb25zdCB1aW50MzJfdCAgbTEgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgMV07CisgIGNvbnN0IHVpbnQzMl90ICBtMiA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyAyXTsKKyAgY29uc3QgdWludDMyX3QgIG0zID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDNdOworICBjb25zdCB1aW50MzJfdCAgbTQgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgNF07CisgIGNvbnN0IHVpbnQzMl90ICBtNSA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyA1XTsKKyAgY29uc3QgdWludDMyX3QgIG02ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDZdOworICBjb25zdCB1aW50MzJfdCAgbTcgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsgN107CisgIGNvbnN0IHVpbnQzMl90ICBtOCA9ICggKCB1aW50MzJfdCAqIClibG9jayApWyA4XTsKKyAgY29uc3QgdWludDMyX3QgIG05ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbIDldOworICBjb25zdCB1aW50MzJfdCBtMTAgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsxMF07CisgIGNvbnN0IHVpbnQzMl90IG0xMSA9ICggKCB1aW50MzJfdCAqIClibG9jayApWzExXTsKKyAgY29uc3QgdWludDMyX3QgbTEyID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbMTJdOworICBjb25zdCB1aW50MzJfdCBtMTMgPSAoICggdWludDMyX3QgKiApYmxvY2sgKVsxM107CisgIGNvbnN0IHVpbnQzMl90IG0xNCA9ICggKCB1aW50MzJfdCAqIClibG9jayApWzE0XTsKKyAgY29uc3QgdWludDMyX3QgbTE1ID0gKCAoIHVpbnQzMl90ICogKWJsb2NrIClbMTVdOworI2VuZGlmCisgIHJvdzEgPSBmZjAgPSBMT0FEVSggJlMtPmhbMF0gKTsKKyAgcm93MiA9IGZmMSA9IExPQURVKCAmUy0+aFs0XSApOworICByb3czID0gX21tX3NldHJfZXBpMzIoIDB4NkEwOUU2NjcsIDB4QkI2N0FFODUsIDB4M0M2RUYzNzIsIDB4QTU0RkY1M0EgKTsKKyAgcm93NCA9IF9tbV94b3Jfc2kxMjgoIF9tbV9zZXRyX2VwaTMyKCAweDUxMEU1MjdGLCAweDlCMDU2ODhDLCAweDFGODNEOUFCLCAweDVCRTBDRDE5ICksIExPQURVKCAmUy0+dFswXSApICk7CisgIFJPVU5EKCAwICk7CisgIFJPVU5EKCAxICk7CisgIFJPVU5EKCAyICk7CisgIFJPVU5EKCAzICk7CisgIFJPVU5EKCA0ICk7CisgIFJPVU5EKCA1ICk7CisgIFJPVU5EKCA2ICk7CisgIFJPVU5EKCA3ICk7CisgIFJPVU5EKCA4ICk7CisgIFJPVU5EKCA5ICk7CisgIFNUT1JFVSggJlMtPmhbMF0sIF9tbV94b3Jfc2kxMjgoIGZmMCwgX21tX3hvcl9zaTEyOCggcm93MSwgcm93MyApICkgKTsKKyAgU1RPUkVVKCAmUy0+aFs0XSwgX21tX3hvcl9zaTEyOCggZmYxLCBfbW1feG9yX3NpMTI4KCByb3cyLCByb3c0ICkgKSApOworICByZXR1cm4gMDsKK30KKworLyogaW5sZW4gbm93IGluIGJ5dGVzICovCitpbnQgYmxha2Uyc191cGRhdGUoIGJsYWtlMnNfc3RhdGUgKlMsIGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50NjRfdCBpbmxlbiApCit7CisgIHdoaWxlKCBpbmxlbiA+IDAgKQorICB7CisgICAgc2l6ZV90IGxlZnQgPSBTLT5idWZsZW47CisgICAgc2l6ZV90IGZpbGwgPSAyICogQkxBS0UyU19CTE9DS0JZVEVTIC0gbGVmdDsKKworICAgIGlmKCBpbmxlbiA+IGZpbGwgKQorICAgIHsKKyAgICAgIG1lbWNweSggUy0+YnVmICsgbGVmdCwgaW4sIGZpbGwgKTsgLyogRmlsbCBidWZmZXIgKi8KKyAgICAgIFMtPmJ1ZmxlbiArPSBmaWxsOworICAgICAgYmxha2Uyc19pbmNyZW1lbnRfY291bnRlciggUywgQkxBS0UyU19CTE9DS0JZVEVTICk7CisgICAgICBibGFrZTJzX2NvbXByZXNzKCBTLCBTLT5idWYgKTsgLyogQ29tcHJlc3MgKi8KKyAgICAgIG1lbWNweSggUy0+YnVmLCBTLT5idWYgKyBCTEFLRTJTX0JMT0NLQllURVMsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOyAvKiBTaGlmdCBidWZmZXIgbGVmdCAqLworICAgICAgUy0+YnVmbGVuIC09IEJMQUtFMlNfQkxPQ0tCWVRFUzsKKyAgICAgIGluICs9IGZpbGw7CisgICAgICBpbmxlbiAtPSBmaWxsOworICAgIH0KKyAgICBlbHNlIC8qIGlubGVuIDw9IGZpbGwgKi8KKyAgICB7CisgICAgICBtZW1jcHkoIFMtPmJ1ZiArIGxlZnQsIGluLCBpbmxlbiApOworICAgICAgUy0+YnVmbGVuICs9IGlubGVuOyAvKiBCZSBsYXp5LCBkbyBub3QgY29tcHJlc3MgKi8KKyAgICAgIGluICs9IGlubGVuOworICAgICAgaW5sZW4gLT0gaW5sZW47CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIElzIHRoaXMgY29ycmVjdD8gKi8KK2ludCBibGFrZTJzX2ZpbmFsKCBibGFrZTJzX3N0YXRlICpTLCB1aW50OF90ICpvdXQsIHVpbnQ4X3Qgb3V0bGVuICkKK3sKKyAgdWludDhfdCBidWZmZXJbQkxBS0UyU19PVVRCWVRFU10gPSB7MH07CisgIGludCBpOworCisgIGlmKCBvdXRsZW4gPiBCTEFLRTJTX09VVEJZVEVTICkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYoIGJsYWtlMnNfaXNfbGFzdGJsb2NrKCBTICkgKQorICAgIHJldHVybiAtMTsKKworICBpZiggUy0+YnVmbGVuID4gQkxBS0UyU19CTE9DS0JZVEVTICkKKyAgeworICAgIGJsYWtlMnNfaW5jcmVtZW50X2NvdW50ZXIoIFMsIEJMQUtFMlNfQkxPQ0tCWVRFUyApOworICAgIGJsYWtlMnNfY29tcHJlc3MoIFMsIFMtPmJ1ZiApOworICAgIFMtPmJ1ZmxlbiAtPSBCTEFLRTJTX0JMT0NLQllURVM7CisgICAgbWVtY3B5KCBTLT5idWYsIFMtPmJ1ZiArIEJMQUtFMlNfQkxPQ0tCWVRFUywgUy0+YnVmbGVuICk7CisgIH0KKworICBibGFrZTJzX2luY3JlbWVudF9jb3VudGVyKCBTLCAoIHVpbnQzMl90IClTLT5idWZsZW4gKTsKKyAgYmxha2Uyc19zZXRfbGFzdGJsb2NrKCBTICk7CisgIG1lbXNldCggUy0+YnVmICsgUy0+YnVmbGVuLCAwLCAyICogQkxBS0UyU19CTE9DS0JZVEVTIC0gUy0+YnVmbGVuICk7IC8qIFBhZGRpbmcgKi8KKyAgYmxha2Uyc19jb21wcmVzcyggUywgUy0+YnVmICk7CisKKyAgZm9yKCBpID0gMDsgaSA8IDg7ICsraSApIC8qIE91dHB1dCBmdWxsIGhhc2ggdG8gdGVtcCBidWZmZXIgKi8KKyAgICBzdG9yZTMyKCBidWZmZXIgKyBzaXplb2YoIFMtPmhbaV0gKSAqIGksIFMtPmhbaV0gKTsKKworICBtZW1jcHkoIG91dCwgYnVmZmVyLCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGlubGVuLCBhdCBsZWFzdCwgc2hvdWxkIGJlIHVpbnQ2NF90LiBPdGhlcnMgY2FuIGJlIHNpemVfdC4gKi8KK2ludCBibGFrZTJzKCB1aW50OF90ICpvdXQsIGNvbnN0IHZvaWQgKmluLCBjb25zdCB2b2lkICprZXksIGNvbnN0IHVpbnQ4X3Qgb3V0bGVuLCBjb25zdCB1aW50NjRfdCBpbmxlbiwgdWludDhfdCBrZXlsZW4gKQoreworICBibGFrZTJzX3N0YXRlIFNbMV07CisKKyAgLyogVmVyaWZ5IHBhcmFtZXRlcnMgKi8KKyAgaWYgKCBOVUxMID09IGluICYmIGlubGVuID4gMCApIHJldHVybiAtMTsKKworICBpZiAoIE5VTEwgPT0gb3V0ICkgcmV0dXJuIC0xOworCisgIGlmICggTlVMTCA9PSBrZXkgJiYga2V5bGVuID4gMCkgcmV0dXJuIC0xOworCisgIGlmKCAhb3V0bGVuIHx8IG91dGxlbiA+IEJMQUtFMlNfT1VUQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IEJMQUtFMlNfS0VZQllURVMgKSByZXR1cm4gLTE7CisKKyAgaWYoIGtleWxlbiA+IDAgKQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdF9rZXkoIFMsIG91dGxlbiwga2V5LCBrZXlsZW4gKSA8IDAgKSByZXR1cm4gLTE7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoIGJsYWtlMnNfaW5pdCggUywgb3V0bGVuICkgPCAwICkgcmV0dXJuIC0xOworICB9CisKKyAgYmxha2Uyc191cGRhdGUoIFMsICggY29uc3QgdWludDhfdCAqIClpbiwgaW5sZW4gKTsKKyAgYmxha2Uyc19maW5hbCggUywgb3V0LCBvdXRsZW4gKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFNVUEVSQ09QKQoraW50IGNyeXB0b19oYXNoKCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGxvbmcgaW5sZW4gKQoreworICByZXR1cm4gYmxha2Uycyggb3V0LCBpbiwgTlVMTCwgQkxBS0UyU19PVVRCWVRFUywgaW5sZW4sIDAgKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTEFLRTJTX1NFTEZURVNUKQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImJsYWtlMi1rYXQuaCIKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQoreworICB1aW50OF90IGtleVtCTEFLRTJTX0tFWUJZVEVTXTsKKyAgdWludDhfdCBidWZbS0FUX0xFTkdUSF07CisgIHNpemVfdCBpOworCisgIGZvciggaSA9IDA7IGkgPCBCTEFLRTJTX0tFWUJZVEVTOyArK2kgKQorICAgIGtleVtpXSA9ICggdWludDhfdCApaTsKKworICBmb3IoIGkgPSAwOyBpIDwgS0FUX0xFTkdUSDsgKytpICkKKyAgICBidWZbaV0gPSAoIHVpbnQ4X3QgKWk7CisKKyAgZm9yKCBpID0gMDsgaSA8IEtBVF9MRU5HVEg7ICsraSApCisgIHsKKyAgICB1aW50OF90IGhhc2hbQkxBS0UyU19PVVRCWVRFU107CisKKyAgICBpZiggYmxha2UycyggaGFzaCwgYnVmLCBrZXksIEJMQUtFMlNfT1VUQllURVMsIGksIEJMQUtFMlNfS0VZQllURVMgKSA8IDAgfHwKKyAgICAgICAgMCAhPSBtZW1jbXAoIGhhc2gsIGJsYWtlMnNfa2V5ZWRfa2F0W2ldLCBCTEFLRTJTX09VVEJZVEVTICkgKQorICAgIHsKKyAgICAgIHB1dHMoICJlcnJvciIgKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBwdXRzKCAib2siICk7CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYnoybW9kdWxlLmMgYi9Nb2R1bGVzL19iejJtb2R1bGUuYwppbmRleCBlM2UwZWIxLi5mNDA3N2ZhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iejJtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iejJtb2R1bGUuYwpAQCAtNTkyLDcgKzU5Miw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfYnoyLkJaMkRlY29tcHJlc3Nvci5kZWNvbXByZXNzCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkJaMkRlY29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICBtYXhfbGVuZ3RoOiBQeV9zc2l6ZV90PS0xCiAKQEAgLTYxNSw3ICs2MTQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChCWjJEZWNvbXByZXNzb3IgKnNlbGYsIFB5X2J1ZmZlciAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjNlNDEwNDVkZWIyNDBhMyBpbnB1dD05NTU4YjQyNGM4YjAwNTE2XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjNlNDEwNDVkZWIyNDBhMyBpbnB1dD01MmUxZmZjNjZhOGVhNjI0XSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggOWIxMTk0ZS4uNGU3NTk5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTIwLDEwICsyMCw2IEBACiAgICAgIDxlbmNvZGluZz5fZGVjb2RlKGNoYXJfYnVmZmVyX29ialssZXJyb3JzPSdzdHJpY3QnXSkgLT4KICAgICAgICAgKFVuaWNvZGUgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKIAotICAgPGVuY29kaW5nPl9lbmNvZGUoKSBpbnRlcmZhY2VzIGFsc28gYWNjZXB0IG5vbi1Vbmljb2RlIG9iamVjdCBhcwotICAgaW5wdXQuIFRoZSBvYmplY3RzIGFyZSB0aGVuIGNvbnZlcnRlZCB0byBVbmljb2RlIHVzaW5nCi0gICBQeVVuaWNvZGVfRnJvbU9iamVjdCgpIHByaW9yIHRvIGFwcGx5aW5nIHRoZSBjb252ZXJzaW9uLgotCiAgICBUaGVzZSA8ZW5jb2Rpbmc+cyBhcmUgYXZhaWxhYmxlOiB1dGZfOCwgdW5pY29kZV9lc2NhcGUsCiAgICByYXdfdW5pY29kZV9lc2NhcGUsIHVuaWNvZGVfaW50ZXJuYWwsIGxhdGluXzEsIGFzY2lpICg3LWJpdCksCiAgICBtYmNzIChvbiB3aW4zMikuCkBAIC03MTgsNyArNzE0LDcgQEAKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfN19lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTcyNiwyNCArNzIyLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfN19lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGZlZGEyMWZmYzkyMWJjOCBpbnB1dD1mZDkxYTc4ZjEwM2IwNDIxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGZlZGEyMWZmYzkyMWJjOCBpbnB1dD1kMWE0NzU3OWU3OWNiZTE1XSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGNyhzdHIsIDAsIDAsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjcoc3RyLCAwLCAwLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfOF9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTc1MSwxOSArNzM4LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfOF9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDJiZjQ3MzMyYjljNzk2YyBpbnB1dD0yYzIyZDQwNTMyZjA3MWYzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDJiZjQ3MzMyYjljNzk2YyBpbnB1dD00MmUzYmE3M2M0MzkyZWVmXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoc3RyLCAidXRmLTgiLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcoc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLyogVGhpcyB2ZXJzaW9uIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnl0ZW9yZGVyIHBhcmFtZXRlciBvZiB0aGUKQEAgLTc3NSw3ICs3NTMsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8xNl9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIGJ5dGVvcmRlcjogaW50ID0gMAogICAgIC8KQEAgLTc4NCwyNCArNzYyLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMTZfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGJ5dGVvcmRlcikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jNjU0ZTEzZWZhMmU2NGU0IGlucHV0PTM5MzVhNDg5YjJkNTM4NWVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jNjU0ZTEzZWZhMmU2NGU0IGlucHV0PWZmNDY0MTZiMDRlZGI5NDRdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTgwOSwyNCArNzc4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMTZfbGVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MzFiMDFlNTVmMmQ0OTk1IGlucHV0PWJjMjdkZjA1ZDFkMjBkZmVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MzFiMDFlNTVmMmQ0OTk1IGlucHV0PWNiMzg1NDU1ZWE4ZjJmZTBdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgLTEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMTZfYmVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC04MzQsMTkgKzc5NCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzE2X2JlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTY4ODZhNmZkNTRkY2FlMyBpbnB1dD01YTY5ZDQxMTI3NjM0NjJiXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTY4ODZhNmZkNTRkY2FlMyBpbnB1dD05MTE5OTk3MDY2YmRhZWZkXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsICsxKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsICsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qIFRoaXMgdmVyc2lvbiBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJ5dGVvcmRlciBwYXJhbWV0ZXIgb2YgdGhlCkBAIC04NTgsNyArODA5LDcgQEAKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMzJfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICBieXRlb3JkZXI6IGludCA9IDAKICAgICAvCkBAIC04NjcsMjQgKzgxOCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzMyX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGludCBieXRlb3JkZXIpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NWM3NjBkYTBjMDlhOGI4MyBpbnB1dD00MzRhMWVmYTQ5MmI4ZDU4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NWM3NjBkYTBjMDlhOGI4MyBpbnB1dD1jNWU3N2RhODJmYmU1YzJhXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMzJfbGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC04OTIsMjQgKzgzNCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzMyX2xlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjY1Y2QxNzZkZThlMzZkNiBpbnB1dD1kZmEyZDdkYzc4Yjk5NDIyXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjY1Y2QxNzZkZThlMzZkNiBpbnB1dD05OTkzYjI1ZmUwODc3ODQ4XSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzMyX2JlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTE3LDI0ICs4NTAsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8zMl9iZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTFkOWU3MWE5MzU4NzA5ZTkgaW5wdXQ9NDU5NTYxN2IxODE2OTAwMl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTFkOWU3MWE5MzU4NzA5ZTkgaW5wdXQ9ZDNlMGNjYWEwMjkyMDQzMV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCArMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCArMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnVuaWNvZGVfZXNjYXBlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTQyLDI0ICs4NjYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3VuaWNvZGVfZXNjYXBlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02NjI3MWIzMGJjNGY3YTNjIGlucHV0PTgyNzM1MDZmMTQwNzY5MTJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02NjI3MWIzMGJjNGY3YTNjIGlucHV0PTY1ZDllZWZjYTY1YjQ1NWFdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05NjcsMjQgKzg4MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfcmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTY2YTgwNmVkMDFjODMwYSBpbnB1dD0xODE3NTVkNWRmYWNlZjNjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTY2YTgwNmVkMDFjODMwYSBpbnB1dD01YWEzM2U0YTEzMzM5MWFiXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MubGF0aW5fMV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTk5MiwyNCArODk4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19sYXRpbl8xX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJjMjhjODNhMjc4ODRlMDggaW5wdXQ9ZjAzZjZkY2YxZDg0YmVlNF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJjMjhjODNhMjc4ODRlMDggaW5wdXQ9MzBiMTFjOWU0OWE2NTE1MF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKHN0ciwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcoc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5hc2NpaV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTEwMTcsMjQgKzkxNCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfYXNjaWlfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI1ZTAzNTE4MmQzM2JlZmMgaW5wdXQ9ZDg3ZTI1YTEwYTU5M2ZlZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI1ZTAzNTE4MmQzM2JlZmMgaW5wdXQ9ODQzYTFkMjY4ZTZkZmE4ZV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcoc3RyLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MuY2hhcm1hcF9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIG1hcHBpbmc6IG9iamVjdCA9IE5VTEwKICAgICAvCkBAIC0xMDQzLDIyICs5MzEsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2NoYXJtYXBfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIFB5T2JqZWN0ICptYXBwaW5nKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA0NzQ3NmY0ODQ5NWE5ZTkgaW5wdXQ9ODVmNDE3MjY2MWU4ZGFkOV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA0NzQ3NmY0ODQ5NWE5ZTkgaW5wdXQ9MDc1MmNkZTA3YTZkNmQwMF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCiAgICAgaWYgKG1hcHBpbmcgPT0gUHlfTm9uZSkKICAgICAgICAgbWFwcGluZyA9IE5VTEw7CiAKLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQpAQCAtMTA3OCwzMiArOTU3LDIzIEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MubWJjc19lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfbWJjc19lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLCBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzZlMmUxNzBjOTY2YzA4MCBpbnB1dD02NWMwOWVlMWU0MjAzMjYzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzZlMmUxNzBjOTY2YzA4MCBpbnB1dD1kZTQ3MWUwODE1OTQ3NTUzXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShDUF9BQ1AsIHN0ciwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShDUF9BQ1AsIHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MuY29kZV9wYWdlX2VuY29kZQogICAgIGNvZGVfcGFnZTogaW50Ci0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC0xMTExLDIxICs5ODEsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2NvZGVfcGFnZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgY29kZV9wYWdlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ1NjczZjYwODU2NTdhOWUgaW5wdXQ9Yzg1NjJlYzQ2MGMyZTMwOV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ1NjczZjYwODU2NTdhOWUgaW5wdXQ9Nzg2NDIxYWU2MTdkNjgwYl0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoY29kZV9wYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShjb2RlX3BhZ2UsIHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKICNlbmRpZiAvKiBIQVZFX01CQ1MgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMgYi9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCmluZGV4IDEwZmJjZmUuLjE2NzUxMDIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwpAQCAtODEsNyArODEsNyBAQAogICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OyAgICAgICAvKiAwIDw9IGxlZnRpbmRleCA8IEJMT0NLTEVOICovCiAgICAgUHlfc3NpemVfdCByaWdodGluZGV4OyAgICAgIC8qIDAgPD0gcmlnaHRpbmRleCA8IEJMT0NLTEVOICovCiAgICAgc2l6ZV90IHN0YXRlOyAgICAgICAgICAgICAgIC8qIGluY3JlbWVudGVkIHdoZW5ldmVyIHRoZSBpbmRpY2VzIG1vdmUgKi8KLSAgICBQeV9zc2l6ZV90IG1heGxlbjsKKyAgICBQeV9zc2l6ZV90IG1heGxlbjsgICAgICAgICAgLyogbWF4bGVuIGlzIC0xIGZvciB1bmJvdW5kZWQgZGVxdWVzICovCiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OwogfSBkZXF1ZW9iamVjdDsKIApAQCAtMTA4LDI5ICsxMDgsMTggQEAKICNkZWZpbmUgQ0hFQ0tfTk9UX0VORChsaW5rKQogI2VuZGlmCiAKLS8qIFRvIHByZXZlbnQgbGVuIGZyb20gb3ZlcmZsb3dpbmcgUFlfU1NJWkVfVF9NQVgsIHdlIHJlZnVzZSB0bwotICAgYWxsb2NhdGUgbmV3IGJsb2NrcyBpZiB0aGUgY3VycmVudCBsZW4gaXMgbmVhcmluZyBvdmVyZmxvdy4KLSovCi0KLSNkZWZpbmUgTUFYX0RFUVVFX0xFTiAoUFlfU1NJWkVfVF9NQVggLSAzKkJMT0NLTEVOKQotCiAvKiBBIHNpbXBsZSBmcmVlbGlzdGluZyBzY2hlbWUgaXMgdXNlZCB0byBtaW5pbWl6ZSBjYWxscyB0byB0aGUgbWVtb3J5CiAgICBhbGxvY2F0b3IuICBJdCBhY2NvbW1vZGF0ZXMgY29tbW9uIHVzZSBjYXNlcyB3aGVyZSBuZXcgYmxvY2tzIGFyZSBiZWluZwogICAgYWRkZWQgYXQgYWJvdXQgdGhlIHNhbWUgcmF0ZSBhcyBvbGQgYmxvY2tzIGFyZSBiZWluZyBmcmVlZC4KICAqLwogCi0jZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTAKKyNkZWZpbmUgTUFYRlJFRUJMT0NLUyAxNgogc3RhdGljIFB5X3NzaXplX3QgbnVtZnJlZWJsb2NrcyA9IDA7CiBzdGF0aWMgYmxvY2sgKmZyZWVibG9ja3NbTUFYRlJFRUJMT0NLU107CiAKIHN0YXRpYyBibG9jayAqCi1uZXdibG9jayhQeV9zc2l6ZV90IGxlbikgeworbmV3YmxvY2sodm9pZCkgewogICAgIGJsb2NrICpiOwotICAgIGlmIChsZW4gPj0gTUFYX0RFUVVFX0xFTikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgYmxvY2tzIHRvIHRoZSBkZXF1ZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKG51bWZyZWVibG9ja3MpIHsKICAgICAgICAgbnVtZnJlZWJsb2Nrcy0tOwogICAgICAgICByZXR1cm4gZnJlZWJsb2Nrc1tudW1mcmVlYmxvY2tzXTsKQEAgLTE1NCwxMiArMTQzLDYgQEAKICAgICB9CiB9CiAKLS8qIFhYWCBUb2RvOgotICAgSWYgYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSwgbWFrZSB0aGUKLSAgIGRlcXVlIG9iamVjdCA2NCBieXRlIGFsaWduZWQgc28gdGhhdCBhbGwgb2YgdGhlIGZpZWxkcwotICAgY2FuIGJlIHJldHJpZXZlZCBvciB1cGRhdGVkIGluIGEgc2luZ2xlIGNhY2hlIGxpbmUuCi0qLwotCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpAQCAtMTcxLDcgKzE1NCw3IEBACiAgICAgaWYgKGRlcXVlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgYiA9IG5ld2Jsb2NrKDApOworICAgIGIgPSBuZXdibG9jaygpOwogICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDcsNyArMTkwLDcgQEAKICAgICBQeV9TSVpFKGRlcXVlKS0tOwogICAgIGRlcXVlLT5zdGF0ZSsrOwogCi0gICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IC0xKSB7CisgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4IDwgMCkgewogICAgICAgICBpZiAoUHlfU0laRShkZXF1ZSkpIHsKICAgICAgICAgICAgIHByZXZibG9jayA9IGRlcXVlLT5yaWdodGJsb2NrLT5sZWZ0bGluazsKICAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKQEAgLTI3MCw0MiArMjUzLDI0IEBACiAvKiBUaGUgZGVxdWUncyBzaXplIGxpbWl0IGlzIGQubWF4bGVuLiAgVGhlIGxpbWl0IGNhbiBiZSB6ZXJvIG9yIHBvc2l0aXZlLgogICogSWYgdGhlcmUgaXMgbm8gbGltaXQsIHRoZW4gZC5tYXhsZW4gPT0gLTEuCiAgKgotICogQWZ0ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byBhIGRlcXVlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaGFzIGdyb3duIHBhc3QKLSAqIHRoZSBsaW1pdC4gSWYgaXQgaGFzLCB3ZSBnZXQgdGhlIHNpemUgYmFjayBkb3duIHRvIHRoZSBsaW1pdCBieSBwb3BwaW5nIGFuCi0gKiBpdGVtIG9mZiBvZiB0aGUgb3Bwb3NpdGUgZW5kLiAgVGhlIG1ldGhvZHMgdGhhdCBjYW4gdHJpZ2dlciB0aGlzIGFyZSBhcHBlbmQoKSwKLSAqIGFwcGVuZGxlZnQoKSwgZXh0ZW5kKCksIGFuZCBleHRlbmRsZWZ0KCkuCisgKiBBZnRlciBhbiBpdGVtIGlzIGFkZGVkIHRvIGEgZGVxdWUsIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2l6ZSBoYXMKKyAqIGdyb3duIHBhc3QgdGhlIGxpbWl0LiBJZiBpdCBoYXMsIHdlIGdldCB0aGUgc2l6ZSBiYWNrIGRvd24gdG8gdGhlIGxpbWl0CisgKiBieSBwb3BwaW5nIGFuIGl0ZW0gb2ZmIG9mIHRoZSBvcHBvc2l0ZSBlbmQuICBUaGUgbWV0aG9kcyB0aGF0IGNhbgorICogdHJpZ2dlciB0aGlzIGFyZSBhcHBlbmQoKSwgYXBwZW5kbGVmdCgpLCBleHRlbmQoKSwgYW5kIGV4dGVuZGxlZnQoKS4KKyAqCisgKiBUaGUgbWFjcm8gdG8gY2hlY2sgd2hldGhlciBhIGRlcXVlIG5lZWRzIHRvIGJlIHRyaW1tZWQgdXNlcyBhIHNpbmdsZQorICogdW5zaWduZWQgdGVzdCB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciAwIDw9IG1heGxlbiA8IFB5X1NJWkUoZGVxdWUpLgogICovCiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV90cmltX3JpZ2h0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKLSAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KHJ2ICE9IE5VTEwpOwotICAgICAgICBhc3NlcnQoUHlfU0laRShkZXF1ZSkgPD0gZGVxdWUtPm1heGxlbik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgfQotfQorI2RlZmluZSBORUVEU19UUklNKGRlcXVlLCBtYXhsZW4pICgoc2l6ZV90KShtYXhsZW4pIDwgKHNpemVfdCkoUHlfU0laRShkZXF1ZSkpKQogCi1zdGF0aWMgdm9pZAotZGVxdWVfdHJpbV9sZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKK3N0YXRpYyBpbnQKK2RlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IG1heGxlbikKIHsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKLSAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQotewotICAgIGRlcXVlLT5zdGF0ZSsrOwogICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKLSAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgaWYgKGIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOwogICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7CiAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOwpAQCAtMzEzLDI0ICsyNzgsMzYgQEAKICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgZGVxdWUtPnJpZ2h0aW5kZXgrKzsKICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOwotICAgIGRlcXVlX3RyaW1fbGVmdChkZXF1ZSk7CisgICAgaWYgKE5FRURTX1RSSU0oZGVxdWUsIG1heGxlbikpIHsKKyAgICAgICAgUHlPYmplY3QgKm9sZGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQoreworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICBpZiAoZGVxdWVfYXBwZW5kX2ludGVybmFsKGRlcXVlLCBpdGVtLCBkZXF1ZS0+bWF4bGVuKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kX2RvYywgIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS4iKTsKIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2FwcGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKK3N0YXRpYyBpbnQKK2RlcXVlX2FwcGVuZGxlZnRfaW50ZXJuYWwoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBtYXhsZW4pCiB7Ci0gICAgZGVxdWUtPnN0YXRlKys7CiAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jaygpOwogICAgICAgICBpZiAoYiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGItPnJpZ2h0bGluayA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayk7CiAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKQEAgLTMzOCwzNyArMzE1LDY1IEBACiAgICAgICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOwogICAgIH0KLSAgICBQeV9JTkNSRUYoaXRlbSk7CiAgICAgUHlfU0laRShkZXF1ZSkrKzsKICAgICBkZXF1ZS0+bGVmdGluZGV4LS07CiAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07Ci0gICAgZGVxdWVfdHJpbV9yaWdodChkZXF1ZSk7CisgICAgaWYgKE5FRURTX1RSSU0oZGVxdWUsIGRlcXVlLT5tYXhsZW4pKSB7CisgICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2FwcGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKK3sKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgaWYgKGRlcXVlX2FwcGVuZGxlZnRfaW50ZXJuYWwoZGVxdWUsIGl0ZW0sIGRlcXVlLT5tYXhsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRsZWZ0X2RvYywgIkFkZCBhbiBlbGVtZW50IHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGRlcXVlLiIpOwogCitzdGF0aWMgUHlPYmplY3QqCitmaW5hbGl6ZV9pdGVyYXRvcihQeU9iamVjdCAqaXQpCit7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X1JFVFVSTl9OT05FOworfQogCiAvKiBSdW4gYW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gIFNob3J0Y3V0IGZvcgogICAgdGhlIGV4dGVuZC9leHRlbmRsZWZ0IG1ldGhvZHMgd2hlbiBtYXhsZW4gPT0gMC4gKi8KIHN0YXRpYyBQeU9iamVjdCoKIGNvbnN1bWVfaXRlcmF0b3IoUHlPYmplY3QgKml0KQogeworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKICAgICBQeU9iamVjdCAqaXRlbTsKIAotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gZmluYWxpemVfaXRlcmF0b3IoaXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfZXh0ZW5kKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewogICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gZGVxdWUtPm1heGxlbjsKIAogICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KICAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKQEAgLTM4MSw2ICszODYsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChtYXhsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOworCiAgICAgLyogU3BhY2Ugc2F2aW5nIGhldXJpc3RpYy4gIFN0YXJ0IGZpbGxpbmcgZnJvbSB0aGUgbGVmdCAqLwogICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKSB7CiAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrKTsKQEAgLTM4OSw0MCArNDAxLDE1IEBACiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gMDsKICAgICB9CiAKLSAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IDApCi0gICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKLQotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKLSAgICAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgewotICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7Ci0gICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOwotICAgICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmspOwotICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7Ci0gICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7Ci0gICAgICAgICAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOwotICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXF1ZV9hcHBlbmRfaW50ZXJuYWwoZGVxdWUsIGl0ZW0sIG1heGxlbikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgUHlfU0laRShkZXF1ZSkrKzsKLSAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXgrKzsKLSAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLSAgICAgICAgZGVxdWVfdHJpbV9sZWZ0KGRlcXVlKTsKICAgICB9Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4dGVuZF9kb2MsCkBAIC00MzIsNiArNDE5LDggQEAKIGRlcXVlX2V4dGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7CiAgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlfc3NpemVfdCBtYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwogCiAgICAgLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwogICAgIGlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewpAQCAtNDQ0LDYgKzQzMywxMyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKG1heGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CisKICAgICAvKiBTcGFjZSBzYXZpbmcgaGV1cmlzdGljLiAgU3RhcnQgZmlsbGluZyBmcm9tIHRoZSByaWdodCAqLwogICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKSB7CiAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrKTsKQEAgLTQ1Miw0MCArNDQ4LDE1IEBACiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQkxPQ0tMRU4gLSAyOwogICAgIH0KIAotICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0gICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOwotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlcXVlLT5zdGF0ZSsrOwotICAgICAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKLSAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGItPnJpZ2h0bGluayA9IGRlcXVlLT5sZWZ0YmxvY2s7Ci0gICAgICAgICAgICBDSEVDS19FTkQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmspOwotICAgICAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotICAgICAgICAgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7Ci0gICAgICAgICAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVxdWVfYXBwZW5kbGVmdF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgbWF4bGVuKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBQeV9TSVpFKGRlcXVlKSsrOwotICAgICAgICBkZXF1ZS0+bGVmdGluZGV4LS07Ci0gICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotICAgICAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKICAgICB9Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4dGVuZGxlZnRfZG9jLApAQCAtNTA0LDcgKzQ3NSw0MCBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICpkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSk7CitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpCit7CisgICAgZGVxdWVvYmplY3QgKm9sZF9kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlOworICAgIGlmIChQeV9UWVBFKGRlcXVlKSA9PSAmZGVxdWVfdHlwZSkgeworICAgICAgICBkZXF1ZW9iamVjdCAqbmV3X2RlcXVlOworICAgICAgICBQeU9iamVjdCAqcnY7CisKKyAgICAgICAgbmV3X2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWVfbmV3KCZkZXF1ZV90eXBlLCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgaWYgKG5ld19kZXF1ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG5ld19kZXF1ZS0+bWF4bGVuID0gb2xkX2RlcXVlLT5tYXhsZW47CisgICAgICAgIC8qIEZhc3QgcGF0aCBmb3IgdGhlIGRlcXVlX3JlcGVhdCgpIGNvbW1vbiBjYXNlIHdoZXJlIGxlbihkZXF1ZSkgPT0gMSAqLworICAgICAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBvbGRfZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtvbGRfZGVxdWUtPmxlZnRpbmRleF07CisgICAgICAgICAgICBydiA9IGRlcXVlX2FwcGVuZChuZXdfZGVxdWUsIGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnYgPSBkZXF1ZV9leHRlbmQobmV3X2RlcXVlLCBkZXF1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3X2RlcXVlOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVxdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG9sZF9kZXF1ZS0+bWF4bGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKKyAgICAgICAgICAgIGRlcXVlLCBvbGRfZGVxdWUtPm1heGxlbiwgTlVMTCk7Cit9CisKK1B5RG9jX1NUUlZBUihjb3B5X2RvYywgIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfY29uY2F0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKm90aGVyKQpAQCAtNTM0LDM4ICs1MzgsMTAyIEBACiAgICAgcmV0dXJuIG5ld19kZXF1ZTsKIH0KIAotc3RhdGljIHZvaWQgZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKTsKK3N0YXRpYyB2b2lkCitkZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpCit7CisgICAgYmxvY2sgKmI7CisgICAgYmxvY2sgKnByZXZibG9jazsKKyAgICBibG9jayAqbGVmdGJsb2NrOworICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OworICAgIFB5X3NzaXplX3QgbiwgbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKml0ZW1wdHIsICoqbGltaXQ7CisKKyAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIGEgZGVxdWUsIGRlY3JlZnMgY2FuIGNhdXNlIHRoZQorICAgICAgIGRlcXVlIHRvIG11dGF0ZS4gIFRvIGF2b2lkIGZhdGFsIGNvbmZ1c2lvbiwgd2UgaGF2ZSB0byBtYWtlIHRoZQorICAgICAgIGRlcXVlIGVtcHR5IGJlZm9yZSBjbGVhcmluZyB0aGUgYmxvY2tzIGFuZCBuZXZlciByZWZlciB0bworICAgICAgIGFueXRoaW5nIHZpYSBkZXF1ZS0+cmVmIHdoaWxlIGNsZWFyaW5nLiAgKFRoaXMgaXMgdGhlIHNhbWUKKyAgICAgICB0ZWNobmlxdWUgdXNlZCBmb3IgY2xlYXJpbmcgbGlzdHMsIHNldHMsIGFuZCBkaWN0cy4pCisKKyAgICAgICBNYWtpbmcgdGhlIGRlcXVlIGVtcHR5IHJlcXVpcmVzIGFsbG9jYXRpbmcgYSBuZXcgZW1wdHkgYmxvY2suICBJbgorICAgICAgIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IG1lbW9yeSBpcyBmdWxsLCB3ZSBmYWxsIGJhY2sgdG8gYW4KKyAgICAgICBhbHRlcm5hdGUgbWV0aG9kIHRoYXQgZG9lc24ndCByZXF1aXJlIGEgbmV3IGJsb2NrLiAgUmVwZWF0aW5nCisgICAgICAgcG9wcyBpbiBhIHdoaWxlLWxvb3AgaXMgc2xvd2VyLCBwb3NzaWJseSByZS1lbnRyYW50IChhbmQgYSBjbGV2ZXIKKyAgICAgICBhZHZlcnNhcnkgY291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgdGVybWluYXRlKS4KKyAgICAqLworCisgICAgYiA9IG5ld2Jsb2NrKCk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBnb3RvIGFsdGVybmF0ZV9tZXRob2Q7CisgICAgfQorCisgICAgLyogUmVtZW1iZXIgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggKi8KKyAgICBuID0gUHlfU0laRShkZXF1ZSk7CisgICAgbGVmdGJsb2NrID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OworCisgICAgLyogU2V0IHRoZSBkZXF1ZSB0byBiZSBlbXB0eSB1c2luZyB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCisgICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOworICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CisgICAgUHlfU0laRShkZXF1ZSkgPSAwOworICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOworICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKKyAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKKyAgICBkZXF1ZS0+c3RhdGUrKzsKKworICAgIC8qIE5vdyB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCBhcmUgZGlzY29ubmVjdGVkIGZyb20KKyAgICAgICB0aGUgZW1wdHkgZGVxdWUgYW5kIHdlIGNhbiB1c2UgdGhlbSB0byBkZWNyZWYgdGhlIHBvaW50ZXJzLgorICAgICovCisgICAgbSA9IChCTE9DS0xFTiAtIGxlZnRpbmRleCA+IG4pID8gbiA6IEJMT0NLTEVOIC0gbGVmdGluZGV4OworICAgIGl0ZW1wdHIgPSAmbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07CisgICAgbGltaXQgPSBpdGVtcHRyICsgbTsKKyAgICBuIC09IG07CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGl0ZW1wdHIgPT0gbGltaXQpIHsKKyAgICAgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBDSEVDS19OT1RfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgIHByZXZibG9jayA9IGxlZnRibG9jazsKKyAgICAgICAgICAgIGxlZnRibG9jayA9IGxlZnRibG9jay0+cmlnaHRsaW5rOworICAgICAgICAgICAgbSA9IChuID4gQkxPQ0tMRU4pID8gQkxPQ0tMRU4gOiBuOworICAgICAgICAgICAgaXRlbXB0ciA9IGxlZnRibG9jay0+ZGF0YTsKKyAgICAgICAgICAgIGxpbWl0ID0gaXRlbXB0ciArIG07CisgICAgICAgICAgICBuIC09IG07CisgICAgICAgICAgICBmcmVlYmxvY2socHJldmJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBpdGVtID0gKihpdGVtcHRyKyspOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIENIRUNLX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7CisgICAgZnJlZWJsb2NrKGxlZnRibG9jayk7CisgICAgcmV0dXJuOworCisgIGFsdGVybmF0ZV9tZXRob2Q6CisgICAgd2hpbGUgKFB5X1NJWkUoZGVxdWUpKSB7CisgICAgICAgIGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOworICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCitkZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgLyogWFhYIGFkZCBhIHNwZWNpYWwgY2FzZSBmb3Igd2hlbiBtYXhsZW4gaXMgZGVmaW5lZCAqLwotICAgIGlmIChuIDwgMCkKLSAgICAgICAgbiA9IDA7Ci0gICAgZWxzZSBpZiAobiA+IDAgJiYgUHlfU0laRShkZXF1ZSkgPiBNQVhfREVRVUVfTEVOIC8gbikKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0KLSAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9uZXcoJmRlcXVlX3R5cGUsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOwotICAgIG5ld19kZXF1ZS0+bWF4bGVuID0gZGVxdWUtPm1heGxlbjsKLQotICAgIGZvciAoIDsgbiA7IG4tLSkgewotICAgICAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQobmV3X2RlcXVlLCAoUHlPYmplY3QgKilkZXF1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld19kZXF1ZTsKKyAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKK1B5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLiIpOworCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfaW5wbGFjZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBzaXplOworICAgIFB5X3NzaXplX3QgaSwgbSwgc2l6ZTsKICAgICBQeU9iamVjdCAqc2VxOwogICAgIFB5T2JqZWN0ICpydjsKIApAQCAtNTgxLDI3ICs2NDksNDcgQEAKICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogICAgIH0KIAotICAgIGlmIChzaXplID4gTUFYX0RFUVVFX0xFTiAvIG4pIHsKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgfQotCiAgICAgaWYgKHNpemUgPT0gMSkgewogICAgICAgICAvKiBjb21tb24gY2FzZSwgcmVwZWF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgKi8KICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdOwogCi0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuICE9IC0xICYmIG4gPiBkZXF1ZS0+bWF4bGVuKQorICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA+PSAwICYmIG4gPiBkZXF1ZS0+bWF4bGVuKQogICAgICAgICAgICAgbiA9IGRlcXVlLT5tYXhsZW47CiAKLSAgICAgICAgZm9yIChpID0gMCA7IGkgPCBuLTEgOyBpKyspIHsKLSAgICAgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChydiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgbi0xIDsgKSB7CisgICAgICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7CisgICAgICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jaygpOworICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfU0laRShkZXF1ZSkgKz0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGItPmxlZnRsaW5rID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmspOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgICAgICAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtID0gbiAtIDEgLSBpOworICAgICAgICAgICAgaWYgKG0gPiBCTE9DS0xFTiAtIDEgLSBkZXF1ZS0+cmlnaHRpbmRleCkKKyAgICAgICAgICAgICAgICBtID0gQkxPQ0tMRU4gLSAxIC0gZGVxdWUtPnJpZ2h0aW5kZXg7CisgICAgICAgICAgICBpICs9IG07CisgICAgICAgICAgICB3aGlsZSAobS0tKSB7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXgrKzsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBQeV9TSVpFKGRlcXVlKSArPSBpOwogICAgICAgICBQeV9JTkNSRUYoZGVxdWUpOwogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiAgICAgfQogCisgICAgaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gKHNpemVfdCluKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKwogICAgIHNlcSA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7CiAgICAgaWYgKHNlcSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gc2VxOwpAQCAtNjE5LDYgKzcwNywyMCBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKK3sKKyAgICBkZXF1ZW9iamVjdCAqbmV3X2RlcXVlOworICAgIFB5T2JqZWN0ICpydjsKKworICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX2NvcHkoKFB5T2JqZWN0ICopIGRlcXVlKTsKKyAgICBpZiAobmV3X2RlcXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gZGVxdWVfaW5wbGFjZV9yZXBlYXQobmV3X2RlcXVlLCBuKTsKKyAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKKyAgICByZXR1cm4gcnY7Cit9CisKIC8qIFRoZSByb3RhdGUoKSBtZXRob2QgaXMgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgaXMgdXNlZCBpbnRlcm5hbGx5CiBhcyBhIHByaW1pdGl2ZSBmb3Igb3RoZXIgbWV0aG9kcy4KIApAQCAtNjcxLDcgKzc3Myw3IEBACiAgICAgd2hpbGUgKG4gPiAwKSB7CiAgICAgICAgIGlmIChsZWZ0aW5kZXggPT0gMCkgewogICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jayhsZW4pOworICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0KQEAgLTcwMiw3ICs4MDQsNyBAQAogICAgICAgICAgICAgICAgICooZGVzdCsrKSA9ICooc3JjKyspOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1tKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmlnaHRpbmRleCA9PSAtMSkgeworICAgICAgICBpZiAocmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgICAgIGFzc2VydChsZWZ0YmxvY2sgIT0gcmlnaHRibG9jayk7CiAgICAgICAgICAgICBhc3NlcnQoYiA9PSBOVUxMKTsKICAgICAgICAgICAgIGIgPSByaWdodGJsb2NrOwpAQCAtNzE1LDcgKzgxNyw3IEBACiAgICAgd2hpbGUgKG4gPCAwKSB7CiAgICAgICAgIGlmIChyaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgewogICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jayhsZW4pOworICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0KQEAgLTc5MCwxMSArODkyLDExIEBACiAgICAgYmxvY2sgKnJpZ2h0YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICBQeV9zc2l6ZV90IGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgUHlfc3NpemVfdCByaWdodGluZGV4ID0gZGVxdWUtPnJpZ2h0aW5kZXg7Ci0gICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSkgLyAyOwotICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKSA+PiAxOwogICAgIFB5T2JqZWN0ICp0bXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIG4rKzsKKyAgICB3aGlsZSAoLS1uKSB7CiAgICAgICAgIC8qIFZhbGlkYXRlIHRoYXQgcG9pbnRlcnMgaGF2ZW4ndCBtZXQgaW4gdGhlIG1pZGRsZSAqLwogICAgICAgICBhc3NlcnQobGVmdGJsb2NrICE9IHJpZ2h0YmxvY2sgfHwgbGVmdGluZGV4IDwgcmlnaHRpbmRleCk7CiAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrKTsKQEAgLTgxNCw3ICs5MTYsNyBAQAogCiAgICAgICAgIC8qIFN0ZXAgYmFja3dhcmRzIHdpdGggdGhlIHJpZ2h0IGJsb2NrL2luZGV4IHBhaXIgKi8KICAgICAgICAgcmlnaHRpbmRleC0tOwotICAgICAgICBpZiAocmlnaHRpbmRleCA9PSAtMSkgeworICAgICAgICBpZiAocmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgICAgIHJpZ2h0YmxvY2sgPSByaWdodGJsb2NrLT5sZWZ0bGluazsKICAgICAgICAgICAgIHJpZ2h0aW5kZXggPSBCTE9DS0xFTiAtIDE7CiAgICAgICAgIH0KQEAgLTgzMSwyMCArOTMzLDE5IEBACiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpOwotICAgIFB5X3NzaXplX3QgaTsKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKICAgICBzaXplX3Qgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7CiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgaW50IGNtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgbisrOworICAgIHdoaWxlICgtLW4pIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwogICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwotICAgICAgICBpZiAoY21wID4gMCkKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNvdW50ICs9IGNtcDsKIAogICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLApAQCAtODcxLDEyICs5NzIsMTIgQEAKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSk7Ci0gICAgUHlfc3NpemVfdCBpOwogICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKICAgICBQeU9iamVjdCAqaXRlbTsKICAgICBpbnQgY21wOwogCi0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICBuKys7CisgICAgd2hpbGUgKC0tbikgewogICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7CkBAIC05MDYsMTEgKzEwMDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pbmRleChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgaSwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKGRlcXVlKTsKKyAgICBQeV9zc2l6ZV90IGksIG4sIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShkZXF1ZSk7CiAgICAgUHlPYmplY3QgKnYsICppdGVtOwogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBzaXplX3Qgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7CisgICAgaW50IGNtcDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LApAQCAtOTI4LDIyICsxMDMwLDMyIEBACiAgICAgfQogICAgIGlmIChzdG9wID4gUHlfU0laRShkZXF1ZSkpCiAgICAgICAgIHN0b3AgPSBQeV9TSVpFKGRlcXVlKTsKKyAgICBpZiAoc3RhcnQgPiBzdG9wKQorICAgICAgICBzdGFydCA9IHN0b3A7CisgICAgYXNzZXJ0KDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gc3RvcCAmJiBzdG9wIDw9IFB5X1NJWkUoZGVxdWUpKTsKIAotICAgIGZvciAoaT0wIDsgaTxzdG9wIDsgaSsrKSB7Ci0gICAgICAgIGlmIChpID49IHN0YXJ0KSB7Ci0gICAgICAgICAgICBpbnQgY21wOwotICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKLSAgICAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKLSAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7Ci0gICAgICAgICAgICBpZiAoY21wID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KGkpOwotICAgICAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgLyogWFhYIFJlcGxhY2UgdGhpcyBsb29wIHdpdGggZmFzdGVyIGNvZGUgZnJvbSBkZXF1ZV9pdGVtKCkgKi8KKyAgICBmb3IgKGk9MCA7IGk8c3RhcnQgOyBpKyspIHsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgaWYgKGluZGV4ID09IEJMT0NLTEVOKSB7CisgICAgICAgICAgICBiID0gYi0+cmlnaHRsaW5rOworICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgbiA9IHN0b3AgLSBpICsgMTsKKyAgICB3aGlsZSAoLS1uKSB7CisgICAgICAgIENIRUNLX05PVF9FTkQoYik7CisgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKKyAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHN0b3AgLSBuKTsKKyAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpbmRleCsrOwogICAgICAgICBpZiAoaW5kZXggPT0gQkxPQ0tMRU4pIHsKQEAgLTEwMzcsODQgKzExNDksMTAgQEAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLAogIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS4iKTsKIAotc3RhdGljIHZvaWQKLWRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBibG9jayAqYjsKLSAgICBibG9jayAqcHJldmJsb2NrOwotICAgIGJsb2NrICpsZWZ0YmxvY2s7Ci0gICAgUHlfc3NpemVfdCBsZWZ0aW5kZXg7Ci0gICAgUHlfc3NpemVfdCBuOwotICAgIFB5T2JqZWN0ICppdGVtOwotCi0gICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyBhIGRlcXVlLCBkZWNyZWZzIGNhbiBjYXVzZSB0aGUKLSAgICAgICBkZXF1ZSB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24sIHdlIGhhdmUgdG8gbWFrZSB0aGUKLSAgICAgICBkZXF1ZSBlbXB0eSBiZWZvcmUgY2xlYXJpbmcgdGhlIGJsb2NrcyBhbmQgbmV2ZXIgcmVmZXIgdG8KLSAgICAgICBhbnl0aGluZyB2aWEgZGVxdWUtPnJlZiB3aGlsZSBjbGVhcmluZy4gIChUaGlzIGlzIHRoZSBzYW1lCi0gICAgICAgdGVjaG5pcXVlIHVzZWQgZm9yIGNsZWFyaW5nIGxpc3RzLCBzZXRzLCBhbmQgZGljdHMuKQotCi0gICAgICAgTWFraW5nIHRoZSBkZXF1ZSBlbXB0eSByZXF1aXJlcyBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGJsb2NrLiAgSW4KLSAgICAgICB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBtZW1vcnkgaXMgZnVsbCwgd2UgZmFsbCBiYWNrIHRvIGFuCi0gICAgICAgYWx0ZXJuYXRlIG1ldGhvZCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhIG5ldyBibG9jay4gIFJlcGVhdGluZwotICAgICAgIHBvcHMgaW4gYSB3aGlsZS1sb29wIGlzIHNsb3dlciwgcG9zc2libHkgcmUtZW50cmFudCAoYW5kIGEgY2xldmVyCi0gICAgICAgYWR2ZXJzYXJ5IGNvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHRlcm1pbmF0ZSkuCi0gICAgKi8KLQotICAgIGIgPSBuZXdibG9jaygwKTsKLSAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGdvdG8gYWx0ZXJuYXRlX21ldGhvZDsKLSAgICB9Ci0KLSAgICAvKiBSZW1lbWJlciB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCAqLwotICAgIGxlZnRibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2s7Ci0gICAgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKLSAgICBuID0gUHlfU0laRShkZXF1ZSk7Ci0KLSAgICAvKiBTZXQgdGhlIGRlcXVlIHRvIGJlIGVtcHR5IHVzaW5nIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KLSAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7Ci0gICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKLSAgICBQeV9TSVpFKGRlcXVlKSA9IDA7Ci0gICAgZGVxdWUtPmxlZnRibG9jayA9IGI7Ci0gICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOwotICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQ0VOVEVSOwotICAgIGRlcXVlLT5zdGF0ZSsrOwotCi0gICAgLyogTm93IHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4IGFyZSBkaXNjb25uZWN0ZWQgZnJvbQotICAgICAgIHRoZSBlbXB0eSBkZXF1ZSBhbmQgd2UgY2FuIHVzZSB0aGVtIHRvIGRlY3JlZiB0aGUgcG9pbnRlcnMuCi0gICAgKi8KLSAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgIGl0ZW0gPSBsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICBsZWZ0aW5kZXgrKzsKLSAgICAgICAgaWYgKGxlZnRpbmRleCA9PSBCTE9DS0xFTiAmJiBuKSB7Ci0gICAgICAgICAgICBDSEVDS19OT1RfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKLSAgICAgICAgICAgIHByZXZibG9jayA9IGxlZnRibG9jazsKLSAgICAgICAgICAgIGxlZnRibG9jayA9IGxlZnRibG9jay0+cmlnaHRsaW5rOwotICAgICAgICAgICAgbGVmdGluZGV4ID0gMDsKLSAgICAgICAgICAgIGZyZWVibG9jayhwcmV2YmxvY2spOwotICAgICAgICB9Ci0gICAgfQotICAgIENIRUNLX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgZnJlZWJsb2NrKGxlZnRibG9jayk7Ci0gICAgcmV0dXJuOwotCi0gIGFsdGVybmF0ZV9tZXRob2Q6Ci0gICAgd2hpbGUgKFB5X1NJWkUoZGVxdWUpKSB7Ci0gICAgICAgIGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOwotICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICB9Ci19Ci0KIHN0YXRpYyBpbnQKIHZhbGlkX2luZGV4KFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBsaW1pdCkKIHsKLSAgICAvKiBUaGUgY2FzdCB0byBzaXplX3QgbGV0IHVzIHVzZSBqdXN0IGEgc2luZ2xlIGNvbXBhcmlzb24KKyAgICAvKiBUaGUgY2FzdCB0byBzaXplX3QgbGV0cyB1cyB1c2UganVzdCBhIHNpbmdsZSBjb21wYXJpc29uCiAgICAgICAgdG8gY2hlY2sgd2hldGhlciBpIGlzIGluIHRoZSByYW5nZTogMCA8PSBpIDwgbGltaXQgKi8KICAgICByZXR1cm4gKHNpemVfdCkgaSA8IChzaXplX3QpIGxpbWl0OwogfQpAQCAtMTE0MywxNCArMTE4MSwxNiBAQAogICAgICAgICBpID0gKFB5X3NzaXplX3QpKChzaXplX3QpIGkgJSBCTE9DS0xFTik7CiAgICAgICAgIGlmIChpbmRleCA8IChQeV9TSVpFKGRlcXVlKSA+PiAxKSkgewogICAgICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7Ci0gICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgbisrOworICAgICAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgICAgICBiID0gYi0+cmlnaHRsaW5rOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbiA9IChQeV9zc2l6ZV90KSgKICAgICAgICAgICAgICAgICAgICAgKChzaXplX3QpKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSAtIDEpKQogICAgICAgICAgICAgICAgICAgICAvIEJMT0NLTEVOIC0gbik7CiAgICAgICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0gICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgbisrOworICAgICAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgICAgICBiID0gYi0+bGVmdGxpbms7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTk0LDE0ICsxMjM0LDE2IEBACiAgICAgaSA9IChQeV9zc2l6ZV90KSgoc2l6ZV90KSBpICUgQkxPQ0tMRU4pOwogICAgIGlmIChpbmRleCA8PSBoYWxmbGVuKSB7CiAgICAgICAgIGIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICBuKys7CisgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICBiID0gYi0+cmlnaHRsaW5rOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG4gPSAoUHlfc3NpemVfdCkoCiAgICAgICAgICAgICAgICAgKChzaXplX3QpKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSAtIDEpKQogICAgICAgICAgICAgICAgIC8gQkxPQ0tMRU4gLSBuKTsKICAgICAgICAgYiA9IGRlcXVlLT5yaWdodGJsb2NrOwotICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICBuKys7CisgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICBiID0gYi0+bGVmdGxpbms7CiAgICAgfQogICAgIFB5X0lOQ1JFRih2KTsKQEAgLTEyMTEsMTUgKzEyNTMsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfY2xlYXJtZXRob2QoZGVxdWVvYmplY3QgKmRlcXVlKQotewotICAgIGRlcXVlX2NsZWFyKGRlcXVlKTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotUHlEb2NfU1RSVkFSKGNsZWFyX2RvYywgIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuIik7Ci0KIHN0YXRpYyB2b2lkCiBkZXF1ZV9kZWFsbG9jKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKQEAgLTEyNDMsNiArMTI3Niw3IEBACiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgUHlfc3NpemVfdCBpbmRleDsKICAgICBQeV9zc2l6ZV90IGluZGV4bG8gPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIFB5X3NzaXplX3QgaW5kZXhoaWdoOwogCiAgICAgZm9yIChiID0gZGVxdWUtPmxlZnRibG9jazsgYiAhPSBkZXF1ZS0+cmlnaHRibG9jazsgYiA9IGItPnJpZ2h0bGluaykgewogICAgICAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPCBCTE9DS0xFTiA7IGluZGV4KyspIHsKQEAgLTEyNTEsNyArMTI4NSw4IEBACiAgICAgICAgIH0KICAgICAgICAgaW5kZXhsbyA9IDA7CiAgICAgfQotICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBkZXF1ZS0+cmlnaHRpbmRleDsgaW5kZXgrKykgeworICAgIGluZGV4aGlnaCA9IGRlcXVlLT5yaWdodGluZGV4OworICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpZ2g7IGluZGV4KyspIHsKICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwogICAgICAgICBQeV9WSVNJVChpdGVtKTsKICAgICB9CkBAIC0xMjU5LDQ1ICsxMjk0LDMzIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAotICAgICAgICAgICAgZGVxdWUsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiwgTlVMTCk7Ci19Ci0KLVB5RG9jX1NUUlZBUihjb3B5X2RvYywgIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmVkdWNlKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLSAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKml0OwogICAgIF9QeV9JREVOVElGSUVSKF9fZGljdF9fKTsKIAogICAgIGRpY3QgPSBfUHlPYmplY3RfR2V0QXR0cklkKChQeU9iamVjdCAqKWRlcXVlLCAmUHlJZF9fX2RpY3RfXyk7Ci0gICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKLSAgICBpZiAoYXNsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICAgICAgZGljdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICB9CisKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoKFB5T2JqZWN0ICopZGVxdWUpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChkaWN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBQeV9Ob25lLCBkaWN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbilPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbiwgZGljdCk7CisKKyAgICBpZiAoZGVxdWUtPm1heGxlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oKU5OIiwgUHlfVFlQRShkZXF1ZSksIGRpY3QsIGl0KTsKICAgICB9Ci0gICAgUHlfWERFQ1JFRihkaWN0KTsKLSAgICBQeV9ERUNSRUYoYXNsaXN0KTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGVsc2UgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTygoKW4pTk4iLCBQeV9UWVBFKGRlcXVlKSwgZGVxdWUtPm1heGxlbiwgZGljdCwgaXQpOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtMTMyMCw3ICsxMzQzLDcgQEAKICAgICAgICAgUHlfUmVwckxlYXZlKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gIT0gLTEpCisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA+PSAwKQogICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiZGVxdWUoJVIsIG1heGxlbj0lemQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsaXN0LCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4pOwogICAgIGVsc2UKQEAgLTEzODEsNyArMTQwNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKHgpOwogICAgICAgICBQeV9ERUNSRUYoeSk7Ci0gICAgICAgIGlmIChiID09IC0xKQorICAgICAgICBpZiAoYiA8IDApCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogICAgIC8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBvbmUgZGVxdWUgb3IgYm90aCAqLwpAQCAtMTQxNiw4ICsxNDM5LDE0IEBACiAgICAgUHlfc3NpemVfdCBtYXhsZW4gPSAtMTsKICAgICBjaGFyICprd2xpc3RbXSA9IHsiaXRlcmFibGUiLCAibWF4bGVuIiwgMH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RhcmdzLCAifE9POmRlcXVlIiwga3dsaXN0LCAmaXRlcmFibGUsICZtYXhsZW5vYmopKQotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGt3ZGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkZXF1ZSgpIiwgMCwgMiwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RhcmdzLCAifE9POmRlcXVlIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmFibGUsICZtYXhsZW5vYmopKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICBpZiAobWF4bGVub2JqICE9IE5VTEwgJiYgbWF4bGVub2JqICE9IFB5X05vbmUpIHsKICAgICAgICAgbWF4bGVuID0gUHlMb25nX0FzU3NpemVfdChtYXhsZW5vYmopOwogICAgICAgICBpZiAobWF4bGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0xNDQ2LDcgKzE0NzUsNyBAQAogICAgIFB5X3NzaXplX3QgYmxvY2tzOwogCiAgICAgcmVzID0gX1B5T2JqZWN0X1NJWkUoUHlfVFlQRShkZXF1ZSkpOwotICAgIGJsb2NrcyA9IChkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgKyBCTE9DS0xFTiAtIDEpIC8gQkxPQ0tMRU47CisgICAgYmxvY2tzID0gKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpICsgQkxPQ0tMRU4gLSAxKSAvIEJMT0NLTEVOOwogICAgIGFzc2VydChkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxID09CiAgICAgICAgICAgIChibG9ja3MgLSAxKSAqIEJMT0NLTEVOICsgZGVxdWUtPnJpZ2h0aW5kZXgpOwogICAgIHJlcyArPSBibG9ja3MgKiBzaXplb2YoYmxvY2spOwpAQCAtMTQ2NSw3ICsxNDk0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9nZXRfbWF4bGVuKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKKyAgICBpZiAoZGVxdWUtPm1heGxlbiA8IDApCiAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QoZGVxdWUtPm1heGxlbik7CiB9CkBAIC0xODA2LDcgKzE4MzUsNyBAQAogICAgIGl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOwogICAgIGl0LT5pbmRleC0tOwogICAgIGl0LT5jb3VudGVyLS07Ci0gICAgaWYgKGl0LT5pbmRleCA9PSAtMSAmJiBpdC0+Y291bnRlciA+IDApIHsKKyAgICBpZiAoaXQtPmluZGV4IDwgMCAmJiBpdC0+Y291bnRlciA+IDApIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChpdC0+Yi0+bGVmdGxpbmspOwogICAgICAgICBpdC0+YiA9IGl0LT5iLT5sZWZ0bGluazsKICAgICAgICAgaXQtPmluZGV4ID0gQkxPQ0tMRU4gLSAxOwpAQCAtMTk4MCw3ICsyMDA5LDcgQEAKICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKICAgICBpZiAoYXJncyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpdGVtcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopZGQsICZQeUlkX2l0ZW1zLCAiKCkiKTsKKyAgICBpdGVtcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopZGQsICZQeUlkX2l0ZW1zLCBOVUxMKTsKICAgICBpZiAoaXRlbXMgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjIzNSwxMyArMjI2NCwxMyBAQAogCiAgICAgICAgICAgICBvbGR2YWwgPSBfUHlEaWN0X0dldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgaGFzaCk7CiAgICAgICAgICAgICBpZiAob2xkdmFsID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG9uZSwgaGFzaCkgPT0gLTEpCisgICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBvbmUsIGhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuZXd2YWwgPSBQeU51bWJlcl9BZGQob2xkdmFsLCBvbmUpOwogICAgICAgICAgICAgICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgbmV3dmFsLCBoYXNoKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG5ld3ZhbCwgaGFzaCkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgUHlfQ0xFQVIobmV3dmFsKTsKICAgICAgICAgICAgIH0KQEAgLTIyNjcsNyArMjI5Niw3IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYob2xkdmFsKTsKICAgICAgICAgICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKG1hcHBpbmcsIGtleSwgbmV3dmFsKSA9PSAtMSkKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKG1hcHBpbmcsIGtleSwgbmV3dmFsKSA8IDApCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBQeV9DTEVBUihuZXd2YWwpOwogICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jc3YuYyBiL01vZHVsZXMvX2Nzdi5jCmluZGV4IGI0MjgyNzkuLjdhNzg1NDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2Nzdi5jCisrKyBiL01vZHVsZXMvX2Nzdi5jCkBAIC02MCwxMCArNjAsMTAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFF1b3RlU3R5bGUgc3R5bGU7Ci0gICAgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOwogfSBTdHlsZURlc2M7CiAKLXN0YXRpYyBTdHlsZURlc2MgcXVvdGVfc3R5bGVzW10gPSB7CitzdGF0aWMgY29uc3QgU3R5bGVEZXNjIHF1b3RlX3N0eWxlc1tdID0gewogICAgIHsgUVVPVEVfTUlOSU1BTCwgICAgIlFVT1RFX01JTklNQUwiIH0sCiAgICAgeyBRVU9URV9BTEwsICAgICAgICAiUVVPVEVfQUxMIiB9LAogICAgIHsgUVVPVEVfTk9OTlVNRVJJQywgIlFVT1RFX05PTk5VTUVSSUMiIH0sCkBAIC0yODYsNyArMjg2LDcgQEAKIHN0YXRpYyBpbnQKIGRpYWxlY3RfY2hlY2tfcXVvdGluZyhpbnQgcXVvdGluZykKIHsKLSAgICBTdHlsZURlc2MgKnFzOworICAgIGNvbnN0IFN0eWxlRGVzYyAqcXM7CiAKICAgICBmb3IgKHFzID0gcXVvdGVfc3R5bGVzOyBxcy0+bmFtZTsgcXMrKykgewogICAgICAgICBpZiAoKGludClxcy0+c3R5bGUgPT0gcXVvdGluZykKQEAgLTUxOCwxNSArNTE4LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NhbGxfZGlhbGVjdChQeU9iamVjdCAqZGlhbGVjdF9pbnN0LCBQeU9iamVjdCAqa3dhcmdzKQogewotICAgIFB5T2JqZWN0ICpjdG9yX2FyZ3M7Ci0gICAgUHlPYmplY3QgKmRpYWxlY3Q7Ci0KLSAgICBjdG9yX2FyZ3MgPSBQeV9CdWlsZFZhbHVlKGRpYWxlY3RfaW5zdCA/ICIoTykiIDogIigpIiwgZGlhbGVjdF9pbnN0KTsKLSAgICBpZiAoY3Rvcl9hcmdzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGRpYWxlY3QgPSBQeU9iamVjdF9DYWxsKChQeU9iamVjdCAqKSZEaWFsZWN0X1R5cGUsIGN0b3JfYXJncywga3dhcmdzKTsKLSAgICBQeV9ERUNSRUYoY3Rvcl9hcmdzKTsKLSAgICByZXR1cm4gZGlhbGVjdDsKKyAgICBQeU9iamVjdCAqdHlwZSA9IChQeU9iamVjdCAqKSZEaWFsZWN0X1R5cGU7CisgICAgaWYgKGRpYWxlY3RfaW5zdCkgeworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdCh0eXBlLCAmZGlhbGVjdF9pbnN0LCAxLCBrd2FyZ3MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIF9QeU9iamVjdF9GYXN0Q2FsbERpY3QodHlwZSwgTlVMTCwgMCwga3dhcmdzKTsKKyAgICB9CiB9CiAKIC8qCkBAIC0xNjQ4LDcgKzE2NDYsNyBAQAogUHlJbml0X19jc3Yodm9pZCkKIHsKICAgICBQeU9iamVjdCAqbW9kdWxlOwotICAgIFN0eWxlRGVzYyAqc3R5bGU7CisgICAgY29uc3QgU3R5bGVEZXNjICpzdHlsZTsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxlY3RfVHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCmluZGV4IGIyMDAzOWYuLjk4NDMzZTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwpAQCAtMTExLDEyICsxMTEsNiBAQAogI2lmbmRlZiBJU19JTlRSRVNPVVJDRQogI2RlZmluZSBJU19JTlRSRVNPVVJDRSh4KSAoKChzaXplX3QpKHgpID4+IDE2KSA9PSAwKQogI2VuZGlmCi0jIGlmZGVmIF9XSU4zMl9XQ0UKLS8qIFVubGlrZSBkZXNrdG9wIFdpbmRvd3MsIFdpbkNFIGhhcyBib3RoIFcgYW5kIEEgdmFyaWFudHMgb2YKLSAgIEdldFByb2NBZGRyZXNzLCBidXQgdGhlIGRlZmF1bHQgVyB2ZXJzaW9uIGlzIG5vdCB3aGF0IHdlIHdhbnQgKi8KLSMgIHVuZGVmIEdldFByb2NBZGRyZXNzCi0jICBkZWZpbmUgR2V0UHJvY0FkZHJlc3MgR2V0UHJvY0FkZHJlc3NBCi0jIGVuZGlmCiAjZWxzZQogI2luY2x1ZGUgImN0eXBlc19kbGZjbi5oIgogI2VuZGlmCkBAIC00MzUsNyArNDI5LDcgQEAKICAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYWRkcmVzc19kb2NbXSA9CiAiQy5mcm9tX2FkZHJlc3MoaW50ZWdlcikgLT4gQyBpbnN0YW5jZVxuYWNjZXNzIGEgQyBpbnN0YW5jZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDUzLDcgKzQ0Nyw3IEBACiAgICAgcmV0dXJuIFB5Q0RhdGFfQXRBZGRyZXNzKHR5cGUsIGJ1Zik7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYnVmZmVyX2RvY1tdID0KICJDLmZyb21fYnVmZmVyKG9iamVjdCwgb2Zmc2V0PTApIC0+IEMgaW5zdGFuY2VcbmNyZWF0ZSBhIEMgaW5zdGFuY2UgZnJvbSBhIHdyaXRlYWJsZSBidWZmZXIiOwogCiBzdGF0aWMgaW50CkBAIC01MjQsNyArNTE4LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9jb3B5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQogIkMuZnJvbV9idWZmZXJfY29weShvYmplY3QsIG9mZnNldD0wKSAtPiBDIGluc3RhbmNlXG5jcmVhdGUgYSBDIGluc3RhbmNlIGZyb20gYSByZWFkYWJsZSBidWZmZXIiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNTY2LDcgKzU2MCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgaW5fZGxsX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGluX2RsbF9kb2NbXSA9CiAiQy5pbl9kbGwoZGxsLCBuYW1lKSAtPiBDIGluc3RhbmNlXG5hY2Nlc3MgYSBDIGluc3RhbmNlIGluIGEgZGxsIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTYyMyw3ICs2MTcsNyBAQAogICAgIHJldHVybiBQeUNEYXRhX0F0QWRkcmVzcyh0eXBlLCBhZGRyZXNzKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9wYXJhbV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX3BhcmFtX2RvY1tdID0KICJDb252ZXJ0IGEgUHl0aG9uIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE0ODcsNyArMTQ4MSw3IEBACiAKICovCiAKLXN0YXRpYyBjaGFyICpTSU1QTEVfVFlQRV9DSEFSUyA9ICJjYkJoSGlJbExkZnV6WnFRUFhPdj9nIjsKK3N0YXRpYyBjb25zdCBjaGFyIFNJTVBMRV9UWVBFX0NIQVJTW10gPSAiY2JCaEhpSWxMZGZ1elpxUVBYT3Y/ZyI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3djaGFyX3BfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQpAQCAtMjQxMiw3ICsyNDA2LDcgQEAKICAgICBjaGFyICpjcCA9IHN0cmluZzsKICAgICBzaXplX3QgYnl0ZXNfbGVmdDsKIAotICAgIGFzc2VydChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CiAgICAgY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CiAgICAgd2hpbGUgKHRhcmdldC0+Yl9iYXNlKSB7CiAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2Yoc3RyaW5nKSAtIChjcCAtIHN0cmluZykgLSAxOwpAQCAtMzIwNyw3ICszMjAxLDcgQEAKIH0KIAogc3RhdGljIGludAotX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNoYXIgKipwbmFtZSkKK19nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICoqcG5hbWUpCiB7CiAjaWZkZWYgTVNfV0lOMzIKICAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKQEAgLTMyMzUsNyArMzIyOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRnVuY1B0cl9Gcm9tRGxsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CiAgICAgUHlPYmplY3QgKmZ0dXBsZTsKICAgICBQeU9iamVjdCAqZGxsOwpAQCAtNTEyNSwyOSArNTExOSwyOCBAQAogCiAjaWZkZWYgTVNfV0lOMzIKIAotc3RhdGljIGNoYXIgY29tZXJyb3JfZG9jW10gPSAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiI7CitzdGF0aWMgY29uc3QgY2hhciBjb21lcnJvcl9kb2NbXSA9ICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIjsKIAogaW50CiBjb21lcnJvcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlPYmplY3QgKmhyZXN1bHQsICp0ZXh0LCAqZGV0YWlsczsKLSAgICBQeUJhc2VFeGNlcHRpb25PYmplY3QgKmJzZWxmOwogICAgIFB5T2JqZWN0ICphOwogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT086Q09NRXJyb3IiLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAgICAgc3RhdHVzID0gUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIsIGEpOwogICAgIFB5X0RFQ1JFRihhKTsKICAgICBpZiAoc3RhdHVzIDwgMCkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJocmVzdWx0IiwgaHJlc3VsdCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC01MTU4LDkgKzUxNTEsOCBAQAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJkZXRhaWxzIiwgZGV0YWlscykgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBic2VsZiA9IChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmOwogICAgIFB5X0lOQ1JFRihhcmdzKTsKLSAgICBQeV9TRVRSRUYoYnNlbGYtPmFyZ3MsIGFyZ3MpOworICAgIFB5X1NFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5hcmdzLCBhcmdzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNTQ5MCwxNCArNTQ4MiwxNCBAQAogI2VuZGlmCiAKIC8qIElmIFJUTERfTE9DQUwgaXMgbm90IGRlZmluZWQgKFdpbmRvd3MhKSwgc2V0IGl0IHRvIHplcm8uICovCi0jaWZuZGVmIFJUTERfTE9DQUwKKyNpZiAhSEFWRV9ERUNMX1JUTERfTE9DQUwKICNkZWZpbmUgUlRMRF9MT0NBTCAwCiAjZW5kaWYKIAogLyogSWYgUlRMRF9HTE9CQUwgaXMgbm90IGRlZmluZWQgKGN5Z3dpbiksIHNldCBpdCB0byB0aGUgc2FtZSB2YWx1ZSBhcwogICAgUlRMRF9MT0NBTC4KICovCi0jaWZuZGVmIFJUTERfR0xPQkFMCisjaWYgIUhBVkVfREVDTF9SVExEX0dMT0JBTAogI2RlZmluZSBSVExEX0dMT0JBTCBSVExEX0xPQ0FMCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IDNjN2Y4OTIuLjkyYzNiOWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTIzMyw3ICsyMzMsNiBAQAogICAgIHJldHVybiAoKmZ1bmMpKHRhYmxlKTsKIH0KIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmRxKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsIFBZX0xPTkdfTE9ORyBxKQogewpAQCAtMjY3LDggKzI2Niw2IEBACiAgICAgcmV0dXJuIHN1bTsKIH0KIAotI2VuZGlmCi0KIHR5cGVkZWYgc3RydWN0IHsKICAgICBjaGFyICpuYW1lOwogICAgIGNoYXIgKnZhbHVlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCmluZGV4IDkxNDEzZDcuLmI5NThmMzAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVByaW50RXJyb3IoY2hhciAqbXNnLCAuLi4pCitQcmludEVycm9yKGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewogICAgIGNoYXIgYnVmWzUxMl07CiAgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwppbmRleCAzMGUzYTk2Li41ZmM5NmY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwpAQCAtMzgyLDcgKzM4Miw3IEBACiAgICAgICAgICAgIHdob3NlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudAogICAgICAgICAgICBtYWNoaW5lIG1vZGUuICovCiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogcHJpdmlsZWRnZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24iKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT046CkBAIC00NzQsNyArNDc0LDYgQEAKICAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUubCk7CiAgICAgICAgIGJyZWFrOwogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICBjYXNlICdxJzoKICAgICBjYXNlICdRJzoKICAgICAgICAgc3ByaW50ZihidWZmZXIsCkBAIC00ODUsNyArNDg0LDYgQEAKICNlbmRpZgogICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5xKTsKICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKICAgICBjYXNlICdkJzoKICAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAogICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5kKTsKQEAgLTU5Myw5ICs1OTEsNyBAQAogICAgIHNob3J0IGg7CiAgICAgaW50IGk7CiAgICAgbG9uZyBsOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgUFlfTE9OR19MT05HIHE7Ci0jZW5kaWYKICAgICBsb25nIGRvdWJsZSBEOwogICAgIGRvdWJsZSBkOwogICAgIGZsb2F0IGY7CkBAIC05MzAsNyArOTI2LDcgQEAKICAqIFJhaXNlIGEgbmV3IGV4Y2VwdGlvbiAnZXhjX2NsYXNzJywgYWRkaW5nIGFkZGl0aW9uYWwgdGV4dCB0byB0aGUgb3JpZ2luYWwKICAqIGV4Y2VwdGlvbiBzdHJpbmcuCiAgKi8KLXZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pCit2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmFyZ3M7CiAgICAgUHlPYmplY3QgKnRwLCAqdiwgKnRiLCAqcywgKmNsc19zdHIsICptc2dfc3RyOwpAQCAtMTIwMyw3ICsxMTk5LDcgQEAKIAogI2lmZGVmIE1TX1dJTjMyCiAKLXN0YXRpYyBjaGFyIGZvcm1hdF9lcnJvcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRfZXJyb3JfZG9jW10gPQogIkZvcm1hdEVycm9yKFtpbnRlZ2VyXSkgLT4gc3RyaW5nXG5cCiBcblwKIENvbnZlcnQgYSB3aW4zMiBlcnJvciBjb2RlIGludG8gYSBzdHJpbmcuIElmIHRoZSBlcnJvciBjb2RlIGlzIG5vdFxuXApAQCAtMTIyNyw3ICsxMjIzLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgbG9hZF9saWJyYXJ5X2RvY1tdID0KICJMb2FkTGlicmFyeShuYW1lKSAtPiBoYW5kbGVcblwKIFxuXAogTG9hZCBhbiBleGVjdXRhYmxlICh1c3VhbGx5IGEgRExMKSwgYW5kIHJldHVybiBhIGhhbmRsZSB0byBpdC5cblwKQEAgLTEyNTYsNyArMTI1Miw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGNoYXIgZnJlZV9saWJyYXJ5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyZWVfbGlicmFyeV9kb2NbXSA9CiAiRnJlZUxpYnJhcnkoaGFuZGxlKSAtPiB2b2lkXG5cCiBcblwKIEZyZWUgdGhlIGhhbmRsZSBvZiBhbiBleGVjdXRhYmxlIHByZXZpb3VzbHkgbG9hZGVkIGJ5IExvYWRMaWJyYXJ5LlxuIjsKQEAgLTEyNzEsNyArMTI2Nyw3IEBACiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLXN0YXRpYyBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weV9jb21fcG9pbnRlcl9kb2NbXSA9CiAiQ29weUNvbVBvaW50ZXIoc3JjLCBkc3QpIC0+IEhSRVNVTFQgdmFsdWVcbiI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzA5LDcgKzEzMDUsNyBAQAogICAgIFB5T2JqZWN0ICpuYW1lLCAqbmFtZTI7CiAgICAgY2hhciAqbmFtZV9zdHI7CiAgICAgdm9pZCAqIGhhbmRsZTsKLSNpZmRlZiBSVExEX0xPQ0FMCisjaWYgSEFWRV9ERUNMX1JUTERfTE9DQUwKICAgICBpbnQgbW9kZSA9IFJUTERfTk9XIHwgUlRMRF9MT0NBTDsKICNlbHNlCiAgICAgLyogY3lnd2luIGRvZXNuJ3QgZGVmaW5lIFJUTERfTE9DQUwgKi8KQEAgLTE0NDEsNyArMTQzNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGZ1bmN0aW9ucwogICovCi1zdGF0aWMgY2hhciBzaXplb2ZfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgc2l6ZW9mX2RvY1tdID0KICJzaXplb2YoQyB0eXBlKSAtPiBpbnRlZ2VyXG4iCiAic2l6ZW9mKEMgaW5zdGFuY2UpIC0+IGludGVnZXJcbiIKICJSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBDIGluc3RhbmNlIjsKQEAgLTE0NjIsNyArMTQ1OCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjaGFyIGFsaWdubWVudF9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhbGlnbm1lbnRfZG9jW10gPQogImFsaWdubWVudChDIHR5cGUpIC0+IGludGVnZXJcbiIKICJhbGlnbm1lbnQoQyBpbnN0YW5jZSkgLT4gaW50ZWdlclxuIgogIlJldHVybiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIEMgaW5zdGFuY2UiOwpAQCAtMTQ4NSw3ICsxNDgxLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIgYnlyZWZfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYnlyZWZfZG9jW10gPQogImJ5cmVmKEMgaW5zdGFuY2VbLCBvZmZzZXQ9MF0pIC0+IGJ5cmVmLW9iamVjdFxuIgogIlJldHVybiBhIHBvaW50ZXIgbG9va2FsaWtlIHRvIGEgQyBpbnN0YW5jZSwgb25seSB1c2FibGVcbiIKICJhcyBmdW5jdGlvbiBhcmd1bWVudCI7CkBAIC0xNTI5LDcgKzE1MjUsNyBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOwogfQogCi1zdGF0aWMgY2hhciBhZGRyZXNzb2ZfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVzc29mX2RvY1tdID0KICJhZGRyZXNzb2YoQyBpbnN0YW5jZSkgLT4gaW50ZWdlclxuIgogIlJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgQyBpbnN0YW5jZSBpbnRlcm5hbCBidWZmZXIiOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKaW5kZXggZDY2NmJlNS4uMDY4MzVjYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwpAQCAtMzc5LDggKzM3OSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIGxvbmcgbG9uZy4gKi8KIAogc3RhdGljIGludApAQCAtNDE3LDggKzQxNSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEludGVnZXIgZmllbGRzLCB3aXRoIGJpdGZpZWxkIHN1cHBvcnQKICAqLwpAQCAtODg4LDcgKzg4NCw2IEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7CkBAIC05ODIsNyArOTc3LDYgQEAKICAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub24taW50ZWdlciBhY2Nlc3NvciBtZXRob2RzLCBub3Qgc3VwcG9ydGluZyBiaXQgZmllbGRzCkBAIC0xNDkwLDkgKzE0ODQsNyBAQAogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKICAgICB2ID0gKHZvaWQgKilQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKHZhbHVlKTsKICNlbHNlCi0jaWZuZGVmIEhBVkVfTE9OR19MT05HCi0jICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZih2b2lkKikgPiBzaXplb2YobG9uZyksIGJ1dCBubyBsb25nIGxvbmciCi0jZWxpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAorI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCiAjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgogICAgIHYgPSAodm9pZCAqKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKQEAgLTE1MzgsMTQgKzE1MzAsMTIgQEAKICNlbHNlCiAjIGVycm9yCiAjZW5kaWYKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogI2lmIFNJWkVPRl9MT05HX0xPTkcgPT0gOAogICAgIHsgJ3EnLCBxX3NldCwgcV9nZXQsICZmZmlfdHlwZV9zaW50NjQsIHFfc2V0X3N3LCBxX2dldF9zd30sCiAgICAgeyAnUScsIFFfc2V0LCBRX2dldCwgJmZmaV90eXBlX3VpbnQ2NCwgUV9zZXRfc3csIFFfZ2V0X3N3fSwKICNlbHNlCiAjIGVycm9yCiAjZW5kaWYKLSNlbmRpZgogICAgIHsgJ1AnLCBQX3NldCwgUF9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKICAgICB7ICd6Jywgel9zZXQsIHpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKQEAgLTE2MzUsMTAgKzE2MjUsOCBAQAogI2VuZGlmCiAqLwogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKIHR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBQWV9MT05HX0xPTkcgeDsgfSBzX2xvbmdfbG9uZzsKICNkZWZpbmUgTE9OR19MT05HX0FMSUdOIChzaXplb2Yoc19sb25nX2xvbmcpIC0gc2l6ZW9mKFBZX0xPTkdfTE9ORykpCi0jZW5kaWYKIAogLyogZnJvbSBmZmkuaDoKIHR5cGVkZWYgc3RydWN0IF9mZmlfdHlwZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCmluZGV4IDBkM2Y3MjQuLjY0Y2I2OWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKQEAgLTMxLDkgKzMxLDcgQEAKICAgICAgICAgICAgICAgICBsb25nIGw7CiAgICAgICAgICAgICAgICAgZmxvYXQgZjsKICAgICAgICAgICAgICAgICBkb3VibGUgZDsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICAgICAgICAgIFBZX0xPTkdfTE9ORyBsbDsKLSNlbmRpZgogICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIEQ7CiB9OwogCkBAIC0yMzgsNyArMjM2LDcgQEAKICBTdGdEaWN0T2JqZWN0IGZ1bmN0aW9uIHRvIGEgZ2VuZXJpYyBvbmUuCiAKICBDdXJyZW50bHksIFB5Q0Z1bmNQdHIgdHlwZXMgaGF2ZSAnY29udmVydGVycycgYW5kICdjaGVja2VyJyBlbnRyaWVzIGluIHRoZWlyCi0gdHlwZSBkaWN0LiAgVGhleSBhcmUgb25seSB1c2VkIHRvIGNhY2hlIGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBlbnRyaWVzLCB3aGloYworIHR5cGUgZGljdC4gIFRoZXkgYXJlIG9ubHkgdXNlZCB0byBjYWNoZSBhdHRyaWJ1dGVzIGZyb20gb3RoZXIgZW50cmllcywgd2hpY2gKICBpcyB3cm9uZy4KIAogIE9uZSB1c2UgY2FzZSBpcyB0aGUgLnZhbHVlIGF0dHJpYnV0ZSB0aGF0IGFsbCBzaW1wbGUgdHlwZXMgaGF2ZS4gIEJ1dCBzb21lCkBAIC0zMDMsOSArMzAxLDcgQEAKICAgICAgICAgc2hvcnQgaDsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGxvbmcgbDsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICBQWV9MT05HX0xPTkcgcTsKLSNlbmRpZgogICAgICAgICBsb25nIGRvdWJsZSBEOwogICAgICAgICBkb3VibGUgZDsKICAgICAgICAgZmxvYXQgZjsKQEAgLTMyNyw3ICszMjMsNyBAQAogUHlDRGF0YV9zZXQoUHlPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAogICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAotZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgYmFzZXNwZWMgewogICAgIENEYXRhT2JqZWN0ICpiYXNlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZGVidWcuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjFmOWYuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBkZWJ1Zy5jIC0gQ29weXJpZ2h0IChjKSAxOTk2IFJlZCBIYXQsIEluYy4KLQotICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi0gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgPGZmaS5oPgotI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBHZW5lcmFsIGRlYnVnZ2luZyByb3V0aW5lcyAqLwotCi12b2lkIGZmaV9zdG9wX2hlcmUodm9pZCkKLXsKLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICAgICBQbGFjZSBhIGJyZWFrcG9pbnQgb24gZmZpX3N0b3BfaGVyZSB0byBiZSBub3RpZmllZCBvZiAKLSAgICAgc2lnbmlmaWNhbnQgZXZlbnRzLiAqLwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB2aWEgdGhlIEZGSV9BU1NFUlQoKSBtYWNybyAqLwotCi12b2lkIGZmaV9hc3NlcnQoY2hhciAqZXhwciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGZwcmludGYoc3RkZXJyLCAiQVNTRVJUSU9OIEZBSUxVUkU6ICVzIGF0ICVzOiVkXG4iLCBleHByLCBmaWxlLCBsaW5lKTsKLSAgZmZpX3N0b3BfaGVyZSgpOwotICBhYm9ydCgpOwotfQotCi0vKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIGFuIGZmaV90eXBlIHN0cnVjdHVyZSAqLwotCi12b2lkIGZmaV90eXBlX3Rlc3QoZmZpX3R5cGUgKmEsIGNoYXIgKmZpbGUsIGludCBsaW5lKQotewotICBGRklfQVNTRVJUX0FUKGEgIT0gTlVMTCwgZmlsZSwgbGluZSk7Ci0KLSAgLypALXVzZWRlZkAqLwotICBGRklfQVNTRVJUX0FUKGEtPnR5cGUgPD0gRkZJX1RZUEVfTEFTVCwgZmlsZSwgbGluZSk7Ci0gIEZGSV9BU1NFUlRfQVQoYS0+dHlwZSA9PSBGRklfVFlQRV9WT0lEIHx8IGEtPnNpemUgPiAwLCBmaWxlLCBsaW5lKTsKLSAgRkZJX0FTU0VSVF9BVChhLT50eXBlID09IEZGSV9UWVBFX1ZPSUQgfHwgYS0+YWxpZ25tZW50ID4gMCwgZmlsZSwgbGluZSk7Ci0gIEZGSV9BU1NFUlRfQVQoYS0+dHlwZSAhPSBGRklfVFlQRV9TVFJVQ1QgfHwgYS0+ZWxlbWVudHMgIT0gTlVMTCwgZmlsZSwgbGluZSk7Ci0gIC8qQD11c2VkZWZAKi8KLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTNhYWEuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk4ICBSZWQgSGF0LCBJbmMuCi0gICAKLSAgIEFSTSBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKLQotICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi0gICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi0gICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLSAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2luY2x1ZGUgPGZmaS5oPgotI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgX1dJTjMyX1dDRQotI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDE0MikgICAgLyogYmVuaWduIHJlZGVmaW5pdGlvbiBvZiB0eXBlICovCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLS8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKLSAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCi0KLS8qQC1leHBvcnRoZWFkZXJAKi8KLXZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQotLypAPWV4cG9ydGhlYWRlckAqLwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLSAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKLSAgcmVnaXN0ZXIgY2hhciAqYXJncDsKLSAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKLQotICBhcmdwID0gc3RhY2s7Ci0KLSAgaWYgKCBlY2lmLT5jaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVCApIHsKLSAgICAqKHZvaWQgKiopIGFyZ3AgPSBlY2lmLT5ydmFsdWU7Ci0gICAgYXJncCArPSA0OwotICB9Ci0KLSAgcF9hcmd2ID0gZWNpZi0+YXZhbHVlOwotCi0gIGZvciAoaSA9IGVjaWYtPmNpZi0+bmFyZ3MsIHBfYXJnID0gZWNpZi0+Y2lmLT5hcmdfdHlwZXM7Ci0gICAgICAgKGkgIT0gMCk7Ci0gICAgICAgaS0tLCBwX2FyZysrKQotICAgIHsKLSAgICAgIHNpemVfdCB6OwotICAgICAgc2l6ZV90IGFyZ2FsaWduID0gKCpwX2FyZyktPmFsaWdubWVudDsKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSAgICAgIGlmIChhcmdhbGlnbiA+IDQpCi0gICAgICAgIGFyZ2FsaWduID0gNDsKLSNlbmRpZgotICAgICAgLyogQWxpZ24gaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoKGFyZ2FsaWduIC0gMSkgJiAodW5zaWduZWQpIGFyZ3ApIHsKLQlhcmdwID0gKGNoYXIgKikgQUxJR04oYXJncCwgYXJnYWxpZ24pOwotICAgICAgfQotCi0JICB6ID0gKCpwX2FyZyktPnNpemU7Ci0JICBpZiAoeiA8IHNpemVvZihpbnQpKQotCSAgICB7Ci0JICAgICAgeiA9IHNpemVvZihpbnQpOwotCSAgICAgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCi0JCXsKLQkJY2FzZSBGRklfVFlQRV9TSU5UODoKLQkJICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDggKikoKiBwX2FyZ3YpOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIEZGSV9UWVBFX1VJTlQ4OgotCQkgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDggKikoKiBwX2FyZ3YpOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKLQkJICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDE2ICopKCogcF9hcmd2KTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSBGRklfVFlQRV9VSU5UMTY6Ci0JCSAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKiBwX2FyZ3YpOwotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlIEZGSV9UWVBFX1NUUlVDVDoKLSAgICAgICAgICAgICAgICAgIC8qICpwX2FyZ3YgbWF5IG5vdCBiZSBhbGlnbmVkIGZvciBhIFVJTlQzMiAqLwotICAgICAgICAgICAgICAgICAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgRkZJX0FTU0VSVCgwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmICh6ID09IHNpemVvZihpbnQpKQotCSAgICB7Ci0JICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMzIgKikoKiBwX2FyZ3YpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1jcHkoYXJncCwgKnBfYXJndiwgeik7Ci0JICAgIH0KLQkgIHBfYXJndisrOwotCSAgYXJncCArPSB6OwotICAgIH0KLSAgCi0gIHJldHVybjsKLX0KLQotLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLwotZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCi17Ci0gIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLwotICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKLSAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKLSAgICBjYXNlIEZGSV9UWVBFX0ZMT0FUOgotICAgIGNhc2UgRkZJX1RZUEVfRE9VQkxFOgotICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgotICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6Ci0gICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX0lOVDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gRkZJX09LOwotfQotCi0vKkAtZGVjbHVuZGVmQCovCi0vKkAtZXhwb3J0aGVhZGVyQCovCi1leHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCAKLQkJCSAgLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLCAKLQkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCAKLQkJCSAgLypAb3V0QCovIHVuc2lnbmVkICosIAotCQkJICB2b2lkICgqZm4pKCkpOwotLypAPWRlY2x1bmRlZkAqLwotLypAPWV4cG9ydGhlYWRlckAqLwotCi0vKiBSZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gdm9pZCBmb3IgY3R5cGVzICovCi1pbnQgZmZpX2NhbGwoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwgCi0JICAgICAgdm9pZCAoKmZuKSgpLCAKLQkgICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKLQkgICAgICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZSkKLXsKLSAgZXh0ZW5kZWRfY2lmIGVjaWY7Ci0KLSAgZWNpZi5jaWYgPSBjaWY7Ci0gIGVjaWYuYXZhbHVlID0gYXZhbHVlOwotICAKLSAgLyogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cnVjdCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHJldHVybgkqLwotICAvKiB2YWx1ZSBhZGRyZXNzIHRoZW4gd2UgbmVlZCB0byBtYWtlIG9uZQkJICAgICAgICAqLwotCi0gIGlmICgocnZhbHVlID09IE5VTEwpICYmIAotICAgICAgKGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSkKLSAgICB7Ci0gICAgICAvKkAtc3lzdW5yZWNvZ0AqLwotICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7Ci0gICAgICAvKkA9c3lzdW5yZWNvZ0AqLwotICAgIH0KLSAgZWxzZQotICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOwotICAgIAotICAKLSAgc3dpdGNoIChjaWYtPmFiaSkgCi0gICAgewotICAgIGNhc2UgRkZJX1NZU1Y6Ci0gICAgICAvKkAtdXNlZGVmQCovCi0gICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCAKLQkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7Ci0gICAgICAvKkA9dXNlZGVmQCovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRkZJX0FTU0VSVCgwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgLyogSSB0aGluayBjYWxjdWxhdGluZyB0aGUgcmVhbCBzdGFjayBwb2ludGVyIGRlbHRhIGlzIG5vdCB1c2VmdWwKLSAgICAgYmVjYXVzZSBzdGRjYWxsIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKiBwcml2YXRlIG1lbWJlcnMgKiovCi0KLXN0YXRpYyB2b2lkIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViAoY2hhciAqc3RhY2ssIHZvaWQgKipyZXQsCi0JCQkJCSB2b2lkKiogYXJncywgZmZpX2NpZiogY2lmKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZmZpX2Nsb3N1cmVfU1lTViBpbiBzeXN2LmFzbSAqLwotCi11bnNpZ25lZCBpbnQKLWZmaV9jbG9zdXJlX1NZU1ZfaW5uZXIgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCBjaGFyICppbl9hcmdzLCB2b2lkICpydmFsdWUpCi17Ci0gIGZmaV9jaWYgKmNpZiA9IGNsb3N1cmUtPmNpZjsKLSAgdm9pZCAqKm91dF9hcmdzOwotCi0gIG91dF9hcmdzID0gKHZvaWQgKiopIGFsbG9jYShjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkICopKTsgIAotCi0gIC8qIHRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgb3V0X2FyZ3MsIHN1Y2ggdGhhdCBlYWNoCi0gICAqIGVsZW1lbnQgaW4gdGhhdCBhcnJheSBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAqIHZhbHVlIG9uIHRoZSBzdGFjazsgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0gICAqIGEgc3RydWN0dXJlLCBpdCB3aWxsIHJlLXNldCBydmFsdWUgdG8gcG9pbnQgdG8gdGhlCi0gICAqIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gICovCi0KLSAgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGluX2FyZ3MsICZydmFsdWUsIG91dF9hcmdzLCBjaWYpOwotICAKLSAgKGNsb3N1cmUtPmZ1bikoY2lmLCBydmFsdWUsIG91dF9hcmdzLCBjbG9zdXJlLT51c2VyX2RhdGEpOwotCi0gIC8qIFRlbGwgZmZpX2Nsb3N1cmVfU1lTViB3aGF0IHRoZSByZXR1cm50eXBlIGlzICovCi0gIHJldHVybiBjaWYtPmZsYWdzOwotfQotCi0vKkAtZXhwb3J0aGVhZGVyQCovCi1zdGF0aWMgdm9pZCAKLWZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihjaGFyICpzdGFjaywgdm9pZCAqKnJ2YWx1ZSwKLQkJCSAgICB2b2lkICoqYXZhbHVlLCBmZmlfY2lmICpjaWYpCi0vKkA9ZXhwb3J0aGVhZGVyQCovCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICB2b2lkICoqcF9hcmd2OwotICBjaGFyICphcmdwOwotICBmZmlfdHlwZSAqKnBfYXJnOwotCi0gIGFyZ3AgPSBzdGFjazsKLQotICBpZiAoIGNpZi0+cnR5cGUtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUICkgewotICAgICpydmFsdWUgPSAqKHZvaWQgKiopIGFyZ3A7Ci0gICAgYXJncCArPSA0OwotICB9Ci0KLSAgcF9hcmd2ID0gYXZhbHVlOwotCi0gIGZvciAoaSA9IGNpZi0+bmFyZ3MsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IChpICE9IDApOyBpLS0sIHBfYXJnKyspCi0gICAgewotICAgICAgc2l6ZV90IHo7Ci0gICAgICBzaXplX3QgYXJnYWxpZ24gPSAoKnBfYXJnKS0+YWxpZ25tZW50OwotCi0jaWZkZWYgX1dJTjMyX1dDRQotICAgICAgaWYgKGFyZ2FsaWduID4gNCkKLSAgICAgICAgYXJnYWxpZ24gPSA0OwotI2VuZGlmCi0gICAgICAvKiBBbGlnbiBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICgoYXJnYWxpZ24gLSAxKSAmICh1bnNpZ25lZCkgYXJncCkgewotCWFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBhcmdhbGlnbik7Ci0gICAgICB9Ci0KLSAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKLSAgICAgIGlmICh6IDwgc2l6ZW9mKGludCkpCi0gICAgICAgIHogPSBzaXplb2YoaW50KTsKLQotICAgICAgKnBfYXJndiA9ICh2b2lkKikgYXJncDsKLQotICAgICAgcF9hcmd2Kys7Ci0gICAgICBhcmdwICs9IHo7Ci0gICAgfQotfQotCi0vKgotICAgIGFkZCAgIGlwLCBwYywgIy04ICAgICA7IGlwID0gYWRkcmVzcyBvZiB0aGlzIHRyYW1wb2xpbmUgPT0gYWRkcmVzcyBvZiBmZmlfY2xvc3VyZQotICAgIGxkciAgIHBjLCBbcGMsICMtNF0gICA7IGp1bXAgdG8gX19mdW4KLSAgICBEQ0QgX19mdW4KLSovCi0jZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOKSBcCi17IFwKLSAgICB1bnNpZ25lZCBpbnQgKl9fdHJhbXAgPSAodW5zaWduZWQgaW50ICopKFRSQU1QKTsgXAotICAgIF9fdHJhbXBbMF0gPSAweGUyNGZjMDA4OyAgICAgICAgICAgIC8qIGFkZCAgIGlwLCBwYywgIy04ICAgICovIFwKLSAgICBfX3RyYW1wWzFdID0gMHhlNTFmZjAwNDsgICAgICAgICAgICAvKiBsZHIgICBwYywgW3BjLCAjLTRdICAqLyBcCi0gICAgX190cmFtcFsyXSA9ICh1bnNpZ25lZCBpbnQpKEZVTik7IFwKLSAgfQotCi0vKiB0aGUgY2lmIG11c3QgYWxyZWFkeSBiZSBwcmVwJ2VkICovCi0KLS8qIGRlZmluZWQgaW4gc3lzdi5hc20gKi8KLXZvaWQgZmZpX2Nsb3N1cmVfU1lTVih2b2lkKTsKLQotZmZpX3N0YXR1cwotZmZpX3ByZXBfY2xvc3VyZSAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCi0JCSAgZmZpX2NpZiogY2lmLAotCQkgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCi0JCSAgdm9pZCAqdXNlcl9kYXRhKQotewotICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfU1lTVik7Ci0gIAotICBGRklfSU5JVF9UUkFNUE9MSU5FICgmY2xvc3VyZS0+dHJhbXBbMF0sICZmZmlfY2xvc3VyZV9TWVNWKTsKLQotICBjbG9zdXJlLT5jaWYgID0gY2lmOwotICBjbG9zdXJlLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7Ci0gIGNsb3N1cmUtPmZ1biAgPSBmdW47Ci0KLSNpZmRlZiBfV0lOMzJfV0NFCi0gIC8qIFRoaXMgaXMgaW1wb3J0YW50IHRvIGFsbG93IGNhbGxpbmcgdGhlIHRyYW1wb2xpbmUgc2FmZWx5ICovCi0gIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZShHZXRDdXJyZW50UHJvY2VzcygpLCAwLCAwKTsKLSNlbmRpZgotCi0gIHJldHVybiBGRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaS5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTc1YjYuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLUMtKi0KLSAgIGxpYmZmaSAyLjAwLWJldGEtd2luY2UgLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgotCi0gICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLSAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIFRoZSBiYXNpYyBBUEkgaXMgZGVzY3JpYmVkIGluIHRoZSBSRUFETUUgZmlsZS4KLQotICAgVGhlIHJhdyBBUEkgaXMgZGVzaWduZWQgdG8gYnlwYXNzIHNvbWUgb2YgdGhlIGFyZ3VtZW50IHBhY2tpbmcKLSAgIGFuZCB1bnBhY2tpbmcgb24gYXJjaGl0ZWN0dXJlcyBmb3Igd2hpY2ggaXQgY2FuIGJlIGF2b2lkZWQuCi0KLSAgIFRoZSBjbG9zdXJlIEFQSSBhbGxvd3MgaW50ZXJwcmV0ZWQgZnVuY3Rpb25zIHRvIGJlIHBhY2thZ2VkIHVwCi0gICBpbnNpZGUgYSBDIGZ1bmN0aW9uIHBvaW50ZXIsIHNvIHRoYXQgdGhleSBjYW4gYmUgY2FsbGVkIGFzIEMgZnVuY3Rpb25zLAotICAgd2l0aCBubyB1bmRlcnN0YW5kaW5nIG9uIHRoZSBjbGllbnQgc2lkZSB0aGF0IHRoZXkgYXJlIGludGVycHJldGVkLgotICAgSXQgY2FuIGFsc28gYmUgdXNlZCBpbiBvdGhlciBjYXNlcyBpbiB3aGljaCBpdCBpcyBuZWNlc3NhcnkgdG8gcGFja2FnZQotICAgdXAgYSB1c2VyIHNwZWNpZmllZCBwYXJhbWV0ZXIgYW5kIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhIHNpbmdsZQotICAgZnVuY3Rpb24gcG9pbnRlci4KLQotICAgVGhlIGNsb3N1cmUgQVBJIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gZ2V0IGl0cyBmdW5jdGlvbmFsaXR5LAotICAgZS5nLiBmb3IgdXNlIGJ5IGdpai4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBlbXVsYXRlIHRoZSByYXcgQVBJCi0gICBpZiB0aGUgdW5kZXJseWluZyBwbGF0Zm9ybSBkb2Vzbid0IGFsbG93IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4KLQotICAgTW9yZSBkZXRhaWxzIG9uIHRoZSByYXcgYW5kIGNsb3VyZSBBUEkgY2FuIGJlIGZvdW5kIGluOgotCi0gICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvamF2YS8xOTk5LXEzL21zZzAwMTM4Lmh0bWwKLQotICAgYW5kCi0KLSAgIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9qYXZhLzE5OTktcTMvbXNnMDAxNzQuaHRtbAotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBMSUJGRklfSAotI2RlZmluZSBMSUJGRklfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIFNwZWNpZnkgd2hpY2ggYXJjaGl0ZWN0dXJlIGxpYmZmaSBpcyBjb25maWd1cmVkIGZvci4gKi8KLS8qI2RlZmluZSBAVEFSR0VUQCovCi0KLS8qIC0tLS0gU3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpbmNsdWRlIDxmZml0YXJnZXQuaD4KLQotI2lmbmRlZiBMSUJGRklfQVNNCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLyogTE9OR19MT05HX01BWCBpcyBub3QgYWx3YXlzIGRlZmluZWQgKG5vdCBpZiBTVFJJQ1RfQU5TSSwgZm9yIGV4YW1wbGUpLgotICAgQnV0IHdlIGNhbiBmaW5kIGl0IGVpdGhlciB1bmRlciB0aGUgY29ycmVjdCBBTlNJIG5hbWUsIG9yIHVuZGVyIEdOVQotICAgQydzIGludGVybmFsIG5hbWUuICAqLwotI2lmZGVmIExPTkdfTE9OR19NQVgKLSMgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIExPTkdfTE9OR19NQVgKLSNlbHNlCi0jIGlmZGVmIExMT05HX01BWAotIyAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIExMT05HX01BWAotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGRlZmluZSBGRklfTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXwotIyAgZW5kaWYKLSMgIGlmZGVmIF9NU0NfVkVSCi0jICAgZGVmaW5lIEZGSV9MT05HX0xPTkdfTUFYIF9JNjRfTUFYCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBTQ0hBUl9NQVggPT0gMTI3Ci0jIGRlZmluZSBmZmlfdHlwZV91Y2hhciAgICAgICAgICAgICAgICBmZmlfdHlwZV91aW50OAotIyBkZWZpbmUgZmZpX3R5cGVfc2NoYXIgICAgICAgICAgICAgICAgZmZpX3R5cGVfc2ludDgKLSNlbHNlCi0gI2Vycm9yICJjaGFyIHNpemUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0jaWYgU0hSVF9NQVggPT0gMzI3NjcKLSMgZGVmaW5lIGZmaV90eXBlX3VzaG9ydCAgICAgICBmZmlfdHlwZV91aW50MTYKLSMgZGVmaW5lIGZmaV90eXBlX3NzaG9ydCAgICAgICBmZmlfdHlwZV9zaW50MTYKLSNlbGlmIFNIUlRfTUFYID09IDIxNDc0ODM2NDcKLSMgZGVmaW5lIGZmaV90eXBlX3VzaG9ydCAgICAgICBmZmlfdHlwZV91aW50MzIKLSMgZGVmaW5lIGZmaV90eXBlX3NzaG9ydCAgICAgICBmZmlfdHlwZV9zaW50MzIKLSNlbHNlCi0gI2Vycm9yICJzaG9ydCBzaXplIG5vdCBzdXBwb3J0ZWQiCi0jZW5kaWYKLQotI2lmIElOVF9NQVggPT0gMzI3NjcKLSMgZGVmaW5lIGZmaV90eXBlX3VpbnQgICAgICAgICBmZmlfdHlwZV91aW50MTYKLSMgZGVmaW5lIGZmaV90eXBlX3NpbnQgICAgICAgICBmZmlfdHlwZV9zaW50MTYKLSNlbGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NwotIyBkZWZpbmUgZmZpX3R5cGVfdWludCAgICAgICAgIGZmaV90eXBlX3VpbnQzMgotIyBkZWZpbmUgZmZpX3R5cGVfc2ludCAgICAgICAgIGZmaV90eXBlX3NpbnQzMgotI2VsaWYgSU5UX01BWCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3Ci0jIGRlZmluZSBmZmlfdHlwZV91aW50ICAgICAgICAgZmZpX3R5cGVfdWludDY0Ci0jIGRlZmluZSBmZmlfdHlwZV9zaW50ICAgICAgICAgZmZpX3R5cGVfc2ludDY0Ci0jZWxzZQotICNlcnJvciAiaW50IHNpemUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0jZGVmaW5lIGZmaV90eXBlX3Vsb25nICAgICAgICAgZmZpX3R5cGVfdWludDY0Ci0jZGVmaW5lIGZmaV90eXBlX3Nsb25nICAgICAgICAgZmZpX3R5cGVfc2ludDY0Ci0jaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NwotIyBpZiBGRklfTE9OR19MT05HX01BWCAhPSA5MjIzMzcyMDM2ODU0Nzc1ODA3Ci0gICNlcnJvciAibm8gNjQtYml0IGRhdGEgdHlwZSBzdXBwb3J0ZWQiCi0jIGVuZGlmCi0jZWxpZiBMT05HX01BWCAhPSA5MjIzMzcyMDM2ODU0Nzc1ODA3Ci0gI2Vycm9yICJsb25nIHNpemUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0vKiBUaGUgY2xvc3VyZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGlzIHdvcmtzIG9uIHBvaW50ZXJzLCBpLmUuIGEgc2l6ZV90CSovCi0vKiBjYW4gaG9sZCBhIHBvaW50ZXIuCQkJCQkJCSovCi0KLXR5cGVkZWYgc3RydWN0IF9mZmlfdHlwZQotewotICBzaXplX3Qgc2l6ZTsKLSAgdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50OwotICB1bnNpZ25lZCBzaG9ydCB0eXBlOwotICAvKkBudWxsQCovIHN0cnVjdCBfZmZpX3R5cGUgKiplbGVtZW50czsKLX0gZmZpX3R5cGU7Ci0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGluIHR5cGVzLmMgKi8KLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV92b2lkOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQ4OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQ4OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3VpbnQxNjsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9zaW50MTY7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfdWludDMyOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3NpbnQzMjsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV91aW50NjQ7Ci1leHRlcm4gZmZpX3R5cGUgZmZpX3R5cGVfc2ludDY0OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2Zsb2F0OwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX2RvdWJsZTsKLWV4dGVybiBmZmlfdHlwZSBmZmlfdHlwZV9sb25nZG91YmxlOwotZXh0ZXJuIGZmaV90eXBlIGZmaV90eXBlX3BvaW50ZXI7Ci0KLQotdHlwZWRlZiBlbnVtIHsKLSAgRkZJX09LID0gMCwKLSAgRkZJX0JBRF9UWVBFREVGLAotICBGRklfQkFEX0FCSSAKLX0gZmZpX3N0YXR1czsKLQotdHlwZWRlZiB1bnNpZ25lZCBGRklfVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBmZmlfYWJpIGFiaTsKLSAgdW5zaWduZWQgbmFyZ3M7Ci0gIC8qQGRlcGVuZGVudEAqLyBmZmlfdHlwZSAqKmFyZ190eXBlczsKLSAgLypAZGVwZW5kZW50QCovIGZmaV90eXBlICpydHlwZTsKLSAgdW5zaWduZWQgYnl0ZXM7Ci0gIHVuc2lnbmVkIGZsYWdzOwotI2lmZGVmIEZGSV9FWFRSQV9DSUZfRklFTERTCi0gIEZGSV9FWFRSQV9DSUZfRklFTERTOwotI2VuZGlmCi19IGZmaV9jaWY7Ci0KLS8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIHRoZSByYXcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZm5kZWYgRkZJX1NJWkVPRl9BUkcKLSMgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NwotIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgICAgICA0Ci0jIGVsaWYgTE9OR19NQVggPT0gOTIyMzM3MjAzNjg1NDc3NTgwNwotIyAgZGVmaW5lIEZGSV9TSVpFT0ZfQVJHICAgICAgICA4Ci0jIGVuZGlmCi0jZW5kaWYKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIGZmaV9zYXJnICBzaW50OwotICBmZmlfYXJnICAgdWludDsKLSAgZmxvYXQJICAgIGZsdDsKLSAgY2hhciAgICAgIGRhdGFbRkZJX1NJWkVPRl9BUkddOwotICB2b2lkKiAgICAgcHRyOwotfSBmZmlfcmF3OwotCi12b2lkIGZmaV9yYXdfY2FsbCAoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwgCi0JCSAgIHZvaWQgKCpmbikoKSwgCi0JCSAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAotCQkgICAvKkBkZXBlbmRlbnRAKi8gZmZpX3JhdyAqYXZhbHVlKTsKLQotdm9pZCBmZmlfcHRyYXJyYXlfdG9fcmF3IChmZmlfY2lmICpjaWYsIHZvaWQgKiphcmdzLCBmZmlfcmF3ICpyYXcpOwotdm9pZCBmZmlfcmF3X3RvX3B0cmFycmF5IChmZmlfY2lmICpjaWYsIGZmaV9yYXcgKnJhdywgdm9pZCAqKmFyZ3MpOwotc2l6ZV90IGZmaV9yYXdfc2l6ZSAoZmZpX2NpZiAqY2lmKTsKLQotLyogVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlIHJhdyBBUEksIGV4Y2VwdCBpdCB1c2VzIEphdmEgcGFyYW1ldGVyCSovCi0vKiBwYWNraW5nLCBldmVuIG9uIDY0LWJpdCBtYWNoaW5lcy4gIEkuZS4gb24gNjQtYml0IG1hY2hpbmVzCQkqLwotLyogbG9uZ3MgYW5kIGRvdWJsZXMgYXJlIGZvbGxvd2VkIGJ5IGFuIGVtcHR5IDY0LWJpdCB3b3JkLgkJKi8KLQotdm9pZCBmZmlfamF2YV9yYXdfY2FsbCAoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwgCi0JCSAgICAgICAgdm9pZCAoKmZuKSgpLCAKLQkJICAgICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKLQkJICAgICAgICAvKkBkZXBlbmRlbnRAKi8gZmZpX3JhdyAqYXZhbHVlKTsKLQotdm9pZCBmZmlfamF2YV9wdHJhcnJheV90b19yYXcgKGZmaV9jaWYgKmNpZiwgdm9pZCAqKmFyZ3MsIGZmaV9yYXcgKnJhdyk7Ci12b2lkIGZmaV9qYXZhX3Jhd190b19wdHJhcnJheSAoZmZpX2NpZiAqY2lmLCBmZmlfcmF3ICpyYXcsIHZvaWQgKiphcmdzKTsKLXNpemVfdCBmZmlfamF2YV9yYXdfc2l6ZSAoZmZpX2NpZiAqY2lmKTsKLQotLyogLS0tLSBEZWZpbml0aW9ucyBmb3IgY2xvc3VyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmIEZGSV9DTE9TVVJFUwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgdHJhbXBbRkZJX1RSQU1QT0xJTkVfU0laRV07Ci0gIGZmaV9jaWYgICAqY2lmOwotICB2b2lkICAgICAoKmZ1bikoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKLSAgdm9pZCAgICAgICp1c2VyX2RhdGE7Ci19IGZmaV9jbG9zdXJlOwotCi1mZmlfc3RhdHVzCi1mZmlfcHJlcF9jbG9zdXJlIChmZmlfY2xvc3VyZSosCi0JCSAgZmZpX2NpZiAqLAotCQkgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCi0JCSAgdm9pZCAqdXNlcl9kYXRhKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyIHRyYW1wW0ZGSV9UUkFNUE9MSU5FX1NJWkVdOwotCi0gIGZmaV9jaWYgICAqY2lmOwotCi0jaWYgIUZGSV9OQVRJVkVfUkFXX0FQSQotCi0gIC8qIGlmIHRoaXMgaXMgZW5hYmxlZCwgdGhlbiBhIHJhdyBjbG9zdXJlIGhhcyB0aGUgc2FtZSBsYXlvdXQgCi0gICAgIGFzIGEgcmVndWxhciBjbG9zdXJlLiAgV2UgdXNlIHRoaXMgdG8gaW5zdGFsbCBhbiBpbnRlcm1lZGlhdGUgCi0gICAgIGhhbmRsZXIgdG8gZG8gdGhlIHRyYW5zYWx0aW9uLCB2b2lkKiogLT4gZmZpX3JhdyouICovCi0KLSAgdm9pZCAgICAgKCp0cmFuc2xhdGVfYXJncykoZmZpX2NpZiosdm9pZCosdm9pZCoqLHZvaWQqKTsKLSAgdm9pZCAgICAgICp0aGlzX2Nsb3N1cmU7Ci0KLSNlbmRpZgotCi0gIHZvaWQgICAgICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKik7Ci0gIHZvaWQgICAgICAqdXNlcl9kYXRhOwotCi19IGZmaV9yYXdfY2xvc3VyZTsKLQotZmZpX3N0YXR1cwotZmZpX3ByZXBfcmF3X2Nsb3N1cmUgKGZmaV9yYXdfY2xvc3VyZSosCi0JCSAgICAgIGZmaV9jaWYgKmNpZiwKLQkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAotCQkgICAgICB2b2lkICp1c2VyX2RhdGEpOwotCi1mZmlfc3RhdHVzCi1mZmlfcHJlcF9qYXZhX3Jhd19jbG9zdXJlIChmZmlfcmF3X2Nsb3N1cmUqLAotCQkgICAgICAgICAgIGZmaV9jaWYgKmNpZiwKLQkJICAgICAgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKiksCi0JCSAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKLQotI2VuZGlmIC8qIEZGSV9DTE9TVVJFUyAqLwotCi0vKiAtLS0tIFB1YmxpYyBpbnRlcmZhY2UgZGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1mZmlfc3RhdHVzIGZmaV9wcmVwX2NpZigvKkBvdXRAKi8gLypAcGFydGlhbEAqLyBmZmlfY2lmICpjaWYsIAotCQkJZmZpX2FiaSBhYmksCi0JCQl1bnNpZ25lZCBpbnQgbmFyZ3MsIAotCQkJLypAZGVwZW5kZW50QCovIC8qQG91dEAqLyAvKkBwYXJ0aWFsQCovIGZmaV90eXBlICpydHlwZSwgCi0JCQkvKkBkZXBlbmRlbnRAKi8gZmZpX3R5cGUgKiphdHlwZXMpOwotCi0vKiBSZXR1cm4gdHlwZSBjaGFuZ2VkIGZyb20gdm9pZCBmb3IgY3R5cGVzICovCi1pbnQgZmZpX2NhbGwoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwgCi0JICAgICAgdm9pZCAoKmZuKSgpLCAKLQkgICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKLQkgICAgICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZSk7Ci0KLS8qIFVzZWZ1bCBmb3IgZWxpbWluYXRpbmcgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNkZWZpbmUgRkZJX0ZOKGYpICgodm9pZCAoKikoKSlmKQotCi0vKiAtLS0tIERlZmluaXRpb25zIHNoYXJlZCB3aXRoIGFzc2VtYmx5IGNvZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYKLQotLyogSWYgdGhlc2UgY2hhbmdlLCB1cGRhdGUgc3JjL21pcHMvZmZpdGFyZ2V0LmguICovCi0jZGVmaW5lIEZGSV9UWVBFX1ZPSUQgICAgICAgMCAgICAKLSNkZWZpbmUgRkZJX1RZUEVfSU5UICAgICAgICAxCi0jZGVmaW5lIEZGSV9UWVBFX0ZMT0FUICAgICAgMiAgICAKLSNkZWZpbmUgRkZJX1RZUEVfRE9VQkxFICAgICAzCi0jaWYgMCAvKkBIQVZFX0xPTkdfRE9VQkxFQCovCi0jZGVmaW5lIEZGSV9UWVBFX0xPTkdET1VCTEUgNAotI2Vsc2UKLSNkZWZpbmUgRkZJX1RZUEVfTE9OR0RPVUJMRSBGRklfVFlQRV9ET1VCTEUKLSNlbmRpZgotI2RlZmluZSBGRklfVFlQRV9VSU5UOCAgICAgIDUgICAKLSNkZWZpbmUgRkZJX1RZUEVfU0lOVDggICAgICA2Ci0jZGVmaW5lIEZGSV9UWVBFX1VJTlQxNiAgICAgNyAKLSNkZWZpbmUgRkZJX1RZUEVfU0lOVDE2ICAgICA4Ci0jZGVmaW5lIEZGSV9UWVBFX1VJTlQzMiAgICAgOQotI2RlZmluZSBGRklfVFlQRV9TSU5UMzIgICAgIDEwCi0jZGVmaW5lIEZGSV9UWVBFX1VJTlQ2NCAgICAgMTEKLSNkZWZpbmUgRkZJX1RZUEVfU0lOVDY0ICAgICAxMgotI2RlZmluZSBGRklfVFlQRV9TVFJVQ1QgICAgIDEzCi0jZGVmaW5lIEZGSV9UWVBFX1BPSU5URVIgICAgMTQKLQotLyogVGhpcyBzaG91bGQgYWx3YXlzIHJlZmVyIHRvIHRoZSBsYXN0IHR5cGUgY29kZSAoZm9yIHNhbml0eSBjaGVja3MpICovCi0jZGVmaW5lIEZGSV9UWVBFX0xBU1QgICAgICAgRkZJX1RZUEVfUE9JTlRFUgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpX2NvbW1vbi5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjg3OWQxLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgZmZpX2NvbW1vbi5oIC0gQ29weXJpZ2h0IChjKSAxOTk2ICBSZWQgSGF0LCBJbmMuCi0KLSAgIENvbW1vbiBpbnRlcm5hbCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zLiBPbmx5IG5lY2Vzc2FyeSBmb3IgYnVpbGRpbmcKLSAgIGxpYmZmaS4KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZm5kZWYgRkZJX0NPTU1PTl9ICi0jZGVmaW5lIEZGSV9DT01NT05fSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlIDxmZmljb25maWcuaD4KLQotLyogRG8gbm90IG1vdmUgdGhpcy4gU29tZSB2ZXJzaW9ucyBvZiBBSVggYXJlIHZlcnkgcGlja3kgYWJvdXQgd2hlcmUKLSAgIHRoaXMgaXMgcG9zaXRpb25lZC4gKi8KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLS8qIENoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIG1lbWNweS4gKi8KLSNpZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpZm5kZWYgSEFWRV9NRU1DUFkKLSMgIGRlZmluZSBtZW1jcHkoZCwgcywgbikgYmNvcHkgKChzKSwgKGQpLCAobikpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoRkZJX0RFQlVHKSAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpZmRlZiBGRklfREVCVUcKLS8qQGV4aXRzQCovIHZvaWQgZmZpX2Fzc2VydCgvKkB0ZW1wQCovIGNoYXIgKmV4cHIsIC8qQHRlbXBAKi8gY2hhciAqZmlsZSwgaW50IGxpbmUpOwotdm9pZCBmZmlfc3RvcF9oZXJlKHZvaWQpOwotdm9pZCBmZmlfdHlwZV90ZXN0KC8qQHRlbXBAKi8gLypAb3V0QCovIGZmaV90eXBlICphLCAvKkB0ZW1wQCovIGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLQotI2RlZmluZSBGRklfQVNTRVJUKHgpICgoeCkgPyAodm9pZCkwIDogZmZpX2Fzc2VydCgjeCwgX19GSUxFX18sX19MSU5FX18pKQotI2RlZmluZSBGRklfQVNTRVJUX0FUKHgsIGYsIGwpICgoeCkgPyAwIDogZmZpX2Fzc2VydCgjeCwgKGYpLCAobCkpKQotI2RlZmluZSBGRklfQVNTRVJUX1ZBTElEX1RZUEUoeCkgZmZpX3R5cGVfdGVzdCAoeCwgX19GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLSNkZWZpbmUgRkZJX0FTU0VSVCh4KSAKLSNkZWZpbmUgRkZJX0FTU0VSVF9BVCh4LCBmLCBsKQotI2RlZmluZSBGRklfQVNTRVJUX1ZBTElEX1RZUEUoeCkKLSNlbmRpZgotCi0jZGVmaW5lIEFMSUdOKHYsIGEpICAoKCgoKHNpemVfdCkgKHYpKS0xKSB8ICgoYSktMSkpKzEpCi0KLS8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KLWZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKTsKLQotLyogRXh0ZW5kZWQgY2lmLCB1c2VkIGluIGNhbGxiYWNrIGZyb20gYXNzZW1ibHkgcm91dGluZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZjsKLSAgLypAZGVwZW5kZW50QCovIHZvaWQgKnJ2YWx1ZTsKLSAgLypAZGVwZW5kZW50QCovIHZvaWQgKiphdmFsdWU7Ci19IGV4dGVuZGVkX2NpZjsKLQotLyogVGVyc2Ugc2l6ZWQgdHlwZSBkZWZpbml0aW9ucy4gICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDggIF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fUUlfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCAgIFNJTlQ4ICBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1FJX18pKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTYgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ISV9fKSkpOwotdHlwZWRlZiBzaWduZWQgaW50ICAgU0lOVDE2IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElfXykpKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMiBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7Ci10eXBlZGVmIHNpZ25lZCBpbnQgICBTSU5UMzIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDY0IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fRElfXykpKTsKLXR5cGVkZWYgc2lnbmVkIGludCAgIFNJTlQ2NCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7Ci0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0KLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ4ICBVSU5UODsKLXR5cGVkZWYgc2lnbmVkIF9faW50OCAgICBTSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQxNiBVSU5UMTY7Ci10eXBlZGVmIHNpZ25lZCBfX2ludDE2ICAgU0lOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIFVJTlQzMjsKLXR5cGVkZWYgc2lnbmVkIF9faW50MzIgICBTSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUlOVDY0OwotdHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgIFNJTlQ2NDsKLQotI2Vsc2UKLSNlcnJvciAiTmVlZCB0eXBlZGVmcyBoZXJlIgotI2VuZGlmCi0KLXR5cGVkZWYgZmxvYXQgRkxPQVQzMjsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9mZmljb25maWcuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaWNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc5NjRjLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaWNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qIGZmaWNvbmZpZy5oIGNyZWF0ZWQgbWFudWFsbHkgZm9yIFdpbmRvd3MgQ0Ugb24gQVJNICovCi0vKiBmZmljb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogMTIzNCA9IExJTF9FTkRJQU4sIDQzMjEgPSBCSUdFTkRJQU4gKi8KLSNkZWZpbmUgQllURU9SREVSIDEyMzQKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBgX2dldGI2NycsIGBHRVRCNjcnLCBgZ2V0YjY3JyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUAotICAgc3lzdGVtcy4gVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYGFsbG9jYS5jJyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuCi0gICAqLwotLyogI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5EICovCi0KLS8qIERlZmluZSB0byAxIGlmIHVzaW5nIGBhbGxvY2EuYycuICovCi0vKiAjdW5kZWYgQ19BTExPQ0EgKi8KLQotLyogRGVmaW5lIHRvIHRoZSBmbGFncyBuZWVkZWQgZm9yIHRoZSAuc2VjdGlvbiAuZWhfZnJhbWUgZGlyZWN0aXZlLiAqLwotLyogI3VuZGVmIEVIX0ZSQU1FX0ZMQUdTICovCi0KLS8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IGV4dHJhIGRlYnVnZ2luZy4gKi8KLSNpZmRlZiBERUJVRyAgLyogRGVmaW5lZCBieSB0aGUgcHJvamVjdCBzZXR0aW5ncyBmb3IgRGVidWcgYnVpbGRzICovCi0jZGVmaW5lIEZGSV9ERUJVRwotI2Vsc2UKLSN1bmRlZiBGRklfREVCVUcKLSNlbmRpZgotCi0vKiBEZWZpbmUgdGhpcyBpcyB5b3UgZG8gbm90IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHJhdyBBUEkuICovCi0vKiAjdW5kZWYgRkZJX05PX1JBV19BUEkgKi8KLQotLyogRGVmaW5lIHRoaXMgaXMgeW91IGRvIG5vdCB3YW50IHN1cHBvcnQgZm9yIGFnZ3JlZ2F0ZSB0eXBlcy4gKi8KLS8qICN1bmRlZiBGRklfTk9fU1RSVUNUUyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBgYWxsb2NhJywgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gKi8KLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuCi0gICAqLwotLyogI3VuZGVmIEhBVkVfQUxMT0NBX0ggKi8KLQotLyogRGVmaW5lIGlmIHlvdXIgYXNzZW1ibGVyIHN1cHBvcnRzIC5yZWdpc3Rlci4gKi8KLS8qICN1bmRlZiBIQVZFX0FTX1JFR0lTVEVSX1BTRVVET19PUCAqLwotCi0vKiBEZWZpbmUgaWYgeW91ciBhc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICAqLwotLyogI3VuZGVmIEhBVkVfQVNfU1BBUkNfVUFfUENSRUwgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX0lOVFRZUEVTX0ggKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsb25nIGRvdWJsZSB0eXBlIGFuZCBpdCBpcyBiaWdnZXIgdGhhbiBhIGRvdWJsZSAqLwotLyogVGhpcyBkaWZmZXJzIGZyb20gdGhlIE1TVkMgYnVpbGQsIGJ1dCBldmVuIHRoZXJlIGl0IHNob3VsZCBub3QgYmUgZGVmaW5lZCAqLwotLyogI3VuZGVmIEhBVkVfTE9OR19ET1VCTEUgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1jcHknIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX01FTUNQWSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLwotLyogV2luQ0UgaGFzIHRoaXMgYnV0IEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byB1c2UgaXQgKi8KLS8qICN1bmRlZiBIQVZFX01FTU9SWV9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW1hcCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9NTUFQICovCi0KLS8qIERlZmluZSBpZiBtbWFwIHdpdGggTUFQX0FOT04oWU1PVVMpIHdvcmtzLiAqLwotLyogI3VuZGVmIEhBVkVfTU1BUF9BTk9OICovCi0KLS8qIERlZmluZSBpZiBtbWFwIG9mIC9kZXYvemVybyB3b3Jrcy4gKi8KLS8qICN1bmRlZiBIQVZFX01NQVBfREVWX1pFUk8gKi8KLQotLyogRGVmaW5lIGlmIHJlYWQtb25seSBtbWFwIG9mIGEgcGxhaW4gZmlsZSB3b3Jrcy4gKi8KLS8qICN1bmRlZiBIQVZFX01NQVBfRklMRSAqLwotCi0vKiBEZWZpbmUgaWYgLmVoX2ZyYW1lIHNlY3Rpb25zIHNob3VsZCBiZSByZWFkLW9ubHkuICovCi0vKiAjdW5kZWYgSEFWRV9ST19FSF9GUkFNRSAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NURElOVF9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSSU5HU19IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW1hbi5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19NTUFOX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19TVEFUX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1VOSVNURF9IICovCi0KLS8qIERlZmluZSBpZiB0aGUgaG9zdCBtYWNoaW5lIHN0b3JlcyB3b3JkcyBvZiBtdWx0aS13b3JkIGludGVnZXJzIGluCi0gICBiaWctZW5kaWFuIG9yZGVyLiAqLwotLyogI3VuZGVmIEhPU1RfV09SRFNfQklHX0VORElBTiAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBhY2NlcHQgLWMgYW5kIC1vIHRvZ2V0aGVyLiAqLwotLyogI3VuZGVmIE5PX01JTlVTX0NfTUlOVVNfTyAqLwotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLS8qICN1bmRlZiBQQUNLQUdFICovCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotLyogI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUICovCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLS8qICN1bmRlZiBQQUNLQUdFX05BTUUgKi8KLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwotLyogI3VuZGVmIFBBQ0tBR0VfU1RSSU5HICovCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLS8qICN1bmRlZiBQQUNLQUdFX1RBUk5BTUUgKi8KLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLS8qICN1bmRlZiBQQUNLQUdFX1ZFUlNJT04gKi8KLQotLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGRvdWJsZSAqLwotI2RlZmluZSBTSVpFT0ZfRE9VQkxFIDgKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0eXBlIGxvbmcgZG91YmxlICovCi0jZGVmaW5lIFNJWkVPRl9MT05HX0RPVUJMRSA4Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0JU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duICovCi0vKiAjdW5kZWYgU1RBQ0tfRElSRUNUSU9OICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI2RlZmluZSBTVERDX0hFQURFUlMgMQotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIFB1cmlmeSBhbmQgd2FudCB0byBzdXBwcmVzcyBzcHVyaW91cyBtZXNzYWdlcy4KLSAgICovCi0vKiAjdW5kZWYgVVNJTkdfUFVSSUZZICovCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLS8qICN1bmRlZiBWRVJTSU9OICovCi0KLS8qIHdoZXRoZXIgYnl0ZW9yZGVyIGlzIGJpZ2VuZGlhbiAqLwotLyogI3VuZGVmIFdPUkRTX0JJR0VORElBTiAqLwotCi0jZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0KLSNkZWZpbmUgYWJvcnQoKSBleGl0KDk5OSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfYXJtX3dpbmNlL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjdiMjUuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvZmZpdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotQy0qLQotICAgZmZpdGFyZ2V0LmggLSBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMyAgUmVkIEhhdCwgSW5jLgotICAgVGFyZ2V0IGNvbmZpZ3VyYXRpb24gbWFjcm9zIGZvciBBUk0uCi0KLSAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmbmRlZiBMSUJGRklfVEFSR0VUX0gKLSNkZWZpbmUgTElCRkZJX1RBUkdFVF9ICi0KLSNpZm5kZWYgTElCRkZJX0FTTQotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIGZmaV9hcmc7Ci10eXBlZGVmIHNpZ25lZCBsb25nICAgICAgICAgICAgZmZpX3Nhcmc7Ci0KLXR5cGVkZWYgZW51bSBmZmlfYWJpIHsKLSAgRkZJX0ZJUlNUX0FCSSA9IDAsCi0gIEZGSV9TWVNWLAotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQotfSBmZmlfYWJpOwotI2VuZGlmCi0KLS8qIC0tLS0gRGVmaW5pdGlvbnMgZm9yIGNsb3N1cmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgRkZJX0NMT1NVUkVTIDEKLSNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAxMgotCi0jZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9wcmVwX2NpZi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2UvcHJlcF9jaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkY2UyZi4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9wcmVwX2NpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBwcmVwX2NpZi5jIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4ICBSZWQgSGF0LCBJbmMuCi0KLSAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi0gICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLSAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpbmNsdWRlIDxmZmkuaD4KLSNpbmNsdWRlIDxmZmlfY29tbW9uLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLQotLyogUm91bmQgdXAgdG8gRkZJX1NJWkVPRl9BUkcuICovCi0KLSNkZWZpbmUgU1RBQ0tfQVJHX1NJWkUoeCkgQUxJR04oeCwgRkZJX1NJWkVPRl9BUkcpCi0KLS8qIFBlcmZvcm0gbWFjaGluZSBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBvZiBhZ2dyZWdhdGUgdHlwZQotICAgc3BlY2lmaWNhdGlvbnMuICovCi0KLXN0YXRpYyBmZmlfc3RhdHVzIGluaXRpYWxpemVfYWdncmVnYXRlKC8qQG91dEAqLyBmZmlfdHlwZSAqYXJnKQotewotICBmZmlfdHlwZSAqKnB0cjsgCi0KLSAgRkZJX0FTU0VSVChhcmcgIT0gTlVMTCk7Ci0KLSAgLypALXVzZWRlZkAqLwotCi0gIEZGSV9BU1NFUlQoYXJnLT5lbGVtZW50cyAhPSBOVUxMKTsKLSAgRkZJX0FTU0VSVChhcmctPnNpemUgPT0gMCk7Ci0gIEZGSV9BU1NFUlQoYXJnLT5hbGlnbm1lbnQgPT0gMCk7Ci0KLSAgcHRyID0gJihhcmctPmVsZW1lbnRzWzBdKTsKLQotICB3aGlsZSAoKCpwdHIpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCgoKnB0ciktPnNpemUgPT0gMCkgJiYgKGluaXRpYWxpemVfYWdncmVnYXRlKCgqcHRyKSkgIT0gRkZJX09LKSkKLQlyZXR1cm4gRkZJX0JBRF9UWVBFREVGOwotICAgICAgCi0gICAgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBhcmd1bWVudCB0eXBlICovCi0gICAgICBGRklfQVNTRVJUX1ZBTElEX1RZUEUoKnB0cik7Ci0KLSAgICAgIGFyZy0+c2l6ZSA9IEFMSUdOKGFyZy0+c2l6ZSwgKCpwdHIpLT5hbGlnbm1lbnQpOwotICAgICAgYXJnLT5zaXplICs9ICgqcHRyKS0+c2l6ZTsKLQotICAgICAgYXJnLT5hbGlnbm1lbnQgPSAoYXJnLT5hbGlnbm1lbnQgPiAoKnB0ciktPmFsaWdubWVudCkgPyAKLQlhcmctPmFsaWdubWVudCA6ICgqcHRyKS0+YWxpZ25tZW50OwotCi0gICAgICBwdHIrKzsKLSAgICB9Ci0KLSAgLyogU3RydWN0dXJlIHNpemUgaW5jbHVkZXMgdGFpbCBwYWRkaW5nLiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yCi0gICAgIHN0cnVjdHVyZXMgdGhhdCBmaXQgaW4gb25lIHJlZ2lzdGVyIG9uIEFCSXMgbGlrZSB0aGUgUG93ZXJQQzY0Ci0gICAgIExpbnV4IEFCSSB0aGF0IHJpZ2h0IGp1c3RpZnkgc21hbGwgc3RydWN0cyBpbiBhIHJlZ2lzdGVyLgotICAgICBJdCdzIGFsc28gbmVlZGVkIGZvciBuZXN0ZWQgc3RydWN0dXJlIGxheW91dCwgZm9yIGV4YW1wbGUKLSAgICAgc3RydWN0IEEgeyBsb25nIGE7IGNoYXIgYjsgfTsgc3RydWN0IEIgeyBzdHJ1Y3QgQSB4OyBjaGFyIHk7IH07Ci0gICAgIHNob3VsZCBmaW5kIHkgYXQgYW4gb2Zmc2V0IG9mIDIqc2l6ZW9mKGxvbmcpIGFuZCByZXN1bHQgaW4gYQotICAgICB0b3RhbCBzaXplIG9mIDMqc2l6ZW9mKGxvbmcpLiAgKi8KLSAgYXJnLT5zaXplID0gQUxJR04gKGFyZy0+c2l6ZSwgYXJnLT5hbGlnbm1lbnQpOwotCi0gIGlmIChhcmctPnNpemUgPT0gMCkKLSAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOwotICBlbHNlCi0gICAgcmV0dXJuIEZGSV9PSzsKLQotICAvKkA9dXNlZGVmQCovCi19Ci0KLS8qIFBlcmZvcm0gbWFjaGluZSBpbmRlcGVuZGVudCBmZmlfY2lmIHByZXBhcmF0aW9uLCB0aGVuIGNhbGwKLSAgIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUuICovCi0KLWZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmKC8qQG91dEAqLyAvKkBwYXJ0aWFsQCovIGZmaV9jaWYgKmNpZiwgCi0JCQlmZmlfYWJpIGFiaSwgdW5zaWduZWQgaW50IG5hcmdzLCAKLQkJCS8qQGRlcGVuZGVudEAqLyAvKkBvdXRAKi8gLypAcGFydGlhbEAqLyBmZmlfdHlwZSAqcnR5cGUsIAotCQkJLypAZGVwZW5kZW50QCovIGZmaV90eXBlICoqYXR5cGVzKQotewotICB1bnNpZ25lZCBieXRlcyA9IDA7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmZmlfdHlwZSAqKnB0cjsKLQotICBGRklfQVNTRVJUKGNpZiAhPSBOVUxMKTsKLSAgRkZJX0FTU0VSVCgoYWJpID4gRkZJX0ZJUlNUX0FCSSkgJiYgKGFiaSA8PSBGRklfREVGQVVMVF9BQkkpKTsKLQotICBjaWYtPmFiaSA9IGFiaTsKLSAgY2lmLT5hcmdfdHlwZXMgPSBhdHlwZXM7Ci0gIGNpZi0+bmFyZ3MgPSBuYXJnczsKLSAgY2lmLT5ydHlwZSA9IHJ0eXBlOwotCi0gIGNpZi0+ZmxhZ3MgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJldHVybiB0eXBlIGlmIG5lY2Vzc2FyeSAqLwotICAvKkAtdXNlZGVmQCovCi0gIGlmICgoY2lmLT5ydHlwZS0+c2l6ZSA9PSAwKSAmJiAoaW5pdGlhbGl6ZV9hZ2dyZWdhdGUoY2lmLT5ydHlwZSkgIT0gRkZJX09LKSkKLSAgICByZXR1cm4gRkZJX0JBRF9UWVBFREVGOwotICAvKkA9dXNlZGVmQCovCi0KLSAgLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgcmV0dXJuIHR5cGUgKi8KLSAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKGNpZi0+cnR5cGUpOwotCi0gIC8qIHg4Ni02NCBhbmQgczM5MCBzdGFjayBzcGFjZSBhbGxvY2F0aW9uIGlzIGhhbmRsZWQgaW4gcHJlcF9tYWNoZGVwLiAgKi8KLSNpZiAhZGVmaW5lZCBNNjhLICYmICFkZWZpbmVkIF9feDg2XzY0X18gJiYgIWRlZmluZWQgUzM5MAotICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHN0cnVjdHVyZSBwb2ludGVyICovCi0gIGlmIChjaWYtPnJ0eXBlLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAotICAgICAgLyogTVNWQyByZXR1cm5zIHNtYWxsIHN0cnVjdHVyZXMgaW4gcmVnaXN0ZXJzLiAgQnV0IHdlIGhhdmUgYSBkaWZmZXJlbnQKLSAgICAgIHdvcmthcm91bmQ6IHByZXRlbmQgaW50MzIgb3IgaW50NjQgcmV0dXJuIHR5cGUsIGFuZCBjb252ZXJ0aW5nIHRvCi0gICAgICBzdHJ1Y3R1cmUgYWZ0ZXJ3YXJkcy4gKi8KLSNpZmRlZiBTUEFSQwotICAgICAgJiYgKGNpZi0+YWJpICE9IEZGSV9WOSB8fCBjaWYtPnJ0eXBlLT5zaXplID4gMzIpCi0jZW5kaWYKLSAgICAgICkKLSAgICBieXRlcyA9IFNUQUNLX0FSR19TSVpFKHNpemVvZih2b2lkKikpOwotI2VuZGlmCi0KLSAgZm9yIChwdHIgPSBjaWYtPmFyZ190eXBlcywgaSA9IGNpZi0+bmFyZ3M7IGkgPiAwOyBpLS0sIHB0cisrKQotICAgIHsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBhbnkgdW5pbml0aWFsaXplZCBhZ2dyZWdhdGUgdHlwZSBkZWZpbml0aW9ucyAqLwotICAgICAgaWYgKCgoKnB0ciktPnNpemUgPT0gMCkgJiYgKGluaXRpYWxpemVfYWdncmVnYXRlKCgqcHRyKSkgIT0gRkZJX09LKSkKLQlyZXR1cm4gRkZJX0JBRF9UWVBFREVGOwotCi0gICAgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBhcmd1bWVudCB0eXBlLCBkbyB0aGlzIAotCSBjaGVjayBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24uICAqLwotICAgICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKCpwdHIpOwotCi0jaWYgIWRlZmluZWQgX194ODZfNjRfXyAmJiAhZGVmaW5lZCBTMzkwCi0jaWZkZWYgU1BBUkMKLSAgICAgIGlmICgoKCpwdHIpLT50eXBlID09IEZGSV9UWVBFX1NUUlVDVAotCSAgICYmICgoKnB0ciktPnNpemUgPiAxNiB8fCBjaWYtPmFiaSAhPSBGRklfVjkpKQotCSAgfHwgKCgqcHRyKS0+dHlwZSA9PSBGRklfVFlQRV9MT05HRE9VQkxFCi0JICAgICAgJiYgY2lmLT5hYmkgIT0gRkZJX1Y5KSkKLQlieXRlcyArPSBzaXplb2Yodm9pZCopOwotICAgICAgZWxzZQotI2VuZGlmCi0JewotI2lmbmRlZiBfTVNDX1ZFUgotCQkvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgYSBsaWJmZmkgYnVnIG9yIG5vdC4gIEF0IGxlYXN0IG9uCi0JCSAgIFdpbmRvd3Mgd2l0aCBNU1ZDLCBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcnMgYXJlICpub3QqCi0JCSAgIGFsaWduZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHN0cnVjdHVyZSBmaWVsZHMgYXJlLCB0aGV5IGFyZQotCQkgICBvbmx5IGFsaWduZWQgaW4gaW50ZWdlciBib3VuZGFyaWVzLgotCi0JCSAgIFRoaXMgZG9lc24ndCBkbyBhbnkgaGFybSBmb3IgY2RlY2wgZnVuY3Rpb25zIGFuZCBjbG9zdXJlcywKLQkJICAgc2luY2UgdGhlIGNhbGxlciBjbGVhbnMgdXAgdGhlIHN0YWNrLCBidXQgaXQgaXMgd3JvbmcgZm9yCi0JCSAgIHN0ZGNhbGwgZnVuY3Rpb25zIHdoZXJlIHRoZSBjYWxsZWUgY2xlYW5zLgotCQkqLwotCi0JICAvKiBBZGQgYW55IHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCi0JICBpZiAoKCgqcHRyKS0+YWxpZ25tZW50IC0gMSkgJiBieXRlcykKLQkgICAgYnl0ZXMgPSBBTElHTihieXRlcywgKCpwdHIpLT5hbGlnbm1lbnQpOwotCSAgCi0jZW5kaWYKLQkgIGJ5dGVzICs9IFNUQUNLX0FSR19TSVpFKCgqcHRyKS0+c2l6ZSk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gIGNpZi0+Ynl0ZXMgPSBieXRlczsKLQotICAvKiBQZXJmb3JtIG1hY2hpbmUgZGVwZW5kZW50IGNpZiBwcm9jZXNzaW5nICovCi0gIHJldHVybiBmZmlfcHJlcF9jaWZfbWFjaGRlcChjaWYpOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9hcm1fd2luY2Uvc3lzdi5hc20gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9zeXN2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3OGI5MC4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX2FybV93aW5jZS9zeXN2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07ICBzeXN2LlMgLSBDb3B5cmlnaHQgKGMpIDE5OTggUmVkIEhhdCwgSW5jLgotOyAgCi07ICBBUk0gRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCi07Ci07ICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLTsgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotOyAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi07ICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi07ICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLTsgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotOyAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotOwotOyAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLTsgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotOwotOyAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotOyAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotOyAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotOyAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgotOyAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCi07ICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKLTsgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLTsgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLTsjZGVmaW5lIExJQkZGSV9BU00gICAgIAotOyNpbmNsdWRlIDxmZmljb25maWcuaD4KLTsjaW5jbHVkZSA8ZmZpLmg+Ci07I2lmZGVmIEhBVkVfTUFDSElORV9BU01fSAotOyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgotOyNlbHNlCi07I2lmZGVmIF9fVVNFUl9MQUJFTF9QUkVGSVhfXwotOyNkZWZpbmUgQ09OQ0FUMShhLCBiKSBDT05DQVQyKGEsIGIpCi07I2RlZmluZSBDT05DQVQyKGEsIGIpIGEgIyMgYgotCi07LyogVXNlIHRoZSByaWdodCBwcmVmaXggZm9yIGdsb2JhbCBsYWJlbHMuICAqLwotOyNkZWZpbmUgQ05BTUUoeCkgQ09OQ0FUMSAoX19VU0VSX0xBQkVMX1BSRUZJWF9fLCB4KQotOyNlbHNlCi07I2RlZmluZSBDTkFNRSh4KSB4Ci07I2VuZGlmCi07I2RlZmluZSBFTlRSWSh4KSAuZ2xvYmwgQ05BTUUoeCk7IC50eXBlIENOQU1FKHgpLCVmdW5jdGlvbjsgQ05BTUUoeCk6Ci07I2VuZGlmCi0KLQotRkZJX1RZUEVfVk9JRCAgICAgICBFUVUgMAotRkZJX1RZUEVfSU5UICAgICAgICBFUVUgMQotRkZJX1RZUEVfRkxPQVQgICAgICBFUVUgMgotRkZJX1RZUEVfRE9VQkxFICAgICBFUVUgMwotO0ZGSV9UWVBFX0xPTkdET1VCTEUgRVFVIDQKLUZGSV9UWVBFX1VJTlQ4ICAgICAgRVFVIDUKLUZGSV9UWVBFX1NJTlQ4ICAgICAgRVFVIDYKLUZGSV9UWVBFX1VJTlQxNiAgICAgRVFVIDcKLUZGSV9UWVBFX1NJTlQxNiAgICAgRVFVIDgKLUZGSV9UWVBFX1VJTlQzMiAgICAgRVFVIDkKLUZGSV9UWVBFX1NJTlQzMiAgICAgRVFVIDEwCi1GRklfVFlQRV9VSU5UNjQgICAgIEVRVSAxMQotRkZJX1RZUEVfU0lOVDY0ICAgICBFUVUgMTIKLUZGSV9UWVBFX1NUUlVDVCAgICAgRVFVIDEzCi1GRklfVFlQRV9QT0lOVEVSICAgIEVRVSAxNAotCi07IFdpbkNFIGFsd2F5cyB1c2VzIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IChJIHRoaW5rKQotX19TT0ZURlBfXyBFUVUge1RSVUV9Ci0KLQotICAgIEFSRUEgfC50ZXh0fCwgQ09ERSwgQVJNICAgICA7IC50ZXh0Ci0KLQotICAgIDsgYTE6ICAgZmZpX3ByZXBfYXJncwotICAgIDsgYTI6ICAgJmVjaWYKLSAgICA7IGEzOiAgIGNpZi0+Ynl0ZXMKLSAgICA7IGE0OiAgIGZpZy0+ZmxhZ3MKLSAgICA7IHNwKzA6IGVjaWYucnZhbHVlCi0gICAgOyBzcCs0OiBmbgotCi0gICAgOyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KLTtFTlRSWShmZmlfY2FsbF9TWVNWKQotCi0gICAgRVhQT1JUIHxmZmlfY2FsbF9TWVNWfAotCi18ZmZpX2NhbGxfU1lTVnwgUFJPQwotCi0gICAgOyBTYXZlIHJlZ2lzdGVycwotICAgIHN0bWZkIHNwISwge2ExLWE0LCBmcCwgbHJ9Ci0gICAgbW92ICAgZnAsIHNwCi0KLSAgICA7IE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KLSAgICBzdWIgICBzcCwgZnAsIGEzCi0KLSAgICA7IFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgotICAgIG1vdiAgIGlwLCBhMQotICAgIG1vdiAgIGExLCBzcAotICAgIDsgICAgIGEyIGFscmVhZHkgc2V0Ci0KLSAgICA7IEFuZCBjYWxsCi0gICAgbW92ICAgbHIsIHBjCi0gICAgbW92ICAgcGMsIGlwCi0KLSAgICA7IG1vdmUgZmlyc3QgNCBwYXJhbWV0ZXJzIGluIHJlZ2lzdGVycwotICAgIGxkciAgIGExLCBbc3AsICMwXQotICAgIGxkciAgIGEyLCBbc3AsICM0XQotICAgIGxkciAgIGEzLCBbc3AsICM4XQotICAgIGxkciAgIGE0LCBbc3AsICMxMl0KLQotICAgIDsgYW5kIGFkanVzdCBzdGFjawotICAgIGxkciAgIGlwLCBbZnAsICM4XQotICAgIGNtcCAgIGlwLCAjMTYKLSAgICBtb3ZnZSBpcCwgIzE2Ci0gICAgYWRkICAgc3AsIHNwLCBpcAotCi0gICAgOyBjYWxsIGZ1bmN0aW9uCi0gICAgbW92ICAgbHIsIHBjCi0gICAgbGRyICAgcGMsIFtmcCwgIzI4XQotCi0gICAgOyBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKLSAgICBtb3YgICBzcCwgZnAKLQotICAgIDsgTG9hZCBhMyB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICBsZHIgICBhMywgW3NwLCAjMjRdCi0KLSAgICA7IExvYWQgYTQgd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZSAKLSAgICBsZHIgICBhNCwgW3NwLCAjMTJdCi0KLSAgICA7IElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgotICAgIGNtcCAgIGEzLCAjMAotICAgIGJlcSAgIGNhbGxfZXBpbG9ndWUKLQotOyByZXR1cm4gSU5UCi0gICAgY21wICAgYTQsICNGRklfVFlQRV9JTlQKLSAgICBzdHJlcSBhMSwgW2EzXQotICAgIGJlcSAgIGNhbGxfZXBpbG9ndWUKLQotOyByZXR1cm4gRkxPQVQKLSAgICBjbXAgICAgIGE0LCAjRkZJX1RZUEVfRkxPQVQKLSAgICBbIF9fU09GVEZQX18gICAgICAgICAgICAgICAgICAgIDtpZmRlZiBfX1NPRlRGUF9fCi0gICAgc3RyZXEgICBhMSwgW2EzXQotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2Vsc2UKLSAgICBzdGZlcXMgIGYwLCBbYTNdCi0gICAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZW5kaWYKLSAgICBiZXEgICAgIGNhbGxfZXBpbG9ndWUKLQotOyByZXR1cm4gRE9VQkxFIG9yIExPTkdET1VCTEUKLSAgICBjbXAgICAgIGE0LCAjRkZJX1RZUEVfRE9VQkxFCi0gICAgWyBfX1NPRlRGUF9fICAgICAgICAgICAgICAgICAgICA7aWZkZWYgX19TT0ZURlBfXwotICAgIHN0bWVxaWEgYTMsIHthMSwgYTJ9Ci0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZWxzZQotICAgIHN0ZmVxZCAgZjAsIFthM10KLSAgICBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbmRpZgotICAgIGJlcSAgICAgY2FsbF9lcGlsb2d1ZQotCi07IHJldHVybiBTSU5UNjQgb3IgVUlOVDY0Ci0gICAgY21wICAgICBhNCwgI0ZGSV9UWVBFX1NJTlQ2NAotICAgIHN0bWVxaWEgYTMsIHthMSwgYTJ9Ci0KLWNhbGxfZXBpbG9ndWUKLSAgICBsZG1mZCAgIHNwISwge2ExLWE0LCBmcCwgcGN9Ci0KLTsuZmZpX2NhbGxfU1lTVl9lbmQ6Ci0gICAgOy5zaXplICAgIENOQU1FKGZmaV9jYWxsX1NZU1YpLC5mZmlfY2FsbF9TWVNWX2VuZC1DTkFNRShmZmlfY2FsbF9TWVNWKQotICAgIEVORFAKLQotCi1SRVNFUlZFX1JFVFVSTiBFUVUgMTYKLQotICAgIDsgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHRyYW1wb2xpbmUKLSAgICA7IEl0IGlzIE5PVCBjYWxsYWJsZSBmcm9tIEMKLSAgICA7IGlwID0gcG9pbnRlciB0byBzdHJ1Y3QgZmZpX2Nsb3N1cmUKLQotICAgIElNUE9SVCB8ZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcnwKLQotICAgIEVYUE9SVCB8ZmZpX2Nsb3N1cmVfU1lTVnwKLXxmZmlfY2xvc3VyZV9TWVNWfCBQUk9DCi0KLSAgICA7IFN0b3JlIHRoZSBhcmd1bWVudCByZWdpc3RlcnMgb24gdGhlIHN0YWNrCi0gICAgc3RtZmQgICBzcCEsIHthMS1hNH0KLSAgICA7IFB1c2ggdGhlIHJldHVybiBhZGRyZXNzIG9udG8gdGhlIHN0YWNrCi0gICAgc3RtZmQgICBzcCEsIHtscn0KLQotICAgIG1vdiAgICAgYTEsIGlwICAgICAgICAgICAgOyBmaXJzdCBhcmcgPSBhZGRyZXNzIG9mIGZmaV9jbG9zdXJlCi0gICAgYWRkICAgICBhMiwgc3AsICM0ICAgICAgICA7IHNlY29uZCBhcmcgPSBzcCs0IChwb2ludHMgdG8gc2F2ZWQgYTEpCi0KLSAgICA7IEFsbG9jYXRlIHNwYWNlIGZvciBhIG5vbi1zdHJ1Y3QgcmV0dXJuIHZhbHVlCi0gICAgc3ViICAgICBzcCwgc3AsICNSRVNFUlZFX1JFVFVSTgotICAgIG1vdiAgICAgYTMsIHNwICAgICAgICAgICAgOyB0aGlyZCBhcmcgPSByZXR1cm4gdmFsdWUgYWRkcmVzcwotCi0gICAgOyBzdGF0aWMgdW5zaWduZWQgaW50Ci0gICAgOyBmZmlfY2xvc3VyZV9TWVNWX2lubmVyIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwgY2hhciAqaW5fYXJncywgdm9pZCAqcnZhbHVlKQotICAgIGJsICAgICAgZmZpX2Nsb3N1cmVfU1lTVl9pbm5lcgotICAgIDsgYTEgbm93IGNvbnRhaW5zIHRoZSByZXR1cm4gdHlwZSBjb2RlIAotCi0gICAgOyBBdCB0aGlzIHBvaW50IHRoZSByZXR1cm4gdmFsdWUgaXMgb24gdGhlIHN0YWNrCi0gICAgOyBUcmFuc2ZlciBpdCB0byB0aGUgY29ycmVjdCByZWdpc3RlcnMgaWYgbmVjZXNzYXJ5Ci0KLTsgcmV0dXJuIElOVAotICAgIGNtcCAgICAgYTEsICNGRklfVFlQRV9JTlQKLSAgICBsZHJlcSAgIGExLCBbc3BdCi0gICAgYmVxICAgICBjbG9zdXJlX2VwaWxvZ3VlCi0KLTsgcmV0dXJuIEZMT0FUCi0gICAgY21wICAgICBhMSwgI0ZGSV9UWVBFX0ZMT0FUCi0gICAgWyBfX1NPRlRGUF9fICAgICAgICAgICAgICAgICAgICA7aWZkZWYgX19TT0ZURlBfXwotICAgIGxkcmVxICAgYTEsIFtzcF0KLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbHNlCi0gICAgc3RmZXFzICBmMCwgW3NwXQotICAgIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2VuZGlmCi0gICAgYmVxICAgICBjbG9zdXJlX2VwaWxvZ3VlCi0KLTsgcmV0dXJuIERPVUJMRSBvciBMT05HRE9VQkxFCi0gICAgY21wICAgICBhMSwgI0ZGSV9UWVBFX0RPVUJMRQotICAgIFsgX19TT0ZURlBfXyAgICAgICAgICAgICAgICAgICAgO2lmZGVmIF9fU09GVEZQX18KLSAgICBsZG1lcWlhIHNwLCB7YTEsIGEyfQotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2Vsc2UKLSAgICBzdGZlcWQgIGYwLCBbc3BdCi0gICAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZW5kaWYKLSAgICBiZXEgICAgIGNsb3N1cmVfZXBpbG9ndWUKLQotOyByZXR1cm4gU0lOVDY0IG9yIFVJTlQ2NAotICAgIGNtcCAgICAgYTEsICNGRklfVFlQRV9TSU5UNjQKLSAgICBsZG1lcWlhIHNwLCB7YTEsIGEyfQotCi1jbG9zdXJlX2VwaWxvZ3VlCi0gICAgYWRkICAgICBzcCwgc3AsICNSRVNFUlZFX1JFVFVSTiAgIDsgcmVtb3ZlIHJldHVybiB2YWx1ZSBidWZmZXIKLSAgICBsZG1mZCAgIHNwISwge2lwfSAgICAgICAgIDsgaXAgPSBwb3AgcmV0dXJuIGFkZHJlc3MKLSAgICBhZGQgICAgIHNwLCBzcCwgIzE2ICAgICAgIDsgcmVtb3ZlIHNhdmVkIGFyZ3VtZW50IHJlZ2lzdGVycyB7YTEtYTR9IGZyb20gdGhlIHN0YWNrCi0gICAgbW92ICAgICBwYywgaXAgICAgICAgICAgICA7IHJldHVybgotCi0gICAgRU5EUCAgICA7IGZmaV9jbG9zdXJlX1NZU1YKLQotICAgIEVORApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwppbmRleCAyMjhmNDk3Li4xOGVmMzM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYworKysgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwpAQCAtNiw3ICs2LDcgQEAKIAogLyogUmVsZWFzZSBOdW1iZXIgKi8KIAotc3RhdGljIGNoYXIgKlB5Q3Vyc2VzVmVyc2lvbiA9ICIyLjEiOworc3RhdGljIGNvbnN0IGNoYXIgUHlDdXJzZXNWZXJzaW9uW10gPSAiMi4xIjsKIAogLyogSW5jbHVkZXMgKi8KIApAQCAtNTYsNyArNTYsNyBAQAogICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKK1B5Q3Vyc2VzQ2hlY2tFUlIoaW50IGNvZGUsIGNvbnN0IGNoYXIgKmZuYW1lKQogewogICAgIGlmIChjb2RlICE9IEVSUikgewogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYyBiL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCmluZGV4IDk2MDc1MmMuLmE0ODczNWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCkBAIC0yMzA2LDcgKzIzMDYsNyBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGRhdGEgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHN0cmVhbSwgJlB5SWRfcmVhZCwgIiIpOworICAgIGRhdGEgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHN0cmVhbSwgJlB5SWRfcmVhZCwgTlVMTCk7CiAgICAgaWYgKGRhdGEgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2soZGF0YSkpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCmluZGV4IGY0MTljYjIuLjY1OTdjYjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYwpAQCAtOSw2ICs5LDEyIEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiAjICBpbmNsdWRlIDx3aW5zb2NrMi5oPiAgICAgICAgIC8qIHN0cnVjdCB0aW1ldmFsICovCitzdGF0aWMgc3RydWN0IHRtICpsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVwLCBzdHJ1Y3QgdG0gKnJlc3VsdCkKK3sKKyAgICBpZiAobG9jYWx0aW1lX3MocmVzdWx0LCB0aW1lcCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gTlVMTDsKK30KICNlbmRpZgogCiAvKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYnVpbGRpbmcgdGhlIGNvcmUgbW9kdWxlIGFuZCBidWlsZGluZyBleHRlbnNpb24KQEAgLTU2LDYgKzYyLDcgQEAKICNkZWZpbmUgREFURV9HRVRfTUlOVVRFICAgICAgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUKICNkZWZpbmUgREFURV9HRVRfU0VDT05EICAgICAgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQKICNkZWZpbmUgREFURV9HRVRfTUlDUk9TRUNPTkQgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9NSUNST1NFQ09ORAorI2RlZmluZSBEQVRFX0dFVF9GT0xEICAgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX0ZPTEQKIAogLyogRGF0ZSBhY2Nlc3NvcnMgZm9yIGRhdGUgYW5kIGRhdGV0aW1lLiAqLwogI2RlZmluZSBTRVRfWUVBUihvLCB2KSAgICAgICAgICAoKChvKS0+ZGF0YVswXSA9ICgodikgJiAweGZmMDApID4+IDgpLCBcCkBAIC03MSwxMiArNzgsMTQgQEAKICAgICAoKChvKS0+ZGF0YVs3XSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCiAgICAgICgobyktPmRhdGFbOF0gPSAoKHYpICYgMHgwMGZmMDApID4+IDgpLCBcCiAgICAgICgobyktPmRhdGFbOV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKKyNkZWZpbmUgREFURV9TRVRfRk9MRChvLCB2KSAgIChQeURhdGVUaW1lX0RBVEVfR0VUX0ZPTEQobykgPSAodikpCiAKIC8qIFRpbWUgYWNjZXNzb3JzIGZvciB0aW1lLiAqLwogI2RlZmluZSBUSU1FX0dFVF9IT1VSICAgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIKICNkZWZpbmUgVElNRV9HRVRfTUlOVVRFICAgICAgICAgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUKICNkZWZpbmUgVElNRV9HRVRfU0VDT05EICAgICAgICAgUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQKICNkZWZpbmUgVElNRV9HRVRfTUlDUk9TRUNPTkQgICAgUHlEYXRlVGltZV9USU1FX0dFVF9NSUNST1NFQ09ORAorI2RlZmluZSBUSU1FX0dFVF9GT0xEICAgICAgICAgICBQeURhdGVUaW1lX1RJTUVfR0VUX0ZPTEQKICNkZWZpbmUgVElNRV9TRVRfSE9VUihvLCB2KSAgICAgKFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSA9ICh2KSkKICNkZWZpbmUgVElNRV9TRVRfTUlOVVRFKG8sIHYpICAgKFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFKG8pID0gKHYpKQogI2RlZmluZSBUSU1FX1NFVF9TRUNPTkQobywgdikgICAoUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQobykgPSAodikpCkBAIC04NCw2ICs5Myw3IEBACiAgICAgKCgobyktPmRhdGFbM10gPSAoKHYpICYgMHhmZjAwMDApID4+IDE2KSwgXAogICAgICAoKG8pLT5kYXRhWzRdID0gKCh2KSAmIDB4MDBmZjAwKSA+PiA4KSwgXAogICAgICAoKG8pLT5kYXRhWzVdID0gKCh2KSAmIDB4MDAwMGZmKSkpCisjZGVmaW5lIFRJTUVfU0VUX0ZPTEQobywgdikgICAoUHlEYXRlVGltZV9USU1FX0dFVF9GT0xEKG8pID0gKHYpKQogCiAvKiBEZWx0YSBhY2Nlc3NvcnMgZm9yIHRpbWVkZWx0YS4gKi8KICNkZWZpbmUgR0VUX1REX0RBWVMobykgICAgICAgICAgKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPmRheXMpCkBAIC0xODQsMTIgKzE5NCwxMiBAQAogICogYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgdGhhdCBtb250aCBpbiB0aGUgc2FtZSB5ZWFyLiAgVGhlc2UKICAqIGFyZSBjb3JyZWN0IGZvciBub24tbGVhcCB5ZWFycyBvbmx5LgogICovCi1zdGF0aWMgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CiAgICAgMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KICAgICAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCiB9OwogCi1zdGF0aWMgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0geworc3RhdGljIGNvbnN0IGludCBfZGF5c19iZWZvcmVfbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CiB9OwpAQCAtNDE3LDcgKzQyNyw3IEBACiAgKiBhcmVuJ3QsIHJhaXNlIFZhbHVlRXJyb3IgYW5kIHJldHVybiAtMS4KICAqLwogc3RhdGljIGludAotY2hlY2tfdGltZV9hcmdzKGludCBoLCBpbnQgbSwgaW50IHMsIGludCB1cykKK2NoZWNrX3RpbWVfYXJncyhpbnQgaCwgaW50IG0sIGludCBzLCBpbnQgdXMsIGludCBmb2xkKQogewogICAgIGlmIChoIDwgMCB8fCBoID4gMjMpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC00MzksNiArNDQ5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAibWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTkiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBpZiAoZm9sZCAhPSAwICYmIGZvbGQgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb2xkIG11c3QgYmUgZWl0aGVyIDAgb3IgMSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC02NzQsOCArNjg5LDggQEAKIAogLyogQ3JlYXRlIGEgZGF0ZXRpbWUgaW5zdGFuY2Ugd2l0aCBubyByYW5nZSBjaGVja2luZy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1uZXdfZGF0ZXRpbWVfZXgoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsCi0gICAgICAgICAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKK25ld19kYXRldGltZV9leDIoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsCisgICAgICAgICAgICAgICAgIGludCBzZWNvbmQsIGludCB1c2Vjb25kLCBQeU9iamVjdCAqdHppbmZvLCBpbnQgZm9sZCwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewogICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGY7CiAgICAgY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOwpAQCAtNjkyLDE4ICs3MDcsMjcgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOwogICAgICAgICAgICAgc2VsZi0+dHppbmZvID0gdHppbmZvOwogICAgICAgICB9CisgICAgICAgIERBVEVfU0VUX0ZPTEQoc2VsZiwgZm9sZCk7CiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi0jZGVmaW5lIG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKSAgICAgICAgICAgXAotICAgIG5ld19kYXRldGltZV9leCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvLCAgICAgICAgICAgIFwKK3N0YXRpYyBQeU9iamVjdCAqCituZXdfZGF0ZXRpbWVfZXgoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsCisgICAgICAgICAgICAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICByZXR1cm4gbmV3X2RhdGV0aW1lX2V4Mih5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8sIDAsIHR5cGUpOworfQorCisjZGVmaW5lIG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvLCBmb2xkKSBcCisgICAgbmV3X2RhdGV0aW1lX2V4Mih5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvLCBmb2xkLCBcCiAgICAgICAgICAgICAgICAgICAgICZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkKIAogLyogQ3JlYXRlIGEgdGltZSBpbnN0YW5jZSB3aXRoIG5vIHJhbmdlIGNoZWNraW5nLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKLW5ld190aW1lX2V4KGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwKLSAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKK25ld190aW1lX2V4MihpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsCisgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbywgaW50IGZvbGQsIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKICAgICBQeURhdGVUaW1lX1RpbWUgKnNlbGY7CiAgICAgY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOwpAQCAtNzIwLDEyICs3NDQsMjAgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOwogICAgICAgICAgICAgc2VsZi0+dHppbmZvID0gdHppbmZvOwogICAgICAgICB9CisgICAgICAgIFRJTUVfU0VUX0ZPTEQoc2VsZiwgZm9sZCk7CiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi0jZGVmaW5lIG5ld190aW1lKGhoLCBtbSwgc3MsIHVzLCB0emluZm8pICAgICAgICAgICAgICAgIFwKLSAgICBuZXdfdGltZV9leChoaCwgbW0sIHNzLCB1cywgdHppbmZvLCAmUHlEYXRlVGltZV9UaW1lVHlwZSkKK3N0YXRpYyBQeU9iamVjdCAqCituZXdfdGltZV9leChpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsCisgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvLCBQeVR5cGVPYmplY3QgKnR5cGUpCit7CisgICAgcmV0dXJuIG5ld190aW1lX2V4Mihob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgdHppbmZvLCAwLCB0eXBlKTsKK30KKworI2RlZmluZSBuZXdfdGltZShoaCwgbW0sIHNzLCB1cywgdHppbmZvLCBmb2xkKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld190aW1lX2V4MihoaCwgbW0sIHNzLCB1cywgdHppbmZvLCBmb2xkLCAmUHlEYXRlVGltZV9UaW1lVHlwZSkKIAogLyogQ3JlYXRlIGEgdGltZWRlbHRhIGluc3RhbmNlLiAgTm9ybWFsaXplIHRoZSBtZW1iZXJzIGlmZiBub3JtYWxpemUgaXMKICAqIHRydWUuICBQYXNzaW5nIGZhbHNlIGlzIGEgc3BlZWQgb3B0aW1pemF0aW9uLCBpZiB5b3Uga25vdyBmb3Igc3VyZQpAQCAtODczLDcgKzkwNSw3IEBACiAgKiB0aGlzIHJldHVybnMgTlVMTC4gIEVsc2UgcmVzdWx0IGlzIHJldHVybmVkLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF90emluZm9fbWV0aG9kKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcpCitjYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKICAgICBQeU9iamVjdCAqb2Zmc2V0OwogCkBAIC04ODcsMTAgKzkxOSwxMCBAQAogICAgIGlmIChvZmZzZXQgPT0gUHlfTm9uZSB8fCBvZmZzZXQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICBpZiAoUHlEZWx0YV9DaGVjayhvZmZzZXQpKSB7Ci0gICAgICAgIGlmIChHRVRfVERfTUlDUk9TRUNPTkRTKG9mZnNldCkgIT0gMCB8fCBHRVRfVERfU0VDT05EUyhvZmZzZXQpICUgNjAgIT0gMCkgeworICAgICAgICBpZiAoR0VUX1REX01JQ1JPU0VDT05EUyhvZmZzZXQpICE9IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihvZmZzZXQpOwogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgbXVzdCBiZSBhIHRpbWVkZWx0YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlcHJlc2VudGluZyBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXByZXNlbnRpbmcgYSB3aG9sZSBudW1iZXIgb2Ygc2Vjb25kcyIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChHRVRfVERfREFZUyhvZmZzZXQpID09IC0xICYmIEdFVF9URF9TRUNPTkRTKG9mZnNldCkgPT0gMCkgfHwKQEAgLTEwMDIsNiArMTAzNCwzMCBAQAogICAgIHJldHVybiByZXByOwogfQogCisvKiByZXByIGlzIGxpa2UgInNvbWVjbGFzcyhhcmcxLCBhcmcyKSIuICBJZiBmb2xkIGlzbid0IDAsCisgKiBzdHVmZgorICogICAgICIsIGZvbGQ9IiArIHJlcHIodHppbmZvKQorICogYmVmb3JlIHRoZSBjbG9zaW5nICIpIi4KKyAqLworc3RhdGljIFB5T2JqZWN0ICoKK2FwcGVuZF9rZXl3b3JkX2ZvbGQoUHlPYmplY3QgKnJlcHIsIGludCBmb2xkKQoreworICAgIFB5T2JqZWN0ICp0ZW1wOworCisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhyZXByKSk7CisgICAgaWYgKGZvbGQgPT0gMCkKKyAgICAgICAgcmV0dXJuIHJlcHI7CisgICAgLyogR2V0IHJpZCBvZiB0aGUgdHJhaWxpbmcgJyknLiAqLworICAgIGFzc2VydChQeVVuaWNvZGVfUkVBRF9DSEFSKHJlcHIsIFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcHIpLTEpID09ICcpJyk7CisgICAgdGVtcCA9IFB5VW5pY29kZV9TdWJzdHJpbmcocmVwciwgMCwgUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwcikgLSAxKTsKKyAgICBQeV9ERUNSRUYocmVwcik7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVwciA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlVSwgZm9sZD0lZCkiLCB0ZW1wLCBmb2xkKTsKKyAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgcmV0dXJuIHJlcHI7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogU3RyaW5nIGZvcm1hdCBoZWxwZXJzLgogICovCkBAIC0xMDA5LDEwICsxMDY1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0X2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqZGF0ZSwgaW50IGhvdXJzLCBpbnQgbWludXRlcywgaW50IHNlY29uZHMpCiB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKkRheU5hbWVzW10gPSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBEYXlOYW1lc1tdID0gewogICAgICAgICAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIgogICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKk1vbnRoTmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IE1vbnRoTmFtZXNbXSA9IHsKICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgogICAgIH07CkBAIC0xMDU3LDEwICsxMTEzLDggQEAKICAgICB9CiAgICAgLyogT2Zmc2V0IGlzIG5vcm1hbGl6ZWQsIHNvIGl0IGlzIG5lZ2F0aXZlIGlmIGRheXMgPCAwICovCiAgICAgaWYgKEdFVF9URF9EQVlTKG9mZnNldCkgPCAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gb2Zmc2V0OwogICAgICAgICBzaWduID0gJy0nOwotICAgICAgICBvZmZzZXQgPSBkZWx0YV9uZWdhdGl2ZSgoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCk7Ci0gICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgUHlfU0VUUkVGKG9mZnNldCwgZGVsdGFfbmVnYXRpdmUoKFB5RGF0ZVRpbWVfRGVsdGEgKilvZmZzZXQpKTsKICAgICAgICAgaWYgKG9mZnNldCA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTEwNzIsMTAgKzExMjYsMTEgQEAKICAgICBQeV9ERUNSRUYob2Zmc2V0KTsKICAgICBtaW51dGVzID0gZGl2bW9kKHNlY29uZHMsIDYwLCAmc2Vjb25kcyk7CiAgICAgaG91cnMgPSBkaXZtb2QobWludXRlcywgNjAsICZtaW51dGVzKTsKLSAgICBhc3NlcnQoc2Vjb25kcyA9PSAwKTsKLSAgICAvKiBYWFggaWdub3JlIHN1Yi1taW51dGUgZGF0YSwgY3VycmVudGx5IG5vdCBhbGxvd2VkLiAqLwotICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyUwMmQlcyUwMmQiLCBzaWduLCBob3Vycywgc2VwLCBtaW51dGVzKTsKLQorICAgIGlmIChzZWNvbmRzID09IDApCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyUwMmQlcyUwMmQiLCBzaWduLCBob3Vycywgc2VwLCBtaW51dGVzKTsKKyAgICBlbHNlCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyUwMmQlcyUwMmQlcyUwMmQiLCBzaWduLCBob3VycywKKyAgICAgICAgICAgICAgICAgICAgICBzZXAsIG1pbnV0ZXMsIHNlcCwgc2Vjb25kcyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEzMjMsNyArMTM3OCw3IEBACiAgICAgaWYgKHRpbWUgIT0gTlVMTCkgewogICAgICAgICBfUHlfSURFTlRJRklFUih0aW1lKTsKIAotICAgICAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHRpbWUsICZQeUlkX3RpbWUsICIoKSIpOworICAgICAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHRpbWUsICZQeUlkX3RpbWUsIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYodGltZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC0yMzA3LDcgKzIzNjIsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAotc3RhdGljIGNoYXIgZGVsdGFfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGVsdGFfZG9jW10gPQogUHlEb2NfU1RSKCJEaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGV0aW1lIHZhbHVlcy4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkZWx0YV9hc19udW1iZXIgPSB7CkBAIC0yNjQ4LDcgKzI3MDMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3RyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLSAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QgKilzZWxmLCAmUHlJZF9pc29mb3JtYXQsICIoKSIpOworICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKXNlbGYsICZQeUlkX2lzb2Zvcm1hdCwgTlVMTCk7CiB9CiAKIApAQCAtMjY3NCw3ICsyNzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgdHVwbGUgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKXNlbGYsICZQeUlkX3RpbWV0dXBsZSwgIigpIik7CisgICAgdHVwbGUgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCAqKXNlbGYsICZQeUlkX3RpbWV0dXBsZSwgTlVMTCk7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJlc3VsdCA9IHdyYXBfc3RyZnRpbWUoKFB5T2JqZWN0ICopc2VsZiwgZm9ybWF0LCB0dXBsZSwKQEAgLTI4ODYsNyArMjk0MSw3IEBACiAgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIGRhdGVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGF0ZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGUoeWVhciwgbW9udGgsIGRheSkgLS0+IGRhdGUgb2JqZWN0Iik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGF0ZV9hc19udW1iZXIgPSB7CkBAIC0zMDQ3LDEwICszMTAyLDggQEAKICAgICBpZiAoZHN0ID09IFB5X05vbmUpCiAgICAgICAgIGdvdG8gSW5jb25zaXN0ZW50OwogICAgIGlmIChkZWx0YV9ib29sKChQeURhdGVUaW1lX0RlbHRhICopZHN0KSAhPSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OwotICAgICAgICByZXN1bHQgPSBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopZHN0LCAxKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopZHN0LCAxKSk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gRmFpbDsKICAgICB9CkBAIC0zMDgwLDM3ICszMTMzLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX3JlZHVjZShQeU9iamVjdCAqc2VsZikKIHsKLSAgICBQeU9iamVjdCAqYXJncywgKnN0YXRlLCAqdG1wOworICAgIFB5T2JqZWN0ICphcmdzLCAqc3RhdGU7CiAgICAgUHlPYmplY3QgKmdldGluaXRhcmdzLCAqZ2V0c3RhdGU7CiAgICAgX1B5X0lERU5USUZJRVIoX19nZXRpbml0YXJnc19fKTsKICAgICBfUHlfSURFTlRJRklFUihfX2dldHN0YXRlX18pOwogCi0gICAgdG1wID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIGdldGluaXRhcmdzID0gX1B5T2JqZWN0X0dldEF0dHJJZChzZWxmLCAmUHlJZF9fX2dldGluaXRhcmdzX18pOwogICAgIGlmIChnZXRpbml0YXJncyAhPSBOVUxMKSB7Ci0gICAgICAgIGFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldGluaXRhcmdzLCB0bXApOworICAgICAgICBhcmdzID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhnZXRpbml0YXJncyk7CiAgICAgICAgIFB5X0RFQ1JFRihnZXRpbml0YXJncyk7CiAgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGFyZ3MgPSB0bXA7Ci0gICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKworICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogCiAgICAgZ2V0c3RhdGUgPSBfUHlPYmplY3RfR2V0QXR0cklkKHNlbGYsICZQeUlkX19fZ2V0c3RhdGVfXyk7CiAgICAgaWYgKGdldHN0YXRlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldHN0YXRlLCB0bXApOworICAgICAgICBzdGF0ZSA9IF9QeU9iamVjdF9DYWxsTm9BcmcoZ2V0c3RhdGUpOwogICAgICAgICBQeV9ERUNSRUYoZ2V0c3RhdGUpOwogICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTMxMTksMTMgKzMxNjksMTIgQEAKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgc3RhdGUgPSBQeV9Ob25lOwogICAgICAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7Ci0gICAgICAgIGlmIChkaWN0cHRyICYmICpkaWN0cHRyICYmIFB5RGljdF9TaXplKCpkaWN0cHRyKSkKKyAgICAgICAgaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIgJiYgUHlEaWN0X1NpemUoKmRpY3RwdHIpKSB7CiAgICAgICAgICAgICBzdGF0ZSA9ICpkaWN0cHRyOworICAgICAgICB9CiAgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHRtcCk7Ci0KICAgICBpZiAoc3RhdGUgPT0gUHlfTm9uZSkgewogICAgICAgICBQeV9ERUNSRUYoc3RhdGUpOwogICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGFyZ3MpOwpAQCAtMzE1NSw3ICszMjA0LDcgQEAKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHR6aW5mb19kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0emluZm9fZG9jW10gPQogUHlEb2NfU1RSKCJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBvYmplY3RzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVFpJbmZvVHlwZSA9IHsKQEAgLTMyODcsNiArMzMzNiwxMSBAQAogICAgICAgICBQeV9JTkNSRUYoc2VsZi0+bmFtZSk7CiAgICAgICAgIHJldHVybiBzZWxmLT5uYW1lOwogICAgIH0KKyAgICBpZiAoKFB5T2JqZWN0ICopc2VsZiA9PSBQeURhdGVUaW1lX1RpbWVab25lX1VUQyB8fAorICAgICAgICAgICAoR0VUX1REX0RBWVMoc2VsZi0+b2Zmc2V0KSA9PSAwICYmCisgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmLT5vZmZzZXQpID09IDAgJiYKKyAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZi0+b2Zmc2V0KSA9PSAwKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJVVEMiKTsKICAgICAvKiBPZmZzZXQgaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgbmVnYXRpdmUgaWYgZGF5cyA8IDAgKi8KICAgICBpZiAoR0VUX1REX0RBWVMoc2VsZi0+b2Zmc2V0KSA8IDApIHsKICAgICAgICAgc2lnbiA9ICctJzsKQEAgLTMzODIsNyArMzQzNiw3IEBACiAgICAge05VTEwsIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciB0aW1lem9uZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0aW1lem9uZV9kb2NbXSA9CiBQeURvY19TVFIoIkZpeGVkIG9mZnNldCBmcm9tIFVUQyBpbXBsZW1lbnRhdGlvbiBvZiB0emluZm8uIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9UaW1lWm9uZVR5cGUgPSB7CkBAIC0zNDY2LDEyICszNTIwLDE5IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK3RpbWVfZm9sZChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKK3sKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFRJTUVfR0VUX0ZPTEQoc2VsZikpOworfQorCiBzdGF0aWMgUHlHZXRTZXREZWYgdGltZV9nZXRzZXRbXSA9IHsKICAgICB7ImhvdXIiLCAgICAgICAgKGdldHRlcil0aW1lX2hvdXJ9LAogICAgIHsibWludXRlIiwgICAgICAoZ2V0dGVyKXRpbWVfbWludXRlfSwKICAgICB7InNlY29uZCIsICAgICAgKGdldHRlcilweV90aW1lX3NlY29uZH0sCiAgICAgeyJtaWNyb3NlY29uZCIsIChnZXR0ZXIpdGltZV9taWNyb3NlY29uZH0sCi0gICAgeyJ0emluZm8iLCAgICAgICAgICAoZ2V0dGVyKXRpbWVfdHppbmZvfSwKKyAgICB7InR6aW5mbyIsICAgICAgKGdldHRlcil0aW1lX3R6aW5mb30sCisgICAgeyJmb2xkIiwgICAgICAgIChnZXR0ZXIpdGltZV9mb2xkfSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTM0ODAsNyArMzU0MSw3IEBACiAgKi8KIAogc3RhdGljIGNoYXIgKnRpbWVfa3dzW10gPSB7ImhvdXIiLCAibWludXRlIiwgInNlY29uZCIsICJtaWNyb3NlY29uZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidHppbmZvIiwgTlVMTH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAidHppbmZvIiwgImZvbGQiLCBOVUxMfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKQEAgLTM0OTIsMTMgKzM1NTMsMTQgQEAKICAgICBpbnQgc2Vjb25kID0gMDsKICAgICBpbnQgdXNlY29uZCA9IDA7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgaW50IGZvbGQgPSAwOwogCiAgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCiAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgogICAgICAgICBQeUJ5dGVzX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKICAgICAgICAgUHlCeXRlc19HRVRfU0laRShzdGF0ZSkgPT0gX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSAmJgotICAgICAgICAoKHVuc2lnbmVkIGNoYXIpIChQeUJ5dGVzX0FTX1NUUklORyhzdGF0ZSlbMF0pKSA8IDI0KQorICAgICAgICAoMHg3RiAmICgodW5zaWduZWQgY2hhcikgKFB5Qnl0ZXNfQVNfU1RSSU5HKHN0YXRlKVswXSkpKSA8IDI0KQogICAgIHsKICAgICAgICAgUHlEYXRlVGltZV9UaW1lICptZTsKICAgICAgICAgY2hhciBhd2FyZTsKQEAgLTM1MjMsMTkgKzM1ODUsMjYgQEAKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodHppbmZvKTsKICAgICAgICAgICAgICAgICBtZS0+dHppbmZvID0gdHppbmZvOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBkYXRhWzBdICYgKDEgPDwgNykpIHsKKyAgICAgICAgICAgICAgICBtZS0+ZGF0YVswXSAtPSAxMjg7CisgICAgICAgICAgICAgICAgbWUtPmZvbGQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWUtPmZvbGQgPSAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiltZTsKICAgICB9CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlPIiwgdGltZV9rd3MsCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTyRpIiwgdGltZV9rd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCwgJnVzZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvKSkgewotICAgICAgICBpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvLCAmZm9sZCkpIHsKKyAgICAgICAgaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgZm9sZCkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgc2VsZiA9IG5ld190aW1lX2V4KGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCB0emluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICAgICAgc2VsZiA9IG5ld190aW1lX2V4Mihob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgdHppbmZvLCBmb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTM1ODUsNiArMzY1NCw3IEBACiAgICAgaW50IG0gPSBUSU1FX0dFVF9NSU5VVEUoc2VsZik7CiAgICAgaW50IHMgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CiAgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgaW50IGZvbGQgPSBUSU1FX0dFVF9GT0xEKHNlbGYpOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCiAgICAgaWYgKHVzKQpAQCAtMzU5NywzMyArMzY2Nyw2OCBAQAogICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJXMoJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSk7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIEhBU1RaSU5GTyhzZWxmKSkKICAgICAgICAgcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfdHppbmZvKHJlc3VsdCwgc2VsZi0+dHppbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgZm9sZCkKKyAgICAgICAgcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfZm9sZChyZXN1bHQsIGZvbGQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3N0cihQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7Ci0gICAgcmV0dXJuIF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0ICopc2VsZiwgJlB5SWRfaXNvZm9ybWF0LCAiKCkiKTsKKyAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QgKilzZWxmLCAmUHlJZF9pc29mb3JtYXQsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQordGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIGNoYXIgYnVmWzEwMF07CisgICAgY2hhciAqdGltZXNwZWMgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0aW1lc3BlYyIsIE5VTEx9OwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgc3RhdGljIGNoYXIgKnNwZWNzW11bMl0gPSB7CisgICAgICAgIHsiaG91cnMiLCAiJTAyZCJ9LAorICAgICAgICB7Im1pbnV0ZXMiLCAiJTAyZDolMDJkIn0sCisgICAgICAgIHsic2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZCJ9LAorICAgICAgICB7Im1pbGxpc2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZC4lMDNkIn0sCisgICAgICAgIHsibWljcm9zZWNvbmRzIiwgIiUwMmQ6JTAyZDolMDJkLiUwNmQifSwKKyAgICB9OworICAgIHNpemVfdCBnaXZlbl9zcGVjOwogCi0gICAgaWYgKHVzKQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTA2ZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cyk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8czppc29mb3JtYXQiLCBrZXl3b3JkcywgJnRpbWVzcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAodGltZXNwZWMgPT0gTlVMTCB8fCBzdHJjbXAodGltZXNwZWMsICJhdXRvIikgPT0gMCkgeworICAgICAgICBpZiAodXMgPT0gMCkgeworICAgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSA0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGdpdmVuX3NwZWMgPSAwOyBnaXZlbl9zcGVjIDwgUHlfQVJSQVlfTEVOR1RIKHNwZWNzKTsgZ2l2ZW5fc3BlYysrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKHRpbWVzcGVjLCBzcGVjc1tnaXZlbl9zcGVjXVswXSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnaXZlbl9zcGVjID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgICAgICAgICAgICAgICAgIHVzID0gdXMgLyAxMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnaXZlbl9zcGVjID09IFB5X0FSUkFZX0xFTkdUSChzcGVjcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIHRpbWVzcGVjIHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoc3BlY3NbZ2l2ZW5fc3BlY11bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksIFRJTUVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLCB1cyk7CisgICAgfQogCiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zNzUwLDkgKzM4NTUsMjMgQEAKIHRpbWVfaGFzaChQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpvZmZzZXQ7Ci0KLSAgICAgICAgb2Zmc2V0ID0gdGltZV91dGNvZmZzZXQoKFB5T2JqZWN0ICopc2VsZiwgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICpvZmZzZXQsICpzZWxmMDsKKyAgICAgICAgaWYgKERBVEVfR0VUX0ZPTEQoc2VsZikpIHsKKyAgICAgICAgICAgIHNlbGYwID0gbmV3X3RpbWVfZXgyKERBVEVfR0VUX0hPVVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBQeV9UWVBFKHNlbGYpKTsKKyAgICAgICAgICAgIGlmIChzZWxmMCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYwID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmMCk7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ID0gdGltZV91dGNvZmZzZXQoc2VsZjAsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoc2VsZjApOwogCiAgICAgICAgIGlmIChvZmZzZXQgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTM3OTgsMTUgKzM5MTcsMjQgQEAKICAgICBpbnQgc3MgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CiAgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CisgICAgaW50IGZvbGQgPSBUSU1FX0dFVF9GT0xEKHNlbGYpOwogCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlPOnJlcGxhY2UiLAorICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTyRpOnJlcGxhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2t3cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhoLCAmbW0sICZzcywgJnVzLCAmdHppbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhoLCAmbW0sICZzcywgJnVzLCAmdHppbmZvLCAmZm9sZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpaU8iLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY2xvbmUgPSB0aW1lX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7CisgICAgaWYgKGNsb25lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZvbGQgIT0gMCAmJiBmb2xkICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xkIG11c3QgYmUgZWl0aGVyIDAgb3IgMSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgVElNRV9TRVRfRk9MRChjbG9uZSwgZm9sZCk7CisgICAgfQogICAgIFB5X0RFQ1JFRih0dXBsZSk7CiAgICAgcmV0dXJuIGNsb25lOwogfQpAQCAtMzgxOSw3ICszOTQ3LDcgQEAKICAqIF9fZ2V0c3RhdGVfXyBpc24ndCBleHBvc2VkLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotdGltZV9nZXRzdGF0ZShQeURhdGVUaW1lX1RpbWUgKnNlbGYpCit0aW1lX2dldHN0YXRlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgaW50IHByb3RvKQogewogICAgIFB5T2JqZWN0ICpiYXNlc3RhdGU7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CkBAIC0zODI3LDYgKzM5NTUsOSBAQAogICAgIGJhc2VzdGF0ZSA9ICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CiAgICAgaWYgKGJhc2VzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcm90byA+IDMgJiYgVElNRV9HRVRfRk9MRChzZWxmKSkKKyAgICAgICAgICAgIC8qIFNldCB0aGUgZmlyc3QgYml0IG9mIHRoZSBmaXJzdCBieXRlICovCisgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhiYXNlc3RhdGUpWzBdIHw9ICgxIDw8IDcpOwogICAgICAgICBpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCiAgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKICAgICAgICAgZWxzZQpAQCAtMzgzNywxNiArMzk2OCwyMSBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdGltZV9yZWR1Y2UoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqYXJnKQordGltZV9yZWR1Y2UoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIHRpbWVfZ2V0c3RhdGUoc2VsZikpOworICAgIGludCBwcm90byA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9leF9fIiwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIHRpbWVfZ2V0c3RhdGUoc2VsZiwgcHJvdG8pKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHRpbWVfbWV0aG9kc1tdID0gewogCi0gICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAotICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTU1subW1tbW1tXSIKLSAgICAgICAgICAgICAgICJbK0hIOk1NXS4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsIFtISFs6TU1bOlNTWy5tbW1bdXV1XV1dXV0iCisgICAgICAgICAgICAgICAiWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJ0aW1lc3BlYyBzcGVjaWZpZXMgd2hhdCBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuXG4iKX0sCiAKICAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LApAQCAtMzg2NiwxMyArNDAwMiwxMyBAQAogICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pdGltZV9yZXBsYWNlLCAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAogCi0gICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKXRpbWVfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCi0gICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX2V4X18iLCAoUHlDRnVuY3Rpb24pdGltZV9yZWR1Y2UsICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfZXhfXyhwcm90bykgLT4gKGNscywgc3RhdGUpIil9LAogCiAgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHRpbWVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdGltZV9kb2NbXSA9CiBQeURvY19TVFIoInRpbWUoW2hvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssIHR6aW5mb11dXV1dKSAtLT4gYSB0aW1lIG9iamVjdFxuXAogXG5cCiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhbiBpbnN0YW5jZSBvZlxuXApAQCAtMzk2MCwxMiArNDA5NiwxOSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitkYXRldGltZV9mb2xkKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKK3sKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKERBVEVfR0VUX0ZPTEQoc2VsZikpOworfQorCiBzdGF0aWMgUHlHZXRTZXREZWYgZGF0ZXRpbWVfZ2V0c2V0W10gPSB7CiAgICAgeyJob3VyIiwgICAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfaG91cn0sCiAgICAgeyJtaW51dGUiLCAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfbWludXRlfSwKICAgICB7InNlY29uZCIsICAgICAgKGdldHRlcilkYXRldGltZV9zZWNvbmR9LAogICAgIHsibWljcm9zZWNvbmQiLCAoZ2V0dGVyKWRhdGV0aW1lX21pY3Jvc2Vjb25kfSwKLSAgICB7InR6aW5mbyIsICAgICAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfdHppbmZvfSwKKyAgICB7InR6aW5mbyIsICAgICAgKGdldHRlcilkYXRldGltZV90emluZm99LAorICAgIHsiZm9sZCIsICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX2ZvbGR9LAogICAgIHtOVUxMfQogfTsKIApAQCAtMzk3NSw3ICs0MTE4LDcgQEAKIAogc3RhdGljIGNoYXIgKmRhdGV0aW1lX2t3c1tdID0gewogICAgICJ5ZWFyIiwgIm1vbnRoIiwgImRheSIsICJob3VyIiwgIm1pbnV0ZSIsICJzZWNvbmQiLAotICAgICJtaWNyb3NlY29uZCIsICJ0emluZm8iLCBOVUxMCisgICAgIm1pY3Jvc2Vjb25kIiwgInR6aW5mbyIsICJmb2xkIiwgTlVMTAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM5OTAsNiArNDEzMyw3IEBACiAgICAgaW50IG1pbnV0ZSA9IDA7CiAgICAgaW50IHNlY29uZCA9IDA7CiAgICAgaW50IHVzZWNvbmQgPSAwOworICAgIGludCBmb2xkID0gMDsKICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKIAogICAgIC8qIENoZWNrIGZvciBpbnZvY2F0aW9uIGZyb20gcGlja2xlIHdpdGggX19nZXRzdGF0ZV9fIHN0YXRlICovCkBAIC0zOTk3LDcgKzQxNDEsNyBAQAogICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDw9IDIgJiYKICAgICAgICAgUHlCeXRlc19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCiAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFICYmCi0gICAgICAgIE1PTlRIX0lTX1NBTkUoUHlCeXRlc19BU19TVFJJTkcoc3RhdGUpWzJdKSkKKyAgICAgICAgTU9OVEhfSVNfU0FORShQeUJ5dGVzX0FTX1NUUklORyhzdGF0ZSlbMl0gJiAweDdGKSkKICAgICB7CiAgICAgICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKm1lOwogICAgICAgICBjaGFyIGF3YXJlOwpAQCAtNDAyMiwyMiArNDE2NiwyOSBAQAogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOwogICAgICAgICAgICAgICAgIG1lLT50emluZm8gPSB0emluZm87CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGRhdGFbMl0gJiAoMSA8PCA3KSkgeworICAgICAgICAgICAgICAgIG1lLT5kYXRhWzJdIC09IDEyODsKKyAgICAgICAgICAgICAgICBtZS0+Zm9sZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZS0+Zm9sZCA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOwogICAgIH0KIAotICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJpaWl8aWlpaU8iLCBkYXRldGltZV9rd3MsCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImlpaXxpaWlpTyRpIiwgZGF0ZXRpbWVfa3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kLCAmdXNlY29uZCwgJnR6aW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmQsICZ1c2Vjb25kLCAmdHppbmZvLCAmZm9sZCkpIHsKICAgICAgICAgaWYgKGNoZWNrX2RhdGVfYXJncyh5ZWFyLCBtb250aCwgZGF5KSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgPCAwKQorICAgICAgICBpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBmb2xkKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBzZWxmID0gbmV3X2RhdGV0aW1lX2V4KHllYXIsIG1vbnRoLCBkYXksCisgICAgICAgIHNlbGYgPSBuZXdfZGF0ZXRpbWVfZXgyKHllYXIsIG1vbnRoLCBkYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8sIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8sIGZvbGQsIHR5cGUpOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTQwNDUsNiArNDE5Niw0NSBAQAogLyogVE1fRlVOQyBpcyB0aGUgc2hhcmVkIHR5cGUgb2YgbG9jYWx0aW1lKCkgYW5kIGdtdGltZSgpLiAqLwogdHlwZWRlZiBzdHJ1Y3QgdG0gKigqVE1fRlVOQykoY29uc3QgdGltZV90ICp0aW1lcik7CiAKKy8qIEFzIG9mIHZlcnNpb24gMjAxNWYgbWF4IGZvbGQgaW4gSUFOQSBkYXRhYmFzZSBpcworICogMjMgaG91cnMgYXQgMTk2OS0wOS0zMCAxMzowMDowMCBpbiBLd2FqYWxlaW4uICovCitzdGF0aWMgbG9uZyBsb25nIG1heF9mb2xkX3NlY29uZHMgPSAyNCAqIDM2MDA7CisvKiBOQjogZGF0ZSgxOTcwLDEsMSkudG9vcmRpbmFsKCkgPT0gNzE5MTYzICovCitzdGF0aWMgbG9uZyBsb25nIGVwb2NoID0gUHlfTEwoNzE5MTYzKSAqIDI0ICogNjAgKiA2MDsKKworc3RhdGljIGxvbmcgbG9uZwordXRjX3RvX3NlY29uZHMoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKKyAgICAgICAgICAgICAgIGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQoreworICAgIGxvbmcgbG9uZyBvcmRpbmFsID0geW1kX3RvX29yZCh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICByZXR1cm4gKChvcmRpbmFsICogMjQgKyBob3VyKSAqIDYwICsgbWludXRlKSAqIDYwICsgc2Vjb25kOworfQorCitzdGF0aWMgbG9uZyBsb25nCitsb2NhbChsb25nIGxvbmcgdSkKK3sKKyAgICBzdHJ1Y3QgdG0gbG9jYWxfdGltZTsKKyAgICB0aW1lX3QgdDsKKyAgICB1IC09IGVwb2NoOworICAgIHQgPSB1OworICAgIGlmICh0ICE9IHUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybSB0aW1lX3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBYWFg6IGFkZCBib3VuZHMgY2hlY2tpbmcgKi8KKyAgICBpZiAobG9jYWx0aW1lX3IoJnQsICZsb2NhbF90aW1lKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gdXRjX3RvX3NlY29uZHMobG9jYWxfdGltZS50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZS50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lLnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWUudG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZS50bV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWUudG1fc2VjKTsKK30KKwogLyogSW50ZXJuYWwgaGVscGVyLgogICogQnVpbGQgZGF0ZXRpbWUgZnJvbSBhIHRpbWVfdCBhbmQgYSBkaXN0aW5jdCBjb3VudCBvZiBtaWNyb3NlY29uZHMuCiAgKiBQYXNzIGxvY2FsdGltZSBvciBnbXRpbWUgZm9yIGYsIHRvIGNvbnRyb2wgdGhlIGludGVycHJldGF0aW9uIG9mIHRpbWV0LgpAQCAtNDA1NCw2ICs0MjQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7CiAgICAgc3RydWN0IHRtICp0bTsKKyAgICBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZvbGQgPSAwOwogCiAgICAgdG0gPSBmKCZ0aW1ldCk7CiAgICAgaWYgKHRtID09IE5VTEwpIHsKQEAgLTQwNjQsNjEgKzQyNTUsNDAgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKICAgICB9CiAKKyAgICB5ZWFyID0gdG0tPnRtX3llYXIgKyAxOTAwOworICAgIG1vbnRoID0gdG0tPnRtX21vbiArIDE7CisgICAgZGF5ID0gdG0tPnRtX21kYXk7CisgICAgaG91ciA9IHRtLT50bV9ob3VyOworICAgIG1pbnV0ZSA9IHRtLT50bV9taW47CiAgICAgLyogVGhlIHBsYXRmb3JtIGxvY2FsdGltZS9nbXRpbWUgbWF5IGluc2VydCBsZWFwIHNlY29uZHMsCiAgICAgICogaW5kaWNhdGVkIGJ5IHRtLT50bV9zZWMgPiA1OS4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlbSwKICAgICAgKiBleGNlcHQgdG8gdGhlIGV4dGVudCB0aGF0IHBhc3NpbmcgdGhlbSBvbiB0byB0aGUgZGF0ZXRpbWUKICAgICAgKiBjb25zdHJ1Y3RvciB3b3VsZCByYWlzZSBWYWx1ZUVycm9yIGZvciBhIHJlYXNvbiB0aGF0CiAgICAgICogbWFkZSBubyBzZW5zZSB0byB0aGUgdXNlci4KICAgICAgKi8KLSAgICBpZiAodG0tPnRtX3NlYyA+IDU5KQotICAgICAgICB0bS0+dG1fc2VjID0gNTk7Ci0gICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWlpaWlpTyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX2hvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKLX0KKyAgICBzZWNvbmQgPSBQeV9NSU4oNTksIHRtLT50bV9zZWMpOwogCi1zdGF0aWMgdGltZV90Ci1fUHlUaW1lX0RvdWJsZVRvVGltZXQoZG91YmxlIHgpCi17Ci0gICAgdGltZV90IHJlc3VsdDsKLSAgICBkb3VibGUgZGlmZjsKKyAgICBpZiAodHppbmZvID09IFB5X05vbmUgJiYgZiA9PSBsb2NhbHRpbWUpIHsKKyAgICAgICAgbG9uZyBsb25nIHByb2JlX3NlY29uZHMsIHJlc3VsdF9zZWNvbmRzLCB0cmFuc2l0aW9uOwogCi0gICAgcmVzdWx0ID0gKHRpbWVfdCl4OwotICAgIC8qIEhvdyBtdWNoIGluZm8gZGlkIHdlIGxvc2U/ICB0aW1lX3QgbWF5IGJlIGFuIGludGVncmFsIG9yCi0gICAgICogZmxvYXRpbmcgdHlwZSwgYW5kIHdlIGRvbid0IGtub3cgd2hpY2guICBJZiBpdCdzIGludGVncmFsLAotICAgICAqIHdlIGRvbid0IGtub3cgd2hldGhlciBDIHRydW5jYXRlcywgcm91bmRzLCByZXR1cm5zIHRoZSBmbG9vciwKLSAgICAgKiBldGMuICBJZiB3ZSBsb3N0IGEgc2Vjb25kIG9yIG1vcmUsIHRoZSBDIHJvdW5kaW5nIGlzCi0gICAgICogdW5yZWFzb25hYmxlLCBvciB0aGUgaW5wdXQganVzdCBkb2Vzbid0IGZpdCBpbiBhIHRpbWVfdDsKLSAgICAgKiBjYWxsIGl0IGFuIGVycm9yIHJlZ2FyZGxlc3MuICBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGNhc3QgdG8KLSAgICAgKiB0aW1lX3QgY2FuIGNhdXNlIGEgQyBlcnJvciB0b28sIGJ1dCBub3RoaW5nIHdlIGNhbiBkbyB0bwotICAgICAqIHdvcm0gYXJvdW5kIHRoYXQuCi0gICAgICovCi0gICAgZGlmZiA9IHggLSAoZG91YmxlKXJlc3VsdDsKLSAgICBpZiAoZGlmZiA8PSAtMS4wIHx8IGRpZmYgPj0gMS4wKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtIHRpbWVfdCIpOwotICAgICAgICByZXN1bHQgPSAodGltZV90KS0xOworICAgICAgICByZXN1bHRfc2Vjb25kcyA9IHV0Y190b19zZWNvbmRzKHllYXIsIG1vbnRoLCBkYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQpOworICAgICAgICAvKiBQcm9iZSBtYXhfZm9sZF9zZWNvbmRzIHRvIGRldGVjdCBhIGZvbGQuICovCisgICAgICAgIHByb2JlX3NlY29uZHMgPSBsb2NhbChlcG9jaCArIHRpbWV0IC0gbWF4X2ZvbGRfc2Vjb25kcyk7CisgICAgICAgIGlmIChwcm9iZV9zZWNvbmRzID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRyYW5zaXRpb24gPSByZXN1bHRfc2Vjb25kcyAtIHByb2JlX3NlY29uZHMgLSBtYXhfZm9sZF9zZWNvbmRzOworICAgICAgICBpZiAodHJhbnNpdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHByb2JlX3NlY29uZHMgPSBsb2NhbChlcG9jaCArIHRpbWV0ICsgdHJhbnNpdGlvbik7CisgICAgICAgICAgICBpZiAocHJvYmVfc2Vjb25kcyA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChwcm9iZV9zZWNvbmRzID09IHJlc3VsdF9zZWNvbmRzKQorICAgICAgICAgICAgICAgIGZvbGQgPSAxOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFJvdW5kIGEgZG91YmxlIHRvIHRoZSBuZWFyZXN0IGxvbmcuICB8eHwgbXVzdCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0Ci0gKiBpbiBhIEMgbG9uZzsgdGhpcyBpcyBub3QgY2hlY2tlZC4KLSAqLwotc3RhdGljIGRvdWJsZQotX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGRvdWJsZSB4KQotewotICAgIGRvdWJsZSByb3VuZGVkID0gcm91bmQoeCk7Ci0gICAgaWYgKGZhYnMoeC1yb3VuZGVkKSA9PSAwLjUpCi0gICAgICAgIC8qIGhhbGZ3YXkgY2FzZTogcm91bmQgdG8gZXZlbiAqLwotICAgICAgICByb3VuZGVkID0gMi4wKnJvdW5kKHgvMi4wKTsKLSAgICByZXR1cm4gcm91bmRlZDsKKyAgICByZXR1cm4gbmV3X2RhdGV0aW1lX2V4Mih5ZWFyLCBtb250aCwgZGF5LCBob3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSwgc2Vjb25kLCB1cywgdHppbmZvLCBmb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKiljbHMpOwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC00MTI5LDMyICs0Mjk5LDE3IEBACiAgKiB0byBnZXQgdGhhdCBtdWNoIHByZWNpc2lvbiAoZS5nLiwgQyB0aW1lKCkgaXNuJ3QgZ29vZCBlbm91Z2gpLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBkb3VibGUgdGltZXN0YW1wLAorZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBQeU9iamVjdCAqdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbykKIHsKICAgICB0aW1lX3QgdGltZXQ7Ci0gICAgZG91YmxlIGZyYWN0aW9uOwotICAgIGludCB1czsKKyAgICBsb25nIHVzOwogCi0gICAgdGltZXQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodGltZXN0YW1wKTsKLSAgICBpZiAodGltZXQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmIChfUHlUaW1lX09iamVjdFRvVGltZXZhbCh0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1ldCwgJnVzLCBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKLSAgICB1cyA9IChpbnQpX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGZyYWN0aW9uICogMWU2KTsKLSAgICBpZiAodXMgPCAwKSB7Ci0gICAgICAgIC8qIFRydW5jYXRpb24gdG93YXJkcyB6ZXJvIGlzIG5vdCB3aGF0IHdlIHdhbnRlZAotICAgICAgICAgICBmb3IgbmVnYXRpdmUgbnVtYmVycyAoUHl0aG9uJ3MgbW9kIHNlbWFudGljcykgKi8KLSAgICAgICAgdGltZXQgLT0gMTsKLSAgICAgICAgdXMgKz0gMTAwMDAwMDsKLSAgICB9Ci0gICAgLyogSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGEKLSAgICAgKiBmdWxsIHNlY29uZCwgcm91bmQgdXAuIE90aGVyd2lzZSwgVmFsdWVFcnJvcnMgYXJlIHJhaXNlZAotICAgICAqIGZvciBzb21lIGZsb2F0cy4gKi8KLSAgICBpZiAodXMgPT0gMTAwMDAwMCkgewotICAgICAgICB0aW1ldCArPSAxOwotICAgICAgICB1cyA9IDA7Ci0gICAgfQotICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCB1cywgdHppbmZvKTsKKworICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCAoaW50KXVzLCB0emluZm8pOwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC00MjA1LDEwICs0MzYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eik7CiAgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0eiAhPSBQeV9Ob25lKSB7CiAgICAgICAgIC8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCi0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKLQotICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0eiwgJlB5SWRfZnJvbXV0YywgIk8iLCBzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0eiwgJlB5SWRfZnJvbXV0YywgIk4iLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00MjI3LDExICs0Mzc5LDExIEBACiBkYXRldGltZV9mcm9tdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgUHlPYmplY3QgKnNlbGY7Ci0gICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqdGltZXN0YW1wOwogICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0aW1lc3RhbXAiLCAidHoiLCBOVUxMfTsKIAotICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImR8Tzpmcm9tdGltZXN0YW1wIiwKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPfE86ZnJvbXRpbWVzdGFtcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCAmdGltZXN0YW1wLCAmdHppbmZvKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKQEAgLTQyNDMsMTAgKzQzOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOwogICAgIGlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKICAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCi0gICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6aW5mbywgJlB5SWRfZnJvbXV0YywgIk8iLCBzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0emluZm8sICZQeUlkX2Zyb211dGMsICJOIiwgc2VsZik7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtNDI1NSwxMCArNDQwNCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqdGltZXN0YW1wOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKICAgICAgICAgcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQyODgsMjcgKzQ0MzcsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9jb21iaW5lKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImRhdGUiLCAidGltZSIsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJkYXRlIiwgInRpbWUiLCAidHppbmZvIiwgTlVMTH07CiAgICAgUHlPYmplY3QgKmRhdGU7CiAgICAgUHlPYmplY3QgKnRpbWU7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPITpjb21iaW5lIiwga2V5d29yZHMsCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hTyF8Tzpjb21iaW5lIiwga2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwgJmRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwgJnRpbWUpKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwotCi0gICAgICAgIGlmIChIQVNUWklORk8odGltZSkpCi0gICAgICAgICAgICB0emluZm8gPSAoKFB5RGF0ZVRpbWVfVGltZSAqKXRpbWUpLT50emluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwgJnRpbWUsICZ0emluZm8pKSB7CisgICAgICAgIGlmICh0emluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKEhBU1RaSU5GTyh0aW1lKSkKKyAgICAgICAgICAgICAgICB0emluZm8gPSAoKFB5RGF0ZVRpbWVfVGltZSAqKXRpbWUpLT50emluZm87CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHppbmZvID0gUHlfTm9uZTsKKyAgICAgICAgfQogICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKGRhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChkYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKGRhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIodGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORCh0aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORCh0aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKGRhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfSE9VUih0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURSh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORCh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIERBVEVfU0VUX0ZPTEQocmVzdWx0LCBUSU1FX0dFVF9GT0xEKHRpbWUpKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQzNzYsNyArNDUzMCw3IEBACiAgICAgZWxzZQogICAgICAgICByZXR1cm4gbmV3X2RhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBU1RaSU5GTyhkYXRlKSA/IGRhdGUtPnR6aW5mbyA6IFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBU1RaSU5GTyhkYXRlKSA/IGRhdGUtPnR6aW5mbyA6IFB5X05vbmUsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDQ2OSw5ICs0NjIzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgICAgICAgaWYgKG9mZmRpZmYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZikpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvZmZkaWZmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUyMSw2ICs0NjczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSk7CiAgICAgfQorICAgIGlmIChiYXNlcmVwciAhPSBOVUxMICYmIERBVEVfR0VUX0ZPTEQoc2VsZikgIT0gMCkKKyAgICAgICAgYmFzZXJlcHIgPSBhcHBlbmRfa2V5d29yZF9mb2xkKGJhc2VyZXByLCBEQVRFX0dFVF9GT0xEKHNlbGYpKTsKICAgICBpZiAoYmFzZXJlcHIgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSkKICAgICAgICAgcmV0dXJuIGJhc2VyZXByOwogICAgIHJldHVybiBhcHBlbmRfa2V5d29yZF90emluZm8oYmFzZXJlcHIsIHNlbGYtPnR6aW5mbyk7CkBAIC00NTM2LDI1ICs0NjkwLDU1IEBACiBkYXRldGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBpbnQgc2VwID0gJ1QnOwotICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJzZXAiLCBOVUxMfTsKKyAgICBjaGFyICp0aW1lc3BlYyA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsICJ0aW1lc3BlYyIsIE5VTEx9OwogICAgIGNoYXIgYnVmZmVyWzEwMF07Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKICAgICBpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBzdGF0aWMgY2hhciAqc3BlY3NbXVsyXSA9IHsKKyAgICAgICAgeyJob3VycyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZCJ9LAorICAgICAgICB7Im1pbnV0ZXMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZCJ9LAorICAgICAgICB7InNlY29uZHMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkIn0sCisgICAgICAgIHsibWlsbGlzZWNvbmRzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZC4lMDNkIn0sCisgICAgICAgIHsibWljcm9zZWNvbmRzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZC4lMDZkIn0sCisgICAgfTsKKyAgICBzaXplX3QgZ2l2ZW5fc3BlYzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifEM6aXNvZm9ybWF0Iiwga2V5d29yZHMsICZzZXApKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifENzOmlzb2Zvcm1hdCIsIGtleXdvcmRzLCAmc2VwLCAmdGltZXNwZWMpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAodXMpCi0gICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQuJTA2ZCIsCisKKyAgICBpZiAodGltZXNwZWMgPT0gTlVMTCB8fCBzdHJjbXAodGltZXNwZWMsICJhdXRvIikgPT0gMCkgeworICAgICAgICBpZiAodXMgPT0gMCkgeworICAgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSA0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGdpdmVuX3NwZWMgPSAwOyBnaXZlbl9zcGVjIDwgUHlfQVJSQVlfTEVOR1RIKHNwZWNzKTsgZ2l2ZW5fc3BlYysrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKHRpbWVzcGVjLCBzcGVjc1tnaXZlbl9zcGVjXVswXSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnaXZlbl9zcGVjID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgdXMgPSB1cyAvIDEwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdpdmVuX3NwZWMgPT0gUHlfQVJSQVlfTEVOR1RIKHNwZWNzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gdGltZXNwZWMgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdChzcGVjc1tnaXZlbl9zcGVjXVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSwgKGludClzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpLCB1cyk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSwgKGludClzZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICB9CiAKICAgICBpZiAoIXJlc3VsdCB8fCAhSEFTVFpJTkZPKHNlbGYpKQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDU4MSw2ICs0NzY1LDcwIEBACiAvKiBNaXNjZWxsYW5lb3VzIG1ldGhvZHMuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCitmbGlwX2ZvbGQoUHlPYmplY3QgKmR0KQoreworICAgIHJldHVybiBuZXdfZGF0ZXRpbWVfZXgyKEdFVF9ZRUFSKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKGR0KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHlEYXRlVGltZV9EYXRlVGltZSAqKWR0KS0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhREFURV9HRVRfRk9MRChkdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShkdCkpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0X2ZsaXBfZm9sZF9vZmZzZXQoUHlPYmplY3QgKmR0KQoreworICAgIFB5T2JqZWN0ICpyZXN1bHQsICpmbGlwX2R0OworCisgICAgZmxpcF9kdCA9IGZsaXBfZm9sZChkdCk7CisgICAgaWYgKGZsaXBfZHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gZGF0ZXRpbWVfdXRjb2Zmc2V0KGZsaXBfZHQsIE5VTEwpOworICAgIFB5X0RFQ1JFRihmbGlwX2R0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBQRVAgNDk1IGV4Y2VwdGlvbjogV2hlbmV2ZXIgb25lIG9yIGJvdGggb2YgdGhlIG9wZXJhbmRzIGluCisgKiBpbnRlci16b25lIGNvbXBhcmlzb24gaXMgc3VjaCB0aGF0IGl0cyB1dGNvZmZzZXQoKSBkZXBlbmRzCisgKiBvbiB0aGUgdmFsdWUgb2YgaXRzIGZvbGQgZm9sZCBhdHRyaWJ1dGUsIHRoZSByZXN1bHQgaXMgRmFsc2UuCisgKgorICogUmV0dXJuIDEgaWYgZXhjZXB0aW9uIGFwcGxpZXMsIDAgaWYgbm90LCAgYW5kIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50CitwZXA0OTVfZXFfZXhjZXB0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvZmZzZXRfc2VsZiwgUHlPYmplY3QgKm9mZnNldF9vdGhlcikKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCAqZmxpcF9vZmZzZXQ7CisKKyAgICBmbGlwX29mZnNldCA9IGdldF9mbGlwX2ZvbGRfb2Zmc2V0KHNlbGYpOworICAgIGlmIChmbGlwX29mZnNldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGZsaXBfb2Zmc2V0ICE9IG9mZnNldF9zZWxmICYmCisgICAgICAgIGRlbHRhX2NtcChmbGlwX29mZnNldCwgb2Zmc2V0X3NlbGYpKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBQeV9ERUNSRUYoZmxpcF9vZmZzZXQpOworCisgICAgZmxpcF9vZmZzZXQgPSBnZXRfZmxpcF9mb2xkX29mZnNldChvdGhlcik7CisgICAgaWYgKGZsaXBfb2Zmc2V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZmxpcF9vZmZzZXQgIT0gb2Zmc2V0X290aGVyICYmCisgICAgICAgIGRlbHRhX2NtcChmbGlwX29mZnNldCwgb2Zmc2V0X290aGVyKSkKKyAgICAgICAgcmVzdWx0ID0gMTsKKyBkb25lOgorICAgIFB5X0RFQ1JFRihmbGlwX29mZnNldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKQEAgLTQ2MjcsNiArNDg3NSwxMyBAQAogICAgICAgICBkaWZmID0gbWVtY21wKCgoUHlEYXRlVGltZV9EYXRlVGltZSAqKXNlbGYpLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICgoUHlEYXRlVGltZV9EYXRlVGltZSAqKW90aGVyKS0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7CisgICAgICAgIGlmICgob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpICYmIGRpZmYgPT0gMCkgeworICAgICAgICAgICAgaW50IGV4ID0gcGVwNDk1X2VxX2V4Y2VwdGlvbihzZWxmLCBvdGhlciwgb2Zmc2V0MSwgb2Zmc2V0Mik7CisgICAgICAgICAgICBpZiAoZXggPT0gLTEpCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgaWYgKGV4KQorICAgICAgICAgICAgICAgIGRpZmYgPSAxOworICAgICAgICB9CiAgICAgICAgIHJlc3VsdCA9IGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CiAgICAgfQogICAgIGVsc2UgaWYgKG9mZnNldDEgIT0gUHlfTm9uZSAmJiBvZmZzZXQyICE9IFB5X05vbmUpIHsKQEAgLTQ2NDIsNiArNDg5NywxMyBAQAogICAgICAgICAgICAgZGlmZiA9IEdFVF9URF9TRUNPTkRTKGRlbHRhKSB8CiAgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhkZWx0YSk7CiAgICAgICAgIFB5X0RFQ1JFRihkZWx0YSk7CisgICAgICAgIGlmICgob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpICYmIGRpZmYgPT0gMCkgeworICAgICAgICAgICAgaW50IGV4ID0gcGVwNDk1X2VxX2V4Y2VwdGlvbihzZWxmLCBvdGhlciwgb2Zmc2V0MSwgb2Zmc2V0Mik7CisgICAgICAgICAgICBpZiAoZXggPT0gLTEpCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgaWYgKGV4KQorICAgICAgICAgICAgICAgIGRpZmYgPSAxOworICAgICAgICB9CiAgICAgICAgIHJlc3VsdCA9IGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CiAgICAgfQogICAgIGVsc2UgaWYgKG9wID09IFB5X0VRKSB7CkBAIC00NjY3LDkgKzQ5MjksMjYgQEAKIGRhdGV0aW1lX2hhc2goUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLSAgICAgICAgUHlPYmplY3QgKm9mZnNldDsKLQotICAgICAgICBvZmZzZXQgPSBkYXRldGltZV91dGNvZmZzZXQoKFB5T2JqZWN0ICopc2VsZiwgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICpvZmZzZXQsICpzZWxmMDsKKyAgICAgICAgaWYgKERBVEVfR0VUX0ZPTEQoc2VsZikpIHsKKyAgICAgICAgICAgIHNlbGYwID0gbmV3X2RhdGV0aW1lX2V4MihHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBQeV9UWVBFKHNlbGYpKTsKKyAgICAgICAgICAgIGlmIChzZWxmMCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYwID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmMCk7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ID0gZGF0ZXRpbWVfdXRjb2Zmc2V0KHNlbGYwLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYwKTsKIAogICAgICAgICBpZiAob2Zmc2V0ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC00NzIzLDc2ICs1MDAyLDc4IEBACiAgICAgaW50IHNzID0gREFURV9HRVRfU0VDT05EKHNlbGYpOwogICAgIGludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOwogICAgIFB5T2JqZWN0ICp0emluZm8gPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOworICAgIGludCBmb2xkID0gREFURV9HRVRfRk9MRChzZWxmKTsKIAotICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpaWlpTzpyZXBsYWNlIiwKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpaWlpaU8kaTpyZXBsYWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfa3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0emluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvLCAmZm9sZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaU8iLCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY2xvbmUgPSBkYXRldGltZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOworCisgICAgaWYgKGNsb25lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZvbGQgIT0gMCAmJiBmb2xkICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xkIG11c3QgYmUgZWl0aGVyIDAgb3IgMSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgREFURV9TRVRfRk9MRChjbG9uZSwgZm9sZCk7CisgICAgfQogICAgIFB5X0RFQ1JFRih0dXBsZSk7CiAgICAgcmV0dXJuIGNsb25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotbG9jYWxfdGltZXpvbmUoUHlEYXRlVGltZV9EYXRlVGltZSAqdXRjX3RpbWUpCitsb2NhbF90aW1lem9uZV9mcm9tX3RpbWVzdGFtcCh0aW1lX3QgdGltZXN0YW1wKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotICAgIHN0cnVjdCB0bSAqdGltZXA7Ci0gICAgdGltZV90IHRpbWVzdGFtcDsKICAgICBQeU9iamVjdCAqZGVsdGE7Ci0gICAgUHlPYmplY3QgKm9uZV9zZWNvbmQ7Ci0gICAgUHlPYmplY3QgKnNlY29uZHM7CisgICAgc3RydWN0IHRtICpsb2NhbF90aW1lX3RtOwogICAgIFB5T2JqZWN0ICpuYW1lbyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqem9uZSA9IE5VTEw7CiAKLSAgICBkZWx0YSA9IG5ld19kZWx0YSh5bWRfdG9fb3JkKEdFVF9ZRUFSKHV0Y190aW1lKSwgR0VUX01PTlRIKHV0Y190aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkodXRjX3RpbWUpKSAtIDcxOTE2MywKLSAgICAgICAgICAgICAgICAgICAgICA2MCAqICg2MCAqIERBVEVfR0VUX0hPVVIodXRjX3RpbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUodXRjX3RpbWUpKSArCi0gICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHV0Y190aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICBpZiAoZGVsdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb25lX3NlY29uZCA9IG5ld19kZWx0YSgwLCAxLCAwLCAwKTsKLSAgICBpZiAob25lX3NlY29uZCA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHNlY29uZHMgPSBkaXZpZGVfdGltZWRlbHRhX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EZWx0YSAqKWRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKW9uZV9zZWNvbmQpOwotICAgIFB5X0RFQ1JFRihvbmVfc2Vjb25kKTsKLSAgICBpZiAoc2Vjb25kcyA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIFB5X0RFQ1JFRihkZWx0YSk7Ci0gICAgdGltZXN0YW1wID0gUHlMb25nX0FzTG9uZyhzZWNvbmRzKTsKLSAgICBQeV9ERUNSRUYoc2Vjb25kcyk7Ci0gICAgaWYgKHRpbWVzdGFtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB0aW1lcCA9IGxvY2FsdGltZSgmdGltZXN0YW1wKTsKKyAgICBsb2NhbF90aW1lX3RtID0gbG9jYWx0aW1lKCZ0aW1lc3RhbXApOwogI2lmZGVmIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUKLSAgICB6b25lID0gdGltZXAtPnRtX3pvbmU7Ci0gICAgZGVsdGEgPSBuZXdfZGVsdGEoMCwgdGltZXAtPnRtX2dtdG9mZiwgMCwgMSk7CisgICAgem9uZSA9IGxvY2FsX3RpbWVfdG0tPnRtX3pvbmU7CisgICAgZGVsdGEgPSBuZXdfZGVsdGEoMCwgbG9jYWxfdGltZV90bS0+dG1fZ210b2ZmLCAwLCAxKTsKICNlbHNlIC8qIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUgKi8KICAgICB7Ci0gICAgICAgIFB5T2JqZWN0ICpsb2NhbF90aW1lOwotICAgICAgICBsb2NhbF90aW1lID0gbmV3X2RhdGV0aW1lKHRpbWVwLT50bV95ZWFyICsgMTkwMCwgdGltZXAtPnRtX21vbiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXAtPnRtX21kYXksIHRpbWVwLT50bV9ob3VyLCB0aW1lcC0+dG1fbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVwLT50bV9zZWMsIERBVEVfR0VUX01JQ1JPU0VDT05EKHV0Y190aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGNfdGltZS0+dHppbmZvKTsKLSAgICAgICAgaWYgKGxvY2FsX3RpbWUgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIGRlbHRhID0gZGF0ZXRpbWVfc3VidHJhY3QobG9jYWxfdGltZSwgKFB5T2JqZWN0Kil1dGNfdGltZSk7Ci0gICAgICAgIC8qIFhYWDogYmVmb3JlIHJlbHlpbmcgb24gdHpuYW1lLCB3ZSBzaG91bGQgY29tcGFyZSBkZWx0YQotICAgICAgICAgICB0byB0aGUgb2Zmc2V0IGltcGxpZWQgYnkgdGltZXpvbmUvYWx0em9uZSAqLwotICAgICAgICBpZiAoZGF5bGlnaHQgJiYgdGltZXAtPnRtX2lzZHN0ID49IDApCi0gICAgICAgICAgICB6b25lID0gdHpuYW1lW3RpbWVwLT50bV9pc2RzdCAlIDJdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB6b25lID0gdHpuYW1lWzBdOworICAgICAgICBQeU9iamVjdCAqbG9jYWxfdGltZSwgKnV0Y190aW1lOworICAgICAgICBzdHJ1Y3QgdG0gKnV0Y190aW1lX3RtOworICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJVoiLCBsb2NhbF90aW1lX3RtKTsKKyAgICAgICAgem9uZSA9IGJ1ZjsKKyAgICAgICAgbG9jYWxfdGltZSA9IG5ld19kYXRldGltZShsb2NhbF90aW1lX3RtLT50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lX3RtLT50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3RpbWVfdG0tPnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZV90bS0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF90aW1lX3RtLT50bV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfdGltZV90bS0+dG1fc2VjLCAwLCBQeV9Ob25lLCAwKTsKKyAgICAgICAgaWYgKGxvY2FsX3RpbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdXRjX3RpbWVfdG0gPSBnbXRpbWUoJnRpbWVzdGFtcCk7CisgICAgICAgIHV0Y190aW1lID0gbmV3X2RhdGV0aW1lKHV0Y190aW1lX3RtLT50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjX3RpbWVfdG0tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Y190aW1lX3RtLT50bV9tZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGNfdGltZV90bS0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjX3RpbWVfdG0tPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjX3RpbWVfdG0tPnRtX3NlYywgMCwgUHlfTm9uZSwgMCk7CisgICAgICAgIGlmICh1dGNfdGltZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobG9jYWxfdGltZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkZWx0YSA9IGRhdGV0aW1lX3N1YnRyYWN0KGxvY2FsX3RpbWUsIHV0Y190aW1lKTsKICAgICAgICAgUHlfREVDUkVGKGxvY2FsX3RpbWUpOworICAgICAgICBQeV9ERUNSRUYodXRjX3RpbWUpOwogICAgIH0KICNlbmRpZiAvKiBIQVZFX1NUUlVDVF9UTV9UTV9aT05FICovCisgICAgaWYgKGRlbHRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBpZiAoem9uZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWVvID0gUHlVbmljb2RlX0RlY29kZUxvY2FsZSh6b25lLCAic3Vycm9nYXRlZXNjYXBlIik7CiAgICAgICAgIGlmIChuYW1lbyA9PSBOVUxMKQpAQCAtNDgwNSwxMiArNTA4Niw2NSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitsb2NhbF90aW1lem9uZShQeURhdGVUaW1lX0RhdGVUaW1lICp1dGNfdGltZSkKK3sKKyAgICB0aW1lX3QgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICpkZWx0YTsKKyAgICBQeU9iamVjdCAqb25lX3NlY29uZDsKKyAgICBQeU9iamVjdCAqc2Vjb25kczsKKworICAgIGRlbHRhID0gZGF0ZXRpbWVfc3VidHJhY3QoKFB5T2JqZWN0ICopdXRjX3RpbWUsIFB5RGF0ZVRpbWVfRXBvY2gpOworICAgIGlmIChkZWx0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbmVfc2Vjb25kID0gbmV3X2RlbHRhKDAsIDEsIDAsIDApOworICAgIGlmIChvbmVfc2Vjb25kID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRlbHRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlY29uZHMgPSBkaXZpZGVfdGltZWRlbHRhX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EZWx0YSAqKWRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKW9uZV9zZWNvbmQpOworICAgIFB5X0RFQ1JFRihvbmVfc2Vjb25kKTsKKyAgICBQeV9ERUNSRUYoZGVsdGEpOworICAgIGlmIChzZWNvbmRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRpbWVzdGFtcCA9IF9QeUxvbmdfQXNUaW1lX3Qoc2Vjb25kcyk7CisgICAgUHlfREVDUkVGKHNlY29uZHMpOworICAgIGlmICh0aW1lc3RhbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGxvY2FsX3RpbWV6b25lX2Zyb21fdGltZXN0YW1wKHRpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBsb25nIGxvbmcKK2xvY2FsX3RvX3NlY29uZHMoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSwKKyAgICAgICAgICAgICAgICAgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCBmb2xkKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK2xvY2FsX3RpbWV6b25lX2Zyb21fbG9jYWwoUHlEYXRlVGltZV9EYXRlVGltZSAqbG9jYWxfZHQpCit7CisgICAgbG9uZyBsb25nIHNlY29uZHM7CisgICAgdGltZV90IHRpbWVzdGFtcDsKKyAgICBzZWNvbmRzID0gbG9jYWxfdG9fc2Vjb25kcyhHRVRfWUVBUihsb2NhbF9kdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKGxvY2FsX2R0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKGxvY2FsX2R0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKGxvY2FsX2R0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUobG9jYWxfZHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChsb2NhbF9kdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfRk9MRChsb2NhbF9kdCkpOworICAgIGlmIChzZWNvbmRzID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFg6IGFkZCBib3VuZHMgY2hlY2sgKi8KKyAgICB0aW1lc3RhbXAgPSBzZWNvbmRzIC0gZXBvY2g7CisgICAgcmV0dXJuIGxvY2FsX3RpbWV6b25lX2Zyb21fdGltZXN0YW1wKHRpbWVzdGFtcCk7Cit9CisKIHN0YXRpYyBQeURhdGVUaW1lX0RhdGVUaW1lICoKIGRhdGV0aW1lX2FzdGltZXpvbmUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBQeURhdGVUaW1lX0RhdGVUaW1lICpyZXN1bHQ7CiAgICAgUHlPYmplY3QgKm9mZnNldDsKICAgICBQeU9iamVjdCAqdGVtcDsKKyAgICBQeU9iamVjdCAqc2VsZl90emluZm87CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InR6IiwgTlVMTH07CiAKQEAgLTQ4MjEsMjcgKzUxNTUsMjcgQEAKICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKCFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCi0gICAgICAgIGdvdG8gTmVlZEF3YXJlOworICAgIGlmICghSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKSB7CisgICAgICAgIHNlbGZfdHppbmZvID0gbG9jYWxfdGltZXpvbmVfZnJvbV9sb2NhbChzZWxmKTsKKyAgICAgICAgaWYgKHNlbGZfdHppbmZvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWxmX3R6aW5mbyA9IHNlbGYtPnR6aW5mbzsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGZfdHppbmZvKTsKKyAgICB9CiAKICAgICAvKiBDb252ZXJzaW9uIHRvIHNlbGYncyBvd24gdGltZSB6b25lIGlzIGEgTk9QLiAqLwotICAgIGlmIChzZWxmLT50emluZm8gPT0gdHppbmZvKSB7CisgICAgaWYgKHNlbGZfdHppbmZvID09IHR6aW5mbykgeworICAgICAgICBQeV9ERUNSRUYoc2VsZl90emluZm8pOwogICAgICAgICBQeV9JTkNSRUYoc2VsZik7CiAgICAgICAgIHJldHVybiBzZWxmOwogICAgIH0KIAogICAgIC8qIENvbnZlcnQgc2VsZiB0byBVVEMuICovCi0gICAgb2Zmc2V0ID0gZGF0ZXRpbWVfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIE5VTEwpOworICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGZfdHppbmZvLCAoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9ERUNSRUYoc2VsZl90emluZm8pOwogICAgIGlmIChvZmZzZXQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKG9mZnNldCA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihvZmZzZXQpOwotICAgICAgTmVlZEF3YXJlOgotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFzdGltZXpvbmUoKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYSBuYWl2ZSBkYXRldGltZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICAgICAvKiByZXN1bHQgPSBzZWxmIC0gb2Zmc2V0ICovCiAgICAgcmVzdWx0ID0gKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCwgLTEpOwpAQCAtNDg0OSw2ICs1MTgzLDMyIEBACiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIC8qIE1ha2Ugc3VyZSByZXN1bHQgaXMgYXdhcmUgYW5kIFVUQy4gKi8KKyAgICBpZiAoIUhBU1RaSU5GTyhyZXN1bHQpKSB7CisgICAgICAgIHRlbXAgPSAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IChQeURhdGVUaW1lX0RhdGVUaW1lICopCisgICAgICAgICAgICAgICAgICAgbmV3X2RhdGV0aW1lX2V4MihHRVRfWUVBUihyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfRk9MRChyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShyZXN1bHQpKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFJlc3VsdCBpcyBhbHJlYWR5IGF3YXJlIC0ganVzdCByZXBsYWNlIHR6aW5mby4gKi8KKyAgICAgICAgdGVtcCA9IHJlc3VsdC0+dHppbmZvOworICAgICAgICByZXN1bHQtPnR6aW5mbyA9IFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0LT50emluZm8pOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorCiAgICAgLyogQXR0YWNoIG5ldyB0emluZm8gYW5kIGxldCBmcm9tdXRjKCkgZG8gdGhlIHJlc3QuICovCiAgICAgdGVtcCA9IHJlc3VsdC0+dHppbmZvOwogICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkgewpAQCAtNDg5Niw2ICs1MjU2LDU2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGZsYWcpOwogfQogCitzdGF0aWMgbG9uZyBsb25nCitsb2NhbF90b19zZWNvbmRzKGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksCisgICAgICAgICAgICAgICAgIGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgZm9sZCkKK3sKKyAgICBsb25nIGxvbmcgdCwgYSwgYiwgdTEsIHUyLCB0MSwgdDIsIGx0OworICAgIHQgPSB1dGNfdG9fc2Vjb25kcyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCk7CisgICAgLyogT3VyIGdvYWwgaXMgdG8gc29sdmUgdCA9IGxvY2FsKHUpIGZvciB1LiAqLworICAgIGx0ID0gbG9jYWwodCk7CisgICAgaWYgKGx0ID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYSA9IGx0IC0gdDsKKyAgICB1MSA9IHQgLSBhOworICAgIHQxID0gbG9jYWwodTEpOworICAgIGlmICh0MSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh0MSA9PSB0KSB7CisgICAgICAgIC8qIFdlIGZvdW5kIG9uZSBzb2x1dGlvbiwgYnV0IGl0IG1heSBub3QgYmUgdGhlIG9uZSB3ZSBuZWVkLgorICAgICAgICAgKiBMb29rIGZvciBhbiBlYXJsaWVyIHNvbHV0aW9uIChpZiBgZm9sZGAgaXMgMCksIG9yIGEKKyAgICAgICAgICogbGF0ZXIgb25lIChpZiBgZm9sZGAgaXMgMSkuICovCisgICAgICAgIGlmIChmb2xkKQorICAgICAgICAgICAgdTIgPSB1MSArIG1heF9mb2xkX3NlY29uZHM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHUyID0gdTEgLSBtYXhfZm9sZF9zZWNvbmRzOworICAgICAgICBsdCA9IGxvY2FsKHUyKTsKKyAgICAgICAgaWYgKGx0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBiID0gbHQgLSB1MjsKKyAgICAgICAgaWYgKGEgPT0gYikKKyAgICAgICAgICAgIHJldHVybiB1MTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGIgPSB0MSAtIHUxOworICAgICAgICBhc3NlcnQoYSAhPSBiKTsKKyAgICB9CisgICAgdTIgPSB0IC0gYjsKKyAgICB0MiA9IGxvY2FsKHUyKTsKKyAgICBpZiAodDIgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodDIgPT0gdCkKKyAgICAgICAgcmV0dXJuIHUyOworICAgIGlmICh0MSA9PSB0KQorICAgICAgICByZXR1cm4gdTE7CisgICAgLyogV2UgaGF2ZSBmb3VuZCBib3RoIG9mZnNldHMgYSBhbmQgYiwgYnV0IG5laXRoZXIgdCAtIGEgbm9yIHQgLSBiIGlzCisgICAgICogYSBzb2x1dGlvbi4gIFRoaXMgbWVhbnMgdCBpcyBpbiB0aGUgZ2FwLiAqLworICAgIHJldHVybiBmb2xkP1B5X01JTih1MSwgdTIpOlB5X01BWCh1MSwgdTIpOworfQorCisvKiBkYXRlKDE5NzAsMSwxKS50b29yZGluYWwoKSA9PSA3MTkxNjMgKi8KKyNkZWZpbmUgRVBPQ0hfU0VDT05EUyAoNzE5MTYzTEwgKiAyNCAqIDYwICogNjApCisKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV90aW1lc3RhbXAoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKQEAgLTQ5MTAsMzMgKzUzMjAsMTggQEAKICAgICAgICAgUHlfREVDUkVGKGRlbHRhKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHN0cnVjdCB0bSB0aW1lOwotICAgICAgICB0aW1lX3QgdGltZXN0YW1wOwotICAgICAgICBtZW1zZXQoKHZvaWQgKikgJnRpbWUsICdcMCcsIHNpemVvZihzdHJ1Y3QgdG0pKTsKLSAgICAgICAgdGltZS50bV95ZWFyID0gR0VUX1lFQVIoc2VsZikgLSAxOTAwOwotICAgICAgICB0aW1lLnRtX21vbiA9IEdFVF9NT05USChzZWxmKSAtIDE7Ci0gICAgICAgIHRpbWUudG1fbWRheSA9IEdFVF9EQVkoc2VsZik7Ci0gICAgICAgIHRpbWUudG1faG91ciA9IERBVEVfR0VUX0hPVVIoc2VsZik7Ci0gICAgICAgIHRpbWUudG1fbWluID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOwotICAgICAgICB0aW1lLnRtX3NlYyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLSAgICAgICAgdGltZS50bV93ZGF5ID0gLTE7Ci0gICAgICAgIHRpbWUudG1faXNkc3QgPSAtMTsKLSAgICAgICAgdGltZXN0YW1wID0gbWt0aW1lKCZ0aW1lKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcCA9PSAodGltZV90KSgtMSkKLSNpZm5kZWYgX0FJWAotICAgICAgICAgICAgLyogUmV0dXJuIHZhbHVlIG9mIC0xIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gYW4gZXJyb3IsCi0gICAgICAgICAgICAgKiBidXQgdG1fd2RheSBjYW5ub3QgcmVtYWluIHNldCB0byAtMSBpZiBta3RpbWUgc3VjY2VlZGVkLiAqLwotICAgICAgICAgICAgJiYgdGltZS50bV93ZGF5ID09IC0xCi0jZWxzZQotICAgICAgICAgICAgLyogb24gQUlYLCB0bV93ZGF5IGlzIGFsd2F5cyBzZXRzLCBldmVuIG9uIGVycm9yICovCi0jZW5kaWYKLSAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIGxvbmcgbG9uZyBzZWNvbmRzOworICAgICAgICBzZWNvbmRzID0gbG9jYWxfdG9fc2Vjb25kcyhHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfRk9MRChzZWxmKSk7CisgICAgICAgIGlmIChzZWNvbmRzID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHRpbWVzdGFtcCArIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpIC8gMWU2KTsKKyAgICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNlY29uZHMgLSBFUE9DSF9TRUNPTkRTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpIC8gMWU2KTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTQ5NTYsNyArNTM1MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0ZPTEQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDk2Niw3ICs1MzYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICBHRVRfRFRfVFpJTkZPKHNlbGYpKTsKKyAgICAgICAgICAgICAgICAgICAgR0VUX0RUX1RaSU5GTyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfRk9MRChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01MDE4LDcgKzU0MTUsNyBAQAogICogX19nZXRzdGF0ZV9fIGlzbid0IGV4cG9zZWQuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1kYXRldGltZV9nZXRzdGF0ZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQorZGF0ZXRpbWVfZ2V0c3RhdGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgaW50IHByb3RvKQogewogICAgIFB5T2JqZWN0ICpiYXNlc3RhdGU7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CkBAIC01MDI2LDYgKzU0MjMsOSBAQAogICAgIGJhc2VzdGF0ZSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKICAgICBpZiAoYmFzZXN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByb3RvID4gMyAmJiBEQVRFX0dFVF9GT0xEKHNlbGYpKQorICAgICAgICAgICAgLyogU2V0IHRoZSBmaXJzdCBiaXQgb2YgdGhlIHRoaXJkIGJ5dGUgKi8KKyAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGJhc2VzdGF0ZSlbMl0gfD0gKDEgPDwgNyk7CiAgICAgICAgIGlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKICAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOwogICAgICAgICBlbHNlCkBAIC01MDM2LDkgKzU0MzYsMTMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRhdGV0aW1lX3JlZHVjZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJnKQorZGF0ZXRpbWVfcmVkdWNlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgZGF0ZXRpbWVfZ2V0c3RhdGUoc2VsZikpOworICAgIGludCBwcm90byA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9leF9fIiwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGRhdGV0aW1lX2dldHN0YXRlKHNlbGYsIHByb3RvKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYXRldGltZV9tZXRob2RzW10gPSB7CkBAIC01MDkzLDkgKzU0OTcsMTIgQEAKIAogICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfaXNvZm9ybWF0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoIltzZXBdIC0+IHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsICIKLSAgICAgICAgICAgICAgICJZWVlZLU1NLUREVEhIOk1NOlNTWy5tbW1tbW1dWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJZWVlZLU1NLUREVFtISFs6TU1bOlNTWy5tbW1bdXV1XV1dXV1bK0hIOk1NXS5cbiIKICAgICAgICAgICAgICAgICJzZXAgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUgeWVhciBmcm9tIHRoZSB0aW1lLCBhbmQgIgotICAgICAgICAgICAgICAgImRlZmF1bHRzIHRvICdUJy4iKX0sCisgICAgICAgICAgICAgICAiZGVmYXVsdHMgdG8gJ1QnLlxuIgorICAgICAgICAgICAgICAgInRpbWVzcGVjIHNwZWNpZmllcyB3aGF0IGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSIKKyAgICAgICAgICAgICAgICIgKGFsbG93ZWQgdmFsdWVzIGFyZSAnYXV0bycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnLCIKKyAgICAgICAgICAgICAgICIgJ21pbGxpc2Vjb25kcycsIGFuZCAnbWljcm9zZWNvbmRzJykuXG4iKX0sCiAKICAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNvZmZzZXQsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LApAQCAtNTExMiwxMyArNTUxOSwxMyBAQAogICAgIHsiYXN0aW1lem9uZSIsICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfYXN0aW1lem9uZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJ0eiAtPiBjb252ZXJ0IHRvIGxvY2FsIHRpbWUgaW4gbmV3IHRpbWV6b25lIHR6XG4iKX0sCiAKLSAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCi0gICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX2V4X18iLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX2V4X18ocHJvdG8pIC0+IChjbHMsIHN0YXRlKSIpfSwKIAogICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBkYXRldGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRldGltZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXlbLCBob3VyWywgbWludXRlWywgc2Vjb25kWywgbWljcm9zZWNvbmRbLHR6aW5mb11dXV1dKVxuXAogXG5cCiBUaGUgeWVhciwgbW9udGggYW5kIGRheSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuXG5cCkBAIC01MjAxLDcgKzU2MDgsOSBAQAogICAgIG5ld190aW1lX2V4LAogICAgIG5ld19kZWx0YV9leCwKICAgICBkYXRldGltZV9mcm9tdGltZXN0YW1wLAotICAgIGRhdGVfZnJvbXRpbWVzdGFtcAorICAgIGRhdGVfZnJvbXRpbWVzdGFtcCwKKyAgICBuZXdfZGF0ZXRpbWVfZXgyLAorICAgIG5ld190aW1lX2V4MgogfTsKIAogCkBAIC01MjgyLDEyICs1NjkxLDEyIEBACiAgICAgLyogdGltZSB2YWx1ZXMgKi8KICAgICBkID0gUHlEYXRlVGltZV9UaW1lVHlwZS50cF9kaWN0OwogCi0gICAgeCA9IG5ld190aW1lKDAsIDAsIDAsIDAsIFB5X05vbmUpOworICAgIHggPSBuZXdfdGltZSgwLCAwLCAwLCAwLCBQeV9Ob25lLCAwKTsKICAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X0RFQ1JFRih4KTsKIAotICAgIHggPSBuZXdfdGltZSgyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOworICAgIHggPSBuZXdfdGltZSgyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUsIDApOwogICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfREVDUkVGKHgpOwpAQCAtNTMwMCwxMiArNTcwOSwxMiBAQAogICAgIC8qIGRhdGV0aW1lIHZhbHVlcyAqLwogICAgIGQgPSBQeURhdGVUaW1lX0RhdGVUaW1lVHlwZS50cF9kaWN0OwogCi0gICAgeCA9IG5ld19kYXRldGltZSgxLCAxLCAxLCAwLCAwLCAwLCAwLCBQeV9Ob25lKTsKKyAgICB4ID0gbmV3X2RhdGV0aW1lKDEsIDEsIDEsIDAsIDAsIDAsIDAsIFB5X05vbmUsIDApOwogICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfREVDUkVGKHgpOwogCi0gICAgeCA9IG5ld19kYXRldGltZShNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSk7CisgICAgeCA9IG5ld19kYXRldGltZShNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSwgMCk7CiAgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9ERUNSRUYoeCk7CkBAIC01MzQ3LDcgKzU3NTYsNyBAQAogCiAgICAgLyogRXBvY2ggKi8KICAgICBQeURhdGVUaW1lX0Vwb2NoID0gbmV3X2RhdGV0aW1lKDE5NzAsIDEsIDEsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeURhdGVUaW1lX1RpbWVab25lX1VUQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeURhdGVUaW1lX1RpbWVab25lX1VUQywgMCk7CiAgICAgaWYgKFB5RGF0ZVRpbWVfRXBvY2ggPT0gTlVMTCkKICAgICAgIHJldHVybiBOVUxMOwogCkBAIC01MzgyLDE5ICs1NzkxLDE5IEBACiAgICAgLyogQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tCiAgICAgICogcGFzdGluZyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0WSA9PSA0ICogMzY1ICsgMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJNFkgPT0gNCAqIDM2NSArIDEpOwogICAgIGFzc2VydChESTRZID09IGRheXNfYmVmb3JlX3llYXIoNCsxKSk7CiAKICAgICAvKiBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkCiAgICAgICogZ2V0IGZyb20gcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKICAgICBhc3NlcnQoREk0MDBZID09IGRheXNfYmVmb3JlX3llYXIoNDAwKzEpKTsKIAogICAgIC8qIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb20KICAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOwogICAgIGFzc2VydChESTEwMFkgPT0gZGF5c19iZWZvcmVfeWVhcigxMDArMSkpOwogCiAgICAgb25lID0gUHlMb25nX0Zyb21Mb25nKDEpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwppbmRleCBlYTg3OTBiLi44MDQ5NzhhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwpAQCAtMTQsMTYgKzE0LDE2IEBACiAgKi8KICNpZiBkZWZpbmVkKEhBVkVfTkRCTV9IKQogI2luY2x1ZGUgPG5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLwogI2VsaWYgZGVmaW5lZChIQVZFX0dEQk1fTkRCTV9IKQogI2luY2x1ZGUgPGdkYm0vbmRibS5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJHTlUgZ2RibSI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJHTlUgZ2RibSI7CiAjZWxpZiBkZWZpbmVkKEhBVkVfR0RCTV9EQVNIX05EQk1fSCkKICNpbmNsdWRlIDxnZGJtLW5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOwogI2VsaWYgZGVmaW5lZChIQVZFX0JFUktEQl9IKQogI2luY2x1ZGUgPGRiLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkJlcmtlbGV5IERCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkJlcmtlbGV5IERCIjsKICNlbHNlCiAjZXJyb3IgIk5vIG5kYm0uaCBhdmFpbGFibGUhIgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMgYi9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKaW5kZXggZTE1OTQxYS4uM2JhOGUzNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSAiZG9jc3RyaW5ncy5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgogCiAKICNpZiAhZGVmaW5lZChNUERfVkVSU0lPTl9IRVgpIHx8IE1QRF9WRVJTSU9OX0hFWCA8IDB4MDIwNDAxMDAKQEAgLTMzOTQsNiArMzM5MywxMDUgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHB5bG9uZzsKIH0KIAorLyogQ29udmVydCBhIERlY2ltYWwgdG8gaXRzIGV4YWN0IGludGVnZXIgcmF0aW8gcmVwcmVzZW50YXRpb24uICovCitzdGF0aWMgUHlPYmplY3QgKgorZGVjX2FzX2ludGVnZXJfcmF0aW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzIFVOVVNFRCkKK3sKKyAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpleHBvbmVudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBtcGRfc3NpemVfdCBleHA7CisgICAgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgdWludDMyX3Qgc3RhdHVzID0gMDsKKworICAgIGlmIChtcGRfaXNzcGVjaWFsKE1QRChzZWxmKSkpIHsKKyAgICAgICAgaWYgKG1wZF9pc25hbihNUEQoc2VsZikpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ1VSUkVOVF9DT05URVhUKGNvbnRleHQpOworCisgICAgdG1wID0gZGVjX2FsbG9jKCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbXBkX3Fjb3B5KE1QRCh0bXApLCBNUEQoc2VsZiksICZzdGF0dXMpKSB7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBleHAgPSBtcGRfaXN6ZXJvKE1QRCh0bXApKSA/IDAgOiBNUEQodG1wKS0+ZXhwOworICAgIE1QRCh0bXApLT5leHAgPSAwOworCisgICAgLyogY29udGV4dCBhbmQgcm91bmRpbmcgYXJlIHVudXNlZCBoZXJlOiB0aGUgY29udmVyc2lvbiBpcyBleGFjdCAqLworICAgIG51bWVyYXRvciA9IGRlY19hc19sb25nKHRtcCwgY29udGV4dCwgTVBEX1JPVU5EX0ZMT09SKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBleHBvbmVudCA9IFB5TG9uZ19Gcm9tU3NpemVfdChleHAgPCAwID8gLWV4cCA6IGV4cCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB0bXAgPSBQeUxvbmdfRnJvbUxvbmcoMTApOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIFB5X1NFVFJFRihleHBvbmVudCwgX3B5X2xvbmdfcG93ZXIodG1wLCBleHBvbmVudCwgUHlfTm9uZSkpOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIGlmIChleHBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGV4cCA+PSAwKSB7CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsIF9weV9sb25nX211bHRpcGx5KG51bWVyYXRvciwgZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOworICAgICAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVub21pbmF0b3IgPSBleHBvbmVudDsKKyAgICAgICAgZXhwb25lbnQgPSBOVUxMOworICAgICAgICB0bXAgPSBfUHlMb25nX0dDRChudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsIF9weV9sb25nX2Zsb29yX2RpdmlkZShudW1lcmF0b3IsIHRtcCkpOworICAgICAgICBQeV9TRVRSRUYoZGVub21pbmF0b3IsIF9weV9sb25nX2Zsb29yX2RpdmlkZShkZW5vbWluYXRvciwgdG1wKSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwgfHwgZGVub21pbmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGV4cG9uZW50KTsKKyAgICBQeV9YREVDUkVGKGRlbm9taW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKG51bWVyYXRvcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIFB5RGVjX1RvSW50ZWdyYWxWYWx1ZShQeU9iamVjdCAqZGVjLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC00NzAyLDYgKzQ4MDAsNyBAQAogICAvKiBNaXNjZWxsYW5lb3VzICovCiAgIHsgImZyb21fZmxvYXQiLCBkZWNfZnJvbV9mbG9hdCwgTUVUSF9PfE1FVEhfQ0xBU1MsIGRvY19mcm9tX2Zsb2F0IH0sCiAgIHsgImFzX3R1cGxlIiwgUHlEZWNfQXNUdXBsZSwgTUVUSF9OT0FSR1MsIGRvY19hc190dXBsZSB9LAorICB7ICJhc19pbnRlZ2VyX3JhdGlvIiwgZGVjX2FzX2ludGVnZXJfcmF0aW8sIE1FVEhfTk9BUkdTLCBkb2NfYXNfaW50ZWdlcl9yYXRpbyB9LAogCiAgIC8qIFNwZWNpYWwgbWV0aG9kcyAqLwogICB7ICJfX2NvcHlfXyIsIGRlY19jb3B5LCBNRVRIX05PQVJHUywgTlVMTCB9LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9kb2NzdHJpbmdzLmggYi9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaAppbmRleCA3MTAyOWE5Li5mN2ZkNmU3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaAorKysgYi9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaApAQCAtNzAsNiArNzAsMTUgQEAKIFJldHVybiBhIHR1cGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuXG5cCiBcbiIpOwogCitQeURvY19TVFJWQVIoZG9jX2FzX2ludGVnZXJfcmF0aW8sCisiYXNfaW50ZWdlcl9yYXRpbygkc2VsZiwgLylcbi0tXG5cblwKK0RlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpIC0+IChpbnQsIGludClcblwKK1xuXAorUmV0dXJuIGEgcGFpciBvZiBpbnRlZ2Vycywgd2hvc2UgcmF0aW8gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgb3JpZ2luYWxcblwKK0RlY2ltYWwgYW5kIHdpdGggYSBwb3NpdGl2ZSBkZW5vbWluYXRvci4gVGhlIHJhdGlvIGlzIGluIGxvd2VzdCB0ZXJtcy5cblwKK1JhaXNlIE92ZXJmbG93RXJyb3Igb24gaW5maW5pdGllcyBhbmQgYSBWYWx1ZUVycm9yIG9uIE5hTnMuXG5cCitcbiIpOworCiBQeURvY19TVFJWQVIoZG9jX2Nhbm9uaWNhbCwKICJjYW5vbmljYWwoJHNlbGYsIC8pXG4tLVxuXG5cCiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBlbmNvZGluZyBvZiB0aGUgYXJndW1lbnQuICBDdXJyZW50bHksIHRoZSBlbmNvZGluZ1xuXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvYmFzZWFyaXRoLmMKaW5kZXggMzVkZTZiOC4uZGZlMTUyMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAiYmFzZWFyaXRoLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYwppbmRleCBhNDVhNDI5Li4zYWFkZmIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2lvLmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAjaW5jbHVkZSAiYml0cy5oIgogI2luY2x1ZGUgImNvbnN0YW50cy5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgogI2luY2x1ZGUgImlvLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5jCmluZGV4IDBmNDFmZTUuLmE4NTRlMDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYwpAQCAtMzAsNyArMzAsMTIgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgIm1wYWxsb2MuaCIKKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MjMyKQorI2VuZGlmCiAKIAogLyogR3VhcmFudGVlZCBtaW5pbXVtIGFsbG9jYXRpb24gZm9yIGEgY29lZmZpY2llbnQuIE1heSBiZSBjaGFuZ2VkIG9uY2UKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmggYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBNb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5oCnJlbmFtZSB0byBNb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wYWxsb2MuaAppbmRleCA5Yzk4ZDFhLi5lZmQ3MTE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCkBAIC0yNiw4ICsyNiw4IEBACiAgKi8KIAogCi0jaWZuZGVmIE1FTU9SWV9ICi0jZGVmaW5lIE1FTU9SWV9ICisjaWZuZGVmIE1QQUxMT0NfSAorI2RlZmluZSBNUEFMTE9DX0gKIAogCiAjaW5jbHVkZSAibXBkZWNpbWFsLmgiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuYwppbmRleCA1OTNmOWY1Li4zMjhhYjkyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJiaXRzLmgiCiAjaW5jbHVkZSAiY29udm9sdXRlLmgiCiAjaW5jbHVkZSAiY3J0LmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAibXBhbGxvYy5oIgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgogI2luY2x1ZGUgInVtb2Rhcml0aC5oIgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaAppbmRleCA1Y2E3NDEzLi5kYWYyYjlkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgKQEAgLTQ4LDYgKzQ4LDggQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaWZkZWYgX01TQ19WRVIKICAgI2luY2x1ZGUgInZjY29tcGF0LmgiCkBAIC01OSwxMiArNjEsNiBAQAogICAjZGVmaW5lIE1QRF9ISURFX1NZTUJPTFNfRU5ECiAgICNkZWZpbmUgRVhUSU5MSU5FIGV4dGVybiBpbmxpbmUKICNlbHNlCi0gICNpZmRlZiBIQVZFX1NURElOVF9ICi0gICAgI2luY2x1ZGUgPHN0ZGludC5oPgotICAjZW5kaWYKLSAgI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAotICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotICAjZW5kaWYKICAgI2lmbmRlZiBfX0dOVUNfU1REQ19JTkxJTkVfXwogICAgICNkZWZpbmUgX19HTlVDX1NURENfSU5MSU5FX18gMQogICAjZW5kaWYKQEAgLTEwOCw5ICsxMDQsOSBAQAogCiAjZGVmaW5lIE1QRF9NQUpPUl9WRVJTSU9OIDIKICNkZWZpbmUgTVBEX01JTk9SX1ZFUlNJT04gNAotI2RlZmluZSBNUERfTUlDUk9fVkVSU0lPTiAxCisjZGVmaW5lIE1QRF9NSUNST19WRVJTSU9OIDIKIAotI2RlZmluZSBNUERfVkVSU0lPTiAiMi40LjEiCisjZGVmaW5lIE1QRF9WRVJTSU9OICIyLjQuMiIKIAogI2RlZmluZSBNUERfVkVSU0lPTl9IRVggKChNUERfTUFKT1JfVkVSU0lPTiA8PCAyNCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKE1QRF9NSU5PUl9WRVJTSU9OIDw8IDE2KSB8IFwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvdmNjb21wYXQuaCBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvdmNjb21wYXQuaAppbmRleCBmNThlMDIzLi41NjRlYWE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL3ZjY29tcGF0LmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy92Y2NvbXBhdC5oCkBAIC0zMiw3ICszMiw2IEBACiAKIC8qIFZpc3VhbCBDIGZpeGVzOiBubyBzdGRpbnQuaCwgbm8gc25wcmludGYgLi4uICovCiAjaWZkZWYgX01TQ19WRVIKLSAgI2luY2x1ZGUgInZjc3RkaW50LmgiCiAgICN1bmRlZiBpbmxpbmUKICAgI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKICAgI3VuZGVmIHJhbmRvbQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weSBiL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKaW5kZXggYWI3ZDViZC4uZjkwNzUzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQorKysgYi9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CkBAIC01MCw4ICs1MCw4IEBACiAgICAgICAgICdfX2Fic19fJywgJ19fYm9vbF9fJywgJ19fY2VpbF9fJywgJ19fY29tcGxleF9fJywgJ19fY29weV9fJywKICAgICAgICAgJ19fZmxvb3JfXycsICdfX2Zsb2F0X18nLCAnX19oYXNoX18nLCAnX19pbnRfXycsICdfX25lZ19fJywKICAgICAgICAgJ19fcG9zX18nLCAnX19yZWR1Y2VfXycsICdfX3JlcHJfXycsICdfX3N0cl9fJywgJ19fdHJ1bmNfXycsCi0gICAgICAgICdhZGp1c3RlZCcsICdhc190dXBsZScsICdjYW5vbmljYWwnLCAnY29uanVnYXRlJywgJ2NvcHlfYWJzJywKLSAgICAgICAgJ2NvcHlfbmVnYXRlJywgJ2lzX2Nhbm9uaWNhbCcsICdpc19maW5pdGUnLCAnaXNfaW5maW5pdGUnLAorICAgICAgICAnYWRqdXN0ZWQnLCAnYXNfaW50ZWdlcl9yYXRpbycsICdhc190dXBsZScsICdjYW5vbmljYWwnLCAnY29uanVnYXRlJywKKyAgICAgICAgJ2NvcHlfYWJzJywgJ2NvcHlfbmVnYXRlJywgJ2lzX2Nhbm9uaWNhbCcsICdpc19maW5pdGUnLCAnaXNfaW5maW5pdGUnLAogICAgICAgICAnaXNfbmFuJywgJ2lzX3FuYW4nLCAnaXNfc2lnbmVkJywgJ2lzX3NuYW4nLCAnaXNfemVybycsICdyYWRpeCcKICAgICApLAogICAgICMgVW5hcnkgd2l0aCBvcHRpb25hbCBjb250ZXh0OgpAQCAtMTI4LDcgKzEyOCw3IEBACiAjIEZ1bmN0aW9ucyB0aGF0IHJlcXVpcmUgYSByZXN0cmljdGVkIGV4cG9uZW50IHJhbmdlIGZvciByZWFzb25hYmxlIHJ1bnRpbWVzLgogVW5hcnlSZXN0cmljdGVkID0gWwogICAnX19jZWlsX18nLCAnX19mbG9vcl9fJywgJ19faW50X18nLCAnX190cnVuY19fJywKLSAgJ3RvX2ludGVncmFsJywgJ3RvX2ludGVncmFsX3ZhbHVlJworICAnYXNfaW50ZWdlcl9yYXRpbycsICd0b19pbnRlZ3JhbCcsICd0b19pbnRlZ3JhbF92YWx1ZScKIF0KIAogQmluYXJ5UmVzdHJpY3RlZCA9IFsnX19yb3VuZF9fJ10KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCmluZGV4IDg1ZmZjYTIuLmNhNWFiMmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKKysrIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwpAQCAtNTcsOSArNTcsOSBAQAogICAgdGhhdCBhbGwgdXNlIG9mIHRleHQgYW5kIHRhaWwgYXMgb2JqZWN0IHBvaW50ZXJzIG11c3QgYmUgd3JhcHBlZCBpbgogICAgSk9JTl9PQkouICBzZWUgY29tbWVudHMgaW4gdGhlIEVsZW1lbnRPYmplY3QgZGVmaW5pdGlvbiBmb3IgbW9yZQogICAgaW5mby4gKi8KLSNkZWZpbmUgSk9JTl9HRVQocCkgKChQeV91aW50cHRyX3QpIChwKSAmIDEpCi0jZGVmaW5lIEpPSU5fU0VUKHAsIGZsYWcpICgodm9pZCopICgoUHlfdWludHB0cl90KSAoSk9JTl9PQkoocCkpIHwgKGZsYWcpKSkKLSNkZWZpbmUgSk9JTl9PQkoocCkgKChQeU9iamVjdCopICgoUHlfdWludHB0cl90KSAocCkgJiB+KFB5X3VpbnRwdHJfdCkxKSkKKyNkZWZpbmUgSk9JTl9HRVQocCkgKCh1aW50cHRyX3QpIChwKSAmIDEpCisjZGVmaW5lIEpPSU5fU0VUKHAsIGZsYWcpICgodm9pZCopICgodWludHB0cl90KSAoSk9JTl9PQkoocCkpIHwgKGZsYWcpKSkKKyNkZWZpbmUgSk9JTl9PQkoocCkgKChQeU9iamVjdCopICgodWludHB0cl90KSAocCkgJiB+KHVpbnRwdHJfdCkxKSkKIAogLyogUHlfQ0xFQVIgZm9yIGEgUHlPYmplY3QqIHRoYXQgdXNlcyBhIGpvaW4gZmxhZy4gUGFzcyB0aGUgcG9pbnRlciBieQogICogcmVmZXJlbmNlIHNpbmNlIHRoaXMgZnVuY3Rpb24gc2V0cyBpdCB0byBOVUxMLgpAQCAtMTI5LDMwICsxMjksNiBAQAogLyogaGVscGVycyAqLwogCiBMT0NBTChQeU9iamVjdCopCi1kZWVwY29weShQeU9iamVjdCogb2JqZWN0LCBQeU9iamVjdCogbWVtbykKLXsKLSAgICAvKiBkbyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICovCi0gICAgUHlPYmplY3QqIGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJlc3VsdDsKLSAgICBlbGVtZW50dHJlZXN0YXRlICpzdCA9IEVUX1NUQVRFX0dMT0JBTDsKLQotICAgIGlmICghc3QtPmRlZXBjb3B5X29iaikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoCi0gICAgICAgICAgICBQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAiZGVlcGNvcHkgaGVscGVyIG5vdCBmb3VuZCIKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgb2JqZWN0LCBtZW1vKTsKLSAgICBpZiAoIWFyZ3MpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3QtPmRlZXBjb3B5X29iaiwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUxPQ0FMKFB5T2JqZWN0KikKIGxpc3Rfam9pbihQeU9iamVjdCogbGlzdCkKIHsKICAgICAvKiBqb2luIGxpc3QgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIGxpc3QgaW4gdGhlIHByb2Nlc3MpICovCkBAIC00MjAsMTAgKzM5Niw4IEBACiAgICAgUHlfWERFQ1JFRihhdHRyaWIpOwogCiAgICAgLyogUmVwbGFjZSB0aGUgb2JqZWN0cyBhbHJlYWR5IHBvaW50ZWQgdG8gYnkgdGFnLCB0ZXh0IGFuZCB0YWlsLiAqLwotICAgIHRtcCA9IHNlbGZfZWxlbS0+dGFnOwogICAgIFB5X0lOQ1JFRih0YWcpOwotICAgIHNlbGZfZWxlbS0+dGFnID0gdGFnOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYoc2VsZl9lbGVtLT50YWcsIHRhZyk7CiAKICAgICB0bXAgPSBzZWxmX2VsZW0tPnRleHQ7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtNzQ4LDYgKzcyMiw5IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopIGVsZW1lbnQ7CiB9CiAKKy8qIEhlbHBlciBmb3IgYSBkZWVwIGNvcHkuICovCitMT0NBTChQeU9iamVjdCAqKSBkZWVwY29weShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLkVsZW1lbnQuX19kZWVwY29weV9fCiAKQEAgLTgyMCw3ICs3OTcsNyBAQAogICAgIH0KIAogICAgIC8qIGFkZCBvYmplY3QgdG8gbWVtbyBkaWN0aW9uYXJ5IChzbyBkZWVwY29weSB3b24ndCB2aXNpdCBpdCBhZ2FpbikgKi8KLSAgICBpZCA9IFB5TG9uZ19Gcm9tU3NpemVfdCgoUHlfdWludHB0cl90KSBzZWxmKTsKKyAgICBpZCA9IFB5TG9uZ19Gcm9tU3NpemVfdCgodWludHB0cl90KSBzZWxmKTsKICAgICBpZiAoIWlkKQogICAgICAgICBnb3RvIGVycm9yOwogCkBAIC04MzgsNiArODE1LDUzIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK0xPQ0FMKFB5T2JqZWN0ICopCitkZWVwY29weShQeU9iamVjdCAqb2JqZWN0LCBQeU9iamVjdCAqbWVtbykKK3sKKyAgICAvKiBkbyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICovCisgICAgZWxlbWVudHRyZWVzdGF0ZSAqc3Q7CisgICAgUHlPYmplY3QgKnN0YWNrWzJdOworCisgICAgLyogRmFzdCBwYXRocyAqLworICAgIGlmIChvYmplY3QgPT0gUHlfTm9uZSB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgIFB5X0lOQ1JFRihvYmplY3QpOworICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIGlmIChQeV9SRUZDTlQob2JqZWN0KSA9PSAxKSB7CisgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgICAgICBpbnQgc2ltcGxlID0gMTsKKyAgICAgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChvYmplY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwgIVB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2ltcGxlKQorICAgICAgICAgICAgICAgIHJldHVybiBQeURpY3RfQ29weShvYmplY3QpOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGdlbmVyYWwgY2FzZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEVsZW1lbnRfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gX2VsZW1lbnR0cmVlX0VsZW1lbnRfX19kZWVwY29weV9fKChFbGVtZW50T2JqZWN0ICopb2JqZWN0LCBtZW1vKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdlbmVyYWwgY2FzZSAqLworICAgIHN0ID0gRVRfU1RBVEVfR0xPQkFMOworICAgIGlmICghc3QtPmRlZXBjb3B5X29iaikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlZXBjb3B5IGhlbHBlciBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhY2tbMF0gPSBvYmplY3Q7CisgICAgc3RhY2tbMV0gPSBtZW1vOworICAgIHJldHVybiBfUHlPYmplY3RfRmFzdENhbGwoc3QtPmRlZXBjb3B5X29iaiwgc3RhY2ssIDIpOworfQorCisKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5FbGVtZW50Ll9fc2l6ZW9mX18gLT4gUHlfc3NpemVfdAogCkBAIC0xODkyLDkyICsxOTE2LDkwIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWVsZW1lbnRfZ2V0YXR0cm8oRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIG5hbWVvYmopCitlbGVtZW50X3RhZ19nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLSAgICBQeU9iamVjdCogcmVzOwotICAgIGNoYXIgKm5hbWUgPSAiIjsKLQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZW9iaikpCi0gICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzU3RyaW5nKG5hbWVvYmopOwotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBoYW5kbGUgY29tbW9uIGF0dHJpYnV0ZXMgZmlyc3QgKi8KLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWciKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IHNlbGYtPnRhZzsKLSAgICAgICAgUHlfSU5DUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRleHQiKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X3RleHQoc2VsZik7Ci0gICAgICAgIFB5X1hJTkNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvKiBtZXRob2RzICovCi0gICAgcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0Kikgc2VsZiwgbmFtZW9iaik7Ci0gICAgaWYgKHJlcykKLSAgICAgICAgcmV0dXJuIHJlczsKLQotICAgIC8qIGxlc3MgY29tbW9uIGF0dHJpYnV0ZXMgKi8KLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWlsIikgPT0gMCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICByZXMgPSBlbGVtZW50X2dldF90YWlsKHNlbGYpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJhdHRyaWIiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X2F0dHJpYihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KKyAgICBQeU9iamVjdCAqcmVzID0gc2VsZi0+dGFnOwogICAgIFB5X0lOQ1JFRihyZXMpOwogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQKLWVsZW1lbnRfc2V0YXR0cm8oRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIG5hbWVvYmosIFB5T2JqZWN0KiB2YWx1ZSkKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfdGV4dF9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLSAgICBjaGFyICpuYW1lID0gIiI7CisgICAgUHlPYmplY3QgKnJlcyA9IGVsZW1lbnRfZ2V0X3RleHQoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CiAKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLTE7CitzdGF0aWMgUHlPYmplY3QqCitlbGVtZW50X3RhaWxfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgUHlPYmplY3QgKnJlcyA9IGVsZW1lbnRfZ2V0X3RhaWwoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfYXR0cmliX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaWYgKCFzZWxmLT5leHRyYSkgeworICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWVvYmopKQotICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc1N0cmluZyhuYW1lb2JqKTsKLSAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gZWxlbWVudF9nZXRfYXR0cmliKHNlbGYpOworICAgIFB5X1hJTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQogCi0gICAgaWYgKHN0cmNtcChuYW1lLCAidGFnIikgPT0gMCkgewotICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICBQeV9TRVRSRUYoc2VsZi0+dGFnLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRleHQiKSA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50ZXh0KSk7Ci0gICAgICAgIHNlbGYtPnRleHQgPSB2YWx1ZTsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRleHQpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ0YWlsIikgPT0gMCkgewotICAgICAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGFpbCkpOwotICAgICAgICBzZWxmLT50YWlsID0gdmFsdWU7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmLT50YWlsKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiYXR0cmliIikgPT0gMCkgewotICAgICAgICBpZiAoIXNlbGYtPmV4dHJhKSB7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgUHlfU0VUUkVGKHNlbGYtPmV4dHJhLT5hdHRyaWIsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAiQ2FuJ3Qgc2V0IGFyYml0cmFyeSBhdHRyaWJ1dGVzIG9uIEVsZW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIC0xOworLyogbWFjcm8gZm9yIHNldHRlciB2YWxpZGF0aW9uICovCisjZGVmaW5lIF9WQUxJREFURV9BVFRSX1ZBTFVFKFYpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVikgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeUV4Y19BdHRyaWJ1dGVFcnJvciwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBlbGVtZW50IGF0dHJpYnV0ZSIpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCitzdGF0aWMgaW50CitlbGVtZW50X3RhZ19zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X1NFVFJFRihzZWxmLT50YWcsIHZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF90ZXh0X3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRleHQpKTsKKyAgICBzZWxmLT50ZXh0ID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGFpbF9zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50YWlsKSk7CisgICAgc2VsZi0+dGFpbCA9IHZhbHVlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X2F0dHJpYl9zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBpZiAoIXNlbGYtPmV4dHJhKSB7CisgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X1NFVFJFRihzZWxmLT5leHRyYS0+YXR0cmliLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE5OTcsMjIgKzIwMTksMjIgQEAKICAqIHByZS1vcmRlciB0cmF2ZXJzYWwuIFRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggc3ViLWVsZW1lbnQgc2hvdWxkIGJlIHJldHVybmVkCiAgKiBuZXh0LCBhIHN0YWNrIG9mIHBhcmVudHMgaXMgbWFpbnRhaW5lZC4gVGhpcyBpcyBhIHN0YW5kYXJkIHN0YWNrLWJhc2VkCiAgKiBpdGVyYXRpdmUgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiBhIHRyZWUuCi0gKiBUaGUgc3RhY2sgaXMgbWFuYWdlZCB1c2luZyBhIHNpbmdsZS1saW5rZWQgbGlzdCBzdGFydGluZyBhdCBwYXJlbnRfc3RhY2suCi0gKiBFYWNoIHN0YWNrIG5vZGUgY29udGFpbnMgdGhlIHNhdmVkIHBhcmVudCB0byB3aGljaCB3ZSBzaG91bGQgcmV0dXJuIGFmdGVyCisgKiBUaGUgc3RhY2sgaXMgbWFuYWdlZCB1c2luZyBhIGNvbnRpbnVvdXMgYXJyYXkuCisgKiBFYWNoIHN0YWNrIGl0ZW0gY29udGFpbnMgdGhlIHNhdmVkIHBhcmVudCB0byB3aGljaCB3ZSBzaG91bGQgcmV0dXJuIGFmdGVyCiAgKiB0aGUgY3VycmVudCBvbmUgaXMgZXhoYXVzdGVkLCBhbmQgdGhlIG5leHQgY2hpbGQgdG8gZXhhbWluZSBpbiB0aGF0IHBhcmVudC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgUGFyZW50TG9jYXRvcl90IHsKICAgICBFbGVtZW50T2JqZWN0ICpwYXJlbnQ7CiAgICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleDsKLSAgICBzdHJ1Y3QgUGFyZW50TG9jYXRvcl90ICpuZXh0OwogfSBQYXJlbnRMb2NhdG9yOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIFBhcmVudExvY2F0b3IgKnBhcmVudF9zdGFjazsKKyAgICBQeV9zc2l6ZV90IHBhcmVudF9zdGFja191c2VkOworICAgIFB5X3NzaXplX3QgcGFyZW50X3N0YWNrX3NpemU7CiAgICAgRWxlbWVudE9iamVjdCAqcm9vdF9lbGVtZW50OwogICAgIFB5T2JqZWN0ICpzb3VnaHRfdGFnOwotICAgIGludCByb290X2RvbmU7CiAgICAgaW50IGdldHRleHQ7CiB9IEVsZW1lbnRJdGVyT2JqZWN0OwogCkBAIC0yMDIwLDEzICsyMDQyLDExIEBACiBzdGF0aWMgdm9pZAogZWxlbWVudGl0ZXJfZGVhbGxvYyhFbGVtZW50SXRlck9iamVjdCAqaXQpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqcCA9IGl0LT5wYXJlbnRfc3RhY2s7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgUGFyZW50TG9jYXRvciAqdGVtcCA9IHA7Ci0gICAgICAgIFB5X1hERUNSRUYocC0+cGFyZW50KTsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgICAgIFB5T2JqZWN0X0ZyZWUodGVtcCk7Ci0gICAgfQorICAgIFB5X3NzaXplX3QgaSA9IGl0LT5wYXJlbnRfc3RhY2tfdXNlZDsKKyAgICBpdC0+cGFyZW50X3N0YWNrX3VzZWQgPSAwOworICAgIHdoaWxlIChpLS0pCisgICAgICAgIFB5X1hERUNSRUYoaXQtPnBhcmVudF9zdGFja1tpXS5wYXJlbnQpOworICAgIFB5TWVtX0ZyZWUoaXQtPnBhcmVudF9zdGFjayk7CiAKICAgICBQeV9YREVDUkVGKGl0LT5zb3VnaHRfdGFnKTsKICAgICBQeV9YREVDUkVGKGl0LT5yb290X2VsZW1lbnQpOwpAQCAtMjAzOCwxMSArMjA1OCw5IEBACiBzdGF0aWMgaW50CiBlbGVtZW50aXRlcl90cmF2ZXJzZShFbGVtZW50SXRlck9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIFBhcmVudExvY2F0b3IgKnAgPSBpdC0+cGFyZW50X3N0YWNrOwotICAgIHdoaWxlIChwKSB7Ci0gICAgICAgIFB5X1ZJU0lUKHAtPnBhcmVudCk7Ci0gICAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KKyAgICBQeV9zc2l6ZV90IGkgPSBpdC0+cGFyZW50X3N0YWNrX3VzZWQ7CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgUHlfVklTSVQoaXQtPnBhcmVudF9zdGFja1tpXS5wYXJlbnQpOwogCiAgICAgUHlfVklTSVQoaXQtPnJvb3RfZWxlbWVudCk7CiAgICAgUHlfVklTSVQoaXQtPnNvdWdodF90YWcpOwpAQCAtMjA1MSwxNyArMjA2OSwyNSBAQAogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVsZW1lbnRpdGVyX25leHQuIEFkZCBhIG5ldyBwYXJlbnQgdG8gdGhlIHBhcmVudCBzdGFjay4KICAqLwotc3RhdGljIFBhcmVudExvY2F0b3IgKgotcGFyZW50X3N0YWNrX3B1c2hfbmV3KFBhcmVudExvY2F0b3IgKnN0YWNrLCBFbGVtZW50T2JqZWN0ICpwYXJlbnQpCitzdGF0aWMgaW50CitwYXJlbnRfc3RhY2tfcHVzaF9uZXcoRWxlbWVudEl0ZXJPYmplY3QgKml0LCBFbGVtZW50T2JqZWN0ICpwYXJlbnQpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqbmV3X25vZGUgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFBhcmVudExvY2F0b3IpKTsKLSAgICBpZiAobmV3X25vZGUpIHsKLSAgICAgICAgbmV3X25vZGUtPnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgUHlfSU5DUkVGKHBhcmVudCk7Ci0gICAgICAgIG5ld19ub2RlLT5jaGlsZF9pbmRleCA9IDA7Ci0gICAgICAgIG5ld19ub2RlLT5uZXh0ID0gc3RhY2s7CisgICAgUGFyZW50TG9jYXRvciAqaXRlbTsKKworICAgIGlmIChpdC0+cGFyZW50X3N0YWNrX3VzZWQgPj0gaXQtPnBhcmVudF9zdGFja19zaXplKSB7CisgICAgICAgIFB5X3NzaXplX3QgbmV3X3NpemUgPSBpdC0+cGFyZW50X3N0YWNrX3NpemUgKiAyOyAgLyogbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgUGFyZW50TG9jYXRvciAqcGFyZW50X3N0YWNrID0gaXQtPnBhcmVudF9zdGFjazsKKyAgICAgICAgUHlNZW1fUmVzaXplKHBhcmVudF9zdGFjaywgUGFyZW50TG9jYXRvciwgbmV3X3NpemUpOworICAgICAgICBpZiAocGFyZW50X3N0YWNrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2s7CisgICAgICAgIGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSA9IG5ld19zaXplOwogICAgIH0KLSAgICByZXR1cm4gbmV3X25vZGU7CisgICAgaXRlbSA9IGl0LT5wYXJlbnRfc3RhY2sgKyBpdC0+cGFyZW50X3N0YWNrX3VzZWQrKzsKKyAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICBpdGVtLT5wYXJlbnQgPSBwYXJlbnQ7CisgICAgaXRlbS0+Y2hpbGRfaW5kZXggPSAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMjA3OCwxNTEgKzIxMDQsOTEgQEAKICAgICAgKiAgIC0gaXRlcnRleHQoKSBhbHNvIGhhcyB0byBoYW5kbGUgdGFpbCwgYWZ0ZXIgZmluaXNoaW5nIHdpdGggYWxsIHRoZQogICAgICAqICAgICBjaGlsZHJlbiBvZiBhIG5vZGUuCiAgICAgICovCi0gICAgRWxlbWVudE9iamVjdCAqY3VyX3BhcmVudDsKLSAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4OwogICAgIGludCByYzsKICAgICBFbGVtZW50T2JqZWN0ICplbGVtOworICAgIFB5T2JqZWN0ICp0ZXh0OwogCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgLyogSGFuZGxlIHRoZSBjYXNlIHJlYWNoZWQgaW4gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGl0ZXJhdGlvbiwgd2hlcmUKLSAgICAgICAgICogdGhlIHBhcmVudCBzdGFjayBpcyBlbXB0eS4gVGhlIHJvb3RfZG9uZSBmbGFnIGdpdmVzIHVzIGluZGljYXRpb24KLSAgICAgICAgICogd2hldGhlciB3ZSd2ZSBqdXN0IHN0YXJ0ZWQgaXRlcmF0aW5nIChzbyByb290X2RvbmUgaXMgMCksIGluIHdoaWNoCi0gICAgICAgICAqIGNhc2UgdGhlIHJvb3QgaXMgcmV0dXJuZWQuIElmIHJvb3RfZG9uZSBpcyAxIGFuZCB3ZSdyZSBoZXJlLCB0aGUKKyAgICAgICAgICogdGhlIHBhcmVudCBzdGFjayBpcyBlbXB0eS4gSWYgcm9vdF9lbGVtZW50IGlzIE5VTEwgYW5kIHdlJ3JlIGhlcmUsIHRoZQogICAgICAgICAgKiBpdGVyYXRvciBpcyBleGhhdXN0ZWQuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCkgewotICAgICAgICAgICAgaWYgKGl0LT5yb290X2RvbmUpIHsKKyAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrX3VzZWQpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnJvb3RfZWxlbWVudCkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVsZW0gPSBpdC0+cm9vdF9lbGVtZW50OwotICAgICAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQtPnBhcmVudF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pOwotICAgICAgICAgICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjaykgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaXQtPnJvb3RfZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgcmMgPSAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZXh0ID0gZWxlbWVudF9nZXRfdGV4dChlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gbGVmdCB0byB0cmF2ZXJzZSBpbiB0aGUgY3VycmVudCBwYXJlbnQuIElmCi0gICAgICAgICAqIHllcywgdmlzaXQgdGhlIG5leHQgY2hpbGQuIElmIG5vdCwgcG9wIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgKi8KLSAgICAgICAgY3VyX3BhcmVudCA9IGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudDsKLSAgICAgICAgY2hpbGRfaW5kZXggPSBpdC0+cGFyZW50X3N0YWNrLT5jaGlsZF9pbmRleDsKLSAgICAgICAgaWYgKGN1cl9wYXJlbnQtPmV4dHJhICYmIGNoaWxkX2luZGV4IDwgY3VyX3BhcmVudC0+ZXh0cmEtPmxlbmd0aCkgewotICAgICAgICAgICAgZWxlbSA9IChFbGVtZW50T2JqZWN0ICopY3VyX3BhcmVudC0+ZXh0cmEtPmNoaWxkcmVuW2NoaWxkX2luZGV4XTsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4Kys7Ci0gICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrID0gcGFyZW50X3N0YWNrX3B1c2hfbmV3KGl0LT5wYXJlbnRfc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pOwotICAgICAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOwotICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOwotICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyYyA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmMgPSAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbSA9IGl0LT5yb290X2VsZW1lbnQ7ICAvKiBzdGVhbHMgYSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgIGl0LT5yb290X2VsZW1lbnQgPSBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnRhaWw7Ci0gICAgICAgICAgICBQYXJlbnRMb2NhdG9yICpuZXh0OwotICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgICAgIHRhaWwgPSBlbGVtZW50X2dldF90YWlsKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgICAgIGlmICghdGFpbCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGFpbCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dCA9IGl0LT5wYXJlbnRfc3RhY2stPm5leHQ7Ci0gICAgICAgICAgICBjdXJfcGFyZW50ID0gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50OwotICAgICAgICAgICAgUHlPYmplY3RfRnJlZShpdC0+cGFyZW50X3N0YWNrKTsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBuZXh0OwotICAgICAgICAgICAgUHlfWERFQ1JFRihjdXJfcGFyZW50KTsKLQotICAgICAgICAgICAgLyogTm90ZSB0aGF0IGV4dHJhIGNvbmRpdGlvbiBvbiBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQgaGVyZTsKLSAgICAgICAgICAgICAqIHRoaXMgaXMgYmVjYXVzZSBpdGVydGV4dCgpIGlzIHN1cHBvc2VkIHRvIG9ubHkgcmV0dXJuICppbm5lcioKLSAgICAgICAgICAgICAqIHRleHQsIG5vdCB0ZXh0IGZvbGxvd2luZyB0aGUgZWxlbWVudCBpdCBiZWdhbiBpdGVyYXRpb24gd2l0aC4KKyAgICAgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gbGVmdCB0byB0cmF2ZXJzZSBpbiB0aGUgY3VycmVudCBwYXJlbnQuIElmCisgICAgICAgICAgICAgKiB5ZXMsIHZpc2l0IHRoZSBuZXh0IGNoaWxkLiBJZiBub3QsIHBvcCB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCkgewotICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRhaWwpOwotICAgICAgICAgICAgICAgIGlmIChyYyA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWlsOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFBhcmVudExvY2F0b3IgKml0ZW0gPSAmaXQtPnBhcmVudF9zdGFja1tpdC0+cGFyZW50X3N0YWNrX3VzZWQgLSAxXTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXggPSBpdGVtLT5jaGlsZF9pbmRleDsKKyAgICAgICAgICAgIEVsZW1lbnRPYmplY3RFeHRyYSAqZXh0cmE7CisgICAgICAgICAgICBlbGVtID0gaXRlbS0+cGFyZW50OworICAgICAgICAgICAgZXh0cmEgPSBlbGVtLT5leHRyYTsKKyAgICAgICAgICAgIGlmICghZXh0cmEgfHwgY2hpbGRfaW5kZXggPj0gZXh0cmEtPmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZC0tOworICAgICAgICAgICAgICAgIC8qIE5vdGUgdGhhdCBleHRyYSBjb25kaXRpb24gb24gaXQtPnBhcmVudF9zdGFja191c2VkIGhlcmU7CisgICAgICAgICAgICAgICAgICogdGhpcyBpcyBiZWNhdXNlIGl0ZXJ0ZXh0KCkgaXMgc3VwcG9zZWQgdG8gb25seSByZXR1cm4gKmlubmVyKgorICAgICAgICAgICAgICAgICAqIHRleHQsIG5vdCB0ZXh0IGZvbGxvd2luZyB0aGUgZWxlbWVudCBpdCBiZWdhbiBpdGVyYXRpb24gd2l0aC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXQtPmdldHRleHQgJiYgaXQtPnBhcmVudF9zdGFja191c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X2dldF90YWlsKGVsZW0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGdldHRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxlbSA9IChFbGVtZW50T2JqZWN0ICopZXh0cmEtPmNoaWxkcmVuW2NoaWxkX2luZGV4XTsKKyAgICAgICAgICAgIGl0ZW0tPmNoaWxkX2luZGV4Kys7CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyZW50X3N0YWNrX3B1c2hfbmV3KGl0LCBlbGVtKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKKyAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOworICAgICAgICAgICAgZ290byBnZXR0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGl0LT5zb3VnaHRfdGFnID09IFB5X05vbmUpCisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKKworICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKKworICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY29udGludWU7CisKK2dldHRleHQ6CisgICAgICAgIGlmICghdGV4dCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI3NCw2ICsyMjQwLDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAorI2RlZmluZSBJTklUX1BBUkVOVF9TVEFDS19TSVpFIDgKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNyZWF0ZV9lbGVtZW50aXRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFnLCBpbnQgZ2V0dGV4dCkKQEAgLTIyODYsMjIgKzIyNTMsMjAgQEAKIAogICAgIFB5X0lOQ1JFRih0YWcpOwogICAgIGl0LT5zb3VnaHRfdGFnID0gdGFnOwotICAgIGl0LT5yb290X2RvbmUgPSAwOwogICAgIGl0LT5nZXR0ZXh0ID0gZ2V0dGV4dDsKICAgICBQeV9JTkNSRUYoc2VsZik7CiAgICAgaXQtPnJvb3RfZWxlbWVudCA9IHNlbGY7CiAKICAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CiAKLSAgICBpdC0+cGFyZW50X3N0YWNrID0gUHlPYmplY3RfTWFsbG9jKHNpemVvZihQYXJlbnRMb2NhdG9yKSk7CisgICAgaXQtPnBhcmVudF9zdGFjayA9IFB5TWVtX05ldyhQYXJlbnRMb2NhdG9yLCBJTklUX1BBUkVOVF9TVEFDS19TSVpFKTsKICAgICBpZiAoaXQtPnBhcmVudF9zdGFjayA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQgPSBOVUxMOwotICAgIGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4ID0gMDsKLSAgICBpdC0+cGFyZW50X3N0YWNrLT5uZXh0ID0gTlVMTDsKKyAgICBpdC0+cGFyZW50X3N0YWNrX3VzZWQgPSAwOworICAgIGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSA9IElOSVRfUEFSRU5UX1NUQUNLX1NJWkU7CiAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CkBAIC0yMzI2LDcgKzIyOTEsNyBAQAogICAgIFB5T2JqZWN0ICplbGVtZW50X2ZhY3Rvcnk7CiAKICAgICAvKiBlbGVtZW50IHRyYWNpbmcgKi8KLSAgICBQeU9iamVjdCAqZXZlbnRzOyAvKiBsaXN0IG9mIGV2ZW50cywgb3IgTlVMTCBpZiBub3QgY29sbGVjdGluZyAqLworICAgIFB5T2JqZWN0ICpldmVudHNfYXBwZW5kOyAvKiB0aGUgYXBwZW5kIG1ldGhvZCBvZiB0aGUgbGlzdCBvZiBldmVudHMsIG9yIE5VTEwgKi8KICAgICBQeU9iamVjdCAqc3RhcnRfZXZlbnRfb2JqOyAvKiBldmVudCBvYmplY3RzIChOVUxMIHRvIGlnbm9yZSkgKi8KICAgICBQeU9iamVjdCAqZW5kX2V2ZW50X29iajsKICAgICBQeU9iamVjdCAqc3RhcnRfbnNfZXZlbnRfb2JqOwpAQCAtMjM2MSw3ICsyMzI2LDcgQEAKICAgICAgICAgfQogICAgICAgICB0LT5pbmRleCA9IDA7CiAKLSAgICAgICAgdC0+ZXZlbnRzID0gTlVMTDsKKyAgICAgICAgdC0+ZXZlbnRzX2FwcGVuZCA9IE5VTEw7CiAgICAgICAgIHQtPnN0YXJ0X2V2ZW50X29iaiA9IHQtPmVuZF9ldmVudF9vYmogPSBOVUxMOwogICAgICAgICB0LT5zdGFydF9uc19ldmVudF9vYmogPSB0LT5lbmRfbnNfZXZlbnRfb2JqID0gTlVMTDsKICAgICB9CkBAIC0yMzgwLDEzICsyMzQ1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplbGVtZW50X2ZhY3RvcnkpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTFjZmE3NTU4OTcwZWU5NiBpbnB1dD0xYjQyNGVlZWZjMzUyNDljXSovCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmIChlbGVtZW50X2ZhY3RvcnkpIHsKICAgICAgICAgUHlfSU5DUkVGKGVsZW1lbnRfZmFjdG9yeSk7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmVsZW1lbnRfZmFjdG9yeTsKLSAgICAgICAgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ID0gZWxlbWVudF9mYWN0b3J5OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIFB5X1hTRVRSRUYoc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCBlbGVtZW50X2ZhY3RvcnkpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMjQxMSw3ICsyMzcyLDcgQEAKICAgICBQeV9DTEVBUihzZWxmLT5zdGFydF9uc19ldmVudF9vYmopOwogICAgIFB5X0NMRUFSKHNlbGYtPmVuZF9ldmVudF9vYmopOwogICAgIFB5X0NMRUFSKHNlbGYtPnN0YXJ0X2V2ZW50X29iaik7Ci0gICAgUHlfQ0xFQVIoc2VsZi0+ZXZlbnRzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5ldmVudHNfYXBwZW5kKTsKICAgICBQeV9DTEVBUihzZWxmLT5zdGFjayk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+ZGF0YSk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+bGFzdCk7CkBAIC0yNDkyLDEzICsyNDUzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5vZGUpCiB7CiAgICAgaWYgKGFjdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeVR1cGxlX1BhY2soMiwgYWN0aW9uLCBub2RlKTsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlPYmplY3QgKmV2ZW50ID0gUHlUdXBsZV9QYWNrKDIsIGFjdGlvbiwgbm9kZSk7CisgICAgICAgIGlmIChldmVudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNlbGYtPmV2ZW50c19hcHBlbmQsIGV2ZW50LCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGV2ZW50KTsKICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5ldmVudHMsIHJlcykgPCAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYocmVzKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNTI3LDEwICsyNDg5LDE3IEBACiAgICAgICAgIHNlbGYtPmRhdGEgPSBOVUxMOwogICAgIH0KIAotICAgIGlmIChzZWxmLT5lbGVtZW50X2ZhY3RvcnkgJiYgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ICE9IFB5X05vbmUpIHsKLSAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKLSAgICB9IGVsc2UgeworICAgIGlmICghc2VsZi0+ZWxlbWVudF9mYWN0b3J5IHx8IHNlbGYtPmVsZW1lbnRfZmFjdG9yeSA9PSBQeV9Ob25lKSB7CiAgICAgICAgIG5vZGUgPSBjcmVhdGVfbmV3X2VsZW1lbnQodGFnLCBhdHRyaWIpOworICAgIH0gZWxzZSBpZiAoYXR0cmliID09IFB5X05vbmUpIHsKKyAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoIWF0dHJpYikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOworICAgICAgICBQeV9ERUNSRUYoYXR0cmliKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7CiAgICAgfQogICAgIGlmICghbm9kZSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI5ODksMTIgKzI5NTgsOCBAQAogICAgICAgICAgICAgYXR0cmliX2luICs9IDI7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvKiBQYXNzIGFuIGVtcHR5IGRpY3Rpb25hcnkgb24gKi8KLSAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoIWF0dHJpYikgewotICAgICAgICAgICAgUHlfREVDUkVGKHRhZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBhdHRyaWIgPSBQeV9Ob25lOwogICAgIH0KIAogICAgIGlmIChUcmVlQnVpbGRlcl9DaGVja0V4YWN0KHNlbGYtPnRhcmdldCkpIHsKQEAgLTMwMDMsNiArMjk2OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBhdHRyaWIpOwogICAgIH0KICAgICBlbHNlIGlmIChzZWxmLT5oYW5kbGVfc3RhcnQpIHsKKyAgICAgICAgaWYgKGF0dHJpYiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXR0cmliKTsKKyAgICAgICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmICghYXR0cmliKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5oYW5kbGVfc3RhcnQsICJPTyIsIHRhZywgYXR0cmliKTsKICAgICB9IGVsc2UKICAgICAgICAgcmVzID0gTlVMTDsKQEAgLTMwNzYsNyArMzA0OSw3IEBACiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmICghdGFyZ2V0LT5ldmVudHMgfHwgIXRhcmdldC0+c3RhcnRfbnNfZXZlbnRfb2JqKQorICAgIGlmICghdGFyZ2V0LT5ldmVudHNfYXBwZW5kIHx8ICF0YXJnZXQtPnN0YXJ0X25zX2V2ZW50X29iaikKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKCF1cmkpCkBAIC0zMDk5LDcgKzMwNzIsNyBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXRhcmdldC0+ZXZlbnRzKQorICAgIGlmICghdGFyZ2V0LT5ldmVudHNfYXBwZW5kKQogICAgICAgICByZXR1cm47CiAKICAgICB0cmVlYnVpbGRlcl9hcHBlbmRfZXZlbnQodGFyZ2V0LCB0YXJnZXQtPmVuZF9uc19ldmVudF9vYmosIFB5X05vbmUpOwpAQCAtMzQyNiw3ICszMzk5LDcgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoc2VsZi0+aGFuZGxlX2Nsb3NlKSB7CiAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmhhbmRsZV9jbG9zZSwgIiIpOworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxOb0FyZyhzZWxmLT5oYW5kbGVfY2xvc2UpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTM1ODgsNyArMzU2MSw3IEBACiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuWE1MUGFyc2VyLl9zZXRldmVudHMKIAotICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0KHN1YmNsYXNzX29mPScmUHlMaXN0X1R5cGUnKQorICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0CiAgICAgZXZlbnRzX3RvX3JlcG9ydDogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMzU5OCwxMiArMzU3MSwxMiBAQAogX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fc2V0ZXZlbnRzX2ltcGwoWE1MUGFyc2VyT2JqZWN0ICpzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV2ZW50c19xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpldmVudHNfdG9fcmVwb3J0KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9NTlkYjk3NDI5MTBjNjE3NF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9YWJmOTA4MzBhMWMzYjBmY10qLwogewogICAgIC8qIGFjdGl2YXRlIGVsZW1lbnQgZXZlbnQgcmVwb3J0aW5nICovCiAgICAgUHlfc3NpemVfdCBpOwogICAgIFRyZWVCdWlsZGVyT2JqZWN0ICp0YXJnZXQ7Ci0gICAgUHlPYmplY3QgKmV2ZW50c19zZXE7CisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQsICpldmVudHNfc2VxOwogCiAgICAgaWYgKCFUcmVlQnVpbGRlcl9DaGVja0V4YWN0KHNlbGYtPnRhcmdldCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKApAQCAtMzYxNiw4ICszNTg5LDEwIEBACiAKICAgICB0YXJnZXQgPSAoVHJlZUJ1aWxkZXJPYmplY3QqKSBzZWxmLT50YXJnZXQ7CiAKLSAgICBQeV9JTkNSRUYoZXZlbnRzX3F1ZXVlKTsKLSAgICBQeV9YU0VUUkVGKHRhcmdldC0+ZXZlbnRzLCBldmVudHNfcXVldWUpOworICAgIGV2ZW50c19hcHBlbmQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGV2ZW50c19xdWV1ZSwgImFwcGVuZCIpOworICAgIGlmIChldmVudHNfYXBwZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1hTRVRSRUYodGFyZ2V0LT5ldmVudHNfYXBwZW5kLCBldmVudHNfYXBwZW5kKTsKIAogICAgIC8qIGNsZWFyIG91dCBleGlzdGluZyBldmVudHMgKi8KICAgICBQeV9DTEVBUih0YXJnZXQtPnN0YXJ0X2V2ZW50X29iaik7CkBAIC0zNzUwLDYgKzM3MjUsMjYgQEAKICAgICAob2Jqb2JqYXJncHJvYykgZWxlbWVudF9hc3Nfc3Vic2NyLAogfTsKIAorc3RhdGljIFB5R2V0U2V0RGVmIGVsZW1lbnRfZ2V0c2V0bGlzdFtdID0geworICAgIHsidGFnIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RhZ19nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90YWdfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgaWRlbnRpZnlpbmcgd2hhdCBraW5kIG9mIGRhdGEgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMifSwKKyAgICB7InRleHQiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGV4dF9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90ZXh0X3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIG9mIHRleHQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0YXJ0IHRhZywgb3IgTm9uZSJ9LAorICAgIHsidGFpbCIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90YWlsX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RhaWxfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgb2YgdGV4dCBkaXJlY3RseSBhZnRlciB0aGUgZW5kIHRhZywgb3IgTm9uZSJ9LAorICAgIHsiYXR0cmliIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X2F0dHJpYl9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF9hdHRyaWJfc2V0dGVyLAorICAgICAgICAiQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIn0sCisgICAge05VTEx9LAorfTsKKwogc3RhdGljIFB5VHlwZU9iamVjdCBFbGVtZW50X1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5FbGVtZW50Iiwgc2l6ZW9mKEVsZW1lbnRPYmplY3QpLCAwLApAQCAtMzc2Niw4ICszNzYxLDggQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotICAgIChnZXRhdHRyb2Z1bmMpZWxlbWVudF9nZXRhdHRybywgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0gICAgKHNldGF0dHJvZnVuYyllbGVtZW50X3NldGF0dHJvLCAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwpAQCAtMzc4MCw3ICszNzc1LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIGVsZW1lbnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgZWxlbWVudF9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Z1bmN0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKaW5kZXggZDc4NWM0OS4uODQ4YTAzYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKQEAgLTEyOCw0NCArMTI4LDYwIEBACiB7CiAgICAgUHlPYmplY3QgKnJldDsKICAgICBQeU9iamVjdCAqYXJnYXBwbCwgKmt3YXBwbDsKKyAgICBQeU9iamVjdCAqKnN0YWNrOworICAgIFB5X3NzaXplX3QgbmFyZ3M7CiAKICAgICBhc3NlcnQgKFB5Q2FsbGFibGVfQ2hlY2socHRvLT5mbikpOwogICAgIGFzc2VydCAoUHlUdXBsZV9DaGVjayhwdG8tPmFyZ3MpKTsKICAgICBhc3NlcnQgKFB5RGljdF9DaGVjayhwdG8tPmt3KSk7CiAKICAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShwdG8tPmFyZ3MpID09IDApIHsKLSAgICAgICAgYXJnYXBwbCA9IGFyZ3M7Ci0gICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKLSAgICB9IGVsc2UgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkgewotICAgICAgICBhcmdhcHBsID0gcHRvLT5hcmdzOwotICAgICAgICBQeV9JTkNSRUYocHRvLT5hcmdzKTsKLSAgICB9IGVsc2UgeworICAgICAgICBzdGFjayA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgICAgICBuYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGFyZ2FwcGwgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApIHsKKyAgICAgICAgc3RhY2sgPSAmUHlUdXBsZV9HRVRfSVRFTShwdG8tPmFyZ3MsIDApOworICAgICAgICBuYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUocHRvLT5hcmdzKTsKKyAgICAgICAgYXJnYXBwbCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGFjayA9IE5VTEw7CiAgICAgICAgIGFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOwotICAgICAgICBpZiAoYXJnYXBwbCA9PSBOVUxMKQorICAgICAgICBpZiAoYXJnYXBwbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCiAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ2FwcGwpKTsKICAgICB9CiAKICAgICBpZiAoUHlEaWN0X1NpemUocHRvLT5rdykgPT0gMCkgewogICAgICAgICBrd2FwcGwgPSBrdzsKICAgICAgICAgUHlfWElOQ1JFRihrd2FwcGwpOwotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICBrd2FwcGwgPSBQeURpY3RfQ29weShwdG8tPmt3KTsKICAgICAgICAgaWYgKGt3YXBwbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGFyZ2FwcGwpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKwogICAgICAgICBpZiAoa3cgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKFB5RGljdF9NZXJnZShrd2FwcGwsIGt3LCAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoYXJnYXBwbCk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt3YXBwbCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXQgPSBQeU9iamVjdF9DYWxsKHB0by0+Zm4sIGFyZ2FwcGwsIGt3YXBwbCk7Ci0gICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgIGlmIChzdGFjaykgeworICAgICAgICByZXQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KHB0by0+Zm4sIHN0YWNrLCBuYXJncywga3dhcHBsKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGwocHRvLT5mbiwgYXJnYXBwbCwga3dhcHBsKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgIH0KICAgICBQeV9YREVDUkVGKGt3YXBwbCk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ2MSwxMiArNDc3LDEyIEBACiBrZXlvYmplY3RfcmljaGNvbXBhcmUoUHlPYmplY3QgKmtvLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKICAgICBQeU9iamVjdCAqcmVzOwotICAgIFB5T2JqZWN0ICphcmdzOwogICAgIFB5T2JqZWN0ICp4OwogICAgIFB5T2JqZWN0ICp5OwogICAgIFB5T2JqZWN0ICpjb21wYXJlOwogICAgIFB5T2JqZWN0ICphbnN3ZXI7CiAgICAgc3RhdGljIFB5T2JqZWN0ICp6ZXJvOworICAgIFB5T2JqZWN0KiBzdGFja1syXTsKIAogICAgIGlmICh6ZXJvID09IE5VTEwpIHsKICAgICAgICAgemVybyA9IFB5TG9uZ19Gcm9tTG9uZygwKTsKQEAgLTQ5MCwxNyArNTA2LDEzIEBACiAgICAgLyogQ2FsbCB0aGUgdXNlcidzIGNvbXBhcmlzb24gZnVuY3Rpb24gYW5kIHRyYW5zbGF0ZSB0aGUgMy13YXkKICAgICAgKiByZXN1bHQgaW50byB0cnVlIG9yIGZhbHNlIChvciBlcnJvcikuCiAgICAgICovCi0gICAgYXJncyA9IFB5VHVwbGVfTmV3KDIpOwotICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgc3RhY2tbMF0gPSB4OworICAgIHN0YWNrWzFdID0geTsKKyAgICByZXMgPSBfUHlPYmplY3RfRmFzdENhbGwoY29tcGFyZSwgc3RhY2ssIDIpOworICAgIGlmIChyZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBQeV9JTkNSRUYoeCk7Ci0gICAgUHlfSU5DUkVGKHkpOwotICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgeCk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB5KTsKLSAgICByZXMgPSBQeU9iamVjdF9DYWxsKGNvbXBhcmUsIGFyZ3MsIE5VTEwpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGFuc3dlciA9IFB5T2JqZWN0X1JpY2hDb21wYXJlKHJlcywgemVybywgb3ApOwogICAgIFB5X0RFQ1JFRihyZXMpOwogICAgIHJldHVybiBhbnN3ZXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19nZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKaW5kZXggYjg0MGJmNS4uZGFhZTcxZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2dkYm1tb2R1bGUuYwpAQCAtNjE0LDcgKzYxNCw3IEBACiAgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOwogfQogCi1zdGF0aWMgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCitzdGF0aWMgY29uc3QgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCiAjaWZkZWYgR0RCTV9GQVNUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMgYi9Nb2R1bGVzL19oYXNob3BlbnNzbC5jCmluZGV4IDk4NmMxMGIuLmRhYTRmM2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hhc2hvcGVuc3NsLmMKKysrIGIvTW9kdWxlcy9faGFzaG9wZW5zc2wuYwpAQCAtMjUsNiArMjUsMTIgQEAKICNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KICNpbmNsdWRlICJvcGVuc3NsL2Vyci5oIgogCisjaW5jbHVkZSAiY2xpbmljL19oYXNob3BlbnNzbC5jLmgiCisvKltjbGluaWMgaW5wdXRdCittb2R1bGUgX2hhc2hsaWIKK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PWMyYjRmZjA4MWJhYzRiZTFdKi8KKwogI2RlZmluZSBNVU5DSF9TSVpFIElOVF9NQVgKIAogI2lmbmRlZiBIQVNIX09CSl9DT05TVFJVQ1RPUgpAQCAtNzEzLDYgKzcxOSwxMjggQEAKIAogI2VuZGlmCiAKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID4gMHgxMDEwMDAwMEwgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TQ1JZUFQpICYmICFkZWZpbmVkKExJQlJFU1NMX1ZFUlNJT05fTlVNQkVSKQorI2RlZmluZSBQWV9TQ1JZUFQgMQorCisvKltjbGluaWMgaW5wdXRdCitfaGFzaGxpYi5zY3J5cHQKKworICAgIHBhc3N3b3JkOiBQeV9idWZmZXIKKyAgICAqCisgICAgc2FsdDogUHlfYnVmZmVyID0gTm9uZQorICAgIG4gYXMgbl9vYmo6IG9iamVjdChzdWJjbGFzc19vZj0nJlB5TG9uZ19UeXBlJykgPSBOb25lCisgICAgciBhcyByX29iajogb2JqZWN0KHN1YmNsYXNzX29mPScmUHlMb25nX1R5cGUnKSA9IE5vbmUKKyAgICBwIGFzIHBfb2JqOiBvYmplY3Qoc3ViY2xhc3Nfb2Y9JyZQeUxvbmdfVHlwZScpID0gTm9uZQorICAgIG1heG1lbTogbG9uZyA9IDAKKyAgICBka2xlbjogbG9uZyA9IDY0CisKKworc2NyeXB0IHBhc3N3b3JkLWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorX2hhc2hsaWJfc2NyeXB0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpwYXNzd29yZCwgUHlfYnVmZmVyICpzYWx0LAorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5fb2JqLCBQeU9iamVjdCAqcl9vYmosIFB5T2JqZWN0ICpwX29iaiwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4bWVtLCBsb25nIGRrbGVuKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0ODQ5ZTJhYTJiN2I0NmMgaW5wdXQ9NDhhN2Q2M2JmM2Y3NWM0Ml0qLworeworICAgIFB5T2JqZWN0ICprZXlfb2JqID0gTlVMTDsKKyAgICBjaGFyICprZXk7CisgICAgaW50IHJldHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIG4sIHIsIHA7CisKKyAgICBpZiAocGFzc3dvcmQtPmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQgaXMgdG9vIGxvbmcuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChzYWx0LT5idWYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNhbHQgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzYWx0LT5sZW4gPiBJTlRfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNhbHQgaXMgdG9vIGxvbmcuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG4gPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcobl9vYmopOworICAgIGlmIChuID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuIDwgMiB8fCBuICYgKG4gLSAxKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuIG11c3QgYmUgYSBwb3dlciBvZiAyLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHJfb2JqKTsKKyAgICBpZiAociA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHBfb2JqKTsKKyAgICBpZiAocCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIHVuc2lnbmVkIGludCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobWF4bWVtIDwgMCB8fCBtYXhtZW0gPiBJTlRfTUFYKSB7CisgICAgICAgIC8qIE9wZW5TU0wgMS4xLjAgcmVzdHJpY3RzIG1heG1lbSB0byAzMk1CLiBJdCBtYXkgY2hhbmdlIGluIHRoZQorICAgICAgICAgICBmdXR1cmUuIFRoZSBtYXhtZW0gY29uc3RhbnQgaXMgcHJpdmF0ZSB0byBPcGVuU1NMLiAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtYXhtZW0gbXVzdCBiZSBwb3NpdGl2ZSBhbmQgc21hbGxlciB0aGFuICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGRrbGVuIDwgMSB8fCBka2xlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJka2xlbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBzbWFsbGVyIHRoYW4gJWQiLAorICAgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogbGV0IE9wZW5TU0wgdmFsaWRhdGUgdGhlIHJlc3QgKi8KKyAgICByZXR2YWwgPSBFVlBfUEJFX3NjcnlwdChOVUxMLCAwLCBOVUxMLCAwLCBuLCByLCBwLCBtYXhtZW0sIE5VTEwsIDApOworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIC8qIHNvcnJ5LCBjYW4ndCBkbyBtdWNoIGJldHRlciAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZW10ZXIgY29tYmluYXRpb24gZm9yIG4sIHIsIHAsIG1heG1lbS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICB9CisKKyAgICBrZXlfb2JqID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBka2xlbik7CisgICAgaWYgKGtleV9vYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAga2V5ID0gUHlCeXRlc19BU19TVFJJTkcoa2V5X29iaik7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0dmFsID0gRVZQX1BCRV9zY3J5cHQoCisgICAgICAgIChjb25zdCBjaGFyKilwYXNzd29yZC0+YnVmLCAoc2l6ZV90KXBhc3N3b3JkLT5sZW4sCisgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc2FsdC0+YnVmLCAoc2l6ZV90KXNhbHQtPmxlbiwKKyAgICAgICAgbiwgciwgcCwgbWF4bWVtLAorICAgICAgICAodW5zaWduZWQgY2hhciAqKWtleSwgKHNpemVfdClka2xlbgorICAgICk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5X0NMRUFSKGtleV9vYmopOworICAgICAgICBfc2V0RXhjZXB0aW9uKFB5RXhjX1ZhbHVlRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGtleV9vYmo7Cit9CisjZW5kaWYKKwogLyogU3RhdGUgZm9yIG91ciBjYWxsYmFjayBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBhY2N1bXVsYXRlIGEgcmVzdWx0LiAqLwogdHlwZWRlZiBzdHJ1Y3QgX2ludGVybmFsX25hbWVfbWFwcGVyX3N0YXRlIHsKICAgICBQeU9iamVjdCAqc2V0OwpAQCAtNzcxLDcgKzg5OSw3IEBACiAvKgogICogIFRoaXMgbWFjcm8gZ2VuZXJhdGVzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciBzcGVjaWZpYwogICogIGhhc2ggYWxnb3JpdGhtcy4gIFRoZXNlIGNvbnN0cnVjdG9ycyBhcmUgbXVjaCBmYXN0ZXIgdGhhbiBjYWxsaW5nCi0gKiAgdGhlIGdlbmVyaWMgb25lIHBhc3NpbmcgaXQgYSBweXRob24gc3RyaW5nIGFuZCBhcmUgbm90aWNhYmx5CisgKiAgdGhlIGdlbmVyaWMgb25lIHBhc3NpbmcgaXQgYSBweXRob24gc3RyaW5nIGFuZCBhcmUgbm90aWNlYWJseQogICogIGZhc3RlciB0aGFuIGNhbGxpbmcgYSBweXRob24gbmV3KCkgd3JhcHBlci4gIFRoYXRzIGltcG9ydGFudCBmb3IKICAqICBjb2RlIHRoYXQgd2FudHMgdG8gbWFrZSBoYXNoZXMgb2YgYSBidW5jaCBvZiBzbWFsbCBzdHJpbmdzLgogICovCkBAIC04MzYsNiArOTY0LDcgQEAKICAgICB7InBia2RmMl9obWFjIiwgKFB5Q0Z1bmN0aW9uKXBia2RmMl9obWFjLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgcGJrZGYyX2htYWNfX2RvY19ffSwKICNlbmRpZgorICAgIF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYKICAgICBDT05TVFJVQ1RPUl9NRVRIX0RFRihtZDUpLAogICAgIENPTlNUUlVDVE9SX01FVEhfREVGKHNoYTEpLAogICAgIENPTlNUUlVDVE9SX01FVEhfREVGKHNoYTIyNCksCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwppbmRleCAxMzZhYmY1Li5iNDk5ZTFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNzgsNiArNzgsNyBAQAogICAgICAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgY2hpbGRwb3MgKz0gKCh1bnNpZ25lZCljbXAgXiAxKTsgICAvKiBpbmNyZW1lbnQgd2hlbiBjbXA9PTAgKi8KKyAgICAgICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7ICAgICAgICAgLyogYXJyIG1heSBoYXZlIGNoYW5nZWQgKi8KICAgICAgICAgICAgIGlmIChlbmRwb3MgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKQEAgLTg1LDcgKzg2LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwotICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwogICAgICAgICB0bXAxID0gYXJyW2NoaWxkcG9zXTsKICAgICAgICAgdG1wMiA9IGFycltwb3NdOwogICAgICAgICBhcnJbY2hpbGRwb3NdID0gdG1wMjsKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKICAgICAgICBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgICAqLwotICAgIGZvciAoaSA9IG4vMiAtIDEgOyBpID49IDAgOyBpLS0pCisgICAgZm9yIChpID0gKG4gPj4gMSkgLSAxIDsgaSA+PSAwIDsgaS0tKQogICAgICAgICBpZiAoc2lmdHVwX2Z1bmMoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC00MjAsNyArNDIwLDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNDMyLDYgKzQzMiw3IEBACiAgICAgICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBjaGlsZHBvcyArPSAoKHVuc2lnbmVkKWNtcCBeIDEpOyAgIC8qIGluY3JlbWVudCB3aGVuIGNtcD09MCAqLworICAgICAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsgICAgICAgICAvKiBhcnIgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwpAQCAtNDM5LDcgKzQ0MCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLSAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKICAgICAgICAgdG1wMSA9IGFycltjaGlsZHBvc107CiAgICAgICAgIHRtcDIgPSBhcnJbcG9zXTsKICAgICAgICAgYXJyW2NoaWxkcG9zXSA9IHRtcDI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuYyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCmluZGV4IDY1Yzk1NWEuLmVjNzAwZjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCkBAIC0yMzgsMjAgKzIzOCwzMyBAQAogICAgIGludCB0ZXh0ID0gMCwgYmluYXJ5ID0gMCwgdW5pdmVyc2FsID0gMDsKIAogICAgIGNoYXIgcmF3bW9kZVs2XSwgKm07Ci0gICAgaW50IGxpbmVfYnVmZmVyaW5nLCBpc2F0dHk7CisgICAgaW50IGxpbmVfYnVmZmVyaW5nLCBpc19udW1iZXI7CisgICAgbG9uZyBpc2F0dHk7CiAKLSAgICBQeU9iamVjdCAqcmF3LCAqbW9kZW9iaiA9IE5VTEwsICpidWZmZXIsICp3cmFwcGVyLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmF3LCAqbW9kZW9iaiA9IE5VTEwsICpidWZmZXIsICp3cmFwcGVyLCAqcmVzdWx0ID0gTlVMTCwgKnBhdGhfb3JfZmQgPSBOVUxMOwogCiAgICAgX1B5X0lERU5USUZJRVIoX2Jsa3NpemUpOwogICAgIF9QeV9JREVOVElGSUVSKGlzYXR0eSk7CiAgICAgX1B5X0lERU5USUZJRVIobW9kZSk7CiAgICAgX1B5X0lERU5USUZJRVIoY2xvc2UpOwogCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soZmlsZSkgJiYKLQkhUHlCeXRlc19DaGVjayhmaWxlKSAmJgotCSFQeU51bWJlcl9DaGVjayhmaWxlKSkgeworICAgIGlzX251bWJlciA9IFB5TnVtYmVyX0NoZWNrKGZpbGUpOworCisgICAgaWYgKGlzX251bWJlcikgeworICAgICAgICBwYXRoX29yX2ZkID0gZmlsZTsKKyAgICAgICAgUHlfSU5DUkVGKHBhdGhfb3JfZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhdGhfb3JfZmQgPSBQeU9TX0ZTUGF0aChmaWxlKTsKKyAgICAgICAgaWYgKHBhdGhfb3JfZmQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWlzX251bWJlciAmJgorICAgICAgICAhUHlVbmljb2RlX0NoZWNrKHBhdGhfb3JfZmQpICYmCisgICAgICAgICFQeUJ5dGVzX0NoZWNrKHBhdGhfb3JfZmQpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbnZhbGlkIGZpbGU6ICVSIiwgZmlsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIC8qIERlY29kZSBtb2RlICovCkBAIC0yOTIsNyArMzA1LDcgQEAKICAgICAgICAgaWYgKHN0cmNocihtb2RlK2krMSwgYykpIHsKICAgICAgICAgICBpbnZhbGlkX21vZGU6CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgbW9kZTogJyVzJyIsIG1vZGUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKICAgICB9CkBAIC0zMDcsNTQgKzMyMCw1NyBAQAogCiAgICAgLyogUGFyYW1ldGVycyB2YWxpZGF0aW9uICovCiAgICAgaWYgKHVuaXZlcnNhbCkgewotICAgICAgICBpZiAod3JpdGluZyB8fCBhcHBlbmRpbmcpIHsKKyAgICAgICAgaWYgKGNyZWF0aW5nIHx8IHdyaXRpbmcgfHwgYXBwZW5kaW5nIHx8IHVwZGF0aW5nKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIFUgYW5kIHdyaXRpbmcgbW9kZSBhdCBvbmNlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZSBVIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIHgnLCAndycsICdhJywgb3IgJysnIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICInVScgbW9kZSBpcyBkZXByZWNhdGVkIiwgMSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICByZWFkaW5nID0gMTsKICAgICB9CiAKICAgICBpZiAodGV4dCAmJiBiaW5hcnkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgaGF2ZSB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBhdCBvbmNlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChjcmVhdGluZyArIHJlYWRpbmcgKyB3cml0aW5nICsgYXBwZW5kaW5nID4gMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGhhdmUgZXhhY3RseSBvbmUgb2YgY3JlYXRlL3JlYWQvd3JpdGUvYXBwZW5kIG1vZGUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGJpbmFyeSAmJiBlbmNvZGluZyAhPSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhbiBlbmNvZGluZyBhcmd1bWVudCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBpZiAoYmluYXJ5ICYmIGVycm9ycyAhPSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhbiBlcnJvcnMgYXJndW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGJpbmFyeSAmJiBuZXdsaW5lICE9IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGEgbmV3bGluZSBhcmd1bWVudCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICAvKiBDcmVhdGUgdGhlIFJhdyBmaWxlIHN0cmVhbSAqLwogICAgIHJhdyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlGaWxlSU9fVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9zaU8iLCBmaWxlLCByYXdtb2RlLCBjbG9zZWZkLCBvcGVuZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3NpTyIsIHBhdGhfb3JfZmQsIHJhd21vZGUsIGNsb3NlZmQsIG9wZW5lcik7CiAgICAgaWYgKHJhdyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICByZXN1bHQgPSByYXc7CiAKKyAgICBQeV9ERUNSRUYocGF0aF9vcl9mZCk7CisgICAgcGF0aF9vcl9mZCA9IE5VTEw7CisKICAgICBtb2Rlb2JqID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobW9kZSk7CiAgICAgaWYgKG1vZGVvYmogPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTQzNywxMCArNDUzLDEwIEBACiAKICAgICAvKiB3cmFwcyBpbnRvIGEgVGV4dElPV3JhcHBlciAqLwogICAgIHdyYXBwZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5VGV4dElPV3JhcHBlcl9UeXBlLAotCQkJCSAgICAiT3Nzc2kiLAotCQkJCSAgICBidWZmZXIsCi0JCQkJICAgIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsCi0JCQkJICAgIGxpbmVfYnVmZmVyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPc3NzaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9idWZmZXJpbmcpOwogICAgIGlmICh3cmFwcGVyID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgcmVzdWx0ID0gd3JhcHBlcjsKQEAgLTQ2MCw2ICs0NzYsNyBAQAogICAgICAgICBQeV9YREVDUkVGKGNsb3NlX3Jlc3VsdCk7CiAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgIH0KKyAgICBQeV9YREVDUkVGKHBhdGhfb3JfZmQpOwogICAgIFB5X1hERUNSRUYobW9kZW9iaik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuaCBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCmluZGV4IDBjNmVhZTIuLjAwN2UwYzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCkBAIC02MCw3ICs2MCw3IEBACiAgICAqIE90aGVyd2lzZSwgdGhlIGxpbmUgZW5kaW5nIGlzIHNwZWNpZmllZCBieSByZWFkbmwsIGEgc3RyIG9iamVjdCAqLwogZXh0ZXJuIFB5X3NzaXplX3QgX1B5SU9fZmluZF9saW5lX2VuZGluZygKICAgICBpbnQgdHJhbnNsYXRlZCwgaW50IHVuaXZlcnNhbCwgUHlPYmplY3QgKnJlYWRubCwKLSAgICBpbnQga2luZCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpOworICAgIGludCBraW5kLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCk7CiAKIC8qIFJldHVybiAxIGlmIGFuIEVudmlyb25tZW50RXJyb3Igd2l0aCBlcnJubyA9PSBFSU5UUiBpcyBzZXQgKGFuZCB0aGVuCiAgICBjbGVhcnMgdGhlIGVycm9yIGluZGljYXRvciksIDAgb3RoZXJ3aXNlLgpAQCAtMTA0LDcgKzEwNCw3IEBACiAjIGRlZmluZSBQWV9PRkZfVF9NSU4gICAgICAgUFlfU1NJWkVfVF9NSU4KICMgZGVmaW5lIFBZX09GRl9UX0NPTVBBVCAgICBQeV9zc2l6ZV90CiAjIGRlZmluZSBQWV9QUklkT0ZGICAgICAgICAgInpkIgotI2VsaWYgKEhBVkVfTE9OR19MT05HICYmIFNJWkVPRl9PRkZfVCA9PSBTSVpFT0ZfTE9OR19MT05HKQorI2VsaWYgKFNJWkVPRl9PRkZfVCA9PSBTSVpFT0ZfTE9OR19MT05HKQogIyBkZWZpbmUgUHlMb25nX0FzT2ZmX3QgICAgIFB5TG9uZ19Bc0xvbmdMb25nCiAjIGRlZmluZSBQeUxvbmdfRnJvbU9mZl90ICAgUHlMb25nX0Zyb21Mb25nTG9uZwogIyBkZWZpbmUgUFlfT0ZGX1RfTUFYICAgICAgIFBZX0xMT05HX01BWApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCmluZGV4IDZkNjc3NTEuLmNiZTc0MjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYworKysgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKQEAgLTY1OSw3ICs2NTksNyBAQAogCiAvKiBTZXRzIHRoZSBjdXJyZW50IGVycm9yIHRvIEJsb2NraW5nSU9FcnJvciAqLwogc3RhdGljIHZvaWQKLV9zZXRfQmxvY2tpbmdJT0Vycm9yKGNoYXIgKm1zZywgUHlfc3NpemVfdCB3cml0dGVuKQorX3NldF9CbG9ja2luZ0lPRXJyb3IoY29uc3QgY2hhciAqbXNnLCBQeV9zc2l6ZV90IHdyaXR0ZW4pCiB7CiAgICAgUHlPYmplY3QgKmVycjsKICAgICBQeUVycl9DbGVhcigpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnl0ZXNpby5jIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCmluZGV4IDllNWQ3OGIuLmExYmExMjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYworKysgYi9Nb2R1bGVzL19pby9ieXRlc2lvLmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQKIHVuc2hhcmVfYnVmZmVyKGJ5dGVzaW8gKnNlbGYsIHNpemVfdCBzaXplKQogewotICAgIFB5T2JqZWN0ICpuZXdfYnVmLCAqb2xkX2J1ZjsKKyAgICBQeU9iamVjdCAqbmV3X2J1ZjsKICAgICBhc3NlcnQoU0hBUkVEX0JVRihzZWxmKSk7CiAgICAgYXNzZXJ0KHNlbGYtPmV4cG9ydHMgPT0gMCk7CiAgICAgYXNzZXJ0KHNpemUgPj0gKHNpemVfdClzZWxmLT5zdHJpbmdfc2l6ZSk7CkBAIC05Niw5ICs5Niw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBtZW1jcHkoUHlCeXRlc19BU19TVFJJTkcobmV3X2J1ZiksIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYtPmJ1ZiksCiAgICAgICAgICAgIHNlbGYtPnN0cmluZ19zaXplKTsKLSAgICBvbGRfYnVmID0gc2VsZi0+YnVmOwotICAgIHNlbGYtPmJ1ZiA9IG5ld19idWY7Ci0gICAgUHlfREVDUkVGKG9sZF9idWYpOworICAgIFB5X1NFVFJFRihzZWxmLT5idWYsIG5ld19idWYpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvX2lvbW9kdWxlLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCmluZGV4IDZjODhlMzIuLjUwODkxYzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oCkBAIC0xMzgsNyArMTM4LDggQEAKIF9pb19vcGVuKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsICJlbmNvZGluZyIsICJlcnJvcnMiLCAibmV3bGluZSIsICJjbG9zZWZkIiwgIm9wZW5lciIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAibW9kZSIsICJidWZmZXJpbmciLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgIm5ld2xpbmUiLCAiY2xvc2VmZCIsICJvcGVuZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHNpenp6aU86b3BlbiIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgY29uc3QgY2hhciAqbW9kZSA9ICJyIjsKICAgICBpbnQgYnVmZmVyaW5nID0gLTE7CkBAIC0xNDgsMTIgKzE0OSwxMyBAQAogICAgIGludCBjbG9zZWZkID0gMTsKICAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2l6enppTzpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJm1vZGUsICZidWZmZXJpbmcsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZjbG9zZWZkLCAmb3BlbmVyKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmaWxlLCAmbW9kZSwgJmJ1ZmZlcmluZywgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmNsb3NlZmQsICZvcGVuZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX29wZW5faW1wbChtb2R1bGUsIGZpbGUsIG1vZGUsIGJ1ZmZlcmluZywgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJjMmMwMDNjYjdkYWVhZmUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NzY5NjI5MzkxYTMxMzAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oCmluZGV4IDQzN2UyNzUuLjU4MTQ0YTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9idWZmZXJlZGlvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvYnVmZmVyZWRpby5jLmgKQEAgLTE5LDE0ICsxOSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZElPQmFzZV9yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDgsMTQgKzUwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50bzEiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRJT0Jhc2VfcmVhZGludG8xX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC05OSw4ICsxMDMsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBlZWsiLAotICAgICAgICAmc2l6ZSkpCisgICAgICAgICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcGVla19pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMTI1LDggKzEzMCw5IEBACiAgICAgUHlfc3NpemVfdCBuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMTUwLDggKzE1Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnJlYWQxIiwgJm4pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibjpyZWFkMSIsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZDFfaW1wbChzZWxmLCBuKTsKIAogZXhpdDoKQEAgLTE3NSwxNCArMTgyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMDQsMTQgKzIxMywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvMSIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvMV9pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjM0LDggKzI0NSw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpCisgICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRsaW5lX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNjEsOCArMjczLDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmdGFyZ2V0b2JqLCAmd2hlbmNlKSkKKyAgICAgICAgJnRhcmdldG9iaiwgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3NlZWtfaW1wbChzZWxmLCB0YXJnZXRvYmosIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yODgsOCArMzAxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvcykpCisgICAgICAgICZwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC0zMTAsMTMgKzMyNCwxNSBAQAogX2lvX0J1ZmZlcmVkUmVhZGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG46QnVmZmVyZWRSZWFkZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpyYXc7CiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG46QnVmZmVyZWRSZWFkZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkUmVhZGVyX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zNDEsMTMgKzM1NywxNSBAQAogX2lvX0J1ZmZlcmVkV3JpdGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJyYXciLCAiYnVmZmVyX3NpemUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG46QnVmZmVyZWRXcml0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpyYXc7CiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG46QnVmZmVyZWRXcml0ZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkV3JpdGVyX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zNzEsMTQgKzM4OSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkV3JpdGVyX3dyaXRlX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MTAsMTEgKzQzMCwxMyBAQAogICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOwogCiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZQeUJ1ZmZlcmVkUldQYWlyX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQnVmZmVyZWRSV1BhaXIiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJ1ZmZlcmVkUldQYWlyIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpCdWZmZXJlZFJXUGFpciIsCi0gICAgICAgICZyZWFkZXIsICZ3cml0ZXIsICZidWZmZXJfc2l6ZSkpCisgICAgICAgICZyZWFkZXIsICZ3cml0ZXIsICZidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRSV1BhaXJfX19pbml0X19faW1wbCgocndwYWlyICopc2VsZiwgcmVhZGVyLCB3cml0ZXIsIGJ1ZmZlcl9zaXplKTsKIAogZXhpdDoKQEAgLTQzOSwxNiArNDYxLDE4IEBACiBfaW9fQnVmZmVyZWRSYW5kb21fX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InJhdyIsICJidWZmZXJfc2l6ZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InJhdyIsICJidWZmZXJfc2l6ZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98bjpCdWZmZXJlZFJhbmRvbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnJhdzsKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bjpCdWZmZXJlZFJhbmRvbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRSYW5kb21fX19pbml0X19faW1wbCgoYnVmZmVyZWQgKilzZWxmLCByYXcsIGJ1ZmZlcl9zaXplKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJiYmI1ZTIzOWI0ZmZlNmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE5NTZmMzk0ZWNkZTRjZjkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oCmluZGV4IDVmMmFiYjAuLmM2NGNlNWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9ieXRlc2lvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvYnl0ZXNpby5jLmgKQEAgLTE3MSw4ICsxNzEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMjE1LDggKzIxNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRsaW5lX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTI0Nyw4ICsyNDksOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmVzIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fcmVhZGxpbmVzX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTI3NiwxNCArMjc5LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzExLDggKzMxNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cnVuY2F0ZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3RydW5jYXRlX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTM0NSw4ICszNTEsOSBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsCi0gICAgICAgICZwb3MsICZ3aGVuY2UpKQorICAgICAgICAmcG9zLCAmd2hlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC00MDgsMTUgKzQxNSwxNyBAQAogX2lvX0J5dGVzSU9fX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImluaXRpYWxfYnl0ZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbml0aWFsX2J5dGVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86Qnl0ZXNJTyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmluaXR2YWx1ZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpCeXRlc0lPIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5pdHZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbml0dmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fX19pbml0X19faW1wbCgoYnl0ZXNpbyAqKXNlbGYsIGluaXR2YWx1ZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MGNlMmM2MjcyNzE4NDMxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MzgyZThlYjU3OGVlYTY0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9maWxlaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKaW5kZXggMTA0MjAwOC4uOTA4ZmUwZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmgKQEAgLTQ5LDE1ICs0OSwxNyBAQAogX2lvX0ZpbGVJT19fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImNsb3NlZmQiLCAib3BlbmVyIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJtb2RlIiwgImNsb3NlZmQiLCAib3BlbmVyIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xzaU86RmlsZUlPIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqbmFtZW9iajsKICAgICBjb25zdCBjaGFyICptb2RlID0gInIiOwogICAgIGludCBjbG9zZWZkID0gMTsKICAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2lPOkZpbGVJTyIsIF9rZXl3b3JkcywKLSAgICAgICAgJm5hbWVvYmosICZtb2RlLCAmY2xvc2VmZCwgJm9wZW5lcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbmFtZW9iaiwgJm1vZGUsICZjbG9zZWZkLCAmb3BlbmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fX19pbml0X19faW1wbCgoZmlsZWlvICopc2VsZiwgbmFtZW9iaiwgbW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKQEAgLTE1NCwxNCArMTU2LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMTAsOCArMjE0LDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemUgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT19yZWFkX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNDAsMTQgKzI0NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBiID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODAsOCArMjg3LDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmcG9zLCAmd2hlbmNlKSkKKyAgICAgICAgJnBvcywgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0zMzMsOCArMzQxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvc29iaikpCisgICAgICAgICZwb3NvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT190cnVuY2F0ZV9pbXBsKHNlbGYsIHBvc29iaik7CiAKIGV4aXQ6CkBAIC0zNjQsNCArMzczLDQgQEAKICNpZm5kZWYgX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYKICAgICAjZGVmaW5lIF9JT19GSUxFSU9fVFJVTkNBVEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGNiYzM5YjQ2NjU5ODQ5MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTE5MjRiYzBlZTExZDU4ZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCmluZGV4IDk3NjJmMTEuLmVkYmY3M2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCkBAIC0xODYsOCArMTg2LDkgQEAKICAgICBQeV9zc2l6ZV90IGxpbWl0ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmbGltaXQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmxpbWl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fSU9CYXNlX3JlYWRsaW5lX2ltcGwoc2VsZiwgbGltaXQpOwogCiBleGl0OgpAQCAtMjE3LDggKzIxOCw5IEBACiAgICAgUHlfc3NpemVfdCBoaW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZXMiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19JT0Jhc2VfcmVhZGxpbmVzX2ltcGwoc2VsZiwgaGludCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjUzLDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsCi0gICAgICAgICZuKSkKKyAgICAgICAgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19SYXdJT0Jhc2VfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjc2LDQgKzI3OSw0IEBACiB7CiAgICAgcmV0dXJuIF9pb19fUmF3SU9CYXNlX3JlYWRhbGxfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iODc0OTUyZjVjYzI0OGE0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZjUzZmVkOTI4ZDhlMDJmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvc3RyaW5naW8uYy5oCmluZGV4IGE4ZTMyYTMuLmQyYzA1ZDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL3N0cmluZ2lvLmMuaApAQCAtNjEsOCArNjEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19yZWFkX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTkxLDggKzkyLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3JlYWRsaW5lX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTEyMyw4ICsxMjUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fU3RyaW5nSU9fdHJ1bmNhdGVfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMTU3LDggKzE2MCw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwKLSAgICAgICAgJnBvcywgJndoZW5jZSkpCisgICAgICAgICZwb3MsICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yMTcsMTMgKzIyMSwxNSBAQAogX2lvX1N0cmluZ0lPX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJpbml0aWFsX3ZhbHVlIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbml0aWFsX3ZhbHVlIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T086U3RyaW5nSU8iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5ld2xpbmVfb2JqID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPTzpTdHJpbmdJTyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnZhbHVlLCAmbmV3bGluZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnZhbHVlLCAmbmV3bGluZV9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX19faW5pdF9fX2ltcGwoKHN0cmluZ2lvICopc2VsZiwgdmFsdWUsIG5ld2xpbmVfb2JqKTsKIAogZXhpdDoKQEAgLTI4Myw0ICsyODksNCBAQAogewogICAgIHJldHVybiBfaW9fU3RyaW5nSU9fc2Vla2FibGVfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mMDYxY2YzYTIwY2QxNGVkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZGQ1YzJhMjEzZTc1NDA1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy90ZXh0aW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKaW5kZXggZGM3ZThjNy4uNmM0MDgxOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmgKQEAgLTI0LDE0ICsyNCwxNiBAQAogX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRlY29kZXIiLCAidHJhbnNsYXRlIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImRlY29kZXIiLCAidHJhbnNsYXRlIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik9pfE86SW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmRlY29kZXI7CiAgICAgaW50IHRyYW5zbGF0ZTsKICAgICBQeU9iamVjdCAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfE86SW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRlY29kZXIsICZ0cmFuc2xhdGUsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmRlY29kZXIsICZ0cmFuc2xhdGUsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfX19pbml0X19faW1wbCgobmxkZWNvZGVyX29iamVjdCAqKXNlbGYsIGRlY29kZXIsIHRyYW5zbGF0ZSwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTU0LDEzICs1NiwxNSBAQAogX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfZGVjb2RlKG5sZGVjb2Rlcl9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZmluYWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98aTpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppbnB1dDsKICAgICBpbnQgZmluYWwgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmlucHV0LCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfZGVjb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGZpbmFsKTsKIAogZXhpdDoKQEAgLTE1Myw3ICsxNTcsOCBAQAogX2lvX1RleHRJT1dyYXBwZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImJ1ZmZlciIsICJlbmNvZGluZyIsICJlcnJvcnMiLCAibmV3bGluZSIsICJsaW5lX2J1ZmZlcmluZyIsICJ3cml0ZV90aHJvdWdoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiYnVmZmVyIiwgImVuY29kaW5nIiwgImVycm9ycyIsICJuZXdsaW5lIiwgImxpbmVfYnVmZmVyaW5nIiwgIndyaXRlX3Rocm91Z2giLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHp6emlpOlRleHRJT1dyYXBwZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpidWZmZXI7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CkBAIC0xNjEsOSArMTY2LDEwIEBACiAgICAgaW50IGxpbmVfYnVmZmVyaW5nID0gMDsKICAgICBpbnQgd3JpdGVfdGhyb3VnaCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHp6emlpOlRleHRJT1dyYXBwZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZidWZmZXIsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZsaW5lX2J1ZmZlcmluZywgJndyaXRlX3Rocm91Z2gpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmJ1ZmZlciwgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmxpbmVfYnVmZmVyaW5nLCAmd3JpdGVfdGhyb3VnaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9fX2luaXRfX19pbXBsKCh0ZXh0aW8gKilzZWxmLCBidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nLCB3cml0ZV90aHJvdWdoKTsKIAogZXhpdDoKQEAgLTIwNCw4ICsyMTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0ZXh0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOndyaXRlIiwgJnRleHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTp3cml0ZSIsICZ0ZXh0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19UZXh0SU9XcmFwcGVyX3dyaXRlX2ltcGwoc2VsZiwgdGV4dCk7CiAKIGV4aXQ6CkBAIC0yMzAsOCArMjM3LDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjU2LDggKzI2NCw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWRsaW5lIiwKLSAgICAgICAgJnNpemUpKQorICAgICAgICAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9yZWFkbGluZV9pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMjgzLDggKzI5Miw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwKLSAgICAgICAgJmNvb2tpZU9iaiwgJndoZW5jZSkpCisgICAgICAgICZjb29raWVPYmosICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfc2Vla19pbXBsKHNlbGYsIGNvb2tpZU9iaiwgd2hlbmNlKTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzcsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmcG9zKSkKKyAgICAgICAgJnBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC00NTMsNCArNDY0LDQgQEAKIHsKICAgICByZXR1cm4gX2lvX1RleHRJT1dyYXBwZXJfY2xvc2VfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OTA2MDhmODVhYWI4YmE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZWM2MjRhOWJmNjM5M2Y1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2ZpbGVpby5jIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKaW5kZXggOTE5Y2Y1MC4uMTJlNTE1NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vZmlsZWlvLmMKKysrIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKQEAgLTkyLDggKzkyLDcgQEAKICAgICBpZiAoc2VsZi0+ZmQgPj0gMCAmJiBzZWxmLT5jbG9zZWZkKSB7CiAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLSAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfUmVzb3VyY2VXYXJuaW5nLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5jbG9zZWQgZmlsZSAlUiIsIHNvdXJjZSkpIHsKKyAgICAgICAgaWYgKFB5RXJyX1Jlc291cmNlV2FybmluZyhzb3VyY2UsIDEsICJ1bmNsb3NlZCBmaWxlICVSIiwgc291cmNlKSkgewogICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKQogICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgc2VsZik7CkBAIC01NDYsNyArNTQ1LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWVycl9tb2RlKGNoYXIgKmFjdGlvbikKK2Vycl9tb2RlKGNvbnN0IGNoYXIgKmFjdGlvbikKIHsKICAgICBfUHlJT19TdGF0ZSAqc3RhdGUgPSBJT19TVEFURSgpOwogICAgIGlmIChzdGF0ZSAhPSBOVUxMKQpAQCAtMTA0OSw3ICsxMDQ4LDcgQEAKIH0KICNlbmRpZiAvKiBIQVZFX0ZUUlVOQ0FURSAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBtb2RlX3N0cmluZyhmaWxlaW8gKnNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmNyZWF0ZWQpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2lvYmFzZS5jIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKaW5kZXggMjEyYjBkZC4uNDcyZWYzYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vaW9iYXNlLmMKKysrIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKQEAgLTkwLDcgKzkwLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyogUG9zaXRpb25uaW5nICovCisvKiBQb3NpdGlvbmluZyAqLwogCiBQeURvY19TVFJWQVIoaW9iYXNlX3NlZWtfZG9jLAogICAgICJDaGFuZ2Ugc3RyZWFtIHBvc2l0aW9uLlxuIgpAQCAtODI4LDcgKzgyOCw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLwotICAgIChkZXN0cnVjdG9yKWlvYmFzZV9maW5hbGl6ZSwgLyogdHBfZmluYWxpemUgKi8KKyAgICBpb2Jhc2VfZmluYWxpemUsICAgICAgICAgICAgLyogdHBfZmluYWxpemUgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vc3RyaW5naW8uYyBiL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKaW5kZXggMDZiNDE0NC4uZWNmNmRjMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vc3RyaW5naW8uYworKysgYi9Nb2R1bGVzL19pby9zdHJpbmdpby5jCkBAIC00MzgsNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlJT19zdHJfcmVhZGxpbmUsIE5VTEwpOwogICAgICAgICBpZiAobGluZSAmJiAhUHlVbmljb2RlX0NoZWNrKGxpbmUpKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBzdHIgb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBzdHIgb2JqZWN0LCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUobGluZSktPnRwX25hbWUpOwogICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby90ZXh0aW8uYyBiL01vZHVsZXMvX2lvL3RleHRpby5jCmluZGV4IDA2M2NhYTYuLjk2YzhlN2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL3RleHRpby5jCisrKyBiL01vZHVsZXMvX2lvL3RleHRpby5jCkBAIC03NzIsNyArNzcyLDcgQEAKICAgICBlbmNvZGVmdW5jX3QgZW5jb2RlZnVuYzsKIH0gZW5jb2RlZnVuY2VudHJ5OwogCi1zdGF0aWMgZW5jb2RlZnVuY2VudHJ5IGVuY29kZWZ1bmNzW10gPSB7CitzdGF0aWMgY29uc3QgZW5jb2RlZnVuY2VudHJ5IGVuY29kZWZ1bmNzW10gPSB7CiAgICAgeyJhc2NpaSIsICAgICAgIChlbmNvZGVmdW5jX3QpIGFzY2lpX2VuY29kZX0sCiAgICAgeyJpc284ODU5LTEiLCAgIChlbmNvZGVmdW5jX3QpIGxhdGluMV9lbmNvZGV9LAogICAgIHsidXRmLTgiLCAgICAgICAoZW5jb2RlZnVuY190KSB1dGY4X2VuY29kZX0sCkBAIC0xMDIxLDcgKzEwMjEsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLSAgICAgICAgICAgIGVuY29kZWZ1bmNlbnRyeSAqZSA9IGVuY29kZWZ1bmNzOworICAgICAgICAgICAgY29uc3QgZW5jb2RlZnVuY2VudHJ5ICplID0gZW5jb2RlZnVuY3M7CiAgICAgICAgICAgICB3aGlsZSAoZS0+bmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhyZXMsIGUtPm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmVuY29kZWZ1bmMgPSBlLT5lbmNvZGVmdW5jOwpAQCAtMTY0NCw4ICsxNjQ0LDggQEAKIC8qIE5PVEU6IGBlbmRgIG11c3QgcG9pbnQgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBQeV9VQ1M0IHN0b3JhZ2UsCiAgICB0aGF0IGlzIHRvIHRoZSBOVUwgY2hhcmFjdGVyLiBPdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZQogICAgaW5jb3JyZWN0IHJlc3VsdHMuICovCi1zdGF0aWMgY2hhciAqCi1maW5kX2NvbnRyb2xfY2hhcihpbnQga2luZCwgY2hhciAqcywgY2hhciAqZW5kLCBQeV9VQ1M0IGNoKQorc3RhdGljIGNvbnN0IGNoYXIgKgorZmluZF9jb250cm9sX2NoYXIoaW50IGtpbmQsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVuZCwgUHlfVUNTNCBjaCkKIHsKICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICBhc3NlcnQoY2ggPCAyNTYpOwpAQCAtMTY2NSwxMyArMTY2NSwxMyBAQAogUHlfc3NpemVfdAogX1B5SU9fZmluZF9saW5lX2VuZGluZygKICAgICBpbnQgdHJhbnNsYXRlZCwgaW50IHVuaXZlcnNhbCwgUHlPYmplY3QgKnJlYWRubCwKLSAgICBpbnQga2luZCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpCisgICAgaW50IGtpbmQsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKQogewogICAgIFB5X3NzaXplX3QgbGVuID0gKChjaGFyKillbmQgLSAoY2hhciopc3RhcnQpL2tpbmQ7CiAKICAgICBpZiAodHJhbnNsYXRlZCkgewogICAgICAgICAvKiBOZXdsaW5lcyBhcmUgYWxyZWFkeSB0cmFuc2xhdGVkLCBvbmx5IHNlYXJjaCBmb3IgXG4gKi8KLSAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgJ1xuJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsICdcbicpOwogICAgICAgICBpZiAocG9zICE9IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gKHBvcyAtIHN0YXJ0KS9raW5kICsgMTsKICAgICAgICAgZWxzZSB7CkBAIC0xNjgzLDcgKzE2ODMsNyBAQAogICAgICAgICAvKiBVbml2ZXJzYWwgbmV3bGluZSBzZWFyY2guIEZpbmQgYW55IG9mIFxyLCBcclxuLCBcbgogICAgICAgICAgKiBUaGUgZGVjb2RlciBlbnN1cmVzIHRoYXQgXHJcbiBhcmUgbm90IHNwbGl0IGluIHR3byBwaWVjZXMKICAgICAgICAgICovCi0gICAgICAgIGNoYXIgKnMgPSBzdGFydDsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0YXJ0OwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBQeV9VQ1M0IGNoOwogICAgICAgICAgICAgLyogRmFzdCBwYXRoIGZvciBub24tY29udHJvbCBjaGFycy4gVGhlIGxvb3AgYWx3YXlzIGVuZHMKQEAgLTE3MTMsMjEgKzE3MTMsMjEgQEAKICAgICAgICAgLyogQXNzdW1lIHRoYXQgcmVhZG5sIGlzIGFuIEFTQ0lJIGNoYXJhY3Rlci4gKi8KICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlYWRubCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOwogICAgICAgICBpZiAocmVhZG5sX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCBubFswXSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCBubFswXSk7CiAgICAgICAgICAgICBpZiAocG9zICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIChwb3MgLSBzdGFydCkva2luZCArIDE7CiAgICAgICAgICAgICAqY29uc3VtZWQgPSBsZW47CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICpzID0gc3RhcnQ7Ci0gICAgICAgICAgICBjaGFyICplID0gZW5kIC0gKHJlYWRubF9sZW4gLSAxKSpraW5kOwotICAgICAgICAgICAgY2hhciAqcG9zOworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0YXJ0OworICAgICAgICAgICAgY29uc3QgY2hhciAqZSA9IGVuZCAtIChyZWFkbmxfbGVuIC0gMSkqa2luZDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvczsKICAgICAgICAgICAgIGlmIChlIDwgcykKICAgICAgICAgICAgICAgICBlID0gczsKICAgICAgICAgICAgIHdoaWxlIChzIDwgZSkgewogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzLCBlbmQsIG5sWzBdKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzLCBlbmQsIG5sWzBdKTsKICAgICAgICAgICAgICAgICBpZiAocG9zID09IE5VTEwgfHwgcG9zID49IGUpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByZWFkbmxfbGVuOyBpKyspIHsKQEAgLTI2ODksNyArMjY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5SU9fc3RyX3JlYWRsaW5lLCBOVUxMKTsKICAgICAgICAgaWYgKGxpbmUgJiYgIVB5VW5pY29kZV9DaGVjayhsaW5lKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gc3RyIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGEgc3RyIG9iamVjdCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKGxpbmUpLT50cF9uYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fanNvbi5jIGIvTW9kdWxlcy9fanNvbi5jCmluZGV4IGY4MmFmMzQuLmQzZGJmOTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2pzb24uYworKysgYi9Nb2R1bGVzL19qc29uLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9lbmNvZGVkX2NvbnN0KFB5T2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQKLXJhaXNlX2Vycm1zZyhjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCk7CityYWlzZV9lcnJtc2coY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpOwogc3RhdGljIFB5T2JqZWN0ICoKIGVuY29kZXJfZW5jb2RlX3N0cmluZyhQeUVuY29kZXJPYmplY3QgKnMsIFB5T2JqZWN0ICpvYmopOwogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTMyMSw3ICszMjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcmFpc2VfZXJybXNnKGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQorcmFpc2VfZXJybXNnKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQogewogICAgIC8qIFVzZSBKU09ORGVjb2RlRXJyb3IgZXhjZXB0aW9uIHRvIHJhaXNlIGEgbmljZSBsb29raW5nIFZhbHVlRXJyb3Igc3ViY2xhc3MgKi8KICAgICBzdGF0aWMgUHlPYmplY3QgKkpTT05EZWNvZGVFcnJvciA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGIxZDZhZGQuLmE5MmZiMTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIC8qIHRoZSBncm91cGluZyBpcyB0ZXJtaW5hdGVkIGJ5IGVpdGhlciAwIG9yIENIQVJfTUFYICovCiBzdGF0aWMgUHlPYmplY3QqCi1jb3B5X2dyb3VwaW5nKGNoYXIqIHMpCitjb3B5X2dyb3VwaW5nKGNvbnN0IGNoYXIqIHMpCiB7CiAgICAgaW50IGk7CiAgICAgUHlPYmplY3QgKnJlc3VsdCwgKnZhbCA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sc3Byb2YuYyBiL01vZHVsZXMvX2xzcHJvZi5jCmluZGV4IDY2ZTUzNGYuLmRjM2Y4YWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xzcHJvZi5jCisrKyBiL01vZHVsZXMvX2xzcHJvZi5jCkBAIC0yLDE3ICsyLDEzIEBACiAjaW5jbHVkZSAiZnJhbWVvYmplY3QuaCIKICNpbmNsdWRlICJyb3RhdGluZ3RyZWUuaCIKIAotI2lmICFkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotI2Vycm9yICJUaGlzIG1vZHVsZSByZXF1aXJlcyBsb25nIGxvbmdzISIKLSNlbmRpZgotCiAvKioqIFNlbGVjdGlvbiBvZiBhIGhpZ2gtcHJlY2lzaW9uIHRpbWVyICoqKi8KIAogI2lmZGVmIE1TX1dJTkRPV1MKIAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIAotc3RhdGljIFBZX0xPTkdfTE9ORworc3RhdGljIGxvbmcgbG9uZwogaHBUaW1lcih2b2lkKQogewogICAgIExBUkdFX0lOVEVHRVIgbGk7CkBAIC0zOSwxMSArMzUsMTEgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxzeXMvdGltZXMuaD4KIAotc3RhdGljIFBZX0xPTkdfTE9ORworc3RhdGljIGxvbmcgbG9uZwogaHBUaW1lcih2b2lkKQogewogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIFBZX0xPTkdfTE9ORyByZXQ7CisgICAgbG9uZyBsb25nIHJldDsKICNpZmRlZiBHRVRUSU1FT0ZEQVlfTk9fVFoKICAgICBnZXR0aW1lb2ZkYXkoJnR2KTsKICNlbHNlCkBAIC03MCw4ICs2Niw4IEBACiAvKiByZXByZXNlbnRzIGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gYW5vdGhlciBmdW5jdGlvbiAqLwogdHlwZWRlZiBzdHJ1Y3QgX1Byb2ZpbGVyU3ViRW50cnkgewogICAgIHJvdGF0aW5nX25vZGVfdCBoZWFkZXI7Ci0gICAgUFlfTE9OR19MT05HIHR0OwotICAgIFBZX0xPTkdfTE9ORyBpdDsKKyAgICBsb25nIGxvbmcgdHQ7CisgICAgbG9uZyBsb25nIGl0OwogICAgIGxvbmcgY2FsbGNvdW50OwogICAgIGxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OwogICAgIGxvbmcgcmVjdXJzaW9uTGV2ZWw7CkBAIC04MSw4ICs3Nyw4IEBACiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJFbnRyeSB7CiAgICAgcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKICAgICBQeU9iamVjdCAqdXNlck9iajsgLyogUHlDb2RlT2JqZWN0LCBvciBhIGRlc2NyaXB0aXZlIHN0ciBmb3IgYnVpbHRpbnMgKi8KLSAgICBQWV9MT05HX0xPTkcgdHQ7IC8qIHRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSAqLwotICAgIFBZX0xPTkdfTE9ORyBpdDsgLyogaW5saW5lIHRpbWUgaW4gdGhpcyBlbnRyeSAobm90IGluIHN1YmNhbGxzKSAqLworICAgIGxvbmcgbG9uZyB0dDsgLyogdG90YWwgdGltZSBpbiB0aGlzIGVudHJ5ICovCisgICAgbG9uZyBsb25nIGl0OyAvKiBpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpICovCiAgICAgbG9uZyBjYWxsY291bnQ7IC8qIGhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCAqLwogICAgIGxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkgKi8KICAgICBsb25nIHJlY3Vyc2lvbkxldmVsOwpAQCAtOTAsOCArODYsOCBAQAogfSBQcm9maWxlckVudHJ5OwogCiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJDb250ZXh0IHsKLSAgICBQWV9MT05HX0xPTkcgdDA7Ci0gICAgUFlfTE9OR19MT05HIHN1YnQ7CisgICAgbG9uZyBsb25nIHQwOworICAgIGxvbmcgbG9uZyBzdWJ0OwogICAgIHN0cnVjdCBfUHJvZmlsZXJDb250ZXh0ICpwcmV2aW91czsKICAgICBQcm9maWxlckVudHJ5ICpjdHhFbnRyeTsKIH0gUHJvZmlsZXJDb250ZXh0OwpAQCAtMTIxLDkgKzExNyw5IEBACiAjZGVmaW5lIERPVUJMRV9USU1FUl9QUkVDSVNJT04gICA0Mjk0OTY3Mjk2LjAKIHN0YXRpYyBQeU9iamVjdCAqZW1wdHlfdHVwbGU7CiAKLXN0YXRpYyBQWV9MT05HX0xPTkcgQ2FsbEV4dGVybmFsVGltZXIoUHJvZmlsZXJPYmplY3QgKnBPYmopCitzdGF0aWMgbG9uZyBsb25nIENhbGxFeHRlcm5hbFRpbWVyKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotICAgIFBZX0xPTkdfTE9ORyByZXN1bHQ7CisgICAgbG9uZyBsb25nIHJlc3VsdDsKICAgICBQeU9iamVjdCAqbyA9IFB5T2JqZWN0X0NhbGwocE9iai0+ZXh0ZXJuYWxUaW1lciwgZW1wdHlfdHVwbGUsIE5VTEwpOwogICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHBPYmotPmV4dGVybmFsVGltZXIpOwpAQCAtMTM2LDExICsxMzIsMTEgQEAKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIC8qIGludGVycHJldCB0aGUgcmVzdWx0IGFzIGEgZG91YmxlIG1lYXN1cmVkIGluIHNlY29uZHMuCi0gICAgICAgICAgIEFzIHRoZSBwcm9maWxlciB3b3JrcyB3aXRoIFBZX0xPTkdfTE9ORyBpbnRlcm5hbGx5CisgICAgICAgICAgIEFzIHRoZSBwcm9maWxlciB3b3JrcyB3aXRoIGxvbmcgbG9uZyBpbnRlcm5hbGx5CiAgICAgICAgICAgIHdlIGNvbnZlcnQgaXQgdG8gYSBsYXJnZSBpbnRlZ2VyICovCiAgICAgICAgIGRvdWJsZSB2YWwgPSBQeUZsb2F0X0FzRG91YmxlKG8pOwogICAgICAgICAvKiBlcnJvciBoYW5kbGluZyBkZWxheWVkIHRvIHRoZSBjb2RlIGJlbG93ICovCi0gICAgICAgIHJlc3VsdCA9IChQWV9MT05HX0xPTkcpICh2YWwgKiBET1VCTEVfVElNRVJfUFJFQ0lTSU9OKTsKKyAgICAgICAgcmVzdWx0ID0gKGxvbmcgbG9uZykgKHZhbCAqIERPVUJMRV9USU1FUl9QUkVDSVNJT04pOwogICAgIH0KICAgICBQeV9ERUNSRUYobyk7CiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKQEAgLTM0Miw4ICszMzgsOCBAQAogc3RhdGljIHZvaWQKIFN0b3AoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyQ29udGV4dCAqc2VsZiwgUHJvZmlsZXJFbnRyeSAqZW50cnkpCiB7Ci0gICAgUFlfTE9OR19MT05HIHR0ID0gQ0FMTF9USU1FUihwT2JqKSAtIHNlbGYtPnQwOwotICAgIFBZX0xPTkdfTE9ORyBpdCA9IHR0IC0gc2VsZi0+c3VidDsKKyAgICBsb25nIGxvbmcgdHQgPSBDQUxMX1RJTUVSKHBPYmopIC0gc2VsZi0+dDA7CisgICAgbG9uZyBsb25nIGl0ID0gdHQgLSBzZWxmLT5zdWJ0OwogICAgIGlmIChzZWxmLT5wcmV2aW91cykKICAgICAgICAgc2VsZi0+cHJldmlvdXMtPnN1YnQgKz0gdHQ7CiAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHNlbGYtPnByZXZpb3VzOwpAQCAtNzYyLDcgKzc1OCw2IEBACiBzdGF0aWMgaW50CiBwcm9maWxlcl9pbml0KFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotICAgIFB5T2JqZWN0ICpvOwogICAgIFB5T2JqZWN0ICp0aW1lciA9IE5VTEw7CiAgICAgZG91YmxlIHRpbWV1bml0ID0gMC4wOwogICAgIGludCBzdWJjYWxscyA9IDE7CkBAIC03NzcsMTEgKzc3Miw5IEBACiAKICAgICBpZiAoc2V0U3ViY2FsbHMocE9iaiwgc3ViY2FsbHMpIDwgMCB8fCBzZXRCdWlsdGlucyhwT2JqLCBidWlsdGlucykgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgbyA9IHBPYmotPmV4dGVybmFsVGltZXI7Ci0gICAgcE9iai0+ZXh0ZXJuYWxUaW1lciA9IHRpbWVyOwotICAgIFB5X1hJTkNSRUYodGltZXIpOwotICAgIFB5X1hERUNSRUYobyk7CiAgICAgcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPSB0aW1ldW5pdDsKKyAgICBQeV9YSU5DUkVGKHRpbWVyKTsKKyAgICBQeV9YU0VUUkVGKHBPYmotPmV4dGVybmFsVGltZXIsIHRpbWVyKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHptYW1vZHVsZS5jIGIvTW9kdWxlcy9fbHptYW1vZHVsZS5jCmluZGV4IGJjMDFmZmUuLjVlMTU4ZmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2x6bWFtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sem1hbW9kdWxlLmMKQEAgLTE4LDEyICsxOCw2IEBACiAKICNpbmNsdWRlIDxsem1hLmg+CiAKLQotI2lmbmRlZiBQWV9MT05HX0xPTkcKLSNlcnJvciAiVGhpcyBtb2R1bGUgcmVxdWlyZXMgUFlfTE9OR19MT05HIHRvIGJlIGRlZmluZWQiCi0jZW5kaWYKLQotCiAjaWZkZWYgV0lUSF9USFJFQUQKICNkZWZpbmUgQUNRVUlSRV9MT0NLKG9iaikgZG8geyBcCiAgICAgaWYgKCFQeVRocmVhZF9hY3F1aXJlX2xvY2soKG9iaiktPmxvY2ssIDApKSB7IFwKQEAgLTE2Myw3ICsxNTcsNyBAQAogICAgICAgdWludDMyX3QgLSB0aGUgIkkiICh1bnNpZ25lZCBpbnQpIHNwZWNpZmllciBpcyB0aGUgcmlnaHQgc2l6ZSwgYnV0CiAgICAgICBzaWxlbnRseSBpZ25vcmVzIG92ZXJmbG93cyBvbiBjb252ZXJzaW9uLgogCi0gICAgICBsem1hX3ZsaSAtIHRoZSAiSyIgKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgc3BlY2lmaWVyIGlzIHRoZSByaWdodAorICAgICAgbHptYV92bGkgLSB0aGUgIksiICh1bnNpZ25lZCBsb25nIGxvbmcpIHNwZWNpZmllciBpcyB0aGUgcmlnaHQKICAgICAgIHNpemUsIGJ1dCBsaWtlICJJIiBpdCBzaWxlbnRseSBpZ25vcmVzIG92ZXJmbG93cyBvbiBjb252ZXJzaW9uLgogCiAgICAgICBsem1hX21vZGUgYW5kIGx6bWFfbWF0Y2hfZmluZGVyIC0gdGhlc2UgYXJlIGVudW1lcmF0aW9uIHR5cGVzLCBhbmQKQEAgLTE3NiwxMiArMTcwLDEyIEBACiAgICAgc3RhdGljIGludCBcCiAgICAgRlVOQ05BTUUoUHlPYmplY3QgKm9iaiwgdm9pZCAqcHRyKSBcCiAgICAgeyBcCi0gICAgICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7IFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbDsgXAogICAgICAgICBcCiAgICAgICAgIHZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcob2JqKTsgXAogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgXAogICAgICAgICAgICAgcmV0dXJuIDA7IFwKLSAgICAgICAgaWYgKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKFRZUEUpdmFsICE9IHZhbCkgeyBcCisgICAgICAgIGlmICgodW5zaWduZWQgbG9uZyBsb25nKShUWVBFKXZhbCAhPSB2YWwpIHsgXAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgdG9vIGxhcmdlIGZvciAiICNUWVBFICIgdHlwZSIpOyBcCiAgICAgICAgICAgICByZXR1cm4gMDsgXApAQCAtMzk4LDcgKzM5Miw3IEBACiAgICBQeXRob24tbGV2ZWwgZmlsdGVyIHNwZWNpZmllcnMgKHJlcHJlc2VudGVkIGFzIGRpY3RzKS4gKi8KIAogc3RhdGljIGludAotc3BlY19hZGRfZmllbGQoUHlPYmplY3QgKnNwZWMsIF9QeV9JZGVudGlmaWVyICprZXksIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZSkKK3NwZWNfYWRkX2ZpZWxkKFB5T2JqZWN0ICpzcGVjLCBfUHlfSWRlbnRpZmllciAqa2V5LCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpCiB7CiAgICAgaW50IHN0YXR1czsKICAgICBQeU9iamVjdCAqdmFsdWVfb2JqZWN0OwpAQCAtNTUzLDcgKzU0Nyw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BQ29tcHJlc3Nvci5jb21wcmVzcwogCi0gICAgc2VsZjogc2VsZih0eXBlPSJDb21wcmVzc29yICoiKQogICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgIC8KIApAQCAtNTY3LDcgKzU2MCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbHptYV9MWk1BQ29tcHJlc3Nvcl9jb21wcmVzc19pbXBsKENvbXByZXNzb3IgKnNlbGYsIFB5X2J1ZmZlciAqZGF0YSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zMWY2MTUxMzY5NjNlMDBmIGlucHV0PThiNjBjYjEzZTBjZTY0MjBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zMWY2MTUxMzY5NjNlMDBmIGlucHV0PTY0MDE5ZWFjN2YyY2M4ZDBdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApAQCAtNTgzLDggKzU3Niw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BQ29tcHJlc3Nvci5mbHVzaAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJDb21wcmVzc29yICoiKQotCiBGaW5pc2ggdGhlIGNvbXByZXNzaW9uIHByb2Nlc3MuCiAKIFJldHVybnMgdGhlIGNvbXByZXNzZWQgZGF0YSBsZWZ0IGluIGludGVybmFsIGJ1ZmZlcnMuCkBAIC01OTQsNyArNTg1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF9sem1hX0xaTUFDb21wcmVzc29yX2ZsdXNoX2ltcGwoQ29tcHJlc3NvciAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZWMyMWYzZTIyNTA0ZjUwIGlucHV0PTMwNjBmYjI2ZjliNDA0MmNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZWMyMWYzZTIyNTA0ZjUwIGlucHV0PTZiMzY5MzAzZjY3YWQwYThdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApAQCAtNjk4LDcgKzY4OSw2IEBACiAvKlstY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQUNvbXByZXNzb3IuX19pbml0X18KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQ29tcHJlc3NvciAqIikKICAgICBmb3JtYXQ6IGludChjX2RlZmF1bHQ9IkZPUk1BVF9YWiIpID0gRk9STUFUX1haCiAgICAgICAgIFRoZSBjb250YWluZXIgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIG91dHB1dC4gIFRoaXMgY2FuCiAgICAgICAgIGJlIEZPUk1BVF9YWiAoZGVmYXVsdCksIEZPUk1BVF9BTE9ORSwgb3IgRk9STUFUX1JBVy4KQEAgLTEwNjMsNyArMTA1Myw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BRGVjb21wcmVzc29yLmRlY29tcHJlc3MKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iRGVjb21wcmVzc29yICoiKQogICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgIG1heF9sZW5ndGg6IFB5X3NzaXplX3Q9LTEKIApAQCAtMTA4Niw3ICsxMDc1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbHptYV9MWk1BRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChEZWNvbXByZXNzb3IgKnNlbGYsIFB5X2J1ZmZlciAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lZjRlMjBlYzcxMjIyNDFkIGlucHV0PWYyYmI5MDJjYzFjYWYyMDNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lZjRlMjBlYzcxMjIyNDFkIGlucHV0PTYwYzFmMTM1ODIwZTMwOWRdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApAQCAtMTEyNiw3ICsxMTE1LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFEZWNvbXByZXNzb3IuX19pbml0X18KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iRGVjb21wcmVzc29yICoiKQogICAgIGZvcm1hdDogaW50KGNfZGVmYXVsdD0iRk9STUFUX0FVVE8iKSA9IEZPUk1BVF9BVVRPCiAgICAgICAgIFNwZWNpZmllcyB0aGUgY29udGFpbmVyIGZvcm1hdCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhpcyBpcwogICAgICAgICBGT1JNQVRfQVVUTyAodGhlIGRlZmF1bHQpLCB0aGUgZGVjb21wcmVzc29yIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QKQEAgLTExNTIsNyArMTE0MCw3IEBACiBzdGF0aWMgaW50CiBfbHptYV9MWk1BRGVjb21wcmVzc29yX19faW5pdF9fX2ltcGwoRGVjb21wcmVzc29yICpzZWxmLCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptZW1saW1pdCwgUHlPYmplY3QgKmZpbHRlcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2UxODIxZjhhYTM2NTY0YyBpbnB1dD00NThjYTYxMzJlZjI5ODAxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2UxODIxZjhhYTM2NTY0YyBpbnB1dD04MWZlNjg0YTZjMmY4YTI3XSovCiB7CiAgICAgY29uc3QgdWludDMyX3QgZGVjb2Rlcl9mbGFncyA9IExaTUFfVEVMTF9BTllfQ0hFQ0sgfCBMWk1BX1RFTExfTk9fQ0hFQ0s7CiAgICAgdWludDY0X3QgbWVtbGltaXRfID0gVUlOVDY0X01BWDsKQEAgLTE0NDcsNyArMTQzNSw3IEBACiAvKiBTb21lIG9mIG91ciBjb25zdGFudHMgYXJlIG1vcmUgdGhhbiAzMiBiaXRzIHdpZGUsIHNvIFB5TW9kdWxlX0FkZEludENvbnN0YW50CiAgICB3b3VsZCBub3Qgd29yayBjb3JyZWN0bHkgb24gcGxhdGZvcm1zIHdpdGggMzItYml0IGxvbmdzLiAqLwogc3RhdGljIGludAotbW9kdWxlX2FkZF9pbnRfY29uc3RhbnQoUHlPYmplY3QgKm0sIGNvbnN0IGNoYXIgKm5hbWUsIFBZX0xPTkdfTE9ORyB2YWx1ZSkKK21vZHVsZV9hZGRfaW50X2NvbnN0YW50KFB5T2JqZWN0ICptLCBjb25zdCBjaGFyICpuYW1lLCBsb25nIGxvbmcgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKm8gPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKICAgICBpZiAobyA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCmluZGV4IDRhZTYzOGUuLmQ5MmE4YmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgIHsicmVjdiIsIG11bHRpcHJvY2Vzc2luZ19yZWN2LCBNRVRIX1ZBUkFSR1MsICIifSwKICAgICB7InNlbmQiLCBtdWx0aXByb2Nlc3Npbmdfc2VuZCwgTUVUSF9WQVJBUkdTLCAiIn0sCiAjZW5kaWYKLSNpZm5kZWYgUE9TSVhfU0VNQVBIT1JFU19OT1RfRU5BQkxFRAorI2lmICFkZWZpbmVkKFBPU0lYX1NFTUFQSE9SRVNfTk9UX0VOQUJMRUQpICYmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQogICAgIHsic2VtX3VubGluayIsIF9QeU1wX3NlbV91bmxpbmssIE1FVEhfVkFSQVJHUywgIiJ9LAogI2VuZGlmCiAgICAge05VTEx9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmggYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmgKaW5kZXggOWFlZWE4ZC4uNTEyYmMxNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5oCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuaApAQCAtNjAsNyArNjAsNyBAQAogI2lmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX0xPTkcKICMgIGRlZmluZSBGX1BPSU5URVIgImsiCiAjICBkZWZpbmUgVF9QT0lOVEVSIFRfVUxPTkcKLSNlbGlmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIChTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9MT05HX0xPTkcpCisjZWxpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9MT05HX0xPTkcKICMgIGRlZmluZSBGX1BPSU5URVIgIksiCiAjICBkZWZpbmUgVF9QT0lOVEVSIFRfVUxPTkdMT05HCiAjZWxzZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fb3BlcmF0b3IuYyBiL01vZHVsZXMvX29wZXJhdG9yLmMKaW5kZXggZGZmZjFkMi4uZmI4ZWFmYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fb3BlcmF0b3IuYworKysgYi9Nb2R1bGVzL19vcGVyYXRvci5jCkBAIC0xMTExLDYgKzExMTEsOCBAQAogICAgICAgICBQeU9iamVjdCAqZnVuY3Rvb2xzOwogICAgICAgICBQeU9iamVjdCAqcGFydGlhbDsKICAgICAgICAgUHlPYmplY3QgKmNvbnN0cnVjdG9yOworICAgICAgICBQeU9iamVjdCAqbmV3YXJnc1syXTsKKwogICAgICAgICBfUHlfSURFTlRJRklFUihwYXJ0aWFsKTsKICAgICAgICAgZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKICAgICAgICAgaWYgKCFmdW5jdG9vbHMpCkBAIC0xMTE5LDE3ICsxMTIxLDExIEBACiAgICAgICAgIFB5X0RFQ1JFRihmdW5jdG9vbHMpOwogICAgICAgICBpZiAoIXBhcnRpYWwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgbmV3YXJncyA9IFB5VHVwbGVfTmV3KDIpOwotICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocGFydGlhbCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYoUHlfVFlQRShtYykpOwotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIChQeU9iamVjdCAqKVB5X1RZUEUobWMpKTsKLSAgICAgICAgUHlfSU5DUkVGKG1jLT5uYW1lKTsKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAxLCBtYy0+bmFtZSk7Ci0gICAgICAgIGNvbnN0cnVjdG9yID0gUHlPYmplY3RfQ2FsbChwYXJ0aWFsLCBuZXdhcmdzLCBtYy0+a3dkcyk7Ci0gICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKworICAgICAgICBuZXdhcmdzWzBdID0gKFB5T2JqZWN0ICopUHlfVFlQRShtYyk7CisgICAgICAgIG5ld2FyZ3NbMV0gPSBtYy0+bmFtZTsKKyAgICAgICAgY29uc3RydWN0b3IgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KHBhcnRpYWwsIG5ld2FyZ3MsIDIsIG1jLT5rd2RzKTsKKwogICAgICAgICBQeV9ERUNSRUYocGFydGlhbCk7CiAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOTyIsIGNvbnN0cnVjdG9yLCBtYy0+YXJncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcGlja2xlLmMgYi9Nb2R1bGVzL19waWNrbGUuYwppbmRleCAzYzIxYjZhLi5mYzE2YzYzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19waWNrbGUuYworKysgYi9Nb2R1bGVzL19waWNrbGUuYwpAQCAtMTUzLDYgKzE1Myw5IEBACiAgICAgUHlPYmplY3QgKmNvZGVjc19lbmNvZGU7CiAgICAgLyogYnVpbHRpbnMuZ2V0YXR0ciwgdXNlZCBmb3Igc2F2aW5nIG5lc3RlZCBuYW1lcyB3aXRoIHByb3RvY29sIDwgNCAqLwogICAgIFB5T2JqZWN0ICpnZXRhdHRyOworICAgIC8qIGZ1bmN0b29scy5wYXJ0aWFsLCB1c2VkIGZvciBpbXBsZW1lbnRpbmcgX19uZXdvYmpfZXhfXyB3aXRoIHByb3RvY29scworICAgICAgIDIgYW5kIDMgKi8KKyAgICBQeU9iamVjdCAqcGFydGlhbDsKIH0gUGlja2xlU3RhdGU7CiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIF9waWNrbGUgbW9kdWxlIGRlZmluaXRpb24uICovCkBAIC0xOTAsNiArMTkzLDcgQEAKICAgICBQeV9DTEVBUihzdC0+aW1wb3J0X21hcHBpbmdfM3RvMik7CiAgICAgUHlfQ0xFQVIoc3QtPmNvZGVjc19lbmNvZGUpOwogICAgIFB5X0NMRUFSKHN0LT5nZXRhdHRyKTsKKyAgICBQeV9DTEVBUihzdC0+cGFydGlhbCk7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGdpdmVuIHBpY2tsZSBtb2R1bGUgc3RhdGUuICovCkBAIC0yMDAsNiArMjA0LDcgQEAKICAgICBQeU9iamVjdCAqY29weXJlZyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmNvbXBhdF9waWNrbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpjb2RlY3MgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmdW5jdG9vbHMgPSBOVUxMOwogCiAgICAgYnVpbHRpbnMgPSBQeUV2YWxfR2V0QnVpbHRpbnMoKTsKICAgICBpZiAoYnVpbHRpbnMgPT0gTlVMTCkKQEAgLTMxNCwxMiArMzE5LDIxIEBACiAgICAgfQogICAgIFB5X0NMRUFSKGNvZGVjcyk7CiAKKyAgICBmdW5jdG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImZ1bmN0b29scyIpOworICAgIGlmICghZnVuY3Rvb2xzKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHN0LT5wYXJ0aWFsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jdG9vbHMsICJwYXJ0aWFsIik7CisgICAgaWYgKCFzdC0+cGFydGlhbCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9DTEVBUihmdW5jdG9vbHMpOworCiAgICAgcmV0dXJuIDA7CiAKICAgZXJyb3I6CiAgICAgUHlfQ0xFQVIoY29weXJlZyk7CiAgICAgUHlfQ0xFQVIoY29tcGF0X3BpY2tsZSk7CiAgICAgUHlfQ0xFQVIoY29kZWNzKTsKKyAgICBQeV9DTEVBUihmdW5jdG9vbHMpOwogICAgIF9QaWNrbGVfQ2xlYXJTdGF0ZShzdCk7CiAgICAgcmV0dXJuIC0xOwogfQpAQCAtMzMxLDQzICszNDUsMjAgQEAKIF9QaWNrbGVfRmFzdENhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpvYmopCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICBQeU9iamVjdCAqYXJnX3R1cGxlID0gUHlUdXBsZV9OZXcoMSk7CiAKLSAgICAvKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHVzZWQgdG8gcmV1c2UgdGhlIGFyZ3VtZW50IHR1cGxlLiBUaGlzIHVzZWQgdG8gZ2l2ZQotICAgICAgIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGJvb3N0IHdpdGggb2xkZXIgcGlja2xlIGltcGxlbWVudGF0aW9ucyB3aGVyZSBtYW55Ci0gICAgICAgdW5idWZmZXJlZCByZWFkcyBvY2N1cnJlZCAodGh1cyBuZWVkaW5nIG1hbnkgZnVuY3Rpb24gY2FsbHMpLgotCi0gICAgICAgSG93ZXZlciwgdGhpcyBvcHRpbWl6YXRpb24gd2FzIHJlbW92ZWQgYmVjYXVzZSBpdCB3YXMgdG9vIGNvbXBsaWNhdGVkCi0gICAgICAgdG8gZ2V0IHJpZ2h0LiBJdCBhYnVzZWQgdGhlIEMgQVBJIGZvciB0dXBsZXMgdG8gbXV0YXRlIHRoZW0gd2hpY2ggbGVkCi0gICAgICAgdG8gc3VidGxlIHJlZmVyZW5jZSBjb3VudGluZyBhbmQgY29uY3VycmVuY3kgYnVncy4gRnVydGhlcm1vcmUsIHRoZQotICAgICAgIGludHJvZHVjdGlvbiBvZiBwcm90b2NvbCA0IGFuZCB0aGUgcHJlZmV0Y2hpbmcgb3B0aW1pemF0aW9uIHZpYSBwZWVrKCkKLSAgICAgICBzaWduaWZpY2FudGx5IHJlZHVjZWQgdGhlIG51bWJlciBvZiBmdW5jdGlvbiBjYWxscyB3ZSBkby4gVGh1cywgdGhlCi0gICAgICAgYmVuZWZpdHMgYmVjYW1lIG1hcmdpbmFsIGF0IGJlc3QuICovCi0KLSAgICBpZiAoYXJnX3R1cGxlID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ190dXBsZSwgMCwgb2JqKTsKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ190dXBsZSwgTlVMTCk7Ci0gICAgUHlfQ0xFQVIoYXJnX3R1cGxlKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbEFyZzEoZnVuYywgb2JqKTsKKyAgICBQeV9ERUNSRUYob2JqKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotc3RhY2tfdW5kZXJmbG93KHZvaWQpCi17Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qIEludGVybmFsIGRhdGEgdHlwZSB1c2VkIGFzIHRoZSB1bnBpY2tsaW5nIHN0YWNrLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgUHlPYmplY3QgKipkYXRhOworICAgIGludCBtYXJrX3NldDsgICAgICAgICAgLyogaXMgTUFSSyBzZXQ/ICovCisgICAgUHlfc3NpemVfdCBmZW5jZTsgICAgICAvKiBwb3NpdGlvbiBvZiB0b3AgTUFSSyBvciAwICovCiAgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7ICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KIH0gUGRhdGE7CiAKQEAgLTM5OCw2ICszODksOCBAQAogICAgIGlmICghKHNlbGYgPSBQeU9iamVjdF9OZXcoUGRhdGEsICZQZGF0YV9UeXBlKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1NJWkUoc2VsZikgPSAwOworICAgIHNlbGYtPm1hcmtfc2V0ID0gMDsKKyAgICBzZWxmLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+YWxsb2NhdGVkID0gODsKICAgICBzZWxmLT5kYXRhID0gUHlNZW1fTUFMTE9DKHNlbGYtPmFsbG9jYXRlZCAqIHNpemVvZihQeU9iamVjdCAqKSk7CiAgICAgaWYgKHNlbGYtPmRhdGEpCkBAIC00MTUsOCArNDA4LDcgQEAKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBQeV9TSVpFKHNlbGYpOwogCi0gICAgaWYgKGNsZWFydG8gPCAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgYXNzZXJ0KGNsZWFydG8gPj0gc2VsZi0+ZmVuY2UpOwogICAgIGlmIChjbGVhcnRvID49IGkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC00NTIsNiArNDQ0LDE3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50CitQZGF0YV9zdGFja191bmRlcmZsb3coUGRhdGEgKnNlbGYpCit7CisgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXJrX3NldCA/CisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE1BUksgZm91bmQiIDoKKyAgICAgICAgICAgICAgICAgICAgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOworfQorCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4KQEAgLTQ1OSw5ICs0NjIsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcChQZGF0YSAqc2VsZikKIHsKLSAgICBpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5mZW5jZSkgeworICAgICAgICBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc2VsZi0+ZGF0YVstLVB5X1NJWkUoc2VsZildOwpAQCAtNDkzLDYgKzQ5NSwxMCBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKICAgICBQeV9zc2l6ZV90IGxlbiwgaSwgajsKIAorICAgIGlmIChzdGFydCA8IHNlbGYtPmZlbmNlKSB7CisgICAgICAgIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGxlbiA9IFB5X1NJWkUoc2VsZikgLSBzdGFydDsKICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC04NjAsNyArODY2LDcgQEAKIHsKICAgICBzaXplX3QgaTsKIAotICAgIGFzc2VydChzaXplb2Yoc2l6ZV90KSA8PSA4KTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPD0gOCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpemVfdCk7IGkrKykgewogICAgICAgICBvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+ICg4ICogaSkpICYgMHhmZik7CkBAIC0xMDg2LDYgKzEwOTIsMTQgQEAKIH0KIAogc3RhdGljIGludAorYmFkX3JlYWRsaW5lKHZvaWQpCit7CisgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAicGlja2xlIGRhdGEgd2FzIHRydW5jYXRlZCIpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAogX1VucGlja2xlcl9Ta2lwQ29uc3VtZWQoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewogICAgIFB5X3NzaXplX3QgY29uc3VtZWQ7CkBAIC0xMTM0LDkgKzExNDgsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAobiA9PSBSRUFEX1dIT0xFX0xJTkUpIHsKLSAgICAgICAgUHlPYmplY3QgKmVtcHR5X3R1cGxlID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgIGRhdGEgPSBQeU9iamVjdF9DYWxsKHNlbGYtPnJlYWRsaW5lLCBlbXB0eV90dXBsZSwgTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihlbXB0eV90dXBsZSk7CisgICAgICAgIGRhdGEgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKHNlbGYtPnJlYWRsaW5lKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5T2JqZWN0ICpsZW47CkBAIC0xMTc0LDYgKzExODYsMzYgQEAKICAgICByZXR1cm4gcmVhZF9zaXplOwogfQogCisvKiBEb24ndCBjYWxsIGl0IGRpcmVjdGx5OiB1c2UgX1VucGlja2xlcl9SZWFkKCkgKi8KK3N0YXRpYyBQeV9zc2l6ZV90CitfVW5waWNrbGVyX1JlYWRJbXBsKFVucGlja2xlck9iamVjdCAqc2VsZiwgY2hhciAqKnMsIFB5X3NzaXplX3QgbikKK3sKKyAgICBQeV9zc2l6ZV90IG51bV9yZWFkOworCisgICAgKnMgPSBOVUxMOworICAgIGlmIChzZWxmLT5uZXh0X3JlYWRfaWR4ID4gUFlfU1NJWkVfVF9NQVggLSBuKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCB3b3VsZCBvdmVyZmxvdyAoaW52YWxpZCBieXRlY29kZSkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGJ5IHRoZSBfVW5waWNrbGVyX1JlYWQoKSBtYWNybyBmb3IgZWZmaWNpZW5jeSAqLworICAgIGFzc2VydChzZWxmLT5uZXh0X3JlYWRfaWR4ICsgbiA+IHNlbGYtPmlucHV0X2xlbik7CisKKyAgICBpZiAoIXNlbGYtPnJlYWQpCisgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKworICAgIG51bV9yZWFkID0gX1VucGlja2xlcl9SZWFkRnJvbUZpbGUoc2VsZiwgbik7CisgICAgaWYgKG51bV9yZWFkIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChudW1fcmVhZCA8IG4pCisgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICAqcyA9IHNlbGYtPmlucHV0X2J1ZmZlcjsKKyAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ID0gbjsKKyAgICByZXR1cm4gbjsKK30KKwogLyogUmVhZCBgbmAgYnl0ZXMgZnJvbSB0aGUgdW5waWNrbGVyJ3MgZGF0YSBzb3VyY2UsIHN0b3JpbmcgdGhlIHJlc3VsdCBpbiBgKnNgLgogCiAgICBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgZGF0YSByZWFkcywgcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSB1bnBpY2tsZXIncwpAQCAtMTE4NywzOCArMTIyOSwxMiBAQAogCiAgICBSZXR1cm5zIC0xICh3aXRoIGFuIGV4Y2VwdGlvbiBzZXQpIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHJldHVybiB0aGUKICAgIG51bWJlciBvZiBjaGFycyByZWFkLiAqLwotc3RhdGljIFB5X3NzaXplX3QKLV9VbnBpY2tsZXJfUmVhZChVbnBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90IG4pCi17Ci0gICAgUHlfc3NpemVfdCBudW1fcmVhZDsKLQotICAgICpzID0gTlVMTDsKLSAgICBpZiAoc2VsZi0+bmV4dF9yZWFkX2lkeCA+IFBZX1NTSVpFX1RfTUFYIC0gbikgewotICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlYWQgd291bGQgb3ZlcmZsb3cgKGludmFsaWQgYnl0ZWNvZGUpIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHNlbGYtPm5leHRfcmVhZF9pZHggKyBuIDw9IHNlbGYtPmlucHV0X2xlbikgewotICAgICAgICAqcyA9IHNlbGYtPmlucHV0X2J1ZmZlciArIHNlbGYtPm5leHRfcmVhZF9pZHg7Ci0gICAgICAgIHNlbGYtPm5leHRfcmVhZF9pZHggKz0gbjsKLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIGlmICghc2VsZi0+cmVhZCkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfRU9GRXJyb3IsICJSYW4gb3V0IG9mIGlucHV0Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbnVtX3JlYWQgPSBfVW5waWNrbGVyX1JlYWRGcm9tRmlsZShzZWxmLCBuKTsKLSAgICBpZiAobnVtX3JlYWQgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKG51bV9yZWFkIDwgbikgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfRU9GRXJyb3IsICJSYW4gb3V0IG9mIGlucHV0Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgKnMgPSBzZWxmLT5pbnB1dF9idWZmZXI7Ci0gICAgc2VsZi0+bmV4dF9yZWFkX2lkeCA9IG47Ci0gICAgcmV0dXJuIG47Ci19CisjZGVmaW5lIF9VbnBpY2tsZXJfUmVhZChzZWxmLCBzLCBuKSBcCisgICAgKCgobikgPD0gKHNlbGYpLT5pbnB1dF9sZW4gLSAoc2VsZiktPm5leHRfcmVhZF9pZHgpICAgICAgXAorICAgICA/ICgqKHMpID0gKHNlbGYpLT5pbnB1dF9idWZmZXIgKyAoc2VsZiktPm5leHRfcmVhZF9pZHgsIFwKKyAgICAgICAgKHNlbGYpLT5uZXh0X3JlYWRfaWR4ICs9IChuKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6IF9VbnBpY2tsZXJfUmVhZEltcGwoc2VsZiwgKHMpLCAobikpKQogCiBzdGF0aWMgUHlfc3NpemVfdAogX1VucGlja2xlcl9Db3B5TGluZShVbnBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKmxpbmUsIFB5X3NzaXplX3QgbGVuLApAQCAtMTIzOCw3ICsxMjU0LDcgQEAKIH0KIAogLyogUmVhZCBhIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtL2J1ZmZlci4gSWYgd2UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dAotICAgYmVmb3JlIGhpdHRpbmcgXG4sIHJldHVybiB0aGUgZGF0YSB3ZSBmb3VuZC4KKyAgIGJlZm9yZSBoaXR0aW5nIFxuLCByYWlzZSBhbiBlcnJvci4KIAogICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuICovCiBzdGF0aWMgUHlfc3NpemVfdApAQCAtMTI1NCwyMCArMTI3MCwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIF9VbnBpY2tsZXJfQ29weUxpbmUoc2VsZiwgbGluZV9zdGFydCwgbnVtX3JlYWQsIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHNlbGYtPnJlYWQpIHsKLSAgICAgICAgbnVtX3JlYWQgPSBfVW5waWNrbGVyX1JlYWRGcm9tRmlsZShzZWxmLCBSRUFEX1dIT0xFX0xJTkUpOwotICAgICAgICBpZiAobnVtX3JlYWQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ID0gbnVtX3JlYWQ7Ci0gICAgICAgIHJldHVybiBfVW5waWNrbGVyX0NvcHlMaW5lKHNlbGYsIHNlbGYtPmlucHV0X2J1ZmZlciwgbnVtX3JlYWQsIHJlc3VsdCk7Ci0gICAgfQorICAgIGlmICghc2VsZi0+cmVhZCkKKyAgICAgICAgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwogCi0gICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLiBSZXR1cm4gdGhlCi0gICAgICAgcmVtYWluaW5nIHN0cmluZyBhbmQgbGV0IHRoZSBjYWxsZXIgZmlndXJlIGl0IG91dC4gKi8KLSAgICAqcmVzdWx0ID0gc2VsZi0+aW5wdXRfYnVmZmVyICsgc2VsZi0+bmV4dF9yZWFkX2lkeDsKLSAgICBudW1fcmVhZCA9IGkgLSBzZWxmLT5uZXh0X3JlYWRfaWR4OwotICAgIHNlbGYtPm5leHRfcmVhZF9pZHggPSBpOwotICAgIHJldHVybiBudW1fcmVhZDsKKyAgICBudW1fcmVhZCA9IF9VbnBpY2tsZXJfUmVhZEZyb21GaWxlKHNlbGYsIFJFQURfV0hPTEVfTElORSk7CisgICAgaWYgKG51bV9yZWFkIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChudW1fcmVhZCA9PSAwIHx8IHNlbGYtPmlucHV0X2J1ZmZlcltudW1fcmVhZCAtIDFdICE9ICdcbicpCisgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ID0gbnVtX3JlYWQ7CisgICAgcmV0dXJuIF9VbnBpY2tsZXJfQ29weUxpbmUoc2VsZiwgc2VsZi0+aW5wdXRfYnVmZmVyLCBudW1fcmVhZCwgcmVzdWx0KTsKIH0KIAogLyogUmV0dXJucyAtMSAod2l0aCBhbiBleGNlcHRpb24gc2V0KSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuIFRoZSBtZW1vIGFycmF5CkBAIC0yMDk2LDM4ICsyMTA4LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmF3X3VuaWNvZGVfZXNjYXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7Ci0gICAgc2l6ZV90IGV4cGFuZHNpemU7CiAgICAgdm9pZCAqZGF0YTsKICAgICB1bnNpZ25lZCBpbnQga2luZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKG9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShvYmopOwogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChvYmopOwotICAgIGlmIChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKQotICAgICAgICBleHBhbmRzaXplID0gMTA7Ci0gICAgZWxzZQotICAgICAgICBleHBhbmRzaXplID0gNjsKIAotICAgIGlmICgoc2l6ZV90KXNpemUgPiAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIHNpemUpOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHJldHVybiByZXByOwotICAgIGFzc2VydChQeV9SRUZDTlQocmVwcikgPT0gMSk7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwogICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAvKiAtMTogc3VidHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMTAtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdVJzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4Zl07CkBAIC0yMTM5LDggKzIxNDgsMTMgQEAKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDQpICYgMHhmXTsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbY2ggJiAxNV07CiAgICAgICAgIH0KLSAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCisgICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycywgJ1xcJyBhbmQgJ1xuJyB0byAnXHV4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAyNTYgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAvKiAtMTogc3VidHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHhmXTsKQEAgLTIxNTIsMTQgKzIxNjYsMTYgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9Ci0gICAgc2l6ZSA9IHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBzaXplKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAotd3JpdGVfdXRmOChQaWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IHNpemUpCit3cml0ZV91dGY4KFBpY2tsZXJPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKmRhdGEsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKICAgICBjaGFyIGhlYWRlcls5XTsKICAgICBQeV9zc2l6ZV90IGxlbjsKQEAgLTI4NTgsNyArMjg3NCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihpdGVtcyk7CiAKLSAgICAgICAgICAgIGl0ZW1zID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChvYmosICZQeUlkX2l0ZW1zLCAiKCkiKTsKKyAgICAgICAgICAgIGl0ZW1zID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChvYmosICZQeUlkX2l0ZW1zLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChpdGVtcyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihpdGVtcyk7CkBAIC0zNTM1LDExICszNTUxLDkgQEAKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZi0+cHJvdG8gPj0gNCkgewotICAgICAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOwotICAgICAgICAgICAgICAgIHVzZV9uZXdvYmpfZXggPSBQeVVuaWNvZGVfQ29tcGFyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fbmV3b2JqX2V4X18pKSA9PSAwOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfZXhfXyk7CisgICAgICAgICAgICB1c2VfbmV3b2JqX2V4ID0gUHlVbmljb2RlX0NvbXBhcmUoCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fbmV3b2JqX2V4X18pKSA9PSAwOwogICAgICAgICAgICAgaWYgKCF1c2VfbmV3b2JqX2V4KSB7CiAgICAgICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfXyk7CiAgICAgICAgICAgICAgICAgdXNlX25ld29iaiA9IFB5VW5pY29kZV9Db21wYXJlKApAQCAtMzU4MywxMSArMzU5Nyw1OCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2xzLCAwKSA8IDAgfHwKLSAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJncywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBzYXZlKHNlbGYsIGt3YXJncywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBfUGlja2xlcl9Xcml0ZShzZWxmLCAmbmV3b2JqX2V4X29wLCAxKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNlbGYtPnByb3RvID49IDQpIHsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBhcmdzLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIGt3YXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJm5ld29ial9leF9vcCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3M7CisgICAgICAgICAgICBQeU9iamVjdCAqY2xzX25ldzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3X18pOworCisgICAgICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoUHlfU0laRShhcmdzKSArIDIpOworICAgICAgICAgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGNsc19uZXcgPSBfUHlPYmplY3RfR2V0QXR0cklkKGNscywgJlB5SWRfX19uZXdfXyk7CisgICAgICAgICAgICBpZiAoY2xzX25ldyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMCwgY2xzX25ldyk7CisgICAgICAgICAgICBQeV9JTkNSRUYoY2xzKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMSwgY2xzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSArIDIsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYWxsYWJsZSA9IFB5T2JqZWN0X0NhbGwoc3QtPnBhcnRpYWwsIG5ld2FyZ3MsIGt3YXJncyk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgICAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2FsbGFibGUsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwgbmV3YXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJnJlZHVjZV9vcCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmICh1c2VfbmV3b2JqKSB7CkBAIC0zODc3LDEwICszOTM4LDcgQEAKICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhIF9fcmVkdWNlX18gbWV0aG9kLiAqLwogICAgICAgICAgICAgcmVkdWNlX2Z1bmMgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfX19yZWR1Y2VfXyk7CiAgICAgICAgICAgICBpZiAocmVkdWNlX2Z1bmMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICAgICAgICAgIHJlZHVjZV92YWx1ZSA9IFB5T2JqZWN0X0NhbGwocmVkdWNlX2Z1bmMsIGVtcHR5X3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVtcHR5X3R1cGxlKTsKKyAgICAgICAgICAgICAgICByZWR1Y2VfdmFsdWUgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKHJlZHVjZV9mdW5jKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChzdC0+UGlja2xpbmdFcnJvciwKQEAgLTQzOTcsNyArNDQ1NSw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIidtZW1vJyBhdHRyaWJ1dGUgbXVzdCBiZSBhbiBQaWNrbGVyTWVtb1Byb3h5IG9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgICInbWVtbycgYXR0cmlidXRlIG11c3QgYmUgYSBQaWNrbGVyTWVtb1Byb3h5IG9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICJvciBkaWN0LCBub3QgJS4yMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ0MjYsOCArNDQ4NCw2IEBACiBzdGF0aWMgaW50CiBQaWNrbGVyX3NldF9wZXJzaWQoUGlja2xlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC00NDM5LDEwICs0NDk1LDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHRtcCA9IHNlbGYtPnBlcnNfZnVuYzsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsgICAgICAvKiBzZWxmLT5wZXJzX2Z1bmMgY2FuIGJlIE5VTEwsIHNvIGJlIGNhcmVmdWwuICovCisgICAgUHlfWFNFVFJFRihzZWxmLT5wZXJzX2Z1bmMsIHZhbHVlKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNDUyNCwxMyArNDU3OCwxOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1hcmtlcihVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5X3NzaXplX3QgbWFyazsKKwogICAgIGlmIChzZWxmLT5udW1fbWFya3MgPCAxKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJjb3VsZCBub3QgZmluZCBNQVJLIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIG1hcmsgPSBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CisgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gc2VsZi0+bnVtX21hcmtzICE9IDA7CisgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gc2VsZi0+bnVtX21hcmtzID8KKyAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICByZXR1cm4gbWFyazsKIH0KIAogc3RhdGljIGludApAQCAtNDU0MSwxNCArNDYwMSw2IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJhZF9yZWFkbGluZSh2b2lkKQotewotICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgInBpY2tsZSBkYXRhIHdhcyB0cnVuY2F0ZWQiKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQKIGxvYWRfaW50KFVucGlja2xlck9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqdmFsdWU7CkBAIC00OTkxLDcgKzUwNDMsNyBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKIAogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8IGxlbikKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKIAogICAgIHR1cGxlID0gUGRhdGFfcG9wdHVwbGUoc2VsZi0+c3RhY2ssIFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gbGVuKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKQEAgLTUwNzMsNiArNTEyNSwxMyBAQAogICAgIGlmICgoZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogCisgICAgaWYgKChqIC0gaSkgJSAyICE9IDApIHsKKyAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgIm9kZCBudW1iZXIgb2YgaXRlbXMgZm9yIERJQ1QiKTsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgZm9yIChrID0gaSArIDE7IGsgPCBqOyBrICs9IDIpIHsKICAgICAgICAga2V5ID0gc2VsZi0+c3RhY2stPmRhdGFbayAtIDFdOwogICAgICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW2tdOwpAQCAtNTE0MCw3ICs1MTk5LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gaSA8IDEpCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICBhcmdzID0gUGRhdGFfcG9wdHVwbGUoc2VsZi0+c3RhY2ssIGkgKyAxKTsKICAgICBpZiAoYXJncyA9PSBOVUxMKQpAQCAtNTQ2MywxMiArNTUyMiwxNSBAQAogICAgICAqLwogICAgIGlmIChzZWxmLT5udW1fbWFya3MgPiAwICYmIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdID09IGxlbikgewogICAgICAgICBzZWxmLT5udW1fbWFya3MtLTsKLSAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gc2VsZi0+bnVtX21hcmtzICE9IDA7CisgICAgICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IHNlbGYtPm51bV9tYXJrcyA/CisgICAgICAgICAgICAgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzIC0gMV0gOiAwOworICAgIH0gZWxzZSBpZiAobGVuIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CisgICAgZWxzZSB7CiAgICAgICAgIGxlbi0tOwogICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhY2stPmRhdGFbbGVuXSk7CiAgICAgICAgIFB5X1NJWkUoc2VsZi0+c3RhY2spID0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01NDkwLDEwICs1NTUyLDEwIEBACiBsb2FkX2R1cChVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKmxhc3Q7Ci0gICAgUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKIAotICAgIGlmICgobGVuID0gUHlfU0laRShzZWxmLT5zdGFjaykpIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAobGVuIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgbGFzdCA9IHNlbGYtPnN0YWNrLT5kYXRhW2xlbiAtIDFdOwogICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgbGFzdCwgLTEpOwogICAgIHJldHVybiAwOwpAQCAtNTY3Niw4ICs1NzM4LDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmIChsZW4gPCAyKQogICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBrZXkgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCBOVUxMLCAxMCk7CkBAIC01NzA1LDggKzU3NjcsOCBAQAogICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDEpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBpZHggPSBQeV9DSEFSTUFTSyhzWzBdKTsKQEAgLTU3MjQsOCArNTc4Niw4IEBACiAgICAgaWYgKF9VbnBpY2tsZXJfUmVhZChzZWxmLCAmcywgNCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFbUHlfU0laRShzZWxmLT5zdGFjaykgLSAxXTsKIAogICAgIGlkeCA9IGNhbGNfYmluc2l6ZShzLCA0KTsKQEAgLTU3NDMsOCArNTgwNSw4IEBACiB7CiAgICAgUHlPYmplY3QgKnZhbHVlOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICByZXR1cm4gX1VucGlja2xlcl9NZW1vUHV0KHNlbGYsIHNlbGYtPm1lbW9fbGVuLCB2YWx1ZSk7CkBAIC01NzU4LDggKzU4MjAsOCBAQAogICAgIFB5X3NzaXplX3QgbGVuLCBpOwogCiAgICAgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7Ci0gICAgaWYgKHggPiBsZW4gfHwgeCA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKHggPiBsZW4gfHwgeCA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGlmIChsZW4gPT0geCkgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTU4MDgsOCArNTg3MCw4IEBACiBzdGF0aWMgaW50CiBsb2FkX2FwcGVuZChVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7Ci0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHJldHVybiBkb19hcHBlbmQoc2VsZiwgUHlfU0laRShzZWxmLT5zdGFjaykgLSAxKTsKIH0KIApAQCAtNTgzMSw4ICs1ODkzLDggQEAKICAgICBpbnQgc3RhdHVzID0gMDsKIAogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmICh4ID4gbGVuIHx8IHggPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmICh4ID4gbGVuIHx8IHggPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IHgpICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmICgobGVuIC0geCkgJSAyICE9IDApIHsKQEAgLTU4ODUsOCArNTk0Nyw4IEBACiAgICAgaWYgKG1hcmsgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7Ci0gICAgaWYgKG1hcmsgPiBsZW4gfHwgbWFyayA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKG1hcmsgPiBsZW4gfHwgbWFyayA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGlmIChsZW4gPT0gbWFyaykgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTU5NDEsOCArNjAwMyw4IEBACiAgICAgLyogU3RhY2sgaXMgLi4uIGluc3RhbmNlLCBzdGF0ZS4gIFdlIHdhbnQgdG8gbGVhdmUgaW5zdGFuY2UgYXQKICAgICAgKiB0aGUgc3RhY2sgdG9wLCBwb3NzaWJseSBtdXRhdGVkIHZpYSBpbnN0YW5jZS5fX3NldHN0YXRlX18oc3RhdGUpLgogICAgICAqLwotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8IDIpCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgLSAyIDwgc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKIAogICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgc3RhdGUpOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKQpAQCAtNjA3OCw3ICs2MTQwLDggQEAKICAgICAgICAgc2VsZi0+bWFya3Nfc2l6ZSA9IChQeV9zc2l6ZV90KWFsbG9jOwogICAgIH0KIAotICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IDE7CisgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzKytdID0gc2VsZi0+c3RhY2stPmZlbmNlID0gUHlfU0laRShzZWxmLT5zdGFjayk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTYxNjEsNiArNjIyNCw4IEBACiAgICAgY2hhciAqcyA9IE5VTEw7CiAKICAgICBzZWxmLT5udW1fbWFya3MgPSAwOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IDA7CisgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gMDsKICAgICBzZWxmLT5wcm90byA9IDA7CiAgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spKQogICAgICAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CkBAIC02MTczLDggKzYyMzgsMTMgQEAKICAgICBjYXNlIG9wY29kZTogaWYgKGxvYWRfZnVuYyhzZWxmLCAoYXJnKSkgPCAwKSBicmVhazsgY29udGludWU7CiAKICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoX1VucGlja2xlcl9SZWFkKHNlbGYsICZzLCAxKSA8IDApCi0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKF9VbnBpY2tsZXJfUmVhZChzZWxmLCAmcywgMSkgPCAwKSB7CisgICAgICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhzdC0+VW5waWNrbGluZ0Vycm9yKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIlJhbiBvdXQgb2YgaW5wdXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoICgoZW51bSBvcGNvZGUpc1swXSkgewogICAgICAgICBPUChOT05FLCBsb2FkX25vbmUpCkBAIC02MjQ2LDE1ICs2MzE2LDE5IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChzdC0+VW5waWNrbGluZ0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsb2FkIGtleSwgJyVjJy4iLCBzWzBdKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAodW5zaWduZWQgY2hhcikgKnM7CisgICAgICAgICAgICAgICAgaWYgKDB4MjAgPD0gYyAmJiBjIDw9IDB4N2UgJiYgYyAhPSAnXCcnICYmIGMgIT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoc3QtPlVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxvYWQga2V5LCAnJWMnLiIsIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHN0LT5VbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsb2FkIGtleSwgJ1xceCUwMngnLiIsIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogYW5kIHdlIGFyZSBkb25lISAqLwpAQCAtNjg2NSw4ICs2OTM5LDYgQEAKIHN0YXRpYyBpbnQKIFVucGlja2xlcl9zZXRfcGVyc2xvYWQoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTY4NzksMTAgKzY5NTEsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgdG1wID0gc2VsZi0+cGVyc19mdW5jOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgc2VsZi0+cGVyc19mdW5jID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOyAgICAgIC8qIHNlbGYtPnBlcnNfZnVuYyBjYW4gYmUgTlVMTCwgc28gYmUgY2FyZWZ1bC4gKi8KKyAgICBQeV9YU0VUUkVGKHNlbGYtPnBlcnNfZnVuYywgdmFsdWUpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYyBiL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCmluZGV4IDhiZWRhYjUuLjBjYTBhYTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCisrKyBiL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCkBAIC0yMSw4ICsyMSw3IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKFNZU19nZXRkZW50czY0KQotLyogQW5kcm9pZCBkb2Vzbid0IGV4cG9zZSBzeXNjYWxscywgYWRkIHRoZSBkZWZpbml0aW9uIG1hbnVhbGx5LiAqLworI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmIF9fQU5EUk9JRF9BUElfXyA8IDIxICYmICFkZWZpbmVkKFNZU19nZXRkZW50czY0KQogIyBpbmNsdWRlIDxzeXMvbGludXgtc3lzY2FsbHMuaD4KICMgZGVmaW5lIFNZU19nZXRkZW50czY0ICBfX05SX2dldGRlbnRzNjQKICNlbmRpZgpAQCAtNzIsNyArNzEsNyBAQAogCiAvKiBDb252ZXJ0IEFTQ0lJIHRvIGEgcG9zaXRpdmUgaW50LCBubyBsaWJjIGNhbGwuIG5vIG92ZXJmbG93LiAtMSBvbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLV9wb3NfaW50X2Zyb21fYXNjaWkoY2hhciAqbmFtZSkKK19wb3NfaW50X2Zyb21fYXNjaWkoY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBpbnQgbnVtID0gMDsKICAgICB3aGlsZSAoKm5hbWUgPj0gJzAnICYmICpuYW1lIDw9ICc5JykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwppbmRleCA5NWFkNGE0Li4xY2Y1N2FlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYworKysgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwpAQCAtNjksMTAgKzY5LDYgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAgICAgICAgLyogZm9yIHNlZWRpbmcgdG8gY3VycmVudCB0aW1lICovCiAKLSNpZm5kZWYgUFlfVUlOVDMyX1QKLSMgIGVycm9yICJGYWlsZWQgdG8gZmluZCBhbiBleGFjdC13aWR0aCAzMi1iaXQgaW50ZWdlciB0eXBlIgotI2VuZGlmCi0KIC8qIFBlcmlvZCBwYXJhbWV0ZXJzIC0tIFRoZXNlIGFyZSBhbGwgbWFnaWMuICBEb24ndCBjaGFuZ2UuICovCiAjZGVmaW5lIE4gNjI0CiAjZGVmaW5lIE0gMzk3CkBAIC04Myw3ICs3OSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIGludCBpbmRleDsKLSAgICBQWV9VSU5UMzJfVCBzdGF0ZVtOXTsKKyAgICB1aW50MzJfdCBzdGF0ZVtOXTsKIH0gUmFuZG9tT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFJhbmRvbV9UeXBlOwpAQCAtOTUsMTMgKzkxLDEzIEBACiAKIAogLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiBbMCwweGZmZmZmZmZmXS1pbnRlcnZhbCAqLwotc3RhdGljIFBZX1VJTlQzMl9UCitzdGF0aWMgdWludDMyX3QKIGdlbnJhbmRfaW50MzIoUmFuZG9tT2JqZWN0ICpzZWxmKQogewotICAgIFBZX1VJTlQzMl9UIHk7Ci0gICAgc3RhdGljIFBZX1VJTlQzMl9UIG1hZzAxWzJdPXsweDBVLCBNQVRSSVhfQX07CisgICAgdWludDMyX3QgeTsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFnMDFbMl0gPSB7MHgwVSwgTUFUUklYX0F9OwogICAgIC8qIG1hZzAxW3hdID0geCAqIE1BVFJJWF9BICBmb3IgeD0wLDEgKi8KLSAgICBQWV9VSU5UMzJfVCAqbXQ7CisgICAgdWludDMyX3QgKm10OwogCiAgICAgbXQgPSBzZWxmLT5zdGF0ZTsKICAgICBpZiAoc2VsZi0+aW5kZXggPj0gTikgeyAvKiBnZW5lcmF0ZSBOIHdvcmRzIGF0IG9uZSB0aW1lICovCkBAIC0xMzYsMjEgKzEzMiwyMSBAQAogICogb3B0aW1pemUgdGhlIGRpdmlzaW9uIGF3YXkgYXQgY29tcGlsZS10aW1lLiAgNjcxMDg4NjQgaXMgMioqMjYuICBJbgogICogZWZmZWN0LCBhIGNvbnRhaW5zIDI3IHJhbmRvbSBiaXRzIHNoaWZ0ZWQgbGVmdCAyNiwgYW5kIGIgZmlsbHMgaW4gdGhlCiAgKiBsb3dlciAyNiBiaXRzIG9mIHRoZSA1My1iaXQgbnVtZXJhdG9yLgotICogVGhlIG9yZ2luYWwgY29kZSBjcmVkaXRlZCBJc2FrdSBXYWRhIGZvciB0aGlzIGFsZ29yaXRobSwgMjAwMi8wMS8wOS4KKyAqIFRoZSBvcmlnaW5hbCBjb2RlIGNyZWRpdGVkIElzYWt1IFdhZGEgZm9yIHRoaXMgYWxnb3JpdGhtLCAyMDAyLzAxLzA5LgogICovCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3JhbmRvbShSYW5kb21PYmplY3QgKnNlbGYpCiB7Ci0gICAgUFlfVUlOVDMyX1QgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7CisgICAgdWludDMyX3QgYT1nZW5yYW5kX2ludDMyKHNlbGYpPj41LCBiPWdlbnJhbmRfaW50MzIoc2VsZik+PjY7CiAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoYSo2NzEwODg2NC4wK2IpKigxLjAvOTAwNzE5OTI1NDc0MDk5Mi4wKSk7CiB9CiAKIC8qIGluaXRpYWxpemVzIG10W05dIHdpdGggYSBzZWVkICovCiBzdGF0aWMgdm9pZAotaW5pdF9nZW5yYW5kKFJhbmRvbU9iamVjdCAqc2VsZiwgUFlfVUlOVDMyX1QgcykKK2luaXRfZ2VucmFuZChSYW5kb21PYmplY3QgKnNlbGYsIHVpbnQzMl90IHMpCiB7CiAgICAgaW50IG10aTsKLSAgICBQWV9VSU5UMzJfVCAqbXQ7CisgICAgdWludDMyX3QgKm10OwogCiAgICAgbXQgPSBzZWxmLT5zdGF0ZTsKICAgICBtdFswXT0gczsKQEAgLTE2OSwxMSArMTY1LDExIEBACiAvKiBpbml0aWFsaXplIGJ5IGFuIGFycmF5IHdpdGggYXJyYXktbGVuZ3RoICovCiAvKiBpbml0X2tleSBpcyB0aGUgYXJyYXkgZm9yIGluaXRpYWxpemluZyBrZXlzICovCiAvKiBrZXlfbGVuZ3RoIGlzIGl0cyBsZW5ndGggKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1pbml0X2J5X2FycmF5KFJhbmRvbU9iamVjdCAqc2VsZiwgUFlfVUlOVDMyX1QgaW5pdF9rZXlbXSwgc2l6ZV90IGtleV9sZW5ndGgpCitzdGF0aWMgdm9pZAoraW5pdF9ieV9hcnJheShSYW5kb21PYmplY3QgKnNlbGYsIHVpbnQzMl90IGluaXRfa2V5W10sIHNpemVfdCBrZXlfbGVuZ3RoKQogewogICAgIHNpemVfdCBpLCBqLCBrOyAgICAgICAvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLwotICAgIFBZX1VJTlQzMl9UICptdDsKKyAgICB1aW50MzJfdCAqbXQ7CiAKICAgICBtdCA9IHNlbGYtPnN0YXRlOwogICAgIGluaXRfZ2VucmFuZChzZWxmLCAxOTY1MDIxOFUpOwpAQCAtMTgxLDIxICsxNzcsMTkgQEAKICAgICBrID0gKE4+a2V5X2xlbmd0aCA/IE4gOiBrZXlfbGVuZ3RoKTsKICAgICBmb3IgKDsgazsgay0tKSB7CiAgICAgICAgIG10W2ldID0gKG10W2ldIF4gKChtdFtpLTFdIF4gKG10W2ktMV0gPj4gMzApKSAqIDE2NjQ1MjVVKSkKLSAgICAgICAgICAgICAgICAgKyBpbml0X2tleVtqXSArIChQWV9VSU5UMzJfVClqOyAvKiBub24gbGluZWFyICovCisgICAgICAgICAgICAgICAgICsgaW5pdF9rZXlbal0gKyAodWludDMyX3QpajsgLyogbm9uIGxpbmVhciAqLwogICAgICAgICBpKys7IGorKzsKICAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KICAgICAgICAgaWYgKGo+PWtleV9sZW5ndGgpIGo9MDsKICAgICB9CiAgICAgZm9yIChrPU4tMTsgazsgay0tKSB7CiAgICAgICAgIG10W2ldID0gKG10W2ldIF4gKChtdFtpLTFdIF4gKG10W2ktMV0gPj4gMzApKSAqIDE1NjYwODM5NDFVKSkKLSAgICAgICAgICAgICAgICAgLSAoUFlfVUlOVDMyX1QpaTsgLyogbm9uIGxpbmVhciAqLworICAgICAgICAgICAgICAgICAtICh1aW50MzJfdClpOyAvKiBub24gbGluZWFyICovCiAgICAgICAgIGkrKzsKICAgICAgICAgaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KICAgICB9CiAKICAgICBtdFswXSA9IDB4ODAwMDAwMDBVOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqLwotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyoKQEAgLTIwMywxMiArMTk3LDQzIEBACiAgKiBUd2lzdGVyIGRvd25sb2FkLgogICovCiAKK3N0YXRpYyBpbnQKK3JhbmRvbV9zZWVkX3VyYW5kb20oUmFuZG9tT2JqZWN0ICpzZWxmKQoreworICAgIFBZX1VJTlQzMl9UIGtleVtOXTsKKworICAgIGlmIChfUHlPU19VUmFuZG9tTm9uYmxvY2soa2V5LCBzaXplb2Yoa2V5KSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIFB5X0FSUkFZX0xFTkdUSChrZXkpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3JhbmRvbV9zZWVkX3RpbWVfcGlkKFJhbmRvbU9iamVjdCAqc2VsZikKK3sKKyAgICBfUHlUaW1lX3Qgbm93OworICAgIHVpbnQzMl90IGtleVs1XTsKKworICAgIG5vdyA9IF9QeVRpbWVfR2V0U3lzdGVtQ2xvY2soKTsKKyAgICBrZXlbMF0gPSAoUFlfVUlOVDMyX1QpKG5vdyAmIDB4ZmZmZmZmZmZVKTsKKyAgICBrZXlbMV0gPSAoUFlfVUlOVDMyX1QpKG5vdyA+PiAzMik7CisKKyAgICBrZXlbMl0gPSAoUFlfVUlOVDMyX1QpZ2V0cGlkKCk7CisKKyAgICBub3cgPSBfUHlUaW1lX0dldE1vbm90b25pY0Nsb2NrKCk7CisgICAga2V5WzNdID0gKFBZX1VJTlQzMl9UKShub3cgJiAweGZmZmZmZmZmVSk7CisgICAga2V5WzRdID0gKFBZX1VJTlQzMl9UKShub3cgPj4gMzIpOworCisgICAgaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIFB5X0FSUkFZX0xFTkdUSChrZXkpKTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9zZWVkKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7ICAgICAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwogICAgIFB5T2JqZWN0ICpuID0gTlVMTDsKLSAgICBQWV9VSU5UMzJfVCAqa2V5ID0gTlVMTDsKKyAgICB1aW50MzJfdCAqa2V5ID0gTlVMTDsKICAgICBzaXplX3QgYml0cywga2V5dXNlZDsKICAgICBpbnQgcmVzOwogICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwpAQCAtMjE2LDE0ICsyNDEsMTcgQEAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZWVkIiwgMCwgMSwgJmFyZykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKGFyZyA9PSBOVUxMIHx8IGFyZyA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIHRpbWVfdCBub3c7CisgICAgIGlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICBpZiAocmFuZG9tX3NlZWRfdXJhbmRvbShzZWxmKSA+PSAwKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogCi0gICAgICAgIHRpbWUoJm5vdyk7Ci0gICAgICAgIGluaXRfZ2VucmFuZChzZWxmLCAoUFlfVUlOVDMyX1Qpbm93KTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIC8qIFJlYWRpbmcgc3lzdGVtIGVudHJvcHkgZmFpbGVkLCBmYWxsIGJhY2sgb24gdGhlIHdvcnN0IGVudHJvcHk6CisgICAgICAgICAgICAgICB1c2UgdGhlIGN1cnJlbnQgdGltZSBhbmQgcHJvY2VzcyBpZGVudGlmaWVyLiAqLworICAgICAgICAgICAgcmFuZG9tX3NlZWRfdGltZV9waWQoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQorCiAgICAgLyogVGhpcyBhbGdvcml0aG0gcmVsaWVzIG9uIHRoZSBudW1iZXIgYmVpbmcgdW5zaWduZWQuCiAgICAgICogU286IGlmIHRoZSBhcmcgaXMgYSBQeUxvbmcsIHVzZSBpdHMgYWJzb2x1dGUgdmFsdWUuCiAgICAgICogT3RoZXJ3aXNlIHVzZSBpdHMgaGFzaCB2YWx1ZSwgY2FzdCB0byB1bnNpZ25lZC4KQEAgLTI0OCw3ICsyNzYsNyBAQAogICAgIGtleXVzZWQgPSBiaXRzID09IDAgPyAxIDogKGJpdHMgLSAxKSAvIDMyICsgMTsKIAogICAgIC8qIENvbnZlcnQgc2VlZCB0byBieXRlIHNlcXVlbmNlLiAqLwotICAgIGtleSA9IChQWV9VSU5UMzJfVCAqKVB5TWVtX01hbGxvYygoc2l6ZV90KTQgKiBrZXl1c2VkKTsKKyAgICBrZXkgPSAodWludDMyX3QgKilQeU1lbV9NYWxsb2MoKHNpemVfdCk0ICoga2V5dXNlZCk7CiAgICAgaWYgKGtleSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIGdvdG8gRG9uZTsKQEAgLTI2NywxMyArMjk1LDE3IEBACiAgICAgICAgIHNpemVfdCBpLCBqOwogICAgICAgICAvKiBSZXZlcnNlIGFuIGFycmF5LiAqLwogICAgICAgICBmb3IgKGkgPSAwLCBqID0ga2V5dXNlZCAtIDE7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICAgICAgUFlfVUlOVDMyX1QgdG1wID0ga2V5W2ldOworICAgICAgICAgICAgdWludDMyX3QgdG1wID0ga2V5W2ldOwogICAgICAgICAgICAga2V5W2ldID0ga2V5W2pdOwogICAgICAgICAgICAga2V5W2pdID0gdG1wOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCi0gICAgcmVzdWx0ID0gaW5pdF9ieV9hcnJheShzZWxmLCBrZXksIGtleXVzZWQpOworICAgIGluaXRfYnlfYXJyYXkoc2VsZiwga2V5LCBrZXl1c2VkKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXN1bHQgPSBQeV9Ob25lOworCiBEb25lOgogICAgIFB5X1hERUNSRUYobik7CiAgICAgUHlNZW1fRnJlZShrZXkpOwpAQCAtMzI5LDcgKzM2MSw3IEBACiAgICAgICAgIGVsZW1lbnQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSkpOwogICAgICAgICBpZiAoZWxlbWVudCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHNlbGYtPnN0YXRlW2ldID0gKFBZX1VJTlQzMl9UKWVsZW1lbnQ7CisgICAgICAgIHNlbGYtPnN0YXRlW2ldID0gKHVpbnQzMl90KWVsZW1lbnQ7CiAgICAgfQogCiAgICAgaW5kZXggPSBQeUxvbmdfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKQEAgLTM0OSw4ICszODEsOCBAQAogcmFuZG9tX2dldHJhbmRiaXRzKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgaW50IGssIGksIHdvcmRzOwotICAgIFBZX1VJTlQzMl9UIHI7Ci0gICAgUFlfVUlOVDMyX1QgKndvcmRhcnJheTsKKyAgICB1aW50MzJfdCByOworICAgIHVpbnQzMl90ICp3b3JkYXJyYXk7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRyYW5kYml0cyIsICZrKSkKQEAgLTM2Niw3ICszOTgsNyBAQAogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoZ2VucmFuZF9pbnQzMihzZWxmKSA+PiAoMzIgLSBrKSk7CiAKICAgICB3b3JkcyA9IChrIC0gMSkgLyAzMiArIDE7Ci0gICAgd29yZGFycmF5ID0gKFBZX1VJTlQzMl9UICopUHlNZW1fTWFsbG9jKHdvcmRzICogNCk7CisgICAgd29yZGFycmF5ID0gKHVpbnQzMl90ICopUHlNZW1fTWFsbG9jKHdvcmRzICogNCk7CiAgICAgaWYgKHdvcmRhcnJheSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2Nwcm94eS5jIGIvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDY2YjZlMzQuLjY4YmU0NTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NjcHJveHkuYworKysgYi9Nb2R1bGVzL19zY3Byb3h5LmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAorc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjb25zdCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBlbmFibGVkS2V5LAogICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCiB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCmluZGV4IDM2ODlhNGUuLjYyYzU4OTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCkBAIC0yNDQsOCArMjQ0LDcgQEAKICAgICAgICAgcHRyID0gcHRyLT5uZXh0OwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IDNjNTIxMDguLjRhMTBjZTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMzY2LDggKzM2Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIC8qCkBAIC02NzMsNyArNjcyLDcgQEAKICAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKIAogICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsKLSAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKKyAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsIE5VTEwpOwogCiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gMDsKQEAgLTc0NSw3ICs3NDQsNyBAQAogICAgIFB5RXJyX0ZldGNoKCZleGNlcHRpb24sICZ2YWx1ZSwgJnRiKTsKICAgICByZXN0b3JlID0gMTsKIAotICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgJlB5SWRfZmluYWxpemUsICIiKTsKKyAgICBmdW5jdGlvbl9yZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKCphZ2dyZWdhdGVfaW5zdGFuY2UsICZQeUlkX2ZpbmFsaXplLCBOVUxMKTsKIAogICAgIFB5X0RFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKIApAQCAtODc0LDggKzg3Myw3IEBACiAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTkwNiw4ICs5MDQsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGFnZ3JlZ2F0ZV9jbGFzcywgUHlfTm9uZSkgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTk2Myw3ICs5NjAsNyBAQAogCiAgICAgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0gICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopdXNlcl9hcmcsICIiKTsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0Kil1c2VyX2FyZywgTlVMTCk7CiAKICAgICBpZiAoIXJldCkgewogICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CkBAIC0xMDQyLDggKzEwMzksNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDcyLDggKzEwNjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3RyYWNlX2NhbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtMTEwMCw4ICsxMDk1LDcgQEAKICAgICAgICAgc3FsaXRlM190cmFjZShzZWxmLT5kYiwgX3RyYWNlX2NhbGxiYWNrLCB0cmFjZV9jYWxsYmFjayk7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTgpAQCAtMTEyNCw4ICsxMTE4LDcgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBlbmFibGluZyBsb2FkIGV4dGVuc2lvbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTExNDgsOCArMTE0MSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTEyOTksNyArMTI5MSw3IEBACiAgICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CiAgICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CiAKLSAgICBjdXJzb3IgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopc2VsZiwgJlB5SWRfY3Vyc29yLCAiIik7CisgICAgY3Vyc29yID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QqKXNlbGYsICZQeUlkX2N1cnNvciwgTlVMTCk7CiAgICAgaWYgKCFjdXJzb3IpIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xMzI4LDcgKzEzMjAsNyBAQAogICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOwogICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOwogCi0gICAgY3Vyc29yID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCgoUHlPYmplY3QqKXNlbGYsICZQeUlkX2N1cnNvciwgIiIpOworICAgIGN1cnNvciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0KilzZWxmLCAmUHlJZF9jdXJzb3IsIE5VTEwpOwogICAgIGlmICghY3Vyc29yKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTM1Nyw3ICsxMzQ5LDcgQEAKICAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKICAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKIAotICAgIGN1cnNvciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0KilzZWxmLCAmUHlJZF9jdXJzb3IsICIiKTsKKyAgICBjdXJzb3IgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopc2VsZiwgJlB5SWRfY3Vyc29yLCBOVUxMKTsKICAgICBpZiAoIWN1cnNvcikgewogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE1MjcsNyArMTUxOSw3IEBACiAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICB9CiAKLSAgICB1cHBlcmNhc2VfbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQobmFtZSwgJlB5SWRfdXBwZXIsICIiKTsKKyAgICB1cHBlcmNhc2VfbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQobmFtZSwgJlB5SWRfdXBwZXIsIE5VTEwpOwogICAgIGlmICghdXBwZXJjYXNlX25hbWUpIHsKICAgICAgICAgZ290byBmaW5hbGx5OwogICAgIH0KQEAgLTE2MTksNyArMTYxMSw3IEBACiAgICAgICAgIG1ldGhvZF9uYW1lID0gInJvbGxiYWNrIjsKICAgICB9CiAKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgbWV0aG9kX25hbWUsICIiKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgbWV0aG9kX25hbWUsIE5VTEwpOwogICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE2MjgsNyArMTYyMCw3IEBACiAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCi1zdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IGUxNjc2ZGUuLmUyYzdhMzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChweXNxbGl0ZV9DdXJzb3IqIHNlbGYpOwogCi1zdGF0aWMgY2hhciogZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFjayA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOworc3RhdGljIGNvbnN0IGNoYXIgZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFja1tdID0gIkN1cnNvciBuZWVkZWQgdG8gYmUgcmVzZXQgYmVjYXVzZSBvZiBjb21taXQvcm9sbGJhY2sgYW5kIGNhbiBubyBsb25nZXIgYmUgZmV0Y2hlZCBmcm9tLiI7CiAKIHN0YXRpYyBweXNxbGl0ZV9TdGF0ZW1lbnRLaW5kIGRldGVjdF9zdGF0ZW1lbnRfdHlwZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQpCiB7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBQeU9iamVjdCogcmV0dmFsOwogICAgIF9QeV9JREVOVElGSUVSKHVwcGVyKTsKIAotICAgIHVwY2FzZV9rZXkgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGtleSwgJlB5SWRfdXBwZXIsICIiKTsKKyAgICB1cGNhc2Vfa2V5ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChrZXksICZQeUlkX3VwcGVyLCBOVUxMKTsKICAgICBpZiAoIXVwY2FzZV9rZXkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjQyLDggKzI0Miw3IEBACiAgICAgY29uc3QgY2hhciogcG9zOwogCiAgICAgaWYgKCFjb2xuYW1lKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIAogICAgIGZvciAocG9zID0gY29sbmFtZTs7IHBvcysrKSB7CkBAIC02OTgsNyArNjk3LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOwotICAgICAgICBpZiAoIW11bHRpcGxlICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQpIHsKKyAgICAgICAgaWYgKCFtdWx0aXBsZSAmJgorICAgICAgICAgICAgLyogUkVQTEFDRSBpcyBhbiBhbGlhcyBmb3IgSU5TRVJUIE9SIFJFUExBQ0UgKi8KKyAgICAgICAgICAgIChzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfSU5TRVJUIHx8IHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9SRVBMQUNFKSkgewogICAgICAgICAgICAgc3FsaXRlX2ludDY0IGxhc3Ryb3dpZDsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIGxhc3Ryb3dpZCA9IHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwpAQCAtOTEzLDggKzkxNCw3IEBACiAKICAgICByb3cgPSBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQoc2VsZik7CiAgICAgaWYgKCFyb3cgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogCiAgICAgcmV0dXJuIHJvdzsKQEAgLTk5NSw4ICs5OTUsNyBAQAogUHlPYmplY3QqIHB5c3FsaXRlX25vb3AocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgLyogZG9uJ3QgY2FyZSwgcmV0dXJuIE5vbmUgKi8KLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfY2xvc2UocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTEwMTIsOCArMTAxMSw3IEBACiAKICAgICBzZWxmLT5jbG9zZWQgPSAxOwogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY3Vyc29yX21ldGhvZHNbXSA9IHsKQEAgLTEwNDksNyArMTA0Nyw3IEBACiAgICAge05VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBjdXJzb3JfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgY3Vyc29yX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGN1cnNvciBjbGFzcy4iKTsKIAogUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0N1cnNvclR5cGUgPSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKaW5kZXggN2E3ZTg2MC4uY2M0NTMzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpAQCAtMTM5LDggKzEzOSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTE3Miw4ICsxNzEsNyBAQAogICAgIGlmIChyYyA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2MsCkBAIC0xOTQsNyArMTkyLDcgQEAKICAgICB9CiAKICAgICAvKiBjb252ZXJ0IHRoZSBuYW1lIHRvIHVwcGVyIGNhc2UgKi8KLSAgICBuYW1lID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChvcmlnX25hbWUsICZQeUlkX3VwcGVyLCAiIik7CisgICAgbmFtZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQob3JpZ19uYW1lLCAmUHlJZF91cHBlciwgTlVMTCk7CiAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMjIxLDggKzIxOSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzX2RvYywKQEAgLTI2MSwxMyArMjU4LDEzIEBACiB9OwogCiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7Ci0gICAgY2hhciogY29uc3RhbnRfbmFtZTsKKyAgICBjb25zdCBjaGFyICpjb25zdGFudF9uYW1lOwogICAgIGludCBjb25zdGFudF92YWx1ZTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOwogCi1zdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CitzdGF0aWMgY29uc3QgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CiAgICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAogICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCmluZGV4IDMxMmZlM2IuLmEyNzZkYWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwpAQCAtMTEzLDcgKzExMyw2IEBACiBQeU9iamVjdCAqCiBfcHlzcWxpdGVfbG9uZ19mcm9tX2ludDY0KHNxbGl0ZV9pbnQ2NCB2YWx1ZSkKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogIyBpZiBTSVpFT0ZfTE9OR19MT05HIDwgOAogICAgIGlmICh2YWx1ZSA+IFBZX0xMT05HX01BWCB8fCB2YWx1ZSA8IFBZX0xMT05HX01JTikgewogICAgICAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKQEAgLTEyNCwxNCArMTIzLDYgQEAKICAgICBpZiAodmFsdWUgPiBMT05HX01BWCB8fCB2YWx1ZSA8IExPTkdfTUlOKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CiAjIGVuZGlmCi0jZWxzZQotIyBpZiBTSVpFT0ZfTE9ORyA8IDgKLSAgICBpZiAodmFsdWUgPiBMT05HX01BWCB8fCB2YWx1ZSA8IExPTkdfTUlOKSB7Ci0gICAgICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoJnZhbHVlLCBzaXplb2YodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0xJVFRMRV9FTkRJQU4sIDEgLyogc2lnbmVkICovKTsKLSAgICB9Ci0jIGVuZGlmCi0jZW5kaWYKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QodmFsdWUsIHNxbGl0ZV9pbnQ2NCwgbG9uZykpOwogfQogCkBAIC0xMzksMjMgKzEzMCwxMyBAQAogX3B5c3FsaXRlX2xvbmdfYXNfaW50NjQoUHlPYmplY3QgKiBweV92YWwpCiB7CiAgICAgaW50IG92ZXJmbG93OwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgUFlfTE9OR19MT05HIHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhweV92YWwsICZvdmVyZmxvdyk7Ci0jZWxzZQotICAgIGxvbmcgdmFsdWUgPSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cocHlfdmFsLCAmb3ZlcmZsb3cpOwotI2VuZGlmCiAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIW92ZXJmbG93KSB7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICMgaWYgU0laRU9GX0xPTkdfTE9ORyA+IDgKICAgICAgICAgaWYgKC0weDgwMDAwMDAwMDAwMDAwMDBMTCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweDdGRkZGRkZGRkZGRkZGRkZMTCkKICMgZW5kaWYKLSNlbHNlCi0jIGlmIFNJWkVPRl9MT05HID4gOAotICAgICAgICBpZiAoLTB4ODAwMDAwMDAwMDAwMDAwMEwgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMHg3RkZGRkZGRkZGRkZGRkZGTCkKLSMgZW5kaWYKLSNlbmRpZgogICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KICAgICBlbHNlIGlmIChzaXplb2YodmFsdWUpIDwgc2l6ZW9mKHNxbGl0ZV9pbnQ2NCkpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NyZS5jIGIvTW9kdWxlcy9fc3JlLmMKaW5kZXggMDliNTgzNS4uYWZhOTA5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3JlLmMKKysrIGIvTW9kdWxlcy9fc3JlLmMKQEAgLTM1LDcgKzM1LDcgQEAKICAqIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KICAqLwogCi1zdGF0aWMgY2hhciBjb3B5cmlnaHRbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CiAgICAgIiBTUkUgMi4yLjIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIgIjsKIAogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCkBAIC02Miw5ICs2Miw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogb3B0aW9uYWwgZmVhdHVyZXMgKi8KIAotLyogZW5hYmxlcyBmYXN0IHNlYXJjaGluZyAqLwotI2RlZmluZSBVU0VfRkFTVF9TRUFSQ0gKLQogLyogZW5hYmxlcyBjb3B5L2RlZXBjb3B5IGhhbmRsaW5nICh3b3JrIGluIHByb2dyZXNzKSAqLwogI3VuZGVmIFVTRV9CVUlMVElOX0NPUFkKIApAQCAtNzE3LDcgKzcxNCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWNhbGwoY2hhciogbW9kdWxlLCBjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGFyZ3MpCitjYWxsKGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBhcmdzKQogewogICAgIFB5T2JqZWN0KiBuYW1lOwogICAgIFB5T2JqZWN0KiBtb2Q7CkBAIC0xMDU5LDcgKzEwNTYsNiBAQAogICAgIFB5T2JqZWN0KiBqb2luZXI7CiAgICAgUHlPYmplY3QqIGl0ZW07CiAgICAgUHlPYmplY3QqIGZpbHRlcjsKLSAgICBQeU9iamVjdCogYXJnczsKICAgICBQeU9iamVjdCogbWF0Y2g7CiAgICAgdm9pZCogcHRyOwogICAgIFB5X3NzaXplX3Qgc3RhdHVzOwpAQCAtMTE2MSwxMyArMTE1Nyw3IEBACiAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm5fbmV3X21hdGNoKHNlbGYsICZzdGF0ZSwgMSk7CiAgICAgICAgICAgICBpZiAoIW1hdGNoKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG1hdGNoKTsKLSAgICAgICAgICAgIGlmICghYXJncykgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXRjaCk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW0gPSBQeU9iamVjdF9DYWxsT2JqZWN0KGZpbHRlciwgYXJncyk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgICAgICBpdGVtID0gX1B5T2JqZWN0X0NhbGxBcmcxKGZpbHRlciwgbWF0Y2gpOwogICAgICAgICAgICAgUHlfREVDUkVGKG1hdGNoKTsKICAgICAgICAgICAgIGlmICghaXRlbSkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU5Miw3ICsxNTgyLDcgQEAKICAgICAgICAgc2tpcCA9ICpjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWVFJBQ0UoKCIlbHUgKHNraXAgdG8gJXApXG4iLCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylza2lwLCBjb2RlK3NraXApKTsgICAgICAgIFwKLSAgICAgICAgaWYgKHNraXAtYWRqID4gKFB5X3VpbnRwdHJfdCkoZW5kIC0gY29kZSkpICAgICAgXAorICAgICAgICBpZiAoc2tpcC1hZGogPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkgICAgICBcCiAgICAgICAgICAgICBGQUlMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY29kZSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCkBAIC0xNjI2LDcgKzE2MTYsNyBAQAogCiAgICAgICAgIGNhc2UgU1JFX09QX0NIQVJTRVQ6CiAgICAgICAgICAgICBvZmZzZXQgPSAyNTYvU1JFX0NPREVfQklUUzsgLyogMjU2LWJpdCBiaXRtYXAgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoUHlfdWludHB0cl90KShlbmQgLSBjb2RlKSkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgY29kZSArPSBvZmZzZXQ7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE2MzQsNyArMTYyNCw3IEBACiAgICAgICAgIGNhc2UgU1JFX09QX0JJR0NIQVJTRVQ6CiAgICAgICAgICAgICBHRVRfQVJHOyAvKiBOdW1iZXIgb2YgYmxvY2tzICovCiAgICAgICAgICAgICBvZmZzZXQgPSAyNTYvc2l6ZW9mKFNSRV9DT0RFKTsgLyogMjU2LWJ5dGUgdGFibGUgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoUHlfdWludHB0cl90KShlbmQgLSBjb2RlKSkKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAodWludHB0cl90KShlbmQgLSBjb2RlKSkKICAgICAgICAgICAgICAgICBGQUlMOwogICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgZWFjaCBieXRlIHBvaW50cyB0byBhIHZhbGlkIGJsb2NrICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTE2NDMsNyArMTYzMyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIG9mZnNldCA9IGFyZyAqICgyNTYvU1JFX0NPREVfQklUUyk7IC8qIDI1Ni1iaXQgYml0bWFwIHRpbWVzIGFyZyAqLwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IChQeV91aW50cHRyX3QpKGVuZCAtIGNvZGUpKQorICAgICAgICAgICAgaWYgKG9mZnNldCA+ICh1aW50cHRyX3QpKGVuZCAtIGNvZGUpKQogICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICBjb2RlICs9IG9mZnNldDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc5NCwxMSArMTc4NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBHRVRfQVJHOyBwcmVmaXhfbGVuID0gYXJnOwogICAgICAgICAgICAgICAgICAgICBHRVRfQVJHOwogICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIGNvbWVzIHRoZSBwcmVmaXggc3RyaW5nICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhfbGVuID4gKFB5X3VpbnRwdHJfdCkobmV3Y29kZSAtIGNvZGUpKQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4X2xlbiA+ICh1aW50cHRyX3QpKG5ld2NvZGUgLSBjb2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUw7CiAgICAgICAgICAgICAgICAgICAgIGNvZGUgKz0gcHJlZml4X2xlbjsKICAgICAgICAgICAgICAgICAgICAgLyogQW5kIGhlcmUgY29tZXMgdGhlIG92ZXJsYXAgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeF9sZW4gPiAoUHlfdWludHB0cl90KShuZXdjb2RlIC0gY29kZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXhfbGVuID4gKHVpbnRwdHJfdCkobmV3Y29kZSAtIGNvZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgRkFJTDsKICAgICAgICAgICAgICAgICAgICAgLyogRWFjaCBvdmVybGFwIHZhbHVlIHNob3VsZCBiZSA8IHByZWZpeF9sZW4gKi8KICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWZpeF9sZW47IGkrKykgewpAQCAtMTkyNyw3ICsxOTE3LDcgQEAKICAgICAgICAgICAgICAgIHRvIGFsbG93IGFyYml0cmFyeSBqdW1wcyBhbnl3aGVyZSBpbiB0aGUgY29kZTsgc28gd2UganVzdCBsb29rCiAgICAgICAgICAgICAgICBmb3IgYSBKVU1QIG9wY29kZSBwcmVjZWRpbmcgb3VyIHNraXAgdGFyZ2V0LgogICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChza2lwID49IDMgJiYgc2tpcC0zIDwgKFB5X3VpbnRwdHJfdCkoZW5kIC0gY29kZSkgJiYKKyAgICAgICAgICAgIGlmIChza2lwID49IDMgJiYgc2tpcC0zIDwgKHVpbnRwdHJfdCkoZW5kIC0gY29kZSkgJiYKICAgICAgICAgICAgICAgICBjb2RlW3NraXAtM10gPT0gU1JFX09QX0pVTVApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgVlRSQUNFKCgiYm90aCB0aGVuIGFuZCBlbHNlIHBhcnRzIHByZXNlbnRcbiIpKTsKQEAgLTIwNTIsOCArMjA0Miw5IEBACiAgICAgICAgIC8qIERlZmF1bHQgdmFsdWUgKi8KICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoUHlMb25nX0NoZWNrKGluZGV4KSkKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Bc1NzaXplX3QoaW5kZXgpOworICAgIGlmIChQeUluZGV4X0NoZWNrKGluZGV4KSkgeworICAgICAgICByZXR1cm4gUHlOdW1iZXJfQXNTc2l6ZV90KGluZGV4LCBOVUxMKTsKKyAgICB9CiAKICAgICBpID0gLTE7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggYTc5YzNhOC4uYjRmYWM0NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTQ1NSw3ICs0NTUsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotUHlTU0xfU2V0RXJyb3IoUHlTU0xTb2NrZXQgKm9iaiwgaW50IHJldCwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCitQeVNTTF9TZXRFcnJvcihQeVNTTFNvY2tldCAqb2JqLCBpbnQgcmV0LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKICAgICBQeU9iamVjdCAqdHlwZSA9IFB5U1NMRXJyb3JPYmplY3Q7CiAgICAgY2hhciAqZXJyc3RyID0gTlVMTDsKQEAgLTUzNyw3ICs1MzcsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotX3NldFNTTEVycm9yIChjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgeworX3NldFNTTEVycm9yIChjb25zdCBjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgewogCiAgICAgaWYgKGVycnN0ciA9PSBOVUxMKQogICAgICAgICBlcnJjb2RlID0gRVJSX3BlZWtfbGFzdF9lcnJvcigpOwpAQCAtMTU0Nyw2ICsxNTQ3LDc2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDIwMDBVTAorc3RhdGljIFB5T2JqZWN0ICoKK2NpcGhlcl90b19kaWN0KGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikKK3sKKyAgICBjb25zdCBjaGFyICpjaXBoZXJfbmFtZSwgKmNpcGhlcl9wcm90b2NvbDsKKworICAgIHVuc2lnbmVkIGxvbmcgY2lwaGVyX2lkOworICAgIGludCBhbGdfYml0cywgc3RyZW5ndGhfYml0cywgbGVuOworICAgIGNoYXIgYnVmWzUxMl0gPSB7MH07CisjaWYgT1BFTlNTTF9WRVJTSU9OXzFfMQorICAgIGludCBhZWFkLCBuaWQ7CisgICAgY29uc3QgY2hhciAqc2tjaXBoZXIgPSBOVUxMLCAqZGlnZXN0ID0gTlVMTCwgKmt4ID0gTlVMTCwgKmF1dGggPSBOVUxMOworI2VuZGlmCisgICAgUHlPYmplY3QgKnJldHZhbDsKKworICAgIHJldHZhbCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmV0dmFsID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBjYW4gYmUgTlVMTCAqLworICAgIGNpcGhlcl9uYW1lID0gU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpOworICAgIGNpcGhlcl9wcm90b2NvbCA9IFNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oY2lwaGVyKTsKKyAgICBjaXBoZXJfaWQgPSBTU0xfQ0lQSEVSX2dldF9pZChjaXBoZXIpOworICAgIFNTTF9DSVBIRVJfZGVzY3JpcHRpb24oY2lwaGVyLCBidWYsIHNpemVvZihidWYpIC0gMSk7CisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgaWYgKGxlbiA+IDEgJiYgYnVmW2xlbi0xXSA9PSAnXG4nKQorICAgICAgICBidWZbbGVuLTFdID0gJ1wwJzsKKyAgICBzdHJlbmd0aF9iaXRzID0gU1NMX0NJUEhFUl9nZXRfYml0cyhjaXBoZXIsICZhbGdfYml0cyk7CisKKyNpZiBPUEVOU1NMX1ZFUlNJT05fMV8xCisgICAgYWVhZCA9IFNTTF9DSVBIRVJfaXNfYWVhZChjaXBoZXIpOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2NpcGhlcl9uaWQoY2lwaGVyKTsKKyAgICBza2NpcGhlciA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2RpZ2VzdF9uaWQoY2lwaGVyKTsKKyAgICBkaWdlc3QgPSBuaWQgIT0gTklEX3VuZGVmID8gT0JKX25pZDJsbihuaWQpIDogTlVMTDsKKyAgICBuaWQgPSBTU0xfQ0lQSEVSX2dldF9reF9uaWQoY2lwaGVyKTsKKyAgICBreCA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworICAgIG5pZCA9IFNTTF9DSVBIRVJfZ2V0X2F1dGhfbmlkKGNpcGhlcik7CisgICAgYXV0aCA9IG5pZCAhPSBOSURfdW5kZWYgPyBPQkpfbmlkMmxuKG5pZCkgOiBOVUxMOworI2VuZGlmCisKKyAgICByZXR2YWwgPSBQeV9CdWlsZFZhbHVlKAorICAgICAgICAie3Nrc3Nzc3Nzc2lzaSIKKyNpZiBPUEVOU1NMX1ZFUlNJT05fMV8xCisgICAgICAgICJzT3Nzc3Nzc3NzIgorI2VuZGlmCisgICAgICAgICJ9IiwKKyAgICAgICAgImlkIiwgY2lwaGVyX2lkLAorICAgICAgICAibmFtZSIsIGNpcGhlcl9uYW1lLAorICAgICAgICAicHJvdG9jb2wiLCBjaXBoZXJfcHJvdG9jb2wsCisgICAgICAgICJkZXNjcmlwdGlvbiIsIGJ1ZiwKKyAgICAgICAgInN0cmVuZ3RoX2JpdHMiLCBzdHJlbmd0aF9iaXRzLAorICAgICAgICAiYWxnX2JpdHMiLCBhbGdfYml0cworI2lmIE9QRU5TU0xfVkVSU0lPTl8xXzEKKyAgICAgICAgLCJhZWFkIiwgYWVhZCA/IFB5X1RydWUgOiBQeV9GYWxzZSwKKyAgICAgICAgInN5bW1ldHJpYyIsIHNrY2lwaGVyLAorICAgICAgICAiZGlnZXN0IiwgZGlnZXN0LAorICAgICAgICAia2VhIiwga3gsCisgICAgICAgICJhdXRoIiwgYXV0aAorI2VuZGlmCisgICAgICAgKTsKKyAgICByZXR1cm4gcmV0dmFsOworCisgIGVycm9yOgorICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKltjbGluaWMgaW5wdXRdCiBfc3NsLl9TU0xTb2NrZXQuc2hhcmVkX2NpcGhlcnMKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTI1MDYsNiArMjU3Niw1MiBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAyMDAwVUwKKy8qW2NsaW5pYyBpbnB1dF0KK19zc2wuX1NTTENvbnRleHQuZ2V0X2NpcGhlcnMKK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK19zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChQeVNTTENvbnRleHQgKnNlbGYpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTU2ZTRkNjhhNDA2ZGZjNCBpbnB1dD1hMmFhZGM5YWY4OWI3OWM1XSovCit7CisgICAgU1NMICpzc2wgPSBOVUxMOworICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICpzayA9IE5VTEw7CisgICAgU1NMX0NJUEhFUiAqY2lwaGVyOworICAgIGludCBpPTA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpkY3Q7CisKKyAgICBzc2wgPSBTU0xfbmV3KHNlbGYtPmN0eCk7CisgICAgaWYgKHNzbCA9PSBOVUxMKSB7CisgICAgICAgIF9zZXRTU0xFcnJvcihOVUxMLCAwLCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHNrID0gU1NMX2dldF9jaXBoZXJzKHNzbCk7CisKKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KHNrX1NTTF9DSVBIRVJfbnVtKHNrKSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2tfU1NMX0NJUEhFUl9udW0oc2spOyBpKyspIHsKKyAgICAgICAgY2lwaGVyID0gc2tfU1NMX0NJUEhFUl92YWx1ZShzaywgaSk7CisgICAgICAgIGRjdCA9IGNpcGhlcl90b19kaWN0KGNpcGhlcik7CisgICAgICAgIGlmIChkY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIocmVzdWx0KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBpLCBkY3QpOworICAgIH0KKworICBleGl0OgorICAgIGlmIChzc2wgIT0gTlVMTCkKKyAgICAgICAgU1NMX2ZyZWUoc3NsKTsKKyAgICByZXR1cm4gcmVzdWx0OworCit9CisjZW5kaWYKKworCiAjaWZkZWYgT1BFTlNTTF9OUE5fTkVHT1RJQVRFRAogc3RhdGljIGludAogZG9fcHJvdG9jb2xfc2VsZWN0aW9uKGludCBhbHBuLCB1bnNpZ25lZCBjaGFyICoqb3V0LCB1bnNpZ25lZCBjaGFyICpvdXRsZW4sCkBAIC0zNjczLDYgKzM3ODksNyBAQAogICAgIF9TU0xfX1NTTENPTlRFWFRfU0VUX1NFUlZFUk5BTUVfQ0FMTEJBQ0tfTUVUSE9EREVGCiAgICAgX1NTTF9fU1NMQ09OVEVYVF9DRVJUX1NUT1JFX1NUQVRTX01FVEhPRERFRgogICAgIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NBX0NFUlRTX01FVEhPRERFRgorICAgIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGCiAgICAge05VTEwsIE5VTEx9ICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBmOTY1NTQxLi5hNjAxZjAzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtNzEsMTAgKzcxLDggQEAKIAogLyogV2UgY2FuJ3Qgc3VwcG9ydCBxIGFuZCBRIGluIG5hdGl2ZSBtb2RlIHVubGVzcyB0aGUgY29tcGlsZXIgZG9lczsKICAgIGluIHN0ZCBtb2RlLCB0aGV5J3JlIDggYnl0ZXMgb24gYWxsIHBsYXRmb3Jtcy4gKi8KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IFBZX0xPTkdfTE9ORyB4OyB9IHNfbG9uZ19sb25nOwotI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YoUFlfTE9OR19MT05HKSkKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGxvbmcgbG9uZyB4OyB9IHNfbG9uZ19sb25nOworI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YobG9uZyBsb25nKSkKIAogI2lmZGVmIEhBVkVfQzk5X0JPT0wKICNkZWZpbmUgQk9PTF9UWVBFIF9Cb29sCkBAIC0xNjQsMTQgKzE2MiwxMiBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQogLyogU2FtZSwgYnV0IGhhbmRsaW5nIG5hdGl2ZSBsb25nIGxvbmcuICovCiAKIHN0YXRpYyBpbnQKLWdldF9sb25nbG9uZyhQeU9iamVjdCAqdiwgUFlfTE9OR19MT05HICpwKQorZ2V0X2xvbmdsb25nKFB5T2JqZWN0ICp2LCBsb25nIGxvbmcgKnApCiB7Ci0gICAgUFlfTE9OR19MT05HIHg7CisgICAgbG9uZyBsb25nIHg7CiAKICAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKICAgICBpZiAodiA9PSBOVUxMKQpAQCAtMTc5LDcgKzE3NSw3IEBACiAgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CiAgICAgeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOwogICAgIFB5X0RFQ1JFRih2KTsKLSAgICBpZiAoeCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBpZiAoeCA9PSAobG9uZyBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwpAQCAtMTkyLDkgKzE4OCw5IEBACiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIHVuc2lnbmVkIGxvbmcgbG9uZy4gKi8KIAogc3RhdGljIGludAotZ2V0X3Vsb25nbG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgUFlfTE9OR19MT05HICpwKQorZ2V0X3Vsb25nbG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyBsb25nICpwKQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OwogCiAgICAgdiA9IGdldF9weWxvbmcodik7CiAgICAgaWYgKHYgPT0gTlVMTCkKQEAgLTIwMiw3ICsxOTgsNyBAQAogICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodikpOwogICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOwogICAgIFB5X0RFQ1JFRih2KTsKLSAgICBpZiAoeCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwpAQCAtMjEyLDggKzIwOCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNlbmRpZgotCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgUHlfc3NpemVfdCAqLwogCiBzdGF0aWMgaW50CkBAIC0yNjcsNiArMjYxLDMzIEBACiAvKiBGbG9hdGluZyBwb2ludCBoZWxwZXJzICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCit1bnBhY2tfaGFsZmZsb2F0KGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiAyLWJ5dGUgc3RyaW5nICovCisgICAgICAgICAgICAgICAgIGludCBsZSkgICAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworeworICAgIGRvdWJsZSB4OworCisgICAgeCA9IF9QeUZsb2F0X1VucGFjazIoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworfQorCitzdGF0aWMgaW50CitwYWNrX2hhbGZmbG9hdChjaGFyICpwLCAgICAgIC8qIHN0YXJ0IG9mIDItYnl0ZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2LCAgLyogdmFsdWUgdG8gcGFjayAqLworICAgICAgICAgICAgICAgaW50IGxlKSAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworeworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUZsb2F0X1BhY2syKHgsICh1bnNpZ25lZCBjaGFyICopcCwgbGUpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgogdW5wYWNrX2Zsb2F0KGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA0LWJ5dGUgc3RyaW5nICovCiAgICAgICAgICBpbnQgbGUpICAgICAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCiB7CkBAIC00MzYsMzAgKzQ1NywyNiBAQAogLyogTmF0aXZlIG1vZGUgZG9lc24ndCBzdXBwb3J0IHEgb3IgUSB1bmxlc3MgdGhlIHBsYXRmb3JtIEMgc3VwcG9ydHMKICAgIGxvbmcgbG9uZyAob3IsIG9uIFdpbmRvd3MsIF9faW50NjQpLiAqLwogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQogc3RhdGljIFB5T2JqZWN0ICoKIG51X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBsb25nIGxvbmcgeDsKICAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwogICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKICAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwogICAgIGlmICh4IDw9IExPTkdfTUFYKQotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBsb25nIGxvbmcsIGxvbmcpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwogfQogCi0jZW5kaWYKLQogc3RhdGljIFB5T2JqZWN0ICoKIG51X2Jvb2woY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewpAQCAtNDcwLDYgKzQ4NywxNiBAQAogCiAKIHN0YXRpYyBQeU9iamVjdCAqCitudV9oYWxmZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmIFBZX0xJVFRMRV9FTkRJQU4KKyAgICByZXR1cm4gdW5wYWNrX2hhbGZmbG9hdChwLCAxKTsKKyNlbHNlCisgICAgcmV0dXJuIHVucGFja19oYWxmZmxvYXQocCwgMCk7CisjZW5kaWYgICAgCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCiBudV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAgICAgZmxvYXQgeDsKQEAgLTY0MywxMiArNjcwLDEwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCiBzdGF0aWMgaW50CiBucF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGxvbmcgbG9uZyB4OwogICAgIGlmIChnZXRfbG9uZ2xvbmcodiwgJngpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CkBAIC02NTgsMTMgKzY4MywxMiBAQAogc3RhdGljIGludAogbnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHg7CiAgICAgaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CiAgICAgcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogCiBzdGF0aWMgaW50CkBAIC02ODEsNiArNzA1LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQKK25wX2hhbGZmbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmIFBZX0xJVFRMRV9FTkRJQU4KKyAgICByZXR1cm4gcGFja19oYWxmZmxvYXQocCwgdiwgMSk7CisjZWxzZQorICAgIHJldHVybiBwYWNrX2hhbGZmbG9hdChwLCB2LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CiBucF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogICAgIGZsb2F0IHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2KTsKQEAgLTcyMyw3ICs3NTcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKICAgICB7J3gnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIE5VTEx9LAogICAgIHsnYicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIG5wX2J5dGV9LAogICAgIHsnQicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIG5wX3VieXRlfSwKQEAgLTczOCwxMSArNzcyLDEwIEBACiAgICAgeydMJywgICAgICAgc2l6ZW9mKGxvbmcpLCAgIExPTkdfQUxJR04sICAgICBudV91bG9uZywgICAgICAgbnBfdWxvbmd9LAogICAgIHsnbicsICAgICAgIHNpemVvZihzaXplX3QpLCBTSVpFX1RfQUxJR04sICAgbnVfc3NpemVfdCwgICAgIG5wX3NzaXplX3R9LAogICAgIHsnTicsICAgICAgIHNpemVvZihzaXplX3QpLCBTSVpFX1RfQUxJR04sICAgbnVfc2l6ZV90LCAgICAgIG5wX3NpemVfdH0sCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICB7J3EnLCAgICAgICBzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV9sb25nbG9uZywgbnBfbG9uZ2xvbmd9LAotICAgIHsnUScsICAgICAgIHNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X3Vsb25nbG9uZyxucF91bG9uZ2xvbmd9LAotI2VuZGlmCisgICAgeydxJywgICAgICAgc2l6ZW9mKGxvbmcgbG9uZyksIExPTkdfTE9OR19BTElHTiwgbnVfbG9uZ2xvbmcsIG5wX2xvbmdsb25nfSwKKyAgICB7J1EnLCAgICAgICBzaXplb2YobG9uZyBsb25nKSwgTE9OR19MT05HX0FMSUdOLCBudV91bG9uZ2xvbmcsbnBfdWxvbmdsb25nfSwKICAgICB7Jz8nLCAgICAgICBzaXplb2YoQk9PTF9UWVBFKSwgICAgICBCT09MX0FMSUdOLCAgICAgbnVfYm9vbCwgICAgICAgIG5wX2Jvb2x9LAorICAgIHsnZScsICAgICAgIHNpemVvZihzaG9ydCksICBTSE9SVF9BTElHTiwgICAgbnVfaGFsZmZsb2F0LCAgIG5wX2hhbGZmbG9hdH0sCiAgICAgeydmJywgICAgICAgc2l6ZW9mKGZsb2F0KSwgIEZMT0FUX0FMSUdOLCAgICBudV9mbG9hdCwgICAgICAgbnBfZmxvYXR9LAogICAgIHsnZCcsICAgICAgIHNpemVvZihkb3VibGUpLCBET1VCTEVfQUxJR04sICAgbnVfZG91YmxlLCAgICAgIG5wX2RvdWJsZX0sCiAgICAgeydQJywgICAgICAgc2l6ZW9mKHZvaWQgKiksIFZPSURfUF9BTElHTiwgICBudV92b2lkX3AsICAgICAgbnBfdm9pZF9wfSwKQEAgLTc4Myw4ICs4MTYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBsb25nIGxvbmcgeCA9IDA7CiAgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKICAgICBkbyB7CkBAIC03OTIsMzcgKzgyNCwzMCBAQAogICAgIH0gd2hpbGUgKC0taSA+IDApOwogICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCiAgICAgaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQotICAgICAgICB4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgICAgICB4IHw9IC0oeCAmICgobG9uZyBsb25nKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwogICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4ID0gMDsKICAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwogICAgIGRvIHsKICAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOwogICAgIH0gd2hpbGUgKC0taSA+IDApOwogICAgIGlmICh4IDw9IExPTkdfTUFYKQotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBsb25nIGxvbmcsIGxvbmcpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitidV9oYWxmZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworICAgIHJldHVybiB1bnBhY2tfaGFsZmZsb2F0KHAsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTIyLDYgKzk0NywxMiBAQAogfQogCiBzdGF0aWMgaW50CiticF9oYWxmZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKyAgICByZXR1cm4gcGFja19oYWxmZmxvYXQocCwgdiwgMCk7Cit9CisKK3N0YXRpYyBpbnQKIGJwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwpAQCAtOTcyLDYgKzEwMDMsNyBAQAogICAgIHsncScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfbG9uZ2xvbmcsICAgIGJwX2xvbmdsb25nfSwKICAgICB7J1EnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X3Vsb25nbG9uZywgICBicF91bG9uZ2xvbmd9LAogICAgIHsnPycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfYm9vbCwgICAgICAgIGJwX2Jvb2x9LAorICAgIHsnZScsICAgICAgIDIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfaGFsZmZsb2F0LCAgIGJwX2hhbGZmbG9hdH0sCiAgICAgeydmJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9mbG9hdCwgICAgICAgYnBfZmxvYXR9LAogICAgIHsnZCcsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfZG91YmxlLCAgICAgIGJwX2RvdWJsZX0sCiAgICAgezB9CkBAIC0xMDExLDggKzEwNDMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBsb25nIGxvbmcgeCA9IDA7CiAgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKICAgICBkbyB7CkBAIC0xMDIwLDM3ICsxMDUxLDMwIEBACiAgICAgfSB3aGlsZSAoaSA+IDApOwogICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCiAgICAgaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQotICAgICAgICB4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgICAgICB4IHw9IC0oeCAmICgobG9uZyBsb25nKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwogICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0gICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIGxvbmcgbG9uZywgbG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsdV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4ID0gMDsKICAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwogICAgIGRvIHsKICAgICAgICAgeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07CiAgICAgfSB3aGlsZSAoaSA+IDApOwogICAgIGlmICh4IDw9IExPTkdfTUFYKQotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBsb25nIGxvbmcsIGxvbmcpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOwotI2Vsc2UKLSAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOwotI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV9oYWxmZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworICAgIHJldHVybiB1bnBhY2tfaGFsZmZsb2F0KHAsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTE0Miw2ICsxMTY2LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKK2xwX2hhbGZmbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworICAgIHJldHVybiBwYWNrX2hhbGZmbG9hdChwLCB2LCAxKTsKK30KKworc3RhdGljIGludAogbHBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKICAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CkBAIC0xMTgyLDYgKzEyMTIsNyBAQAogICAgIHsnUScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfdWxvbmdsb25nLCAgIGxwX3Vsb25nbG9uZ30sCiAgICAgeyc/JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9ib29sLCAgICAgICAgYnBfYm9vbH0sIC8qIFN0ZCByZXAgbm90IGVuZGlhbiBkZXAsCiAgICAgICAgIGJ1dCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgcmVwIC0tIHJldXNlIGJ4X2Jvb2wgZnVuY3MuICovCisgICAgeydlJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9oYWxmZmxvYXQsICAgbHBfaGFsZmZsb2F0fSwKICAgICB7J2YnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2Zsb2F0LCAgICAgICBscF9mbG9hdH0sCiAgICAgeydkJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9kb3VibGUsICAgICAgbHBfZG91YmxlfSwKICAgICB7MH0KQEAgLTExODksNyArMTIyMCw3IEBACiAKIAogc3RhdGljIGNvbnN0IGZvcm1hdGRlZiAqCi13aGljaHRhYmxlKGNoYXIgKipwZm10KQord2hpY2h0YWJsZShjb25zdCBjaGFyICoqcGZtdCkKIHsKICAgICBjb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCiAgICAgc3dpdGNoICgqZm10KSB7CkBAIC0xMjY4LDcgKzEyOTksNyBAQAogCiAgICAgZm10ID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZi0+c19mb3JtYXQpOwogCi0gICAgZiA9IHdoaWNodGFibGUoKGNoYXIgKiopJmZtdCk7CisgICAgZiA9IHdoaWNodGFibGUoJmZtdCk7CiAKICAgICBzID0gZm10OwogICAgIHNpemUgPSAwOwpAQCAtMTQ1Niw3ICsxNDg3LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXNfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNoYXIgKnN0YXJ0ZnJvbSkgeworc191bnBhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgY29uc3QgY2hhciAqc3RhcnRmcm9tKSB7CiAgICAgZm9ybWF0Y29kZSAqY29kZTsKICAgICBQeV9zc2l6ZV90IGkgPSAwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldyhzb3NlbGYtPnNfbGVuKTsKQEAgLTIyMzksNyArMjI3MCw3IEBACiAgIHg6IHBhZCBieXRlIChubyBkYXRhKTsgYzpjaGFyOyBiOnNpZ25lZCBieXRlOyBCOnVuc2lnbmVkIGJ5dGU7XG5cCiAgID86IF9Cb29sIChyZXF1aXJlcyBDOTk7IGlmIG5vdCBhdmFpbGFibGUsIGNoYXIgaXMgdXNlZCBpbnN0ZWFkKVxuXAogICBoOnNob3J0OyBIOnVuc2lnbmVkIHNob3J0OyBpOmludDsgSTp1bnNpZ25lZCBpbnQ7XG5cCi0gIGw6bG9uZzsgTDp1bnNpZ25lZCBsb25nOyBmOmZsb2F0OyBkOmRvdWJsZS5cblwKKyAgbDpsb25nOyBMOnVuc2lnbmVkIGxvbmc7IGY6ZmxvYXQ7IGQ6ZG91YmxlOyBlOmhhbGYtZmxvYXQuXG5cCiBTcGVjaWFsIGNhc2VzIChwcmVjZWRpbmcgZGVjaW1hbCBjb3VudCBpbmRpY2F0ZXMgbGVuZ3RoKTpcblwKICAgczpzdHJpbmcgKGFycmF5IG9mIGNoYXIpOyBwOiBwYXNjYWwgc3RyaW5nICh3aXRoIGNvdW50IGJ5dGUpLlxuXAogU3BlY2lhbCBjYXNlcyAob25seSBhdmFpbGFibGUgaW4gbmF0aXZlIGZvcm1hdCk6XG5cCkBAIC0yMjc5LDcgKzIzMTAsNyBAQAogCiAgICAgLyogQ2hlY2sgZW5kaWFuIGFuZCBzd2FwIGluIGZhc3RlciBmdW5jdGlvbnMgKi8KICAgICB7Ci0gICAgICAgIGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKICAgICAgICAgZm9ybWF0ZGVmICpvdGhlciwgKnB0cjsKICNpZiBQWV9MSVRUTEVfRU5ESUFOCiAgICAgICAgIG90aGVyID0gbGlsZW5kaWFuX3RhYmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jIGIvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCmluZGV4IDQzZGI4YTguLjEzZDNjY2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RidWZmZXIuYworKysgYi9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKQEAgLTEzLDcgKzEzLDcgQEAKIFB5T2JqZWN0ICpjYWxjc2l6ZSA9IE5VTEw7CiAKIC8qIGNhY2hlIHNpbXBsZSBmb3JtYXQgc3RyaW5nICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltcGxlX2ZtdCA9ICJCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNpbXBsZV9mbXRbXSA9ICJCIjsKIFB5T2JqZWN0ICpzaW1wbGVfZm9ybWF0ID0gTlVMTDsKICNkZWZpbmUgU0lNUExFX0ZPUk1BVChmbXQpIChmbXQgPT0gTlVMTCB8fCBzdHJjbXAoZm10LCAiQiIpID09IDApCiAjZGVmaW5lIEZJWF9GT1JNQVQoZm10KSAoZm10ID09IE5VTEwgPyAiQiIgOiBmbXQpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwppbmRleCAzODEwZTk0Li44N2NmNGIyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKQEAgLTYwLDkgKzYwLDcgQEAKICAgICBDSEVDS19TSVpFT0YoU0laRU9GX0xPTkcsIGxvbmcpOwogICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfVk9JRF9QLCB2b2lkKik7CiAgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9USU1FX1QsIHRpbWVfdCk7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBDSEVDS19TSVpFT0YoU0laRU9GX0xPTkdfTE9ORywgUFlfTE9OR19MT05HKTsKLSNlbmRpZgorICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBsb25nIGxvbmcpOwogCiAjdW5kZWYgQ0hFQ0tfU0laRU9GCiAKQEAgLTEwMCwyMiArOTgsMTQgQEAKICAgICBDSEVDS19TSUdOTkVTUyhQeV9VQ1MxLCAwKTsKICAgICBDSEVDS19TSUdOTkVTUyhQeV9VQ1MyLCAwKTsKICAgICBDSEVDS19TSUdOTkVTUyhQeV9VQ1M0LCAwKTsKLSNpZmRlZiBIQVZFX0lOVDMyX1QKLSAgICBDSEVDS19TSVpFT0YoUFlfSU5UMzJfVCwgNCk7Ci0gICAgQ0hFQ0tfU0lHTk5FU1MoUFlfSU5UMzJfVCwgMSk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VJTlQzMl9UCi0gICAgQ0hFQ0tfU0laRU9GKFBZX1VJTlQzMl9ULCA0KTsKLSAgICBDSEVDS19TSUdOTkVTUyhQWV9VSU5UMzJfVCwgMCk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVDY0X1QKLSAgICBDSEVDS19TSVpFT0YoUFlfSU5UNjRfVCwgOCk7Ci0gICAgQ0hFQ0tfU0lHTk5FU1MoUFlfSU5UNjRfVCwgMSk7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VJTlQ2NF9UCi0gICAgQ0hFQ0tfU0laRU9GKFBZX1VJTlQ2NF9ULCA4KTsKLSAgICBDSEVDS19TSUdOTkVTUyhQWV9VSU5UNjRfVCwgMCk7Ci0jZW5kaWYKKyAgICBDSEVDS19TSVpFT0YoaW50MzJfdCwgNCk7CisgICAgQ0hFQ0tfU0lHTk5FU1MoaW50MzJfdCwgMSk7CisgICAgQ0hFQ0tfU0laRU9GKHVpbnQzMl90LCA0KTsKKyAgICBDSEVDS19TSUdOTkVTUyh1aW50MzJfdCwgMCk7CisgICAgQ0hFQ0tfU0laRU9GKGludDY0X3QsIDgpOworICAgIENIRUNLX1NJR05ORVNTKGludDY0X3QsIDEpOworICAgIENIRUNLX1NJWkVPRih1aW50NjRfdCwgOCk7CisgICAgQ0hFQ0tfU0lHTk5FU1ModWludDY0X3QsIDApOwogCiAgICAgLyogcG9pbnRlci9zaXplIHR5cGVzICovCiAgICAgQ0hFQ0tfU0laRU9GKHNpemVfdCwgc2l6ZW9mKHZvaWQgKikpOwpAQCAtMTIzLDEwICsxMTMsMTAgQEAKICAgICBDSEVDS19TSVpFT0YoUHlfc3NpemVfdCwgc2l6ZW9mKHZvaWQgKikpOwogICAgIENIRUNLX1NJR05ORVNTKFB5X3NzaXplX3QsIDEpOwogCi0gICAgQ0hFQ0tfU0laRU9GKFB5X3VpbnRwdHJfdCwgc2l6ZW9mKHZvaWQgKikpOwotICAgIENIRUNLX1NJR05ORVNTKFB5X3VpbnRwdHJfdCwgMCk7Ci0gICAgQ0hFQ0tfU0laRU9GKFB5X2ludHB0cl90LCBzaXplb2Yodm9pZCAqKSk7Ci0gICAgQ0hFQ0tfU0lHTk5FU1MoUHlfaW50cHRyX3QsIDEpOworICAgIENIRUNLX1NJWkVPRih1aW50cHRyX3QsIHNpemVvZih2b2lkICopKTsKKyAgICBDSEVDS19TSUdOTkVTUyh1aW50cHRyX3QsIDApOworICAgIENIRUNLX1NJWkVPRihpbnRwdHJfdCwgc2l6ZW9mKHZvaWQgKikpOworICAgIENIRUNLX1NJR05ORVNTKGludHB0cl90LCAxKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTM1NywxMiArMzQ3LDEyIEBACiB9CiAKIAotLyogVGVzdHMgb2YgUHlMb25nX3tBcywgRnJvbX17VW5zaWduZWQsfUxvbmcoKSwgYW5kICgjaWZkZWYgSEFWRV9MT05HX0xPTkcpCisvKiBUZXN0cyBvZiBQeUxvbmdfe0FzLCBGcm9tfXtVbnNpZ25lZCx9TG9uZygpLCBhbmQKICAgIFB5TG9uZ197QXMsIEZyb219e1Vuc2lnbmVkLH1Mb25nTG9uZygpLgogCiAgICBOb3RlIHRoYXQgdGhlIG1lYXQgb2YgdGhlIHRlc3QgaXMgY29udGFpbmVkIGluIHRlc3RjYXBpX2xvbmcuaC4KICAgIFRoaXMgaXMgcmV2b2x0aW5nLCBidXQgZGVsaWNhdGUgY29kZSBkdXBsaWNhdGlvbiBpcyB3b3JzZTogICJhbG1vc3QKLSAgIGV4YWN0bHkgdGhlIHNhbWUiIGNvZGUgaXMgbmVlZGVkIHRvIHRlc3QgUFlfTE9OR19MT05HLCBidXQgdGhlIHViaXF1aXRvdXMKKyAgIGV4YWN0bHkgdGhlIHNhbWUiIGNvZGUgaXMgbmVlZGVkIHRvIHRlc3QgbG9uZyBsb25nLCBidXQgdGhlIHViaXF1aXRvdXMKICAgIGRlcGVuZGVuY2Ugb24gdHlwZSBuYW1lcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHVzZSBhIHBhcmFtZXRlcml6ZWQKICAgIGZ1bmN0aW9uLiAgQSBnaWFudCBtYWNybyB3b3VsZCBiZSBldmVuIHdvcnNlIHRoYW4gdGhpcy4gIEEgQysrIHRlbXBsYXRlCiAgICB3b3VsZCBiZSBwZXJmZWN0LgpAQCAtNDAyLDggKzM5Miw2IEBACiAjdW5kZWYgRl9VX1RPX1BZCiAjdW5kZWYgRl9QWV9UT19VCiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCiBzdGF0aWMgUHlPYmplY3QgKgogcmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcihjb25zdCBjaGFyKiBtc2cpCiB7CkBAIC00MTEsNyArMzk5LDcgQEAKIH0KIAogI2RlZmluZSBURVNUTkFNRSAgICAgICAgdGVzdF9sb25nbG9uZ19hcGlfaW5uZXIKLSNkZWZpbmUgVFlQRU5BTUUgICAgICAgIFBZX0xPTkdfTE9ORworI2RlZmluZSBUWVBFTkFNRSAgICAgICAgbG9uZyBsb25nCiAjZGVmaW5lIEZfU19UT19QWSAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nCiAjZGVmaW5lIEZfUFlfVE9fUyAgICAgICBQeUxvbmdfQXNMb25nTG9uZwogI2RlZmluZSBGX1VfVE9fUFkgICAgICAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCkBAIC01OTgsNyArNTg2LDcgQEAKIH0KIAogLyogVGVzdCB0aGUgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyBBUEkuIEdlbmVyYWwgY29udmVyc2lvbiB0bwotICAgUFlfTE9OR19MT05HIGlzIHRlc3RlZCBieSB0ZXN0X2xvbmdfYXBpX2lubmVyLiBUaGlzIHRlc3Qgd2lsbAorICAgbG9uZyBsb25nIGlzIHRlc3RlZCBieSB0ZXN0X2xvbmdfYXBpX2lubmVyLiBUaGlzIHRlc3Qgd2lsbAogICAgY29uY2VudHJhdGUgb24gcHJvcGVyIGhhbmRsaW5nIG9mIG92ZXJmbG93LgogKi8KIApAQCAtNjA2LDcgKzU5NCw3IEBACiB0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3coUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKm51bSwgKm9uZSwgKnRlbXA7Ci0gICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgIGxvbmcgbG9uZyB2YWx1ZTsKICAgICBpbnQgb3ZlcmZsb3c7CiAKICAgICAvKiBUZXN0IHRoYXQgb3ZlcmZsb3cgaXMgc2V0IHByb3Blcmx5IGZvciBhIGxhcmdlIHZhbHVlLiAqLwpAQCAtODI0LDcgKzgxMiw3IEBACiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLS8qIFRlc3QgdGhlIEwgY29kZSBmb3IgUHlBcmdfUGFyc2VUdXBsZS4gIFRoaXMgc2hvdWxkIGRlbGl2ZXIgYSBQWV9MT05HX0xPTkcKKy8qIFRlc3QgdGhlIEwgY29kZSBmb3IgUHlBcmdfUGFyc2VUdXBsZS4gIFRoaXMgc2hvdWxkIGRlbGl2ZXIgYSBsb25nIGxvbmcKICAgIGZvciBib3RoIGxvbmcgYW5kIGludCBhcmd1bWVudHMuICBUaGUgdGVzdCBtYXkgbGVhayBhIGxpdHRsZSBtZW1vcnkgaWYKICAgIGl0IGZhaWxzLgogKi8KQEAgLTgzMiw3ICs4MjAsNyBAQAogdGVzdF9MX2NvZGUoUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKnR1cGxlLCAqbnVtOwotICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICBsb25nIGxvbmcgdmFsdWU7CiAKICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOwogICAgIGlmICh0dXBsZSA9PSBOVUxMKQpAQCAtODcwLDggKzg1OCw2IEBACiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLSNlbmRpZiAgLyogaWZkZWYgSEFWRV9MT05HX0xPTkcgKi8KLQogc3RhdGljIFB5T2JqZWN0ICoKIHJldHVybl9ub25lKHZvaWQgKnVudXNlZCkKIHsKQEAgLTEwMDEsNyArOTg3LDcgQEAKIGdldGFyZ3Nfa2V5d29yZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhcmcxIiwiYXJnMiIsImFyZzMiLCJhcmc0IiwiYXJnNSIsIE5VTEx9OwotICAgIHN0YXRpYyBjaGFyICpmbXQ9IihpaSlpfChpKGlpKSkoaWlpKWkiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIihpaSlpfChpKGlpKSkoaWlpKWkiOwogICAgIGludCBpbnRfYXJnc1sxMF09ey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgZm10LCBrZXl3b3JkcywKQEAgLTEwMjgsNiArMTAxNCwyMSBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCByZXF1aXJlZCwgb3B0aW9uYWwsIGtleXdvcmRfb25seSk7CiB9CiAKKy8qIHRlc3QgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIHBvc2l0aW9uYWwtb25seSBhcmd1bWVudHMgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyIiLCAiIiwgImtleXdvcmQiLCBOVUxMfTsKKyAgICBpbnQgcmVxdWlyZWQgPSAtMTsKKyAgICBpbnQgb3B0aW9uYWwgPSAtMTsKKyAgICBpbnQga2V5d29yZCA9IC0xOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaXxpaSIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1aXJlZCwgJm9wdGlvbmFsLCAma2V5d29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCByZXF1aXJlZCwgb3B0aW9uYWwsIGtleXdvcmQpOworfQorCiAvKiBGdW5jdGlvbnMgdG8gY2FsbCBQeUFyZ19QYXJzZVR1cGxlIHdpdGggaW50ZWdlciBmb3JtYXQgY29kZXMsCiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCiAqLwpAQCAtMTEyMSwxMSArMTEyMiwxMCBAQAogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICBsb25nIGxvbmcgdmFsdWU7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJMIiwgJnZhbHVlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOwpAQCAtMTEzNCwxMiArMTEzNCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfSyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIksiLCAmdmFsdWUpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKIH0KLSNlbmRpZgogCiAvKiBUaGlzIGZ1bmN0aW9uIG5vdCBvbmx5IHRlc3RzIHRoZSAnaycgZ2V0YXJncyBjb2RlLCBidXQgYWxzbyB0aGUKICAgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSBhbmQgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIGZ1bmN0aW9ucy4gKi8KQEAgLTExNjEsNyArMTE2MCw3IEBACiAgICAgdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CiAgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKICAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0gICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAogICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKQEAgLTExODAsNyArMTE3OSw3IEBACiAgICAgdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CiAgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQogICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLSAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCiAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIApAQCAtMjEzMCw3ICsyMTI5LDcgQEAKICAgICBQeU9iamVjdCAqcmM7CiAgICAgaW50IHN1Y2Nlc3M7CiAgICAgUHlHSUxTdGF0ZV9TVEFURSBzID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKLSAgICByYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKiljYWxsYWJsZSwgIiIpOworICAgIHJjID0gX1B5T2JqZWN0X0NhbGxOb0FyZygoUHlPYmplY3QgKiljYWxsYWJsZSk7CiAgICAgc3VjY2VzcyA9IChyYyAhPSBOVUxMKTsKICAgICBQeV9YREVDUkVGKHJjKTsKICAgICBQeUdJTFN0YXRlX1JlbGVhc2Uocyk7CkBAIC0yMjY0LDEwICsyMjYzLDggQEAKICAgICBDSEVDS18xX0ZPUk1BVCgiJXp1Iiwgc2l6ZV90KTsKIAogICAgIC8qICIlbGxkIiBhbmQgIiVsbHUiIHN1cHBvcnQgYWRkZWQgaW4gUHl0aG9uIDIuNy4gKi8KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIENIRUNLXzFfRk9STUFUKCIlbGx1IiwgdW5zaWduZWQgUFlfTE9OR19MT05HKTsKLSAgICBDSEVDS18xX0ZPUk1BVCgiJWxsZCIsIFBZX0xPTkdfTE9ORyk7Ci0jZW5kaWYKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWxsdSIsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiVsbGQiLCBsb25nIGxvbmcpOwogCiAgICAgUHlfUkVUVVJOX05PTkU7CiAKQEAgLTI5MDQsNyArMjkwMSw5IEBACiBzdGF0aWMgaW50CiBjaGVja190aW1lX3JvdW5kaW5nKGludCByb3VuZCkKIHsKLSAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUiAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKKyAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUgorICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcKKyAgICAgICAgJiYgcm91bmQgIT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIHJvdW5kaW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zMzk5LDcgKzMzOTgsNyBAQAogICAgIC8qIEFsbG9jYXRlIGEgUHl0aG9uIHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KICAgICBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAKLSAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24odGVzdF9jX3RocmVhZC0+Y2FsbGJhY2ssICIiLCBOVUxMKTsKKyAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKHRlc3RfY190aHJlYWQtPmNhbGxiYWNrKTsKICAgICBQeV9DTEVBUih0ZXN0X2NfdGhyZWFkLT5jYWxsYmFjayk7CiAKICAgICBpZiAocmVzID09IE5VTEwpIHsKQEAgLTM2ODksNyArMzY4OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9weXRpbWVfYXNzZWNvbmRzZG91YmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQWV9MT05HX0xPTkcgbnM7CisgICAgbG9uZyBsb25nIG5zOwogICAgIF9QeVRpbWVfdCB0czsKICAgICBkb3VibGUgZDsKIApAQCAtMzcwMyw3ICszNzAyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X1B5VGltZV9Bc1RpbWV2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFBZX0xPTkdfTE9ORyBuczsKKyAgICBsb25nIGxvbmcgbnM7CiAgICAgaW50IHJvdW5kOwogICAgIF9QeVRpbWVfdCB0OwogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtMzcxNyw3ICszNzE2LDcgQEAKICAgICBpZiAoX1B5VGltZV9Bc1RpbWV2YWwodCwgJnR2LCByb3VuZCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHNlY29uZHMgPSBQeUxvbmdfRnJvbUxvbmcoKFBZX0xPTkdfTE9ORyl0di50dl9zZWMpOworICAgIHNlY29uZHMgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcgbG9uZyl0di50dl9zZWMpOwogICAgIGlmIChzZWNvbmRzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJObCIsIHNlY29uZHMsIHR2LnR2X3VzZWMpOwpAQCAtMzcyNyw3ICszNzI2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X1B5VGltZV9Bc1RpbWVzcGVjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQWV9MT05HX0xPTkcgbnM7CisgICAgbG9uZyBsb25nIG5zOwogICAgIF9QeVRpbWVfdCB0OwogICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKIApAQCAtMzc0Myw3ICszNzQyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X1B5VGltZV9Bc01pbGxpc2Vjb25kcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUFlfTE9OR19MT05HIG5zOworICAgIGxvbmcgbG9uZyBuczsKICAgICBpbnQgcm91bmQ7CiAgICAgX1B5VGltZV90IHQsIG1zOwogCkBAIC0zNzYxLDcgKzM3NjAsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfUHlUaW1lX0FzTWljcm9zZWNvbmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQWV9MT05HX0xPTkcgbnM7CisgICAgbG9uZyBsb25nIG5zOwogICAgIGludCByb3VuZDsKICAgICBfUHlUaW1lX3QgdCwgbXM7CiAKQEAgLTM3ODEsMTAgKzM3ODAsMTQxIEBACiB7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKIAotICAgIC8qIHN1YnN0cmFjdCBvbmUgdG8gaWdub3JlIHRoZSBmcmFtZSBvZiB0aGUgZ2V0X3JlY3Vyc2lvbl9kZXB0aCgpIGNhbGwgKi8KKyAgICAvKiBzdWJ0cmFjdCBvbmUgdG8gaWdub3JlIHRoZSBmcmFtZSBvZiB0aGUgZ2V0X3JlY3Vyc2lvbl9kZXB0aCgpIGNhbGwgKi8KICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoIC0gMSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCoKK3B5bWVtX2J1ZmZlcl9vdmVyZmxvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBidWZmZXIgb3ZlcmZsb3cgdG8gY2hlY2sgdGhhdCBQeU1lbV9GcmVlKCkgZGV0ZWN0cworICAgICAgIHRoZSBvdmVyZmxvdyB3aGVuIGRlYnVnIGhvb2tzIGFyZSBpbnN0YWxsZWQuICovCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDE2KTsKKyAgICBidWZmZXJbMTZdID0gJ3gnOworICAgIFB5TWVtX0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9hcGlfbWlzdXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIG1pc3VzYWdlIG9mIFB5dGhvbiBhbGxvY2F0b3JzOgorICAgICAgIGFsbG9jb2NhdGUgd2l0aCBQeU1lbSBidXQgcmVsZWFzZSB3aXRoIFB5TWVtX1Jhdy4gKi8KKyAgICBidWZmZXIgPSBQeU1lbV9NYWxsb2MoMTYpOworICAgIFB5TWVtX1Jhd0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9tYWxsb2Nfd2l0aG91dF9naWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVnIHRvIHRlc3QgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzOgorICAgICAgIGNhbGwgUHlNZW1fTWFsbG9jKCkgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDEwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgUHlNZW1fRnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK3B5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBidWcgdG8gdGVzdCBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnM6CisgICAgICAgY2FsbCBQeU9iamVjdF9NYWxsb2MoKSB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBidWZmZXIgPSBQeU9iamVjdF9NYWxsb2MoMTApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBQeU9iamVjdF9GcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX3RyYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluOworICAgIFB5T2JqZWN0ICpwdHJfb2JqOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IHJlbGVhc2VfZ2lsID0gMDsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJT258aSIsICZkb21haW4sICZwdHJfb2JqLCAmc2l6ZSwgJnJlbGVhc2VfZ2lsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAocmVsZWFzZV9naWwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19UcmFjayhkb21haW4sICh1aW50cHRyX3QpcHRyLCBzaXplKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IF9QeVRyYWNlTWFsbG9jX1RyYWNrKGRvbWFpbiwgKHVpbnRwdHJfdClwdHIsIHNpemUpOworICAgIH0KKworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJfUHlUcmFjZU1hbGxvY19UcmFjayBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX3VudHJhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBkb21haW47CisgICAgUHlPYmplY3QgKnB0cl9vYmo7CisgICAgdm9pZCAqcHRyOworICAgIGludCByZXM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklPIiwgJmRvbWFpbiwgJnB0cl9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKHB0cl9vYmopOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJlcyA9IF9QeVRyYWNlTWFsbG9jX1VudHJhY2soZG9tYWluLCAodWludHB0cl90KXB0cik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIl9QeVRyYWNlTWFsbG9jX1RyYWNrIGVycm9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgordHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICBQeU9iamVjdCAqcHRyX29iajsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklPIiwgJmRvbWFpbiwgJnB0cl9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKHB0cl9vYmopOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBfUHlUcmFjZU1hbGxvY19HZXRUcmFjZWJhY2soZG9tYWluLCAodWludHB0cl90KXB0cik7Cit9CisKIAogc3RhdGljIFB5TWV0aG9kRGVmIFRlc3RNZXRob2RzW10gPSB7CiAgICAgeyJyYWlzZV9leGNlcHRpb24iLCAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbiwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCkBAIC0zODMwLDYgKzM5NjAsOSBAQAogICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsiZ2V0YXJnc19rZXl3b3JkX29ubHkiLCAoUHlDRnVuY3Rpb24pZ2V0YXJnc19rZXl3b3JkX29ubHksCiAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCisgICAgeyJnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMiLAorICAgICAgKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcywKKyAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKICAgICB7ImdldGFyZ3NfYiIsICAgICAgICAgICAgICAgZ2V0YXJnc19iLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfQiIsICAgICAgICAgICAgICAgZ2V0YXJnc19CLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfaCIsICAgICAgICAgICAgICAgZ2V0YXJnc19oLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKQEAgLTM4NDAsMTQgKzM5NzMsMTIgQEAKICAgICB7ImdldGFyZ3NfbCIsICAgICAgICAgICAgICAgZ2V0YXJnc19sLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfbiIsICAgICAgICAgICAgICAgZ2V0YXJnc19uLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfcCIsICAgICAgICAgICAgICAgZ2V0YXJnc19wLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIHsiZ2V0YXJnc19MIiwgICAgICAgICAgICAgICBnZXRhcmdzX0wsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19LIiwgICAgICAgICAgICAgICBnZXRhcmdzX0ssICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsidGVzdF9sb25nbG9uZ19hcGkiLCAgICAgICB0ZXN0X2xvbmdsb25nX2FwaSwgICAgICAgICAgICAgICBNRVRIX05PQVJHU30sCiAgICAgeyJ0ZXN0X2xvbmdfbG9uZ19hbmRfb3ZlcmZsb3ciLAogICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9sb25nX2xvbmdfYW5kX292ZXJmbG93LCBNRVRIX05PQVJHU30sCiAgICAgeyJ0ZXN0X0xfY29kZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X0xfY29kZSwgICAgICAgIE1FVEhfTk9BUkdTfSwKLSNlbmRpZgogICAgIHsiZ2V0YXJnc19mIiwgICAgICAgICAgICAgICBnZXRhcmdzX2YsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19kIiwgICAgICAgICAgICAgICBnZXRhcmdzX2QsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0YXJnc19EIiwgICAgICAgICAgICAgICBnZXRhcmdzX0QsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LApAQCAtMzk3Niw2ICs0MTA3LDEzIEBACiAgICAgeyJQeVRpbWVfQXNNaWxsaXNlY29uZHMiLCB0ZXN0X1B5VGltZV9Bc01pbGxpc2Vjb25kcywgTUVUSF9WQVJBUkdTfSwKICAgICB7IlB5VGltZV9Bc01pY3Jvc2Vjb25kcyIsIHRlc3RfUHlUaW1lX0FzTWljcm9zZWNvbmRzLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0X3JlY3Vyc2lvbl9kZXB0aCIsIGdldF9yZWN1cnNpb25fZGVwdGgsIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5bWVtX2J1ZmZlcl9vdmVyZmxvdyIsIHB5bWVtX2J1ZmZlcl9vdmVyZmxvdywgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fYXBpX21pc3VzZSIsIHB5bWVtX2FwaV9taXN1c2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5bWVtX21hbGxvY193aXRob3V0X2dpbCIsIHB5bWVtX21hbGxvY193aXRob3V0X2dpbCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHlvYmplY3RfbWFsbG9jX3dpdGhvdXRfZ2lsIiwgcHlvYmplY3RfbWFsbG9jX3dpdGhvdXRfZ2lsLCBNRVRIX05PQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY190cmFjayIsIHRyYWNlbWFsbG9jX3RyYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidHJhY2VtYWxsb2NfdW50cmFjayIsIHRyYWNlbWFsbG9jX3VudHJhY2ssIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrIiwgdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjaywgTUVUSF9WQVJBUkdTfSwKICAgICB7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTM5OTUsMTAgKzQxMzMsOCBAQAogICAgIGZsb2F0IGZsb2F0X21lbWJlcjsKICAgICBkb3VibGUgZG91YmxlX21lbWJlcjsKICAgICBjaGFyIGlucGxhY2VfbWVtYmVyWzZdOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgUFlfTE9OR19MT05HIGxvbmdsb25nX21lbWJlcjsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdWxvbmdsb25nX21lbWJlcjsKLSNlbmRpZgorICAgIGxvbmcgbG9uZyBsb25nbG9uZ19tZW1iZXI7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHVsb25nbG9uZ19tZW1iZXI7CiB9IGFsbF9zdHJ1Y3RtZW1iZXJzOwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC00MDIwLDEwICs0MTU2LDggQEAKICAgICB7IlRfRkxPQVQiLCBUX0ZMT0FULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyKSwgMCwgTlVMTH0sCiAgICAgeyJUX0RPVUJMRSIsIFRfRE9VQkxFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciksIDAsIE5VTEx9LAogICAgIHsiVF9TVFJJTkdfSU5QTEFDRSIsIFRfU1RSSU5HX0lOUExBQ0UsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciksIDAsIE5VTEx9LAotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgeyJUX0xPTkdMT05HIiwgVF9MT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciksIDAsIE5VTEx9LAogICAgIHsiVF9VTE9OR0xPTkciLCBUX1VMT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVsb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKLSNlbmRpZgogICAgIHtOVUxMfQogfTsKIApAQCAtNDAzNSwxNSArNDE2OSw5IEBACiAgICAgICAgICJUX0JPT0wiLCAiVF9CWVRFIiwgIlRfVUJZVEUiLCAiVF9TSE9SVCIsICJUX1VTSE9SVCIsCiAgICAgICAgICJUX0lOVCIsICJUX1VJTlQiLCAiVF9MT05HIiwgIlRfVUxPTkciLCAiVF9QWVNTSVpFVCIsCiAgICAgICAgICJUX0ZMT0FUIiwgIlRfRE9VQkxFIiwgIlRfU1RSSU5HX0lOUExBQ0UiLAotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICJUX0xPTkdMT05HIiwgIlRfVUxPTkdMT05HIiwKLSNlbmRpZgogICAgICAgICBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gInxiYkJoSGlJbGtuZmRzIyIKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgICAiTEsiCi0jZW5kaWYKLSAgICAgICAgOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gInxiYkJoSGlJbGtuZmRzI0xLIjsKICAgICB0ZXN0X3N0cnVjdG1lbWJlcnMgKm9iOwogICAgIGNvbnN0IGNoYXIgKnMgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc3RyaW5nX2xlbiA9IDA7CkBAIC00MDY1LDEwICs0MTkzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy5kb3VibGVfbWVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLCAmc3RyaW5nX2xlbgotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAmb2ItPnN0cnVjdG1lbWJlcnMubG9uZ2xvbmdfbWVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51bG9uZ2xvbmdfbWVtYmVyCi0jZW5kaWYKICAgICAgICAgKSkgewogICAgICAgICBQeV9ERUNSRUYob2IpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQzOTQsNiArNDUyMCw3IEBACiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01BWCIsIFB5TG9uZ19Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUxvbmdfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NSU4pKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9QWUdDX0hFQUQiLCBQeUxvbmdfRnJvbVNzaXplX3Qoc2l6ZW9mKFB5R0NfSGVhZCkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9USU1FX1QiLCBQeUxvbmdfRnJvbVNzaXplX3Qoc2l6ZW9mKHRpbWVfdCkpKTsKICAgICBQeV9JTkNSRUYoJlB5SW5zdGFuY2VNZXRob2RfVHlwZSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpbnN0YW5jZW1ldGhvZCIsIChQeU9iamVjdCAqKSZQeUluc3RhbmNlTWV0aG9kX1R5cGUpOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jIGIvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYwppbmRleCA0MWRhOTk3Li40ZGFhMzRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIH0KIAogc3RhdGljIGludAotRXhhbXBsZV9zZXRhdHRyKEV4YW1wbGVPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQorRXhhbXBsZV9zZXRhdHRyKEV4YW1wbGVPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190aHJlYWRtb2R1bGUuYyBiL01vZHVsZXMvX3RocmVhZG1vZHVsZS5jCmluZGV4IDk2ODE4MWMuLjAyMTk1NTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RocmVhZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3RocmVhZG1vZHVsZS5jCkBAIC00NSw3ICs0NSw3IEBACiAvKiBIZWxwZXIgdG8gYWNxdWlyZSBhbiBpbnRlcnJ1cHRpYmxlIGxvY2sgd2l0aCBhIHRpbWVvdXQuICBJZiB0aGUgbG9jayBhY3F1aXJlCiAgKiBpcyBpbnRlcnJ1cHRlZCwgc2lnbmFsIGhhbmRsZXJzIGFyZSBydW4sIGFuZCBpZiB0aGV5IHJhaXNlIGFuIGV4Y2VwdGlvbiwKICAqIFBZX0xPQ0tfSU5UUiBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgUFlfTE9DS19BQ1FVSVJFRCBvciBQWV9MT0NLX0ZBSUxVUkUKLSAqIGFyZSByZXR1cm5lZCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxvY2sgY2FuIGJlIGFjcXVpcmVkIHdpdGhpbmcgdGhlCisgKiBhcmUgcmV0dXJuZWQsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBsb2NrIGNhbiBiZSBhY3F1aXJlZCB3aXRoaW4gdGhlCiAgKiB0aW1lb3V0LgogICovCiBzdGF0aWMgUHlMb2NrU3RhdHVzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggMzE2ZjkzMi4uOGFmYzRkNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgaSwgdyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHcpOwogICAgICAgICB9CiAgICAgfQogICAgIFRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwpAQCAtNDgwLDEzICs0ODAsMTMgQEAKICAgICAgICAgUHlfc3NpemVfdCBpLCBzaXplOwogICAgICAgICBQeU9iamVjdCAqZWxlbSwgKm5ld2VsZW0sICpyZXN1bHQ7CiAKLSAgICAgICAgc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmcpOworICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOwogICAgICAgICByZXN1bHQgPSBOVUxMOwogICAgICAgICAvKiBSZWN1cnNpdmVseSBpbnZva2UgU3BsaXRPYmogZm9yIGFsbCB0dXBsZSBpdGVtcy4KICAgICAgICAgICAgSWYgdGhpcyBkb2VzIG5vdCByZXR1cm4gYSBuZXcgb2JqZWN0LCBubyBhY3Rpb24gaXMKICAgICAgICAgICAgbmVlZGVkLiAqLwogICAgICAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBpKTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgaSk7CiAgICAgICAgICAgICBuZXdlbGVtID0gU3BsaXRPYmooZWxlbSk7CiAgICAgICAgICAgICBpZiAoIW5ld2VsZW0pIHsKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CkBAIC01MDIsMTIgKzUwMiwxMiBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGspOworICAgICAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIGspOwogICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGssIGVsZW0pOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaywgZWxlbSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC01MjksNyArNTI5LDcgQEAKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTU1MSw3ICs1NTEsNyBAQAogICAgIGVsc2UgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSkgewogICAgICAgICBpbnQgYXJnYzsKICAgICAgICAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gICAgICAgIGNoYXIgKmxpc3QgPSBQeUJ5dGVzX0FzU3RyaW5nKGFyZyk7CisgICAgICAgIGNoYXIgKmxpc3QgPSBQeUJ5dGVzX0FTX1NUUklORyhhcmcpOwogCiAgICAgICAgIGlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRihhcmcpOwpAQCAtNTU5LDcgKzU1OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7CiAgICAgICAgIGlmIChhcmdjID4gMSkKLSAgICAgICAgICAgIHJldHVybiBTcGxpdChQeUJ5dGVzX0FzU3RyaW5nKGFyZykpOworICAgICAgICAgICAgcmV0dXJuIFNwbGl0KFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZykpOwogICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCiAgICAgfQogICAgIFB5X0lOQ1JFRihhcmcpOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRjbF9saWJyYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmcodXRmOF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHV0ZjhfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0xfR0xPQkFMX09OTFkpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1dGY4X3BhdGgpOwogICAgICAgICAgICAgfQpAQCAtODQxLDcgKzg0MSw3IEBACiAgICAgUHlfREVDUkVGKHRwKTsKIH0KIAotc3RhdGljIGNoYXIqCitzdGF0aWMgY29uc3QgY2hhciAqCiBQeVRjbE9iamVjdF9UY2xTdHJpbmcoUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgcmV0dXJuIFRjbF9HZXRTdHJpbmcoKChQeVRjbE9iamVjdCopc2VsZiktPnZhbHVlKTsKQEAgLTExODIsMTAgKzExODIsOCBAQAogewogICAgICAgICBUY2xfV2lkZUludCB3aWRlVmFsdWU7CiAgICAgICAgIGlmIChUY2xfR2V0V2lkZUludEZyb21PYmooVGthcHBfSW50ZXJwKHRrYXBwKSwgdmFsdWUsICZ3aWRlVmFsdWUpID09IFRDTF9PSykgewotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICAgICBpZiAoc2l6ZW9mKHdpZGVWYWx1ZSkgPD0gU0laRU9GX0xPTkdfTE9ORykKICAgICAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh3aWRlVmFsdWUpOwotI2VuZGlmCiAgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KCh1bnNpZ25lZCBjaGFyICopKHZvaWQgKikmd2lkZVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yod2lkZVZhbHVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfTElUVExFX0VORElBTiwKQEAgLTEzMDYsNyArMTMwNCw3IEBACiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE1MTcsOCArMTUxNSw4IEBACiAgICAgaW50IGZsYWdzID0gVENMX0VWQUxfRElSRUNUIHwgVENMX0VWQUxfR0xPQkFMOwogCiAgICAgLyogSWYgYXJncyBpcyBhIHNpbmdsZSB0dXBsZSwgcmVwbGFjZSB3aXRoIGNvbnRlbnRzIG9mIHR1cGxlICovCi0gICAgaWYgKDEgPT0gUHlUdXBsZV9TaXplKGFyZ3MpKXsKLSAgICAgICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CiAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKQogICAgICAgICAgICAgYXJncyA9IGl0ZW07CiAgICAgfQpAQCAtMTcyNiwxNCArMTcyNCwxNCBAQAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewogICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKKyAgICBjb25zdCBjaGFyICoqb3V0ID0gKGNvbnN0IGNoYXIqKilfb3V0OwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKGluKSkgewotICAgICAgICBpZiAoUHlCeXRlc19TaXplKGluKSA+IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKFB5Qnl0ZXNfR0VUX1NJWkUoaW4pID4gSU5UX01BWCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJieXRlcyBvYmplY3QgaXMgdG9vIGxvbmciKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIHMgPSBQeUJ5dGVzX0FzU3RyaW5nKGluKTsKLSAgICAgICAgaWYgKHN0cmxlbihzKSAhPSAoc2l6ZV90KVB5Qnl0ZXNfU2l6ZShpbikpIHsKKyAgICAgICAgcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGluKTsKKyAgICAgICAgaWYgKHN0cmxlbihzKSAhPSAoc2l6ZV90KVB5Qnl0ZXNfR0VUX1NJWkUoaW4pKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtYmVkZGVkIG51bGwgYnl0ZSIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTE4NDYsNyArMTg0NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI7CisgICAgY29uc3QgY2hhciAqbmFtZTEsICpuYW1lMjsKICAgICBQeU9iamVjdCAqbmV3VmFsdWU7CiAgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAgICAgVGNsX09iaiAqbmV3dmFsLCAqb2s7CkBAIC0xOTE1LDcgKzE5MTMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEdldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncykKIHsKLSAgICBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CisgICAgY29uc3QgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFRjbF9PYmogKnRyZXM7CiAKQEAgLTIyNzQsMTAgKzIyNzIsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCBvYmp2W2ldKTsKLSAgICAgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQpAQCAtMjMwNCwxMSArMjMwMywxMiBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqcyA9IHVuaWNvZGVGcm9tVGNsU3RyaW5nKGFyZ3ZbaV0pOwotICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHMpKSB7CisgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgdiA9IE5VTEw7CiAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICB9CiAKICAgZmluYWxseToKQEAgLTIzNDksMTAgKzIzNDksMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCBvYmp2W2ldKTsKLSAgICAgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQpAQCAtMjQxMCwxMCArMjQxMSwxMSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IChhcmdjIC0gMSk7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqcyA9IHVuaWNvZGVGcm9tVGNsU3RyaW5nKGFyZ3ZbaSArIDFdKTsKLSAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbShhcmcsIGksIHMpKSB7CisgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CiAgICAgICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CiAgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmcsIGksIHMpOwogICAgIH0KICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwogICAgIFB5X0RFQ1JFRihhcmcpOwpAQCAtMjQ4NSw3ICsyNDg3LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLmNyZWF0ZWNvbW1hbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGthcHBPYmplY3QgKiIpCiAgICAgbmFtZTogc3RyCiAgICAgZnVuYzogb2JqZWN0CiAgICAgLwpAQCAtMjQ5NSw3ICsyNDk2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF9jcmVhdGVjb21tYW5kX2ltcGwoVGthcHBPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmExYzc5YTRlZTJhZjQxMCBpbnB1dD0yYmMyYzA0NmEwOTE0MjM0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmExYzc5YTRlZTJhZjQxMCBpbnB1dD0yNTU3ODVjYjcwZWRjNmEwXSovCiB7CiAgICAgUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGE7CiAgICAgaW50IGVycjsKQEAgLTI1NjEsNyArMjU2Miw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a2FwcC5kZWxldGVjb21tYW5kCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQogICAgIG5hbWU6IHN0cgogICAgIC8KIApAQCAtMjU2OSw3ICsyNTY5LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX2RlbGV0ZWNvbW1hbmRfaW1wbChUa2FwcE9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjdlOGNiNTg0NWUwZDJkIGlucHV0PWI2MzA2NDY4ZjEwYjIxOWNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjdlOGNiNTg0NWUwZDJkIGlucHV0PTUzZTk5NTJlYWUxZjg1ZjVdKi8KIHsKICAgICBpbnQgZXJyOwogCkBAIC0yNzYyLDEzICsyNzYyLDExIEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a3RpbWVydG9rZW4uZGVsZXRldGltZXJoYW5kbGVyCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrdHRPYmplY3QgKiIpCi0KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrdGltZXJ0b2tlbl9kZWxldGV0aW1lcmhhbmRsZXJfaW1wbChUa3R0T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJkN2ZlMTdmMzI4Y2ZhNTUgaW5wdXQ9MjViYTVkZDU5NGU1MjA4NF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJkN2ZlMTdmMzI4Y2ZhNTUgaW5wdXQ9NDBiZDA3MGZmODVmNWNmM10qLwogewogICAgIFRrdHRPYmplY3QgKnYgPSBzZWxmOwogICAgIFB5T2JqZWN0ICpmdW5jID0gdi0+ZnVuYzsKQEAgLTI4OTQsNyArMjg5Miw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a2FwcC5tYWlubG9vcAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKICAgICB0aHJlc2hvbGQ6IGludCA9IDAKICAgICAvCiAKQEAgLTI5MDIsNyArMjg5OSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF9tYWlubG9vcF9pbXBsKFRrYXBwT2JqZWN0ICpzZWxmLCBpbnQgdGhyZXNob2xkKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiYThlYWJiZTU3ODQxYjAgaW5wdXQ9YWQ1N2M5YzFkZDJiOTQ3MF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiYThlYWJiZTU3ODQxYjAgaW5wdXQ9MDM2YmNkY2YwM2Q1ZWNhMF0qLwogewogI2lmZGVmIFdJVEhfVEhSRUFECiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKQEAgLTMwNzIsMTMgKzMwNjksMTEgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLndpbGxkaXNwYXRjaAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKLQogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGthcHBfd2lsbGRpc3BhdGNoX2ltcGwoVGthcHBPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGUzZjQ2ZDI0NDY0MjE1NSBpbnB1dD0yNjMwNjk5NzY3ODA4OTcwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGUzZjQ2ZDI0NDY0MjE1NSBpbnB1dD1kODhmNTk3MDg0M2Q2ZGFiXSovCiB7CiAgICAgc2VsZi0+ZGlzcGF0Y2hpbmcgPSAxOwogCkBAIC0zNjI5LDE0ICszNjI0LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19Bc1N0cmluZyhjZXhlKSk7CisgICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19BU19TVFJJTkcoY2V4ZSkpOwogCiAgICAgICAgICAgICBpZiAoc2V0X3ZhcikgewogICAgICAgICAgICAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGVXKEwiVENMX0xJQlJBUlkiLCBOVUxMKTsKICAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHdjc19wYXRoKTsKICAgICAgICAgICAgIH0KICNlbHNlCi0gICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19Bc1N0cmluZyhjZXhlKSk7CisgICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19BU19TVFJJTkcoY2V4ZSkpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICAgICAgICAgfQogICAgICAgICBQeV9YREVDUkVGKGNleGUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYyBiL01vZHVsZXMvX3RyYWNlbWFsbG9jLmMKaW5kZXggNzk2YWMwZi4uMWE1M2NmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYworKysgYi9Nb2R1bGVzL190cmFjZW1hbGxvYy5jCkBAIC0zOSw3ICszOSwxMSBAQAogICAgIC8qIGxpbWl0IG9mIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIGEgdHJhY2ViYWNrLCAxIGJ5IGRlZmF1bHQuCiAgICAgICAgVmFyaWFibGUgcHJvdGVjdGVkIGJ5IHRoZSBHSUwuICovCiAgICAgaW50IG1heF9uZnJhbWU7Ci19IHRyYWNlbWFsbG9jX2NvbmZpZyA9IHtUUkFDRU1BTExPQ19OT1RfSU5JVElBTElaRUQsIDAsIDF9OworCisgICAgLyogdXNlIGRvbWFpbiBpbiB0cmFjZSBrZXk/CisgICAgICAgVmFyaWFibGUgcHJvdGVjdGVkIGJ5IHRoZSBHSUwuICovCisgICAgaW50IHVzZV9kb21haW47Cit9IHRyYWNlbWFsbG9jX2NvbmZpZyA9IHtUUkFDRU1BTExPQ19OT1RfSU5JVElBTElaRUQsIDAsIDEsIDB9OwogCiAjaWYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKQogLyogVGhpcyBsb2NrIGlzIG5lZWRlZCBiZWNhdXNlIHRyYWNlbWFsbG9jX2ZyZWUoKSBpcyBjYWxsZWQgd2l0aG91dApAQCAtNTQsMTAgKzU4LDIxIEBACiAjICBkZWZpbmUgVEFCTEVTX1VOTE9DSygpCiAjZW5kaWYKIAorCisjZGVmaW5lIERFRkFVTFRfRE9NQUlOIDAKKworLyogUGFjayB0aGUgZnJhbWVfdCBzdHJ1Y3R1cmUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50LiAqLwordHlwZWRlZiBzdHJ1Y3QKKyNpZmRlZiBfX0dOVUNfXworX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbmRpZgoreworICAgIHVpbnRwdHJfdCBwdHI7CisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluOworfSBwb2ludGVyX3Q7CisKIC8qIFBhY2sgdGhlIGZyYW1lX3Qgc3RydWN0dXJlIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludCBvbiA2NC1iaXQKLSAgIGFyY2hpdGVjdHVyZXM6IDEyIGJ5dGVzIGluc3RlYWQgb2YgMTYuIFRoaXMgb3B0aW1pemF0aW9uIG1pZ2h0IHByb2R1Y2UKLSAgIFNJR0JVUyBvbiBhcmNoaXRlY3R1cmVzIG5vdCBzdXBwb3J0aW5nIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgKDY0LWJpdAotICAgTUlQUyBDUFU/KTogb24gc3VjaCBhcmNoaXRlY3R1cmUsIHRoZSBzdHJ1Y3R1cmUgbXVzdCBub3QgYmUgcGFja2VkLiAqLworICAgYXJjaGl0ZWN0dXJlczogMTIgYnl0ZXMgaW5zdGVhZCBvZiAxNi4gKi8KIHR5cGVkZWYgc3RydWN0CiAjaWZkZWYgX19HTlVDX18KIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCkBAIC02NSwxMCArODAsMTMgQEAKIF9kZWNsc3BlYyhhbGlnbig0KSkKICNlbmRpZgogeworICAgIC8qIGZpbGVuYW1lIGNhbm5vdCBiZSBOVUxMOiAiPHVua25vd24+IiBpcyB1c2VkIGlmIHRoZSBQeXRob24gZnJhbWUKKyAgICAgICBmaWxlbmFtZSBpcyBOVUxMICovCiAgICAgUHlPYmplY3QgKmZpbGVuYW1lOwogICAgIHVuc2lnbmVkIGludCBsaW5lbm87CiB9IGZyYW1lX3Q7CiAKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5X3VoYXNoX3QgaGFzaDsKICAgICBpbnQgbmZyYW1lOwpAQCAtODEsNiArOTksNyBAQAogI2RlZmluZSBNQVhfTkZSQU1FIFwKICAgICAgICAgKChJTlRfTUFYIC0gKGludClzaXplb2YodHJhY2ViYWNrX3QpKSAvIChpbnQpc2l6ZW9mKGZyYW1lX3QpICsgMSkKIAorCiBzdGF0aWMgUHlPYmplY3QgKnVua25vd25fZmlsZW5hbWUgPSBOVUxMOwogc3RhdGljIHRyYWNlYmFja190IHRyYWNlbWFsbG9jX2VtcHR5X3RyYWNlYmFjazsKIApAQCAtOTMsNiArMTEyLDcgQEAKICAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwogfSB0cmFjZV90OwogCisKIC8qIFNpemUgaW4gYnl0ZXMgb2YgY3VycmVudGx5IHRyYWNlZCBtZW1vcnkuCiAgICBQcm90ZWN0ZWQgYnkgVEFCTEVTX0xPQ0soKS4gKi8KIHN0YXRpYyBzaXplX3QgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA9IDA7CkBAIC0xMTksNiArMTM5LDcgQEAKICAgIFByb3RlY3RlZCBieSBUQUJMRVNfTE9DSygpLiAqLwogc3RhdGljIF9QeV9oYXNodGFibGVfdCAqdHJhY2VtYWxsb2NfdHJhY2VzID0gTlVMTDsKIAorCiAjaWZkZWYgVFJBQ0VfREVCVUcKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKQEAgLTEzMyw2ICsxNTQsNyBAQAogfQogI2VuZGlmCiAKKwogI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmIGRlZmluZWQoVFJBQ0VfUkFXX01BTExPQykKICNkZWZpbmUgUkVFTlRSQU5UX1RIUkVBRExPQ0FMCiAKQEAgLTE0Myw3ICsxNjUsNyBAQAogIyAgZXJyb3IgIm5lZWQgbmF0aXZlIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIgogI2VuZGlmCiAKLXN0YXRpYyBpbnQgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleTsKK3N0YXRpYyBpbnQgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSA9IC0xOwogCiAvKiBBbnkgbm9uLU5VTEwgcG9pbnRlciBjYW4gYmUgdXNlZCAqLwogI2RlZmluZSBSRUVOVFJBTlQgUHlfVHJ1ZQpAQCAtMTUxLDcgKzE3MywxMCBAQAogc3RhdGljIGludAogZ2V0X3JlZW50cmFudCh2b2lkKQogewotICAgIHZvaWQgKnB0ciA9IFB5VGhyZWFkX2dldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CisgICAgdm9pZCAqcHRyOworCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkgIT0gLTEpOworICAgIHB0ciA9IFB5VGhyZWFkX2dldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CiAgICAgaWYgKHB0ciAhPSBOVUxMKSB7CiAgICAgICAgIGFzc2VydChwdHIgPT0gUkVFTlRSQU5UKTsKICAgICAgICAgcmV0dXJuIDE7CkBAIC0xNjQsMTIgKzE4OSwxNCBAQAogc2V0X3JlZW50cmFudChpbnQgcmVlbnRyYW50KQogewogICAgIGFzc2VydChyZWVudHJhbnQgPT0gMCB8fCByZWVudHJhbnQgPT0gMSk7CisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkgIT0gLTEpOworCiAgICAgaWYgKHJlZW50cmFudCkgewotICAgICAgICBhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KSA9PSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KCFnZXRfcmVlbnRyYW50KCkpOwogICAgICAgICBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXksIFJFRU5UUkFOVCk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KSA9PSBSRUVOVFJBTlQpOworICAgICAgICBhc3NlcnQoZ2V0X3JlZW50cmFudCgpKTsKICAgICAgICAgUHlUaHJlYWRfc2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5LCBOVUxMKTsKICAgICB9CiB9CkBAIC0xOTQsMjcgKzIyMSw3NSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQKLWhhc2h0YWJsZV9jb21wYXJlX3VuaWNvZGUoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQorCitzdGF0aWMgUHlfdWhhc2hfdAoraGFzaHRhYmxlX2hhc2hfcHlvYmplY3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSkKIHsKLSAgICBpZiAoa2V5ICE9IE5VTEwgJiYgZW50cnktPmtleSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gKFB5VW5pY29kZV9Db21wYXJlKChQeU9iamVjdCAqKWtleSwgKFB5T2JqZWN0ICopZW50cnktPmtleSkgPT0gMCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4ga2V5ID09IGVudHJ5LT5rZXk7CisgICAgUHlPYmplY3QgKm9iajsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIG9iaik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0hhc2gob2JqKTsKIH0KIAotc3RhdGljIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgaGFzaHRhYmxlX2FsbG9jID0ge21hbGxvYywgZnJlZX07CisKK3N0YXRpYyBpbnQKK2hhc2h0YWJsZV9jb21wYXJlX3VuaWNvZGUoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKK3sKKyAgICBQeU9iamVjdCAqa2V5MSwgKmtleTI7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBrZXkxKTsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwga2V5Mik7CisKKyAgICBpZiAoa2V5MSAhPSBOVUxMICYmIGtleTIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeVVuaWNvZGVfQ29tcGFyZShrZXkxLCBrZXkyKSA9PSAwKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBrZXkxID09IGtleTI7Cit9CisKKworc3RhdGljIFB5X3VoYXNoX3QKK2hhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQoreworICAgIHBvaW50ZXJfdCBwdHI7CisgICAgUHlfdWhhc2hfdCBoYXNoOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgcHRyKTsKKworICAgIGhhc2ggPSAoUHlfdWhhc2hfdClfUHlfSGFzaFBvaW50ZXIoKHZvaWQqKXB0ci5wdHIpOworICAgIGhhc2ggXj0gcHRyLmRvbWFpbjsKKyAgICByZXR1cm4gaGFzaDsKK30KKworCitzdGF0aWMgaW50CitoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQoreworICAgIHBvaW50ZXJfdCBwdHIxLCBwdHIyOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgcHRyMSk7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHB0cjIpOworCisgICAgLyogY29tcGFyZSBwb2ludGVyIGJlZm9yZSBkb21haW4sIGJlY2F1c2UgcG9pbnRlciBpcyBtb3JlIGxpa2VseSB0byBiZQorICAgICAgIGRpZmZlcmVudCAqLworICAgIHJldHVybiAocHRyMS5wdHIgPT0gcHRyMi5wdHIgJiYgcHRyMS5kb21haW4gPT0gcHRyMi5kb21haW4pOworCit9CisKIAogc3RhdGljIF9QeV9oYXNodGFibGVfdCAqCi1oYXNodGFibGVfbmV3KHNpemVfdCBkYXRhX3NpemUsCitoYXNodGFibGVfbmV3KHNpemVfdCBrZXlfc2l6ZSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMpCiB7Ci0gICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoZGF0YV9zaXplLCAwLAorICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgaGFzaHRhYmxlX2FsbG9jID0ge21hbGxvYywgZnJlZX07CisgICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoa2V5X3NpemUsIGRhdGFfc2l6ZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Z1bmMsIGNvbXBhcmVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmaGFzaHRhYmxlX2FsbG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzaHRhYmxlX2FsbG9jKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHJhd19tYWxsb2Moc2l6ZV90IHNpemUpCiB7CkBAIC0yMjcsMjEgKzMwMiwyOCBAQAogICAgIGFsbG9jYXRvcnMucmF3LmZyZWUoYWxsb2NhdG9ycy5yYXcuY3R4LCBwdHIpOwogfQogCisKIHN0YXRpYyBQeV91aGFzaF90Ci1oYXNodGFibGVfaGFzaF90cmFjZWJhY2soY29uc3Qgdm9pZCAqa2V5KQoraGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCiB7Ci0gICAgY29uc3QgdHJhY2ViYWNrX3QgKnRyYWNlYmFjayA9IGtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgdHJhY2ViYWNrKTsKICAgICByZXR1cm4gdHJhY2ViYWNrLT5oYXNoOwogfQogCisKIHN0YXRpYyBpbnQKLWhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayhjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmhlKQoraGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKIHsKLSAgICBjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMiA9IGhlLT5rZXk7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazEsICp0cmFjZWJhY2syOwogICAgIGNvbnN0IGZyYW1lX3QgKmZyYW1lMSwgKmZyYW1lMjsKICAgICBpbnQgaTsKIAorICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIHRyYWNlYmFjazEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCB0cmFjZWJhY2syKTsKKwogICAgIGlmICh0cmFjZWJhY2sxLT5uZnJhbWUgIT0gdHJhY2ViYWNrMi0+bmZyYW1lKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMjYwLDYgKzM0Miw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2dldF9mcmFtZShQeUZyYW1lT2JqZWN0ICpweWZyYW1lLCBmcmFtZV90ICpmcmFtZSkKIHsKQEAgLTMxMCwxNSArMzkzLDE1IEBACiAgICAgfQogCiAgICAgLyogaW50ZXJuIHRoZSBmaWxlbmFtZSAqLwotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBmaWxlbmFtZSk7CisgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewotICAgICAgICBmaWxlbmFtZSA9IChQeU9iamVjdCAqKWVudHJ5LT5rZXk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBlbnRyeSwgZmlsZW5hbWUpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgLyogdHJhY2VtYWxsb2NfZmlsZW5hbWVzIGlzIHJlc3BvbnNpYmxlIHRvIGtlZXAgYSByZWZlcmVuY2UKICAgICAgICAgICAgdG8gdGhlIGZpbGVuYW1lICovCiAgICAgICAgIFB5X0lOQ1JFRihmaWxlbmFtZSk7Ci0gICAgICAgIGlmIChfUHlfaGFzaHRhYmxlX3NldCh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lLCBOVUxMLCAwKSA8IDApIHsKKyAgICAgICAgaWYgKF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKSA8IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihmaWxlbmFtZSk7CiAjaWZkZWYgVFJBQ0VfREVCVUcKICAgICAgICAgICAgIHRyYWNlbWFsbG9jX2Vycm9yKCJmYWlsZWQgdG8gaW50ZXJuIHRoZSBmaWxlbmFtZSIpOwpAQCAtMzMxLDYgKzQxNCw3IEBACiAgICAgZnJhbWUtPmZpbGVuYW1lID0gZmlsZW5hbWU7CiB9CiAKKwogc3RhdGljIFB5X3VoYXNoX3QKIHRyYWNlYmFja19oYXNoKHRyYWNlYmFja190ICp0cmFjZWJhY2spCiB7CkBAIC0zNTUsNiArNDM5LDcgQEAKICAgICByZXR1cm4geDsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2ViYWNrX2dldF9mcmFtZXModHJhY2ViYWNrX3QgKnRyYWNlYmFjaykKIHsKQEAgLTM4Miw2ICs0NjcsNyBAQAogICAgIH0KIH0KIAorCiBzdGF0aWMgdHJhY2ViYWNrX3QgKgogdHJhY2ViYWNrX25ldyh2b2lkKQogewpAQCAtNDAxLDkgKzQ4Nyw5IEBACiAgICAgdHJhY2ViYWNrLT5oYXNoID0gdHJhY2ViYWNrX2hhc2godHJhY2ViYWNrKTsKIAogICAgIC8qIGludGVybiB0aGUgdHJhY2ViYWNrICovCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCB0cmFjZWJhY2spOworICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgdHJhY2ViYWNrKTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewotICAgICAgICB0cmFjZWJhY2sgPSAodHJhY2ViYWNrX3QgKillbnRyeS0+a2V5OworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGVudHJ5LCB0cmFjZWJhY2spOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdHJhY2ViYWNrX3QgKmNvcHk7CkBAIC00MjAsNyArNTA2LDcgQEAKICAgICAgICAgfQogICAgICAgICBtZW1jcHkoY29weSwgdHJhY2ViYWNrLCB0cmFjZWJhY2tfc2l6ZSk7CiAKLSAgICAgICAgaWYgKF9QeV9oYXNodGFibGVfc2V0KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGNvcHksIE5VTEwsIDApIDwgMCkgeworICAgICAgICBpZiAoX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGNvcHkpIDwgMCkgewogICAgICAgICAgICAgcmF3X2ZyZWUoY29weSk7CiAjaWZkZWYgVFJBQ0VfREVCVUcKICAgICAgICAgICAgIHRyYWNlbWFsbG9jX2Vycm9yKCJmYWlsZWQgdG8gaW50ZXJuIHRoZSB0cmFjZWJhY2s6IHB1dGRhdGEgZmFpbGVkIik7CkBAIC00MzIsNDYgKzUxOCwxNTQgQEAKICAgICByZXR1cm4gdHJhY2ViYWNrOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2FkZF90cmFjZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQordHJhY2VtYWxsb2NfdXNlX2RvbWFpbl9jYihfUHlfaGFzaHRhYmxlX3QgKm9sZF90cmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKLSAgICB0cmFjZV90IHRyYWNlOwotICAgIGludCByZXM7CisgICAgdWludHB0cl90IHB0cjsKKyAgICBwb2ludGVyX3Qga2V5OworICAgIF9QeV9oYXNodGFibGVfdCAqbmV3X3RyYWNlcyA9IChfUHlfaGFzaHRhYmxlX3QgKil1c2VyX2RhdGE7CisgICAgY29uc3Qgdm9pZCAqcGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKG9sZF90cmFjZXMsIGVudHJ5KTsKIAotI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7Ci0jZW5kaWYKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKG9sZF90cmFjZXMsIGVudHJ5LCBwdHIpOworICAgIGtleS5wdHIgPSBwdHI7CisgICAga2V5LmRvbWFpbiA9IERFRkFVTFRfRE9NQUlOOwogCi0gICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX25ldygpOwotICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9zZXQobmV3X3RyYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtleSksICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF90cmFjZXMtPmRhdGFfc2l6ZSwgcGRhdGEpOworfQorCisKKy8qIENvbnZlcnQgdHJhY2VtYWxsb2NfdHJhY2VzIGZyb20gY29tcGFjdCBrZXkgKHVpbnRwdHJfdCkgdG8gcG9pbnRlcl90IGtleS4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLworc3RhdGljIGludAordHJhY2VtYWxsb2NfdXNlX2RvbWFpbih2b2lkKQoreworICAgIF9QeV9oYXNodGFibGVfdCAqbmV3X3RyYWNlcyA9IE5VTEw7CisKKyAgICBhc3NlcnQoIXRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKTsKKworICAgIG5ld190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihwb2ludGVyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfaGFzaF9wb2ludGVyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfcG9pbnRlcl90KTsKKyAgICBpZiAobmV3X3RyYWNlcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKLQotICAgIHRyYWNlLnNpemUgPSBzaXplOwotICAgIHRyYWNlLnRyYWNlYmFjayA9IHRyYWNlYmFjazsKLQotICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7Ci0gICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7Ci0gICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgKz0gc2l6ZTsKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPiB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkpCi0gICAgICAgICAgICB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkgPSB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5OwogICAgIH0KIAotICAgIHJldHVybiByZXM7CisgICAgaWYgKF9QeV9oYXNodGFibGVfZm9yZWFjaCh0cmFjZW1hbGxvY190cmFjZXMsIHRyYWNlbWFsbG9jX3VzZV9kb21haW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdHJhY2VzKSA8IDApCisgICAgeworICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kobmV3X3RyYWNlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2VzKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBuZXdfdHJhY2VzOworCisgICAgdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4gPSAxOworCisgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKLXRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZSh2b2lkICpwdHIpCit0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UoX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyKQogewogICAgIHRyYWNlX3QgdHJhY2U7CisgICAgaW50IHJlbW92ZWQ7CiAKLSAgICBpZiAoX1B5X2hhc2h0YWJsZV9wb3AodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsICZ0cmFjZSwgc2l6ZW9mKHRyYWNlKSkpIHsKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpOworCisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgICAgICByZW1vdmVkID0gX1B5X0hBU0hUQUJMRV9QT1AodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXksIHRyYWNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlbW92ZWQgPSBfUHlfSEFTSFRBQkxFX1BPUCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgIH0KKyAgICBpZiAoIXJlbW92ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID49IHRyYWNlLnNpemUpOworICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgLT0gdHJhY2Uuc2l6ZTsKK30KKworI2RlZmluZSBSRU1PVkVfVFJBQ0UocHRyKSBcCisgICAgICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UoREVGQVVMVF9ET01BSU4sICh1aW50cHRyX3QpKHB0cikpCisKKworc3RhdGljIGludAordHJhY2VtYWxsb2NfYWRkX3RyYWNlKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgdWludHB0cl90IHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBwb2ludGVyX3Qga2V5ID0ge3B0ciwgZG9tYWlufTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworICAgIHRyYWNlX3QgdHJhY2U7CisgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90KiBlbnRyeTsKKyAgICBpbnQgcmVzOworCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKTsKKworICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja19uZXcoKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4gJiYgZG9tYWluICE9IERFRkFVTFRfRE9NQUlOKSB7CisgICAgICAgIC8qIGZpcnN0IHRyYWNlIHVzaW5nIGEgbm9uLXplcm8gZG9tYWluIHdoZXJlYXMgdHJhY2VzIHVzZSBjb21wYWN0CisgICAgICAgICAgICh1aW50cHRyX3QpIGtleXM6IHN3aXRjaCB0byBwb2ludGVyX3Qga2V5cy4gKi8KKyAgICAgICAgaWYgKHRyYWNlbWFsbG9jX3VzZV9kb21haW4oKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIpOworICAgIH0KKworICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHRoZSBtZW1vcnkgYmxvY2sgaXMgYWxyZWFkeSB0cmFja2VkICovCisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlbWFsbG9jX3RyYWNlcywgZW50cnksIHRyYWNlKTsKICAgICAgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPj0gdHJhY2Uuc2l6ZSk7CiAgICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgLT0gdHJhY2Uuc2l6ZTsKKworICAgICAgICB0cmFjZS5zaXplID0gc2l6ZTsKKyAgICAgICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1dSSVRFX0RBVEEodHJhY2VtYWxsb2NfdHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdHJhY2Uuc2l6ZSA9IHNpemU7CisgICAgICAgIHRyYWNlLnRyYWNlYmFjayA9IHRyYWNlYmFjazsKKworICAgICAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5LCB0cmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBfUHlfSEFTSFRBQkxFX1NFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSArPSBzaXplOworICAgIGlmICh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID4gdHJhY2VtYWxsb2NfcGVha190cmFjZWRfbWVtb3J5KQorICAgICAgICB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkgPSB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5OworICAgIHJldHVybiAwOwogfQogCisjZGVmaW5lIEFERF9UUkFDRShwdHIsIHNpemUpIFwKKyAgICAgICAgICAgIHRyYWNlbWFsbG9jX2FkZF90cmFjZShERUZBVUxUX0RPTUFJTiwgKHVpbnRwdHJfdCkocHRyKSwgc2l6ZSkKKworCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX2FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKQEAgLTQ4OCw3ICs2ODIsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIsIG5lbGVtICogZWxzaXplKSA8IDApIHsKKyAgICBpZiAoQUREX1RSQUNFKHB0ciwgbmVsZW0gKiBlbHNpemUpIDwgMCkgewogICAgICAgICAvKiBGYWlsZWQgdG8gYWxsb2NhdGUgYSB0cmFjZSBmb3IgdGhlIG5ldyBtZW1vcnkgYmxvY2sgKi8KICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICBhbGxvYy0+ZnJlZShhbGxvYy0+Y3R4LCBwdHIpOwpAQCAtNDk4LDYgKzY5Miw3IEBACiAgICAgcmV0dXJuIHB0cjsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKIHsKQEAgLTUxMiwxMSArNzA3LDE2IEBACiAgICAgICAgIC8qIGFuIGV4aXN0aW5nIG1lbW9yeSBibG9jayBoYXMgYmVlbiByZXNpemVkICovCiAKICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CiAKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jX2FkZF90cmFjZSgpIHVwZGF0ZXMgdGhlIHRyYWNlIGlmIHRoZXJlIGlzIGFscmVhZHkKKyAgICAgICAgICAgYSB0cmFjZSBhdCBhZGRyZXNzIChkb21haW4sIHB0cjIpICovCisgICAgICAgIGlmIChwdHIyICE9IHB0cikgeworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQUREX1RSQUNFKHB0cjIsIG5ld19zaXplKSA8IDApIHsKICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gVGhlIGVycm9yIGNhbm5vdCBiZSByZXBvcnRlZCB0bwotICAgICAgICAgICAgICAgdGhlIGNhbGxlciwgYmVjYXVzZSByZWFsbG9jKCkgbWF5IGFscmVhZHkgaGF2ZSBzaHJpbmtlZCB0aGUKKyAgICAgICAgICAgICAgIHRoZSBjYWxsZXIsIGJlY2F1c2UgcmVhbGxvYygpIG1heSBhbHJlYWR5IGhhdmUgc2hydW5rIHRoZQogICAgICAgICAgICAgICAgbWVtb3J5IGJsb2NrIGFuZCBzbyByZW1vdmVkIGJ5dGVzLgogCiAgICAgICAgICAgICAgICBUaGlzIGNhc2UgaXMgdmVyeSB1bmxpa2VseTogYSBoYXNoIGVudHJ5IGhhcyBqdXN0IGJlZW4KQEAgLTUzMiw3ICs3MzIsNyBAQAogICAgICAgICAvKiBuZXcgYWxsb2NhdGlvbiAqLwogCiAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgIGlmICh0cmFjZW1hbGxvY19hZGRfdHJhY2UocHRyMiwgbmV3X3NpemUpIDwgMCkgeworICAgICAgICBpZiAoQUREX1RSQUNFKHB0cjIsIG5ld19zaXplKSA8IDApIHsKICAgICAgICAgICAgIC8qIEZhaWxlZCB0byBhbGxvY2F0ZSBhIHRyYWNlIGZvciB0aGUgbmV3IG1lbW9yeSBibG9jayAqLwogICAgICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyMik7CkBAIC01NDMsNiArNzQzLDcgQEAKICAgICByZXR1cm4gcHRyMjsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfZnJlZSh2b2lkICpjdHgsIHZvaWQgKnB0cikKIHsKQEAgLTU1NywxMCArNzU4LDExIEBACiAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyKTsKIAogICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CisgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgVEFCTEVTX1VOTE9DSygpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKQEAgLTU4NSwxOCArNzg3LDIxIEBACiAgICAgcmV0dXJuIHB0cjsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX21hbGxvY19naWwodm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKDAsIGN0eCwgMSwgc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19jYWxsb2NfZ2lsKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19hbGxvY19naWwoMSwgY3R4LCBuZWxlbSwgZWxzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3JlYWxsb2NfZ2lsKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCiB7CkBAIC02MTIsNyArODE3LDcgQEAKICAgICAgICAgcHRyMiA9IGFsbG9jLT5yZWFsbG9jKGFsbG9jLT5jdHgsIHB0ciwgbmV3X3NpemUpOwogICAgICAgICBpZiAocHRyMiAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CisgICAgICAgICAgICBSRU1PVkVfVFJBQ0UocHRyKTsKICAgICAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcHRyMjsKQEAgLTYyOSw2ICs4MzQsNyBAQAogICAgIHJldHVybiBwdHIyOwogfQogCisKICNpZmRlZiBUUkFDRV9SQVdfTUFMTE9DCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19hbGxvYyhpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCkBAIC02NjMsMTggKzg2OSwyMSBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfbWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3Jhd19hbGxvYygwLCBjdHgsIDEsIHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X2NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfcmF3X2FsbG9jKDEsIGN0eCwgbmVsZW0sIGVsc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfcmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplKQogewpAQCAtNjkxLDcgKzkwMCw3IEBACiAKICAgICAgICAgaWYgKHB0cjIgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHB0cjI7CkBAIC03MTUsMjIgKzkyNCwzMSBAQAogfQogI2VuZGlmICAgLyogVFJBQ0VfUkFXX01BTExPQyAqLwogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2NsZWFyX2ZpbGVuYW1lKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX2NsZWFyX2ZpbGVuYW1lKF9QeV9oYXNodGFibGVfdCAqaHQsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgUHlPYmplY3QgKmZpbGVuYW1lID0gKFB5T2JqZWN0ICopZW50cnktPmtleTsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgZmlsZW5hbWUpOwogICAgIFB5X0RFQ1JFRihmaWxlbmFtZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2ViYWNrX2ZyZWVfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlYmFja19mcmVlX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX3QgKmh0LCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrID0gKHRyYWNlYmFja190ICopZW50cnktPmtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHRyYWNlYmFjayk7CiAgICAgcmF3X2ZyZWUodHJhY2ViYWNrKTsKICAgICByZXR1cm4gMDsKIH0KIAorCiAvKiByZWVudHJhbnQgZmxhZyBtdXN0IGJlIHNldCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYW5kIEdJTCBtdXN0IGJlIGhlbGQgKi8KIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19jbGVhcl90cmFjZXModm9pZCkKQEAgLTc1Myw2ICs5NzEsNyBAQAogICAgIF9QeV9oYXNodGFibGVfY2xlYXIodHJhY2VtYWxsb2NfZmlsZW5hbWVzKTsKIH0KIAorCiBzdGF0aWMgaW50CiB0cmFjZW1hbGxvY19pbml0KHZvaWQpCiB7CkBAIC03ODksMjEgKzEwMDgsMjkgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyA9IGhhc2h0YWJsZV9uZXcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYylQeU9iamVjdF9IYXNoLAorICAgIHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5T2JqZWN0ICopLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfcHlvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV91bmljb2RlKTsKIAotICAgIHRyYWNlbWFsbG9jX3RyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeV9oYXNodGFibGVfaGFzaF9mdW5jKWhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMpaGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2ViYWNrX3QgKiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayk7CiAKLSAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZih0cmFjZV90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YocG9pbnRlcl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3BvaW50ZXJfdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZih1aW50cHRyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QpOworICAgIH0KIAogICAgIGlmICh0cmFjZW1hbGxvY19maWxlbmFtZXMgPT0gTlVMTCB8fCB0cmFjZW1hbGxvY190cmFjZWJhY2tzID09IE5VTEwKLSAgICAgICAgfHwgdHJhY2VtYWxsb2NfdHJhY2VzID09IE5VTEwpCi0gICAgeworICAgICAgIHx8IHRyYWNlbWFsbG9jX3RyYWNlcyA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC04MjMsNiArMTA1MCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2RlaW5pdCh2b2lkKQogewpAQCAtODMzLDkgKzEwNjEsOSBAQAogICAgIHRyYWNlbWFsbG9jX3N0b3AoKTsKIAogICAgIC8qIGRlc3Ryb3kgaGFzaCB0YWJsZXMgKi8KLSAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2VzKTsKICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2ViYWNrcyk7CiAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyk7CisgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlcyk7CiAKICNpZiBkZWZpbmVkKFdJVEhfVEhSRUFEKSAmJiBkZWZpbmVkKFRSQUNFX1JBV19NQUxMT0MpCiAgICAgaWYgKHRhYmxlc19sb2NrICE9IE5VTEwpIHsKQEAgLTg0NiwxMSArMTA3NCwxMyBAQAogCiAjaWZkZWYgUkVFTlRSQU5UX1RIUkVBRExPQ0FMCiAgICAgUHlUaHJlYWRfZGVsZXRlX2tleSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKKyAgICB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5ID0gLTE7CiAjZW5kaWYKIAogICAgIFB5X1hERUNSRUYodW5rbm93bl9maWxlbmFtZSk7CiB9CiAKKwogc3RhdGljIGludAogdHJhY2VtYWxsb2Nfc3RhcnQoaW50IG1heF9uZnJhbWUpCiB7CkBAIC05MDcsNiArMTEzNyw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX3N0b3Aodm9pZCkKIHsKQEAgLTkyMyw4ICsxMTU0LDkgQEAKICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX01FTSwgJmFsbG9jYXRvcnMubWVtKTsKICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jYXRvcnMub2JqKTsKIAotICAgIC8qIHJlbGVhc2UgbWVtb3J5ICovCiAgICAgdHJhY2VtYWxsb2NfY2xlYXJfdHJhY2VzKCk7CisKKyAgICAvKiByZWxlYXNlIG1lbW9yeSAqLwogICAgIHJhd19mcmVlKHRyYWNlbWFsbG9jX3RyYWNlYmFjayk7CiAgICAgdHJhY2VtYWxsb2NfdHJhY2ViYWNrID0gTlVMTDsKIH0KQEAgLTkzNSw2ICsxMTY3LDcgQEAKICAgICAiVHJ1ZSBpZiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlIGlzIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyxcbiIKICAgICAiRmFsc2Ugb3RoZXJ3aXNlLiIpOwogCisKIHN0YXRpYyBQeU9iamVjdCoKIHB5X3RyYWNlbWFsbG9jX2lzX3RyYWNpbmcoUHlPYmplY3QgKnNlbGYpCiB7CkBAIC05NDYsNiArMTE3OSw3IEBACiAgICAgIlxuIgogICAgICJDbGVhciB0cmFjZXMgb2YgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQgYnkgUHl0aG9uLiIpOwogCisKIHN0YXRpYyBQeU9iamVjdCoKIHB5X3RyYWNlbWFsbG9jX2NsZWFyX3RyYWNlcyhQeU9iamVjdCAqc2VsZikKIHsKQEAgLTk1OSw2ICsxMTkzLDcgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCiBmcmFtZV90b19weW9iamVjdChmcmFtZV90ICpmcmFtZSkKIHsKQEAgLTk2OCw4ICsxMjAzLDYgQEAKICAgICBpZiAoZnJhbWVfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKGZyYW1lLT5maWxlbmFtZSA9PSBOVUxMKQotICAgICAgICBmcmFtZS0+ZmlsZW5hbWUgPSBQeV9Ob25lOwogICAgIFB5X0lOQ1JFRihmcmFtZS0+ZmlsZW5hbWUpOwogICAgIFB5VHVwbGVfU0VUX0lURU0oZnJhbWVfb2JqLCAwLCBmcmFtZS0+ZmlsZW5hbWUpOwogCkBAIC05ODMsNiArMTIxNiw3IEBACiAgICAgcmV0dXJuIGZyYW1lX29iajsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2ViYWNrX3QgKnRyYWNlYmFjaywgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdGFibGUpCiB7CkBAIC0xMDIxLDMzICsxMjU1LDQzIEBACiAgICAgcmV0dXJuIGZyYW1lczsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCi10cmFjZV90b19weW9iamVjdCh0cmFjZV90ICp0cmFjZSwgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdHJhY2ViYWNrcykKK3RyYWNlX3RvX3B5b2JqZWN0KF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgdHJhY2VfdCAqdHJhY2UsCisgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX3QgKmludGVybl90cmFjZWJhY2tzKQogewogICAgIFB5T2JqZWN0ICp0cmFjZV9vYmogPSBOVUxMOwotICAgIFB5T2JqZWN0ICpzaXplLCAqdHJhY2ViYWNrOworICAgIFB5T2JqZWN0ICpvYmo7CiAKLSAgICB0cmFjZV9vYmogPSBQeVR1cGxlX05ldygyKTsKKyAgICB0cmFjZV9vYmogPSBQeVR1cGxlX05ldygzKTsKICAgICBpZiAodHJhY2Vfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgc2l6ZSA9IFB5TG9uZ19Gcm9tU2l6ZV90KHRyYWNlLT5zaXplKTsKLSAgICBpZiAoc2l6ZSA9PSBOVUxMKSB7CisgICAgb2JqID0gUHlMb25nX0Zyb21TaXplX3QoZG9tYWluKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHRyYWNlX29iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMCwgc2l6ZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDAsIG9iaik7CiAKLSAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UtPnRyYWNlYmFjaywgaW50ZXJuX3RyYWNlYmFja3MpOwotICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkgeworICAgIG9iaiA9IFB5TG9uZ19Gcm9tU2l6ZV90KHRyYWNlLT5zaXplKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHRyYWNlX29iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMSwgdHJhY2ViYWNrKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMSwgb2JqKTsKKworICAgIG9iaiA9IHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZS0+dHJhY2ViYWNrLCBpbnRlcm5fdHJhY2ViYWNrcyk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDIsIG9iaik7CiAKICAgICByZXR1cm4gdHJhY2Vfb2JqOwogfQogCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBfUHlfaGFzaHRhYmxlX3QgKnRyYWNlczsKICAgICBfUHlfaGFzaHRhYmxlX3QgKnRyYWNlYmFja3M7CkBAIC0xMDU1LDE2ICsxMjk5LDI2IEBACiB9IGdldF90cmFjZXNfdDsKIAogc3RhdGljIGludAotdHJhY2VtYWxsb2NfZ2V0X3RyYWNlc19maWxsKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX2dldF90cmFjZXNfZmlsbChfUHlfaGFzaHRhYmxlX3QgKnRyYWNlcywgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgZ2V0X3RyYWNlc190ICpnZXRfdHJhY2VzID0gdXNlcl9kYXRhOwotICAgIHRyYWNlX3QgKnRyYWNlOworICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbjsKKyAgICB0cmFjZV90IHRyYWNlOwogICAgIFB5T2JqZWN0ICp0cmFjZW1hbGxvY19vYmo7CiAgICAgaW50IHJlczsKIAotICAgIHRyYWNlID0gKHRyYWNlX3QgKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoZW50cnkpOworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBwb2ludGVyX3Qga2V5OworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKHRyYWNlcywgZW50cnksIGtleSk7CisgICAgICAgIGRvbWFpbiA9IGtleS5kb21haW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkb21haW4gPSBERUZBVUxUX0RPTUFJTjsKKyAgICB9CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogCi0gICAgdHJhY2VtYWxsb2Nfb2JqID0gdHJhY2VfdG9fcHlvYmplY3QodHJhY2UsIGdldF90cmFjZXMtPnRyYWNlYmFja3MpOworICAgIHRyYWNlbWFsbG9jX29iaiA9IHRyYWNlX3RvX3B5b2JqZWN0KGRvbWFpbiwgJnRyYWNlLCBnZXRfdHJhY2VzLT50cmFjZWJhY2tzKTsKICAgICBpZiAodHJhY2VtYWxsb2Nfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiAxOwogCkBAIC0xMDc2LDE0ICsxMzMwLDE5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYihfUHlfaGFzaHRhYmxlX3QgKnRyYWNlYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgUHlPYmplY3QgKm9iaiA9IChQeU9iamVjdCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2ViYWNrcywgZW50cnksIG9iaik7CiAgICAgUHlfREVDUkVGKG9iaik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZXNfZG9jLAogICAgICJfZ2V0X3RyYWNlcygpIC0+IGxpc3RcbiIKICAgICAiXG4iCkBAIC0xMTEwLDcgKzEzNjksOCBAQAogCiAgICAgLyogdGhlIHRyYWNlYmFjayBoYXNoIHRhYmxlIGlzIHVzZWQgdGVtcG9yYXJpbHkgdG8gaW50ZXJuIHRyYWNlYmFjayB0dXBsZQogICAgICAgIG9mIChmaWxlbmFtZSwgbGluZW5vKSB0dXBsZXMgKi8KLSAgICBnZXRfdHJhY2VzLnRyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KHNpemVvZihQeU9iamVjdCAqKSwKKyAgICBnZXRfdHJhY2VzLnRyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KHNpemVvZih0cmFjZWJhY2tfdCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeU9iamVjdCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKICAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZWJhY2tzID09IE5VTEwpIHsKQEAgLTExNDIsMTUgKzE0MDIsNDMgQEAKIGZpbmFsbHk6CiAgICAgaWYgKGdldF90cmFjZXMudHJhY2ViYWNrcyAhPSBOVUxMKSB7CiAgICAgICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaChnZXRfdHJhY2VzLnRyYWNlYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYiwgTlVMTCk7CiAgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShnZXRfdHJhY2VzLnRyYWNlYmFja3MpOwogICAgIH0KLSAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZXMgIT0gTlVMTCkKKyAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZXMgIT0gTlVMTCkgewogICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koZ2V0X3RyYWNlcy50cmFjZXMpOworICAgIH0KIAogICAgIHJldHVybiBnZXRfdHJhY2VzLmxpc3Q7CiB9CiAKKworc3RhdGljIHRyYWNlYmFja190KgordHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIHVpbnRwdHJfdCBwdHIpCit7CisgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBpbnQgZm91bmQ7CisKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgICAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5LCB0cmFjZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgfQorICAgIFRBQkxFU19VTkxPQ0soKTsKKworICAgIGlmICghZm91bmQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHRyYWNlLnRyYWNlYmFjazsKK30KKworCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X29iamVjdF90cmFjZWJhY2tfZG9jLAogICAgICJfZ2V0X29iamVjdF90cmFjZWJhY2sob2JqKVxuIgogICAgICJcbiIKQEAgLTExNjUsMTEgKzE0NTMsNyBAQAogewogICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKICAgICB2b2lkICpwdHI7Ci0gICAgdHJhY2VfdCB0cmFjZTsKLSAgICBpbnQgZm91bmQ7Ci0KLSAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKQotICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwogCiAgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKICAgICBpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQpAQCAtMTE3NywxNiArMTQ2MSw0OCBAQAogICAgIGVsc2UKICAgICAgICAgcHRyID0gKHZvaWQgKilvYmo7CiAKLSAgICBUQUJMRVNfTE9DSygpOwotICAgIGZvdW5kID0gX1B5X0hBU0hUQUJMRV9HRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKLSAgICBUQUJMRVNfVU5MT0NLKCk7Ci0KLSAgICBpZiAoIWZvdW5kKQorICAgIHRyYWNlYmFjayA9IHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soREVGQVVMVF9ET01BSU4sICh1aW50cHRyX3QpcHRyKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCiAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogCi0gICAgcmV0dXJuIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZS50cmFjZWJhY2ssIE5VTEwpOworICAgIHJldHVybiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2ViYWNrLCBOVUxMKTsKIH0KIAorCisjZGVmaW5lIFBVVFMoZmQsIHN0cikgX1B5X3dyaXRlX25vcmFpc2UoZmQsIHN0ciwgKGludClzdHJsZW4oc3RyKSkKKworc3RhdGljIHZvaWQKK19QeU1lbV9EdW1wRnJhbWUoaW50IGZkLCBmcmFtZV90ICogZnJhbWUpCit7CisgICAgUFVUUyhmZCwgIiAgRmlsZSBcIiIpOworICAgIF9QeV9EdW1wQVNDSUkoZmQsIGZyYW1lLT5maWxlbmFtZSk7CisgICAgUFVUUyhmZCwgIlwiLCBsaW5lICIpOworICAgIF9QeV9EdW1wRGVjaW1hbChmZCwgZnJhbWUtPmxpbmVubyk7CisgICAgUFVUUyhmZCwgIlxuIik7Cit9CisKKy8qIER1bXAgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkIGludG8gZmlsZSBkZXNjcmlwdG9yCisgICBmZC4gVGhlIGZ1bmN0aW9uIG1heSBibG9jayBvbiBUQUJMRVNfTE9DSygpIGJ1dCBpdCBpcyB1bmxpa2VseS4gKi8KK3ZvaWQKK19QeU1lbV9EdW1wVHJhY2ViYWNrKGludCBmZCwgY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisgICAgaW50IGk7CisKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKERFRkFVTFRfRE9NQUlOLCAodWludHB0cl90KXB0cik7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBQVVRTKGZkLCAiTWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBhdCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6XG4iKTsKKyAgICBmb3IgKGk9MDsgaSA8IHRyYWNlYmFjay0+bmZyYW1lOyBpKyspIHsKKyAgICAgICAgX1B5TWVtX0R1bXBGcmFtZShmZCwgJnRyYWNlYmFjay0+ZnJhbWVzW2ldKTsKKyAgICB9CisgICAgUFVUUyhmZCwgIlxuIik7Cit9CisKKyN1bmRlZiBQVVRTCisKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX3N0YXJ0X2RvYywKICAgICAic3RhcnQobmZyYW1lOiBpbnQ9MSlcbiIKICAgICAiXG4iCkBAIC0xMjIyLDYgKzE1MzgsNyBAQAogICAgICJTdG9wIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgY2xlYXIgdHJhY2VzXG4iCiAgICAgIm9mIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGJ5IFB5dGhvbi4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19zdG9wKFB5T2JqZWN0ICpzZWxmKQogewpAQCAtMTIyOSw2ICsxNTQ2LDcgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFja19saW1pdF9kb2MsCiAgICAgImdldF90cmFjZWJhY2tfbGltaXQoKSAtPiBpbnRcbiIKICAgICAiXG4iCkBAIC0xMjQ0LDYgKzE1NjIsNyBAQAogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodHJhY2VtYWxsb2NfY29uZmlnLm1heF9uZnJhbWUpOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VtYWxsb2NfbWVtb3J5X2RvYywKICAgICAiZ2V0X3RyYWNlbWFsbG9jX21lbW9yeSgpIC0+IGludFxuIgogICAgICJcbiIKQEAgLTEyNjcsNiArMTU4Niw3IEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4iLCBzaXplX29iaik7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZWRfbWVtb3J5X2RvYywKICAgICAiZ2V0X3RyYWNlZF9tZW1vcnkoKSAtPiAoaW50LCBpbnQpXG4iCiAgICAgIlxuIgpAQCAtMTI5Miw2ICsxNjEyLDcgQEAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTk4iLCBzaXplX29iaiwgcGVha19zaXplX29iaik7CiB9CiAKKwogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICAgeyJpc190cmFjaW5nIiwgKFB5Q0Z1bmN0aW9uKXB5X3RyYWNlbWFsbG9jX2lzX3RyYWNpbmcsCiAgICAgIE1FVEhfTk9BUkdTLCB0cmFjZW1hbGxvY19pc190cmFjaW5nX2RvY30sCkBAIC0xMzQyLDYgKzE2NjMsNyBAQAogICAgIHJldHVybiBtOwogfQogCisKIHN0YXRpYyBpbnQKIHBhcnNlX3N5c194b3B0aW9ucyhQeU9iamVjdCAqdmFsdWUpCiB7CkBAIC0xMzcwLDYgKzE2OTIsNyBAQAogICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKG5mcmFtZSwgbG9uZywgaW50KTsKIH0KIAorCiBpbnQKIF9QeVRyYWNlTWFsbG9jX0luaXQodm9pZCkKIHsKQEAgLTE0MjgsNiArMTc1MSw3IEBACiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3N0YXJ0KG5mcmFtZSk7CiB9CiAKKwogdm9pZAogX1B5VHJhY2VNYWxsb2NfRmluaSh2b2lkKQogewpAQCAtMTQzNywzICsxNzYxLDU5IEBACiAgICAgdHJhY2VtYWxsb2NfZGVpbml0KCk7CiB9CiAKK2ludAorX1B5VHJhY2VNYWxsb2NfVHJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCit7CisgICAgaW50IHJlczsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsX3N0YXRlOworI2VuZGlmCisKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jIGlzIG5vdCB0cmFjaW5nOiBkbyBub3RoaW5nICovCisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGdpbF9zdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisjZW5kaWYKKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgcmVzID0gdHJhY2VtYWxsb2NfYWRkX3RyYWNlKGRvbWFpbiwgcHRyLCBzaXplKTsKKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxfc3RhdGUpOworI2VuZGlmCisgICAgcmV0dXJuIHJlczsKK30KKworCitpbnQKK19QeVRyYWNlTWFsbG9jX1VudHJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB1aW50cHRyX3QgcHRyKQoreworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpIHsKKyAgICAgICAgLyogdHJhY2VtYWxsb2MgaXMgbm90IHRyYWNpbmc6IGRvIG5vdGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKGRvbWFpbiwgcHRyKTsKKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitQeU9iamVjdCoKK19QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIHVpbnRwdHJfdCBwdHIpCit7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKworICAgIHRyYWNlYmFjayA9IHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soZG9tYWluLCBwdHIpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisKKyAgICByZXR1cm4gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFjaywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL193aW5hcGkuYyBiL01vZHVsZXMvX3dpbmFwaS5jCmluZGV4IGVkYzZjZjQuLjkxZDRmMDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3dpbmFwaS5jCisrKyBiL01vZHVsZXMvX3dpbmFwaS5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgc2VsZi5kZWNsYXJlKGRhdGEpCiAgICAgICAgIHNlbGYuZXJyX29jY3VycmVkX2lmKCJfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFIiwgZGF0YSkKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoCi0gICAgICAgICAgICAnaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTClcbiAgICBQeV9SRVRVUk5fTk9ORTtcbicpCisgICAgICAgICAgICAnaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkge1xuICAgIFB5X1JFVFVSTl9OT05FO1xufVxuJykKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoCiAgICAgICAgICAgICAncmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpO1xuJykKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKAogICAgICAgICAgICAgJ3JldHVybl92YWx1ZSA9IFB5X0J1aWxkVmFsdWUoImsiLCBfcmV0dXJuX3ZhbHVlKTtcbicpCiBbcHl0aG9uIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltweXRob24gZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD0zNzQwNzY5Nzk1OTZlYmJhXSovCisvKltweXRob24gZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD05NDgxOWU3MmQyYzZkNTU4XSovCiAKICNpbmNsdWRlICJjbGluaWMvX3dpbmFwaS5jLmgiCiAKQEAgLTQ4Niw3ICs0ODYsNyBAQAogICAgIGNvbnN0IFVTSE9SVCBwcmVmaXhfbGVuID0gNDsKICAgICBVU0hPUlQgcHJpbnRfbGVuID0gMDsKICAgICBVU0hPUlQgcmRiX3NpemUgPSAwOwotICAgIFBSRVBBUlNFX0RBVEFfQlVGRkVSIHJkYiA9IE5VTEw7CisgICAgX1B5X1BSRVBBUlNFX0RBVEFfQlVGRkVSIHJkYiA9IE5VTEw7CiAKICAgICAvKiBKdW5jdGlvbiBwb2ludCBjcmVhdGlvbiAqLwogICAgIEhBTkRMRSBqdW5jdGlvbiA9IE5VTEw7CkBAIC01NDIsMTggKzU0MiwxOCBAQAogICAgICAgICAgLSB0aGUgc2l6ZSBvZiB0aGUgcHJpbnQgbmFtZSBpbiBieXRlcwogICAgICAgICAgLSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3RpdHV0ZSBuYW1lIGluIGJ5dGVzCiAgICAgICAgICAtIHRoZSBzaXplIG9mIHR3byBOVUwgdGVybWluYXRvcnMgaW4gYnl0ZXMgKi8KLSAgICByZGJfc2l6ZSA9IFJFUEFSU0VfREFUQV9CVUZGRVJfSEVBREVSX1NJWkUgKworICAgIHJkYl9zaXplID0gX1B5X1JFUEFSU0VfREFUQV9CVUZGRVJfSEVBREVSX1NJWkUgKwogICAgICAgICBzaXplb2YocmRiLT5Nb3VudFBvaW50UmVwYXJzZUJ1ZmZlcikgLQogICAgICAgICBzaXplb2YocmRiLT5Nb3VudFBvaW50UmVwYXJzZUJ1ZmZlci5QYXRoQnVmZmVyKSArCiAgICAgICAgIC8qIFR3byArMSdzIGZvciBOVUwgdGVybWluYXRvcnMuICovCiAgICAgICAgIChwcmVmaXhfbGVuICsgcHJpbnRfbGVuICsgMSArIHByaW50X2xlbiArIDEpICogc2l6ZW9mKFdDSEFSKTsKLSAgICByZGIgPSAoUFJFUEFSU0VfREFUQV9CVUZGRVIpUHlNZW1fUmF3TWFsbG9jKHJkYl9zaXplKTsKKyAgICByZGIgPSAoX1B5X1BSRVBBUlNFX0RBVEFfQlVGRkVSKVB5TWVtX1Jhd01hbGxvYyhyZGJfc2l6ZSk7CiAgICAgaWYgKHJkYiA9PSBOVUxMKQogICAgICAgICBnb3RvIGNsZWFudXA7CiAKICAgICBtZW1zZXQocmRiLCAwLCByZGJfc2l6ZSk7CiAgICAgcmRiLT5SZXBhcnNlVGFnID0gSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQ7Ci0gICAgcmRiLT5SZXBhcnNlRGF0YUxlbmd0aCA9IHJkYl9zaXplIC0gUkVQQVJTRV9EQVRBX0JVRkZFUl9IRUFERVJfU0laRTsKKyAgICByZGItPlJlcGFyc2VEYXRhTGVuZ3RoID0gcmRiX3NpemUgLSBfUHlfUkVQQVJTRV9EQVRBX0JVRkZFUl9IRUFERVJfU0laRTsKICAgICByZGItPk1vdW50UG9pbnRSZXBhcnNlQnVmZmVyLlN1YnN0aXR1dGVOYW1lT2Zmc2V0ID0gMDsKICAgICByZGItPk1vdW50UG9pbnRSZXBhcnNlQnVmZmVyLlN1YnN0aXR1dGVOYW1lTGVuZ3RoID0KICAgICAgICAgKHByZWZpeF9sZW4gKyBwcmludF9sZW4pICogc2l6ZW9mKFdDSEFSKTsKQEAgLTY3NCw3ICs2NzQsNyBAQAogLyogaGVscGVycyBmb3IgY3JlYXRlcHJvY2VzcyAqLwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0dWxvbmcoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKK2dldHVsb25nKFB5T2JqZWN0KiBvYmosIGNvbnN0IGNoYXIqIG5hbWUpCiB7CiAgICAgUHlPYmplY3QqIHZhbHVlOwogICAgIHVuc2lnbmVkIGxvbmcgcmV0OwpAQCAtNjkwLDcgKzY5MCw3IEBACiB9CiAKIHN0YXRpYyBIQU5ETEUKLWdldGhhbmRsZShQeU9iamVjdCogb2JqLCBjaGFyKiBuYW1lKQorZ2V0aGFuZGxlKFB5T2JqZWN0KiBvYmosIGNvbnN0IGNoYXIqIG5hbWUpCiB7CiAgICAgUHlPYmplY3QqIHZhbHVlOwogICAgIEhBTkRMRSByZXQ7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FkZHJpbmZvLmggYi9Nb2R1bGVzL2FkZHJpbmZvLmgKaW5kZXggMWNiNmYwZS4uYzNjODYyNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hZGRyaW5mby5oCisrKyBiL01vZHVsZXMvYWRkcmluZm8uaApAQCAtMTQxLDExICsxNDEsNyBAQAogICogUkZDIDI1NTM6IHByb3RvY29sLWluZGVwZW5kZW50IHBsYWNlaG9sZGVyIGZvciBzb2NrZXQgYWRkcmVzc2VzCiAgKi8KICNkZWZpbmUgX1NTX01BWFNJWkUgICAgIDEyOAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIF9TU19BTElHTlNJWkUgICAoc2l6ZW9mKFBZX0xPTkdfTE9ORykpCi0jZWxzZQotI2RlZmluZSBfU1NfQUxJR05TSVpFICAgKHNpemVvZihkb3VibGUpKQotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCisjZGVmaW5lIF9TU19BTElHTlNJWkUgICAoc2l6ZW9mKGxvbmcgbG9uZykpCiAjZGVmaW5lIF9TU19QQUQxU0laRSAgICAoX1NTX0FMSUdOU0laRSAtIHNpemVvZih1X2NoYXIpICogMikKICNkZWZpbmUgX1NTX1BBRDJTSVpFICAgIChfU1NfTUFYU0laRSAtIHNpemVvZih1X2NoYXIpICogMiAtIFwKICAgICAgICAgICAgICAgICBfU1NfUEFEMVNJWkUgLSBfU1NfQUxJR05TSVpFKQpAQCAtMTU4LDExICsxNTQsNyBAQAogICAgIHVuc2lnbmVkIHNob3J0IHNzX2ZhbWlseTsgICAgICAgICAgIC8qIGFkZHJlc3MgZmFtaWx5ICovCiAjZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TQV9MRU4gKi8KICAgICBjaGFyICAgICAgICBfX3NzX3BhZDFbX1NTX1BBRDFTSVpFXTsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyBfX3NzX2FsaWduOyAgICAgICAgICAgIC8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCi0jZWxzZQotICAgIGRvdWJsZSBfX3NzX2FsaWduOyAgICAgICAgICAvKiBmb3JjZSBkZXNpcmVkIHN0cnVjdHVyZSBzdG9yYWdlIGFsaWdubWVudCAqLwotI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCisgICAgbG9uZyBsb25nIF9fc3NfYWxpZ247ICAgICAgICAgICAgLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KICAgICBjaGFyICAgICAgICBfX3NzX3BhZDJbX1NTX1BBRDJTSVpFXTsKIH07CiAjZW5kaWYgLyogIUhBVkVfU09DS0FERFJfU1RPUkFHRSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IGI5Zjg3YWUuLjg2YTU4ZDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBpbnQgaXRlbXNpemU7CiAgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICAgICBpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7Ci0gICAgY2hhciAqZm9ybWF0czsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRzOwogICAgIGludCBpc19pbnRlZ2VyX3R5cGU7CiAgICAgaW50IGlzX3NpZ25lZDsKIH07CkBAIC00MCw3ICs0MCw3IEBACiAgICAgUHlPYmplY3RfVkFSX0hFQUQKICAgICBjaGFyICpvYl9pdGVtOwogICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogICAgIGludCBvYl9leHBvcnRzOyAgLyogTnVtYmVyIG9mIGV4cG9ydGVkIGJ1ZmZlcnMgKi8KIH0gYXJyYXlvYmplY3Q7CkBAIC00MTgsMjIgKzQxOCwyMCBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQogc3RhdGljIFB5T2JqZWN0ICoKIHFfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoKFBZX0xPTkdfTE9ORyAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKChsb25nIGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBxX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGxvbmcgbG9uZyB4OwogICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoaSA+PSAwKQotICAgICAgICAoKFBZX0xPTkdfTE9ORyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgICAgICgobG9uZyBsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDQxLDIwICs0MzksMjAgQEAKIFFRX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygKLSAgICAgICAgKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilhcC0+b2JfaXRlbSlbaV0pOworICAgICAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIFFRX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OwogICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKICAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7Ci0gICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBQWV9MT05HX0xPTkcgeTsKKyAgICAgICAgbG9uZyBsb25nIHk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeSkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGlmICh5IDwgMCkgewpAQCAtNDYyLDE0ICs0NjAsMTMgQEAKICAgICAgICAgICAgICAgICAidW5zaWduZWQgbG9uZyBsb25nIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgeCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpeTsKKyAgICAgICAgeCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpeTsKICAgICB9CiAKICAgICBpZiAoaSA+PSAwKQotICAgICAgICAoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKICAgICByZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQpAQCAtNTExLDcgKzUwOCw3IEBACiAgKiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHR5cGVjb2RlX3RvX21mb3JtYXRfY29kZSgpIGlmIHlvdSBhZGQgYSBuZXcKICAqIHR5cGVjb2RlLgogICovCi1zdGF0aWMgc3RydWN0IGFycmF5ZGVzY3IgZGVzY3JpcHRvcnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0gewogICAgIHsnYicsIDEsIGJfZ2V0aXRlbSwgYl9zZXRpdGVtLCAiYiIsIDEsIDF9LAogICAgIHsnQicsIDEsIEJCX2dldGl0ZW0sIEJCX3NldGl0ZW0sICJCIiwgMSwgMH0sCiAgICAgeyd1Jywgc2l6ZW9mKFB5X1VOSUNPREUpLCB1X2dldGl0ZW0sIHVfc2V0aXRlbSwgInUiLCAwLCAwfSwKQEAgLTUyMSwxMCArNTE4LDggQEAKICAgICB7J0knLCBzaXplb2YoaW50KSwgSUlfZ2V0aXRlbSwgSUlfc2V0aXRlbSwgIkkiLCAxLCAwfSwKICAgICB7J2wnLCBzaXplb2YobG9uZyksIGxfZ2V0aXRlbSwgbF9zZXRpdGVtLCAibCIsIDEsIDF9LAogICAgIHsnTCcsIHNpemVvZihsb25nKSwgTExfZ2V0aXRlbSwgTExfc2V0aXRlbSwgIkwiLCAxLCAwfSwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIHsncScsIHNpemVvZihQWV9MT05HX0xPTkcpLCBxX2dldGl0ZW0sIHFfc2V0aXRlbSwgInEiLCAxLCAxfSwKLSAgICB7J1EnLCBzaXplb2YoUFlfTE9OR19MT05HKSwgUVFfZ2V0aXRlbSwgUVFfc2V0aXRlbSwgIlEiLCAxLCAwfSwKLSNlbmRpZgorICAgIHsncScsIHNpemVvZihsb25nIGxvbmcpLCBxX2dldGl0ZW0sIHFfc2V0aXRlbSwgInEiLCAxLCAxfSwKKyAgICB7J1EnLCBzaXplb2YobG9uZyBsb25nKSwgUVFfZ2V0aXRlbSwgUVFfc2V0aXRlbSwgIlEiLCAxLCAwfSwKICAgICB7J2YnLCBzaXplb2YoZmxvYXQpLCBmX2dldGl0ZW0sIGZfc2V0aXRlbSwgImYiLCAwLCAwfSwKICAgICB7J2QnLCBzaXplb2YoZG91YmxlKSwgZF9nZXRpdGVtLCBkX3NldGl0ZW0sICJkIiwgMCwgMH0sCiAgICAgeydcMCcsIDAsIDAsIDAsIDAsIDAsIDB9IC8qIFNlbnRpbmVsICovCkBAIC01MzksNyArNTM0LDcgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PWFkNDNkMzdlOTQyYTg4NTRdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLW5ld2FycmF5b2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBzaXplLCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3IpCituZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQogewogICAgIGFycmF5b2JqZWN0ICpvcDsKICAgICBzaXplX3QgbmJ5dGVzOwpAQCAtODQ2LDM3ICs4NDEsMTAgQEAKIH0KIAogc3RhdGljIGludAotYXJyYXlfYXNzX3NsaWNlKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gsIFB5T2JqZWN0ICp2KQorYXJyYXlfZGVsX3NsaWNlKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7CiAgICAgY2hhciAqaXRlbTsKLSAgICBQeV9zc2l6ZV90IG47IC8qIFNpemUgb2YgcmVwbGFjZW1lbnQgYXJyYXkgKi8KICAgICBQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCi0jZGVmaW5lIGIgKChhcnJheW9iamVjdCAqKXYpCi0gICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgbiA9IDA7Ci0gICAgZWxzZSBpZiAoYXJyYXlfQ2hlY2sodikpIHsKLSAgICAgICAgbiA9IFB5X1NJWkUoYik7Ci0gICAgICAgIGlmIChhID09IGIpIHsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCi0gICAgICAgICAgICBpbnQgcmV0OwotICAgICAgICAgICAgdiA9IGFycmF5X3NsaWNlKGIsIDAsIG4pOwotICAgICAgICAgICAgaWYgKCF2KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHJldCA9IGFycmF5X2Fzc19zbGljZShhLCBpbG93LCBpaGlnaCwgdik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChiLT5vYl9kZXNjciAhPSBhLT5vYl9kZXNjcikgewotICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CiAgICAgaWYgKGlsb3cgPCAwKQogICAgICAgICBpbG93ID0gMDsKICAgICBlbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKQEAgLTg4OCw3ICs4NTYsNyBAQAogICAgIGVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKICAgICAgICAgaWhpZ2ggPSBQeV9TSVpFKGEpOwogICAgIGl0ZW0gPSBhLT5vYl9pdGVtOwotICAgIGQgPSBuIC0gKGloaWdoLWlsb3cpOworICAgIGQgPSBpaGlnaC1pbG93OwogICAgIC8qIElzc3VlICM0NTA5OiBJZiB0aGUgYXJyYXkgaGFzIGV4cG9ydGVkIGJ1ZmZlcnMgYW5kIHRoZSBzbGljZQogICAgICAgIGFzc2lnbm1lbnQgd291bGQgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBhcnJheSwgZmFpbCBlYXJseSB0byBtYWtlCiAgICAgICAgc3VyZSB3ZSBkb24ndCBtb2RpZnkgaXQuICovCkBAIC04OTcsMjUgKzg2NSwxNCBAQAogICAgICAgICAgICAgImNhbm5vdCByZXNpemUgYW4gYXJyYXkgdGhhdCBpcyBleHBvcnRpbmcgYnVmZmVycyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChkIDwgMCkgeyAvKiBEZWxldGUgLWQgaXRlbXMgKi8KLSAgICAgICAgbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICBpZiAoZCA+IDApIHsgLyogRGVsZXRlIGQgaXRlbXMgKi8KKyAgICAgICAgbWVtbW92ZShpdGVtICsgKGloaWdoLWQpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKICAgICAgICAgICAgIGl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCiAgICAgICAgICAgICAoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLSAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShhLCBQeV9TSVpFKGEpICsgZCkgPT0gLTEpCisgICAgICAgIGlmIChhcnJheV9yZXNpemUoYSwgUHlfU0laRShhKSAtIGQpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBlbHNlIGlmIChkID4gMCkgeyAvKiBJbnNlcnQgZCBpdGVtcyAqLwotICAgICAgICBpZiAoYXJyYXlfcmVzaXplKGEsIFB5X1NJWkUoYSkgKyBkKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLSAgICAgICAgICAgIGl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0gICAgICAgICAgICAoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLSAgICB9Ci0gICAgaWYgKG4gPiAwKQotICAgICAgICBtZW1jcHkoaXRlbSArIGlsb3cqYS0+b2JfZGVzY3ItPml0ZW1zaXplLCBiLT5vYl9pdGVtLAotICAgICAgICAgICAgICAgbipiLT5vYl9kZXNjci0+aXRlbXNpemUpOwogICAgIHJldHVybiAwOwotI3VuZGVmIGIKIH0KIAogc3RhdGljIGludApAQCAtOTI3LDcgKzg4NCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGFycmF5X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOworICAgICAgICByZXR1cm4gYXJyYXlfZGVsX3NsaWNlKGEsIGksIGkrMSk7CiAgICAgcmV0dXJuICgqYS0+b2JfZGVzY3ItPnNldGl0ZW0pKGEsIGksIHYpOwogfQogCkBAIC0xMTU1LDggKzExMTIsNyBAQAogICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKICAgICAgICAgUHlfREVDUkVGKHNlbGZpKTsKICAgICAgICAgaWYgKGNtcCA+IDApIHsKLSAgICAgICAgICAgIGlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwpICE9IDApCisgICAgICAgICAgICBpZiAoYXJyYXlfZGVsX3NsaWNlKHNlbGYsIGksIGkrMSkgIT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwpAQCAtMTE5OSw3ICsxMTU1LDcgQEAKICAgICB2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOwogICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChhcnJheV9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKSAhPSAwKSB7CisgICAgaWYgKGFycmF5X2RlbF9zbGljZShzZWxmLCBpLCBpKzEpICE9IDApIHsKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xODUzLDE2ICsxODA5LDE0IEBACiAgICAgICAgIGludHNpemUgPSBzaXplb2YobG9uZyk7CiAgICAgICAgIGlzX3NpZ25lZCA9IDA7CiAgICAgICAgIGJyZWFrOwotI2lmIEhBVkVfTE9OR19MT05HCiAgICAgY2FzZSAncSc6Ci0gICAgICAgIGludHNpemUgPSBzaXplb2YoUFlfTE9OR19MT05HKTsKKyAgICAgICAgaW50c2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOwogICAgICAgICBpc19zaWduZWQgPSAxOwogICAgICAgICBicmVhazsKICAgICBjYXNlICdRJzoKLSAgICAgICAgaW50c2l6ZSA9IHNpemVvZihQWV9MT05HX0xPTkcpOworICAgICAgICBpbnRzaXplID0gc2l6ZW9mKGxvbmcgbG9uZyk7CiAgICAgICAgIGlzX3NpZ25lZCA9IDA7CiAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIFVOS05PV05fRk9STUFUOwogICAgIH0KQEAgLTE5NDYsNyArMTkwMCw3IEBACiB7CiAgICAgUHlPYmplY3QgKmNvbnZlcnRlZF9pdGVtczsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICBpZiAoIVB5VHlwZV9DaGVjayhhcnJheXR5cGUpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0yMDg0LDcgKzIwMzgsNyBAQAogICAgICAgICBQeV9zc2l6ZV90IGl0ZW1jb3VudCA9IFB5X1NJWkUoaXRlbXMpIC8gbWZfZGVzY3Iuc2l6ZTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtc3RyID0KICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcoaXRlbXMpOwotICAgICAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgICAgICAvKiBJZiBwb3NzaWJsZSwgdHJ5IHRvIHBhY2sgYXJyYXkncyBpdGVtcyB1c2luZyBhIGRhdGEgdHlwZQogICAgICAgICAgKiB0aGF0IGZpdHMgYmV0dGVyLiBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXJyYXkgd2l0aCBuYXJyb3dlcgpAQCAtMjU1NCw3ICsyNTA4LDcgQEAKICAgICB2aWV3LT5mb3JtYXQgPSBOVUxMOwogICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKICAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpIHsKLSAgICAgICAgdmlldy0+Zm9ybWF0ID0gc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CisgICAgICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgPT0gJ3UnKSB7CiAgICAgICAgICAgICB2aWV3LT5mb3JtYXQgPSAidyI7CkBAIC0yNTk1LDcgKzI1NDksNyBAQAogewogICAgIGludCBjOwogICAgIFB5T2JqZWN0ICppbml0aWFsID0gTlVMTCwgKml0ID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKHR5cGUgPT0gJkFycmF5dHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImFycmF5LmFycmF5KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNzI0LDExICsyNjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICAiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIHEsIFEsIGYgb3IgZCkiKTsKLSNlbHNlCi0gICAgICAgICJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKSIpOwotI2VuZGlmCiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI4NzUsOSArMjgyNSwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5aXRlcl9uZXh0KGFycmF5aXRlcm9iamVjdCAqaXQpCiB7CisgICAgYXJyYXlvYmplY3QgKmFvOworCisgICAgYXNzZXJ0KGl0ICE9IE5VTEwpOwogICAgIGFzc2VydChQeUFycmF5SXRlcl9DaGVjayhpdCkpOwotICAgIGlmIChpdC0+aW5kZXggPCBQeV9TSVpFKGl0LT5hbykpCi0gICAgICAgIHJldHVybiAoKml0LT5nZXRpdGVtKShpdC0+YW8sIGl0LT5pbmRleCsrKTsKKyAgICBhbyA9IGl0LT5hbzsKKyAgICBpZiAoYW8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0KGFycmF5X0NoZWNrKGFvKSk7CisgICAgaWYgKGl0LT5pbmRleCA8IFB5X1NJWkUoYW8pKSB7CisgICAgICAgIHJldHVybiAoKml0LT5nZXRpdGVtKShhbywgaXQtPmluZGV4KyspOworICAgIH0KKyAgICBpdC0+YW8gPSBOVUxMOworICAgIFB5X0RFQ1JFRihhbyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI5MDYsOCArMjg2NywxMSBAQAogYXJyYXlfYXJyYXlpdGVyYXRvcl9fX3JlZHVjZV9fX2ltcGwoYXJyYXlpdGVyb2JqZWN0ICpzZWxmKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc4OThhNTJlOGU2NmUwMTYgaW5wdXQ9YTA2MmVhMWU5OTUxNDE3YV0qLwogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOKE8pbiIsIF9QeU9iamVjdF9HZXRCdWlsdGluKCJpdGVyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YW8sIHNlbGYtPmluZGV4KTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IF9QeU9iamVjdF9HZXRCdWlsdGluKCJpdGVyIik7CisgICAgaWYgKHNlbGYtPmFvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4oKCkpIiwgZnVuYyk7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOKE8pbiIsIGZ1bmMsIHNlbGYtPmFvLCBzZWxmLT5pbmRleCk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KQEAgLTI5ODcsNyArMjk1MSw3IEBACiAgICAgY2hhciBidWZmZXJbUHlfQVJSQVlfTEVOR1RIKGRlc2NyaXB0b3JzKV0sICpwOwogICAgIFB5T2JqZWN0ICp0eXBlY29kZXM7CiAgICAgUHlfc3NpemVfdCBzaXplID0gMDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKFB5VHlwZV9SZWFkeSgmQXJyYXl0eXBlKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggMWUxMzFkMi4uYzExNTA2YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTUxLDEzICs1MSwxNSBAQAogI2RlZmluZSBTRUdfU0hJRlQgICAgICAgKDQpICAgICAgICAgICAgIC8qIExlZnQgc2hpZnQgZm9yIHNlZ21lbnQgbnVtYmVyLiAqLwogI2RlZmluZSBTRUdfTUFTSyAgICAgICAgKDB4NzApICAgICAgICAgIC8qIFNlZ21lbnQgZmllbGQgbWFzay4gKi8KIAotc3RhdGljIFB5SW50MTYgc2VnX2FlbmRbOF0gPSB7MHgxRiwgMHgzRiwgMHg3RiwgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGfTsKLXN0YXRpYyBQeUludDE2IHNlZ191ZW5kWzhdID0gezB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzRkYsIDB4N0ZGLCAweEZGRiwgMHgxRkZGfTsKK3N0YXRpYyBjb25zdCBQeUludDE2IHNlZ19hZW5kWzhdID0geworICAgIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGCit9Oworc3RhdGljIGNvbnN0IFB5SW50MTYgc2VnX3VlbmRbOF0gPSB7CisgICAgMHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRgorfTsKIAogc3RhdGljIFB5SW50MTYKLXNlYXJjaChQeUludDE2IHZhbCwgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQorc2VhcmNoKFB5SW50MTYgdmFsLCBjb25zdCBQeUludDE2ICp0YWJsZSwgaW50IHNpemUpCiB7CiAgICAgaW50IGk7CiAKQEAgLTcwLDcgKzcyLDcgQEAKICNkZWZpbmUgc3RfdWxhdzJsaW5lYXIxNih1YykgKF9zdF91bGF3MmxpbmVhcjE2W3VjXSkKICNkZWZpbmUgc3RfYWxhdzJsaW5lYXIxNih1YykgKF9zdF9hbGF3MmxpbmVhcjE2W3VjXSkKIAotc3RhdGljIFB5SW50MTYgX3N0X3VsYXcybGluZWFyMTZbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CiAgICAgLTMyMTI0LCAgLTMxMTAwLCAgLTMwMDc2LCAgLTI5MDUyLCAgLTI4MDI4LCAgLTI3MDA0LCAgLTI1OTgwLAogICAgIC0yNDk1NiwgIC0yMzkzMiwgIC0yMjkwOCwgIC0yMTg4NCwgIC0yMDg2MCwgIC0xOTgzNiwgIC0xODgxMiwKICAgICAtMTc3ODgsICAtMTY3NjQsICAtMTU5OTYsICAtMTU0ODQsICAtMTQ5NzIsICAtMTQ0NjAsICAtMTM5NDgsCkBAIC0xNzYsNyArMTc4LDcgQEAKIAogfQogCi1zdGF0aWMgUHlJbnQxNiBfc3RfYWxhdzJsaW5lYXIxNlsyNTZdID0geworc3RhdGljIGNvbnN0IFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKICAgICAgLTU1MDQsICAgLTUyNDgsICAgLTYwMTYsICAgLTU3NjAsICAgLTQ0ODAsICAgLTQyMjQsICAgLTQ5OTIsCiAgICAgIC00NzM2LCAgIC03NTUyLCAgIC03Mjk2LCAgIC04MDY0LCAgIC03ODA4LCAgIC02NTI4LCAgIC02MjcyLAogICAgICAtNzA0MCwgICAtNjc4NCwgICAtMjc1MiwgICAtMjYyNCwgICAtMzAwOCwgICAtMjg4MCwgICAtMjI0MCwKQEAgLTI3MCwxMiArMjcyLDEyIEBACiAvKiBFbmQgb2YgY29kZSB0YWtlbiBmcm9tIHNveCAqLwogCiAvKiBJbnRlbCBBRFBDTSBzdGVwIHZhcmlhdGlvbiB0YWJsZSAqLwotc3RhdGljIGludCBpbmRleFRhYmxlWzE2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7CiAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCiAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCiB9OwogCi1zdGF0aWMgaW50IHN0ZXBzaXplVGFibGVbODldID0geworc3RhdGljIGNvbnN0IGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKICAgICA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE2LCAxNywKICAgICAxOSwgMjEsIDIzLCAyNSwgMjgsIDMxLCAzNCwgMzcsIDQxLCA0NSwKICAgICA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LApAQCAtMjk1LDcgKzI5Nyw3IEBACiAKICNkZWZpbmUgR0VUSU5UOChjcCwgaSkgICAgICAgICAgR0VUSU5UWChzaWduZWQgY2hhciwgKGNwKSwgKGkpKQogI2RlZmluZSBHRVRJTlQxNihjcCwgaSkgICAgICAgICBHRVRJTlRYKHNob3J0LCAoY3ApLCAoaSkpCi0jZGVmaW5lIEdFVElOVDMyKGNwLCBpKSAgICAgICAgIEdFVElOVFgoUFlfSU5UMzJfVCwgKGNwKSwgKGkpKQorI2RlZmluZSBHRVRJTlQzMihjcCwgaSkgICAgICAgICBHRVRJTlRYKGludDMyX3QsIChjcCksIChpKSkKIAogI2lmIFdPUkRTX0JJR0VORElBTgogI2RlZmluZSBHRVRJTlQyNChjcCwgaSkgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMTIsNyArMzE0LDcgQEAKIAogI2RlZmluZSBTRVRJTlQ4KGNwLCBpLCB2YWwpICAgICBTRVRJTlRYKHNpZ25lZCBjaGFyLCAoY3ApLCAoaSksICh2YWwpKQogI2RlZmluZSBTRVRJTlQxNihjcCwgaSwgdmFsKSAgICBTRVRJTlRYKHNob3J0LCAoY3ApLCAoaSksICh2YWwpKQotI2RlZmluZSBTRVRJTlQzMihjcCwgaSwgdmFsKSAgICBTRVRJTlRYKFBZX0lOVDMyX1QsIChjcCksIChpKSwgKHZhbCkpCisjZGVmaW5lIFNFVElOVDMyKGNwLCBpLCB2YWwpICAgIFNFVElOVFgoaW50MzJfdCwgKGNwKSwgKGkpLCAodmFsKSkKIAogI2lmIFdPUkRTX0JJR0VORElBTgogI2RlZmluZSBTRVRJTlQyNChjcCwgaSwgdmFsKSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ0NCw3ICs0NDYsOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnQtPmxlbjsgaSArPSB3aWR0aCkgewogICAgICAgICBpbnQgdmFsID0gR0VUUkFXU0FNUExFKHdpZHRoLCBmcmFnbWVudC0+YnVmLCBpKTsKLSAgICAgICAgaWYgKHZhbCA8IDApIGFic3ZhbCA9ICgtdmFsKTsKKyAgICAgICAgLyogQ2FzdCB0byB1bnNpZ25lZCBiZWZvcmUgbmVnYXRpbmcuIFVuc2lnbmVkIG92ZXJmbG93IGlzIHdlbGwtCisgICAgICAgIGRlZmluZWQsIGJ1dCBzaWduZWQgb3ZlcmZsb3cgaXMgbm90LiAqLworICAgICAgICBpZiAodmFsIDwgMCkgYWJzdmFsID0gLSh1bnNpZ25lZCBpbnQpdmFsOwogICAgICAgICBlbHNlIGFic3ZhbCA9IHZhbDsKICAgICAgICAgaWYgKGFic3ZhbCA+IG1heCkgbWF4ID0gYWJzdmFsOwogICAgIH0KQEAgLTExMjUsNyArMTEyOSw3IEBACiAgICAgICAgICAgICB2YWwgPSAoKHVuc2lnbmVkIGludClHRVRJTlQyNChmcmFnbWVudC0+YnVmLCBpKSkgJiAweGZmZmZmZnU7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgYXNzZXJ0KHdpZHRoID09IDQpOwotICAgICAgICAgICAgdmFsID0gR0VUSU5UWChQWV9VSU5UMzJfVCwgZnJhZ21lbnQtPmJ1ZiwgaSk7CisgICAgICAgICAgICB2YWwgPSBHRVRJTlRYKHVpbnQzMl90LCBmcmFnbWVudC0+YnVmLCBpKTsKICAgICAgICAgfQogCiAgICAgICAgIHZhbCArPSAodW5zaWduZWQgaW50KWJpYXM7CkBAIC0xMTQwLDcgKzExNDQsNyBAQAogICAgICAgICAgICAgU0VUSU5UMjQobmNwLCBpLCAoaW50KXZhbCk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgYXNzZXJ0KHdpZHRoID09IDQpOwotICAgICAgICAgICAgU0VUSU5UWChQWV9VSU5UMzJfVCwgbmNwLCBpLCB2YWwpOworICAgICAgICAgICAgU0VUSU5UWCh1aW50MzJfdCwgbmNwLCBpLCB2YWwpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBydjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYmluYXNjaWkuYyBiL01vZHVsZXMvYmluYXNjaWkuYwppbmRleCBmMGI0N2Q4Li5jMzMyMGNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2JpbmFzY2lpLmMKKysrIGIvTW9kdWxlcy9iaW5hc2NpaS5jCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIFNLSVAgMHg3RQogI2RlZmluZSBGQUlMIDB4N0QKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwogLyogMCovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXGIgICAgXHQgICAgXG4gICAgXksgICAgXkwgICAgXHIgICAgXk4gICAgXk8gICAqLwpAQCAtMTI1LDEwICsxMjUsMTAgQEAKICAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2hxeFtdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCi1zdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogLyogTWF4IGJpbmFyeSBjaHVuayBzaXplOyBsaW1pdGVkIG9ubHkgYnkgYXZhaWxhYmxlIG1lbW9yeSAqLwogI2RlZmluZSBCQVNFNjRfTUFYQklOICgoUFlfU1NJWkVfVF9NQVggLSAzKSAvIDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9iYXNlNjRbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyY3RhYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CiAgICAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBhNSwgMHg2MGM2LCAweDcwZTcsCiAgICAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCiAgICAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCkBAIC0yNTYsNyArMjU2LDggQEAKIGJpbmFzY2lpX2EyYl91dV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMDI3ZjhlMGIwNTk4NzQyIGlucHV0PTdjYWZlYWY3M2RmNjNkMWNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwpAQCAtMzQyLDEzICszNDMsMTUgQEAKIGJpbmFzY2lpX2IyYV91dV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMDcwNjcwZTUyZTRhYTZiIGlucHV0PTAwZmRmNDU4Y2U4YjQ2NWJdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAgICAgYmluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgYmluX2xlbiA9IGRhdGEtPmxlbjsKICAgICBpZiAoIGJpbl9sZW4gPiA0NSApIHsKQEAgLTM1OCw5ICszNjEsMTAgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKKyAgICBvdXRfbGVuID0gMiArIChiaW5fbGVuICsgMikgLyAzICogNDsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgLyogU3RvcmUgdGhlIGxlbmd0aCAqLwogICAgICphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CkBAIC0zODIsMTcgKzM4NiwxMiBAQAogICAgIH0KICAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIAogc3RhdGljIGludAotYmluYXNjaWlfZmluZF92YWxpZCh1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCitiaW5hc2NpaV9maW5kX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIFB5X3NzaXplX3Qgc2xlbiwgaW50IG51bSkKIHsKICAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAogICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgpAQCAtNDI5LDEzICs0MjgsMTQgQEAKIGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDYyODIyM2YxOWZkM2Y5YiBpbnB1dD01ODcyYWNmNmUxY2FjMjQzXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CiAgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CiAgICAgaW50IHF1YWRfcG9zID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGFzY2lpX2xlbiA9IGRhdGEtPmxlbjsKQEAgLTQ0NywxMSArNDQ3LDEyIEBACiAKICAgICBiaW5fbGVuID0gKChhc2NpaV9sZW4rMykvNCkqMzsgLyogVXBwZXIgYm91bmQsIGNvcnJlY3RlZCBsYXRlciAqLwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGJpbl9sZW4pOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwotICAgIGJpbl9sZW4gPSAwOwogCiAgICAgZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKICAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhOwpAQCAtNDk2LDMxICs0OTcsMTcgQEAKICAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewogICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKICAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0gICAgICAgICAgICBiaW5fbGVuKys7CiAgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobGVmdGJpdHMgIT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvKiBBbmQgc2V0IHN0cmluZyBzaXplIGNvcnJlY3RseS4gSWYgdGhlIHJlc3VsdCBzdHJpbmcgaXMgZW1wdHkKLSAgICAqKiAoYmVjYXVzZSB0aGUgaW5wdXQgd2FzIGFsbCBpbnZhbGlkKSByZXR1cm4gdGhlIHNoYXJlZCBlbXB0eQotICAgICoqIHN0cmluZyBpbnN0ZWFkOyBfUHlCeXRlc19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KLSAgICAqLwotICAgIGlmIChiaW5fbGVuID4gMCkgewotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKIH0KIAogCkBAIC01MjgsMjQgKzUxNSwyNyBAQAogYmluYXNjaWkuYjJhX2Jhc2U2NAogCiAgICAgZGF0YTogUHlfYnVmZmVyCi0gICAgLworICAgICoKKyAgICBuZXdsaW5lOiBpbnQoY19kZWZhdWx0PSIxIikgPSBUcnVlCiAKIEJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGQ5NjY2MzE3MDc3OGRjMyBpbnB1dD0xNGVjNGU0NzM3MTE3NGE5XSovCitiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbmV3bGluZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00YWQ2MmM4ZTg0ODVkM2IzIGlucHV0PTdiMmVhNmZhMzhkODkyNGNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCkBAIC01NTUsMTEgKzU0NSwxNCBAQAogICAgIH0KIAogICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCi0gICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCi0gICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApCisgICAgICAgIisyIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzLgorICAgICAgIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgb3V0X2xlbiA9IGJpbl9sZW4qMiArIDI7CisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgIG91dF9sZW4rKzsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCB0aGUgZGF0YSBpbnRvIG91ciBidWZmZXIgKi8KQEAgLTU4MSwxNCArNTc0LDEwIEBACiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0WyhsZWZ0Y2hhciYweGYpIDw8IDJdOwogICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKICAgICB9Ci0gICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KKyAgICBpZiAobmV3bGluZSkKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC02MDQsMTYgKzU5MywxOSBAQAogYmluYXNjaWlfYTJiX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZDZkOGM1NGQ1NGVhMWMxIGlucHV0PTBkOTE0YzY4MGUwZWVkNTVdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGludCBkb25lID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNjIzLDkgKzYxNSw5IEBACiAgICAgLyogQWxsb2NhdGUgYSBzdHJpbmcgdGhhdCBpcyB0b28gYmlnIChmaXhlZCBsYXRlcikKICAgICAgICBBZGQgdHdvIHRvIHRoZSBpbml0aWFsIGxlbmd0aCB0byBwcmV2ZW50IGludGVybmluZyB3aGljaAogICAgICAgIHdvdWxkIHByZWNsdWRlIHN1YnNlcXVlbnQgcmVzaXppbmcuICAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiArIDIpOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgewogICAgICAgICAvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KQEAgLTYzNCw3ICs2MjYsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBGQUlMICkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBET05FICkgewpAQCAtNjU2LDIxICs2NDgsMTQgQEAKICAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJpbl9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIHJydjsKLSAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYmluX2RhdGEpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5pIiwgcmVzLCBkb25lKTsKIH0KIAogCkBAIC02ODcsMTEgKzY3MiwxMyBAQAogYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzkzZDc5MzM4ZjVmNTYyOSBpbnB1dD1lMWYxNzEyNDQ3YTgyYjA5XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKm91dF9kYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgY2g7CiAgICAgUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgbGVuID0gZGF0YS0+bGVuOwogCkBAIC03MDEsOSArNjg4LDkgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBXb3JzdCBjYXNlOiBvdXRwdXQgaXMgdHdpY2UgYXMgYmlnIGFzIGlucHV0IChmaXhlZCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggaW49MDsgaW48bGVuOyBpbisrKSB7CiAgICAgICAgIGNoID0gaW5fZGF0YVtpbl07CkBAIC03MjksMTIgKzcxNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOwogfQogCiAKQEAgLTc1MSwxNSArNzM0LDE3IEBACiBiaW5hc2NpaV9iMmFfaHF4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQwYWE1YTcwNGJjOWY3ZGUgaW5wdXQ9OTU5NmViZTAxOWZlMTJiYV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNzY3LDkgKzc1Miw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuICogMiArIDIpOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CiAgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KQEAgLTc4NiwxMiArNzcxLDggQEAKICAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogCkBAIC04MDgsMTMgKzc4OSwxNSBAQAogYmluYXNjaWlfcmxlZGVjb2RlX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ODI2NjE5NTY1ZGUxYzZjIGlucHV0PTU0Y2RkNDlmYzAxNDQwMmNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIGluX3JlcGVhdDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBpbl9sZW4sIG91dF9sZW4sIG91dF9sZW5fbGVmdDsKKyAgICBQeV9zc2l6ZV90IGluX2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGluX2xlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGluX2xlbiA+PSAwKTsKIApAQCAtODI1LDU5ICs4MDgsNDggQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KLSAgICBvdXRfbGVuID0gaW5fbGVuKjI7Ci0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBvdXRfbGVuKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBpbl9sZW4pOworICAgIGlmIChvdXRfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CisKKyAgICAvKiBVc2Ugb3ZlcmFsbG9jYXRpb24gKi8KKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIC8qCiAgICAgKiogV2UgbmVlZCB0d28gbWFjcm9zIGhlcmUgdG8gZ2V0L3B1dCBieXRlcyBhbmQgaGFuZGxlCiAgICAgKiogZW5kLW9mLWJ1ZmZlciBmb3IgaW5wdXQgYW5kIG91dHB1dCBzdHJpbmdzLgogICAgICovCi0jZGVmaW5lIElOQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLWluX2xlbiA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAotICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgYiA9ICppbl9kYXRhKys7IFwKKyNkZWZpbmUgSU5CWVRFKGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgT1VUQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB7IFB5X1hERUNSRUYocnYpOyByZXR1cm4gTlVMTDsgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRfbGVuOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgKm91dF9kYXRhKysgPSBiOyBcCi0gICAgfSB3aGlsZSgwKQotCi0gICAgICAgIC8qCi0gICAgICAgICoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5Ci0gICAgICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgotICAgICAgICAqLwotICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CisgICAgLyoKKyAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQorICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgorICAgICovCisgICAgSU5CWVRFKGluX2J5dGUpOwogCiAgICAgaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewogICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgc3VidHJhY3QgMSBieXRlIHRvIHByZXZlbnQgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgd3JpdGVyLm1pbl9zaXplLS07CisKICAgICAgICAgaWYgKGluX3JlcGVhdCAhPSAwKSB7CiAgICAgICAgICAgICAvKiBOb3RlIEVycm9yLCBub3QgSW5jb21wbGV0ZSAod2hpY2ggaXMgYXQgdGhlIGVuZAogICAgICAgICAgICAgKiogb2YgdGhlIHN0cmluZyBvbmx5KS4gVGhpcyBpcyBhIHByb2dyYW1tZXIgZXJyb3IuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiT3JwaGFuZWQgUkxFIGNvZGUgYXQgc3RhcnQiKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgT1VUQllURShSVU5DSEFSKTsKKyAgICAgICAgKm91dF9kYXRhKysgPSBSVU5DSEFSOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICpvdXRfZGF0YSsrID0gaW5fYnl0ZTsKICAgICB9CiAKICAgICB3aGlsZSggaW5fbGVuID4gMCApIHsKQEAgLTg4NSwyNiArODU3LDM5IEBACiAKICAgICAgICAgaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewogICAgICAgICAgICAgSU5CWVRFKGluX3JlcGVhdCk7CisgICAgICAgICAgICAvKiBvbmx5IDEgYnl0ZSB3aWxsIGJlIHdyaXR0ZW4sIGJ1dCAyIGJ5dGVzIHdlcmUgcHJlYWxsb2NhdGVkOgorICAgICAgICAgICAgICAgc3VidHJhY3QgMSBieXRlIHRvIHByZXZlbnQgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgICAgICBpZiAoIGluX3JlcGVhdCA9PSAwICkgewogICAgICAgICAgICAgICAgIC8qIEp1c3QgYW4gZXNjYXBlZCBSVU5DSEFSIHZhbHVlICovCi0gICAgICAgICAgICAgICAgT1VUQllURShSVU5DSEFSKTsKKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWUgYW5kIG91dHB1dCBhIHNlcXVlbmNlIG9mIGl0ICovCiAgICAgICAgICAgICAgICAgaW5fYnl0ZSA9IG91dF9kYXRhWy0xXTsKKworICAgICAgICAgICAgICAgIC8qIGVubGFyZ2UgdGhlIGJ1ZmZlciBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5fcmVwZWF0ID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvKiAtMSBiZWNhdXNlIHdlIGFscmVhZHkgcHJlYWxsb2NhdGVkIDEgYnl0ZSAqLworICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yZXBlYXQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dF9kYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHdoaWxlICggLS1pbl9yZXBlYXQgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBpbl9ieXRlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogTm9ybWFsIGJ5dGUgKi8KLSAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIG91dF9kYXRhKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC05MjIsNyArOTA3LDcgQEAKIGJpbmFzY2lpX2NyY19ocXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIHVuc2lnbmVkIGludCBjcmMpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGVjMmE3ODU5MGQxOTE3MCBpbnB1dD1hZGQ4YzUzNzEyY2NjZWRhXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CiAKICAgICBjcmMgJj0gMHhmZmZmOwpAQCAtMTAwMCw3ICs5ODUsNyBAQAogICAgICB1c2luZyBieXRlLXN3YXAgaW5zdHJ1Y3Rpb25zLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3JjXzMyX3RhYlsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjcmNfMzJfdGFiWzI1Nl0gPSB7CiAweDAwMDAwMDAwVSwgMHg3NzA3MzA5NlUsIDB4ZWUwZTYxMmNVLCAweDk5MDk1MWJhVSwgMHgwNzZkYzQxOVUsCiAweDcwNmFmNDhmVSwgMHhlOTYzYTUzNVUsIDB4OWU2NDk1YTNVLCAweDBlZGI4ODMyVSwgMHg3OWRjYjhhNFUsCiAweGUwZDVlOTFlVSwgMHg5N2QyZDk4OFUsIDB4MDliNjRjMmJVLCAweDdlYjE3Y2JkVSwgMHhlN2I4MmQwN1UsCkBAIC0xMDczLDcgKzEwNTgsNyBAQAogI2lmZGVmIFVTRV9aTElCX0NSQzMyCiAvKiBUaGlzIHdhcyB0YWtlbiBmcm9tIHpsaWJtb2R1bGUuYyBQeVpsaWJfY3JjMzIgKGJ1dCBpcyBQWV9TU0laRV9UX0NMRUFOKSAqLwogewotICAgIEJ5dGUgKmJ1ZjsKKyAgICBjb25zdCBCeXRlICpidWY7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgaW50IHNpZ25lZF92YWw7CiAKQEAgLTEwODQsNyArMTA2OSw3IEBACiB9CiAjZWxzZSAgLyogVVNFX1pMSUJfQ1JDMzIgKi8KIHsgLyogQnkgSmltIEFobHN0cm9tOyBBbGwgcmlnaHRzIHRyYW5zZmVycmVkIHRvIENOUkkgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0OwogCkBAIC0xMTY3LDcgKzExNTIsNyBAQAogYmluYXNjaWlfYTJiX2hleF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqaGV4c3RyKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBjYzFhMTM5YWYwZWVlY2IgaW5wdXQ9OWUxZTdmMmY5NGRiMjRmZF0qLwogewotICAgIGNoYXIqIGFyZ2J1ZjsKKyAgICBjb25zdCBjaGFyKiBhcmdidWY7CiAgICAgUHlfc3NpemVfdCBhcmdsZW47CiAgICAgUHlPYmplY3QgKnJldHZhbDsKICAgICBjaGFyKiByZXRidWY7CkBAIC0xMjI0LDcgKzEyMDksNyBAQAogICAgIHJldHVybiBiaW5hc2NpaV9hMmJfaGV4X2ltcGwobW9kdWxlLCBoZXhzdHIpOwogfQogCi1zdGF0aWMgaW50IHRhYmxlX2hleFsxMjhdID0geworc3RhdGljIGNvbnN0IGludCB0YWJsZV9oZXhbMTI4XSA9IHsKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKQEAgLTEyNTUsNyArMTI0MCw4IEBACiB7CiAgICAgUHlfc3NpemVfdCBpbiwgb3V0OwogICAgIGNoYXIgY2g7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKm9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqb2RhdGE7CiAgICAgUHlfc3NpemVfdCBkYXRhbGVuID0gMDsKICAgICBQeU9iamVjdCAqcnY7CiAKQEAgLTEzNjEsMTMgKzEzNDcsMTQgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lOTg4NDQ3MmViYjFhOTRjIGlucHV0PTdmMmE5YWFhMDA4ZTkyYjJdKi8KIHsKICAgICBQeV9zc2l6ZV90IGluLCBvdXQ7Ci0gICAgdW5zaWduZWQgY2hhciAqZGF0YWJ1ZiwgKm9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFidWY7CisgICAgdW5zaWduZWQgY2hhciAqb2RhdGE7CiAgICAgUHlfc3NpemVfdCBkYXRhbGVuID0gMCwgb2RhdGFsZW4gPSAwOwogICAgIFB5T2JqZWN0ICpydjsKICAgICB1bnNpZ25lZCBpbnQgbGluZWxlbiA9IDA7CiAgICAgdW5zaWduZWQgY2hhciBjaDsKICAgICBpbnQgY3JsZiA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOwogCiAgICAgZGF0YWJ1ZiA9IGRhdGEtPmJ1ZjsKICAgICBkYXRhbGVuID0gZGF0YS0+bGVuOwpAQCAtMTM3Niw3ICsxMzYzLDcgQEAKICAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjb252ZXJ0aW5nIGFsbCBvZgogICAgICAqIHRoZSBlbmQgb2YgbGluZXMgdG8gYmUgdGhlIHNhbWUgZGVwZW5kaW5nIG9uIHRoaXMgZGV0ZWN0aW9uCiAgICAgICogaGVyZSAqLwotICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBtZW1jaHIoZGF0YWJ1ZiwgJ1xuJywgZGF0YWxlbik7CisgICAgcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhYnVmLCAnXG4nLCBkYXRhbGVuKTsKICAgICBpZiAoKHAgIT0gTlVMTCkgJiYgKHAgPiBkYXRhYnVmKSAmJiAoKihwLTEpID09ICdccicpKQogICAgICAgICBjcmxmID0gMTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaCBiL01vZHVsZXMvY2prY29kZWNzL2NsaW5pYy9tdWx0aWJ5dGVjb2RlYy5jLmgKaW5kZXggOGE0N2ZmOC4uYzljNThjZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jbGluaWMvbXVsdGlieXRlY29kZWMuYy5oCkBAIC0yNSwxMyArMjUsMTUgQEAKIF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVDb2RlY19lbmNvZGUoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3x6OmVuY29kZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmlucHV0OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHo6ZW5jb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5wdXQsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVDb2RlY19lbmNvZGVfaW1wbChzZWxmLCBpbnB1dCwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTYxLDE5ICs2MywyMiBAQAogX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZUNvZGVjX2RlY29kZShNdWx0aWJ5dGVDb2RlY09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ5Knx6OmRlY29kZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGlucHV0ID0ge05VTEwsIE5VTEx9OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5Knx6OmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbnB1dCwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlQ29kZWNfZGVjb2RlX2ltcGwoc2VsZiwgJmlucHV0LCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGlucHV0ICovCi0gICAgaWYgKGlucHV0Lm9iaikKKyAgICBpZiAoaW5wdXQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmaW5wdXQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC05NSwxMyArMTAwLDE1IEBACiBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX2VuY29kZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaW5wdXQiLCAiZmluYWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98aTplbmNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppbnB1dDsKICAgICBpbnQgZmluYWwgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmlucHV0LCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9lbmNvZGVfaW1wbChzZWxmLCBpbnB1dCwgZmluYWwpOwogCiBleGl0OgpAQCAtMTQyLDE5ICsxNDksMjIgQEAKIF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfZGVjb2RlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImlucHV0IiwgImZpbmFsIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8aTpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2J1ZmZlciBpbnB1dCA9IHtOVUxMLCBOVUxMfTsKICAgICBpbnQgZmluYWwgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8aTpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmZpbmFsKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZpbnB1dCwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfZGVjb2RlX2ltcGwoc2VsZiwgJmlucHV0LCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgaW5wdXQgKi8KLSAgICBpZiAoaW5wdXQub2JqKQorICAgIGlmIChpbnB1dC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZpbnB1dCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE5Niw4ICsyMDYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplb2JqKSkKKyAgICAgICAgJnNpemVvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkX2ltcGwoc2VsZiwgc2l6ZW9iaik7CiAKIGV4aXQ6CkBAIC0yMjQsOCArMjM1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnNpemVvYmopKQorICAgICAgICAmc2l6ZW9iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlU3RyZWFtUmVhZGVyX3JlYWRsaW5lX2ltcGwoc2VsZiwgc2l6ZW9iaik7CiAKIGV4aXQ6CkBAIC0yNTIsOCArMjY0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplaGludG9iaikpCisgICAgICAgICZzaXplaGludG9iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlU3RyZWFtUmVhZGVyX3JlYWRsaW5lc19pbXBsKHNlbGYsIHNpemVoaW50b2JqKTsKIAogZXhpdDoKQEAgLTMxNyw0ICszMzAsNCBAQAogCiAjZGVmaW5lIF9NVUxUSUJZVEVDT0RFQ19fX0NSRUFURV9DT0RFQ19NRVRIT0RERUYgICAgXAogICAgIHsiX19jcmVhdGVfY29kZWMiLCAoUHlDRnVuY3Rpb24pX211bHRpYnl0ZWNvZGVjX19fY3JlYXRlX2NvZGVjLCBNRVRIX08sIF9tdWx0aWJ5dGVjb2RlY19fX2NyZWF0ZV9jb2RlY19fZG9jX199LAotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVlYmIyMWUxOGMzMDQzZDEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PThlODZmYTE2MmM4NTIzMGIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAppbmRleCAzZWQ4MzAzLi5jNDAzMmVhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkNvbXByZXNzb3JfY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODAsMTEgKzgyLDEzIEBACiAgICAgaW50IGNvbXByZXNzbGV2ZWwgPSA5OwogCiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZCWjJDb21wcmVzc29yX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyQ29tcHJlc3NvciIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyQ29tcHJlc3NvciIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOkJaMkNvbXByZXNzb3IiLAotICAgICAgICAmY29tcHJlc3NsZXZlbCkpCisgICAgICAgICZjb21wcmVzc2xldmVsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9iejJfQloyQ29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKChCWjJDb21wcmVzc29yICopc2VsZiwgY29tcHJlc3NsZXZlbCk7CiAKIGV4aXQ6CkBAIC0xMjEsMTkgKzEyNSwyMiBAQAogX2J6Ml9CWjJEZWNvbXByZXNzb3JfZGVjb21wcmVzcyhCWjJEZWNvbXByZXNzb3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8bjpkZWNvbXByZXNzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGggPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfG46ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZtYXhfbGVuZ3RoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEsIG1heF9sZW5ndGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE1NSwxNCArMTYyLDE2IEBACiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwogCiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZCWjJEZWNvbXByZXNzb3JfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIkJaMkRlY29tcHJlc3NvciIsIGFyZ3MpKQorICAgICAgICAhX1B5QXJnX05vUG9zaXRpb25hbCgiQloyRGVjb21wcmVzc29yIiwgYXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoKFB5X1RZUEUoc2VsZikgPT0gJkJaMkRlY29tcHJlc3Nvcl9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkRlY29tcHJlc3NvciIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyRGVjb21wcmVzc29yIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9iejJfQloyRGVjb21wcmVzc29yX19faW5pdF9fX2ltcGwoKEJaMkRlY29tcHJlc3NvciAqKXNlbGYpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmVmMjliNzZiMzMxNGZjNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDBlNWVmMDQ5ZjllNzE5YiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCmluZGV4IGFmMDZjNmQuLjA5MGIxZWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCkBAIC0zMyw4ICszMyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6bG9va3VwIiwgJmVuY29kaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6bG9va3VwIiwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbG9va3VwX2ltcGwobW9kdWxlLCBlbmNvZGluZyk7CiAKIGV4aXQ6CkBAIC02NCwxNCArNjUsMTYgQEAKIF9jb2RlY3NfZW5jb2RlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsib2JqIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHNzOmVuY29kZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKm9iajsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c3M6ZW5jb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZW5jb2RlX2ltcGwobW9kdWxlLCBvYmosIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTAxLDE0ICsxMDQsMTYgQEAKIF9jb2RlY3NfZGVjb2RlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsib2JqIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfHNzOmRlY29kZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKm9iajsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c3M6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZGVjb2RlX2ltcGwobW9kdWxlLCBvYmosIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTMzLDggKzEzOCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6X2ZvcmdldF9jb2RlYyIsICZlbmNvZGluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOl9mb3JnZXRfY29kZWMiLCAmZW5jb2RpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19fZm9yZ2V0X2NvZGVjX2ltcGwobW9kdWxlLCBlbmNvZGluZyk7CiAKIGV4aXQ6CkBAIC0xNjEsMTQgKzE2NywxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6ZXNjYXBlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19lc2NhcGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xOTMsOCArMjAxLDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAotICAgICAgICAmUHlCeXRlc19UeXBlLCAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZQeUJ5dGVzX1R5cGUsICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZXNjYXBlX2VuY29kZV9pbXBsKG1vZHVsZSwgZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTIyMSw4ICsyMzAsOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCi0gICAgICAgICZvYmosICZlcnJvcnMpKQorICAgICAgICAmb2JqLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9pbnRlcm5hbF9kZWNvZGVfaW1wbChtb2R1bGUsIG9iaiwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTI1MCwxNCArMjYwLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzdfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfN19kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODMsMTQgKzI5NSwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl84X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzhfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzE2LDE0ICszMzAsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzQ5LDE0ICszNjUsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfbGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfbGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzgyLDE0ICs0MDAsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfYmVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfYmVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDE3LDE0ICs0MzcsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aWk6dXRmXzE2X2V4X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2V4X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgYnl0ZW9yZGVyLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDUwLDE0ICs0NzIsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDgzLDE0ICs1MDcsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfbGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfbGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTE2LDE0ICs1NDIsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfYmVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfYmVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTUxLDE0ICs1NzksMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aWk6dXRmXzMyX2V4X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2V4X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgYnl0ZW9yZGVyLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTgzLDE0ICs2MTMsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnVuaWNvZGVfZXNjYXBlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2VzY2FwZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTYxNSwxNCArNjQ3LDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3Jhd191bmljb2RlX2VzY2FwZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY0NywxNCArNjgxLDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8ejpsYXRpbl8xX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19sYXRpbl8xX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjc5LDE0ICs3MTUsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6OmFzY2lpX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19hc2NpaV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTcxMiwxNCArNzUwLDE2IEBACiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6TzpjaGFybWFwX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmbWFwcGluZykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmbWFwcGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBtYXBwaW5nKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03NDcsMTQgKzc4NywxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOm1iY3NfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19tYmNzX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc4NSwxNCArODI3LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqfHppOmNvZGVfcGFnZV9kZWNvZGUiLAotICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19jb2RlX3BhZ2VfZGVjb2RlX2ltcGwobW9kdWxlLCBjb2RlcGFnZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgxOSwxNCArODYzLDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpyZWFkYnVmZmVyX2VuY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yZWFkYnVmZmVyX2VuY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODUxLDggKzg5Nyw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwKLSAgICAgICAgJm9iaiwgJmVycm9ycykpCisgICAgICAgICZvYmosICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2ludGVybmFsX2VuY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtODc4LDkgKzkyNSwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl83X2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl83X2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfN19lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTkwNiw5ICs5NTQsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfOF9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfOF9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzhfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC05MzUsOSArOTg0LDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMTZfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8xNl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC05NjMsOSArMTAxMywxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8xNl9sZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMTZfbGVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9sZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTk5MSw5ICsxMDQyLDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzE2X2JlX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8xNl9iZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2JlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTAyMCw5ICsxMDcyLDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMzJfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8zMl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC0xMDQ4LDkgKzExMDEsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2xlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfbGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMDc2LDkgKzExMzAsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2JlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfYmVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTA0LDkgKzExNTksMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTMyLDkgKzExODgsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6cmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTYwLDkgKzEyMTcsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OmxhdGluXzFfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xhdGluXzFfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTg4LDkgKzEyNDYsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejphc2NpaV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejphc2NpaV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfYXNjaWlfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMjE3LDkgKzEyNzYsMTAgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6TzpjaGFybWFwX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMsICZtYXBwaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ek86Y2hhcm1hcF9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgbWFwcGluZyk7CiAKIGV4aXQ6CkBAIC0xMjQzLDggKzEzMDMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6Y2hhcm1hcF9idWlsZCIsICZtYXApKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpjaGFybWFwX2J1aWxkIiwgJm1hcCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfYnVpbGRfaW1wbChtb2R1bGUsIG1hcCk7CiAKIGV4aXQ6CkBAIC0xMjcxLDkgKzEzMzIsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6Om1iY3NfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX21iY3NfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMzA0LDkgKzEzNjYsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPfHo6Y29kZV9wYWdlX2VuY29kZSIsCi0gICAgICAgICZjb2RlX3BhZ2UsICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaVV8ejpjb2RlX3BhZ2VfZW5jb2RlIiwKKyAgICAgICAgJmNvZGVfcGFnZSwgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NvZGVfcGFnZV9lbmNvZGVfaW1wbChtb2R1bGUsIGNvZGVfcGFnZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTM0MCw4ICsxNDAzLDkgQEAKICAgICBQeU9iamVjdCAqaGFuZGxlcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086cmVnaXN0ZXJfZXJyb3IiLAotICAgICAgICAmZXJyb3JzLCAmaGFuZGxlcikpCisgICAgICAgICZlcnJvcnMsICZoYW5kbGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfcmVnaXN0ZXJfZXJyb3JfaW1wbChtb2R1bGUsIGVycm9ycywgaGFuZGxlcik7CiAKIGV4aXQ6CkBAIC0xMzY5LDggKzE0MzMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6bG9va3VwX2Vycm9yIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXBfZXJyb3IiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xvb2t1cF9lcnJvcl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0xMzkyLDQgKzE0NTcsNCBAQAogI2lmbmRlZiBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19DT0RFX1BBR0VfRU5DT0RFX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MmZlZDk0ZTJhYjc2NWJhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMjIxZTRlZWNlNjJjOTA1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fY3J5cHRtb2R1bGUuYy5oCmluZGV4IGEzYzM3MWMuLjQxMmM2ZmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2NyeXB0bW9kdWxlLmMuaApAQCAtMjcsMTEgKzI3LDEyIEBACiAgICAgY29uc3QgY2hhciAqc2FsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6Y3J5cHQiLAotICAgICAgICAmd29yZCwgJnNhbHQpKQorICAgICAgICAmd29yZCwgJnNhbHQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY3J5cHRfY3J5cHRfaW1wbChtb2R1bGUsIHdvcmQsIHNhbHQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTA0OTNhOTY5MTUzNzY5MCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGRmYzg4MjY0ZTY2MmRmNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fY3Vyc2VzbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCmluZGV4IDVlMTE3NDIuLjYyZmYxYzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCkBAIC00MCwyMiArNDAsMjYgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YWRkY2giLCAmY2gpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmFkZGNoIiwgJmNoKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTzphZGRjaCIsICZ5LCAmeCwgJmNoKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPOmFkZGNoIiwgJnksICZ4LCAmY2gpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpT2w6YWRkY2giLCAmeSwgJngsICZjaCwgJmF0dHIpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU9sOmFkZGNoIiwgJnksICZ4LCAmY2gsICZhdHRyKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgsNCArNzIsNCBAQAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MmIxZTcwOTU3N2YzZWMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTEzZmZjNWY4ZDc5Y2JmYmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19kYXRldGltZW1vZHVsZS5jLmgKaW5kZXggNjg4YzkwMy4uY2YwOTIwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZGF0ZXRpbWVtb2R1bGUuYy5oCkBAIC0yMywxNSArMjMsMTcgQEAKIGRhdGV0aW1lX2RhdGV0aW1lX25vdyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidHoiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOm5vdyIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnR6ID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOm5vdyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnR6KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0eikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkYXRldGltZV9kYXRldGltZV9ub3dfaW1wbCh0eXBlLCB0eik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZjQ1YzY3MGQ2ZTQ5NTNhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MWY4NWFmNTYzN2RmOGI1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKaW5kZXggNDljYmNlYi4uMDZjZjdlNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKQEAgLTYwLDggKzYwLDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKLSAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9kYm1fZGJtX2dldF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC05Myw4ICs5NCw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOnNldGRlZmF1bHQiLAotICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2RibV9kYm1fc2V0ZGVmYXVsdF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMzEsMTEgKzEzMywxMiBAQAogICAgIGludCBtb2RlID0gNDM4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHNpOm9wZW4iLAotICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKQorICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGJtb3Blbl9pbXBsKG1vZHVsZSwgZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZmZjEyZjE2OGNkZjhiNDMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk5YWRmOTY2ZWYwNDc1ZmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaCBiL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKaW5kZXggODZiNGM0Yy4uYzkxZGZiZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCkBAIC0xOSw4ICsxOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2FwcGVuZF9pbXBsKHNlbGYsIHN1YmVsZW1lbnQpOwogCiBleGl0OgpAQCAtODcsOCArODgsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9fX3NpemVvZl9fX2ltcGwoc2VsZik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0NCwxMyArMTQ2LDE1IEBACiBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xPOmZpbmQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpwYXRoOwogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpmaW5kIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmRfaW1wbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTE3NCwxNCArMTc4LDE2IEBACiBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kdGV4dChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZGVmYXVsdCIsICJuYW1lc3BhY2VzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkZWZhdWx0IiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE9POmZpbmR0ZXh0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0aDsKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAgICAgUHlPYmplY3QgKm5hbWVzcGFjZXMgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPTzpmaW5kdGV4dCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZkZWZhdWx0X3ZhbHVlLCAmbmFtZXNwYWNlcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcGF0aCwgJmRlZmF1bHRfdmFsdWUsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmR0ZXh0X2ltcGwoc2VsZiwgcGF0aCwgZGVmYXVsdF92YWx1ZSwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yMDQsMTMgKzIxMCwxNSBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfZmluZGFsbChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibmFtZXNwYWNlcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibmFtZXNwYWNlcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98TzpmaW5kYWxsIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0aDsKICAgICBQeU9iamVjdCAqbmFtZXNwYWNlcyA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE86ZmluZGFsbCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoLCAmbmFtZXNwYWNlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9maW5kYWxsX2ltcGwoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yMzMsMTMgKzI0MSwxNSBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcmZpbmQoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWVzcGFjZXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86aXRlcmZpbmQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpwYXRoOwogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzppdGVyZmluZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoLCAmbmFtZXNwYWNlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9pdGVyZmluZF9pbXBsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpOwogCiBleGl0OgpAQCAtMjYyLDEzICsyNzIsMTUgQEAKIF9lbGVtZW50dHJlZV9FbGVtZW50X2dldChFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtleSIsICJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgImRlZmF1bHQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86Z2V0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqa2V5OwogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpnZXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2dldF9pbXBsKHNlbGYsIGtleSwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMDcsMTIgKzMxOSwxNCBAQAogX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InRhZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InRhZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOml0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICp0YWcgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86aXRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnRhZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmdGFnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2l0ZXJfaW1wbChzZWxmLCB0YWcpOwogCiBleGl0OgpAQCAtMzU2LDggKzM3MCw5IEBACiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PITppbnNlcnQiLAotICAgICAgICAmaW5kZXgsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICAgICAgJmluZGV4LCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9pbnNlcnRfaW1wbChzZWxmLCBpbmRleCwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00MTksOCArNDM0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm1ha2VlbGVtZW50IiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJnRhZywgJmF0dHJpYikpCisgICAgICAgICZ0YWcsICZhdHRyaWIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfbWFrZWVsZW1lbnRfaW1wbChzZWxmLCB0YWcsIGF0dHJpYik7CiAKIGV4aXQ6CkBAIC00NDQsOCArNDYwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3ViZWxlbWVudDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfcmVtb3ZlX2ltcGwoc2VsZiwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00NzMsOCArNDkwLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldCIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZrZXksICZ2YWx1ZSkpCisgICAgICAgICZrZXksICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9zZXRfaW1wbChzZWxmLCBrZXksIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQ4OSwxMiArNTA3LDE0IEBACiBfZWxlbWVudHRyZWVfVHJlZUJ1aWxkZXJfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImVsZW1lbnRfZmFjdG9yeSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImVsZW1lbnRfZmFjdG9yeSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOlRyZWVCdWlsZGVyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZWxlbWVudF9mYWN0b3J5ID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOlRyZWVCdWlsZGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZWxlbWVudF9mYWN0b3J5KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZlbGVtZW50X2ZhY3RvcnkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX19faW5pdF9fX2ltcGwoKFRyZWVCdWlsZGVyT2JqZWN0ICopc2VsZiwgZWxlbWVudF9mYWN0b3J5KTsKIAogZXhpdDoKQEAgLTU1NSw4ICs1NzUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhcnQiLAogICAgICAgICAxLCAyLAotICAgICAgICAmdGFnLCAmYXR0cnMpKQorICAgICAgICAmdGFnLCAmYXR0cnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX3N0YXJ0X2ltcGwoc2VsZiwgdGFnLCBhdHRycyk7CiAKIGV4aXQ6CkBAIC01NzEsMTQgKzU5MiwxNiBAQAogX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaHRtbCIsICJ0YXJnZXQiLCAiZW5jb2RpbmciLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJodG1sIiwgInRhcmdldCIsICJlbmNvZGluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPT3o6WE1MUGFyc2VyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqaHRtbCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnRhcmdldCA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9PejpYTUxQYXJzZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZodG1sLCAmdGFyZ2V0LCAmZW5jb2RpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmh0bWwsICZ0YXJnZXQsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19faW5pdF9fX2ltcGwoKFhNTFBhcnNlck9iamVjdCAqKXNlbGYsIGh0bWwsIHRhcmdldCwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtNjQwLDggKzY2Myw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkb2N0eXBlIiwKICAgICAgICAgMywgMywKLSAgICAgICAgJm5hbWUsICZwdWJpZCwgJnN5c3RlbSkpCisgICAgICAgICZuYW1lLCAmcHViaWQsICZzeXN0ZW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9kb2N0eXBlX2ltcGwoc2VsZiwgbmFtZSwgcHViaWQsIHN5c3RlbSk7CiAKIGV4aXQ6CkBAIC02NjgsMTIgKzY5MiwxNCBAQAogICAgIFB5T2JqZWN0ICpldmVudHNfcXVldWU7CiAgICAgUHlPYmplY3QgKmV2ZW50c190b19yZXBvcnQgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOl9zZXRldmVudHMiLAotICAgICAgICAmUHlMaXN0X1R5cGUsICZldmVudHNfcXVldWUsICZldmVudHNfdG9fcmVwb3J0KSkKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJfc2V0ZXZlbnRzIiwKKyAgICAgICAgMSwgMiwKKyAgICAgICAgJmV2ZW50c19xdWV1ZSwgJmV2ZW50c190b19yZXBvcnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fc2V0ZXZlbnRzX2ltcGwoc2VsZiwgZXZlbnRzX3F1ZXVlLCBldmVudHNfdG9fcmVwb3J0KTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTI1YjhiZjdlN2YyMTUxY2EgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRjNWU5NGMyOGEwMDljZTYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oCmluZGV4IDJkODdjZmMuLmZkZDU4OWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19nZGJtbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZ2RibW1vZHVsZS5jLmgKQEAgLTIzLDggKzIzLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9nZXRfaW1wbChzZWxmLCBrZXksIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTMsOCArNTQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0ZGVmYXVsdCIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9zZXRkZWZhdWx0X2ltcGwoc2VsZiwga2V5LCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0Nyw4ICsxNDksOSBAQAogICAgIGNvbnN0IGNoYXIgKmtleTsKICAgICBQeV9zc2l6ZV9jbGVhbl90IGtleV9sZW5ndGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOm5leHRrZXkiLCAma2V5LCAma2V5X2xlbmd0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpuZXh0a2V5IiwgJmtleSwgJmtleV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2dkYm1fZ2RibV9uZXh0a2V5X2ltcGwoc2VsZiwga2V5LCBrZXlfbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTI0MiwxMSArMjQ1LDEyIEBACiAgICAgaW50IG1vZGUgPSA0Mzg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8c2k6b3BlbiIsCi0gICAgICAgICZuYW1lLCAmZmxhZ3MsICZtb2RlKSkKKyAgICAgICAgJm5hbWUsICZmbGFncywgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGJtb3Blbl9pbXBsKG1vZHVsZSwgbmFtZSwgZmxhZ3MsIG1vZGUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OWFjN2E4OTg1OGE5NzY1ZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWQwZjVkNGUzZDc5YjgwYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9faGFzaG9wZW5zc2wuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2hhc2hvcGVuc3NsLmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9jbGluaWMvX2hhc2hvcGVuc3NsLmMuaApAQCAtMCwwICsxLDYwIEBACisvKltjbGluaWMgaW5wdXRdCitwcmVzZXJ2ZQorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPiAweDEwMTAwMDAwTCAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NDUllQVCkgJiYgIWRlZmluZWQoTElCUkVTU0xfVkVSU0lPTl9OVU1CRVIpKQorCitQeURvY19TVFJWQVIoX2hhc2hsaWJfc2NyeXB0X19kb2NfXywKKyJzY3J5cHQoJG1vZHVsZSwgLywgcGFzc3dvcmQsICosIHNhbHQ9Tm9uZSwgbj1Ob25lLCByPU5vbmUsIHA9Tm9uZSxcbiIKKyIgICAgICAgbWF4bWVtPTAsIGRrbGVuPTY0KVxuIgorIi0tXG4iCisiXG4iCisic2NyeXB0IHBhc3N3b3JkLWJhc2VkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLiIpOworCisjZGVmaW5lIF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYgICAgXAorICAgIHsic2NyeXB0IiwgKFB5Q0Z1bmN0aW9uKV9oYXNobGliX3NjcnlwdCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIF9oYXNobGliX3NjcnlwdF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorX2hhc2hsaWJfc2NyeXB0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpwYXNzd29yZCwgUHlfYnVmZmVyICpzYWx0LAorICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5fb2JqLCBQeU9iamVjdCAqcl9vYmosIFB5T2JqZWN0ICpwX29iaiwKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4bWVtLCBsb25nIGRrbGVuKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK19oYXNobGliX3NjcnlwdChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXNzd29yZCIsICJzYWx0IiwgIm4iLCAiciIsICJwIiwgIm1heG1lbSIsICJka2xlbiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfCR5Kk8hTyFPIWxsOnNjcnlwdCIsIF9rZXl3b3JkcywgMH07CisgICAgUHlfYnVmZmVyIHBhc3N3b3JkID0ge05VTEwsIE5VTEx9OworICAgIFB5X2J1ZmZlciBzYWx0ID0ge05VTEwsIE5VTEx9OworICAgIFB5T2JqZWN0ICpuX29iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnJfb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqcF9vYmogPSBQeV9Ob25lOworICAgIGxvbmcgbWF4bWVtID0gMDsKKyAgICBsb25nIGRrbGVuID0gNjQ7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXNzd29yZCwgJnNhbHQsICZQeUxvbmdfVHlwZSwgJm5fb2JqLCAmUHlMb25nX1R5cGUsICZyX29iaiwgJlB5TG9uZ19UeXBlLCAmcF9vYmosICZtYXhtZW0sICZka2xlbikpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBfaGFzaGxpYl9zY3J5cHRfaW1wbChtb2R1bGUsICZwYXNzd29yZCwgJnNhbHQsIG5fb2JqLCByX29iaiwgcF9vYmosIG1heG1lbSwgZGtsZW4pOworCitleGl0OgorICAgIC8qIENsZWFudXAgZm9yIHBhc3N3b3JkICovCisgICAgaWYgKHBhc3N3b3JkLm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBhc3N3b3JkKTsKKyAgICB9CisgICAgLyogQ2xlYW51cCBmb3Igc2FsdCAqLworICAgIGlmIChzYWx0Lm9iaikgeworICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnNhbHQpOworICAgIH0KKworICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cit9CisKKyNlbmRpZiAvKiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+IDB4MTAxMDAwMDBMICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0NSWVBUKSAmJiAhZGVmaW5lZChMSUJSRVNTTF9WRVJTSU9OX05VTUJFUikpICovCisKKyNpZm5kZWYgX0hBU0hMSUJfU0NSWVBUX01FVEhPRERFRgorICAgICNkZWZpbmUgX0hBU0hMSUJfU0NSWVBUX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9IQVNITElCX1NDUllQVF9NRVRIT0RERUYpICovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGM1Mzg2Nzg5Zjc3NDMwYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmgKaW5kZXggZjhkMzhlYS4uYzJhYzg5YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BQ29tcHJlc3Nvcl9jb21wcmVzc19pbXBsKHNlbGYsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04OSwxOSArOTEsMjIgQEAKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfZGVjb21wcmVzcyhEZWNvbXByZXNzb3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJtYXhfbGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8bjpkZWNvbXByZXNzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGggPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfG46ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZtYXhfbGVuZ3RoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTM3LDE0ICsxNDIsMTYgQEAKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZvcm1hdCIsICJtZW1saW1pdCIsICJmaWx0ZXJzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgIm1lbWxpbWl0IiwgImZpbHRlcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aU9POkxaTUFEZWNvbXByZXNzb3IiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmb3JtYXQgPSBGT1JNQVRfQVVUTzsKICAgICBQeU9iamVjdCAqbWVtbGltaXQgPSBQeV9Ob25lOwogICAgIFB5T2JqZWN0ICpmaWx0ZXJzID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpT086TFpNQURlY29tcHJlc3NvciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZvcm1hdCwgJm1lbWxpbWl0LCAmZmlsdGVycykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZm9ybWF0LCAmbWVtbGltaXQsICZmaWx0ZXJzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX0xaTUFEZWNvbXByZXNzb3JfX19pbml0X19faW1wbCgoRGVjb21wcmVzc29yICopc2VsZiwgZm9ybWF0LCBtZW1saW1pdCwgZmlsdGVycyk7CiAKIGV4aXQ6CkBAIC0xNzEsOCArMTc4LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hlY2tfaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNfY2hlY2tfc3VwcG9ydGVkIiwgJmNoZWNrX2lkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNfY2hlY2tfc3VwcG9ydGVkIiwgJmNoZWNrX2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX2lzX2NoZWNrX3N1cHBvcnRlZF9pbXBsKG1vZHVsZSwgY2hlY2tfaWQpOwogCiBleGl0OgpAQCAtMTk5LDggKzIwNyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgbHptYV9maWx0ZXIgZmlsdGVyID0ge0xaTUFfVkxJX1VOS05PV04sIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfZW5jb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzIiwgbHptYV9maWx0ZXJfY29udmVydGVyLCAmZmlsdGVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9lbmNvZGVfZmlsdGVyX3Byb3BlcnRpZXMiLCBsem1hX2ZpbHRlcl9jb252ZXJ0ZXIsICZmaWx0ZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfX2VuY29kZV9maWx0ZXJfcHJvcGVydGllc19pbXBsKG1vZHVsZSwgZmlsdGVyKTsKIAogZXhpdDoKQEAgLTIzNCwxNSArMjQzLDE3IEBACiAgICAgUHlfYnVmZmVyIGVuY29kZWRfcHJvcHMgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8meSo6X2RlY29kZV9maWx0ZXJfcHJvcGVydGllcyIsCi0gICAgICAgIGx6bWFfdmxpX2NvbnZlcnRlciwgJmZpbHRlcl9pZCwgJmVuY29kZWRfcHJvcHMpKQorICAgICAgICBsem1hX3ZsaV9jb252ZXJ0ZXIsICZmaWx0ZXJfaWQsICZlbmNvZGVkX3Byb3BzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX19kZWNvZGVfZmlsdGVyX3Byb3BlcnRpZXNfaW1wbChtb2R1bGUsIGZpbHRlcl9pZCwgJmVuY29kZWRfcHJvcHMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGVuY29kZWRfcHJvcHMgKi8KLSAgICBpZiAoZW5jb2RlZF9wcm9wcy5vYmopCisgICAgaWYgKGVuY29kZWRfcHJvcHMub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZW5jb2RlZF9wcm9wcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mYWRhMDYwMjBmZDMxOGNjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NDM0NTgzZmUxMTFjNzcxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19vcGNvZGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKaW5kZXggYTVmNjQ0Mi4uNTEzY2JmZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmgKQEAgLTIzLDE0ICsyMywxNiBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfE86c3RhY2tfZWZmZWN0IiwKLSAgICAgICAgJm9wY29kZSwgJm9wYXJnKSkKKyAgICAgICAgJm9wY29kZSwgJm9wYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfb3Bjb2RlX3N0YWNrX2VmZmVjdF9pbXBsKG1vZHVsZSwgb3Bjb2RlLCBvcGFyZyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4NGQ2ZGUxNDAzMDNkMTAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRkOTFjNmE3NjUwOTc4NTMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3BpY2tsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaAppbmRleCBiZDEyZDJhLi5iOGVlYzMzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaApAQCAtNTMsOCArNTMsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfcGlja2xlX1BpY2tsZXJfX19zaXplb2ZfX19pbXBsKHNlbGYpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC05MiwxNCArOTMsMTYgQEAKIF9waWNrbGVfUGlja2xlcl9fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgaW50IHJldHVybl92YWx1ZSA9IC0xOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAicHJvdG9jb2wiLCAiZml4X2ltcG9ydHMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE9wOlBpY2tsZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpmaWxlOwogICAgIFB5T2JqZWN0ICpwcm90b2NvbCA9IE5VTEw7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98T3A6UGlja2xlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZpbGUsICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX1BpY2tsZXJfX19pbml0X19faW1wbCgoUGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC0yMTIsOCArMjE1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpbmRfY2xhc3MiLAogICAgICAgICAyLCAyLAotICAgICAgICAmbW9kdWxlX25hbWUsICZnbG9iYWxfbmFtZSkpCisgICAgICAgICZtb2R1bGVfbmFtZSwgJmdsb2JhbF9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX2ZpbmRfY2xhc3NfaW1wbChzZWxmLCBtb2R1bGVfbmFtZSwgZ2xvYmFsX25hbWUpOwogCiBleGl0OgpAQCAtMjM5LDggKzI0Myw5IEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19fc2l6ZW9mX19faW1wbChzZWxmKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjgxLDE1ICsyODYsMTcgQEAKIF9waWNrbGVfVW5waWNrbGVyX19faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmaWxlIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZpbGUiLCAiZml4X2ltcG9ydHMiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3wkcHNzOlVucGlja2xlciIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9ICJBU0NJSSI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gInN0cmljdCI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfCRwc3M6VW5waWNrbGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19faW5pdF9fX2ltcGwoKFVucGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIGZpeF9pbXBvcnRzLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTM4NywxNSArMzk0LDE3IEBACiBfcGlja2xlX2R1bXAoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJvYmoiLCAiZmlsZSIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJmaWxlIiwgInByb3RvY29sIiwgImZpeF9pbXBvcnRzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT098TyRwOmR1bXAiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpvYmo7CiAgICAgUHlPYmplY3QgKmZpbGU7CiAgICAgUHlPYmplY3QgKnByb3RvY29sID0gTlVMTDsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT098TyRwOmR1bXAiLCBfa2V5d29yZHMsCi0gICAgICAgICZvYmosICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmb2JqLCAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9kdW1wX2ltcGwobW9kdWxlLCBvYmosIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC00MzEsMTQgKzQ0MCwxNiBAQAogX3BpY2tsZV9kdW1wcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im9iaiIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7Im9iaiIsICJwcm90b2NvbCIsICJmaXhfaW1wb3J0cyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98TyRwOmR1bXBzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqb2JqOwogICAgIFB5T2JqZWN0ICpwcm90b2NvbCA9IE5VTEw7CiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TyRwOmR1bXBzIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmb2JqLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2R1bXBzX2ltcGwobW9kdWxlLCBvYmosIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC00ODUsMTUgKzQ5NiwxNyBAQAogX3BpY2tsZV9sb2FkKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmlsZSIsICJmaXhfaW1wb3J0cyIsICJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJmaWxlIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98JHBzczpsb2FkIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZmlsZTsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gIkFTQ0lJIjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSAic3RyaWN0IjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98JHBzczpsb2FkIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfbG9hZF9pbXBsKG1vZHVsZSwgZmlsZSwgZml4X2ltcG9ydHMsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtNTMxLDE4ICs1NDQsMjAgQEAKIF9waWNrbGVfbG9hZHMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkYXRhIiwgImZpeF9pbXBvcnRzIiwgImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImRhdGEiLCAiZml4X2ltcG9ydHMiLCAiZW5jb2RpbmciLCAiZXJyb3JzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3wkcHNzOmxvYWRzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZGF0YTsKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gIkFTQ0lJIjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSAic3RyaWN0IjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98JHBzczpsb2FkcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2xvYWRzX2ltcGwobW9kdWxlLCBkYXRhLCBmaXhfaW1wb3J0cywgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MzY1N2U1NWQ2YTc0OGFmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MGY5MTI3MTA5NjczYzk4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19zcmUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKaW5kZXggMzI4MTcxNy4uOWFiYTEzZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKQEAgLTIwLDggKzIwLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGNvZGVzaXplX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDgsMTEgKzQ5LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOmdldGxvd2VyIiwKLSAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkKKyAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGxvd2VyX2ltcGwobW9kdWxlLCBjaGFyYWN0ZXIsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNzcsMTUgKzgwLDE3IEBACiBfc3JlX1NSRV9QYXR0ZXJuX21hdGNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86bWF0Y2giLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZHBvcyA9IFBZX1NTSVpFX1RfTUFYOwogICAgIFB5T2JqZWN0ICpwYXR0ZXJuID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzptYXRjaCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9tYXRjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTExLDE1ICsxMTYsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fZnVsbG1hdGNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86ZnVsbG1hdGNoIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86ZnVsbG1hdGNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX2Z1bGxtYXRjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTQ3LDE1ICsxNTQsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fc2VhcmNoKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCAicGF0dGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInBhdHRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T25uJE86c2VhcmNoIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86c2VhcmNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NlYXJjaF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHBhdHRlcm4pOwogCiBleGl0OgpAQCAtMTgxLDE1ICsxOTAsMTcgQEAKIF9zcmVfU1JFX1BhdHRlcm5fZmluZGFsbChQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbm4kTzpmaW5kYWxsIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqc291cmNlID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzpmaW5kYWxsIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmc291cmNlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZzb3VyY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9maW5kYWxsX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcywgc291cmNlKTsKIAogZXhpdDoKQEAgLTIxNSwxNCArMjI2LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX2ZpbmRpdGVyKFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdHJpbmciLCAicG9zIiwgImVuZHBvcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98bm46ZmluZGl0ZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kcG9zID0gUFlfU1NJWkVfVF9NQVg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG5uOmZpbmRpdGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9maW5kaXRlcl9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MpOwogCiBleGl0OgpAQCAtMjQ1LDE0ICsyNTgsMTYgQEAKIF9zcmVfU1JFX1BhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgInBvcyIsICJlbmRwb3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfG5uOnNjYW5uZXIiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kcG9zID0gUFlfU1NJWkVfVF9NQVg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG5uOnNjYW5uZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NjYW5uZXJfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zKTsKIAogZXhpdDoKQEAgLTI3NiwxNCArMjkxLDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3NwbGl0KFBhdHRlcm5PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgIm1heHNwbGl0IiwgInNvdXJjZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsICJtYXhzcGxpdCIsICJzb3VyY2UiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8T24kTzpzcGxpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IDA7CiAgICAgUHlPYmplY3QgKnNvdXJjZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T24kTzpzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJm1heHNwbGl0LCAmc291cmNlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdHJpbmcsICZtYXhzcGxpdCwgJnNvdXJjZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3NwbGl0X2ltcGwoc2VsZiwgc3RyaW5nLCBtYXhzcGxpdCwgc291cmNlKTsKIAogZXhpdDoKQEAgLTMwNywxNCArMzI0LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3N1YihQYXR0ZXJuT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicmVwbCIsICJzdHJpbmciLCAiY291bnQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPT3xuOnN1YiIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnJlcGw7CiAgICAgUHlPYmplY3QgKnN0cmluZzsKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PfG46c3ViIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zdWJfaW1wbChzZWxmLCByZXBsLCBzdHJpbmcsIGNvdW50KTsKIAogZXhpdDoKQEAgLTMzOCwxNCArMzU3LDE2IEBACiBfc3JlX1NSRV9QYXR0ZXJuX3N1Ym4oUGF0dGVybk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJyZXBsIiwgInN0cmluZyIsICJjb3VudCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT098bjpzdWJuIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcmVwbDsKICAgICBQeU9iamVjdCAqc3RyaW5nOwogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT098bjpzdWJuIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zdWJuX2ltcGwoc2VsZiwgcmVwbCwgc3RyaW5nLCBjb3VudCk7CiAKIGV4aXQ6CkBAIC0zODQsMTIgKzQwNSwxNCBAQAogX3NyZV9TUkVfUGF0dGVybl9fX2RlZXBjb3B5X18oUGF0dGVybk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJtZW1vIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsibWVtbyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86X19kZWVwY29weV9fIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqbWVtbzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86X19kZWVwY29weV9fIiwgX2tleXdvcmRzLAotICAgICAgICAmbWVtbykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbWVtbykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX19fZGVlcGNvcHlfX19pbXBsKHNlbGYsIG1lbW8pOwogCiBleGl0OgpAQCAtNDE0LDcgKzQzNyw4IEBACiBfc3JlX2NvbXBpbGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXR0ZXJuIiwgImZsYWdzIiwgImNvZGUiLCAiZ3JvdXBzIiwgImdyb3VwaW5kZXgiLCAiaW5kZXhncm91cCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdHRlcm4iLCAiZmxhZ3MiLCAiY29kZSIsICJncm91cHMiLCAiZ3JvdXBpbmRleCIsICJpbmRleGdyb3VwIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT2lPIW5PTzpjb21waWxlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqcGF0dGVybjsKICAgICBpbnQgZmxhZ3M7CiAgICAgUHlPYmplY3QgKmNvZGU7CkBAIC00MjIsOSArNDQ2LDEwIEBACiAgICAgUHlPYmplY3QgKmdyb3VwaW5kZXg7CiAgICAgUHlPYmplY3QgKmluZGV4Z3JvdXA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaU8hbk9POmNvbXBpbGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZwYXR0ZXJuLCAmZmxhZ3MsICZQeUxpc3RfVHlwZSwgJmNvZGUsICZncm91cHMsICZncm91cGluZGV4LCAmaW5kZXhncm91cCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcGF0dGVybiwgJmZsYWdzLCAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLCAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9jb21waWxlX2ltcGwobW9kdWxlLCBwYXR0ZXJuLCBmbGFncywgY29kZSwgZ3JvdXBzLCBncm91cGluZGV4LCBpbmRleGdyb3VwKTsKIAogZXhpdDoKQEAgLTQ0NywxMiArNDcyLDE0IEBACiBfc3JlX1NSRV9NYXRjaF9leHBhbmQoTWF0Y2hPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidGVtcGxhdGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0ZW1wbGF0ZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86ZXhwYW5kIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqdGVtcGxhdGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOmV4cGFuZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnRlbXBsYXRlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0ZW1wbGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9leHBhbmRfaW1wbChzZWxmLCB0ZW1wbGF0ZSk7CiAKIGV4aXQ6CkBAIC00NzgsMTIgKzUwNSwxNCBAQAogX3NyZV9TUkVfTWF0Y2hfZ3JvdXBzKE1hdGNoT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRlZmF1bHQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86Z3JvdXBzIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8Tzpncm91cHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZkZWZhdWx0X3ZhbHVlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2dyb3Vwc19pbXBsKHNlbGYsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTA5LDEyICs1MzgsMTQgQEAKIF9zcmVfU1JFX01hdGNoX2dyb3VwZGljdChNYXRjaE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkZWZhdWx0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZGVmYXVsdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOmdyb3VwZGljdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86Z3JvdXBkaWN0IiwgX2tleXdvcmRzLAotICAgICAgICAmZGVmYXVsdF92YWx1ZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9ncm91cGRpY3RfaW1wbChzZWxmLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU0MiwxMSArNTczLDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGFydCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZncm91cCkpCisgICAgICAgICZncm91cCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfc3RhcnRfaW1wbChzZWxmLCBncm91cCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU3NCwxMSArNjA3LDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJlbmQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmZ3JvdXApKQorICAgICAgICAmZ3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2VuZF9pbXBsKHNlbGYsIGdyb3VwKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjA1LDggKzY0MCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzcGFuIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgJmdyb3VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX3NwYW5faW1wbChzZWxmLCBncm91cCk7CiAKIGV4aXQ6CkBAIC02NDUsMTIgKzY4MSwxNCBAQAogX3NyZV9TUkVfTWF0Y2hfX19kZWVwY29weV9fKE1hdGNoT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im1lbW8iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJtZW1vIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICptZW1vOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZtZW1vKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZtZW1vKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX19fZGVlcGNvcHlfX19pbXBsKHNlbGYsIG1lbW8pOwogCiBleGl0OgpAQCAtNjkwLDQgKzcyOCw0IEBACiB7CiAgICAgcmV0dXJuIF9zcmVfU1JFX1NjYW5uZXJfc2VhcmNoX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTRjZTllNWI3NDhjZTUzMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmNiYzJiMTQ4MjczOGU1NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fc3NsLmMuaCBiL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCmluZGV4IDg1MmUzNjUuLmVlODIxM2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19zc2wuYy5oCkBAIC0zNiw4ICszNiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl90ZXN0X2RlY29kZV9jZXJ0IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfdGVzdF9kZWNvZGVfY2VydCIsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fdGVzdF9kZWNvZGVfY2VydF9pbXBsKG1vZHVsZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC03MSw4ICs3Miw5IEBACiAgICAgaW50IGJpbmFyeV9tb2RlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHA6cGVlcl9jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICZiaW5hcnlfbW9kZSkpCisgICAgICAgICZiaW5hcnlfbW9kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xTb2NrZXRfcGVlcl9jZXJ0aWZpY2F0ZV9pbXBsKHNlbGYsIGJpbmFyeV9tb2RlKTsKIAogZXhpdDoKQEAgLTIwOSwxNCArMjExLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xTb2NrZXRfd3JpdGVfaW1wbChzZWxmLCAmYik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYiAqLwotICAgIGlmIChiLm9iaikKKyAgICBpZiAoYi5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZiKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjYwLDEyICsyNjQsMTQgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZCIsICZsZW4pKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmbGVuKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml3KjpyZWFkIiwgJmxlbiwgJmJ1ZmZlcikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml3KjpyZWFkIiwgJmxlbiwgJmJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjc2LDggKzI4Miw5IEBACiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMzIsMTEgKzMzOSwxMyBAQAogICAgIGludCBwcm90b192ZXJzaW9uOwogCiAgICAgaWYgKCh0eXBlID09ICZQeVNTTENvbnRleHRfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJfU1NMQ29udGV4dCIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiX1NTTENvbnRleHQiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOl9TU0xDb250ZXh0IiwKLSAgICAgICAgJnByb3RvX3ZlcnNpb24pKQorICAgICAgICAmcHJvdG9fdmVyc2lvbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2ltcGwodHlwZSwgcHJvdG9fdmVyc2lvbik7CiAKIGV4aXQ6CkBAIC0zNjAsMTQgKzM2OSwzNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmNpcGhlcmxpc3Q7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6c2V0X2NpcGhlcnMiLCAmY2lwaGVybGlzdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnNldF9jaXBoZXJzIiwgJmNpcGhlcmxpc3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9zZXRfY2lwaGVyc19pbXBsKHNlbGYsIGNpcGhlcmxpc3QpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CiAKKyNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMDAyMDAwVUwpCisKK1B5RG9jX1NUUlZBUihfc3NsX19TU0xDb250ZXh0X2dldF9jaXBoZXJzX19kb2NfXywKKyJnZXRfY2lwaGVycygkc2VsZiwgLylcbiIKKyItLVxuIgorIlxuIik7CisKKyNkZWZpbmUgX1NTTF9fU1NMQ09OVEVYVF9HRVRfQ0lQSEVSU19NRVRIT0RERUYgICAgXAorICAgIHsiZ2V0X2NpcGhlcnMiLCAoUHlDRnVuY3Rpb24pX3NzbF9fU1NMQ29udGV4dF9nZXRfY2lwaGVycywgTUVUSF9OT0FSR1MsIF9zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfX2RvY19ffSwKKworc3RhdGljIFB5T2JqZWN0ICoKK19zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChQeVNTTENvbnRleHQgKnNlbGYpOworCitzdGF0aWMgUHlPYmplY3QgKgorX3NzbF9fU1NMQ29udGV4dF9nZXRfY2lwaGVycyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICpQeV9VTlVTRUQoaWdub3JlZCkpCit7CisgICAgcmV0dXJuIF9zc2xfX1NTTENvbnRleHRfZ2V0X2NpcGhlcnNfaW1wbChzZWxmKTsKK30KKworI2VuZGlmIC8qIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAwMDIwMDBVTCkgKi8KKwogUHlEb2NfU1RSVkFSKF9zc2xfX1NTTENvbnRleHRfX3NldF9ucG5fcHJvdG9jb2xzX19kb2NfXywKICJfc2V0X25wbl9wcm90b2NvbHMoJHNlbGYsIHByb3RvcywgLylcbiIKICItLVxuIgpAQCAtMzg2LDE0ICs0MTcsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgcHJvdG9zID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpfc2V0X25wbl9wcm90b2NvbHMiLCAmcHJvdG9zKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOl9zZXRfbnBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X25wbl9wcm90b2NvbHNfaW1wbChzZWxmLCAmcHJvdG9zKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBwcm90b3MgKi8KLSAgICBpZiAocHJvdG9zLm9iaikKKyAgICBpZiAocHJvdG9zLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnByb3Rvcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQxNiwxNCArNDQ5LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIHByb3RvcyA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X2FscG5fcHJvdG9jb2xzX2ltcGwoc2VsZiwgJnByb3Rvcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgcHJvdG9zICovCi0gICAgaWYgKHByb3Rvcy5vYmopCisgICAgaWYgKHByb3Rvcy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwcm90b3MpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NDQsMTQgKzQ3OSwxNiBAQAogX3NzbF9fU1NMQ29udGV4dF9sb2FkX2NlcnRfY2hhaW4oUHlTU0xDb250ZXh0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImNlcnRmaWxlIiwgImtleWZpbGUiLCAicGFzc3dvcmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjZXJ0ZmlsZSIsICJrZXlmaWxlIiwgInBhc3N3b3JkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT3xPTzpsb2FkX2NlcnRfY2hhaW4iLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpjZXJ0ZmlsZTsKICAgICBQeU9iamVjdCAqa2V5ZmlsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhc3N3b3JkID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98T086bG9hZF9jZXJ0X2NoYWluIiwgX2tleXdvcmRzLAotICAgICAgICAmY2VydGZpbGUsICZrZXlmaWxlLCAmcGFzc3dvcmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmNlcnRmaWxlLCAma2V5ZmlsZSwgJnBhc3N3b3JkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfbG9hZF9jZXJ0X2NoYWluX2ltcGwoc2VsZiwgY2VydGZpbGUsIGtleWZpbGUsIHBhc3N3b3JkKTsKIAogZXhpdDoKQEAgLTQ3NiwxNCArNTEzLDE2IEBACiBfc3NsX19TU0xDb250ZXh0X2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiY2FmaWxlIiwgImNhcGF0aCIsICJjYWRhdGEiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjYWZpbGUiLCAiY2FwYXRoIiwgImNhZGF0YSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPT086bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqY2FmaWxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqY2FwYXRoID0gTlVMTDsKICAgICBQeU9iamVjdCAqY2FkYXRhID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPT086bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgX2tleXdvcmRzLAotICAgICAgICAmY2FmaWxlLCAmY2FwYXRoLCAmY2FkYXRhKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZjYWZpbGUsICZjYXBhdGgsICZjYWRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnNfaW1wbChzZWxmLCBjYWZpbGUsIGNhcGF0aCwgY2FkYXRhKTsKIAogZXhpdDoKQEAgLTUxNCwxNCArNTUzLDE2IEBACiBfc3NsX19TU0xDb250ZXh0X193cmFwX3NvY2tldChQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic29jayIsICJzZXJ2ZXJfc2lkZSIsICJzZXJ2ZXJfaG9zdG5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzb2NrIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8haXxPOl93cmFwX3NvY2tldCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNvY2s7CiAgICAgaW50IHNlcnZlcl9zaWRlOwogICAgIFB5T2JqZWN0ICpob3N0bmFtZV9vYmogPSBQeV9Ob25lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyFpfE86X3dyYXBfc29ja2V0IiwgX2tleXdvcmRzLAotICAgICAgICBQeVNvY2tldE1vZHVsZS5Tb2NrX1R5cGUsICZzb2NrLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLCAmc29jaywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfc29ja2V0X2ltcGwoc2VsZiwgc29jaywgc2VydmVyX3NpZGUsIGhvc3RuYW1lX29iaik7CiAKIGV4aXQ6CkBAIC01NDYsMTUgKzU4NywxNyBAQAogX3NzbF9fU1NMQ29udGV4dF9fd3JhcF9iaW8oUHlTU0xDb250ZXh0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImluY29taW5nIiwgIm91dGdvaW5nIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImluY29taW5nIiwgIm91dGdvaW5nIiwgInNlcnZlcl9zaWRlIiwgInNlcnZlcl9ob3N0bmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8hTyFpfE86X3dyYXBfYmlvIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeVNTTE1lbW9yeUJJTyAqaW5jb21pbmc7CiAgICAgUHlTU0xNZW1vcnlCSU8gKm91dGdvaW5nOwogICAgIGludCBzZXJ2ZXJfc2lkZTsKICAgICBQeU9iamVjdCAqaG9zdG5hbWVfb2JqID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8hTyFpfE86X3dyYXBfYmlvIiwgX2tleXdvcmRzLAotICAgICAgICAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJmluY29taW5nLCAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJm91dGdvaW5nLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZpbmNvbWluZywgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZvdXRnb2luZywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfYmlvX2ltcGwoc2VsZiwgaW5jb21pbmcsIG91dGdvaW5nLCBzZXJ2ZXJfc2lkZSwgaG9zdG5hbWVfb2JqKTsKIAogZXhpdDoKQEAgLTY2NiwxMiArNzA5LDE0IEBACiBfc3NsX19TU0xDb250ZXh0X2dldF9jYV9jZXJ0cyhQeVNTTENvbnRleHQgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiYmluYXJ5X2Zvcm0iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJiaW5hcnlfZm9ybSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxwOmdldF9jYV9jZXJ0cyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGJpbmFyeV9mb3JtID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxwOmdldF9jYV9jZXJ0cyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmJpbmFyeV9mb3JtKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZiaW5hcnlfZm9ybSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2dldF9jYV9jZXJ0c19pbXBsKHNlbGYsIGJpbmFyeV9mb3JtKTsKIAogZXhpdDoKQEAgLTY4NywxMSArNzMyLDEzIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoKHR5cGUgPT0gJlB5U1NMTWVtb3J5QklPX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJNZW1vcnlCSU8iLCBhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIk1lbW9yeUJJTyIsIGFyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCh0eXBlID09ICZQeVNTTE1lbW9yeUJJT19UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIk1lbW9yeUJJTyIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiTWVtb3J5QklPIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfTWVtb3J5QklPX2ltcGwodHlwZSk7CiAKIGV4aXQ6CkBAIC03MjIsOCArNzY5LDkgQEAKICAgICBpbnQgbGVuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWQiLAotICAgICAgICAmbGVuKSkKKyAgICAgICAgJmxlbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT19yZWFkX2ltcGwoc2VsZiwgbGVuKTsKIAogZXhpdDoKQEAgLTc1MCwxNCArNzk4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MDUsMTQgKzg1NSwxNiBAQAogICAgIGRvdWJsZSBlbnRyb3B5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKmQ6UkFORF9hZGQiLAotICAgICAgICAmdmlldywgJmVudHJvcHkpKQorICAgICAgICAmdmlldywgJmVudHJvcHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX2FkZF9pbXBsKG1vZHVsZSwgJnZpZXcsIGVudHJvcHkpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHZpZXcgKi8KLSAgICBpZiAodmlldy5vYmopCisgICAgaWYgKHZpZXcub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgzNSw4ICs4ODcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfYnl0ZXNfaW1wbChtb2R1bGUsIG4pOwogCiBleGl0OgpAQCAtODY0LDggKzkxNyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG47CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9wc2V1ZG9fYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfcHNldWRvX2J5dGVzIiwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX3BzZXVkb19ieXRlc19pbXBsKG1vZHVsZSwgbik7CiAKIGV4aXQ6CkBAIC05MTYsOCArOTcwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UkFORF9lZ2QiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlJBTkRfZWdkIiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfZWdkX2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTk2NSwxMyArMTAyMCwxNSBAQAogX3NzbF90eHQyb2JqKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsidHh0IiwgIm5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ0eHQiLCAibmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InN8cDp0eHQyb2JqIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICp0eHQ7CiAgICAgaW50IG5hbWUgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xwOnR4dDJvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZ0eHQsICZuYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0eHQsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfdHh0Mm9ial9pbXBsKG1vZHVsZSwgdHh0LCBuYW1lKTsKIAogZXhpdDoKQEAgLTk5Niw4ICsxMDUzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOm5pZDJvYmoiLCAmbmlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmlkMm9iaiIsICZuaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9uaWQyb2JqX2ltcGwobW9kdWxlLCBuaWQpOwogCiBleGl0OgpAQCAtMTAyOCwxMiArMTA4NiwxNCBAQAogX3NzbF9lbnVtX2NlcnRpZmljYXRlcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0b3JlX25hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdG9yZV9uYW1lIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiczplbnVtX2NlcnRpZmljYXRlcyIsIF9rZXl3b3JkcywgMH07CiAgICAgY29uc3QgY2hhciAqc3RvcmVfbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInM6ZW51bV9jZXJ0aWZpY2F0ZXMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdG9yZV9uYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jZXJ0aWZpY2F0ZXNfaW1wbChtb2R1bGUsIHN0b3JlX25hbWUpOwogCiBleGl0OgpAQCAtMTA2NSwxMiArMTEyNSwxNCBAQAogX3NzbF9lbnVtX2NybHMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdG9yZV9uYW1lIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RvcmVfbmFtZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InM6ZW51bV9jcmxzIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICpzdG9yZV9uYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiczplbnVtX2NybHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdG9yZV9uYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jcmxzX2ltcGwobW9kdWxlLCBzdG9yZV9uYW1lKTsKIAogZXhpdDoKQEAgLTEwODcsNiArMTE0OSwxMCBAQAogICAgICNkZWZpbmUgX1NTTF9fU1NMU09DS0VUX1NFTEVDVEVEX0FMUE5fUFJPVE9DT0xfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1NTTF9fU1NMU09DS0VUX1NFTEVDVEVEX0FMUE5fUFJPVE9DT0xfTUVUSE9EREVGKSAqLwogCisjaWZuZGVmIF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGCisgICAgI2RlZmluZSBfU1NMX19TU0xDT05URVhUX0dFVF9DSVBIRVJTX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKF9TU0xfX1NTTENPTlRFWFRfR0VUX0NJUEhFUlNfTUVUSE9EREVGKSAqLworCiAjaWZuZGVmIF9TU0xfX1NTTENPTlRFWFRfU0VUX0VDREhfQ1VSVkVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU1NMX19TU0xDT05URVhUX1NFVF9FQ0RIX0NVUlZFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9TU0xfX1NTTENPTlRFWFRfU0VUX0VDREhfQ1VSVkVfTUVUSE9EREVGKSAqLwpAQCAtMTEwMiw0ICsxMTY4LDQgQEAKICNpZm5kZWYgX1NTTF9FTlVNX0NSTFNfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmZiMTA1OTRkODM1MWRjNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmU3OTA3YTdkOGY5N2NjZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmgKaW5kZXggNzdhZjA4My4uZWRkNTM4MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3RraW50ZXIuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL190a2ludGVyLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNjcmlwdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpldmFsIiwgJnNjcmlwdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWwiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V2YWxfaW1wbChzZWxmLCBzY3JpcHQpOwogCiBleGl0OgpAQCAtNDQsOCArNDUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZXZhbGZpbGVfaW1wbChzZWxmLCBmaWxlTmFtZSk7CiAKIGV4aXQ6CkBAIC02OSw4ICs3MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2NyaXB0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnJlY29yZCIsICZzY3JpcHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpyZWNvcmQiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX3JlY29yZF9pbXBsKHNlbGYsIHNjcmlwdCk7CiAKIGV4aXQ6CkBAIC05NCw4ICs5Nyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbXNnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmFkZGVycmluZm8iLCAmbXNnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6YWRkZXJyaW5mbyIsICZtc2cpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfYWRkZXJyaW5mb19pbXBsKHNlbGYsIG1zZyk7CiAKIGV4aXQ6CkBAIC0xNDMsOCArMTQ3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByc3RyaW5nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xNjgsOCArMTczLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJsb25nIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHBybG9uZyIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJsb25nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xOTMsOCArMTk5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByZG91YmxlX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yMTgsOCArMjI1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJib29sZWFuIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByYm9vbGVhbiIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJib29sZWFuX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yNjIsOCArMjcwLDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsCi0gICAgICAgICZuYW1lLCAmZnVuYykpCisgICAgICAgICZuYW1lLCAmZnVuYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9jcmVhdGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSwgZnVuYyk7CiAKIGV4aXQ6CkBAIC0yODcsOCArMjk2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9kZWxldGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0zMTgsOCArMzI4LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPOmNyZWF0ZWZpbGVoYW5kbGVyIiwKLSAgICAgICAgJmZpbGUsICZtYXNrLCAmZnVuYykpCisgICAgICAgICZmaWxlLCAmbWFzaywgJmZ1bmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfY3JlYXRlZmlsZWhhbmRsZXJfaW1wbChzZWxmLCBmaWxlLCBtYXNrLCBmdW5jKTsKIAogZXhpdDoKQEAgLTM3Nyw4ICszODgsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpjcmVhdGV0aW1lcmhhbmRsZXIiLAotICAgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpCisgICAgICAgICZtaWxsaXNlY29uZHMsICZmdW5jKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2NyZWF0ZXRpbWVyaGFuZGxlcl9pbXBsKHNlbGYsIG1pbGxpc2Vjb25kcywgZnVuYyk7CiAKIGV4aXQ6CkBAIC00MDMsOCArNDE1LDkgQEAKICAgICBpbnQgdGhyZXNob2xkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6bWFpbmxvb3AiLAotICAgICAgICAmdGhyZXNob2xkKSkKKyAgICAgICAgJnRocmVzaG9sZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9tYWlubG9vcF9pbXBsKHNlbGYsIHRocmVzaG9sZCk7CiAKIGV4aXQ6CkBAIC00MjksOCArNDQyLDkgQEAKICAgICBpbnQgZmxhZ3MgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkb29uZWV2ZW50IiwKLSAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2Rvb25lZXZlbnRfaW1wbChzZWxmLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC01NTEsOCArNTY1LDkgQEAKICAgICBjb25zdCBjaGFyICp1c2UgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enNzaWlpaXo6Y3JlYXRlIiwKLSAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkKKyAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX2NyZWF0ZV9pbXBsKG1vZHVsZSwgc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCB3YW50VGssIHN5bmMsIHVzZSk7CiAKIGV4aXQ6CkBAIC01NzksOCArNTk0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmV3X3ZhbDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbF9pbXBsKG1vZHVsZSwgbmV3X3ZhbCk7CiAKIGV4aXQ6CkBAIC02MDYsOCArNjIyLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjIxLDQgKzYzOCw0IEBACiAjaWZuZGVmIF9US0lOVEVSX1RLQVBQX0RFTEVURUZJTEVIQU5ETEVSX01FVEhPRERFRgogICAgICNkZWZpbmUgX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY5MDU3YzhiZjI4ODYzM2QgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgzNmM1NzhiNzFkNjkwOTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oCmluZGV4IGI4M2IzM2UuLmMxOTJlNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL193ZWFrcmVmLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2Vha3JlZi5jLmgKQEAgLTIxLDExICsyMSwxMiBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2Vha3JlZl9nZXR3ZWFrcmVmY291bnRfaW1wbChtb2R1bGUsIG9iamVjdCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ5MDg2Yzg1NzZkNDY5MzMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUxYWQ1ODcxNDczMjNlMTkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAppbmRleCBhYzM4ZDM3Li40NGQ0OGE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB3YWl0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX092ZXJsYXBwZWRfR2V0T3ZlcmxhcHBlZFJlc3VsdF9pbXBsKHNlbGYsIHdhaXQpOwogCiBleGl0OgpAQCAtNzksOCArODAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhBTkRMRSBoYW5kbGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpDbG9zZUhhbmRsZSIsICZoYW5kbGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkNsb3NlSGFuZGxlIiwgJmhhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0Nsb3NlSGFuZGxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwogCiBleGl0OgpAQCAtMTAzLDEzICsxMDUsMTUgQEAKIF93aW5hcGlfQ29ubmVjdE5hbWVkUGlwZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJvdmVybGFwcGVkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaGFuZGxlIiwgIm92ZXJsYXBwZWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyIiIEZfSEFORExFICJ8aTpDb25uZWN0TmFtZWRQaXBlIiwgX2tleXdvcmRzLCAwfTsKICAgICBIQU5ETEUgaGFuZGxlOwogICAgIGludCB1c2Vfb3ZlcmxhcHBlZCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIEZfSEFORExFICJ8aTpDb25uZWN0TmFtZWRQaXBlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmdXNlX292ZXJsYXBwZWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmhhbmRsZSwgJnVzZV9vdmVybGFwcGVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ29ubmVjdE5hbWVkUGlwZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCB1c2Vfb3ZlcmxhcHBlZCk7CiAKIGV4aXQ6CkBAIC0xNDcsMTMgKzE1MSwxNiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJza2siIEZfUE9JTlRFUiAia2siIEZfSEFORExFICI6Q3JlYXRlRmlsZSIsCi0gICAgICAgICZmaWxlX25hbWUsICZkZXNpcmVkX2FjY2VzcywgJnNoYXJlX21vZGUsICZzZWN1cml0eV9hdHRyaWJ1dGVzLCAmY3JlYXRpb25fZGlzcG9zaXRpb24sICZmbGFnc19hbmRfYXR0cmlidXRlcywgJnRlbXBsYXRlX2ZpbGUpKQorICAgICAgICAmZmlsZV9uYW1lLCAmZGVzaXJlZF9hY2Nlc3MsICZzaGFyZV9tb2RlLCAmc2VjdXJpdHlfYXR0cmlidXRlcywgJmNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCAmZmxhZ3NfYW5kX2F0dHJpYnV0ZXMsICZ0ZW1wbGF0ZV9maWxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZUZpbGVfaW1wbChtb2R1bGUsIGZpbGVfbmFtZSwgZGVzaXJlZF9hY2Nlc3MsIHNoYXJlX21vZGUsIHNlY3VyaXR5X2F0dHJpYnV0ZXMsIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCBmbGFnc19hbmRfYXR0cmlidXRlcywgdGVtcGxhdGVfZmlsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTgwLDggKzE4Nyw5IEBACiAgICAgTFBXU1RSIGRzdF9wYXRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1dTpDcmVhdGVKdW5jdGlvbiIsCi0gICAgICAgICZzcmNfcGF0aCwgJmRzdF9wYXRoKSkKKyAgICAgICAgJnNyY19wYXRoLCAmZHN0X3BhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVKdW5jdGlvbl9pbXBsKG1vZHVsZSwgc3JjX3BhdGgsIGRzdF9wYXRoKTsKIAogZXhpdDoKQEAgLTIyMCwxMyArMjI4LDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNra2tra2siIEZfUE9JTlRFUiAiOkNyZWF0ZU5hbWVkUGlwZSIsCi0gICAgICAgICZuYW1lLCAmb3Blbl9tb2RlLCAmcGlwZV9tb2RlLCAmbWF4X2luc3RhbmNlcywgJm91dF9idWZmZXJfc2l6ZSwgJmluX2J1ZmZlcl9zaXplLCAmZGVmYXVsdF90aW1lb3V0LCAmc2VjdXJpdHlfYXR0cmlidXRlcykpCisgICAgICAgICZuYW1lLCAmb3Blbl9tb2RlLCAmcGlwZV9tb2RlLCAmbWF4X2luc3RhbmNlcywgJm91dF9idWZmZXJfc2l6ZSwgJmluX2J1ZmZlcl9zaXplLCAmZGVmYXVsdF90aW1lb3V0LCAmc2VjdXJpdHlfYXR0cmlidXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVOYW1lZFBpcGVfaW1wbChtb2R1bGUsIG5hbWUsIG9wZW5fbW9kZSwgcGlwZV9tb2RlLCBtYXhfaW5zdGFuY2VzLCBvdXRfYnVmZmVyX3NpemUsIGluX2J1ZmZlcl9zaXplLCBkZWZhdWx0X3RpbWVvdXQsIHNlY3VyaXR5X2F0dHJpYnV0ZXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTI1OCw4ICsyNjksOSBAQAogICAgIERXT1JEIHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9rOkNyZWF0ZVBpcGUiLAotICAgICAgICAmcGlwZV9hdHRycywgJnNpemUpKQorICAgICAgICAmcGlwZV9hdHRycywgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVQaXBlX2ltcGwobW9kdWxlLCBwaXBlX2F0dHJzLCBzaXplKTsKIAogZXhpdDoKQEAgLTMwOCw4ICszMjAsOSBAQAogICAgIFB5T2JqZWN0ICpzdGFydHVwX2luZm87CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlpaT09pa09aTzpDcmVhdGVQcm9jZXNzIiwKLSAgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsICZjb21tYW5kX2xpbmUsICZwcm9jX2F0dHJzLCAmdGhyZWFkX2F0dHJzLCAmaW5oZXJpdF9oYW5kbGVzLCAmY3JlYXRpb25fZmxhZ3MsICZlbnZfbWFwcGluZywgJmN1cnJlbnRfZGlyZWN0b3J5LCAmc3RhcnR1cF9pbmZvKSkKKyAgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsICZjb21tYW5kX2xpbmUsICZwcm9jX2F0dHJzLCAmdGhyZWFkX2F0dHJzLCAmaW5oZXJpdF9oYW5kbGVzLCAmY3JlYXRpb25fZmxhZ3MsICZlbnZfbWFwcGluZywgJmN1cnJlbnRfZGlyZWN0b3J5LCAmc3RhcnR1cF9pbmZvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlUHJvY2Vzc19pbXBsKG1vZHVsZSwgYXBwbGljYXRpb25fbmFtZSwgY29tbWFuZF9saW5lLCBwcm9jX2F0dHJzLCB0aHJlYWRfYXR0cnMsIGluaGVyaXRfaGFuZGxlcywgY3JlYXRpb25fZmxhZ3MsIGVudl9tYXBwaW5nLCBjdXJyZW50X2RpcmVjdG9yeSwgc3RhcnR1cF9pbmZvKTsKIAogZXhpdDoKQEAgLTM1MSwxMyArMzY0LDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIiIgRl9IQU5ETEUgIiIgRl9IQU5ETEUgImtpfGs6RHVwbGljYXRlSGFuZGxlIiwKLSAgICAgICAgJnNvdXJjZV9wcm9jZXNzX2hhbmRsZSwgJnNvdXJjZV9oYW5kbGUsICZ0YXJnZXRfcHJvY2Vzc19oYW5kbGUsICZkZXNpcmVkX2FjY2VzcywgJmluaGVyaXRfaGFuZGxlLCAmb3B0aW9ucykpCisgICAgICAgICZzb3VyY2VfcHJvY2Vzc19oYW5kbGUsICZzb3VyY2VfaGFuZGxlLCAmdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLCAmZGVzaXJlZF9hY2Nlc3MsICZpbmhlcml0X2hhbmRsZSwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfRHVwbGljYXRlSGFuZGxlX2ltcGwobW9kdWxlLCBzb3VyY2VfcHJvY2Vzc19oYW5kbGUsIHNvdXJjZV9oYW5kbGUsIHRhcmdldF9wcm9jZXNzX2hhbmRsZSwgZGVzaXJlZF9hY2Nlc3MsIGluaGVyaXRfaGFuZGxlLCBvcHRpb25zKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zODEsOCArMzk3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBVSU5UIEV4aXRDb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOkV4aXRQcm9jZXNzIiwgJkV4aXRDb2RlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkk6RXhpdFByb2Nlc3MiLCAmRXhpdENvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9FeGl0UHJvY2Vzc19pbXBsKG1vZHVsZSwgRXhpdENvZGUpOwogCiBleGl0OgpAQCAtNDA4LDEwICs0MjUsMTIgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldEN1cnJlbnRQcm9jZXNzX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzcsMTEgKzQ1NiwxMyBAQAogICAgIEhBTkRMRSBwcm9jZXNzOwogICAgIERXT1JEIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRFeGl0Q29kZVByb2Nlc3MiLCAmcHJvY2VzcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6R2V0RXhpdENvZGVQcm9jZXNzIiwgJnByb2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0RXhpdENvZGVQcm9jZXNzX2ltcGwobW9kdWxlLCBwcm9jZXNzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NjYsOCArNDg3LDkgQEAKICAgICBEV09SRCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0TGFzdEVycm9yX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00OTksOCArNTIxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBITU9EVUxFIG1vZHVsZV9oYW5kbGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRNb2R1bGVGaWxlTmFtZSIsICZtb2R1bGVfaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRNb2R1bGVGaWxlTmFtZSIsICZtb2R1bGVfaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0TW9kdWxlRmlsZU5hbWVfaW1wbChtb2R1bGUsIG1vZHVsZV9oYW5kbGUpOwogCiBleGl0OgpAQCAtNTMxLDEzICs1NTQsMTYgQEAKICAgICBEV09SRCBzdGRfaGFuZGxlOwogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJrOkdldFN0ZEhhbmRsZSIsICZzdGRfaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIms6R2V0U3RkSGFuZGxlIiwgJnN0ZF9oYW5kbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0U3RkSGFuZGxlX2ltcGwobW9kdWxlLCBzdGRfaGFuZGxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01NjMsOCArNTg5LDkgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRWZXJzaW9uX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTkzLDEzICs2MjAsMTYgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAia2lrOk9wZW5Qcm9jZXNzIiwKLSAgICAgICAgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZwcm9jZXNzX2lkKSkKKyAgICAgICAgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZwcm9jZXNzX2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX09wZW5Qcm9jZXNzX2ltcGwobW9kdWxlLCBkZXNpcmVkX2FjY2VzcywgaW5oZXJpdF9oYW5kbGUsIHByb2Nlc3NfaWQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTYyNSw4ICs2NTUsOSBAQAogICAgIGludCBzaXplID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAifGk6UGVla05hbWVkUGlwZSIsCi0gICAgICAgICZoYW5kbGUsICZzaXplKSkKKyAgICAgICAgJmhhbmRsZSwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9QZWVrTmFtZWRQaXBlX2ltcGwobW9kdWxlLCBoYW5kbGUsIHNpemUpOwogCiBleGl0OgpAQCAtNjQ5LDE0ICs2ODAsMTYgQEAKIF93aW5hcGlfUmVhZEZpbGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJoYW5kbGUiLCAic2l6ZSIsICJvdmVybGFwcGVkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiaGFuZGxlIiwgInNpemUiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7IiIgRl9IQU5ETEUgIml8aTpSZWFkRmlsZSIsIF9rZXl3b3JkcywgMH07CiAgICAgSEFORExFIGhhbmRsZTsKICAgICBpbnQgc2l6ZTsKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiaXxpOlJlYWRGaWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmc2l6ZSwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZoYW5kbGUsICZzaXplLCAmdXNlX292ZXJsYXBwZWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9SZWFkRmlsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBzaXplLCB1c2Vfb3ZlcmxhcHBlZCk7CiAKIGV4aXQ6CkBAIC02ODgsOCArNzIxLDkgQEAKICAgICBQeU9iamVjdCAqY29sbGVjdF9kYXRhX3RpbWVvdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIk9PTzpTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSIsCi0gICAgICAgICZuYW1lZF9waXBlLCAmbW9kZSwgJm1heF9jb2xsZWN0aW9uX2NvdW50LCAmY29sbGVjdF9kYXRhX3RpbWVvdXQpKQorICAgICAgICAmbmFtZWRfcGlwZSwgJm1vZGUsICZtYXhfY29sbGVjdGlvbl9jb3VudCwgJmNvbGxlY3RfZGF0YV90aW1lb3V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGVfaW1wbChtb2R1bGUsIG5hbWVkX3BpcGUsIG1vZGUsIG1heF9jb2xsZWN0aW9uX2NvdW50LCBjb2xsZWN0X2RhdGFfdGltZW91dCk7CiAKIGV4aXQ6CkBAIC03MTcsOCArNzUxLDkgQEAKICAgICBVSU5UIGV4aXRfY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAiSTpUZXJtaW5hdGVQcm9jZXNzIiwKLSAgICAgICAgJmhhbmRsZSwgJmV4aXRfY29kZSkpCisgICAgICAgICZoYW5kbGUsICZleGl0X2NvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9UZXJtaW5hdGVQcm9jZXNzX2ltcGwobW9kdWxlLCBoYW5kbGUsIGV4aXRfY29kZSk7CiAKIGV4aXQ6CkBAIC03NDQsOCArNzc5LDkgQEAKICAgICBEV09SRCB0aW1lb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzazpXYWl0TmFtZWRQaXBlIiwKLSAgICAgICAgJm5hbWUsICZ0aW1lb3V0KSkKKyAgICAgICAgJm5hbWUsICZ0aW1lb3V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfV2FpdE5hbWVkUGlwZV9pbXBsKG1vZHVsZSwgbmFtZSwgdGltZW91dCk7CiAKIGV4aXQ6CkBAIC03NzQsOCArODEwLDkgQEAKICAgICBEV09SRCBtaWxsaXNlY29uZHMgPSBJTkZJTklURTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2l8azpXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIiwKLSAgICAgICAgJmhhbmRsZV9zZXEsICZ3YWl0X2ZsYWcsICZtaWxsaXNlY29uZHMpKQorICAgICAgICAmaGFuZGxlX3NlcSwgJndhaXRfZmxhZywgJm1pbGxpc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dhaXRGb3JNdWx0aXBsZU9iamVjdHNfaW1wbChtb2R1bGUsIGhhbmRsZV9zZXEsIHdhaXRfZmxhZywgbWlsbGlzZWNvbmRzKTsKIAogZXhpdDoKQEAgLTgwOCwxMSArODQ1LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICJrOldhaXRGb3JTaW5nbGVPYmplY3QiLAotICAgICAgICAmaGFuZGxlLCAmbWlsbGlzZWNvbmRzKSkKKyAgICAgICAgJmhhbmRsZSwgJm1pbGxpc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9XYWl0Rm9yU2luZ2xlT2JqZWN0X2ltcGwobW9kdWxlLCBoYW5kbGUsIG1pbGxpc2Vjb25kcyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTgzNSwxNyArODc0LDE5IEBACiBfd2luYXBpX1dyaXRlRmlsZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJidWZmZXIiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImhhbmRsZSIsICJidWZmZXIiLCAib3ZlcmxhcHBlZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7IiIgRl9IQU5ETEUgIk98aTpXcml0ZUZpbGUiLCBfa2V5d29yZHMsIDB9OwogICAgIEhBTkRMRSBoYW5kbGU7CiAgICAgUHlPYmplY3QgKmJ1ZmZlcjsKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiT3xpOldyaXRlRmlsZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmhhbmRsZSwgJmJ1ZmZlciwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZoYW5kbGUsICZidWZmZXIsICZ1c2Vfb3ZlcmxhcHBlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dyaXRlRmlsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBidWZmZXIsIHVzZV9vdmVybGFwcGVkKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE0YzRiMmE5ZmNiMGJlYTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRiZmNjZmIzMmFiNzI2ZTggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oCmluZGV4IDBjNzA2MWEuLjNiOWZjZGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2FycmF5bW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9hcnJheW1vZHVsZS5jLmgKQEAgLTc3LDggKzc3LDkgQEAKICAgICBQeV9zc2l6ZV90IGkgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwKLSAgICAgICAgJmkpKQorICAgICAgICAmaSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9wb3BfaW1wbChzZWxmLCBpKTsKIAogZXhpdDoKQEAgLTExNCw4ICsxMTUsOSBAQAogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLAotICAgICAgICAmaSwgJnYpKQorICAgICAgICAmaSwgJnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfaW5zZXJ0X2ltcGwoc2VsZiwgaSwgdik7CiAKIGV4aXQ6CkBAIC0yMTEsOCArMjEzLDkgQEAKICAgICBQeV9zc2l6ZV90IG47CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9uOmZyb21maWxlIiwKLSAgICAgICAgJmYsICZuKSkKKyAgICAgICAgJmYsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21maWxlX2ltcGwoc2VsZiwgZiwgbik7CiAKIGV4aXQ6CkBAIC0yNzUsMTQgKzI3OCwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMqOmZyb21zdHJpbmciLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMqOmZyb21zdHJpbmciLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21zdHJpbmdfaW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMwNSwxNCArMzEwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6ZnJvbWJ5dGVzIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpmcm9tYnl0ZXMiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb21ieXRlc19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzc5LDggKzM4Niw5IEBACiAgICAgUHlfVU5JQ09ERSAqdXN0cjsKICAgICBQeV9zc2l6ZV9jbGVhbl90IHVzdHJfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ1Izpmcm9tdW5pY29kZSIsICZ1c3RyLCAmdXN0cl9sZW5ndGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidSM6ZnJvbXVuaWNvZGUiLCAmdXN0ciwgJnVzdHJfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2Zyb211bmljb2RlX2ltcGwoc2VsZiwgdXN0ciwgdXN0cl9sZW5ndGgpOwogCiBleGl0OgpAQCAtNDUzLDggKzQ2MSw5IEBACiAgICAgUHlPYmplY3QgKml0ZW1zOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPQ2lPOl9hcnJheV9yZWNvbnN0cnVjdG9yIiwKLSAgICAgICAgJmFycmF5dHlwZSwgJnR5cGVjb2RlLCAmbWZvcm1hdF9jb2RlLCAmaXRlbXMpKQorICAgICAgICAmYXJyYXl0eXBlLCAmdHlwZWNvZGUsICZtZm9ybWF0X2NvZGUsICZpdGVtcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9fYXJyYXlfcmVjb25zdHJ1Y3Rvcl9pbXBsKG1vZHVsZSwgYXJyYXl0eXBlLCB0eXBlY29kZSwgbWZvcm1hdF9jb2RlLCBpdGVtcyk7CiAKIGV4aXQ6CkBAIC00OTYsNCArNTA1LDQgQEAKIAogI2RlZmluZSBBUlJBWV9BUlJBWUlURVJBVE9SX19fU0VUU1RBVEVfX19NRVRIT0RERUYgICAgXAogICAgIHsiX19zZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKWFycmF5X2FycmF5aXRlcmF0b3JfX19zZXRzdGF0ZV9fLCBNRVRIX08sIGFycmF5X2FycmF5aXRlcmF0b3JfX19zZXRzdGF0ZV9fX19kb2NfX30sCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzA1ZGYzZjU3OTYwMzllNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjIwNTRmYjc2NGM4Y2M2NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaCBiL01vZHVsZXMvY2xpbmljL2F1ZGlvb3AuYy5oCmluZGV4IDYyZTMxM2I1Li5iZTRiNzE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaApAQCAtMjQsMTQgKzI0LDE2IEBACiAgICAgUHlfc3NpemVfdCBpbmRleDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppbjpnZXRzYW1wbGUiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmluZGV4KSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2dldHNhbXBsZV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgaW5kZXgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01NiwxNCArNTgsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTptYXgiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbWF4X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODgsMTQgKzkyLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bWlubWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21pbm1heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEyMCwxNCArMTI2LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YXZnIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2F2Z19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE1MiwxNCArMTYwLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6cm1zIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3Jtc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE4NSwxNyArMTk1LDIwIEBACiAgICAgUHlfYnVmZmVyIHJlZmVyZW5jZSA9IHtOVUxMLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp5KjpmaW5kZml0IiwKLSAgICAgICAgJmZyYWdtZW50LCAmcmVmZXJlbmNlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmcmVmZXJlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfZmluZGZpdF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCAmcmVmZXJlbmNlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgcmVmZXJlbmNlICovCi0gICAgaWYgKHJlZmVyZW5jZS5vYmopCisgICAgaWYgKHJlZmVyZW5jZS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZWZlcmVuY2UpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMjEsMTcgKzIzNCwyMCBAQAogICAgIFB5X2J1ZmZlciByZWZlcmVuY2UgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6ZmluZGZhY3RvciIsCi0gICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpCisgICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2ZpbmRmYWN0b3JfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgJnJlZmVyZW5jZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmIChyZWZlcmVuY2Uub2JqKQorICAgIGlmIChyZWZlcmVuY2Uub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmVmZXJlbmNlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjU3LDE0ICsyNzMsMTYgQEAKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSpuOmZpbmRtYXgiLAotICAgICAgICAmZnJhZ21lbnQsICZsZW5ndGgpKQorICAgICAgICAmZnJhZ21lbnQsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9maW5kbWF4X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIGxlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI4OSwxNCArMzA3LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YXZncHAiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYXZncHBfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMjEsMTQgKzM0MSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOm1heHBwIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21heHBwX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzUzLDE0ICszNzUsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpjcm9zcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9jcm9zc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM4NywxNCArNDExLDE2IEBACiAgICAgZG91YmxlIGZhY3RvcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppZDptdWwiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmZmFjdG9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbXVsX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MjIsMTQgKzQ0OCwxNiBAQAogICAgIGRvdWJsZSByZmFjdG9yOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlkZDp0b21vbm8iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmxmYWN0b3IsICZyZmFjdG9yKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3RvbW9ub19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgbGZhY3RvciwgcmZhY3Rvcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ1NywxNCArNDg1LDE2IEBACiAgICAgZG91YmxlIHJmYWN0b3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWRkOnRvc3RlcmVvIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF90b3N0ZXJlb19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgbGZhY3RvciwgcmZhY3Rvcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ5MSwxNyArNTIxLDIwIEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqaTphZGQiLAotICAgICAgICAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hZGRfaW1wbChtb2R1bGUsICZmcmFnbWVudDEsICZmcmFnbWVudDIsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudDEgKi8KLSAgICBpZiAoZnJhZ21lbnQxLm9iaikKKyAgICBpZiAoZnJhZ21lbnQxLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50MSk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50MiAqLwotICAgIGlmIChmcmFnbWVudDIub2JqKQorICAgIGlmIChmcmFnbWVudDIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTI3LDE0ICs1NjAsMTYgQEAKICAgICBpbnQgYmlhczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppaTpiaWFzIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZiaWFzKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZiaWFzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYmlhc19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgYmlhcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU1OSwxNCArNTk0LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6cmV2ZXJzZSIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9yZXZlcnNlX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTkxLDE0ICs2MjgsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpieXRlc3dhcCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9ieXRlc3dhcF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTYyNSwxNCArNjY0LDE2IEBACiAgICAgaW50IG5ld3dpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlpOmxpbjJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJm5ld3dpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuZXd3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIG5ld3dpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjY2LDE0ICs3MDcsMTYgQEAKICAgICBpbnQgd2VpZ2h0QiA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWlpaU98aWk6cmF0ZWN2IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuY2hhbm5lbHMsICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9yYXRlY3ZfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCBzdGF0ZSwgd2VpZ2h0QSwgd2VpZ2h0Qik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY5OCwxNCArNzQxLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bGluMnVsYXciLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbGluMnVsYXdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03MzAsMTQgKzc3NSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnVsYXcybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX3VsYXcybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzYyLDE0ICs4MDksMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTpsaW4yYWxhdyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4yYWxhd19pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc5NCwxNCArODQzLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6YWxhdzJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYWxhdzJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MjgsMTQgKzg3OSwxNiBAQAogICAgIFB5T2JqZWN0ICpzdGF0ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppTzpsaW4yYWRwY20iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJnN0YXRlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJhZHBjbV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgc3RhdGUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04NjIsMTUgKzkxNSwxNyBAQAogICAgIFB5T2JqZWN0ICpzdGF0ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppTzphZHBjbTJsaW4iLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJnN0YXRlKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2FkcGNtMmxpbl9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgc3RhdGUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mzg1ZmIwOWZhMjFhNjJjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTBhYjc0YzNmYTU3YzM5YyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKaW5kZXggZTIwY2FjMi4uMGVlN2Y1NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaApAQCAtMjAsOCArMjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfdXUiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfdXUiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfdXVfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKQEAgLTUwLDE0ICs1MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfdXUiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfdXUiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfdXVfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MCw4ICs4Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9iYXNlNjQiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfYmFzZTY0IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgpAQCAtOTMsMzEgKzk3LDM3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfXywKLSJiMmFfYmFzZTY0KCRtb2R1bGUsIGRhdGEsIC8pXG4iCisiYjJhX2Jhc2U2NCgkbW9kdWxlLCAvLCBkYXRhLCAqLCBuZXdsaW5lPVRydWUpXG4iCiAiLS1cbiIKICJcbiIKICJCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEuIik7CiAKICNkZWZpbmUgQklOQVNDSUlfQjJBX0JBU0U2NF9NRVRIT0RERUYgICAgXAotICAgIHsiYjJhX2Jhc2U2NCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX08sIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKKyAgICB7ImIyYV9iYXNlNjQiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpOworYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IG5ld2xpbmUpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJnKQorYmluYXNjaWlfYjJhX2Jhc2U2NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgIm5ld2xpbmUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ5KnwkaTpiMmFfYmFzZTY0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKKyAgICBpbnQgbmV3bGluZSA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9iYXNlNjQiLCAmZGF0YSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJm5ld2xpbmUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwobW9kdWxlLCAmZGF0YSk7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChtb2R1bGUsICZkYXRhLCBuZXdsaW5lKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNDAsOCArMTUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX2hxeCIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9ocXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CkBAIC0xNzAsMTQgKzE4MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVjb2RlX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJsZWNvZGVfaHF4IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMDAsMTQgKzIxMywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaHF4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMzAsMTQgKzI0NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVkZWNvZGVfaHF4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlZGVjb2RlX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3JsZWRlY29kZV9ocXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yNjMsMTcgKzI4MCwyMCBAQAogICAgIHVuc2lnbmVkIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kkk6Y3JjX2hxeCIsCi0gICAgICAgICZkYXRhLCAmY3JjKSkKKyAgICAgICAgJmRhdGEsICZjcmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IGJpbmFzY2lpX2NyY19ocXhfaW1wbChtb2R1bGUsICZkYXRhLCBjcmMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjk5LDE3ICszMTksMjAgQEAKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8STpjcmMzMiIsCi0gICAgICAgICZkYXRhLCAmY3JjKSkKKyAgICAgICAgJmRhdGEsICZjcmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IGJpbmFzY2lpX2NyYzMyX2ltcGwobW9kdWxlLCAmZGF0YSwgY3JjKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMzNSwxNCArMzU4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9oZXgiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaGV4IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2hleF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM2NywxNCArMzkyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmhleGxpZnkiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpoZXhsaWZ5IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfaGV4bGlmeV9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQwMCw4ICs0MjcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBoZXhzdHIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9oZXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9oZXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2EyYl9oZXhfaW1wbChtb2R1bGUsICZoZXhzdHIpOwogCiBleGl0OgpAQCAtNDMyLDggKzQ2MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGhleHN0ciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5oZXhsaWZ5IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjp1bmhleGxpZnkiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmaGV4c3RyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3VuaGV4bGlmeV9pbXBsKG1vZHVsZSwgJmhleHN0cik7CiAKIGV4aXQ6CkBAIC00NjAsMTMgKzQ4OSwxNSBAQAogYmluYXNjaWlfYTJiX3FwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJoZWFkZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgImhlYWRlciIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfGk6YTJiX3FwIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBpbnQgaGVhZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGk6YTJiX3FwIiwgX2tleXdvcmRzLAotICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBoZWFkZXIpOwogCiBleGl0OgpAQCAtNDk4LDIyICs1MjksMjUgQEAKIGJpbmFzY2lpX2IyYV9xcChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsICJoZWFkZXIiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJkYXRhIiwgInF1b3RldGFicyIsICJpc3RleHQiLCAiaGVhZGVyIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8aWlpOmIyYV9xcCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IHF1b3RldGFicyA9IDA7CiAgICAgaW50IGlzdGV4dCA9IDE7CiAgICAgaW50IGhlYWRlciA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxpaWk6YjJhX3FwIiwgX2tleXdvcmRzLAotICAgICAgICAmZGF0YSwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBxdW90ZXRhYnMsIGlzdGV4dCwgaGVhZGVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTExNzNmYzk3MThhNWVkYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTI2MTFiMDVkOGJmNGE5YyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmgKaW5kZXggYTI1NTM1My4uZTQ2YzMxNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaApAQCAtMjEsOCArMjEsOSBAQAogICAgIFB5X2NvbXBsZXggejsKICAgICBQeV9jb21wbGV4IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvcyIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvcyIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hY29zX2ltcGwobW9kdWxlLCB6KTsKQEAgLTYyLDggKzYzLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3NoIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphY29zaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hY29zaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0xMDMsOCArMTA1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXNpbl9pbXBsKG1vZHVsZSwgeik7CkBAIC0xNDQsOCArMTQ3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFzaW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hc2luaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0xODUsOCArMTg5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXRhbl9pbXBsKG1vZHVsZSwgeik7CkBAIC0yMjYsOCArMjMxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmF0YW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuaCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9hdGFuaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0yNjcsOCArMjczLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvcyIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6Y29zIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2Nvc19pbXBsKG1vZHVsZSwgeik7CkBAIC0zMDgsOCArMzE1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvc2giLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvc2giLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfY29zaF9pbXBsKG1vZHVsZSwgeik7CkBAIC0zNDksOCArMzU3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmV4cCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6ZXhwIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2V4cF9pbXBsKG1vZHVsZSwgeik7CkBAIC0zOTAsOCArMzk5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmxvZzEwIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpsb2cxMCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9sb2cxMF9pbXBsKG1vZHVsZSwgeik7CkBAIC00MzEsOCArNDQxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6c2luIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3Npbl9pbXBsKG1vZHVsZSwgeik7CkBAIC00NzIsOCArNDgzLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbmgiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfc2luaF9pbXBsKG1vZHVsZSwgeik7CkBAIC01MTMsOCArNTI1LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNxcnQiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNxcnQiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfc3FydF9pbXBsKG1vZHVsZSwgeik7CkBAIC01NTQsOCArNTY3LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6dGFuIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3Rhbl9pbXBsKG1vZHVsZSwgeik7CkBAIC01OTUsOCArNjA5LDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbmgiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfdGFuaF9pbXBsKG1vZHVsZSwgeik7CkBAIC02MzksOCArNjU0LDkgQEAKICAgICBQeU9iamVjdCAqeV9vYmogPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEfE86bG9nIiwKLSAgICAgICAgJngsICZ5X29iaikpCisgICAgICAgICZ4LCAmeV9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfbG9nX2ltcGwobW9kdWxlLCB4LCB5X29iaik7CiAKIGV4aXQ6CkBAIC02NjUsOCArNjgxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6cGhhc2UiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBoYXNlIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfcGhhc2VfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtNjkzLDggKzcxMCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBvbGFyIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwb2xhciIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3BvbGFyX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTcyMSw4ICs3MzksOSBAQAogICAgIGRvdWJsZSBwaGk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRkOnJlY3QiLAotICAgICAgICAmciwgJnBoaSkpCisgICAgICAgICZyLCAmcGhpKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3JlY3RfaW1wbChtb2R1bGUsIHIsIHBoaSk7CiAKIGV4aXQ6CkBAIC03NDcsOCArNzY2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNmaW5pdGUiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzZmluaXRlIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNmaW5pdGVfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtNzczLDggKzc5Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzbmFuIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc25hbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2lzbmFuX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTc5OSw4ICs4MjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc2luZiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNpbmYiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9pc2luZl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC04MzksMjIgKzg2MSwyNSBAQAogY21hdGhfaXNjbG9zZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImEiLCAiYiIsICJyZWxfdG9sIiwgImFic190b2wiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJhIiwgImIiLCAicmVsX3RvbCIsICJhYnNfdG9sIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiRER8JGRkOmlzY2xvc2UiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2NvbXBsZXggYTsKICAgICBQeV9jb21wbGV4IGI7CiAgICAgZG91YmxlIHJlbF90b2wgPSAxZS0wOTsKICAgICBkb3VibGUgYWJzX3RvbCA9IDAuMDsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIkREfCRkZDppc2Nsb3NlIiwgX2tleXdvcmRzLAotICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNjbG9zZV9pbXBsKG1vZHVsZSwgYSwgYiwgcmVsX3RvbCwgYWJzX3RvbCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTczMjE5NDAyOWI3ZmIxZTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFhMmU3N2NhOWZjMjY5MjggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oCmluZGV4IDY3NjYwZWIuLjg0YTAwNGIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2ZjbnRsbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpfE86ZmNudGwiLAotICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKQorICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfZmNudGxfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBhcmcpOwogCiBleGl0OgpAQCAtOTEsOCArOTIsOSBAQAogICAgIGludCBtdXRhdGVfYXJnID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZJfE9wOmlvY3RsIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmb2JfYXJnLCAmbXV0YXRlX2FyZykpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJm9iX2FyZywgJm11dGF0ZV9hcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfaW9jdGxfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBvYl9hcmcsIG11dGF0ZV9hcmcpOwogCiBleGl0OgpAQCAtMTIyLDggKzEyNCw5IEBACiAgICAgaW50IGNvZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpmbG9jayIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSkpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9mbG9ja19pbXBsKG1vZHVsZSwgZmQsIGNvZGUpOwogCiBleGl0OgpAQCAtMTc1LDExICsxNzgsMTIgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpfE9PaTpsb2NrZiIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmxlbm9iaiwgJnN0YXJ0b2JqLCAmd2hlbmNlKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZmNudGxfbG9ja2ZfaW1wbChtb2R1bGUsIGZkLCBjb2RlLCBsZW5vYmosIHN0YXJ0b2JqLCB3aGVuY2UpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTdiMTMwNmI4NjRjMDFjOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzZjZmY3NmE4ZmIyYzlhNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvZ3JwbW9kdWxlLmMuaAppbmRleCAyYzQ3YTQyLi45YzlkNTk1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmgKQEAgLTIwLDEyICsyMCwxNCBAQAogZ3JwX2dldGdyZ2lkKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJpZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICppZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZpZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZ3JwX2dldGdyZ2lkX2ltcGwobW9kdWxlLCBpZCk7CiAKIGV4aXQ6CkBAIC01MCwxMiArNTIsMTQgQEAKIGdycF9nZXRncm5hbShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJuYW1lIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiVTpnZXRncm5hbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOmdldGdybmFtIiwgX2tleXdvcmRzLAotICAgICAgICAmbmFtZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBncnBfZ2V0Z3JuYW1faW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtODIsNCArODYsNCBAQAogewogICAgIHJldHVybiBncnBfZ2V0Z3JhbGxfaW1wbChtb2R1bGUpOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJlZTA5ZmVlZmM1NGEyY2IgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMwNjA4MTA5N2I3ZmZmZTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmgKaW5kZXggMGJkOTU4YS4uYWViMWM0MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9tZDVtb2R1bGUuYy5oCkBAIC04MSwxNSArODEsMTcgQEAKIF9tZDVfbWQ1KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86bWQ1IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOm1kNSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tZDVfbWQ1X2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGNkM2NjOTZlMzU1NjNkMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Zjg2ZmMyZjNmMjE4MzFlMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKaW5kZXggMWJiZmMwNi4uZTU0M2RiNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaApAQCAtMzYsMTQgKzM2LDE2IEBACiBvc19zdGF0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZ8JE8mcDpzdGF0IiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzdGF0IiwgInBhdGgiLCAwLCAxKTsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyZwOnN0YXQiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03MiwxMyArNzQsMTUgQEAKIG9zX2xzdGF0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjpsc3RhdCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibHN0YXQiLCAicGF0aCIsIDAsIDApOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfCRPJjpsc3RhdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBGU1RBVEFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBGU1RBVEFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbHN0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTMxLDcgKzEzNSw4IEBACiBvc19hY2Nlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm1vZGUiLCAiZGlyX2ZkIiwgImVmZmVjdGl2ZV9pZHMiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsICJlZmZlY3RpdmVfaWRzIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8maXwkTyZwcDphY2Nlc3MiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImFjY2VzcyIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGU7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwpAQCAtMTM5LDEyICsxNDQsMTQgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8maXwkTyZwcDphY2Nlc3MiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZBQ0NFU1NBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZWZmZWN0aXZlX2lkcywgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2FjY2Vzc19pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCwgZWZmZWN0aXZlX2lkcywgZm9sbG93X3N5bWxpbmtzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTc4LDExICsxODUsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgY2hhciAqX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0dHluYW1lIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dHR5bmFtZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfdHR5bmFtZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yMzMsMTIgKzI0MiwxNCBAQAogb3NfY2hkaXIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mOmNoZGlyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGRpciIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZDSERJUik7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaGRpcl9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtMjY5LDEyICsyODAsMTQgQEAKIG9zX2ZjaGRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJjpmY2hkaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmZjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgZmlsZGVzX2NvbnZlcnRlciwgJmZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hkaXJfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTMyMCwxNSArMzMzLDE3IEBACiBvc19jaG1vZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJml8JE8mcDpjaG1vZCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2htb2QiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GQ0hNT0QpOwogICAgIGludCBtb2RlOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8maXwkTyZwOmNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQ0hNT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZDSE1PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2htb2RfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC0zNTgsMTMgKzM3MywxNSBAQAogb3NfZmNobW9kKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgIm1vZGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpaTpmY2htb2QiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKICAgICBpbnQgbW9kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlpOmZjaG1vZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkLCAmbW9kZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZjaG1vZF9pbXBsKG1vZHVsZSwgZmQsIG1vZGUpOwogCiBleGl0OgpAQCAtMzk0LDEzICs0MTEsMTUgQEAKIG9zX2xjaG1vZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8maTpsY2htb2QiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxjaG1vZCIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJmk6bGNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGNobW9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSk7CiAKIGV4aXQ6CkBAIC00MzcsMTQgKzQ1NiwxNiBAQAogb3NfY2hmbGFncyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZmxhZ3MiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmbGFncyIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJmt8cDpjaGZsYWdzIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGZsYWdzIiwgInBhdGgiLCAwLCAwKTsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrfHA6Y2hmbGFncyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2hmbGFnc19pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtNDc3LDEzICs0OTgsMTUgQEAKIG9zX2xjaGZsYWdzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmbGFncyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZmxhZ3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJms6bGNoZmxhZ3MiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxjaGZsYWdzIiwgInBhdGgiLCAwLCAwKTsKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrOmxjaGZsYWdzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19sY2hmbGFnc19pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzKTsKIAogZXhpdDoKQEAgLTUxMywxMiArNTM2LDE0IEBACiBvc19jaHJvb3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mOmNocm9vdCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2hyb290IiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmNocm9vdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaHJvb3RfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTU0OCwxMiArNTczLDE0IEBACiBvc19mc3luYyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJjpmc3luYyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZnN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN5bmNfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTYwMiwxMiArNjI5LDE0IEBACiBvc19mZGF0YXN5bmMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJmZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyY6ZmRhdGFzeW5jIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpmZGF0YXN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZmRhdGFzeW5jX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC02NTksMTYgKzY4OCwxOCBAQAogb3NfY2hvd24oUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInVpZCIsICJnaWQiLCAiZGlyX2ZkIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAidWlkIiwgImdpZCIsICJkaXJfZmQiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJk8mfCRPJnA6Y2hvd24iLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImNob3duIiwgInBhdGgiLCAwLCBQQVRIX0hBVkVfRkNIT1dOKTsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZPJnwkTyZwOmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaG93bl9pbXBsKG1vZHVsZSwgJnBhdGgsIHVpZCwgZ2lkLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03MDAsMTQgKzczMSwxNiBAQAogb3NfZmNob3duKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCAidWlkIiwgImdpZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImZkIiwgInVpZCIsICJnaWQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpTyZPJjpmY2hvd24iLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaU8mTyY6ZmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hvd25faW1wbChtb2R1bGUsIGZkLCB1aWQsIGdpZCk7CiAKIGV4aXQ6CkBAIC03MzcsMTQgKzc3MCwxNiBAQAogb3NfbGNob3duKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJ1aWQiLCAiZ2lkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJ1aWQiLCAiZ2lkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJk8mOmxjaG93biIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibGNob3duIiwgInBhdGgiLCAwLCAwKTsKICAgICB1aWRfdCB1aWQ7CiAgICAgZ2lkX3QgZ2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJk8mOmxjaG93biIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGNob3duX2ltcGwobW9kdWxlLCAmcGF0aCwgdWlkLCBnaWQpOwogCiBleGl0OgpAQCAtODIyLDE2ICs4NTcsMTggQEAKIG9zX2xpbmsoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8mfCRPJk8mcDpsaW5rIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoImxpbmsiLCAic3JjIiwgMCwgMCk7CiAgICAgcGF0aF90IGRzdCA9IFBBVEhfVF9JTklUSUFMSVpFKCJsaW5rIiwgImRzdCIsIDAsIDApOwogICAgIGludCBzcmNfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyZwOmxpbmsiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xpbmtfaW1wbChtb2R1bGUsICZzcmMsICZkc3QsIHNyY19kaXJfZmQsIGRzdF9kaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC04NzIsMTIgKzkwOSwxNCBAQAogb3NfbGlzdGRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE8mOmxpc3RkaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxpc3RkaXIiLCAicGF0aCIsIDEsIFBBVEhfSEFWRV9GRE9QRU5ESVIpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8mOmxpc3RkaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGlzdGRpcl9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtOTA2LDggKzk0NSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2dldGZ1bGxwYXRobmFtZSIsICJwYXRoIiwgMCwgMCk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9nZXRmdWxscGF0aG5hbWUiLCBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2dldGZ1bGxwYXRobmFtZSIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0ZnVsbHBhdGhuYW1lX2ltcGwobW9kdWxlLCAmcGF0aCk7CiAKIGV4aXQ6CkBAIC05MzksOCArOTc5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpfZ2V0ZmluYWxwYXRobmFtZSIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6X2dldGZpbmFscGF0aG5hbWUiLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0ZmluYWxwYXRobmFtZV9pbXBsKG1vZHVsZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC05NjgsOCArMTAwOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2lzZGlyIiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2lzZGlyIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9pc2RpciIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19faXNkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTk5OSwxMiArMTA0MSwxNCBAQAogb3NfX2dldHZvbHVtZXBhdGhuYW1lKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldHZvbHVtZXBhdGhuYW1lX2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTEwMzYsMTQgKzEwODAsMTYgQEAKIG9zX21rZGlyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAibW9kZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxpJE8mOm1rZGlyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJta2RpciIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IG1vZGUgPSA1MTE7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8aSRPJjpta2RpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgTUtESVJBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIE1LRElSQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19ta2Rpcl9pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMDczLDggKzExMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBpbmNyZW1lbnQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmljZSIsICZpbmNyZW1lbnQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpuaWNlIiwgJmluY3JlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19uaWNlX2ltcGwobW9kdWxlLCBpbmNyZW1lbnQpOwogCiBleGl0OgpAQCAtMTEwMSwxMyArMTE0OCwxNSBAQAogb3NfZ2V0cHJpb3JpdHkoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJ3aGljaCIsICJ3aG8iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJ3aGljaCIsICJ3aG8iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpaTpnZXRwcmlvcml0eSIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHdoaWNoOwogICAgIGludCB3aG87CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaTpnZXRwcmlvcml0eSIsIF9rZXl3b3JkcywKLSAgICAgICAgJndoaWNoLCAmd2hvKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ3aGljaCwgJndobykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXRwcmlvcml0eV9pbXBsKG1vZHVsZSwgd2hpY2gsIHdobyk7CiAKIGV4aXQ6CkBAIC0xMTM0LDE0ICsxMTgzLDE2IEBACiBvc19zZXRwcmlvcml0eShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7IndoaWNoIiwgIndobyIsICJwcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IndoaWNoIiwgIndobyIsICJwcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7ImlpaTpzZXRwcmlvcml0eSIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHdoaWNoOwogICAgIGludCB3aG87CiAgICAgaW50IHByaW9yaXR5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWlpOnNldHByaW9yaXR5IiwgX2tleXdvcmRzLAotICAgICAgICAmd2hpY2gsICZ3aG8sICZwcmlvcml0eSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmd2hpY2gsICZ3aG8sICZwcmlvcml0eSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRwcmlvcml0eV9pbXBsKG1vZHVsZSwgd2hpY2gsIHdobywgcHJpb3JpdHkpOwogCiBleGl0OgpAQCAtMTE3MywxNSArMTIyNCwxNyBAQAogb3NfcmVuYW1lKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3JjIiwgImRzdCIsICJzcmNfZGlyX2ZkIiwgImRzdF9kaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mTyZ8JE8mTyY6cmVuYW1lIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbmFtZSIsICJzcmMiLCAwLCAwKTsKICAgICBwYXRoX3QgZHN0ID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbmFtZSIsICJkc3QiLCAwLCAwKTsKICAgICBpbnQgc3JjX2Rpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogICAgIGludCBkc3RfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRPJk8mOnJlbmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVuYW1lX2ltcGwobW9kdWxlLCAmc3JjLCAmZHN0LCBzcmNfZGlyX2ZkLCBkc3RfZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTEyMTYsMTUgKzEyNjksMTcgQEAKIG9zX3JlcGxhY2UoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInNyY19kaXJfZmQiLCAiZHN0X2Rpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNyYyIsICJkc3QiLCAic3JjX2Rpcl9mZCIsICJkc3RfZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJnwkTyZPJjpyZXBsYWNlIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3Qgc3JjID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlcGxhY2UiLCAic3JjIiwgMCwgMCk7CiAgICAgcGF0aF90IGRzdCA9IFBBVEhfVF9JTklUSUFMSVpFKCJyZXBsYWNlIiwgImRzdCIsIDAsIDApOwogICAgIGludCBzcmNfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyY6cmVwbGFjZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVwbGFjZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjU3LDEzICsxMzEyLDE1IEBACiBvc19ybWRpcihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnwkTyY6cm1kaXIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInJtZGlyIiwgInBhdGgiLCAwLCAwKTsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyY6cm1kaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfcm1kaXJfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTI5MSwxNiArMTM0OCwxOSBAQAogb3Nfc3lzdGVtKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiY29tbWFuZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImNvbW1hbmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ1OnN5c3RlbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfVU5JQ09ERSAqY29tbWFuZDsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ1OnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmNvbW1hbmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzMjcsMTYgKzEzODcsMTkgQEAKIG9zX3N5c3RlbShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImNvbW1hbmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJjb21tYW5kIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyY6c3lzdGVtIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqY29tbWFuZCA9IE5VTEw7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6c3lzdGVtIiwgX2tleXdvcmRzLAotICAgICAgICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZjb21tYW5kKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzNjYsOCArMTQyOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG1hc2s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dW1hc2siLCAmbWFzaykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnVtYXNrIiwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW1hc2tfaW1wbChtb2R1bGUsIG1hc2spOwogCiBleGl0OgpAQCAtMTM5NSwxMyArMTQ1OSwxNSBAQAogb3NfdW5saW5rKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjp1bmxpbmsiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInVubGluayIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnVubGluayIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191bmxpbmtfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTQzMiwxMyArMTQ5OCwxNSBAQAogb3NfcmVtb3ZlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfCRPJjpyZW1vdmUiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbW92ZSIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnJlbW92ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgVU5MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19yZW1vdmVfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTUxMywxNiArMTU4MSwxOCBAQAogb3NfdXRpbWUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInRpbWVzIiwgIm5zIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgInRpbWVzIiwgIm5zIiwgImRpcl9mZCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJnxPJE9PJnA6dXRpbWUiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInV0aW1lIiwgInBhdGgiLCAwLCBQQVRIX1VUSU1FX0hBVkVfRkQpOwogICAgIFB5T2JqZWN0ICp0aW1lcyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5zID0gTlVMTDsKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxPJE9PJnA6dXRpbWUiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJnRpbWVzLCAmbnMsIEZVVElNRU5TQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdXRpbWVfaW1wbChtb2R1bGUsICZwYXRoLCB0aW1lcywgbnMsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTE1NDgsMTIgKzE2MTgsMTQgQEAKIG9zX19leGl0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpfZXhpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6X2V4aXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZXhpdF9pbXBsKG1vZHVsZSwgc3RhdHVzKTsKIAogZXhpdDoKQEAgLTE1ODcsOCArMTY1OSw5IEBACiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTzpleGVjdiIsCi0gICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkKKyAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZfaW1wbChtb2R1bGUsIHBhdGgsIGFyZ3YpOwogCiBleGl0OgpAQCAtMTYyNSwxNCArMTY5OCwxNiBAQAogb3NfZXhlY3ZlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhcmd2IiwgImVudiIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXJndiIsICJlbnYiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk9POmV4ZWN2ZSIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiZXhlY3ZlIiwgInBhdGgiLCAwLCBQQVRIX0hBVkVfRkVYRUNWRSk7CiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAgICAgUHlPYmplY3QgKmVudjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mT086ZXhlY3ZlIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZhcmd2LCAmZW52KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZlX2ltcGwobW9kdWxlLCAmcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE2NzQsOCArMTc0OSw5IEBACiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk86c3Bhd252IiwKLSAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkKKyAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NwYXdudl9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndik7CiAKIGV4aXQ6CkBAIC0xNzIxLDggKzE3OTcsOSBAQAogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk9POnNwYXdudmUiLAotICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKQorICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3Bhd252ZV9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE4MDAsMTIgKzE4NzcsMTQgQEAKIG9zX3NjaGVkX2dldF9wcmlvcml0eV9tYXgoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwb2xpY3kiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwb2xpY3kiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOnNjaGVkX2dldF9wcmlvcml0eV9tYXgiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBwb2xpY3k7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOnNjaGVkX2dldF9wcmlvcml0eV9tYXgiLCBfa2V5d29yZHMsCi0gICAgICAgICZwb2xpY3kpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBvbGljeSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4X2ltcGwobW9kdWxlLCBwb2xpY3kpOwogCiBleGl0OgpAQCAtMTgzMiwxMiArMTkxMSwxNCBAQAogb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBvbGljeSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBvbGljeSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6c2NoZWRfZ2V0X3ByaW9yaXR5X21pbiIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHBvbGljeTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6c2NoZWRfZ2V0X3ByaW9yaXR5X21pbiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBvbGljeSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmcG9saWN5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX2dldF9wcmlvcml0eV9taW5faW1wbChtb2R1bGUsIHBvbGljeSk7CiAKIGV4aXQ6CkBAIC0xODY4LDggKzE5NDksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0c2NoZWR1bGVyIiwgJnBpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9nZXRzY2hlZHVsZXIiLCAmcGlkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX2dldHNjaGVkdWxlcl9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTE4OTYsMTIgKzE5NzgsMTQgQEAKIG9zX3NjaGVkX3BhcmFtKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzY2hlZF9wcmlvcml0eSIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNjaGVkX3ByaW9yaXR5IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTzpzY2hlZF9wYXJhbSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNjaGVkX3ByaW9yaXR5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpzY2hlZF9wYXJhbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNjaGVkX3ByaW9yaXR5KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzY2hlZF9wcmlvcml0eSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9wYXJhbV9pbXBsKHR5cGUsIHNjaGVkX3ByaW9yaXR5KTsKIAogZXhpdDoKQEAgLTE5MzcsOCArMjAyMSw5IEBACiAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImlPJjpzY2hlZF9zZXRzY2hlZHVsZXIiLAotICAgICAgICAmcGlkLCAmcG9saWN5LCBjb252ZXJ0X3NjaGVkX3BhcmFtLCAmcGFyYW0pKQorICAgICAgICAmcGlkLCAmcG9saWN5LCBjb252ZXJ0X3NjaGVkX3BhcmFtLCAmcGFyYW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfc2V0c2NoZWR1bGVyX2ltcGwobW9kdWxlLCBwaWQsIHBvbGljeSwgJnBhcmFtKTsKIAogZXhpdDoKQEAgLTE5NzAsOCArMjA1NSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGlkX3QgcGlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9nZXRwYXJhbSIsICZwaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0cGFyYW0iLCAmcGlkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX2dldHBhcmFtX2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMjAwNiw4ICsyMDkyLDkgQEAKICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiTyY6c2NoZWRfc2V0cGFyYW0iLAotICAgICAgICAmcGlkLCBjb252ZXJ0X3NjaGVkX3BhcmFtLCAmcGFyYW0pKQorICAgICAgICAmcGlkLCBjb252ZXJ0X3NjaGVkX3BhcmFtLCAmcGFyYW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfc2V0cGFyYW1faW1wbChtb2R1bGUsIHBpZCwgJnBhcmFtKTsKIAogZXhpdDoKQEAgLTIwMzksMTEgKzIxMjYsMTMgQEAKICAgICBwaWRfdCBwaWQ7CiAgICAgZG91YmxlIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX3JyX2dldF9pbnRlcnZhbCIsICZwaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfcnJfZ2V0X2ludGVydmFsIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfcnJfZ2V0X2ludGVydmFsX2ltcGwobW9kdWxlLCBwaWQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlGbG9hdF9Gcm9tRG91YmxlKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjA5OCw4ICsyMTg3LDkgQEAKICAgICBQeU9iamVjdCAqbWFzazsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJPOnNjaGVkX3NldGFmZmluaXR5IiwKLSAgICAgICAgJnBpZCwgJm1hc2spKQorICAgICAgICAmcGlkLCAmbWFzaykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9zZXRhZmZpbml0eV9pbXBsKG1vZHVsZSwgcGlkLCBtYXNrKTsKIAogZXhpdDoKQEAgLTIxMTQsNyArMjIwNCw3IEBACiAic2NoZWRfZ2V0YWZmaW5pdHkoJG1vZHVsZSwgcGlkLCAvKVxuIgogIi0tXG4iCiAiXG4iCi0iUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZC5cbiIKKyJSZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkIChvciB0aGUgY3VycmVudCBwcm9jZXNzIGlmIHplcm8pLlxuIgogIlxuIgogIlRoZSBhZmZpbml0eSBpcyByZXR1cm5lZCBhcyBhIHNldCBvZiBDUFUgaWRlbnRpZmllcnMuIik7CiAKQEAgLTIxMzAsOCArMjIyMCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGlkX3QgcGlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9nZXRhZmZpbml0eSIsICZwaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0YWZmaW5pdHkiLCAmcGlkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX2dldGFmZmluaXR5X2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMjMxNiwxMiArMjQwNywxNCBAQAogb3NfZ2V0cGdpZChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBpZCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBpZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7IiIgX1B5X1BBUlNFX1BJRCAiOmdldHBnaWQiLCBfa2V5d29yZHMsIDB9OwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIiIgX1B5X1BBUlNFX1BJRCAiOmdldHBnaWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZwaWQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXRwZ2lkX2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMjQ2NSw4ICsyNTU4LDkgQEAKICAgICBQeV9zc2l6ZV90IHNpZ25hbDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJuOmtpbGwiLAotICAgICAgICAmcGlkLCAmc2lnbmFsKSkKKyAgICAgICAgJnBpZCwgJnNpZ25hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19raWxsX2ltcGwobW9kdWxlLCBwaWQsIHNpZ25hbCk7CiAKIGV4aXQ6CkBAIC0yNDk3LDggKzI1OTEsOSBAQAogICAgIGludCBzaWduYWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTpraWxscGciLAotICAgICAgICAmcGdpZCwgJnNpZ25hbCkpCisgICAgICAgICZwZ2lkLCAmc2lnbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2tpbGxwZ19pbXBsKG1vZHVsZSwgcGdpZCwgc2lnbmFsKTsKIAogZXhpdDoKQEAgLTI1MjcsOCArMjYyMiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG9wOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnBsb2NrIiwgJm9wKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6cGxvY2siLCAmb3ApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcGxvY2tfaW1wbChtb2R1bGUsIG9wKTsKIAogZXhpdDoKQEAgLTI1NTcsOCArMjY1Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgdWlkX3QgdWlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXR1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXR1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXR1aWRfaW1wbChtb2R1bGUsIHVpZCk7CiAKIGV4aXQ6CkBAIC0yNTg3LDggKzI2ODQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVpZF90IGV1aWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGV1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0ZXVpZCIsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRldWlkX2ltcGwobW9kdWxlLCBldWlkKTsKIAogZXhpdDoKQEAgLTI2MTcsOCArMjcxNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgZ2lkX3QgZWdpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0ZWdpZCIsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRlZ2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldGVnaWRfaW1wbChtb2R1bGUsIGVnaWQpOwogCiBleGl0OgpAQCAtMjY0OSw4ICsyNzQ4LDkgQEAKICAgICB1aWRfdCBldWlkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnNldHJldWlkIiwKLSAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKQorICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJnJ1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZXVpZF9pbXBsKG1vZHVsZSwgcnVpZCwgZXVpZCk7CiAKIGV4aXQ6CkBAIC0yNjgxLDggKzI3ODEsOSBAQAogICAgIGdpZF90IGVnaWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyY6c2V0cmVnaWQiLAotICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJnJnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpCisgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldHJlZ2lkX2ltcGwobW9kdWxlLCByZ2lkLCBlZ2lkKTsKIAogZXhpdDoKQEAgLTI3MTEsOCArMjgxMiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgZ2lkX3QgZ2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRnaWQiLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRnaWQiLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRnaWRfaW1wbChtb2R1bGUsIGdpZCk7CiAKIGV4aXQ6CkBAIC0yNzU1LDEyICsyODU3LDE0IEBACiBvc193YWl0MyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7Im9wdGlvbnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJvcHRpb25zIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTp3YWl0MyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IG9wdGlvbnM7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOndhaXQzIiwgX2tleXdvcmRzLAotICAgICAgICAmb3B0aW9ucykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0M19pbXBsKG1vZHVsZSwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yNzkwLDEzICsyODk0LDE1IEBACiBvc193YWl0NChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBpZCIsICJvcHRpb25zIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGlkIiwgIm9wdGlvbnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyIiIF9QeV9QQVJTRV9QSUQgImk6d2FpdDQiLCBfa2V5d29yZHMsIDB9OwogICAgIHBpZF90IHBpZDsKICAgICBpbnQgb3B0aW9uczsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBpZCwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdDRfaW1wbChtb2R1bGUsIHBpZCwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yODM5LDggKzI5NDUsOSBAQAogICAgIGludCBvcHRpb25zOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiBfUHlfUEFSU0VfUElEICJpOndhaXRpZCIsCi0gICAgICAgICZpZHR5cGUsICZpZCwgJm9wdGlvbnMpKQorICAgICAgICAmaWR0eXBlLCAmaWQsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3dhaXRpZF9pbXBsKG1vZHVsZSwgaWR0eXBlLCBpZCwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yODc2LDggKzI5ODMsOSBAQAogICAgIGludCBvcHRpb25zOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImk6d2FpdHBpZCIsCi0gICAgICAgICZwaWQsICZvcHRpb25zKSkKKyAgICAgICAgJnBpZCwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdHBpZF9pbXBsKG1vZHVsZSwgcGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI5MDMsMTggKzMwMTEsMTkgQEAKICAgICB7IndhaXRwaWQiLCAoUHlDRnVuY3Rpb24pb3Nfd2FpdHBpZCwgTUVUSF9WQVJBUkdTLCBvc193YWl0cGlkX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1vc193YWl0cGlkX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfaW50cHRyX3QgcGlkLCBpbnQgb3B0aW9ucyk7Citvc193YWl0cGlkX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50cHRyX3QgcGlkLCBpbnQgb3B0aW9ucyk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvc193YWl0cGlkKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIFB5X2ludHB0cl90IHBpZDsKKyAgICBpbnRwdHJfdCBwaWQ7CiAgICAgaW50IG9wdGlvbnM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiaTp3YWl0cGlkIiwKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgICAgICAmcGlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0cGlkX2ltcGwobW9kdWxlLCBwaWQsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjk3NywxNSArMzA4NiwxNyBAQAogb3Nfc3ltbGluayhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InNyYyIsICJkc3QiLCAidGFyZ2V0X2lzX2RpcmVjdG9yeSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzcmMiLCAiZHN0IiwgInRhcmdldF9pc19kaXJlY3RvcnkiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJnxwJE8mOnN5bWxpbmsiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBzcmMgPSBQQVRIX1RfSU5JVElBTElaRSgic3ltbGluayIsICJzcmMiLCAwLCAwKTsKICAgICBwYXRoX3QgZHN0ID0gUEFUSF9UX0lOSVRJQUxJWkUoInN5bWxpbmsiLCAiZHN0IiwgMCwgMCk7CiAgICAgaW50IHRhcmdldF9pc19kaXJlY3RvcnkgPSAwOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8cCRPJjpzeW1saW5rIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsICZ0YXJnZXRfaXNfZGlyZWN0b3J5LCBTWU1MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsICZ0YXJnZXRfaXNfZGlyZWN0b3J5LCBTWU1MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zeW1saW5rX2ltcGwobW9kdWxlLCAmc3JjLCAmZHN0LCB0YXJnZXRfaXNfZGlyZWN0b3J5LCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzA0NSw4ICszMTU2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBwaWRfdCBwaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOmdldHNpZCIsICZwaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6Z2V0c2lkIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXRzaWRfaW1wbChtb2R1bGUsIHBpZCk7CiAKIGV4aXQ6CkBAIC0zMDk5LDggKzMyMTEsOSBAQAogICAgIHBpZF90IHBncnA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiIiBfUHlfUEFSU0VfUElEICI6c2V0cGdpZCIsCi0gICAgICAgICZwaWQsICZwZ3JwKSkKKyAgICAgICAgJnBpZCwgJnBncnApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cGdpZF9pbXBsKG1vZHVsZSwgcGlkLCBwZ3JwKTsKIAogZXhpdDoKQEAgLTMxMjksOCArMzI0Miw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnRjZ2V0cGdycCIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnRjZ2V0cGdycCIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc190Y2dldHBncnBfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTMxNjEsOCArMzI3NSw5IEBACiAgICAgcGlkX3QgcGdpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIgX1B5X1BBUlNFX1BJRCAiOnRjc2V0cGdycCIsCi0gICAgICAgICZmZCwgJnBnaWQpKQorICAgICAgICAmZmQsICZwZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Rjc2V0cGdycF9pbXBsKG1vZHVsZSwgZmQsIHBnaWQpOwogCiBleGl0OgpAQCAtMzE5MiwxOSArMzMwNywyMiBAQAogb3Nfb3BlbihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZmxhZ3MiLCAibW9kZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImZsYWdzIiwgIm1vZGUiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZpfGkkTyY6b3BlbiIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgib3BlbiIsICJwYXRoIiwgMCwgMCk7CiAgICAgaW50IGZsYWdzOwogICAgIGludCBtb2RlID0gNTExOwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8maXxpJE8mOm9wZW4iLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZsYWdzLCAmbW9kZSwgT1BFTkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZtb2RlLCBPUEVOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfb3Blbl9pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzLCBtb2RlLCBkaXJfZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMjMwLDEyICszMzQ4LDE0IEBACiBvc19jbG9zZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOmNsb3NlIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOmNsb3NlIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Nsb3NlX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC0zMjYyLDggKzMzODIsOSBAQAogICAgIGludCBmZF9oaWdoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpjbG9zZXJhbmdlIiwKLSAgICAgICAgJmZkX2xvdywgJmZkX2hpZ2gpKQorICAgICAgICAmZmRfbG93LCAmZmRfaGlnaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jbG9zZXJhbmdlX2ltcGwobW9kdWxlLCBmZF9sb3csIGZkX2hpZ2gpOwogCiBleGl0OgpAQCAtMzI4OSwxMSArMzQxMCwxMyBAQAogICAgIGludCBmZDsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpkdXAiLCAmZmQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpkdXAiLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2R1cF9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMzE2LDE0ICszNDM5LDE2IEBACiBvc19kdXAyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCAiZmQyIiwgImluaGVyaXRhYmxlIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCAiZmQyIiwgImluaGVyaXRhYmxlIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaWl8cDpkdXAyIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZmQ7CiAgICAgaW50IGZkMjsKICAgICBpbnQgaW5oZXJpdGFibGUgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWl8cDpkdXAyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQsICZmZDIsICZpbmhlcml0YWJsZSkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQsICZmZDIsICZpbmhlcml0YWJsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19kdXAyX2ltcGwobW9kdWxlLCBmZCwgZmQyLCBpbmhlcml0YWJsZSk7CiAKIGV4aXQ6CkBAIC0zMzYwLDggKzM0ODUsOSBAQAogICAgIFB5X29mZl90IGxlbmd0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPJjpsb2NrZiIsCi0gICAgICAgICZmZCwgJmNvbW1hbmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpCisgICAgICAgICZmZCwgJmNvbW1hbmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19sb2NrZl9pbXBsKG1vZHVsZSwgZmQsIGNvbW1hbmQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC0zMzk1LDExICszNTIxLDEzIEBACiAgICAgUHlfb2ZmX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8maTpsc2VlayIsCi0gICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmcG9zaXRpb24sICZob3cpKQorICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJnBvc2l0aW9uLCAmaG93KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19sc2Vla19pbXBsKG1vZHVsZSwgZmQsIHBvc2l0aW9uLCBob3cpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVB5X29mZl90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzQyNiw4ICszNTU0LDkgQEAKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaW46cmVhZCIsCi0gICAgICAgICZmZCwgJmxlbmd0aCkpCisgICAgICAgICZmZCwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19yZWFkX2ltcGwobW9kdWxlLCBmZCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTM0NjUsMTEgKzM1OTQsMTMgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnJlYWR2IiwKLSAgICAgICAgJmZkLCAmYnVmZmVycykpCisgICAgICAgICZmZCwgJmJ1ZmZlcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3JlYWR2X2ltcGwobW9kdWxlLCBmZCwgYnVmZmVycyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1MDQsOCArMzYzNSw5IEBACiAgICAgUHlfb2ZmX3Qgb2Zmc2V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU8mOnByZWFkIiwKLSAgICAgICAgJmZkLCAmbGVuZ3RoLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQpKQorICAgICAgICAmZmQsICZsZW5ndGgsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wcmVhZF9pbXBsKG1vZHVsZSwgZmQsIGxlbmd0aCwgb2Zmc2V0KTsKIAogZXhpdDoKQEAgLTM1MzUsMTcgKzM2NjcsMjAgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml5Kjp3cml0ZSIsCi0gICAgICAgICZmZCwgJmRhdGEpKQorICAgICAgICAmZmQsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc193cml0ZV9pbXBsKG1vZHVsZSwgZmQsICZkYXRhKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM1NjksMTIgKzM3MDQsMTQgQEAKIG9zX2ZzdGF0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJmZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Imk6ZnN0YXQiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6ZnN0YXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN0YXRfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTM2MDMsMTEgKzM3NDAsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19pc2F0dHlfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzY2NSw4ICszODA0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmxhZ3M7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6cGlwZTIiLCAmZmxhZ3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwaXBlMiIsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19waXBlMl9pbXBsKG1vZHVsZSwgZmxhZ3MpOwogCiBleGl0OgpAQCAtMzcwMSwxMSArMzg0MSwxMyBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86d3JpdGV2IiwKLSAgICAgICAgJmZkLCAmYnVmZmVycykpCisgICAgICAgICZmZCwgJmJ1ZmZlcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3dyaXRldl9pbXBsKG1vZHVsZSwgZmQsIGJ1ZmZlcnMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNzQyLDE3ICszODg0LDIwIEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpeSpPJjpwd3JpdGUiLAotICAgICAgICAmZmQsICZidWZmZXIsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpCisgICAgICAgICZmZCwgJmJ1ZmZlciwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19wd3JpdGVfaW1wbChtb2R1bGUsIGZkLCAmYnVmZmVyLCBvZmZzZXQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNzgyLDE0ICszOTI3LDE2IEBACiBvc19ta2ZpZm8oUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm1vZGUiLCAiZGlyX2ZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfGkkTyY6bWtmaWZvIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJta2ZpZm8iLCAicGF0aCIsIDAsIDApOwogICAgIGludCBtb2RlID0gNDM4OwogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGkkTyY6bWtmaWZvIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0ZJRk9BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIE1LRklGT0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbWtmaWZvX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTM4MzIsMTUgKzM5NzksMTcgQEAKIG9zX21rbm9kKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJtb2RlIiwgImRldmljZSIsICJkaXJfZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm1vZGUiLCAiZGV2aWNlIiwgImRpcl9mZCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mfGlPJiRPJjpta25vZCIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibWtub2QiLCAicGF0aCIsIDAsIDApOwogICAgIGludCBtb2RlID0gMzg0OwogICAgIGRldl90IGRldmljZSA9IDA7CiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8aU8mJE8mOm1rbm9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSwgTUtOT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlLCBNS05PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbWtub2RfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkZXZpY2UsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0zODczLDExICs0MDIyLDEzIEBACiAgICAgZGV2X3QgZGV2aWNlOwogICAgIHVuc2lnbmVkIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptYWpvciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOm1ham9yIiwgX1B5X0Rldl9Db252ZXJ0ZXIsICZkZXZpY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX21ham9yX2ltcGwobW9kdWxlLCBkZXZpY2UpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zOTA3LDExICs0MDU4LDEzIEBACiAgICAgZGV2X3QgZGV2aWNlOwogICAgIHVuc2lnbmVkIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptaW5vciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOm1pbm9yIiwgX1B5X0Rldl9Db252ZXJ0ZXIsICZkZXZpY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX21pbm9yX2ltcGwobW9kdWxlLCBkZXZpY2UpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zOTQzLDExICs0MDk2LDEzIEBACiAgICAgZGV2X3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6bWFrZWRldiIsCi0gICAgICAgICZtYWpvciwgJm1pbm9yKSkKKyAgICAgICAgJm1ham9yLCAmbWlub3IpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX21ha2VkZXZfaW1wbChtb2R1bGUsIG1ham9yLCBtaW5vcik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IChkZXZfdCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKGRldl90KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX1B5TG9uZ19Gcm9tRGV2KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzk3OCw4ICs0MTMzLDkgQEAKICAgICBQeV9vZmZfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJjpmdHJ1bmNhdGUiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Z0cnVuY2F0ZV9pbXBsKG1vZHVsZSwgZmQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC00MDA5LDEzICs0MTY1LDE1IEBACiBvc190cnVuY2F0ZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAibGVuZ3RoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJsZW5ndGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8mOnRydW5jYXRlIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJ0cnVuY2F0ZSIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZUUlVOQ0FURSk7CiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJjp0cnVuY2F0ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdHJ1bmNhdGVfaW1wbChtb2R1bGUsICZwYXRoLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtNDA1NCw4ICs0MjEyLDkgQEAKICAgICBQeV9vZmZfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk8mOnBvc2l4X2ZhbGxvY2F0ZSIsCi0gICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0LCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Bvc2l4X2ZhbGxvY2F0ZV9pbXBsKG1vZHVsZSwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTQwOTcsOCArNDI1Niw5IEBACiAgICAgaW50IGFkdmljZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8mTyZpOnBvc2l4X2ZhZHZpc2UiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoLCAmYWR2aWNlKSkKKyAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCwgJmFkdmljZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wb3NpeF9mYWR2aXNlX2ltcGwobW9kdWxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIGFkdmljZSk7CiAKIGV4aXQ6CkBAIC00MTI5LDggKzQyODksOSBAQAogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVVU6cHV0ZW52IiwKLSAgICAgICAgJm5hbWUsICZ2YWx1ZSkpCisgICAgICAgICZuYW1lLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcHV0ZW52X2ltcGwobW9kdWxlLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MTYxLDggKzQzMjIsOSBAQAogICAgIFB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyY6cHV0ZW52IiwKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmdmFsdWUpKQorICAgICAgICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZuYW1lLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wdXRlbnZfaW1wbChtb2R1bGUsIG5hbWUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQxOTYsOCArNDM1OCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjp1bnNldGVudiIsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5zZXRlbnYiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Vuc2V0ZW52X2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTQyMjcsOCArNDM5MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNvZGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6c3RyZXJyb3IiLCAmY29kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnN0cmVycm9yIiwgJmNvZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3RyZXJyb3JfaW1wbChtb2R1bGUsIGNvZGUpOwogCiBleGl0OgpAQCAtNDI1NiwxMSArNDQyMCwxMyBAQAogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6V0NPUkVEVU1QIiwgJnN0YXR1cykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOldDT1JFRFVNUCIsICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dDT1JFRFVNUF9pbXBsKG1vZHVsZSwgc3RhdHVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDI5MCwxNiArNDQ1NiwxOSBAQAogb3NfV0lGQ09OVElOVUVEKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXSUZDT05USU5VRUQiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRkNPTlRJTlVFRCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0YXR1cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XSUZDT05USU5VRURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQzMjYsMTYgKzQ0OTUsMTkgQEAKIG9zX1dJRlNUT1BQRUQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdGF0dXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdGF0dXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOldJRlNUT1BQRUQiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRlNUT1BQRUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGU1RPUFBFRF9pbXBsKG1vZHVsZSwgc3RhdHVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDM2MiwxNiArNDUzNCwxOSBAQAogb3NfV0lGU0lHTkFMRUQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJzdGF0dXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJzdGF0dXMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOldJRlNJR05BTEVEIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXSUZTSUdOQUxFRCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0YXR1cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XSUZTSUdOQUxFRF9pbXBsKG1vZHVsZSwgc3RhdHVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDM5OCwxNiArNDU3MywxOSBAQAogb3NfV0lGRVhJVEVEKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXSUZFWElURUQiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBzdGF0dXM7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRkVYSVRFRCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0YXR1cykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XSUZFWElURURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0MzQsMTYgKzQ2MTIsMTkgQEAKIG9zX1dFWElUU1RBVFVTKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXRVhJVFNUQVRVUyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0VYSVRTVEFUVVMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0VYSVRTVEFUVVNfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0NzAsMTYgKzQ2NTEsMTkgQEAKIG9zX1dURVJNU0lHKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXVEVSTVNJRyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V1RFUk1TSUciLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV1RFUk1TSUdfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ1MDYsMTYgKzQ2OTAsMTkgQEAKIG9zX1dTVE9QU0lHKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RhdHVzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiaTpXU1RPUFNJRyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V1NUT1BTSUciLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV1NUT1BTSUdfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ1NDYsOCArNDczMyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmZzdGF0dmZzIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZnN0YXR2ZnMiLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN0YXR2ZnNfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTQ1NzgsMTIgKzQ3NjYsMTQgQEAKIG9zX3N0YXR2ZnMoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mOnN0YXR2ZnMiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInN0YXR2ZnMiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GU1RBVFZGUyk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpzdGF0dmZzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0YXR2ZnNfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTQ2MTMsMTIgKzQ4MDMsMTQgQEAKIG9zX19nZXRkaXNrdXNhZ2UoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InU6X2dldGRpc2t1c2FnZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlfVU5JQ09ERSAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInU6X2dldGRpc2t1c2FnZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldGRpc2t1c2FnZV9pbXBsKG1vZHVsZSwgcGF0aCk7CiAKIGV4aXQ6CkBAIC00NjUyLDExICs0ODQ0LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyY6ZnBhdGhjb25mIiwKLSAgICAgICAgJmZkLCBjb252X3BhdGhfY29uZm5hbWUsICZuYW1lKSkKKyAgICAgICAgJmZkLCBjb252X3BhdGhfY29uZm5hbWUsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19mcGF0aGNvbmZfaW1wbChtb2R1bGUsIGZkLCBuYW1lKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDY4NywxNyArNDg4MSwyMCBAQAogb3NfcGF0aGNvbmYoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgIm5hbWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8mOnBhdGhjb25mIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJwYXRoY29uZiIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZQQVRIQ09ORik7CiAgICAgaW50IG5hbWU7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJjpwYXRoY29uZiIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBjb252X3BhdGhfY29uZm5hbWUsICZuYW1lKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfcGF0aGNvbmZfaW1wbChtb2R1bGUsICZwYXRoLCBuYW1lKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDcyOSw4ICs0OTI2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Y29uZnN0ciIsIGNvbnZfY29uZnN0cl9jb25mbmFtZSwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Y29uZnN0ciIsIGNvbnZfY29uZnN0cl9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY29uZnN0cl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC00NzYwLDExICs0OTU4LDEzIEBACiAgICAgaW50IG5hbWU7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzeXNjb25mIiwgY29udl9zeXNjb25mX2NvbmZuYW1lLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzeXNjb25mIiwgY29udl9zeXNjb25mX2NvbmZuYW1lLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfc3lzY29uZl9pbXBsKG1vZHVsZSwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ4MzksMTIgKzUwMzksMTQgQEAKIG9zX2RldmljZV9lbmNvZGluZyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImZkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpOmRldmljZV9lbmNvZGluZyIsIF9rZXl3b3JkcywgMH07CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpkZXZpY2VfZW5jb2RpbmciLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZGV2aWNlX2VuY29kaW5nX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00ODc0LDggKzUwNzYsOSBAQAogICAgIHVpZF90IHN1aWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJjpzZXRyZXN1aWQiLAotICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJnJ1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZzdWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmc3VpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZXN1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQsIHN1aWQpOwogCiBleGl0OgpAQCAtNDkwNyw4ICs1MTEwLDkgQEAKICAgICBnaWRfdCBzZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyY6c2V0cmVzZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmc2dpZCkpCisgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJnNnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmVzZ2lkX2ltcGwobW9kdWxlLCByZ2lkLCBlZ2lkLCBzZ2lkKTsKIAogZXhpdDoKQEAgLTQ5ODUsMTQgKzUxODksMTYgQEAKIG9zX2dldHhhdHRyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhdHRyaWJ1dGUiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJhdHRyaWJ1dGUiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZPJnwkcDpnZXR4YXR0ciIsIF9rZXl3b3JkcywgMH07CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiZ2V0eGF0dHIiLCAicGF0aCIsIDAsIDEpOwogICAgIHBhdGhfdCBhdHRyaWJ1dGUgPSBQQVRIX1RfSU5JVElBTElaRSgiZ2V0eGF0dHIiLCAiYXR0cmlidXRlIiwgMCwgMCk7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRwOmdldHhhdHRyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0eGF0dHJfaW1wbChtb2R1bGUsICZwYXRoLCAmYXR0cmlidXRlLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtNTAzMSwxNiArNTIzNywxOCBAQAogb3Nfc2V0eGF0dHIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImF0dHJpYnV0ZSIsICJ2YWx1ZSIsICJmbGFncyIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJwYXRoIiwgImF0dHJpYnV0ZSIsICJ2YWx1ZSIsICJmbGFncyIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPJk8meSp8aSRwOnNldHhhdHRyIiwgX2tleXdvcmRzLCAwfTsKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJzZXR4YXR0ciIsICJwYXRoIiwgMCwgMSk7CiAgICAgcGF0aF90IGF0dHJpYnV0ZSA9IFBBVEhfVF9JTklUSUFMSVpFKCJzZXR4YXR0ciIsICJhdHRyaWJ1dGUiLCAwLCAwKTsKICAgICBQeV9idWZmZXIgdmFsdWUgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IGZsYWdzID0gMDsKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ5KnxpJHA6c2V0eGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZ2YWx1ZSwgJmZsYWdzLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZ2YWx1ZSwgJmZsYWdzLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldHhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgJmF0dHJpYnV0ZSwgJnZhbHVlLCBmbGFncywgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUwNDksOCArNTI1Nyw5IEBACiAgICAgLyogQ2xlYW51cCBmb3IgYXR0cmlidXRlICovCiAgICAgcGF0aF9jbGVhbnVwKCZhdHRyaWJ1dGUpOwogICAgIC8qIENsZWFudXAgZm9yIHZhbHVlICovCi0gICAgaWYgKHZhbHVlLm9iaikKKyAgICBpZiAodmFsdWUub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFsdWUpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01MDgxLDE0ICs1MjkwLDE2IEBACiBvc19yZW1vdmV4YXR0cihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXR0cmlidXRlIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCAiYXR0cmlidXRlIiwgImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mTyZ8JHA6cmVtb3ZleGF0dHIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbW92ZXhhdHRyIiwgInBhdGgiLCAwLCAxKTsKICAgICBwYXRoX3QgYXR0cmlidXRlID0gUEFUSF9UX0lOSVRJQUxJWkUoInJlbW92ZXhhdHRyIiwgImF0dHJpYnV0ZSIsIDAsIDApOwogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnwkcDpyZW1vdmV4YXR0ciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbW92ZXhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgJmF0dHJpYnV0ZSwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUxMjYsMTMgKzUzMzcsMTUgQEAKIG9zX2xpc3R4YXR0cihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InBhdGgiLCAiZm9sbG93X3N5bWxpbmtzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsicGF0aCIsICJmb2xsb3dfc3ltbGlua3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8TyYkcDpsaXN0eGF0dHIiLCBfa2V5d29yZHMsIDB9OwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoImxpc3R4YXR0ciIsICJwYXRoIiwgMSwgMSk7CiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyYkcDpsaXN0eGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbGlzdHhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUxNjIsOCArNTM3NSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzaXplOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnVyYW5kb20iLCAmc2l6ZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnVyYW5kb20iLCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191cmFuZG9tX2ltcGwobW9kdWxlLCBzaXplKTsKIAogZXhpdDoKQEAgLTUxNzQsNyArNTM4OCwxMSBAQAogImNwdV9jb3VudCgkbW9kdWxlLCAvKVxuIgogIi0tXG4iCiAiXG4iCi0iUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtOyByZXR1cm4gTm9uZSBpZiBpbmRldGVybWluYWJsZS4iKTsKKyJSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW07IHJldHVybiBOb25lIGlmIGluZGV0ZXJtaW5hYmxlLlxuIgorIlxuIgorIlRoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhblxuIgorInVzZS4gIFRoZSBudW1iZXIgb2YgdXNhYmxlIENQVXMgY2FuIGJlIG9idGFpbmVkIHdpdGhcbiIKKyJgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYCIpOwogCiAjZGVmaW5lIE9TX0NQVV9DT1VOVF9NRVRIT0RERUYgICAgXAogICAgIHsiY3B1X2NvdW50IiwgKFB5Q0Z1bmN0aW9uKW9zX2NwdV9jb3VudCwgTUVUSF9OT0FSR1MsIG9zX2NwdV9jb3VudF9fZG9jX199LApAQCAtNTIwNywxMSArNTQyNSwxMyBAQAogICAgIGludCBmZDsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfaW5oZXJpdGFibGUiLCAmZmQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfaW5oZXJpdGFibGUiLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2dldF9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MjM4LDggKzU0NTgsOSBAQAogICAgIGludCBpbmhlcml0YWJsZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2V0X2luaGVyaXRhYmxlIiwKLSAgICAgICAgJmZkLCAmaW5oZXJpdGFibGUpKQorICAgICAgICAmZmQsICZpbmhlcml0YWJsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRfaW5oZXJpdGFibGVfaW1wbChtb2R1bGUsIGZkLCBpbmhlcml0YWJsZSk7CiAKIGV4aXQ6CkBAIC01MjU4LDIwICs1NDc5LDIyIEBACiAgICAgeyJnZXRfaGFuZGxlX2luaGVyaXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKW9zX2dldF9oYW5kbGVfaW5oZXJpdGFibGUsIE1FVEhfTywgb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZV9fZG9jX199LAogCiBzdGF0aWMgaW50Ci1vc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfaW50cHRyX3QgaGFuZGxlKTsKK29zX2dldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnRwdHJfdCBoYW5kbGUpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJnKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIFB5X2ludHB0cl90IGhhbmRsZTsKKyAgICBpbnRwdHJfdCBoYW5kbGU7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MjkyLDE5ICs1NTE1LDIwIEBACiAgICAgeyJzZXRfaGFuZGxlX2luaGVyaXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKW9zX3NldF9oYW5kbGVfaW5oZXJpdGFibGUsIE1FVEhfVkFSQVJHUywgb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwKK29zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnRwdHJfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaGVyaXRhYmxlKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX3NldF9oYW5kbGVfaW5oZXJpdGFibGUoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfaW50cHRyX3QgaGFuZGxlOworICAgIGludHB0cl90IGhhbmRsZTsKICAgICBpbnQgaW5oZXJpdGFibGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX0lOVFBUUiAicDpzZXRfaGFuZGxlX2luaGVyaXRhYmxlIiwKLSAgICAgICAgJmhhbmRsZSwgJmluaGVyaXRhYmxlKSkKKyAgICAgICAgJmhhbmRsZSwgJmluaGVyaXRhYmxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgaW5oZXJpdGFibGUpOwogCiBleGl0OgpAQCAtNTMxMyw2ICs1NTM3LDc1IEBACiAKICNlbmRpZiAvKiBkZWZpbmVkKE1TX1dJTkRPV1MpICovCiAKK1B5RG9jX1NUUlZBUihvc19mc3BhdGhfX2RvY19fLAorImZzcGF0aCgkbW9kdWxlLCAvLCBwYXRoKVxuIgorIi0tXG4iCisiXG4iCisiUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXG4iCisiXG4iCisiSWYgdGhlIG9iamVjdCBpcyBzdHIgb3IgYnl0ZXMsIHRoZW4gYWxsb3cgaXQgdG8gcGFzcyB0aHJvdWdoIGFzLWlzLiBJZiB0aGVcbiIKKyJvYmplY3QgZGVmaW5lcyBfX2ZzcGF0aF9fKCksIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdCBtZXRob2QuIEFsbCBvdGhlclxuIgorInR5cGVzIHJhaXNlIGEgVHlwZUVycm9yLiIpOworCisjZGVmaW5lIE9TX0ZTUEFUSF9NRVRIT0RERUYgICAgXAorICAgIHsiZnNwYXRoIiwgKFB5Q0Z1bmN0aW9uKW9zX2ZzcGF0aCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIG9zX2ZzcGF0aF9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZnNwYXRoX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnBhdGgpOworCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZnNwYXRoKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InBhdGgiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPOmZzcGF0aCIsIF9rZXl3b3JkcywgMH07CisgICAgUHlPYmplY3QgKnBhdGg7CisKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZwYXRoKSkgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IG9zX2ZzcGF0aF9pbXBsKG1vZHVsZSwgcGF0aCk7CisKK2V4aXQ6CisgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworI2lmIGRlZmluZWQoSEFWRV9HRVRSQU5ET01fU1lTQ0FMTCkKKworUHlEb2NfU1RSVkFSKG9zX2dldHJhbmRvbV9fZG9jX18sCisiZ2V0cmFuZG9tKCRtb2R1bGUsIC8sIHNpemUsIGZsYWdzPTApXG4iCisiLS1cbiIKKyJcbiIKKyJPYnRhaW4gYSBzZXJpZXMgb2YgcmFuZG9tIGJ5dGVzLiIpOworCisjZGVmaW5lIE9TX0dFVFJBTkRPTV9NRVRIT0RERUYgICAgXAorICAgIHsiZ2V0cmFuZG9tIiwgKFB5Q0Z1bmN0aW9uKW9zX2dldHJhbmRvbSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIG9zX2dldHJhbmRvbV9fZG9jX199LAorCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZ2V0cmFuZG9tX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfc3NpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZ2V0cmFuZG9tKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNpemUiLCAiZmxhZ3MiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJufGk6Z2V0cmFuZG9tIiwgX2tleXdvcmRzLCAwfTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IGZsYWdzID0gMDsKKworICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnNpemUsICZmbGFncykpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBvc19nZXRyYW5kb21faW1wbChtb2R1bGUsIHNpemUsIGZsYWdzKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCisjZW5kaWYgLyogZGVmaW5lZChIQVZFX0dFVFJBTkRPTV9TWVNDQUxMKSAqLworCiAjaWZuZGVmIE9TX1RUWU5BTUVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBPU19UVFlOQU1FX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE9TX1RUWU5BTUVfTUVUSE9EREVGKSAqLwpAQCAtNTc4NCw0ICs2MDc3LDggQEAKICNpZm5kZWYgT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYKICAgICAjZGVmaW5lIE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OWQ1ZjgzMWIyMzE0NWQxZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisKKyNpZm5kZWYgT1NfR0VUUkFORE9NX01FVEhPRERFRgorICAgICNkZWZpbmUgT1NfR0VUUkFORE9NX01FVEhPRERFRgorI2VuZGlmIC8qICFkZWZpbmVkKE9TX0dFVFJBTkRPTV9NRVRIT0RERUYpICovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmNlNTFjN2Q0MzI2NjJjMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvcHdkbW9kdWxlLmMuaAppbmRleCBjYjE5MWEwLi5mOWUwNjQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B3ZG1vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqYXJnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmdfLCAiVTpnZXRwd25hbSIsICZhcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0cHduYW0iLCAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB3ZF9nZXRwd25hbV9pbXBsKG1vZHVsZSwgYXJnKTsKIAogZXhpdDoKQEAgLTY4LDQgKzY5LDQgQEAKICNpZm5kZWYgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFBXRF9HRVRQV0FMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDBlYTFjNWM4MzJmMGMxYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmM0MWQ4ZDg4ZWMyMDZkOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaCBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCmluZGV4IGM1YjVjNzEuLjhhMDNmNjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCkBAIC0yNSw4ICsyNSw5IEBACiAgICAgaW50IGlzZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6UGFyc2UiLAotICAgICAgICAmZGF0YSwgJmlzZmluYWwpKQorICAgICAgICAmZGF0YSwgJmlzZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfUGFyc2VfaW1wbChzZWxmLCBkYXRhLCBpc2ZpbmFsKTsKIAogZXhpdDoKQEAgLTYwLDggKzYxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpiYXNlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRCYXNlX2ltcGwoc2VsZiwgYmFzZSk7CiAKIGV4aXQ6CkBAIC0xMjksOCArMTMxLDkgQEAKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8czpFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIsCi0gICAgICAgICZjb250ZXh0LCAmZW5jb2RpbmcpKQorICAgICAgICAmY29udGV4dCwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfeG1scGFyc2VyX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlX2ltcGwoc2VsZiwgY29udGV4dCwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtMTYwLDggKzE2Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZsYWc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6U2V0UGFyYW1FbnRpdHlQYXJzaW5nIiwgJmZsYWcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpTZXRQYXJhbUVudGl0eVBhcnNpbmciLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRQYXJhbUVudGl0eVBhcnNpbmdfaW1wbChzZWxmLCBmbGFnKTsKIAogZXhpdDoKQEAgLTE5Myw4ICsxOTcsOSBAQAogICAgIGludCBmbGFnID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHA6VXNlRm9yZWlnbkRURCIsCi0gICAgICAgICZmbGFnKSkKKyAgICAgICAgJmZsYWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfVXNlRm9yZWlnbkRURF9pbXBsKHNlbGYsIGZsYWcpOwogCiBleGl0OgpAQCAtMjM4LDE0ICsyNDMsMTYgQEAKIHB5ZXhwYXRfUGFyc2VyQ3JlYXRlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZW5jb2RpbmciLCAibmFtZXNwYWNlX3NlcGFyYXRvciIsICJpbnRlcm4iLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJuYW1lc3BhY2Vfc2VwYXJhdG9yIiwgImludGVybiIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Inx6ek86UGFyc2VyQ3JlYXRlIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbmFtZXNwYWNlX3NlcGFyYXRvciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmludGVybiA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8enpPOlBhcnNlckNyZWF0ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVuY29kaW5nLCAmbmFtZXNwYWNlX3NlcGFyYXRvciwgJmludGVybikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZW5jb2RpbmcsICZuYW1lc3BhY2Vfc2VwYXJhdG9yLCAmaW50ZXJuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfUGFyc2VyQ3JlYXRlX2ltcGwobW9kdWxlLCBlbmNvZGluZywgbmFtZXNwYWNlX3NlcGFyYXRvciwgaW50ZXJuKTsKIAogZXhpdDoKQEAgLTI3MCw4ICsyNzcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGxvbmcgY29kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibDpFcnJvclN0cmluZyIsICZjb2RlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImw6RXJyb3JTdHJpbmciLCAmY29kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X0Vycm9yU3RyaW5nX2ltcGwobW9kdWxlLCBjb2RlKTsKIAogZXhpdDoKQEAgLTI4MSw0ICsyODksNCBAQAogI2lmbmRlZiBQWUVYUEFUX1hNTFBBUlNFUl9VU0VGT1JFSUdORFREX01FVEhPRERFRgogICAgICNkZWZpbmUgUFlFWFBBVF9YTUxQQVJTRVJfVVNFRk9SRUlHTkRURF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChQWUVYUEFUX1hNTFBBUlNFUl9VU0VGT1JFSUdORFREX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kNDc5Y2ZhYjYwN2U5ZGM4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05M2NmZTY2MmYyYmM0OGU1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3NoYTFtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2hhMW1vZHVsZS5jLmgKaW5kZXggNWI4ZGI4MC4uMTk3Mjc2MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvc2hhMW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvc2hhMW1vZHVsZS5jLmgKQEAgLTgxLDE1ICs4MSwxNyBAQAogX3NoYTFfc2hhMShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOnNoYTEiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86c2hhMSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zaGExX3NoYTFfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wYjZhMTk0ZmJiMGI5NGYyIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NDlhNWQwOGMyNDgzMzdkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3NoYTI1Nm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oCmluZGV4IDY2MTU2OWMuLjQyMzlhYjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3NoYTI1Nm1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvc2hhMjU2bW9kdWxlLmMuaApAQCAtODEsMTIgKzgxLDE0IEBACiBfc2hhMjU2X3NoYTI1NihQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOnNoYTI1NiIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpzaGEyNTYiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMjU2X3NoYTI1Nl9pbXBsKG1vZHVsZSwgc3RyaW5nKTsKIAogZXhpdDoKQEAgLTEwOSwxNSArMTExLDE3IEBACiBfc2hhMjU2X3NoYTIyNChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InN0cmluZyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPOnNoYTIyNCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpzaGEyMjQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMjU2X3NoYTIyNF9pbXBsKG1vZHVsZSwgc3RyaW5nKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVhMWZjNTQ4MGUzOTlmOTUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWExMjk2YmE2ZDA3ODAwNTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3NoYTUxMm1vZHVsZS5jLmgKaW5kZXggZDY0YzJhNC4uNzhmNzc0MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaGE1MTJtb2R1bGUuYy5oCkBAIC05OSwxMiArOTksMTQgQEAKIF9zaGE1MTJfc2hhNTEyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86c2hhNTEyIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTUxMiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zaGE1MTJfc2hhNTEyX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgpAQCAtMTMxLDEyICsxMzMsMTQgQEAKIF9zaGE1MTJfc2hhMzg0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic3RyaW5nIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE86c2hhMzg0IiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTM4NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zaGE1MTJfc2hhMzg0X2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgpAQCAtMTY4LDQgKzE3Miw0IEBACiAjaWZuZGVmIF9TSEE1MTJfU0hBMzg0X01FVEhPRERFRgogICAgICNkZWZpbmUgX1NIQTUxMl9TSEEzODRfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1NIQTUxMl9TSEEzODRfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJiODdmNDk0ZGY1MGZmYzAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWNmMGRhNzZjYjYwM2QxYmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2lnbmFsbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3NpZ25hbG1vZHVsZS5jLmgKaW5kZXggYzhmNGNkNS4uZjhkNWJkOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvc2lnbmFsbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oCkBAIC0yMywxMSArMjMsMTMgQEAKICAgICBpbnQgc2Vjb25kczsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6YWxhcm0iLCAmc2Vjb25kcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmFsYXJtIiwgJnNlY29uZHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHNpZ25hbF9hbGFybV9pbXBsKG1vZHVsZSwgc2Vjb25kcyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTg1LDggKzg3LDkgQEAKICAgICBQeU9iamVjdCAqaGFuZGxlcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86c2lnbmFsIiwKLSAgICAgICAgJnNpZ25hbG51bSwgJmhhbmRsZXIpKQorICAgICAgICAmc2lnbmFsbnVtLCAmaGFuZGxlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2lnbmFsX2ltcGwobW9kdWxlLCBzaWduYWxudW0sIGhhbmRsZXIpOwogCiBleGl0OgpAQCAtMTE3LDggKzEyMCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHNpZ25hbG51bTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRzaWduYWwiLCAmc2lnbmFsbnVtKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Z2V0c2lnbmFsIiwgJnNpZ25hbG51bSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfZ2V0c2lnbmFsX2ltcGwobW9kdWxlLCBzaWduYWxudW0pOwogCiBleGl0OgpAQCAtMTUwLDggKzE1NCw5IEBACiAgICAgaW50IGZsYWc7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnNpZ2ludGVycnVwdCIsCi0gICAgICAgICZzaWduYWxudW0sICZmbGFnKSkKKyAgICAgICAgJnNpZ25hbG51bSwgJmZsYWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3NpZ2ludGVycnVwdF9pbXBsKG1vZHVsZSwgc2lnbmFsbnVtLCBmbGFnKTsKIAogZXhpdDoKQEAgLTE4OSw4ICsxOTQsOSBAQAogICAgIGRvdWJsZSBpbnRlcnZhbCA9IDAuMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWR8ZDpzZXRpdGltZXIiLAotICAgICAgICAmd2hpY2gsICZzZWNvbmRzLCAmaW50ZXJ2YWwpKQorICAgICAgICAmd2hpY2gsICZzZWNvbmRzLCAmaW50ZXJ2YWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3NldGl0aW1lcl9pbXBsKG1vZHVsZSwgd2hpY2gsIHNlY29uZHMsIGludGVydmFsKTsKIAogZXhpdDoKQEAgLTIxOSw4ICsyMjUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB3aGljaDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRpdGltZXIiLCAmd2hpY2gpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRpdGltZXIiLCAmd2hpY2gpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX2dldGl0aW1lcl9pbXBsKG1vZHVsZSwgd2hpY2gpOwogCiBleGl0OgpAQCAtMjUxLDggKzI1OCw5IEBACiAgICAgUHlPYmplY3QgKm1hc2s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnB0aHJlYWRfc2lnbWFzayIsCi0gICAgICAgICZob3csICZtYXNrKSkKKyAgICAgICAgJmhvdywgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3B0aHJlYWRfc2lnbWFza19pbXBsKG1vZHVsZSwgaG93LCBtYXNrKTsKIAogZXhpdDoKQEAgLTM0NCw4ICszNTIsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2lndGltZWR3YWl0IiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJnNpZ3NldCwgJnRpbWVvdXRfb2JqKSkKKyAgICAgICAgJnNpZ3NldCwgJnRpbWVvdXRfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9zaWd0aW1lZHdhaXRfaW1wbChtb2R1bGUsIHNpZ3NldCwgdGltZW91dF9vYmopOwogCiBleGl0OgpAQCAtMzc2LDggKzM4NSw5IEBACiAgICAgaW50IHNpZ25hbG51bTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6cHRocmVhZF9raWxsIiwKLSAgICAgICAgJnRocmVhZF9pZCwgJnNpZ25hbG51bSkpCisgICAgICAgICZ0aHJlYWRfaWQsICZzaWduYWxudW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3B0aHJlYWRfa2lsbF9pbXBsKG1vZHVsZSwgdGhyZWFkX2lkLCBzaWduYWxudW0pOwogCiBleGl0OgpAQCAtNDI5LDQgKzQzOSw0IEBACiAjaWZuZGVmIFNJR05BTF9QVEhSRUFEX0tJTExfTUVUSE9EREVGCiAgICAgI2RlZmluZSBTSUdOQUxfUFRIUkVBRF9LSUxMX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFNJR05BTF9QVEhSRUFEX0tJTExfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhZmE1OTg0MTJiZmI4ZDIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM2OTkwZWYwZDBiYTcyYjYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc3B3ZG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaAppbmRleCBlMjZhY2YxLi5iMjQ3OWZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaApAQCAtMjQsOCArMjQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICphcmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ18sICJVOmdldHNwbmFtIiwgJmFyZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdfLCAiVTpnZXRzcG5hbSIsICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc3B3ZF9nZXRzcG5hbV9pbXBsKG1vZHVsZSwgYXJnKTsKIAogZXhpdDoKQEAgLTY1LDQgKzY2LDQgQEAKICNpZm5kZWYgU1BXRF9HRVRTUEFMTF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFNQV0RfR0VUU1BBTExfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoU1BXRF9HRVRTUEFMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTEwZjY4MWIzNmY1NGMzMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDdjZDhhZjBhZmQ3N2ZlNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy91bmljb2RlZGF0YS5jLmggYi9Nb2R1bGVzL2NsaW5pYy91bmljb2RlZGF0YS5jLmgKaW5kZXggZDUyMGMxZS4uZDQ4MWNjYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvdW5pY29kZWRhdGEuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaApAQCAtMjcsOCArMjcsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOmRlY2ltYWwiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9kZWNpbWFsX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU5LDggKzYwLDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkN8TzpkaWdpdCIsCi0gICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2RpZ2l0X2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTkyLDggKzk0LDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkN8TzpudW1lcmljIiwKLSAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfbnVtZXJpY19pbXBsKHNlbGYsIGNociwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMTgsOCArMTIxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmNhdGVnb3J5IiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmNhdGVnb3J5IiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfY2F0ZWdvcnlfaW1wbChzZWxmLCBjaHIpOwogCiBleGl0OgpAQCAtMTQ2LDggKzE1MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNocjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpiaWRpcmVjdGlvbmFsIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmJpZGlyZWN0aW9uYWwiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9iaWRpcmVjdGlvbmFsX2ltcGwoc2VsZiwgY2hyKTsKIAogZXhpdDoKQEAgLTE3NSwxMSArMTgwLDEzIEBACiAgICAgaW50IGNocjsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpjb21iaW5pbmciLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y29tYmluaW5nIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2NvbWJpbmluZ19pbXBsKHNlbGYsIGNocik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTIwOCwxMSArMjE1LDEzIEBACiAgICAgaW50IGNocjsKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzptaXJyb3JlZCIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzptaXJyb3JlZCIsICZjaHIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9taXJyb3JlZF9pbXBsKHNlbGYsIGNocik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTIzNyw4ICsyNDYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6ZWFzdF9hc2lhbl93aWR0aCIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzplYXN0X2FzaWFuX3dpZHRoIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZWFzdF9hc2lhbl93aWR0aF9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0yNjUsOCArMjc1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmRlY29tcG9zaXRpb24iLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6ZGVjb21wb3NpdGlvbiIsICZjaHIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2RlY29tcG9zaXRpb25faW1wbChzZWxmLCBjaHIpOwogCiBleGl0OgpAQCAtMjk2LDggKzMwNyw5IEBACiAgICAgUHlPYmplY3QgKmlucHV0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTyE6bm9ybWFsaXplIiwKLSAgICAgICAgJmZvcm0sICZQeVVuaWNvZGVfVHlwZSwgJmlucHV0KSkKKyAgICAgICAgJmZvcm0sICZQeVVuaWNvZGVfVHlwZSwgJmlucHV0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9ub3JtYWxpemVfaW1wbChzZWxmLCBmb3JtLCBpbnB1dCk7CiAKIGV4aXQ6CkBAIC0zMjcsOCArMzM5LDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkN8TzpuYW1lIiwKLSAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfbmFtZV9pbXBsKHNlbGYsIGNociwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNTgsMTEgKzM3MSwxMiBAQAogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgUHlfc3NpemVfY2xlYW5fdCBuYW1lX2xlbmd0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicyM6bG9va3VwIiwgJm5hbWUsICZuYW1lX2xlbmd0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9sb29rdXBfaW1wbChzZWxmLCBuYW1lLCBuYW1lX2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZjhkYTMzYzZiYzZlZmM5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MzEzY2UxMjlkYTg3YjJmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3psaWJtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmgKaW5kZXggYjFhZjdjZS4uMTcyMzA4YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmgKQEAgLTMsNDQgKzMsNDggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogUHlEb2NfU1RSVkFSKHpsaWJfY29tcHJlc3NfX2RvY19fLAotImNvbXByZXNzKCRtb2R1bGUsIGJ5dGVzLCBsZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04sIC8pXG4iCisiY29tcHJlc3MoJG1vZHVsZSwgZGF0YSwgLywgbGV2ZWw9Wl9ERUZBVUxUX0NPTVBSRVNTSU9OKVxuIgogIi0tXG4iCiAiXG4iCiAiUmV0dXJucyBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIGNvbXByZXNzZWQgZGF0YS5cbiIKICJcbiIKLSIgIGJ5dGVzXG4iCisiICBkYXRhXG4iCiAiICAgIEJpbmFyeSBkYXRhIHRvIGJlIGNvbXByZXNzZWQuXG4iCiAiICBsZXZlbFxuIgotIiAgICBDb21wcmVzc2lvbiBsZXZlbCwgaW4gMC05LiIpOworIiAgICBDb21wcmVzc2lvbiBsZXZlbCwgaW4gMC05IG9yIC0xLiIpOwogCiAjZGVmaW5lIFpMSUJfQ09NUFJFU1NfTUVUSE9EREVGICAgIFwKLSAgICB7ImNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKXpsaWJfY29tcHJlc3MsIE1FVEhfVkFSQVJHUywgemxpYl9jb21wcmVzc19fZG9jX199LAorICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9jb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIHpsaWJfY29tcHJlc3NfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLXpsaWJfY29tcHJlc3NfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmJ5dGVzLCBpbnQgbGV2ZWwpOworemxpYl9jb21wcmVzc19pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IGxldmVsKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLXpsaWJfY29tcHJlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MpCit6bGliX2NvbXByZXNzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIFB5X2J1ZmZlciBieXRlcyA9IHtOVUxMLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyIiLCAibGV2ZWwiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ5KnxpOmNvbXByZXNzIiwgX2tleXdvcmRzLCAwfTsKKyAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKICAgICBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfGk6Y29tcHJlc3MiLAotICAgICAgICAmYnl0ZXMsICZsZXZlbCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZGF0YSwgJmxldmVsKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc19pbXBsKG1vZHVsZSwgJmJ5dGVzLCBsZXZlbCk7CisgICAgfQorICAgIHJldHVybl92YWx1ZSA9IHpsaWJfY29tcHJlc3NfaW1wbChtb2R1bGUsICZkYXRhLCBsZXZlbCk7CiAKIGV4aXQ6Ci0gICAgLyogQ2xlYW51cCBmb3IgYnl0ZXMgKi8KLSAgICBpZiAoYnl0ZXMub2JqKQotICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ5dGVzKTsKKyAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCisgICAgaWYgKGRhdGEub2JqKSB7CisgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKHpsaWJfZGVjb21wcmVzc19fZG9jX18sCi0iZGVjb21wcmVzcygkbW9kdWxlLCBkYXRhLCB3Yml0cz1NQVhfV0JJVFMsIGJ1ZnNpemU9REVGX0JVRl9TSVpFLCAvKVxuIgorImRlY29tcHJlc3MoJG1vZHVsZSwgZGF0YSwgLywgd2JpdHM9TUFYX1dCSVRTLCBidWZzaXplPURFRl9CVUZfU0laRSlcbiIKICItLVxuIgogIlxuIgogIlJldHVybnMgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgdW5jb21wcmVzc2VkIGRhdGEuXG4iCkBAIC01MywyOSArNTcsMzMgQEAKICIgICAgVGhlIGluaXRpYWwgb3V0cHV0IGJ1ZmZlciBzaXplLiIpOwogCiAjZGVmaW5lIFpMSUJfREVDT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbil6bGliX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywgemxpYl9kZWNvbXByZXNzX19kb2NfX30sCisgICAgeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKXpsaWJfZGVjb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIHpsaWJfZGVjb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgogemxpYl9kZWNvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgd2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGJ1ZnNpemUpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9kZWNvbXByZXNzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQoremxpYl9kZWNvbXByZXNzKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IiIsICJ3Yml0cyIsICJidWZzaXplIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsieSp8aU8mOmRlY29tcHJlc3MiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogICAgIGludCB3Yml0cyA9IE1BWF9XQklUUzsKICAgICBQeV9zc2l6ZV90IGJ1ZnNpemUgPSBERUZfQlVGX1NJWkU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfGlPJjpkZWNvbXByZXNzIiwKLSAgICAgICAgJmRhdGEsICZ3Yml0cywgc3NpemVfdF9jb252ZXJ0ZXIsICZidWZzaXplKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCAmd2JpdHMsIHNzaXplX3RfY29udmVydGVyLCAmYnVmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX2RlY29tcHJlc3NfaW1wbChtb2R1bGUsICZkYXRhLCB3Yml0cywgYnVmc2l6ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTIxLDcgKzEyOSw4IEBACiB6bGliX2NvbXByZXNzb2JqKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsibGV2ZWwiLCAibWV0aG9kIiwgIndiaXRzIiwgIm1lbUxldmVsIiwgInN0cmF0ZWd5IiwgInpkaWN0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsibGV2ZWwiLCAibWV0aG9kIiwgIndiaXRzIiwgIm1lbUxldmVsIiwgInN0cmF0ZWd5IiwgInpkaWN0IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifGlpaWlpeSo6Y29tcHJlc3NvYmoiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKICAgICBpbnQgbWV0aG9kID0gREVGTEFURUQ7CiAgICAgaW50IHdiaXRzID0gTUFYX1dCSVRTOwpAQCAtMTI5LDE1ICsxMzgsMTcgQEAKICAgICBpbnQgc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7CiAgICAgUHlfYnVmZmVyIHpkaWN0ID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlpaWlpeSo6Y29tcHJlc3NvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZsZXZlbCwgJm1ldGhvZCwgJndiaXRzLCAmbWVtTGV2ZWwsICZzdHJhdGVneSwgJnpkaWN0KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZsZXZlbCwgJm1ldGhvZCwgJndiaXRzLCAmbWVtTGV2ZWwsICZzdHJhdGVneSwgJnpkaWN0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfY29tcHJlc3NvYmpfaW1wbChtb2R1bGUsIGxldmVsLCBtZXRob2QsIHdiaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksICZ6ZGljdCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgemRpY3QgKi8KLSAgICBpZiAoemRpY3Qub2JqKQorICAgIGlmICh6ZGljdC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ6ZGljdCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE2NCwxMyArMTc1LDE1IEBACiB6bGliX2RlY29tcHJlc3NvYmooUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJ3Yml0cyIsICJ6ZGljdCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IndiaXRzIiwgInpkaWN0IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifGlPOmRlY29tcHJlc3NvYmoiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCB3Yml0cyA9IE1BWF9XQklUUzsKICAgICBQeU9iamVjdCAqemRpY3QgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlPOmRlY29tcHJlc3NvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZ3Yml0cywgJnpkaWN0KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ3Yml0cywgJnpkaWN0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfZGVjb21wcmVzc29ial9pbXBsKG1vZHVsZSwgd2JpdHMsIHpkaWN0KTsKIAogZXhpdDoKQEAgLTIwMiwyMCArMjE1LDIyIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0NvbXByZXNzX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKHpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzX19kb2NfXywKLSJkZWNvbXByZXNzKCRzZWxmLCBkYXRhLCBtYXhfbGVuZ3RoPTAsIC8pXG4iCisiZGVjb21wcmVzcygkc2VsZiwgZGF0YSwgLywgbWF4X2xlbmd0aD0wKVxuIgogIi0tXG4iCiAiXG4iCiAiUmV0dXJuIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLlxuIgpAQCAtMjMyLDI4ICsyNDcsMzIgQEAKICJDYWxsIHRoZSBmbHVzaCgpIG1ldGhvZCB0byBjbGVhciB0aGVzZSBidWZmZXJzLiIpOwogCiAjZGVmaW5lIFpMSUJfREVDT01QUkVTU19ERUNPTVBSRVNTX01FVEhPRERFRiAgICBcCi0gICAgeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKXpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsIHpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzX19kb2NfX30sCisgICAgeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKXpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKIHpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzX2ltcGwoY29tcG9iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3MoY29tcG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit6bGliX0RlY29tcHJlc3NfZGVjb21wcmVzcyhjb21wb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyIiLCAibWF4X2xlbmd0aCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InkqfE8mOmRlY29tcHJlc3MiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfE8mOmRlY29tcHJlc3MiLAotICAgICAgICAmZGF0YSwgc3NpemVfdF9jb252ZXJ0ZXIsICZtYXhfbGVuZ3RoKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZkYXRhLCBzc2l6ZV90X2NvbnZlcnRlciwgJm1heF9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9EZWNvbXByZXNzX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjgzLDggKzMwMiw5IEBACiAgICAgaW50IG1vZGUgPSBaX0ZJTklTSDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Zmx1c2giLAotICAgICAgICAmbW9kZSkpCisgICAgICAgICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfQ29tcHJlc3NfZmx1c2hfaW1wbChzZWxmLCBtb2RlKTsKIAogZXhpdDoKQEAgLTM1Nyw4ICszNzcsOSBAQAogICAgIFB5X3NzaXplX3QgbGVuZ3RoID0gREVGX0JVRl9TSVpFOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8TyY6Zmx1c2giLAotICAgICAgICBzc2l6ZV90X2NvbnZlcnRlciwgJmxlbmd0aCkpCisgICAgICAgIHNzaXplX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfRGVjb21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC0zOTAsMTQgKzQxMSwxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6YWRsZXIzMiIsCi0gICAgICAgICZkYXRhLCAmdmFsdWUpKQorICAgICAgICAmZGF0YSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfYWRsZXIzMl9pbXBsKG1vZHVsZSwgJmRhdGEsIHZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MjcsMTQgKzQ1MCwxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6Y3JjMzIiLAotICAgICAgICAmZGF0YSwgJnZhbHVlKSkKKyAgICAgICAgJmRhdGEsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NyYzMyX2ltcGwobW9kdWxlLCAmZGF0YSwgdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ0Miw0ICs0NjcsNCBAQAogI2lmbmRlZiBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAgICAgI2RlZmluZSBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoWkxJQl9DT01QUkVTU19DT1BZX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NzExZWYwMmQxZDU3NzZjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ODkxMWVmNDI5YjY1OTAzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY21hdGhtb2R1bGUuYyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwppbmRleCBjYmE0MmE3Li44MzE5NzY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCkBAIC04MSw2ICs4MSw1NCBAQAogI2VuZGlmCiAjZGVmaW5lIENNX1NDQUxFX0RPV04gKC0oQ01fU0NBTEVfVVArMSkvMikKIAorLyogQ29uc3RhbnRzIGNtYXRoLmluZiwgY21hdGguaW5maiwgY21hdGgubmFuLCBjbWF0aC5uYW5qLgorICAgY21hdGgubmFuIGFuZCBjbWF0aC5uYW5qIGFyZSBkZWZpbmVkIG9ubHkgd2hlbiBlaXRoZXIKKyAgIFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIgaXMgKm5vdCogZGVmaW5lZCAod2hpY2ggc2hvdWxkIGJlCisgICB0aGUgbW9zdCBjb21tb24gc2l0dWF0aW9uIG9uIG1hY2hpbmVzIHVzaW5nIGFuIElFRUUgNzU0CisgICByZXByZXNlbnRhdGlvbiksIG9yIFB5X05BTiBpcyBkZWZpbmVkLiAqLworCitzdGF0aWMgZG91YmxlCittX2luZih2b2lkKQoreworI2lmbmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCisgICAgcmV0dXJuIF9QeV9kZ19pbmZpbml0eSgwKTsKKyNlbHNlCisgICAgcmV0dXJuIFB5X0hVR0VfVkFMOworI2VuZGlmCit9CisKK3N0YXRpYyBQeV9jb21wbGV4CitjX2luZmoodm9pZCkKK3sKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gMC4wOworICAgIHIuaW1hZyA9IG1faW5mKCk7CisgICAgcmV0dXJuIHI7Cit9CisKKyNpZiAhZGVmaW5lZChQWV9OT19TSE9SVF9GTE9BVF9SRVBSKSB8fCBkZWZpbmVkKFB5X05BTikKKworc3RhdGljIGRvdWJsZQorbV9uYW4odm9pZCkKK3sKKyNpZm5kZWYgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUgorICAgIHJldHVybiBfUHlfZGdfc3RkbmFuKDApOworI2Vsc2UKKyAgICByZXR1cm4gUHlfTkFOOworI2VuZGlmCit9CisKK3N0YXRpYyBQeV9jb21wbGV4CitjX25hbmoodm9pZCkKK3sKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gMC4wOworICAgIHIuaW1hZyA9IG1fbmFuKCk7CisgICAgcmV0dXJuIHI7Cit9CisKKyNlbmRpZgorCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogc3RhdGljIFB5X2NvbXBsZXggY21hdGhfYXNpbmhfaW1wbChQeU9iamVjdCAqLCBQeV9jb21wbGV4KTsKIHN0YXRpYyBQeV9jb21wbGV4IGNtYXRoX2F0YW5oX2ltcGwoUHlPYmplY3QgKiwgUHlfY29tcGxleCk7CkBAIC0xMjM5LDYgKzEyODcsMTMgQEAKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwKICAgICAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0YXUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9UQVUpKTsgLyogMnBpICovCisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpbmYiLCBQeUZsb2F0X0Zyb21Eb3VibGUobV9pbmYoKSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaW5maiIsIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoY19pbmZqKCkpKTsKKyNpZiAhZGVmaW5lZChQWV9OT19TSE9SVF9GTE9BVF9SRVBSKSB8fCBkZWZpbmVkKFB5X05BTikKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIm5hbiIsIFB5RmxvYXRfRnJvbURvdWJsZShtX25hbigpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJuYW5qIiwgUHlDb21wbGV4X0Zyb21DQ29tcGxleChjX25hbmooKSkpOworI2VuZGlmCiAKICAgICAvKiBpbml0aWFsaXplIHNwZWNpYWwgdmFsdWUgdGFibGVzICovCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMgYi9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCmluZGV4IGYxZmRhNDguLmMyZDMwMDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKKysrIGIvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgaGFuZGxlciBmYWlscyBpbiBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoKSAqLwogICAgIHtTSUdTRUdWLCAwLCAiU2VnbWVudGF0aW9uIGZhdWx0IiwgfQogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhdWx0aGFuZGxlcl9uc2lnbmFscyA9IFwKK3N0YXRpYyBjb25zdCBzaXplX3QgZmF1bHRoYW5kbGVyX25zaWduYWxzID0gXAogICAgIFB5X0FSUkFZX0xFTkdUSChmYXVsdGhhbmRsZXJfaGFuZGxlcnMpOwogCiAjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgICAgIHJldHVybiBmZDsKICAgICB9CiAKLSAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZpbGUsICZQeUlkX2ZpbGVubywgIiIpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmlsZSwgJlB5SWRfZmlsZW5vLCBOVUxMKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKIApAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZpbGUsICZQeUlkX2ZsdXNoLCAiIik7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgTlVMTCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQogICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICBlbHNlIHsKQEAgLTIwMiw4ICsyMDIsOSBAQAogc3RhdGljIFB5VGhyZWFkU3RhdGUqCiBnZXRfdGhyZWFkX3N0YXRlKHZvaWQpCiB7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKTsKICAgICBpZiAodHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgLyoganVzdCBpbiBjYXNlIGJ1dCB2ZXJ5IHVubGlrZWx5Li4uICovCiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGdldCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMzQsMTEgKzIzNSwxMiBAQAogICAgICAgIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkuICovCiAgICAgdHN0YXRlID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKICNlbHNlCi0gICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKKyAgICB0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKTsKICNlbmRpZgogCi0gICAgaWYgKGFsbF90aHJlYWRzKQotICAgICAgICBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIGludGVycCwgdHN0YXRlKTsKKyAgICBpZiAoYWxsX3RocmVhZHMpIHsKKyAgICAgICAgKHZvaWQpX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCBOVUxMLCB0c3RhdGUpOworICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgaWYgKHRzdGF0ZSAhPSBOVUxMKQogICAgICAgICAgICAgX1B5X0R1bXBUcmFjZWJhY2soZmQsIHRzdGF0ZSk7CkBAIC0yNzIsNyArMjc0LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoYWxsX3RocmVhZHMpIHsKLSAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCB0c3RhdGUtPmludGVycCwgdHN0YXRlKTsKKyAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCBOVUxMLCB0c3RhdGUpOwogICAgICAgICBpZiAoZXJybXNnICE9IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIGVycm1zZyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4OCw2ICsyOTAsMTkgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorc3RhdGljIHZvaWQKK2ZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyKQoreworICAgIGlmICghaGFuZGxlci0+ZW5hYmxlZCkKKyAgICAgICAgcmV0dXJuOworICAgIGhhbmRsZXItPmVuYWJsZWQgPSAwOworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisgICAgKHZvaWQpc2lnYWN0aW9uKGhhbmRsZXItPnNpZ251bSwgJmhhbmRsZXItPnByZXZpb3VzLCBOVUxMKTsKKyNlbHNlCisgICAgKHZvaWQpc2lnbmFsKGhhbmRsZXItPnNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOworI2VuZGlmCit9CisKIAogLyogSGFuZGxlciBmb3IgU0lHU0VHViwgU0lHRlBFLCBTSUdBQlJULCBTSUdCVVMgYW5kIFNJR0lMTCBzaWduYWxzLgogCkBAIC0zMDYsNyArMzIxLDcgQEAKIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcihpbnQgc2lnbnVtKQogewogICAgIGNvbnN0IGludCBmZCA9IGZhdGFsX2Vycm9yLmZkOwotICAgIHVuc2lnbmVkIGludCBpOworICAgIHNpemVfdCBpOwogICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlciA9IE5VTEw7CiAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsKIApAQCAtMzI0LDEyICszMzksNyBAQAogICAgIH0KIAogICAgIC8qIHJlc3RvcmUgdGhlIHByZXZpb3VzIGhhbmRsZXIgKi8KLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotICAgICh2b2lkKXNpZ2FjdGlvbihzaWdudW0sICZoYW5kbGVyLT5wcmV2aW91cywgTlVMTCk7Ci0jZWxzZQotICAgICh2b2lkKXNpZ25hbChzaWdudW0sIGhhbmRsZXItPnByZXZpb3VzKTsKLSNlbmRpZgotICAgIGhhbmRsZXItPmVuYWJsZWQgPSAwOworICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CiAKICAgICBQVVRTKGZkLCAiRmF0YWwgUHl0aG9uIGVycm9yOiAiKTsKICAgICBQVVRTKGZkLCBoYW5kbGVyLT5uYW1lKTsKQEAgLTM1MSwyMCArMzYxLDExNyBAQAogICAgIHJhaXNlKHNpZ251bSk7CiB9CiAKKyNpZmRlZiBNU19XSU5ET1dTCitzdGF0aWMgTE9ORyBXSU5BUEkKK2ZhdWx0aGFuZGxlcl9leGNfaGFuZGxlcihzdHJ1Y3QgX0VYQ0VQVElPTl9QT0lOVEVSUyAqZXhjX2luZm8pCit7CisgICAgY29uc3QgaW50IGZkID0gZmF0YWxfZXJyb3IuZmQ7CisgICAgRFdPUkQgY29kZSA9IGV4Y19pbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGU7CisgICAgRFdPUkQgZmxhZ3MgPSBleGNfaW5mby0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25GbGFnczsKKworICAgIC8qIG9ubHkgbG9nIGZhdGFsIGV4Y2VwdGlvbnMgKi8KKyAgICBpZiAoZmxhZ3MgJiBFWENFUFRJT05fTk9OQ09OVElOVUFCTEUpIHsKKyAgICAgICAgLyogY2FsbCB0aGUgbmV4dCBleGNlcHRpb24gaGFuZGxlciAqLworICAgICAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKKyAgICB9CisKKyAgICBQVVRTKGZkLCAiV2luZG93cyBmYXRhbCBleGNlcHRpb246ICIpOworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgLyogb25seSBmb3JtYXQgbW9zdCBjb21tb24gZXJyb3JzICovCisgICAgY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjogUFVUUyhmZCwgImFjY2VzcyB2aW9sYXRpb24iKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fRkxUX0RJVklERV9CWV9aRVJPOiBQVVRTKGZkLCAiZmxvYXQgZGl2aWRlIGJ5IHplcm8iKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOiBQVVRTKGZkLCAiZmxvYXQgb3ZlcmZsb3ciKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPOiBQVVRTKGZkLCAiaW50IGRpdmlkZSBieSB6ZXJvIik7IGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX0lOVF9PVkVSRkxPVzogUFVUUyhmZCwgImludGVnZXIgb3ZlcmZsb3ciKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fSU5fUEFHRV9FUlJPUjogUFVUUyhmZCwgInBhZ2UgZXJyb3IiKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c6IFBVVFMoZmQsICJzdGFjayBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQVVRTKGZkLCAiY29kZSAiKTsKKyAgICAgICAgX1B5X0R1bXBEZWNpbWFsKGZkLCBjb2RlKTsKKyAgICB9CisgICAgUFVUUyhmZCwgIlxuXG4iKTsKKworICAgIGlmIChjb2RlID09IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OKSB7CisgICAgICAgIC8qIGRpc2FibGUgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR1NFR1YgKi8KKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKKyAgICAgICAgICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07CisgICAgICAgICAgICBpZiAoaGFuZGxlci0+c2lnbnVtID09IFNJR1NFR1YpIHsKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZGlzYWJsZV9mYXRhbF9oYW5kbGVyKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZmF1bHRoYW5kbGVyX2R1bXBfdHJhY2ViYWNrKGZkLCBmYXRhbF9lcnJvci5hbGxfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWxfZXJyb3IuaW50ZXJwKTsKKworICAgIC8qIGNhbGwgdGhlIG5leHQgZXhjZXB0aW9uIGhhbmRsZXIgKi8KKyAgICByZXR1cm4gRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSDsKK30KKyNlbmRpZgorCiAvKiBJbnN0YWxsIHRoZSBoYW5kbGVyIGZvciBmYXRhbCBzaWduYWxzLCBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoKS4gKi8KIAorc3RhdGljIGludAorZmF1bHRoYW5kbGVyX2VuYWJsZSh2b2lkKQoreworICAgIHNpemVfdCBpOworCisgICAgaWYgKGZhdGFsX2Vycm9yLmVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZhdGFsX2Vycm9yLmVuYWJsZWQgPSAxOworCisgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgeworICAgICAgICBmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247CisjZW5kaWYKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKKyAgICAgICAgYXNzZXJ0KCFoYW5kbGVyLT5lbmFibGVkKTsKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorICAgICAgICBhY3Rpb24uc2FfaGFuZGxlciA9IGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcjsKKyAgICAgICAgc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKKyAgICAgICAgLyogRG8gbm90IHByZXZlbnQgdGhlIHNpZ25hbCBmcm9tIGJlaW5nIHJlY2VpdmVkIGZyb20gd2l0aGluCisgICAgICAgICAgIGl0cyBvd24gc2lnbmFsIGhhbmRsZXIgKi8KKyAgICAgICAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfTk9ERUZFUjsKKyNpZmRlZiBIQVZFX1NJR0FMVFNUQUNLCisgICAgICAgIGlmIChzdGFjay5zc19zcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaWduYWwgaGFuZGxlciBvbiBhbiBhbHRlcm5hdGUgc2lnbmFsIHN0YWNrCisgICAgICAgICAgICAgICBwcm92aWRlZCBieSBzaWdhbHRzdGFjaygpICovCisgICAgICAgICAgICBhY3Rpb24uc2FfZmxhZ3MgfD0gU0FfT05TVEFDSzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVyciA9IHNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZhY3Rpb24sICZoYW5kbGVyLT5wcmV2aW91cyk7CisjZWxzZQorICAgICAgICBoYW5kbGVyLT5wcmV2aW91cyA9IHNpZ25hbChoYW5kbGVyLT5zaWdudW0sCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKTsKKyAgICAgICAgZXJyID0gKGhhbmRsZXItPnByZXZpb3VzID09IFNJR19FUlIpOworI2VuZGlmCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDE7CisgICAgfQorCisjaWZkZWYgTVNfV0lORE9XUworICAgIEFkZFZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcigxLCBmYXVsdGhhbmRsZXJfZXhjX2hhbmRsZXIpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBQeU9iamVjdCoKLWZhdWx0aGFuZGxlcl9lbmFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorZmF1bHRoYW5kbGVyX3B5X2VuYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmaWxlIiwgImFsbF90aHJlYWRzIiwgTlVMTH07CiAgICAgUHlPYmplY3QgKmZpbGUgPSBOVUxMOwogICAgIGludCBhbGxfdGhyZWFkcyA9IDE7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247Ci0jZW5kaWYKLSAgICBpbnQgZXJyOwogICAgIGludCBmZDsKICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAKQEAgLTM4NiwzNyArNDkzLDEwIEBACiAgICAgZmF0YWxfZXJyb3IuYWxsX3RocmVhZHMgPSBhbGxfdGhyZWFkczsKICAgICBmYXRhbF9lcnJvci5pbnRlcnAgPSB0c3RhdGUtPmludGVycDsKIAotICAgIGlmICghZmF0YWxfZXJyb3IuZW5hYmxlZCkgewotICAgICAgICBmYXRhbF9lcnJvci5lbmFibGVkID0gMTsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IGZhdWx0aGFuZGxlcl9uc2lnbmFsczsgaSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotICAgICAgICAgICAgYWN0aW9uLnNhX2hhbmRsZXIgPSBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3I7Ci0gICAgICAgICAgICBzaWdlbXB0eXNldCgmYWN0aW9uLnNhX21hc2spOwotICAgICAgICAgICAgLyogRG8gbm90IHByZXZlbnQgdGhlIHNpZ25hbCBmcm9tIGJlaW5nIHJlY2VpdmVkIGZyb20gd2l0aGluCi0gICAgICAgICAgICAgICBpdHMgb3duIHNpZ25hbCBoYW5kbGVyICovCi0gICAgICAgICAgICBhY3Rpb24uc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOwotI2lmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKLSAgICAgICAgICAgIGlmIChzdGFjay5zc19zcCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2lnbmFsIGhhbmRsZXIgb24gYW4gYWx0ZXJuYXRlIHNpZ25hbCBzdGFjawotICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHNpZ2FsdHN0YWNrKCkgKi8KLSAgICAgICAgICAgICAgICBhY3Rpb24uc2FfZmxhZ3MgfD0gU0FfT05TVEFDSzsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgZXJyID0gc2lnYWN0aW9uKGhhbmRsZXItPnNpZ251bSwgJmFjdGlvbiwgJmhhbmRsZXItPnByZXZpb3VzKTsKLSNlbHNlCi0gICAgICAgICAgICBoYW5kbGVyLT5wcmV2aW91cyA9IHNpZ25hbChoYW5kbGVyLT5zaWdudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IpOwotICAgICAgICAgICAgZXJyID0gKGhhbmRsZXItPnByZXZpb3VzID09IFNJR19FUlIpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVyLT5lbmFibGVkID0gMTsKLSAgICAgICAgfQorICAgIGlmIChmYXVsdGhhbmRsZXJfZW5hYmxlKCkgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCkBAIC00MzAsMTQgKzUxMCw3IEBACiAgICAgICAgIGZhdGFsX2Vycm9yLmVuYWJsZWQgPSAwOwogICAgICAgICBmb3IgKGk9MDsgaSA8IGZhdWx0aGFuZGxlcl9uc2lnbmFsczsgaSsrKSB7CiAgICAgICAgICAgICBoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIGlmICghaGFuZGxlci0+ZW5hYmxlZCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotICAgICAgICAgICAgKHZvaWQpc2lnYWN0aW9uKGhhbmRsZXItPnNpZ251bSwgJmhhbmRsZXItPnByZXZpb3VzLCBOVUxMKTsKLSNlbHNlCi0gICAgICAgICAgICAodm9pZClzaWduYWwoaGFuZGxlci0+c2lnbnVtLCBoYW5kbGVyLT5wcmV2aW91cyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGhhbmRsZXItPmVuYWJsZWQgPSAwOworICAgICAgICAgICAgZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihoYW5kbGVyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDY5LDcgKzU0Miw2IEBACiB7CiAgICAgUHlMb2NrU3RhdHVzIHN0OwogICAgIGNvbnN0IGNoYXIqIGVycm1zZzsKLSAgICBQeVRocmVhZFN0YXRlICpjdXJyZW50OwogICAgIGludCBvazsKICNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9TSUdNQVNLKSAmJiAhZGVmaW5lZChIQVZFX0JST0tFTl9QVEhSRUFEX1NJR01BU0spCiAgICAgc2lnc2V0X3Qgc2V0OwpAQCAtNDg5LDEyICs1NjEsOSBAQAogICAgICAgICAvKiBUaW1lb3V0ID0+IGR1bXAgdHJhY2ViYWNrICovCiAgICAgICAgIGFzc2VydChzdCA9PSBQWV9MT0NLX0ZBSUxVUkUpOwogCi0gICAgICAgIC8qIGdldCB0aGUgdGhyZWFkIGhvbGRpbmcgdGhlIEdJTCwgTlVMTCBpZiBubyB0aHJlYWQgaG9sZCB0aGUgR0lMICovCi0gICAgICAgIGN1cnJlbnQgPSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKTsKLQogICAgICAgICBfUHlfd3JpdGVfbm9yYWlzZSh0aHJlYWQuZmQsIHRocmVhZC5oZWFkZXIsIChpbnQpdGhyZWFkLmhlYWRlcl9sZW4pOwogCi0gICAgICAgIGVycm1zZyA9IF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyh0aHJlYWQuZmQsIHRocmVhZC5pbnRlcnAsIGN1cnJlbnQpOworICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHModGhyZWFkLmZkLCB0aHJlYWQuaW50ZXJwLCBOVUxMKTsKICAgICAgICAgb2sgPSAoZXJybXNnID09IE5VTEwpOwogCiAgICAgICAgIGlmICh0aHJlYWQuZXhpdCkKQEAgLTg5NCw3ICs5NjMsNyBAQAogZmF1bHRoYW5kbGVyX3NpZ3NlZ3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGludCByZWxlYXNlX2dpbCA9IDA7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfcmVhZF9udWxsIiwgJnJlbGVhc2VfZ2lsKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9zaWdzZWd2IiwgJnJlbGVhc2VfZ2lsKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAocmVsZWFzZV9naWwpIHsKQEAgLTkwNyw2ICs5NzYsNDkgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorI2lmZGVmIFdJVEhfVEhSRUFECitzdGF0aWMgdm9pZAorZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX3RocmVhZCh2b2lkICpwbG9jaykKK3sKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgKmxvY2sgPSAoUHlUaHJlYWRfdHlwZV9sb2NrICopcGxvY2s7CisKKyAgICBQeV9GYXRhbEVycm9yKCJpbiBuZXcgdGhyZWFkIik7CisKKyAgICAvKiBub3RpZnkgdGhlIGNhbGxlciB0aGF0IHdlIGFyZSBkb25lICovCisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGxvY2spOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX2NfdGhyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBsb25nIHRocmVhZDsKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKworICAgIGZhdWx0aGFuZGxlcl9zdXBwcmVzc19jcmFzaF9yZXBvcnQoKTsKKworICAgIGxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKGxvY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sobG9jaywgV0FJVF9MT0NLKTsKKworICAgIHRocmVhZCA9IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX3RocmVhZCwgbG9jayk7CisgICAgaWYgKHRocmVhZCA9PSAtMSkgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2sobG9jayk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiB3YWl0IHVudGlsIHRoZSB0aHJlYWQgY29tcGxldGVzOiBpdCB3aWxsIG5ldmVyIG9jY3VyLCBzaW5jZSBQeV9GYXRhbEVycm9yKCkKKyAgICAgICBleGl0cyB0aGUgcHJvY2VzcyBpbW1lZGlhbHR5LiAqLworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhsb2NrLCBXQUlUX0xPQ0spOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhsb2NrKTsKKyAgICBQeVRocmVhZF9mcmVlX2xvY2sobG9jayk7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKyNlbmRpZgorCiBzdGF0aWMgUHlPYmplY3QgKgogZmF1bHRoYW5kbGVyX3NpZ2ZwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC05NTEsNiArMTA2Myw4IEBACiB9CiAKICNpZiBkZWZpbmVkKEhBVkVfU0lHQUxUU1RBQ0spICYmIGRlZmluZWQoSEFWRV9TSUdBQ1RJT04pCisjZGVmaW5lIEZBVUxUSEFORExFUl9TVEFDS19PVkVSRkxPVworCiAjaWZkZWYgX19JTlRFTF9DT01QSUxFUgogICAgLyogSXNzdWUgIzIzNjU0OiBUdXJuIG9mZiBJQ0MncyB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIGZvciB0aGUKICAgICAqIHN0YWNrX292ZXJmbG93IGdlbmVyYXRvci4gSUNDIHR1cm5zIHRoZSByZWN1cnNpdmUgdGFpbCBjYWxsIGludG8KQEAgLTk1OCwxMiArMTA3MiwxMiBAQAogIyAgcHJhZ21hIGludGVsIG9wdGltaXphdGlvbl9sZXZlbCAwCiAjZW5kaWYKIHN0YXRpYwotUHlfdWludHB0cl90Ci1zdGFja19vdmVyZmxvdyhQeV91aW50cHRyX3QgbWluX3NwLCBQeV91aW50cHRyX3QgbWF4X3NwLCBzaXplX3QgKmRlcHRoKQordWludHB0cl90CitzdGFja19vdmVyZmxvdyh1aW50cHRyX3QgbWluX3NwLCB1aW50cHRyX3QgbWF4X3NwLCBzaXplX3QgKmRlcHRoKQogewogICAgIC8qIGFsbG9jYXRlIDQwOTYgYnl0ZXMgb24gdGhlIHN0YWNrIGF0IGVhY2ggY2FsbCAqLwogICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzQwOTZdOwotICAgIFB5X3VpbnRwdHJfdCBzcCA9IChQeV91aW50cHRyX3QpJmJ1ZmZlcjsKKyAgICB1aW50cHRyX3Qgc3AgPSAodWludHB0cl90KSZidWZmZXI7CiAgICAgKmRlcHRoICs9IDE7CiAgICAgaWYgKHNwIDwgbWluX3NwIHx8IG1heF9zcCA8IHNwKQogICAgICAgICByZXR1cm4gc3A7CkBAIC05NzYsOCArMTA5MCw4IEBACiBmYXVsdGhhbmRsZXJfc3RhY2tfb3ZlcmZsb3coUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgc2l6ZV90IGRlcHRoLCBzaXplOwotICAgIFB5X3VpbnRwdHJfdCBzcCA9IChQeV91aW50cHRyX3QpJmRlcHRoOwotICAgIFB5X3VpbnRwdHJfdCBzdG9wOworICAgIHVpbnRwdHJfdCBzcCA9ICh1aW50cHRyX3QpJmRlcHRoOworICAgIHVpbnRwdHJfdCBzdG9wOwogCiAgICAgZmF1bHRoYW5kbGVyX3N1cHByZXNzX2NyYXNoX3JlcG9ydCgpOwogICAgIGRlcHRoID0gMDsKQEAgLTk5NCw3ICsxMTA4LDcgQEAKICAgICAgICAgc2l6ZSwgZGVwdGgpOwogICAgIHJldHVybiBOVUxMOwogfQotI2VuZGlmCisjZW5kaWYgICAvKiBkZWZpbmVkKEhBVkVfU0lHQUxUU1RBQ0spICYmIGRlZmluZWQoSEFWRV9TSUdBQ1RJT04pICovCiAKIAogc3RhdGljIGludApAQCAtMTAxNywxMiArMTEzMSwyNSBAQAogICAgIHJldHVybiAwOwogfQogCisjaWZkZWYgTVNfV0lORE9XUworc3RhdGljIFB5T2JqZWN0ICoKK2ZhdWx0aGFuZGxlcl9yYWlzZV9leGNlcHRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBjb2RlLCBmbGFncyA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJfEk6X3JhaXNlX2V4Y2VwdGlvbiIsICZjb2RlLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmYXVsdGhhbmRsZXJfc3VwcHJlc3NfY3Jhc2hfcmVwb3J0KCk7CisgICAgUmFpc2VFeGNlcHRpb24oY29kZSwgZmxhZ3MsIDAsIE5VTEwpOworICAgIFB5X1JFVFVSTl9OT05FOworfQorI2VuZGlmCisKIFB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLAogImZhdWx0aGFuZGxlciBtb2R1bGUuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgIHsiZW5hYmxlIiwKLSAgICAgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9lbmFibGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX3B5X2VuYWJsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiZW5hYmxlKGZpbGU9c3lzLnN0ZGVyciwgYWxsX3RocmVhZHM9VHJ1ZSk6ICIKICAgICAgICAgICAgICAgICJlbmFibGUgdGhlIGZhdWx0IGhhbmRsZXIiKX0sCiAgICAgeyJkaXNhYmxlIiwgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9kaXNhYmxlX3B5LCBNRVRIX05PQVJHUywKQEAgLTEwNjUsMTYgKzExOTIsMjUgQEAKICAgICAgICAgICAgICAgICJhIFNJR1NFR1Ygb3IgU0lHQlVTIHNpZ25hbCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIil9LAogICAgIHsiX3NpZ3NlZ3YiLCBmYXVsdGhhbmRsZXJfc2lnc2VndiwgTUVUSF9WQVJBUkdTLAogICAgICBQeURvY19TVFIoIl9zaWdzZWd2KHJlbGVhc2VfZ2lsPUZhbHNlKTogcmFpc2UgYSBTSUdTRUdWIHNpZ25hbCIpfSwKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIHsiX2ZhdGFsX2Vycm9yX2NfdGhyZWFkIiwgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX2NfdGhyZWFkLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJmYXRhbF9lcnJvcl9jX3RocmVhZCgpOiAiCisgICAgICAgICAgICAgICAiY2FsbCBQeV9GYXRhbEVycm9yKCkgaW4gYSBuZXcgQyB0aHJlYWQuIil9LAorI2VuZGlmCiAgICAgeyJfc2lnYWJydCIsIGZhdWx0aGFuZGxlcl9zaWdhYnJ0LCBNRVRIX05PQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc2lnYWJydCgpOiByYWlzZSBhIFNJR0FCUlQgc2lnbmFsIil9LAogICAgIHsiX3NpZ2ZwZSIsIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfc2lnZnBlLCBNRVRIX05PQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc2lnZnBlKCk6IHJhaXNlIGEgU0lHRlBFIHNpZ25hbCIpfSwKICAgICB7Il9mYXRhbF9lcnJvciIsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl9weSwgTUVUSF9WQVJBUkdTLAogICAgICBQeURvY19TVFIoIl9mYXRhbF9lcnJvcihtZXNzYWdlKTogY2FsbCBQeV9GYXRhbEVycm9yKG1lc3NhZ2UpIil9LAotI2lmIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgJiYgZGVmaW5lZChIQVZFX1NJR0FDVElPTikKKyNpZmRlZiBGQVVMVEhBTkRMRVJfU1RBQ0tfT1ZFUkZMT1cKICAgICB7Il9zdGFja19vdmVyZmxvdyIsIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfc3RhY2tfb3ZlcmZsb3csIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIl9zdGFja19vdmVyZmxvdygpOiByZWN1cnNpdmUgY2FsbCB0byByYWlzZSBhIHN0YWNrIG92ZXJmbG93Iil9LAogI2VuZGlmCisjaWZkZWYgTVNfV0lORE9XUworICAgIHsiX3JhaXNlX2V4Y2VwdGlvbiIsIGZhdWx0aGFuZGxlcl9yYWlzZV9leGNlcHRpb24sIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJyYWlzZV9leGNlcHRpb24oY29kZSwgZmxhZ3M9MCk6IENhbGwgUmFpc2VFeGNlcHRpb24oY29kZSwgZmxhZ3MpLiIpfSwKKyNlbmRpZgogICAgIHtOVUxMLCBOVUxMfSAgLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTEwOTMsNyArMTIyOSwzMyBAQAogUHlNT0RJTklUX0ZVTkMKIFB5SW5pdF9mYXVsdGhhbmRsZXIodm9pZCkKIHsKLSAgICByZXR1cm4gUHlNb2R1bGVfQ3JlYXRlKCZtb2R1bGVfZGVmKTsKKyAgICBQeU9iamVjdCAqbSA9IFB5TW9kdWxlX0NyZWF0ZSgmbW9kdWxlX2RlZik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBBZGQgY29uc3RhbnRzIGZvciB1bml0IHRlc3RzICovCisjaWZkZWYgTVNfV0lORE9XUworICAgIC8qIFJhaXNlRXhjZXB0aW9uKCkgY29kZXMgKHByZWZpeGVkIGJ5IGFuIHVuZGVyc2NvcmUpICovCisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBSYWlzZUV4Y2VwdGlvbigpIGZsYWdzIChwcmVmaXhlZCBieSBhbiB1bmRlcnNjb3JlKSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9OT05DT05USU5VQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKworICAgIHJldHVybiBtOwogfQogCiAvKiBDYWxsIGZhdWx0aGFuZGxlci5lbmFibGUoKSBpZiB0aGUgUFlUSE9ORkFVTFRIQU5ETEVSIGVudmlyb25tZW50IHZhcmlhYmxlCkBAIC0xMTI4LDcgKzEyOTAsNyBAQAogICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQobW9kdWxlLCAmUHlJZF9lbmFibGUsICIiKTsKKyAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKG1vZHVsZSwgJlB5SWRfZW5hYmxlLCBOVUxMKTsKICAgICBQeV9ERUNSRUYobW9kdWxlKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCBjYjcyMjJkLi4wYzZmNDQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC03MzgsNyArNzM4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQorZGVidWdfY3ljbGUoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlTeXNfRm9ybWF0U3RkZXJyKCJnYzogJXMgPCVzICVwPlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBQeV9UWVBFKG9wKS0+dHBfbmFtZSwgb3ApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IGQ4MTY3ZWEuLmI2ZmI1M2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICosIGludCk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlcihjb25zdCBjaGFyICopOwogCi1zdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaV9lcnJsaXN0W10gPSB7CiAgICAgInN1Y2Nlc3MuIiwKICAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KICAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIEVSUihlcnIpIHsgZXJyb3IgPSAoZXJyKTsgZ290byBiYWQ7IH0KIAotY2hhciAqCitjb25zdCBjaGFyICoKIGdhaV9zdHJlcnJvcihpbnQgZWNvZGUpCiB7CiAgICAgaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDE4ZGViNjAuLjY1YjQ3YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC00NjAsOCArNDYwLDggQEAKIHsKICAgICBleHRlcm4gd2NoYXJfdCAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKLSAgICBzdGF0aWMgd2NoYXJfdCBkZWxpbWl0ZXJbMl0gPSB7REVMSU0sICdcMCd9OwotICAgIHN0YXRpYyB3Y2hhcl90IHNlcGFyYXRvclsyXSA9IHtTRVAsICdcMCd9OworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CiAgICAgY2hhciAqX3J0cHlwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7IC8qIFhYWCB1c2Ugd2lkZSB2ZXJzaW9uIG9uIFdpbmRvd3MgKi8KICAgICB3Y2hhcl90ICpydHB5cGF0aCA9IE5VTEw7CiAgICAgd2NoYXJfdCAqaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ3JwbW9kdWxlLmMgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCmluZGV4IDNhMTM0YTAuLjk0MzdhZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ3JwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwpAQCAtMTAwLDE0ICsxMDAsMjUgQEAKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwogCi0gICAgcHlfaW50X2lkID0gUHlOdW1iZXJfTG9uZyhpZCk7Ci0gICAgaWYgKCFweV9pbnRfaWQpCisgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihpZCwgJmdpZCkpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghX1B5X0dpZF9Db252ZXJ0ZXIocHlfaW50X2lkLCAmZ2lkKSkgeworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIGlkIG11c3QgYmUgaW50LCBub3QgJS4yMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+b2JfdHlwZS0+dHBfbmFtZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBweV9pbnRfaWQgPSBQeU51bWJlcl9Mb25nKGlkKTsKKyAgICAgICAgaWYgKCFweV9pbnRfaWQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihweV9pbnRfaWQsICZnaWQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihweV9pbnRfaWQpOwotICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfREVDUkVGKHB5X2ludF9pZCk7CiAKICAgICBpZiAoKHAgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpnaWRfb2JqID0gX1B5TG9uZ19Gcm9tR2lkKGdpZCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2hhc2hsaWIuaCBiL01vZHVsZXMvaGFzaGxpYi5oCmluZGV4IDM1ODA0NTMuLjUzMGI2YjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaGFzaGxpYi5oCisrKyBiL01vZHVsZXMvaGFzaGxpYi5oCkBAIC0yLDMwICsyLDMzIEBACiAKIC8qCiAgKiBHaXZlbiBhIFB5T2JqZWN0KiBvYmosIGZpbGwgaW4gdGhlIFB5X2J1ZmZlciogdmlld3Agd2l0aCB0aGUgcmVzdWx0Ci0gKiBvZiBQeU9iamVjdF9HZXRCdWZmZXIuICBTZXRzIGFuIGV4Y2VwdGlvbiBhbmQgaXNzdWVzIGEgcmV0dXJuIE5VTEwKLSAqIG9uIGFueSBlcnJvcnMuCisgKiBvZiBQeU9iamVjdF9HZXRCdWZmZXIuICBTZXRzIGFuIGV4Y2VwdGlvbiBhbmQgaXNzdWVzIHRoZSBlcnJhY3Rpb24KKyAqIG9uIGFueSBlcnJvcnMsIGUuZy4gJ3JldHVybiBOVUxMJyBvciAnZ290byBlcnJvcicuCiAgKi8KLSNkZWZpbmUgR0VUX0JVRkZFUl9WSUVXX09SX0VSUk9VVChvYmosIHZpZXdwKSBkbyB7IFwKKyNkZWZpbmUgR0VUX0JVRkZFUl9WSUVXX09SX0VSUk9SKG9iaiwgdmlld3AsIGVycmFjdGlvbikgZG8geyBcCiAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soKG9iaikpKSB7IFwKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZS1vYmplY3RzIG11c3QgYmUgZW5jb2RlZCBiZWZvcmUgaGFzaGluZyIpO1wKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgICAgICAgICBlcnJhY3Rpb247IFwKICAgICAgICAgfSBcCiAgICAgICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIoKG9iaikpKSB7IFwKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHN1cHBvcnRpbmcgdGhlIGJ1ZmZlciBBUEkgcmVxdWlyZWQiKTsgXAotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgIGVycmFjdGlvbjsgXAogICAgICAgICB9IFwKICAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcigob2JqKSwgKHZpZXdwKSwgUHlCVUZfU0lNUExFKSA9PSAtMSkgeyBcCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgICAgICAgICAgZXJyYWN0aW9uOyBcCiAgICAgICAgIH0gXAogICAgICAgICBpZiAoKHZpZXdwKS0+bmRpbSA+IDEpIHsgXAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBtdXN0IGJlIHNpbmdsZSBkaW1lbnNpb24iKTsgXAogICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgodmlld3ApKTsgXAotICAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgIGVycmFjdGlvbjsgXAogICAgICAgICB9IFwKLSAgICB9IHdoaWxlKDApOworICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1VUKG9iaiwgdmlld3ApIFwKKyAgICBHRVRfQlVGRkVSX1ZJRVdfT1JfRVJST1Iob2JqLCB2aWV3cCwgcmV0dXJuIE5VTEwpCiAKIC8qCiAgKiBIZWxwZXIgY29kZSB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggb2JqZWN0IHdoZW4gdGhlIEdJTCBpcwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9oYXNodGFibGUuYyBiL01vZHVsZXMvaGFzaHRhYmxlLmMKaW5kZXggMTMzZjMxMy4uYjUzY2MyNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9oYXNodGFibGUuYworKysgYi9Nb2R1bGVzL2hhc2h0YWJsZS5jCkBAIC0xLDUgKzEsNSBAQAotLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoIHRhYmxlIChfUHlfaGFzaHRhYmxlX3QpIGlzIGJhc2VkIG9uIHRoZSBjZnVoYXNoCi0gICBwcm9qZWN0OgorLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoIHRhYmxlIChfUHlfaGFzaHRhYmxlX3QpIGlzIGJhc2VkIG9uIHRoZQorICAgY2Z1aGFzaCBwcm9qZWN0OgogICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJjZnUvCiAKICAgIENvcHlyaWdodCBvZiBjZnVoYXNoOgpAQCAtNTksNyArNTksMjEgQEAKICNkZWZpbmUgRU5UUllfTkVYVChFTlRSWSkgXAogICAgICAgICAoKF9QeV9oYXNodGFibGVfZW50cnlfdCAqKV9QeV9TTElTVF9JVEVNX05FWFQoRU5UUlkpKQogI2RlZmluZSBIQVNIVEFCTEVfSVRFTV9TSVpFKEhUKSBcCi0gICAgICAgIChzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSArIChIVCktPmRhdGFfc2l6ZSkKKyAgICAgICAgKHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpICsgKEhUKS0+a2V5X3NpemUgKyAoSFQpLT5kYXRhX3NpemUpCisKKyNkZWZpbmUgRU5UUllfUkVBRF9QREFUQShUQUJMRSwgRU5UUlksIERBVEFfU0laRSwgUERBVEEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KChEQVRBX1NJWkUpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKChQREFUQSksIF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoVEFCTEUsIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAoREFUQV9TSVpFKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVOVFJZX1dSSVRFX1BEQVRBKFRBQkxFLCBFTlRSWSwgREFUQV9TSVpFLCBQREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoKERBVEFfU0laRSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKChUQUJMRSksIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAoUERBVEEpLCAoREFUQV9TSVpFKSk7IFwKKyAgICB9IHdoaWxlICgwKQogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCiBzdGF0aWMgdm9pZCBoYXNodGFibGVfcmVoYXNoKF9QeV9oYXNodGFibGVfdCAqaHQpOwpAQCAtNzAsNiArODQsNyBAQAogICAgIGxpc3QtPmhlYWQgPSBOVUxMOwogfQogCisKIHN0YXRpYyB2b2lkCiBfUHlfc2xpc3RfcHJlcGVuZChfUHlfc2xpc3RfdCAqbGlzdCwgX1B5X3NsaXN0X2l0ZW1fdCAqaXRlbSkKIHsKQEAgLTc3LDYgKzkyLDcgQEAKICAgICBsaXN0LT5oZWFkID0gaXRlbTsKIH0KIAorCiBzdGF0aWMgdm9pZAogX1B5X3NsaXN0X3JlbW92ZShfUHlfc2xpc3RfdCAqbGlzdCwgX1B5X3NsaXN0X2l0ZW1fdCAqcHJldmlvdXMsCiAgICAgICAgICAgICAgICAgIF9QeV9zbGlzdF9pdGVtX3QgKml0ZW0pCkBAIC04NywyNCArMTAzLDI2IEBACiAgICAgICAgIGxpc3QtPmhlYWQgPSBpdGVtLT5uZXh0OwogfQogCi1QeV91aGFzaF90Ci1fUHlfaGFzaHRhYmxlX2hhc2hfaW50KGNvbnN0IHZvaWQgKmtleSkKLXsKLSAgICByZXR1cm4gKFB5X3VoYXNoX3Qpa2V5OwotfQogCiBQeV91aGFzaF90Ci1fUHlfaGFzaHRhYmxlX2hhc2hfcHRyKGNvbnN0IHZvaWQgKmtleSkKK19QeV9oYXNodGFibGVfaGFzaF9wdHIoc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCiB7Ci0gICAgcmV0dXJuIChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcigodm9pZCAqKWtleSk7CisgICAgdm9pZCAqa2V5OworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwga2V5KTsKKyAgICByZXR1cm4gKFB5X3VoYXNoX3QpX1B5X0hhc2hQb2ludGVyKGtleSk7CiB9CiAKKwogaW50Ci1fUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KGNvbnN0IHZvaWQgKmtleSwgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKK19QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKIHsKLSAgICByZXR1cm4gZW50cnktPmtleSA9PSBrZXk7CisgICAgY29uc3Qgdm9pZCAqcGtleTIgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpOworICAgIHJldHVybiAobWVtY21wKHBrZXksIHBrZXkyLCBodC0+a2V5X3NpemUpID09IDApOwogfQogCisKIC8qIG1ha2VzIHN1cmUgdGhlIHJlYWwgc2l6ZSBvZiB0aGUgYnVja2V0cyBhcnJheSBpcyBhIHBvd2VyIG9mIDIgKi8KIHN0YXRpYyBzaXplX3QKIHJvdW5kX3NpemUoc2l6ZV90IHMpCkBAIC0xMTgsMTMgKzEzNiwxMiBAQAogICAgIHJldHVybiBpOwogfQogCisKIF9QeV9oYXNodGFibGVfdCAqCi1fUHlfaGFzaHRhYmxlX25ld19mdWxsKHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBpbml0X3NpemUsCitfUHlfaGFzaHRhYmxlX25ld19mdWxsKHNpemVfdCBrZXlfc2l6ZSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluaXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMgY29weV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMgZnJlZV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZ2V0X2RhdGFfc2l6ZV9mdW5jIGdldF9kYXRhX3NpemVfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCAqYWxsb2NhdG9yKQogewogICAgIF9QeV9oYXNodGFibGVfdCAqaHQ7CkBAIC0xNDQsNiArMTYxLDcgQEAKIAogICAgIGh0LT5udW1fYnVja2V0cyA9IHJvdW5kX3NpemUoaW5pdF9zaXplKTsKICAgICBodC0+ZW50cmllcyA9IDA7CisgICAgaHQtPmtleV9zaXplID0ga2V5X3NpemU7CiAgICAgaHQtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKIAogICAgIGJ1Y2tldHNfc2l6ZSA9IGh0LT5udW1fYnVja2V0cyAqIHNpemVvZihodC0+YnVja2V0c1swXSk7CkBAIC0xNTYsMjggKzE3NCwyNyBAQAogCiAgICAgaHQtPmhhc2hfZnVuYyA9IGhhc2hfZnVuYzsKICAgICBodC0+Y29tcGFyZV9mdW5jID0gY29tcGFyZV9mdW5jOwotICAgIGh0LT5jb3B5X2RhdGFfZnVuYyA9IGNvcHlfZGF0YV9mdW5jOwotICAgIGh0LT5mcmVlX2RhdGFfZnVuYyA9IGZyZWVfZGF0YV9mdW5jOwotICAgIGh0LT5nZXRfZGF0YV9zaXplX2Z1bmMgPSBnZXRfZGF0YV9zaXplX2Z1bmM7CiAgICAgaHQtPmFsbG9jID0gYWxsb2M7CiAgICAgcmV0dXJuIGh0OwogfQogCisKIF9QeV9oYXNodGFibGVfdCAqCi1fUHlfaGFzaHRhYmxlX25ldyhzaXplX3QgZGF0YV9zaXplLAorX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZV90IGtleV9zaXplLCBzaXplX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jKQogewotICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGRhdGFfc2l6ZSwgSEFTSFRBQkxFX01JTl9TSVpFLAorICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGtleV9zaXplLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTSFRBQkxFX01JTl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfZnVuYywgY29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogfQogCisKIHNpemVfdAogX1B5X2hhc2h0YWJsZV9zaXplKF9QeV9oYXNodGFibGVfdCAqaHQpCiB7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgc2l6ZV90IGh2OwogCiAgICAgc2l6ZSA9IHNpemVvZihfUHlfaGFzaHRhYmxlX3QpOwogCkBAIC0xODcsMjIgKzIwNCwxMCBAQAogICAgIC8qIGVudHJpZXMgKi8KICAgICBzaXplICs9IGh0LT5lbnRyaWVzICogSEFTSFRBQkxFX0lURU1fU0laRShodCk7CiAKLSAgICAvKiBkYXRhIGxpbmtlZCBmcm9tIGVudHJpZXMgKi8KLSAgICBpZiAoaHQtPmdldF9kYXRhX3NpemVfZnVuYykgewotICAgICAgICBmb3IgKGh2ID0gMDsgaHYgPCBodC0+bnVtX2J1Y2tldHM7IGh2KyspIHsKLSAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7Ci0KLSAgICAgICAgICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBodik7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqZGF0YTsKLQotICAgICAgICAgICAgICAgIGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBzaXplICs9IGh0LT5nZXRfZGF0YV9zaXplX2Z1bmMoZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKKwogI2lmZGVmIFB5X0RFQlVHCiB2b2lkCiBfUHlfaGFzaHRhYmxlX3ByaW50X3N0YXRzKF9QeV9oYXNodGFibGVfdCAqaHQpCkBAIC0yNDMsMzggKzI0OCw0NSBAQAogfQogI2VuZGlmCiAKLS8qIEdldCBhbiBlbnRyeS4gUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdC4gKi8KKwogX1B5X2hhc2h0YWJsZV9lbnRyeV90ICoKLV9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSkKK19QeV9oYXNodGFibGVfZ2V0X2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXkpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAotICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhrZXkpOworICAgIGFzc2VydChrZXlfc2l6ZSA9PSBodC0+a2V5X3NpemUpOworCisgICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGh0LCBwa2V5KTsKICAgICBpbmRleCA9IGtleV9oYXNoICYgKGh0LT5udW1fYnVja2V0cyAtIDEpOwogCiAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGluZGV4KTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoa2V5LCBlbnRyeSkpCisgICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhodCwgcGtleSwgZW50cnkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmV0dXJuIGVudHJ5OwogfQogCisKIHN0YXRpYyBpbnQKLV9oYXNodGFibGVfcG9wX2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfcG9wX2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgKnByZXZpb3VzOwogCi0gICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGtleSk7CisgICAgYXNzZXJ0KGtleV9zaXplID09IGh0LT5rZXlfc2l6ZSk7CisKKyAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoaHQsIHBrZXkpOwogICAgIGluZGV4ID0ga2V5X2hhc2ggJiAoaHQtPm51bV9idWNrZXRzIC0gMSk7CiAKICAgICBwcmV2aW91cyA9IE5VTEw7CiAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGluZGV4KTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoa2V5LCBlbnRyeSkpCisgICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhodCwgcGtleSwgZW50cnkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIHByZXZpb3VzID0gZW50cnk7CiAgICAgfQpAQCAtMjg3LDcgKzI5OSw3IEBACiAgICAgaHQtPmVudHJpZXMtLTsKIAogICAgIGlmIChkYXRhICE9IE5VTEwpCi0gICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKGh0LCBkYXRhLCBkYXRhX3NpemUsIGVudHJ5KTsKKyAgICAgICAgRU5UUllfUkVBRF9QREFUQShodCwgZW50cnksIGRhdGFfc2l6ZSwgZGF0YSk7CiAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogCiAgICAgaWYgKChmbG9hdClodC0+ZW50cmllcyAvIChmbG9hdClodC0+bnVtX2J1Y2tldHMgPCBIQVNIVEFCTEVfTE9XKQpAQCAtMjk1LDI2ICszMDcsMjcgQEAKICAgICByZXR1cm4gMTsKIH0KIAotLyogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBoYXNoLiBUaGUga2V5IG11c3Qgbm90IGJlIHByZXNlbnQgaW4gdGhlIGhhc2ggdGFibGUuCi0gICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBtZW1vcnkgZXJyb3IuICovCisKIGludAotX1B5X2hhc2h0YWJsZV9zZXQoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5LAotICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfc2V0KF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IHZvaWQgKmRhdGEpCiB7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKICAgICBzaXplX3QgaW5kZXg7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAorICAgIGFzc2VydChrZXlfc2l6ZSA9PSBodC0+a2V5X3NpemUpOworCiAgICAgYXNzZXJ0KGRhdGEgIT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCk7CiAjaWZuZGVmIE5ERUJVRwogICAgIC8qIERvbid0IHdyaXRlIHRoZSBhc3NlcnRpb24gb24gYSBzaW5nbGUgbGluZSBiZWNhdXNlIGl0IGlzIGludGVyZXN0aW5nCiAgICAgICAgdG8ga25vdyB0aGUgZHVwbGljYXRlZCBlbnRyeSBpZiB0aGUgYXNzZXJ0aW9uIGZhaWxlZC4gVGhlIGVudHJ5IGNhbgogICAgICAgIGJlIHJlYWQgdXNpbmcgYSBkZWJ1Z2dlci4gKi8KLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXkpOworICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5KTsKICAgICBhc3NlcnQoZW50cnkgPT0gTlVMTCk7CiAjZW5kaWYKIAotICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhrZXkpOworICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhodCwgcGtleSk7CiAgICAgaW5kZXggPSBrZXlfaGFzaCAmIChodC0+bnVtX2J1Y2tldHMgLSAxKTsKIAogICAgIGVudHJ5ID0gaHQtPmFsbG9jLm1hbGxvYyhIQVNIVEFCTEVfSVRFTV9TSVpFKGh0KSk7CkBAIC0zMjMsMTEgKzMzNiw5IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBlbnRyeS0+a2V5ID0gKHZvaWQgKilrZXk7CiAgICAgZW50cnktPmtleV9oYXNoID0ga2V5X2hhc2g7Ci0KLSAgICBhc3NlcnQoZGF0YV9zaXplID09IGh0LT5kYXRhX3NpemUpOwotICAgIG1lbWNweShfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoZW50cnkpLCBkYXRhLCBkYXRhX3NpemUpOworICAgIFB5X01FTUNQWSgodm9pZCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShlbnRyeSksIHBrZXksIGh0LT5rZXlfc2l6ZSk7CisgICAgRU5UUllfV1JJVEVfUERBVEEoaHQsIGVudHJ5LCBkYXRhX3NpemUsIGRhdGEpOwogCiAgICAgX1B5X3NsaXN0X3ByZXBlbmQoJmh0LT5idWNrZXRzW2luZGV4XSwgKF9QeV9zbGlzdF9pdGVtX3QqKWVudHJ5KTsKICAgICBodC0+ZW50cmllcysrOwpAQCAtMzM3LDQ4ICszNDgsNTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogR2V0IGRhdGEgZnJvbSBhbiBlbnRyeS4gQ29weSBlbnRyeSBkYXRhIGludG8gZGF0YSBhbmQgcmV0dXJuIDEgaWYgdGhlIGVudHJ5Ci0gICBleGlzdHMsIHJldHVybiAwIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdC4gKi8KKwogaW50Ci1fUHlfaGFzaHRhYmxlX2dldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCitfUHlfaGFzaHRhYmxlX2dldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCiB7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKIAogICAgIGFzc2VydChkYXRhICE9IE5VTEwpOwogCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShodCwga2V5KTsKKyAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwotICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKGh0LCBkYXRhLCBkYXRhX3NpemUsIGVudHJ5KTsKKyAgICBFTlRSWV9SRUFEX1BEQVRBKGh0LCBlbnRyeSwgZGF0YV9zaXplLCBkYXRhKTsKICAgICByZXR1cm4gMTsKIH0KIAorCiBpbnQKLV9QeV9oYXNodGFibGVfcG9wKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfcG9wKF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCiB7CiAgICAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7Ci0gICAgYXNzZXJ0KGh0LT5mcmVlX2RhdGFfZnVuYyA9PSBOVUxMKTsKLSAgICByZXR1cm4gX2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5LCBkYXRhLCBkYXRhX3NpemUpOwogfQogCi0vKiBEZWxldGUgYW4gZW50cnkuIFRoZSBlbnRyeSBtdXN0IGV4aXN0LiAqLworCisvKiBDb2RlIGNvbW1lbnRlZCBzaW5jZSB0aGUgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpbiBQeXRob24gKi8KKyNpZiAwCiB2b2lkCi1fUHlfaGFzaHRhYmxlX2RlbGV0ZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXkpCitfUHlfaGFzaHRhYmxlX2RlbGV0ZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXkpCiB7CiAjaWZuZGVmIE5ERUJVRwotICAgIGludCBmb3VuZCA9IF9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXksIE5VTEwsIDApOworICAgIGludCBmb3VuZCA9IF9QeV9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSwgTlVMTCwgMCk7CiAgICAgYXNzZXJ0KGZvdW5kKTsKICNlbHNlCi0gICAgKHZvaWQpX2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleSwgTlVMTCwgMCk7CisgICAgKHZvaWQpX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5LCBOVUxMLCAwKTsKICNlbmRpZgogfQorI2VuZGlmCiAKLS8qIFByb3RvdHlwZSBmb3IgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvcmVhY2gKLSAgIGtleS92YWx1ZSBwYWlyIGluIHRoZSBoYXNoIGJ5IGhhc2h0YWJsZV9mb3JlYWNoKCkuICBJdGVyYXRpb24KLSAgIHN0b3BzIGlmIGEgbm9uLXplcm8gdmFsdWUgaXMgcmV0dXJuZWQuICovCisKIGludAogX1B5X2hhc2h0YWJsZV9mb3JlYWNoKF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICgqZnVuYykgKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKmFyZyksCisgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMgZnVuYywKICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCiB7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKQEAgLTM4Niw3ICszOTksNyBAQAogCiAgICAgZm9yIChodiA9IDA7IGh2IDwgaHQtPm51bV9idWNrZXRzOyBodisrKSB7CiAgICAgICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBodik7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcmVzID0gZnVuYyhlbnRyeSwgYXJnKTsKKyAgICAgICAgICAgIGludCByZXMgPSBmdW5jKGh0LCBlbnRyeSwgYXJnKTsKICAgICAgICAgICAgIGlmIChyZXMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMzk0LDYgKzQwNyw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIGhhc2h0YWJsZV9yZWhhc2goX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKQEAgLTQyNSw3ICs0MzksOCBAQAogICAgICAgICBmb3IgKGVudHJ5ID0gQlVDS0VUU19IRUFEKG9sZF9idWNrZXRzW2J1Y2tldF0pOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IG5leHQpIHsKICAgICAgICAgICAgIHNpemVfdCBlbnRyeV9pbmRleDsKIAotICAgICAgICAgICAgYXNzZXJ0KGh0LT5oYXNoX2Z1bmMoZW50cnktPmtleSkgPT0gZW50cnktPmtleV9oYXNoKTsKKworICAgICAgICAgICAgYXNzZXJ0KGh0LT5oYXNoX2Z1bmMoaHQsIF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShlbnRyeSkpID09IGVudHJ5LT5rZXlfaGFzaCk7CiAgICAgICAgICAgICBuZXh0ID0gRU5UUllfTkVYVChlbnRyeSk7CiAgICAgICAgICAgICBlbnRyeV9pbmRleCA9IGVudHJ5LT5rZXlfaGFzaCAmIChuZXdfc2l6ZSAtIDEpOwogCkBAIC00MzYsNiArNDUxLDcgQEAKICAgICBodC0+YWxsb2MuZnJlZShvbGRfYnVja2V0cyk7CiB9CiAKKwogdm9pZAogX1B5X2hhc2h0YWJsZV9jbGVhcihfUHlfaGFzaHRhYmxlX3QgKmh0KQogewpAQCAtNDQ1LDggKzQ2MSw2IEBACiAgICAgZm9yIChpPTA7IGkgPCBodC0+bnVtX2J1Y2tldHM7IGkrKykgewogICAgICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaSk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgewogICAgICAgICAgICAgbmV4dCA9IEVOVFJZX05FWFQoZW50cnkpOwotICAgICAgICAgICAgaWYgKGh0LT5mcmVlX2RhdGFfZnVuYykKLSAgICAgICAgICAgICAgICBodC0+ZnJlZV9kYXRhX2Z1bmMoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSkpOwogICAgICAgICAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogICAgICAgICB9CiAgICAgICAgIF9QeV9zbGlzdF9pbml0KCZodC0+YnVja2V0c1tpXSk7CkBAIC00NTUsNiArNDY5LDcgQEAKICAgICBoYXNodGFibGVfcmVoYXNoKGh0KTsKIH0KIAorCiB2b2lkCiBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKQEAgLTQ2NCw4ICs0NzksNiBAQAogICAgICAgICBfUHlfc2xpc3RfaXRlbV90ICplbnRyeSA9IGh0LT5idWNrZXRzW2ldLmhlYWQ7CiAgICAgICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgICAgICAgX1B5X3NsaXN0X2l0ZW1fdCAqZW50cnlfbmV4dCA9IGVudHJ5LT5uZXh0OwotICAgICAgICAgICAgaWYgKGh0LT5mcmVlX2RhdGFfZnVuYykKLSAgICAgICAgICAgICAgICBodC0+ZnJlZV9kYXRhX2Z1bmMoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSkpOwogICAgICAgICAgICAgaHQtPmFsbG9jLmZyZWUoZW50cnkpOwogICAgICAgICAgICAgZW50cnkgPSBlbnRyeV9uZXh0OwogICAgICAgICB9CkBAIC00NzUsMzkgKzQ4OCwzMSBAQAogICAgIGh0LT5hbGxvYy5mcmVlKGh0KTsKIH0KIAotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCB0YWJsZSAqLworCiBfUHlfaGFzaHRhYmxlX3QgKgogX1B5X2hhc2h0YWJsZV9jb3B5KF9QeV9oYXNodGFibGVfdCAqc3JjKQogeworICAgIGNvbnN0IHNpemVfdCBrZXlfc2l6ZSA9IHNyYy0+a2V5X3NpemU7CisgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHNyYy0+ZGF0YV9zaXplOwogICAgIF9QeV9oYXNodGFibGVfdCAqZHN0OwogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CiAgICAgc2l6ZV90IGJ1Y2tldDsKICAgICBpbnQgZXJyOwotICAgIHZvaWQgKmRhdGEsICpuZXdfZGF0YTsKIAotICAgIGRzdCA9IF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoc3JjLT5kYXRhX3NpemUsIHNyYy0+bnVtX2J1Y2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5oYXNoX2Z1bmMsIHNyYy0+Y29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Y29weV9kYXRhX2Z1bmMsIHNyYy0+ZnJlZV9kYXRhX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5nZXRfZGF0YV9zaXplX2Z1bmMsICZzcmMtPmFsbG9jKTsKKyAgICBkc3QgPSBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGtleV9zaXplLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPm51bV9idWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5oYXNoX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmNvbXBhcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMtPmFsbG9jKTsKICAgICBpZiAoZHN0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgZm9yIChidWNrZXQ9MDsgYnVja2V0IDwgc3JjLT5udW1fYnVja2V0czsgYnVja2V0KyspIHsKICAgICAgICAgZW50cnkgPSBUQUJMRV9IRUFEKHNyYywgYnVja2V0KTsKICAgICAgICAgZm9yICg7IGVudHJ5OyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgICAgICBpZiAoc3JjLT5jb3B5X2RhdGFfZnVuYykgewotICAgICAgICAgICAgICAgIGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IHNyYy0+Y29weV9kYXRhX2Z1bmMoZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld19kYXRhICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IF9QeV9oYXNodGFibGVfc2V0KGRzdCwgZW50cnktPmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2RhdGEsIHNyYy0+ZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBlcnIgPSBfUHlfaGFzaHRhYmxlX3NldChkc3QsIGVudHJ5LT5rZXksIGRhdGEsIHNyYy0+ZGF0YV9zaXplKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXkgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKHNyYywgZW50cnkpOworICAgICAgICAgICAgZXJyID0gX1B5X2hhc2h0YWJsZV9zZXQoZHN0LCBrZXlfc2l6ZSwgcGtleSwgZGF0YV9zaXplLCBwZGF0YSk7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KGRzdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01MTYsNCArNTIxLDMgQEAKICAgICB9CiAgICAgcmV0dXJuIGRzdDsKIH0KLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9oYXNodGFibGUuaCBiL01vZHVsZXMvaGFzaHRhYmxlLmgKaW5kZXggYTlmOTk5My4uMThmZWQwOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9oYXNodGFibGUuaAorKysgYi9Nb2R1bGVzL2hhc2h0YWJsZS5oCkBAIC0xLDkgKzEsMTAgQEAKICNpZm5kZWYgUHlfSEFTSFRBQkxFX0gKICNkZWZpbmUgUHlfSEFTSFRBQkxFX0gKLQogLyogVGhlIHdob2xlIEFQSSBpcyBwcml2YXRlICovCiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiAKKy8qIFNpbmdsZSBsaW5rZWQgbGlzdCAqLworCiB0eXBlZGVmIHN0cnVjdCBfUHlfc2xpc3RfaXRlbV9zIHsKICAgICBzdHJ1Y3QgX1B5X3NsaXN0X2l0ZW1fcyAqbmV4dDsKIH0gX1B5X3NsaXN0X2l0ZW1fdDsKQEAgLTE2LDMzICsxNyw2NiBAQAogCiAjZGVmaW5lIF9QeV9TTElTVF9IRUFEKFNMSVNUKSAoKChfUHlfc2xpc3RfdCAqKVNMSVNUKS0+aGVhZCkKIAorCisvKiBfUHlfaGFzaHRhYmxlOiB0YWJsZSBlbnRyeSAqLworCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogdXNlZCBieSBfUHlfaGFzaHRhYmxlX3QuYnVja2V0cyB0byBsaW5rIGVudHJpZXMgKi8KICAgICBfUHlfc2xpc3RfaXRlbV90IF9QeV9zbGlzdF9pdGVtOwogCi0gICAgY29uc3Qgdm9pZCAqa2V5OwogICAgIFB5X3VoYXNoX3Qga2V5X2hhc2g7CiAKLSAgICAvKiBkYXRhIGZvbGxvd3MgKi8KKyAgICAvKiBrZXkgKGtleV9zaXplIGJ5dGVzKSBhbmQgdGhlbiBkYXRhIChkYXRhX3NpemUgYnl0ZXMpIGZvbGxvd3MgKi8KIH0gX1B5X2hhc2h0YWJsZV9lbnRyeV90OwogCi0jZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShFTlRSWSkgXAotICAgICAgICAoKGNoYXIgKikoRU5UUlkpICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkpCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShFTlRSWSkgXAorICAgICAgICAoKGNvbnN0IHZvaWQgKikoKGNoYXIgKikoRU5UUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkpKQogCi0jZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoRU5UUlkpIFwKLSAgICAgICAgKCoodm9pZCAqKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoRU5UUlkpKQorI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKFRBQkxFLCBFTlRSWSkgXAorICAgICAgICAoKGNvbnN0IHZvaWQgKikoKGNoYXIgKikoRU5UUlkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoVEFCTEUpLT5rZXlfc2l6ZSkpCiAKLSNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEoVEFCTEUsIERBVEEsIERBVEFfU0laRSwgRU5UUlkpIFwKKy8qIEdldCBhIGtleSB2YWx1ZSBmcm9tIHBrZXk6IHVzZSBtZW1jcHkoKSByYXRoZXIgdGhhbiBhIHBvaW50ZXIgZGVyZWZlcmVuY2UKKyAgIHRvIGF2b2lkIG1lbW9yeSBhbGlnbm1lbnQgaXNzdWVzLiAqLworI2RlZmluZSBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKFRBQkxFLCBQS0VZLCBEU1RfS0VZKSBcCiAgICAgZG8geyBcCi0gICAgICAgIGFzc2VydCgoREFUQV9TSVpFKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCi0gICAgICAgIG1lbWNweShEQVRBLCBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoRU5UUlkpLCBEQVRBX1NJWkUpOyBcCisgICAgICAgIGFzc2VydChzaXplb2YoRFNUX0tFWSkgPT0gKFRBQkxFKS0+a2V5X3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgmKERTVF9LRVkpLCAoUEtFWSksIHNpemVvZihEU1RfS0VZKSk7IFwKICAgICB9IHdoaWxlICgwKQogCi10eXBlZGVmIFB5X3VoYXNoX3QgKCpfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYykgKGNvbnN0IHZvaWQgKmtleSk7Ci10eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jKSAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmhlKTsKLXR5cGVkZWYgdm9pZCogKCpfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jKSh2b2lkICpkYXRhKTsKLXR5cGVkZWYgdm9pZCAoKl9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMpKHZvaWQgKmRhdGEpOwotdHlwZWRlZiBzaXplX3QgKCpfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYykodm9pZCAqZGF0YSk7CisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoVEFCTEUsIEVOVFJZLCBLRVkpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KHNpemVvZihLRVkpID09IChUQUJMRSktPmtleV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoJihLRVkpLCBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoRU5UUlkpLCBzaXplb2YoS0VZKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKFRBQkxFLCBFTlRSWSwgREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKERBVEEpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCYoREFUQSksIF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoVEFCTEUsIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICBzaXplb2YoREFUQSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1dSSVRFX0RBVEEoVEFCTEUsIEVOVFJZLCBEQVRBKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydChzaXplb2YoREFUQSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKChUQUJMRSksIChFTlRSWSkpLCBcCisgICAgICAgICAgICAgICAgICAmKERBVEEpLCBzaXplb2YoREFUQSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworCisvKiBfUHlfaGFzaHRhYmxlOiBwcm90b3R5cGVzICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBfUHlfaGFzaHRhYmxlX3Q7CisKK3R5cGVkZWYgUHlfdWhhc2hfdCAoKl9QeV9oYXNodGFibGVfaGFzaF9mdW5jKSAoc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXkpOwordHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYykgKHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICpoZSk7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayAqLwpAQCAtNTIsNzcgKzg2LDEyNiBAQAogICAgIHZvaWQgKCpmcmVlKSAodm9pZCAqcHRyKTsKIH0gX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgeworCisvKiBfUHlfaGFzaHRhYmxlOiB0YWJsZSAqLworCit0eXBlZGVmIHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgewogICAgIHNpemVfdCBudW1fYnVja2V0czsKICAgICBzaXplX3QgZW50cmllczsgLyogVG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlLiAqLwogICAgIF9QeV9zbGlzdF90ICpidWNrZXRzOworICAgIHNpemVfdCBrZXlfc2l6ZTsKICAgICBzaXplX3QgZGF0YV9zaXplOwogCiAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jOwogICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYzsKLSAgICBfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jIGNvcHlfZGF0YV9mdW5jOwotICAgIF9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMgZnJlZV9kYXRhX2Z1bmM7Ci0gICAgX1B5X2hhc2h0YWJsZV9nZXRfZGF0YV9zaXplX2Z1bmMgZ2V0X2RhdGFfc2l6ZV9mdW5jOwogICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgYWxsb2M7CiB9IF9QeV9oYXNodGFibGVfdDsKIAotLyogaGFzaCBhbmQgY29tcGFyZSBmdW5jdGlvbnMgZm9yIGludGVnZXJzIGFuZCBwb2ludGVycyAqLwotUHlBUElfRlVOQyhQeV91aGFzaF90KSBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyKGNvbnN0IHZvaWQgKmtleSk7Ci1QeUFQSV9GVU5DKFB5X3VoYXNoX3QpIF9QeV9oYXNodGFibGVfaGFzaF9pbnQoY29uc3Qgdm9pZCAqa2V5KTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KGNvbnN0IHZvaWQgKmtleSwgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSk7CisvKiBoYXNoIGEgcG9pbnRlciAodm9pZCopICovCitQeUFQSV9GVU5DKFB5X3VoYXNoX3QpIF9QeV9oYXNodGFibGVfaGFzaF9wdHIoCisgICAgc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgY29uc3Qgdm9pZCAqcGtleSk7CisKKy8qIGNvbXBhcmlzb24gdXNpbmcgbWVtY21wKCkgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KTsKIAogUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX3QgKikgX1B5X2hhc2h0YWJsZV9uZXcoCisgICAgc2l6ZV90IGtleV9zaXplLAogICAgIHNpemVfdCBkYXRhX3NpemUsCiAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYyk7CisKIFB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoCisgICAgc2l6ZV90IGtleV9zaXplLAogICAgIHNpemVfdCBkYXRhX3NpemUsCiAgICAgc2l6ZV90IGluaXRfc2l6ZSwKICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jLAotICAgIF9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMgY29weV9kYXRhX2Z1bmMsCi0gICAgX1B5X2hhc2h0YWJsZV9mcmVlX2RhdGFfZnVuYyBmcmVlX2RhdGFfZnVuYywKLSAgICBfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYyBnZXRfZGF0YV9zaXplX2Z1bmMsCiAgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCAqYWxsb2NhdG9yKTsKLVB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfY29weShfUHlfaGFzaHRhYmxlX3QgKnNyYyk7Ci1QeUFQSV9GVU5DKHZvaWQpIF9QeV9oYXNodGFibGVfY2xlYXIoX1B5X2hhc2h0YWJsZV90ICpodCk7CisKIFB5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9kZXN0cm95KF9QeV9oYXNodGFibGVfdCAqaHQpOwogCi10eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jKSAoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqYXJnKTsKKy8qIFJldHVybiBhIGNvcHkgb2YgdGhlIGhhc2ggdGFibGUgKi8KK1B5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfY29weShfUHlfaGFzaHRhYmxlX3QgKnNyYyk7CiAKK1B5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9jbGVhcihfUHlfaGFzaHRhYmxlX3QgKmh0KTsKKwordHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYykgKF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCisvKiBDYWxsIGZ1bmMoKSBvbiBlYWNoIGVudHJ5IG9mIHRoZSBoYXNodGFibGUuCisgICBJdGVyYXRpb24gc3RvcHMgaWYgZnVuYygpIHJlc3VsdCBpcyBub24temVybywgaW4gdGhpcyBjYXNlIGl0J3MgdGhlIHJlc3VsdAorICAgb2YgdGhlIGNhbGwuIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2ZvcmVhY2goCiAgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYyBmdW5jLCB2b2lkICphcmcpOworICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jIGZ1bmMsCisgICAgdm9pZCAqYXJnKTsKKwogUHlBUElfRlVOQyhzaXplX3QpIF9QeV9oYXNodGFibGVfc2l6ZShfUHlfaGFzaHRhYmxlX3QgKmh0KTsKIAotUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX2VudHJ5X3QqKSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSgKLSAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSk7CisvKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGhhc2guIFRoZSBrZXkgbXVzdCBub3QgYmUgcHJlc2VudCBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIG1lbW9yeSBlcnJvci4KKworICAgRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLAorICAgYnV0IHVzZSBfUHlfSEFTSFRBQkxFX1NFVCgpIGFuZCBfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEoKSBtYWNyb3MgKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX3NldCgKICAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSwKLSAgICB2b2lkICpkYXRhLAotICAgIHNpemVfdCBkYXRhX3NpemUpOwotUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfZ2V0KAotICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5LAotICAgIHZvaWQgKmRhdGEsCi0gICAgc2l6ZV90IGRhdGFfc2l6ZSk7Ci1QeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9wb3AoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXksCi0gICAgdm9pZCAqZGF0YSwKLSAgICBzaXplX3QgZGF0YV9zaXplKTsKLVB5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9kZWxldGUoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXkpOworICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgY29uc3Qgdm9pZCAqZGF0YSk7CiAKICNkZWZpbmUgX1B5X0hBU0hUQUJMRV9TRVQoVEFCTEUsIEtFWSwgREFUQSkgXAotICAgIF9QeV9oYXNodGFibGVfc2V0KFRBQkxFLCBLRVksICYoREFUQSksIHNpemVvZihEQVRBKSkKKyAgICBfUHlfaGFzaHRhYmxlX3NldChUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSwgc2l6ZW9mKERBVEEpLCAmKERBVEEpKQorCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQShUQUJMRSwgS0VZKSBcCisgICAgX1B5X2hhc2h0YWJsZV9zZXQoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSksIDAsIE5VTEwpCisKKworLyogR2V0IGFuIGVudHJ5LgorICAgUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdC4KKworICAgRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLCBidXQgdXNlIF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKCkKKyAgIG1hY3JvICovCitQeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfZW50cnlfdCopIF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXkpOworCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKFRBQkxFLCBLRVkpIFwKKyAgICBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSkKKworCisvKiBHZXQgZGF0YSBmcm9tIGFuIGVudHJ5LiBDb3B5IGVudHJ5IGRhdGEgaW50byBkYXRhIGFuZCByZXR1cm4gMSBpZiB0aGUgZW50cnkKKyAgIGV4aXN0cywgcmV0dXJuIDAgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LgorCisgICBEb24ndCBjYWxsIGRpcmVjdGx5IHRoaXMgZnVuY3Rpb24sIGJ1dCB1c2UgX1B5X0hBU0hUQUJMRV9HRVQoKSBtYWNybyAqLworUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfZ2V0KAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB2b2lkICpkYXRhKTsKIAogI2RlZmluZSBfUHlfSEFTSFRBQkxFX0dFVChUQUJMRSwgS0VZLCBEQVRBKSBcCi0gICAgX1B5X2hhc2h0YWJsZV9nZXQoVEFCTEUsIEtFWSwgJihEQVRBKSwgc2l6ZW9mKERBVEEpKQorICAgIF9QeV9oYXNodGFibGVfZ2V0KFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCBzaXplb2YoREFUQSksICYoREFUQSkpCisKKworLyogRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLCBidXQgdXNlIF9QeV9IQVNIVEFCTEVfUE9QKCkgbWFjcm8gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX3BvcCgKKyAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9QT1AoVEFCTEUsIEtFWSwgREFUQSkgXAorICAgIF9QeV9oYXNodGFibGVfcG9wKFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCBzaXplb2YoREFUQSksICYoREFUQSkpCisKIAogI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwppbmRleCA2ZmYyNDFlLi5jOTY2Mzc2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCisrKyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKQEAgLTEsNCArMSw1IEBACiAKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCkBAIC03LDcgKzgsNyBAQAogKi8KIAogCi0vKiBncm91cGJ5IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGdyb3VwYnkgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTc0LDcgKzc1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25leHQoZ3JvdXBieW9iamVjdCAqZ2JvKQogewotICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOworICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyOwogCiAgICAgLyogc2tpcCB0byBuZXh0IGl0ZXJhdGlvbiBncm91cCAqLwogICAgIGZvciAoOzspIHsKQEAgLTg1LDggKzg2LDcgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBpbnQgcmNtcDsKIAotICAgICAgICAgICAgcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2JvLT5jdXJya2V5LCBQeV9FUSk7CisgICAgICAgICAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGdiby0+dGd0a2V5LCBnYm8tPmN1cnJrZXksIFB5X0VRKTsKICAgICAgICAgICAgIGlmIChyY21wID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgZWxzZSBpZiAocmNtcCA9PSAwKQpAQCAtMTAxLDI3ICsxMDEsMTkgQEAKICAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOwogICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywgbmV3dmFsdWUsIE5VTEwpOwogICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHRtcCA9IGdiby0+Y3VycmtleTsKLSAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gZ2JvLT5jdXJydmFsdWU7Ci0gICAgICAgIGdiby0+Y3VycnZhbHVlID0gbmV3dmFsdWU7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgUHlfWFNFVFJFRihnYm8tPmN1cnJrZXksIG5ld2tleSk7CisgICAgICAgIFB5X1hTRVRSRUYoZ2JvLT5jdXJydmFsdWUsIG5ld3ZhbHVlKTsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoZ2JvLT5jdXJya2V5KTsKLSAgICB0bXAgPSBnYm8tPnRndGtleTsKLSAgICBnYm8tPnRndGtleSA9IGdiby0+Y3VycmtleTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihnYm8tPnRndGtleSwgZ2JvLT5jdXJya2V5KTsKIAogICAgIGdyb3VwZXIgPSBfZ3JvdXBlcl9jcmVhdGUoZ2JvLCBnYm8tPnRndGtleSk7CiAgICAgaWYgKGdyb3VwZXIgPT0gTlVMTCkKQEAgLTE3Myw3ICsxNjUsNyBAQAogICAgICByZWR1Y2VfZG9jfSwKICAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbilncm91cGJ5X3NldHN0YXRlLCAgICBNRVRIX08sCiAgICAgIHNldHN0YXRlX2RvY30sCi0gICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihncm91cGJ5X2RvYywKQEAgLTI5Niw4ICsyODgsNyBAQAogICAgICAgICAgICAgbmV3a2V5ID0gbmV3dmFsdWU7CiAgICAgICAgICAgICBQeV9JTkNSRUYobmV3dmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKKyAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLCBuZXd2YWx1ZSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAobmV3a2V5ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dmFsdWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzI1LDggKzMxNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2dyb3VwZXJfcmVkdWNlKF9ncm91cGVyb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgIGx6LT5wYXJlbnQsIGx6LT50Z3RrZXkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLCBsei0+cGFyZW50LCBsei0+dGd0a2V5KTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIF9ncm91cGVyX21ldGhvZHNbXSA9IHsKQEAgLTM1OSw3ICszNDksNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKV9ncm91cGVyX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtMzgwLDggKzM3MCw3IEBACiB9OwogCiAKLQotLyogdGVlIG9iamVjdCBhbmQgd2l0aCBzdXBwb3J0aW5nIGZ1bmN0aW9uIGFuZCBvYmplY3RzICoqKioqKioqKioqKioqKi8KKy8qIHRlZSBvYmplY3QgYW5kIHdpdGggc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGhlIHRlZWRhdGFvYmplY3QgcHJlLWFsbG9jYXRlcyBzcGFjZSBmb3IgTElOS0NFTExTIG51bWJlciBvZiBvYmplY3RzLgogICAgVG8gaGVscCB0aGUgb2JqZWN0IGZpdCBuZWF0bHkgaW5zaWRlIGNhY2hlIGxpbmVzIChzcGFjZSBmb3IgMTYgdG8gMzIKQEAgLTM5Niw3ICszODUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqaXQ7Ci0gICAgaW50IG51bXJlYWQ7ICAvKiAwIDw9IG51bXJlYWQgPD0gTElOS0NFTExTICovCisgICAgaW50IG51bXJlYWQ7ICAgICAgICAgICAgICAgIC8qIDAgPD0gbnVtcmVhZCA8PSBMSU5LQ0VMTFMgKi8KICAgICBQeU9iamVjdCAqbmV4dGxpbms7CiAgICAgUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CiB9IHRlZWRhdGFvYmplY3Q7CkBAIC00MDQsNyArMzkzLDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgdGVlZGF0YW9iamVjdCAqZGF0YW9iajsKLSAgICBpbnQgaW5kZXg7ICAgIC8qIDAgPD0gaW5kZXggPD0gTElOS0NFTExTICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAgICAgICAgIC8qIDAgPD0gaW5kZXggPD0gTElOS0NFTExTICovCiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OwogfSB0ZWVvYmplY3Q7CiAKQEAgLTQ2MSw2ICs0NTAsNyBAQAogdGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKIHsKICAgICBpbnQgaTsKKwogICAgIFB5X1ZJU0lUKHRkby0+aXQpOwogICAgIGZvciAoaSA9IDA7IGkgPCB0ZG8tPm51bXJlYWQ7IGkrKykKICAgICAgICAgUHlfVklTSVQodGRvLT52YWx1ZXNbaV0pOwpAQCAtNTEwLDYgKzUwMCw3IEBACiAgICAgaW50IGk7CiAgICAgLyogY3JlYXRlIGEgdGVtcG9yYXJ5IGxpc3Qgb2YgYWxyZWFkeSBpdGVyYXRlZCB2YWx1ZXMgKi8KICAgICBQeU9iamVjdCAqdmFsdWVzID0gUHlMaXN0X05ldyh0ZG8tPm51bXJlYWQpOworCiAgICAgaWYgKCF2YWx1ZXMpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspIHsKQEAgLTU3Nyw3ICs1NjgsNyBAQAogUHlEb2NfU1RSVkFSKHRlZWRhdGFvYmplY3RfZG9jLCAiRGF0YSBjb250YWluZXIgY29tbW9uIHRvIG11bHRpcGxlIHRlZSBvYmplY3RzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRlZWRhdGFvYmplY3RfdHlwZSA9IHsKLSAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgICAgICAgICAgLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KICAgICAiaXRlcnRvb2xzLl90ZWVfZGF0YW9iamVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YodGVlZGF0YW9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KQEAgLTU5Nyw3ICs1ODgsNyBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgIC8qIHRwX2ZsYWdzICovCiAgICAgdGVlZGF0YW9iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtNzUyLDkgKzc0Myw5IEBACiAiSXRlcmF0b3Igd3JhcHBlZCB0byBtYWtlIGl0IGNvcHlhYmxlIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0ZWVfbWV0aG9kc1tdID0gewotICAgIHsiX19jb3B5X18iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LCAgTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKLSAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbil0ZWVfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLCByZWR1Y2VfZG9jfSwKLSAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbil0ZWVfc2V0c3RhdGUsICAgIE1FVEhfTywgc2V0c3RhdGVfZG9jfSwKKyAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbil0ZWVfY29weSwgICAgIE1FVEhfTk9BUkdTLCB0ZWVjb3B5X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pdGVlX3JlZHVjZSwgICBNRVRIX05PQVJHUywgcmVkdWNlX2RvY30sCisgICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pdGVlX3NldHN0YXRlLCBNRVRIX08sICAgICAgc2V0c3RhdGVfZG9jfSwKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNzg0LDcgKzc3NSw3IEBACiAgICAgKHRyYXZlcnNlcHJvYyl0ZWVfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSl0ZWVfY2xlYXIsICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIG9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpdGVlX25leHQsICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgdGVlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwpAQCAtODUwLDEyICs4NDEsMTMgQEAKICJ0ZWUoaXRlcmFibGUsIG49MikgLS0+IHR1cGxlIG9mIG4gaW5kZXBlbmRlbnQgaXRlcmF0b3JzLiIpOwogCiAKLS8qIGN5Y2xlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY3ljbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICppdDsKICAgICBQeU9iamVjdCAqc2F2ZWQ7CisgICAgUHlfc3NpemVfdCBpbmRleDsKICAgICBpbnQgZmlyc3RwYXNzOwogfSBjeWNsZW9iamVjdDsKIApAQCAtODk1LDYgKzg4Nyw3IEBACiAgICAgfQogICAgIGx6LT5pdCA9IGl0OwogICAgIGx6LT5zYXZlZCA9IHNhdmVkOworICAgIGx6LT5pbmRleCA9IDA7CiAgICAgbHotPmZpcnN0cGFzcyA9IDA7CiAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CkBAIC05MDQsMTUgKzg5NywxNiBAQAogY3ljbGVfZGVhbGxvYyhjeWNsZW9iamVjdCAqbHopCiB7CiAgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0gICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOwogICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9YREVDUkVGKGx6LT5zYXZlZCk7CiAgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBjeWNsZV90cmF2ZXJzZShjeWNsZW9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgaWYgKGx6LT5pdCkKKyAgICAgICAgUHlfVklTSVQobHotPml0KTsKICAgICBQeV9WSVNJVChsei0+c2F2ZWQpOwogICAgIHJldHVybiAwOwogfQpAQCAtOTIxLDU2ICs5MTUsNjkgQEAKIGN5Y2xlX25leHQoY3ljbGVvYmplY3QgKmx6KQogewogICAgIFB5T2JqZWN0ICppdGVtOwotICAgIFB5T2JqZWN0ICppdDsKLSAgICBQeU9iamVjdCAqdG1wOwogCi0gICAgd2hpbGUgKDEpIHsKKyAgICBpZiAobHotPml0ICE9IE5VTEwpIHsKICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7CiAgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICghbHotPmZpcnN0cGFzcyAmJiBQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSkpIHsKKyAgICAgICAgICAgIGlmIChsei0+Zmlyc3RwYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobHotPnNhdmVkLCBpdGVtKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICB9Ci0gICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLSAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQeUxpc3RfU2l6ZShsei0+c2F2ZWQpID09IDApCisgICAgICAgIC8qIE5vdGU6ICBTdG9wSXRlcmF0aW9uIGlzIGFscmVhZHkgY2xlYXJlZCBieSBQeUl0ZXJfTmV4dCgpICovCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihsei0+c2F2ZWQpOwotICAgICAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB0bXAgPSBsei0+aXQ7Ci0gICAgICAgIGx6LT5pdCA9IGl0OwotICAgICAgICBsei0+Zmlyc3RwYXNzID0gMTsKLSAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIFB5X0NMRUFSKGx6LT5pdCk7CiAgICAgfQorICAgIGlmIChQeV9TSVpFKGx6LT5zYXZlZCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShsei0+c2F2ZWQsIGx6LT5pbmRleCk7CisgICAgbHotPmluZGV4Kys7CisgICAgaWYgKGx6LT5pbmRleCA+PSBQeV9TSVpFKGx6LT5zYXZlZCkpCisgICAgICAgIGx6LT5pbmRleCA9IDA7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIHJldHVybiBpdGVtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfcmVkdWNlKGN5Y2xlb2JqZWN0ICpseikKIHsKLSAgICAvKiBDcmVhdGUgYSBuZXcgY3ljbGUgd2l0aCB0aGUgaXRlcmF0b3IgdHVwbGUsIHRoZW4gc2V0Ci0gICAgICogdGhlIHNhdmVkIHN0YXRlIG9uIGl0LgotICAgICAqLwotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pKE9pKSIsIFB5X1RZUEUobHopLAotICAgICAgICBsei0+aXQsIGx6LT5zYXZlZCwgbHotPmZpcnN0cGFzcyk7CisgICAgLyogQ3JlYXRlIGEgbmV3IGN5Y2xlIHdpdGggdGhlIGl0ZXJhdG9yIHR1cGxlLCB0aGVuIHNldCB0aGUgc2F2ZWQgc3RhdGUgKi8KKyAgICBpZiAobHotPml0ID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihsei0+c2F2ZWQpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobHotPmluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fc2V0c3RhdGVfXyk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChpdCwgJlB5SWRfX19zZXRzdGF0ZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm4iLCBsei0+aW5kZXgpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE4pKE9pKSIsIFB5X1RZUEUobHopLCBpdCwgbHotPnNhdmVkLCAxKTsKICAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykoT2kpIiwgUHlfVFlQRShseiksIGx6LT5pdCwgbHotPnNhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5maXJzdHBhc3MpOworfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfc2V0c3RhdGUoY3ljbGVvYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKnNhdmVkPU5VTEw7CiAgICAgaW50IGZpcnN0cGFzczsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJPaSIsICZzYXZlZCwgJmZpcnN0cGFzcykpCisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJPIWkiLCAmUHlMaXN0X1R5cGUsICZzYXZlZCwgJmZpcnN0cGFzcykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X1hJTkNSRUYoc2F2ZWQpOworICAgIFB5X0lOQ1JFRihzYXZlZCk7CiAgICAgUHlfWFNFVFJFRihsei0+c2F2ZWQsIHNhdmVkKTsKICAgICBsei0+Zmlyc3RwYXNzID0gZmlyc3RwYXNzICE9IDA7CisgICAgbHotPmluZGV4ID0gMDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtMTAzOSw3ICsxMDQ2LDcgQEAKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKmZ1bmM7CiAgICAgUHlPYmplY3QgKml0OwotICAgIGxvbmcgICAgICAgICBzdGFydDsKKyAgICBsb25nIHN0YXJ0OwogfSBkcm9wd2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGU7CkBAIC0xMTI5LDggKzExMzYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9yZWR1Y2UoZHJvcHdoaWxlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0YXJ0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdGFydCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMTgxLDEzICsxMTg3LDEzIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIGRyb3B3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpZHJvcHdoaWxlX25leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZHJvcHdoaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkcm9wd2hpbGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KQEAgLTEyMDgsNyArMTIxNCw3IEBACiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICpmdW5jOwogICAgIFB5T2JqZWN0ICppdDsKLSAgICBsb25nICAgICAgICAgc3RvcDsKKyAgICBsb25nIHN0b3A7CiB9IHRha2V3aGlsZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0YWtld2hpbGVfdHlwZTsKQEAgLTEyODMsNyArMTI4OSw3IEBACiAgICAgfQogICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgIFB5X0RFQ1JFRihnb29kKTsKLSAgICBpZiAob2sgPT0gMSkKKyAgICBpZiAob2sgPiAwKQogICAgICAgICByZXR1cm4gaXRlbTsKICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgaWYgKG9rID09IDApCkBAIC0xMjk0LDE0ICsxMzAwLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX3JlZHVjZSh0YWtld2hpbGVvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfcmVkdWNlX3NldHN0YXRlKHRha2V3aGlsZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBpbnQgc3RvcCA9IFB5T2JqZWN0X0lzVHJ1ZShzdGF0ZSk7CisKICAgICBpZiAoc3RvcCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5zdG9wID0gc3RvcDsKQEAgLTEzNDUsNyArMTM1MSw3IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIHRha2V3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC0xMzY2LDcgKzEzNzIsNyBAQAogfTsKIAogCi0vKiBpc2xpY2Ugb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlzbGljZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTE0MDIsNyArMTQwOCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciAiCisgICAgICAgICAgICAgICAgICAgImFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxNywxNCArMTQyNCwxNiBAQAogICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOworICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXJ0PDAgfHwgc3RvcDwtMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAiYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE1MjEsNiArMTUzMCw3IEBACiAgICAgICogdGhlbiAnc2V0c3RhdGUnIHdpdGggdGhlIG5leHQgYW5kIGNvdW50CiAgICAgICovCiAgICAgUHlPYmplY3QgKnN0b3A7CisKICAgICBpZiAobHotPml0ID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKmVtcHR5X2xpc3Q7CiAgICAgICAgIFB5T2JqZWN0ICplbXB0eV9pdDsKQEAgLTE1NTAsNiArMTU2MCw3IEBACiBpc2xpY2Vfc2V0c3RhdGUoaXNsaWNlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5X3NzaXplX3QgY250ID0gUHlMb25nX0FzU3NpemVfdChzdGF0ZSk7CisKICAgICBpZiAoY250ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5jbnQgPSBjbnQ7CkBAIC0xNzY0LDcgKzE3NzUsNyBAQAogfTsKIAogCi0vKiBjaGFpbiBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY2hhaW4gb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMTg0MCwzMiArMTg1MSwzMiBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogCiAgICAgaWYgKGx6LT5zb3VyY2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCiAKICAgICBpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IFB5SXRlcl9OZXh0KGx6LT5zb3VyY2UpOwogICAgICAgICBpZiAoaXRlcmFibGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLwogICAgICAgICB9CiAgICAgICAgIGx6LT5hY3RpdmUgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKICAgICAgICAgUHlfREVDUkVGKGl0ZXJhYmxlKTsKICAgICAgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLwogICAgICAgICB9CiAgICAgfQotICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+YWN0aXZlKTsKKyAgICBpdGVtID0gKCpQeV9UWVBFKGx6LT5hY3RpdmUpLT50cF9pdGVybmV4dCkobHotPmFjdGl2ZSk7CiAgICAgaWYgKGl0ZW0gIT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBpbnB1dCByYWlzZWQgYW4gZXhjZXB0aW9uICovCiAgICAgfQogICAgIFB5X0NMRUFSKGx6LT5hY3RpdmUpOwotICAgIHJldHVybiBjaGFpbl9uZXh0KGx6KTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCisgICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xODkxLDYgKzE5MDIsNyBAQAogY2hhaW5fc2V0c3RhdGUoY2hhaW5vYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKnNvdXJjZSwgKmFjdGl2ZT1OVUxMOworCiAgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgIk98TyIsICZzb3VyY2UsICZhY3RpdmUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTkxNSwxMyArMTkyNywxMyBAQAogdGhhdCBldmFsdWF0ZXMgbGF6aWx5LiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgY2hhaW5fbWV0aG9kc1tdID0gewotICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsICAgICAgICAgICAgTUVUSF9PIHwgTUVUSF9DTEFTUywKLSAgICAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAorICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCisgICAgIGNoYWluX2Zyb21faXRlcmFibGVfZG9jfSwKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbiljaGFpbl9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCiAgICAgIHJlZHVjZV9kb2N9LAogICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKWNoYWluX3NldHN0YXRlLCAgICBNRVRIX08sCiAgICAgIHNldHN0YXRlX2RvY30sCi0gICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZSA9IHsKQEAgLTE5NzMsMTAgKzE5ODUsMTAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcHJvZHVjdCBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHByb2R1Y3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlOwpAQCAtMTk5NSw3ICsyMDA3LDggQEAKICAgICAgICAgUHlPYmplY3QgKnRtcGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKICAgICAgICAgaWYgKHRtcGFyZ3MgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsIGt3bGlzdCwgJnJlcGVhdCkpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZyZXBlYXQpKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wYXJncyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMjI4NCw3ICsyMjk3LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMucHJvZHVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLSAgICBzaXplb2YocHJvZHVjdG9iamVjdCksICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgc2l6ZW9mKHByb2R1Y3RvYmplY3QpLCAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpcHJvZHVjdF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLwpAQCAtMjMyNiwxNSArMjMzOSwxNSBAQAogfTsKIAogCi0vKiBjb21iaW5hdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWJpbmF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGNvbWJpbmF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGNvbWJpbmF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb21iaW5hdGlvbnNfdHlwZTsKQEAgLTI1NDQsMTcgKzI1NTcsMTYgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShsei0+cG9vbCk7CiAKLSAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKQotICAgIHsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBhcmd1bWVudHMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICBQeV9zc2l6ZV90IG1heDsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBub3QgYW4gaW50ZWdlciAqLwogICAgICAgICBtYXggPSBpICsgbiAtIGx6LT5yOwpAQCAtMjY0MCw3ICsyNjUyLDcgQEAKIH07CiAKIAotLyogY29tYmluYXRpb25zIHdpdGggcmVwbGFjZW1lbnQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb21iaW5hdGlvbnMgd2l0aCByZXBsYWNlbWVudCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEVxdWl2YWxlbnQgdG86CiAKQEAgLTI2NzAsMTEgKzI2ODIsMTEgQEAKICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KICAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCiAgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY3dyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGN3cl90eXBlOwpAQCAtMjY5MSw4ICsyNzAzLDkgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLCBrd2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJncywgJml0ZXJhYmxlLCAmcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOwpAQCAtMjg1Nyw4ICsyODcwLDcgQEAKICAgICAgICAgaW5kaWNlcyA9IFB5VHVwbGVfTmV3KGx6LT5yKTsKICAgICAgICAgaWYgKCFpbmRpY2VzKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QqIGluZGV4ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGx6LT5pbmRpY2VzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5kaWNlcyk7CkBAIC0yODg0LDEwICsyODk2LDEwIEBACiAgICAgfQogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobHotPnBvb2wpOwotICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbm90IGFuIGludGVnZXIgKi8KICAgICAgICAgLyogY2xhbXAgdGhlIGluZGV4ICovCkBAIC0yOTcxLDcgKzI5ODMsNyBAQAogfTsKIAogCi0vKiBwZXJtdXRhdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogcGVybXV0YXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiBkZWYgcGVybXV0YXRpb25zKGl0ZXJhYmxlLCByPU5vbmUpOgogICAgICdwZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSAoMCwyKSAoMSwwKSAoMSwyKSAoMiwwKSAoMiwxKScKQEAgLTI5OTgsMTIgKzMwMTAsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBlbGVtZW50IGluIHRoZSBwb29sICovCi0gICAgUHlfc3NpemVfdCAqY3ljbGVzOyAgICAgICAgICAgICAgICAgLyogb25lIHJvbGxvdmVyIGNvdW50ZXIgcGVyIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHBlcm11dGF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLworICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHBlcm11dGF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZTsKQEAgLTMyMTgsNyArMzIzMCw3IEBACiAgICAgICAgIGluZGljZXMgPSBQeVR1cGxlX05ldyhuKTsKICAgICAgICAgaWYgKGluZGljZXMgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspeworICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+aW5kaWNlc1tpXSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwpAQCAtMzIyOCw4ICszMjQwLDcgQEAKICAgICAgICAgY3ljbGVzID0gUHlUdXBsZV9OZXcocG8tPnIpOwogICAgICAgICBpZiAoY3ljbGVzID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgZm9yIChpPTA7IGk8cG8tPnI7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGk9MCA7IGk8cG8tPnIgOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+Y3ljbGVzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0zMjU3LDE1ICszMjY4LDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG8tPnBvb2wpOwotICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGluZGljZXMpICE9IG4gfHwKLSAgICAgICAgUHlUdXBsZV9HRVRfU0laRShjeWNsZXMpICE9IHBvLT5yKQotICAgIHsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShpbmRpY2VzKSAhPSBuIHx8IFB5VHVwbGVfR0VUX1NJWkUoY3ljbGVzKSAhPSBwby0+cikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oaW5kaWNlcywgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMzI3OCw4ICszMjg2LDcgQEAKICAgICAgICAgcG8tPmluZGljZXNbaV0gPSBpbmRleDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oY3ljbGVzLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0zMzIwLDExICszMzI3LDExIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcGVybXV0YXRpb25zX3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZihwZXJtdXRhdGlvbnNvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zMzQxLDEzICszMzQ4LDEzIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylwZXJtdXRhdGlvbnNfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIHBlcm11YXRpb25zX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCkBAIC0zMzU4LDExICszMzY1LDExIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgcGVybXV0YXRpb25zX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0zNDI5LDkgKzM0MzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfbmV4dChhY2N1bXVsYXRlb2JqZWN0ICpseikKIHsKLSAgICBQeU9iamVjdCAqdmFsLCAqb2xkdG90YWwsICpuZXd0b3RhbDsKKyAgICBQeU9iamVjdCAqdmFsLCAqbmV3dG90YWw7CiAKLSAgICB2YWwgPSBQeUl0ZXJfTmV4dChsei0+aXQpOworICAgIHZhbCA9ICgqUHlfVFlQRShsei0+aXQpLT50cF9pdGVybmV4dCkobHotPml0KTsKICAgICBpZiAodmFsID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0zNDQ5LDExICszNDU2LDggQEAKICAgICBpZiAobmV3dG90YWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBvbGR0b3RhbCA9IGx6LT50b3RhbDsKLSAgICBsei0+dG90YWwgPSBuZXd0b3RhbDsKLSAgICBQeV9ERUNSRUYob2xkdG90YWwpOwotCiAgICAgUHlfSU5DUkVGKG5ld3RvdGFsKTsKKyAgICBQeV9TRVRSRUYobHotPnRvdGFsLCBuZXd0b3RhbCk7CiAgICAgcmV0dXJuIG5ld3RvdGFsOwogfQogCkBAIC0zNDgwLDcgKzM0ODQsNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGx6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+aXQsIGx6LT5iaW5vcD9sei0+Ymlub3A6UHlfTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+dG90YWw/bHotPnRvdGFsOlB5X05vbmUpOwotIH0KK30KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfc2V0c3RhdGUoYWNjdW11bGF0ZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKQEAgLTM2NDIsNyArMzY0Niw3IEBACiAKICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoc2VsZWN0b3IpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZWN0b3IpOwotICAgICAgICBpZiAob2sgPT0gMSkKKyAgICAgICAgaWYgKG9rID4gMCkKICAgICAgICAgICAgIHJldHVybiBkYXR1bTsKICAgICAgICAgUHlfREVDUkVGKGRhdHVtKTsKICAgICAgICAgaWYgKG9rIDwgMCkKQEAgLTM2NTUsNyArMzY1OSw3IEBACiB7CiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCiAgICAgICAgIGx6LT5kYXRhLCBsei0+c2VsZWN0b3JzKTsKLSAgICB9Cit9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wcmVzc19tZXRob2RzW10gPSB7CiAgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pY29tcHJlc3NfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLApAQCAtMzY3NCw0NCArMzY3OCw0NCBAQAogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMuY29tcHJlc3MiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YoY29tcHJlc3NvYmplY3QpLCAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKWNvbXByZXNzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb21wcmVzc190cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvbXByZXNzX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvbXByZXNzX25leHQsICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvbXByZXNzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICBjb21wcmVzc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0gICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBjb21wcmVzc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbXByZXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzc5Miw4ICszNzk2LDcgQEAKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7Ci0gICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwogICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM4MTIsOSArMzgxNSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVyZmFsc2VfcmVkdWNlKGZpbHRlcmZhbHNlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCk7Ci0gICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0KTsKK30KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZpbHRlcmZhbHNlX21ldGhvZHNbXSA9IHsKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilmaWx0ZXJmYWxzZV9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCkBAIC0zODM0LDcgKzM4MzYsNyBAQAogICAgIHNpemVvZihmaWx0ZXJmYWxzZW9iamVjdCksICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zODUyLDcgKzM4NTQsNyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBmaWx0ZXJmYWxzZV9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWZpbHRlcmZhbHNlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylmaWx0ZXJmYWxzZV90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTQwOTEsMTUgKzQwOTMsMTUgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0gICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgY291bnRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvdW50X3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvdW50X25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwpAQCAtNDI2NSw5ICs0MjY3LDcgQEAKICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0vKiB6aXBsb25nZXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKKy8qIHppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTQzMDYsNyArNDMwNiw3IEBACiAgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CiAgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgIGZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOwogICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewpAQCAtNDQ0Nyw2ICs0NDQ3LDcgQEAKICAgICAgKi8KICAgICBpbnQgaTsKICAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpKTsKKwogICAgIGlmIChhcmdzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaT0wOyBpPFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpOyBpKyspIHsKQEAgLTQ0OTcsNyArNDQ5OCw3IEBACiAgICAgc2l6ZW9mKHppcGxvbmdlc3RvYmplY3QpLCAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgLyogdHBfZGVhbGxvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KQEAgLTQ1MTQsOCArNDUxNSw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICB6aXBfbG9uZ2VzdF9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXppcF9sb25nZXN0X3RyYXZlcnNlLCAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtNDUzMSw3ICs0NTMyLDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0gICAgemlwX2xvbmdlc3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICB6aXBfbG9uZ2VzdF9uZXcsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IGU0Yzk1NWUuLmI2ZGNkZDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC00MiwxMSArNDIsMTEgQEAKICNkZWZpbmUgUFJPR1JBTV9PUFRTIEJBU0VfT1BUUwogCiAvKiBTaG9ydCB1c2FnZSBtZXNzYWdlICh3aXRoICVzIGZvciBhcmd2MCkgKi8KLXN0YXRpYyBjaGFyICp1c2FnZV9saW5lID0KK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX2xpbmVbXSA9CiAidXNhZ2U6ICVscyBbb3B0aW9uXSAuLi4gWy1jIGNtZCB8IC1tIG1vZCB8IGZpbGUgfCAtXSBbYXJnXSAuLi5cbiI7CiAKIC8qIExvbmcgdXNhZ2UgbWVzc2FnZSwgc3BsaXQgaW50byBwYXJ0cyA8IDUxMiBieXRlcyAqLwotc3RhdGljIGNoYXIgKnVzYWdlXzEgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMVtdID0gIlwKIE9wdGlvbnMgYW5kIGFyZ3VtZW50cyAoYW5kIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzKTpcblwKIC1iICAgICA6IGlzc3VlIHdhcm5pbmdzIGFib3V0IHN0cihieXRlc19pbnN0YW5jZSksIHN0cihieXRlYXJyYXlfaW5zdGFuY2UpXG5cCiAgICAgICAgICBhbmQgY29tcGFyaW5nIGJ5dGVzL2J5dGVhcnJheSB3aXRoIHN0ci4gKC1iYjogaXNzdWUgZXJyb3JzKVxuXApAQCAtNTYsNyArNTYsNyBAQAogLUUgICAgIDogaWdub3JlIFBZVEhPTiogZW52aXJvbm1lbnQgdmFyaWFibGVzIChzdWNoIGFzIFBZVEhPTlBBVEgpXG5cCiAtaCAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdCAoYWxzbyAtLWhlbHApXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzIgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMltdID0gIlwKIC1pICAgICA6IGluc3BlY3QgaW50ZXJhY3RpdmVseSBhZnRlciBydW5uaW5nIHNjcmlwdDsgZm9yY2VzIGEgcHJvbXB0IGV2ZW5cblwKICAgICAgICAgIGlmIHN0ZGluIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHRlcm1pbmFsOyBhbHNvIFBZVEhPTklOU1BFQ1Q9eFxuXAogLUkgICAgIDogaXNvbGF0ZSBQeXRob24gZnJvbSB0aGUgdXNlcidzIGVudmlyb25tZW50IChpbXBsaWVzIC1FIGFuZCAtcylcblwKQEAgLTY3LDcgKzY3LDcgQEAKIC1zICAgICA6IGRvbid0IGFkZCB1c2VyIHNpdGUgZGlyZWN0b3J5IHRvIHN5cy5wYXRoOyBhbHNvIFBZVEhPTk5PVVNFUlNJVEVcblwKIC1TICAgICA6IGRvbid0IGltcGx5ICdpbXBvcnQgc2l0ZScgb24gaW5pdGlhbGl6YXRpb25cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfMyA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV8zW10gPSAiXAogLXUgICAgIDogdW5idWZmZXJlZCBiaW5hcnkgc3Rkb3V0IGFuZCBzdGRlcnIsIHN0ZGluIGFsd2F5cyBidWZmZXJlZDtcblwKICAgICAgICAgIGFsc28gUFlUSE9OVU5CVUZGRVJFRD14XG5cCiAgICAgICAgICBzZWUgbWFuIHBhZ2UgZm9yIGRldGFpbHMgb24gaW50ZXJuYWwgYnVmZmVyaW5nIHJlbGF0aW5nIHRvICctdSdcblwKQEAgLTc5LDcgKzc5LDcgQEAKIC14ICAgICA6IHNraXAgZmlyc3QgbGluZSBvZiBzb3VyY2UsIGFsbG93aW5nIHVzZSBvZiBub24tVW5peCBmb3JtcyBvZiAjIWNtZFxuXAogLVggb3B0IDogc2V0IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG9wdGlvblxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV80ID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzRbXSA9ICJcCiBmaWxlICAgOiBwcm9ncmFtIHJlYWQgZnJvbSBzY3JpcHQgZmlsZVxuXAogLSAgICAgIDogcHJvZ3JhbSByZWFkIGZyb20gc3RkaW4gKGRlZmF1bHQ7IGludGVyYWN0aXZlIG1vZGUgaWYgYSB0dHkpXG5cCiBhcmcgLi4uOiBhcmd1bWVudHMgcGFzc2VkIHRvIHByb2dyYW0gaW4gc3lzLmFyZ3ZbMTpdXG5cblwKQEAgLTg4LDIyICs4OCwyMyBAQAogUFlUSE9OUEFUSCAgIDogJyVsYyctc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgcHJlZml4ZWQgdG8gdGhlXG5cCiAgICAgICAgICAgICAgICBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aC4gIFRoZSByZXN1bHQgaXMgc3lzLnBhdGguXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzUgPQorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfNVtdID0KICJQWVRIT05IT01FICAgOiBhbHRlcm5hdGUgPHByZWZpeD4gZGlyZWN0b3J5IChvciA8cHJlZml4PiVsYzxleGVjX3ByZWZpeD4pLlxuIgogIiAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCB1c2VzICVzLlxuIgogIlBZVEhPTkNBU0VPSyA6IGlnbm9yZSBjYXNlIGluICdpbXBvcnQnIHN0YXRlbWVudHMgKFdpbmRvd3MpLlxuIgogIlBZVEhPTklPRU5DT0RJTkc6IEVuY29kaW5nWzplcnJvcnNdIHVzZWQgZm9yIHN0ZGluL3N0ZG91dC9zdGRlcnIuXG4iCi0iUFlUSE9ORkFVTFRIQU5ETEVSOiBkdW1wIHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycy5cblwKLSI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfNiA9ICJcCi1QWVRIT05IQVNIU0VFRDogaWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gJ3JhbmRvbScsIGEgcmFuZG9tIHZhbHVlIGlzIHVzZWRcblwKLSAgIHRvIHNlZWQgdGhlIGhhc2hlcyBvZiBzdHIsIGJ5dGVzIGFuZCBkYXRldGltZSBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmVcblwKLSAgIHNldCB0byBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCw0Mjk0OTY3Mjk1XSB0byBnZXQgaGFzaCB2YWx1ZXMgd2l0aCBhXG5cCi0gICBwcmVkaWN0YWJsZSBzZWVkLlxuXAotIjsKKyJQWVRIT05GQVVMVEhBTkRMRVI6IGR1bXAgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzLlxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzZbXSA9CisiUFlUSE9OSEFTSFNFRUQ6IGlmIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvICdyYW5kb20nLCBhIHJhbmRvbSB2YWx1ZSBpcyB1c2VkXG4iCisiICAgdG8gc2VlZCB0aGUgaGFzaGVzIG9mIHN0ciwgYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZVxuIgorIiAgIHNldCB0byBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMCw0Mjk0OTY3Mjk1XSB0byBnZXQgaGFzaCB2YWx1ZXMgd2l0aCBhXG4iCisiICAgcHJlZGljdGFibGUgc2VlZC5cbiIKKyJQWVRIT05NQUxMT0M6IHNldCB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzXG4iCisiICAgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzLiBVc2UgUFlUSE9OTUFMTE9DPWRlYnVnIHRvIGluc3RhbGwgZGVidWdcbiIKKyIgICBob29rcy5cbiI7CiAKIHN0YXRpYyBpbnQKLXVzYWdlKGludCBleGl0Y29kZSwgd2NoYXJfdCogcHJvZ3JhbSkKK3VzYWdlKGludCBleGl0Y29kZSwgY29uc3Qgd2NoYXJfdCogcHJvZ3JhbSkKIHsKICAgICBGSUxFICpmID0gZXhpdGNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CiAKQEAgLTM0MSw2ICszNDIsNyBAQAogICAgIGludCBoZWxwID0gMDsKICAgICBpbnQgdmVyc2lvbiA9IDA7CiAgICAgaW50IHNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAwOworICAgIGNoYXIgKm9wdDsKICAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CiAgICAgUHlPYmplY3QgKndhcm5pbmdfb3B0aW9uID0gTlVMTDsKICAgICBQeU9iamVjdCAqd2FybmluZ19vcHRpb25zID0gTlVMTDsKQEAgLTM2NSw2ICszNjcsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG9wdCA9IFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DIik7CisgICAgaWYgKF9QeU1lbV9TZXR1cEFsbG9jYXRvcnMob3B0KSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkVycm9yIGluIFBZVEhPTk1BTExPQzogdW5rbm93biBhbGxvY2F0b3IgXCIlc1wiIVxuIiwgb3B0KTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKICAgICBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWcgPSAxOwogICAgIF9QeVJhbmRvbV9Jbml0KCk7CiAKQEAgLTY1NCw3ICs2NjMsNyBAQAogICAgICAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUod2J1Zik7CiAKICAgICAgICAgICAgIC8qIERvbid0IGZyZWUgd2J1ZiwgdGhlIGFyZ3VtZW50IHRvIFB5X1NldFByb2dyYW1OYW1lCi0gICAgICAgICAgICAgKiBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgUHlfRmluYWxpemUgaXMgY2FsbGVkLgorICAgICAgICAgICAgICogbXVzdCByZW1haW4gdmFsaWQgdW50aWwgUHlfRmluYWxpemVFeCBpcyBjYWxsZWQuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwpAQCAtNzg1LDcgKzc5NCwxMSBAQAogICAgICAgICBzdHMgPSBQeVJ1bl9BbnlGaWxlRmxhZ3Moc3RkaW4sICI8c3RkaW4+IiwgJmNmKSAhPSAwOwogICAgIH0KIAotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgLyogVmFsdWUgdW5saWtlbHkgdG8gYmUgY29uZnVzZWQgd2l0aCBhIG5vbi1lcnJvciBleGl0IHN0YXR1cyBvcgorICAgICAgICBvdGhlciBzcGVjaWFsIG1lYW5pbmcgKi8KKyAgICAgICAgc3RzID0gMTIwOworICAgIH0KIAogI2lmZGVmIF9fSU5TVVJFX18KICAgICAvKiBJbnN1cmUrKyBpcyBhIG1lbW9yeSBhbmFseXNpcyB0b29sIHRoYXQgYWlkcyBpbiBkaXNjb3ZlcmluZwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYXRobW9kdWxlLmMgYi9Nb2R1bGVzL21hdGhtb2R1bGUuYwppbmRleCA3ZWJmOGU4Li45NWVhNGY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21hdGhtb2R1bGUuYworKysgYi9Nb2R1bGVzL21hdGhtb2R1bGUuYwpAQCAtODc1LDcgKzg3NSw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1tYXRoXzIoUHlPYmplY3QgKmFyZ3MsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUsIGRvdWJsZSksIGNoYXIgKmZ1bmNuYW1lKQorbWF0aF8yKFB5T2JqZWN0ICphcmdzLCBkb3VibGUgKCpmdW5jKSAoZG91YmxlLCBkb3VibGUpLCBjb25zdCBjaGFyICpmdW5jbmFtZSkKIHsKICAgICBQeU9iamVjdCAqb3gsICpveTsKICAgICBkb3VibGUgeCwgeSwgcjsKQEAgLTEyNzQsNyArMTI3NCw3IEBACiAKIC8qIERpdmlkZS1hbmQtY29ucXVlciBmYWN0b3JpYWwgYWxnb3JpdGhtCiAgKgotICogQmFzZWQgb24gdGhlIGZvcm11bGEgYW5kIHBzdWVkby1jb2RlIHByb3ZpZGVkIGF0OgorICogQmFzZWQgb24gdGhlIGZvcm11bGEgYW5kIHBzZXVkby1jb2RlIHByb3ZpZGVkIGF0OgogICogaHR0cDovL3d3dy5sdXNjaG55LmRlL21hdGgvZmFjdG9yaWFsL2JpbmFyeXNwbGl0ZmFjdC5odG1sCiAgKgogICogRmFzdGVyIGFsZ29yaXRobXMgZXhpc3QsIGJ1dCB0aGV5J3JlIG1vcmUgY29tcGxpY2F0ZWQgYW5kIGRlcGVuZCBvbgpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKICAgIGluIHRoYXQgaW50IGlzIGxhcmdlciB0aGFuIFBZX1NTSVpFX1RfTUFYLiAqLwogCiBzdGF0aWMgUHlPYmplY3QqCi1sb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCitsb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY29uc3QgY2hhciAqZnVuY25hbWUpCiB7CiAgICAgLyogSWYgaXQgaXMgaW50LCBkbyBpdCBvdXJzZWx2ZXMuICovCiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CkBAIC0yMTQ0LDYgKzIxNDQsNyBAQAogCiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX1BJKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfRSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidGF1IiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfVEFVKSk7ICAvKiAycGkgKi8KICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImluZiIsIFB5RmxvYXRfRnJvbURvdWJsZShtX2luZigpKSk7CiAjaWYgIWRlZmluZWQoUFlfTk9fU0hPUlRfRkxPQVRfUkVQUikgfHwgZGVmaW5lZChQeV9OQU4pCiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJuYW4iLCBQeUZsb2F0X0Zyb21Eb3VibGUobV9uYW4oKSkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tZDVtb2R1bGUuYyBiL01vZHVsZXMvbWQ1bW9kdWxlLmMKaW5kZXggZjk0YWNjNy4uMDRiYzA2ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tZDVtb2R1bGUuYworKysgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCkBAIC0zMCw3ICszMCw3IEBACiAKICNpZiBTSVpFT0ZfSU5UID09IDQKIHR5cGVkZWYgdW5zaWduZWQgaW50IE1ENV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgUFlfTE9OR19MT05HIE1ENV9JTlQ2NDsgLyogNjQtYml0IGludGVnZXIgKi8KK3R5cGVkZWYgbG9uZyBsb25nIE1ENV9JTlQ2NDsgLyogNjQtYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvbW1hcG1vZHVsZS5jIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKaW5kZXggYmI5OGE5OS4uYjAwMTVhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKQEAgLTkzLDcgKzkzLDcgQEAKICAgICBzaXplX3QgICAgICBzaXplOwogICAgIHNpemVfdCAgICAgIHBvczsgICAgLyogcmVsYXRpdmUgdG8gb2Zmc2V0ICovCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIFBZX0xPTkdfTE9ORyBvZmZzZXQ7CisgICAgbG9uZyBsb25nIG9mZnNldDsKICNlbHNlCiAgICAgb2ZmX3QgICAgICAgb2Zmc2V0OwogI2VuZGlmCkBAIC0zODksNiArMzg5LDcgQEAKICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5X2J1ZmZlciBkYXRhOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKICAgICBDSEVDS19WQUxJRChOVUxMKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqOndyaXRlIiwgJmRhdGEpKQpAQCAtNDA2LDkgKzQwNyw5IEBACiAgICAgfQogICAgIG1lbWNweShzZWxmLT5kYXRhICsgc2VsZi0+cG9zLCBkYXRhLmJ1ZiwgZGF0YS5sZW4pOwogICAgIHNlbGYtPnBvcyA9IHNlbGYtPnBvcyArIGRhdGEubGVuOworICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tU3NpemVfdChkYXRhLmxlbik7CiAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NDUsNyArNDQ2LDcgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgICAgIERXT1JEIGxvdyxoaWdoOwotICAgICAgICBQWV9MT05HX0xPTkcgc2l6ZTsKKyAgICAgICAgbG9uZyBsb25nIHNpemU7CiAgICAgICAgIGxvdyA9IEdldEZpbGVTaXplKHNlbGYtPmZpbGVfaGFuZGxlLCAmaGlnaCk7CiAgICAgICAgIGlmIChsb3cgPT0gSU5WQUxJRF9GSUxFX1NJWkUpIHsKICAgICAgICAgICAgIC8qIEl0IG1pZ2h0IGJlIHRoYXQgdGhlIGZ1bmN0aW9uIGFwcGVhcnMgdG8gaGF2ZSBmYWlsZWQsCkBAIC00NTYsNyArNDU3LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWhpZ2ggJiYgbG93IDwgTE9OR19NQVgpCiAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKWxvdyk7Ci0gICAgICAgIHNpemUgPSAoKChQWV9MT05HX0xPTkcpaGlnaCk8PDMyKSArIGxvdzsKKyAgICAgICAgc2l6ZSA9ICgoKGxvbmcgbG9uZyloaWdoKTw8MzIpICsgbG93OwogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhzaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHNlbGYtPnNpemUpOwpAQCAtMTI1Nyw3ICsxMjU4LDcgQEAKIAogLyogQSBub3RlIG9uIHNpemVzIGFuZCBvZmZzZXRzOiB3aGlsZSB0aGUgYWN0dWFsIG1hcCBzaXplIG11c3QgaG9sZCBpbiBhCiAgICBQeV9zc2l6ZV90LCBib3RoIHRoZSB0b3RhbCBmaWxlIHNpemUgYW5kIHRoZSBzdGFydCBvZmZzZXQgY2FuIGJlIGxvbmdlcgotICAgdGhhbiBhIFB5X3NzaXplX3QsIHNvIHdlIHVzZSBQWV9MT05HX0xPTkcgd2hpY2ggaXMgYWx3YXlzIDY0LWJpdC4KKyAgIHRoYW4gYSBQeV9zc2l6ZV90LCBzbyB3ZSB1c2UgbG9uZyBsb25nIHdoaWNoIGlzIGFsd2F5cyA2NC1iaXQuCiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTI2Niw3ICsxMjY3LDcgQEAKICAgICBtbWFwX29iamVjdCAqbV9vYmo7CiAgICAgUHlPYmplY3QgKm1hcF9zaXplX29iaiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBtYXBfc2l6ZTsKLSAgICBQWV9MT05HX0xPTkcgb2Zmc2V0ID0gMCwgc2l6ZTsKKyAgICBsb25nIGxvbmcgb2Zmc2V0ID0gMCwgc2l6ZTsKICAgICBEV09SRCBvZmZfaGk7ICAgICAgIC8qIHVwcGVyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCiAgICAgRFdPUkQgb2ZmX2xvOyAgICAgICAvKiBsb3dlciAzMiBiaXRzIG9mIG9mZnNldCAqLwogICAgIERXT1JEIHNpemVfaGk7ICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBzaXplICovCkBAIC0xMzc4LDcgKzEzNzksNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNpemUgPSAoKChQWV9MT05HX0xPTkcpIGhpZ2gpIDw8IDMyKSArIGxvdzsKKyAgICAgICAgICAgIHNpemUgPSAoKChsb25nIGxvbmcpIGhpZ2gpIDw8IDMyKSArIGxvdzsKICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBtbWFwIGFuIGVtcHR5IGZpbGUiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvbmlzbW9kdWxlLmMgYi9Nb2R1bGVzL25pc21vZHVsZS5jCmluZGV4IDY0ZWI1ZGIuLmI2YTg1NWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbmlzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwpAQCAtNzYsMTEgKzc2LDcgQEAKIAogICAgICpwZml4ID0gMDsKICAgICBmb3IgKGk9MDsgYWxpYXNlc1tpXS5hbGlhcyAhPSAwTDsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLmFsaWFzLCBtYXApKSB7Ci0gICAgICAgICAgICAqcGZpeCA9IGFsaWFzZXNbaV0uZml4OwotICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaV0ubWFwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgeworICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSB8fCAhc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgewogICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKICAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vc3NhdWRpb2Rldi5jIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCmluZGV4IGQyZmQ1YzguLjJiN2Q3MWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYworKysgYi9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKQEAgLTMxLDcgKzMxLDExIEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjZWxzZQogI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChsaW51eCkKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKaW5kZXggNjQ3MWI4ZS4uODI3NzBhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgU3RyaW5nIGNvbnN0YW50cyB1c2VkIHRvIGluaXRpYWxpemUgbW9kdWxlIGF0dHJpYnV0ZXMuCiAgKgogICovCi1zdGF0aWMgY2hhciBwYXJzZXJfY29weXJpZ2h0X3N0cmluZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHBhcnNlcl9jb3B5cmlnaHRfc3RyaW5nW10gPQogIkNvcHlyaWdodCAxOTk1LTE5OTYgYnkgVmlyZ2luaWEgUG9seXRlY2huaWMgSW5zdGl0dXRlICYgU3RhdGVcblwKIFVuaXZlcnNpdHksIEJsYWNrc2J1cmcsIFZpcmdpbmlhLCBVU0EsIGFuZCBGcmVkIEwuIERyYWtlLCBKci4sIFJlc3RvbixcblwKIFZpcmdpbmlhLCBVU0EuICBQb3J0aW9ucyBjb3B5cmlnaHQgMTk5MS0xOTk1IGJ5IFN0aWNodGluZyBNYXRoZW1hdGlzY2hcblwKQEAgLTYzLDcgKzYzLDcgQEAKIFB5RG9jX1NUUlZBUihwYXJzZXJfZG9jX3N0cmluZywKICJUaGlzIGlzIGFuIGludGVyZmFjZSB0byBQeXRob24ncyBpbnRlcm5hbCBwYXJzZXIuIik7CiAKLXN0YXRpYyBjaGFyIHBhcnNlcl92ZXJzaW9uX3N0cmluZ1tdID0gIjAuNSI7CitzdGF0aWMgY29uc3QgY2hhciBwYXJzZXJfdmVyc2lvbl9zdHJpbmdbXSA9ICIwLjUiOwogCiAKIHR5cGVkZWYgUHlPYmplY3QqICgqU2VxTWFrZXIpIChQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC01NzgsMTMgKzU3OCwxMyBAQAogfQogCiAKLS8qICBlcnJfc3RyaW5nKGNoYXIqIG1lc3NhZ2UpCisvKiAgZXJyX3N0cmluZyhjb25zdCBjaGFyKiBtZXNzYWdlKQogICoKICAqICBTZXRzIHRoZSBlcnJvciBzdHJpbmcgZm9yIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIFBhcnNlckVycm9yLgogICoKICAqLwogc3RhdGljIHZvaWQKLWVycl9zdHJpbmcoY2hhciAqbWVzc2FnZSkKK2Vycl9zdHJpbmcoY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKICAgICBQeUVycl9TZXRTdHJpbmcocGFyc2VyX2Vycm9yLCBtZXNzYWdlKTsKIH0KQEAgLTU5Nyw3ICs1OTcsNyBAQAogICoKICAqLwogc3RhdGljIFB5T2JqZWN0KgotcGFyc2VyX2RvX3BhcnNlKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNoYXIgKmFyZ3NwZWMsIGludCB0eXBlKQorcGFyc2VyX2RvX3BhcnNlKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmFyZ3NwZWMsIGludCB0eXBlKQogewogICAgIGNoYXIqICAgICBzdHJpbmcgPSAwOwogICAgIFB5T2JqZWN0KiByZXMgICAgPSAwOwpAQCAtNjcwLDkgKzY3MCw3NSBAQAogCiAKIHN0YXRpYyBub2RlKiBidWlsZF9ub2RlX3RyZWUoUHlPYmplY3QgKnR1cGxlKTsKLXN0YXRpYyBpbnQgICB2YWxpZGF0ZV9leHByX3RyZWUobm9kZSAqdHJlZSk7Ci1zdGF0aWMgaW50ICAgdmFsaWRhdGVfZmlsZV9pbnB1dChub2RlICp0cmVlKTsKLXN0YXRpYyBpbnQgICB2YWxpZGF0ZV9lbmNvZGluZ19kZWNsKG5vZGUgKnRyZWUpOworCitzdGF0aWMgaW50Cit2YWxpZGF0ZV9ub2RlKG5vZGUgKnRyZWUpCit7CisgICAgaW50IHR5cGUgPSBUWVBFKHRyZWUpOworICAgIGludCBuY2ggPSBOQ0godHJlZSk7CisgICAgZGZhICpudF9kZmE7CisgICAgc3RhdGUgKmRmYV9zdGF0ZTsKKyAgICBpbnQgcG9zLCBhcmM7CisKKyAgICBhc3NlcnQoSVNOT05URVJNSU5BTCh0eXBlKSk7CisgICAgdHlwZSAtPSBOVF9PRkZTRVQ7CisgICAgaWYgKHR5cGUgPj0gX1B5UGFyc2VyX0dyYW1tYXIuZ19uZGZhcykgeworICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLCAiVW5yZWNvZ25pemVkIG5vZGUgdHlwZSAlZC4iLCBUWVBFKHRyZWUpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG50X2RmYSA9ICZfUHlQYXJzZXJfR3JhbW1hci5nX2RmYVt0eXBlXTsKKyAgICBSRVEodHJlZSwgbnRfZGZhLT5kX3R5cGUpOworCisgICAgLyogUnVuIHRoZSBERkEgZm9yIHRoaXMgbm9udGVybWluYWwuICovCisgICAgZGZhX3N0YXRlID0gJm50X2RmYS0+ZF9zdGF0ZVtudF9kZmEtPmRfaW5pdGlhbF07CisgICAgZm9yIChwb3MgPSAwOyBwb3MgPCBuY2g7ICsrcG9zKSB7CisgICAgICAgIG5vZGUgKmNoID0gQ0hJTEQodHJlZSwgcG9zKTsKKyAgICAgICAgaW50IGNoX3R5cGUgPSBUWVBFKGNoKTsKKyAgICAgICAgZm9yIChhcmMgPSAwOyBhcmMgPCBkZmFfc3RhdGUtPnNfbmFyY3M7ICsrYXJjKSB7CisgICAgICAgICAgICBzaG9ydCBhX2xhYmVsID0gZGZhX3N0YXRlLT5zX2FyY1thcmNdLmFfbGJsOworICAgICAgICAgICAgYXNzZXJ0KGFfbGFiZWwgPCBfUHlQYXJzZXJfR3JhbW1hci5nX2xsLmxsX25sYWJlbHMpOworICAgICAgICAgICAgaWYgKF9QeVBhcnNlcl9HcmFtbWFyLmdfbGwubGxfbGFiZWxbYV9sYWJlbF0ubGJfdHlwZSA9PSBjaF90eXBlKSB7CisgICAgIAkgICAgICAgIC8qIFRoZSBjaGlsZCBpcyBhY2NlcHRhYmxlOyBpZiBub24tdGVybWluYWwsIHZhbGlkYXRlIGl0IHJlY3Vyc2l2ZWx5LiAqLworICAgICAgICAgICAgICAgIGlmIChJU05PTlRFUk1JTkFMKGNoX3R5cGUpICYmICF2YWxpZGF0ZV9ub2RlKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHN0YXRlLCBhbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBjaGlsZC4gKi8KKyAgICAgICAgICAgICAgICBkZmFfc3RhdGUgPSAmbnRfZGZhLT5kX3N0YXRlW2RmYV9zdGF0ZS0+c19hcmNbYXJjXS5hX2Fycm93XTsKKyAgICAgICAgICAgICAgICBnb3RvIGFyY19mb3VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBXaGF0IHdvdWxkIHRoaXMgc3RhdGUgaGF2ZSBhY2NlcHRlZD8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgc2hvcnQgYV9sYWJlbCA9IGRmYV9zdGF0ZS0+c19hcmMtPmFfbGJsOworICAgICAgICAgICAgaW50IG5leHRfdHlwZTsKKyAgICAgICAgICAgIGlmICghYV9sYWJlbCkgLyogV291bGRuJ3QgYWNjZXB0IGFueSBtb3JlIGNoaWxkcmVuICovCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX251bV9jaGlsZHJlbjsKKworICAgICAgICAgICAgbmV4dF90eXBlID0gX1B5UGFyc2VyX0dyYW1tYXIuZ19sbC5sbF9sYWJlbFthX2xhYmVsXS5sYl90eXBlOworICAgICAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwobmV4dF90eXBlKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLCAiRXhwZWN0ZWQgbm9kZSB0eXBlICVkLCBnb3QgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90eXBlLCBjaF90eXBlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLCAiSWxsZWdhbCB0ZXJtaW5hbDogZXhwZWN0ZWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5UGFyc2VyX1Rva2VuTmFtZXNbbmV4dF90eXBlXSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCithcmNfZm91bmQ6CisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBBcmUgd2UgaW4gYSBmaW5hbCBzdGF0ZT8gSWYgc28sIHJldHVybiAxIGZvciBzdWNjZXNzZnVsIHZhbGlkYXRpb24uICovCisgICAgZm9yIChhcmMgPSAwOyBhcmMgPCBkZmFfc3RhdGUtPnNfbmFyY3M7ICsrYXJjKSB7CisgICAgICAgIGlmICghZGZhX3N0YXRlLT5zX2FyY1thcmNdLmFfbGJsKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworaWxsZWdhbF9udW1fY2hpbGRyZW46CisgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKKyAgICAgICAgICAgICAgICAgIklsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciAlcyBub2RlLiIsIG50X2RmYS0+ZF9uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KIAogLyogIFB5T2JqZWN0KiBwYXJzZXJfdHVwbGUyc3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogICoKQEAgLTY4MSw3ICs3NDcsNyBAQAogICogIHR1cGxlIGNhbiBiZSB2YWxpZGF0ZWQuICBJdCBkb2VzIHRoaXMgYnkgY2hlY2tpbmcgdGhlIGZpcnN0IGNvZGUgb2YgdGhlCiAgKiAgdHVwbGUsIGFuZCwgaWYgYWNjZXB0YWJsZSwgYnVpbGRzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gIElmIHRoaXMKICAqICBzdGVwIHN1Y2NlZWRzLCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgdmFsaWRhdGVkIGFzIGZ1bGx5IGFzCi0gKiAgcG9zc2libGUgd2l0aCB0aGUgdmFyaW91cyB2YWxpZGF0ZV8qKCkgcm91dGluZXMgZGVmaW5lZCBiZWxvdy4KKyAqICBwb3NzaWJsZSB3aXRoIHRoZSByZWN1cnNpdmUgdmFsaWRhdGVfbm9kZSgpIHJvdXRpbmUgZGVmaW5lZCBhYm92ZS4KICAqCiAgKiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgc3VwcG9ydCBpcyB0byBiZSBhZGRlZCBmb3IgUHlTVF9GUkFHTUVOVAogICogIFNUIG9iamVjdHMuCkBAIC03MTAsMzMgKzc3NiwzNSBAQAogICAgICAqLwogICAgIHRyZWUgPSBidWlsZF9ub2RlX3RyZWUodHVwbGUpOwogICAgIGlmICh0cmVlICE9IDApIHsKLSAgICAgICAgaW50IHN0YXJ0X3N5bSA9IFRZUEUodHJlZSk7Ci0gICAgICAgIGlmIChzdGFydF9zeW0gPT0gZXZhbF9pbnB1dCkgeworICAgICAgICBub2RlICp2YWxpZGF0aW9uX3Jvb3QgPSB0cmVlOworICAgICAgICBpbnQgdHJlZV90eXBlID0gMDsKKyAgICAgICAgc3dpdGNoIChUWVBFKHRyZWUpKSB7CisgICAgICAgIGNhc2UgZXZhbF9pbnB1dDoKICAgICAgICAgICAgIC8qICBNaWdodCBiZSBhbiBldmFsIGZvcm0uICAqLwotICAgICAgICAgICAgaWYgKHZhbGlkYXRlX2V4cHJfdHJlZSh0cmVlKSkKLSAgICAgICAgICAgICAgICBzdCA9IHBhcnNlcl9uZXdzdG9iamVjdCh0cmVlLCBQeVNUX0VYUFIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFB5Tm9kZV9GcmVlKHRyZWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0YXJ0X3N5bSA9PSBmaWxlX2lucHV0KSB7Ci0gICAgICAgICAgICAvKiAgVGhpcyBsb29rcyBsaWtlIGFuIGV4ZWMgZm9ybSBzbyBmYXIuICAqLwotICAgICAgICAgICAgaWYgKHZhbGlkYXRlX2ZpbGVfaW5wdXQodHJlZSkpCi0gICAgICAgICAgICAgICAgc3QgPSBwYXJzZXJfbmV3c3RvYmplY3QodHJlZSwgUHlTVF9TVUlURSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlOb2RlX0ZyZWUodHJlZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RhcnRfc3ltID09IGVuY29kaW5nX2RlY2wpIHsKKyAgICAgICAgICAgIHRyZWVfdHlwZSA9IFB5U1RfRVhQUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVuY29kaW5nX2RlY2w6CiAgICAgICAgICAgICAvKiBUaGlzIGxvb2tzIGxpa2UgYW4gZW5jb2RpbmdfZGVjbCBzbyBmYXIuICovCi0gICAgICAgICAgICBpZiAodmFsaWRhdGVfZW5jb2RpbmdfZGVjbCh0cmVlKSkKLSAgICAgICAgICAgICAgICBzdCA9IHBhcnNlcl9uZXdzdG9iamVjdCh0cmVlLCBQeVNUX1NVSVRFKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeU5vZGVfRnJlZSh0cmVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChOQ0godHJlZSkgIT0gMSkKKyAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJFcnJvciBQYXJzaW5nIGVuY29kaW5nX2RlY2wiKTsKKyAgICAgICAgICAgIHZhbGlkYXRpb25fcm9vdCA9IENISUxEKHRyZWUsIDApOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgZmlsZV9pbnB1dDoKKyAgICAgICAgICAgIC8qICBUaGlzIGxvb2tzIGxpa2UgYW4gZXhlYyBmb3JtIHNvIGZhci4gICovCisKKyAgICAgICAgICAgIHRyZWVfdHlwZSA9IFB5U1RfU1VJVEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8qICBUaGlzIGlzIGEgZnJhZ21lbnQsIGF0IGJlc3QuICovCiAgICAgICAgICAgICBQeU5vZGVfRnJlZSh0cmVlKTsKICAgICAgICAgICAgIGVycl9zdHJpbmcoInBhcnNlIHRyZWUgZG9lcyBub3QgdXNlIGEgdmFsaWQgc3RhcnQgc3ltYm9sIik7CisgICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkYXRlX25vZGUodmFsaWRhdGlvbl9yb290KSkKKyAgICAgICAgICAgIHN0ID0gcGFyc2VyX25ld3N0b2JqZWN0KHRyZWUsIHRyZWVfdHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5Tm9kZV9GcmVlKHRyZWUpOwogICAgIH0KICAgICAvKiAgTWFrZSBzdXJlIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBhbGwgZXJyb3JzLiAgV2Ugc2hvdWxkIG5ldmVyCiAgICAgICogIGdldCB0aGlzLCBidXQgd2UnZCBkbyB3ZWxsIHRvIGJlIHN1cmUgc29tZXRoaW5nIGlzIGRvbmUuCkBAIC05ODEsMjQzMyArMTA0OSw2IEBACiB9CiAKIAotLyoKLSAqICBWYWxpZGF0aW9uIHJvdXRpbmVzIHVzZWQgd2l0aGluIHRoZSB2YWxpZGF0aW9uIHNlY3Rpb246Ci0gKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfdGVybWluYWwobm9kZSAqdGVybWluYWwsIGludCB0eXBlLCBjaGFyICpzdHJpbmcpOwotCi0jZGVmaW5lIHZhbGlkYXRlX2FtcGVyc2FuZChjaCkgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgIEFNUEVSLCAiJiIpCi0jZGVmaW5lIHZhbGlkYXRlX2NpcmN1bWZsZXgoY2gpIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCBDSVJDVU1GTEVYLCAiXiIpCi0jZGVmaW5lIHZhbGlkYXRlX2NvbG9uKGNoKSAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgIENPTE9OLCAiOiIpCi0jZGVmaW5lIHZhbGlkYXRlX2NvbW1hKGNoKSAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgIENPTU1BLCAiLCIpCi0jZGVmaW5lIHZhbGlkYXRlX2RlZGVudChjaCkgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgREVERU5ULCAiIikKLSNkZWZpbmUgdmFsaWRhdGVfZXF1YWwoY2gpICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgRVFVQUwsICI9IikKLSNkZWZpbmUgdmFsaWRhdGVfaW5kZW50KGNoKSAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICBJTkRFTlQsIChjaGFyKilOVUxMKQotI2RlZmluZSB2YWxpZGF0ZV9scGFyZW4oY2gpICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgTFBBUiwgIigiKQotI2RlZmluZSB2YWxpZGF0ZV9uZXdsaW5lKGNoKSAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgTkVXTElORSwgKGNoYXIqKU5VTEwpCi0jZGVmaW5lIHZhbGlkYXRlX3JwYXJlbihjaCkgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBSUEFSLCAiKSIpCi0jZGVmaW5lIHZhbGlkYXRlX3NlbWkoY2gpICAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBTRU1JLCAiOyIpCi0jZGVmaW5lIHZhbGlkYXRlX3N0YXIoY2gpICAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBTVEFSLCAiKiIpCi0jZGVmaW5lIHZhbGlkYXRlX3ZiYXIoY2gpICAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBWQkFSLCAifCIpCi0jZGVmaW5lIHZhbGlkYXRlX2RvdWJsZXN0YXIoY2gpIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCBET1VCTEVTVEFSLCAiKioiKQotI2RlZmluZSB2YWxpZGF0ZV9kb3QoY2gpICAgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgIERPVCwgIi4iKQotI2RlZmluZSB2YWxpZGF0ZV9hdChjaCkgICAgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgICBBVCwgIkAiKQotI2RlZmluZSB2YWxpZGF0ZV9yYXJyb3coY2gpICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgIFJBUlJPVywgIi0+IikKLSNkZWZpbmUgdmFsaWRhdGVfbmFtZShjaCwgc3RyKSAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIE5BTUUsIHN0cikKLQotI2RlZmluZSBWQUxJREFURVIobikgICAgc3RhdGljIGludCB2YWxpZGF0ZV8jI24obm9kZSAqdHJlZSkKLQotVkFMSURBVEVSKG5vZGUpOyAgICAgICAgICAgICAgICBWQUxJREFURVIoc21hbGxfc3RtdCk7Ci1WQUxJREFURVIoY2xhc3MpOyAgICAgICAgICAgICAgIFZBTElEQVRFUihub2RlKTsKLVZBTElEQVRFUihwYXJhbWV0ZXJzKTsgICAgICAgICAgVkFMSURBVEVSKHN1aXRlKTsKLVZBTElEQVRFUih0ZXN0bGlzdCk7ICAgICAgICAgICAgVkFMSURBVEVSKHZhcmFyZ3NsaXN0KTsKLVZBTElEQVRFUih2ZnBkZWYpOwotVkFMSURBVEVSKHN0bXQpOyAgICAgICAgICAgICAgICBWQUxJREFURVIoc2ltcGxlX3N0bXQpOwotVkFMSURBVEVSKGV4cHJfc3RtdCk7ICAgICAgICAgICBWQUxJREFURVIocG93ZXIpOwotVkFMSURBVEVSKGRlbF9zdG10KTsKLVZBTElEQVRFUihyZXR1cm5fc3RtdCk7ICAgICAgICAgVkFMSURBVEVSKHJhaXNlX3N0bXQpOwotVkFMSURBVEVSKGltcG9ydF9zdG10KTsgICAgICAgICBWQUxJREFURVIoaW1wb3J0X3N0bXQpOwotVkFMSURBVEVSKGltcG9ydF9uYW1lKTsgICAgICAgICBWQUxJREFURVIoeWllbGRfc3RtdCk7Ci1WQUxJREFURVIoZ2xvYmFsX3N0bXQpOyAgICAgICAgIFZBTElEQVRFUihub25sb2NhbF9zdG10KTsKLVZBTElEQVRFUihhc3NlcnRfc3RtdCk7Ci1WQUxJREFURVIoY29tcG91bmRfc3RtdCk7ICAgICAgIFZBTElEQVRFUih0ZXN0X29yX3N0YXJfZXhwcik7Ci1WQUxJREFURVIod2hpbGUpOyAgICAgICAgICAgICAgIFZBTElEQVRFUihmb3IpOwotVkFMSURBVEVSKHRyeSk7ICAgICAgICAgICAgICAgICBWQUxJREFURVIoZXhjZXB0X2NsYXVzZSk7Ci1WQUxJREFURVIodGVzdCk7ICAgICAgICAgICAgICAgIFZBTElEQVRFUihhbmRfdGVzdCk7Ci1WQUxJREFURVIobm90X3Rlc3QpOyAgICAgICAgICAgIFZBTElEQVRFUihjb21wYXJpc29uKTsKLVZBTElEQVRFUihjb21wX29wKTsKLVZBTElEQVRFUihzdGFyX2V4cHIpOyAgICAgICAgICAgVkFMSURBVEVSKGV4cHIpOwotVkFMSURBVEVSKHhvcl9leHByKTsgICAgICAgICAgICBWQUxJREFURVIoYW5kX2V4cHIpOwotVkFMSURBVEVSKHNoaWZ0X2V4cHIpOyAgICAgICAgICBWQUxJREFURVIoYXJpdGhfZXhwcik7Ci1WQUxJREFURVIodGVybSk7ICAgICAgICAgICAgICAgIFZBTElEQVRFUihmYWN0b3IpOwotVkFMSURBVEVSKGF0b20pOyAgICAgICAgICAgICAgICBWQUxJREFURVIobGFtYmRlZik7Ci1WQUxJREFURVIodHJhaWxlcik7ICAgICAgICAgICAgIFZBTElEQVRFUihzdWJzY3JpcHQpOwotVkFMSURBVEVSKHN1YnNjcmlwdGxpc3QpOyAgICAgICBWQUxJREFURVIoc2xpY2VvcCk7Ci1WQUxJREFURVIoZXhwcmxpc3QpOyAgICAgICAgICAgIFZBTElEQVRFUihkaWN0b3JzZXRtYWtlcik7Ci1WQUxJREFURVIoYXJnbGlzdCk7ICAgICAgICAgICAgIFZBTElEQVRFUihhcmd1bWVudCk7Ci1WQUxJREFURVIoY29tcF9mb3IpOwotVkFMSURBVEVSKGNvbXBfaXRlcik7ICAgICAgICAgICBWQUxJREFURVIoY29tcF9pZik7Ci1WQUxJREFURVIodGVzdGxpc3RfY29tcCk7ICAgICAgIFZBTElEQVRFUih5aWVsZF9leHByKTsKLVZBTElEQVRFUihvcl90ZXN0KTsKLVZBTElEQVRFUih0ZXN0X25vY29uZCk7ICAgICAgICAgVkFMSURBVEVSKGxhbWJkZWZfbm9jb25kKTsKLVZBTElEQVRFUih5aWVsZF9hcmcpOwotVkFMSURBVEVSKGFzeW5jX2Z1bmNkZWYpOyAgICAgICBWQUxJREFURVIoYXN5bmNfc3RtdCk7Ci1WQUxJREFURVIoYXRvbV9leHByKTsKLQotI3VuZGVmIFZBTElEQVRFUgotCi0jZGVmaW5lIGlzX2V2ZW4obikgICAgICAoKChuKSAmIDEpID09IDApCi0jZGVmaW5lIGlzX29kZChuKSAgICAgICAoKChuKSAmIDEpID09IDEpCi0KLQotc3RhdGljIGludAotdmFsaWRhdGVfbnR5cGUobm9kZSAqbiwgaW50IHQpCi17Ci0gICAgaWYgKFRZUEUobikgIT0gdCkgewotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLCAiRXhwZWN0ZWQgbm9kZSB0eXBlICVkLCBnb3QgJWQuIiwKLSAgICAgICAgICAgICAgICAgICAgIHQsIFRZUEUobikpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLyogIFZlcmlmaWVzIHRoYXQgdGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBpcyBleGFjdGx5ICdudW0nLCByYWlzaW5nCi0gKiAgYW4gZXhjZXB0aW9uIGlmIGl0IGlzbid0LiAgVGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGRvZXMgbm90IGluZGljYXRlCi0gKiAgdGhlIGV4YWN0IG51bWJlciBvZiBub2RlcywgYWxsb3dpbmcgdGhpcyB0byBiZSB1c2VkIHRvIHJhaXNlIHRoZQotICogICJyaWdodCIgZXhjZXB0aW9uIHdoZW4gdGhlIHdyb25nIG51bWJlciBvZiBub2RlcyBpcyBwcmVzZW50IGluIGEKLSAqICBzcGVjaWZpYyB2YXJpYW50IG9mIGEgc3RhdGVtZW50J3Mgc3ludGF4LiAgVGhpcyBpcyBjb21tb25seSB1c2VkCi0gKiAgaW4gdGhhdCBmYXNoaW9uLgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9udW1ub2Rlcyhub2RlICpuLCBpbnQgbnVtLCBjb25zdCBjaGFyICpjb25zdCBuYW1lKQotewotICAgIGlmIChOQ0gobikgIT0gbnVtKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yICVzIG5vZGUuIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNoYXIgKnN0cmluZykKLXsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRlcm1pbmFsLCB0eXBlKQotICAgICAgICAgICAgICAgJiYgKChzdHJpbmcgPT0gMCkgfHwgKHN0cmNtcChzdHJpbmcsIFNUUih0ZXJtaW5hbCkpID09IDApKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgdGVybWluYWw6IGV4cGVjdGVkIFwiJXNcIiIsIHN0cmluZyk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotLyogIFggKCcsJyBYKSBbJywnXSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfcmVwZWF0aW5nX2xpc3RfdmFyaWFibGUobm9kZSAqdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0X25vZGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKnZhbGlkYXRlX2NoaWxkX2Z1bmNfaW5jKShub2RlICosIGludCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbGlzdF9ub2RlX3R5cGVfbmFtZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAobmNoICYmIHZhbGlkYXRlX250eXBlKHRyZWUsIGxpc3Rfbm9kZV90eXBlKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAvKiBVbmNvbmRpdGlvbmFsbHkgcmFpc2UuICovCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCBsaXN0X25vZGVfdHlwZV9uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoIDsgcmVzICYmICpwb3MgPCBuY2g7ICkgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY2hpbGRfZnVuY19pbmModHJlZSwgcG9zKTsKLSAgICAgICAgICAgIGlmICghcmVzIHx8ICpwb3MgPj0gbmNoKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgKCpwb3MpKyspKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKiAgWCAoJywnIFgpIFsnLCddICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdChub2RlICp0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3Rfbm9kZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqdmFsaWRhdGVfY2hpbGRfZnVuYykobm9kZSAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGxpc3Rfbm9kZV90eXBlX25hbWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKG5jaCAmJiB2YWxpZGF0ZV9udHlwZSh0cmVlLCBsaXN0X25vZGVfdHlwZSkpOwotICAgIGludCBwb3MgPSAwOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgLyogVW5jb25kaXRpb25hbGx5IHJhaXNlLiAqLwotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgbGlzdF9ub2RlX3R5cGVfbmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKCA7IHJlcyAmJiBwb3MgPCBuY2g7ICkgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY2hpbGRfZnVuYyhDSElMRCh0cmVlLCBwb3MrKykpOwotICAgICAgICAgICAgaWYgKCFyZXMgfHwgcG9zID49IG5jaCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIHBvcysrKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiAgdmFsaWRhdGVfY2xhc3MoKQotICoKLSAqICBjbGFzc2RlZjoKLSAqICAgICAgJ2NsYXNzJyBOQU1FIFsnKCcgdGVzdGxpc3QgJyknXSAnOicgc3VpdGUKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfY2xhc3Mobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgY2xhc3NkZWYpICYmCi0gICAgICAgICAgICAgICAgKChuY2ggPT0gNCkgfHwgKG5jaCA9PSA2KSB8fCAobmNoID09IDcpKSk7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiY2xhc3MiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBuY2ggLSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNCwgImNsYXNzIik7Ci0gICAgfQotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAobmNoID09IDcpIHsKLSAgICAgICAgICAgICAgICByZXMgPSAoKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAyKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgNCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoID09IDYpIHsKLSAgICAgICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsMikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwzKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgaWZfc3RtdDoKLSAqICAgICAgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2lmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGlmX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAobmNoID49IDQpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgMykpKTsKLQotICAgIGlmIChyZXMgJiYgKChuY2ggJSA0KSA9PSAzKSkgewotICAgICAgICAvKiAgLi4uICdlbHNlJyAnOicgc3VpdGUgICovCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIG5jaCAtIDMpLCAiZWxzZSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBuY2ggLSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0gICAgICAgIG5jaCAtPSAzOwotICAgIH0KLSAgICBlbHNlIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNCwgImlmIik7Ci0gICAgaWYgKChuY2ggJSA0KSAhPSAwKQotICAgICAgICAvKiBXaWxsIGNhdGNoIHRoZSBjYXNlIGZvciBuY2ggPCA0ICovCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDAsICJpZiIpOwotICAgIGVsc2UgaWYgKHJlcyAmJiAobmNoID4gNCkpIHsKLSAgICAgICAgLyogIC4uLiAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSsgLi4uICAqLwotICAgICAgICBpbnQgaiA9IDQ7Ci0gICAgICAgIHdoaWxlICgoaiA8IG5jaCkgJiYgcmVzKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBqKSwgImVsaWYiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIGogKyAyKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIGogKyAxKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBqICsgMykpKTsKLSAgICAgICAgICAgIGogKz0gNDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHBhcmFtZXRlcnM6Ci0gKiAgICAgICcoJyBbdmFyYXJnc2xpc3RdICcpJwotICoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfcGFyYW1ldGVycyhub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHBhcmFtZXRlcnMpICYmICgobmNoID09IDIpIHx8IChuY2ggPT0gMykpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0gICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZhcmFyZ3NsaXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAicGFyYW1ldGVycyIpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHZhbGlkYXRlX3N1aXRlKCkKLSAqCi0gKiAgc3VpdGU6Ci0gKiAgICAgIHNpbXBsZV9zdG10Ci0gKiAgICB8IE5FV0xJTkUgSU5ERU5UIHN0bXQrIERFREVOVAotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zdWl0ZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBzdWl0ZSkgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA+PSA0KSkpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDEpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9zaW1wbGVfc3RtdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgZWxzZSBpZiAocmVzKSB7Ci0gICAgICAgIC8qICBORVdMSU5FIElOREVOVCBzdG10KyBERURFTlQgICovCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uZXdsaW5lKENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfaW5kZW50KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3RtdChDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RlZGVudChDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotCi0gICAgICAgIGlmIChyZXMgJiYgKG5jaCA+IDQpKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDM7Ci0gICAgICAgICAgICAtLW5jaDsgICAgICAgICAgICAgICAgICAgICAgLyogZm9yZ2V0IHRoZSBERURFTlQgICAgICovCi0gICAgICAgICAgICBmb3IgKCA7IHJlcyAmJiAoaSA8IG5jaCk7ICsraSkKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdG10KENISUxEKHRyZWUsIGkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPCA0KQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNCwgInN1aXRlIik7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0bGlzdChub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodHJlZSwgdGVzdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV90ZXN0LCAidGVzdGxpc3QiKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3RsaXN0X3N0YXJfZXhwcihub2RlICp0bCkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRsLCB0ZXN0bGlzdF9zdGFyX2V4cHIsIHZhbGlkYXRlX3Rlc3Rfb3Jfc3Rhcl9leHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RsaXN0IikpOwotfQotCi0KLS8qIHZhbGlkYXRlIGVpdGhlciB2ZnBkZWYgb3IgdGZwZGVmLgotICogdmZwZGVmOiBOQU1FCi0gKiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV92ZnBkZWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGlmIChUWVBFKHRyZWUpID09IHZmcGRlZikgewotICAgICAgICByZXR1cm4gbmNoID09IDEgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKFRZUEUodHJlZSkgPT0gdGZwZGVmKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAxKSkgJiYKLSAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdmZwZGVmXSB8ICcqKicgdmZwZGVmCi0gKiAuLm9yIHRmcGRlZiBpbiBwbGFjZSBvZiB2ZnBkZWYuIHZmcGRlZjogTkFNRTsgdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdmFyYXJnc2xpc3RfdHJhaWxlcihub2RlICp0cmVlLCBpbnQgc3RhcnQpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gMDsKLQotICAgIGlmIChuY2ggPD0gc3RhcnQpIHsKLSAgICAgICAgZXJyX3N0cmluZygiZXhwZWN0ZWQgdmFyaWFibGUgYXJndW1lbnQgdHJhaWxlciBmb3IgdmFyYXJnc2xpc3QiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChUWVBFKENISUxEKHRyZWUsIHN0YXJ0KSkgPT0gU1RBUikgewotICAgICAgICAvKgotICAgICAgICAgKiAnKicgW3ZmcGRlZl0KLSAgICAgICAgICovCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3N0YXIoQ0hJTEQodHJlZSwgc3RhcnQrKykpOwotICAgICAgICBpZiAocmVzICYmIHN0YXJ0IDwgbmNoICYmIChUWVBFKENISUxEKHRyZWUsIHN0YXJ0KSkgPT0gdmZwZGVmIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQpKSA9PSB0ZnBkZWYpKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdmZwZGVmKENISUxEKHRyZWUsIHN0YXJ0KyspKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAocmVzICYmIHN0YXJ0ICsgMSA8IG5jaCAmJiAoCi0gICAgICAgICAgICAgICAgICAgVFlQRShDSElMRCh0cmVlLCBzdGFydCArIDEpKSA9PSB2ZnBkZWYgfHwKLSAgICAgICAgICAgICAgICAgICBUWVBFKENISUxEKHRyZWUsIHN0YXJ0ICsgMSkpID09IHRmcGRlZikpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBzdGFydCsrKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV92ZnBkZWYoQ0hJTEQodHJlZSwgc3RhcnQrKykpKTsKLSAgICAgICAgICAgIGlmIChyZXMgJiYgc3RhcnQgKyAxIDwgbmNoICYmIFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQpKSA9PSBFUVVBTCkKLSAgICAgICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfZXF1YWwoQ0hJTEQodHJlZSwgc3RhcnQrKykpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgc3RhcnQrKykpKTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBbJywnICcqKicgdmZwZGVmXQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJlcyAmJiBzdGFydCArIDIgPCBuY2ggJiYgVFlQRShDSElMRCh0cmVlLCBzdGFydCsxKSkgPT0gRE9VQkxFU1RBUikKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBzdGFydCsrKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3VibGVzdGFyKENISUxEKHRyZWUsIHN0YXJ0KyspKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3ZmcGRlZihDSElMRCh0cmVlLCBzdGFydCsrKSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChUWVBFKENISUxEKHRyZWUsIHN0YXJ0KSkgPT0gRE9VQkxFU1RBUikgewotICAgICAgICAvKgotICAgICAgICAgKiAnKionIHZmcGRlZgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0YXJ0ICsgMSA8IG5jaCkKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9kb3VibGVzdGFyKENISUxEKHRyZWUsIHN0YXJ0KyspKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3ZmcGRlZihDSElMRCh0cmVlLCBzdGFydCsrKSkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJleHBlY3RlZCB2ZnBkZWYgYWZ0ZXIgKiogaW4gdmFyYXJnc2xpc3QgdHJhaWxlciIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBlcnJfc3RyaW5nKCJleHBlY3RlZCAqIG9yICoqIGluIHZhcmFyZ3NsaXN0IHRyYWlsZXIiKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzICYmIHN0YXJ0ICE9IG5jaCkgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBlcnJfc3RyaW5nKCJ1bmV4cGVjdGVkIGV4dHJhIGNoaWxkcmVuIGluIHZhcmFyZ3NsaXN0IHRyYWlsZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiB2YWxpZGF0ZV92YXJhcmdzbGlzdCgpCi0gKgotICogVmFsaWRhdGUgdHlwZWRhcmdzbGlzdCBvciB2YXJhcmdzbGlzdC4KLSAqCi0gKiB0eXBlZGFyZ3NsaXN0OiAoKHRmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gKiAgICAgICAgICAgICAgICAgKCcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfAotICogICAgICAgICAgICAgICAgICAnKionIHRmcGRlZikKLSAqICAgICAgICAgICAgICAgICB8IHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKLSAqIHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi0gKiB2YXJhcmdzbGlzdDogKCh2ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICogICAgICAgICAgICAgICAoJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiAgWycsJyAnKionIHZmcGRlZl0gfAotICogICAgICAgICAgICAgICAgJyoqJyB2ZnBkZWYpCi0gKiAgICAgICAgICAgICAgIHwgdmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQotICogdmZwZGVmOiBOQU1FCi0gKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV92YXJhcmdzbGlzdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IChUWVBFKHRyZWUpID09IHZhcmFyZ3NsaXN0IHx8Ci0gICAgICAgICAgICAgICBUWVBFKHRyZWUpID09IHR5cGVkYXJnc2xpc3QpICYmCi0gICAgICAgICAgICAgIChuY2ggIT0gMCk7Ci0gICAgaW50IHN5bTsKLSAgICBub2RlICpjaDsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG5jaCA8IDEpIHsKLSAgICAgICAgZXJyX3N0cmluZygidmFyYXJnc2xpc3QgbWlzc2luZyBjaGlsZCBub2RlcyIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgd2hpbGUgKGkgPCBuY2gpIHsKLSAgICAgICAgY2ggPSBDSElMRCh0cmVlLCBpKTsKLSAgICAgICAgc3ltID0gVFlQRShjaCk7Ci0gICAgICAgIGlmIChzeW0gPT0gdmZwZGVmIHx8IHN5bSA9PSB0ZnBkZWYpIHsKLSAgICAgICAgICAgIC8qIHZhbGlkYXRlICh2ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKyAqLwotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdmZwZGVmKGNoKTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgIGlmIChyZXMgJiYgKGkrMiA8PSBuY2gpICYmIFRZUEUoQ0hJTEQodHJlZSwgaSkpID09IEVRVUFMKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2VxdWFsKENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIGkrMSkpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzKQotICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlcyAmJiBpIDwgbmNoKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaSkpOwotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzeW0gPT0gRE9VQkxFU1RBUiB8fCBzeW0gPT0gU1RBUikgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdmFyYXJnc2xpc3RfdHJhaWxlcih0cmVlLCBpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgZm9ybWF0aW9uIGZvciB2YXJhcmdzbGlzdCIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogIGNvbXBfaXRlcjogIGNvbXBfZm9yIHwgY29tcF9pZgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wX2l0ZXIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGNvbXBfaXRlcikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJjb21wX2l0ZXIiKSk7Ci0gICAgaWYgKHJlcyAmJiBUWVBFKENISUxEKHRyZWUsIDApKSA9PSBjb21wX2ZvcikKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9mb3IoQ0hJTEQodHJlZSwgMCkpOwotICAgIGVsc2UKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9pZihDSElMRCh0cmVlLCAwKSk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKiAgY29tcF9mb3I6ICAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3QgW2NvbXBfaXRlcl0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfY29tcF9mb3Iobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAobmNoID09IDUpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBfaXRlcihDSElMRCh0cmVlLCA0KSk7Ci0gICAgZWxzZQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCA0LCAiY29tcF9mb3IiKTsKLQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZm9yIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHJsaXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgImluIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX29yX3Rlc3QoQ0hJTEQodHJlZSwgMykpKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qICBjb21wX2lmOiAgJ2lmJyB0ZXN0X25vY29uZCBbY29tcF9pdGVyXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wX2lmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzOwotCi0gICAgaWYgKG5jaCA9PSAzKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wX2l0ZXIoQ0hJTEQodHJlZSwgMikpOwotICAgIGVsc2UKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImNvbXBfaWYiKTsKLQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdF9ub2NvbmQoQ0hJTEQodHJlZSwgMSkpKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogIHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAotICoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgc3RtdCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJzdG10IikpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICB0cmVlID0gQ0hJTEQodHJlZSwgMCk7Ci0KLSAgICAgICAgaWYgKFRZUEUodHJlZSkgPT0gc2ltcGxlX3N0bXQpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zaW1wbGVfc3RtdCh0cmVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcG91bmRfc3RtdCh0cmVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddIE5FV0xJTkUKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3NpbXBsZV9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHNpbXBsZV9zdG10KQotICAgICAgICAgICAgICAgJiYgKG5jaCA+PSAyKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc21hbGxfc3RtdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25ld2xpbmUoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLQotICAgIGlmIChuY2ggPCAyKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAic2ltcGxlX3N0bXQiKTsKLSAgICAtLW5jaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JnZXQgdGhlIE5FV0xJTkUgICAgKi8KLSAgICBpZiAocmVzICYmIGlzX2V2ZW4obmNoKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfc2VtaShDSElMRCh0cmVlLCAtLW5jaCkpOwotICAgIGlmIChyZXMgJiYgKG5jaCA+IDIpKSB7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9zZW1pKENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3NtYWxsX3N0bXQoQ0hJTEQodHJlZSwgaSArIDEpKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zbWFsbF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgInNtYWxsX3N0bXQiKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaW50IG50eXBlID0gVFlQRShDSElMRCh0cmVlLCAwKSk7Ci0KLSAgICAgICAgaWYgKCAgKG50eXBlID09IGV4cHJfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IGRlbF9zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gcGFzc19zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gZmxvd19zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gaW1wb3J0X3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBnbG9iYWxfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IG5vbmxvY2FsX3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBhc3NlcnRfc3RtdCkpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub2RlKENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBzbWFsbF9zdG10IGNoaWxkIHR5cGUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChuY2ggPT0gMSkgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBjaGlsZCBub2RlIG9mIHNtYWxsX3N0bXQ6ICVkLiIsCi0gICAgICAgICAgICAgICAgICAgICBUWVBFKENISUxEKHRyZWUsIDApKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgY29tcG91bmRfc3RtdDoKLSAqICAgICAgaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgd2l0aF9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmIHwgZGVjb3JhdGVkCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBvdW5kX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGNvbXBvdW5kX3N0bXQpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiY29tcG91bmRfc3RtdCIpKTsKLSAgICBpbnQgbnR5cGU7Ci0KLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuICgwKTsKLQotICAgIHRyZWUgPSBDSElMRCh0cmVlLCAwKTsKLSAgICBudHlwZSA9IFRZUEUodHJlZSk7Ci0gICAgaWYgKCAgKG50eXBlID09IGlmX3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IHdoaWxlX3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IGZvcl9zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSB0cnlfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gd2l0aF9zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSBmdW5jZGVmKQotICAgICAgICAgIHx8IChudHlwZSA9PSBhc3luY19zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSBjbGFzc2RlZikKLSAgICAgICAgICB8fCAobnR5cGUgPT0gZGVjb3JhdGVkKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbm9kZSh0cmVlKTsKLSAgICBlbHNlIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIGNvbXBvdW5kIHN0YXRlbWVudCB0eXBlOiAlZC4iLCBUWVBFKHRyZWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChub2RlICp0cmVlLCBpbnQgdHNlKQotewotICAgIGlmIChUWVBFKHRyZWUpID09IHlpZWxkX2V4cHIpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3lpZWxkX2V4cHIodHJlZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAodHNlKQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3Rlc3RsaXN0X3N0YXJfZXhwcih0cmVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3Rlc3RsaXN0KHRyZWUpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhwcl9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGV4cHJfc3RtdCkKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0bGlzdF9zdGFyX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGlmIChyZXMgJiYgbmNoID09IDMKLSAgICAgICAgJiYgVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gYXVnYXNzaWduKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKENISUxEKHRyZWUsIDEpLCAxLCAiYXVnYXNzaWduIikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KENISUxEKHRyZWUsIDIpLCAwKTsKLQotICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICBjaGFyICpzID0gU1RSKENISUxEKENISUxEKHRyZWUsIDEpLCAwKSk7Ci0KLSAgICAgICAgICAgIHJlcyA9IChzdHJjbXAocywgIis9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiLT0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICIqPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIi89IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiLy89IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiJT0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICImPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgInw9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiXj0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICI8PD0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICI+Pj0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICIqKj0iKSA9PSAwKTsKLSAgICAgICAgICAgIGlmICghcmVzKQotICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgYXVnbWVudGVkIGFzc2lnbm1lbnQgb3BlcmF0b3IiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChqID0gMTsgcmVzICYmIChqIDwgbmNoKTsgaiArPSAyKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZXF1YWwoQ0hJTEQodHJlZSwgaikpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfeWllbGRfb3JfdGVzdGxpc3QoQ0hJTEQodHJlZSwgaiArIDEpLCAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RlbF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiZGVsX3N0bXQiKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImRlbCIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHBybGlzdChDSElMRCh0cmVlLCAxKSkpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3JldHVybl9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHJldHVybl9zdG10KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA9PSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJyZXR1cm4iKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gMikpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIDEpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKgotICogIHJhaXNlX3N0bXQ6Ci0gKgotICogICdyYWlzZScgW3Rlc3QgWydmcm9tJyB0ZXN0XV0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfcmFpc2Vfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCByYWlzZV9zdG10KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMSkgfHwgKG5jaCA9PSAyKSB8fCAobmNoID09IDQpKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJyYWlzZSIpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICByZXMgPSB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAicmFpc2UiKTsKLSAgICAgICAgaWYgKHJlcyAmJiAobmNoID49IDIpKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSA0KSkgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksICJmcm9tIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDMpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qIHlpZWxkX2V4cHI6ICd5aWVsZCcgW3lpZWxkX2FyZ10KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfeWllbGRfZXhwcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaWYgKG5jaCA8IDEgfHwgbmNoID4gMikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCF2YWxpZGF0ZV9udHlwZSh0cmVlLCB5aWVsZF9leHByKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCF2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAieWllbGQiKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKG5jaCA9PSAyKSB7Ci0gICAgICAgIGlmICghdmFsaWRhdGVfeWllbGRfYXJnKENISUxEKHRyZWUsIDEpKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyogeWllbGRfYXJnOiAnZnJvbScgdGVzdCB8IHRlc3RsaXN0Ci0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3lpZWxkX2FyZyhub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaWYgKCF2YWxpZGF0ZV9udHlwZSh0cmVlLCB5aWVsZF9hcmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzd2l0Y2ggKG5jaCkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoIXZhbGlkYXRlX3Rlc3RsaXN0KENISUxEKHRyZWUsIG5jaCAtIDEpKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKCF2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZnJvbSIpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICghdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIHlpZWxkX3N0bXQ6IHlpZWxkX2V4cHIKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfeWllbGRfc3RtdChub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgeWllbGRfc3RtdCkKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJ5aWVsZF9zdG10IikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX3lpZWxkX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IG9rID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X2FzX25hbWUpOwotCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gMSkKLSAgICAgICAgICAgIG9rID0gdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCk7Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAzKQotICAgICAgICAgICAgb2sgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCkKLSAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMSksICJhcyIpCi0gICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCBOVUxMKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9rID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMywgImltcG9ydF9hc19uYW1lIik7Ci0gICAgfQotICAgIHJldHVybiBvazsKLX0KLQotCi0vKiBkb3R0ZWRfbmFtZTogIE5BTUUgKCIuIiBOQU1FKSoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZG90dGVkX25hbWUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZG90dGVkX25hbWUpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgTlVMTCkpOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMTsgcmVzICYmIChpIDwgbmNoKTsgaSArPSAyKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9kb3QoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIGkrMSksIE5VTEwpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBkb3R0ZWRfYXNfbmFtZTogIGRvdHRlZF9uYW1lIFtOQU1FIE5BTUVdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RvdHRlZF9hc19uYW1lKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZG90dGVkX2FzX25hbWUpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAobmNoID09IDEpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAzKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMSksICJhcyIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgTlVMTCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgZG90dGVkX2FzX25hbWUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIGRvdHRlZF9hc19uYW1lICgnLCcgZG90dGVkX2FzX25hbWUpKiAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZG90dGVkX2FzX25hbWVzKG5vZGUgKnRyZWUpCi17Ci0gICAgICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgICAgIGludCByZXMgPSBpc19vZGQobmNoKSAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKLSAgICAgICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qIGltcG9ydF9hc19uYW1lICgnLCcgaW1wb3J0X2FzX25hbWUpKiBbJywnXSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMTsgcmVzICYmIChpICsgMSA8IG5jaCk7IGkgKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUoQ0hJTEQodHJlZSwgaSArIDEpKSk7Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lcyAqLwotc3RhdGljIGludAotdmFsaWRhdGVfaW1wb3J0X25hbWUobm9kZSAqdHJlZSkKLXsKLSAgICAgICAgcmV0dXJuICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfbmFtZSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiaW1wb3J0X25hbWUiKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpbXBvcnQiKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lcyhDSElMRCh0cmVlLCAxKSkpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gY291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIGRvdHMgKG9yIGVsbGlwc2lzIHRva2VucykgaW4KLSAqICdmcm9tIC4uLm1vZHVsZSBpbXBvcnQgbmFtZScKLSAqLwotc3RhdGljIGludAotY291bnRfZnJvbV9kb3RzKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMTsgaSA8IE5DSCh0cmVlKTsgaSsrKQotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBpKSkgIT0gRE9UICYmIFRZUEUoQ0hJTEQodHJlZSwgaSkpICE9IEVMTElQU0lTKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgcmV0dXJuIGkgLSAxOwotfQotCi0vKiBpbXBvcnRfZnJvbTogKCdmcm9tJyAoJy4nKiBkb3R0ZWRfbmFtZSB8ICcuJyspCi0gKiAgICAgICAgICAgICAgICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykpCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ltcG9ydF9mcm9tKG5vZGUgKnRyZWUpCi17Ci0gICAgICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgICAgIGludCBuZG90cyA9IGNvdW50X2Zyb21fZG90cyh0cmVlKTsKLSAgICAgICAgaW50IGhhdmVuYW1lID0gKFRZUEUoQ0hJTEQodHJlZSwgbmRvdHMgKyAxKSkgPT0gZG90dGVkX25hbWUpOwotICAgICAgICBpbnQgb2Zmc2V0ID0gbmRvdHMgKyBoYXZlbmFtZTsKLSAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9mcm9tKQotICAgICAgICAgICAgICAgICYmIChvZmZzZXQgPj0gMSkKLSAgICAgICAgICAgICAgICAmJiAobmNoID49IDMgKyBvZmZzZXQpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImZyb20iKQotICAgICAgICAgICAgICAgICYmICghaGF2ZW5hbWUgfHwgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgbmRvdHMgKyAxKSkpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBvZmZzZXQgKyAxKSwgImltcG9ydCIpOwotCi0gICAgICAgIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgPT0gTFBBUikKLSAgICAgICAgICAgIHJlcyA9ICgobmNoID09IG9mZnNldCArIDUpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIG9mZnNldCArIDIpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhDSElMRCh0cmVlLCBvZmZzZXQgKyAzKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgNCkpKTsKLSAgICAgICAgZWxzZSBpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpICE9IFNUQVIpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpOwotICAgICAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogaW1wb3J0X3N0bXQ6IGltcG9ydF9uYW1lIHwgaW1wb3J0X2Zyb20gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ltcG9ydF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImltcG9ydF9zdG10Iik7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGludCBudHlwZSA9IFRZUEUoQ0hJTEQodHJlZSwgMCkpOwotCi0gICAgICAgIGlmIChudHlwZSA9PSBpbXBvcnRfbmFtZSB8fCBudHlwZSA9PSBpbXBvcnRfZnJvbSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25vZGUoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGltcG9ydF9zdG10IGNoaWxkIHR5cGUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChuY2ggPT0gMSkgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBjaGlsZCBub2RlIG9mIGltcG9ydF9zdG10OiAlZC4iLAotICAgICAgICAgICAgICAgICAgICAgVFlQRShDSElMRCh0cmVlLCAwKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGdsb2JhbF9zdG10OgotICoKLSAqICAnZ2xvYmFsJyBOQU1FICgnLCcgTkFNRSkqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2dsb2JhbF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGdsb2JhbF9zdG10KQotICAgICAgICAgICAgICAgJiYgaXNfZXZlbihuY2gpICYmIChuY2ggPj0gMikpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgZ2xvYmFsIHN0YXRlbWVudCIpOwotCi0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJnbG9iYWwiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpKTsKLSAgICBmb3IgKGogPSAyOyByZXMgJiYgKGogPCBuY2gpOyBqICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBqKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIGogKyAxKSwgTkFNRSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0vKiAgbm9ubG9jYWxfc3RtdDoKLSAqCi0gKiAgJ25vbmxvY2FsJyBOQU1FICgnLCcgTkFNRSkqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX25vbmxvY2FsX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgbm9ubG9jYWxfc3RtdCkKLSAgICAgICAgICAgICAgICYmIGlzX2V2ZW4obmNoKSAmJiAobmNoID49IDIpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG5vbmxvY2FsIHN0YXRlbWVudCIpOwotCi0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJub25sb2NhbCIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkpOwotICAgIGZvciAoaiA9IDI7IHJlcyAmJiAoaiA8IG5jaCk7IGogKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGopKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgaiArIDEpLCBOQU1FKSk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKiAgYXNzZXJ0X3N0bXQ6Ci0gKgotICogICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hc3NlcnRfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhc3NlcnRfc3RtdCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDIpIHx8IChuY2ggPT0gNCkpCi0gICAgICAgICAgICAgICAmJiAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImFzc2VydCIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgYXNzZXJ0IHN0YXRlbWVudCIpOwotICAgIGlmIChyZXMgJiYgKG5jaCA+IDIpKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDMpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfd2hpbGUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgd2hpbGVfc3RtdCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDQpIHx8IChuY2ggPT0gNykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAid2hpbGUiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgMykpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSA3KSkKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgNCksICJlbHNlIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDUpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgNikpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9mb3Iobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZm9yX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSA2KSB8fCAobmNoID09IDkpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImZvciIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHBybGlzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksICJpbiIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCAzKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgNSkpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSA5KSkKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgNiksICJlbHNlIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDcpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgOCkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgdHJ5X3N0bXQ6Ci0gKiAgICAgICd0cnknICc6JyBzdWl0ZSAoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZmluYWxseScgJzonIHN1aXRlXQotICogICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQotICoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdHJ5KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcG9zID0gMzsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHRyeV9zdG10KQotICAgICAgICAgICAgICAgJiYgKG5jaCA+PSA2KSAmJiAoKG5jaCAlIDMpID09IDApKTsKLQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAidHJ5IikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBuY2ggLSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0gICAgZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgY29uc3QgY2hhciogbmFtZSA9ICJleGNlcHQiOwotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBuY2ggLSAzKSkgIT0gZXhjZXB0X2NsYXVzZSkKLSAgICAgICAgICAgIG5hbWUgPSBTVFIoQ0hJTEQodHJlZSwgbmNoIC0gMykpOwotCi0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIHRyeS8lcyBub2RlLiIsIG5hbWUpOwotICAgIH0KLSAgICAvKiBIYW5kbGUgdHJ5L2ZpbmFsbHkgc3RhdGVtZW50ICovCi0gICAgaWYgKHJlcyAmJiAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBOQU1FKSAmJgotICAgICAgICAoc3RyY21wKFNUUihDSElMRCh0cmVlLCBwb3MpKSwgImZpbmFsbHkiKSA9PSAwKSkgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNiwgInRyeS9maW5hbGx5IikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgNSkpKTsKLSAgICAgICAgcmV0dXJuIChyZXMpOwotICAgIH0KLSAgICAvKiB0cnkvZXhjZXB0IHN0YXRlbWVudDogc2tpcCBwYXN0IGV4Y2VwdF9jbGF1c2Ugc2VjdGlvbnMgKi8KLSAgICB3aGlsZSAocmVzICYmIHBvcyA8IG5jaCAmJiAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBleGNlcHRfY2xhdXNlKSkgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfZXhjZXB0X2NsYXVzZShDSElMRCh0cmVlLCBwb3MpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgcG9zICsgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBwb3MgKyAyKSkpOwotICAgICAgICBwb3MgKz0gMzsKLSAgICB9Ci0gICAgLyogc2tpcCBlbHNlIGNsYXVzZSAqLwotICAgIGlmIChyZXMgJiYgcG9zIDwgbmNoICYmIChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IE5BTUUpICYmCi0gICAgICAgIChzdHJjbXAoU1RSKENISUxEKHRyZWUsIHBvcykpLCAiZWxzZSIpID09IDApKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBwb3MgKyAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIHBvcyArIDIpKSk7Ci0gICAgICAgIHBvcyArPSAzOwotICAgIH0KLSAgICBpZiAocmVzICYmIHBvcyA8IG5jaCkgewotICAgICAgICAvKiBsYXN0IGNsYXVzZSBtdXN0IGJlIGEgZmluYWxseSAqLwotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBwb3MpLCAiZmluYWxseSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCBwb3MgKyAzLCAidHJ5L2V4Y2VwdC9maW5hbGx5IikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIHBvcyArIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgcG9zICsgMikpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4Y2VwdF9jbGF1c2Uobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZXhjZXB0X2NsYXVzZSkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDEpIHx8IChuY2ggPT0gMikgfHwgKG5jaCA9PSA0KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJleGNlcHQiKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPiAxKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgaWYgKHJlcyAmJiAobmNoID09IDQpKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgImFzIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDMpLCBOQU1FKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHRlc3QpICYmIGlzX29kZChuY2gpOwotCi0gICAgaWYgKHJlcyAmJiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gbGFtYmRlZikpCi0gICAgICAgIHJlcyA9ICgobmNoID09IDEpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9sYW1iZGVmKENISUxEKHRyZWUsIDApKSk7Ci0gICAgZWxzZSBpZiAocmVzKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX29yX3Rlc3QoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICByZXMgPSAocmVzICYmIChuY2ggPT0gMSB8fCAobmNoID09IDUgJiYKLSAgICAgICAgICAgIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMSksICJpZiIpICYmCi0gICAgICAgICAgICB2YWxpZGF0ZV9vcl90ZXN0KENISUxEKHRyZWUsIDIpKSAmJgotICAgICAgICAgICAgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAzKSwgImVsc2UiKSAmJgotICAgICAgICAgICAgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCA0KSkpKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdF9ub2NvbmQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCB0ZXN0X25vY29uZCkgJiYgKG5jaCA9PSAxKTsKLQotICAgIGlmIChyZXMgJiYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IGxhbWJkZWZfbm9jb25kKSkKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2xhbWJkZWZfbm9jb25kKENISUxEKHRyZWUsIDApKSk7Ci0gICAgZWxzZSBpZiAocmVzKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9vcl90ZXN0KENISUxEKHRyZWUsIDApKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfb3JfdGVzdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIG9yX3Rlc3QpICYmIGlzX29kZChuY2gpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpbnQgcG9zOwotICAgICAgICByZXMgPSB2YWxpZGF0ZV9hbmRfdGVzdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIHBvcyksICJvciIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfYW5kX3Rlc3QoQ0hJTEQodHJlZSwgcG9zICsgMSkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FuZF90ZXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvczsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgYW5kX3Rlc3QpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbm90X3Rlc3QoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgcG9zKSwgImFuZCIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9ub3RfdGVzdChDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX25vdF90ZXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgbm90X3Rlc3QpICYmICgobmNoID09IDEpIHx8IChuY2ggPT0gMikpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAobmNoID09IDIpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgIm5vdCIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbm90X3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKLSAgICAgICAgZWxzZSBpZiAobmNoID09IDEpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wYXJpc29uKENISUxEKHRyZWUsIDApKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBhcmlzb24obm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBjb21wYXJpc29uKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbXBfb3AoQ0hJTEQodHJlZSwgcG9zKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHIoQ0hJTEQodHJlZSwgcG9zICsgMSkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wX29wKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9IDA7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLQotICAgIGlmICghdmFsaWRhdGVfbnR5cGUodHJlZSwgY29tcF9vcCkpCi0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICBPbmx5IGNoaWxkIHdpbGwgYmUgYSB0ZXJtaW5hbCB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5bWJvbGljIG5hbWUKLSAgICAgICAgICogIG9yIGEgTkFNRSB3aXRoIGEgc3RyaW5nIG9mIGVpdGhlciAnaXMnIG9yICdpbicKLSAgICAgICAgICovCi0gICAgICAgIHRyZWUgPSBDSElMRCh0cmVlLCAwKTsKLSAgICAgICAgc3dpdGNoIChUWVBFKHRyZWUpKSB7Ci0gICAgICAgICAgY2FzZSBMRVNTOgotICAgICAgICAgIGNhc2UgR1JFQVRFUjoKLSAgICAgICAgICBjYXNlIEVRRVFVQUw6Ci0gICAgICAgICAgY2FzZSBFUVVBTDoKLSAgICAgICAgICBjYXNlIExFU1NFUVVBTDoKLSAgICAgICAgICBjYXNlIEdSRUFURVJFUVVBTDoKLSAgICAgICAgICBjYXNlIE5PVEVRVUFMOgotICAgICAgICAgICAgICByZXMgPSAxOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE5BTUU6Ci0gICAgICAgICAgICAgIHJlcyA9ICgoc3RyY21wKFNUUih0cmVlKSwgImluIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgIHx8IChzdHJjbXAoU1RSKHRyZWUpLCAiaXMiKSA9PSAwKSk7Ci0gICAgICAgICAgICAgIGlmICghcmVzKSB7Ci0gICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIG9wZXJhdG9yICclcyciLCBTVFIodHJlZSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgY29tcGFyaXNvbiBvcGVyYXRvciB0eXBlIik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChyZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiY29tcF9vcCIpKSAhPSAwKSB7Ci0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAwKSwgTkFNRSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKQotICAgICAgICAgICAgICAgJiYgKCgoc3RyY21wKFNUUihDSElMRCh0cmVlLCAwKSksICJpcyIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHJjbXAoU1RSKENISUxEKHRyZWUsIDEpKSwgIm5vdCIpID09IDApKQotICAgICAgICAgICAgICAgICAgIHx8ICgoc3RyY21wKFNUUihDSElMRCh0cmVlLCAwKSksICJub3QiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3RyY21wKFNUUihDSElMRCh0cmVlLCAxKSksICJpbiIpID09IDApKSkpOwotICAgICAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIGVycl9zdHJpbmcoInVua25vd24gY29tcGFyaXNvbiBvcGVyYXRvciIpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfc3Rhcl9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHN0YXJfZXhwcik7Ci0gICAgaWYgKCFyZXMpIHJldHVybiByZXM7Ci0gICAgaWYgKCF2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAic3Rhcl9leHByIikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAwKSwgU1RBUikgJiYgICAgICBcCi0gICAgICAgIHZhbGlkYXRlX2V4cHIoQ0hJTEQodHJlZSwgMSkpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgajsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZXhwcikKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV94b3JfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yIChqID0gMjsgcmVzICYmIChqIDwgbmNoKTsgaiArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfeG9yX2V4cHIoQ0hJTEQodHJlZSwgaikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV92YmFyKENISUxEKHRyZWUsIGogLSAxKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3hvcl9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHhvcl9leHByKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2FuZF9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKGogPSAyOyByZXMgJiYgKGogPCBuY2gpOyBqICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jaXJjdW1mbGV4KENISUxEKHRyZWUsIGogLSAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2FuZF9leHByKENISUxEKHRyZWUsIGopKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfYW5kX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhbmRfZXhwcikKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zaGlmdF9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9hbXBlcnNhbmQoQ0hJTEQodHJlZSwgcG9zKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3NoaWZ0X2V4cHIoQ0hJTEQodHJlZSwgcG9zICsgMSkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jaGFpbl90d29fb3BzKG5vZGUgKnRyZWUsIGludCAoKnRlcm12YWxpZCkobm9kZSAqKSwgaW50IG9wMSwgaW50IG9wMikKLSB7Ci0gICAgaW50IHBvcyA9IDE7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiAoKnRlcm12YWxpZCkoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAoIDsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSAhPSBvcDEpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBwb3MpLCBvcDIpOwotICAgICAgICBpZiAocmVzKQotICAgICAgICAgICAgcmVzID0gKCp0ZXJtdmFsaWQpKENISUxEKHRyZWUsIHBvcyArIDEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3NoaWZ0X2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIHNoaWZ0X2V4cHIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9jaGFpbl90d29fb3BzKHRyZWUsIHZhbGlkYXRlX2FyaXRoX2V4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRTSElGVCwgUklHSFRTSElGVCkpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FyaXRoX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFyaXRoX2V4cHIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9jaGFpbl90d29fb3BzKHRyZWUsIHZhbGlkYXRlX3Rlcm0sIFBMVVMsIE1JTlVTKSk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVybShub2RlICp0cmVlKQotewotICAgIGludCBwb3MgPSAxOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB0ZXJtKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ZhY3RvcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yICggOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKQotICAgICAgICByZXMgPSAoKChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IFNUQVIpCi0gICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBTTEFTSCkKLSAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IERPVUJMRVNMQVNIKQotICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gUEVSQ0VOVCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9mYWN0b3IoQ0hJTEQodHJlZSwgcG9zICsgMSkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgZmFjdG9yOgotICoKLSAqICBmYWN0b3I6ICgnKyd8Jy0nfCd+JykgZmFjdG9yIHwgcG93ZXIKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZmFjdG9yKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGZhY3RvcikKLSAgICAgICAgICAgICAgICYmICgoKG5jaCA9PSAyKQotICAgICAgICAgICAgICAgICAgICAmJiAoKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IFBMVVMpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gTUlOVVMpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gVElMREUpKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9mYWN0b3IoQ0hJTEQodHJlZSwgMSkpKQotICAgICAgICAgICAgICAgICAgIHx8ICgobmNoID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Bvd2VyKENISUxEKHRyZWUsIDApKSkpKTsKLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHBvd2VyOgotICoKLSAqICBwb3dlcjogYXRvbV9leHByIHRyYWlsZXIqIFsnKionIGZhY3Rvcl0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfcG93ZXIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgcG93ZXIpICYmIChuY2ggPj0gMSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2F0b21fZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgaWYgKG5jaCA+IDEpIHsKLSAgICAgICAgaWYgKG5jaCAhPSAzKSB7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBub2RlcyBmb3IgJ3Bvd2VyJyIpOwotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgICAgICByZXMgPSAodmFsaWRhdGVfZG91Ymxlc3RhcihDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ZhY3RvcihDSElMRCh0cmVlLCAyKSkpOwotICAgIH0KLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgYXRvbV9leHByOgotICoKLSAqICBhdG9tX2V4cHI6IFtBV0FJVF0gYXRvbSB0cmFpbGVyKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hdG9tX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlczsKLSAgICBpbnQgcG9zOwotCi0gICAgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgYXRvbV9leHByKSAmJiAobmNoID49IDEpOwotICAgIGlmICghcmVzKSB7Ci0gICAgICAgIHJldHVybiAocmVzKTsKLSAgICB9Ci0KLSAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gQVdBSVQpIHsKLSAgICAgICAgc3RhcnQgPSAxOwotICAgICAgICBpZiAobmNoIDwgMikgewotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2Ygbm9kZXMgZm9yICdhdG9tX2V4cHInIik7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzID0gdmFsaWRhdGVfYXRvbShDSElMRCh0cmVlLCBzdGFydCkpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcG9zID0gc3RhcnQgKyAxOwotICAgICAgICB3aGlsZSAocmVzICYmIChwb3MgPCBuY2gpICYmIChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IHRyYWlsZXIpKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdHJhaWxlcihDSElMRCh0cmVlLCBwb3MrKykpOwotICAgIH0KLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hdG9tKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvczsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBhdG9tKTsKLQotICAgIGlmIChyZXMgJiYgbmNoIDwgMSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgbmNoKzEsICJhdG9tIik7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBzd2l0Y2ggKFRZUEUoQ0hJTEQodHJlZSwgMCkpKSB7Ci0gICAgICAgICAgY2FzZSBMUEFSOgotICAgICAgICAgICAgcmVzID0gKChuY2ggPD0gMykKLSAgICAgICAgICAgICAgICAgICAmJiAodmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIG5jaCAtIDEpKSkpOwotCi0gICAgICAgICAgICBpZiAocmVzICYmIChuY2ggPT0gMykpIHsKLSAgICAgICAgICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAxKSk9PXlpZWxkX2V4cHIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV95aWVsZF9leHByKENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0bGlzdF9jb21wKENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTFNRQjoKLSAgICAgICAgICAgIGlmIChuY2ggPT0gMikKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgUlNRQik7Ci0gICAgICAgICAgICBlbHNlIGlmIChuY2ggPT0gMykKLSAgICAgICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfdGVzdGxpc3RfY29tcChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMiksIFJTUUIpKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBsaXN0IGRpc3BsYXkgYXRvbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgICByZXMgPSAoKG5jaCA8PSAzKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIG5jaCAtIDEpLCBSQlJBQ0UpKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDMpKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2RpY3RvcnNldG1ha2VyKENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTkFNRToKLSAgICAgICAgICBjYXNlIE5VTUJFUjoKLSAgICAgICAgICBjYXNlIEVMTElQU0lTOgotICAgICAgICAgICAgcmVzID0gKG5jaCA9PSAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IG5jaCk7ICsrcG9zKQotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIHBvcyksIFNUUklORyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgdGVzdGxpc3RfY29tcDoKLSAqICAgICh0ZXN0fHN0YXJfZXhwcikgKCBjb21wX2ZvciB8ICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddICkKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdGxpc3RfY29tcChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IG9rOwotCi0gICAgaWYgKG5jaCA9PSAwKSB7Ci0gICAgICAgIGVycl9zdHJpbmcoIm1pc3NpbmcgY2hpbGQgbm9kZXMgb2YgdGVzdGxpc3RfY29tcCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAobmNoID09IDIgJiYgVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gY29tcF9mb3IpIHsKLSAgICAgICAgb2sgPSAodmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb21wX2ZvcihDSElMRCh0cmVlLCAxKSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgb2sgPSB2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0cmVlLAotICAgICAgICAgICAgICAgIHRlc3RsaXN0X2NvbXAsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVfdGVzdF9vcl9zdGFyX2V4cHIsCi0gICAgICAgICAgICAgICAgInRlc3RsaXN0X2NvbXAiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9rOwotfQotCi0vKiAgZGVjb3JhdG9yOgotICogICAgJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RlY29yYXRvcihub2RlICp0cmVlKQotewotICAgIGludCBvazsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRvcikgJiYKLSAgICAgICAgICAobmNoID09IDMgfHwgbmNoID09IDUgfHwgbmNoID09IDYpICYmCi0gICAgICAgICAgdmFsaWRhdGVfYXQoQ0hJTEQodHJlZSwgMCkpICYmCi0gICAgICAgICAgdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMSkpICYmCi0gICAgICAgICAgdmFsaWRhdGVfbmV3bGluZShSQ0hJTEQodHJlZSwgLTEpKSk7Ci0KLSAgICBpZiAob2sgJiYgbmNoICE9IDMpIHsKLSAgICAgICAgb2sgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgotICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oUkNISUxEKHRyZWUsIC0yKSkpOwotCi0gICAgICAgIGlmIChvayAmJiBuY2ggPT0gNikKLSAgICAgICAgICAgIG9rID0gdmFsaWRhdGVfYXJnbGlzdChDSElMRCh0cmVlLCAzKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9rOwotfQotCi0vKiAgZGVjb3JhdG9yczoKLSAqICAgIGRlY29yYXRvcisKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZGVjb3JhdG9ycyhub2RlICp0cmVlKQotewotICAgIGludCBpLCBuY2gsIG9rOwotICAgIG5jaCA9IE5DSCh0cmVlKTsKLSAgICBvayA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRvcnMpICYmIG5jaCA+PSAxOwotCi0gICAgZm9yIChpID0gMDsgb2sgJiYgaSA8IG5jaDsgKytpKQotICAgICAgICBvayA9IHZhbGlkYXRlX2RlY29yYXRvcihDSElMRCh0cmVlLCBpKSk7Ci0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qICB3aXRoX2l0ZW06Ci0gKiAgIHRlc3QgWydhcycgZXhwcl0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfd2l0aF9pdGVtKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgd2l0aF9pdGVtKQotICAgICAgICAgICAgICAmJiAobmNoID09IDEgfHwgbmNoID09IDMpCi0gICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICBpZiAob2sgJiYgbmNoID09IDMpCi0gICAgICAgIG9rID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMSksICJhcyIpCi0gICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHIoQ0hJTEQodHJlZSwgMikpKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qICB3aXRoX3N0bXQ6Ci0gKiAgICAwICAgICAgMSAgICAgICAgICAuLi4gICAgICAgICAgICAgLTIgICAtMQotICogICAnd2l0aCcgd2l0aF9pdGVtICgnLCcgd2l0aF9pdGVtKSogJzonIHN1aXRlCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3dpdGhfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBpOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHdpdGhfc3RtdCkKLSAgICAgICAgJiYgKG5jaCAlIDIgPT0gMCkKLSAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgIndpdGgiKQotICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihSQ0hJTEQodHJlZSwgLTIpKQotICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShSQ0hJTEQodHJlZSwgLTEpKSk7Ci0gICAgZm9yIChpID0gMTsgb2sgJiYgaSA8IG5jaCAtIDI7IGkgKz0gMikKLSAgICAgICAgb2sgPSB2YWxpZGF0ZV93aXRoX2l0ZW0oQ0hJTEQodHJlZSwgaSkpOwotICAgIHJldHVybiBvazsKLX0KLQotLyogZnVuY2RlZjogJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZSAqLwotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9mdW5jZGVmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZnVuY2RlZik7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAobmNoID09IDUpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZGVmIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9wYXJhbWV0ZXJzKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDMpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDQpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoID09IDcpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZGVmIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9wYXJhbWV0ZXJzKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3JhcnJvdyhDSElMRCh0cmVlLCAzKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDQpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDUpKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDYpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGZ1bmNkZWYiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKiBhc3luY19mdW5jZGVmOiBBU1lOQyBmdW5jZGVmICovCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FzeW5jX2Z1bmNkZWYobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBhc3luY19mdW5jZGVmKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGlmIChuY2ggPT0gMikgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDApLCBBU1lOQykKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9mdW5jZGVmKENISUxEKHRyZWUsIDEpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGFzeW5jX2Z1bmNkZWYiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qIGFzeW5jX3N0bXQ6IEFTWU5DIChmdW5jZGVmIHwgd2l0aF9zdG10IHwgZm9yX3N0bXQpICovCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FzeW5jX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgYXN5bmNfc3RtdCkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAwKSwgQVNZTkMpKTsKLQotICAgIGlmIChuY2ggIT0gMikgewotICAgICAgICByZXMgPSAwOwotICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgYXN5bmNfc3RtdCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKSA9PSBmdW5jZGVmKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9mdW5jZGVmKENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUWVBFKENISUxEKHRyZWUsIDEpKSA9PSB3aXRoX3N0bXQpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3dpdGhfc3RtdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gZm9yX3N0bXQpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ZvcihDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLQotLyogZGVjb3JhdGVkCi0gKiAgIGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZikKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZGVjb3JhdGVkKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdGVkKQotICAgICAgICAgICAgICAmJiAobmNoID09IDIpCi0gICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RlY29yYXRvcnMoUkNISUxEKHRyZWUsIC0yKSkpOwotICAgIGlmIChUWVBFKFJDSElMRCh0cmVlLCAtMSkpID09IGZ1bmNkZWYpCi0gICAgICAgIG9rID0gb2sgJiYgdmFsaWRhdGVfZnVuY2RlZihSQ0hJTEQodHJlZSwgLTEpKTsKLSAgICBlbHNlCi0gICAgICAgIG9rID0gb2sgJiYgdmFsaWRhdGVfY2xhc3MoUkNISUxEKHRyZWUsIC0xKSk7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9sYW1iZGVmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGxhbWJkZWYpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAzKSB8fCAobmNoID09IDQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImxhbWJkYSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBuY2ggLSAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSA0KSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdmFyYXJnc2xpc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgIGVsc2UgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAzLCAibGFtYmRlZiIpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2xhbWJkZWZfbm9jb25kKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGxhbWJkZWZfbm9jb25kKQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMykgfHwgKG5jaCA9PSA0KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJsYW1iZGEiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgbmNoIC0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gNCkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZhcmFyZ3NsaXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICBlbHNlIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMywgImxhbWJkZWZfbm9jb25kIik7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGFyZ2xpc3Q6Ci0gKgotICogIChhcmd1bWVudCAnLCcpKiAoYXJndW1lbnQgWycsJ10gfCAnKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FyZ2xpc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBpID0gMDsKLSAgICBpbnQgb2sgPSAxOwotCi0gICAgaWYgKG5jaCA8PSAwKQotICAgICAgICAvKiByYWlzZSB0aGUgcmlnaHQgZXJyb3IgZnJvbSBoYXZpbmcgYW4gaW52YWxpZCBudW1iZXIgb2YgY2hpbGRyZW4gKi8KLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIG5jaCArIDEsICJhcmdsaXN0Iik7Ci0KLSAgICBpZiAobmNoID4gMSkgewotICAgICAgICBmb3IgKGk9MDsgaTxuY2g7IGkrKykgewotICAgICAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgaSkpID09IGFyZ3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgbm9kZSAqY2ggPSBDSElMRCh0cmVlLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoTkNIKGNoKSA9PSAyICYmIFRZUEUoQ0hJTEQoY2gsIDEpKSA9PSBjb21wX2ZvcikgewotICAgICAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJuZWVkICcoJywgJyknIGZvciBnZW5lcmF0b3IgZXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAob2sgJiYgbmNoLWkgPj0gMikgewotICAgICAgICAvKiBza2lwIGxlYWRpbmcgKGFyZ3VtZW50ICcsJykgKi8KLSAgICAgICAgb2sgPSAodmFsaWRhdGVfYXJndW1lbnQoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkrMSkpKTsKLSAgICAgICAgaWYgKG9rKQotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIH0KLSAgICBvayA9IDE7Ci0gICAgaWYgKG5jaC1pID4gMCkgewotICAgICAgICBpbnQgc3ltID0gVFlQRShDSElMRCh0cmVlLCBpKSk7Ci0KLSAgICAgICAgaWYgKHN5bSA9PSBhcmd1bWVudCkgewotICAgICAgICAgICAgb2sgPSB2YWxpZGF0ZV9hcmd1bWVudChDSElMRCh0cmVlLCBpKSk7Ci0gICAgICAgICAgICBpZiAob2sgJiYgaSsxICE9IG5jaCkgewotICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgYXJnbGlzdCBzcGVjaWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZXh0cmEgc3R1ZmYgb24gZW5kKSIpOwotICAgICAgICAgICAgICAgIG9rID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgIGVsc2UgewotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBhcmdsaXN0IHNwZWNpZmljYXRpb24iKTsKLSAgICAgICAgICAgIG9rID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKG9rKTsKLX0KLQotCi0KLS8qICBhcmd1bWVudDogKCB0ZXN0IFtjb21wX2Zvcl0gfAotICogICAgICAgICAgICAgIHRlc3QgJz0nIHRlc3QgfAotICogICAgICAgICAgICAgICcqKicgdGVzdCB8Ci0gKiAgICAgICAgICAgICAgJyonIHRlc3QgKQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hcmd1bWVudChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhcmd1bWVudCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDEpIHx8IChuY2ggPT0gMikgfHwgKG5jaCA9PSAzKSkpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gRE9VQkxFU1RBUikgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gU1RBUikgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoID09IDEpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAyKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29tcF9mb3IoQ0hJTEQodHJlZSwgMSkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2VxdWFsKENISUxEKHRyZWUsIDEpKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDIpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLQotLyogIHRyYWlsZXI6Ci0gKgotICogICcoJyBbYXJnbGlzdF0gJyknIHwgJ1snIHN1YnNjcmlwdGxpc3QgJ10nIHwgJy4nIE5BTUUKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdHJhaWxlcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHRyYWlsZXIpICYmICgobmNoID09IDIpIHx8IChuY2ggPT0gMykpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBzd2l0Y2ggKFRZUEUoQ0hJTEQodHJlZSwgMCkpKSB7Ci0gICAgICAgICAgY2FzZSBMUEFSOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIG5jaCAtIDEpKTsKLSAgICAgICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hcmdsaXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTFNRQjoKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAzLCAidHJhaWxlciIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3Vic2NyaXB0bGlzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAyKSwgUlNRQikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInRyYWlsZXIiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInRyYWlsZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBzdWJzY3JpcHRsaXN0OgotICoKLSAqICBzdWJzY3JpcHQgKCcsJyBzdWJzY3JpcHQpKiBbJywnXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zdWJzY3JpcHRsaXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0cmVlLCBzdWJzY3JpcHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfc3Vic2NyaXB0LCAic3Vic2NyaXB0bGlzdCIpKTsKLX0KLQotCi0vKiAgc3Vic2NyaXB0OgotICoKLSAqICAnLicgJy4nICcuJyB8IHRlc3QgfCBbdGVzdF0gJzonIFt0ZXN0XSBbc2xpY2VvcF0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfc3Vic2NyaXB0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgc3Vic2NyaXB0KSAmJiAobmNoID49IDEpICYmIChuY2ggPD0gNCk7Ci0KLSAgICBpZiAoIXJlcykgewotICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHN1YnNjcmlwdCBub2RlIik7Ci0gICAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBET1QpCi0gICAgICAgIC8qIHRha2UgY2FyZSBvZiAoJy4nICcuJyAnLicpIHBvc3NpYmlsaXR5ICovCi0gICAgICAgIHJldHVybiAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMywgInN1YnNjcmlwdCIpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG90KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3QoQ0hJTEQodHJlZSwgMikpKTsKLSAgICBpZiAobmNoID09IDEpIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IHRlc3QpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICByZXR1cm4gKHJlcyk7Ci0gICAgfQotICAgIC8qICBNdXN0IGJlIFt0ZXN0XSAnOicgW3Rlc3RdIFtzbGljZW9wXSwKLSAgICAgKiAgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgb3B0aW9uYWwgY29tcG9uZW50cyB3aWxsCi0gICAgICogIGJlIHByZXNlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIHlldC4KLSAgICAgKi8KLSAgICBpZiAoKFRZUEUoQ0hJTEQodHJlZSwgMCkpICE9IENPTE9OKSB8fCAobmNoID09IDQpKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBvZmZzZXQgPSAxOwotICAgIH0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBvZmZzZXQpKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGludCByZW0gPSBuY2ggLSArK29mZnNldDsKLSAgICAgICAgaWYgKHJlbSkgewotICAgICAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0KSkgPT0gdGVzdCkgewotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgKytvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgLS1yZW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzICYmIHJlbSkKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zbGljZW9wKENISUxEKHRyZWUsIG9mZnNldCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zbGljZW9wKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKChuY2ggPT0gMSkgfHwgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInNsaWNlb3AiKSkKLSAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUodHJlZSwgc2xpY2VvcCk7Ci0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgInNsaWNlb3AiKTsKLSAgICB9Ci0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMCkpOwotICAgIGlmIChyZXMgJiYgKG5jaCA9PSAyKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdF9vcl9zdGFyX2V4cHIobm9kZSAqbikKLXsKLSAgICBpZiAoVFlQRShuKSA9PSB0ZXN0KQotICAgICAgICByZXR1cm4gdmFsaWRhdGVfdGVzdChuKTsKLSAgICByZXR1cm4gdmFsaWRhdGVfc3Rhcl9leHByKG4pOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leHByX29yX3N0YXJfZXhwcihub2RlICpuKQotewotICAgIGlmIChUWVBFKG4pID09IGV4cHIpCi0gICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKG4pOwotICAgIHJldHVybiB2YWxpZGF0ZV9zdGFyX2V4cHIobik7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhwcmxpc3Qobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRyZWUsIGV4cHJsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfZXhwcl9vcl9zdGFyX2V4cHIsICJleHBybGlzdCIpKTsKLX0KLQotLyogSW5jcmVtZW50aW5nIHZhbGlkYXRlIGZ1bmN0aW9ucyByZXR1cm5zIG5vbnplcm8gaWZmIHN1Y2Nlc3MgKGxpa2Ugb3RoZXIKLSAqIHZhbGlkYXRlIGZ1bmN0aW9ucywgYW5kIGFkdmFuY2UgKmkgYnkgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCBwYXR0ZXJuLiAqLwotCi0vKiB0ZXN0ICc6JyB0ZXN0ICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0X2NvbG9uX3Rlc3RfaW5jKG5vZGUgKnRyZWUsIGludCAqaSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgKCppKSsrKSkKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsICgqaSkrKykpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsICgqaSkrKykpKTsKLX0KLQotLyogdGVzdCAnOicgdGVzdCB8ICcqKicgZXhwciAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZGljdF9lbGVtZW50X2luYyhub2RlICp0cmVlLCBpbnQgKmkpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gMDsKLSAgICBpZiAobmNoIC0gKmkgPj0gMikgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAqaSsxKSkgPT0gQ09MT04pIHsKLSAgICAgICAgICAgIC8qIHRlc3QgJzonIHRlc3QgKi8KLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RfY29sb25fdGVzdF9pbmModHJlZSwgaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiAnKionIGV4cHIgKi8KLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9kb3VibGVzdGFyKENISUxEKHRyZWUsICgqaSkrKykpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2V4cHIoQ0hJTEQodHJlZSwgKCppKSsrKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiAgZGljdG9yc2V0bWFrZXI6Ci0gKgotICogICAoICgodGVzdCAnOicgdGVzdCB8ICcqKicgZXhwcikKLSAqICAgICAgKGNvbXBfZm9yIHwgKCcsJyAodGVzdCAnOicgdGVzdCB8ICcqKicgZXhwcikpKiBbJywnXSkpIHwKLSAqICAgICAoKHRlc3QgfCAnKicgdGVzdCkKLSAqICAgICAgKGNvbXBfZm9yIHwgKCcsJyAodGVzdCB8ICcqJyB0ZXN0KSkqIFsnLCddKSkgKQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kaWN0b3JzZXRtYWtlcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlczsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBkaWN0b3JzZXRtYWtlcik7Ci0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG5jaCAtIGkgPCAxKSB7Ci0gICAgICAgIC8qIFVuY29uZGl0aW9uYWxseSByYWlzZS4gKi8KLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJkaWN0b3JzZXRtYWtlciIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAobmNoIC0gaSA+PSAyCi0gICAgICAgICYmICgoVFlQRShDSElMRCh0cmVlLCBpKzEpKSA9PSBDT0xPTikgfHwKLSAgICAgICAgICAgIChUWVBFKENISUxEKHRyZWUsIGkpKSA9PSBET1VCTEVTVEFSKSkpIHsKLSAgICAgICAgLyogRGljdGlvbmFyeSBkaXNwbGF5IG9yIGRpY3Rpb25hcnkgY29tcHJlaGVuc2lvbi4gKi8KLSAgICAgICAgaWYgKG5jaCAtIGkgPj0gNCAmJiBUWVBFKENISUxEKHRyZWUsIGkrMykpID09IGNvbXBfZm9yKSB7Ci0gICAgICAgICAgICAvKiBEaWN0aW9uYXJ5IGNvbXByZWhlbnNpb24uICovCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfdGVzdF9jb2xvbl90ZXN0X2luYyh0cmVlLCAmaSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29tcF9mb3IoQ0hJTEQodHJlZSwgaSsrKSkpOwotICAgICAgICAgICAgaWYgKCFyZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBEaWN0aW9uYXJ5IGRpc3BsYXkuICovCi0gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfcmVwZWF0aW5nX2xpc3RfdmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgIHRyZWUsCi0gICAgICAgICAgICAgICAgICAgIGRpY3RvcnNldG1ha2VyLAotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9kaWN0X2VsZW1lbnRfaW5jLAotICAgICAgICAgICAgICAgICAgICAmaSwKLSAgICAgICAgICAgICAgICAgICAgImRpY3RvcnNldG1ha2VyIik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBTZXQgZGlzcGxheSBvciBzZXQgY29tcHJlaGVuc2lvbi4gKi8KLSAgICAgICAgaWYgKG5jaCAtIGkgPj0gMiAmJiBUWVBFKENISUxEKHRyZWUsIGkgKyAxKSkgPT0gY29tcF9mb3IpIHsKLSAgICAgICAgICAgIC8qIFNldCBjb21wcmVoZW5zaW9uLiAqLwotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgaSsrKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb21wX2ZvcihDSElMRCh0cmVlLCBpKyspKSk7Ci0gICAgICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFNldCBkaXNwbGF5LiAqLwotICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RvcnNldG1ha2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfdGVzdF9vcl9zdGFyX2V4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGljdG9yc2V0bWFrZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuY2ggLSBpID4gMCkgewotICAgICAgICBlcnJfc3RyaW5nKCJJbGxlZ2FsIHRyYWlsaW5nIG5vZGVzIGZvciBkaWN0b3JzZXRtYWtlci4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXZhbF9pbnB1dChub2RlICp0cmVlKQotewotICAgIGludCBwb3M7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGV2YWxfaW5wdXQpCi0gICAgICAgICAgICAgICAmJiAobmNoID49IDIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIG5jaCAtIDEpLCBFTkRNQVJLRVIpKTsKLQotICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCAobmNoIC0gMSkpOyArK3BvcykKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgcG9zKSwgTkVXTElORSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfbm9kZShub2RlICp0cmVlKQotewotICAgIGludCAgIG5jaCAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bS4gY2hpbGRyZW4gb24gY3VycmVudCBub2RlICAqLwotICAgIGludCAgIHJlcyAgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotICAgIG5vZGUqIG5leHQgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gcHJvY2VzcyBhZnRlciB0aGlzIG9uZSAqLwotCi0gICAgd2hpbGUgKHJlcyAmJiAodHJlZSAhPSAwKSkgewotICAgICAgICBuY2ggID0gTkNIKHRyZWUpOwotICAgICAgICBuZXh0ID0gMDsKLSAgICAgICAgc3dpdGNoIChUWVBFKHRyZWUpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIERlZmluaXRpb24gbm9kZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICBjYXNlIGFzeW5jX2Z1bmNkZWY6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hc3luY19mdW5jZGVmKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhc3luY19zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXN5bmNfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZnVuY2RlZjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2Z1bmNkZWYodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHdpdGhfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3dpdGhfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgY2xhc3NkZWY6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jbGFzcyh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZGVjb3JhdGVkOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZGVjb3JhdGVkKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogICJUcml2aWFsIiBwYXJzZSB0cmVlIG5vZGVzLgotICAgICAgICAgICAgICogIChXaHkgZGlkIEkgY2FsbCB0aGVzZSB0cml2aWFsPykKLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2Ugc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHNtYWxsX3N0bXQ6Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIGV4cHJfc3RtdCB8IGRlbF9zdG10IHwgcGFzc19zdG10IHwgZmxvd19zdG10IHwKLSAgICAgICAgICAgICAqICBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgbm9ubG9jYWxfc3RtdCB8IGFzc2VydF9zdG10Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3NtYWxsX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZsb3dfc3RtdDoKLSAgICAgICAgICAgIHJlcyAgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImZsb3dfc3RtdCIpCi0gICAgICAgICAgICAgICAgICAgICYmICgoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gYnJlYWtfc3RtdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBjb250aW51ZV9zdG10KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IHlpZWxkX3N0bXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gcmV0dXJuX3N0bXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gcmFpc2Vfc3RtdCkpKTsKLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgbmV4dCA9IENISUxEKHRyZWUsIDApOwotICAgICAgICAgICAgZWxzZSBpZiAobmNoID09IDEpCi0gICAgICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBmbG93X3N0bXQgdHlwZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB5aWVsZF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfeWllbGRfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBDb21wb3VuZCBzdGF0ZW1lbnRzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSBzaW1wbGVfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3NpbXBsZV9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBjb21wb3VuZF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcG91bmRfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBGdW5kYW1lbnRhbCBzdGF0ZW1lbnRzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSBleHByX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9leHByX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGRlbF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZGVsX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHBhc3Nfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAicGFzcyIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgInBhc3MiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGJyZWFrX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImJyZWFrIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiYnJlYWsiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGNvbnRpbnVlX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImNvbnRpbnVlIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiY29udGludWUiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHJldHVybl9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfcmV0dXJuX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHJhaXNlX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9yYWlzZV9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBpbXBvcnRfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBpbXBvcnRfbmFtZToKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9uYW1lKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBpbXBvcnRfZnJvbToKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9mcm9tKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBnbG9iYWxfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2dsb2JhbF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBub25sb2NhbF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbm9ubG9jYWxfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYXNzZXJ0X3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hc3NlcnRfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgaWZfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2lmKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB3aGlsZV9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfd2hpbGUodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZvcl9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZm9yKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0cnlfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3RyeSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugc3VpdGU6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdWl0ZSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBFeHByZXNzaW9uIG5vZGVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSB0ZXN0bGlzdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB5aWVsZF9leHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfeWllbGRfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdGVzdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGFuZF90ZXN0OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYW5kX3Rlc3QodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIG5vdF90ZXN0OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbm90X3Rlc3QodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGNvbXBhcmlzb246Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wYXJpc29uKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBleHBybGlzdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2V4cHJsaXN0KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBjb21wX29wOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9vcCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHhvcl9leHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfeG9yX2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGFuZF9leHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYW5kX2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHNoaWZ0X2V4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zaGlmdF9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhcml0aF9leHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXJpdGhfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdGVybToKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlcm0odHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZhY3RvcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ZhY3Rvcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgcG93ZXI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9wb3dlcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYXRvbToKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2F0b20odHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBIb3BlZnVsbHkgbmV2ZXIgcmVhY2hlZCEgKi8KLSAgICAgICAgICAgIGVycl9zdHJpbmcoInVucmVjb2duaXplZCBub2RlIHR5cGUiKTsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0cmVlID0gbmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4cHJfdHJlZShub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSB2YWxpZGF0ZV9ldmFsX2lucHV0KHRyZWUpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoImNvdWxkIG5vdCB2YWxpZGF0ZSBleHByZXNzaW9uIHR1cGxlIik7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGZpbGVfaW5wdXQ6Ci0gKiAgICAgIChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9maWxlX2lucHV0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKSAtIDE7Ci0gICAgaW50IHJlcyA9ICgobmNoID49IDApCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBuY2gpLCBFTkRNQVJLRVIpKTsKLQotICAgIGZvciAoaiA9IDA7IHJlcyAmJiAoaiA8IG5jaCk7ICsraikgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBqKSkgPT0gc3RtdCkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3N0bXQoQ0hJTEQodHJlZSwgaikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9uZXdsaW5lKENISUxEKHRyZWUsIGopKTsKLSAgICB9Ci0gICAgLyogIFRoaXMgc3RheXMgaW4gdG8gcHJldmVudCBhbnkgaW50ZXJuYWwgZmFpbHVyZXMgZnJvbSBnZXR0aW5nIHRvIHRoZQotICAgICAqICB1c2VyLiAgSG9wZWZ1bGx5LCB0aGlzIHdvbid0IGJlIG5lZWRlZC4gIElmIGEgdXNlciByZXBvcnRzIGdldHRpbmcKLSAgICAgKiAgdGhpcywgd2UgaGF2ZSBzb21lIGRlYnVnZ2luZyB0byBkby4KLSAgICAgKi8KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiVkFMSURBVElPTiBGQUlMVVJFOiByZXBvcnQgdGhpcyB0byB0aGUgbWFpbnRhaW5lciEiKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZW5jb2RpbmdfZGVjbChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICgobmNoID09IDEpCi0gICAgICAgICYmIHZhbGlkYXRlX2ZpbGVfaW5wdXQoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJFcnJvciBQYXJzaW5nIGVuY29kaW5nX2RlY2wiKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCoKIHBpY2tsZV9jb25zdHJ1Y3RvciA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCBmNmYwOGJmLi4wYjliM2Y2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC0zMiw2ICszMiwxMiBAQAogI2luY2x1ZGUgIndpbnJlcGFyc2UuaCIKICNlbmRpZgogCisvKiBPbiBhbmRyb2lkIEFQSSBsZXZlbCAyMSwgJ0FUX0VBQ0NFU1MnIGlzIG5vdCBkZWNsYXJlZCBhbHRob3VnaAorICogSEFWRV9GQUNDRVNTQVQgaXMgZGVmaW5lZC4gKi8KKyNpZmRlZiBfX0FORFJPSURfXworI3VuZGVmIEhBVkVfRkFDQ0VTU0FUCisjZW5kaWYKKwogI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBuZWVkZWQgZm9yIGN0ZXJtaWQoKSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTEyNyw2ICsxMzMsMTMgQEAKICNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiAjZW5kaWYKIAorI2lmZGVmIEhBVkVfTElOVVhfUkFORE9NX0gKKyMgIGluY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9HRVRSQU5ET01fU1lTQ0FMTAorIyAgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKQogIyAgZGVmaW5lIFRFUk1TSVpFX1VTRV9DT05JTwogI2VsaWYgZGVmaW5lZChIQVZFX1NZU19JT0NUTF9IKQpAQCAtNjM0LDIyICs2NDcsMTQgQEAKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jICBkZWZpbmUgX1B5TG9uZ19Gcm9tRGV2IFB5TG9uZ19Gcm9tTG9uZ0xvbmcKLSNlbHNlCi0jICBkZWZpbmUgX1B5TG9uZ19Gcm9tRGV2IFB5TG9uZ19Gcm9tTG9uZwotI2VuZGlmCisjZGVmaW5lIF9QeUxvbmdfRnJvbURldiBQeUxvbmdfRnJvbUxvbmdMb25nCiAKIAogI2lmIGRlZmluZWQoSEFWRV9NS05PRCkgJiYgZGVmaW5lZChIQVZFX01BS0VERVYpCiBzdGF0aWMgaW50CiBfUHlfRGV2X0NvbnZlcnRlcihQeU9iamVjdCAqb2JqLCB2b2lkICpwKQogewotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgKigoZGV2X3QgKilwKSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcob2JqKTsKLSNlbHNlCi0gICAgKigoZGV2X3QgKilwKSA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOwotI2VuZGlmCiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiAxOwpAQCAtNjcxLDIxICs2NzYsMjAgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50Ci1fZmRfY29udmVydGVyKFB5T2JqZWN0ICpvLCBpbnQgKnAsIGNvbnN0IGNoYXIgKmFsbG93ZWQpCitfZmRfY29udmVydGVyKFB5T2JqZWN0ICpvLCBpbnQgKnApCiB7CiAgICAgaW50IG92ZXJmbG93OwogICAgIGxvbmcgbG9uZ192YWx1ZTsKIAogICAgIFB5T2JqZWN0ICppbmRleCA9IFB5TnVtYmVyX0luZGV4KG8pOwogICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgc2hvdWxkIGJlICVzLCBub3QgJS4yMDBzIiwKLSAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQsIFB5X1RZUEUobyktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKGluZGV4KSk7CiAgICAgbG9uZ192YWx1ZSA9IFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhpbmRleCwgJm92ZXJmbG93KTsKICAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CiAgICAgaWYgKG92ZXJmbG93ID4gMCB8fCBsb25nX3ZhbHVlID4gSU5UX01BWCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJmZCBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwpAQCAtNzA4LDcgKzcxMiwxNSBAQAogICAgICAgICAqKGludCAqKXAgPSBERUZBVUxUX0RJUl9GRDsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIHJldHVybiBfZmRfY29udmVydGVyKG8sIChpbnQgKilwLCAiaW50ZWdlciIpOworICAgIGVsc2UgaWYgKFB5SW5kZXhfQ2hlY2sobykpIHsKKyAgICAgICAgcmV0dXJuIF9mZF9jb252ZXJ0ZXIobywgKGludCAqKXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBOb25lLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIApAQCAtNzk5LDggKzgxMSw4IEBACiAgICAgY29uc3QgY2hhciAqYXJndW1lbnRfbmFtZTsKICAgICBpbnQgbnVsbGFibGU7CiAgICAgaW50IGFsbG93X2ZkOwotICAgIHdjaGFyX3QgKndpZGU7Ci0gICAgY2hhciAqbmFycm93OworICAgIGNvbnN0IHdjaGFyX3QgKndpZGU7CisgICAgY29uc3QgY2hhciAqbmFycm93OwogICAgIGludCBmZDsKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKICAgICBQeU9iamVjdCAqb2JqZWN0OwpAQCAtODE4LDExICs4MzAsMTUgQEAKIH0KIAogc3RhdGljIGludAotcGF0aF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIHZvaWQgKnApIHsKK3BhdGhfY29udmVydGVyKFB5T2JqZWN0ICpvLCB2b2lkICpwKQorewogICAgIHBhdGhfdCAqcGF0aCA9IChwYXRoX3QgKilwOwotICAgIFB5T2JqZWN0ICp1bmljb2RlLCAqYnl0ZXM7CisgICAgUHlPYmplY3QgKmJ5dGVzLCAqdG9fY2xlYW51cCA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBsZW5ndGg7Ci0gICAgY2hhciAqbmFycm93OworICAgIGludCBpc19pbmRleCwgaXNfYnVmZmVyLCBpc19ieXRlcywgaXNfdW5pY29kZTsKKyAgICAvKiBEZWZhdWx0IHRvIGZhaWx1cmUsIGZvcmNpbmcgZXhwbGljaXQgc2lnbmFsaW5nIG9mIHN1Y2NjZXNzLiAqLworICAgIGludCByZXQgPSAwOworICAgIGNvbnN0IGNoYXIgKm5hcnJvdzsKIAogI2RlZmluZSBGT1JNQVRfRVhDRVBUSU9OKGV4YywgZm10KSBcCiAgICAgUHlFcnJfRm9ybWF0KGV4YywgIiVzJXMiIGZtdCwgXApAQCAtODM2LDE1ICs4NTIsMTAgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgLyogZW5zdXJlIGl0J3MgYWx3YXlzIHNhZmUgdG8gY2FsbCBwYXRoX2NsZWFudXAoKSAqLworICAgIC8qIEVuc3VyZSBpdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgcGF0aF9jbGVhbnVwKCkuICovCiAgICAgcGF0aC0+Y2xlYW51cCA9IE5VTEw7CiAKLSAgICBpZiAobyA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIGlmICghcGF0aC0+bnVsbGFibGUpIHsKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3BlY2lmeSBOb25lIGZvciAlcyBhcmd1bWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoKG8gPT0gUHlfTm9uZSkgJiYgcGF0aC0+bnVsbGFibGUpIHsKICAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7CiAgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7CiAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7CkBAIC04NTMsMjUgKzg2NCw1NCBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICB1bmljb2RlID0gUHlVbmljb2RlX0Zyb21PYmplY3Qobyk7Ci0gICAgaWYgKHVuaWNvZGUpIHsKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgICAgIHdjaGFyX3QgKndpZGU7CisgICAgLyogT25seSBjYWxsIHRoaXMgaGVyZSBzbyB0aGF0IHdlIGRvbid0IHRyZWF0IHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgICBvcy5mc3BhdGgoKSBhcyBhbiBmZCBvciBidWZmZXIuICovCisgICAgaXNfaW5kZXggPSBwYXRoLT5hbGxvd19mZCAmJiBQeUluZGV4X0NoZWNrKG8pOworICAgIGlzX2J1ZmZlciA9IFB5T2JqZWN0X0NoZWNrQnVmZmVyKG8pOworICAgIGlzX2J5dGVzID0gUHlCeXRlc19DaGVjayhvKTsKKyAgICBpc191bmljb2RlID0gUHlVbmljb2RlX0NoZWNrKG8pOwogCi0gICAgICAgIHdpZGUgPSBQeVVuaWNvZGVfQXNVbmljb2RlQW5kU2l6ZSh1bmljb2RlLCAmbGVuZ3RoKTsKKyAgICBpZiAoIWlzX2luZGV4ICYmICFpc19idWZmZXIgJiYgIWlzX3VuaWNvZGUgJiYgIWlzX2J5dGVzKSB7CisgICAgICAgIC8qIElubGluZSBQeU9TX0ZTUGF0aCgpIGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuICovCisgICAgICAgIF9QeV9JREVOVElGSUVSKF9fZnNwYXRoX18pOworICAgICAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisKKyAgICAgICAgZnVuYyA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKG8sICZQeUlkX19fZnNwYXRoX18pOworICAgICAgICBpZiAoTlVMTCA9PSBmdW5jKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgIH0KKworICAgICAgICBvID0gdG9fY2xlYW51cCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gbykgeworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvKSkgeworICAgICAgICAgICAgaXNfdW5pY29kZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlCeXRlc19DaGVjayhvKSkgeworICAgICAgICAgICAgaXNfYnl0ZXMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX3VuaWNvZGUpIHsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGNvbnN0IHdjaGFyX3QgKndpZGU7CisKKyAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVBbmRTaXplKG8sICZsZW5ndGgpOwogICAgICAgICBpZiAoIXdpZGUpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChsZW5ndGggPiAzMjc2NykgewogICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19WYWx1ZUVycm9yLCAiJXMgdG9vIGxvbmcgZm9yIFdpbmRvd3MiKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmICh3Y3NsZW4od2lkZSkgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAKICAgICAgICAgcGF0aC0+d2lkZSA9IHdpZGU7CkBAIC04NzksNTggKzkxOSw3OSBAQAogICAgICAgICBwYXRoLT5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIHBhdGgtPm9iamVjdCA9IG87CiAgICAgICAgIHBhdGgtPmZkID0gLTE7Ci0gICAgICAgIHBhdGgtPmNsZWFudXAgPSB1bmljb2RlOwotICAgICAgICByZXR1cm4gUHlfQ0xFQU5VUF9TVVBQT1JURUQ7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGdvdG8gZXhpdDsKICNlbHNlCi0gICAgICAgIGludCBjb252ZXJ0ZWQgPSBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIodW5pY29kZSwgJmJ5dGVzKTsKLSAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgICBpZiAoIWNvbnZlcnRlZCkKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICAgICAgaWYgKCFQeVVuaWNvZGVfRlNDb252ZXJ0ZXIobywgJmJ5dGVzKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CiAjZW5kaWYKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcihvKSkKLSAgICAgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tT2JqZWN0KG8pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBieXRlcyA9IE5VTEw7CisgICAgZWxzZSBpZiAoaXNfYnl0ZXMpIHsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGlmICh3aW4zMl93YXJuX2J5dGVzX2FwaSgpKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBieXRlcyA9IG87CisgICAgICAgIFB5X0lOQ1JFRihieXRlcyk7CisgICAgfQorICAgIGVsc2UgaWYgKGlzX2J1ZmZlcikgeworICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAiJXMlcyVzIHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gcGF0aC0+ZnVuY3Rpb25fbmFtZSA6ICIiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/ICI6ICIgICAgICAgICAgICAgICAgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmFyZ3VtZW50X25hbWUgPyBwYXRoLT5hcmd1bWVudF9uYW1lIDogInBhdGgiLAorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgJiYgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgb3IgTm9uZSIgOgorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciIgOgorICAgICAgICAgICAgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgTm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nLCBieXRlcyBvciBvcy5QYXRoTGlrZSIsCisgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBpZiAod2luMzJfd2Fybl9ieXRlc19hcGkoKSkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7CiAgICAgICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICBpZiAocGF0aC0+YWxsb3dfZmQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZmQ7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IF9mZF9jb252ZXJ0ZXIobywgJmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZywgYnl0ZXMgb3IgaW50ZWdlciIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm9iamVjdCA9IG87Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmZkID0gZmQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKCFieXRlcykgewotICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1R5cGVFcnJvciwgImlsbGVnYWwgdHlwZSBmb3IgJXMgcGFyYW1ldGVyIik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKHBhdGgtPmFsbG93X2ZkICYmIFB5SW5kZXhfQ2hlY2sobykpIHsKKyAgICAgICAgaWYgKCFfZmRfY29udmVydGVyKG8sICZwYXRoLT5mZCkpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBwYXRoLT53aWRlID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bGVuZ3RoID0gMDsKKyAgICAgICAgcGF0aC0+b2JqZWN0ID0gbzsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLQotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICBpZiAod2luMzJfd2Fybl9ieXRlc19hcGkoKSkgewotICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIHsKKyBlcnJvcl9leGl0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyVzIHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gcGF0aC0+ZnVuY3Rpb25fbmFtZSA6ICIiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/ICI6ICIgICAgICAgICAgICAgICAgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmFyZ3VtZW50X25hbWUgPyBwYXRoLT5hcmd1bWVudF9uYW1lIDogInBhdGgiLAorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgJiYgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgb3IgTm9uZSIgOgorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgaW50ZWdlciIgOgorICAgICAgICAgICAgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgb3MuUGF0aExpa2Ugb3IgTm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nLCBieXRlcyBvciBvcy5QYXRoTGlrZSIsCisgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLSNlbmRpZgogCiAgICAgbGVuZ3RoID0gUHlCeXRlc19HRVRfU0laRShieXRlcyk7CiAjaWZkZWYgTVNfV0lORE9XUwogICAgIGlmIChsZW5ndGggPiBNQVhfUEFUSC0xKSB7CiAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVmFsdWVFcnJvciwgIiVzIHRvbyBsb25nIGZvciBXaW5kb3dzIik7CiAgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogI2VuZGlmCiAKQEAgLTkzOCw3ICs5OTksNyBAQAogICAgIGlmICgoc2l6ZV90KWxlbmd0aCAhPSBzdHJsZW4obmFycm93KSkgewogICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOwogICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgIHBhdGgtPndpZGUgPSBOVUxMOwpAQCAtOTQ2LDEyICsxMDA3LDIyIEBACiAgICAgcGF0aC0+bGVuZ3RoID0gbGVuZ3RoOwogICAgIHBhdGgtPm9iamVjdCA9IG87CiAgICAgcGF0aC0+ZmQgPSAtMTsKLSAgICBwYXRoLT5jbGVhbnVwID0gYnl0ZXM7Ci0gICAgcmV0dXJuIFB5X0NMRUFOVVBfU1VQUE9SVEVEOworICAgIGlmIChieXRlcyA9PSBvKSB7CisgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwYXRoLT5jbGVhbnVwID0gYnl0ZXM7CisgICAgICAgIHJldCA9IFB5X0NMRUFOVVBfU1VQUE9SVEVEOworICAgIH0KKyBleGl0OgorICAgIFB5X1hERUNSRUYodG9fY2xlYW51cCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQKLWFyZ3VtZW50X3VuYXZhaWxhYmxlX2Vycm9yKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNoYXIgKmFyZ3VtZW50X25hbWUpIHsKK2FyZ3VtZW50X3VuYXZhaWxhYmxlX2Vycm9yKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNvbnN0IGNoYXIgKmFyZ3VtZW50X25hbWUpCit7CiAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCiAgICAgICAgICIlcyVzJXMgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIsCiAgICAgICAgIChmdW5jdGlvbl9uYW1lICE9IE5VTEwpID8gZnVuY3Rpb25fbmFtZSA6ICIiLApAQCAtOTc0LDcgKzEwNDUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1mZF9zcGVjaWZpZWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkKSB7CitmZF9zcGVjaWZpZWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkKQorewogICAgIGlmIChmZCA9PSAtMSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTk4Myw3ICsxMDU1LDggQEAKIH0KIAogc3RhdGljIGludAotZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZm9sbG93X3N5bWxpbmtzKSB7Citmb2xsb3dfc3ltbGlua3Nfc3BlY2lmaWVkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmb2xsb3dfc3ltbGlua3MpCit7CiAgICAgaWYgKGZvbGxvd19zeW1saW5rcykKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTk5Miw3ICsxMDY1LDggQEAKIH0KIAogc3RhdGljIGludAotcGF0aF9hbmRfZGlyX2ZkX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLCBpbnQgZGlyX2ZkKSB7CitwYXRoX2FuZF9kaXJfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsIGludCBkaXJfZmQpCit7CiAgICAgaWYgKCFwYXRoLT5uYXJyb3cgJiYgIXBhdGgtPndpZGUgJiYgKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgZGlyX2ZkIHdpdGhvdXQgbWF0Y2hpbmcgcGF0aCIsCkBAIC0xMDAzLDcgKzEwNzcsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1kaXJfZmRfYW5kX2ZkX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwgaW50IGZkKSB7CitkaXJfZmRfYW5kX2ZkX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwgaW50IGZkKQorewogICAgIGlmICgoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKSAmJiAoZmQgIT0gLTEpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW4ndCBzcGVjaWZ5IGJvdGggZGlyX2ZkIGFuZCBmZCIsCkBAIC0xMDE0LDggKzEwODksOSBAQAogfQogCiBzdGF0aWMgaW50Ci1mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2ZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoKGZkID4gMCkgJiYgKCFmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgdXNlIGZkIGFuZCBmb2xsb3dfc3ltbGlua3MgdG9nZXRoZXIiLApAQCAtMTAyNiw4ICsxMTAyLDkgQEAKIH0KIAogc3RhdGljIGludAotZGlyX2ZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKSB7CitkaXJfZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpCit7CiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpICYmICghZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IHVzZSBkaXJfZmQgYW5kIGZvbGxvd19zeW1saW5rcyB0b2dldGhlciIsCkBAIC0xMDM4LDcgKzExMTUsNyBAQAogfQogCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIHR5cGVkZWYgUFlfTE9OR19MT05HIFB5X29mZl90OworICAgIHR5cGVkZWYgbG9uZyBsb25nIFB5X29mZl90OwogI2Vsc2UKICAgICB0eXBlZGVmIG9mZl90IFB5X29mZl90OwogI2VuZGlmCkBAIC0xMDk5LDggKzExNzYsOCBAQAogc3RhdGljIGludAogd2luMzJfZ2V0X3JlcGFyc2VfdGFnKEhBTkRMRSByZXBhcnNlX3BvaW50X2hhbmRsZSwgVUxPTkcgKnJlcGFyc2VfdGFnKQogewotICAgIGNoYXIgdGFyZ2V0X2J1ZmZlcltNQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRV07Ci0gICAgUkVQQVJTRV9EQVRBX0JVRkZFUiAqcmRiID0gKFJFUEFSU0VfREFUQV9CVUZGRVIgKil0YXJnZXRfYnVmZmVyOworICAgIGNoYXIgdGFyZ2V0X2J1ZmZlcltfUHlfTUFYSU1VTV9SRVBBUlNFX0RBVEFfQlVGRkVSX1NJWkVdOworICAgIF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSICpyZGIgPSAoX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIgKil0YXJnZXRfYnVmZmVyOwogICAgIERXT1JEIG5fYnl0ZXNfcmV0dXJuZWQ7CiAKICAgICBpZiAoMCA9PSBEZXZpY2VJb0NvbnRyb2woCkBAIC0xMTU5LDcgKzEyMzYsNyBAQAogICAgIGZvciAoZSA9IF93ZW52aXJvbjsgKmUgIT0gTlVMTDsgZSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICprOwogICAgICAgICBQeU9iamVjdCAqdjsKLSAgICAgICAgd2NoYXJfdCAqcCA9IHdjc2NocigqZSwgTCc9Jyk7CisgICAgICAgIGNvbnN0IHdjaGFyX3QgKnAgPSB3Y3NjaHIoKmUsIEwnPScpOwogICAgICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGsgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCplLCAoUHlfc3NpemVfdCkocC0qZSkpOwpAQCAtMTE4Nyw3ICsxMjY0LDcgQEAKICAgICBmb3IgKGUgPSBlbnZpcm9uOyAqZSAhPSBOVUxMOyBlKyspIHsKICAgICAgICAgUHlPYmplY3QgKms7CiAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICBjaGFyICpwID0gc3RyY2hyKCplLCAnPScpOworICAgICAgICBjb25zdCBjaGFyICpwID0gc3RyY2hyKCplLCAnPScpOwogICAgICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGsgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKCplLCAoaW50KShwLSplKSk7CkBAIC0xMjIyLDcgKzEyOTksNyBAQAogCiAjaWZkZWYgTVNfV0lORE9XUwogc3RhdGljIFB5T2JqZWN0ICoKLXdpbjMyX2Vycm9yKGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkKK3dpbjMyX2Vycm9yKGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkKIHsKICAgICAvKiBYWFggV2Ugc2hvdWxkIHBhc3MgdGhlIGZ1bmN0aW9uIG5hbWUgYWxvbmcgaW4gdGhlIGZ1dHVyZS4KICAgICAgICAod2lucmVnLmMgYWxzbyB3YW50cyB0byBwYXNzIHRoZSBmdW5jdGlvbiBuYW1lLikKQEAgLTEyMzcsNyArMTMxNCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi13aW4zMl9lcnJvcl9vYmplY3QoY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBmaWxlbmFtZSkKK3dpbjMyX2Vycm9yX29iamVjdChjb25zdCBjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGZpbGVuYW1lKQogewogICAgIC8qIFhYWCAtIHNlZSB3aW4zMl9lcnJvciBmb3IgY29tbWVudHMgb24gJ2Z1bmN0aW9uJyAqLwogICAgIGVycm5vID0gR2V0TGFzdEVycm9yKCk7CkBAIC0xNDU4LDcgKzE1MzUsNyBAQAogICAgIGlmKCFidWZfc2l6ZSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgYnVmID0gUHlNZW1fTmV3KHdjaGFyX3QsIGJ1Zl9zaXplKzEpOworICAgIGJ1ZiA9ICh3Y2hhcl90ICopUHlNZW1fUmF3TWFsbG9jKChidWZfc2l6ZSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICBpZiAoIWJ1ZikgewogICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfT1VUT0ZNRU1PUlkpOwogICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC0xNDY4LDEyICsxNTQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUsIFZPTFVNRV9OQU1FX0RPUyk7CiAKICAgICBpZighcmVzdWx0X2xlbmd0aCkgewotICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgICAgIFB5TWVtX1Jhd0ZyZWUoYnVmKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIGlmKCFDbG9zZUhhbmRsZShoZGwpKSB7Ci0gICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgUHlNZW1fUmF3RnJlZShidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0xNTU4LDcgKzE2MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKICAgICAgICAgICAgICAgICBjb2RlID0gd2luMzJfeHN0YXRfaW1wbF93KHRhcmdldF9wYXRoLCByZXN1bHQsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHRhcmdldF9wYXRoKTsKKyAgICAgICAgICAgICAgICBQeU1lbV9SYXdGcmVlKHRhcmdldF9wYXRoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY29kZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlCkBAIC0xNjQ4LDcgKzE3MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKICAgICAgICAgICAgICAgICBjb2RlID0gd2luMzJfeHN0YXRfaW1wbF93KHRhcmdldF9wYXRoLCByZXN1bHQsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHRhcmdldF9wYXRoKTsKKyAgICAgICAgICAgICAgICBQeU1lbV9SYXdGcmVlKHRhcmdldF9wYXRoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY29kZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlCkBAIC0yMDAzLDcgKzIwODAsNyBAQAogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMCwgUHlMb25nX0Zyb21Mb25nKChsb25nKXN0LT5zdF9tb2RlKSk7CiAjaWZkZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVAogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORylzdC0+c3RfaW5vKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpc3QtPnN0X2lubykpOwogI2Vsc2UKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDEsIFB5TG9uZ19Gcm9tTG9uZygobG9uZylzdC0+c3RfaW5vKSk7CiAjZW5kaWYKQEAgLTIwMjIsNyArMjA5OSw3IEBACiAjZW5kaWYKICNpZmRlZiBIQVZFX0xBUkdFRklMRV9TVVBQT1JUCiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXN0LT5zdF9zaXplKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpc3QtPnN0X3NpemUpKTsKICNlbHNlCiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA2LCBQeUxvbmdfRnJvbUxvbmcoc3QtPnN0X3NpemUpKTsKICNlbmRpZgpAQCAtMjEwMiw3ICsyMTc5LDcgQEAKIAogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9zaXhfZG9fc3RhdChjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsCitwb3NpeF9kb19zdGF0KGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwKICAgICAgICAgICAgICAgaW50IGRpcl9mZCwgaW50IGZvbGxvd19zeW1saW5rcykKIHsKICAgICBTVFJVQ1RfU1RBVCBzdDsKQEAgLTI0MjIsOCArMjQ5OSw4IEBACiAgICAgdHlwZSA9ICdpZF90JwogICAgIGZvcm1hdF91bml0ID0gJyIgX1B5X1BBUlNFX1BJRCAiJwogCi1jbGFzcyBQeV9pbnRwdHJfdF9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeV9pbnRwdHJfdCcKK2NsYXNzIGludHB0cl90X2NvbnZlcnRlcihDQ29udmVydGVyKToKKyAgICB0eXBlID0gJ2ludHB0cl90JwogICAgIGZvcm1hdF91bml0ID0gJyIgX1B5X1BBUlNFX0lOVFBUUiAiJwogCiBjbGFzcyBQeV9vZmZfdF9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6CkBAIC0yNDUwLDcgKzI1MjcsNyBAQAogICAgIGltcGxfYnlfcmVmZXJlbmNlID0gVHJ1ZTsKIAogW3B5dGhvbiBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwotLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9YWZmZTY4MzE2ZjE2MDQwMV0qLworLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9NDE4ZmNlMGUwMTE0NDQ2MV0qLwogCiAvKltjbGluaWMgaW5wdXRdCiAKQEAgLTMzMTQsMTIgKzMzOTEsMjIgQEAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgZG8gewogICAgICAgICBidWZsZW4gKz0gY2h1bms7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBpZiAoYnVmbGVuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgdG1wYnVmID0gUHlNZW1fUmF3UmVhbGxvYyhidWYsIGJ1Zmxlbik7CiAgICAgICAgIGlmICh0bXBidWYgPT0gTlVMTCkKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGJ1ZiA9IHRtcGJ1ZjsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGN3ZCA9IGdldGN3ZChidWYsIChpbnQpYnVmbGVuKTsKKyNlbHNlCiAgICAgICAgIGN3ZCA9IGdldGN3ZChidWYsIGJ1Zmxlbik7CisjZW5kaWYKICAgICB9IHdoaWxlIChjd2QgPT0gTlVMTCAmJiBlcnJubyA9PSBFUkFOR0UpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKQEAgLTM0NjEsMTUgKzM1NDgsMTMgQEAKICAgICBCT09MIHJlc3VsdDsKICAgICBXSU4zMl9GSU5EX0RBVEEgRmlsZURhdGE7CiAgICAgY2hhciBuYW1lYnVmW01BWF9QQVRIKzRdOyAvKiBPdmVyYWxsb2NhdGUgZm9yICJcKi4qIiAqLwotICAgIGNoYXIgKmJ1ZnB0ciA9IG5hbWVidWY7CiAgICAgLyogb25seSBjbGFpbSB0byBoYXZlIHNwYWNlIGZvciBNQVhfUEFUSCAqLwogICAgIFB5X3NzaXplX3QgbGVuID0gUHlfQVJSQVlfTEVOR1RIKG5hbWVidWYpLTQ7Ci0gICAgUHlPYmplY3QgKnBvID0gTlVMTDsKICAgICB3Y2hhcl90ICp3bmFtZWJ1ZiA9IE5VTEw7CiAKICAgICBpZiAoIXBhdGgtPm5hcnJvdykgewogICAgICAgICBXSU4zMl9GSU5EX0RBVEFXIHdGaWxlRGF0YTsKLSAgICAgICAgd2NoYXJfdCAqcG9fd2NoYXJzOworICAgICAgICBjb25zdCB3Y2hhcl90ICpwb193Y2hhcnM7CiAKICAgICAgICAgaWYgKCFwYXRoLT53aWRlKSB7IC8qIERlZmF1bHQgYXJnOiAiLiIgKi8KICAgICAgICAgICAgIHBvX3djaGFycyA9IEwiLiI7CkBAIC0zNjM1LDcgKzM3MjAsNyBAQAogICAgIGVsc2UKICNlbmRpZgogICAgIHsKLSAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgICAgaWYgKHBhdGgtPm5hcnJvdykgewogICAgICAgICAgICAgbmFtZSA9IHBhdGgtPm5hcnJvdzsKICAgICAgICAgICAgIC8qIG9ubHkgcmV0dXJuIGJ5dGVzIGlmIHRoZXkgc3BlY2lmaWVkIGEgYnl0ZXMgb2JqZWN0ICovCkBAIC0zODE3LDcgKzM5MDIsNyBAQAogICAgIHdjaGFyX3QgKnRhcmdldF9wYXRoOwogICAgIGludCByZXN1bHRfbGVuZ3RoOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgd2NoYXJfdCAqcGF0aF93Y2hhcjsKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoX3djaGFyOwogCiAgICAgcGF0aF93Y2hhciA9IFB5VW5pY29kZV9Bc1VuaWNvZGUocGF0aCk7CiAgICAgaWYgKHBhdGhfd2NoYXIgPT0gTlVMTCkKQEAgLTM5MDgsNyArMzk5Myw4IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Y2JkY2JkMTA1OWNlZWY0YyBpbnB1dD03ZWFjYWRjNDBhY2JkYTZiXSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICB3Y2hhcl90ICpwYXRoX3djaGFyLCAqbW91bnRwYXRoPU5VTEw7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aF93Y2hhcjsKKyAgICB3Y2hhcl90ICptb3VudHBhdGg9TlVMTDsKICAgICBzaXplX3QgYnVmbGVuOwogICAgIEJPT0wgcmV0OwogCkBAIC00MTA2LDcgKzQxOTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludGVybmFsX3JlbmFtZShwYXRoX3QgKnNyYywgcGF0aF90ICpkc3QsIGludCBzcmNfZGlyX2ZkLCBpbnQgZHN0X2Rpcl9mZCwgaW50IGlzX3JlcGxhY2UpCiB7Ci0gICAgY2hhciAqZnVuY3Rpb25fbmFtZSA9IGlzX3JlcGxhY2UgPyAicmVwbGFjZSIgOiAicmVuYW1lIjsKKyAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lID0gaXNfcmVwbGFjZSA/ICJyZXBsYWNlIiA6ICJyZW5hbWUiOwogICAgIGludCBkaXJfZmRfc3BlY2lmaWVkOwogCiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtNDI4Niw3ICs0MzcyLDcgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yOTBmYzQzN2RkNGYzM2EwIGlucHV0PTg2YTU4NTU0YmE2MDk0YWZdKi8KIHsKICAgICBsb25nIHJlc3VsdDsKLSAgICBjaGFyICpieXRlcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoY29tbWFuZCk7CisgICAgY29uc3QgY2hhciAqYnl0ZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKGNvbW1hbmQpOwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICByZXN1bHQgPSBzeXN0ZW0oYnl0ZXMpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC00NTY2LDcgKzQ2NTIsNyBAQAogI2lmIGRlZmluZWQoSEFWRV9GVVRJTUVTQVQpIHx8IGRlZmluZWQoSEFWRV9VVElNRU5TQVQpCiAKIHN0YXRpYyBpbnQKLXV0aW1lX2Rpcl9mZCh1dGltZV90ICp1dCwgaW50IGRpcl9mZCwgY2hhciAqcGF0aCwgaW50IGZvbGxvd19zeW1saW5rcykKK3V0aW1lX2Rpcl9mZCh1dGltZV90ICp1dCwgaW50IGRpcl9mZCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZvbGxvd19zeW1saW5rcykKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIGludCBmbGFncyA9IGZvbGxvd19zeW1saW5rcyA/IDAgOiBBVF9TWU1MSU5LX05PRk9MTE9XOwpAQCAtNDYwOCwxNCArNDY5NCwxNCBAQAogICAgICNkZWZpbmUgUEFUSF9VVElNRV9IQVZFX0ZEIDAKICNlbmRpZgogCisjaWYgZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpCisjICBkZWZpbmUgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2VuZGlmCiAKLSNkZWZpbmUgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUyBcCi0gICAgICAgIChkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKSB8fCBkZWZpbmVkKEhBVkVfTFVUSU1FUykpCi0KLSNpZiBVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCisjaWZkZWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUwogCiBzdGF0aWMgaW50Ci11dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY2hhciAqcGF0aCkKK3V0aW1lX25vZm9sbG93X3N5bWxpbmtzKHV0aW1lX3QgKnV0LCBjb25zdCBjaGFyICpwYXRoKQogewogI2lmZGVmIEhBVkVfVVRJTUVOU0FUCiAgICAgVVRJTUVfVE9fVElNRVNQRUM7CkBAIC00NjMxLDcgKzQ3MTcsNyBAQAogI2lmbmRlZiBNU19XSU5ET1dTCiAKIHN0YXRpYyBpbnQKLXV0aW1lX2RlZmF1bHQodXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjb25zdCBjaGFyICpwYXRoKQogewogI2lmZGVmIEhBVkVfVVRJTUVOU0FUCiAgICAgVVRJTUVfVE9fVElNRVNQRUM7CkBAIC00Nzc0LDcgKzQ4NjAsNyBAQAogICAgICAgICB1dGltZS5ub3cgPSAxOwogICAgIH0KIAotI2lmICFVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCisjaWYgIWRlZmluZWQoVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUykKICAgICBpZiAoZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZCgidXRpbWUiLCBmb2xsb3dfc3ltbGlua3MpKQogICAgICAgICBnb3RvIGV4aXQ7CiAjZW5kaWYKQEAgLTQ4MjgsNyArNDkxNCw3IEBACiAjZWxzZSAvKiBNU19XSU5ET1dTICovCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKICAgICBpZiAoKCFmb2xsb3dfc3ltbGlua3MpICYmIChkaXJfZmQgPT0gREVGQVVMVF9ESVJfRkQpKQogICAgICAgICByZXN1bHQgPSB1dGltZV9ub2ZvbGxvd19zeW1saW5rcygmdXRpbWUsIHBhdGgtPm5hcnJvdyk7CiAgICAgZWxzZQpAQCAtNDkyNSw3ICs1MDExLDggQEAKICAgICBQeV9zc2l6ZV90IGksIHBvcywgZW52YzsKICAgICBQeU9iamVjdCAqa2V5cz1OVUxMLCAqdmFscz1OVUxMOwogICAgIFB5T2JqZWN0ICprZXksICp2YWwsICprZXkyLCAqdmFsMjsKLSAgICBjaGFyICpwLCAqaywgKnY7CisgICAgY2hhciAqcDsKKyAgICBjb25zdCBjaGFyICprLCAqdjsKICAgICBzaXplX3QgbGVuOwogCiAgICAgaSA9IFB5TWFwcGluZ19TaXplKGVudik7CkBAIC01MDQwLDcgKzUxMjcsNyBAQAogb3NfZXhlY3ZfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjIxZGMzNGRlZWI1YjAwNCBpbnB1dD05NjA0MTU1OTkyNWU1MjI5XSovCiB7Ci0gICAgY2hhciAqcGF0aF9jaGFyOworICAgIGNvbnN0IGNoYXIgKnBhdGhfY2hhcjsKICAgICBjaGFyICoqYXJndmxpc3Q7CiAgICAgUHlfc3NpemVfdCBhcmdjOwogCkBAIC01MTYwLDExICs1MjQ3LDExIEBACiBvc19zcGF3bnZfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgbW9kZSwgUHlPYmplY3QgKnBhdGgsIFB5T2JqZWN0ICphcmd2KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM0MjdjMGNlNDBmMTA2MzggaW5wdXQ9MDQyYzkxZGZjMWU2ZGViY10qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKKyAgICBjb25zdCBjaGFyICpwYXRoX2NoYXI7CiAgICAgY2hhciAqKmFyZ3ZsaXN0OwogICAgIGludCBpOwogICAgIFB5X3NzaXplX3QgYXJnYzsKLSAgICBQeV9pbnRwdHJfdCBzcGF3bnZhbDsKKyAgICBpbnRwdHJfdCBzcGF3bnZhbDsKICAgICBQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIAogICAgIC8qIHNwYXdudiBoYXMgdGhyZWUgYXJndW1lbnRzOiAobW9kZSwgcGF0aCwgYXJndiksIHdoZXJlCkBAIC01MjM4LDEyICs1MzI1LDEyIEBACiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVudikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYmNmYTVmN2JhMmY0MjE5IGlucHV0PTAyMzYyZmQ5Mzc5NjNmOGZdKi8KIHsKLSAgICBjaGFyICpwYXRoX2NoYXI7CisgICAgY29uc3QgY2hhciAqcGF0aF9jaGFyOwogICAgIGNoYXIgKiphcmd2bGlzdDsKICAgICBjaGFyICoqZW52bGlzdDsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IGFyZ2MsIGksIGVudmM7Ci0gICAgUHlfaW50cHRyX3Qgc3Bhd252YWw7CisgICAgaW50cHRyX3Qgc3Bhd252YWw7CiAgICAgUHlPYmplY3QgKigqZ2V0aXRlbSkoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CiAgICAgUHlfc3NpemVfdCBsYXN0YXJnID0gMDsKIApAQCAtNTc1OCwxNCArNTg0NSwxNCBAQAogICAgIHBpZDogcGlkX3QKICAgICAvCiAKLVJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuCitSZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkIChvciB0aGUgY3VycmVudCBwcm9jZXNzIGlmIHplcm8pLgogCiBUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Nfc2NoZWRfZ2V0YWZmaW5pdHlfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBwaWRfdCBwaWQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjcyNmYyYzE5M2MxN2E0ZiBpbnB1dD1lYWYxNjE5MzY4NzRiOGExXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjcyNmYyYzE5M2MxN2E0ZiBpbnB1dD05ODNjZTdjYjRhNTY1OTgwXSovCiB7CiAgICAgaW50IGNwdSwgbmNwdXMsIGNvdW50OwogICAgIHNpemVfdCBzZXRzaXplOwpAQCAtNTkyNiw3ICs2MDEzLDcgQEAKICAgICBpZiAoX1B5X3NldF9pbmhlcml0YWJsZShtYXN0ZXJfZmQsIDAsIE5VTEwpIDwgMCkKICAgICAgICAgZ290byBwb3NpeF9lcnJvcjsKIAotI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKEhBVkVfREVWX1BUQykKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoSEFWRV9ERVZfUFRDKQogICAgIGlvY3RsKHNsYXZlX2ZkLCBJX1BVU0gsICJwdGVtIik7IC8qIHB1c2ggcHRlbSAqLwogICAgIGlvY3RsKHNsYXZlX2ZkLCBJX1BVU0gsICJsZHRlcm0iKTsgLyogcHVzaCBsZHRlcm0gKi8KICNpZm5kZWYgX19ocHV4CkBAIC02MjUxLDcgKzYzMzgsNyBAQAogcG9zaXhfaW5pdGdyb3VwcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9uYW1lOwotICAgIGNoYXIgKnVzZXJuYW1lOworICAgIGNvbnN0IGNoYXIgKnVzZXJuYW1lOwogICAgIGludCByZXM7CiAjaWZkZWYgX19BUFBMRV9fCiAgICAgaW50IGdpZDsKQEAgLTY5OTgsNyArNzA4NSw3IEBACiAvKiBNUyBDIGhhcyBhIHZhcmlhbnQgb2Ygd2FpdHBpZCgpIHRoYXQncyB1c2FibGUgZm9yIG1vc3QgcHVycG9zZXMuICovCiAvKltjbGluaWMgaW5wdXRdCiBvcy53YWl0cGlkCi0gICAgcGlkOiBQeV9pbnRwdHJfdAorICAgIHBpZDogaW50cHRyX3QKICAgICBvcHRpb25zOiBpbnQKICAgICAvCiAKQEAgLTcwMTEsMTEgKzcwOTgsMTEgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLW9zX3dhaXRwaWRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9pbnRwdHJfdCBwaWQsIGludCBvcHRpb25zKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE1ZjFjZTAwNWEzNDZiMDkgaW5wdXQ9NDQ0YzhmNTFjY2E1Yjg2Ml0qLworb3Nfd2FpdHBpZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludHB0cl90IHBpZCwgaW50IG9wdGlvbnMpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmU4MzZiMjIxMjcxZDUzOCBpbnB1dD00MGYyNDQwYzUxNTQxMGY4XSovCiB7CiAgICAgaW50IHN0YXR1czsKLSAgICBQeV9pbnRwdHJfdCByZXM7CisgICAgaW50cHRyX3QgcmVzOwogICAgIGludCBhc3luY19lcnIgPSAwOwogCiAgICAgZG8gewpAQCAtNzEyNSwxNiArNzIxMiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbl9yZWFkbGluayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0gICAgd2NoYXJfdCAqcGF0aDsKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoOwogICAgIERXT1JEIG5fYnl0ZXNfcmV0dXJuZWQ7CiAgICAgRFdPUkQgaW9fcmVzdWx0OwogICAgIFB5T2JqZWN0ICpwbywgKnJlc3VsdDsKLSAgICAgICAgaW50IGRpcl9mZDsKKyAgICBpbnQgZGlyX2ZkOwogICAgIEhBTkRMRSByZXBhcnNlX3BvaW50X2hhbmRsZTsKIAotICAgIGNoYXIgdGFyZ2V0X2J1ZmZlcltNQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRV07Ci0gICAgUkVQQVJTRV9EQVRBX0JVRkZFUiAqcmRiID0gKFJFUEFSU0VfREFUQV9CVUZGRVIgKil0YXJnZXRfYnVmZmVyOwotICAgIHdjaGFyX3QgKnByaW50X25hbWU7CisgICAgY2hhciB0YXJnZXRfYnVmZmVyW19QeV9NQVhJTVVNX1JFUEFSU0VfREFUQV9CVUZGRVJfU0laRV07CisgICAgX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIgKnJkYiA9IChfUHlfUkVQQVJTRV9EQVRBX0JVRkZFUiAqKXRhcmdldF9idWZmZXI7CisgICAgY29uc3Qgd2NoYXJfdCAqcHJpbnRfbmFtZTsKIAogICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJwYXRoIiwgImRpcl9mZCIsIE5VTEx9OwogCkBAIC03MjAyLDggKzcyODksOCBAQAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKIAogLyogR3JhYiBDcmVhdGVTeW1ib2xpY0xpbmtXIGR5bmFtaWNhbGx5IGZyb20ga2VybmVsMzIgKi8KLXN0YXRpYyBEV09SRCAoQ0FMTEJBQ0sgKlB5X0NyZWF0ZVN5bWJvbGljTGlua1cpKExQV1NUUiwgTFBXU1RSLCBEV09SRCkgPSBOVUxMOwotc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rQSkoTFBTVFIsIExQU1RSLCBEV09SRCkgPSBOVUxMOworc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rVykoTFBDV1NUUiwgTFBDV1NUUiwgRFdPUkQpID0gTlVMTDsKK3N0YXRpYyBEV09SRCAoQ0FMTEJBQ0sgKlB5X0NyZWF0ZVN5bWJvbGljTGlua0EpKExQQ1NUUiwgTFBDU1RSLCBEV09SRCkgPSBOVUxMOwogCiBzdGF0aWMgaW50CiBjaGVja19DcmVhdGVTeW1ib2xpY0xpbmsodm9pZCkKQEAgLTczMDgsNyArNzM5NSw3IEBACiAKIC8qIFJldHVybiBUcnVlIGlmIHRoZSBwYXRoIGF0IHNyYyByZWxhdGl2ZSB0byBkZXN0IGlzIGEgZGlyZWN0b3J5ICovCiBzdGF0aWMgaW50Ci1fY2hlY2tfZGlyVyhXQ0hBUiAqc3JjLCBXQ0hBUiAqZGVzdCkKK19jaGVja19kaXJXKExQQ1dTVFIgc3JjLCBMUENXU1RSIGRlc3QpCiB7CiAgICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBzcmNfaW5mbzsKICAgICBXQ0hBUiBkZXN0X3BhcmVudFtNQVhfUEFUSF07CkBAIC03MzI3LDcgKzc0MTQsNyBAQAogCiAvKiBSZXR1cm4gVHJ1ZSBpZiB0aGUgcGF0aCBhdCBzcmMgcmVsYXRpdmUgdG8gZGVzdCBpcyBhIGRpcmVjdG9yeSAqLwogc3RhdGljIGludAotX2NoZWNrX2RpckEoY2hhciAqc3JjLCBjaGFyICpkZXN0KQorX2NoZWNrX2RpckEoTFBDU1RSIHNyYywgTFBDU1RSIGRlc3QpCiB7CiAgICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBzcmNfaW5mbzsKICAgICBjaGFyIGRlc3RfcGFyZW50W01BWF9QQVRIXTsKQEAgLTg0NzksOCArODU2Niw4IEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIG9rID0gQ3JlYXRlUGlwZSgmcmVhZCwgJndyaXRlLCAmYXR0ciwgMCk7CiAgICAgaWYgKG9rKSB7Ci0gICAgICAgIGZkc1swXSA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpcmVhZCwgX09fUkRPTkxZKTsKLSAgICAgICAgZmRzWzFdID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCl3cml0ZSwgX09fV1JPTkxZKTsKKyAgICAgICAgZmRzWzBdID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdClyZWFkLCBfT19SRE9OTFkpOworICAgICAgICBmZHNbMV0gPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KXdyaXRlLCBfT19XUk9OTFkpOwogICAgICAgICBpZiAoZmRzWzBdID09IC0xIHx8IGZkc1sxXSA9PSAtMSkgewogICAgICAgICAgICAgQ2xvc2VIYW5kbGUocmVhZCk7CiAgICAgICAgICAgICBDbG9zZUhhbmRsZSh3cml0ZSk7CkBAIC05MDE1LDcgKzkxMDIsNyBAQAogb3NfcHV0ZW52X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMjlhNTY3ZDZiMjMyN2QyIGlucHV0PWJhNTg2NTgxYzJlNjEwNWZdKi8KIHsKLSAgICB3Y2hhcl90ICplbnY7CisgICAgY29uc3Qgd2NoYXJfdCAqZW52OwogCiAgICAgUHlPYmplY3QgKnVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVU9JVUiLCBuYW1lLCB2YWx1ZSk7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkgewpAQCAtOTA2MSw4ICs5MTQ4LDggQEAKIHsKICAgICBQeU9iamVjdCAqYnl0ZXMgPSBOVUxMOwogICAgIGNoYXIgKmVudjsKLSAgICBjaGFyICpuYW1lX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcobmFtZSk7Ci0gICAgY2hhciAqdmFsdWVfc3RyaW5nID0gUHlCeXRlc19Bc1N0cmluZyh2YWx1ZSk7CisgICAgY29uc3QgY2hhciAqbmFtZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKG5hbWUpOworICAgIGNvbnN0IGNoYXIgKnZhbHVlX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcodmFsdWUpOwogCiAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21Gb3JtYXQoIiVzPSVzIiwgbmFtZV9zdHJpbmcsIHZhbHVlX3N0cmluZyk7CiAgICAgaWYgKGJ5dGVzID09IE5VTEwpIHsKQEAgLTkzNDAsMTcgKzk0MjcsMTcgQEAKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDAsIFB5TG9uZ19Gcm9tTG9uZygobG9uZykgc3QuZl9ic2l6ZSkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMSwgUHlMb25nX0Zyb21Mb25nKChsb25nKSBzdC5mX2Zyc2l6ZSkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgc3QuZl9ibG9ja3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9ibG9ja3MpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHN0LmZfYmZyZWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9iZnJlZSkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgc3QuZl9iYXZhaWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9iYXZhaWwpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHN0LmZfZmlsZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgc3QuZl9maWxlcykpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgc3QuZl9mZnJlZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBzdC5mX2ZmcmVlKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSBzdC5mX2ZhdmFpbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBzdC5mX2ZhdmFpbCkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgOCwgUHlMb25nX0Zyb21Mb25nKChsb25nKSBzdC5mX2ZsYWcpKTsKICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDksIFB5TG9uZ19Gcm9tTG9uZygobG9uZykgc3QuZl9uYW1lbWF4KSk7CiAjZW5kaWYKQEAgLTk0ODEsOCArOTU2OCw4IEBACiAgKiBzdWZmaWNpZW50bHkgcGVydmFzaXZlIHRoYXQgaXQncyBub3Qgd29ydGggdGhlIGxvc3Mgb2YgcmVhZGFiaWxpdHkuCiAgKi8KIHN0cnVjdCBjb25zdGRlZiB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBsb25nIHZhbHVlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHZhbHVlOwogfTsKIAogc3RhdGljIGludApAQCAtOTQ5MCw3ICs5NTc3LDEwIEBACiAgICAgICAgICAgICAgIHNpemVfdCB0YWJsZXNpemUpCiB7CiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0gICAgICAgICp2YWx1ZXAgPSBQeUxvbmdfQVNfTE9ORyhhcmcpOworICAgICAgICBpbnQgdmFsdWUgPSBfUHlMb25nX0FzSW50KGFyZyk7CisgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGVsc2UgewpAQCAtMTA0NTEsNyArMTA1NDEsNyBAQAogCiBzdGF0aWMgaW50CiBzZXR1cF9jb25mbmFtZV90YWJsZShzdHJ1Y3QgY29uc3RkZWYgKnRhYmxlLCBzaXplX3QgdGFibGVzaXplLAotICAgICAgICAgICAgICAgICAgICAgY2hhciAqdGFibGVuYW1lLCBQeU9iamVjdCAqbW9kdWxlKQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFibGVuYW1lLCBQeU9iamVjdCAqbW9kdWxlKQogewogICAgIFB5T2JqZWN0ICpkID0gTlVMTDsKICAgICBzaXplX3QgaTsKQEAgLTEwNTc4LDkgKzEwNjY4LDkgQEAKIHdpbjMyX3N0YXJ0ZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9maWxlcGF0aDsKLSAgICBjaGFyICpmaWxlcGF0aDsKLSAgICBjaGFyICpvcGVyYXRpb24gPSBOVUxMOwotICAgIHdjaGFyX3QgKndwYXRoLCAqd29wZXJhdGlvbjsKKyAgICBjb25zdCBjaGFyICpmaWxlcGF0aDsKKyAgICBjb25zdCBjaGFyICpvcGVyYXRpb24gPSBOVUxMOworICAgIGNvbnN0IHdjaGFyX3QgKndwYXRoLCAqd29wZXJhdGlvbjsKICAgICBISU5TVEFOQ0UgcmM7CiAKICAgICBQeU9iamVjdCAqdW5pcGF0aCwgKnVvcGVyYXRpb24gPSBOVUxMOwpAQCAtMTA4MjEsNyArMTA5MTEsNyBAQAogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKICAgICAgICAgc3NpemVfdCByZXN1bHQ7Ci0gICAgICAgIHN0YXRpYyBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0gezEyOCwgWEFUVFJfU0laRV9NQVgsIDB9OworICAgICAgICBzdGF0aWMgY29uc3QgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsxMjgsIFhBVFRSX1NJWkVfTUFYLCAwfTsKICAgICAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplc1tpXTsKICAgICAgICAgaWYgKCFidWZmZXJfc2l6ZSkgewogICAgICAgICAgICAgcGF0aF9lcnJvcihwYXRoKTsKQEAgLTEwOTg1LDkgKzExMDc1LDkgQEAKICAgICBuYW1lID0gcGF0aC0+bmFycm93ID8gcGF0aC0+bmFycm93IDogIi4iOwogCiAgICAgZm9yIChpID0gMDsgOyBpKyspIHsKLSAgICAgICAgY2hhciAqc3RhcnQsICp0cmFjZSwgKmVuZDsKKyAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsICp0cmFjZSwgKmVuZDsKICAgICAgICAgc3NpemVfdCBsZW5ndGg7Ci0gICAgICAgIHN0YXRpYyBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0geyAyNTYsIFhBVFRSX0xJU1RfTUFYLCAwIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0geyAyNTYsIFhBVFRSX0xJU1RfTUFYLCAwIH07CiAgICAgICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZXNbaV07CiAgICAgICAgIGlmICghYnVmZmVyX3NpemUpIHsKICAgICAgICAgICAgIC8qIEVSQU5HRSAqLwpAQCAtMTEwNzgsOCArMTExNjgsNyBAQAogICAgIGlmIChieXRlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJlc3VsdCA9IF9QeU9TX1VSYW5kb20oUHlCeXRlc19BU19TVFJJTkcoYnl0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShieXRlcykpOworICAgIHJlc3VsdCA9IF9QeU9TX1VSYW5kb20oUHlCeXRlc19BU19TVFJJTkcoYnl0ZXMpLCBQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKSk7CiAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewogICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExMTk5LDExICsxMTI4OCwxNSBAQAogb3MuY3B1X2NvdW50CiAKIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuCisKK1RoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgordXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX2NwdV9jb3VudF9pbXBsKFB5T2JqZWN0ICptb2R1bGUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NWZjMjk0NjNjMzkzNmE5YyBpbnB1dD1kNTVlMmY4ZjM4MjNhNjI4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NWZjMjk0NjNjMzkzNmE5YyBpbnB1dD1lN2M4ZjRiYTZkYmJhZGQzXSovCiB7CiAgICAgaW50IG5jcHUgPSAwOwogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTExMjg4LDE1ICsxMTM4MSwxNSBAQAogI2lmZGVmIE1TX1dJTkRPV1MKIC8qW2NsaW5pYyBpbnB1dF0KIG9zLmdldF9oYW5kbGVfaW5oZXJpdGFibGUgLT4gYm9vbAotICAgIGhhbmRsZTogUHlfaW50cHRyX3QKKyAgICBoYW5kbGU6IGludHB0cl90CiAgICAgLwogCiBHZXQgdGhlIGNsb3NlLW9uLWV4ZSBmbGFnIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgaW50Ci1vc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfaW50cHRyX3QgaGFuZGxlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTllNTM4OWIwYWEwOTE2Y2UgaW5wdXQ9NWY3NzU5NDQzYWFlM2RjNV0qLworb3NfZ2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludHB0cl90IGhhbmRsZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zNmJlNWFmY2E2ZWE4NGQ4IGlucHV0PWNmZTk5ZjljMDVjNzBhZDFdKi8KIHsKICAgICBEV09SRCBmbGFnczsKIApAQCAtMTEzMTEsNyArMTE0MDQsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBvcy5zZXRfaGFuZGxlX2luaGVyaXRhYmxlCi0gICAgaGFuZGxlOiBQeV9pbnRwdHJfdAorICAgIGhhbmRsZTogaW50cHRyX3QKICAgICBpbmhlcml0YWJsZTogYm9vbAogICAgIC8KIApAQCAtMTEzMTksOSArMTE0MTIsOSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwKK29zX3NldF9oYW5kbGVfaW5oZXJpdGFibGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnRwdHJfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaGVyaXRhYmxlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIxZTY3YmZhMzIxM2Q3NDUgaW5wdXQ9ZTY0YjJiMjczMDQ2OWRlZl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTAyMWQ3NGZlNmM5NmJhYTMgaW5wdXQ9N2E3NjQxMzkwZDgzNjRmY10qLwogewogICAgIERXT1JEIGZsYWdzID0gaW5oZXJpdGFibGUgPyBIQU5ETEVfRkxBR19JTkhFUklUIDogMDsKICAgICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKChIQU5ETEUpaGFuZGxlLCBIQU5ETEVfRkxBR19JTkhFUklULCBmbGFncykpIHsKQEAgLTExNDYwLDcgKzExNTUzLDcgQEAKICAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OwogCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIHdjaGFyX3QgKnBhdGg7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aDsKIAogICAgIHBhdGggPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNlbGYtPnBhdGgpOwogICAgIGlmICghcGF0aCkKQEAgLTExNDc3LDcgKzExNTcwLDcgQEAKICAgICB9CiAjZWxzZSAvKiBQT1NJWCAqLwogICAgIFB5T2JqZWN0ICpieXRlczsKLSAgICBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAKICAgICBpZiAoIVB5VW5pY29kZV9GU0NvbnZlcnRlcihzZWxmLT5wYXRoLCAmYnl0ZXMpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNjYxLDcgKzExNzU0LDcgQEAKIHsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKCFzZWxmLT5nb3RfZmlsZV9pbmRleCkgewotICAgICAgICB3Y2hhcl90ICpwYXRoOworICAgICAgICBjb25zdCB3Y2hhcl90ICpwYXRoOwogICAgICAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0YXQ7CiAKICAgICAgICAgcGF0aCA9IFB5VW5pY29kZV9Bc1VuaWNvZGUoc2VsZi0+cGF0aCk7CkBAIC0xMTY3NiwxMCArMTE3NjksMTAgQEAKICAgICAgICAgc2VsZi0+d2luMzJfZmlsZV9pbmRleCA9IHN0YXQuc3RfaW5vOwogICAgICAgICBzZWxmLT5nb3RfZmlsZV9pbmRleCA9IDE7CiAgICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpc2VsZi0+d2luMzJfZmlsZV9pbmRleCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZylzZWxmLT53aW4zMl9maWxlX2luZGV4KTsKICNlbHNlIC8qIFBPU0lYICovCiAjaWZkZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVAotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpc2VsZi0+ZF9pbm8pOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpc2VsZi0+ZF9pbm8pOwogI2Vsc2UKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKXNlbGYtPmRfaW5vKTsKICNlbmRpZgpAQCAtMTE2OTIsNiArMTE3ODUsMTMgQEAKICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIjxEaXJFbnRyeSAlUj4iLCBzZWxmLT5uYW1lKTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK0RpckVudHJ5X2ZzcGF0aChEaXJFbnRyeSAqc2VsZikKK3sKKyAgICBQeV9JTkNSRUYoc2VsZi0+cGF0aCk7CisgICAgcmV0dXJuIHNlbGYtPnBhdGg7Cit9CisKIHN0YXRpYyBQeU1lbWJlckRlZiBEaXJFbnRyeV9tZW1iZXJzW10gPSB7CiAgICAgeyJuYW1lIiwgVF9PQkpFQ1RfRVgsIG9mZnNldG9mKERpckVudHJ5LCBuYW1lKSwgUkVBRE9OTFksCiAgICAgICJ0aGUgZW50cnkncyBiYXNlIGZpbGVuYW1lLCByZWxhdGl2ZSB0byBzY2FuZGlyKCkgXCJwYXRoXCIgYXJndW1lbnQifSwKQEAgLTExNzE2LDYgKzExODE2LDkgQEAKICAgICB7Imlub2RlIiwgKFB5Q0Z1bmN0aW9uKURpckVudHJ5X2lub2RlLCBNRVRIX05PQVJHUywKICAgICAgInJldHVybiBpbm9kZSBvZiB0aGUgZW50cnk7IGNhY2hlZCBwZXIgZW50cnkiLAogICAgIH0sCisgICAgeyJfX2ZzcGF0aF9fIiwgKFB5Q0Z1bmN0aW9uKURpckVudHJ5X2ZzcGF0aCwgTUVUSF9OT0FSR1MsCisgICAgICJyZXR1cm5zIHRoZSBwYXRoIGZvciB0aGUgZW50cnkiLAorICAgIH0sCiAgICAge05VTEx9CiB9OwogCkBAIC0xMTc1NSw3ICsxMTg1OCw3IEBACiAjaWZkZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgd2NoYXJfdCAqCi1qb2luX3BhdGhfZmlsZW5hbWVXKHdjaGFyX3QgKnBhdGhfd2lkZSwgd2NoYXJfdCogZmlsZW5hbWUpCitqb2luX3BhdGhfZmlsZW5hbWVXKGNvbnN0IHdjaGFyX3QgKnBhdGhfd2lkZSwgY29uc3Qgd2NoYXJfdCAqZmlsZW5hbWUpCiB7CiAgICAgUHlfc3NpemVfdCBwYXRoX2xlbjsKICAgICBQeV9zc2l6ZV90IHNpemU7CkBAIC0xMTgzMCw3ICsxMTkzMyw3IEBACiAjZWxzZSAvKiBQT1NJWCAqLwogCiBzdGF0aWMgY2hhciAqCi1qb2luX3BhdGhfZmlsZW5hbWUoY2hhciAqcGF0aF9uYXJyb3csIGNoYXIqIGZpbGVuYW1lLCBQeV9zc2l6ZV90IGZpbGVuYW1lX2xlbikKK2pvaW5fcGF0aF9maWxlbmFtZShjb25zdCBjaGFyICpwYXRoX25hcnJvdywgY29uc3QgY2hhciogZmlsZW5hbWUsIFB5X3NzaXplX3QgZmlsZW5hbWVfbGVuKQogewogICAgIFB5X3NzaXplX3QgcGF0aF9sZW47CiAgICAgUHlfc3NpemVfdCBzaXplOwpAQCAtMTE4NjIsNyArMTE5NjUsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotRGlyRW50cnlfZnJvbV9wb3NpeF9pbmZvKHBhdGhfdCAqcGF0aCwgY2hhciAqbmFtZSwgUHlfc3NpemVfdCBuYW1lX2xlbiwKK0RpckVudHJ5X2Zyb21fcG9zaXhfaW5mbyhwYXRoX3QgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbmFtZV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5vX3QgZF9pbm8KICNpZmRlZiBIQVZFX0RJUkVOVF9EX1RZUEUKICAgICAgICAgICAgICAgICAgICAgICAgICAsIHVuc2lnbmVkIGNoYXIgZF90eXBlCkBAIC0xMTkyNSw4ICsxMjAyOCwxNCBAQAogCiAjaWZkZWYgTVNfV0lORE9XUwogCitzdGF0aWMgaW50CitTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgcmV0dXJuIGl0ZXJhdG9yLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKIHN0YXRpYyB2b2lkCi1TY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQogewogICAgIEhBTkRMRSBoYW5kbGUgPSBpdGVyYXRvci0+aGFuZGxlOwogCkBAIC0xMTk0Niw3ICsxMjA1NSw3IEBACiAgICAgQk9PTCBzdWNjZXNzOwogICAgIFB5T2JqZWN0ICplbnRyeTsKIAotICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlICovCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UsIG9yIGNsb3NlZCBleHBsaWNpdGx5ICovCiAgICAgaWYgKGl0ZXJhdG9yLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xMTk3NywxNCArMTIwODYsMjAgQEAKICAgICB9CiAKICAgICAvKiBFcnJvciBvciBubyBtb3JlIGZpbGVzICovCi0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOwogICAgIHJldHVybiBOVUxMOwogfQogCiAjZWxzZSAvKiBQT1NJWCAqLwogCitzdGF0aWMgaW50CitTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgcmV0dXJuICFpdGVyYXRvci0+ZGlycDsKK30KKwogc3RhdGljIHZvaWQKLVNjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQorU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCiB7CiAgICAgRElSICpkaXJwID0gaXRlcmF0b3ItPmRpcnA7CiAKQEAgLTEyMDA2LDcgKzEyMTIxLDcgQEAKICAgICBpbnQgaXNfZG90OwogICAgIFB5T2JqZWN0ICplbnRyeTsKIAotICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlICovCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UsIG9yIGNsb3NlZCBleHBsaWNpdGx5ICovCiAgICAgaWYgKCFpdGVyYXRvci0+ZGlycCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTEyMDQzLDIxICsxMjE1OCw3NiBAQAogICAgIH0KIAogICAgIC8qIEVycm9yIG9yIG5vIG1vcmUgZmlsZXMgKi8KLSAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihpdGVyYXRvcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbmRpZgogCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKFNjYW5kaXJJdGVyYXRvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKHNlbGYpOworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2VudGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitTY2FuZGlySXRlcmF0b3JfZXhpdChTY2FuZGlySXRlcmF0b3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihzZWxmKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIHZvaWQKK1NjYW5kaXJJdGVyYXRvcl9maW5hbGl6ZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworCisgICAgaWYgKCFTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKGl0ZXJhdG9yKSkgeworICAgICAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOworCisgICAgICAgIGlmIChQeUVycl9SZXNvdXJjZVdhcm5pbmcoKFB5T2JqZWN0ICopaXRlcmF0b3IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuY2xvc2VkIHNjYW5kaXIgaXRlcmF0b3IgJVIiLCBpdGVyYXRvcikpIHsKKyAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgaXRlcmF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUHlfQ0xFQVIoaXRlcmF0b3ItPnBhdGgub2JqZWN0KTsKKyAgICBwYXRoX2NsZWFudXAoJml0ZXJhdG9yLT5wYXRoKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworfQorCiBzdGF0aWMgdm9pZAogU2NhbmRpckl0ZXJhdG9yX2RlYWxsb2MoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKIHsKLSAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOwotICAgIFB5X1hERUNSRUYoaXRlcmF0b3ItPnBhdGgub2JqZWN0KTsKLSAgICBwYXRoX2NsZWFudXAoJml0ZXJhdG9yLT5wYXRoKTsKKyAgICBpZiAoUHlPYmplY3RfQ2FsbEZpbmFsaXplckZyb21EZWFsbG9jKChQeU9iamVjdCAqKWl0ZXJhdG9yKSA8IDApCisgICAgICAgIHJldHVybjsKKwogICAgIFB5X1RZUEUoaXRlcmF0b3IpLT50cF9mcmVlKChQeU9iamVjdCAqKWl0ZXJhdG9yKTsKIH0KIAorc3RhdGljIFB5TWV0aG9kRGVmIFNjYW5kaXJJdGVyYXRvcl9tZXRob2RzW10gPSB7CisgICAgeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pU2NhbmRpckl0ZXJhdG9yX2VudGVyLCBNRVRIX05PQVJHU30sCisgICAgeyJfX2V4aXRfXyIsIChQeUNGdW5jdGlvbilTY2FuZGlySXRlcmF0b3JfZXhpdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKVNjYW5kaXJJdGVyYXRvcl9jbG9zZSwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMfQorfTsKKwogc3RhdGljIFB5VHlwZU9iamVjdCBTY2FuZGlySXRlcmF0b3JUeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgIE1PRE5BTUUgIi5TY2FuZGlySXRlcmF0b3IiLCAgICAgICAgICAgICAvKiB0cF9uYW1lICovCkBAIC0xMjA3OSw3ICsxMjI0OSw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVAorICAgICAgICB8IFB5X1RQRkxBR1NfSEFWRV9GSU5BTElaRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTEyMDg3LDYgKzEyMjU4LDI3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKVNjYW5kaXJJdGVyYXRvcl9pdGVybmV4dCwgLyogdHBfaXRlcm5leHQgKi8KKyAgICBTY2FuZGlySXRlcmF0b3JfbWV0aG9kcywgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCisgICAgKGRlc3RydWN0b3IpU2NhbmRpckl0ZXJhdG9yX2ZpbmFsaXplLCAgIC8qIHRwX2ZpbmFsaXplICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTIwOTcsNyArMTIyODksNyBAQAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICB3Y2hhcl90ICpwYXRoX3N0clc7CiAjZWxzZQotICAgIGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqcGF0aDsKICNlbmRpZgogCiAgICAgaXRlcmF0b3IgPSBQeU9iamVjdF9OZXcoU2NhbmRpckl0ZXJhdG9yLCAmU2NhbmRpckl0ZXJhdG9yVHlwZSk7CkBAIC0xMjE2OSw2ICsxMjM2MSwxMjQgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorLyoKKyAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKworICAgIElmIHRoZSBvYmplY3QgaXMgc3RyIG9yIGJ5dGVzLCB0aGVuIGFsbG93IGl0IHRvIHBhc3MgdGhyb3VnaCB3aXRoCisgICAgYW4gaW5jcmVtZW50ZWQgcmVmY291bnQuIElmIHRoZSBvYmplY3QgZGVmaW5lcyBfX2ZzcGF0aF9fKCksIHRoZW4KKyAgICByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0IG1ldGhvZC4gQWxsIG90aGVyIHR5cGVzIHJhaXNlIGEgVHlwZUVycm9yLgorKi8KK1B5T2JqZWN0ICoKK1B5T1NfRlNQYXRoKFB5T2JqZWN0ICpwYXRoKQoreworICAgIC8qIEZvciBlcnJvciBtZXNzYWdlIHJlYXNvbnMsIHRoaXMgZnVuY3Rpb24gaXMgbWFudWFsbHkgaW5saW5lZCBpbgorICAgICAgIHBhdGhfY29udmVydGVyKCkuICovCisgICAgX1B5X0lERU5USUZJRVIoX19mc3BhdGhfXyk7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpwYXRoX3JlcHIgPSBOVUxMOworCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhwYXRoKSB8fCBQeUJ5dGVzX0NoZWNrKHBhdGgpKSB7CisgICAgICAgIFB5X0lOQ1JFRihwYXRoKTsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgZnVuYyA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKHBhdGgsICZQeUlkX19fZnNwYXRoX18pOworICAgIGlmIChOVUxMID09IGZ1bmMpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0ciwgYnl0ZXMgb3Igb3MuUGF0aExpa2Ugb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocGF0aCktPnRwX25hbWUpOworICAgIH0KKworICAgIHBhdGhfcmVwciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIGlmIChOVUxMID09IHBhdGhfcmVwcikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShQeVVuaWNvZGVfQ2hlY2socGF0aF9yZXByKSB8fCBQeUJ5dGVzX0NoZWNrKHBhdGhfcmVwcikpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJS4yMDBzLl9fZnNwYXRoX18oKSB0byByZXR1cm4gc3RyIG9yIGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsIFB5X1RZUEUocGF0aCktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHBhdGhfcmVwciktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocGF0aF9yZXByKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBhdGhfcmVwcjsKK30KKworLypbY2xpbmljIGlucHV0XQorb3MuZnNwYXRoCisKKyAgICBwYXRoOiBvYmplY3QKKworUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisKK0lmIHRoZSBvYmplY3QgaXMgc3RyIG9yIGJ5dGVzLCB0aGVuIGFsbG93IGl0IHRvIHBhc3MgdGhyb3VnaCBhcy1pcy4gSWYgdGhlCitvYmplY3QgZGVmaW5lcyBfX2ZzcGF0aF9fKCksIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdCBtZXRob2QuIEFsbCBvdGhlcgordHlwZXMgcmFpc2UgYSBUeXBlRXJyb3IuCitbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19mc3BhdGhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcGF0aCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jM2MzYjc4ZWNmZjI5MTRmIGlucHV0PWUzNTcxNjVmN2IyMjQ5MGZdKi8KK3sKKyAgICByZXR1cm4gUHlPU19GU1BhdGgocGF0aCk7Cit9CisKKyNpZmRlZiBIQVZFX0dFVFJBTkRPTV9TWVNDQUxMCisvKltjbGluaWMgaW5wdXRdCitvcy5nZXRyYW5kb20KKworICAgIHNpemU6IFB5X3NzaXplX3QKKyAgICBmbGFnczogaW50PTAKKworT2J0YWluIGEgc2VyaWVzIG9mIHJhbmRvbSBieXRlcy4KK1tjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK29zX2dldHJhbmRvbV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIzYTYxODE5NmE2MTQwOWMgaW5wdXQ9NTliYWZhYzM5YzU5NDk0N10qLworeworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKmJ5dGVzOworCisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKKyAgICB9CisKKyAgICBidWZmZXIgPSBQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIG4gPSBzeXNjYWxsKFNZU19nZXRyYW5kb20sIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworICAgICAgICBpZiAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChuIDwgMCkgeworICAgICAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbik7CisgICAgUHlNZW1fRnJlZShidWZmZXIpOworCisgICAgcmV0dXJuIGJ5dGVzOworfQorI2VuZGlmICAgLyogSEFWRV9HRVRSQU5ET01fU1lTQ0FMTCAqLwogCiAjaW5jbHVkZSAiY2xpbmljL3Bvc2l4bW9kdWxlLmMuaCIKIApAQCAtMTIzNjksNiArMTI2NzksOCBAQAogICAgIHsic2NhbmRpciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvc2l4X3NjYW5kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXhfc2NhbmRpcl9fZG9jX199LAorICAgIE9TX0ZTUEFUSF9NRVRIT0RERUYKKyAgICBPU19HRVRSQU5ET01fTUVUSE9EREVGCiAgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCkBAIC0xMjM4MCw3ICsxMjY5Miw2IEBACiAgICAgSEFORExFIHRvazsKICAgICBUT0tFTl9QUklWSUxFR0VTIHRva19wcml2OwogICAgIExVSUQgbHVpZDsKLSAgICBpbnQgbWV0aF9pZHggPSAwOwogCiAgICAgaWYgKCFPcGVuUHJvY2Vzc1Rva2VuKEdldEN1cnJlbnRQcm9jZXNzKCksIFRPS0VOX0FMTF9BQ0NFU1MsICZ0b2spKQogICAgICAgICByZXR1cm4gMDsKQEAgLTEyNDgzLDEyICsxMjc5NCwxNCBAQAogI2lmZGVmIE9fTEFSR0VGSUxFCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE9fTEFSR0VGSUxFKSkgcmV0dXJuIC0xOwogI2VuZGlmCisjaWZuZGVmIF9fR05VX18KICNpZmRlZiBPX1NITE9DSwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBPX1NITE9DSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fRVhMT0NLCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE9fRVhMT0NLKSkgcmV0dXJuIC0xOwogI2VuZGlmCisjZW5kaWYKICNpZmRlZiBPX0VYRUMKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19FWEVDKSkgcmV0dXJuIC0xOwogI2VuZGlmCkBAIC0xMjc5MSwyOCArMTMxMDQsMzMgQEAKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgWEFUVFJfU0laRV9NQVgpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAotI2lmZGVmIFJUTERfTEFaWQorI2lmIEhBVkVfREVDTF9SVExEX0xBWlkKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9MQVpZKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9OT1cKKyNpZiBIQVZFX0RFQ0xfUlRMRF9OT1cKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9OT1cpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX0dMT0JBTAorI2lmIEhBVkVfREVDTF9SVExEX0dMT0JBTAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX0dMT0JBTCkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfTE9DQUwKKyNpZiBIQVZFX0RFQ0xfUlRMRF9MT0NBTAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX0xPQ0FMKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9OT0RFTEVURQorI2lmIEhBVkVfREVDTF9SVExEX05PREVMRVRFCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTk9ERUxFVEUpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX05PTE9BRAorI2lmIEhBVkVfREVDTF9SVExEX05PTE9BRAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX05PTE9BRCkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfREVFUEJJTkQKKyNpZiBIQVZFX0RFQ0xfUlRMRF9ERUVQQklORAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX0RFRVBCSU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKKyNpZmRlZiBIQVZFX0dFVFJBTkRPTV9TWVNDQUxMCisgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEdSTkRfUkFORE9NKSkgcmV0dXJuIC0xOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBHUk5EX05PTkJMT0NLKSkgcmV0dXJuIC0xOworI2VuZGlmCisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTI4MzAsNyArMTMxNDgsNyBAQAogfTsKIAogCi1zdGF0aWMgY2hhciAqaGF2ZV9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGF2ZV9mdW5jdGlvbnNbXSA9IHsKIAogI2lmZGVmIEhBVkVfRkFDQ0VTU0FUCiAgICAgIkhBVkVfRkFDQ0VTU0FUIiwKQEAgLTEyOTY1LDcgKzEzMjgzLDcgQEAKIHsKICAgICBQeU9iamVjdCAqbSwgKnY7CiAgICAgUHlPYmplY3QgKmxpc3Q7Ci0gICAgY2hhciAqKnRyYWNlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdHJhY2U7CiAKICNpZiBkZWZpbmVkKEhBVkVfU1lNTElOSykgJiYgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIHdpbjMyX2Nhbl9zeW1saW5rID0gZW5hYmxlX3N5bWxpbmsoKTsKQEAgLTEzMTQxLDYgKzEzNDU5LDkgQEAKICAgICB9CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfaGF2ZV9mdW5jdGlvbnMiLCBsaXN0KTsKIAorICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikgJkRpckVudHJ5VHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaXJFbnRyeSIsIChQeU9iamVjdCAqKSZEaXJFbnRyeVR5cGUpOworCiAgICAgaW5pdGlhbGl6ZWQgPSAxOwogCiAgICAgcmV0dXJuIG07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B3ZG1vZHVsZS5jIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwppbmRleCA3NDE2Y2Y3Li43ODRlOWQwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKQEAgLTc1LDEwICs3NSwxOCBAQAogI2RlZmluZSBTRVRTKGksdmFsKSBzZXRzKHYsIGksIHZhbCkKIAogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfbmFtZSk7CisjaWYgZGVmaW5lZChIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dEKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3Bhc3N3ZCk7CisjZWxzZQorICAgIFNFVFMoc2V0SW5kZXgrKywgIiIpOworI2VuZGlmCiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBzZXRJbmRleCsrLCBfUHlMb25nX0Zyb21VaWQocC0+cHdfdWlkKSk7CiAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBzZXRJbmRleCsrLCBfUHlMb25nX0Zyb21HaWQocC0+cHdfZ2lkKSk7CisjaWYgZGVmaW5lZChIQVZFX1NUUlVDVF9QQVNTV0RfUFdfR0VDT1MpCiAgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19nZWNvcyk7CisjZWxzZQorICAgIFNFVFMoc2V0SW5kZXgrKywgIiIpOworI2VuZGlmCiAgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19kaXIpOwogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfc2hlbGwpOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B5ZXhwYXQuYyBiL01vZHVsZXMvcHlleHBhdC5jCmluZGV4IGViMzIyYzIuLmRjOTdlOWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHlleHBhdC5jCisrKyBiL01vZHVsZXMvcHlleHBhdC5jCkBAIC05MSw3ICs5MSw3IEBACiAgKiBmYWxzZSBvbiBhbiBleGNlcHRpb24uCiAgKi8KIHN0YXRpYyBpbnQKLXNldF9lcnJvcl9hdHRyKFB5T2JqZWN0ICplcnIsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKK3NldF9lcnJvcl9hdHRyKFB5T2JqZWN0ICplcnIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKIHsKICAgICBQeU9iamVjdCAqdiA9IFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiAKQEAgLTIxOCw3ICsyMTgsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1jYWxsX3dpdGhfZnJhbWUoY2hhciAqZnVuY25hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0KiBmdW5jLCBQeU9iamVjdCogYXJncywKK2NhbGxfd2l0aF9mcmFtZShjb25zdCBjaGFyICpmdW5jbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QqIGZ1bmMsIFB5T2JqZWN0KiBhcmdzLAogICAgICAgICAgICAgICAgIHhtbHBhcnNlb2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpyZXM7CkBAIC03NDcsNyArNzQ3LDggQEAKICAgICAgICAgcyArPSBNQVhfQ0hVTktfU0laRTsKICAgICAgICAgc2xlbiAtPSBNQVhfQ0hVTktfU0laRTsKICAgICB9Ci0gICAgYXNzZXJ0KE1BWF9DSFVOS19TSVpFIDwgSU5UX01BWCAmJiBzbGVuIDwgSU5UX01BWCk7CisgICAgUHlfQlVJTERfQVNTRVJUKE1BWF9DSFVOS19TSVpFIDw9IElOVF9NQVgpOworICAgIGFzc2VydChzbGVuIDw9IElOVF9NQVgpOwogICAgIHJjID0gWE1MX1BhcnNlKHNlbGYtPml0c2VsZiwgcywgKGludClzbGVuLCBpc2ZpbmFsKTsKIAogZG9uZToKQEAgLTc2NSw3ICs3NjYsNyBAQAogewogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgUHlfc3NpemVfdCBsZW47Ci0gICAgY2hhciAqcHRyOworICAgIGNvbnN0IGNoYXIgKnB0cjsKIAogICAgIHN0ciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihtZXRoLCAibiIsIGJ1Zl9zaXplKTsKICAgICBpZiAoc3RyID09IE5VTEwpCkBAIC0xMjI1LDEyICsxMjI2LDggQEAKICAgICBzZWxmLT5pdHNlbGYgPSBOVUxMOwogCiAgICAgaWYgKHNlbGYtPmhhbmRsZXJzICE9IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewotICAgICAgICAgICAgdGVtcCA9IHNlbGYtPmhhbmRsZXJzW2ldOwotICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwotICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgIFB5TWVtX0ZyZWUoc2VsZi0+aGFuZGxlcnMpOwogICAgICAgICBzZWxmLT5oYW5kbGVycyA9IE5VTEw7CiAgICAgfQpAQCAtMTM0NCw3ICsxMzQxLDYgQEAKICAgICBpbnQgaGFuZGxlcm51bSA9IGhhbmRsZXJuYW1lMmludChuYW1lKTsKICAgICBpZiAoaGFuZGxlcm51bSA+PSAwKSB7CiAgICAgICAgIHhtbGhhbmRsZXIgY19oYW5kbGVyID0gTlVMTDsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmLT5oYW5kbGVyc1toYW5kbGVybnVtXTsKIAogICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7CiAgICAgICAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyLCBhbmQgYSBjaGFyYWN0ZXIKQEAgLTEzNjYsOCArMTM2Miw3IEBACiAgICAgICAgICAgICBQeV9JTkNSRUYodik7CiAgICAgICAgICAgICBjX2hhbmRsZXIgPSBoYW5kbGVyX2luZm9baGFuZGxlcm51bV0uaGFuZGxlcjsKICAgICAgICAgfQotICAgICAgICBzZWxmLT5oYW5kbGVyc1toYW5kbGVybnVtXSA9IHY7Ci0gICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgIFB5X1hTRVRSRUYoc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV0sIHYpOwogICAgICAgICBoYW5kbGVyX2luZm9baGFuZGxlcm51bV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgY19oYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpAQCAtMTg5NywxNSArMTg5MiwxMiBAQAogY2xlYXJfaGFuZGxlcnMoeG1scGFyc2VvYmplY3QgKnNlbGYsIGludCBpbml0aWFsKQogewogICAgIGludCBpID0gMDsKLSAgICBQeU9iamVjdCAqdGVtcDsKIAogICAgIGZvciAoOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKICAgICAgICAgaWYgKGluaXRpYWwpCiAgICAgICAgICAgICBzZWxmLT5oYW5kbGVyc1tpXSA9IE5VTEw7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGVtcCA9IHNlbGYtPmhhbmRsZXJzW2ldOwotICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwotICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKHNlbGYtPmhhbmRsZXJzW2ldKTsKICAgICAgICAgICAgIGhhbmRsZXJfaW5mb1tpXS5zZXR0ZXIoc2VsZi0+aXRzZWxmLCBOVUxMKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVhZGxpbmUuYyBiL01vZHVsZXMvcmVhZGxpbmUuYwppbmRleCA1NGYxNWJjLi4zYjk0ZDRhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3JlYWRsaW5lLmMKKysrIGIvTW9kdWxlcy9yZWFkbGluZS5jCkBAIC0zNDMsMTAgKzM0Myw4IEBACiAgICAgICAgIFB5X0NMRUFSKCpob29rX3Zhcik7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5Q2FsbGFibGVfQ2hlY2soZnVuY3Rpb24pKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXAgPSAqaG9va192YXI7CiAgICAgICAgIFB5X0lOQ1JFRihmdW5jdGlvbik7Ci0gICAgICAgICpob29rX3ZhciA9IGZ1bmN0aW9uOwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIFB5X1hTRVRSRUYoKmhvb2tfdmFyLCBmdW5jdGlvbik7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLApAQCAtNjA0LDYgKzYwMiwyNCBAQAogImFkZF9oaXN0b3J5KHN0cmluZykgLT4gTm9uZVxuXAogYWRkIGFuIGl0ZW0gdG8gdGhlIGhpc3RvcnkgYnVmZmVyIik7CiAKK3N0YXRpYyBpbnQgc2hvdWxkX2F1dG9fYWRkX2hpc3RvcnkgPSAxOworCisvKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbWF0aWMgaGlzdG9yeSAqLworCitzdGF0aWMgUHlPYmplY3QgKgorcHlfc2V0X2F1dG9faGlzdG9yeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJwOnNldF9hdXRvX2hpc3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkX2F1dG9fYWRkX2hpc3RvcnkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworUHlEb2NfU1RSVkFSKGRvY19zZXRfYXV0b19oaXN0b3J5LAorInNldF9hdXRvX2hpc3RvcnkoZW5hYmxlZCkgLT4gTm9uZVxuXAorRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgaGlzdG9yeS4iKTsKKwogCiAvKiBHZXQgdGhlIHRhYi1jb21wbGV0aW9uIHdvcmQtZGVsaW1pdGVycyB0aGF0IHJlYWRsaW5lIHVzZXMgKi8KIApAQCAtODIyLDYgKzgzOCw3IEBACiAKICAgICB7InNldF9jb21wbGV0ZXJfZGVsaW1zIiwgc2V0X2NvbXBsZXRlcl9kZWxpbXMsCiAgICAgIE1FVEhfTywgZG9jX3NldF9jb21wbGV0ZXJfZGVsaW1zfSwKKyAgICB7InNldF9hdXRvX2hpc3RvcnkiLCBweV9zZXRfYXV0b19oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfYXV0b19oaXN0b3J5fSwKICAgICB7ImFkZF9oaXN0b3J5IiwgcHlfYWRkX2hpc3RvcnksIE1FVEhfTywgZG9jX2FkZF9oaXN0b3J5fSwKICAgICB7InJlbW92ZV9oaXN0b3J5X2l0ZW0iLCBweV9yZW1vdmVfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVtb3ZlX2hpc3Rvcnl9LAogICAgIHsicmVwbGFjZV9oaXN0b3J5X2l0ZW0iLCBweV9yZXBsYWNlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlcGxhY2VfaGlzdG9yeX0sCkBAIC04NTcsNyArODc0LDcgQEAKICAgICAgICAgaWYgKHIgPT0gUHlfTm9uZSkKICAgICAgICAgICAgIHJlc3VsdCA9IDA7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gUHlMb25nX0FzTG9uZyhyKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9QeUxvbmdfQXNJbnQocik7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMTMyNyw3ICsxMzQ0LDcgQEAKIAogICAgIC8qIHdlIGhhdmUgYSB2YWxpZCBsaW5lICovCiAgICAgbiA9IHN0cmxlbihwKTsKLSAgICBpZiAobiA+IDApIHsKKyAgICBpZiAoc2hvdWxkX2F1dG9fYWRkX2hpc3RvcnkgJiYgbiA+IDApIHsKICAgICAgICAgY29uc3QgY2hhciAqbGluZTsKICAgICAgICAgaW50IGxlbmd0aCA9IF9weV9nZXRfaGlzdG9yeV9sZW5ndGgoKTsKICAgICAgICAgaWYgKGxlbmd0aCA+IDApCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Jlc291cmNlLmMgYi9Nb2R1bGVzL3Jlc291cmNlLmMKaW5kZXggM2ExY2YwOS4uNjcwMmI3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZXNvdXJjZS5jCisrKyBiL01vZHVsZXMvcmVzb3VyY2UuYwpAQCAtMTM1LDEzICsxMzUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHJsaW1pdDJweShzdHJ1Y3QgcmxpbWl0IHJsKQogewotI2lmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpCiAgICAgaWYgKHNpemVvZihybC5ybGltX2N1cikgPiBzaXplb2YobG9uZykpIHsKICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkxMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBZX0xPTkdfTE9ORykgcmwucmxpbV9jdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgcmwucmxpbV9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHJsLnJsaW1fbWF4KTsKICAgICB9Ci0jZW5kaWYKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZykgcmwucmxpbV9jdXIsIChsb25nKSBybC5ybGltX21heCk7CiB9CiAKQEAgLTQzOCwxMSArNDM2LDkgQEAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSTElNSVRfTlBUUyk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpCiAgICAgaWYgKHNpemVvZihSTElNX0lORklOSVRZKSA+IHNpemVvZihsb25nKSkgewotICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSBSTElNX0lORklOSVRZKTsKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgUkxJTV9JTkZJTklUWSk7CiAgICAgfSBlbHNlCi0jZW5kaWYKICAgICB7CiAgICAgICAgIHYgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpIFJMSU1fSU5GSU5JVFkpOwogICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCmluZGV4IDAwMzI0YTUuLjQ5ZmExZjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwpAQCAtNCw2ICs0LDEwIEBACiAgICBoYXZlIGFueSB2YWx1ZSBleGNlcHQgSU5WQUxJRF9TT0NLRVQuCiAqLwogCisjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkgJiYgIWRlZmluZWQoX0dOVV9TT1VSQ0UpCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPgogCkBAIC0xNzkzLDcgKzE3OTcsNyBAQAogICovCiAjaWYgIWRlZmluZWQoX19PcGVuQlNEX18pCiAjICAgZGVmaW5lIElERU5UX1RZUEUgIFRfVUlOVFBUUlQKLSMgICBkZWZpbmUgSURFTlRfQ0FTVCAgUHlfaW50cHRyX3QKKyMgICBkZWZpbmUgSURFTlRfQ0FTVCAgaW50cHRyX3QKICMgICBkZWZpbmUgREFUQV9UWVBFICAgVF9JTlRQVFJUCiAjICAgZGVmaW5lIERBVEFfRk1UX1VOSVQgSU5UUFRSVF9GTVRfVU5JVAogIyAgIGRlZmluZSBJREVOVF9Bc1R5cGUgUHlMb25nX0FzVWludHB0cl90CkBAIC0xODQyLDcgKzE4NDYsNyBAQAogICAgIFB5T2JqZWN0ICpwZmQ7CiAgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpZGVudCIsICJmaWx0ZXIiLCAiZmxhZ3MiLCAiZmZsYWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiLCAidWRhdGEiLCBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gIk98aEhJIiBEQVRBX0ZNVF9VTklUIFVJTlRQVFJUX0ZNVF9VTklUICI6a2V2ZW50IjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJPfGhISSIgREFUQV9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CiAKICAgICBFVl9TRVQoJihzZWxmLT5lKSwgMCwgRVZGSUxUX1JFQUQsIEVWX0FERCwgMCwgMCwgMCk7IC8qIGRlZmF1bHRzICovCiAKQEAgLTE4NzIsNyArMTg3Niw3IEBACiBrcXVldWVfZXZlbnRfcmljaGNvbXBhcmUoa3F1ZXVlX2V2ZW50X09iamVjdCAqcywga3F1ZXVlX2V2ZW50X09iamVjdCAqbywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ApCiB7Ci0gICAgUHlfaW50cHRyX3QgcmVzdWx0ID0gMDsKKyAgICBpbnRwdHJfdCByZXN1bHQgPSAwOwogCiAgICAgaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2sobykpIHsKICAgICAgICAgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7CkBAIC0yMTI3LDcgKzIxMzEsNyBAQAogICAgICAgICBpZiAoX1B5VGltZV9Gcm9tU2Vjb25kc09iamVjdCgmdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RpbWVvdXQsIF9QeVRpbWVfUk9VTkRfQ0VJTElORykgPCAwKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICJ0aW1lb3V0IGFyZ3VtZW50IG11c3QgYmUgYW4gbnVtYmVyICIKKyAgICAgICAgICAgICAgICAidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyICIKICAgICAgICAgICAgICAgICAib3IgTm9uZSwgZ290ICUuMjAwcyIsCiAgICAgICAgICAgICAgICAgUHlfVFlQRShvdGltZW91dCktPnRwX25hbWUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNDUyLDYgKzI0NTYsMTAgQEAKICNpZmRlZiBQT0xMTVNHCiAgICAgICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFBPTExNU0cpOwogI2VuZGlmCisjaWZkZWYgUE9MTFJESFVQCisgICAgICAgIC8qIEtlcm5lbCAyLjYuMTcrICovCisgICAgICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFBPTExSREhVUCk7CisjZW5kaWYKICAgICB9CiAjZW5kaWYgLyogSEFWRV9QT0xMICovCiAKQEAgLTI0NzMsMTIgKzI0ODEsMTggQEAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTFBSSSk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgRVBPTExFUlIpOwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMSFVQKTsKKyNpZmRlZiBFUE9MTFJESFVQCisgICAgLyogS2VybmVsIDIuNi4xNyAqLworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMUkRIVVApOworI2VuZGlmCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgRVBPTExFVCk7CiAjaWZkZWYgRVBPTExPTkVTSE9UCiAgICAgLyogS2VybmVsIDIuNi4yKyAqLwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMT05FU0hPVCk7CiAjZW5kaWYKLSAgICAvKiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExfUkRIVVAiLCBFUE9MTFJESFVQKTsgKi8KKyNpZmRlZiBFUE9MTEVYQ0xVU0lWRQorICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEVQT0xMRVhDTFVTSVZFKTsKKyNlbmRpZgogCiAjaWZkZWYgRVBPTExSRE5PUk0KICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBFUE9MTFJETk9STSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NoYTFtb2R1bGUuYyBiL01vZHVsZXMvc2hhMW1vZHVsZS5jCmluZGV4IDZjYjMyZWQuLmQ1MDY1Y2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2hhMW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2hhMW1vZHVsZS5jCkBAIC0zMCw3ICszMCw3IEBACiAKICNpZiBTSVpFT0ZfSU5UID09IDQKIHR5cGVkZWYgdW5zaWduZWQgaW50IFNIQTFfSU5UMzI7ICAgICAgICAvKiAzMi1iaXQgaW50ZWdlciAqLwotdHlwZWRlZiBQWV9MT05HX0xPTkcgU0hBMV9JTlQ2NDsgICAgICAgIC8qIDY0LWJpdCBpbnRlZ2VyICovCit0eXBlZGVmIGxvbmcgbG9uZyBTSEExX0lOVDY0OyAgICAgICAgLyogNjQtYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCmluZGV4IGY5ZmYwZWEuLmY1ZjllMTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYwpAQCAtMjcsMTUgKzI3LDEzIEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD04MWEzY2NkZTkyYmNmZThkXSovCiAKLSNpZmRlZiBQWV9MT05HX0xPTkcgLyogSWYgbm8gUFlfTE9OR19MT05HLCBkb24ndCBjb21waWxlIGFueXRoaW5nISAqLwotCiAvKiBTb21lIHVzZWZ1bCB0eXBlcyAqLwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKIHR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HIFNIQV9JTlQ2NDsgICAgICAgIC8qIDY0LWJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBTSEFfSU5UNjQ7ICAgICAgICAvKiA2NC1iaXQgaW50ZWdlciAqLwogI2Vsc2UKIC8qIG5vdCBkZWZpbmVkLiBjb21waWxhdGlvbiB3aWxsIGRpZS4gKi8KICNlbmRpZgpAQCAtMTIxLDEyICsxMTksMTIgQEAKIAogLyogVmFyaW91cyBsb2dpY2FsIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBST1I2NCh4LCB5KSBcCi0gICAgKCAoKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSk+PigodW5zaWduZWQgUFlfTE9OR19MT05HKSh5KSAmIDYzKSkgfCBcCi0gICAgICAoKHgpPDwoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoNjQtKCh5KSAmIDYzKSkpKSkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkKKyAgICAoICgoKCh4KSAmIFB5X1VMTCgweEZGRkZGRkZGRkZGRkZGRkYpKT4+KCh1bnNpZ25lZCBsb25nIGxvbmcpKHkpICYgNjMpKSB8IFwKKyAgICAgICgoeCk8PCgodW5zaWduZWQgbG9uZyBsb25nKSg2NC0oKHkpICYgNjMpKSkpKSAmIFB5X1VMTCgweEZGRkZGRkZGRkZGRkZGRkYpKQogI2RlZmluZSBDaCh4LHkseikgICAgICAgKHogXiAoeCAmICh5IF4geikpKQogI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikgfCAoeCAmIHkpKQogI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SNjQoKHgpLChuKSkKLSNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpID4+ICgodW5zaWduZWQgUFlfTE9OR19MT05HKW4pKQorI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkgPj4gKCh1bnNpZ25lZCBsb25nIGxvbmcpbikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyOCkgXiBTKHgsIDM0KSBeIFMoeCwgMzkpKQogI2RlZmluZSBTaWdtYTEoeCkgICAgICAgKFMoeCwgMTQpIF4gUyh4LCAxOCkgXiBTKHgsIDQxKSkKICNkZWZpbmUgR2FtbWEwKHgpICAgICAgIChTKHgsIDEpIF4gUyh4LCA4KSBeIFIoeCwgNykpCkBAIC04MDMsNSArODAxLDMgQEAKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNIQTUxMlR5cGUiLCAoUHlPYmplY3QgKikmU0hBNTEydHlwZSk7CiAgICAgcmV0dXJuIG07CiB9Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaWduYWxtb2R1bGUuYyBiL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKaW5kZXggYTFhMThiMC4uZTA3ODA5MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaWduYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIHJlcG9ydF93YWtldXBfd3JpdGVfZXJyb3Iodm9pZCAqZGF0YSkKIHsKICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotICAgIGVycm5vID0gKGludCkgKFB5X2ludHB0cl90KSBkYXRhOworICAgIGVycm5vID0gKGludCkgKGludHB0cl90KSBkYXRhOwogICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGlnbm9yZWQgd2hlbiB0cnlpbmcgdG8gd3JpdGUgdG8gdGhlICIKICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsIHdha2V1cCBmZDpcbiIpOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAKICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9BZGRQZW5kaW5nQ2FsbChyZXBvcnRfd2FrZXVwX3dyaXRlX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKFB5X2ludHB0cl90KWVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShpbnRwdHJfdCllcnJubyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwppbmRleCBiMzQ5ODFjLi4wYjQ1YzMzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogc2VuZChkYXRhWywgZmxhZ3NdKSAtLSBzZW5kIGRhdGEsIG1heSBub3Qgc2VuZCBhbGwgb2YgaXRcblwKIHNlbmR0byhkYXRhWywgZmxhZ3NdLCBhZGRyKSAtLSBzZW5kIGRhdGEgdG8gYSBnaXZlbiBhZGRyZXNzXG5cCiBzZXRibG9ja2luZygwIHwgMSkgLS0gc2V0IG9yIGNsZWFyIHRoZSBibG9ja2luZyBJL08gZmxhZ1xuXAotc2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgdmFsdWUpIC0tIHNldCBzb2NrZXQgb3B0aW9uc1xuXAorc2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgdmFsdWVbLCBvcHRsZW5dKSAtLSBzZXQgc29ja2V0IG9wdGlvbnNcblwKIHNldHRpbWVvdXQoTm9uZSB8IGZsb2F0KSAtLSBzZXQgb3IgY2xlYXIgdGhlIHRpbWVvdXRcblwKIHNodXRkb3duKGhvdykgLS0gc2h1dCBkb3duIHRyYWZmaWMgaW4gb25lIG9yIGJvdGggZGlyZWN0aW9uc1xuXAogaWZfbmFtZWluZGV4KCkgLS0gcmV0dXJuIGFsbCBuZXR3b3JrIGludGVyZmFjZSBpbmRpY2VzIGFuZCBuYW1lc1xuXApAQCAtMTYzLDcgKzE2MywxMSBAQAogIyBpbmNsdWRlIDxzeXMvdWlvLmg+CiAjZW5kaWYKIAotI2lmbmRlZiBXSVRIX1RIUkVBRAorI2lmICFkZWZpbmVkKFdJVEhfVEhSRUFEKQorIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAyMwogIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgogI2VuZGlmCiAKQEAgLTI4Miw2ICsyODYsMzYgQEAKICNpbmNsdWRlIDxuZXQvaWYuaD4KICNlbmRpZgogCisjaWZkZWYgSEFWRV9TT0NLQUREUl9BTEcKKyNpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD4KKyNpZm5kZWYgQUZfQUxHCisjZGVmaW5lIEFGX0FMRyAzOAorI2VuZGlmCisjaWZuZGVmIFNPTF9BTEcKKyNkZWZpbmUgU09MX0FMRyAyNzkKKyNlbmRpZgorCisvKiBMaW51eCAzLjE5ICovCisjaWZuZGVmIEFMR19TRVRfQUVBRF9BU1NPQ0xFTgorI2RlZmluZSBBTEdfU0VUX0FFQURfQVNTT0NMRU4gICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBBTEdfU0VUX0FFQURfQVVUSFNJWkUKKyNkZWZpbmUgQUxHX1NFVF9BRUFEX0FVVEhTSVpFICAgICAgICAgICA1CisjZW5kaWYKKy8qIExpbnV4IDQuOCAqLworI2lmbmRlZiBBTEdfU0VUX1BVQktFWQorI2RlZmluZSBBTEdfU0VUX1BVQktFWSAgICAgICAgICAgICAgICAgIDYKKyNlbmRpZgorCisjaWZuZGVmIEFMR19PUF9TSUdOCisjZGVmaW5lIEFMR19PUF9TSUdOICAgICAgICAgICAgICAgICAgICAgMgorI2VuZGlmCisjaWZuZGVmIEFMR19PUF9WRVJJRlkKKyNkZWZpbmUgQUxHX09QX1ZFUklGWSAgICAgICAgICAgICAgICAgICAzCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfQUxHICovCisKIC8qIEdlbmVyaWMgc29ja2V0IG9iamVjdCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgKi8KICNkZWZpbmUgUHlTb2NrZXRfQlVJTERJTkdfU09DS0VUCiAjaW5jbHVkZSAic29ja2V0bW9kdWxlLmgiCkBAIC05MjYsNyArOTYwLDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkOyB0aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICovCiAKIHN0YXRpYyBpbnQKLXNldGlwYWRkcihjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBzaXplX3QgYWRkcl9yZXRfc2l6ZSwgaW50IGFmKQorc2V0aXBhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCiB7CiAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwogICAgIGludCBlcnJvcjsKQEAgLTExMDcsNyArMTE0MSw3IEBACiAgICBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogc3RhdGljIGludAotc2V0YmRhZGRyKGNoYXIgKm5hbWUsIGJkYWRkcl90ICpiZGFkZHIpCitzZXRiZGFkZHIoY29uc3QgY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKIHsKICAgICB1bnNpZ25lZCBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNTsKICAgICBjaGFyIGNoOwpAQCAtMTM3MSw2ICsxNDA1LDIyIEBACiAgICAgICAgIH0KICNlbmRpZgogCisjaWZkZWYgSEFWRV9TT0NLQUREUl9BTEcKKyAgICBjYXNlIEFGX0FMRzoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9hbGcgKmEgPSAoc3RydWN0IHNvY2thZGRyX2FsZyAqKWFkZHI7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJzI3MjSEgiLAorICAgICAgICAgICAgYS0+c2FsZ190eXBlLAorICAgICAgICAgICAgc3RybmxlbigoY29uc3QgY2hhciopYS0+c2FsZ190eXBlLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYS0+c2FsZ190eXBlKSksCisgICAgICAgICAgICBhLT5zYWxnX25hbWUsCisgICAgICAgICAgICBzdHJubGVuKChjb25zdCBjaGFyKilhLT5zYWxnX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhLT5zYWxnX25hbWUpKSwKKyAgICAgICAgICAgIGEtPnNhbGdfZmVhdCwKKyAgICAgICAgICAgIGEtPnNhbGdfbWFzayk7CisgICAgfQorI2VuZGlmCisKICAgICAvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KIAogICAgIGRlZmF1bHQ6CkBAIC0xNDAxLDcgKzE0NTEsNyBAQAogaWRuYV9jb252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgc3RydWN0IG1heWJlX2lkbmEgKmRhdGEpCiB7CiAgICAgc2l6ZV90IGxlbjsKLSAgICBQeU9iamVjdCAqb2JqMiwgKm9iajM7CisgICAgUHlPYmplY3QgKm9iajI7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIGlkbmFfY2xlYW51cChkYXRhKTsKICAgICAgICAgcmV0dXJuIDE7CkBAIC0xNDE2LDMxICsxNDY2LDI3IEBACiAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5Qnl0ZUFycmF5X0FzU3RyaW5nKG9iaik7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZUFycmF5X1NpemUob2JqKTsKICAgICB9Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikgJiYgUHlVbmljb2RlX1JFQURZKG9iaikgPT0gMCAmJiBQeVVuaWNvZGVfSVNfQ09NUEFDVF9BU0NJSShvYmopKSB7Ci0gICAgICAgIGRhdGEtPmJ1ZiA9IFB5VW5pY29kZV9EQVRBKG9iaik7Ci0gICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopID09IDAgJiYgUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkob2JqKSkgeworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlVbmljb2RlX0RBVEEob2JqKTsKKyAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYmoyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmosICJpZG5hIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9iajIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhvYmoyKSk7CisgICAgICAgICAgICBkYXRhLT5vYmogPSBvYmoyOworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlCeXRlc19BU19TVFJJTkcob2JqMik7CisgICAgICAgICAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKG9iajIpOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBvYmoyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICAgICAgaWYgKCFvYmoyKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RyaW5nIG9yIHVuaWNvZGUgdGV4dCBidWZmZXIgZXhwZWN0ZWQsIG5vdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG9iajMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG9iajIsICJpZG5hIiwgTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihvYmoyKTsKLSAgICAgICAgaWYgKCFvYmozKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sob2JqMykpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihvYmozKTsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlbmNvZGluZyBvZiBob3N0bmFtZSBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBkYXRhLT5vYmogPSBvYmozOwotICAgICAgICBkYXRhLT5idWYgPSBQeUJ5dGVzX0FTX1NUUklORyhvYmozKTsKLSAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShvYmozKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0ciwgYnl0ZXMgb3IgYnl0ZWFycmF5IGV4cGVjdGVkLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChzdHJsZW4oZGF0YS0+YnVmKSAhPSBsZW4pIHsKICAgICAgICAgUHlfQ0xFQVIoZGF0YS0+b2JqKTsKQEAgLTE5NDAsNiArMTk4NiwzNiBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgY2FzZSBBRl9BTEc6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfYWxnICpzYTsKKyAgICAgICAgY2hhciAqdHlwZTsKKyAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyX2FsZyAqKWFkZHJfcmV0OworCisgICAgICAgIG1lbXNldChzYSwgMCwgc2l6ZW9mKCpzYSkpOworICAgICAgICBzYS0+c2FsZ19mYW1pbHkgPSBBRl9BTEc7CisKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xISDpnZXRzb2NrYWRkcmFyZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlLCAmbmFtZSwgJnNhLT5zYWxnX2ZlYXQsICZzYS0+c2FsZ19tYXNrKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAvKiBzb2NrYWRkcl9hbGcgaGFzIGZpeGVkLXNpemVkIGNoYXIgYXJyYXlzIGZvciB0eXBlIGFuZCBuYW1lICovCisgICAgICAgIGlmIChzdHJsZW4odHlwZSkgPiBzaXplb2Yoc2EtPnNhbGdfdHlwZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiQUZfQUxHIHR5cGUgdG9vIGxvbmcuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KChjaGFyICopc2EtPnNhbGdfdHlwZSwgdHlwZSwgc2l6ZW9mKHNhLT5zYWxnX3R5cGUpKTsKKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA+IHNpemVvZihzYS0+c2FsZ19uYW1lKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJBRl9BTEcgbmFtZSB0b28gbG9uZy4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoKGNoYXIgKilzYS0+c2FsZ19uYW1lLCBuYW1lLCBzaXplb2Yoc2EtPnNhbGdfbmFtZSkpOworCisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mKCpzYSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgogCiAgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKQEAgLTIwNjEsNiArMjEzNywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgY2FzZSBBRl9BTEc6CisgICAgeworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2FsZyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgogCiAgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKQEAgLTIyMjAsMTAgKzIzMDMsMjEgQEAKIHNvY2tfYWNjZXB0X2ltcGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCB2b2lkICpkYXRhKQogewogICAgIHN0cnVjdCBzb2NrX2FjY2VwdCAqY3R4ID0gZGF0YTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBTQVMyU0EoY3R4LT5hZGRyYnVmKTsKKyAgICBzb2NrbGVuX3QgKnBhZGRybGVuID0gY3R4LT5hZGRybGVuOworI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgLyogQUZfQUxHIGRvZXMgbm90IHN1cHBvcnQgYWNjZXB0KCkgd2l0aCBhZGRyIGFuZCByYWlzZXMKKyAgICAgKiBFQ09OTkFCT1JURUQgaW5zdGVhZC4gKi8KKyAgICBpZiAocy0+c29ja19mYW1pbHkgPT0gQUZfQUxHKSB7CisgICAgICAgIGFkZHIgPSBOVUxMOworICAgICAgICBwYWRkcmxlbiA9IE5VTEw7CisgICAgICAgICpjdHgtPmFkZHJsZW4gPSAwOworICAgIH0KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX0FDQ0VQVDQpICYmIGRlZmluZWQoU09DS19DTE9FWEVDKQogICAgIGlmIChhY2NlcHQ0X3dvcmtzICE9IDApIHsKLSAgICAgICAgY3R4LT5yZXN1bHQgPSBhY2NlcHQ0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4sCisgICAgICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0NChzLT5zb2NrX2ZkLCBhZGRyLCBwYWRkcmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfQ0xPRVhFQyk7CiAgICAgICAgIGlmIChjdHgtPnJlc3VsdCA9PSBJTlZBTElEX1NPQ0tFVCAmJiBhY2NlcHQ0X3dvcmtzID09IC0xKSB7CiAgICAgICAgICAgICAvKiBPbiBMaW51eCBvbGRlciB0aGFuIDIuNi4yOCwgYWNjZXB0NCgpIGZhaWxzIHdpdGggRU5PU1lTICovCkBAIC0yMjMxLDkgKzIzMjUsOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChhY2NlcHQ0X3dvcmtzID09IDApCi0gICAgICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4pOworICAgICAgICBjdHgtPnJlc3VsdCA9IGFjY2VwdChzLT5zb2NrX2ZkLCBhZGRyLCBwYWRkcmxlbik7CiAjZWxzZQotICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIFNBUzJTQShjdHgtPmFkZHJidWYpLCBjdHgtPmFkZHJsZW4pOworICAgIGN0eC0+cmVzdWx0ID0gYWNjZXB0KHMtPnNvY2tfZmQsIGFkZHIsIHBhZGRybGVuKTsKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMjQzNSw5ICsyNTI5LDEyIEBACiBvcGVyYXRpb25zIGFyZSBkaXNhYmxlZC4iKTsKIAogLyogcy5zZXRzb2Nrb3B0KCkgbWV0aG9kLgotICAgV2l0aCBhbiBpbnRlZ2VyIHRoaXJkIGFyZ3VtZW50LCBzZXRzIGFuIGludGVnZXIgb3B0aW9uLgorICAgV2l0aCBhbiBpbnRlZ2VyIHRoaXJkIGFyZ3VtZW50LCBzZXRzIGFuIGludGVnZXIgb3B0dmFsIHdpdGggb3B0bGVuPTQuCisgICBXaXRoIE5vbmUgYXMgdGhpcmQgYXJndW1lbnQgYW5kIGFuIGludGVnZXIgZm91cnRoIGFyZ3VtZW50LCBzZXQKKyAgIG9wdHZhbD1OVUxMIHdpdGggdW5zaWduZWQgaW50IGFzIG9wdGxlbi4KICAgIFdpdGggYSBzdHJpbmcgdGhpcmQgYXJndW1lbnQsIHNldHMgYW4gb3B0aW9uIGZyb20gYSBidWZmZXI7Ci0gICB1c2Ugb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlICdzdHJ1Y3QnIHRvIGVuY29kZSB0aGUgc3RyaW5nLiAqLworICAgdXNlIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSAnc3RydWN0JyB0byBlbmNvZGUgdGhlIHN0cmluZy4KKyovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NldHNvY2tvcHQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKQEAgLTI0NDcsMzEgKzI1NDQsNjQgQEAKICAgICBpbnQgcmVzOwogICAgIFB5X2J1ZmZlciBvcHR2YWw7CiAgICAgaW50IGZsYWc7CisgICAgdW5zaWduZWQgaW50IG9wdGxlbjsKKyAgICBQeU9iamVjdCAqbm9uZTsKIAorICAgIC8qIHNldHNvY2tvcHQobGV2ZWwsIG9wdCwgZmxhZykgKi8KICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNldHNvY2tvcHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZmbGFnKSkgewogICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikmZmxhZywgc2l6ZW9mIGZsYWcpOworICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpeSo6c2V0c29ja29wdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmb3B0dmFsKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwuYnVmLCBvcHR2YWwubGVuKTsKKworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgLyogc2V0c29ja29wdChsZXZlbCwgb3B0LCBOb25lLCBmbGFnKSAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU8hSTpzZXRzb2Nrb3B0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCBQeV9UWVBFKFB5X05vbmUpLCAmbm9uZSwgJm9wdGxlbikpIHsKKyAgICAgICAgYXNzZXJ0KHNpemVvZihzb2NrbGVuX3QpID49IHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAoc29ja2xlbl90KW9wdGxlbik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBQeUVycl9DbGVhcigpOworICAgIC8qIHNldHNvY2tvcHQobGV2ZWwsIG9wdCwgYnVmZmVyKSAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl5KjpzZXRzb2Nrb3B0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmb3B0dmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgaWYgKG9wdHZhbC5sZW4gPiBJTlRfTUFYKSB7CiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9wdHZhbCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcHRpb24gaXMgbGFyZ2VyIHRoYW4gJWkgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAocmVzIDwgMCkKKyAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsLmJ1ZiwgKGludClvcHR2YWwubGVuKTsKKyNlbHNlCisgICAgcmVzID0gc2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLmJ1Ziwgb3B0dmFsLmxlbik7CisjZW5kaWYKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZvcHR2YWwpOworCitkb25lOgorICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRzb2Nrb3B0X2RvYywKLSJzZXRzb2Nrb3B0KGxldmVsLCBvcHRpb24sIHZhbHVlKVxuXAorInNldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgdmFsdWU6IGludClcblwKK3NldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgdmFsdWU6IGJ1ZmZlcilcblwKK3NldHNvY2tvcHQobGV2ZWwsIG9wdGlvbiwgTm9uZSwgb3B0bGVuOiBpbnQpXG5cCiBcblwKIFNldCBhIHNvY2tldCBvcHRpb24uICBTZWUgdGhlIFVuaXggbWFudWFsIGZvciBsZXZlbCBhbmQgb3B0aW9uLlxuXAotVGhlIHZhbHVlIGFyZ3VtZW50IGNhbiBlaXRoZXIgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZy4iKTsKK1RoZSB2YWx1ZSBhcmd1bWVudCBjYW4gZWl0aGVyIGJlIGFuIGludGVnZXIsIGEgc3RyaW5nIGJ1ZmZlciwgb3IgXG5cCitOb25lLCBvcHRsZW4uIik7CiAKIAogLyogcy5nZXRzb2Nrb3B0KCkgbWV0aG9kLgpAQCAtMjU2MywxNyArMjY5MywyMiBAQAogc29ja19jbG9zZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7CiAgICAgU09DS0VUX1QgZmQ7CisgICAgaW50IHJlczsKIAotICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIHJldHJ5IHVwb24gRUlOVFI6IHNlZSBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy81NzY0NzgvCi0gICAgICogYW5kIGh0dHA6Ly9saW51eC5kZXJrZWlsZXIuY29tL01haWxpbmctTGlzdHMvS2VybmVsLzIwMDUtMDkvMzAwMC5odG1sCi0gICAgICogZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKi8KICAgICBmZCA9IHMtPnNvY2tfZmQ7CiAgICAgaWYgKGZkICE9IElOVkFMSURfU09DS0VUKSB7CiAgICAgICAgIHMtPnNvY2tfZmQgPSBJTlZBTElEX1NPQ0tFVDsKKworICAgICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUKKyAgICAgICAgICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNTc2NDc4LyBhbmQKKyAgICAgICAgICAgaHR0cDovL2xpbnV4LmRlcmtlaWxlci5jb20vTWFpbGluZy1MaXN0cy9LZXJuZWwvMjAwNS0wOS8zMDAwLmh0bWwKKyAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gKi8KICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICByZXMgPSBTT0NLRVRDTE9TRShmZCk7CiAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtMzc1Niw2ICszODkxLDUxIEBACiB9OwogCiBzdGF0aWMgaW50Citzb2NrX3NlbmRtc2dfaW92ZWMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqZGF0YV9hcmcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLAorICAgICAgICAgICAgICAgICAgIFB5X2J1ZmZlciAqKmRhdGFidWZzb3V0LCBQeV9zc2l6ZV90ICpuZGF0YWJ1ZnNvdXQpIHsKKyAgICBQeV9zc2l6ZV90IG5kYXRhcGFydHMsIG5kYXRhYnVmcyA9IDA7CisgICAgaW50IHJlc3VsdCA9IC0xOworICAgIHN0cnVjdCBpb3ZlYyAqaW92cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRhdGFfZmFzdCA9IE5VTEw7CisgICAgUHlfYnVmZmVyICpkYXRhYnVmcyA9IE5VTEw7CisKKyAgICAvKiBGaWxsIGluIGFuIGlvdmVjIGZvciBlYWNoIG1lc3NhZ2UgcGFydCwgYW5kIHNhdmUgdGhlIFB5X2J1ZmZlcgorICAgICAgIHN0cnVjdHMgdG8gcmVsZWFzZSBhZnRlcndhcmRzLiAqLworICAgIGlmICgoZGF0YV9mYXN0ID0gUHlTZXF1ZW5jZV9GYXN0KGRhdGFfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmFibGUiKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIG5kYXRhcGFydHMgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZGF0YV9mYXN0KTsKKyAgICBpZiAobmRhdGFwYXJ0cyA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsICJzZW5kbXNnKCkgYXJndW1lbnQgMSBpcyB0b28gbG9uZyIpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIG1zZy0+bXNnX2lvdmxlbiA9IG5kYXRhcGFydHM7CisgICAgaWYgKG5kYXRhcGFydHMgPiAwICYmCisgICAgICAgICgobXNnLT5tc2dfaW92ID0gaW92cyA9IFB5TWVtX05ldyhzdHJ1Y3QgaW92ZWMsIG5kYXRhcGFydHMpKSA9PSBOVUxMIHx8CisgICAgICAgICAoZGF0YWJ1ZnMgPSBQeU1lbV9OZXcoUHlfYnVmZmVyLCBuZGF0YXBhcnRzKSkgPT0gTlVMTCkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBmb3IgKDsgbmRhdGFidWZzIDwgbmRhdGFwYXJ0czsgbmRhdGFidWZzKyspIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZGF0YV9mYXN0LCBuZGF0YWJ1ZnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ5KjtzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMtbGlrZSBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJ1ZnNbbmRhdGFidWZzXSkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIGlvdnNbbmRhdGFidWZzXS5pb3ZfYmFzZSA9IGRhdGFidWZzW25kYXRhYnVmc10uYnVmOworICAgICAgICBpb3ZzW25kYXRhYnVmc10uaW92X2xlbiA9IGRhdGFidWZzW25kYXRhYnVmc10ubGVuOworICAgIH0KKyAgICByZXN1bHQgPSAwOworICBmaW5hbGx5OgorICAgICpkYXRhYnVmc291dCA9IGRhdGFidWZzOworICAgICpuZGF0YWJ1ZnNvdXQgPSBuZGF0YWJ1ZnM7CisgICAgUHlfWERFQ1JFRihkYXRhX2Zhc3QpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKIHNvY2tfc2VuZG1zZ19pbXBsKFB5U29ja2V0U29ja09iamVjdCAqcywgdm9pZCAqZGF0YSkKIHsKICAgICBzdHJ1Y3Qgc29ja19zZW5kbXNnICpjdHggPSBkYXRhOwpAQCAtMzc2OSw5ICszOTQ5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NlbmRtc2coUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IGksIG5kYXRhcGFydHMsIG5kYXRhYnVmcyA9IDAsIG5jbXNncywgbmNtc2didWZzID0gMDsKKyAgICBQeV9zc2l6ZV90IGksIG5kYXRhYnVmcyA9IDAsIG5jbXNncywgbmNtc2didWZzID0gMDsKICAgICBQeV9idWZmZXIgKmRhdGFidWZzID0gTlVMTDsKLSAgICBzdHJ1Y3QgaW92ZWMgKmlvdnMgPSBOVUxMOwogICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CiAgICAgc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07CiAgICAgc3RydWN0IGNtc2dpbmZvIHsKQEAgLTM3ODIsNyArMzk2MSw3IEBACiAgICAgdm9pZCAqY29udHJvbGJ1ZiA9IE5VTEw7CiAgICAgc2l6ZV90IGNvbnRyb2xsZW4sIGNvbnRyb2xsZW5fbGFzdDsKICAgICBpbnQgYWRkcmxlbiwgZmxhZ3MgPSAwOwotICAgIFB5T2JqZWN0ICpkYXRhX2FyZywgKmNtc2dfYXJnID0gTlVMTCwgKmFkZHJfYXJnID0gTlVMTCwgKmRhdGFfZmFzdCA9IE5VTEwsCisgICAgUHlPYmplY3QgKmRhdGFfYXJnLCAqY21zZ19hcmcgPSBOVUxMLCAqYWRkcl9hcmcgPSBOVUxMLAogICAgICAgICAqY21zZ19mYXN0ID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7CiAgICAgc3RydWN0IHNvY2tfc2VuZG1zZyBjdHg7CiAKQEAgLTM4MDAsMzAgKzM5NzksOCBAQAogCiAgICAgLyogRmlsbCBpbiBhbiBpb3ZlYyBmb3IgZWFjaCBtZXNzYWdlIHBhcnQsIGFuZCBzYXZlIHRoZSBQeV9idWZmZXIKICAgICAgICBzdHJ1Y3RzIHRvIHJlbGVhc2UgYWZ0ZXJ3YXJkcy4gKi8KLSAgICBpZiAoKGRhdGFfZmFzdCA9IFB5U2VxdWVuY2VfRmFzdChkYXRhX2FyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZG1zZygpIGFyZ3VtZW50IDEgbXVzdCBiZSBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhYmxlIikpID09IE5VTEwpCisgICAgaWYgKHNvY2tfc2VuZG1zZ19pb3ZlYyhzLCBkYXRhX2FyZywgJm1zZywgJmRhdGFidWZzLCAmbmRhdGFidWZzKSA9PSAtMSkgewogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgbmRhdGFwYXJ0cyA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShkYXRhX2Zhc3QpOwotICAgIGlmIChuZGF0YXBhcnRzID4gSU5UX01BWCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwgInNlbmRtc2coKSBhcmd1bWVudCAxIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIGdvdG8gZmluYWxseTsKLSAgICB9Ci0gICAgbXNnLm1zZ19pb3ZsZW4gPSBuZGF0YXBhcnRzOwotICAgIGlmIChuZGF0YXBhcnRzID4gMCAmJgotICAgICAgICAoKG1zZy5tc2dfaW92ID0gaW92cyA9IFB5TWVtX05ldyhzdHJ1Y3QgaW92ZWMsIG5kYXRhcGFydHMpKSA9PSBOVUxMIHx8Ci0gICAgICAgICAoZGF0YWJ1ZnMgPSBQeU1lbV9OZXcoUHlfYnVmZmVyLCBuZGF0YXBhcnRzKSkgPT0gTlVMTCkpIHsKLSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgZ290byBmaW5hbGx5OwotICAgIH0KLSAgICBmb3IgKDsgbmRhdGFidWZzIDwgbmRhdGFwYXJ0czsgbmRhdGFidWZzKyspIHsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZGF0YV9mYXN0LCBuZGF0YWJ1ZnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ5KjtzZW5kbXNnKCkgYXJndW1lbnQgMSBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMtbGlrZSBvYmplY3RzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJ1ZnNbbmRhdGFidWZzXSkpCi0gICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgIGlvdnNbbmRhdGFidWZzXS5pb3ZfYmFzZSA9IGRhdGFidWZzW25kYXRhYnVmc10uYnVmOwotICAgICAgICBpb3ZzW25kYXRhYnVmc10uaW92X2xlbiA9IGRhdGFidWZzW25kYXRhYnVmc10ubGVuOwogICAgIH0KIAogICAgIGlmIChjbXNnX2FyZyA9PSBOVUxMKQpAQCAtMzk1NCw4ICs0MTExLDYgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbmRhdGFidWZzOyBpKyspCiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGFidWZzW2ldKTsKICAgICBQeU1lbV9GcmVlKGRhdGFidWZzKTsKLSAgICBQeU1lbV9GcmVlKGlvdnMpOwotICAgIFB5X1hERUNSRUYoZGF0YV9mYXN0KTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0zOTc3LDYgKzQxMzIsMTY1IEBACiBkYXRhIHNlbnQuIik7CiAjZW5kaWYgICAgLyogQ01TR19MRU4gKi8KIAorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCitzdGF0aWMgUHlPYmplY3QqCitzb2NrX3NlbmRtc2dfYWZhbGcoUHlTb2NrZXRTb2NrT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisKKyAgICBQeV9zc2l6ZV90IGksIG5kYXRhYnVmcyA9IDA7CisgICAgUHlfYnVmZmVyICpkYXRhYnVmcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRhdGFfYXJnID0gTlVMTDsKKworICAgIFB5X2J1ZmZlciBpdiA9IHtOVUxMLCBOVUxMfTsKKworICAgIFB5T2JqZWN0ICpvcG9iaiA9IE5VTEw7CisgICAgaW50IG9wID0gLTE7CisKKyAgICBQeU9iamVjdCAqYXNzb2NsZW5vYmogPSBOVUxMOworICAgIGludCBhc3NvY2xlbiA9IC0xOworCisgICAgdW5zaWduZWQgaW50ICp1aXB0cjsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgc3RydWN0IG1zZ2hkciBtc2c7CisgICAgc3RydWN0IGNtc2doZHIgKmhlYWRlciA9IE5VTEw7CisgICAgc3RydWN0IGFmX2FsZ19pdiAqYWxnX2l2ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc29ja19zZW5kbXNnIGN0eDsKKyAgICBQeV9zc2l6ZV90IGNvbnRyb2xsZW47CisgICAgdm9pZCAqY29udHJvbGJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7Im1zZyIsICJvcCIsICJpdiIsICJhc3NvY2xlbiIsICJmbGFncyIsIDB9OworCisgICAgaWYgKHNlbGYtPnNvY2tfZmFtaWx5ICE9IEFGX0FMRykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbGdzZXQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEFGX0FMRyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8TyRPIXkqTyFpOnNlbmRtc2dfYWZhbGciLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TG9uZ19UeXBlLCAmb3BvYmosICZpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMb25nX1R5cGUsICZhc3NvY2xlbm9iaiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBvcCBpcyBhIHJlcXVpcmVkLCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgPj0gMCAqLworICAgIGlmIChvcG9iaiAhPSBOVUxMKSB7CisgICAgICAgIG9wID0gX1B5TG9uZ19Bc0ludChvcG9iaik7CisgICAgfQorICAgIGlmIChvcCA8IDApIHsKKyAgICAgICAgLyogb3ZlcnJpZGUgZXhjZXB0aW9uIGZyb20gX1B5TG9uZ19Bc0ludCgpICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBtaXNzaW5nIGFyZ3VtZW50ICdvcCciKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICAvKiBhc3NvY2xlbiBpcyBvcHRpb25hbCBidXQgbXVzdCBiZSA+PSAwICovCisgICAgaWYgKGFzc29jbGVub2JqICE9IE5VTEwpIHsKKyAgICAgICAgYXNzb2NsZW4gPSBfUHlMb25nX0FzSW50KGFzc29jbGVub2JqKTsKKyAgICAgICAgaWYgKGFzc29jbGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNzb2NsZW4gPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY2xlbiBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb250cm9sbGVuID0gQ01TR19TUEFDRSg0KTsKKyAgICBpZiAoaXYuYnVmICE9IE5VTEwpIHsKKyAgICAgICAgY29udHJvbGxlbiArPSBDTVNHX1NQQUNFKHNpemVvZigqYWxnX2l2KSArIGl2Lmxlbik7CisgICAgfQorICAgIGlmIChhc3NvY2xlbiA+PSAwKSB7CisgICAgICAgIGNvbnRyb2xsZW4gKz0gQ01TR19TUEFDRSg0KTsKKyAgICB9CisKKyAgICBjb250cm9sYnVmID0gUHlNZW1fTWFsbG9jKGNvbnRyb2xsZW4pOworICAgIGlmIChjb250cm9sYnVmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIG1lbXNldChjb250cm9sYnVmLCAwLCBjb250cm9sbGVuKTsKKworICAgIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gY29udHJvbGxlbjsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBjb250cm9sYnVmOworCisgICAgLyogRmlsbCBpbiBhbiBpb3ZlYyBmb3IgZWFjaCBtZXNzYWdlIHBhcnQsIGFuZCBzYXZlIHRoZSBQeV9idWZmZXIKKyAgICAgICBzdHJ1Y3RzIHRvIHJlbGVhc2UgYWZ0ZXJ3YXJkcy4gKi8KKyAgICBpZiAoZGF0YV9hcmcgIT0gTlVMTCkgeworICAgICAgICBpZiAoc29ja19zZW5kbXNnX2lvdmVjKHNlbGYsIGRhdGFfYXJnLCAmbXNnLCAmZGF0YWJ1ZnMsICZuZGF0YWJ1ZnMpID09IC0xKSB7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgb3BlcmF0aW9uIHRvIGVuY3J5cHQgb3IgZGVjcnlwdCAqLworICAgIGhlYWRlciA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIHJlc3VsdCBmcm9tIENNU0dfRklSU1RIRFIiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBoZWFkZXItPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOworICAgIGhlYWRlci0+Y21zZ190eXBlID0gQUxHX1NFVF9PUDsKKyAgICBoZWFkZXItPmNtc2dfbGVuID0gQ01TR19MRU4oNCk7CisgICAgdWlwdHIgPSAodm9pZCopQ01TR19EQVRBKGhlYWRlcik7CisgICAgKnVpcHRyID0gKHVuc2lnbmVkIGludClvcDsKKworICAgIC8qIHNldCBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKi8KKyAgICBpZiAoaXYuYnVmICE9IE5VTEwpIHsKKyAgICAgICAgaGVhZGVyID0gQ01TR19OWFRIRFIoJm1zZywgaGVhZGVyKTsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgcmVzdWx0IGZyb20gQ01TR19OWFRIRFIoaXYpIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5jbXNnX2xldmVsID0gU09MX0FMRzsKKyAgICAgICAgaGVhZGVyLT5jbXNnX3R5cGUgPSBBTEdfU0VUX0lWOworICAgICAgICBoZWFkZXItPmNtc2dfbGVuID0gQ01TR19TUEFDRShzaXplb2YoKmFsZ19pdikgKyBpdi5sZW4pOworICAgICAgICBhbGdfaXYgPSAodm9pZCopQ01TR19EQVRBKGhlYWRlcik7CisgICAgICAgIGFsZ19pdi0+aXZsZW4gPSBpdi5sZW47CisgICAgICAgIG1lbWNweShhbGdfaXYtPml2LCBpdi5idWYsIGl2Lmxlbik7CisgICAgfQorCisgICAgLyogc2V0IGxlbmd0aCBvZiBhc3NvY2lhdGVkIGRhdGEgZm9yIEFFQUQgKi8KKyAgICBpZiAoYXNzb2NsZW4gPj0gMCkgeworICAgICAgICBoZWFkZXIgPSBDTVNHX05YVEhEUigmbXNnLCBoZWFkZXIpOworICAgICAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCByZXN1bHQgZnJvbSBDTVNHX05YVEhEUihhc3NvYykiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOworICAgICAgICBoZWFkZXItPmNtc2dfdHlwZSA9IEFMR19TRVRfQUVBRF9BU1NPQ0xFTjsKKyAgICAgICAgaGVhZGVyLT5jbXNnX2xlbiA9IENNU0dfTEVOKDQpOworICAgICAgICB1aXB0ciA9ICh2b2lkKilDTVNHX0RBVEEoaGVhZGVyKTsKKyAgICAgICAgKnVpcHRyID0gKHVuc2lnbmVkIGludClhc3NvY2xlbjsKKyAgICB9CisKKyAgICBjdHgubXNnID0gJm1zZzsKKyAgICBjdHguZmxhZ3MgPSBmbGFnczsKKyAgICBpZiAoc29ja19jYWxsKHNlbGYsIDEsIHNvY2tfc2VuZG1zZ19pbXBsLCAmY3R4KSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKworICAgIHJldHZhbCA9IFB5TG9uZ19Gcm9tU3NpemVfdChjdHgucmVzdWx0KTsKKworICBmaW5hbGx5OgorICAgIFB5TWVtX0ZyZWUoY29udHJvbGJ1Zik7CisgICAgaWYgKGl2LmJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJml2KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5kYXRhYnVmczsgaSsrKQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhYnVmc1tpXSk7CisgICAgUHlNZW1fRnJlZShkYXRhYnVmcyk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworUHlEb2NfU1RSVkFSKHNlbmRtc2dfYWZhbGdfZG9jLAorInNlbmRtc2dfYWZhbGcoW21zZ10sICosIG9wWywgaXZbLCBhc3NvY2xlblssIGZsYWdzPU1TR19NT1JFXV1dKVxuXAorXG5cCitTZXQgb3BlcmF0aW9uIG1vZGUsIElWIGFuZCBsZW5ndGggb2YgYXNzb2NpYXRlZCBkYXRhIGZvciBhbiBBRl9BTEdcblwKK29wZXJhdGlvbiBzb2NrZXQuIik7CisjZW5kaWYKIAogLyogcy5zaHV0ZG93bihob3cpIG1ldGhvZCAqLwogCkBAIC00MDM1LDYgKzQzNDksMTcgQEAKICAgICAgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KKyNpZiBkZWZpbmVkKFNJT19MT09QQkFDS19GQVNUX1BBVEgpCisgICAgY2FzZSBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIOiB7CisgICAgICAgIHVuc2lnbmVkIGludCBvcHRpb247CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmcsICJrSTppb2N0bCIsICZjbWQsICZvcHRpb24pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChXU0FJb2N0bChzLT5zb2NrX2ZkLCBjbWQsICZvcHRpb24sIHNpemVvZihvcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7IH0KKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBpb2N0bCBjb21tYW5kICVkIiwgY21kKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MDQ1LDcgKzQzNzAsOCBAQAogXG5cCiBDb250cm9sIHRoZSBzb2NrZXQgd2l0aCBXU0FJb2N0bCBzeXNjYWxsLiBDdXJyZW50bHkgc3VwcG9ydGVkICdjbWQnIHZhbHVlcyBhcmVcblwKIFNJT19SQ1ZBTEw6ICAnb3B0aW9uJyBtdXN0IGJlIG9uZSBvZiB0aGUgc29ja2V0LlJDVkFMTF8qIGNvbnN0YW50cy5cblwKLVNJT19LRUVQQUxJVkVfVkFMUzogICdvcHRpb24nIGlzIGEgdHVwbGUgb2YgKG9ub2ZmLCB0aW1lb3V0LCBpbnRlcnZhbCkuIik7CitTSU9fS0VFUEFMSVZFX1ZBTFM6ICAnb3B0aW9uJyBpcyBhIHR1cGxlIG9mIChvbm9mZiwgdGltZW91dCwgaW50ZXJ2YWwpLlxuXAorU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSDogJ29wdGlvbicgaXMgYSBib29sZWFuIHZhbHVlLCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCIpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCkBAIC00MTQ0LDYgKzQ0NzAsMTAgQEAKICAgICB7InNlbmRtc2ciLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZG1zZywgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgICAgIHNlbmRtc2dfZG9jfSwKICNlbmRpZgorI2lmZGVmIEhBVkVfU09DS0FERFJfQUxHCisgICAgeyJzZW5kbXNnX2FmYWxnIiwgICAgIChQeUNGdW5jdGlvbilzb2NrX3NlbmRtc2dfYWZhbGcsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgc2VuZG1zZ19hZmFsZ19kb2N9LAorI2VuZGlmCiAgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNDE2NCwyMiArNDQ5NCw0NSBAQAogICAgRmlyc3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRpb24uICovCiAKIHN0YXRpYyB2b2lkCitzb2NrX2ZpbmFsaXplKFB5U29ja2V0U29ja09iamVjdCAqcykKK3sKKyAgICBTT0NLRVRfVCBmZDsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKworICAgIGlmIChzLT5zb2NrX2ZkICE9IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIGlmIChQeUVycl9SZXNvdXJjZVdhcm5pbmcoKFB5T2JqZWN0ICopcywgMSwgInVuY2xvc2VkICVSIiwgcykpIHsKKyAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKilzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE9ubHkgY2xvc2UgdGhlIHNvY2tldCAqYWZ0ZXIqIGxvZ2dpbmcgdGhlIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgICAgICAgICAgIHRvIGFsbG93IHRoZSBsb2dnZXIgdG8gY2FsbCBzb2NrZXQgbWV0aG9kcyBsaWtlCisgICAgICAgICAgIHNvY2tldC5nZXRzb2NrbmFtZSgpLiBJZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBiZWZvcmUsIHNvY2tldAorICAgICAgICAgICBtZXRob2RzIGZhaWxzIHdpdGggdGhlIEVCQURGIGVycm9yLiAqLworICAgICAgICBmZCA9IHMtPnNvY2tfZmQ7CisgICAgICAgIHMtPnNvY2tfZmQgPSBJTlZBTElEX1NPQ0tFVDsKKworICAgICAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUgc29ja19jbG9zZSgpICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKGZkKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKK30KKworc3RhdGljIHZvaWQKIHNvY2tfZGVhbGxvYyhQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0gICAgaWYgKHMtPnNvY2tfZmQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOwotICAgICAgICBQeV9zc2l6ZV90IG9sZF9yZWZjb3VudCA9IFB5X1JFRkNOVChzKTsKLSAgICAgICAgKytQeV9SRUZDTlQocyk7Ci0gICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7Ci0gICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX1Jlc291cmNlV2FybmluZywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuY2xvc2VkICVSIiwgcykpCi0gICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLwotICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpCi0gICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKSBzKTsKLSAgICAgICAgUHlFcnJfUmVzdG9yZShleGMsIHZhbCwgdGIpOwotICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0Uocy0+c29ja19mZCk7Ci0gICAgICAgIFB5X1JFRkNOVChzKSA9IG9sZF9yZWZjb3VudDsKLSAgICB9CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYygoUHlPYmplY3QgKilzKSA8IDApCisgICAgICAgIHJldHVybjsKKwogICAgIFB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CiB9CiAKQEAgLTQzOTYsNyArNDc0OSw4IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRQorICAgICAgICB8IFB5X1RQRkxBR1NfSEFWRV9GSU5BTElaRSwgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBzb2NrX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC00NDE2LDYgKzQ3NzAsMTUgQEAKICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgc29ja19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWNoZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3ViY2xhc3NlcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdmVyc2lvbl90YWcgKi8KKyAgICAoZGVzdHJ1Y3Rvcilzb2NrX2ZpbmFsaXplLCAgICAgICAgICAgICAgICAgIC8qIHRwX2ZpbmFsaXplICovCiB9OwogCiAKQEAgLTU0NTEsMTAgKzU4MTQsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhyZXR2YWwpOwogICAgIH0KLQotICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiaW52YWxpZCBoYW5kbGluZyBvZiBpbmV0X250b3AiKTsKLSAgICByZXR1cm4gTlVMTDsKIH0KIAogI2VsaWYgZGVmaW5lZChNU19XSU5ET1dTKQpAQCAtNjE4OCw5ICs2NTQ3LDYgQEAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBRl9VTlNQRUMpOwogI2VuZGlmCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfSU5FVCk7Ci0jaWZkZWYgQUZfSU5FVDYKLSAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBRl9JTkVUNik7Ci0jZW5kaWYgLyogQUZfSU5FVDYgKi8KICNpZiBkZWZpbmVkKEFGX1VOSVgpCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfVU5JWCk7CiAjZW5kaWYgLyogQUZfVU5JWCAqLwpAQCAtNjIyMSw2ICs2NTc3LDkgQEAKICAgICAvKiBSZXNlcnZlZCBmb3IgV2VybmVyJ3MgQVRNICovCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfQUFMNSk7CiAjZW5kaWYKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX0FMRworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX0FMRyk7IC8qIExpbnV4IGNyeXB0byAqLworI2VuZGlmCiAjaWZkZWYgQUZfWDI1CiAgICAgLyogUmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdCAqLwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX1gyNSk7CkBAIC02MjgyLDYgKzY2NDEsOSBAQAogI2lmZGVmIE5FVExJTktfVEFQQkFTRQogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE5FVExJTktfVEFQQkFTRSk7CiAjZW5kaWYKKyNpZmRlZiBORVRMSU5LX0NSWVBUTworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE5FVExJTktfQ1JZUFRPKTsKKyNlbmRpZgogI2VuZGlmIC8qIEFGX05FVExJTksgKi8KICNpZmRlZiBBRl9ST1VURQogICAgIC8qIEFsaWFzIHRvIGVtdWxhdGUgNC40QlNEICovCkBAIC02NDM1LDExICs2Nzk3LDMwIEBACiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgVElQQ19UT1BfU1JWKTsKICNlbmRpZgogCisjaWZkZWYgSEFWRV9TT0NLQUREUl9BTEcKKyAgICAvKiBTb2NrZXQgb3B0aW9ucyAqLworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19TRVRfS0VZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfU0VUX0lWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfU0VUX09QKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfU0VUX0FFQURfQVNTT0NMRU4pOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19TRVRfQUVBRF9BVVRIU0laRSk7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX1NFVF9QVUJLRVkpOworCisgICAgLyogT3BlcmF0aW9ucyAqLworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19PUF9ERUNSWVBUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBBTEdfT1BfRU5DUllQVCk7CisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUxHX09QX1NJR04pOworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFMR19PUF9WRVJJRlkpOworI2VuZGlmCisKICAgICAvKiBTb2NrZXQgdHlwZXMgKi8KICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0NLX1NUUkVBTSk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09DS19ER1JBTSk7CiAvKiBXZSBoYXZlIGluY29tcGxldGUgc29ja2V0IHN1cHBvcnQuICovCisjaWZkZWYgU09DS19SQVcKKyAgICAvKiBTT0NLX1JBVyBpcyBtYXJrZWQgYXMgb3B0aW9uYWwgaW4gdGhlIFBPU0lYIHNwZWNpZmljYXRpb24gKi8KICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0NLX1JBVyk7CisjZW5kaWYKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0NLX1NFUVBBQ0tFVCk7CiAjaWYgZGVmaW5lZChTT0NLX1JETSkKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT0NLX1JETSk7CkBAIC02NDgyLDkgKzY4NjMsMTEgQEAKICNpZmRlZiAgU09fT09CSU5MSU5FCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fT09CSU5MSU5FKTsKICNlbmRpZgorI2lmbmRlZiBfX0dOVV9fCiAjaWZkZWYgIFNPX1JFVVNFUE9SVAogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1JFVVNFUE9SVCk7CiAjZW5kaWYKKyNlbmRpZgogI2lmZGVmICBTT19TTkRCVUYKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19TTkRCVUYpOwogI2VuZGlmCkBAIC02NTIxLDYgKzY5MDQsMTIgQEAKICNpZmRlZiAgTE9DQUxfUEVFUkNSRUQKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBMT0NBTF9QRUVSQ1JFRCk7CiAjZW5kaWYKKyNpZmRlZiAgU09fUEFTU1NFQworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1BBU1NTRUMpOworI2VuZGlmCisjaWZkZWYgIFNPX1BFRVJTRUMKKyAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19QRUVSU0VDKTsKKyNlbmRpZgogI2lmZGVmICBTT19CSU5EVE9ERVZJQ0UKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19CSU5EVE9ERVZJQ0UpOwogI2VuZGlmCkBAIC02NTMwLDYgKzY5MTksMTIgQEAKICNpZmRlZiAgU09fTUFSSwogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX01BUkspOwogI2VuZGlmCisjaWZkZWYgU09fRE9NQUlOCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fRE9NQUlOKTsKKyNlbmRpZgorI2lmZGVmIFNPX1BST1RPQ09MCisgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fUFJPVE9DT0wpOworI2VuZGlmCiAKICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBmb3IgImxpc3RlbiIgKi8KICNpZmRlZiAgU09NQVhDT05OCkBAIC02NTM4LDcgKzY5MzMsNyBAQAogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT01BWENPTk4iLCA1KTsgLyogQ29tbW9uIHZhbHVlICovCiAjZW5kaWYKIAotICAgIC8qIEFuY2lsbGlhcnkgbWVzc2FnZSB0eXBlcyAqLworICAgIC8qIEFuY2lsbGFyeSBtZXNzYWdlIHR5cGVzICovCiAjaWZkZWYgIFNDTV9SSUdIVFMKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTQ01fUklHSFRTKTsKICNlbmRpZgpAQCAtNjY4OCw2ICs3MDgzLDkgQEAKICNpZmRlZiBTT0xfUkRTCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09MX1JEUyk7CiAjZW5kaWYKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX0FMRworICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPTF9BTEcpOworI2VuZGlmCiAjaWZkZWYgUkRTX0NBTkNFTF9TRU5UX1RPCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUkRTX0NBTkNFTF9TRU5UX1RPKTsKICNlbmRpZgpAQCAtNzIyNSw4ICs3NjIzLDE2IEBACiAKICNpZmRlZiBTSU9fUkNWQUxMCiAgICAgewotICAgICAgICBEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMU307Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7IlNJT19SQ1ZBTEwiLCAiU0lPX0tFRVBBTElWRV9WQUxTIn07CisgICAgICAgIERXT1JEIGNvZGVzW10gPSB7U0lPX1JDVkFMTCwgU0lPX0tFRVBBTElWRV9WQUxTLAorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICAgICAgICAgIFNJT19MT09QQkFDS19GQVNUX1BBVEgKKyNlbmRpZgorICAgICAgICB9OworICAgICAgICBjb25zdCBjaGFyICpuYW1lc1tdID0geyJTSU9fUkNWQUxMIiwgIlNJT19LRUVQQUxJVkVfVkFMUyIsCisjaWYgZGVmaW5lZChTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIKQorICAgICAgICAgICAgIlNJT19MT09QQkFDS19GQVNUX1BBVEgiCisjZW5kaWYKKyAgICAgICAgfTsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvcihpID0gMDsgaTxQeV9BUlJBWV9MRU5HVEgoY29kZXMpOyArK2kpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp0bXA7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IDRiOWYzY2QuLjU1NmE3MTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC0xMzcsNyArMTM3LDEwIEBACiAgICAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKGJ5dGVzLCAmbmFtZSwgTlVMTCkgPT0gLTEpCiAgICAgICAgIGdvdG8gb3V0OwogICAgIGlmICgocCA9IGdldHNwbmFtKG5hbWUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgImdldHNwbmFtKCk6IG5hbWUgbm90IGZvdW5kIik7CisgICAgICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAgICAgcmV0dmFsID0gbWtzcGVudChwKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc3JlX2xpYi5oIGIvTW9kdWxlcy9zcmVfbGliLmgKaW5kZXggMTI4YzcxZS4uMDg2NWZjNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zcmVfbGliLmgKKysrIGIvTW9kdWxlcy9zcmVfbGliLmgKQEAgLTM2NywxNCArMzY3LDEyIEBACiAjZGVmaW5lIFJFVFVSTl9PTl9GQUlMVVJFKGkpIFwKICAgICBkbyB7IFJFVFVSTl9PTl9FUlJPUihpKTsgaWYgKGkgPT0gMCkgUkVUVVJOX0ZBSUxVUkU7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0ZZKHgpICN4Ci0KICNkZWZpbmUgREFUQV9TVEFDS19BTExPQyhzdGF0ZSwgdHlwZSwgcHRyKSBcCiBkbyB7IFwKICAgICBhbGxvY19wb3MgPSBzdGF0ZS0+ZGF0YV9zdGFja19iYXNlOyBcCiAgICAgVFJBQ0UoKCJhbGxvY2F0aW5nICVzIGluICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgIiBcCiAgICAgICAgICAgICIoJSIgUFlfRk9STUFUX1NJWkVfVCAiZClcbiIsIFwKLSAgICAgICAgICAgU0ZZKHR5cGUpLCBhbGxvY19wb3MsIHNpemVvZih0eXBlKSkpOyBcCisgICAgICAgICAgIFB5X1NUUklOR0lGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAogICAgIGlmIChzaXplb2YodHlwZSkgPiBzdGF0ZS0+ZGF0YV9zdGFja19zaXplIC0gYWxsb2NfcG9zKSB7IFwKICAgICAgICAgaW50IGogPSBkYXRhX3N0YWNrX2dyb3coc3RhdGUsIHNpemVvZih0eXBlKSk7IFwKICAgICAgICAgaWYgKGogPCAwKSByZXR1cm4gajsgXApAQCAtMzg3LDcgKzM4NSw3IEBACiAKICNkZWZpbmUgREFUQV9TVEFDS19MT09LVVBfQVQoc3RhdGUsIHR5cGUsIHB0ciwgcG9zKSBcCiBkbyB7IFwKLSAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgU0ZZKHR5cGUpLCBwb3MpKTsgXAorICAgIFRSQUNFKCgibG9va2luZyB1cCAlcyBhdCAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLCBQeV9TVFJJTkdJRlkodHlwZSksIHBvcykpOyBcCiAgICAgcHRyID0gKHR5cGUqKShzdGF0ZS0+ZGF0YV9zdGFjaytwb3MpOyBcCiB9IHdoaWxlICgwKQogCkBAIC01MzEsNyArNTI5LDcgQEAKICAgICBpZiAoY3R4LT5wYXR0ZXJuWzBdID09IFNSRV9PUF9JTkZPKSB7CiAgICAgICAgIC8qIG9wdGltaXphdGlvbiBpbmZvIGJsb2NrICovCiAgICAgICAgIC8qIDxJTkZPPiA8MT1za2lwPiA8Mj1mbGFncz4gPDM9bWluPiAuLi4gKi8KLSAgICAgICAgaWYgKGN0eC0+cGF0dGVyblszXSAmJiAoUHlfdWludHB0cl90KShlbmQgLSBjdHgtPnB0cikgPCBjdHgtPnBhdHRlcm5bM10pIHsKKyAgICAgICAgaWYgKGN0eC0+cGF0dGVyblszXSAmJiAodWludHB0cl90KShlbmQgLSBjdHgtPnB0cikgPCBjdHgtPnBhdHRlcm5bM10pIHsKICAgICAgICAgICAgIFRSQUNFKCgicmVqZWN0IChnb3QgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBjaGFycywgIgogICAgICAgICAgICAgICAgICAgICJuZWVkICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLAogICAgICAgICAgICAgICAgICAgIGVuZCAtIGN0eC0+cHRyLCAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzNdKSk7CkBAIC0xMjU2LDcgKzEyNTQsMzIgQEAKICAgICAgICAgICAgcHJlZml4LCBwcmVmaXhfbGVuLCBwcmVmaXhfc2tpcCkpOwogICAgIFRSQUNFKCgiY2hhcnNldCA9ICVwXG4iLCBjaGFyc2V0KSk7CiAKLSNpZiBkZWZpbmVkKFVTRV9GQVNUX1NFQVJDSCkKKyAgICBpZiAocHJlZml4X2xlbiA9PSAxKSB7CisgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3RlciAqLworICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwcmVmaXhbMF07CisjaWYgU0laRU9GX1NSRV9DSEFSIDwgNAorICAgICAgICBpZiAoKFNSRV9DT0RFKSBjICE9IHByZWZpeFswXSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBsaXRlcmFsIGNhbid0IG1hdGNoOiBkb2Vzbid0IGZpdCBpbiBjaGFyIHdpZHRoICovCisjZW5kaWYKKyAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKKyAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCkgeworICAgICAgICAgICAgd2hpbGUgKCpwdHIgIT0gYykgeworICAgICAgICAgICAgICAgIGlmICgrK3B0ciA+PSBlbmQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8U0VBUkNIIExJVEVSQUxcbiIsIHBhdHRlcm4sIHB0cikpOworICAgICAgICAgICAgc3RhdGUtPnN0YXJ0ID0gcHRyOworICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHB0ciArIHByZWZpeF9za2lwOworICAgICAgICAgICAgaWYgKGZsYWdzICYgU1JFX0lORk9fTElURVJBTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogd2UgZ290IGFsbCBvZiBpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gU1JFKG1hdGNoKShzdGF0ZSwgcGF0dGVybiArIDIqcHJlZml4X3NraXAsIDApOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICArK3B0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBpZiAocHJlZml4X2xlbiA+IDEpIHsKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGtub3duIHByZWZpeC4gIHVzZSB0aGUgb3ZlcmxhcAogICAgICAgICAgICB0YWJsZSB0byBza2lwIGZvcndhcmQgYXMgZmFzdCBhcyB3ZSBwb3NzaWJseSBjYW4gKi8KQEAgLTEzMDUsMzIgKzEzMjgsOCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSNlbmRpZgogCi0gICAgaWYgKHBhdHRlcm5bMF0gPT0gU1JFX09QX0xJVEVSQUwpIHsKLSAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGxpdGVyYWwgY2hhcmFjdGVyLiAgdGhpcyBpcyB1c2VkCi0gICAgICAgICAgIGZvciBzaG9ydCBwcmVmaXhlcywgYW5kIGlmIGZhc3Qgc2VhcmNoIGlzIGRpc2FibGVkICovCi0gICAgICAgIFNSRV9DSEFSIGMgPSAoU1JFX0NIQVIpIHBhdHRlcm5bMV07Ci0jaWYgU0laRU9GX1NSRV9DSEFSIDwgNAotICAgICAgICBpZiAoKFNSRV9DT0RFKSBjICE9IHBhdHRlcm5bMV0pCi0gICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLwotI2VuZGlmCi0gICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7Ci0gICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKLSAgICAgICAgICAgIHN0YXRlLT5wdHIgPSArK3B0cjsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyLCAwKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY2hhcnNldCkgeworICAgIGlmIChjaGFyc2V0KSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBjaGFyYWN0ZXIgZnJvbSBhIGtub3duIHNldCAqLwogICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICBmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCmluZGV4IGQyY2FhY2QuLjk0NzQ2NDQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCkBAIC0zMTEsNyArMzExLDcgQEAKICAgIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2VzcyAocGFyYWxsZWxzIFB5QXJnX1BhcnNlVHVwbGUpLgogKi8KIHN0YXRpYyBpbnQKLXBhcnNlX3RpbWVfdF9hcmdzKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIHRpbWVfdCAqcHdoZW4pCitwYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQogewogICAgIFB5T2JqZWN0ICpvdCA9IE5VTEw7CiAgICAgdGltZV90IHdoZW50OwpAQCAtNzMyLDEwICs3MzIsMTAgQEAKIHsKICAgICAvKiBJbnNwaXJlZCBieSBPcGVuIEdyb3VwIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgYXQKICAgICAgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9hc2N0aW1lLmh0bWwgKi8KLSAgICBzdGF0aWMgY2hhciB3ZGF5X25hbWVbN11bNF0gPSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgd2RheV9uYW1lWzddWzRdID0gewogICAgICAgICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgogICAgIH07Ci0gICAgc3RhdGljIGNoYXIgbW9uX25hbWVbMTJdWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgogICAgIH07CkBAIC0xMDM0LDYgKzEwMzQsNyBAQAogICAgIH0KICNlbmRpZgogCisgICAgLyogQ3VycmVudGx5LCBQeXRob24gMyByZXF1aXJlcyBjbG9jaygpIHRvIGJ1aWxkOiBzZWUgaXNzdWUgIzIyNjI0ICovCiAgICAgcmV0dXJuIGZsb2F0Y2xvY2soaW5mbyk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCBmZTRlOTA4Li43ZDUxOGZhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC04ODQsNyArODg0LDcgQEAKICAgICByZXR1cm4gaDsKIH0KIAotc3RhdGljIGNoYXIgKmhhbmd1bF9zeWxsYWJsZXNbXVszXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGFuZ3VsX3N5bGxhYmxlc1tdWzNdID0gewogICAgIHsgIkciLCAgIkEiLCAgICIiICAgfSwKICAgICB7ICJHRyIsICJBRSIsICAiRyIgIH0sCiAgICAgeyAiTiIsICAiWUEiLCAgIkdHIiB9LApAQCAtMTA1Nyw3ICsxMDU3LDcgQEAKICAgICBpbnQgaSwgbGVuMTsKICAgICAqbGVuID0gLTE7CiAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgY2hhciAqcyA9IGhhbmd1bF9zeWxsYWJsZXNbaV1bY29sdW1uXTsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IGhhbmd1bF9zeWxsYWJsZXNbaV1bY29sdW1uXTsKICAgICAgICAgbGVuMSA9IFB5X1NBRkVfRE9XTkNBU1Qoc3RybGVuKHMpLCBzaXplX3QsIGludCk7CiAgICAgICAgIGlmIChsZW4xIDw9ICpsZW4pCiAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvd2lucmVwYXJzZS5oIGIvTW9kdWxlcy93aW5yZXBhcnNlLmgKaW5kZXggNjZmNzc3NS4uMjgwNDljOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy93aW5yZXBhcnNlLmgKKysrIGIvTW9kdWxlcy93aW5yZXBhcnNlLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIFB5X1dJTlJFUEFSU0VfSAogCiAjaWZkZWYgTVNfV0lORE9XUwotI2luY2x1ZGUgPFdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0xMCw5ICsxMCwxMCBAQAogCiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB3YXMgY29waWVkIGZyb20KICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjU1MjAxMi5hc3B4IGFzIHRoZSByZXF1aXJlZAotICAgaW5jbHVkZSBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudCBpbiB0aGUgV2luZG93cyBTREsgKGF0IGxlYXN0IGFzIGluY2x1ZGVkCi0gICB3aXRoIFZpc3VhbCBTdHVkaW8gRXhwcmVzcykuICovCi10eXBlZGVmIHN0cnVjdCBfUkVQQVJTRV9EQVRBX0JVRkZFUiB7CisgICBpbmNsdWRlIGttXG50aWZzLmggaXNuJ3QgcHJlc2VudCBpbiB0aGUgV2luZG93cyBTREsgKGF0IGxlYXN0IGFzIGluY2x1ZGVkCisgICB3aXRoIFZpc3VhbCBTdHVkaW8gRXhwcmVzcykuIFVzZSB1bmlxdWUgbmFtZXMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aAorICAgdGhlIHN0cnVjdHVyZSBhcyBkZWZpbmVkIGJ5IE1pbiBHVy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKICAgICBVTE9ORyBSZXBhcnNlVGFnOwogICAgIFVTSE9SVCBSZXBhcnNlRGF0YUxlbmd0aDsKICAgICBVU0hPUlQgUmVzZXJ2ZWQ7CkBAIC0zOCwxMSArMzksMTEgQEAKICAgICAgICAgICAgIFVDSEFSICBEYXRhQnVmZmVyWzFdOwogICAgICAgICB9IEdlbmVyaWNSZXBhcnNlQnVmZmVyOwogICAgIH07Ci19IFJFUEFSU0VfREFUQV9CVUZGRVIsICpQUkVQQVJTRV9EQVRBX0JVRkZFUjsKK30gX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIsICpfUHlfUFJFUEFSU0VfREFUQV9CVUZGRVI7CiAKLSNkZWZpbmUgUkVQQVJTRV9EQVRBX0JVRkZFUl9IRUFERVJfU0laRSAgRklFTERfT0ZGU0VUKFJFUEFSU0VfREFUQV9CVUZGRVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpY1JlcGFyc2VCdWZmZXIpCi0jZGVmaW5lIE1BWElNVU1fUkVQQVJTRV9EQVRBX0JVRkZFUl9TSVpFICAoIDE2ICogMTAyNCApCisjZGVmaW5lIF9QeV9SRVBBUlNFX0RBVEFfQlVGRkVSX0hFQURFUl9TSVpFIFwKKyAgICBGSUVMRF9PRkZTRVQoX1B5X1JFUEFSU0VfREFUQV9CVUZGRVIsIEdlbmVyaWNSZXBhcnNlQnVmZmVyKQorI2RlZmluZSBfUHlfTUFYSU1VTV9SRVBBUlNFX0RBVEFfQlVGRkVSX1NJWkUgICggMTYgKiAxMDI0ICkKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bGltaXRlZC5jIGIvTW9kdWxlcy94eGxpbWl0ZWQuYwppbmRleCA0MGMxNzYwLi5jMWE5YmU5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bGltaXRlZC5jCisrKyBiL01vZHVsZXMveHhsaW1pdGVkLmMKQEAgLTg5LDcgKzg5LDcgQEAKIH0KIAogc3RhdGljIGludAotWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK1h4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CiAgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMveHhtb2R1bGUuYyBiL01vZHVsZXMveHhtb2R1bGUuYwppbmRleCA4NTIzMGQ5Li4wNzY0NDA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy94eG1vZHVsZS5jCkBAIC03Niw3ICs3Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3ppcGltcG9ydC5jIGIvTW9kdWxlcy96aXBpbXBvcnQuYwppbmRleCBlODQwMjcxLi42ZDVjNjhhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3ppcGltcG9ydC5jCisrKyBiL01vZHVsZXMvemlwaW1wb3J0LmMKQEAgLTEzMTUsNyArMTMxNSw3IEBACiAgICAgcmV0dXJuIGNvZGU7CiB9CiAKLS8qIFJlcGxhY2UgYW55IG9jY3VyYW5jZXMgb2YgIlxyXG4/IiBpbiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggIlxuIi4KKy8qIFJlcGxhY2UgYW55IG9jY3VycmVuY2VzIG9mICJcclxuPyIgaW4gdGhlIGlucHV0IHN0cmluZyB3aXRoICJcbiIuCiAgICBUaGlzIGNvbnZlcnRzIERPUyBhbmQgTWFjIGxpbmUgZW5kaW5ncyB0byBVbml4IGxpbmUgZW5kaW5ncy4KICAgIEFsc28gYXBwZW5kIGEgdHJhaWxpbmcgIlxuIiB0byBiZSBjb21wYXRpYmxlIHdpdGgKICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZSgpLiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4gKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggZmNjYjYxNi4uNGNkZWQzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTU3LDcgKzU3LDcgQEAKIH0gY29tcG9iamVjdDsKIAogc3RhdGljIHZvaWQKLXpsaWJfZXJyb3Ioel9zdHJlYW0genN0LCBpbnQgZXJyLCBjaGFyICptc2cpCit6bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY29uc3QgY2hhciAqbXNnKQogewogICAgIGNvbnN0IGNoYXIgKnptc2cgPSBaX05VTEw7CiAgICAgLyogSW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIHpzdC5tc2cgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuCkBAIC0xOTksMTggKzE5OSwxOCBAQAogLypbY2xpbmljIGlucHV0XQogemxpYi5jb21wcmVzcwogCi0gICAgYnl0ZXM6IFB5X2J1ZmZlcgorICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgICAgICBCaW5hcnkgZGF0YSB0byBiZSBjb21wcmVzc2VkLgotICAgIGxldmVsOiBpbnQoY19kZWZhdWx0PSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iKSA9IFpfREVGQVVMVF9DT01QUkVTU0lPTgotICAgICAgICBDb21wcmVzc2lvbiBsZXZlbCwgaW4gMC05LgogICAgIC8KKyAgICBsZXZlbDogaW50KGNfZGVmYXVsdD0iWl9ERUZBVUxUX0NPTVBSRVNTSU9OIikgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04KKyAgICAgICAgQ29tcHJlc3Npb24gbGV2ZWwsIGluIDAtOSBvciAtMS4KIAogUmV0dXJucyBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIGNvbXByZXNzZWQgZGF0YS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLXpsaWJfY29tcHJlc3NfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmJ5dGVzLCBpbnQgbGV2ZWwpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YWU2NGMyYzMwNzYzMjFhMCBpbnB1dD1iZTNhYmU5OTM0YmRhNGIzXSovCit6bGliX2NvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbGV2ZWwpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDgwOTA2ZDczZjYyOTRjOCBpbnB1dD02MzhkNTRiNjMxNWRiZWQzXSovCiB7CiAgICAgUHlPYmplY3QgKlJldFZhbCA9IE5VTEw7CiAgICAgQnl0ZSAqaWJ1ZjsKQEAgLTIxOCw4ICsyMTgsOCBAQAogICAgIGludCBlcnIsIGZsdXNoOwogICAgIHpfc3RyZWFtIHpzdDsKIAotICAgIGlidWYgPSBieXRlcy0+YnVmOwotICAgIGlidWZsZW4gPSBieXRlcy0+bGVuOworICAgIGlidWYgPSBkYXRhLT5idWY7CisgICAgaWJ1ZmxlbiA9IGRhdGEtPmxlbjsKIAogICAgIHpzdC5vcGFxdWUgPSBOVUxMOwogICAgIHpzdC56YWxsb2MgPSBQeVpsaWJfTWFsbG9jOwpAQCAtMzE4LDExICszMTgsMTEgQEAKIAogICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgICAgICBDb21wcmVzc2VkIGRhdGEuCisgICAgLwogICAgIHdiaXRzOiBpbnQoY19kZWZhdWx0PSJNQVhfV0JJVFMiKSA9IE1BWF9XQklUUwogICAgICAgICBUaGUgd2luZG93IGJ1ZmZlciBzaXplIGFuZCBjb250YWluZXIgZm9ybWF0LgogICAgIGJ1ZnNpemU6IHNzaXplX3QoY19kZWZhdWx0PSJERUZfQlVGX1NJWkUiKSA9IERFRl9CVUZfU0laRQogICAgICAgICBUaGUgaW5pdGlhbCBvdXRwdXQgYnVmZmVyIHNpemUuCi0gICAgLwogCiBSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMzMwLDcgKzMzMCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogemxpYl9kZWNvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgd2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGJ1ZnNpemUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzdjN2UzNTExMWRjOGM0MiBpbnB1dD1jMTNkZDJjNTY5NmNkMTdmXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzdjN2UzNTExMWRjOGM0MiBpbnB1dD0yMTk2MDkzNjIwOGU5YTViXSovCiB7CiAgICAgUHlPYmplY3QgKlJldFZhbCA9IE5VTEw7CiAgICAgQnl0ZSAqaWJ1ZjsKQEAgLTc1MCwxMSArNzUwLDExIEBACiAKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICAgICAgVGhlIGJpbmFyeSBkYXRhIHRvIGRlY29tcHJlc3MuCisgICAgLwogICAgIG1heF9sZW5ndGg6IHNzaXplX3QgPSAwCiAgICAgICAgIFRoZSBtYXhpbXVtIGFsbG93YWJsZSBsZW5ndGggb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhLgogICAgICAgICBVbmNvbnN1bWVkIGlucHV0IGRhdGEgd2lsbCBiZSBzdG9yZWQgaW4KICAgICAgICAgdGhlIHVuY29uc3VtZWRfdGFpbCBhdHRyaWJ1dGUuCi0gICAgLwogCiBSZXR1cm4gYSBieXRlcyBvYmplY3QgY29udGFpbmluZyB0aGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCiAKQEAgLTc2Niw3ICs3NjYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHpsaWJfRGVjb21wcmVzc19kZWNvbXByZXNzX2ltcGwoY29tcG9iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmU1MTczYzc0ZTcxMDM1MiBpbnB1dD1kNmRlOWI1M2M0NTY2YjhhXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmU1MTczYzc0ZTcxMDM1MiBpbnB1dD1iODVhMjEyYTAxMmI3NzBhXSovCiB7CiAgICAgaW50IGVyciA9IFpfT0s7CiAgICAgUHlfc3NpemVfdCBpYnVmbGVuLCBvYnVmbGVuID0gREVGX0JVRl9TSVpFLCBoYXJkX2xpbWl0OwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAKICJ6bGliIGxpYnJhcnksIHdoaWNoIGlzIGJhc2VkIG9uIEdOVSB6aXAuXG4iCiAiXG4iCiAiYWRsZXIzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYW4gQWRsZXItMzIgY2hlY2tzdW0uXG4iCi0iY29tcHJlc3Moc3RyaW5nWywgbGV2ZWxdKSAtLSBDb21wcmVzcyBzdHJpbmcsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgaW4gMC05LlxuIgorImNvbXByZXNzKGRhdGFbLCBsZXZlbF0pIC0tIENvbXByZXNzIGRhdGEsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMC05IG9yIC0xLlxuIgogImNvbXByZXNzb2JqKFtsZXZlbFssIC4uLl1dKSAtLSBSZXR1cm4gYSBjb21wcmVzc29yIG9iamVjdC5cbiIKICJjcmMzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYSBDUkMtMzIgY2hlY2tzdW0uXG4iCiAiZGVjb21wcmVzcyhzdHJpbmcsW3diaXRzXSxbYnVmc2l6ZV0pIC0tIERlY29tcHJlc3NlcyBhIGNvbXByZXNzZWQgc3RyaW5nLlxuIgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IDg4MjA1YmQuLmQ4NzZkYzUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTMyLDggKzMyLDEwIEBACiB7CiAgICAgUHlPYmplY3QgKnY7CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICB2ID0gKFB5T2JqZWN0ICopby0+b2JfdHlwZTsKICAgICBQeV9JTkNSRUYodik7CiAgICAgcmV0dXJuIHY7CkBAIC0xMzcsMTIgKzEzOSwxNiBAQAogewogICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLSAgICBpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLSAgICBpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpCi0gICAgICAgIHJldHVybiBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKKyAgICBpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKKyAgICAgICAgYXNzZXJ0KChpdGVtICE9IE5VTEwpIF4gKFB5RXJyX09jY3VycmVkKCkgIT0gTlVMTCkpOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CiAKICAgICBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKICAgICAgICAgaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgewpAQCAtNjY5LDEzICs2NzUsMzEgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKICAgICBfUHlfSURFTlRJRklFUihfX2Zvcm1hdF9fKTsKIAorICAgIGlmIChmb3JtYXRfc3BlYyAhPSBOVUxMICYmICFQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJGb3JtYXQgc3BlY2lmaWVyIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShmb3JtYXRfc3BlYyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBGYXN0IHBhdGggZm9yIGNvbW1vbiB0eXBlcy4gKi8KKyAgICBpZiAoZm9ybWF0X3NwZWMgPT0gTlVMTCB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSChmb3JtYXRfc3BlYykgPT0gMCkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxvbmdfQ2hlY2tFeGFjdChvYmopKSB7CisgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfU3RyKG9iaik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBJZiBubyBmb3JtYXRfc3BlYyBpcyBwcm92aWRlZCwgdXNlIGFuIGVtcHR5IHN0cmluZyAqLwogICAgIGlmIChmb3JtYXRfc3BlYyA9PSBOVUxMKSB7CiAgICAgICAgIGVtcHR5ID0gUHlVbmljb2RlX05ldygwLCAwKTsKICAgICAgICAgZm9ybWF0X3NwZWMgPSBlbXB0eTsKICAgICB9CiAKLSAgICAvKiBGaW5kIHRoZSAodW5ib3VuZCEpIF9fZm9ybWF0X18gbWV0aG9kIChhIGJvcnJvd2VkIHJlZmVyZW5jZSkgKi8KKyAgICAvKiBGaW5kIHRoZSAodW5ib3VuZCEpIF9fZm9ybWF0X18gbWV0aG9kICovCiAgICAgbWV0aCA9IF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKG9iaiwgJlB5SWRfX19mb3JtYXRfXyk7CiAgICAgaWYgKG1ldGggPT0gTlVMTCkgewogICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCkBAIC0xMTIyLDggKzExNDYsMTAgQEAKIHsKICAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwogICAgIGlmIChtICYmIG0tPm5iX25lZ2F0aXZlKQogICAgICAgICByZXR1cm4gKCptLT5uYl9uZWdhdGl2ZSkobyk7CkBAIC0xMTM2LDggKzExNjIsMTAgQEAKIHsKICAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwogICAgIGlmIChtICYmIG0tPm5iX3Bvc2l0aXZlKQogICAgICAgICByZXR1cm4gKCptLT5uYl9wb3NpdGl2ZSkobyk7CkBAIC0xMTUwLDggKzExNzgsMTAgQEAKIHsKICAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLSAgICBpZiAobyA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CisKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwogICAgIGlmIChtICYmIG0tPm5iX2ludmVydCkKICAgICAgICAgcmV0dXJuICgqbS0+bmJfaW52ZXJ0KShvKTsKQEAgLTExNjQsOCArMTE5NCwxMCBAQAogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKwogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfYWJzb2x1dGUpCiAgICAgICAgIHJldHVybiBtLT5uYl9hYnNvbHV0ZShvKTsKQEAgLTExODEsOCArMTIxMywxMCBAQAogUHlOdW1iZXJfSW5kZXgoUHlPYmplY3QgKml0ZW0pCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0gICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQorCiAgICAgaWYgKFB5TG9uZ19DaGVjayhpdGVtKSkgewogICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CiAgICAgICAgIHJldHVybiBpdGVtOwpAQCAtMTI2NSw0MiArMTI5OSw1NSBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbykKIHsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKICAgICBQeU9iamVjdCAqdHJ1bmNfZnVuYzsKICAgICBQeV9idWZmZXIgdmlldzsKICAgICBfUHlfSURFTlRJRklFUihfX3RydW5jX18pOwogCi0gICAgaWYgKG8gPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQorCiAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KG8pKSB7CiAgICAgICAgIFB5X0lOQ1JFRihvKTsKICAgICAgICAgcmV0dXJuIG87CiAgICAgfQogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfaW50KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBpbnQgKi8KLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKV9QeUxvbmdfRnJvbU5iSW50KG8pOworICAgICAgICByZXN1bHQgPSAoUHlPYmplY3QgKilfUHlMb25nX0Zyb21OYkludChvKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmICFQeUxvbmdfQ2hlY2tFeGFjdChyZXN1bHQpKSB7CisgICAgICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHRydW5jX2Z1bmMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChvLCAmUHlJZF9fX3RydW5jX18pOwogICAgIGlmICh0cnVuY19mdW5jKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0cnVuY2F0ZWQgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cnVuY19mdW5jLCBOVUxMKTsKLSAgICAgICAgUHlPYmplY3QgKmludF9pbnN0YW5jZTsKKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRih0cnVuY19mdW5jKTsKLSAgICAgICAgaWYgKHRydW5jYXRlZCA9PSBOVUxMIHx8IFB5TG9uZ19DaGVjayh0cnVuY2F0ZWQpKQotICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZDsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8IFB5TG9uZ19DaGVja0V4YWN0KHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXJlc3VsdCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogICAgICAgICAvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLAogICAgICAgICAgICBidXQgaW50KCkgbmVlZHMgdG8gcmV0dXJuIGFuIGludC4gKi8KLSAgICAgICAgbSA9IHRydW5jYXRlZC0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgICAgICBtID0gcmVzdWx0LT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgICAgIGlmIChtID09IE5VTEwgfHwgbS0+bmJfaW50ID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwgKHR5cGUgJS4yMDBzKSIsCi0gICAgICAgICAgICAgICAgdHJ1bmNhdGVkLT5vYl90eXBlLT50cF9uYW1lKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0cnVuY2F0ZWQpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGludF9pbnN0YW5jZSA9IChQeU9iamVjdCAqKV9QeUxvbmdfRnJvbU5iSW50KHRydW5jYXRlZCk7Ci0gICAgICAgIFB5X0RFQ1JFRih0cnVuY2F0ZWQpOwotICAgICAgICByZXR1cm4gaW50X2luc3RhbmNlOworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCAoUHlPYmplY3QgKilfUHlMb25nX0Zyb21OYkludChyZXN1bHQpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmICFQeUxvbmdfQ2hlY2tFeGFjdChyZXN1bHQpKSB7CisgICAgICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEzMjIsNyArMTM2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9HRVRfU0laRShvKSwgMTApOwogCiAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvLCAmdmlldywgUHlCVUZfU0lNUExFKSA9PSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXN1bHQsICpieXRlczsKKyAgICAgICAgUHlPYmplY3QgKmJ5dGVzOwogCiAgICAgICAgIC8qIENvcHkgdG8gTlVMLXRlcm1pbmF0ZWQgYnVmZmVyLiAqLwogICAgICAgICBieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIgKil2aWV3LmJ1Ziwgdmlldy5sZW4pOwpAQCAtMTM0NiwyMyArMTM5Myw0MyBAQAogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KKworICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QobykpIHsKKyAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICByZXR1cm4gbzsKKyAgICB9CiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKICAgICBpZiAobSAmJiBtLT5uYl9mbG9hdCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgZmxvYXQgKi8KICAgICAgICAgUHlPYmplY3QgKnJlcyA9IG0tPm5iX2Zsb2F0KG8pOwotICAgICAgICBpZiAocmVzICYmICFQeUZsb2F0X0NoZWNrKHJlcykpIHsKKyAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgaWYgKCFyZXMgfHwgUHlGbG9hdF9DaGVja0V4YWN0KHJlcykpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKHJlcykpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICJfX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuMjAwcykiLAotICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICIlLjUwcy5fX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuNTBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgby0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgLyogSXNzdWUgIzI2OTgzOiB3YXJuIGlmICdyZXMnIG5vdCBvZiBleGFjdCB0eXBlIGZsb2F0LiAqLworICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpLiAgIgorICAgICAgICAgICAgICAgICJUaGUgYWJpbGl0eSB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQgIgorICAgICAgICAgICAgICAgICJpcyBkZXByZWNhdGVkLCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uIiwKKyAgICAgICAgICAgICAgICBvLT5vYl90eXBlLT50cF9uYW1lLCByZXMtPm9iX3R5cGUtPnRwX25hbWUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiAgICAgfQogICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7IC8qIEEgZmxvYXQgc3ViY2xhc3Mgd2l0aCBuYl9mbG9hdCA9PSBOVUxMICovCi0gICAgICAgIFB5RmxvYXRPYmplY3QgKnBvID0gKFB5RmxvYXRPYmplY3QgKilvOwotICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBvLT5vYl9mdmFsKTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShQeUZsb2F0X0FTX0RPVUJMRShvKSk7CiAgICAgfQogICAgIHJldHVybiBQeUZsb2F0X0Zyb21TdHJpbmcobyk7CiB9CkBAIC0xNDMwLDggKzE0OTcsOSBAQAogewogICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCisgICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CiAgICAgaWYgKG0gJiYgbS0+c3FfY29uY2F0KQpAQCAtMTQ1NCw4ICsxNTIyLDkgQEAKIHsKICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotICAgIGlmIChvID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKICAgICBpZiAobSAmJiBtLT5zcV9yZXBlYXQpCkBAIC0xNDgzLDggKzE1NTIsOSBAQAogewogICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCisgICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CiAgICAgaWYgKG0gJiYgbS0+c3FfaW5wbGFjZV9jb25jYXQpCkBAIC0xNTA3LDggKzE1NzcsOSBAQAogewogICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0gICAgaWYgKG8gPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwogICAgIGlmIChtICYmIG0tPnNxX2lucGxhY2VfcmVwZWF0KQpAQCAtMTUzNiwxNiArMTYwNywxOSBAQAogewogICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0gICAgaWYgKHMgPT0gTlVMTCkKKyAgICBpZiAocyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwogICAgIGlmIChtICYmIG0tPnNxX2l0ZW0pIHsKICAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaSArPSBsOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTYwLDcgKzE2MzQsOSBAQAogewogICAgIFB5TWFwcGluZ01ldGhvZHMgKm1wOwogCi0gICAgaWYgKCFzKSByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICghcykgeworICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG1wID0gcy0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKICAgICBpZiAobXAgJiYgbXAtPm1wX3N1YnNjcmlwdCkgewpAQCAtMTY4Nyw4ICsxNzYzLDkgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IGo7CiAKLSAgICBpZiAodiA9PSBOVUxMKQorICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICAvKiBTcGVjaWFsLWNhc2UgdGhlIGNvbW1vbiB0dXBsZSBhbmQgbGlzdCBjYXNlcywgZm9yIGVmZmljaWVuY3kuICovCiAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgewpAQCAtMTc2OCw4ICsxODQ1LDkgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0OyAgLyogcmVzdWx0IGxpc3QgKi8KICAgICBQeU9iamVjdCAqcnY7ICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSBmcm9tIFB5TGlzdF9FeHRlbmQgKi8KIAotICAgIGlmICh2ID09IE5VTEwpCisgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQpAQCAtMTc4OSw4ICsxODY3LDkgQEAKIHsKICAgICBQeU9iamVjdCAqaXQ7CiAKLSAgICBpZiAodiA9PSBOVUxMKQorICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikgfHwgUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7CiAgICAgICAgIFB5X0lOQ1JFRih2KTsKQEAgLTE5NzMsOCArMjA1Miw5IEBACiB7CiAgICAgUHlPYmplY3QgKm9rZXksICpyOwogCi0gICAgaWYgKGtleSA9PSBOVUxMKQorICAgIGlmIChrZXkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIG9rZXkgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhrZXkpOwogICAgIGlmIChva2V5ID09IE5VTEwpCkBAIC0yMTQzLDcgKzIyMjMsNyBAQAogfQogCiBQeU9iamVjdCAqCi1QeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCitQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICB0ZXJuYXJ5ZnVuYyBjYWxsOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CkBAIC0yMTUyLDYgKzIyMzIsOCBAQAogICAgICAgIGJlY2F1c2UgaXQgbWF5IGNsZWFyIGl0IChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBhbmQgc28gdGhlCiAgICAgICAgY2FsbGVyIGxvc2VzIGl0cyBleGNlcHRpb24gKi8KICAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa3dhcmdzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3YXJncykpOwogCiAgICAgY2FsbCA9IGZ1bmMtPm9iX3R5cGUtPnRwX2NhbGw7CiAgICAgaWYgKGNhbGwgPT0gTlVMTCkgewpAQCAtMjE2MywxMDggKzIyNDUsMjI1IEBACiAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGNhbGxpbmcgYSBQeXRob24gb2JqZWN0IikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmVzdWx0ID0gKCpjYWxsKShmdW5jLCBhcmcsIGt3KTsKKyAgICByZXN1bHQgPSAoKmNhbGwpKGZ1bmMsIGFyZ3MsIGt3YXJncyk7CiAKICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKIAogICAgIHJldHVybiBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdChmdW5jLCByZXN1bHQsIE5VTEwpOwogfQogCitQeU9iamVjdCoKK19QeVN0YWNrX0FzVHVwbGUoUHlPYmplY3QgKipzdGFjaywgUHlfc3NpemVfdCBuYXJncykKK3sKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeV9zc2l6ZV90IGk7CisKKyAgICBhcmdzID0gUHlUdXBsZV9OZXcobmFyZ3MpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuYXJnczsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gc3RhY2tbaV07CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCBpLCBpdGVtKTsKKyAgICB9CisKKyAgICByZXR1cm4gYXJnczsKK30KKworUHlPYmplY3QgKgorX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKiphcmdzLCBQeV9zc2l6ZV90IG5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIHRlcm5hcnlmdW5jIGNhbGw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisKKyAgICAvKiBfUHlPYmplY3RfRmFzdENhbGxEaWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwKKyAgICAgICBiZWNhdXNlIGl0IG1heSBjbGVhciBpdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgYW5kIHNvIHRoZQorICAgICAgIGNhbGxlciBsb3NlcyBpdHMgZXhjZXB0aW9uICovCisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKKworICAgIGFzc2VydChmdW5jICE9IE5VTEwpOworICAgIGFzc2VydChuYXJncyA+PSAwKTsKKyAgICBhc3NlcnQobmFyZ3MgPT0gMCB8fCBhcmdzICE9IE5VTEwpOworICAgIGFzc2VydChrd2FyZ3MgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dhcmdzKSk7CisKKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgY2FsbGluZyBhIFB5dGhvbiBvYmplY3QiKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICByZXN1bHQgPSBfUHlGdW5jdGlvbl9GYXN0Q2FsbERpY3QoZnVuYywgYXJncywgbmFyZ3MsIGt3YXJncyk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIHJlc3VsdCA9IF9QeUNGdW5jdGlvbl9GYXN0Q2FsbERpY3QoZnVuYywgYXJncywgbmFyZ3MsIGt3YXJncyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqdHVwbGU7CisKKyAgICAgICAgLyogU2xvdy1wYXRoOiBidWlsZCBhIHRlbXBvcmFyeSB0dXBsZSAqLworICAgICAgICBjYWxsID0gZnVuYy0+b2JfdHlwZS0+dHBfY2FsbDsKKyAgICAgICAgaWYgKGNhbGwgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgdHVwbGUgPSBfUHlTdGFja19Bc1R1cGxlKGFyZ3MsIG5hcmdzKTsKKyAgICAgICAgaWYgKHR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9ICgqY2FsbCkoZnVuYywgdHVwbGUsIGt3YXJncyk7CisgICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisKKyAgICAgICAgcmVzdWx0ID0gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoZnVuYywgcmVzdWx0LCBOVUxMKTsKKyAgICB9CisKK2V4aXQ6CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgb2JqIGZvbGxvd2VkIGFyZ3MuICovCitQeU9iamVjdCAqCitfUHlPYmplY3RfQ2FsbF9QcmVwZW5kKFB5T2JqZWN0ICpmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBQeU9iamVjdCAqc21hbGxfc3RhY2tbOF07CisgICAgUHlPYmplY3QgKipzdGFjazsKKyAgICBQeV9zc2l6ZV90IGFyZ2NvdW50OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisKKyAgICBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKGFyZ2NvdW50ICsgMSA8PSAoUHlfc3NpemVfdClQeV9BUlJBWV9MRU5HVEgoc21hbGxfc3RhY2spKSB7CisgICAgICAgIHN0YWNrID0gc21hbGxfc3RhY2s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGFjayA9IFB5TWVtX01hbGxvYygoYXJnY291bnQgKyAxKSAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgIGlmIChzdGFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1c2UgYm9ycm93ZWQgcmVmZXJlbmNlcyAqLworICAgIHN0YWNrWzBdID0gb2JqOworICAgIFB5X01FTUNQWSgmc3RhY2tbMV0sCisgICAgICAgICAgICAgICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApLAorICAgICAgICAgICAgICBhcmdjb3VudCAqIHNpemVvZihQeU9iamVjdCAqKSk7CisKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjaywgYXJnY291bnQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dhcmdzKTsKKyAgICBpZiAoc3RhY2sgIT0gc21hbGxfc3RhY2spIHsKKyAgICAgICAgUHlNZW1fRnJlZShzdGFjayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfZnVuY3Rpb25fdGFpbChQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5T2JqZWN0ICpyZXR2YWw7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChhcmdzICE9IE5VTEwpOwogCiAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0gICAgICAgIFB5T2JqZWN0ICphOwotCi0gICAgICAgIGEgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgaWYgKGEgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhLCAwLCBhcmdzKTsKLSAgICAgICAgYXJncyA9IGE7CisgICAgICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsQXJnMShjYWxsYWJsZSwgYXJncyk7CiAgICAgfQotICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOworICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKKyAgICB9CiAKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0KLSAgICByZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeU9iamVjdCAqY2FsbGFibGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmE7Ci0gICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXN1bHQ7CiAKLSAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwotCi0gICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0gICAgICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotICAgICAgICB2YV9lbmQodmEpOwogICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOworICAgIGlmICghZm9ybWF0IHx8ICEqZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE5vQXJnKGNhbGxhYmxlKTsKKyAgICB9CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUKFB5T2JqZWN0ICpjYWxsYWJsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YTsKLSAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqYXJncywgKnJlc3VsdDsKIAotICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7Ci0KLSAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLSAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0gICAgICAgIGFyZ3MgPSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGZvcm1hdCwgdmEpOwotICAgICAgICB2YV9lbmQodmEpOwogICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotICAgIHJldHVybiBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOworICAgIGlmICghZm9ybWF0IHx8ICEqZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE5vQXJnKGNhbGxhYmxlKTsKKyAgICB9CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzdWx0ID0gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbG1ldGhvZChQeU9iamVjdCogZnVuYywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhLCBpbnQgaXNfc2l6ZV90KQogewotICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwotICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzdWx0OworCisgICAgYXNzZXJ0KGZ1bmMgIT0gTlVMTCk7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKICAgICAgICAgdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7Ci0gICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0gICAgICAgIGlmIChpc19zaXplX3QpCi0gICAgICAgICAgICBhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICBpZiAoIWZvcm1hdCB8fCAhKmZvcm1hdCkgeworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxOb0FyZyhmdW5jKTsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLSAgICByZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CisgICAgaWYgKGlzX3NpemVfdCkgeworICAgICAgICBhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gIGV4aXQ6Ci0gICAgLyogYXJncyBnZXRzIGNvbnN1bWVkIGluIGNhbGxfZnVuY3Rpb25fdGFpbCAqLwotICAgIFB5X1hERUNSRUYoZnVuYyk7Ci0KLSAgICByZXR1cm4gcmV0dmFsOworICAgIHJlc3VsdCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgpAQCAtMjI3NCw4ICsyNDczLDkgQEAKICAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKLSAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOwogICAgIGlmIChmdW5jID09IE5VTEwpCkBAIC0yMjg0LDYgKzI0ODQsNyBAQAogICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogICAgIHJldHZhbCA9IGNhbGxtZXRob2QoZnVuYywgZm9ybWF0LCB2YSwgMCk7CiAgICAgdmFfZW5kKHZhKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjI5NSw4ICsyNDk2LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKLSAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGZ1bmMgPSBfUHlPYmplY3RfR2V0QXR0cklkKG8sIG5hbWUpOwogICAgIGlmIChmdW5jID09IE5VTEwpCkBAIC0yMzA1LDYgKzI1MDcsNyBAQAogICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogICAgIHJldHZhbCA9IGNhbGxtZXRob2QoZnVuYywgZm9ybWF0LCB2YSwgMCk7CiAgICAgdmFfZW5kKHZhKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjMxNiw4ICsyNTE5LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJldHZhbDsKIAotICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgfQogCiAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKQEAgLTIzMjUsNiArMjUyOSw3IEBACiAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAgICAgcmV0dmFsID0gY2FsbG1ldGhvZChmdW5jLCBmb3JtYXQsIHZhLCAxKTsKICAgICB2YV9lbmQodmEpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yMzM2LDggKzI1NDEsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmV0dmFsOwogCi0gICAgaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisgICAgaWYgKG8gPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICBmdW5jID0gX1B5T2JqZWN0X0dldEF0dHJJZChvLCBuYW1lKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CkBAIC0yMzQ2LDM5ICsyNTUyLDYxIEBACiAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAgICAgcmV0dmFsID0gY2FsbG1ldGhvZChmdW5jLCBmb3JtYXQsIHZhLCAxKTsKICAgICB2YV9lbmQodmEpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotb2JqYXJnc19ta3R1cGxlKHZhX2xpc3QgdmEpCitzdGF0aWMgUHlPYmplY3QgKioKK29iamFyZ3NfbWtzdGFjayhQeU9iamVjdCAqKnNtYWxsX3N0YWNrLCBQeV9zc2l6ZV90IHNtYWxsX3N0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgdmFfbGlzdCB2YSwgUHlfc3NpemVfdCAqcF9uYXJncykKIHsKLSAgICBpbnQgaSwgbiA9IDA7CisgICAgUHlfc3NpemVfdCBpLCBuOwogICAgIHZhX2xpc3QgY291bnR2YTsKLSAgICBQeU9iamVjdCAqcmVzdWx0LCAqdG1wOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CiAKLSAgICAgICAgUHlfVkFfQ09QWShjb3VudHZhLCB2YSk7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICBQeV9WQV9DT1BZKGNvdW50dmEsIHZhKTsKIAotICAgIHdoaWxlICgoKFB5T2JqZWN0ICopdmFfYXJnKGNvdW50dmEsIFB5T2JqZWN0ICopKSAhPSBOVUxMKQotICAgICAgICArK247Ci0gICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7Ci0gICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIG4gPiAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHRtcCA9IChQeU9iamVjdCAqKXZhX2FyZyh2YSwgUHlPYmplY3QgKik7Ci0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdG1wKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgIG4gPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmcgPSAoUHlPYmplY3QgKil2YV9hcmcoY291bnR2YSwgUHlPYmplY3QgKik7CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbisrOworICAgIH0KKyAgICAqcF9uYXJncyA9IG47CisKKyAgICAvKiBDb3B5IGFyZ3VtZW50cyAqLworICAgIGlmIChuIDw9IHNtYWxsX3N0YWNrX3NpemUpIHsKKyAgICAgICAgc3RhY2sgPSBzbWFsbF9zdGFjazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YWNrID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2Yoc3RhY2tbMF0pKTsKKyAgICAgICAgaWYgKHN0YWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBzdGFja1tpXSA9IHZhX2FyZyh2YSwgUHlPYmplY3QgKik7CisgICAgfQorICAgIHJldHVybiBzdGFjazsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLCBQeU9iamVjdCAqbmFtZSwgLi4uKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqdG1wOworICAgIFB5T2JqZWN0ICpzbWFsbF9zdGFja1s1XTsKKyAgICBQeU9iamVjdCAqKnN0YWNrOworICAgIFB5X3NzaXplX3QgbmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICB2YV9saXN0IHZhcmdzOwogCi0gICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGNhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0cihjYWxsYWJsZSwgbmFtZSk7CiAgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCkBAIC0yMzg2LDI4ICsyNjE0LDM2IEBACiAKICAgICAvKiBjb3VudCB0aGUgYXJncyAqLwogICAgIHZhX3N0YXJ0KHZhcmdzLCBuYW1lKTsKLSAgICBhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKKyAgICBzdGFjayA9IG9iamFyZ3NfbWtzdGFjayhzbWFsbF9zdGFjaywgUHlfQVJSQVlfTEVOR1RIKHNtYWxsX3N0YWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJncywgJm5hcmdzKTsKICAgICB2YV9lbmQodmFyZ3MpOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICBpZiAoc3RhY2sgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAKLSAgICByZXR1cm4gdG1wOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbChjYWxsYWJsZSwgc3RhY2ssIG5hcmdzKTsKKyAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIGlmIChzdGFjayAhPSBzbWFsbF9zdGFjaykgeworICAgICAgICBQeU1lbV9GcmVlKHN0YWNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkT2JqQXJncyhQeU9iamVjdCAqY2FsbGFibGUsCiAgICAgICAgIHN0cnVjdCBfUHlfSWRlbnRpZmllciAqbmFtZSwgLi4uKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqdG1wOworICAgIFB5T2JqZWN0ICpzbWFsbF9zdGFja1s1XTsKKyAgICBQeU9iamVjdCAqKnN0YWNrOworICAgIFB5X3NzaXplX3QgbmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICB2YV9saXN0IHZhcmdzOwogCi0gICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIH0KIAogICAgIGNhbGxhYmxlID0gX1B5T2JqZWN0X0dldEF0dHJJZChjYWxsYWJsZSwgbmFtZSk7CiAgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCkBAIC0yNDE1LDM4ICsyNjUxLDUxIEBACiAKICAgICAvKiBjb3VudCB0aGUgYXJncyAqLwogICAgIHZhX3N0YXJ0KHZhcmdzLCBuYW1lKTsKLSAgICBhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKKyAgICBzdGFjayA9IG9iamFyZ3NfbWtzdGFjayhzbWFsbF9zdGFjaywgUHlfQVJSQVlfTEVOR1RIKHNtYWxsX3N0YWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJncywgJm5hcmdzKTsKICAgICB2YV9lbmQodmFyZ3MpOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICBpZiAoc3RhY2sgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAKLSAgICByZXR1cm4gdG1wOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbChjYWxsYWJsZSwgc3RhY2ssIG5hcmdzKTsKKyAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIGlmIChzdGFjayAhPSBzbWFsbF9zdGFjaykgeworICAgICAgICBQeU1lbV9GcmVlKHN0YWNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgLi4uKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqdG1wOworICAgIFB5T2JqZWN0ICpzbWFsbF9zdGFja1s1XTsKKyAgICBQeU9iamVjdCAqKnN0YWNrOworICAgIFB5X3NzaXplX3QgbmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICB2YV9saXN0IHZhcmdzOwogCi0gICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB9CiAKICAgICAvKiBjb3VudCB0aGUgYXJncyAqLwogICAgIHZhX3N0YXJ0KHZhcmdzLCBjYWxsYWJsZSk7Ci0gICAgYXJncyA9IG9iamFyZ3NfbWt0dXBsZSh2YXJncyk7CisgICAgc3RhY2sgPSBvYmphcmdzX21rc3RhY2soc21hbGxfc3RhY2ssIFB5X0FSUkFZX0xFTkdUSChzbWFsbF9zdGFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZ3MsICZuYXJncyk7CiAgICAgdmFfZW5kKHZhcmdzKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgIGlmIChzdGFjayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHRtcCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CiAKLSAgICByZXR1cm4gdG1wOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbChjYWxsYWJsZSwgc3RhY2ssIG5hcmdzKTsKKyAgICBpZiAoc3RhY2sgIT0gc21hbGxfc3RhY2spIHsKKyAgICAgICAgUHlNZW1fRnJlZShzdGFjayk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwppbmRleCAxNDU4NjM1Li5jNmQwNzA3IDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKQEAgLTI3OCwzMSArMjc4LDYgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zvcm1hdChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKmJ5dGVzX2luLCAqYnl0ZXNfb3V0LCAqcmVzOwotICAgIGNoYXIgKmJ5dGVzdHJpbmc7Ci0KLSAgICBpZiAoc2VsZiA9PSBOVUxMIHx8ICFQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSB8fCBhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBieXRlc3RyaW5nID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIGJ5dGVzX2luID0gUHlCeXRlc19Gcm9tU3RyaW5nKGJ5dGVzdHJpbmcpOwotICAgIGlmIChieXRlc19pbiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBieXRlc19vdXQgPSBfUHlCeXRlc19Gb3JtYXQoYnl0ZXNfaW4sIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihieXRlc19pbik7Ci0gICAgaWYgKGJ5dGVzX291dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KGJ5dGVzX291dCk7Ci0gICAgUHlfREVDUkVGKGJ5dGVzX291dCk7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzOwotfQotCiAvKiBGdW5jdGlvbnMgc3R1ZmZlZCBpbnRvIHRoZSB0eXBlIG9iamVjdCAqLwogCiBzdGF0aWMgUHlfc3NpemVfdApAQCAtNTA2LDcgKzQ4MSw3IEBACiAKICAgICAgICAgICAgICAgIElmIGdyb3d0aCA8IDAgYW5kIGxvICE9IDAsIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBidXQgYQogICAgICAgICAgICAgICAgTWVtb3J5RXJyb3IgaXMgc3RpbGwgcmFpc2VkIGFuZCB0aGUgbWVtb3J5IGJsb2NrIGlzIG5vdAotICAgICAgICAgICAgICAgc2hyaW5rZWQuIE90aGVyd2lzZSwgdGhlIGJ5dGVhcnJheSBpcyByZXN0b3JlZCBpbiBpdHMgcHJldmlvdXMKKyAgICAgICAgICAgICAgIHNocnVuay4gT3RoZXJ3aXNlLCB0aGUgYnl0ZWFycmF5IGlzIHJlc3RvcmVkIGluIGl0cyBwcmV2aW91cwogICAgICAgICAgICAgICAgc3RhdGUgYW5kIGEgTWVtb3J5RXJyb3IgaXMgcmFpc2VkLiAqLwogICAgICAgICAgICAgaWYgKGxvID09IDApIHsKICAgICAgICAgICAgICAgICBzZWxmLT5vYl9zdGFydCArPSBncm93dGg7CkBAIC04MjAsMTcgKzc5NSwxNSBAQAogICAgIH0KIAogICAgIC8qIElzIGl0IGFuIGludD8gKi8KLSAgICBjb3VudCA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX092ZXJmbG93RXJyb3IpOwotICAgIGlmIChjb3VudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgIGlmIChQeUluZGV4X0NoZWNrKGFyZykpIHsKKyAgICAgICAgY291bnQgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICAgICAgaWYgKGNvdW50ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgY291bnQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGNvdW50Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSgoUHlPYmplY3QgKilzZWxmLCBjb3VudCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTExOSwxNjEgKzEwOTIsMjcgQEAKICNpbmNsdWRlICJzdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgiCiAKIAotLyogVGhlIGZvbGxvd2luZyBQeV9MT0NBTF9JTkxJTkUgYW5kIFB5X0xPQ0FMIGZ1bmN0aW9ucwotd2VyZSBjb3BpZWQgZnJvbSB0aGUgb2xkIGNoYXIqIHN0eWxlIHN0cmluZyBvYmplY3QuICovCi0KLS8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCi0jZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCi0gICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoZW5kIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHN0YXJ0IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWJ5dGVhcnJheV9maW5kX2ludGVybmFsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKLXsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9idWZmZXIgc3ViYnVmOwotICAgIGNvbnN0IGNoYXIgKnN1YjsKLSAgICBQeV9zc2l6ZV90IGxlbiwgc3ViX2xlbjsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKLSAgICBQeV9zc2l6ZV90IHJlczsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgaWYgKHN1Ym9iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLSAgICBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAotICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGUsIG1vZGUpOwotICAgICAgICBpZiAocmVzID49IDApCi0gICAgICAgICAgICByZXMgKz0gc3RhcnQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoZGlyID4gMCkKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX3NsaWNlKAotICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIGlmIChzdWJvYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1QeURvY19TVFJWQVIoZmluZF9fZG9jX18sCi0iQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2ZpbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2ZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLVB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCi0iQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnNlY3Rpb24gc3ViIGluXG5cCi1ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKLWFzIGluIHNsaWNlIG5vdGF0aW9uLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvdW50KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqc3ViX29iajsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0gICAgUHlfc3NpemVfdCBzdWJfbGVuOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0KLSAgICBQeV9idWZmZXIgdnN1YjsKLSAgICBQeU9iamVjdCAqY291bnRfb2JqOwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsICZzdWJfb2JqLCAmYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc3ViX29iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKLSAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpKTsKLQotICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKLSAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKLSAgICAgICAgKTsKLQotICAgIGlmIChzdWJfb2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKLQotICAgIHJldHVybiBjb3VudF9vYmo7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb3VudChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmNsZWFyCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGJ5dGVhcnJheS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9jbGVhcl9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZTUyNGZkMzMwYWJjZGMxOF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZWQ2ZWRhZTlkZTQ0N2FjNF0qLwogewogICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUoKFB5T2JqZWN0ICopc2VsZiwgMCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyODMsMjUzICsxMTIyLDcyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuY29weQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV0dXJuIGEgY29weSBvZiBCLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvcHlfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTZkNWQyOTc1YWEwZjMzZjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTY1OTdiMGMwMWJjY2FhOWVdKi8KIHsKICAgICByZXR1cm4gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKChQeU9iamVjdCAqKXNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSk7CiB9CiAKLVB5RG9jX1NUUlZBUihpbmRleF9fZG9jX18sCi0iQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9pbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfaW5kZXgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJmaW5kX19kb2NfXywKLSJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZmluZChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCi0iQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JpbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmluZGV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KIHN0YXRpYyBpbnQKIGJ5dGVhcnJheV9jb250YWlucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeV9zc2l6ZV90IGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X2J1ZmZlciB2YXJnOwotICAgICAgICBQeV9zc2l6ZV90IHBvczsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsICZ2YXJnLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHBvcyA9IHN0cmluZ2xpYl9maW5kKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlfU0laRShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7Ci0gICAgICAgIHJldHVybiBwb3MgPj0gMDsKLSAgICB9Ci0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBtZW1jaHIoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCAoaW50KSBpdmFsLCBQeV9TSVpFKHNlbGYpKSAhPSBOVUxMOworICAgIHJldHVybiBfUHlfYnl0ZXNfY29udGFpbnMoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJnKTsKIH0KIAotCi0vKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2Ygc2VsZgotICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucwotICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgotICovCi1QeV9MT0NBTChpbnQpCi1fYnl0ZWFycmF5X3RhaWxtYXRjaChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBjb25zdCBjaGFyKiBzdHI7Ci0gICAgUHlfYnVmZmVyIHZzdWJzdHI7Ci0gICAgaW50IHJ2ID0gMDsKLQotICAgIHN0ciA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLQotICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmdnN1YnN0ciwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwotCi0gICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKLSAgICAgICAgLyogc3RhcnRzd2l0aCAqLwotICAgICAgICBpZiAoc3RhcnQrdnN1YnN0ci5sZW4gPiBsZW4pIHsKLSAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVuZHN3aXRoICovCi0gICAgICAgIGlmIChlbmQtc3RhcnQgPCB2c3Vic3RyLmxlbiB8fCBzdGFydCA+IGxlbikgewotICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuZC12c3Vic3RyLmxlbiA+IHN0YXJ0KQotICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSB2c3Vic3RyLmxlbjsKLSAgICB9Ci0gICAgaWYgKGVuZC1zdGFydCA+PSB2c3Vic3RyLmxlbikKLSAgICAgICAgcnYgPSAhIG1lbWNtcChzdHIrc3RhcnQsIHZzdWJzdHIuYnVmLCB2c3Vic3RyLmxlbik7Ci0KLWRvbmU6Ci0gICAgUHlCdWZmZXJfUmVsZWFzZSgmdnN1YnN0cik7Ci0gICAgcmV0dXJuIHJ2OwotfQotCi0KLVB5RG9jX1NUUlZBUihzdGFydHN3aXRoX19kb2NfXywKLSJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCi1XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAotcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3N0YXJ0c3dpdGgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygic3RhcnRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19zdGFydHN3aXRoKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi1QeURvY19TVFJWQVIoZW5kc3dpdGhfX2RvY19fLAotIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9lbmRzd2l0aChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJlbmRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgKzEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfZW5kc3dpdGgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnRyYW5zbGF0ZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICB0YWJsZTogb2JqZWN0CiAgICAgICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuCi0gICAgWwotICAgIGRlbGV0ZWNoYXJzOiBvYmplY3QKLSAgICBdCiAgICAgLworICAgIGRlbGV0ZSBhcyBkZWxldGVjaGFyczogb2JqZWN0KGNfZGVmYXVsdD0iTlVMTCIpID0gYicnCiAKIFJldHVybiBhIGNvcHkgd2l0aCBlYWNoIGNoYXJhY3RlciBtYXBwZWQgYnkgdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLgogCi1BbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZWNoYXJzIGFyZSByZW1vdmVkLgorQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGUgYXJlIHJlbW92ZWQuCiBUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV90cmFuc2xhdGVfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9yaWdodF8xLCBQeU9iamVjdCAqZGVsZXRlY2hhcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmJlYmM4NmE5YTFmZjA4MyBpbnB1dD1iNzQ5YWQ4NWY0ODYwODI0XSovCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI2YThmMDFjMmE3NGU0NDYgaW5wdXQ9Y2ZmZjk1NmQ0ZDEyN2E5Yl0qLwogewogICAgIGNoYXIgKmlucHV0LCAqb3V0cHV0OwogICAgIGNvbnN0IGNoYXIgKnRhYmxlX2NoYXJzOwpAQCAtMTU3Miw3ICsxMjMwLDcgQEAKICAgICByZXN1bHQgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZG9uZTsKLSAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhyZXN1bHQpOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwogICAgIGlucHV0ID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKICAgICBpZiAodmRlbC5sZW4gPT0gMCAmJiB0YWJsZV9jaGFycyAhPSBOVUxMKSB7CkBAIC0xNTk4LDggKzEyNTYsNyBAQAogICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CiAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CiAgICAgICAgIGlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKLSAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXTsKICAgICB9CiAgICAgLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCiAgICAgaWYgKGlubGVuID4gMCkKQEAgLTE2NDIsNDkzICsxMjk5LDYgQEAKIH0KIAogCi0vKiBmaW5kIGFuZCBjb3VudCBjaGFyYWN0ZXJzIGFuZCBzdWJzdHJpbmdzICovCi0KLSNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoY2hhciAqKW1lbWNocigoY29uc3Qgdm9pZCAqKSh0YXJnZXQpLCBjLCB0YXJnZXRfbGVuKSkKLQotCi0vKiBCeXRlcyBvcHMgbXVzdCByZXR1cm4gYSBzdHJpbmcsIGNyZWF0ZSBhIGNvcHkgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXR1cm5fc2VsZihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLXsKLSAgICAvKiBhbHdheXMgcmV0dXJuIGEgbmV3IGJ5dGVhcnJheSAqLwotICAgIHJldHVybiAoUHlCeXRlQXJyYXlPYmplY3QgKilQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpKTsKLX0KLQotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBQeV9zc2l6ZV90IGNvdW50PTA7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQ9dGFyZ2V0OwotICAgIGNvbnN0IGNoYXIgKmVuZD10YXJnZXQrdGFyZ2V0X2xlbjsKLQotICAgIHdoaWxlICggKHN0YXJ0PWZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGMpKSAhPSBOVUxMICkgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBpZiAoY291bnQgPj0gbWF4Y291bnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhcnQgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0KLS8qIEFsZ29yaXRobXMgZm9yIGRpZmZlcmVudCBjYXNlcyBvZiBzdHJpbmcgcmVwbGFjZW1lbnQgKi8KLQotLyogbGVuKHNlbGYpPj0xLCBmcm9tPSIiLCBsZW4odG8pPj0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2VfaW50ZXJsZWF2ZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgaTsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIC8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyOwotICAgICAgIGNvdW50ID0gbWluKG1heGNvdW50LCBzZWxmX2xlbiArIDEpICovCi0gICAgaWYgKG1heGNvdW50IDw9IHNlbGZfbGVuKQotICAgICAgICBjb3VudCA9IG1heGNvdW50OwotICAgIGVsc2UKLSAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3c6IHNlbGZfbGVuICsgMSA8PSBtYXhjb3VudCA8PSBQWV9TU0laRV9UX01BWC4gKi8KLSAgICAgICAgY291bnQgPSBzZWxmX2xlbiArIDE7Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47Ci0KLSAgICBpZiAoISAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgLyogVE9ETzogc3BlY2lhbCBjYXNlIHNpbmdsZSBjaGFyYWN0ZXIsIHdoaWNoIGRvZXNuJ3QgbmVlZCBtZW1jcHkgKi8KLQotICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgY291bnQgLT0gMTsKLQotICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLSAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCi0gICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOwotICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdGFydCArIG9mZnNldDsKLQotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLSAgICB9Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW47Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7Ci0KLSAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBieXRlcyAqLwotICAgIHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0KLSAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKLSAgICAqc3RhcnQgPSB0b19jOwotICAgIHN0YXJ0Kys7Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAqbmV4dCA9IHRvX2M7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7Ci0gICAgY2hhciAqc2VsZl9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgLyogVGhlIHJlc3VsdCBieXRlcyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IGJ5dGVzICovCi0gICAgcmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQotICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0gICAgc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7Ci0gICAgUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7Ci0gICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQ9PS0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICAgICAgc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSAxID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSAxKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9zdWJzdHJpbmcoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSBmcm9tX2xlbik7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQrb2Zmc2V0OwotICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgewotICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBpZiAobWF4Y291bnQgPCAwKSB7Ci0gICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKG1heGNvdW50ID09IDAgfHwKLSAgICAgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCi0KLSAgICBpZiAoZnJvbV9sZW4gPT0gMCkgewotICAgICAgICAvKiBpbnNlcnQgdGhlICd0bycgYnl0ZXMgZXZlcnl3aGVyZS4gICAqLwotICAgICAgICAvKiAgICA+Pj4gIlB5dGhvbiIucmVwbGFjZSgiIiwgIi4iKSAgICAgKi8KLSAgICAgICAgLyogICAgJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfQotCi0gICAgLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KLSAgICAvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBieXRlcyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBieXRlcyAqLwotICAgIC8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgYnl0ZXMgKi8KLSAgICBpZiAoUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKHRvX2xlbiA9PSAwKSB7Ci0gICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2Zyb20nIGJ5dGVzICovCi0gICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKLSAgICAgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIG1heGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBieXRlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgewotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgICAgICB0b19zWzBdLAotICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCi0gICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLwotICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0KLX0KLQotCiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucmVwbGFjZQogCkBAIC0yMTUwLDkgKzEzMjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBQeV9idWZmZXIgKm5ldywgUHlfc3NpemVfdCBjb3VudCkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMzk4ODRjNGRjNTk0MTJhIGlucHV0PWFhMzc5ZDk4ODYzN2M3ZmJdKi8KIHsKLSAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlCeXRlQXJyYXlPYmplY3QgKikgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQtPmJ1Ziwgb2xkLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5idWYsIG5ldy0+bGVuLCBjb3VudCk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopb2xkLT5idWYsIG9sZC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0yMjAwLDcgKzEzNzAsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBzZXA6IG9iamVjdAogICAgIC8KIApAQCAtMjIxNiw3ICsxMzg1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9wYXJ0aXRpb24oUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXApCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDVkMjUyNWRkZDM1Zjk1NyBpbnB1dD03ZDdmZTM3YjE2OTZkNTA2XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDVkMjUyNWRkZDM1Zjk1NyBpbnB1dD04NmY4OTIyMzg5MmI3MGI1XSovCiB7CiAgICAgUHlPYmplY3QgKmJ5dGVzZXAsICpyZXN1bHQ7CiAKQEAgLTIyMzgsNyArMTQwNyw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBzZXA6IG9iamVjdAogICAgIC8KIApAQCAtMjI1NCw3ICsxNDIyLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9ycGFydGl0aW9uKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ0MGRlM2M5NDI2MTE1ZTggaW5wdXQ9OWI4Y2Q1NDBjMWI3NTg1M10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ0MGRlM2M5NDI2MTE1ZTggaW5wdXQ9NWY0MDk0ZjJkZTg3YzhmM10qLwogewogICAgIFB5T2JqZWN0ICpieXRlc2VwLCAqcmVzdWx0OwogCkBAIC0yMzEyLDE0ICsxNDgwLDEyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucmV2ZXJzZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpbiBCIGluIHBsYWNlLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JldmVyc2VfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Zjc2MTZmMjlhYjMwOWQzIGlucHV0PTc5MzNhNDk5Yjg1OTdiZDFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Zjc2MTZmMjlhYjMwOWQzIGlucHV0PTU0MzM1NjMxOWZjNzg1NTddKi8KIHsKICAgICBjaGFyIHN3YXAsICpoZWFkLCAqdGFpbDsKICAgICBQeV9zc2l6ZV90IGksIGosIG4gPSBQeV9TSVpFKHNlbGYpOwpAQCAtMjM0OCw3ICsxNTE0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5pbnNlcnQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaW5kZXg6IFB5X3NzaXplX3QKICAgICAgICAgVGhlIGluZGV4IHdoZXJlIHRoZSB2YWx1ZSBpcyB0byBiZSBpbnNlcnRlZC4KICAgICBpdGVtOiBieXRlc3ZhbHVlCkBAIC0yMzYwLDcgKzE1MjUsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2luc2VydF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBpbnQgaXRlbSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmM3NzVhNzBlN2IwN2I3IGlucHV0PTgzMzc2NjgzNmJhMzBlMWVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03NmM3NzVhNzBlN2IwN2I3IGlucHV0PWIyYjVkMDdlOWRlNmMwNzBdKi8KIHsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwogICAgIGNoYXIgKmJ1ZjsKQEAgLTIzOTAsNyArMTU1NSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuYXBwZW5kCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIGl0ZW06IGJ5dGVzdmFsdWUKICAgICAgICAgVGhlIGl0ZW0gdG8gYmUgYXBwZW5kZWQuCiAgICAgLwpAQCAtMjQwMCw3ICsxNTY0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9hcHBlbmRfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgaW50IGl0ZW0pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTE1NGUxOWVkMTg4NmNiNiBpbnB1dD1hZTU2ZWE4NzM4MDQwN2NjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTE1NGUxOWVkMTg4NmNiNiBpbnB1dD0yMGQ2YmVjM2QxMzQwNTkzXSovCiB7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKIApAQCAtMjQyMCw3ICsxNTg0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5leHRlbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaXRlcmFibGVfb2ZfaW50czogb2JqZWN0CiAgICAgICAgIFRoZSBpdGVyYWJsZSBvZiBpdGVtcyB0byBhcHBlbmQuCiAgICAgLwpAQCAtMjQzMCw3ICsxNTkzLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9leHRlbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9pbnRzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MTU1ZGJlMjQ5MTcwYjEgaW5wdXQ9Y2U4M2E1ZDc1YjcwZDg1MF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MTU1ZGJlMjQ5MTcwYjEgaW5wdXQ9YzYxN2IzYTkzMjQ5YmEyOF0qLwogewogICAgIFB5T2JqZWN0ICppdCwgKml0ZW0sICpieXRlYXJyYXlfb2JqOwogICAgIFB5X3NzaXplX3QgYnVmX3NpemUgPSAwLCBsZW4gPSAwOwpAQCAtMjUxNSw3ICsxNjc4LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5wb3AKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaW5kZXg6IFB5X3NzaXplX3QgPSAtMQogICAgICAgICBUaGUgaW5kZXggZnJvbSB3aGVyZSB0byByZW1vdmUgdGhlIGl0ZW0uCiAgICAgICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVtb3ZlIHRoZSBsYXN0IGl0ZW0uCkBAIC0yNTI4LDcgKzE2OTAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3BvcF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUwY2NkNDAxZjgwMjFkYTggaW5wdXQ9MDc5N2U2YzBjYTlkNWE4NV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUwY2NkNDAxZjgwMjFkYTggaW5wdXQ9MzU5MWRmMmQwNmMwZDIzN10qLwogewogICAgIGludCB2YWx1ZTsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwpAQCAtMjU2MCw3ICsxNzIyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5yZW1vdmUKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgdmFsdWU6IGJ5dGVzdmFsdWUKICAgICAgICAgVGhlIHZhbHVlIHRvIHJlbW92ZS4KICAgICAvCkBAIC0yNTcwLDIwICsxNzMxLDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmVtb3ZlX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIGludCB2YWx1ZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kNjU5ZTM3ODY2NzA5YzEzIGlucHV0PTQ3NTYwYjExZmQ4NTZjMjRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kNjU5ZTM3ODY2NzA5YzEzIGlucHV0PTEyMTgzMTI0MGNkNTFkZGZdKi8KIHsKLSAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOworICAgIFB5X3NzaXplX3Qgd2hlcmUsIG4gPSBQeV9TSVpFKHNlbGYpOwogICAgIGNoYXIgKmJ1ZiA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBjaGFyICp3aGVyZSA9IG1lbWNocihidWYsIHZhbHVlLCBuKTsKIAotICAgIGlmICghd2hlcmUpIHsKKyAgICB3aGVyZSA9IHN0cmluZ2xpYl9maW5kX2NoYXIoYnVmLCBuLCB2YWx1ZSk7CisgICAgaWYgKHdoZXJlIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInZhbHVlIG5vdCBmb3VuZCBpbiBieXRlYXJyYXkiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmICghX2NhbnJlc2l6ZShzZWxmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBtZW1tb3ZlKHdoZXJlLCB3aGVyZSArIDEsIGJ1ZiArIG4gLSB3aGVyZSk7CisgICAgbWVtbW92ZShidWYgKyB3aGVyZSwgYnVmICsgd2hlcmUgKyAxLCBuIC0gd2hlcmUpOwogICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUoKFB5T2JqZWN0ICopc2VsZiwgbiAtIDEpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTI1OTMsOCArMTc1NCw4IEBACiAvKiBYWFggVGhlc2UgdHdvIGhlbHBlcnMgY291bGQgYmUgb3B0aW1pemVkIGlmIGFyZ3NpemUgPT0gMSAqLwogCiBzdGF0aWMgUHlfc3NpemVfdAotbHN0cmlwX2hlbHBlcihjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCi0gICAgICAgICAgICAgIHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQorbHN0cmlwX2hlbHBlcihjb25zdCBjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQogewogICAgIFB5X3NzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGkgPCBteXNpemUgJiYgbWVtY2hyKGFyZ3B0ciwgKHVuc2lnbmVkIGNoYXIpIG15cHRyW2ldLCBhcmdzaXplKSkKQEAgLTI2MDMsOCArMTc2NCw4IEBACiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1yc3RyaXBfaGVscGVyKGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCityc3RyaXBfaGVscGVyKGNvbnN0IGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCiB7CiAgICAgUHlfc3NpemVfdCBpID0gbXlzaXplIC0gMTsKICAgICB3aGlsZSAoaSA+PSAwICYmIG1lbWNocihhcmdwdHIsICh1bnNpZ25lZCBjaGFyKSBteXB0cltpXSwgYXJnc2l6ZSkpCkBAIC0yODA1LDI3ICsxOTY2LDEwIEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKLWhleF9kaWdpdF90b19pbnQoUHlfVUNTNCBjKQotewotICAgIGlmIChjID49IDEyOCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeV9JU0RJR0lUKGMpKQotICAgICAgICByZXR1cm4gYyAtICcwJzsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5X0lTVVBQRVIoYykpCi0gICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKltjbGluaWMgaW5wdXRdCiBAY2xhc3NtZXRob2QKIGJ5dGVhcnJheS5mcm9taGV4CiAKLSAgICBjbHM6IHNlbGYodHlwZT0iUHlPYmplY3QqIikKICAgICBzdHJpbmc6IHVuaWNvZGUKICAgICAvCiAKQEAgLTI4MzYsNTEgKzE5ODAsMTUgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlPYmplY3QqY2xzLCBQeU9iamVjdCAqc3RyaW5nKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRmM2RhNjAxMjliMzcwMGMgaW5wdXQ9OTA3YmJkMmQzNGQ5MzY3YV0qLworYnl0ZWFycmF5X2Zyb21oZXhfaW1wbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzdHJpbmcpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGYwZjBiNmQzMGZiM2JhMCBpbnB1dD1mMDMzYTE2ZDFmYjIxZjQ4XSovCiB7Ci0gICAgUHlPYmplY3QgKm5ld2J5dGVzOwotICAgIGNoYXIgKmJ1ZjsKLSAgICBQeV9zc2l6ZV90IGhleGxlbiwgYnl0ZXNsZW4sIGksIGo7Ci0gICAgaW50IHRvcCwgYm90OwotICAgIHZvaWQgKmRhdGE7Ci0gICAgdW5zaWduZWQgaW50IGtpbmQ7Ci0KLSAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHN0cmluZykpOwotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7Ci0gICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cmluZyk7Ci0gICAgaGV4bGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyaW5nKTsKLQotICAgIGJ5dGVzbGVuID0gaGV4bGVuLzI7IC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCi0gICAgbmV3Ynl0ZXMgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlc2xlbik7Ci0gICAgaWYgKCFuZXdieXRlcykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnVmID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKG5ld2J5dGVzKTsKLSAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGhleGxlbjsgaSArPSAyKSB7Ci0gICAgICAgIC8qIHNraXAgb3ZlciBzcGFjZXMgaW4gdGhlIGlucHV0ICovCi0gICAgICAgIHdoaWxlIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA9PSAnICcpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGlmIChpID49IGhleGxlbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB0b3AgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgYm90ID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKzEpKTsKLSAgICAgICAgaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgdHlwZSA9PSAmUHlCeXRlQXJyYXlfVHlwZSk7CisgICAgaWYgKHR5cGUgIT0gJlB5Qnl0ZUFycmF5X1R5cGUgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QgKil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgTlVMTCkpOwogICAgIH0KLSAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKG5ld2J5dGVzLCBqKSA8IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgcmV0dXJuIG5ld2J5dGVzOwotCi0gIGVycm9yOgotICAgIFB5X0RFQ1JFRihuZXdieXRlcyk7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGhleF9fZG9jX18sCkBAIC0yOTM1LDE0ICsyMDQzLDEyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuX19yZWR1Y2VfXyBhcyBieXRlYXJyYXlfcmVkdWNlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JlZHVjZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyYmYzMDQwODY0NjRjYWIgaW5wdXQ9ZmJiMDdkZTRkMTAyYTAzYV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyYmYzMDQwODY0NjRjYWIgaW5wdXQ9NDRiNTczN2FkYTYyZGQzZl0qLwogewogICAgIHJldHVybiBfY29tbW9uX3JlZHVjZShzZWxmLCAyKTsKIH0KQEAgLTI5NTAsNyArMjA1Niw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuX19yZWR1Y2VfZXhfXyBhcyBieXRlYXJyYXlfcmVkdWNlX2V4CiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIHByb3RvOiBpbnQgPSAwCiAgICAgLwogCkBAIC0yOTU5LDcgKzIwNjQsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JlZHVjZV9leF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBpbnQgcHJvdG8pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJlYWMzMzM3NzE5NzUyMCBpbnB1dD0wZTA5MWE0MmNhNmRiZDkxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJlYWMzMzM3NzE5NzUyMCBpbnB1dD1mMTI5YmMxYTFhYTE1MWVlXSovCiB7CiAgICAgcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIHByb3RvKTsKIH0KQEAgLTI5NjcsMTQgKzIwNzIsMTIgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5fX3NpemVvZl9fIGFzIGJ5dGVhcnJheV9zaXplb2YKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCi0KIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ5dGVhcnJheSBvYmplY3QgaW4gbWVtb3J5LCBpbiBieXRlcy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9zaXplb2ZfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03MzhhYmRkMTc5NTFjNDI3IGlucHV0PTZiMjNkMzA1MzYyYjQ2MmJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03MzhhYmRkMTc5NTFjNDI3IGlucHV0PWUyNzMyMGZkOThhNGJjNWFdKi8KIHsKICAgICBQeV9zc2l6ZV90IHJlczsKIApAQCAtMzAxNSwxOSArMjExOCwyMiBAQAogICAgIEJZVEVBUlJBWV9BUFBFTkRfTUVUSE9EREVGCiAgICAgeyJjYXBpdGFsaXplIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jYXBpdGFsaXplLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2NhcGl0YWxpemVfX2RvY19ffSwKLSAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIGNlbnRlcl9fZG9jX199LAorICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywgX1B5X2NlbnRlcl9fZG9jX199LAogICAgIEJZVEVBUlJBWV9DTEVBUl9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfQ09QWV9NRVRIT0RERUYKLSAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9jb3VudCwgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9jb3VudF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9ERUNPREVfTUVUSE9EREVGCi0gICAgeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywgZW5kc3dpdGhfX2RvY19ffSwKKyAgICB7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfZW5kc3dpdGhfX2RvY19ffSwKICAgICB7ImV4cGFuZHRhYnMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2V4cGFuZHRhYnMsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgIGV4cGFuZHRhYnNfX2RvY19ffSwKKyAgICAgX1B5X2V4cGFuZHRhYnNfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfRVhURU5EX01FVEhPRERFRgotICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCisgICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9maW5kLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9maW5kX19kb2NfX30sCiAgICAgQllURUFSUkFZX0ZST01IRVhfTUVUSE9EREVGCiAgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2hleCwgTUVUSF9OT0FSR1MsIGhleF9fZG9jX199LAotICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCisgICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfaW5kZXgsIE1FVEhfVkFSQVJHUywgX1B5X2luZGV4X19kb2NfX30sCiAgICAgQllURUFSUkFZX0lOU0VSVF9NRVRIT0RERUYKICAgICB7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzYWxudW0sIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXNhbG51bV9fZG9jX199LApAQCAtMzA0NCw3ICsyMTUwLDcgQEAKICAgICB7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzdXBwZXIsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXN1cHBlcl9fZG9jX199LAogICAgIEJZVEVBUlJBWV9KT0lOX01FVEhPRERFRgotICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCisgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X2xqdXN0X19kb2NfX30sCiAgICAgeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbG93ZXIsIE1FVEhfTk9BUkdTLCBfUHlfbG93ZXJfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfTFNUUklQX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9NQUtFVFJBTlNfTUVUSE9EREVGCkBAIC0zMDUzLDIzICsyMTU5LDIzIEBACiAgICAgQllURUFSUkFZX1JFTU9WRV9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUkVQTEFDRV9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUkVWRVJTRV9NRVRIT0RERUYKLSAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAotICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0gICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yZmluZCwgTUVUSF9WQVJBUkdTLCBfUHlfcmZpbmRfX2RvY19ffSwKKyAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIF9QeV9yaW5kZXhfX2RvY19ffSwKKyAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9yanVzdCwgTUVUSF9WQVJBUkdTLCBfUHlfcmp1c3RfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfUlBBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUlNQTElUX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9SU1RSSVBfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1NQTElUX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9TUExJVExJTkVTX01FVEhPRERFRgogICAgIHsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTICwKLSAgICAgc3RhcnRzd2l0aF9fZG9jX199LAorICAgICBfUHlfc3RhcnRzd2l0aF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9TVFJJUF9NRVRIT0RERUYKICAgICB7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9zd2FwY2FzZV9fZG9jX199LAogICAgIHsidGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3RpdGxlLCBNRVRIX05PQVJHUywgX1B5X3RpdGxlX19kb2NfX30sCiAgICAgQllURUFSUkFZX1RSQU5TTEFURV9NRVRIT0RERUYKICAgICB7InVwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl91cHBlciwgTUVUSF9OT0FSR1MsIF9QeV91cHBlcl9fZG9jX199LAotICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIHpmaWxsX19kb2NfX30sCisgICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfemZpbGwsIE1FVEhfVkFSQVJHUywgX1B5X3pmaWxsX19kb2NfX30sCiAgICAge05VTEx9CiB9OwogCkBAIC0zMDc4LDcgKzIxODQsNyBAQAogewogICAgIGlmICghUHlCeXRlQXJyYXlfQ2hlY2sodikpCiAgICAgICAgIFB5X1JFVFVSTl9OT1RJTVBMRU1FTlRFRDsKLSAgICByZXR1cm4gYnl0ZWFycmF5X2Zvcm1hdCgoUHlCeXRlQXJyYXlPYmplY3QgKil2LCB3KTsKKyAgICByZXR1cm4gX1B5Qnl0ZXNfRm9ybWF0RXgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRSh2KSwgdywgMSk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYnl0ZWFycmF5X2FzX251bWJlciA9IHsKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKaW5kZXggYTI5OTkxNS4uZDdmMDYxYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKKysrIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKQEAgLTEsMyArMSw0IEBACisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJieXRlc19tZXRob2RzLmgiCiAKQEAgLTI3Nyw3ICsyNzgsNyBAQAogY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKICAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwpAQCAtMzA2LDcgKzMwNyw3IEBACiBhbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKIApAQCAtMzM2LDcgKzMzNyw3IEBACiB0byBsb3dlcmNhc2UgQVNDSUkgYW5kIHZpY2UgdmVyc2EuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlfc3NpemVfdCBpOwogCkBAIC0zODcsMyArMzg4LDQyNyBAQAogCiAgICAgcmV0dXJuIHJlczsKIH0KKworI2RlZmluZSBGQVNUU0VBUkNIIGZhc3RzZWFyY2gKKyNkZWZpbmUgU1RSSU5HTElCKEYpIHN0cmluZ2xpYl8jI0YKKyNkZWZpbmUgU1RSSU5HTElCX0NIQVIgY2hhcgorI2RlZmluZSBTVFJJTkdMSUJfU0laRU9GX0NIQVIgMQorCisjaW5jbHVkZSAic3RyaW5nbGliL2Zhc3RzZWFyY2guaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvY291bnQuaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvZmluZC5oIgorCisvKgorV3JhcHMgc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKSBhbmQgYWRkaXRpb25hbGx5IGNoZWNrcyB3aGV0aGVyIHRoZQorZmlyc3QgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBpbiByYW5nZSgwLCAyNTYpLgorCitJZiB0aGlzIGlzIHRoZSBjYXNlLCB3cml0ZXMgdGhlIGludGVnZXIgdmFsdWUgdG8gdGhlIGJ5dGUgcGFyYW1ldGVyCithbmQgc2V0cyBzdWJvYmogdG8gTlVMTC4gT3RoZXJ3aXNlLCBzZXRzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzdWJvYmoKK2FuZCBkb2Vzbid0IHRvdWNoIGJ5dGUuIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFyZSBzaW1pbGFyIHRvIHRob3NlIG9mCitzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpLgorKi8KKworUHlfTE9DQUxfSU5MSU5FKGludCkKK3BhcnNlX2FyZ3NfZmluZHNfYnl0ZShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1Ym9iaiwgY2hhciAqYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kKQoreworICAgIFB5T2JqZWN0ICp0bXBfc3Vib2JqOworICAgIFB5X3NzaXplX3QgaXZhbDsKKyAgICBQeU9iamVjdCAqZXJyOworCisgICAgaWYoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKGZ1bmN0aW9uX25hbWUsIGFyZ3MsICZ0bXBfc3Vib2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIVB5TnVtYmVyX0NoZWNrKHRtcF9zdWJvYmopKSB7CisgICAgICAgICpzdWJvYmogPSB0bXBfc3Vib2JqOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KHRtcF9zdWJvYmosIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgIGlmIChpdmFsID09IC0xKSB7CisgICAgICAgIGVyciA9IFB5RXJyX09jY3VycmVkKCk7CisgICAgICAgIGlmIChlcnIgJiYgIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhlcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID4gMjU1KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKnN1Ym9iaiA9IE5VTEw7CisgICAgKmJ5dGUgPSAoY2hhcilpdmFsOworICAgIHJldHVybiAxOworfQorCisvKiBoZWxwZXIgbWFjcm8gdG8gZml4dXAgc3RhcnQvZW5kIHNsaWNlIHZhbHVlcyAqLworI2RlZmluZSBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pICAgICAgICAgXAorICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmIChlbmQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhcnQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK2ZpbmRfaW50ZXJuYWwoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCit7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBjaGFyIGJ5dGU7CisgICAgUHlfYnVmZmVyIHN1YmJ1ZjsKKyAgICBjb25zdCBjaGFyICpzdWI7CisgICAgUHlfc3NpemVfdCBzdWJfbGVuOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeV9zc2l6ZV90IHJlczsKKworICAgIGlmICghcGFyc2VfYXJnc19maW5kc19ieXRlKGZ1bmN0aW9uX25hbWUsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Ym9iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmIChzdWJvYmopIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJvYmosICZzdWJidWYsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKworICAgICAgICBzdWIgPSBzdWJidWYuYnVmOworICAgICAgICBzdWJfbGVuID0gc3ViYnVmLmxlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN1YiA9ICZieXRlOworICAgICAgICBzdWJfbGVuID0gMTsKKyAgICB9CisKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOworICAgIGlmIChlbmQgLSBzdGFydCA8IHN1Yl9sZW4pCisgICAgICAgIHJlcyA9IC0xOworICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMSkgeworICAgICAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX2NoYXIoCisgICAgICAgICAgICAgICAgc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfY2hhcigKKyAgICAgICAgICAgICAgICBzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgKnN1Yik7CisgICAgICAgIGlmIChyZXMgPj0gMCkKKyAgICAgICAgICAgIHJlcyArPSBzdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChkaXIgPiAwKQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCisgICAgICAgICAgICAgICAgc3RyLCBsZW4sCisgICAgICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAorICAgICAgICAgICAgICAgIHN0ciwgbGVuLAorICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7CisgICAgfQorCisgICAgaWYgKHN1Ym9iaikKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViYnVmKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2ZpbmRfX2RvY19fLAorIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKK3N1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAorYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAorXG5cCitSZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX2ZpbmQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAiZmluZCIsIGFyZ3MsICsxKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2luZGV4X19kb2NfXywKKyJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitMaWtlIEIuZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAiaW5kZXgiLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9yZmluZF9fZG9jX18sCisiQi5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXG5cCitzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcblwKK2FyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKK1xuXAorUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19yZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGZpbmRfaW50ZXJuYWwoc3RyLCBsZW4sICJyZmluZCIsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3JpbmRleF9fZG9jX18sCisiQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK0xpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfcmluZGV4KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gZmluZF9pbnRlcm5hbChzdHIsIGxlbiwgInJpbmRleCIsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YnNlY3Rpb24gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2NvdW50X19kb2NfXywKKyJCLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cblwKK2J5dGVzIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZFxuXAorYXMgaW4gc2xpY2Ugbm90YXRpb24uIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19jb3VudChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqc3ViX29iajsKKyAgICBjb25zdCBjaGFyICpzdWI7CisgICAgUHlfc3NpemVfdCBzdWJfbGVuOworICAgIGNoYXIgYnl0ZTsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisKKyAgICBQeV9idWZmZXIgdnN1YjsKKyAgICBQeU9iamVjdCAqY291bnRfb2JqOworCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX2J5dGUoImNvdW50IiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViX29iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHN1Yl9vYmopIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJfb2JqLCAmdnN1YiwgUHlCVUZfU0lNUExFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgc3ViID0gdnN1Yi5idWY7CisgICAgICAgIHN1Yl9sZW4gPSB2c3ViLmxlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN1YiA9ICZieXRlOworICAgICAgICBzdWJfbGVuID0gMTsKKyAgICB9CisKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOworCisgICAgY291bnRfb2JqID0gUHlMb25nX0Zyb21Tc2l6ZV90KAorICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4sIFBZX1NTSVpFX1RfTUFYKQorICAgICAgICApOworCisgICAgaWYgKHN1Yl9vYmopCisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZzdWIpOworCisgICAgcmV0dXJuIGNvdW50X29iajsKK30KKworaW50CitfUHlfYnl0ZXNfY29udGFpbnMoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZykKK3sKKyAgICBQeV9zc2l6ZV90IGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBOVUxMKTsKKyAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X2J1ZmZlciB2YXJnOworICAgICAgICBQeV9zc2l6ZV90IHBvczsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsICZ2YXJnLCBQeUJVRl9TSU1QTEUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHBvcyA9IHN0cmluZ2xpYl9maW5kKHN0ciwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJnLmJ1ZiwgdmFyZy5sZW4sIDApOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2YXJnKTsKKyAgICAgICAgcmV0dXJuIHBvcyA+PSAwOworICAgIH0KKyAgICBpZiAoaXZhbCA8IDAgfHwgaXZhbCA+PSAyNTYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJieXRlIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIG1lbWNocihzdHIsIChpbnQpIGl2YWwsIGxlbikgIT0gTlVMTDsKK30KKworCisvKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2YgdGhlIGJ1ZmZlcgorICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucworICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgorICovCitQeV9MT0NBTChpbnQpCit0YWlsbWF0Y2goY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKnN1YnN0ciwKKyAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKK3sKKyAgICBQeV9idWZmZXIgc3ViX3ZpZXcgPSB7TlVMTCwgTlVMTH07CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc2xlbjsKKworICAgIGlmIChQeUJ5dGVzX0NoZWNrKHN1YnN0cikpIHsKKyAgICAgICAgc3ViID0gUHlCeXRlc19BU19TVFJJTkcoc3Vic3RyKTsKKyAgICAgICAgc2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc3Vic3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmc3ViX3ZpZXcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3ViID0gc3ViX3ZpZXcuYnVmOworICAgICAgICBzbGVuID0gc3ViX3ZpZXcubGVuOworICAgIH0KKworICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CisKKyAgICBpZiAoZGlyZWN0aW9uIDwgMCkgeworICAgICAgICAvKiBzdGFydHN3aXRoICovCisgICAgICAgIGlmIChzdGFydCArIHNsZW4gPiBsZW4pCisgICAgICAgICAgICBnb3RvIG5vdGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGVuZHN3aXRoICovCisgICAgICAgIGlmIChlbmQgLSBzdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCisgICAgICAgICAgICBnb3RvIG5vdGZvdW5kOworCisgICAgICAgIGlmIChlbmQgLSBzbGVuID4gc3RhcnQpCisgICAgICAgICAgICBzdGFydCA9IGVuZCAtIHNsZW47CisgICAgfQorICAgIGlmIChlbmQgLSBzdGFydCA8IHNsZW4pCisgICAgICAgIGdvdG8gbm90Zm91bmQ7CisgICAgaWYgKG1lbWNtcChzdHIgKyBzdGFydCwgc3ViLCBzbGVuKSAhPSAwKQorICAgICAgICBnb3RvIG5vdGZvdW5kOworCisgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViX3ZpZXcpOworICAgIHJldHVybiAxOworCitub3Rmb3VuZDoKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7CisgICAgcmV0dXJuIDA7Cit9CisKK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitfUHlfYnl0ZXNfdGFpbG1hdGNoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQoreworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Ym9iajsKKyAgICBpbnQgcmVzdWx0OworCisgICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcyhmdW5jdGlvbl9uYW1lLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc3RyLCBsZW4sIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHN0ciwgbGVuLCBzdWJvYmosIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgb3IgYSB0dXBsZSBvZiBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfc3RhcnRzd2l0aF9fZG9jX18sCisiQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKK1xuXAorUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAorV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAorV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3ByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX3N0YXJ0c3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgcmV0dXJuIF9QeV9ieXRlc190YWlsbWF0Y2goc3RyLCBsZW4sICJzdGFydHN3aXRoIiwgYXJncywgLTEpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9lbmRzd2l0aF9fZG9jX18sCisiQi5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXG5cCitcblwKK1JldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCitXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCitXaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAorc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfZW5kc3dpdGgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgcmV0dXJuIF9QeV9ieXRlc190YWlsbWF0Y2goc3RyLCBsZW4sICJlbmRzd2l0aCIsIGFyZ3MsICsxKTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfZXhwYW5kdGFic19fZG9jX18sCisiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXG5cCitcblwKK1JldHVybiBhIGNvcHkgb2YgQiB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cblwKK0lmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9sanVzdF9fZG9jX18sCisiQi5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUmV0dXJuIEIgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCisiZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9yanVzdF9fZG9jX18sCisiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xuIgorImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKSIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9jZW50ZXJfX2RvY19fLAorIkIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKKyJcbiIKKyJSZXR1cm4gQiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguICBQYWRkaW5nIGlzXG4iCisiZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOworCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV96ZmlsbF9fZG9jX18sCisiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcbiIKKyJvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuIik7CisKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNvYmplY3QuYyBiL09iamVjdHMvYnl0ZXNvYmplY3QuYwppbmRleCA1OTM0MzM2Li5iMGQ5YjM5IDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ieXRlc29iamVjdC5jCkBAIC05LDkgKzksOSBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiAvKltjbGluaWMgaW5wdXRdCi1jbGFzcyBieXRlcyAiUHlCeXRlc09iamVjdCoiICImUHlCeXRlc19UeXBlIgorY2xhc3MgYnl0ZXMgIlB5Qnl0ZXNPYmplY3QgKiIgIiZQeUJ5dGVzX1R5cGUiCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD0xYTFkOTEwMmFmYzFiMDBjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD03YTIzOGY5NjVkNjQ4OTJiXSovCiAKICNpbmNsdWRlICJjbGluaWMvYnl0ZXNvYmplY3QuYy5oIgogCkBAIC0zMCw2ICszMCwxMCBAQAogKi8KICNkZWZpbmUgUHlCeXRlc09iamVjdF9TSVpFIChvZmZzZXRvZihQeUJ5dGVzT2JqZWN0LCBvYl9zdmFsKSArIDEpCiAKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOworCiAvKgogICAgRm9yIFB5Qnl0ZXNfRnJvbVN0cmluZygpLCB0aGUgcGFyYW1ldGVyIGBzdHInIHBvaW50cyB0byBhIG51bGwtdGVybWluYXRlZAogICAgc3RyaW5nIGNvbnRhaW5pbmcgZXhhY3RseSBgc2l6ZScgYnl0ZXMuCkBAIC0xNzQsMTkwICsxNzgsMTg0IEBACiBQeU9iamVjdCAqCiBQeUJ5dGVzX0Zyb21Gb3JtYXRWKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKIHsKLSAgICB2YV9saXN0IGNvdW50OwotICAgIFB5X3NzaXplX3QgbiA9IDA7Ci0gICAgY29uc3QgY2hhciogZjsKICAgICBjaGFyICpzOwotICAgIFB5T2JqZWN0KiBzdHJpbmc7CisgICAgY29uc3QgY2hhciAqZjsKKyAgICBjb25zdCBjaGFyICpwOworICAgIFB5X3NzaXplX3QgcHJlYzsKKyAgICBpbnQgbG9uZ2ZsYWc7CisgICAgaW50IHNpemVfdGZsYWc7CisgICAgLyogTG9uZ2VzdCA2NC1iaXQgZm9ybWF0dGVkIG51bWJlcnM6CisgICAgICAgLSAiMTg0NDY3NDQwNzM3MDk1NTE2MTVcMCIgKDIxIGJ5dGVzKQorICAgICAgIC0gIi05MjIzMzcyMDM2ODU0Nzc1ODA4XDAiICgyMSBieXRlcykKKyAgICAgICBEZWNpbWFsIHRha2VzIHRoZSBtb3N0IHNwYWNlIChpdCBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLikKIAotICAgIFB5X1ZBX0NPUFkoY291bnQsIHZhcmdzKTsKLSAgICAvKiBzdGVwIDE6IGZpZ3VyZSBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIHdlIG5lZWQgKi8KLSAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLSAgICAgICAgaWYgKCpmID09ICclJykgewotICAgICAgICAgICAgY29uc3QgY2hhciogcCA9IGY7Ci0gICAgICAgICAgICB3aGlsZSAoKisrZiAmJiAqZiAhPSAnJScgJiYgIVB5X0lTQUxQSEEoKmYpKQotICAgICAgICAgICAgICAgIDsKKyAgICAgICBMb25nZXN0IDY0LWJpdCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOgorICAgICAgICIweGZmZmZmZmZmZmZmZmZmZmZcMCIgKDE5IGJ5dGVzKS4gKi8KKyAgICBjaGFyIGJ1ZmZlclsyMV07CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCi0gICAgICAgICAgICAvKiBza2lwIHRoZSAnbCcgb3IgJ3onIGluIHslbGQsICV6ZCwgJWx1LCAlenV9IHNpbmNlCi0gICAgICAgICAgICAgKiB0aGV5IGRvbid0IGFmZmVjdCB0aGUgYW1vdW50IG9mIHNwYWNlIHdlIHJlc2VydmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgoKmYgPT0gJ2wnIHx8ICpmID09ICd6JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKQotICAgICAgICAgICAgICAgICsrZjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCi0gICAgICAgICAgICBzd2l0Y2ggKCpmKSB7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeUJ5dGVzX0Zyb21Gb3JtYXRWKCk6ICVjIGZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ2knOiBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIC8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0Ci0gICAgICAgICAgICAgICAgICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgVGhpcyBpc24ndCBlbm91Z2ggZm9yIG9jdGFsLiAqLwotICAgICAgICAgICAgICAgIG4gKz0gMjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICBzID0gdmFfYXJnKGNvdW50LCBjaGFyKik7Ci0gICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIC8qIG1heGltdW0gNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246Ci0gICAgICAgICAgICAgICAgICogMHhmZmZmZmZmZmZmZmZmZmZmCi0gICAgICAgICAgICAgICAgICogc28gMTkgY2hhcmFjdGVycyBpcyBlbm91Z2guCi0gICAgICAgICAgICAgICAgICogWFhYIEkgY291bnQgMTggLS0gd2hhdCdzIHRoZSBleHRyYSBmb3I/Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbiArPSAxOTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogaWYgd2Ugc3R1bWJsZSB1cG9uIGFuIHVua25vd24KLSAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nIGNvZGUsIGNvcHkgdGhlIHJlc3Qgb2YKLSAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWF0IHN0cmluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgc3RyaW5nLiAod2UgY2Fubm90IGp1c3Qgc2tpcCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb2RlLCBzaW5jZSB0aGVyZSdzIG5vIHdheSB0byBrbm93Ci0gICAgICAgICAgICAgICAgICAgd2hhdCdzIGluIHRoZSBhcmd1bWVudCBsaXN0KSAqLwotICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGdvdG8gZXhwYW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG4rKzsKLSAgICB9Ci0gZXhwYW5kOgotICAgIC8qIHN0ZXAgMjogZmlsbCB0aGUgYnVmZmVyICovCi0gICAgLyogU2luY2Ugd2UndmUgYW5hbHl6ZWQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZCBmb3IgdGhlIHdvcnN0IGNhc2UsCi0gICAgICAgdXNlIHNwcmludGYgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aGUgc2xvd2VyIFB5T1Nfc25wcmludGYuICovCi0gICAgc3RyaW5nID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLSAgICBpZiAoIXN0cmluZykKKyAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc3RybGVuKGZvcm1hdCkpOworICAgIGlmIChzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoc3RyaW5nKTsKKyNkZWZpbmUgV1JJVEVfQllURVMoc3RyKSBcCisgICAgZG8geyBcCisgICAgICAgIHMgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHMsIChzdHIpLCBzdHJsZW4oc3RyKSk7IFwKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgXAorICAgICAgICAgICAgZ290byBlcnJvcjsgXAorICAgIH0gd2hpbGUgKDApCiAKICAgICBmb3IgKGYgPSBmb3JtYXQ7ICpmOyBmKyspIHsKLSAgICAgICAgaWYgKCpmID09ICclJykgewotICAgICAgICAgICAgY29uc3QgY2hhciogcCA9IGYrKzsKKyAgICAgICAgaWYgKCpmICE9ICclJykgeworICAgICAgICAgICAgKnMrKyA9ICpmOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBwID0gZisrOworCisgICAgICAgIC8qIGlnbm9yZSB0aGUgd2lkdGggKGV4OiAxMCBpbiAiJTEwcyIpICovCisgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpmKSkKKyAgICAgICAgICAgIGYrKzsKKworICAgICAgICAvKiBwYXJzZSB0aGUgcHJlY2lzaW9uIChleDogMTAgaW4gIiUuMTBzIikgKi8KKyAgICAgICAgcHJlYyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAnLicpIHsKKyAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgIGZvciAoOyBQeV9JU0RJR0lUKCpmKTsgZisrKSB7CisgICAgICAgICAgICAgICAgcHJlYyA9IChwcmVjICogMTApICsgKCpmIC0gJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgqZiAmJiAqZiAhPSAnJScgJiYgIVB5X0lTQUxQSEEoKmYpKQorICAgICAgICAgICAgZisrOworCisgICAgICAgIC8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnICgnbCcpLCBidXQgb25seSBmb3IgJWxkIGFuZCAlbHUuCisgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCisgICAgICAgIGxvbmdmbGFnID0gMDsKKyAgICAgICAgaWYgKCpmID09ICdsJyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICBsb25nZmxhZyA9IDE7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKworICAgICAgICAvKiBoYW5kbGUgdGhlIHNpemVfdCBmbGFnICgneicpLiAqLworICAgICAgICBzaXplX3RmbGFnID0gMDsKKyAgICAgICAgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CisgICAgICAgICAgICBzaXplX3RmbGFnID0gMTsKKyAgICAgICAgICAgICsrZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN1YnRyYWN0IGJ5dGVzIHByZWFsbG9jYXRlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgKGV4OiAyIGZvciAiJXMiKSAqLworICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGYgLSBwICsgMSk7CisKKyAgICAgICAgc3dpdGNoICgqZikgeworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIldSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICB7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOwotICAgICAgICAgICAgaW50IHNpemVfdGZsYWcgPSAwOwotICAgICAgICAgICAgLyogcGFyc2UgdGhlIHdpZHRoLnByZWNpc2lvbiBwYXJ0ICh3ZSdyZSBvbmx5Ci0gICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZSBwcmVjaXNpb24gdmFsdWUsIGlmIGFueSkgKi8KLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQotICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotICAgICAgICAgICAgaWYgKCpmID09ICcuJykgewotICAgICAgICAgICAgICAgIGYrKzsKLSAgICAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworCisgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICAgICAgICBpID0gc3RybGVuKHApOworICAgICAgICAgICAgaWYgKHByZWMgPiAwICYmIGkgPiBwcmVjKQorICAgICAgICAgICAgICAgIGkgPSBwcmVjOworICAgICAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgcCwgaSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCisgICAgICAgICAgICBpZiAoYnVmZmVyWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CisgICAgICAgICAgICBlbHNlIGlmIChidWZmZXJbMV0gIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShidWZmZXIrMiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAnMCc7CisgICAgICAgICAgICAgICAgYnVmZmVyWzFdID0gJ3gnOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcsIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KLSAgICAgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCi0gICAgICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLSAgICAgICAgICAgICAgICBsb25nZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOwotICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICclJzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKmYgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZpeCBtaW5fc2l6ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogYyBoYXMgYmVlbiBjaGVja2VkIGZvciBvdmVyZmxvdyBpbiB0aGUgZmlyc3Qgc3RlcCAqLwotICAgICAgICAgICAgICAgICpzKysgPSAodW5zaWduZWQgY2hhciljOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBpID0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiBpID4gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IG47Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHMsIHAsIGkpOwotICAgICAgICAgICAgICAgIHMgKz0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOwotICAgICAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCi0gICAgICAgICAgICAgICAgaWYgKHNbMV0gPT0gJ1gnKQotICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgKnMrKyA9ICclJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RyY3B5KHMsIHApOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIC8qIGludmFsaWQgZm9ybWF0IHN0cmluZzogY29weSB1bmZvcm1hdHRlZCBzdHJpbmcgYW5kIGV4aXQgKi8KKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKHApOworICAgICAgICAgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKyAgICAgICAgfQogICAgIH0KIAotIGVuZDoKLSAgICBfUHlCeXRlc19SZXNpemUoJnN0cmluZywgcyAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cmluZykpOwotICAgIHJldHVybiBzdHJpbmc7CisjdW5kZWYgV1JJVEVfQllURVMKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcyk7CisKKyBlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC00MDksMTIgKzQwNywxNCBAQAogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIFB5Qnl0ZXMgb2JqZWN0LCBvciBOVUxMIG9uIGZhaWx1cmUuICovCiAKLXN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRmbG9hdChQeU9iamVjdCAqdiwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUpCitzdGF0aWMgY2hhcioKK2Zvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSwKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9yZXN1bHQsIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKIHsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CisgICAgc2l6ZV90IGxlbjsKIAogICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwogICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNDMxLDkgKzQzMSwyMiBAQAogCiAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOworCisgICAgbGVuID0gc3RybGVuKHApOworICAgIGlmICh3cml0ZXIgIT0gTlVMTCkgeworICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBsZW4pOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfTUVNQ1BZKHN0ciwgcCwgbGVuKTsKKyAgICAgICAgUHlNZW1fRnJlZShwKTsKKyAgICAgICAgc3RyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIGxlbik7CiAgICAgUHlNZW1fRnJlZShwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgICpwX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICByZXR1cm4gc3RyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDczLDExICs0ODYsMTEgQEAKIHN0YXRpYyBpbnQKIGJ5dGVfY29udmVydGVyKFB5T2JqZWN0ICphcmcsIGNoYXIgKnApCiB7Ci0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX1NpemUoYXJnKSA9PSAxKSB7CisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX0dFVF9TSVpFKGFyZykgPT0gMSkgewogICAgICAgICAqcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZylbMF07CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhhcmcpICYmIFB5Qnl0ZUFycmF5X1NpemUoYXJnKSA9PSAxKSB7CisgICAgZWxzZSBpZiAoUHlCeXRlQXJyYXlfQ2hlY2soYXJnKSAmJiBQeUJ5dGVBcnJheV9HRVRfU0laRShhcmcpID09IDEpIHsKICAgICAgICAgKnAgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoYXJnKVswXTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpAQCAtNTU3LDM2ICs1NzAsMzYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pCi0KLSAgIEZPUk1BVEJVRkxFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGludHMgJgotICAgY2hhcnMgYXJlIGZvcm1hdHRlZC4gWFhYIFRoaXMgaXMgYSBtYWdpYyBudW1iZXIuIEVhY2ggZm9ybWF0dGluZwotICAgcm91dGluZSBkb2VzIGJvdW5kcyBjaGVja2luZyB0byBlbnN1cmUgbm8gb3ZlcmZsb3csIGJ1dCBhIGJldHRlcgotICAgc29sdXRpb24gbWF5IGJlIHRvIG1hbGxvYyBhIGJ1ZmZlciBvZiBhcHByb3ByaWF0ZSBzaXplIGZvciBlYWNoCi0gICBmb3JtYXQuIEZvciBub3csIHRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHN1ZmZpY2llbnQuCi0qLwotI2RlZmluZSBGT1JNQVRCVUZMRU4gKHNpemVfdCkxMjAKKy8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKSAqLwogCiBQeU9iamVjdCAqCi1fUHlCeXRlc19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCitfUHlCeXRlc19Gb3JtYXRFeChjb25zdCBjaGFyICpmb3JtYXQsIFB5X3NzaXplX3QgZm9ybWF0X2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBpbnQgdXNlX2J5dGVhcnJheSkKIHsKLSAgICBjaGFyICpmbXQsICpyZXM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgKnJlczsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OwotICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBQeV9zc2l6ZV90IGZtdGNudDsKICAgICBpbnQgYXJnc19vd25lZCA9IDA7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeUJ5dGVzX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdCk7Ci0gICAgZm10Y250ID0gUHlCeXRlc19HRVRfU0laRShmb3JtYXQpOwotICAgIHJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcmVzbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgZm10ID0gZm9ybWF0OworICAgIGZtdGNudCA9IGZvcm1hdF9sZW47CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKKworICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGZtdGNudCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaWYgKCF1c2VfYnl0ZWFycmF5KQorICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKwogICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CiAgICAgICAgIGFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAgICAgICAgIGFyZ2lkeCA9IDA7CkBAIC02MDAsMTggKzYxMywyMyBAQAogICAgICAgICAhUHlCeXRlQXJyYXlfQ2hlY2soYXJncykpIHsKICAgICAgICAgICAgIGRpY3QgPSBhcmdzOwogICAgIH0KKwogICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CiAgICAgICAgIGlmICgqZm10ICE9ICclJykgewotICAgICAgICAgICAgaWYgKC0tcmVzY250IDwgMCkgewotICAgICAgICAgICAgICAgIHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpyZXMrKyA9ICpmbXQrKzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgY2hhciAqcG9zOworCisgICAgICAgICAgICBwb3MgPSBzdHJjaHIoZm10ICsgMSwgJyUnKTsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBsZW4gPSBwb3MgLSBmbXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0X2xlbiAtIChmbXQgLSBmb3JtYXQpOworICAgICAgICAgICAgYXNzZXJ0KGxlbiAhPSAwKTsKKworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgZm10LCBsZW4pOworICAgICAgICAgICAgcmVzICs9IGxlbjsKKyAgICAgICAgICAgIGZtdCArPSBsZW47CisgICAgICAgICAgICBmbXRjbnQgLT0gKGxlbiAtIDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLwpAQCAtNjI2LDEwICs2NDQsMTQgQEAKICAgICAgICAgICAgIGludCBzaWduOwogICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSAwOwogICAgICAgICAgICAgY2hhciBvbmVjaGFyOyAvKiBGb3IgYnl0ZV9jb252ZXJ0ZXIoKSAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBhbGxvYzsKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgY2hhciAqYmVmb3JlOworI2VuZGlmCiAKICAgICAgICAgICAgIGZtdCsrOwogICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqa2V5c3RhcnQ7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5c3RhcnQ7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlsZW47CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKICAgICAgICAgICAgICAgICBpbnQgcGNvdW50ID0gMTsKQEAgLTY3Myw2ICs2OTUsOCBAQAogICAgICAgICAgICAgICAgIGFyZ2xlbiA9IC0xOwogICAgICAgICAgICAgICAgIGFyZ2lkeCA9IC0yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBmbGFncy4gRXhhbXBsZTogIiUraSIgPT4gZmxhZ3M9Rl9TSUdOLiAqLwogICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSAqZm10KyspIHsKICAgICAgICAgICAgICAgICBjYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7CkBAIC02ODMsNiArNzA3LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIHdpZHRoLiBFeGFtcGxlOiAiJTEwcyIgPT4gd2lkdGg9MTAgKi8KICAgICAgICAgICAgIGlmIChjID09ICcqJykgewogICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKQEAgLTcxNyw2ICs3NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2UgcHJlY2lzaW9uLiBFeGFtcGxlOiAiJS4zZiIgPT4gcHJlYz0zICovCiAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKICAgICAgICAgICAgICAgICBwcmVjID0gMDsKICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKQEAgLTc3MSwxMyArNzk5LDE5IEBACiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZtdGNudCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBsYXN0IHdyaXRlcjogZGlzYWJsZSB3cml0ZXIgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc2lnbiA9IDA7CiAgICAgICAgICAgICBmaWxsID0gJyAnOwogICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBwYnVmID0gIiUiOwotICAgICAgICAgICAgICAgIGxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKnJlcysrID0gJyUnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAvLyAlciBpcyBvbmx5IGZvciAyLzMgY29kZTsgMyBvbmx5IGNvZGUgc2hvdWxkIHVzZSAlYQogICAgICAgICAgICAgY2FzZSAnYSc6CkBAIC03OTAsNiArODI0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgIC8vICVzIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICViCiAgICAgICAgICAgICBjYXNlICdiJzoKQEAgLTc5OSwxMiArODM0LDQ5IEBACiAgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQogICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnWCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdGVybmF0ZSA9IGZsYWdzICYgRl9BTFQ7CisgICAgICAgICAgICAgICAgICAgIGludCBiYXNlOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwICYmICIndHlwZScgbm90IGluIFtkaXVveFhdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gMjsgLyogc2l6ZSBwcmVhbGxvY2F0ZWQgZm9yICIlZCIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcigmd3JpdGVyLCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYmFzZSwgYWx0ZXJuYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGxvbmcodiwgZmxhZ3MsIHByZWMsIGMpOwogICAgICAgICAgICAgICAgIGlmICghdGVtcCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTgxNSwxNCArODg3LDI1IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICBjYXNlICdGJzoKICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSAmJiBwcmVjID09IC0xCisgICAgICAgICAgICAgICAgICAgICYmICEoZmxhZ3MgJiAoRl9TSUdOIHwgRl9CTEFOSykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVmIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgTlVMTCwgJndyaXRlciwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgJnRlbXAsIE5VTEwsIHJlcykpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHRlbXApOwogICAgICAgICAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUodGVtcCk7CkBAIC04MzAsMjEgKzkxMywyOCBAQAogICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICAgcGJ1ZiA9ICZvbmVjaGFyOwogICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVfY29udmVydGVyKHYsICZvbmVjaGFyKTsKICAgICAgICAgICAgICAgICBpZiAoIWxlbikKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IG9uZWNoYXI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKICAgICAgICAgICAgICAgICAgICJhdCBpbmRleCAlemQiLAogICAgICAgICAgICAgICAgICAgYywgYywKLSAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0gZm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgewogICAgICAgICAgICAgICAgICAgICBzaWduID0gKnBidWYrKzsKQEAgLTg1OSwyOSArOTQ5LDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod2lkdGggPCBsZW4pCiAgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47Ci0gICAgICAgICAgICBpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgIHJlc2xlbiAtPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7Ci0gICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKLSAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKKworICAgICAgICAgICAgYWxsb2MgPSB3aWR0aDsKKyAgICAgICAgICAgIGlmIChzaWduICE9IDAgJiYgbGVuID09IHdpZHRoKQorICAgICAgICAgICAgICAgIGFsbG9jKys7CisgICAgICAgICAgICAvKiAyOiBzaXplIHByZWFsbG9jYXRlZCBmb3IgJXMgKi8KKyAgICAgICAgICAgIGlmIChhbGxvYyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHJlcywgYWxsb2MgLSAyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisjaWZkZWYgUHlfREVCVUcKKyAgICAgICAgICAgIGJlZm9yZSA9IHJlczsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgc2lnbiBpZiBuZWVkZWQgKi8KICAgICAgICAgICAgIGlmIChzaWduKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwotICAgICAgICAgICAgICAgIHJlc2NudC0tOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikKICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIG51bWVyaWMgcHJlZml4IGZvciAieCIsICJYIiBhbmQgIm8iIGZvcm1hdHMKKyAgICAgICAgICAgICAgIGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkLgorICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHdyaXRlICIweCIgZm9yIHRoZSAiJSN4IiBmb3JtYXQuICovCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKICAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOwpAQCAtODg5LDE4ICs5ODEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzY250IC09IDI7CiAgICAgICAgICAgICAgICAgd2lkdGggLT0gMjsKICAgICAgICAgICAgICAgICBpZiAod2lkdGggPCAwKQogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhZCBsZWZ0IHdpdGggdGhlIGZpbGwgY2hhcmFjdGVyIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IGZpbGw7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7CisgICAgICAgICAgICAgICAgbWVtc2V0KHJlcywgZmlsbCwgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBwYWRkaW5nIHdpdGggc3BhY2VzOiB3cml0ZSBzaWduIGlmIG5lZWRlZCBhbmQvb3IgbnVtZXJpYworICAgICAgICAgICAgICAgcHJlZml4IGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkICovCiAgICAgICAgICAgICBpZiAoZmlsbCA9PSAnICcpIHsKICAgICAgICAgICAgICAgICBpZiAoc2lnbikKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKQEAgLTkxMiwxMyArMTAwNywxNyBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29weSBieXRlcyAqLwogICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKICAgICAgICAgICAgIHJlcyArPSBsZW47Ci0gICAgICAgICAgICByZXNjbnQgLT0gbGVuOwotICAgICAgICAgICAgd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgKnJlcysrID0gJyAnOworCisgICAgICAgICAgICAvKiBQYWQgcmlnaHQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCisgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCAnICcsIHdpZHRoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICByZXMgKz0gKHdpZHRoIC0gbGVuKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwpAQCAtOTI2LDIyICsxMDI1LDMxIEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBjb21wdXRlZCB0aGUgZXhhY3Qgc2l6ZSBmb3IgdGhpcyB3cml0ZSAqLworICAgICAgICAgICAgYXNzZXJ0KChyZXMgLSBiZWZvcmUpID09IGFsbG9jKTsKKyNlbmRpZgogICAgICAgICB9IC8qICclJyAqLworCisgICAgICAgIC8qIElmIG92ZXJhbGxvY2F0aW9uIHdhcyBkaXNhYmxlZCwgZW5zdXJlIHRoYXQgaXQgd2FzIHRoZSBsYXN0CisgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgZm10Y250IDwgMCB8fCB1c2VfYnl0ZWFycmF5KTsKICAgICB9IC8qIHVudGlsIGVuZCAqLworCiAgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKwogICAgIGlmIChhcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcmVzKTsKIAogIGVycm9yOgotICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KQEAgLTk2MSw2ICsxMDY5LDQyIEBACiAgICB0aGUgc3RyaW5nIGlzIFVURi04IGVuY29kZWQgYW5kIHNob3VsZCBiZSByZS1lbmNvZGVkIGluIHRoZQogICAgc3BlY2lmaWVkIGVuY29kaW5nLiAgKi8KIAorc3RhdGljIGNoYXIgKgorX1B5Qnl0ZXNfRGVjb2RlRXNjYXBlUmVjb2RlKGNvbnN0IGNoYXIgKipzLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqcCkKK3sKKyAgICBQeU9iamVjdCAqdSwgKnc7CisgICAgY29uc3QgY2hhciogdDsKKworICAgIHQgPSAqczsKKyAgICAvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLworICAgIHdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKQorICAgICAgICB0Kys7CisgICAgdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KCpzLCB0IC0gKnMsIGVycm9ycyk7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCisgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOworICAgIFB5X0RFQ1JFRih1KTsKKyAgICBpZiAgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOworCisgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCisgICAgd3JpdGVyLT5taW5fc2l6ZS0tOyAgIC8qIHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyh3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRSh3KSk7CisgICAgUHlfREVDUkVGKHcpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnMgPSB0OworICAgIHJldHVybiBwOworfQorCiBQeU9iamVjdCAqUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKQEAgLTk2OCw1NCArMTExMiw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCiB7CiAgICAgaW50IGM7Ci0gICAgY2hhciAqcCwgKmJ1ZjsKKyAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBQeU9iamVjdCAqdjsKLSAgICBQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKLSAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7Ci0gICAgaWYgKHYgPT0gTlVMTCkKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodik7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisKICAgICBlbmQgPSBzICsgbGVuOwogICAgIHdoaWxlIChzIDwgZW5kKSB7CiAgICAgICAgIGlmICgqcyAhPSAnXFwnKSB7CiAgICAgICAgICAgbm9uX2VzYzoKLSAgICAgICAgICAgIGlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdSwgKnc7Ci0gICAgICAgICAgICAgICAgY2hhciAqcjsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0OwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgcm47Ci0gICAgICAgICAgICAgICAgdCA9IHM7Ci0gICAgICAgICAgICAgICAgLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOwotICAgICAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBpZighdSkgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCi0gICAgICAgICAgICAgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF3KSAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7Ci0gICAgICAgICAgICAgICAgciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHcpOwotICAgICAgICAgICAgICAgIHJuID0gUHlCeXRlc19HRVRfU0laRSh3KTsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocCwgciwgcm4pOwotICAgICAgICAgICAgICAgIHAgKz0gcm47Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOwotICAgICAgICAgICAgICAgIHMgPSB0OwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkpIHsKICAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vbi1BU0NJSSBjaGFyYWN0ZXIgYW5kIG5lZWQgdG8gcmVjb2RlICovCisgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgmcywgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCByZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKICAgICAgICAgcysrOwotICAgICAgICBpZiAocz09ZW5kKSB7CisgICAgICAgIGlmIChzID09IGVuZCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOwogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KKwogICAgICAgICBzd2l0Y2ggKCpzKyspIHsKICAgICAgICAgLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KICAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKQEAgLTEwNDAsMjggKzExNzIsMTggQEAKICAgICAgICAgICAgICpwKysgPSBjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSAmJiBQeV9JU1hESUdJVChzWzFdKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB4ID0gMDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IGMgLSAnMCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlfSVNMT1dFUihjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgeCA9IHggPDwgNDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ2EnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgKnArKyA9IHg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocysxIDwgZW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGRpZ2l0MSwgZGlnaXQyOworICAgICAgICAgICAgICAgIGRpZ2l0MSA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzBdKV07CisgICAgICAgICAgICAgICAgZGlnaXQyID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHNbMV0pXTsKKyAgICAgICAgICAgICAgICBpZiAoZGlnaXQxIDwgMTYgJiYgZGlnaXQyIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSgoZGlnaXQxIDw8IDQpICsgZGlnaXQyKTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0cyAqLworCiAgICAgICAgICAgICBpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBcXHggZXNjYXBlIGF0IHBvc2l0aW9uICVkIiwKQEAgLTEwODMsNiArMTIwNSw3IEBACiAgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSkKICAgICAgICAgICAgICAgICBzKys7IC8qIGFuZCBhIGhleGRpZ2l0ICovCiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICBzLS07CkBAIC0xMDkwLDExICsxMjEzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04IGJ5dGVzIG1heSBmb2xsb3cuICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHAtYnVmIDwgbmV3bGVuKQotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnYsIHAgLSBidWYpOwotICAgIHJldHVybiB2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKwogICBmYWlsZWQ6Ci0gICAgUHlfREVDUkVGKHYpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEzNjMsMjQgKzE0ODYsNyBAQAogc3RhdGljIGludAogYnl0ZXNfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgUHlfc3NpemVfdCBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9idWZmZXIgdmFyZzsKLSAgICAgICAgUHlfc3NpemVfdCBwb3M7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCAmdmFyZywgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBwb3MgPSBzdHJpbmdsaWJfZmluZChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlfU0laRShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7Ci0gICAgICAgIHJldHVybiBwb3MgPj0gMDsKLSAgICB9Ci0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBtZW1jaHIoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIChpbnQpIGl2YWwsIFB5X1NJWkUoc2VsZikpICE9IE5VTEw7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb250YWlucyhQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE2MjcsOCArMTczMyw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04YmRlNDRkYWNiMzZlZjJlIGlucHV0PThiODA5YjM5MDc0YWJiZmFdKi8KK2J5dGVzX3NwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MjEyNmI1ODQ0YzFkOGVmIGlucHV0PThiODA5YjM5MDc0YWJiZmFdKi8KIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIG47CiAgICAgY29uc3QgY2hhciAqcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwpAQCAtMTY1Miw3ICsxNzU4LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIHNlcDogUHlfYnVmZmVyCiAgICAgLwogCkBAIC0xNjY4LDcgKzE3NzMsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcGFydGl0aW9uX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpzZXApCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjUzMmIzOTJhMTdmZjY5NSBpbnB1dD1iYzg1NWRjNjNjYTk0OWRlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjUzMmIzOTJhMTdmZjY5NSBpbnB1dD02MWNjYTk1NTE5NDA2MDk5XSovCiB7CiAgICAgcmV0dXJuIHN0cmluZ2xpYl9wYXJ0aXRpb24oCiAgICAgICAgIChQeU9iamVjdCopIHNlbGYsCkBAIC0xNjgwLDcgKzE3ODUsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMucnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIHNlcDogUHlfYnVmZmVyCiAgICAgLwogCkBAIC0xNjk2LDcgKzE4MDAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcnBhcnRpdGlvbl9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE5MWIxMTRjYmIwMjhlNTAgaW5wdXQ9NjU4OGZmZjI2MmE5MTcwZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE5MWIxMTRjYmIwMjhlNTAgaW5wdXQ9NjdmNjg5ZTYzYTYyZDQ3OF0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfcnBhcnRpdGlvbigKICAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwKQEAgLTE3MTQsOCArMTgxOCw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGI2NTcwYjk3NzkxMWQ4OCBpbnB1dD0wZjg2YzlmMjhmN2Q3YjdiXSovCitieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJhNjk4ZDllYTAxZTFjOGYgaW5wdXQ9MGY4NmM5ZjI4ZjdkN2I3Yl0qLwogewogICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKSwgbjsKICAgICBjb25zdCBjaGFyICpzID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZiksICpzdWI7CkBAIC0xNzUzLDggKzE4NTcsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfam9pbihQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9ieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MzRhZmYxNDc2NGZmOTk3IGlucHV0PTdmZTM3N2I5NWJkNTQ5ZDJdKi8KK2J5dGVzX2pvaW4oUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZXJhYmxlX29mX2J5dGVzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWEwNDZmMzc5ZjYyNmY2ZjggaW5wdXQ9N2ZlMzc3Yjk1YmQ1NDlkMl0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfYnl0ZXNfam9pbigoUHlPYmplY3QqKXNlbGYsIGl0ZXJhYmxlX29mX2J5dGVzKTsKIH0KQEAgLTE3NjcsMTU4ICsxODcxLDMwIEBACiAgICAgcmV0dXJuIGJ5dGVzX2pvaW4oKFB5Qnl0ZXNPYmplY3QqKXNlcCwgeCk7CiB9CiAKLS8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCi0jZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCi0gICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZW5kID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKGVuZCA8IDApIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGVuZCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzdGFydCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLVB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotYnl0ZXNfZmluZF9pbnRlcm5hbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKLXsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9idWZmZXIgc3ViYnVmOwotICAgIGNvbnN0IGNoYXIgKnN1YjsKLSAgICBQeV9zc2l6ZV90IGxlbiwgc3ViX2xlbjsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKLSAgICBQeV9zc2l6ZV90IHJlczsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgaWYgKHN1Ym9iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLSAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBzdWJfbGVuKQotICAgICAgICByZXMgPSAtMTsKLSAgICBlbHNlIGlmIChzdWJfbGVuID09IDEKLSNpZm5kZWYgSEFWRV9NRU1SQ0hSCi0gICAgICAgICAgICAmJiBkaXIgPiAwCi0jZW5kaWYKLSAgICApIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSAqc3ViOwotICAgICAgICBpbnQgbW9kZSA9IChkaXIgPiAwKSA/IEZBU1RfU0VBUkNIIDogRkFTVF9SU0VBUkNIOwotICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIoCi0gICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKLSAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlLCBtb2RlKTsKLSAgICAgICAgaWYgKHJlcyA+PSAwKQotICAgICAgICAgICAgcmVzICs9IHN0YXJ0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRpciA+IDApCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgaWYgKHN1Ym9iaikKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViYnVmKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotUHlEb2NfU1RSVkFSKGZpbmRfX2RvY19fLAotIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfZmluZChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2ZpbmQoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KLVB5RG9jX1NUUlZBUihpbmRleF9fZG9jX18sCi0iQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfaW5kZXgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2luZGV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCi1QeURvY19TVFJWQVIocmZpbmRfX2RvY19fLAotIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXG5cCi1zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydDplbmRdLiAgT3B0aW9uYWxcblwKLWFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKLVxuXAotUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yZmluZChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JmaW5kKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCi1QeURvY19TVFJWQVIocmluZGV4X19kb2NfXywKLSJCLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLnJmaW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JpbmRleChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3Vic3RyaW5nIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmluZGV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCkBAIC0yMDA1LDcgKzE5ODEsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMuc3RyaXAKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBieXRlczogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMjAxNiw3ICsxOTkxLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3N0cmlwX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJ5dGVzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM3YzIyOGQzYmQxMDRhMWIgaW5wdXQ9MzdkYWE1ZmFkMTM5NWQ5NV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM3YzIyOGQzYmQxMDRhMWIgaW5wdXQ9OGEzNTQ2NDBlNGUwYjNlZl0qLwogewogICAgIHJldHVybiBkb19hcmdzdHJpcChzZWxmLCBCT1RIU1RSSVAsIGJ5dGVzKTsKIH0KQEAgLTIwMjQsNyArMTk5OSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy5sc3RyaXAKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBieXRlczogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMjAzNSw3ICsyMDA5LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2xzdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yODYwMmU1ODZmNTI0ZTgyIGlucHV0PTg4ODExYjA5ZGZiYzI5ODhdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yODYwMmU1ODZmNTI0ZTgyIGlucHV0PTliYWZmNDM5OGMzZjY4NTddKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgTEVGVFNUUklQLCBieXRlcyk7CiB9CkBAIC0yMDQzLDcgKzIwMTcsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMucnN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwNTQsODEgKzIwMjcsMzcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JzdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NDdlMzgxNWM5NTQ0N2RhIGlucHV0PThmOTNjOWNkMzYxZjAxNDBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NDdlMzgxNWM5NTQ0N2RhIGlucHV0PWI3OGFmNDQ1YzcyN2UzMmJdKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgUklHSFRTVFJJUCwgYnl0ZXMpOwogfQogCiAKLVB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCi0iQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW5cblwKLXN0cmluZyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKLWFzIGluIHNsaWNlIG5vdGF0aW9uLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfY291bnQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnN1Yl9vYmo7Ci0gICAgY29uc3QgY2hhciAqc3RyID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0gICAgUHlfc3NpemVfdCBzdWJfbGVuOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0KLSAgICBQeV9idWZmZXIgdnN1YjsKLSAgICBQeU9iamVjdCAqY291bnRfb2JqOwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsICZzdWJfb2JqLCAmYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc3ViX29iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKLSAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikpOwotCi0gICAgY291bnRfb2JqID0gUHlMb25nX0Zyb21Tc2l6ZV90KAotICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4sIFBZX1NTSVpFX1RfTUFYKQotICAgICAgICApOwotCi0gICAgaWYgKHN1Yl9vYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZzdWIpOwotCi0gICAgcmV0dXJuIGNvdW50X29iajsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2NvdW50KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy50cmFuc2xhdGUKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICB0YWJsZTogb2JqZWN0CiAgICAgICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuCi0gICAgWwotICAgIGRlbGV0ZWNoYXJzOiBvYmplY3QKLSAgICBdCiAgICAgLworICAgIGRlbGV0ZSBhcyBkZWxldGVjaGFyczogb2JqZWN0KGNfZGVmYXVsdD0iTlVMTCIpID0gYicnCiAKIFJldHVybiBhIGNvcHkgd2l0aCBlYWNoIGNoYXJhY3RlciBtYXBwZWQgYnkgdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLgogCi1BbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZWNoYXJzIGFyZSByZW1vdmVkLgorQWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGUgYXJlIHJlbW92ZWQuCiBUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3RyYW5zbGF0ZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWJsZSwgaW50IGdyb3VwX3JpZ2h0XzEsCitieXRlc190cmFuc2xhdGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVsZXRlY2hhcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjMzZGY4NTBlYjUwYmY4ZCBpbnB1dD1kOGZhNTUxOWQ3Y2M0YmU3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDNiZTM0MzdmMTk1NjIxMSBpbnB1dD0wZWNkZjE1OWY2NTQyMzNjXSovCiB7CiAgICAgY2hhciAqaW5wdXQsICpvdXRwdXQ7CiAgICAgUHlfYnVmZmVyIHRhYmxlX3ZpZXcgPSB7TlVMTCwgTlVMTH07CkBAIC0yMTg5LDcgKzIxMTgsNyBAQAogICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ0YWJsZV92aWV3KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5Qnl0ZXNfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwogICAgIGlucHV0ID0gUHlCeXRlc19BU19TVFJJTkcoaW5wdXRfb2JqKTsKIAogICAgIGlmIChkZWxsZW4gPT0gMCAmJiB0YWJsZV9jaGFycyAhPSBOVUxMKSB7CkBAIC0yMjY1LDQ5OCArMjE5NCw2IEBACiAgICAgcmV0dXJuIF9QeV9ieXRlc19tYWtldHJhbnMoZnJtLCB0byk7CiB9CiAKLS8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KLQotI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQotCi0vKiBTdHJpbmcgb3BzIG11c3QgcmV0dXJuIGEgc3RyaW5nLiAgKi8KLS8qIElmIHRoZSBvYmplY3QgaXMgc3ViY2xhc3Mgb2Ygc3RyaW5nLCBjcmVhdGUgYSBjb3B5ICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXR1cm5fc2VsZihQeUJ5dGVzT2JqZWN0ICpzZWxmKQotewotICAgIGlmIChQeUJ5dGVzX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gc2VsZjsKLSAgICB9Ci0gICAgcmV0dXJuIChQeUJ5dGVzT2JqZWN0ICopUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksCi0gICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikpOwotfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWNvdW50Y2hhcihjb25zdCBjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIFB5X3NzaXplX3QgY291bnQ9MDsKLSAgICBjb25zdCBjaGFyICpzdGFydD10YXJnZXQ7Ci0gICAgY29uc3QgY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOwotCi0gICAgd2hpbGUgKCAoc3RhcnQ9ZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgYykpICE9IE5VTEwgKSB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGlmIChjb3VudCA+PSBtYXhjb3VudCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzdGFydCArPSAxOwotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLQotLyogQWxnb3JpdGhtcyBmb3IgZGlmZmVyZW50IGNhc2VzIG9mIHN0cmluZyByZXBsYWNlbWVudCAqLwotCi0vKiBsZW4oc2VsZik+PTEsIGZyb209IiIsIGxlbih0byk+PTEsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX2ludGVybGVhdmUoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgaTsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICAvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlcjsKLSAgICAgICBjb3VudCA9IG1pbihtYXhjb3VudCwgc2VsZl9sZW4gKyAxKSAqLwotICAgIGlmIChtYXhjb3VudCA8PSBzZWxmX2xlbikKLSAgICAgICAgY291bnQgPSBtYXhjb3VudDsKLSAgICBlbHNlCi0gICAgICAgIC8qIENhbid0IG92ZXJmbG93OiBzZWxmX2xlbiArIDEgPD0gbWF4Y291bnQgPD0gUFlfU1NJWkVfVF9NQVguICovCi0gICAgICAgIGNvdW50ID0gc2VsZl9sZW4gKyAxOwotCi0gICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnQgYnl0ZXMgYXJlIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsKLQotICAgIGlmICghIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIC8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCi0KLSAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgIGNvdW50IC09IDE7Ci0KLSAgICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0gICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOwotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4taSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIGRlbGV0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciAqLwotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLQotICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KLSAgICBhc3NlcnQocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgfQotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgdG89IiIsIG1heGNvdW50Pj0xICovCi0KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KSB7Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSAoY291bnQgKiBmcm9tX2xlbik7Ci0gICAgYXNzZXJ0IChyZXN1bHRfbGVuPj0wKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdGFydCArIG9mZnNldDsKLQotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLSAgICB9Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZShQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLCBjaGFyIHRvX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kLCAqbmV4dDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuOwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIG5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOwotCi0gICAgaWYgKG5leHQgPT0gTlVMTCkgewotICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwotICAgIHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0KLSAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKLSAgICAqc3RhcnQgPSB0b19jOwotICAgIHN0YXJ0Kys7Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAqbmV4dCA9IHRvX2M7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kOwotICAgIGNoYXIgKnNlbGZfczsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwotICAgIHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0KLSAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OwotICAgIFB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOwotICAgIHN0YXJ0ICs9IGZyb21fbGVuOwotICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47Ci0KLSAgICB3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0PT0tMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBQeV9NRU1DUFkoc3RhcnQrb2Zmc2V0LCB0b19zLCBmcm9tX2xlbik7Ci0gICAgICAgIHN0YXJ0ICs9IG9mZnNldCtmcm9tX2xlbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBuZXcsIGhlbmNlIHRoZSAiLTEiICovCi0gICAgLyogICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tMSkgICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIDEgPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlbWVudCBieXRlcyBhcmUgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbiAtIDEpOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgewotICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLQotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgIC8qICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbikgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuIC0gZnJvbV9sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlbWVudCBieXRlcyBhcmUgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbik7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQrb2Zmc2V0OwotICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgewotICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZShQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGlmIChtYXhjb3VudCA8IDApIHsKLSAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKLSAgICB9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgUHlCeXRlc19HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAobWF4Y291bnQgPT0gMCB8fAotICAgICAgICAoZnJvbV9sZW4gPT0gMCAmJiB0b19sZW4gPT0gMCkpIHsKLSAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCi0KLSAgICBpZiAoZnJvbV9sZW4gPT0gMCkgewotICAgICAgICAvKiBpbnNlcnQgdGhlICd0bycgc3RyaW5nIGV2ZXJ5d2hlcmUuICAgKi8KLSAgICAgICAgLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCi0gICAgICAgIC8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0KLQotICAgIC8qIEV4Y2VwdCBmb3IgIiIucmVwbGFjZSgiIiwgIkEiKSA9PSAiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCi0gICAgLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgc3RyaW5nIHRvIGdlbmVyYXRlIGEgbm9uLWVtcHR5IHN0cmluZyAqLwotICAgIC8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgc3RyaW5nICovCi0gICAgaWYgKFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKHRvX2xlbiA9PSAwKSB7Ci0gICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2Zyb20nIHN0cmluZyAqLwotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCi0gICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9sZW4sIG1heGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBzdHJpbmdzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICovCi0KLSAgICBpZiAoZnJvbV9sZW4gPT0gdG9fbGVuKSB7Ci0gICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAotICAgICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgIHRvX3NbMF0sCi0gICAgICAgICAgICAgICAgbWF4Y291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAotICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwKLSAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLwotICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgZnJvbV9zWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLSAgICB9Ci19Ci0KIAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMucmVwbGFjZQpAQCAtMjc3NSwxNTYgKzIyMTIsMjggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3JlcGxhY2VfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5X2J1ZmZlciAqb2xkLCBQeV9idWZmZXIgKm5ldywKK2J5dGVzX3JlcGxhY2VfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKm9sZCwgUHlfYnVmZmVyICpuZXcsCiAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MDNkYzlkN2E4M2M1YTFkIGlucHV0PWIyZmJiZjBiZjA0ZGU4ZTVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05OTRmYTU4OGI2YjljMTA0IGlucHV0PWIyZmJiZjBiZjA0ZGU4ZTVdKi8KIHsKLSAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlCeXRlc09iamVjdCAqKSBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopb2xkLT5idWYsIG9sZC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopbmV3LT5idWYsIG5ldy0+bGVuLCBjb3VudCk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopb2xkLT5idWYsIG9sZC0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOwogfQogCiAvKiogRW5kIERBTEtFICoqLwogCi0vKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2Ygc2VsZgotICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucwotICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgotICovCi1QeV9MT0NBTChpbnQpCi1fYnl0ZXNfdGFpbG1hdGNoKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzdWJzdHIsIFB5X3NzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKLXsKLSAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0gICAgUHlfc3NpemVfdCBzbGVuOwotICAgIFB5X2J1ZmZlciBzdWJfdmlldyA9IHtOVUxMLCBOVUxMfTsKLSAgICBjb25zdCBjaGFyKiBzdWI7Ci0gICAgY29uc3QgY2hhciogc3RyOwotCi0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2soc3Vic3RyKSkgewotICAgICAgICBzdWIgPSBQeUJ5dGVzX0FTX1NUUklORyhzdWJzdHIpOwotICAgICAgICBzbGVuID0gUHlCeXRlc19HRVRfU0laRShzdWJzdHIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJzdHIsICZzdWJfdmlldywgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBzdWIgPSBzdWJfdmlldy5idWY7Ci0gICAgICAgIHNsZW4gPSBzdWJfdmlldy5sZW47Ci0gICAgfQotICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotCi0gICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKLQotICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7Ci0gICAgICAgIC8qIHN0YXJ0c3dpdGggKi8KLSAgICAgICAgaWYgKHN0YXJ0K3NsZW4gPiBsZW4pCi0gICAgICAgICAgICBnb3RvIG5vdGZvdW5kOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVuZHN3aXRoICovCi0gICAgICAgIGlmIChlbmQtc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQotICAgICAgICAgICAgZ290byBub3Rmb3VuZDsKLQotICAgICAgICBpZiAoZW5kLXNsZW4gPiBzdGFydCkKLSAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gc2xlbjsKLSAgICB9Ci0gICAgaWYgKGVuZC1zdGFydCA8IHNsZW4pCi0gICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0gICAgaWYgKG1lbWNtcChzdHIrc3RhcnQsIHN1Yiwgc2xlbikgIT0gMCkKLSAgICAgICAgZ290byBub3Rmb3VuZDsKLQotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1Yl92aWV3KTsKLSAgICByZXR1cm4gMTsKLQotbm90Zm91bmQ6Ci0gICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViX3ZpZXcpOwotICAgIHJldHVybiAwOwotfQotCi0KLVB5RG9jX1NUUlZBUihzdGFydHN3aXRoX19kb2NfXywKLSJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCi1XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAotcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfc3RhcnRzd2l0aChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIFB5T2JqZWN0ICpzdWJvYmo7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoInN0YXJ0c3dpdGgiLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgfQotICAgIHJlc3VsdCA9IF9ieXRlc190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19zdGFydHN3aXRoKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAotCi1QeURvY19TVFJWQVIoZW5kc3dpdGhfX2RvY19fLAotIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2VuZHN3aXRoKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygiZW5kc3dpdGgiLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsICsxKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgfQotICAgIHJlc3VsdCA9IF9ieXRlc190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfZW5kc3dpdGgoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCiAKQEAgLTI5NDQsOSArMjI1Myw5IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19kZWNvZGVfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmQyMDE2ZmY4ZTBiYjE3NiBpbnB1dD05NTgxNzQ3NjlkMmE0MGNhXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTY0OWE1M2RkZTI3YjMxNCBpbnB1dD05NTgxNzQ3NjlkMmE0MGNhXSovCiB7CiAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgoUHlPYmplY3QqKXNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOwogfQpAQCAtMjk2NCw4ICsyMjczLDggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3NwbGl0bGluZXNfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIGludCBrZWVwZW5kcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05OTVjMzU5OGY3ODMzY2FkIGlucHV0PTdmNGFhYzY3MTQ0Zjk5NDRdKi8KK2J5dGVzX3NwbGl0bGluZXNfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBpbnQga2VlcGVuZHMpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzQ4NDE0OWE1ZDg4MGZmYiBpbnB1dD03ZjRhYWM2NzE0NGY5OTQ0XSovCiB7CiAgICAgcmV0dXJuIHN0cmluZ2xpYl9zcGxpdGxpbmVzKAogICAgICAgICAoUHlPYmplY3QqKSBzZWxmLCBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwKQEAgLTI5NzMsMjIgKzIyODIsNiBAQAogICAgICAgICApOwogfQogCi1zdGF0aWMgaW50Ci1oZXhfZGlnaXRfdG9faW50KFB5X1VDUzQgYykKLXsKLSAgICBpZiAoYyA+PSAxMjgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgcmV0dXJuIGMgLSAnMCc7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChQeV9JU1VQUEVSKGMpKQotICAgICAgICAgICAgYyA9IFB5X1RPTE9XRVIoYyk7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLSAgICAgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQogLypbY2xpbmljIGlucHV0XQogQGNsYXNzbWV0aG9kCiBieXRlcy5mcm9taGV4CkBAIC0zMDA2LDQ3ICsyMjk5LDg4IEBACiBieXRlc19mcm9taGV4X2ltcGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqc3RyaW5nKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA5NzNhY2M2MzY2MWJiMmUgaW5wdXQ9YmY0ZDFjMzYxNjcwYWNkM10qLwogewotICAgIFB5T2JqZWN0ICpuZXdzdHJpbmc7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IF9QeUJ5dGVzX0Zyb21IZXgoc3RyaW5nLCAwKTsKKyAgICBpZiAodHlwZSAhPSAmUHlCeXRlc19UeXBlICYmIHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIE5VTEwpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tSGV4KFB5T2JqZWN0ICpzdHJpbmcsIGludCB1c2VfYnl0ZWFycmF5KQorewogICAgIGNoYXIgKmJ1ZjsKLSAgICBQeV9zc2l6ZV90IGhleGxlbiwgYnl0ZXNsZW4sIGksIGo7Ci0gICAgaW50IHRvcCwgYm90OwotICAgIHZvaWQgKmRhdGE7Ci0gICAgdW5zaWduZWQgaW50IGtpbmQ7CisgICAgUHlfc3NpemVfdCBoZXhsZW4sIGludmFsaWRfY2hhcjsKKyAgICB1bnNpZ25lZCBpbnQgdG9wLCBib3Q7CisgICAgUHlfVUNTMSAqc3RyLCAqZW5kOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgd3JpdGVyLnVzZV9ieXRlYXJyYXkgPSB1c2VfYnl0ZWFycmF5OwogCiAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhzdHJpbmcpKTsKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cmluZykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHJpbmcpOwotICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOwogICAgIGhleGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cmluZyk7CiAKLSAgICBieXRlc2xlbiA9IGhleGxlbi8yOyAvKiBUaGlzIG92ZXJlc3RpbWF0ZXMgaWYgdGhlcmUgYXJlIHNwYWNlcyAqLwotICAgIG5ld3N0cmluZyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXNsZW4pOwotICAgIGlmICghbmV3c3RyaW5nKQorICAgIGlmICghUHlVbmljb2RlX0lTX0FTQ0lJKHN0cmluZykpIHsKKyAgICAgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cmluZyk7CisgICAgICAgIHVuc2lnbmVkIGludCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKKyAgICAgICAgUHlfc3NpemVfdCBpOworCisgICAgICAgIC8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IG5vbi1BU0NJSSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhleGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkgPj0gMTI4KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludmFsaWRfY2hhciA9IGk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHN0cmluZykgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworICAgIHN0ciA9IFB5VW5pY29kZV8xQllURV9EQVRBKHN0cmluZyk7CisKKyAgICAvKiBUaGlzIG92ZXJlc3RpbWF0ZXMgaWYgdGhlcmUgYXJlIHNwYWNlcyAqLworICAgIGJ1ZiA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGhleGxlbiAvIDIpOworICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnVmID0gUHlCeXRlc19BU19TVFJJTkcobmV3c3RyaW5nKTsKLSAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGhleGxlbjsgaSArPSAyKSB7CisKKyAgICBlbmQgPSBzdHIgKyBoZXhsZW47CisgICAgd2hpbGUgKHN0ciA8IGVuZCkgewogICAgICAgICAvKiBza2lwIG92ZXIgc3BhY2VzIGluIHRoZSBpbnB1dCAqLwotICAgICAgICB3aGlsZSAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkgPT0gJyAnKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpZiAoaSA+PSBoZXhsZW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdG9wID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7Ci0gICAgICAgIGJvdCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSsxKSk7Ci0gICAgICAgIGlmICh0b3AgPT0gLTEgfHwgYm90ID09IC0xKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gJXpkIiwgaSk7CisgICAgICAgIGlmICgqc3RyID09ICcgJykgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHN0cisrOworICAgICAgICAgICAgfSB3aGlsZSAoKnN0ciA9PSAnICcpOworICAgICAgICAgICAgaWYgKHN0ciA+PSBlbmQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0b3AgPSBfUHlMb25nX0RpZ2l0VmFsdWVbKnN0cl07CisgICAgICAgIGlmICh0b3AgPj0gMTYpIHsKKyAgICAgICAgICAgIGludmFsaWRfY2hhciA9IHN0ciAtIFB5VW5pY29kZV8xQllURV9EQVRBKHN0cmluZyk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKKyAgICAgICAgc3RyKys7CisKKyAgICAgICAgYm90ID0gX1B5TG9uZ19EaWdpdFZhbHVlWypzdHJdOworICAgICAgICBpZiAoYm90ID49IDE2KSB7CisgICAgICAgICAgICBpbnZhbGlkX2NoYXIgPSBzdHIgLSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzdHIrKzsKKworICAgICAgICAqYnVmKysgPSAodW5zaWduZWQgY2hhcikoKHRvcCA8PCA0KSArIGJvdCk7CiAgICAgfQotICAgIGlmIChqICE9IGJ5dGVzbGVuICYmIF9QeUJ5dGVzX1Jlc2l6ZSgmbmV3c3RyaW5nLCBqKSA8IDApCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgcmV0dXJuIG5ld3N0cmluZzsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYnVmKTsKIAogICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKG5ld3N0cmluZyk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluICIKKyAgICAgICAgICAgICAgICAgImZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gJXpkIiwgaW52YWxpZF9jaGFyKTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zMDc2LDE3ICsyNDEwLDIwIEBACiAgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilieXRlc19nZXRuZXdhcmdzLCAgTUVUSF9OT0FSR1N9LAogICAgIHsiY2FwaXRhbGl6ZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2FwaXRhbGl6ZSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9jYXBpdGFsaXplX19kb2NfX30sCi0gICAgeyJjZW50ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NlbnRlciwgTUVUSF9WQVJBUkdTLCBjZW50ZXJfX2RvY19ffSwKLSAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2NvdW50LCBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCisgICAgeyJjZW50ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NlbnRlciwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfY2VudGVyX19kb2NfX30sCisgICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilieXRlc19jb3VudCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfY291bnRfX2RvY19ffSwKICAgICBCWVRFU19ERUNPREVfTUVUSE9EREVGCiAgICAgeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlc19lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAotICAgICBlbmRzd2l0aF9fZG9jX199LAorICAgICBfUHlfZW5kc3dpdGhfX2RvY19ffSwKICAgICB7ImV4cGFuZHRhYnMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2V4cGFuZHRhYnMsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0gICAgIGV4cGFuZHRhYnNfX2RvY19ffSwKLSAgICB7ImZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCisgICAgIF9QeV9leHBhbmR0YWJzX19kb2NfX30sCisgICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2ZpbmQsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2ZpbmRfX2RvY19ffSwKICAgICBCWVRFU19GUk9NSEVYX01FVEhPRERFRgogICAgIHsiaGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2hleCwgTUVUSF9OT0FSR1MsIGhleF9fZG9jX199LAotICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfaW5kZXgsIE1FVEhfVkFSQVJHUywgaW5kZXhfX2RvY19ffSwKKyAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2luZGV4LCBNRVRIX1ZBUkFSR1MsIF9QeV9pbmRleF9fZG9jX199LAogICAgIHsiaXNhbG51bSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXNhbG51bSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9pc2FsbnVtX19kb2NfX30sCiAgICAgeyJpc2FscGhhIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc2FscGhhLCBNRVRIX05PQVJHUywKQEAgLTMxMDIsMzggKzI0MzksNDAgQEAKICAgICB7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzdXBwZXIsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXN1cHBlcl9fZG9jX199LAogICAgIEJZVEVTX0pPSU5fTUVUSE9EREVGCi0gICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgbGp1c3RfX2RvY19ffSwKKyAgICB7ImxqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sanVzdCwgTUVUSF9WQVJBUkdTLCBfUHlfbGp1c3RfX2RvY19ffSwKICAgICB7Imxvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sb3dlciwgTUVUSF9OT0FSR1MsIF9QeV9sb3dlcl9fZG9jX199LAogICAgIEJZVEVTX0xTVFJJUF9NRVRIT0RERUYKICAgICBCWVRFU19NQUtFVFJBTlNfTUVUSE9EREVGCiAgICAgQllURVNfUEFSVElUSU9OX01FVEhPRERFRgogICAgIEJZVEVTX1JFUExBQ0VfTUVUSE9EREVGCi0gICAgeyJyZmluZCIsIChQeUNGdW5jdGlvbilieXRlc19yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAotICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JpbmRleCwgTUVUSF9WQVJBUkdTLCByaW5kZXhfX2RvY19ffSwKLSAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAorICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmZpbmQsIE1FVEhfVkFSQVJHUywgX1B5X3JmaW5kX19kb2NfX30sCisgICAgeyJyaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIF9QeV9yaW5kZXhfX2RvY19ffSwKKyAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9yanVzdCwgTUVUSF9WQVJBUkdTLCBfUHlfcmp1c3RfX2RvY19ffSwKICAgICBCWVRFU19SUEFSVElUSU9OX01FVEhPRERFRgogICAgIEJZVEVTX1JTUExJVF9NRVRIT0RERUYKICAgICBCWVRFU19SU1RSSVBfTUVUSE9EREVGCiAgICAgQllURVNfU1BMSVRfTUVUSE9EREVGCiAgICAgQllURVNfU1BMSVRMSU5FU19NRVRIT0RERUYKICAgICB7InN0YXJ0c3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTLAotICAgICBzdGFydHN3aXRoX19kb2NfX30sCisgICAgIF9QeV9zdGFydHN3aXRoX19kb2NfX30sCiAgICAgQllURVNfU1RSSVBfTUVUSE9EREVGCiAgICAgeyJzd2FwY2FzZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfc3dhcGNhc2UsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfc3dhcGNhc2VfX2RvY19ffSwKICAgICB7InRpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl90aXRsZSwgTUVUSF9OT0FSR1MsIF9QeV90aXRsZV9fZG9jX199LAogICAgIEJZVEVTX1RSQU5TTEFURV9NRVRIT0RERUYKICAgICB7InVwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl91cHBlciwgTUVUSF9OT0FSR1MsIF9QeV91cHBlcl9fZG9jX199LAotICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIHpmaWxsX19kb2NfX30sCisgICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfemZpbGwsIE1FVEhfVkFSQVJHUywgX1B5X3pmaWxsX19kb2NfX30sCiAgICAge05VTEwsICAgICBOVUxMfSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX21vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCitieXRlc19tb2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHYpKQorICAgIGlmICghUHlCeXRlc19DaGVjayhzZWxmKSkgewogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7Ci0gICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdCh2LCB3KTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdEV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIDApOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGJ5dGVzX2FzX251bWJlciA9IHsKQEAgLTMyMjIsMTcgKzI1NjEsMTUgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIC8qIElzIGl0IGFuIGludGVnZXI/ICovCi0gICAgc2l6ZSA9IFB5TnVtYmVyX0FzU3NpemVfdCh4LCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKLSAgICBpZiAoc2l6ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgIGlmIChQeUluZGV4X0NoZWNrKHgpKSB7CisgICAgICAgIHNpemUgPSBQeU51bWJlcl9Bc1NzaXplX3QoeCwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgICAgIGlmIChzaXplID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChzaXplIDwgMCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGNvdW50Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgY291bnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIG5ldyA9IF9QeUJ5dGVzX0Zyb21TaXplKHNpemUsIDEpOwogICAgICAgICBpZiAobmV3ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMyNDIsMTA4ICsyNTc5LDkzIEBACiAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbU9iamVjdCh4KTsKIH0KIAotUHlPYmplY3QgKgotUHlCeXRlc19Gcm9tT2JqZWN0KFB5T2JqZWN0ICp4KQorc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUJ1ZmZlcihQeU9iamVjdCAqeCkKIHsKLSAgICBQeU9iamVjdCAqbmV3LCAqaXQ7CisgICAgUHlPYmplY3QgKm5ldzsKKyAgICBQeV9idWZmZXIgdmlldzsKKworICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoeCwgJnZpZXcsIFB5QlVGX0ZVTExfUk8pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHZpZXcubGVuKTsKKyAgICBpZiAoIW5ldykKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXMoKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbCwKKyAgICAgICAgICAgICAgICAmdmlldywgdmlldy5sZW4sICdDJykgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgcmV0dXJuIG5ldzsKKworZmFpbDoKKyAgICBQeV9YREVDUkVGKG5ldyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgR0VUX0lURU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfc3NpemVfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X3NzaXplX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyICpzdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlPYmplY3QgKml0ZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGJ5dGVzID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHIgPSAoKFB5Qnl0ZXNPYmplY3QgKilieXRlcyktPm9iX3N2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXRlbSA9IEdFVF9JVEVNKCh4KSwgaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUxpc3QoUHlPYmplY3QgKngpCit7CisgICAgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgUHlMaXN0X0dFVF9JVEVNKTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbVR1cGxlKFB5T2JqZWN0ICp4KQoreworICAgIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIFB5VHVwbGVfR0VUX0lURU0pOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKFB5T2JqZWN0ICppdCwgUHlPYmplY3QgKngpCit7CisgICAgY2hhciAqc3RyOwogICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKLQotICAgIGlmICh4ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChQeUJ5dGVzX0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgUHlfSU5DUkVGKHgpOwotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICAvKiBVc2UgdGhlIG1vZGVybiBidWZmZXIgaW50ZXJmYWNlICovCi0gICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKHgpKSB7Ci0gICAgICAgIFB5X2J1ZmZlciB2aWV3OwotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHgsICZ2aWV3LCBQeUJVRl9GVUxMX1JPKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB2aWV3Lmxlbik7Ci0gICAgICAgIGlmICghbmV3KQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBpZiAoUHlCdWZmZXJfVG9Db250aWd1b3VzKCgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXcsIHZpZXcubGVuLCAnQycpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgICBmYWlsOgotICAgICAgICBQeV9YREVDUkVGKG5ldyk7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVjayh4KSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IHVuaWNvZGUgb2JqZWN0IHRvIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOwotICAgICAgICBpZiAobmV3ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgewotICAgICAgICAgICAgUHlfc3NpemVfdCB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdCgKLSAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oeCwgaSksIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWxbaV0gPSAoY2hhcikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICB9Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOwotICAgICAgICBpZiAobmV3ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgewotICAgICAgICAgICAgUHlfc3NpemVfdCB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdCgKLSAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHgsIGkpLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgfQorICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIC8qIEZvciBpdGVyYXRvciB2ZXJzaW9uLCBjcmVhdGUgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXNpemUgYXMgbmVlZGVkICovCiAgICAgc2l6ZSA9IFB5T2JqZWN0X0xlbmd0aEhpbnQoeCwgNjQpOwogICAgIGlmIChzaXplID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIEFsbG9jYXRlIGFuIGV4dHJhIGJ5dGUgdG8gcHJldmVudCBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKCkgZnJvbQotICAgICAgIHJldHVybmluZyBhIHNoYXJlZCBlbXB0eSBieXRlcyBzdHJpbmcuIFRoaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZQotICAgICAgIHdhbnQgdG8gY2FsbCBfUHlCeXRlc19SZXNpemUoKSB0aGUgcmV0dXJuZWQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KLSAgICAgICBvbmx5IGRvIG9uIGJ5dGVzIG9iamVjdHMgd2l0aCByZWZjb3VudCA9PSAxLiAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHNpemUgPSAxOwotICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7Ci0gICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhc3NlcnQoUHlfUkVGQ05UKG5ldykgPT0gMSk7CiAKLSAgICAvKiBHZXQgdGhlIGl0ZXJhdG9yICovCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOwotICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKyAgICBzaXplID0gd3JpdGVyLmFsbG9jYXRlZDsKIAogICAgIC8qIFJ1biB0aGUgaXRlcmF0b3IgdG8gZXhoYXVzdGlvbiAqLwogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CkBAIC0zMzU5LDcgKzI2ODEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyogSW50ZXJwcmV0IGl0IGFzIGFuIGludCAoX19pbmRleF9fKSAqLwotICAgICAgICB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMzM3MywyMSArMjY5NSw1OCBAQAogCiAgICAgICAgIC8qIEFwcGVuZCB0aGUgYnl0ZSAqLwogICAgICAgICBpZiAoaSA+PSBzaXplKSB7Ci0gICAgICAgICAgICBzaXplID0gMiAqIHNpemUgKyAxOwotICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmbmV3LCBzaXplKSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1Jlc2l6ZSgmd3JpdGVyLCBzdHIsIHNpemUrMSk7CisgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzaXplID0gd3JpdGVyLmFsbG9jYXRlZDsKICAgICAgICAgfQotICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOworICAgICAgICAqc3RyKysgPSAoY2hhcikgdmFsdWU7CiAgICAgfQotICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmbmV3LCBpKTsKIAotICAgIC8qIENsZWFuIHVwIGFuZCByZXR1cm4gc3VjY2VzcyAqLwotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgcmV0dXJuIG5ldzsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHN0cik7CiAKICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihpdCk7Ci0gICAgUHlfWERFQ1JFRihuZXcpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1B5T2JqZWN0ICoKK1B5Qnl0ZXNfRnJvbU9iamVjdChQeU9iamVjdCAqeCkKK3sKKyAgICBQeU9iamVjdCAqaXQsICpyZXN1bHQ7CisKKyAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlCeXRlc19DaGVja0V4YWN0KHgpKSB7CisgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorCisgICAgLyogVXNlIHRoZSBtb2Rlcm4gYnVmZmVyIGludGVyZmFjZSAqLworICAgIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcih4KSkKKyAgICAgICAgcmV0dXJuIF9QeUJ5dGVzX0Zyb21CdWZmZXIoeCk7CisKKyAgICBpZiAoUHlMaXN0X0NoZWNrRXhhY3QoeCkpCisgICAgICAgIHJldHVybiBfUHlCeXRlc19Gcm9tTGlzdCh4KTsKKworICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QoeCkpCisgICAgICAgIHJldHVybiBfUHlCeXRlc19Gcm9tVHVwbGUoeCk7CisKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh4KSkgeworICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoeCk7CisgICAgICAgIGlmIChpdCAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgPSBfUHlCeXRlc19Gcm9tSXRlcmF0b3IoaXQsIHgpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgJyUuMjAwcycgb2JqZWN0IHRvIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgeC0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM3MzgsMyArMzA5NywyODIgQEAKICAgICBfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwogICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KKworCisvKiBfUHlCeXRlc1dyaXRlciBBUEkgKi8KKworI2lmZGVmIE1TX1dJTkRPV1MKKyAgIC8qIE9uIFdpbmRvd3MsIG92ZXJhbGxvY2F0ZSBieSA1MCUgaXMgdGhlIGJlc3QgZmFjdG9yICovCisjICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiAyCisjZWxzZQorICAgLyogT24gTGludXgsIG92ZXJhbGxvY2F0ZSBieSAyNSUgaXMgdGhlIGJlc3QgZmFjdG9yICovCisjICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiA0CisjZW5kaWYKKwordm9pZAorX1B5Qnl0ZXNXcml0ZXJfSW5pdChfUHlCeXRlc1dyaXRlciAqd3JpdGVyKQoreworICAgIC8qIFNldCBhbGwgYXR0cmlidXRlcyBiZWZvcmUgc21hbGxfYnVmZmVyIHRvIDAgKi8KKyAgICBtZW1zZXQod3JpdGVyLCAwLCBvZmZzZXRvZihfUHlCeXRlc1dyaXRlciwgc21hbGxfYnVmZmVyKSk7CisjaWZkZWYgUHlfREVCVUcKKyAgICBtZW1zZXQod3JpdGVyLT5zbWFsbF9idWZmZXIsIDB4Q0IsIHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcikpOworI2VuZGlmCit9CisKK3ZvaWQKK19QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7Cit9CisKK1B5X0xPQ0FMX0lOTElORShjaGFyKikKK19QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpCit7CisgICAgaWYgKHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisgICAgICAgIHJldHVybiB3cml0ZXItPnNtYWxsX2J1ZmZlcjsKKyAgICB9CisgICAgZWxzZSBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIFB5Qnl0ZUFycmF5X0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiBQeUJ5dGVzX0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgfQorfQorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK19QeUJ5dGVzV3JpdGVyX0dldFNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyKQoreworICAgIGNoYXIgKnN0YXJ0ID0gX1B5Qnl0ZXNXcml0ZXJfQXNTdHJpbmcod3JpdGVyKTsKKyAgICBhc3NlcnQoc3RyICE9IE5VTEwpOworICAgIGFzc2VydChzdHIgPj0gc3RhcnQpOworICAgIGFzc2VydChzdHIgLSBzdGFydCA8PSB3cml0ZXItPmFsbG9jYXRlZCk7CisgICAgcmV0dXJuIHN0ciAtIHN0YXJ0OworfQorCitQeV9MT0NBTF9JTkxJTkUodm9pZCkKK19QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3koX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyKQoreworI2lmZGVmIFB5X0RFQlVHCisgICAgY2hhciAqc3RhcnQsICplbmQ7CisKKyAgICBpZiAod3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyKSB7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkKKyAgICAgICAgICAgIGFzc2VydChQeUJ5dGVBcnJheV9DaGVja0V4YWN0KHdyaXRlci0+YnVmZmVyKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrRXhhY3Qod3JpdGVyLT5idWZmZXIpKTsKKyAgICAgICAgYXNzZXJ0KFB5X1JFRkNOVCh3cml0ZXItPmJ1ZmZlcikgPT0gMSk7CisgICAgfQorCisgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAvKiBieXRlYXJyYXkgaGFzIGl0cyBvd24gb3ZlcmFsbG9jYXRpb24gYWxnb3JpdGhtLAorICAgICAgICAgICB3cml0ZXIgb3ZlcmFsbG9jYXRpb24gbXVzdCBiZSBkaXNhYmxlZCAqLworICAgICAgICBhc3NlcnQoIXdyaXRlci0+b3ZlcmFsbG9jYXRlKTsKKyAgICB9CisKKyAgICBhc3NlcnQoMCA8PSB3cml0ZXItPmFsbG9jYXRlZCk7CisgICAgYXNzZXJ0KDAgPD0gd3JpdGVyLT5taW5fc2l6ZSAmJiB3cml0ZXItPm1pbl9zaXplIDw9IHdyaXRlci0+YWxsb2NhdGVkKTsKKyAgICAvKiB0aGUgbGFzdCBieXRlIG11c3QgYWx3YXlzIGJlIG51bGwgKi8KKyAgICBzdGFydCA9IF9QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKHdyaXRlcik7CisgICAgYXNzZXJ0KHN0YXJ0W3dyaXRlci0+YWxsb2NhdGVkXSA9PSAwKTsKKworICAgIGVuZCA9IHN0YXJ0ICsgd3JpdGVyLT5hbGxvY2F0ZWQ7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RhcnQgPD0gc3RyICYmIHN0ciA8PSBlbmQpOworI2VuZGlmCit9CisKK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9SZXNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQsIHBvczsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworICAgIGFzc2VydCh3cml0ZXItPmFsbG9jYXRlZCA8IHNpemUpOworCisgICAgYWxsb2NhdGVkID0gc2l6ZTsKKyAgICBpZiAod3JpdGVyLT5vdmVyYWxsb2NhdGUKKyAgICAgICAgJiYgYWxsb2NhdGVkIDw9IChQWV9TU0laRV9UX01BWCAtIGFsbG9jYXRlZCAvIE9WRVJBTExPQ0FURV9GQUNUT1IpKSB7CisgICAgICAgIC8qIG92ZXJhbGxvY2F0ZSB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHJlYWxsb2MoKSAqLworICAgICAgICBhbGxvY2F0ZWQgKz0gYWxsb2NhdGVkIC8gT1ZFUkFMTE9DQVRFX0ZBQ1RPUjsKKyAgICB9CisKKyAgICBwb3MgPSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKHdyaXRlciwgc3RyKTsKKyAgICBpZiAoIXdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgICAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKHdyaXRlci0+YnVmZmVyLCBhbGxvY2F0ZWQpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAvKiB3cml0ZXItPmFsbG9jYXRlZCBjYW4gYmUgc21hbGxlciB0aGFuIHdyaXRlci0+YnVmZmVyLT5vYl9hbGxvYywKKyAgICAgICAgICAgICAgIGJ1dCB3ZSBjYW5ub3QgdXNlIG9iX2FsbG9jIGJlY2F1c2UgYnl0ZXMgbWF5IG5lZWQgdG8gYmUgbW92ZWQKKyAgICAgICAgICAgICAgIHRvIHVzZSB0aGUgd2hvbGUgYnVmZmVyLiBieXRlYXJyYXkgdXNlcyBhbiBpbnRlcm5hbCBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgIHRvIGF2b2lkIG1vdmluZyBvciBjb3B5aW5nIGJ5dGVzIHdoZW4gYnl0ZXMgYXJlIHJlbW92ZWQgYXQgdGhlCisgICAgICAgICAgICAgICBiZWdpbm5pbmcgKGV4OiBkZWwgYnl0ZWFycmF5WzoxXSkuICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZ3cml0ZXItPmJ1ZmZlciwgYWxsb2NhdGVkKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBjb252ZXJ0IGZyb20gc3RhY2sgYnVmZmVyIHRvIGJ5dGVzIG9iamVjdCBidWZmZXIgKi8KKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworCisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGFsbG9jYXRlZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci0+YnVmZmVyID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhbGxvY2F0ZWQpOworICAgICAgICBpZiAod3JpdGVyLT5idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgaWYgKHBvcyAhPSAwKSB7CisgICAgICAgICAgICBjaGFyICpkZXN0OworICAgICAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkKKyAgICAgICAgICAgICAgICBkZXN0ID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXN0ID0gUHlCeXRlc19BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgICAgICAgICAgUHlfTUVNQ1BZKGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLT5zbWFsbF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlciA9IDA7CisjaWZkZWYgUHlfREVCVUcKKyAgICAgICAgbWVtc2V0KHdyaXRlci0+c21hbGxfYnVmZmVyLCAweERCLCBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpKTsKKyNlbmRpZgorICAgIH0KKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IGFsbG9jYXRlZDsKKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKHdyaXRlcikgKyBwb3M7CisgICAgX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSh3cml0ZXIsIHN0cik7CisgICAgcmV0dXJuIHN0cjsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYyh3cml0ZXIpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpzdHIsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBQeV9zc2l6ZV90IG5ld19taW5fc2l6ZTsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworICAgIGFzc2VydChzaXplID49IDApOworCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgaWYgKHdyaXRlci0+bWluX3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYyh3cml0ZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmV3X21pbl9zaXplID0gd3JpdGVyLT5taW5fc2l6ZSArIHNpemU7CisKKyAgICBpZiAobmV3X21pbl9zaXplID4gd3JpdGVyLT5hbGxvY2F0ZWQpCisgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1Jlc2l6ZSh3cml0ZXIsIHN0ciwgbmV3X21pbl9zaXplKTsKKworICAgIHdyaXRlci0+bWluX3NpemUgPSBuZXdfbWluX3NpemU7CisgICAgcmV0dXJuIHN0cjsKK30KKworLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciB0byB3cml0ZSBzaXplIGJ5dGVzLgorICAgUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyIGRhdGEuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX0FsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICAvKiBlbnN1cmUgdGhhdCBfUHlCeXRlc1dyaXRlcl9BbGxvYygpIGlzIG9ubHkgY2FsbGVkIG9uY2UgKi8KKyAgICBhc3NlcnQod3JpdGVyLT5taW5fc2l6ZSA9PSAwICYmIHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworICAgIGFzc2VydChzaXplID49IDApOworCisgICAgd3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyID0gMTsKKyNpZmRlZiBQeV9ERUJVRworICAgIHdyaXRlci0+YWxsb2NhdGVkID0gc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKSAtIDE7CisgICAgLyogSW4gZGVidWcgbW9kZSwgZG9uJ3QgdXNlIHRoZSBmdWxsIHNtYWxsIGJ1ZmZlciBiZWNhdXNlIGl0IGlzIGxlc3MKKyAgICAgICBlZmZpY2llbnQgdGhhbiBieXRlcyBhbmQgYnl0ZWFycmF5IG9iamVjdHMgdG8gZGV0ZWN0IGJ1ZmZlciB1bmRlcmZsb3cKKyAgICAgICBhbmQgYnVmZmVyIG92ZXJmbG93LiBVc2UgMTAgYnl0ZXMgb2YgdGhlIHNtYWxsIGJ1ZmZlciB0byB0ZXN0IGFsc28KKyAgICAgICBjb2RlIHVzaW5nIHRoZSBzbWFsbGVyIGJ1ZmZlciBpbiBkZWJ1ZyBtb2RlLgorCisgICAgICAgRG9uJ3QgbW9kaWZ5IHRoZSBfUHlCeXRlc1dyaXRlciBzdHJ1Y3R1cmUgKHVzZSBhIHNob3J0ZXIgc21hbGwgYnVmZmVyKQorICAgICAgIGluIGRlYnVnIG1vZGUgdG8gYWxzbyBiZSBhYmxlIHRvIGRldGVjdCBzdGFjayBvdmVyZmxvdyB3aGVuIHJ1bm5pbmcKKyAgICAgICB0ZXN0cyBpbiBkZWJ1ZyBtb2RlLiBUaGUgX1B5Qnl0ZXNXcml0ZXIgaXMgbGFyZ2UgKG1vcmUgdGhhbiA1MTIgYnl0ZXMpLAorICAgICAgIGlmIFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgpIGlzIG5vdCB1c2VkIGluIGRlZXAgQyBjYWxsYmFjaywgd2UgbWF5IGhpdCBhCisgICAgICAgc3RhY2sgb3ZlcmZsb3cuICovCisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBQeV9NSU4od3JpdGVyLT5hbGxvY2F0ZWQsIDEwKTsKKyAgICAvKiBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KCkgcmVxdWlyZXMgdGhlIGxhc3QgYnl0ZSB0byBiZSAwLAorICAgICAgIHRvIGRldGVjdCBidWZmZXIgb3ZlcmZsb3cgKi8KKyAgICB3cml0ZXItPnNtYWxsX2J1ZmZlclt3cml0ZXItPmFsbG9jYXRlZF0gPSAwOworI2Vsc2UKKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcik7CisjZW5kaWYKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHdyaXRlci0+c21hbGxfYnVmZmVyLCBzaXplKTsKK30KKworUHlPYmplY3QgKgorX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnN0cikKK3sKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworCisgICAgc2l6ZSA9IF9QeUJ5dGVzV3JpdGVyX0dldFNpemUod3JpdGVyLCBzdHIpOworICAgIGlmIChzaXplID09IDAgJiYgIXdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7CisgICAgICAgIC8qIEdldCB0aGUgZW1wdHkgYnl0ZSBzdHJpbmcgc2luZ2xldG9uICovCisgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSh3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHdyaXRlci0+c21hbGxfYnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gd3JpdGVyLT5idWZmZXI7CisgICAgICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAoc2l6ZSAhPSB3cml0ZXItPmFsbG9jYXRlZCkgeworICAgICAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUocmVzdWx0LCBzaXplKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCBzaXplKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpieXRlcywgUHlfc3NpemVfdCBzaXplKQoreworICAgIGNoYXIgKnN0ciA9IChjaGFyICopcHRyOworCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN0ciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFB5X01FTUNQWShzdHIsIGJ5dGVzLCBzaXplKTsKKyAgICBzdHIgKz0gc2l6ZTsKKworICAgIHJldHVybiBzdHI7Cit9CmRpZmYgLS1naXQgYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKaW5kZXggNWU4YWM1OS4uYjBlZDAyMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGFzc29iamVjdC5jCisrKyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwpAQCAtMzAyLDM0ICszMDIsMTkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLW1ldGhvZF9jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCittZXRob2RfY2FsbChQeU9iamVjdCAqbWV0aG9kLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLSAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jOwogCi0gICAgZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKKyAgICBzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYobWV0aG9kKTsKICAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5X3NzaXplX3QgYXJnY291bnQgPSBQeVR1cGxlX1NpemUoYXJnKTsKLSAgICAgICAgUHlPYmplY3QgKm5ld2FyZyA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50ICsgMSk7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpZiAobmV3YXJnID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgMCwgc2VsZik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBpKTsKLSAgICAgICAgICAgIFB5X1hJTkNSRUYodik7Ci0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgaSsxLCB2KTsKLSAgICAgICAgfQotICAgICAgICBhcmcgPSBuZXdhcmc7Ci0gICAgfQotICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopZnVuYywgYXJnLCBrdyk7Ci0gICAgUHlfREVDUkVGKGFyZyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04obWV0aG9kKTsKKworICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbF9QcmVwZW5kKGZ1bmMsIHNlbGYsIGFyZ3MsIGt3YXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCmRpZmYgLS1naXQgYS9PYmplY3RzL2NsaW5pYy9ieXRlYXJyYXlvYmplY3QuYy5oIGIvT2JqZWN0cy9jbGluaWMvYnl0ZWFycmF5b2JqZWN0LmMuaAppbmRleCBlODdhMjIxLi5hNjBiZTc2IDEwMDY0NAotLS0gYS9PYmplY3RzL2NsaW5pYy9ieXRlYXJyYXlvYmplY3QuYy5oCisrKyBiL09iamVjdHMvY2xpbmljL2J5dGVhcnJheW9iamVjdC5jLmgKQEAgLTM5LDQ1ICszOSwzOCBAQAogfQogCiBQeURvY19TVFJWQVIoYnl0ZWFycmF5X3RyYW5zbGF0ZV9fZG9jX18sCi0idHJhbnNsYXRlKHRhYmxlLCBbZGVsZXRlY2hhcnNdKVxuIgorInRyYW5zbGF0ZSgkc2VsZiwgdGFibGUsIC8sIGRlbGV0ZT1iXCdcJylcbiIKKyItLVxuIgorIlxuIgogIlJldHVybiBhIGNvcHkgd2l0aCBlYWNoIGNoYXJhY3RlciBtYXBwZWQgYnkgdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLlxuIgogIlxuIgogIiAgdGFibGVcbiIKICIgICAgVHJhbnNsYXRpb24gdGFibGUsIHdoaWNoIG11c3QgYmUgYSBieXRlcyBvYmplY3Qgb2YgbGVuZ3RoIDI1Ni5cbiIKICJcbiIKLSJBbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZWNoYXJzIGFyZSByZW1vdmVkLlxuIgorIkFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgZGVsZXRlIGFyZSByZW1vdmVkLlxuIgogIlRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLiIpOwogCiAjZGVmaW5lIEJZVEVBUlJBWV9UUkFOU0xBVEVfTUVUSE9EREVGICAgIFwKLSAgICB7InRyYW5zbGF0ZSIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfdHJhbnNsYXRlLCBNRVRIX1ZBUkFSR1MsIGJ5dGVhcnJheV90cmFuc2xhdGVfX2RvY19ffSwKKyAgICB7InRyYW5zbGF0ZSIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfdHJhbnNsYXRlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZWFycmF5X3RyYW5zbGF0ZV9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3RyYW5zbGF0ZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX3JpZ2h0XzEsIFB5T2JqZWN0ICpkZWxldGVjaGFycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV90cmFuc2xhdGUoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnl0ZWFycmF5X3RyYW5zbGF0ZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsiIiwgImRlbGV0ZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik98Tzp0cmFuc2xhdGUiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICp0YWJsZTsKLSAgICBpbnQgZ3JvdXBfcmlnaHRfMSA9IDA7CiAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzID0gTlVMTDsKIAotICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dHJhbnNsYXRlIiwgJnRhYmxlKSkKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzp0cmFuc2xhdGUiLCAmdGFibGUsICZkZWxldGVjaGFycykpCi0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgZ3JvdXBfcmlnaHRfMSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJieXRlYXJyYXkudHJhbnNsYXRlIHJlcXVpcmVzIDEgdG8gMiBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0YWJsZSwgJmRlbGV0ZWNoYXJzKSkgeworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV90cmFuc2xhdGVfaW1wbChzZWxmLCB0YWJsZSwgZ3JvdXBfcmlnaHRfMSwgZGVsZXRlY2hhcnMpOworICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV90cmFuc2xhdGVfaW1wbChzZWxmLCB0YWJsZSwgZGVsZXRlY2hhcnMpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CkBAIC0xMDgsMTcgKzEwMSwyMCBAQAogICAgIFB5X2J1ZmZlciB0byA9IHtOVUxMLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp5KjptYWtldHJhbnMiLAotICAgICAgICAmZnJtLCAmdG8pKQorICAgICAgICAmZnJtLCAmdG8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X21ha2V0cmFuc19pbXBsKCZmcm0sICZ0byk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJtICovCi0gICAgaWYgKGZybS5vYmopCisgICAgaWYgKGZybS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcm0pOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciB0byAqLwotICAgIGlmICh0by5vYmopCisgICAgaWYgKHRvLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnRvKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTUyLDE3ICsxNDgsMjAgQEAKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSp8bjpyZXBsYWNlIiwKLSAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkKKyAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9yZXBsYWNlX2ltcGwoc2VsZiwgJm9sZCwgJm5ldywgY291bnQpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIG9sZCAqLwotICAgIGlmIChvbGQub2JqKQorICAgIGlmIChvbGQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmb2xkKTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgbmV3ICovCi0gICAgaWYgKG5ldy5vYmopCisgICAgaWYgKG5ldy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZuZXcpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xOTIsMTMgKzE5MSwxNSBAQAogYnl0ZWFycmF5X3NwbGl0KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbjpzcGxpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNlcCA9IFB5X05vbmU7CiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9uOnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9zcGxpdF9pbXBsKHNlbGYsIHNlcCwgbWF4c3BsaXQpOwogCiBleGl0OgpAQCAtMjY0LDEzICsyNjUsMTUgQEAKIGJ5dGVhcnJheV9yc3BsaXQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic2VwIiwgIm1heHNwbGl0IiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic2VwIiwgIm1heHNwbGl0IiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsifE9uOnJzcGxpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNlcCA9IFB5X05vbmU7CiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9uOnJzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzZXAsICZtYXhzcGxpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfcnNwbGl0X2ltcGwoc2VsZiwgc2VwLCBtYXhzcGxpdCk7CiAKIGV4aXQ6CkBAIC0zMjAsOCArMzIzLDkgQEAKICAgICBpbnQgaXRlbTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk8mOmluc2VydCIsCi0gICAgICAgICZpbmRleCwgX2dldGJ5dGV2YWx1ZSwgJml0ZW0pKQorICAgICAgICAmaW5kZXgsIF9nZXRieXRldmFsdWUsICZpdGVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9pbnNlcnRfaW1wbChzZWxmLCBpbmRleCwgaXRlbSk7CiAKIGV4aXQ6CkBAIC0zNDksOCArMzUzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgaXRlbTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YXBwZW5kIiwgX2dldGJ5dGV2YWx1ZSwgJml0ZW0pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YXBwZW5kIiwgX2dldGJ5dGV2YWx1ZSwgJml0ZW0pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2FwcGVuZF9pbXBsKHNlbGYsIGl0ZW0pOwogCiBleGl0OgpAQCAtMzk0LDggKzM5OSw5IEBACiAgICAgUHlfc3NpemVfdCBpbmRleCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpwb3AiLAotICAgICAgICAmaW5kZXgpKQorICAgICAgICAmaW5kZXgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3BvcF9pbXBsKHNlbGYsIGluZGV4KTsKIAogZXhpdDoKQEAgLTQyMyw4ICs0MjksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB2YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6cmVtb3ZlIiwgX2dldGJ5dGV2YWx1ZSwgJnZhbHVlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnJlbW92ZSIsIF9nZXRieXRldmFsdWUsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfcmVtb3ZlX2ltcGwoc2VsZiwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDUzLDggKzQ2MCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdHJpcCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZieXRlcykpCisgICAgICAgICZieXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfc3RyaXBfaW1wbChzZWxmLCBieXRlcyk7CiAKIGV4aXQ6CkBAIC00ODMsOCArNDkxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImxzdHJpcCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZieXRlcykpCisgICAgICAgICZieXRlcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfbHN0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtNTEzLDggKzUyMiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JzdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTU0NywxMyArNTU3LDE1IEBACiBieXRlYXJyYXlfZGVjb2RlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImVuY29kaW5nIiwgImVycm9ycyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxzczpkZWNvZGUiLCBfa2V5d29yZHMsIDB9OwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gTlVMTDsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifHNzOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfZGVjb2RlX2ltcGwoc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC01OTIsMTIgKzYwNCwxNCBAQAogYnl0ZWFycmF5X3NwbGl0bGluZXMoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsia2VlcGVuZHMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJrZWVwZW5kcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxpOnNwbGl0bGluZXMiLCBfa2V5d29yZHMsIDB9OwogICAgIGludCBrZWVwZW5kcyA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aTpzcGxpdGxpbmVzIiwgX2tleXdvcmRzLAotICAgICAgICAma2VlcGVuZHMpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmtlZXBlbmRzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9zcGxpdGxpbmVzX2ltcGwoc2VsZiwga2VlcGVuZHMpOwogCiBleGl0OgpAQCAtNjE3LDE3ICs2MzEsMTggQEAKICAgICB7ImZyb21oZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2Zyb21oZXgsIE1FVEhfT3xNRVRIX0NMQVNTLCBieXRlYXJyYXlfZnJvbWhleF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zyb21oZXhfaW1wbChQeU9iamVjdCpjbHMsIFB5T2JqZWN0ICpzdHJpbmcpOworYnl0ZWFycmF5X2Zyb21oZXhfaW1wbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzdHJpbmcpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zyb21oZXgoUHlUeXBlT2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmcpCitieXRlYXJyYXlfZnJvbWhleChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmcpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN0cmluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpmcm9taGV4IiwgJnN0cmluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmZyb21oZXgiLCAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2Zyb21oZXhfaW1wbCgoUHlPYmplY3QqKWNscywgc3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2Zyb21oZXhfaW1wbCh0eXBlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CkBAIC02NzAsOCArNjg1LDkgQEAKICAgICBpbnQgcHJvdG8gPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9leF9fIiwKLSAgICAgICAgJnByb3RvKSkKKyAgICAgICAgJnByb3RvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9yZWR1Y2VfZXhfaW1wbChzZWxmLCBwcm90byk7CiAKIGV4aXQ6CkBAIC02OTUsNCArNzExLDQgQEAKIHsKICAgICByZXR1cm4gYnl0ZWFycmF5X3NpemVvZl9pbXBsKHNlbGYpOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk2NmMxNWZmMjJjNWUyNDMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTU5YTBjODZiMjlmZjA2ZDEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGluaWMvYnl0ZXNvYmplY3QuYy5oIGIvT2JqZWN0cy9jbGluaWMvYnl0ZXNvYmplY3QuYy5oCmluZGV4IDVhMWE1ZTkuLmYxNzljZTYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2xpbmljL2J5dGVzb2JqZWN0LmMuaAorKysgYi9PYmplY3RzL2NsaW5pYy9ieXRlc29iamVjdC5jLmgKQEAgLTIwLDE5ICsyMCwyMSBAQAogICAgIHsic3BsaXQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfc3BsaXQsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBieXRlc19zcGxpdF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpOworYnl0ZXNfc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3NwbGl0KFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitieXRlc19zcGxpdChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbjpzcGxpdCIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNlcCA9IFB5X05vbmU7CiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9uOnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJnNlcCwgJm1heHNwbGl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3NwbGl0X2ltcGwoc2VsZiwgc2VwLCBtYXhzcGxpdCk7CiAKIGV4aXQ6CkBAIC02NCwxNCArNjYsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgc2VwID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpwYXJ0aXRpb24iLCAmc2VwKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnBhcnRpdGlvbiIsICZzZXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcGFydGl0aW9uX2ltcGwoc2VsZiwgJnNlcCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3Igc2VwICovCi0gICAgaWYgKHNlcC5vYmopCisgICAgaWYgKHNlcC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzZXApOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMDEsMTQgKzEwNSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBzZXAgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJwYXJ0aXRpb24iLCAmc2VwKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJwYXJ0aXRpb24iLCAmc2VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3JwYXJ0aXRpb25faW1wbChzZWxmLCAmc2VwKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBzZXAgKi8KLSAgICBpZiAoc2VwLm9iaikKKyAgICBpZiAoc2VwLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnNlcCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEzMywxOSArMTM5LDIxIEBACiAgICAgeyJyc3BsaXQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcnNwbGl0LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfcnNwbGl0X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpOworYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yc3BsaXQoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK2J5dGVzX3JzcGxpdChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNlcCIsICJtYXhzcGxpdCIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxPbjpyc3BsaXQiLCBfa2V5d29yZHMsIDB9OwogICAgIFB5T2JqZWN0ICpzZXAgPSBQeV9Ob25lOwogICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbjpyc3BsaXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzZXAsICZtYXhzcGxpdCkpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcnNwbGl0X2ltcGwoc2VsZiwgc2VwLCBtYXhzcGxpdCk7CiAKIGV4aXQ6CkBAIC0xODksOCArMTk3LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3N0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjE5LDggKzIyOCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfbHN0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjQ5LDggKzI1OSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcnN0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjU4LDQ1ICsyNjksMzggQEAKIH0KIAogUHlEb2NfU1RSVkFSKGJ5dGVzX3RyYW5zbGF0ZV9fZG9jX18sCi0idHJhbnNsYXRlKHRhYmxlLCBbZGVsZXRlY2hhcnNdKVxuIgorInRyYW5zbGF0ZSgkc2VsZiwgdGFibGUsIC8sIGRlbGV0ZT1iXCdcJylcbiIKKyItLVxuIgorIlxuIgogIlJldHVybiBhIGNvcHkgd2l0aCBlYWNoIGNoYXJhY3RlciBtYXBwZWQgYnkgdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLlxuIgogIlxuIgogIiAgdGFibGVcbiIKICIgICAgVHJhbnNsYXRpb24gdGFibGUsIHdoaWNoIG11c3QgYmUgYSBieXRlcyBvYmplY3Qgb2YgbGVuZ3RoIDI1Ni5cbiIKICJcbiIKLSJBbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcgaW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGRlbGV0ZWNoYXJzIGFyZSByZW1vdmVkLlxuIgorIkFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgZGVsZXRlIGFyZSByZW1vdmVkLlxuIgogIlRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLiIpOwogCiAjZGVmaW5lIEJZVEVTX1RSQU5TTEFURV9NRVRIT0RERUYgICAgXAotICAgIHsidHJhbnNsYXRlIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTLCBieXRlc190cmFuc2xhdGVfX2RvY19ffSwKKyAgICB7InRyYW5zbGF0ZSIsIChQeUNGdW5jdGlvbilieXRlc190cmFuc2xhdGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBieXRlc190cmFuc2xhdGVfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3RyYW5zbGF0ZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWJsZSwgaW50IGdyb3VwX3JpZ2h0XzEsCitieXRlc190cmFuc2xhdGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVsZXRlY2hhcnMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfdHJhbnNsYXRlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnl0ZXNfdHJhbnNsYXRlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7IiIsICJkZWxldGUiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJPfE86dHJhbnNsYXRlIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqdGFibGU7Ci0gICAgaW50IGdyb3VwX3JpZ2h0XzEgPSAwOwogICAgIFB5T2JqZWN0ICpkZWxldGVjaGFycyA9IE5VTEw7CiAKLSAgICBzd2l0Y2ggKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnRyYW5zbGF0ZSIsICZ0YWJsZSkpCi0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhbnNsYXRlIiwgJnRhYmxlLCAmZGVsZXRlY2hhcnMpKQotICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnl0ZXMudHJhbnNsYXRlIHJlcXVpcmVzIDEgdG8gMiBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0YWJsZSwgJmRlbGV0ZWNoYXJzKSkgeworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQotICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3RyYW5zbGF0ZV9pbXBsKHNlbGYsIHRhYmxlLCBncm91cF9yaWdodF8xLCBkZWxldGVjaGFycyk7CisgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfdHJhbnNsYXRlX2ltcGwoc2VsZiwgdGFibGUsIGRlbGV0ZWNoYXJzKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwpAQCAtMzI3LDE3ICszMzEsMjAgQEAKICAgICBQeV9idWZmZXIgdG8gPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6bWFrZXRyYW5zIiwKLSAgICAgICAgJmZybSwgJnRvKSkKKyAgICAgICAgJmZybSwgJnRvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX21ha2V0cmFuc19pbXBsKCZmcm0sICZ0byk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJtICovCi0gICAgaWYgKGZybS5vYmopCisgICAgaWYgKGZybS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcm0pOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciB0byAqLwotICAgIGlmICh0by5vYmopCisgICAgaWYgKHRvLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnRvKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzU5LDExICszNjYsMTEgQEAKICAgICB7InJlcGxhY2UiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmVwbGFjZSwgTUVUSF9WQVJBUkdTLCBieXRlc19yZXBsYWNlX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeV9idWZmZXIgKm9sZCwgUHlfYnVmZmVyICpuZXcsCitieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcmVwbGFjZShQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnl0ZXNfcmVwbGFjZShQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgb2xkID0ge05VTEwsIE5VTEx9OwpAQCAtMzcxLDE3ICszNzgsMjAgQEAKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSp8bjpyZXBsYWNlIiwKLSAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkKKyAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3JlcGxhY2VfaW1wbChzZWxmLCAmb2xkLCAmbmV3LCBjb3VudCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3Igb2xkICovCi0gICAgaWYgKG9sZC5vYmopCisgICAgaWYgKG9sZC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZvbGQpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciBuZXcgKi8KLSAgICBpZiAobmV3Lm9iaikKKyAgICBpZiAobmV3Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm5ldyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQwNSwyMCArNDE1LDIyIEBACiAgICAgeyJkZWNvZGUiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZGVjb2RlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfZGVjb2RlX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19kZWNvZGVfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfZGVjb2RlKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitieXRlc19kZWNvZGUoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8c3M6ZGVjb2RlIiwgX2tleXdvcmRzLCAwfTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxzczpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZlbmNvZGluZywgJmVycm9ycykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfZGVjb2RlX2ltcGwoc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC00MzgsMTggKzQ1MCwyMCBAQAogICAgIHsic3BsaXRsaW5lcyIsIChQeUNGdW5jdGlvbilieXRlc19zcGxpdGxpbmVzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfc3BsaXRsaW5lc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRsaW5lc19pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgaW50IGtlZXBlbmRzKTsKK2J5dGVzX3NwbGl0bGluZXNfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBpbnQga2VlcGVuZHMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRsaW5lcyhQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorYnl0ZXNfc3BsaXRsaW5lcyhQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtlZXBlbmRzIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2VlcGVuZHMiLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJ8aTpzcGxpdGxpbmVzIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQga2VlcGVuZHMgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGk6c3BsaXRsaW5lcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmtlZXBlbmRzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZrZWVwZW5kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19zcGxpdGxpbmVzX2ltcGwoc2VsZiwga2VlcGVuZHMpOwogCiBleGl0OgpAQCAtNDc3LDExICs0OTEsMTIgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3RyaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmZyb21oZXgiLCAmc3RyaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6ZnJvbWhleCIsICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfZnJvbWhleF9pbXBsKHR5cGUsIHN0cmluZyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iZDBjZThmMjVkN2UxOGY0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NjE4YzA1YzI0YzFlNjE3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2xpbmljL2RpY3RvYmplY3QuYy5oIGIvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKaW5kZXggNTI4OGI5YS4uZDBjZGZjMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKKysrIGIvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKQEAgLTIzLDggKzIzLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZyb21rZXlzIiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJml0ZXJhYmxlLCAmdmFsdWUpKQorICAgICAgICAmaXRlcmFibGUsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkaWN0X2Zyb21rZXlzX2ltcGwodHlwZSwgaXRlcmFibGUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTM5LDQgKzQwLDQgQEAKIAogI2RlZmluZSBESUNUX19fQ09OVEFJTlNfX19NRVRIT0RERUYgICAgXAogICAgIHsiX19jb250YWluc19fIiwgKFB5Q0Z1bmN0aW9uKWRpY3RfX19jb250YWluc19fLCBNRVRIX098TUVUSF9DT0VYSVNULCBkaWN0X19fY29udGFpbnNfX19fZG9jX199LAotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlNzRkNjc2MzMyZmRiYTYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkyNjMyNjEwOWUzZDk4MzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGluaWMvdW5pY29kZW9iamVjdC5jLmggYi9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaAppbmRleCBkNDJhNzAwLi44OTFlOTBjIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaAorKysgYi9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaApAQCAtMzEsMTEgKzMxLDEyIEBACiAgICAgUHlPYmplY3QgKnogPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfFVVOm1ha2V0cmFucyIsCi0gICAgICAgICZ4LCAmeSwgJnopKQorICAgICAgICAmeCwgJnksICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVfbWFrZXRyYW5zX2ltcGwoeCwgeSwgeik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NGFmZmRmZjViMmRhZmY1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00YTg2ZGQxMDhkOTJkMTA0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY29kZW9iamVjdC5jIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKaW5kZXggOTY0YWU2Mi4uNzhmNTAzNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKQEAgLTY5NCw3ICs2OTQsOCBAQAogICAgICAgICBhZGRyICs9ICpwKys7CiAgICAgICAgIGlmIChhZGRyID4gYWRkcnEpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICBsaW5lICs9IChzaWduZWQgY2hhcikqcDsKKyAgICAgICAgcCsrOwogICAgIH0KICAgICByZXR1cm4gbGluZTsKIH0KQEAgLTcxOCw3ICs3MTksNyBAQAogICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgogICAgICAgIChsaWtlbHkgdG8gYmUgYSBjb21tb24gY2FzZSkgdGhlbiB3ZSBhbHJlYWR5IGtub3cKICAgICAgICBpbnN0cl9sYiAtLSBpZiB3ZSBzdG9yZWQgdGhlIG1hdGNoaW5nIHZhbHVlIG9mIHAKLSAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLworICAgICAgIHNvbWV3aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLwogCiAgICAgLyogU2VlIGxub3RhYl9ub3Rlcy50eHQgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZgogICAgICAgIGNvX2xub3RhYi4gIEEgcG9pbnQgdG8gcmVtZW1iZXI6IGluY3JlbWVudHMgdG8gcApAQCAtNzI5LDE3ICs3MzAsMTkgQEAKICAgICAgICAgaWYgKGFkZHIgKyAqcCA+IGxhc3RpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGFkZHIgKz0gKnArKzsKLSAgICAgICAgaWYgKCpwKQorICAgICAgICBpZiAoKHNpZ25lZCBjaGFyKSpwKQogICAgICAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IGFkZHI7Ci0gICAgICAgIGxpbmUgKz0gKnArKzsKKyAgICAgICAgbGluZSArPSAoc2lnbmVkIGNoYXIpKnA7CisgICAgICAgIHArKzsKICAgICAgICAgLS1zaXplOwogICAgIH0KIAogICAgIGlmIChzaXplID4gMCkgewogICAgICAgICB3aGlsZSAoLS1zaXplID49IDApIHsKICAgICAgICAgICAgIGFkZHIgKz0gKnArKzsKLSAgICAgICAgICAgIGlmICgqcCsrKQorICAgICAgICAgICAgaWYgKChzaWduZWQgY2hhcikqcCkKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHArKzsKICAgICAgICAgfQogICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gYWRkcjsKICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKaW5kZXggZGE2OGUzYi4uMDc2ZTc0MSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jCisrKyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwpAQCAtMjIsNyArMjIsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVzY3JfcmVwcihQeURlc2NyT2JqZWN0ICpkZXNjciwgY2hhciAqZm9ybWF0KQorZGVzY3JfcmVwcihQeURlc2NyT2JqZWN0ICpkZXNjciwgY29uc3QgY2hhciAqZm9ybWF0KQogewogICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKICAgICBpZiAoZGVzY3ItPmRfbmFtZSAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhkZXNjci0+ZF9uYW1lKSkKQEAgLTIxMyw3ICsyMTMsNyBAQAogbWV0aG9kZGVzY3JfY2FsbChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIFB5X3NzaXplX3QgYXJnYzsKLSAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0LCAqKnN0YWNrOwogCiAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCiAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwpAQCAtMjQyLDEzICsyNDIsOCBAQAogICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXdFeChkZXNjci0+ZF9tZXRob2QsIHNlbGYsIE5VTEwpOwogICAgIGlmIChmdW5jID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHN0YWNrID0gJlB5VHVwbGVfR0VUX0lURU0oYXJncywgMSk7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChmdW5jLCBzdGFjaywgYXJnYyAtIDEsIGt3ZHMpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjU4LDcgKzI1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlfc3NpemVfdCBhcmdjOwotICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQsICoqc3RhY2s7CiAKICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CkBAIC0yOTUsMTQgKzI5MCw5IEBACiAgICAgZnVuYyA9IFB5Q0Z1bmN0aW9uX05ld0V4KGRlc2NyLT5kX21ldGhvZCwgc2VsZiwgTlVMTCk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgYXJnYyk7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKKyAgICBzdGFjayA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoZnVuYywgc3RhY2ssIGFyZ2MgLSAxLCBrd2RzKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTMxMCw3ICszMDAsNyBAQAogd3JhcHBlcmRlc2NyX2NhbGwoUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlfc3NpemVfdCBhcmdjOwotICAgIFB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQsICoqc3RhY2s7CiAKICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CkBAIC0zMzksMTMgKzMyOSw5IEBACiAgICAgZnVuYyA9IFB5V3JhcHBlcl9OZXcoKFB5T2JqZWN0ICopZGVzY3IsIHNlbGYpOwogICAgIGlmIChmdW5jID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOwotICAgIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOworCisgICAgc3RhY2sgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KGZ1bmMsIHN0YWNrLCBhcmdjIC0gMSwga3dkcyk7CiAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xMDMzLDcgKzEwMTksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfcmljaGNvbXBhcmUoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiLCBpbnQgb3ApCiB7Ci0gICAgUHlfaW50cHRyX3QgcmVzdWx0OworICAgIGludHB0cl90IHJlc3VsdDsKICAgICBQeU9iamVjdCAqdjsKICAgICBQeVdyYXBwZXJEZXNjck9iamVjdCAqYV9kZXNjciwgKmJfZGVzY3I7CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZGljdG9iamVjdC5jIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKaW5kZXggZTA0YWIyYi4uZDk5MzIzOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKQEAgLTMyMSw3ICszMjEsNyBAQAogCiAgICAgYXNzZXJ0KHNpemUgPj0gUHlEaWN0X01JTlNJWkVfU1BMSVQpOwogICAgIGFzc2VydChJU19QT1dFUl9PRl8yKHNpemUpKTsKLSAgICBkayA9IFB5TWVtX01BTExPQyhzaXplb2YoUHlEaWN0S2V5c09iamVjdCkgKworICAgIGRrID0gUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeURpY3RLZXlzT2JqZWN0KSArCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFB5RGljdEtleUVudHJ5KSAqIChzaXplLTEpKTsKICAgICBpZiAoZGsgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgIFB5X1hERUNSRUYoZW50cmllc1tpXS5tZV9rZXkpOwogICAgICAgICBQeV9YREVDUkVGKGVudHJpZXNbaV0ubWVfdmFsdWUpOwogICAgIH0KLSAgICBQeU1lbV9GUkVFKGtleXMpOworICAgIFB5T2JqZWN0X0ZSRUUoa2V5cyk7CiB9CiAKICNkZWZpbmUgbmV3X3ZhbHVlcyhzaXplKSBQeU1lbV9ORVcoUHlPYmplY3QgKiwgc2l6ZSkKQEAgLTk2MSw3ICs5NjEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFzc2VydChvbGRrZXlzLT5ka19yZWZjbnQgPT0gMSk7Ci0gICAgICAgIERLX0RFQlVHX0RFQ1JFRiBQeU1lbV9GUkVFKG9sZGtleXMpOworICAgICAgICBES19ERUJVR19ERUNSRUYgUHlPYmplY3RfRlJFRShvbGRrZXlzKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTYwLDM5ICsxMTYwLDQyIEBACiAgICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKGRwLCBrdik7CiB9CiAKLS8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwLgorLyogRmFzdCB2ZXJzaW9uIG9mIGdsb2JhbCB2YWx1ZSBsb29rdXAgKExPQURfR0xPQkFMKS4KICAqIExvb2t1cCBpbiBnbG9iYWxzLCB0aGVuIGJ1aWx0aW5zLgorICoKKyAqIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKGV4OiBjb21wdXRpbmcgdGhlCisgKiBrZXkgaGFzaCBmYWlsZWQsIGtleSBjb21wYXJpc29uIGZhaWxlZCwgLi4uKS4gUmV0dXJuIE5VTEwgaWYgdGhlIGtleSBkb2Vzbid0CisgKiBleGlzdC4gUmV0dXJuIHRoZSB2YWx1ZSBpZiB0aGUga2V5IGV4aXN0cy4KICAqLwogUHlPYmplY3QgKgogX1B5RGljdF9Mb2FkR2xvYmFsKFB5RGljdE9iamVjdCAqZ2xvYmFscywgUHlEaWN0T2JqZWN0ICpidWlsdGlucywgUHlPYmplY3QgKmtleSkKIHsKLSAgICBQeU9iamVjdCAqeDsKLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSkgewotICAgICAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7Ci0gICAgICAgIFB5X2hhc2hfdCBoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopa2V5KS0+aGFzaDsKLSAgICAgICAgaWYgKGhhc2ggIT0gLTEpIHsKLSAgICAgICAgICAgIFB5RGljdEtleUVudHJ5ICplOwotICAgICAgICAgICAgZSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKLSAgICAgICAgICAgIGlmIChlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggPSAqdmFsdWVfYWRkcjsKLSAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgICAgICBlID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQorICAgIFB5X2hhc2hfdCBoYXNoOworICAgIFB5RGljdEtleUVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqKnZhbHVlX2FkZHI7CisgICAgUHlPYmplY3QgKnZhbHVlOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKQorICAgIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgeCA9IFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWdsb2JhbHMsIGtleSk7Ci0gICAgaWYgKHggIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisKKyAgICAvKiBuYW1lc3BhY2UgMTogZ2xvYmFscyAqLworICAgIGVudHJ5ID0gZ2xvYmFscy0+bWFfa2V5cy0+ZGtfbG9va3VwKGdsb2JhbHMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IoKFB5T2JqZWN0ICopYnVpbHRpbnMsIGtleSk7CisgICAgdmFsdWUgPSAqdmFsdWVfYWRkcjsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgLyogbmFtZXNwYWNlIDI6IGJ1aWx0aW5zICovCisgICAgZW50cnkgPSBidWlsdGlucy0+bWFfa2V5cy0+ZGtfbG9va3VwKGJ1aWx0aW5zLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICp2YWx1ZV9hZGRyOwogfQogCiAvKiBDQVVUSU9OOiBQeURpY3RfU2V0SXRlbSgpIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgd29uJ3QgcmVzaXplIHRoZQpAQCAtMTkxNyw3ICsxOTIwLDcgQEAKIH0KIAogc3RhdGljIGludAotZGljdF91cGRhdGVfY29tbW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGNoYXIgKm1ldGhuYW1lKQorZGljdF91cGRhdGVfY29tbW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGNvbnN0IGNoYXIgKm1ldGhuYW1lKQogewogICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwogICAgIGludCByZXN1bHQgPSAwOwpAQCAtMjUxNiwyNCArMjUxOSwyNiBAQAogc3RhdGljIGludAogZGljdF90cmF2ZXJzZShQeU9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIFB5X3NzaXplX3QgaSwgbjsKICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotICAgIGlmIChtcC0+bWFfa2V5cy0+ZGtfbG9va3VwID09IGxvb2tkaWN0KSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBES19TSVpFKG1wLT5tYV9rZXlzKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobXAtPm1hX2tleXMtPmRrX2VudHJpZXNbaV0ubWVfdmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X1ZJU0lUKG1wLT5tYV9rZXlzLT5ka19lbnRyaWVzW2ldLm1lX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICBQeV9WSVNJVChtcC0+bWFfa2V5cy0+ZGtfZW50cmllc1tpXS5tZV9rZXkpOworICAgIFB5RGljdEtleXNPYmplY3QgKmtleXMgPSBtcC0+bWFfa2V5czsKKyAgICBQeURpY3RLZXlFbnRyeSAqZW50cmllcyA9ICZrZXlzLT5ka19lbnRyaWVzWzBdOworICAgIFB5X3NzaXplX3QgaSwgbiA9IERLX1NJWkUobXAtPm1hX2tleXMpOworICAgIGlmIChrZXlzLT5ka19sb29rdXAgPT0gbG9va2RpY3QpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X1ZJU0lUKGVudHJpZXNbaV0ubWVfdmFsdWUpOworICAgICAgICAgICAgICAgIFB5X1ZJU0lUKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtcC0+bWFfdmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDAsIG4gPSBES19TSVpFKG1wLT5tYV9rZXlzKTsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgICAgIFB5X1ZJU0lUKG1wLT5tYV92YWx1ZXNbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZm9yIChpID0gMCwgbiA9IERLX1NJWkUobXAtPm1hX2tleXMpOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUHlfVklTSVQobXAtPm1hX2tleXMtPmRrX2VudHJpZXNbaV0ubWVfdmFsdWUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIFB5X1ZJU0lUKGVudHJpZXNbaV0ubWVfdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9lbnVtb2JqZWN0LmMgYi9PYmplY3RzL2VudW1vYmplY3QuYwppbmRleCBjNDU4Y2ZlLi5kYWUxNjZkIDEwMDY0NAotLS0gYS9PYmplY3RzL2VudW1vYmplY3QuYworKysgYi9PYmplY3RzL2VudW1vYmplY3QuYwpAQCAtMjUwLDYgKzI1MCwxMyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHJldmVyc2VkX21ldGggPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChzZXEsICZQeUlkX19fcmV2ZXJzZWRfXyk7CisgICAgaWYgKHJldmVyc2VkX21ldGggPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYocmV2ZXJzZWRfbWV0aCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCByZXZlcnNpYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VxKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBpZiAocmV2ZXJzZWRfbWV0aCAhPSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHJldmVyc2VkX21ldGgsIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYocmV2ZXJzZWRfbWV0aCk7CkBAIC0yNTksOCArMjY2LDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHRvIHJldmVyc2VkKCkgbXVzdCBiZSBhIHNlcXVlbmNlIik7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCByZXZlcnNpYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VxKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9leGNlcHRpb25zLmMgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwppbmRleCAwNzQ5ZTkwLi4zMzZjMzJjIDEwMDY0NAotLS0gYS9PYmplY3RzL2V4Y2VwdGlvbnMuYworKysgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwpAQCAtNTksMTUgKzU5LDExIEBACiBzdGF0aWMgaW50CiBCYXNlRXhjZXB0aW9uX2luaXQoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwga3dkcykpCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIHRtcCA9IHNlbGYtPmFyZ3M7Ci0gICAgc2VsZi0+YXJncyA9IGFyZ3M7Ci0gICAgUHlfSU5DUkVGKHNlbGYtPmFyZ3MpOwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgUHlfWFNFVFJFRihzZWxmLT5hcmdzLCBhcmdzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjM0LDcgKzIzMCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBQeV9YSU5DUkVGKHRiKTsKKyAgICBQeV9JTkNSRUYodGIpOwogICAgIFB5X1hTRVRSRUYoc2VsZi0+dHJhY2ViYWNrLCB0Yik7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMjgsMTEgKzMyNCwxMCBAQAogCiAvKiBTdGVhbHMgYSByZWZlcmVuY2UgdG8gY2F1c2UgKi8KIHZvaWQKLVB5RXhjZXB0aW9uX1NldENhdXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2F1c2UpIHsKLSAgICBQeU9iamVjdCAqb2xkX2NhdXNlID0gKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y2F1c2U7Ci0gICAgKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y2F1c2UgPSBjYXVzZTsKK1B5RXhjZXB0aW9uX1NldENhdXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2F1c2UpCit7CiAgICAgKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+c3VwcHJlc3NfY29udGV4dCA9IDE7Ci0gICAgUHlfWERFQ1JFRihvbGRfY2F1c2UpOworICAgIFB5X1hTRVRSRUYoKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y2F1c2UsIGNhdXNlKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMzQ0LDEwICszMzksOSBAQAogCiAvKiBTdGVhbHMgYSByZWZlcmVuY2UgdG8gY29udGV4dCAqLwogdm9pZAotUHlFeGNlcHRpb25fU2V0Q29udGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNvbnRleHQpIHsKLSAgICBQeU9iamVjdCAqb2xkX2NvbnRleHQgPSAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jb250ZXh0OwotICAgICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNvbnRleHQgPSBjb250ZXh0OwotICAgIFB5X1hERUNSRUYob2xkX2NvbnRleHQpOworUHlFeGNlcHRpb25fU2V0Q29udGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmNvbnRleHQpCit7CisgICAgUHlfWFNFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jb250ZXh0LCBjb250ZXh0KTsKIH0KIAogCkBAIC05OTEsNyArOTg1LDcgQEAKICAgICByZXR1cm4gMDsKIAogZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgcmV0dXJuIC0xOwogfQogCkBAIC0xMDcxLDggKzEwNjUsNyBAQAogICAgIH0KICAgICBpZiAoc2VsZi0+bXllcnJubyAmJiBzZWxmLT5zdHJlcnJvcikKICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJbRXJybm8gJVNdICVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm15ZXJybm8gPyBzZWxmLT5teWVycm5vOiBQeV9Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RyZXJyb3IgPyBzZWxmLT5zdHJlcnJvcjogUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5teWVycm5vLCBzZWxmLT5zdHJlcnJvcik7CiAgICAgcmV0dXJuIEJhc2VFeGNlcHRpb25fc3RyKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKTsKIH0KIApAQCAtMjYxMCw3ICsyNjAzLDkgQEAKICAgICBBRERfRVJSTk8oQmxvY2tpbmdJT0Vycm9yLCBFV09VTERCTE9DSyk7CiAgICAgUE9TVF9JTklUKEJyb2tlblBpcGVFcnJvcik7CiAgICAgQUREX0VSUk5PKEJyb2tlblBpcGVFcnJvciwgRVBJUEUpOworI2lmZGVmIEVTSFVURE9XTgogICAgIEFERF9FUlJOTyhCcm9rZW5QaXBlRXJyb3IsIEVTSFVURE9XTik7CisjZW5kaWYKICAgICBQT1NUX0lOSVQoQ2hpbGRQcm9jZXNzRXJyb3IpOwogICAgIEFERF9FUlJOTyhDaGlsZFByb2Nlc3NFcnJvciwgRUNISUxEKTsKICAgICBQT1NUX0lOSVQoQ29ubmVjdGlvbkFib3J0ZWRFcnJvcik7CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IDIzNGQwN2UuLmY0NDI0MTggMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIGludAogUHlGaWxlX1dyaXRlT2JqZWN0KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqZiwgaW50IGZsYWdzKQogewotICAgIFB5T2JqZWN0ICp3cml0ZXIsICp2YWx1ZSwgKmFyZ3MsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKndyaXRlciwgKnZhbHVlLCAqcmVzdWx0OwogICAgIF9QeV9JREVOVElGSUVSKHdyaXRlKTsKIAogICAgIGlmIChmID09IE5VTEwpIHsKQEAgLTE0NiwxNCArMTQ2LDcgQEAKICAgICAgICAgUHlfREVDUkVGKHdyaXRlcik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwotICAgICAgICBQeV9ERUNSRUYod3JpdGVyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh3cml0ZXIsIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbEFyZzEod3JpdGVyLCB2YWx1ZSk7CiAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICBQeV9ERUNSRUYod3JpdGVyKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCmRpZmYgLS1naXQgYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKaW5kZXggZDkyYmVjMy4uMDY0MmIxNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jCisrKyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwpAQCAtMjE1LDM1ICsyMTUsNDkgQEAKIFB5RmxvYXRfQXNEb3VibGUoUHlPYmplY3QgKm9wKQogewogICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0gICAgUHlGbG9hdE9iamVjdCAqZm87CisgICAgUHlPYmplY3QgKnJlczsKICAgICBkb3VibGUgdmFsOwogCi0gICAgaWYgKG9wICYmIFB5RmxvYXRfQ2hlY2sob3ApKQotICAgICAgICByZXR1cm4gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QqKSBvcCk7Ci0KICAgICBpZiAob3AgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwgbmItPm5iX2Zsb2F0ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKTsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhvcCkpIHsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfQVNfRE9VQkxFKG9wKTsKKyAgICB9CisKKyAgICBuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXI7CisgICAgaWYgKG5iID09IE5VTEwgfHwgbmItPm5iX2Zsb2F0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIm11c3QgYmUgcmVhbCBudW1iZXIsIG5vdCAlLjUwcyIsCisgICAgICAgICAgICAgICAgICAgICBvcC0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBmbyA9IChQeUZsb2F0T2JqZWN0KikgKCpuYi0+bmJfZmxvYXQpIChvcCk7Ci0gICAgaWYgKGZvID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoIVB5RmxvYXRfQ2hlY2soZm8pKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmbyk7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAibmJfZmxvYXQgc2hvdWxkIHJldHVybiBmbG9hdCBvYmplY3QiKTsKKyAgICByZXMgPSAoKm5iLT5uYl9mbG9hdCkgKG9wKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBpZiAoIVB5RmxvYXRfQ2hlY2tFeGFjdChyZXMpKSB7CisgICAgICAgIGlmICghUHlGbG9hdF9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlLjUwcy5fX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuNTBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPm9iX3R5cGUtPnRwX25hbWUsIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpLiAgIgorICAgICAgICAgICAgICAgICJUaGUgYWJpbGl0eSB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQgIgorICAgICAgICAgICAgICAgICJpcyBkZXByZWNhdGVkLCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uIiwKKyAgICAgICAgICAgICAgICBvcC0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICB2YWwgPSBQeUZsb2F0X0FTX0RPVUJMRShmbyk7Ci0gICAgUHlfREVDUkVGKGZvKTsKLQorICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgcmV0dXJuIHZhbDsKIH0KIApAQCAtMTE5NSw3ICsxMjA5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mcm9taGV4KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdF9hc19mbG9hdCwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIGRvdWJsZSB4OwogICAgIGxvbmcgZXhwLCB0b3BfZXhwLCBsc2IsIGtleV9kaWdpdDsKICAgICBjaGFyICpzLCAqY29lZmZfc3RhcnQsICpzX3N0b3JlLCAqY29lZmZfZW5kLCAqZXhwX3N0YXJ0LCAqc19lbmQ7CkBAIC0xNDEwLDExICsxNDI0LDEwIEBACiAgICAgICAgIHMrKzsKICAgICBpZiAocyAhPSBzX2VuZCkKICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKLSAgICByZXN1bHRfYXNfZmxvYXQgPSBQeV9CdWlsZFZhbHVlKCIoZCkiLCBuZWdhdGUgPyAteCA6IHgpOwotICAgIGlmIChyZXN1bHRfYXNfZmxvYXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChjbHMsIHJlc3VsdF9hc19mbG9hdCk7Ci0gICAgUHlfREVDUkVGKHJlc3VsdF9hc19mbG9hdCk7CisgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKG5lZ2F0ZSA/IC14IDogeCk7CisgICAgaWYgKGNscyAhPSAoUHlPYmplY3QgKikmUHlGbG9hdF9UeXBlICYmIHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2xzLCByZXN1bHQsIE5VTEwpKTsKKyAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIAogICBvdmVyZmxvd19lcnJvcjoKQEAgLTE0NTEsMjkgKzE0NjQsMjMgQEAKICAgICBpbnQgZXhwb25lbnQ7CiAgICAgaW50IGk7CiAKLSAgICBQeU9iamVjdCAqcHJldjsKICAgICBQeU9iamVjdCAqcHlfZXhwb25lbnQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpudW1lcmF0b3IgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpkZW5vbWluYXRvciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlc3VsdF9wYWlyID0gTlVMTDsKICAgICBQeU51bWJlck1ldGhvZHMgKmxvbmdfbWV0aG9kcyA9IFB5TG9uZ19UeXBlLnRwX2FzX251bWJlcjsKIAotI2RlZmluZSBJTlBMQUNFX1VQREFURShvYmosIGNhbGwpIFwKLSAgICBwcmV2ID0gb2JqOyBcCi0gICAgb2JqID0gY2FsbDsgXAotICAgIFB5X0RFQ1JFRihwcmV2KTsgXAotCiAgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgc2VsZik7CiAKICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoc2VsZikpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGFzcyBpbmZpbml0eSB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOwotICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChQeV9JU19OQU4oc2VsZikpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGFzcyBOYU4gdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKLSAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhc19pbnRlZ2VyX3JhdGlvIiwgZ290byBlcnJvcik7CkBAIC0xNDg5LDI5ICsxNDk2LDMxIEBACiAgICAgICAgdG8gYmUgdHJ1bmNhdGVkIGJ5IFB5TG9uZ19Gcm9tRG91YmxlKCkuICovCiAKICAgICBudW1lcmF0b3IgPSBQeUxvbmdfRnJvbURvdWJsZShmbG9hdF9wYXJ0KTsKLSAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOworICAgIGlmIChkZW5vbWluYXRvciA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHB5X2V4cG9uZW50ID0gUHlMb25nX0Zyb21Mb25nKFB5X0FCUyhleHBvbmVudCkpOworICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgLyogZm9sZCBpbiAyKipleHBvbmVudCAqLwotICAgIGRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOwotICAgIHB5X2V4cG9uZW50ID0gUHlMb25nX0Zyb21Mb25nKGxhYnMoKGxvbmcpZXhwb25lbnQpKTsKLSAgICBpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgICBJTlBMQUNFX1VQREFURShweV9leHBvbmVudCwKLSAgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX2xzaGlmdChkZW5vbWluYXRvciwgcHlfZXhwb25lbnQpKTsKLSAgICBpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkgZ290byBlcnJvcjsKICAgICBpZiAoZXhwb25lbnQgPiAwKSB7Ci0gICAgICAgIElOUExBQ0VfVVBEQVRFKG51bWVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9tdWx0aXBseShudW1lcmF0b3IsIHB5X2V4cG9uZW50KSk7Ci0gICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KG51bWVyYXRvciwgcHlfZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihkZW5vbWluYXRvcik7Ci0gICAgICAgIGRlbm9taW5hdG9yID0gcHlfZXhwb25lbnQ7Ci0gICAgICAgIHB5X2V4cG9uZW50ID0gTlVMTDsKKyAgICAgICAgUHlfU0VUUkVGKGRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQoZGVub21pbmF0b3IsIHB5X2V4cG9uZW50KSk7CisgICAgICAgIGlmIChkZW5vbWluYXRvciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICByZXN1bHRfcGFpciA9IFB5VHVwbGVfUGFjaygyLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKIAotI3VuZGVmIElOUExBQ0VfVVBEQVRFCiBlcnJvcjoKICAgICBQeV9YREVDUkVGKHB5X2V4cG9uZW50KTsKICAgICBQeV9YREVDUkVGKGRlbm9taW5hdG9yKTsKQEAgLTE5NjYsOCArMTk3NSwxMjAgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIF9QeUZsb2F0X3tQYWNrLFVucGFja317NCw4fS4gIFNlZSBmbG9hdG9iamVjdC5oLgorICogX1B5RmxvYXRfe1BhY2ssVW5wYWNrfXsyLDQsOH0uICBTZWUgZmxvYXRvYmplY3QuaC4KKyAqIFRvIG1hdGNoIHRoZSBOUFlfSEFMRl9ST1VORF9USUVTX1RPX0VWRU4gYmVoYXZpb3IgaW46CisgKiBodHRwczovL2dpdGh1Yi5jb20vbnVtcHkvbnVtcHkvYmxvYi9tYXN0ZXIvbnVtcHkvY29yZS9zcmMvbnB5bWF0aC9oYWxmZmxvYXQuYworICogV2UgdXNlOgorICogICAgICAgYml0cyA9ICh1bnNpZ25lZCBzaG9ydClmOyAgICBOb3RlIHRoZSB0cnVuY2F0aW9uCisgKiAgICAgICBpZiAoKGYgLSBiaXRzID4gMC41KSB8fCAoZiAtIGJpdHMgPT0gMC41ICYmIGJpdHMgJSAyKSkgeworICogICAgICAgICAgIGJpdHMrKzsKKyAqICAgICAgIH0KICAqLworCitpbnQKK19QeUZsb2F0X1BhY2syKGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpCit7CisgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgIGludCBlOworICAgIGRvdWJsZSBmOworICAgIHVuc2lnbmVkIHNob3J0IGJpdHM7CisgICAgaW50IGluY3IgPSAxOworCisgICAgaWYgKHggPT0gMC4wKSB7CisgICAgICAgIHNpZ24gPSAoY29weXNpZ24oMS4wLCB4KSA9PSAtMS4wKTsKKyAgICAgICAgZSA9IDA7CisgICAgICAgIGJpdHMgPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWSh4KSkgeworICAgICAgICBzaWduID0gKHggPCAwLjApOworICAgICAgICBlID0gMHgxZjsKKyAgICAgICAgYml0cyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX05BTih4KSkgeworICAgICAgICAvKiBUaGVyZSBhcmUgMjA0NiBkaXN0aW5jdCBoYWxmLXByZWNpc2lvbiBOYU5zICgxMDIyIHNpZ25hbGluZyBhbmQKKyAgICAgICAgICAgMTAyNCBxdWlldCksIGJ1dCB0aGVyZSBhcmUgb25seSB0d28gcXVpZXQgTmFOcyB0aGF0IGRvbid0IGFyaXNlIGJ5CisgICAgICAgICAgIHF1aWV0aW5nIGEgc2lnbmFsaW5nIE5hTjsgd2UgZ2V0IHRob3NlIGJ5IHNldHRpbmcgdGhlIHRvcG1vc3QgYml0CisgICAgICAgICAgIG9mIHRoZSBmcmFjdGlvbiBmaWVsZCBhbmQgY2xlYXJpbmcgYWxsIG90aGVyIGZyYWN0aW9uIGJpdHMuIFdlCisgICAgICAgICAgIGNob29zZSB0aGUgb25lIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNpZ24uICovCisgICAgICAgIHNpZ24gPSAoY29weXNpZ24oMS4wLCB4KSA9PSAtMS4wKTsKKyAgICAgICAgZSA9IDB4MWY7CisgICAgICAgIGJpdHMgPSA1MTI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzaWduID0gKHggPCAwLjApOworICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgICAgeCA9IC14OworICAgICAgICB9CisKKyAgICAgICAgZiA9IGZyZXhwKHgsICZlKTsKKyAgICAgICAgaWYgKGYgPCAwLjUgfHwgZiA+PSAxLjApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJleHAoKSByZXN1bHQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3JtYWxpemUgZiB0byBiZSBpbiB0aGUgcmFuZ2UgWzEuMCwgMi4wKSAqLworICAgICAgICBmICo9IDIuMDsKKyAgICAgICAgZS0tOworCisgICAgICAgIGlmIChlID49IDE2KSB7CisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGUgPCAtMjUpIHsKKyAgICAgICAgICAgIC8qIHx4fCA8IDIqKi0yNS4gVW5kZXJmbG93IHRvIHplcm8uICovCisgICAgICAgICAgICBmID0gMC4wOworICAgICAgICAgICAgZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZSA8IC0xNCkgeworICAgICAgICAgICAgLyogfHh8IDwgMioqLTE0LiBHcmFkdWFsIHVuZGVyZmxvdyAqLworICAgICAgICAgICAgZiA9IGxkZXhwKGYsIDE0ICsgZSk7CisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGlmICghKGUgPT0gMCAmJiBmID09IDAuMCkpICovIHsKKyAgICAgICAgICAgIGUgKz0gMTU7CisgICAgICAgICAgICBmIC09IDEuMDsgLyogR2V0IHJpZCBvZiBsZWFkaW5nIDEgKi8KKyAgICAgICAgfQorCisgICAgICAgIGYgKj0gMTAyNC4wOyAvKiAyKioxMCAqLworICAgICAgICAvKiBSb3VuZCB0byBldmVuICovCisgICAgICAgIGJpdHMgPSAodW5zaWduZWQgc2hvcnQpZjsgLyogTm90ZSB0aGUgdHJ1bmNhdGlvbiAqLworICAgICAgICBhc3NlcnQoYml0cyA8IDEwMjQpOworICAgICAgICBhc3NlcnQoZSA8IDMxKTsKKyAgICAgICAgaWYgKChmIC0gYml0cyA+IDAuNSkgfHwgKChmIC0gYml0cyA9PSAwLjUpICYmIChiaXRzICUgMiA9PSAxKSkpIHsKKyAgICAgICAgICAgICsrYml0czsKKyAgICAgICAgICAgIGlmIChiaXRzID09IDEwMjQpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY2FycnkgcHJvcGFnYXRlZCBvdXQgb2YgYSBzdHJpbmcgb2YgMTAgMSBiaXRzLiAqLworICAgICAgICAgICAgICAgIGJpdHMgPSAwOworICAgICAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSAzMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJpdHMgfD0gKGUgPDwgMTApIHwgKHNpZ24gPDwgMTUpOworCisgICAgLyogV3JpdGUgb3V0IHJlc3VsdC4gKi8KKyAgICBpZiAobGUpIHsKKyAgICAgICAgcCArPSAxOworICAgICAgICBpbmNyID0gLTE7CisgICAgfQorCisgICAgLyogRmlyc3QgYnl0ZSAqLworICAgICpwID0gKHVuc2lnbmVkIGNoYXIpKChiaXRzID4+IDgpICYgMHhGRik7CisgICAgcCArPSBpbmNyOworCisgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKShiaXRzICYgMHhGRik7CisKKyAgICByZXR1cm4gMDsKKworICBPdmVyZmxvdzoKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZsb2F0IHRvbyBsYXJnZSB0byBwYWNrIHdpdGggZSBmb3JtYXQiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKIGludAogX1B5RmxvYXRfUGFjazQoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKQEAgLTIyMDMsNiArMjMyNCw3NiBAQAogfQogCiBkb3VibGUKK19QeUZsb2F0X1VucGFjazIoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQoreworICAgIHVuc2lnbmVkIGNoYXIgc2lnbjsKKyAgICBpbnQgZTsKKyAgICB1bnNpZ25lZCBpbnQgZjsKKyAgICBkb3VibGUgeDsKKyAgICBpbnQgaW5jciA9IDE7CisKKyAgICBpZiAobGUpIHsKKyAgICAgICAgcCArPSAxOworICAgICAgICBpbmNyID0gLTE7CisgICAgfQorCisgICAgLyogRmlyc3QgYnl0ZSAqLworICAgIHNpZ24gPSAoKnAgPj4gNykgJiAxOworICAgIGUgPSAoKnAgJiAweDdDKSA+PiAyOworICAgIGYgPSAoKnAgJiAweDAzKSA8PCA4OworICAgIHAgKz0gaW5jcjsKKworICAgIC8qIFNlY29uZCBieXRlICovCisgICAgZiB8PSAqcDsKKworICAgIGlmIChlID09IDB4MWYpIHsKKyNpZmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCisgICAgICAgIGlmIChmID09IDApIHsKKyAgICAgICAgICAgIC8qIEluZmluaXR5ICovCisgICAgICAgICAgICByZXR1cm4gc2lnbiA/IC1QeV9IVUdFX1ZBTCA6IFB5X0hVR0VfVkFMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTmFOICovCisjaWZkZWYgUHlfTkFOCisgICAgICAgICAgICByZXR1cm4gc2lnbiA/IC1QeV9OQU4gOiBQeV9OQU47CisjZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbid0IHVucGFjayBJRUVFIDc1NCBOYU4gIgorICAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgTmFOcyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworI2VuZGlmICAvKiAjaWZkZWYgUHlfTkFOICovCisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChmID09IDApIHsKKyAgICAgICAgICAgIC8qIEluZmluaXR5ICovCisgICAgICAgICAgICByZXR1cm4gX1B5X2RnX2luZmluaXR5KHNpZ24pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTmFOICovCisgICAgICAgICAgICByZXR1cm4gX1B5X2RnX3N0ZG5hbihzaWduKTsKKyAgICAgICAgfQorI2VuZGlmICAvKiAjaWZkZWYgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUiAqLworICAgIH0KKworICAgIHggPSAoZG91YmxlKWYgLyAxMDI0LjA7CisKKyAgICBpZiAoZSA9PSAwKSB7CisgICAgICAgIGUgPSAtMTQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB4ICs9IDEuMDsKKyAgICAgICAgZSAtPSAxNTsKKyAgICB9CisgICAgeCA9IGxkZXhwKHgsIGUpOworCisgICAgaWYgKHNpZ24pCisgICAgICAgIHggPSAteDsKKworICAgIHJldHVybiB4OworfQorCitkb3VibGUKIF9QeUZsb2F0X1VucGFjazQoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewogICAgIGlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvZnJhbWVvYmplY3QuYyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwppbmRleCA5YWFkZDYxLi5iMTE1NjE0IDEwMDY0NAotLS0gYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgICAgbmV3X2xhc3RpID0gLTE7CiAgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbG5vdGFiX2xlbjsgb2Zmc2V0ICs9IDIpIHsKICAgICAgICAgICAgIGFkZHIgKz0gbG5vdGFiW29mZnNldF07Ci0gICAgICAgICAgICBsaW5lICs9IGxub3RhYltvZmZzZXQrMV07CisgICAgICAgICAgICBsaW5lICs9IChzaWduZWQgY2hhcilsbm90YWJbb2Zmc2V0KzFdOwogICAgICAgICAgICAgaWYgKGxpbmUgPj0gbmV3X2xpbmVubykgewogICAgICAgICAgICAgICAgIG5ld19sYXN0aSA9IGFkZHI7CiAgICAgICAgICAgICAgICAgbmV3X2xpbmVubyA9IGxpbmU7CkBAIC0xODksNyArMTg5LDcgQEAKICAgICBtZW1zZXQoYmxvY2tzdGFjaywgJ1wwJywgc2l6ZW9mKGJsb2Nrc3RhY2spKTsKICAgICBtZW1zZXQoaW5fZmluYWxseSwgJ1wwJywgc2l6ZW9mKGluX2ZpbmFsbHkpKTsKICAgICBibG9ja3N0YWNrX3RvcCA9IDA7Ci0gICAgZm9yIChhZGRyID0gMDsgYWRkciA8IGNvZGVfbGVuOyBhZGRyKyspIHsKKyAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY29kZV9sZW47IGFkZHIgKz0gMikgewogICAgICAgICB1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CkBAIC0yNTEsMTAgKzI1MSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKLSAgICAgICAgICAgIGFkZHIgKz0gMjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBibG9ja3N0YWNrIHRyYWNraW5nIGNvZGUgZGlkbid0IGdldCBsb3N0LiAqLwpAQCAtMjc3LDcgKzI3Myw3IEBACiAgICAgICogY2FuIHRlbGwgd2hldGhlciB0aGUganVtcCBnb2VzIGludG8gYW55IGJsb2NrcyB3aXRob3V0IGNvbWluZyBvdXQKICAgICAgKiBhZ2FpbiAtIGluIHRoYXQgY2FzZSB3ZSByYWlzZSBhbiBleGNlcHRpb24gYmVsb3cuICovCiAgICAgZGVsdGFfaWJsb2NrID0gMDsKLSAgICBmb3IgKGFkZHIgPSBtaW5fYWRkcjsgYWRkciA8IG1heF9hZGRyOyBhZGRyKyspIHsKKyAgICBmb3IgKGFkZHIgPSBtaW5fYWRkcjsgYWRkciA8IG1heF9hZGRyOyBhZGRyICs9IDIpIHsKICAgICAgICAgdW5zaWduZWQgY2hhciBvcCA9IGNvZGVbYWRkcl07CiAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgY2FzZSBTRVRVUF9MT09QOgpAQCAtMjk0LDEwICsyOTAsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgbWluX2RlbHRhX2libG9jayA9IFB5X01JTihtaW5fZGVsdGFfaWJsb2NrLCBkZWx0YV9pYmxvY2spOwotCi0gICAgICAgIGlmIChvcCA+PSBIQVZFX0FSR1VNRU5UKSB7Ci0gICAgICAgICAgICBhZGRyICs9IDI7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKiBEZXJpdmUgdGhlIGFic29sdXRlIGlibG9jayB2YWx1ZXMgZnJvbSB0aGUgZGVsdGFzLiAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwppbmRleCBlNmMzMjdkLi4yNjFjMTZkIDEwMDY0NAotLS0gYS9PYmplY3RzL2Z1bmNvYmplY3QuYworKysgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwpAQCAtMjQ5LDcgKzI0OSw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9jb2RlKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKICAgICBQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKIAogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX2NvZGUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCkBAIC0yNzAsMTAgKzI2OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICBuY2xvc3VyZSwgbmZyZWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX2NvZGU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19jb2RlID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19jb2RlLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI4Nyw4ICsyODQsNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfbmFtZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwogICAgICAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwogICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CkBAIC0yOTYsMTAgKzI5MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfbmFtZTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX25hbWUgPSB2YWx1ZTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX25hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzEzLDggKzMwNiw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9xdWFsbmFtZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGYuX19xdWFsbmFtZV9fIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwogICAgICAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwogICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CkBAIC0zMjIsMTAgKzMxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19xdWFsbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX3F1YWxuYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfcXVhbG5hbWUgPSB2YWx1ZTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX3F1YWxuYW1lLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM0Myw4ICszMzIsNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfZGVmYXVsdHMoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19kZWZhdWx0cy4KICAgICAgKiBDYW4gb25seSBzZXQgZnVuY19kZWZhdWx0cyB0byBOVUxMIG9yIGEgdHVwbGUuICovCiAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCkBAIC0zNTQsMTAgKzM0MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19kZWZhdWx0c19fIG11c3QgYmUgc2V0IHRvIGEgdHVwbGUgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfZGVmYXVsdHM7CiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfZGVmYXVsdHMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19kZWZhdWx0cywgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNzUsOCArMzYwLDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2t3ZGVmYXVsdHMoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCiAgICAgICAgIHZhbHVlID0gTlVMTDsKICAgICAvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2t3ZGVmYXVsdHMuCkBAIC0zODYsMTAgKzM2OSw4IEBACiAgICAgICAgICAgICAiX19rd2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0IG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX2t3ZGVmYXVsdHM7CiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfa3dkZWZhdWx0cyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2t3ZGVmYXVsdHMsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDA4LDggKzM4OSw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9hbm5vdGF0aW9ucyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKICAgICAgICAgdmFsdWUgPSBOVUxMOwogICAgIC8qIExlZ2FsIHRvIGRlbCBmLmZ1bmNfYW5ub3RhdGlvbnMuCkBAIC00MjAsMTAgKzM5OSw4IEBACiAgICAgICAgICAgICAiX19hbm5vdGF0aW9uc19fIG11c3QgYmUgc2V0IHRvIGEgZGljdCBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19hbm5vdGF0aW9uczsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19hbm5vdGF0aW9ucyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2Fubm90YXRpb25zLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZ2Vub2JqZWN0LmMgYi9PYmplY3RzL2dlbm9iamVjdC5jCmluZGV4IDAxYzU5YzIuLjEwNGQ5MGIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZ2Vub2JqZWN0LmMKKysrIGIvT2JqZWN0cy9nZW5vYmplY3QuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgICAgICAvKiBQb3AgdGhlIGV4Y2VwdGlvbiBiZWZvcmUgaXNzdWluZyBhIHdhcm5pbmcuICovCiAgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwogCi0gICAgICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAxLAorICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciAnJS41MFMnIHJhaXNlZCBTdG9wSXRlcmF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi0+Z2lfcXVhbG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgLyogV2FybmluZyB3YXMgY29udmVydGVkIHRvIGFuIGVycm9yLiAqLwpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHlmKTsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIiIpOworICAgICAgICAgICAgcmV0dmFsID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhtZXRoKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRoKTsKICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAgICAgUHlPYmplY3QgKmJ5dGVjb2RlID0gZi0+Zl9jb2RlLT5jb19jb2RlOwogICAgICAgICB1bnNpZ25lZCBjaGFyICpjb2RlID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhieXRlY29kZSk7CiAKLSAgICAgICAgaWYgKGNvZGVbZi0+Zl9sYXN0aSArIDFdICE9IFlJRUxEX0ZST00pCisgICAgICAgIGlmIChjb2RlW2YtPmZfbGFzdGkgKyAyXSAhPSBZSUVMRF9GUk9NKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHlmID0gZi0+Zl9zdGFja3RvcFstMV07CiAgICAgICAgIFB5X0lOQ1JFRih5Zik7CkBAIC0zODAsNyArMzgwLDcgQEAKICAgICAgICAgICAgIGFzc2VydChyZXQgPT0geWYpOwogICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CiAgICAgICAgICAgICAvKiBUZXJtaW5hdGlvbiByZXBldGl0aW9uIG9mIFlJRUxEX0ZST00gKi8KLSAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkrKzsKKyAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkgKz0gMjsKICAgICAgICAgICAgIGlmIChfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUoJnZhbCkgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldCA9IGdlbl9zZW5kX2V4KGdlbiwgdmFsLCAwLCAwKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsKTsKQEAgLTUyMyw4ICs1MjMsNiBAQAogc3RhdGljIGludAogZ2VuX3NldF9uYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5naV9uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwogICAgICAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwogICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CkBAIC01MzIsMTAgKzUzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX25hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+Z2lfbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmdpX25hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTQ5LDggKzU0NSw2IEBACiBzdGF0aWMgaW50CiBnZW5fc2V0X3F1YWxuYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5fX3F1YWxuYW1lX18gb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTU1OCwxMCArNTUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX3F1YWxuYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmdpX3F1YWxuYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+Z2lfcXVhbG5hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwppbmRleCBhYjI5ZmY4Li43NWIyZmNiIDEwMDY0NAotLS0gYS9PYmplY3RzL2l0ZXJvYmplY3QuYworKysgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwpAQCAtMjA4LDMwICsyMDgsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsaXRlcl9pdGVybmV4dChjYWxsaXRlcm9iamVjdCAqaXQpCiB7Ci0gICAgaWYgKGl0LT5pdF9jYWxsYWJsZSAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChpdC0+aXRfY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50IG9rOwotICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXQtPml0X3NlbnRpbmVsLCByZXN1bHQsIFB5X0VRKTsKLSAgICAgICAgICAgIGlmIChvayA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7IC8qIENvbW1vbiBjYXNlLCBmYXN0IHBhdGggKi8KLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgaWYgKG9rID4gMCkgewotICAgICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9jYWxsYWJsZSk7Ci0gICAgICAgICAgICAgICAgUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKLSAgICAgICAgICAgIH0KKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgaWYgKGl0LT5pdF9jYWxsYWJsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTm9BcmcoaXQtPml0X2NhbGxhYmxlKTsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IG9rOworCisgICAgICAgIG9rID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0LT5pdF9zZW50aW5lbCwgcmVzdWx0LCBQeV9FUSk7CisgICAgICAgIGlmIChvayA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAvKiBDb21tb24gY2FzZSwgZmFzdCBwYXRoICovCiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgewotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgaWYgKG9rID4gMCkgewogICAgICAgICAgICAgUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9zZW50aW5lbCk7CiAgICAgICAgIH0KICAgICB9CisgICAgZWxzZSBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOworICAgICAgICBQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOworICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0b2JqZWN0LmMgYi9PYmplY3RzL2xpc3RvYmplY3QuYwppbmRleCBkNjg4MTc5Li4zNWE0OWRhIDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3RvYmplY3QuYworKysgYi9PYmplY3RzL2xpc3RvYmplY3QuYwpAQCAtODIsNiArODIsMTYgQEAKIHN0YXRpYyB2b2lkCiBzaG93X2FsbG9jKHZvaWQpCiB7CisgICAgUHlPYmplY3QgKnhvcHRpb25zLCAqdmFsdWU7CisgICAgX1B5X0lERU5USUZJRVIoc2hvd2FsbG9jY291bnQpOworCisgICAgeG9wdGlvbnMgPSBQeVN5c19HZXRYT3B0aW9ucygpOworICAgIGlmICh4b3B0aW9ucyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgdmFsdWUgPSBfUHlEaWN0X0dldEl0ZW1JZCh4b3B0aW9ucywgJlB5SWRfc2hvd2FsbG9jY291bnQpOworICAgIGlmICh2YWx1ZSAhPSBQeV9UcnVlKQorICAgICAgICByZXR1cm47CisKICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCiAgICAgICAgIGNvdW50X2FsbG9jKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVApAQCAtMTMwLDcgKzE0MCw2IEBACiBQeUxpc3RfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIHsKICAgICBQeUxpc3RPYmplY3QgKm9wOwotICAgIHNpemVfdCBuYnl0ZXM7CiAjaWZkZWYgU0hPV19BTExPQ19DT1VOVAogICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKQEAgLTE0MywxMSArMTUyLDYgQEAKICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgd2l0aG91dCBhbiBhY3R1YWwgb3ZlcmZsb3csCi0gICAgICogIHdoaWNoIGNhbiBjYXVzZSBjb21waWxlciB0byBvcHRpbWlzZSBvdXQgKi8KLSAgICBpZiAoKHNpemVfdClzaXplID4gUFlfU0laRV9NQVggLyBzaXplb2YoUHlPYmplY3QgKikpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIG5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3QgKik7CiAgICAgaWYgKG51bWZyZWUpIHsKICAgICAgICAgbnVtZnJlZS0tOwogICAgICAgICBvcCA9IGZyZWVfbGlzdFtudW1mcmVlXTsKQEAgLTE2NiwxMiArMTcwLDExIEBACiAgICAgaWYgKHNpemUgPD0gMCkKICAgICAgICAgb3AtPm9iX2l0ZW0gPSBOVUxMOwogICAgIGVsc2UgewotICAgICAgICBvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAqKikgUHlNZW1fTUFMTE9DKG5ieXRlcyk7CisgICAgICAgIG9wLT5vYl9pdGVtID0gKFB5T2JqZWN0ICoqKSBQeU1lbV9DYWxsb2Moc2l6ZSwgc2l6ZW9mKFB5T2JqZWN0ICopKTsKICAgICAgICAgaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CiAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgfQotICAgICAgICBtZW1zZXQob3AtPm9iX2l0ZW0sIDAsIG5ieXRlcyk7CiAgICAgfQogICAgIFB5X1NJWkUob3ApID0gc2l6ZTsKICAgICBvcC0+YWxsb2NhdGVkID0gc2l6ZTsKQEAgLTIxNiw3ICsyMTksNiBAQAogUHlMaXN0X1NldEl0ZW0oUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGksCiAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmV3aXRlbSkKIHsKLSAgICBQeU9iamVjdCAqb2xkaXRlbTsKICAgICBQeU9iamVjdCAqKnA7CiAgICAgaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7CiAgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CkBAIC0yMzAsOSArMjMyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBwID0gKChQeUxpc3RPYmplY3QgKilvcCkgLT4gb2JfaXRlbSArIGk7Ci0gICAgb2xkaXRlbSA9ICpwOwotICAgICpwID0gbmV3aXRlbTsKLSAgICBQeV9YREVDUkVGKG9sZGl0ZW0pOworICAgIFB5X1hTRVRSRUYoKnAsIG5ld2l0ZW0pOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKHdoZXJlIDwgMCkgewpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKKyAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIFB5X0lOQ1JFRih2KTsKQEAgLTQ4MSw5ICs0ODEsOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZGVmaW5lIGIgKChQeUxpc3RPYmplY3QgKiliYikKLSAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0gICAgaWYgKHNpemUgPCAwKQorICAgIGlmIChQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKQogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7CiAgICAgbnAgPSAoUHlMaXN0T2JqZWN0ICopIFB5TGlzdF9OZXcoc2l6ZSk7CiAgICAgaWYgKG5wID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC03MTEsNyArNzExLDcgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQogCi0gICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIHNpemUqbikgPT0gLTEpCisgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIHNpemUqbikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHAgPSBzaXplOwpAQCAtNzMwLDcgKzczMCw2IEBACiBzdGF0aWMgaW50CiBsaXN0X2Fzc19pdGVtKFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLSAgICBQeU9iamVjdCAqb2xkX3ZhbHVlOwogICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwpAQCAtNzM5LDkgKzczOCw3IEBACiAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGxpc3RfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7CiAgICAgUHlfSU5DUkVGKHYpOwotICAgIG9sZF92YWx1ZSA9IGEtPm9iX2l0ZW1baV07Ci0gICAgYS0+b2JfaXRlbVtpXSA9IHY7Ci0gICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CisgICAgUHlfU0VUUkVGKGEtPm9iX2l0ZW1baV0sIHYpOwogICAgIHJldHVybiAwOwogfQogCkBAIC04MDQsNyArODAxLDcgQEAKICAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgICAgICB9CiAgICAgICAgIG0gPSBQeV9TSVpFKHNlbGYpOwotICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pID09IC0xKSB7CisgICAgICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtICsgbikgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtODMyLDIzICs4MjksMjUgQEAKIAogICAgIC8qIEd1ZXNzIGEgcmVzdWx0IGxpc3Qgc2l6ZS4gKi8KICAgICBuID0gUHlPYmplY3RfTGVuZ3RoSGludChiLCA4KTsKLSAgICBpZiAobiA9PSAtMSkgeworICAgIGlmIChuIDwgMCkgewogICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgbSA9IFB5X1NJWkUoc2VsZik7Ci0gICAgbW4gPSBtICsgbjsKLSAgICBpZiAobW4gPj0gbSkgeworICAgIGlmIChtID4gUFlfU1NJWkVfVF9NQVggLSBuKSB7CisgICAgICAgIC8qIG0gKyBuIG92ZXJmbG93ZWQ7IG9uIHRoZSBjaGFuY2UgdGhhdCBuIGxpZWQsIGFuZCB0aGVyZSByZWFsbHkKKyAgICAgICAgICogaXMgZW5vdWdoIHJvb20sIGlnbm9yZSBpdC4gIElmIG4gd2FzIHRlbGxpbmcgdGhlIHRydXRoLCB3ZSdsbAorICAgICAgICAgKiBldmVudHVhbGx5IHJ1biBvdXQgb2YgbWVtb3J5IGR1cmluZyB0aGUgbG9vcC4KKyAgICAgICAgICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtbiA9IG0gKyBuOwogICAgICAgICAvKiBNYWtlIHJvb20uICovCi0gICAgICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPT0gLTEpCisgICAgICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPCAwKQogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgLyogTWFrZSB0aGUgbGlzdCBzYW5lIGFnYWluLiAqLwogICAgICAgICBQeV9TSVpFKHNlbGYpID0gbTsKICAgICB9Ci0gICAgLyogRWxzZSBtICsgbiBvdmVyZmxvd2VkOyBvbiB0aGUgY2hhbmNlIHRoYXQgbiBsaWVkLCBhbmQgdGhlcmUgcmVhbGx5Ci0gICAgICogaXMgZW5vdWdoIHJvb20sIGlnbm9yZSBpdC4gIElmIG4gd2FzIHRlbGxpbmcgdGhlIHRydXRoLCB3ZSdsbAotICAgICAqIGV2ZW50dWFsbHkgcnVuIG91dCBvZiBtZW1vcnkgZHVyaW5nIHRoZSBsb29wLgotICAgICAqLwogCiAgICAgLyogUnVuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICovCiAgICAgZm9yICg7OykgewpAQCAtMjQ5Nyw5ICsyNDk2LDYgQEAKICAgICAgICAgICAgICAgICBzdGVwID0gLXN0ZXA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFzc2VydCgoc2l6ZV90KXNsaWNlbGVuZ3RoIDw9Ci0gICAgICAgICAgICAgICAgICAgUFlfU0laRV9NQVggLyBzaXplb2YoUHlPYmplY3QqKSk7Ci0KICAgICAgICAgICAgIGdhcmJhZ2UgPSAoUHlPYmplY3QqKikKICAgICAgICAgICAgICAgICBQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOwogICAgICAgICAgICAgaWYgKCFnYXJiYWdlKSB7CmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3Rzb3J0LnR4dCBiL09iamVjdHMvbGlzdHNvcnQudHh0CmluZGV4IDgzMmU0ZjIuLjE3ZDI3OTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdHNvcnQudHh0CisrKyBiL09iamVjdHMvbGlzdHNvcnQudHh0CkBAIC00ODYsNyArNDg2LDcgQEAKIEkgZmlyc3QgbGVhcm5lZCBhYm91dCB0aGUgZ2FsbG9waW5nIHN0cmF0ZWd5IGluIGEgcmVsYXRlZCBjb250ZXh0OyBzZWU6CiAKICAgICAiQWRhcHRpdmUgU2V0IEludGVyc2VjdGlvbnMsIFVuaW9ucywgYW5kIERpZmZlcmVuY2VzIiAoMjAwMCkKLSAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBM83Blei1PcnRpeiwgSi4gSWFuIE11bnJvCisgICAgRXJpayBELiBEZW1haW5lLCBBbGVqYW5kcm8gTMOzcGV6LU9ydGl6LCBKLiBJYW4gTXVucm8KIAogYW5kIGl0cyBmb2xsb3d1cChzKS4gIEFuIGVhcmxpZXIgcGFwZXIgY2FsbGVkIHRoZSBzYW1lIHN0cmF0ZWd5CiAiZXhwb25lbnRpYWwgc2VhcmNoIjoKQEAgLTY5NCw3ICs2OTQsNyBAQAogCiBCdXQgaW4gQ1B5dGhvbidzIGNhc2UsIGNvbXBhcmlzb25zIGFyZSBleHRyYW9yZGluYXJpbHkgZXhwZW5zaXZlIGNvbXBhcmVkIHRvCiBtb3ZpbmcgZGF0YSwgYW5kIHRoZSBkZXRhaWxzIG1hdHRlci4gIE1vdmluZyBvYmplY3RzIGlzIGp1c3QgY29weWluZwotcG9pbnRlcnMuICBDb21wYXJpc29ucyBjYW4gYmUgYXJiaXRyYXJpbHkgZXhwZW5zaXZlIChjYW4gaW52b2tlIGFyYml0YXJ5Citwb2ludGVycy4gIENvbXBhcmlzb25zIGNhbiBiZSBhcmJpdHJhcmlseSBleHBlbnNpdmUgKGNhbiBpbnZva2UgYXJiaXRyYXJ5CiB1c2VyLXN1cHBsaWVkIFB5dGhvbiBjb2RlKSwgYnV0IGV2ZW4gaW4gc2ltcGxlIGNhc2VzIChsaWtlIDMgPCA0KSBfYWxsXwogZGVjaXNpb25zIGFyZSBtYWRlIGF0IHJ1bnRpbWU6ICB3aGF0J3MgdGhlIHR5cGUgb2YgdGhlIGxlZnQgY29tcGFyYW5kPyAgdGhlCiB0eXBlIG9mIHRoZSByaWdodD8gIGRvIHRoZXkgbmVlZCB0byBiZSBjb2VyY2VkIHRvIGEgY29tbW9uIHR5cGU/ICB3aGVyZSdzIHRoZQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0IGIvT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0CmluZGV4IGQyNDdlZGQuLjUxNTM3NTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dAorKysgYi9PYmplY3RzL2xub3RhYl9ub3Rlcy50eHQKQEAgLTEyLDQyICsxMiw0NyBAQAogICAgICAgICAwCQkgICAgMQogICAgICAgICA2CQkgICAgMgogICAgICAgIDUwCQkgICAgNwotICAgICAgMzUwICAgICAgICAgICAgICAgICAzMDcKLSAgICAgIDM2MSAgICAgICAgICAgICAgICAgMzA4CisgICAgICAzNTAgICAgICAgICAgICAgICAgIDIwNworICAgICAgMzYxICAgICAgICAgICAgICAgICAyMDgKIAogSW5zdGVhZCBvZiBzdG9yaW5nIHRoZXNlIG51bWJlcnMgbGl0ZXJhbGx5LCB3ZSBjb21wcmVzcyB0aGUgbGlzdCBieSBzdG9yaW5nIG9ubHkKLXRoZSBpbmNyZW1lbnRzIGZyb20gb25lIHJvdyB0byB0aGUgbmV4dC4gIENvbmNlcHR1YWxseSwgdGhlIHN0b3JlZCBsaXN0IG1pZ2h0Cit0aGUgZGlmZmVyZW5jZSBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQuICBDb25jZXB0dWFsbHksIHRoZSBzdG9yZWQgbGlzdCBtaWdodAogbG9vayBsaWtlOgogCi0gICAgMCwgMSwgIDYsIDEsICA0NCwgNSwgIDMwMCwgMzAwLCAgMTEsIDEKKyAgICAwLCAxLCAgNiwgMSwgIDQ0LCA1LCAgMzAwLCAyMDAsICAxMSwgMQogCi1UaGUgYWJvdmUgZG9lc24ndCByZWFsbHkgd29yaywgYnV0IGl0J3MgYSBzdGFydC4gTm90ZSB0aGF0IGFuIHVuc2lnbmVkIGJ5dGUKLWNhbid0IGhvbGQgbmVnYXRpdmUgdmFsdWVzLCBvciB2YWx1ZXMgbGFyZ2VyIHRoYW4gMjU1LCBhbmQgdGhlIGFib3ZlIGV4YW1wbGUKLWNvbnRhaW5zIHR3byBzdWNoIHZhbHVlcy4gU28gd2UgbWFrZSB0d28gdHdlYWtzOgorVGhlIGFib3ZlIGRvZXNuJ3QgcmVhbGx5IHdvcmssIGJ1dCBpdCdzIGEgc3RhcnQuIEFuIHVuc2lnbmVkIGJ5dGUgKGJ5dGUgY29kZQorb2Zmc2V0KSBjYW4ndCBob2xkIG5lZ2F0aXZlIHZhbHVlcywgb3IgdmFsdWVzIGxhcmdlciB0aGFuIDI1NSwgYSBzaWduZWQgYnl0ZQorKGxpbmUgbnVtYmVyKSBjYW4ndCBob2xkIHZhbHVlcyBsYXJnZXIgdGhhbiAxMjcgb3IgbGVzcyB0aGFuIC0xMjgsIGFuZCB0aGUKK2Fib3ZlIGV4YW1wbGUgY29udGFpbnMgdHdvIHN1Y2ggdmFsdWVzLiBTbyB3ZSBtYWtlIHR3byB0d2Vha3M6CiAKLSAoYSkgdGhlcmUncyBhIGRlZXAgYXNzdW1wdGlvbiB0aGF0IGJ5dGUgY29kZSBvZmZzZXRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCi0gbGluZSAjcyBib3RoIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZAotIChiKSBpZiBhdCBsZWFzdCBvbmUgY29sdW1uIGp1bXBzIGJ5IG1vcmUgdGhhbiAyNTUgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LAotIG1vcmUgdGhhbiBvbmUgcGFpciBpcyB3cml0dGVuIHRvIHRoZSB0YWJsZS4gSW4gY2FzZSAjYiwgdGhlcmUncyBubyB3YXkgdG8ga25vdwotIGZyb20gbG9va2luZyBhdCB0aGUgdGFibGUgbGF0ZXIgaG93IG1hbnkgd2VyZSB3cml0dGVuLiAgVGhhdCdzIHRoZSBkZWxpY2F0ZQotIHBhcnQuICBBIHVzZXIgb2YgY29fbG5vdGFiIGRlc2lyaW5nIHRvIGZpbmQgdGhlIHNvdXJjZSBsaW5lIG51bWJlcgotIGNvcnJlc3BvbmRpbmcgdG8gYSBieXRlY29kZSBhZGRyZXNzIEEgc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMKKyAoYSkgdGhlcmUncyBhIGRlZXAgYXNzdW1wdGlvbiB0aGF0IGJ5dGUgY29kZSBvZmZzZXRzIGluY3JlYXNlIG1vbm90b25pY2FsbHksCisgYW5kCisgKGIpIGlmIGJ5dGUgY29kZSBvZmZzZXQganVtcHMgYnkgbW9yZSB0aGFuIDI1NSBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQsIG9yIGlmCisgc291cmNlIGNvZGUgbGluZSBudW1iZXIganVtcHMgYnkgbW9yZSB0aGFuIDEyNyBvciBsZXNzIHRoYW4gLTEyOCBmcm9tIG9uZSByb3cKKyB0byB0aGUgbmV4dCwgbW9yZSB0aGFuIG9uZSBwYWlyIGlzIHdyaXR0ZW4gdG8gdGhlIHRhYmxlLiBJbiBjYXNlICNiLAorIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgZnJvbSBsb29raW5nIGF0IHRoZSB0YWJsZSBsYXRlciBob3cgbWFueSB3ZXJlIHdyaXR0ZW4uCisgVGhhdCdzIHRoZSBkZWxpY2F0ZSBwYXJ0LiAgQSB1c2VyIG9mIGNvX2xub3RhYiBkZXNpcmluZyB0byBmaW5kIHRoZSBzb3VyY2UKKyBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgYnl0ZWNvZGUgYWRkcmVzcyBBIHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZQorIHRoaXM6CiAKICAgICBsaW5lbm8gPSBhZGRyID0gMAogICAgIGZvciBhZGRyX2luY3IsIGxpbmVfaW5jciBpbiBjb19sbm90YWI6CiAgICAgICAgIGFkZHIgKz0gYWRkcl9pbmNyCiAgICAgICAgIGlmIGFkZHIgPiBBOgogICAgICAgICAgICAgcmV0dXJuIGxpbmVubworICAgICAgICBpZiBsaW5lX2luY3IgPj0gMHg4MDoKKyAgICAgICAgICAgIGxpbmVfaW5jciAtPSAweDEwMAogICAgICAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAKIChJbiBDLCB0aGlzIGlzIGltcGxlbWVudGVkIGJ5IFB5Q29kZV9BZGRyMkxpbmUoKS4pICBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLAogd2hlbiB0aGUgYWRkciBmaWVsZCBpbmNyZW1lbnRzIGJ5IG1vcmUgdGhhbiAyNTUsIHRoZSBsaW5lICMgaW5jcmVtZW50IGluIGVhY2gKIHBhaXIgZ2VuZXJhdGVkIG11c3QgYmUgMCB1bnRpbCB0aGUgcmVtYWluaW5nIGFkZHIgaW5jcmVtZW50IGlzIDwgMjU2LiAgU28sIGluCiB0aGUgZXhhbXBsZSBhYm92ZSwgYXNzZW1ibGVfbG5vdGFiIGluIGNvbXBpbGUuYyBzaG91bGQgbm90IChhcyB3YXMgYWN0dWFsbHkgZG9uZQotdW50aWwgMi4yKSBleHBhbmQgMzAwLCAzMDAgdG8KK3VudGlsIDIuMikgZXhwYW5kIDMwMCwgMjAwIHRvCiAgICAgMjU1LCAyNTUsIDQ1LCA0NSwKIGJ1dCB0bwotICAgIDI1NSwgMCwgNDUsIDI1NSwgMCwgNDUuCisgICAgMjU1LCAwLCA0NSwgMTI4LCAwLCA3Mi4KIAogVGhlIGFib3ZlIGlzIHN1ZmZpY2llbnQgdG8gcmVjb25zdHJ1Y3QgbGluZSBudW1iZXJzIGZvciB0cmFjZWJhY2tzLCBidXQgbm90IGZvcgogbGluZSB0cmFjaW5nLiAgVHJhY2luZyBpcyBoYW5kbGVkIGJ5IFB5Q29kZV9DaGVja0xpbmVOdW1iZXIoKSBpbiBjb2Rlb2JqZWN0LmMKQEAgLTkwLDE2ICs5NSwxNiBAQAogICAgICAgICAgICAgICA2IFBPUF9KVU1QX0lGX0ZBTFNFICAgICAgIDE3CiAKICAgMyAgICAgICAgICAgOSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAxMiBQUklOVF9JVEVNICAgICAgICAgIAorICAgICAgICAgICAgIDEyIFBSSU5UX0lURU0KIAotICA0ICAgICAgICAgIDEzIEJSRUFLX0xPT1AgICAgICAgICAgCisgIDQgICAgICAgICAgMTMgQlJFQUtfTE9PUAogICAgICAgICAgICAgIDE0IEpVTVBfQUJTT0xVVEUgICAgICAgICAgICAzCi0gICAgICAgID4+ICAgMTcgUE9QX0JMT0NLICAgICAgICAgICAKKyAgICAgICAgPj4gICAxNyBQT1BfQkxPQ0sKIAogICA2ICAgICAgICAgIDE4IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgyKQotICAgICAgICAgICAgIDIxIFBSSU5UX0lURU0gICAgICAgICAgCisgICAgICAgICAgICAgMjEgUFJJTlRfSVRFTQogICAgICAgICA+PiAgIDIyIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgIDI1IFJFVFVSTl9WQUxVRSAgICAgICAgCisgICAgICAgICAgICAgMjUgUkVUVVJOX1ZBTFVFCiAKIElmICdhJyBpcyBmYWxzZSwgZXhlY3V0aW9uIHdpbGwganVtcCB0byB0aGUgUE9QX0JMT0NLIGluc3RydWN0aW9uIGF0IG9mZnNldCAxNwogYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZSA0LCB3aGljaCBpcyB3cm9uZy4KZGlmZiAtLWdpdCBhL09iamVjdHMvbG9uZ29iamVjdC5jIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKaW5kZXggY2QwNGUzNi4uNmViNDBlNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9sb25nb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9sb25nb2JqZWN0LmMKQEAgLTM2OCw3ICszNjgsNyBAQAogLyogQ2hlY2tpbmcgZm9yIG92ZXJmbG93IGluIFB5TG9uZ19Bc0xvbmcgaXMgYSBQSVRBIHNpbmNlIEMgZG9lc24ndCBkZWZpbmUKICAqIGFueXRoaW5nIGFib3V0IHdoYXQgaGFwcGVucyB3aGVuIGEgc2lnbmVkIGludGVnZXIgb3BlcmF0aW9uIG92ZXJmbG93cywKICAqIGFuZCBzb21lIGNvbXBpbGVycyB0aGluayB0aGV5J3JlIGRvaW5nIHlvdSBhIGZhdm9yIGJ5IGJlaW5nICJjbGV2ZXIiCi0gKiB0aGVuLiAgVGhlIGJpdCBwYXR0ZXJuIGZvciB0aGUgbGFyZ2VzdCBwb3N0aXZlIHNpZ25lZCBsb25nIGlzCisgKiB0aGVuLiAgVGhlIGJpdCBwYXR0ZXJuIGZvciB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBzaWduZWQgbG9uZyBpcwogICogKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgsIGFuZCBmb3IgdGhlIHNtYWxsZXN0IG5lZ2F0aXZlIHNpZ25lZCBsb25nCiAgKiBpdCBpcyBhYnMoTE9OR19NSU4pLCB3aGljaCB3ZSBjb3VsZCB3cml0ZSAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4uCiAgKiBIb3dldmVyLCBzb21lIG90aGVyIGNvbXBpbGVycyB3YXJuIGFib3V0IGFwcGx5aW5nIHVuYXJ5IG1pbnVzIHRvIGFuCkBAIC05ODksMTYgKzk4OSwxMyBAQAogUHlMb25nX0Zyb21Wb2lkUHRyKHZvaWQgKnApCiB7CiAjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZykoUHlfdWludHB0cl90KXApOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZykodWludHB0cl90KXApOwogI2Vsc2UKIAotI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwotIyAgIGVycm9yICJQeUxvbmdfRnJvbVZvaWRQdHI6IHNpemVvZih2b2lkKikgPiBzaXplb2YobG9uZyksIGJ1dCBubyBsb25nIGxvbmciCi0jZW5kaWYKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAotIyAgIGVycm9yICJQeUxvbmdfRnJvbVZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKKyMgICBlcnJvciAiUHlMb25nX0Zyb21Wb2lkUHRyOiBzaXplb2YobG9uZyBsb25nKSA8IHNpemVvZih2b2lkKikiCiAjZW5kaWYKLSAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKFB5X3VpbnRwdHJfdClwKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCh1bnNpZ25lZCBsb25nIGxvbmcpKHVpbnRwdHJfdClwKTsKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HICovCiAKIH0KQEAgLTEwMTcsMTMgKzEwMTQsMTAgQEAKICAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2dik7CiAjZWxzZQogCi0jaWZuZGVmIEhBVkVfTE9OR19MT05HCi0jICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZih2b2lkKikgPiBzaXplb2YobG9uZyksIGJ1dCBubyBsb25nIGxvbmciCi0jZW5kaWYKICNpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAotIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2YoUFlfTE9OR19MT05HKSA8IHNpemVvZih2b2lkKikiCisjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZihsb25nIGxvbmcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgotICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGxvbmcgbG9uZyB4OwogCiAgICAgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCiAgICAgICAgIHggPSBQeUxvbmdfQXNMb25nTG9uZyh2dik7CkBAIC0xMDM3LDIyICsxMDMxLDIwIEBACiAgICAgcmV0dXJuICh2b2lkICopeDsKIH0KIAotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0KLS8qIEluaXRpYWwgUFlfTE9OR19MT05HIHN1cHBvcnQgYnkgQ2hyaXMgSGVyYm9ydGggKGNocmlzaEBxbnguY29tKSwgbGF0ZXIKKy8qIEluaXRpYWwgbG9uZyBsb25nIHN1cHBvcnQgYnkgQ2hyaXMgSGVyYm9ydGggKGNocmlzaEBxbnguY29tKSwgbGF0ZXIKICAqIHJld3JpdHRlbiB0byB1c2UgdGhlIG5ld2VyIFB5TG9uZ197QXMsRnJvbX1CeXRlQXJyYXkgQVBJLgogICovCiAKLSNkZWZpbmUgUFlfQUJTX0xMT05HX01JTiAoMC0odW5zaWduZWQgUFlfTE9OR19MT05HKVBZX0xMT05HX01JTikKKyNkZWZpbmUgUFlfQUJTX0xMT05HX01JTiAoMC0odW5zaWduZWQgbG9uZyBsb25nKVBZX0xMT05HX01JTikKIAotLyogQ3JlYXRlIGEgbmV3IGludCBvYmplY3QgZnJvbSBhIEMgUFlfTE9OR19MT05HIGludC4gKi8KKy8qIENyZWF0ZSBhIG5ldyBpbnQgb2JqZWN0IGZyb20gYSBDIGxvbmcgbG9uZyBpbnQuICovCiAKIFB5T2JqZWN0ICoKLVB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HIGl2YWwpCitQeUxvbmdfRnJvbUxvbmdMb25nKGxvbmcgbG9uZyBpdmFsKQogewogICAgIFB5TG9uZ09iamVjdCAqdjsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYWJzX2l2YWw7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7ICAvKiB1bnNpZ25lZCBzbyA+PiBkb2Vzbid0IHByb3BhZ2F0ZSBzaWduIGJpdCAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhYnNfaXZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCiAgICAgaW50IG5kaWdpdHMgPSAwOwogICAgIGludCBuZWdhdGl2ZSA9IDA7CiAKQEAgLTEwNjAsMTEgKzEwNTIsMTEgQEAKICAgICBpZiAoaXZhbCA8IDApIHsKICAgICAgICAgLyogYXZvaWQgc2lnbmVkIG92ZXJmbG93IG9uIG5lZ2F0aW9uOyAgc2VlIGNvbW1lbnRzCiAgICAgICAgICAgIGluIFB5TG9uZ19Gcm9tTG9uZyBhYm92ZS4gKi8KLSAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKSgtMS1pdmFsKSArIDE7CisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcgbG9uZykoLTEtaXZhbCkgKyAxOwogICAgICAgICBuZWdhdGl2ZSA9IDE7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpaXZhbDsKKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgbG9uZyBsb25nKWl2YWw7CiAgICAgfQogCiAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgpAQCAtMTA4OSwxOSArMTA4MSwxOSBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCi0vKiBDcmVhdGUgYSBuZXcgaW50IG9iamVjdCBmcm9tIGEgQyB1bnNpZ25lZCBQWV9MT05HX0xPTkcgaW50LiAqLworLyogQ3JlYXRlIGEgbmV3IGludCBvYmplY3QgZnJvbSBhIEMgdW5zaWduZWQgbG9uZyBsb25nIGludC4gKi8KIAogUHlPYmplY3QgKgotUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpdmFsKQorUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHVuc2lnbmVkIGxvbmcgbG9uZyBpdmFsKQogewogICAgIFB5TG9uZ09iamVjdCAqdjsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdDsKICAgICBpbnQgbmRpZ2l0cyA9IDA7CiAKICAgICBpZiAoaXZhbCA8IFB5TG9uZ19CQVNFKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKWl2YWwpOwogICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4gKi8KLSAgICB0ID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOworICAgIHQgPSAodW5zaWduZWQgbG9uZyBsb25nKWl2YWw7CiAgICAgd2hpbGUgKHQpIHsKICAgICAgICAgKytuZGlnaXRzOwogICAgICAgICB0ID4+PSBQeUxvbmdfU0hJRlQ7CkBAIC0xMTkwLDExICsxMTgyLDExIEBACiAvKiBHZXQgYSBDIGxvbmcgbG9uZyBpbnQgZnJvbSBhbiBpbnQgb2JqZWN0IG9yIGFueSBvYmplY3QgdGhhdCBoYXMgYW4KICAgIF9faW50X18gbWV0aG9kLiAgUmV0dXJuIC0xIGFuZCBzZXQgYW4gZXJyb3IgaWYgb3ZlcmZsb3cgb2NjdXJzLiAqLwogCi1QWV9MT05HX0xPTkcKK2xvbmcgbG9uZwogUHlMb25nX0FzTG9uZ0xvbmcoUHlPYmplY3QgKnZ2KQogewogICAgIFB5TG9uZ09iamVjdCAqdjsKLSAgICBQWV9MT05HX0xPTkcgYnl0ZXM7CisgICAgbG9uZyBsb25nIGJ5dGVzOwogICAgIGludCByZXM7CiAgICAgaW50IGRvX2RlY3JlZiA9IDA7IC8qIGlmIG5iX2ludCB3YXMgY2FsbGVkICovCiAKQEAgLTEyMzIsMzAgKzEyMjQsMzAgQEAKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgIH0KIAotICAgIC8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgUFlfTE9OR19MT05HIGluID8gOiBleHByZXNzaW9ucyAqLworICAgIC8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgbG9uZyBsb25nIGluID8gOiBleHByZXNzaW9ucyAqLwogICAgIGlmIChyZXMgPCAwKQotICAgICAgICByZXR1cm4gKFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgcmV0dXJuIChsb25nIGxvbmcpLTE7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gYnl0ZXM7CiB9CiAKLS8qIEdldCBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludCBmcm9tIGFuIGludCBvYmplY3QuCisvKiBHZXQgYSBDIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZnJvbSBhbiBpbnQgb2JqZWN0LgogICAgUmV0dXJuIC0xIGFuZCBzZXQgYW4gZXJyb3IgaWYgb3ZlcmZsb3cgb2NjdXJzLiAqLwogCi11bnNpZ25lZCBQWV9MT05HX0xPTkcKK3Vuc2lnbmVkIGxvbmcgbG9uZwogUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqdnYpCiB7CiAgICAgUHlMb25nT2JqZWN0ICp2OwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBieXRlczsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXM7CiAgICAgaW50IHJlczsKIAogICAgIGlmICh2diA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpLTE7CiAgICAgfQogICAgIGlmICghUHlMb25nX0NoZWNrKHZ2KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpLTE7CiAgICAgfQogCiAgICAgdiA9IChQeUxvbmdPYmplY3QqKXZ2OwpAQCAtMTI2Nyw5ICsxMjU5LDkgQEAKICAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0ZfTE9OR19MT05HLCBQWV9MSVRUTEVfRU5ESUFOLCAwKTsKIAotICAgIC8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgUFlfTE9OR19MT05HIGluID8gOiBleHByZXNzaW9ucyAqLworICAgIC8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgbG9uZyBsb25nIGluID8gOiBleHByZXNzaW9ucyAqLwogICAgIGlmIChyZXMgPCAwKQotICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylyZXM7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKXJlczsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBieXRlczsKIH0KQEAgLTEyNzcsMTEgKzEyNjksMTEgQEAKIC8qIEdldCBhIEMgdW5zaWduZWQgbG9uZyBpbnQgZnJvbSBhbiBpbnQgb2JqZWN0LCBpZ25vcmluZyB0aGUgaGlnaCBiaXRzLgogICAgUmV0dXJucyAtMSBhbmQgc2V0cyBhbiBlcnJvciBjb25kaXRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLiAqLwogCi1zdGF0aWMgdW5zaWduZWQgUFlfTE9OR19MT05HCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCiBfUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKnZ2KQogewogICAgIFB5TG9uZ09iamVjdCAqdjsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgaW50IHNpZ247CiAKQEAgLTEzMDcsMTEgKzEyOTksMTEgQEAKICAgICByZXR1cm4geCAqIHNpZ247CiB9CiAKLXVuc2lnbmVkIFBZX0xPTkdfTE9ORwordW5zaWduZWQgbG9uZyBsb25nCiBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlMb25nT2JqZWN0ICpsbzsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CiAKICAgICBpZiAob3AgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKQEAgLTEzMjQsNyArMTMxNiw3IEBACiAKICAgICBsbyA9IF9QeUxvbmdfRnJvbU5iSW50KG9wKTsKICAgICBpZiAobG8gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKS0xOwogCiAgICAgdmFsID0gX1B5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKChQeU9iamVjdCAqKWxvKTsKICAgICBQeV9ERUNSRUYobG8pOwpAQCAtMTM0MSwxMyArMTMzMywxMyBAQAogICAgSW4gdGhpcyBjYXNlICpvdmVyZmxvdyB3aWxsIGJlIDAuCiAqLwogCi1QWV9MT05HX0xPTkcKK2xvbmcgbG9uZwogUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqdnYsIGludCAqb3ZlcmZsb3cpCiB7CiAgICAgLyogVGhpcyB2ZXJzaW9uIGJ5IFRpbSBQZXRlcnMgKi8KICAgICBQeUxvbmdPYmplY3QgKnY7Ci0gICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHgsIHByZXY7Ci0gICAgUFlfTE9OR19MT05HIHJlczsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgeCwgcHJldjsKKyAgICBsb25nIGxvbmcgcmVzOwogICAgIFB5X3NzaXplX3QgaTsKICAgICBpbnQgc2lnbjsKICAgICBpbnQgZG9fZGVjcmVmID0gMDsgLyogaWYgbmJfaW50IHdhcyBjYWxsZWQgKi8KQEAgLTEzOTksOCArMTM5MSw4IEBACiAgICAgICAgIC8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gbG9uZyByZXF1aXJlcyBleHRyYQogICAgICAgICAgKiBjYXJlIChzZWUgY29tbWVudCBhYm92ZSkuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoeCA8PSAodW5zaWduZWQgUFlfTE9OR19MT05HKVBZX0xMT05HX01BWCkgewotICAgICAgICAgICAgcmVzID0gKFBZX0xPTkdfTE9ORyl4ICogc2lnbjsKKyAgICAgICAgaWYgKHggPD0gKHVuc2lnbmVkIGxvbmcgbG9uZylQWV9MTE9OR19NQVgpIHsKKyAgICAgICAgICAgIHJlcyA9IChsb25nIGxvbmcpeCAqIHNpZ247CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfTExPTkdfTUlOKSB7CiAgICAgICAgICAgICByZXMgPSBQWV9MTE9OR19NSU47CkBAIC0xNDE3LDggKzE0MDksNiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwotCiAjZGVmaW5lIENIRUNLX0JJTk9QKHYsdykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoIVB5TG9uZ19DaGVjayh2KSB8fCAhUHlMb25nX0NoZWNrKHcpKSAgICAgICBcCkBAIC0xNTgyLDEzICsxNTcyLDE2IEBACiBzdGF0aWMgaW50CiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKFB5T2JqZWN0ICphYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyICpieXRlc193cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipieXRlc19zdHIpCiB7CiAgICAgUHlMb25nT2JqZWN0ICpzY3JhdGNoLCAqYTsKLSAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpzdHIgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc2l6ZSwgc3RybGVuLCBzaXplX2EsIGksIGo7CiAgICAgZGlnaXQgKnBvdXQsICpwaW4sIHJlbSwgdGVucG93OwogICAgIGludCBuZWdhdGl2ZTsKKyAgICBpbnQgZDsKICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CiAKICAgICBhID0gKFB5TG9uZ09iamVjdCAqKWFhOwpAQCAtMTYwNiwxNSArMTU5OSwxNyBAQAogCiAgICAgICAgQnV0IGxvZzIoYSkgPCBzaXplX2EgKiBQeUxvbmdfU0hJRlQsIGFuZAogICAgICAgIGxvZzIoX1B5TG9uZ19ERUNJTUFMX0JBU0UpID0gbG9nMigxMCkgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDMuMyAqIF9QeUxvbmdfREVDSU1BTF9TSElGVAorCisgICAgICAgICBzaXplX2EgKiBQeUxvbmdfU0hJRlQgLyAoMy4zICogX1B5TG9uZ19ERUNJTUFMX1NISUZUKSA9CisgICAgICAgICAgICAgc2l6ZV9hICsgc2l6ZV9hIC8gZCA8IHNpemVfYSArIHNpemVfYSAvIGZsb29yKGQpLAorICAgICAgIHdoZXJlIGQgPSAoMy4zICogX1B5TG9uZ19ERUNJTUFMX1NISUZUKSAvCisgICAgICAgICAgICAgICAgIChQeUxvbmdfU0hJRlQgLSAzLjMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpCiAgICAgKi8KLSAgICBpZiAoc2l6ZV9hID4gUFlfU1NJWkVfVF9NQVggLyBQeUxvbmdfU0hJRlQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW50IHRvbyBsYXJnZSB0byBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvKiB0aGUgZXhwcmVzc2lvbiBzaXplX2EgKiBQeUxvbmdfU0hJRlQgaXMgbm93IHNhZmUgZnJvbSBvdmVyZmxvdyAqLwotICAgIHNpemUgPSAxICsgc2l6ZV9hICogUHlMb25nX1NISUZUIC8gKDMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpOworICAgIGQgPSAoMzMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpIC8KKyAgICAgICAgKDEwICogUHlMb25nX1NISUZUIC0gMzMgKiBfUHlMb25nX0RFQ0lNQUxfU0hJRlQpOworICAgIGFzc2VydChzaXplX2EgPCBQWV9TU0laRV9UX01BWC8yKTsKKyAgICBzaXplID0gMSArIHNpemVfYSArIHNpemVfYSAvIGQ7CiAgICAgc2NyYXRjaCA9IF9QeUxvbmdfTmV3KHNpemUpOwogICAgIGlmIChzY3JhdGNoID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE2NjIsNyArMTY1NywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGtpbmQgPSB3cml0ZXItPmtpbmQ7Ci0gICAgICAgIHN0ciA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAqYnl0ZXNfc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShieXRlc193cml0ZXIsICpieXRlc19zdHIsIHN0cmxlbik7CisgICAgICAgIGlmICgqYnl0ZXNfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgc3RyID0gUHlVbmljb2RlX05ldyhzdHJsZW4sICc5Jyk7CkBAIC0xNjczLDEzICsxNjc0LDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CiAgICAgfQogCi0jZGVmaW5lIFdSSVRFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAvKiBwb3V0WzBdIHRocm91Z2ggcG91dFtzaXplLTJdIGNvbnRyaWJ1dGUgZXhhY3RseSAgICAgICAgICAgIFwKICAgICAgICAgICAgX1B5TG9uZ19ERUNJTUFMX1NISUZUIGRpZ2l0cyBlYWNoICovICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZSAtIDE7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTY5OSw2ICsxNjk1LDE2IEBACiAgICAgICAgIC8qIGFuZCBzaWduICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAobmVnYXRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICotLXAgPSAnLSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUklURV9ESUdJVFMocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIGNoZWNrIHdlJ3ZlIGNvdW50ZWQgY29ycmVjdGx5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3MDgsMjUgKzE3MTQsMzQgQEAKICAgICB9IHdoaWxlICgwKQogCiAgICAgLyogZmlsbCB0aGUgc3RyaW5nIHJpZ2h0LXRvLWxlZnQgKi8KLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgeworICAgIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgY2hhciAqcCA9ICpieXRlc19zdHIgKyBzdHJsZW47CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgIHdyaXRlci0+cG9zICs9IHN0cmxlbjsKICAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICgqYnl0ZXNfc3RyKSArPSBzdHJsZW47CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHN0ciwgMSkpOwogICAgICAgICAqcF9vdXRwdXQgPSAoUHlPYmplY3QgKilzdHI7CkBAIC0xNzM4LDcgKzE3NTMsNyBAQAogbG9uZ190b19kZWNpbWFsX3N0cmluZyhQeU9iamVjdCAqYWEpCiB7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgaWYgKGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwoYWEsICZ2LCBOVUxMKSA9PSAtMSkKKyAgICBpZiAobG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChhYSwgJnYsIE5VTEwsIE5VTEwsIE5VTEwpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdjsKIH0KQEAgLTE3NTAsMTAgKzE3NjUsMTEgQEAKIAogc3RhdGljIGludAogbG9uZ19mb3JtYXRfYmluYXJ5KFB5T2JqZWN0ICphYSwgaW50IGJhc2UsIGludCBhbHRlcm5hdGUsCi0gICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9vdXRwdXQsIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqYnl0ZXNfd3JpdGVyLCBjaGFyICoqYnl0ZXNfc3RyKQogewogICAgIFB5TG9uZ09iamVjdCAqYSA9IChQeUxvbmdPYmplY3QgKilhYTsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzejsKICAgICBQeV9zc2l6ZV90IHNpemVfYTsKICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CkBAIC0xODEwLDcgKzE4MjYsMTEgQEAKICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN6LCAneCcpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBraW5kID0gd3JpdGVyLT5raW5kOwotICAgICAgICB2ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICpieXRlc19zdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKGJ5dGVzX3dyaXRlciwgKmJ5dGVzX3N0ciwgc3opOworICAgICAgICBpZiAoKmJ5dGVzX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdiA9IFB5VW5pY29kZV9OZXcoc3osICd4Jyk7CkBAIC0xODE5LDEzICsxODM5LDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHYpOwogICAgIH0KIAotI2RlZmluZSBXUklURV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCi0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChzaXplX2EgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJzAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xODYwLDMwICsxODc1LDUwIEBACiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChuZWdhdGl2ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJy0nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBhc3NlcnQocCA9PSAoKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zKSk7IFwKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFzc2VydChwID09IChUWVBFKilQeVVuaWNvZGVfREFUQSh2KSk7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCi0gICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKKyAgICBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgIGNoYXIgKnAgPSAqYnl0ZXNfc3RyICsgc3o7CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIGlmICh3cml0ZXIpIHsKICAgICAgICAgd3JpdGVyLT5wb3MgKz0gc3o7CiAgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAoKmJ5dGVzX3N0cikgKz0gc3o7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHYsIDEpKTsKICAgICAgICAgKnBfb3V0cHV0ID0gdjsKQEAgLTE4OTcsOSArMTkzMiw5IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBpbnQgZXJyOwogICAgIGlmIChiYXNlID09IDEwKQotICAgICAgICBlcnIgPSBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgJnN0ciwgTlVMTCk7CisgICAgICAgIGVyciA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBlbHNlCi0gICAgICAgIGVyciA9IGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIDEsICZzdHIsIE5VTEwpOworICAgICAgICBlcnIgPSBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCAxLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoZXJyID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gc3RyOwpAQCAtMTkxMSw5ICsxOTQ2LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSwgaW50IGFsdGVybmF0ZSkKIHsKICAgICBpZiAoYmFzZSA9PSAxMCkKLSAgICAgICAgcmV0dXJuIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosIE5VTEwsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Cit9CisKK2NoYXIqCitfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGludCBhbHRlcm5hdGUpCit7CisgICAgY2hhciAqc3RyMjsKKyAgICBpbnQgcmVzOworICAgIHN0cjIgPSBzdHI7CisgICAgaWYgKGJhc2UgPT0gMTApCisgICAgICAgIHJlcyA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwgJnN0cjIpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCAmc3RyMik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChzdHIyICE9IE5VTEwpOworICAgIHJldHVybiBzdHIyOwogfQogCiAvKiBUYWJsZSBvZiBkaWdpdCB2YWx1ZXMgZm9yIDgtYml0IHN0cmluZyAtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCkBAIC0yMzk0LDggKzI0NTEsMTEgQEAKICAgICAgICAgKnBkaXYgPSAoUHlMb25nT2JqZWN0KilQeUxvbmdfRnJvbUxvbmcoMCk7CiAgICAgICAgIGlmICgqcGRpdiA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9JTkNSRUYoYSk7Ci0gICAgICAgICpwcmVtID0gKFB5TG9uZ09iamVjdCAqKSBhOworICAgICAgICAqcHJlbSA9IChQeUxvbmdPYmplY3QgKilsb25nX2xvbmcoKFB5T2JqZWN0ICopYSk7CisgICAgICAgIGlmICgqcHJlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUigqcGRpdik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChzaXplX2IgPT0gMSkgewpAQCAtMjcwNSw2ICsyNzY1LDEzIEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CiAgICAgICAgIHJldHVybiAtMS4wOwogICAgIH0KKyAgICBpZiAoUHlfQUJTKFB5X1NJWkUodikpIDw9IDEpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoOyBzaW5nbGUgZGlnaXQgbG9uZyAoMzEgYml0cykgd2lsbCBjYXN0IHNhZmVseQorICAgICAgICAgICB0byBkb3VibGUuICBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIG9mIEZQL2xvbmcgb3BlcmF0aW9ucworICAgICAgICAgICBieSAyMCUuCisgICAgICAgICovCisgICAgICAgIHJldHVybiAoZG91YmxlKU1FRElVTV9WQUxVRSgoUHlMb25nT2JqZWN0ICopdik7CisgICAgfQogICAgIHggPSBfUHlMb25nX0ZyZXhwKChQeUxvbmdPYmplY3QgKil2LCAmZXhwb25lbnQpOwogICAgIGlmICgoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHx8IGV4cG9uZW50ID4gREJMX01BWF9FWFApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCkBAIC0yOTI5LDkgKzI5OTYsNyBAQAogICAgIH0KICAgICBhc3NlcnQoYm9ycm93ID09IDApOwogICAgIGlmIChzaWduIDwgMCkgewotICAgICAgICBfUHlMb25nX05lZ2F0ZSgmeik7Ci0gICAgICAgIGlmICh6ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfU0laRSh6KSA9IC1QeV9TSVpFKHopOwogICAgIH0KICAgICByZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CiB9CkBAIC0yOTUxLDggKzMwMTYsMTQgQEAKICAgICBpZiAoUHlfU0laRShhKSA8IDApIHsKICAgICAgICAgaWYgKFB5X1NJWkUoYikgPCAwKSB7CiAgICAgICAgICAgICB6ID0geF9hZGQoYSwgYik7Ci0gICAgICAgICAgICBpZiAoeiAhPSBOVUxMICYmIFB5X1NJWkUoeikgIT0gMCkKKyAgICAgICAgICAgIGlmICh6ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiB4X2FkZCByZWNlaXZlZCBhdCBsZWFzdCBvbmUgbXVsdGlwbGUtZGlnaXQgaW50LAorICAgICAgICAgICAgICAgICAgIGFuZCB0aHVzIHogbXVzdCBiZSBhIG11bHRpcGxlLWRpZ2l0IGludC4KKyAgICAgICAgICAgICAgICAgICBUaGF0IGFsc28gbWVhbnMgeiBpcyBub3QgYW4gZWxlbWVudCBvZgorICAgICAgICAgICAgICAgICAgIHNtYWxsX2ludHMsIHNvIG5lZ2F0aW5nIGl0IGluLXBsYWNlIGlzIHNhZmUuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5X1JFRkNOVCh6KSA9PSAxKTsKICAgICAgICAgICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICB6ID0geF9zdWIoYiwgYSk7CkBAIC0yOTgzLDggKzMwNTQsMTAgQEAKICAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOwotICAgICAgICBpZiAoeiAhPSBOVUxMICYmIFB5X1NJWkUoeikgIT0gMCkKKyAgICAgICAgaWYgKHogIT0gTlVMTCkgeworICAgICAgICAgICAgYXNzZXJ0KFB5X1NJWkUoeikgPT0gMCB8fCBQeV9SRUZDTlQoeikgPT0gMSk7CiAgICAgICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgaWYgKFB5X1NJWkUoYikgPCAwKQpAQCAtMzQwOCwxNyArMzQ4MSw3IEBACiAgICAgLyogZmFzdCBwYXRoIGZvciBzaW5nbGUtZGlnaXQgbXVsdGlwbGljYXRpb24gKi8KICAgICBpZiAoUHlfQUJTKFB5X1NJWkUoYSkpIDw9IDEgJiYgUHlfQUJTKFB5X1NJWkUoYikpIDw9IDEpIHsKICAgICAgICAgc3R3b2RpZ2l0cyB2ID0gKHN0d29kaWdpdHMpKE1FRElVTV9WQUxVRShhKSkgKiBNRURJVU1fVkFMVUUoYik7Ci0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl2KTsKLSNlbHNlCi0gICAgICAgIC8qIGlmIHdlIGRvbid0IGhhdmUgbG9uZyBsb25nIHRoZW4gd2UncmUgYWxtb3N0IGNlcnRhaW5seQotICAgICAgICAgICB1c2luZyAxNS1iaXQgZGlnaXRzLCBzbyB2IHdpbGwgZml0IGluIGEgbG9uZy4gIEluIHRoZQotICAgICAgICAgICB1bmxpa2VseSBldmVudCB0aGF0IHdlJ3JlIHVzaW5nIDMwLWJpdCBkaWdpdHMgb24gYSBwbGF0Zm9ybQotICAgICAgICAgICB3aXRob3V0IGxvbmcgbG9uZywgYSBsYXJnZSB2IHdpbGwganVzdCBjYXVzZSB1cyB0byBmYWxsCi0gICAgICAgICAgIHRocm91Z2ggdG8gdGhlIGdlbmVyYWwgbXVsdGlwbGljYXRpb24gY29kZSBiZWxvdy4gKi8KLSAgICAgICAgaWYgKHYgPj0gTE9OR19NSU4gJiYgdiA8PSBMT05HX01BWCkKLSAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdik7Ci0jZW5kaWYKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZyl2KTsKICAgICB9CiAKICAgICB6ID0ga19tdWwoYSwgYik7CkBAIC0zNDMxLDYgKzM0OTQsNTIgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAorLyogRmFzdCBtb2R1bG8gZGl2aXNpb24gZm9yIHNpbmdsZS1kaWdpdCBsb25ncy4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitmYXN0X21vZChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKK3sKKyAgICBzZGlnaXQgbGVmdCA9IGEtPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCByaWdodCA9IGItPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCBtb2Q7CisKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEpOworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShiKSkgPT0gMSk7CisKKyAgICBpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpKSB7CisgICAgICAgIC8qICdhJyBhbmQgJ2InIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICAgICAgbW9kID0gbGVmdCAlIHJpZ2h0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogRWl0aGVyICdhJyBvciAnYicgaXMgbmVnYXRpdmUuICovCisgICAgICAgIG1vZCA9IHJpZ2h0IC0gMSAtIChsZWZ0IC0gMSkgJSByaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKG1vZCAqIChzZGlnaXQpUHlfU0laRShiKSk7Cit9CisKKy8qIEZhc3QgZmxvb3IgZGl2aXNpb24gZm9yIHNpbmdsZS1kaWdpdCBsb25ncy4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitmYXN0X2Zsb29yX2RpdihQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKK3sKKyAgICBzZGlnaXQgbGVmdCA9IGEtPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCByaWdodCA9IGItPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCBkaXY7CisKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEpOworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShiKSkgPT0gMSk7CisKKyAgICBpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpKSB7CisgICAgICAgIC8qICdhJyBhbmQgJ2InIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICAgICAgZGl2ID0gbGVmdCAvIHJpZ2h0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogRWl0aGVyICdhJyBvciAnYicgaXMgbmVnYXRpdmUuICovCisgICAgICAgIGRpdiA9IC0xIC0gKGxlZnQgLSAxKSAvIHJpZ2h0OworICAgIH0KKworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoZGl2KTsKK30KKwogLyogVGhlIC8gYW5kICUgb3BlcmF0b3JzIGFyZSBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBkaXZtb2QoKS4KICAgIFRoZSBleHByZXNzaW9uIGEgbW9kIGIgaGFzIHRoZSB2YWx1ZSBhIC0gYipmbG9vcihhL2IpLgogICAgVGhlIGxvbmdfZGl2cmVtIGZ1bmN0aW9uIGdpdmVzIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aXNpb24gb2YKQEAgLTM0NTgsNiArMzU2NywzMCBAQAogewogICAgIFB5TG9uZ09iamVjdCAqZGl2LCAqbW9kOwogCisgICAgaWYgKFB5X0FCUyhQeV9TSVpFKHYpKSA9PSAxICYmIFB5X0FCUyhQeV9TSVpFKHcpKSA9PSAxKSB7CisgICAgICAgIC8qIEZhc3QgcGF0aCBmb3Igc2luZ2xlLWRpZ2l0IGxvbmdzICovCisgICAgICAgIGRpdiA9IE5VTEw7CisgICAgICAgIGlmIChwZGl2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRpdiA9IChQeUxvbmdPYmplY3QgKilmYXN0X2Zsb29yX2Rpdih2LCB3KTsKKyAgICAgICAgICAgIGlmIChkaXYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG1vZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtb2QgPSAoUHlMb25nT2JqZWN0ICopZmFzdF9tb2Qodiwgdyk7CisgICAgICAgICAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGRpdik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBtb2QgPSBtb2Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBkaXYgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogV2Ugb25seSB3YW50IHRvIHNldCBgKnBkaXZgIHdoZW4gYCpwbW9kYCBpcworICAgICAgICAgICAgICAgc2V0IHN1Y2Nlc3NmdWxseS4gKi8KKyAgICAgICAgICAgICpwZGl2ID0gZGl2OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpZiAobG9uZ19kaXZyZW0odiwgdywgJmRpdiwgJm1vZCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKChQeV9TSVpFKG1vZCkgPCAwICYmIFB5X1NJWkUodykgPiAwKSB8fApAQCAtMzUwMiw2ICszNjM1LDExIEBACiAgICAgUHlMb25nT2JqZWN0ICpkaXY7CiAKICAgICBDSEVDS19CSU5PUChhLCBiKTsKKworICAgIGlmIChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSAmJiBQeV9BQlMoUHlfU0laRShiKSkgPT0gMSkgeworICAgICAgICByZXR1cm4gZmFzdF9mbG9vcl9kaXYoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYik7CisgICAgfQorCiAgICAgaWYgKGxfZGl2bW9kKChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIsICZkaXYsIE5VTEwpIDwgMCkKICAgICAgICAgZGl2ID0gTlVMTDsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGl2OwpAQCAtMzc0MSw5ICszODc5LDkgQEAKICAgICAvKiBSb3VuZCBieSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIGxvdyBkaWdpdCBvZiB4LiAqLwogICAgIG1hc2sgPSAoZGlnaXQpMSA8PCAoZXh0cmFfYml0cyAtIDEpOwogICAgIGxvdyA9IHgtPm9iX2RpZ2l0WzBdIHwgaW5leGFjdDsKLSAgICBpZiAobG93ICYgbWFzayAmJiBsb3cgJiAoMyptYXNrLTEpKQorICAgIGlmICgobG93ICYgbWFzaykgJiYgKGxvdyAmICgzVSptYXNrLTFVKSkpCiAgICAgICAgIGxvdyArPSBtYXNrOwotICAgIHgtPm9iX2RpZ2l0WzBdID0gbG93ICYgfihtYXNrLTFVKTsKKyAgICB4LT5vYl9kaWdpdFswXSA9IGxvdyAmIH4oMlUqbWFzay0xVSk7CiAKICAgICAvKiBDb252ZXJ0IHggdG8gYSBkb3VibGUgZHg7IHRoZSBjb252ZXJzaW9uIGlzIGV4YWN0LiAqLwogICAgIGR4ID0geC0+b2JfZGlnaXRbLS14X3NpemVdOwpAQCAtMzc3Nyw2ICszOTE1LDEwIEBACiAKICAgICBDSEVDS19CSU5PUChhLCBiKTsKIAorICAgIGlmIChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSAmJiBQeV9BQlMoUHlfU0laRShiKSkgPT0gMSkgeworICAgICAgICByZXR1cm4gZmFzdF9tb2QoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYik7CisgICAgfQorCiAgICAgaWYgKGxfZGl2bW9kKChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIsIE5VTEwsICZtb2QpIDwgMCkKICAgICAgICAgbW9kID0gTlVMTDsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopbW9kOwpAQCAtNDAxMSw4ICs0MTUzLDEwIEBACiAgICAgUHlfREVDUkVGKHcpOwogICAgIGlmICh4ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X1NJWkUoeCkgPSAtKFB5X1NJWkUoeCkpOwotICAgIHJldHVybiAoUHlPYmplY3QgKiltYXliZV9zbWFsbF9sb25nKHgpOworICAgIF9QeUxvbmdfTmVnYXRlKCZ4KTsKKyAgICAvKiBObyBuZWVkIGZvciBtYXliZV9zbWFsbF9sb25nIGhlcmUsIHNpbmNlIGFueSBzbWFsbAorICAgICAgIGxvbmdzIHdpbGwgaGF2ZSBiZWVuIGNhdWdodCBpbiB0aGUgUHlfU0laRSA8PSAxIGZhc3QgcGF0aC4gKi8KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopeDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQxMTcsNiArNDI2MSwxMSBAQAogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKworICAgIGlmIChQeV9TSVpFKGEpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKKyAgICB9CisKICAgICAvKiB3b3Jkc2hpZnQsIHJlbXNoaWZ0ID0gZGl2bW9kKHNoaWZ0YnksIFB5TG9uZ19TSElGVCkgKi8KICAgICB3b3Jkc2hpZnQgPSBzaGlmdGJ5IC8gUHlMb25nX1NISUZUOwogICAgIHJlbXNoaWZ0ICA9IHNoaWZ0YnkgLSB3b3Jkc2hpZnQgKiBQeUxvbmdfU0hJRlQ7CkBAIC00NTAxLDcgKzQ2NTAsNyBAQAogICAgIC8qIGEgZml0cyBpbnRvIGEgbG9uZywgc28gYiBtdXN0IHRvbyAqLwogICAgIHggPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWEpOwogICAgIHkgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWIpOwotI2VsaWYgZGVmaW5lZChQWV9MT05HX0xPTkcpICYmIFBZX0xMT05HX01BWCA+PiBQeUxvbmdfU0hJRlQgPj4gUHlMb25nX1NISUZUCisjZWxpZiBQWV9MTE9OR19NQVggPj4gUHlMb25nX1NISUZUID4+IFB5TG9uZ19TSElGVAogICAgIHggPSBQeUxvbmdfQXNMb25nTG9uZygoUHlPYmplY3QgKilhKTsKICAgICB5ID0gUHlMb25nX0FzTG9uZ0xvbmcoKFB5T2JqZWN0ICopYik7CiAjZWxzZQpAQCAtNDUyMCw3ICs0NjY5LDcgQEAKICAgICB9CiAjaWYgTE9OR19NQVggPj4gUHlMb25nX1NISUZUID4+IFB5TG9uZ19TSElGVAogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoeCk7Ci0jZWxpZiBkZWZpbmVkKFBZX0xPTkdfTE9ORykgJiYgUFlfTExPTkdfTUFYID4+IFB5TG9uZ19TSElGVCA+PiBQeUxvbmdfU0hJRlQKKyNlbGlmIFBZX0xMT05HX01BWCA+PiBQeUxvbmdfU0hJRlQgPj4gUHlMb25nX1NISUZUCiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CiAjZWxzZQogIyBlcnJvciAiX1B5TG9uZ19HQ0QiCmRpZmYgLS1naXQgYS9PYmplY3RzL21lbW9yeW9iamVjdC5jIGIvT2JqZWN0cy9tZW1vcnlvYmplY3QuYwppbmRleCAxMDE2MmNiLi4wNzQwMmQyIDEwMDY0NAotLS0gYS9PYmplY3RzL21lbW9yeW9iamVjdC5jCisrKyBiL09iamVjdHMvbWVtb3J5b2JqZWN0LmMKQEAgLTExMTEsOSArMTExMSw3IEBACiAgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOiBzaXplID0gc2l6ZW9mKHNob3J0KTsgYnJlYWs7CiAgICAgY2FzZSAnaSc6IGNhc2UgJ0knOiBzaXplID0gc2l6ZW9mKGludCk7IGJyZWFrOwogICAgIGNhc2UgJ2wnOiBjYXNlICdMJzogc2l6ZSA9IHNpemVvZihsb25nKTsgYnJlYWs7Ci0gICAgI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgY2FzZSAncSc6IGNhc2UgJ1EnOiBzaXplID0gc2l6ZW9mKFBZX0xPTkdfTE9ORyk7IGJyZWFrOwotICAgICNlbmRpZgorICAgIGNhc2UgJ3EnOiBjYXNlICdRJzogc2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOyBicmVhazsKICAgICBjYXNlICduJzogY2FzZSAnTic6IHNpemUgPSBzaXplb2YoUHlfc3NpemVfdCk7IGJyZWFrOwogICAgIGNhc2UgJ2YnOiBzaXplID0gc2l6ZW9mKGZsb2F0KTsgYnJlYWs7CiAgICAgY2FzZSAnZCc6IHNpemUgPSBzaXplb2YoZG91YmxlKTsgYnJlYWs7CkBAIC0xMTMzLDcgKzExMzEsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotUHlfTE9DQUxfSU5MSU5FKGNoYXIgKikKK1B5X0xPQ0FMX0lOTElORShjb25zdCBjaGFyICopCiBnZXRfbmF0aXZlX2ZtdHN0cihjb25zdCBjaGFyICpmbXQpCiB7CiAgICAgaW50IGF0ID0gMDsKQEAgLTExNTgsMTAgKzExNTYsOCBAQAogICAgIGNhc2UgJ0knOiBSRVRVUk4oIkkiKTsKICAgICBjYXNlICdsJzogUkVUVVJOKCJsIik7CiAgICAgY2FzZSAnTCc6IFJFVFVSTigiTCIpOwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgJ3EnOiBSRVRVUk4oInEiKTsKICAgICBjYXNlICdRJzogUkVUVVJOKCJRIik7Ci0gICAgI2VuZGlmCiAgICAgY2FzZSAnbic6IFJFVFVSTigibiIpOwogICAgIGNhc2UgJ04nOiBSRVRVUk4oIk4iKTsKICAgICBjYXNlICdmJzogUkVUVVJOKCJmIik7CkBAIC0xMjIxLDcgKzEyMTcsNyBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICB2aWV3LT5mb3JtYXQgPSBnZXRfbmF0aXZlX2ZtdHN0cihQeUJ5dGVzX0FTX1NUUklORyhhc2NpaWZtdCkpOworICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopZ2V0X25hdGl2ZV9mbXRzdHIoUHlCeXRlc19BU19TVFJJTkcoYXNjaWlmbXQpKTsKICAgICBpZiAodmlldy0+Zm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgLyogTk9UX1JFQUNIRUQ6IGdldF9uYXRpdmVfZm10Y2hhcigpIGFscmVhZHkgdmFsaWRhdGVzIHRoZSBmb3JtYXQuICovCiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC0xNTgxLDEyICsxNTc3LDExIEBACiAgICAgcmV0dXJuIGx1OwogfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLXN0YXRpYyBQWV9MT05HX0xPTkcKK3N0YXRpYyBsb25nIGxvbmcKIHB5bG9uZ19hc19sbGQoUHlPYmplY3QgKml0ZW0pCiB7CiAgICAgUHlPYmplY3QgKnRtcDsKLSAgICBQWV9MT05HX0xPTkcgbGxkOworICAgIGxvbmcgbG9uZyBsbGQ7CiAKICAgICB0bXAgPSBQeU51bWJlcl9JbmRleChpdGVtKTsKICAgICBpZiAodG1wID09IE5VTEwpCkBAIC0xNTk3LDIxICsxNTkyLDIwIEBACiAgICAgcmV0dXJuIGxsZDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIFBZX0xPTkdfTE9ORworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZwogcHlsb25nX2FzX2xsdShQeU9iamVjdCAqaXRlbSkKIHsKICAgICBQeU9iamVjdCAqdG1wOwotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBsbHU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGxsdTsKIAogICAgIHRtcCA9IFB5TnVtYmVyX0luZGV4KGl0ZW0pOwogICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKS0xOwogCiAgICAgbGx1ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh0bXApOwogICAgIFB5X0RFQ1JFRih0bXApOwogICAgIHJldHVybiBsbHU7CiB9Ci0jZW5kaWYKIAogc3RhdGljIFB5X3NzaXplX3QKIHB5bG9uZ19hc196ZChQeU9iamVjdCAqaXRlbSkKQEAgLTE2NTksMTAgKzE2NTMsMTAgQEAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogdW5wYWNrX3NpbmdsZShjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmZtdCkKIHsKLSAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgbGx1OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsbHU7CiAgICAgdW5zaWduZWQgbG9uZyBsdTsKICAgICBzaXplX3QgenU7Ci0gICAgUFlfTE9OR19MT05HIGxsZDsKKyAgICBsb25nIGxvbmcgbGxkOwogICAgIGxvbmcgbGQ7CiAgICAgUHlfc3NpemVfdCB6ZDsKICAgICBkb3VibGUgZDsKQEAgLTE2OTEsMTAgKzE2ODUsOCBAQAogICAgIGNhc2UgJ0wnOiBVTlBBQ0tfU0lOR0xFKGx1LCBwdHIsIHVuc2lnbmVkIGxvbmcpOyBnb3RvIGNvbnZlcnRfbHU7CiAKICAgICAvKiBuYXRpdmUgNjQtYml0ICovCi0gICAgI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgY2FzZSAncSc6IFVOUEFDS19TSU5HTEUobGxkLCBwdHIsIFBZX0xPTkdfTE9ORyk7IGdvdG8gY29udmVydF9sbGQ7Ci0gICAgY2FzZSAnUSc6IFVOUEFDS19TSU5HTEUobGx1LCBwdHIsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyk7IGdvdG8gY29udmVydF9sbHU7Ci0gICAgI2VuZGlmCisgICAgY2FzZSAncSc6IFVOUEFDS19TSU5HTEUobGxkLCBwdHIsIGxvbmcgbG9uZyk7IGdvdG8gY29udmVydF9sbGQ7CisgICAgY2FzZSAnUSc6IFVOUEFDS19TSU5HTEUobGx1LCBwdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyk7IGdvdG8gY29udmVydF9sbHU7CiAKICAgICAvKiBzc2l6ZV90IGFuZCBzaXplX3QgKi8KICAgICBjYXNlICduJzogVU5QQUNLX1NJTkdMRSh6ZCwgcHRyLCBQeV9zc2l6ZV90KTsgZ290byBjb252ZXJ0X3pkOwpAQCAtMTc1NSwxMCArMTc0NywxMCBAQAogc3RhdGljIGludAogcGFja19zaW5nbGUoY2hhciAqcHRyLCBQeU9iamVjdCAqaXRlbSwgY29uc3QgY2hhciAqZm10KQogewotICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBsbHU7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGxsdTsKICAgICB1bnNpZ25lZCBsb25nIGx1OwogICAgIHNpemVfdCB6dTsKLSAgICBQWV9MT05HX0xPTkcgbGxkOworICAgIGxvbmcgbG9uZyBsbGQ7CiAgICAgbG9uZyBsZDsKICAgICBQeV9zc2l6ZV90IHpkOwogICAgIGRvdWJsZSBkOwpAQCAtMTgwNiwyMCArMTc5OCwxOCBAQAogICAgICAgICBicmVhazsKIAogICAgIC8qIG5hdGl2ZSA2NC1iaXQgKi8KLSAgICAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICBjYXNlICdxJzoKICAgICAgICAgbGxkID0gcHlsb25nX2FzX2xsZChpdGVtKTsKICAgICAgICAgaWYgKGxsZCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBlcnJfb2NjdXJyZWQ7Ci0gICAgICAgIFBBQ0tfU0lOR0xFKHB0ciwgbGxkLCBQWV9MT05HX0xPTkcpOworICAgICAgICBQQUNLX1NJTkdMRShwdHIsIGxsZCwgbG9uZyBsb25nKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAnUSc6CiAgICAgICAgIGxsdSA9IHB5bG9uZ19hc19sbHUoaXRlbSk7Ci0gICAgICAgIGlmIChsbHUgPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBpZiAobGx1ID09ICh1bnNpZ25lZCBsb25nIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIGdvdG8gZXJyX29jY3VycmVkOwotICAgICAgICBQQUNLX1NJTkdMRShwdHIsIGxsdSwgdW5zaWduZWQgUFlfTE9OR19MT05HKTsKKyAgICAgICAgUEFDS19TSU5HTEUocHRyLCBsbHUsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CiAgICAgICAgIGJyZWFrOwotICAgICNlbmRpZgogCiAgICAgLyogc3NpemVfdCBhbmQgc2l6ZV90ICovCiAgICAgY2FzZSAnbic6CkBAIC0yNjU2LDEwICsyNjQ2LDggQEAKICAgICBjYXNlICdMJzogQ01QX1NJTkdMRShwLCBxLCB1bnNpZ25lZCBsb25nKTsgcmV0dXJuIGVxdWFsOwogCiAgICAgLyogbmF0aXZlIDY0LWJpdCAqLwotICAgICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGNhc2UgJ3EnOiBDTVBfU0lOR0xFKHAsIHEsIFBZX0xPTkdfTE9ORyk7IHJldHVybiBlcXVhbDsKLSAgICBjYXNlICdRJzogQ01QX1NJTkdMRShwLCBxLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpOyByZXR1cm4gZXF1YWw7Ci0gICAgI2VuZGlmCisgICAgY2FzZSAncSc6IENNUF9TSU5HTEUocCwgcSwgbG9uZyBsb25nKTsgcmV0dXJuIGVxdWFsOworICAgIGNhc2UgJ1EnOiBDTVBfU0lOR0xFKHAsIHEsIHVuc2lnbmVkIGxvbmcgbG9uZyk7IHJldHVybiBlcXVhbDsKIAogICAgIC8qIHNzaXplX3QgYW5kIHNpemVfdCAqLwogICAgIGNhc2UgJ24nOiBDTVBfU0lOR0xFKHAsIHEsIFB5X3NzaXplX3QpOyByZXR1cm4gZXF1YWw7CmRpZmYgLS1naXQgYS9PYmplY3RzL21ldGhvZG9iamVjdC5jIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwppbmRleCA5NDYzNTdmLi4zOTRmMWY0IDEwMDY0NAotLS0gYS9PYmplY3RzL21ldGhvZG9iamVjdC5jCisrKyBiL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKQEAgLTE0NSw2ICsxNDUsMTA0IEBACiAgICAgcmV0dXJuIF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHJlcywgTlVMTCk7CiB9CiAKK1B5T2JqZWN0ICoKK19QeUNGdW5jdGlvbl9GYXN0Q2FsbERpY3QoUHlPYmplY3QgKmZ1bmNfb2JqLCBQeU9iamVjdCAqKmFyZ3MsIFB5X3NzaXplX3QgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmZ1bmMgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmNfb2JqOworICAgIFB5Q0Z1bmN0aW9uIG1ldGggPSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYyk7CisgICAgUHlPYmplY3QgKnNlbGYgPSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBmbGFnczsKKworICAgIGFzc2VydChmdW5jICE9IE5VTEwpOworICAgIGFzc2VydChuYXJncyA+PSAwKTsKKyAgICBhc3NlcnQobmFyZ3MgPT0gMCB8fCBhcmdzICE9IE5VTEwpOworICAgIGFzc2VydChrd2FyZ3MgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dhcmdzKSk7CisKKyAgICAvKiBfUHlDRnVuY3Rpb25fRmFzdENhbGxEaWN0KCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwKKyAgICAgICBiZWNhdXNlIGl0IG1heSBjbGVhciBpdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgYW5kIHNvIHRoZQorICAgICAgIGNhbGxlciBsb3NlcyBpdHMgZXhjZXB0aW9uICovCisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKKworICAgIGZsYWdzID0gUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpICYgfihNRVRIX0NMQVNTIHwgTUVUSF9TVEFUSUMgfCBNRVRIX0NPRVhJU1QpOworCisgICAgc3dpdGNoIChmbGFncykKKyAgICB7CisgICAgY2FzZSBNRVRIX05PQVJHUzoKKyAgICAgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hcmdzICE9IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJXpkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgZnVuYy0+bV9tbC0+bWxfbmFtZSwgbmFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSAoKm1ldGgpIChzZWxmLCBOVUxMKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FVEhfTzoKKyAgICAgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hcmdzICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICBmdW5jLT5tX21sLT5tbF9uYW1lLCBuYXJncyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9ICgqbWV0aCkgKHNlbGYsIGFyZ3NbMF0pOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUVUSF9WQVJBUkdTOgorICAgIGNhc2UgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUzoKKyAgICB7CisgICAgICAgIC8qIFNsb3ctcGF0aDogY3JlYXRlIGEgdGVtcG9yYXJ5IHR1cGxlICovCisgICAgICAgIFB5T2JqZWN0ICp0dXBsZTsKKworICAgICAgICBpZiAoIShmbGFncyAmIE1FVEhfS0VZV09SRFMpICYmIGt3YXJncyAhPSBOVUxMICYmIFB5RGljdF9TaXplKGt3YXJncykgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPm1fbWwtPm1sX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB0dXBsZSA9IF9QeVN0YWNrX0FzVHVwbGUoYXJncywgbmFyZ3MpOworICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX0tFWVdPUkRTKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKihQeUNGdW5jdGlvbldpdGhLZXl3b3JkcyltZXRoKSAoc2VsZiwgdHVwbGUsIGt3YXJncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKm1ldGgpIChzZWxmLCB0dXBsZSk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBjYWxsIGZsYWdzIGluIFB5Q0Z1bmN0aW9uX0NhbGwuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJNRVRIX09MREFSR1MgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmVzdWx0ID0gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoZnVuY19vYmosIHJlc3VsdCwgTlVMTCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvKiBNZXRob2RzICh0aGUgc3RhbmRhcmQgYnVpbHQtaW4gbWV0aG9kcywgdGhhdCBpcykgKi8KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCmluZGV4IGFjMDc2NDIuLmQ4OGIwNmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwpAQCAtNDUwLDggKzQ1MCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3Q7Ci0gICAgaWYgKGQgPT0gTlVMTCkKLSAgICAgICAgKChQeU1vZHVsZU9iamVjdCAqKW0pIC0+IG1kX2RpY3QgPSBkID0gUHlEaWN0X05ldygpOworICAgIGFzc2VydChkICE9IE5VTEwpOwogICAgIHJldHVybiBkOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCA4MDI0ODg5Li41NTk3OTRmIDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTEwOSw2ICsxMDksMTUgQEAKIGR1bXBfY291bnRzKEZJTEUqIGYpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0cDsKKyAgICBQeU9iamVjdCAqeG9wdGlvbnMsICp2YWx1ZTsKKyAgICBfUHlfSURFTlRJRklFUihzaG93YWxsb2Njb3VudCk7CisKKyAgICB4b3B0aW9ucyA9IFB5U3lzX0dldFhPcHRpb25zKCk7CisgICAgaWYgKHhvcHRpb25zID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICB2YWx1ZSA9IF9QeURpY3RfR2V0SXRlbUlkKHhvcHRpb25zLCAmUHlJZF9zaG93YWxsb2Njb3VudCk7CisgICAgaWYgKHZhbHVlICE9IFB5X1RydWUpCisgICAgICAgIHJldHVybjsKIAogICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQogICAgICAgICBmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCkBAIC02NDQsNyArNjUzLDcgQEAKIC8qIE1hcCByaWNoIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIHRoZWlyIHN3YXBwZWQgdmVyc2lvbiwgZS5nLiBMVCA8LS0+IEdUICovCiBpbnQgX1B5X1N3YXBwZWRPcFtdID0ge1B5X0dULCBQeV9HRSwgUHlfRVEsIFB5X05FLCBQeV9MVCwgUHlfTEV9OwogCi1zdGF0aWMgY2hhciAqb3BzdHJpbmdzW10gPSB7IjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHN0cmluZ3NbXSA9IHsiPCIsICI8PSIsICI9PSIsICIhPSIsICI+IiwgIj49In07CiAKIC8qIFBlcmZvcm0gYSByaWNoIGNvbXBhcmlzb24sIHJhaXNpbmcgVHlwZUVycm9yIHdoZW4gdGhlIHJlcXVlc3RlZCBjb21wYXJpc29uCiAgICBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiAqLwpAQCAtNjg2LDExICs2OTUsMTAgQEAKICAgICAgICAgcmVzID0gKHYgIT0gdykgPyBQeV9UcnVlIDogUHlfRmFsc2U7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFhYWCBTcGVjaWFsLWNhc2UgTm9uZSBzbyBpdCBkb2Vzbid0IHNob3cgYXMgTm9uZVR5cGUoKSAqLwogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgInVub3JkZXJhYmxlIHR5cGVzOiAlLjEwMHMoKSAlcyAlLjEwMHMoKSIsCi0gICAgICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIiclcycgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnJS4xMDBzJyBhbmQgJyUuMTAwcyciLAogICAgICAgICAgICAgICAgICAgICAgb3BzdHJpbmdzW29wXSwKKyAgICAgICAgICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTA0MSw4ICsxMDQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgUHlfSU5DUkVGKG5hbWUpOwogCiAgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQpAQCAtMTA1MCwxMCArMTA1NywxMCBAQAogICAgIH0KIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCiAgICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7CiAgICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CiAgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CkBAIC0xMDczLDggKzEwODAsOSBAQAogICAgICAgICAgICAgICAgIGlmICh0c2l6ZSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHRzaXplID0gLXRzaXplOwogICAgICAgICAgICAgICAgIHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc2l6ZSA8PSBQWV9TU0laRV9UX01BWCk7CiAKLSAgICAgICAgICAgICAgICBkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7CisgICAgICAgICAgICAgICAgZGljdG9mZnNldCArPSAoUHlfc3NpemVfdClzaXplOwogICAgICAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwogICAgICAgICAgICAgfQpAQCAtMTE0MiwxMiArMTE1MCwxMSBAQAogICAgIFB5X0lOQ1JFRihuYW1lKTsKIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCi0gICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7Ci0gICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CisgICAgICAgIGlmIChmICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOwogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CkBAIC0xMTU1LDQwICsxMTYyLDMyIEBACiAKICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CiAgICAgICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotICAgICAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXMgPSBfUHlPYmplY3REaWN0X1NldEl0ZW0oUHlfVFlQRShvYmopLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclVSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyVVJyBpcyByZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgIH0KKyAgICAgICAgcmVzID0gX1B5T2JqZWN0RGljdF9TZXRJdGVtKHRwLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7CiAgICAgfQotICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICBlbHNlIHsKICAgICAgICAgUHlfSU5DUkVGKGRpY3QpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKICAgICAgICAgICAgIHJlcyA9IFB5RGljdF9EZWxJdGVtKGRpY3QsIG5hbWUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXMgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKLSAgICAgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQorICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwogCi0gICAgaWYgKGYgIT0gTlVMTCkgewotICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIGlmIChkZXNjciA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJVUnIiwKLSAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGF0dHJpYnV0ZSAnJVUnIGlzIHJlYWQtb25seSIsCi0gICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKICAgZG9uZToKICAgICBQeV9YREVDUkVGKGRlc2NyKTsKICAgICBQeV9ERUNSRUYobmFtZSk7CkBAIC0xMjA0LDcgKzEyMDMsNyBAQAogaW50CiBQeU9iamVjdF9HZW5lcmljU2V0RGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKQEAgLTEyMjAsMTAgKzEyMTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGRpY3QgPSAqZGljdHB0cjsKLSAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICAqZGljdHB0ciA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9YU0VUUkVGKCpkaWN0cHRyLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCA3Y2M4ODlmLi5jMjAxZGExIDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0xLDE3ICsxLDM4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKworLyogRGVmaW5lZCBpbiB0cmFjZW1hbGxvYy5jICovCitleHRlcm4gdm9pZCBfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cik7CisKKwogLyogUHl0aG9uJ3MgbWFsbG9jIHdyYXBwZXJzIChzZWUgcHltZW0uaCkgKi8KIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHICAgLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLworLyoKKyAqIEJhc2ljIHR5cGVzCisgKiBJIGRvbid0IGNhcmUgaWYgdGhlc2UgYXJlIGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPiBvciBlbHNld2hlcmUuIEF4aW9tLgorICovCisjdW5kZWYgIHVjaGFyCisjZGVmaW5lIHVjaGFyICAgdW5zaWduZWQgY2hhciAgIC8qIGFzc3VtaW5nID09IDggYml0cyAgKi8KKworI3VuZGVmICB1aW50CisjZGVmaW5lIHVpbnQgICAgdW5zaWduZWQgaW50ICAgIC8qIGFzc3VtaW5nID49IDE2IGJpdHMgKi8KKworI3VuZGVmIHVwdHIKKyNkZWZpbmUgdXB0ciAgICB1aW50cHRyX3QKKwogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSYXdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z1Jhd0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKKwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKIHN0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwotc3RhdGljIHZvaWQgX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnApOwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKIAogc3RhdGljIHZvaWQgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CiBzdGF0aWMgdm9pZCBfUHlNZW1fRGVidWdDaGVja0FkZHJlc3MoY2hhciBhcGlfaWQsIGNvbnN0IHZvaWQgKnApOwotI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpICAvKiBDbGFuZyAqLwogICNpZiBfX2hhc19mZWF0dXJlKGFkZHJlc3Nfc2FuaXRpemVyKSAgLyogaXMgQVNBTiBlbmFibGVkPyAqLwpAQCAtMTQ1LDkgKzE2Niw4IEBACiAjZWxzZQogIyAgZGVmaW5lIFBZT0JKX0ZVTkNTIFBZUkFXX0ZVTkNTCiAjZW5kaWYKLSNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlSQVdfRlVOQ1MKKyNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlPQkpfRlVOQ1MKIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogV2UgdGFnIGVhY2ggYmxvY2sgd2l0aCBhbiBBUEkgSUQgaW4gb3JkZXIgdG8gdGFnIEFQSSB2aW9sYXRpb25zICovCiAgICAgY2hhciBhcGlfaWQ7CkBAIC0xNjMsMTkgKzE4MywyMSBAQAogICAgIHsnbycsIHtOVUxMLCBQWU9CSl9GVU5DU319CiAgICAgfTsKIAotI2RlZmluZSBQWURCR19GVU5DUyBfUHlNZW1fRGVidWdNYWxsb2MsIF9QeU1lbV9EZWJ1Z0NhbGxvYywgX1B5TWVtX0RlYnVnUmVhbGxvYywgX1B5TWVtX0RlYnVnRnJlZQotI2VuZGlmCisjZGVmaW5lIFBZUkFXREJHX0ZVTkNTIFwKKyAgICBfUHlNZW1fRGVidWdSYXdNYWxsb2MsIF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYywgX1B5TWVtX0RlYnVnUmF3UmVhbGxvYywgX1B5TWVtX0RlYnVnUmF3RnJlZQorI2RlZmluZSBQWURCR19GVU5DUyBcCisgICAgX1B5TWVtX0RlYnVnTWFsbG9jLCBfUHlNZW1fRGVidWdDYWxsb2MsIF9QeU1lbV9EZWJ1Z1JlYWxsb2MsIF9QeU1lbV9EZWJ1Z0ZyZWUKIAogc3RhdGljIFB5TWVtQWxsb2NhdG9yRXggX1B5TWVtX1JhdyA9IHsKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgICZfUHlNZW1fRGVidWcucmF3LCBQWURCR19GVU5DUworI2lmZGVmIFB5X0RFQlVHCisgICAgJl9QeU1lbV9EZWJ1Zy5yYXcsIFBZUkFXREJHX0ZVTkNTCiAjZWxzZQogICAgIE5VTEwsIFBZUkFXX0ZVTkNTCiAjZW5kaWYKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlNZW0gPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcubWVtLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU1FTV9GVU5DUwpAQCAtMTgzLDE2ICsyMDUsNzYgQEAKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlPYmplY3QgPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcub2JqLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU9CSl9GVU5DUwogI2VuZGlmCiAgICAgfTsKIAoraW50CitfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKGNvbnN0IGNoYXIgKm9wdCkKK3sKKyAgICBpZiAob3B0ID09IE5VTEwgfHwgKm9wdCA9PSAnXDAnKSB7CisgICAgICAgIC8qIFBZVEhPTk1BTExPQyBpcyBlbXB0eSBvciBpcyBub3Qgc2V0IG9yIGlnbm9yZWQgKC1FLy1JIGNvbW1hbmQgbGluZQorICAgICAgICAgICBvcHRpb25zKTogdXNlIGRlZmF1bHQgYWxsb2NhdG9ycyAqLworI2lmZGVmIFB5X0RFQlVHCisjICBpZmRlZiBXSVRIX1BZTUFMTE9DCisgICAgICAgIG9wdCA9ICJweW1hbGxvY19kZWJ1ZyI7CisjICBlbHNlCisgICAgICAgIG9wdCA9ICJtYWxsb2NfZGVidWciOworIyAgZW5kaWYKKyNlbHNlCisgICAvKiAhUHlfREVCVUcgKi8KKyMgIGlmZGVmIFdJVEhfUFlNQUxMT0MKKyAgICAgICAgb3B0ID0gInB5bWFsbG9jIjsKKyMgIGVsc2UKKyAgICAgICAgb3B0ID0gIm1hbGxvYyI7CisjICBlbmRpZgorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN0cmNtcChvcHQsICJkZWJ1ZyIpID09IDApIHsKKyAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJtYWxsb2MiKSA9PSAwIHx8IHN0cmNtcChvcHQsICJtYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCBhbGxvYyA9IHtOVUxMLCBQWVJBV19GVU5DU307CisKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9SQVcsICZhbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmYWxsb2MpOworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jKTsKKworICAgICAgICBpZiAoc3RyY21wKG9wdCwgIm1hbGxvY19kZWJ1ZyIpID09IDApCisgICAgICAgICAgICBQeU1lbV9TZXR1cERlYnVnSG9va3MoKTsKKyAgICB9CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJweW1hbGxvYyIpID09IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCByYXdfYWxsb2MgPSB7TlVMTCwgUFlSQVdfRlVOQ1N9OworICAgICAgICBQeU1lbUFsbG9jYXRvckV4IG1lbV9hbGxvYyA9IHtOVUxMLCBQWU1FTV9GVU5DU307CisgICAgICAgIFB5TWVtQWxsb2NhdG9yRXggb2JqX2FsbG9jID0ge05VTEwsIFBZT0JKX0ZVTkNTfTsKKworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJnJhd19hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmbWVtX2FsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZvYmpfYWxsb2MpOworCisgICAgICAgIGlmIChzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgICAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIC8qIHVua25vd24gYWxsb2NhdG9yICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKICN1bmRlZiBQWVJBV19GVU5DUwogI3VuZGVmIFBZTUVNX0ZVTkNTCiAjdW5kZWYgUFlPQkpfRlVOQ1MKKyN1bmRlZiBQWVJBV0RCR19GVU5DUwogI3VuZGVmIFBZREJHX0ZVTkNTCiAKIHN0YXRpYyBQeU9iamVjdEFyZW5hQWxsb2NhdG9yIF9QeU9iamVjdF9BcmVuYSA9IHtOVUxMLApAQCAtMjA1LDIzICsyODcsNDYgQEAKICNlbmRpZgogICAgIH07CiAKKyNpZmRlZiBXSVRIX1BZTUFMTE9DCitzdGF0aWMgaW50CitfUHlNZW1fRGVidWdFbmFibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIChfUHlPYmplY3QubWFsbG9jID09IF9QeU1lbV9EZWJ1Z01hbGxvYyk7Cit9CisKK2ludAorX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCh2b2lkKQoreworICAgIGlmIChfUHlNZW1fRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChfUHlNZW1fRGVidWcub2JqLmFsbG9jLm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAoX1B5T2JqZWN0Lm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9Cit9CisjZW5kaWYKKwogdm9pZAogUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKHZvaWQpCiB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKICAgICBQeU1lbUFsbG9jYXRvckV4IGFsbG9jOwogCisgICAgYWxsb2MubWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3TWFsbG9jOworICAgIGFsbG9jLmNhbGxvYyA9IF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYzsKKyAgICBhbGxvYy5yZWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3UmVhbGxvYzsKKyAgICBhbGxvYy5mcmVlID0gX1B5TWVtX0RlYnVnUmF3RnJlZTsKKworICAgIGlmIChfUHlNZW1fUmF3Lm1hbGxvYyAhPSBfUHlNZW1fRGVidWdSYXdNYWxsb2MpIHsKKyAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5yYXc7CisgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmX1B5TWVtX0RlYnVnLnJhdy5hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmYWxsb2MpOworICAgIH0KKwogICAgIGFsbG9jLm1hbGxvYyA9IF9QeU1lbV9EZWJ1Z01hbGxvYzsKICAgICBhbGxvYy5jYWxsb2MgPSBfUHlNZW1fRGVidWdDYWxsb2M7CiAgICAgYWxsb2MucmVhbGxvYyA9IF9QeU1lbV9EZWJ1Z1JlYWxsb2M7CiAgICAgYWxsb2MuZnJlZSA9IF9QeU1lbV9EZWJ1Z0ZyZWU7CiAKLSAgICBpZiAoX1B5TWVtX1Jhdy5tYWxsb2MgIT0gX1B5TWVtX0RlYnVnTWFsbG9jKSB7Ci0gICAgICAgIGFsbG9jLmN0eCA9ICZfUHlNZW1fRGVidWcucmF3OwotICAgICAgICBQeU1lbV9HZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJl9QeU1lbV9EZWJ1Zy5yYXcuYWxsb2MpOwotICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJmFsbG9jKTsKLSAgICB9Ci0KICAgICBpZiAoX1B5TWVtLm1hbGxvYyAhPSBfUHlNZW1fRGVidWdNYWxsb2MpIHsKICAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5tZW07CiAgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmX1B5TWVtX0RlYnVnLm1lbS5hbGxvYyk7CkBAIC0yMzMsNyArMzM4LDYgQEAKICAgICAgICAgUHlNZW1fR2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZfUHlNZW1fRGVidWcub2JqLmFsbG9jKTsKICAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvYyk7CiAgICAgfQotI2VuZGlmCiB9CiAKIHZvaWQKQEAgLTI2NCw3ICszNjgsNiBAQAogICAgIGNhc2UgUFlNRU1fRE9NQUlOX09CSjogX1B5T2JqZWN0ID0gKmFsbG9jYXRvcjsgYnJlYWs7CiAgICAgLyogaWdub3JlIHVua25vd24gZG9tYWluICovCiAgICAgfQotCiB9CiAKIHZvaWQKQEAgLTY0MiwyMiArNzQ1LDYgQEAKICNkZWZpbmUgU0lNUExFTE9DS19MT0NLKGxvY2spICAgLyogYWNxdWlyZSByZWxlYXNlZCBsb2NrICovCiAjZGVmaW5lIFNJTVBMRUxPQ0tfVU5MT0NLKGxvY2spIC8qIHJlbGVhc2UgYWNxdWlyZWQgbG9jayAqLwogCi0vKgotICogQmFzaWMgdHlwZXMKLSAqIEkgZG9uJ3QgY2FyZSBpZiB0aGVzZSBhcmUgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+IG9yIGVsc2V3aGVyZS4gQXhpb20uCi0gKi8KLSN1bmRlZiAgdWNoYXIKLSNkZWZpbmUgdWNoYXIgICB1bnNpZ25lZCBjaGFyICAgLyogYXNzdW1pbmcgPT0gOCBiaXRzICAqLwotCi0jdW5kZWYgIHVpbnQKLSNkZWZpbmUgdWludCAgICB1bnNpZ25lZCBpbnQgICAgLyogYXNzdW1pbmcgPj0gMTYgYml0cyAqLwotCi0jdW5kZWYgIHVsb25nCi0jZGVmaW5lIHVsb25nICAgdW5zaWduZWQgbG9uZyAgIC8qIGFzc3VtaW5nID49IDMyIGJpdHMgKi8KLQotI3VuZGVmIHVwdHIKLSNkZWZpbmUgdXB0ciAgICBQeV91aW50cHRyX3QKLQogLyogV2hlbiB5b3Ugc2F5IG1lbW9yeSwgbXkgbWluZCByZWFzb25zIGluIHRlcm1zIG9mIChwb2ludGVycyB0bykgYmxvY2tzICovCiB0eXBlZGVmIHVjaGFyIGJsb2NrOwogCkBAIC05NDksMTEgKzEwMzYsMTUgQEAKICAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhcmVuYW9iajsKICAgICB1aW50IGV4Y2VzczsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBhYm92ZSBwb29sIGFsaWdubWVudCAqLwogICAgIHZvaWQgKmFkZHJlc3M7CisgICAgc3RhdGljIGludCBkZWJ1Z19zdGF0cyA9IC0xOwogCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQorICAgIGlmIChkZWJ1Z19zdGF0cyA9PSAtMSkgeworICAgICAgICBjaGFyICpvcHQgPSBQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIik7CisgICAgICAgIGRlYnVnX3N0YXRzID0gKG9wdCAhPSBOVUxMICYmICpvcHQgIT0gJ1wwJyk7CisgICAgfQorICAgIGlmIChkZWJ1Z19zdGF0cykKICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKLSNlbmRpZgorCiAgICAgaWYgKHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpIHsKICAgICAgICAgdWludCBpOwogICAgICAgICB1aW50IG51bWFyZW5hczsKQEAgLTE3MDksNyArMTgwMCw3IEBACiAKICNlbmRpZiAvKiBXSVRIX1BZTUFMTE9DICovCiAKLSNpZmRlZiBQWU1BTExPQ19ERUJVRworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEEgeC1wbGF0Zm9ybSBkZWJ1Z2dpbmcgYWxsb2NhdG9yLiAgVGhpcyBkb2Vzbid0IG1hbmFnZSBtZW1vcnkgZGlyZWN0bHksCiAgKiBpdCB3cmFwcyBhIHJlYWwgYWxsb2NhdG9yLCBhZGRpbmcgZXh0cmEgZGVidWdnaW5nIGluZm8gdG8gdGhlIG1lbW9yeSBibG9ja3MuCkBAIC0xNzY3LDMxICsxODU4LDYgQEAKICAgICB9CiB9CiAKLSNpZmRlZiBQeV9ERUJVRwotLyogSXMgdGFyZ2V0IGluIHRoZSBsaXN0PyAgVGhlIGxpc3QgaXMgdHJhdmVyc2VkIHZpYSB0aGUgbmV4dHBvb2wgcG9pbnRlcnMuCi0gKiBUaGUgbGlzdCBtYXkgYmUgTlVMTC10ZXJtaW5hdGVkLCBvciBjaXJjdWxhci4gIFJldHVybiAxIGlmIHRhcmdldCBpcyBpbgotICogbGlzdCwgZWxzZSAwLgotICovCi1zdGF0aWMgaW50Ci1wb29sX2lzX2luX2xpc3QoY29uc3QgcG9vbHAgdGFyZ2V0LCBwb29scCBsaXN0KQotewotICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKLSAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOwotICAgIGlmIChsaXN0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotICAgIGRvIHsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKLSAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIHBvb2xfaXNfaW5fbGlzdChYLCBZKSAxCi0KLSNlbmRpZiAgLyogUHlfREVCVUcgKi8KLQogLyogTGV0IFMgPSBzaXplb2Yoc2l6ZV90KS4gIFRoZSBkZWJ1ZyBtYWxsb2MgYXNrcyBmb3IgNCpTIGV4dHJhIGJ5dGVzIGFuZAogICAgZmlsbHMgdGhlbSB3aXRoIHVzZWZ1bCBzdHVmZiwgaGVyZSBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIG1hbGxvYydzIHJlc3VsdCBwOgogCkBAIC0xODE5LDcgKzE4ODUsNyBAQAogKi8KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnQWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKK19QeU1lbV9EZWJ1Z1Jhd0FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCiB7CiAgICAgZGVidWdfYWxsb2NfYXBpX3QgKmFwaSA9IChkZWJ1Z19hbGxvY19hcGlfdCAqKWN0eDsKICAgICB1Y2hhciAqcDsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyBvZiBtYWxsb2MnZWQgYmxvY2sgKi8KQEAgLTE4NTYsMTggKzE5MjIsMTggQEAKIH0KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnTWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKK19QeU1lbV9EZWJ1Z1Jhd01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCiB7Ci0gICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3QWxsb2MoMCwgY3R4LCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgdm9pZCAqCi1fUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCitfUHlNZW1fRGVidWdSYXdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CiAgICAgc2l6ZV90IG5ieXRlczsKICAgICBhc3NlcnQoZWxzaXplID09IDAgfHwgbmVsZW0gPD0gUFlfU1NJWkVfVF9NQVggLyBlbHNpemUpOwogICAgIG5ieXRlcyA9IG5lbGVtICogZWxzaXplOwotICAgIHJldHVybiBfUHlNZW1fRGVidWdBbGxvYygxLCBjdHgsIG5ieXRlcyk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0FsbG9jKDEsIGN0eCwgbmJ5dGVzKTsKIH0KIAogLyogVGhlIGRlYnVnIGZyZWUgZmlyc3QgY2hlY2tzIHRoZSAyKlNTVCBieXRlcyBvbiBlYWNoIGVuZCBmb3Igc2FuaXR5IChpbgpAQCAtMTg3Niw3ICsxOTQyLDcgQEAKICAgIFRoZW4gY2FsbHMgdGhlIHVuZGVybHlpbmcgZnJlZS4KICovCiBzdGF0aWMgdm9pZAotX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnApCitfUHlNZW1fRGVidWdSYXdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcCkKIHsKICAgICBkZWJ1Z19hbGxvY19hcGlfdCAqYXBpID0gKGRlYnVnX2FsbG9jX2FwaV90ICopY3R4OwogICAgIHVjaGFyICpxID0gKHVjaGFyICopcCAtIDIqU1NUOyAgLyogYWRkcmVzcyByZXR1cm5lZCBmcm9tIG1hbGxvYyAqLwpAQCAtMTg5Myw3ICsxOTU5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCitfUHlNZW1fRGVidWdSYXdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKICAgICBkZWJ1Z19hbGxvY19hcGlfdCAqYXBpID0gKGRlYnVnX2FsbG9jX2FwaV90ICopY3R4OwogICAgIHVjaGFyICpxID0gKHVjaGFyICopcCwgKm9sZHE7CkBAIC0xOTAzLDcgKzE5NjksNyBAQAogICAgIGludCBpOwogCiAgICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKIAogICAgIF9QeU1lbV9EZWJ1Z0NoZWNrQWRkcmVzcyhhcGktPmFwaV9pZCwgcCk7CiAgICAgYnVtcHNlcmlhbG5vKCk7CkBAIC0xOTQ2LDYgKzIwMTIsNDQgQEAKICAgICByZXR1cm4gcTsKIH0KIAorc3RhdGljIHZvaWQKK19QeU1lbV9EZWJ1Z0NoZWNrR0lMKHZvaWQpCit7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBpZiAoIVB5R0lMU3RhdGVfQ2hlY2soKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBob2xkaW5nIHRoZSBHSUwiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqCitfUHlNZW1fRGVidWdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQoreworICAgIF9QeU1lbV9EZWJ1Z0NoZWNrR0lMKCk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYyhjdHgsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyB2b2lkICoKK19QeU1lbV9EZWJ1Z0NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdDYWxsb2MoY3R4LCBuZWxlbSwgZWxzaXplKTsKK30KKworc3RhdGljIHZvaWQKK19QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwdHIpCit7CisgICAgX1B5TWVtX0RlYnVnQ2hlY2tHSUwoKTsKKyAgICBfUHlNZW1fRGVidWdSYXdGcmVlKGN0eCwgcHRyKTsKK30KKworc3RhdGljIHZvaWQgKgorX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ieXRlcykKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdSZWFsbG9jKGN0eCwgcHRyLCBuYnl0ZXMpOworfQorCiAvKiBDaGVjayB0aGUgZm9yYmlkZGVuIGJ5dGVzIG9uIGJvdGggZW5kcyBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcC4KICAqIElmIGFueXRoaW5nIGlzIHdyb25nLCBwcmludCBpbmZvIHRvIHN0ZGVyciB2aWEgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MsCiAgKiBhbmQgY2FsbCBQeV9GYXRhbEVycm9yIHRvIGtpbGwgdGhlIHByb2dyYW0uCkBAIC0yMTA0LDkgKzIyMDgsMTIgQEAKICAgICAgICAgfQogICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwogICAgIH0KKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworCisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgX1B5TWVtX0R1bXBUcmFjZWJhY2soZmlsZW5vKHN0ZGVyciksIHApOwogfQogCi0jZW5kaWYgIC8qIFBZTUFMTE9DX0RFQlVHICovCiAKIHN0YXRpYyBzaXplX3QKIHByaW50b25lKEZJTEUgKm91dCwgY29uc3QgY2hhciogbXNnLCBzaXplX3QgdmFsdWUpCkBAIC0yMTU4LDggKzIyNjUsMzAgQEAKICAgICAodm9pZClwcmludG9uZShvdXQsIGJ1ZjIsIG51bV9ibG9ja3MgKiBzaXplb2ZfYmxvY2spOwogfQogCisKICNpZmRlZiBXSVRIX1BZTUFMTE9DCiAKKyNpZmRlZiBQeV9ERUJVRworLyogSXMgdGFyZ2V0IGluIHRoZSBsaXN0PyAgVGhlIGxpc3QgaXMgdHJhdmVyc2VkIHZpYSB0aGUgbmV4dHBvb2wgcG9pbnRlcnMuCisgKiBUaGUgbGlzdCBtYXkgYmUgTlVMTC10ZXJtaW5hdGVkLCBvciBjaXJjdWxhci4gIFJldHVybiAxIGlmIHRhcmdldCBpcyBpbgorICogbGlzdCwgZWxzZSAwLgorICovCitzdGF0aWMgaW50Citwb29sX2lzX2luX2xpc3QoY29uc3QgcG9vbHAgdGFyZ2V0LCBwb29scCBsaXN0KQoreworICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKKyAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGRvIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKKyAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLyogUHJpbnQgc3VtbWFyeSBpbmZvIHRvICJvdXQiIGFib3V0IHRoZSBzdGF0ZSBvZiBweW1hbGxvYydzIHN0cnVjdHVyZXMuCiAgKiBJbiBQeV9ERUJVRyBtb2RlLCBhbHNvIHBlcmZvcm0gc29tZSBleHBlbnNpdmUgaW50ZXJuYWwgY29uc2lzdGVuY3kKICAqIGNoZWNrcy4KQEAgLTIyMzMsNyArMjM2Miw5IEBACiAKICAgICAgICAgICAgIGlmIChwLT5yZWYuY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNpZmRlZiBQeV9ERUJVRwogICAgICAgICAgICAgICAgIGFzc2VydChwb29sX2lzX2luX2xpc3QocCwgYXJlbmFzW2ldLmZyZWVwb29scykpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICArK251bXBvb2xzW3N6XTsKQEAgLTIyNzMsOSArMjQwNCw4IEBACiAgICAgICAgIHF1YW50aXphdGlvbiArPSBwICogKChQT09MX1NJWkUgLSBQT09MX09WRVJIRUFEKSAlIHNpemUpOwogICAgIH0KICAgICBmcHV0YygnXG4nLCBvdXQpOwotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCi0gICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKLSNlbmRpZgorICAgIGlmIChfUHlNZW1fRGVidWdFbmFibGVkKCkpCisgICAgICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgdGltZXMgb2JqZWN0IG1hbGxvYyBjYWxsZWQiLCBzZXJpYWxubyk7CiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyBhcmVuYXMgYWxsb2NhdGVkIHRvdGFsIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCk7CiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyBhcmVuYXMgcmVjbGFpbWVkIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCAtIG5hcmVuYXMpOwogICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgYXJlbmFzIGhpZ2h3YXRlciBtYXJrIiwgbmFyZW5hc19oaWdod2F0ZXIpOwpAQCAtMjMwMyw2ICsyNDMzLDcgQEAKIAogI2VuZGlmIC8qICNpZmRlZiBXSVRIX1BZTUFMTE9DICovCiAKKwogI2lmZGVmIFB5X1VTSU5HX01FTU9SWV9ERUJVR0dFUgogLyogTWFrZSB0aGlzIGZ1bmN0aW9uIGxhc3Qgc28gZ2NjIHdvbid0IGlubGluZSBpdCBzaW5jZSB0aGUgZGVmaW5pdGlvbiBpcwogICogYWZ0ZXIgdGhlIHJlZmVyZW5jZS4KZGlmZiAtLWdpdCBhL09iamVjdHMvb2RpY3RvYmplY3QuYyBiL09iamVjdHMvb2RpY3RvYmplY3QuYwppbmRleCBhNjk2M2Q3Li5mMDU2MDc0IDEwMDY0NAotLS0gYS9PYmplY3RzL29kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vZGljdG9iamVjdC5jCkBAIC0xNDI0LDE0ICsxNDI0LDEzIEBACiAgKiBPcmRlcmVkRGljdCBtZW1iZXJzCiAgKi8KIAotLyogdHBfbWVtYmVycyAqLworLyogdHBfZ2V0c2V0ICovCiAKLXN0YXRpYyBQeU1lbWJlckRlZiBvZGljdF9tZW1iZXJzW10gPSB7Ci0gICAgeyJfX2RpY3RfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeU9EaWN0T2JqZWN0LCBvZF9pbnN0X2RpY3QpLCBSRUFET05MWX0sCi0gICAgezB9CitzdGF0aWMgUHlHZXRTZXREZWYgb2RpY3RfZ2V0c2V0W10gPSB7CisgICAgeyJfX2RpY3RfXyIsIFB5T2JqZWN0X0dlbmVyaWNHZXREaWN0LCBQeU9iamVjdF9HZW5lcmljU2V0RGljdH0sCisgICAge05VTEx9CiB9OwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE9yZGVyZWREaWN0IHR5cGUgc2xvdCBtZXRob2RzCiAgKi8KQEAgLTE0NjMsNyArMTQ2Miw3IEBACiAgICAgKyt0c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogCiAgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc2VsZikKLX07Cit9CiAKIC8qIHRwX3JlcHIgKi8KIApAQCAtMTU0MCw3ICsxNTM5LDcgQEAKICAgICBQeV9YREVDUkVGKHBpZWNlcyk7CiAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXNlbGYpOwogICAgIHJldHVybiByZXN1bHQ7Ci19OworfQogCiAvKiB0cF9kb2MgKi8KIApAQCAtMTYxMiw3ICsxNjExLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7CiAgICAgfQotfTsKK30KIAogLyogdHBfaXRlciAqLwogCkBAIC0xNjIwLDcgKzE2MTksNyBAQAogb2RpY3RfaXRlcihQeU9EaWN0T2JqZWN0ICpvZCkKIHsKICAgICByZXR1cm4gb2RpY3RpdGVyX25ldyhvZCwgX29kaWN0X0lURVJfS0VZUyk7Ci19OworfQogCiAvKiB0cF9pbml0ICovCiAKQEAgLTE2NDYsMjcgKzE2NDUsMTkgQEAKICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLX07Cit9CiAKIC8qIHRwX25ldyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb2RpY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5T0RpY3RPYmplY3QgKm9kOwogCi0gICAgZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBpZiAoZGljdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIG9kID0gKFB5T0RpY3RPYmplY3QgKilQeURpY3RfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0gICAgaWYgKG9kID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgIGlmIChvZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICBvZC0+b2RfaW5zdF9kaWN0ID0gZGljdDsKICAgICAvKiB0eXBlIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSBtZW1vcnkgd2l0aCB6ZXJvcyAoc2VlCiAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygpKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlbSB0byB6ZXJvIGFnYWluICovCiAgICAgaWYgKF9vZGljdF9yZXNpemUob2QpIDwgMCkgewpAQCAtMTcwOCw4ICsxNjk5LDggQEAKICAgICAoZ2V0aXRlcmZ1bmMpb2RpY3RfaXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgb2RpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgb2RpY3RfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBvZGljdF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgICZQeURpY3RfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCkBAIC0xNzI5LDcgKzE3MjAsNyBAQAogUHlPYmplY3QgKgogUHlPRGljdF9OZXcodm9pZCkgewogICAgIHJldHVybiBvZGljdF9uZXcoJlB5T0RpY3RfVHlwZSwgTlVMTCwgTlVMTCk7Ci19OworfQogCiBzdGF0aWMgaW50CiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSwKQEAgLTE3NDcsNyArMTczOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlczsKLX07Cit9CiAKIGludAogUHlPRGljdF9TZXRJdGVtKFB5T2JqZWN0ICpvZCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQpAQCAtMTc1Niw3ICsxNzQ3LDcgQEAKICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChvZCwga2V5LCB2YWx1ZSwgaGFzaCk7Ci19OworfQogCiBpbnQKIFB5T0RpY3RfRGVsSXRlbShQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXkpCkBAIC0xNzY5LDcgKzE3NjAsMjIgQEAKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBfUHlEaWN0X0RlbEl0ZW1fS25vd25IYXNoKG9kLCBrZXksIGhhc2gpOwotfTsKK30KKworUHlPYmplY3QgKgorX1B5T0RpY3RfS2V5c0FzVHVwbGUoUHlPYmplY3QgKm9kKSB7CisgICAgUHlfc3NpemVfdCBpID0gMDsKKyAgICBfT0RpY3ROb2RlICpub2RlOworICAgIFB5T2JqZWN0ICprZXlzID0gUHlUdXBsZV9OZXcoUHlPRGljdF9TaXplKG9kKSk7CisgICAgaWYgKGtleXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX29kaWN0X0ZPUkVBQ0goKFB5T0RpY3RPYmplY3QgKilvZCwgbm9kZSkgeworICAgICAgICBQeV9JTkNSRUYoX29kaWN0bm9kZV9LRVkobm9kZSkpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGtleXMsIGksIF9vZGljdG5vZGVfS0VZKG5vZGUpKTsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4ga2V5czsKK30KIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMgYi9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKaW5kZXggMGU5ZWIyMC4uOGU3NDEzMiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9yYW5nZW9iamVjdC5jCisrKyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwpAQCAtNiw3ICs2LDcgQEAKIC8qIFN1cHBvcnQgb2JqZWN0cyB3aG9zZSBsZW5ndGggaXMgPiBQWV9TU0laRV9UX01BWC4KIAogICAgVGhpcyBjb3VsZCBiZSBzcGVkIHVwIGZvciBzbWFsbCBQeUxvbmdzIGlmIHRoZXkgZml0IGluIGEgUHlfc3NpemVfdC4KLSAgIFRoaXMgb25seSBtYXR0ZXJzIG9uIFdpbjY0LiAgVGhvdWdoIHdlIGNvdWxkIHVzZSBQWV9MT05HX0xPTkcgd2hpY2gKKyAgIFRoaXMgb25seSBtYXR0ZXJzIG9uIFdpbjY0LiAgVGhvdWdoIHdlIGNvdWxkIHVzZSBsb25nIGxvbmcgd2hpY2gKICAgIHdvdWxkIHByZXN1bWFibHkgaGVscCBwZXJmLgogKi8KIApAQCAtMjksMTcgKzI5LDEwIEBACiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMSk7CiAKICAgICBzdGVwID0gUHlOdW1iZXJfSW5kZXgoc3RlcCk7Ci0gICAgaWYgKHN0ZXApIHsKLSAgICAgICAgUHlfc3NpemVfdCBpc3RlcCA9IFB5TnVtYmVyX0FzU3NpemVfdChzdGVwLCBOVUxMKTsKLSAgICAgICAgaWYgKGlzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgIC8qIElnbm9yZSBPdmVyZmxvd0Vycm9yLCB3ZSBrbm93IHRoZSB2YWx1ZSBpc24ndCAwLiAqLwotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc3RlcCA9PSAwKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2UoKSBhcmcgMyBtdXN0IG5vdCBiZSB6ZXJvIik7Ci0gICAgICAgICAgICBQeV9DTEVBUihzdGVwKTsKLSAgICAgICAgfQorICAgIGlmIChzdGVwICYmIF9QeUxvbmdfU2lnbihzdGVwKSA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgYXJnIDMgbXVzdCBub3QgYmUgemVybyIpOworICAgICAgICBQeV9DTEVBUihzdGVwKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RlcDsKQEAgLTEyOSw5ICsxMjIsOSBAQAogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9iajsKIAogICAgIC8qIEZhaWxlZCB0byBjcmVhdGUgb2JqZWN0LCByZWxlYXNlIGF0dHJpYnV0ZXMgKi8KLSAgICBQeV9YREVDUkVGKHN0YXJ0KTsKLSAgICBQeV9YREVDUkVGKHN0b3ApOwotICAgIFB5X1hERUNSRUYoc3RlcCk7CisgICAgUHlfREVDUkVGKHN0YXJ0KTsKKyAgICBQeV9ERUNSRUYoc3RvcCk7CisgICAgUHlfREVDUkVGKHN0ZXApOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0xOTYsNyArMTg5LDcgQEAKICAgICAvKiBpZiAobG8gPj0gaGkpLCByZXR1cm4gbGVuZ3RoIG9mIDAuICovCiAgICAgY21wX3Jlc3VsdCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChsbywgaGksIFB5X0dFKTsKICAgICBpZiAoY21wX3Jlc3VsdCAhPSAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RlcCk7CisgICAgICAgIFB5X0RFQ1JFRihzdGVwKTsKICAgICAgICAgaWYgKGNtcF9yZXN1bHQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMCk7CkBAIC0yMjUsOSArMjE4LDkgQEAKICAgICByZXR1cm4gcmVzdWx0OwogCiAgIEZhaWw6CisgICAgUHlfREVDUkVGKHN0ZXApOwogICAgIFB5X1hERUNSRUYodG1wMik7CiAgICAgUHlfWERFQ1JFRihkaWZmKTsKLSAgICBQeV9YREVDUkVGKHN0ZXApOwogICAgIFB5X1hERUNSRUYodG1wMSk7CiAgICAgUHlfWERFQ1JFRihvbmUpOwogICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zZXRvYmplY3QuYyBiL09iamVjdHMvc2V0b2JqZWN0LmMKaW5kZXggNGVmNjkyZC4uNmRkNDAzZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zZXRvYmplY3QuYworKysgYi9PYmplY3RzL3NldG9iamVjdC5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKLSNpbmNsdWRlICJzdHJpbmdsaWIvZXEuaCIKIAogLyogT2JqZWN0IHVzZWQgYXMgZHVtbXkga2V5IHRvIGZpbGwgZGVsZXRlZCBlbnRyaWVzICovCiBzdGF0aWMgUHlPYmplY3QgX2R1bW15X3N0cnVjdDsKQEAgLTQ4LDE5ICs0NywyMCBAQAogc3RhdGljIHNldGVudHJ5ICoKIHNldF9sb29ra2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7Ci0gICAgc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwotICAgIHNldGVudHJ5ICpmcmVlc2xvdCA9IE5VTEw7CisgICAgc2V0ZW50cnkgKnRhYmxlOwogICAgIHNldGVudHJ5ICplbnRyeTsKLSAgICBzaXplX3QgcGVydHVyYiA9IGhhc2g7CisgICAgc2l6ZV90IHBlcnR1cmI7CiAgICAgc2l6ZV90IG1hc2sgPSBzby0+bWFzazsKICAgICBzaXplX3QgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7IC8qIFVuc2lnbmVkIGZvciBkZWZpbmVkIG92ZXJmbG93IGJlaGF2aW9yICovCiAgICAgc2l6ZV90IGo7CiAgICAgaW50IGNtcDsKIAotICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gZW50cnk7CiAKKyAgICBwZXJ0dXJiID0gaGFzaDsKKwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwpAQCAtNzAsOCArNzAsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKICAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCi0gICAgICAgICAgICAgICAgJiYgdW5pY29kZV9lcShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICAmJiBfUHlVbmljb2RlX0VRKHN0YXJ0a2V5LCBrZXkpKQogICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgIHRhYmxlID0gc28tPnRhYmxlOwogICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOwpAQCAtODMsMTQgKzg0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOyAgICAgICAgICAgICAgICAgLyogaGVscCBhdm9pZCBhIHJlZ2lzdGVyIHNwaWxsICovCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IC0xICYmIGZyZWVzbG90ID09IE5VTEwpCi0gICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OwogCiAgICAgICAgIGlmIChpICsgTElORUFSX1BST0JFUyA8PSBtYXNrKSB7CiAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IExJTkVBUl9QUk9CRVMgOyBqKyspIHsKICAgICAgICAgICAgICAgICBlbnRyeSsrOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gMCAmJiBlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgewogICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOwpAQCAtOTgsOCArOTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB1bmljb2RlX2VxKHN0YXJ0a2V5LCBrZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CkBAIC0xMTEsNyArMTExLDEwNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKKyAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CisKKyAgICAgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KK30KKworc3RhdGljIGludCBzZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICosIFB5X3NzaXplX3QpOworCitzdGF0aWMgaW50CitzZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCit7CisgICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IG1hc2s7CisgICAgc2l6ZV90IGk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnNpZ25lZCBmb3IgZGVmaW5lZCBvdmVyZmxvdyBiZWhhdmlvciAqLworICAgIHNpemVfdCBqOworICAgIGludCBjbXA7CisKKyAgICAvKiBQcmUtaW5jcmVtZW50IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGFyYml0cmFyeSBjb2RlIGluIHRoZSByaWNoCisgICAgICAgY29tcGFyaXNvbiBmcm9tIGRlYWxsb2NhdGluZyB0aGUga2V5IGp1c3QgYmVmb3JlIHRoZSBpbnNlcnRpb24uICovCisgICAgUHlfSU5DUkVGKGtleSk7CisKKyAgcmVzdGFydDoKKworICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICBpID0gKHNpemVfdCloYXNoICYgbWFzazsKKworICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKworICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICBwZXJ0dXJiID0gaGFzaDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgLyogc3RhcnRrZXkgY2Fubm90IGJlIGEgZHVtbXkgYmVjYXVzZSB0aGUgZHVtbXkgaGFzaCBmaWVsZCBpcyAtMSAqLworICAgICAgICAgICAgYXNzZXJ0KHN0YXJ0a2V5ICE9IGR1bW15KTsKKyAgICAgICAgICAgIGlmIChzdGFydGtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQorICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpa2VseSAqLworICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfYWN0aXZlOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgLyogQ29udGludWluZyB0aGUgc2VhcmNoIGZyb20gdGhlIGN1cnJlbnQgZW50cnkgb25seSBtYWtlcworICAgICAgICAgICAgICAgc2Vuc2UgaWYgdGhlIHRhYmxlIGFuZCBlbnRyeSBhcmUgdW5jaGFuZ2VkOyBvdGhlcndpc2UsCisgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nICovCisgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOyAgICAgICAgICAgICAgICAgLyogaGVscCBhdm9pZCBhIHJlZ2lzdGVyIHNwaWxsICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisKKyAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTElORUFSX1BST0JFUyA7IGorKykgeworICAgICAgICAgICAgICAgIGVudHJ5Kys7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IDAgJiYgZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3VudXNlZF9vcl9kdW1teTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRrZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE5LDI5ICsyMTYsNTEgQEAKICAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKICAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CiAKLSAgICAgICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKICAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZm91bmRfbnVsbDsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfdW51c2VkX29yX2R1bW15OwogICAgIH0KLSAgZm91bmRfbnVsbDoKLSAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7CisKKyAgZm91bmRfdW51c2VkX29yX2R1bW15OgorICAgIGlmIChmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKyAgICBzby0+dXNlZCsrOworICAgIGZyZWVzbG90LT5rZXkgPSBrZXk7CisgICAgZnJlZXNsb3QtPmhhc2ggPSBoYXNoOworICAgIHJldHVybiAwOworCisgIGZvdW5kX3VudXNlZDoKKyAgICBzby0+ZmlsbCsrOworICAgIHNvLT51c2VkKys7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CisgICAgaWYgKChzaXplX3Qpc28tPmZpbGwqMyA8IG1hc2sqMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkKTsKKworICBmb3VuZF9hY3RpdmU6CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIDA7CisKKyAgY29tcGFyaXNvbl9lcnJvcjoKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCiBJbnRlcm5hbCByb3V0aW5lIHVzZWQgYnkgc2V0X3RhYmxlX3Jlc2l6ZSgpIHRvIGluc2VydCBhbiBpdGVtIHdoaWNoIGlzCiBrbm93biB0byBiZSBhYnNlbnQgZnJvbSB0aGUgc2V0LiAgVGhpcyByb3V0aW5lIGFsc28gYXNzdW1lcyB0aGF0CiB0aGUgc2V0IGNvbnRhaW5zIG5vIGRlbGV0ZWQgZW50cmllcy4gIEJlc2lkZXMgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXQsCi11c2luZyBzZXRfaW5zZXJ0X2NsZWFuKCkgaW4gc2V0X3RhYmxlX3Jlc2l6ZSgpIGlzIGRhbmdlcm91cyAoU0YgYnVnICMxNDU2MjA5KS4KLU5vdGUgdGhhdCBubyByZWZjb3VudHMgYXJlIGNoYW5nZWQgYnkgdGhpcyByb3V0aW5lOyBpZiBuZWVkZWQsIHRoZSBjYWxsZXIKLWlzIHJlc3BvbnNpYmxlIGZvciBpbmNyZWYnaW5nIGBrZXlgLgordGhlcmUgaXMgYWxzbyBzYWZldHkgYmVuZWZpdCBzaW5jZSB1c2luZyBzZXRfYWRkX2VudHJ5KCkgcmlza3MgbWFraW5nCithIGNhbGxiYWNrIGluIHRoZSBtaWRkbGUgb2YgYSBzZXRfdGFibGVfcmVzaXplKCksIHNlZSBpc3N1ZSAxNDU2MjA5LgorVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIGtleSdzIHJlZmVyZW5jZSBjb3VudCBhbmQKK3RoZSBzZXRvYmplY3QncyBmaWxsIGFuZCB1c2VkIGZpZWxkcy4KICovCiBzdGF0aWMgdm9pZAotc2V0X2luc2VydF9jbGVhbihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQorc2V0X2luc2VydF9jbGVhbihzZXRlbnRyeSAqdGFibGUsIHNpemVfdCBtYXNrLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIHNpemVfdCBwZXJ0dXJiID0gaGFzaDsKLSAgICBzaXplX3QgbWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgc2l6ZV90IGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOwogICAgIHNpemVfdCBqOwogCkBAIC0xNjIsNDUgKzI4MSwxMSBAQAogICBmb3VuZF9udWxsOgogICAgIGVudHJ5LT5rZXkgPSBrZXk7CiAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgIHNvLT5maWxsKys7Ci0gICAgc28tPnVzZWQrKzsKIH0KIAogLyogPT09PT09PT0gRW5kIGxvZ2ljIGZvciBwcm9iaW5nIHRoZSBoYXNoIHRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCi0vKgotSW50ZXJuYWwgcm91dGluZSB0byBpbnNlcnQgYSBuZXcga2V5IGludG8gdGhlIHRhYmxlLgotVXNlZCBieSB0aGUgcHVibGljIGluc2VydCByb3V0aW5lLgotRWF0cyBhIHJlZmVyZW5jZSB0byBrZXkuCi0qLwotc3RhdGljIGludAotc2V0X2luc2VydF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKLXsKLSAgICBzZXRlbnRyeSAqZW50cnk7Ci0KLSAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOwotICAgIGlmIChlbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewotICAgICAgICAvKiBVTlVTRUQgKi8KLSAgICAgICAgZW50cnktPmtleSA9IGtleTsKLSAgICAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgICAgICBzby0+ZmlsbCsrOwotICAgICAgICBzby0+dXNlZCsrOwotICAgIH0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotICAgICAgICAvKiBEVU1NWSAqLwotICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OwotICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgICAgIHNvLT51c2VkKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogQUNUSVZFICovCi0gICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogLyoKIFJlc3RydWN0dXJlIHRoZSB0YWJsZSBieSBhbGxvY2F0aW5nIGEgbmV3IHRhYmxlIGFuZCByZWluc2VydGluZyBhbGwKIGtleXMgYWdhaW4uICBXaGVuIGVudHJpZXMgaGF2ZSBiZWVuIGRlbGV0ZWQsIHRoZSBuZXcgdGFibGUgbWF5CkBAIC0yMTMsMTAgKzI5OCwxMyBAQAogICAgIHNldGVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBvbGRmaWxsID0gc28tPmZpbGw7CiAgICAgUHlfc3NpemVfdCBvbGR1c2VkID0gc28tPnVzZWQ7CisgICAgUHlfc3NpemVfdCBvbGRtYXNrID0gc28tPm1hc2s7CisgICAgc2l6ZV90IG5ld21hc2s7CiAgICAgaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOwogICAgIHNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAKICAgICBhc3NlcnQobWludXNlZCA+PSAwKTsKKyAgICBtaW51c2VkID0gKG1pbnVzZWQgPiA1MDAwMCkgPyBtaW51c2VkICogMiA6IG1pbnVzZWQgKiA0OwogCiAgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCiAgICAgLyogWFhYIHNwZWVkLXVwIHdpdGggaW50cmluc2ljcyAqLwpAQCAtMjY0LDI1ICszNTIsMjQgQEAKICAgICAvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCiAgICAgYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKICAgICBtZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihzZXRlbnRyeSkgKiBuZXdzaXplKTsKLSAgICBzby0+ZmlsbCA9IDA7Ci0gICAgc28tPnVzZWQgPSAwOworICAgIHNvLT5maWxsID0gb2xkdXNlZDsKKyAgICBzby0+dXNlZCA9IG9sZHVzZWQ7CiAgICAgc28tPm1hc2sgPSBuZXdzaXplIC0gMTsKICAgICBzby0+dGFibGUgPSBuZXd0YWJsZTsKIAogICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKICAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgaWYgKG9sZGZpbGwgPT0gb2xkdXNlZCkgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgb2xkdXNlZC0tOwotICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4oc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKG5ld3RhYmxlLCBuZXdtYXNrLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgICAgICBvbGR1c2VkLS07Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4obmV3dGFibGUsIG5ld21hc2ssIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5Miw1NyArMzc5LDMwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIENBVVRJT046IHNldF9hZGRfa2V5L2VudHJ5KCkgbXVzdCBndWFyYW50ZWUgaXQgd29uJ3QgcmVzaXplIHRoZSB0YWJsZSAqLwotCiBzdGF0aWMgaW50Ci1zZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQorc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7Ci0gICAgUHlfc3NpemVfdCBuX3VzZWQ7Ci0gICAgUHlPYmplY3QgKmtleSA9IGVudHJ5LT5rZXk7Ci0gICAgUHlfaGFzaF90IGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLSAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLSAgICBuX3VzZWQgPSBzby0+dXNlZDsKLSAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKLX0KLQotc3RhdGljIGludAotc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQotewotICAgIHNldGVudHJ5IGVudHJ5OwotICAgIFB5X2hhc2hfdCBoYXNoOwotCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8Ci0gICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9hZGRfZW50cnkoc28sICZlbnRyeSk7CisgICAgZW50cnkgPSBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5rZXkgIT0gTlVMTDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRElTQ0FSRF9OT1RGT1VORCAwCiAjZGVmaW5lIERJU0NBUkRfRk9VTkQgMQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9lbnRyeShQeVNldE9iamVjdCAqc28sIHNldGVudHJ5ICpvbGRlbnRyeSkKK3NldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5T2JqZWN0ICpvbGRfa2V5OwogCi0gICAgZW50cnkgPSBzZXRfbG9va2tleShzbywgb2xkZW50cnktPmtleSwgb2xkZW50cnktPmhhc2gpOworICAgIGVudHJ5ID0gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKICAgICBvbGRfa2V5ID0gZW50cnktPmtleTsKICAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CkBAIC0zNTMsMjIgKzQxMyw0NSBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQorc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotICAgIHNldGVudHJ5IGVudHJ5OwogICAgIFB5X2hhc2hfdCBoYXNoOwogCi0gICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CiAgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CiAgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAgICAgICAgIGlmIChoYXNoID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmZW50cnkpOworICAgIHJldHVybiBzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworfQorCitzdGF0aWMgaW50CitzZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKK30KKworc3RhdGljIGludAorc2V0X2Rpc2NhcmRfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDQ5LDIwICs1MzIsMjIgQEAKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBtYXNrOwotICAgIHNldGVudHJ5ICp0YWJsZTsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKICAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAgICAgaSA9ICpwb3NfcHRyOwogICAgIGFzc2VydChpID49IDApOwotICAgIHRhYmxlID0gc28tPnRhYmxlOwogICAgIG1hc2sgPSBzby0+bWFzazsKLSAgICB3aGlsZSAoaSA8PSBtYXNrICYmICh0YWJsZVtpXS5rZXkgPT0gTlVMTCB8fCB0YWJsZVtpXS5rZXkgPT0gZHVtbXkpKQorICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkpIHsKICAgICAgICAgaSsrOworICAgICAgICBlbnRyeSsrOworICAgIH0KICAgICAqcG9zX3B0ciA9IGkrMTsKICAgICBpZiAoaSA+IG1hc2spCiAgICAgICAgIHJldHVybiAwOwotICAgIGFzc2VydCh0YWJsZVtpXS5rZXkgIT0gTlVMTCk7Ci0gICAgKmVudHJ5X3B0ciA9ICZ0YWJsZVtpXTsKKyAgICBhc3NlcnQoZW50cnkgIT0gTlVMTCk7CisgICAgKmVudHJ5X3B0ciA9IGVudHJ5OwogICAgIHJldHVybiAxOwogfQogCkBAIC01NjAsOCArNjQ1LDggQEAKICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAogICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgogICAgICAqLwotICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgewotICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKKyAgICBpZiAoKHNvLT5maWxsICsgb3RoZXItPnVzZWQpKjMgPj0gc28tPm1hc2sqMikgeworICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCArIG90aGVyLT51c2VkKSAhPSAwKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHNvX2VudHJ5ID0gc28tPnRhYmxlOwpAQCAtNTg2LDExICs2NzEsMTUgQEAKIAogICAgIC8qIElmIG91ciB0YWJsZSBpcyBlbXB0eSwgd2UgY2FuIHVzZSBzZXRfaW5zZXJ0X2NsZWFuKCkgKi8KICAgICBpZiAoc28tPmZpbGwgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyssIG90aGVyX2VudHJ5KyspIHsKKyAgICAgICAgc2V0ZW50cnkgKm5ld3RhYmxlID0gc28tPnRhYmxlOworICAgICAgICBzaXplX3QgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CisgICAgICAgIHNvLT5maWxsID0gb3RoZXItPnVzZWQ7CisgICAgICAgIHNvLT51c2VkID0gb3RoZXItPnVzZWQ7CisgICAgICAgIGZvciAoaSA9IG90aGVyLT5tYXNrICsgMTsgaSA+IDAgOyBpLS0sIG90aGVyX2VudHJ5KyspIHsKICAgICAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgICAgICBpZiAoa2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15KSB7CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CisgICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihuZXd0YWJsZSwgbmV3bWFzaywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC02MDEsNDYgKzY5MCwxMyBAQAogICAgICAgICBvdGhlcl9lbnRyeSA9ICZvdGhlci0+dGFibGVbaV07CiAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgIGlmIChrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOwotICAgICAgICAgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgb3RoZXJfZW50cnktPmhhc2gpKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQotewotICAgIFB5T2JqZWN0ICprZXk7Ci0gICAgc2V0ZW50cnkgKmx1X2VudHJ5OwotCi0gICAgbHVfZW50cnkgPSBzZXRfbG9va2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotICAgIGlmIChsdV9lbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAga2V5ID0gbHVfZW50cnktPmtleTsKLSAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwotfQotCi1zdGF0aWMgaW50Ci1zZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKLXsKLSAgICBzZXRlbnRyeSBlbnRyeTsKLSAgICBQeV9oYXNoX3QgaGFzaDsKLQotICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAotICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgewotICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotICAgICAgICBpZiAoaGFzaCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZW50cnkua2V5ID0ga2V5OwotICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgIHJldHVybiBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9wKFB5U2V0T2JqZWN0ICpzbykKIHsKQEAgLTY4Miw0MyArNzM4LDY0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoIHZhbHVlcy4KKyAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSB1c2UgY2FzZXMgaGF2ZSBtYW55IGNvbWJpbmF0aW9ucyBvZiBhCisgICBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdAorICAgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLworCitzdGF0aWMgUHlfdWhhc2hfdAorX3NodWZmbGVfYml0cyhQeV91aGFzaF90IGgpCit7CisgICAgcmV0dXJuICgoaCBeIDg5ODY5NzQ3VUwpIF4gKGggPDwgMTYpKSAqIDM2NDQ3OTgxNjdVTDsKK30KKworLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob3NlbgorICAgbGFyZ2UgcHJpbWVzIHdpdGggImludGVyZXN0aW5nIGJpdCBwYXR0ZXJucyIgYW5kIHRoYXQgcGFzc2VkIHRlc3RzCisgICBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMgZGF0YXNldHMKKyAgIGluY2x1ZGluZyBwb3dlcnNldHMgYW5kIGdyYXBoIHN0cnVjdHVyZXMgKHN1Y2ggYXMgRGF2aWQgRXBwc3RlaW4ncworICAgZ3JhcGggcmVjaXBlcyBpbiBMaWIvdGVzdC90ZXN0X3NldC5weSkgKi8KKwogc3RhdGljIFB5X2hhc2hfdAogZnJvemVuc2V0X2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob29zZW4KLSAgICAgICBsYXJnZSBwcmltZXMgd2l0aCAiaW50ZXJlc3RpbmcgYml0IHBhdHRlcm5zIiBhbmQgdGhhdCBwYXNzZWQKLSAgICAgICB0ZXN0cyBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMKLSAgICAgICBkYXRhc2V0cyBzdWNoIGFzOgotCi0gICAgICAgICAgcHMgPSBbXQotICAgICAgICAgIGZvciByIGluIHJhbmdlKDIxKToKLSAgICAgICAgICAgICAgcHMgKz0gaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhyYW5nZSgyMCksIHIpCi0gICAgICAgICAgbnVtX2Rpc3RpbmN0X2hhc2hlcyA9IGxlbih7aGFzaChmcm96ZW5zZXQocykpIGZvciBzIGluIHBzfSkKLQotICAgICovCiAgICAgUHlTZXRPYmplY3QgKnNvID0gKFB5U2V0T2JqZWN0ICopc2VsZjsKLSAgICBQeV91aGFzaF90IGgsIGhhc2ggPSAxOTI3ODY4MjM3VUw7CisgICAgUHlfdWhhc2hfdCBoYXNoID0gMDsKICAgICBzZXRlbnRyeSAqZW50cnk7Ci0gICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCiAgICAgaWYgKHNvLT5oYXNoICE9IC0xKQogICAgICAgICByZXR1cm4gc28tPmhhc2g7CiAKLSAgICBoYXNoICo9IChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMTsKLSAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2gKLSAgICAgICAgICAgdmFsdWVzLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkKLSAgICAgICAgICAgY29tYmluYXRpb25zIG9mIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggbmVhcmJ5Ci0gICAgICAgICAgIGhhc2hlcyBzbyB0aGF0IG1hbnkgZGlzdGluY3QgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkKLSAgICAgICAgICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLwotICAgICAgICBoID0gZW50cnktPmhhc2g7Ci0gICAgICAgIGhhc2ggXj0gKChoIF4gODk4Njk3NDdVTCkgXiAoaCA8PCAxNikpICogMzY0NDc5ODE2N1VMOwotICAgIH0KLSAgICAvKiBNYWtlIHRoZSBmaW5hbCByZXN1bHQgc3ByZWFkLW91dCBpbiBhIGRpZmZlcmVudCBwYXR0ZXJuCi0gICAgICAgdGhhbiB0aGUgYWxnb3JpdGhtIGZvciB0dXBsZXMgb3Igb3RoZXIgcHl0aG9uIG9iamVjdHMuICovCisgICAgLyogWG9yLWluIHNodWZmbGVkIGJpdHMgZnJvbSBldmVyeSBlbnRyeSdzIGhhc2ggZmllbGQgYmVjYXVzZSB4b3IgaXMKKyAgICAgICBjb21tdXRhdGl2ZSBhbmQgYSBmcm96ZW5zZXQgaGFzaCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2Ygb3JkZXIuCisKKyAgICAgICBGb3Igc3BlZWQsIGluY2x1ZGUgbnVsbCBlbnRyaWVzIGFuZCBkdW1teSBlbnRyaWVzIGFuZCB0aGVuCisgICAgICAgc3VidHJhY3Qgb3V0IHRoZWlyIGVmZmVjdCBhZnRlcndhcmRzIHNvIHRoYXQgdGhlIGZpbmFsIGhhc2gKKyAgICAgICBkZXBlbmRzIG9ubHkgb24gYWN0aXZlIGVudHJpZXMuICBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBiZQorICAgICAgIHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBpdCBzYXZlcyB0aGUgdW5wcmVkaWN0YWJsZQorICAgICAgIGJyYW5jaGVzIHRoYXQgd291bGQgYXJpc2Ugd2hlbiB0cnlpbmcgdG8gZXhjbHVkZSBudWxsIGFuZCBkdW1teQorICAgICAgIGVudHJpZXMgb24gZXZlcnkgaXRlcmF0aW9uLiAqLworCisgICAgZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZW50cnkgPD0gJnNvLT50YWJsZVtzby0+bWFza107IGVudHJ5KyspCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cyhlbnRyeS0+aGFzaCk7CisKKyAgICAvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBhbiBvZGQgbnVtYmVyIG9mIE5VTEwgZW50cmllcyAqLworICAgIGlmICgoc28tPm1hc2sgKyAxIC0gc28tPmZpbGwpICYgMSkKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKDApOworCisgICAgLyogUmVtb3ZlIHRoZSBlZmZlY3Qgb2YgYW4gb2RkIG51bWJlciBvZiBkdW1teSBlbnRyaWVzICovCisgICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAmIDEpCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cygtMSk7CisKKyAgICAvKiBGYWN0b3IgaW4gdGhlIG51bWJlciBvZiBhY3RpdmUgZW50cmllcyAqLworICAgIGhhc2ggXj0gKChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMSkgKiAxOTI3ODY4MjM3VUw7CisKKyAgICAvKiBEaXNwZXJzZSBwYXR0ZXJucyBhcmlzaW5nIGluIG5lc3RlZCBmcm96ZW5zZXRzICovCiAgICAgaGFzaCA9IGhhc2ggKiA2OTA2OVUgKyA5MDcxMzM5MjNVTDsKKworICAgIC8qIC0xIGlzIHJlc2VydmVkIGFzIGFuIGVycm9yIGNvZGUgKi8KICAgICBpZiAoaGFzaCA9PSAoUHlfdWhhc2hfdCktMSkKICAgICAgICAgaGFzaCA9IDU5MDkyMzcxM1VMOworCiAgICAgc28tPmhhc2ggPSBoYXNoOwogICAgIHJldHVybiBoYXNoOwogfQpAQCAtODY1LDcgKzk0Miw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC05MTAsMTggKzk4NywxNCBAQAogICAgICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBrZXlzLiAgRXhwZWN0CiAgICAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCiAgICAgICAgICovCi0gICAgICAgIGlmIChkaWN0c2l6ZSA9PSAtMSkKKyAgICAgICAgaWYgKGRpY3RzaXplIDwgMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKChzby0+ZmlsbCArIGRpY3RzaXplKSozID49IChzby0+bWFzaysxKSoyKSB7Ci0gICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgKHNvLT51c2VkICsgZGljdHNpemUpKjIpICE9IDApCisgICAgICAgIGlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSBzby0+bWFzayoyKSB7CisgICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQgKyBkaWN0c2l6ZSkgIT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwotCi0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpKQorICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwpAQCAtOTcwLDkgKzEwNDMsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VfbmV3X3NldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLSAgICBQeVNldE9iamVjdCAqc28gPSBOVUxMOworICAgIFB5U2V0T2JqZWN0ICpzbzsKIAotICAgIC8qIGNyZWF0ZSBQeVNldE9iamVjdCBzdHJ1Y3R1cmUgKi8KICAgICBzbyA9IChQeVNldE9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwogICAgIGlmIChzbyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEwMTUsNyArMTA4Nyw4IEBACiB7CiAgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTCwgKnJlc3VsdDsKIAotICAgIGlmICh0eXBlID09ICZQeUZyb3plblNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiZnJvemVuc2V0KCkiLCBrd2RzKSkKKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUKKyAgICAgICAgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJmcm96ZW5zZXQoKSIsIGt3ZHMpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgdHlwZS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKQEAgLTEwNDIsMjQgKzExMTUsOSBAQAogICAgIHJldHVybiBlbXB0eWZyb3plbnNldDsKIH0KIAotaW50Ci1QeVNldF9DbGVhckZyZWVMaXN0KHZvaWQpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLVB5U2V0X0Zpbmkodm9pZCkKLXsKLSAgICBQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGlmICh0eXBlID09ICZQeVNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KICAgICByZXR1cm4gbWFrZV9uZXdfc2V0KHR5cGUsIE5VTEwpOwogfQogCkBAIC0xMjAxLDYgKzEyNTksOCBAQAogewogICAgIFB5U2V0T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIFB5X2hhc2hfdCBoYXNoOworICAgIGludCBydjsKIAogICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKICAgICAgICAgcmV0dXJuIHNldF9jb3B5KHNvKTsKQEAgLTEyMjAsMTMgKzEyODAsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHdoaWxlIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilvdGhlciwgJnBvcywgJmVudHJ5KSkgewotICAgICAgICAgICAgaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeSk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICBoYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChydikgewotICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgZW50cnkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjQyLDMyICsxMzA0LDE1IEBACiAgICAgfQogCiAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgaW50IHJ2OwotICAgICAgICBzZXRlbnRyeSBlbnRyeTsKLSAgICAgICAgUHlfaGFzaF90IGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0KLSAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgewotICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICBpZiAocnYgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgaWYgKHJ2KSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsICZlbnRyeSkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBrZXksIGhhc2gpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgfQpAQCAtMTI3Nyw2ICsxMzIyLDExIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICBlcnJvcjoKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTM2Myw2ICsxNDEzLDcgQEAKIHNldF9pc2Rpc2pvaW50KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewogICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpIHsKICAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA9PSAwKQpAQCAtMTM4MSw4ICsxNDMyLDggQEAKICAgICAgICAgICAgIG90aGVyID0gdG1wOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilvdGhlciwgJnBvcywgJmVudHJ5KSkgewotICAgICAgICAgICAgaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeSk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGlmIChydikKICAgICAgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CkBAIC0xMzk1LDggKzE0NDYsNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgc2V0ZW50cnkgZW50cnk7CiAgICAgICAgIFB5X2hhc2hfdCBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwogCiAgICAgICAgIGlmIChoYXNoID09IC0xKSB7CkBAIC0xNDA0LDExICsxNDUzLDkgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgZW50cnkua2V5ID0ga2V5OwotICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGtleSwgaGFzaCk7CiAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xNDM3LDcgKzE0ODQsNyBAQAogICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKQotICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpCisgICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFB5T2JqZWN0ICprZXksICppdDsKQEAgLTE0NDYsNyArMTQ5Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKICAgICAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9rZXkoc28sIGtleSkgPT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9rZXkoc28sIGtleSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xNDU3LDEwICsxNTA0LDEwIEBACiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICAvKiBJZiBtb3JlIHRoYW4gMS81IGFyZSBkdW1taWVzLCB0aGVuIHJlc2l6ZSB0aGVtIGF3YXkuICovCi0gICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAqIDUgPCBzby0+bWFzaykKKyAgICAvKiBJZiBtb3JlIHRoYW4gMS80dGggYXJlIGR1bW1pZXMsIHRoZW4gcmVzaXplIHRoZW0gYXdheS4gKi8KKyAgICBpZiAoKHNpemVfdCkoc28tPmZpbGwgLSBzby0+dXNlZCkgPD0gKHNpemVfdClzby0+bWFzayAvIDQpCiAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ4Nyw3ICsxNTM0LDcgQEAKICAgICByZXN1bHQgPSBzZXRfY29weShzbyk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKSByZXN1bHQsIG90aGVyKSAhPSAtMSkKKyAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKSByZXN1bHQsIG90aGVyKSA9PSAwKQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgIHJldHVybiBOVUxMOwpAQCAtMTQ5Nyw4ICsxNTQ0LDExIEBACiBzZXRfZGlmZmVyZW5jZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlfaGFzaF90IGhhc2g7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSAgJiYgIVB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICByZXR1cm4gc2V0X2NvcHlfYW5kX2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKQEAgLTE1MTYsMTcgKzE1NjYsMTUgQEAKIAogICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKICAgICAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBzZXRlbnRyeSBlbnRyeWNvcHk7Ci0gICAgICAgICAgICBpbnQgcnY7Ci0gICAgICAgICAgICBlbnRyeWNvcHkuaGFzaCA9IGVudHJ5LT5oYXNoOwotICAgICAgICAgICAgZW50cnljb3B5LmtleSA9IGVudHJ5LT5rZXk7Ci0gICAgICAgICAgICBydiA9IF9QeURpY3RfQ29udGFpbnMob3RoZXIsIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICBoYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgICAgICBydiA9IF9QeURpY3RfQ29udGFpbnMob3RoZXIsIGtleSwgaGFzaCk7CiAgICAgICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXJ2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCAmZW50cnljb3B5KSkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTUzNywxMyArMTU4NSwxNSBAQAogCiAgICAgLyogSXRlcmF0ZSBvdmVyIHNvLCBjaGVja2luZyBmb3IgY29tbW9uIGVsZW1lbnRzIGluIG90aGVyLiAqLwogICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFydikgewotICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBlbnRyeSkpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtMTYwNSwyOSArMTY1NSwyNCBAQAogICAgIFB5U2V0T2JqZWN0ICpvdGhlcnNldDsKICAgICBQeU9iamVjdCAqa2V5OwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeV9oYXNoX3QgaGFzaDsKICAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQogICAgICAgICByZXR1cm4gc2V0X2NsZWFyKHNvKTsKIAogICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKICAgICAgICAgUHlPYmplY3QgKnZhbHVlOwotICAgICAgICBpbnQgcnY7Ci0gICAgICAgIFB5X2hhc2hfdCBoYXNoOwogICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgewotICAgICAgICAgICAgc2V0ZW50cnkgYW5fZW50cnk7Ci0KICAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOwotICAgICAgICAgICAgYW5fZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgICAgICAgICBhbl9lbnRyeS5rZXkgPSBrZXk7Ci0KLSAgICAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZhbl9lbnRyeSk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2NDcsMTMgKzE2OTIsMTUgQEAKICAgICB9CiAKICAgICB3aGlsZSAoc2V0X25leHQob3RoZXJzZXQsICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgaW50IHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywgZW50cnkpKSB7CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xNzE1LDYgKzE3NjIsNyBAQAogewogICAgIHNldGVudHJ5ICplbnRyeTsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKICAgICAgICAgUHlPYmplY3QgKnRtcCwgKnJlc3VsdDsKQEAgLTE3MjksOCArMTc3Nyw4IEBACiAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmICghcnYpCiAgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CkBAIC0xODIxLDcgKzE4NjksNyBAQAogICAgIGludCBydjsKIAogICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2tleShzbywga2V5KTsKLSAgICBpZiAocnYgPT0gLTEpIHsKKyAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMTg0MCw3ICsxODg4LDcgQEAKICAgICBsb25nIHJlc3VsdDsKIAogICAgIHJlc3VsdCA9IHNldF9jb250YWlucyhzbywga2V5KTsKLSAgICBpZiAocmVzdWx0ID09IC0xKQorICAgIGlmIChyZXN1bHQgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CkBAIC0xODU0LDcgKzE5MDIsNyBAQAogICAgIGludCBydjsKIAogICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpOwotICAgIGlmIChydiA9PSAtMSkgeworICAgIGlmIChydiA8IDApIHsKICAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTE4NjMsNyArMTkxMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIHRtcGtleSk7CiAgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOwotICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE4ODYsNyArMTkzNCw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0gICAgaWYgKHJ2ID09IC0xKSB7CisgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMTg5NSw3ICsxOTQzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKICAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTE5NDksMTMgKzE5OTcsMTIgQEAKIHsKICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFueVNldF9DaGVjayhzZWxmKSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeVNldF9DaGVjayhzZWxmKSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzZXRfY2xlYXJfaW50ZXJuYWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmZpbGwpCisgICAgICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKICAgICBzZWxmLT5oYXNoID0gLTE7CiAgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMjEyMiw3ICsyMTY5LDcgQEAKICAgICAgY29weV9kb2N9LAogICAgIHsiZGlmZmVyZW5jZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWZmZXJlbmNlX211bHRpLCAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgZGlmZmVyZW5jZV9kb2N9LAotICAgIHsiaW50ZXJzZWN0aW9uIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl9tdWx0aSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICB7ImludGVyc2VjdGlvbiIsICAgIChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICBNRVRIX1ZBUkFSR1MsCiAgICAgIGludGVyc2VjdGlvbl9kb2N9LAogICAgIHsiaXNkaXNqb2ludCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc2Rpc2pvaW50LCAgICBNRVRIX08sCiAgICAgIGlzZGlzam9pbnRfZG9jfSwKQEAgLTIxOTMsNyArMjI0MCw3IEBACiAgICAgKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIChyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIG9mZnNldG9mKFB5U2V0T2JqZWN0LCB3ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgKGdldGl0ZXJmdW5jKXNldF9pdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgZnJvemVuc2V0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwpAQCAtMjI3Nyw2ICsyMzI0LDE4IEBACiB9CiAKIGludAorUHlTZXRfQ2xlYXJGcmVlTGlzdCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkCitQeVNldF9GaW5pKHZvaWQpCit7CisgICAgUHlfQ0xFQVIoZW1wdHlmcm96ZW5zZXQpOworfQorCitpbnQKIF9QeVNldF9OZXh0RW50cnkoUHlPYmplY3QgKnNldCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlfaGFzaF90ICpoYXNoKQogewogICAgIHNldGVudHJ5ICplbnRyeTsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2NvZGVjcy5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKaW5kZXggMGZjNmI1OC4uYTlkMGEzNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKQEAgLTEsNiArMSw4IEBACiAvKiBzdHJpbmdsaWI6IGNvZGVjIGltcGxlbWVudGF0aW9ucyAqLwogCi0jaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKKyNpZiAhU1RSSU5HTElCX0lTX1VOSUNPREUKKyMgZXJyb3IgImNvZGVjcy5oIGlzIHNwZWNpZmljIHRvIFVuaWNvZGUiCisjZW5kaWYKIAogLyogTWFzayB0byBxdWlja2x5IGNoZWNrIHdoZXRoZXIgYSBDICdsb25nJyBjb250YWlucyBhCiAgICBub24tQVNDSUksIFVURjgtZW5jb2RlZCBjaGFyLiAqLwpAQCAtMjYzLDQ5ICsyNjUsMzMgQEAKICNkZWZpbmUgTUFYX1NIT1JUX1VOSUNIQVJTIDMwMCAgLyogbGFyZ2VzdCBzaXplIHdlJ2xsIGRvIG9uIHRoZSBzdGFjayAqLwogCiAgICAgUHlfc3NpemVfdCBpOyAgICAgICAgICAgICAgICAvKiBpbmRleCBpbnRvIHMgb2YgbmV4dCBpbnB1dCBieXRlICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAvKiByZXN1bHQgc3RyaW5nIG9iamVjdCAqLwogICAgIGNoYXIgKnA7ICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBmcmVlIGJ5dGUgaW4gb3V0cHV0IGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbmFsbG9jYXRlZDsgICAgICAvKiBudW1iZXIgb2YgcmVzdWx0IGJ5dGVzIGFsbG9jYXRlZCAqLwotICAgIFB5X3NzaXplX3Qgbm5lZWRlZDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzdWx0IGJ5dGVzIG5lZWRlZCAqLwogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXAgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKICNlbmRpZgogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAxCiAgICAgY29uc3QgUHlfc3NpemVfdCBtYXhfY2hhcl9zaXplID0gMjsKLSAgICBjaGFyIHN0YWNrYnVmW01BWF9TSE9SVF9VTklDSEFSUyAqIDJdOwogI2VsaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDIKICAgICBjb25zdCBQeV9zc2l6ZV90IG1heF9jaGFyX3NpemUgPSAzOwotICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogM107CiAjZWxzZSAvKiAgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDQgKi8KICAgICBjb25zdCBQeV9zc2l6ZV90IG1heF9jaGFyX3NpemUgPSA0OwotICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogNF07CiAjZW5kaWYKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCi0gICAgaWYgKHNpemUgPD0gTUFYX1NIT1JUX1VOSUNIQVJTKSB7Ci0gICAgICAgIC8qIFdyaXRlIGludG8gdGhlIHN0YWNrIGJ1ZmZlcjsgbmFsbG9jYXRlZCBjYW4ndCBvdmVyZmxvdy4KLSAgICAgICAgICogQXQgdGhlIGVuZCwgd2UnbGwgYWxsb2NhdGUgZXhhY3RseSBhcyBtdWNoIGhlYXAgc3BhY2UgYXMgaXQKLSAgICAgICAgICogdHVybnMgb3V0IHdlIG5lZWQuCi0gICAgICAgICAqLwotICAgICAgICBuYWxsb2NhdGVkID0gUHlfU0FGRV9ET1dOQ0FTVChzaXplb2Yoc3RhY2tidWYpLCBzaXplX3QsIGludCk7Ci0gICAgICAgIHJlc3VsdCA9IE5VTEw7ICAgLyogd2lsbCBhbGxvY2F0ZSBhZnRlciB3ZSdyZSBkb25lICovCi0gICAgICAgIHAgPSBzdGFja2J1ZjsKKyAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbWF4X2NoYXJfc2l6ZSkgeworICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG1heF9jaGFyX3NpemUpIHsKLSAgICAgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIE92ZXJhbGxvY2F0ZSBvbiB0aGUgaGVhcCwgYW5kIGdpdmUgdGhlIGV4Y2VzcyBiYWNrIGF0IHRoZSBlbmQuICovCi0gICAgICAgIG5hbGxvY2F0ZWQgPSBzaXplICogbWF4X2NoYXJfc2l6ZTsKLSAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYWxsb2NhdGVkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotICAgIH0KKworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzaXplICogbWF4X2NoYXJfc2l6ZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IGRhdGFbaSsrXTsKQEAgLTMyNiw3MiArMzEyLDExOSBAQAogICAgICAgICB9CiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQogICAgICAgICBlbHNlIGlmIChQeV9VTklDT0RFX0lTX1NVUlJPR0FURShjaCkpIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgbmV3cG9zOwotICAgICAgICAgICAgUHlfc3NpemVfdCByZXBzaXplLCBrLCBzdGFydHBvczsKLSAgICAgICAgICAgIHN0YXJ0cG9zID0gaS0xOwotICAgICAgICAgICAgcmVwID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsICJ1dGYtOCIsICJzdXJyb2dhdGVzIG5vdCBhbGxvd2VkIiwKLSAgICAgICAgICAgICAgICAgIHVuaWNvZGUsICZleGMsIHN0YXJ0cG9zLCBzdGFydHBvcysxLCAmbmV3cG9zKTsKLSAgICAgICAgICAgIGlmICghcmVwKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpCi0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKLQotICAgICAgICAgICAgaWYgKHJlcHNpemUgPiBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHAgLSBzdGFja2J1ZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbGxvY2F0ZWQgPiBQWV9TU0laRV9UX01BWCAtIHJlcHNpemUgKyBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFsbG9jYXRlZCArPSByZXBzaXplIC0gbWF4X2NoYXJfc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCBuYWxsb2NhdGVkKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmFsbG9jYXRlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIFB5X01FTUNQWShQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpLCBzdGFja2J1Ziwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCkgKyBvZmZzZXQ7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIG5ld3BvczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgazsKKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwcmVwID0gUHlCeXRlc19BU19TVFJJTkcocmVwKTsKLSAgICAgICAgICAgICAgICBmb3IoayA9IHJlcHNpemU7IGsgPiAwOyBrLS0pCi0gICAgICAgICAgICAgICAgICAgICpwKysgPSAqcHJlcCsrOwotICAgICAgICAgICAgfSBlbHNlIC8qIHJlcCBpcyB1bmljb2RlICovIHsKLSAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIHJlcGtpbmQ7Ci0gICAgICAgICAgICAgICAgdm9pZCAqcmVwZGF0YTsKKyAgICAgICAgICAgIHN0YXJ0cG9zID0gaS0xOworICAgICAgICAgICAgZW5kcG9zID0gc3RhcnRwb3MrMTsKIAotICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCisgICAgICAgICAgICB3aGlsZSAoKGVuZHBvcyA8IHNpemUpICYmIFB5X1VOSUNPREVfSVNfU1VSUk9HQVRFKGRhdGFbZW5kcG9zXSkpCisgICAgICAgICAgICAgICAgZW5kcG9zKys7CisKKyAgICAgICAgICAgIC8qIE9ubHkgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgaWYgaXQncyBub3QgdGhlIGxhc3Qgd3JpdGUgKi8KKyAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAoZW5kcG9zIDwgc2l6ZSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHAsICc/JywgZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIHAgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdGhlIGlnbm9yZSBoYW5kbGVyICovCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFUEFTUzoKKyAgICAgICAgICAgICAgICBmb3IgKGs9c3RhcnRwb3M7IGs8ZW5kcG9zOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBkYXRhW2tdOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ZTAgfCAoY2ggPj4gMTIpKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKSgweDgwIHwgKGNoICYgMHgzZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnRyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSBtYXhfY2hhcl9zaXplICogKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICBwID0gYmFja3NsYXNocmVwbGFjZSgmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHN0YXJ0cG9zLCBlbmRwb3MpOworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgcmVwa2luZCA9IFB5VW5pY29kZV9LSU5EKHJlcCk7Ci0gICAgICAgICAgICAgICAgcmVwZGF0YSA9IFB5VW5pY29kZV9EQVRBKHJlcCk7CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8cmVwc2l6ZTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgYyA9IFB5VW5pY29kZV9SRUFEKHJlcGtpbmQsIHJlcGRhdGEsIGspOwotICAgICAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBjKSB7CisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKKyAgICAgICAgICAgICAgICAvKiBzdWJ0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gbWF4X2NoYXJfc2l6ZSAqIChlbmRwb3MgLSBzdGFydHBvcyk7CisgICAgICAgICAgICAgICAgcCA9IHhtbGNoYXJyZWZyZXBsYWNlKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHN0YXJ0cG9zLCBlbmRwb3MpOworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICAgICAgICAgIGZvciAoaz1zdGFydHBvczsgazxlbmRwb3M7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IGRhdGFba107CisgICAgICAgICAgICAgICAgICAgIGlmICghKDB4REM4MCA8PSBjaCAmJiBjaCA8PSAweERDRkYpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoY2ggJiAweGZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGsgPj0gZW5kcG9zKSB7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFydHBvcyA9IGs7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHN0YXJ0cG9zIDwgZW5kcG9zKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdGhlIGRlZmF1bHQgaGFuZGxlciAqLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXAgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwgInV0Zi04IiwgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsICZleGMsIHN0YXJ0cG9zLCBlbmRwb3MsICZuZXdwb3MpOworICAgICAgICAgICAgICAgIGlmICghcmVwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IG1heF9jaGFyX3NpemU7CisKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocmVwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiByZXAgaXMgdW5pY29kZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHJlcCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShyZXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsICJ1dGYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktMSwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKWM7CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlcCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworICAgICAgICAgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfREFUQShyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKHJlcCk7CisKKyAgICAgICAgICAgICAgICBpID0gbmV3cG9zOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IGkgPT0gc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDIKQEAgLTQxNiwzMSArNDQ5LDE4IEBACiAjZW5kaWYgLyogU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMSAqLwogICAgIH0KIAotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAvKiBUaGlzIHdhcyBzdGFjayBhbGxvY2F0ZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBwIC0gc3RhY2tidWY7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHN0YWNrYnVmLCBubmVlZGVkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEN1dCBiYWNrIHRvIHNpemUgYWN0dWFsbHkgbmVlZGVkLiAqLwotICAgICAgICBubmVlZGVkID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbm5lZWRlZCk7Ci0gICAgfQotCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAjZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CiAKICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgZXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXApOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIApAQCAtODA2LDUgKzgyNiwzIEBACiAjdW5kZWYgU1dBQjQKIAogI2VuZGlmCi0KLSNlbmRpZiAvKiBTVFJJTkdMSUJfSVNfVU5JQ09ERSAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaCBiL09iamVjdHMvc3RyaW5nbGliL2N0eXBlLmgKaW5kZXggNzM5Y2YzZC4uZjA1NDYyNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9jdHlwZS5oCkBAIC0xLDUgKzEsNiBAQAotLyogTk9URTogdGhpcyBBUEkgaXMgLU9OTFktIGZvciB1c2Ugd2l0aCBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgc3RyaW5ncy4gKi8KLS8qIERvIG5vdCB1c2UgaXQgd2l0aCBVbmljb2RlLiAqLworI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCisjIGVycm9yICJjdHlwZS5oIG9ubHkgY29tcGF0aWJsZSB3aXRoIGJ5dGUtd2lzZSBzdHJpbmdzIgorI2VuZGlmCiAKICNpbmNsdWRlICJieXRlc19tZXRob2RzLmgiCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaCBiL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaAppbmRleCBjZGE2OGU3Li45ODE2NWFkIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oCkBAIC0zMiw1MiArMzIsOTggQEAKICNkZWZpbmUgU1RSSU5HTElCX0JMT09NKG1hc2ssIGNoKSAgICAgXAogICAgICgobWFzayAmICAoMVVMIDw8ICgoY2gpICYgKFNUUklOR0xJQl9CTE9PTV9XSURUSCAtMSkpKSkpCiAKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorU1RSSU5HTElCKGZpbmRfY2hhcikoY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwgU1RSSU5HTElCX0NIQVIgY2gpCit7CisgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKnAsICplOworCisgICAgcCA9IHM7CisgICAgZSA9IHMgKyBuOworICAgIGlmIChuID4gMTApIHsKKyNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMQorICAgICAgICBwID0gbWVtY2hyKHMsIGNoLCBuKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgICAgICByZXR1cm4gLTE7CisjZWxzZQorICAgICAgICAvKiB1c2UgbWVtY2hyIGlmIHdlIGNhbiBjaG9vc2UgYSBuZWVkbGUgd2l0aG91dCB0d28gbWFueSBsaWtlbHkKKyAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gY2ggJiAweGZmOworICAgICAgICAvKiBJZiBsb29raW5nIGZvciBhIG11bHRpcGxlIG9mIDI1Niwgd2UnZCBoYXZlIHRvbworICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKKyAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLworICAgICAgICBpZiAobmVlZGxlICE9IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChwIDwgZSkgeworICAgICAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbWNocihwLCBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIC0gcCkgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBwID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICB3aGlsZSAocCA8IGUpIHsKKyAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLVNUUklOR0xJQihmYXN0c2VhcmNoX21lbWNocl8xY2hhcikoY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgY2gsIHVuc2lnbmVkIGNoYXIgbmVlZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKK1NUUklOR0xJQihyZmluZF9jaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLCBTVFJJTkdMSUJfQ0hBUiBjaCkKIHsKLSAgICBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkgewotICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqcHRyID0gczsKLSAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKmUgPSBzICsgbjsKLSAgICAgICAgd2hpbGUgKHB0ciA8IGUpIHsKLSAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbWNocigoY29uc3Qgdm9pZCAqKSBwdHIsIG5lZWRsZSwgKGUgLSBwdHIpICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgcHRyID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSA9PSAxIHx8ICpwdHIgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChwdHIgLSBzKTsKLSAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCi0gICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpwOwogI2lmZGVmIEhBVkVfTUVNUkNIUgogICAgIC8qIG1lbXJjaHIoKSBpcyBhIEdOVSBleHRlbnNpb24sIGF2YWlsYWJsZSBzaW5jZSBnbGliYyAyLjEuOTEuCiAgICAgICAgaXQgZG9lc24ndCBzZWVtIGFzIG9wdGltaXplZCBhcyBtZW1jaHIoKSwgYnV0IGlzIHN0aWxsIHF1aXRlCi0gICAgICAgZmFzdGVyIHRoYW4gb3VyIGhhbmQtd3JpdHRlbiBsb29wIGluIEZBU1RTRUFSQ0ggYmVsb3cgKi8KLSAgICBlbHNlIGlmIChtb2RlID09IEZBU1RfUlNFQVJDSCkgewotICAgICAgICB3aGlsZSAobiA+IDApIHsKLSAgICAgICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpmb3VuZDsKLSAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbXJjaHIoKGNvbnN0IHZvaWQgKikgcywgbmVlZGxlLCBuICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgZm91bmQgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIG4gPSBmb3VuZCAtIHM7Ci0gICAgICAgICAgICBpZiAoc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSA9PSAxIHx8ICpmb3VuZCA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgewotICAgICAgICBhc3NlcnQoMCk7IC8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgICAgZmFzdGVyIHRoYW4gb3VyIGhhbmQtd3JpdHRlbiBsb29wIGJlbG93ICovCiAKLSN1bmRlZiBET19NRU1DSFIKKyAgICBpZiAobiA+IDEwKSB7CisjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKKyAgICAgICAgcCA9IG1lbXJjaHIocywgY2gsIG4pOworICAgICAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgICAgIC8qIHVzZSBtZW1yY2hyIGlmIHdlIGNhbiBjaG9vc2UgYSBuZWVkbGUgd2l0aG91dCB0d28gbWFueSBsaWtlbHkKKyAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gY2ggJiAweGZmOworICAgICAgICAvKiBJZiBsb29raW5nIGZvciBhIG11bHRpcGxlIG9mIDI1Niwgd2UnZCBoYXZlIHRvbworICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKKyAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLworICAgICAgICBpZiAobmVlZGxlICE9IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbXJjaHIocywgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHAgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgbiA9IHAgLSBzOworICAgICAgICAgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmICAvKiBIQVZFX01FTVJDSFIgKi8KKyAgICBwID0gcyArIG47CisgICAgd2hpbGUgKHAgPiBzKSB7CisgICAgICAgIHAtLTsKKyAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCkBAIC05OSwyNSArMTQ1LDExIEBACiAgICAgICAgIGlmIChtIDw9IDApCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIC8qIHVzZSBzcGVjaWFsIGNhc2UgZm9yIDEtY2hhcmFjdGVyIHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKG4gPiAxMCAmJiAobW9kZSA9PSBGQVNUX1NFQVJDSAotI2lmZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IEZBU1RfUlNFQVJDSAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICkpIHsKLSAgICAgICAgICAgIC8qIHVzZSBtZW1jaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQotICAgICAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCi0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZTsKLSAgICAgICAgICAgIG5lZWRsZSA9IHBbMF0gJiAweGZmOwotI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKLSAgICAgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCi0gICAgICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKLSAgICAgICAgICAgICAgIGFuZCBVQ1M0IHJlcHJlc2VudGF0aW9ucy4gKi8KLSAgICAgICAgICAgIGlmIChuZWVkbGUgIT0gMCkKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUIoZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgIChzLCBuLCBwWzBdLCBuZWVkbGUsIG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlID09IEZBU1RfQ09VTlQpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gRkFTVF9TRUFSQ0gpCisgICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCKGZpbmRfY2hhcikocywgbiwgcFswXSk7CisgICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gRkFTVF9SU0VBUkNIKQorICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQihyZmluZF9jaGFyKShzLCBuLCBwWzBdKTsKKyAgICAgICAgZWxzZSB7ICAvKiBGQVNUX0NPVU5UICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHBbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKQEAgLTEyNSwxNCArMTU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhjb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfSBlbHNlIHsgICAgLyogRkFTVF9SU0VBUkNIICovCi0gICAgICAgICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+IC0xOyBpLS0pCi0gICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gcFswXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaCBiL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaAppbmRleCAxNDgxNWY2Li41MDliOTI5IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oCkBAIC0xMTcsODUgKzExNywzIEBACiB9CiAKICN1bmRlZiBGT1JNQVRfQlVGRkVSX1NJWkUKLQotI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCi0KLS8qCi1XcmFwcyBzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpIGFuZCBhZGRpdGlvbmFsbHkgZW5zdXJlcyB0aGF0IHRoZQotZmlyc3QgYXJndW1lbnQgaXMgYSB1bmljb2RlIG9iamVjdC4KLQotTm90ZSB0aGF0IHdlIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIG9mIHRoZSBzdWJzdHJpbmcgb2JqZWN0LAotc28gd2hlbiB3ZSBjcmVhdGUgdGhhdCBvYmplY3QgaW4gdGhpcyBmdW5jdGlvbiB3ZSBkb24ndCBERUNSRUYgaXQsCi1iZWNhdXNlIGl0IGNvbnRpbnVlcyBsaXZpbmcgaW4gdGhlIGNhbGxlciBmdW5jdGlvbnMgKHRob3NlIGZ1bmN0aW9ucywKLWFmdGVyIGZpbmlzaGluZyB1c2luZyB0aGUgc3Vic3RyaW5nLCBtdXN0IERFQ1JFRiBpdCkuCi0qLwotCi1QeV9MT0NBTF9JTkxJTkUoaW50KQotU1RSSU5HTElCKHBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSkoY29uc3QgY2hhciAqIGZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKLXsKLSAgICBQeU9iamVjdCAqdG1wX3N1YnN0cmluZzsKLQotICAgIGlmKFNUUklOR0xJQihwYXJzZV9hcmdzX2ZpbmRzKShmdW5jdGlvbl9uYW1lLCBhcmdzLCAmdG1wX3N1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkgewotICAgICAgICB0bXBfc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3QodG1wX3N1YnN0cmluZyk7Ci0gICAgICAgIGlmICghdG1wX3N1YnN0cmluZykKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAqc3Vic3RyaW5nID0gdG1wX3N1YnN0cmluZzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZWxzZSAvKiAhU1RSSU5HTElCX0lTX1VOSUNPREUgKi8KLQotLyoKLVdyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBjaGVja3Mgd2hldGhlciB0aGUKLWZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVnZXIgaW4gcmFuZ2UoMCwgMjU2KS4KLQotSWYgdGhpcyBpcyB0aGUgY2FzZSwgd3JpdGVzIHRoZSBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBieXRlIHBhcmFtZXRlcgotYW5kIHNldHMgc3Vib2JqIHRvIE5VTEwuIE90aGVyd2lzZSwgc2V0cyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc3Vib2JqCi1hbmQgZG9lc24ndCB0b3VjaCBieXRlLiBUaGUgb3RoZXIgcGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byB0aG9zZSBvZgotc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKS4KLSovCi0KLVB5X0xPQ0FMX0lOTElORShpbnQpCi1TVFJJTkdMSUIocGFyc2VfYXJnc19maW5kc19ieXRlKShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vib2JqLCBjaGFyICpieXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKLXsKLSAgICBQeU9iamVjdCAqdG1wX3N1Ym9iajsKLSAgICBQeV9zc2l6ZV90IGl2YWw7Ci0gICAgUHlPYmplY3QgKmVycjsKLQotICAgIGlmKCFTVFJJTkdMSUIocGFyc2VfYXJnc19maW5kcykoZnVuY3Rpb25fbmFtZSwgYXJncywgJnRtcF9zdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIVB5TnVtYmVyX0NoZWNrKHRtcF9zdWJvYmopKSB7Ci0gICAgICAgICpzdWJvYmogPSB0bXBfc3Vib2JqOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KHRtcF9zdWJvYmosIFB5RXhjX092ZXJmbG93RXJyb3IpOwotICAgIGlmIChpdmFsID09IC0xKSB7Ci0gICAgICAgIGVyciA9IFB5RXJyX09jY3VycmVkKCk7Ci0gICAgICAgIGlmIChlcnIgJiYgIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhlcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKSB7Ci0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID4gMjU1KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgKnN1Ym9iaiA9IE5VTEw7Ci0gICAgKmJ5dGUgPSAoY2hhcilpdmFsOwotICAgIHJldHVybiAxOwotfQotCi0jZW5kaWYgLyogU1RSSU5HTElCX0lTX1VOSUNPREUgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmRfbWF4X2NoYXIuaCBiL09iamVjdHMvc3RyaW5nbGliL2ZpbmRfbWF4X2NoYXIuaAppbmRleCBlYjNmZTg4Li44Y2NiYzMwIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9maW5kX21heF9jaGFyLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZF9tYXhfY2hhci5oCkBAIC0xLDYgKzEsOCBAQAogLyogRmluZGluZyB0aGUgb3B0aW1hbCB3aWR0aCBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gYSBidWZmZXIgKi8KIAotI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCisjaWYgIVNUUklOR0xJQl9JU19VTklDT0RFCisjIGVycm9yICJmaW5kX21heF9jaGFyLmggaXMgc3BlY2lmaWMgdG8gVW5pY29kZSIKKyNlbmRpZgogCiAvKiBNYXNrIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciBhIEMgJ2xvbmcnIGNvbnRhaW5zIGEKICAgIG5vbi1BU0NJSSwgVVRGOC1lbmNvZGVkIGNoYXIuICovCkBAIC0xMjksNSArMTMxLDQgQEAKICN1bmRlZiBNQVhfQ0hBUl9VQ1M0CiAKICNlbmRpZiAvKiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMSAqLwotI2VuZGlmIC8qIFNUUklOR0xJQl9JU19VTklDT0RFICovCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2pvaW4uaCBiL09iamVjdHMvc3RyaW5nbGliL2pvaW4uaAppbmRleCBjYmY4MWJlLi45MGY5NjZkIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9qb2luLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvam9pbi5oCkBAIC0xLDYgKzEsNiBAQAogLyogc3RyaW5nbGliOiBieXRlcyBqb2luaW5nIGltcGxlbWVudGF0aW9uICovCiAKLSNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgIT0gMQorI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCiAjZXJyb3Igam9pbi5oIG9ubHkgY29tcGF0aWJsZSB3aXRoIGJ5dGUtd2lzZSBzdHJpbmdzCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCmluZGV4IDZlMmYwNzMuLmRmNTAxZWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmgKQEAgLTIsOCArMiw4IEBACiAKICNpbmNsdWRlIDxsb2NhbGUuaD4KIAotI2lmbmRlZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQotIyAgIGVycm9yICJsb2NhbGV1dGlsIGlzIHNwZWNpZmljIHRvIFVuaWNvZGUiCisjaWYgIVNUUklOR0xJQl9JU19VTklDT0RFCisjICAgZXJyb3IgImxvY2FsZXV0aWwuaCBpcyBzcGVjaWZpYyB0byBVbmljb2RlIgogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKaW5kZXggYjU1OWI1My4uNjI1NTA3ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKQEAgLTEsMTQgKzEsMjEgQEAKLS8qIE5PVEU6IHRoaXMgQVBJIGlzIC1PTkxZLSBmb3IgdXNlIHdpdGggc2luZ2xlIGJ5dGUgY2hhcmFjdGVyIHN0cmluZ3MuICovCi0vKiBEbyBub3QgdXNlIGl0IHdpdGggVW5pY29kZS4gKi8KKyNpZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQorIyBlcnJvciAidHJhbnNtb2dyaWZ5Lmggb25seSBjb21wYXRpYmxlIHdpdGggYnl0ZS13aXNlIHN0cmluZ3MiCisjZW5kaWYKIAogLyogdGhlIG1vcmUgY29tcGxpY2F0ZWQgbWV0aG9kcy4gIHBhcnRzIG9mIHRoZXNlIHNob3VsZCBiZSBwdWxsZWQgb3V0IGludG8gdGhlCiAgICBzaGFyZWQgY29kZSBpbiBieXRlc19tZXRob2RzLmMgdG8gY3V0IGRvd24gb24gZHVwbGljYXRlIGNvZGUgYmxvYXQuICAqLwogCi1QeURvY19TVFJWQVIoZXhwYW5kdGFic19fZG9jX18sCi0iQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXG5cCi1cblwKLVJldHVybiBhIGNvcHkgb2YgQiB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cblwKLUlmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLiIpOworUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCityZXR1cm5fc2VsZihQeU9iamVjdCAqc2VsZikKK3sKKyNpZiAhU1RSSU5HTElCX01VVEFCTEUKKyAgICBpZiAoU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Cit9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cmluZ2xpYl9leHBhbmR0YWJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCkBAIC05MywzOSArMTAwLDI1IEBACiAgICAgaWYgKHJpZ2h0IDwgMCkKICAgICAgICAgcmlnaHQgPSAwOwogCi0gICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwotI2VuZGlmIC8qIFNUUklOR0xJQl9NVVRBQkxFICovCisgICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKICAgICB9CiAKLSAgICB1ID0gU1RSSU5HTElCX05FVyhOVUxMLAotCQkJCSAgIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOworICAgIHUgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOwogICAgIGlmICh1KSB7CiAgICAgICAgIGlmIChsZWZ0KQogICAgICAgICAgICAgbWVtc2V0KFNUUklOR0xJQl9TVFIodSksIGZpbGwsIGxlZnQpOwogICAgICAgICBQeV9NRU1DUFkoU1RSSU5HTElCX1NUUih1KSArIGxlZnQsCi0JICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCi0JICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOworICAgICAgICAgICAgICAgU1RSSU5HTElCX1NUUihzZWxmKSwKKyAgICAgICAgICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOwogICAgICAgICBpZiAocmlnaHQpCiAgICAgICAgICAgICBtZW1zZXQoU1RSSU5HTElCX1NUUih1KSArIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpLAotCQkgICBmaWxsLCByaWdodCk7CisgICAgICAgICAgICAgICAgICAgZmlsbCwgcmlnaHQpOwogICAgIH0KIAogICAgIHJldHVybiB1OwogfQogCi1QeURvY19TVFJWQVIobGp1c3RfX2RvY19fLAotIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xuIgotImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ2xpYl9sanVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC0xMzUsMjcgKzEyOCwxNCBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOmxqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgMCwgd2lkdGggLSBTVFJJTkdMSUJfTEVOKHNlbGYpLCBmaWxsY2hhcik7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJqdXN0X19kb2NfXywKLSJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKLSJcbiIKLSJSZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCi0iZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdsaWJfcmp1c3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtMTY1LDI3ICsxNDUsMTQgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpyanVzdCIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCAmJiBTVFJJTkdMSUJfQ0hFQ0tfRVhBQ1Qoc2VsZikpIHsKLSNpZiBTVFJJTkdMSUJfTVVUQUJMRQotICAgICAgICAvKiBXZSdyZSBkZWZpbmVkIGFzIHJldHVybmluZyBhIGNvcHk7ICBJZiB0aGUgb2JqZWN0IGlzIG11dGFibGUKLSAgICAgICAgICogdGhhdCBtZWFucyB3ZSBtdXN0IG1ha2UgYW4gaWRlbnRpY2FsIGNvcHkuICovCi0gICAgICAgIHJldHVybiBTVFJJTkdMSUJfTkVXKFNUUklOR0xJQl9TVFIoc2VsZiksIFNUUklOR0xJQl9MRU4oc2VsZikpOwotI2Vsc2UKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSNlbmRpZgorICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKICAgICB9CiAKICAgICByZXR1cm4gcGFkKHNlbGYsIHdpZHRoIC0gU1RSSU5HTElCX0xFTihzZWxmKSwgMCwgZmlsbGNoYXIpOwogfQogCiAKLVB5RG9jX1NUUlZBUihjZW50ZXJfX2RvY19fLAotIkIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKLSJcbiIKLSJSZXR1cm4gQiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguICBQYWRkaW5nIGlzXG4iCi0iZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nbGliX2NlbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC0xOTYsMTUgKzE2Myw4IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6Y2VudGVyIiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIG1hcmcgPSB3aWR0aCAtIFNUUklOR0xJQl9MRU4oc2VsZik7CkBAIC0yMTMsMTIgKzE3Myw2IEBACiAgICAgcmV0dXJuIHBhZChzZWxmLCBsZWZ0LCBtYXJnIC0gbGVmdCwgZmlsbGNoYXIpOwogfQogCi1QeURvY19TVFJWQVIoemZpbGxfX2RvY19fLAotIkIuemZpbGwod2lkdGgpIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlBhZCBhIG51bWVyaWMgc3RyaW5nIEIgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkXG4iCi0ib2YgdGhlIHNwZWNpZmllZCB3aWR0aC4gIEIgaXMgbmV2ZXIgdHJ1bmNhdGVkLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nbGliX3pmaWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTIzMSwyMSArMTg1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCkgewotICAgICAgICBpZiAoU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7Ci0jaWYgU1RSSU5HTElCX01VVEFCTEUKLSAgICAgICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgICAgICogdGhhdCBtZWFucyB3ZSBtdXN0IG1ha2UgYW4gaWRlbnRpY2FsIGNvcHkuICovCi0gICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKLSNlbHNlCi0gICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUJfTkVXKAotICAgICAgICAgICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCi0gICAgICAgICAgICAgICAgU1RSSU5HTElCX0xFTihzZWxmKQotICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIGZpbGwgPSB3aWR0aCAtIFNUUklOR0xJQl9MRU4oc2VsZik7CkBAIC0yNjIsNSArMjAyLDUwMCBAQAogICAgICAgICBwW2ZpbGxdID0gJzAnOwogICAgIH0KIAotICAgIHJldHVybiAoUHlPYmplY3QqKSBzOworICAgIHJldHVybiBzOwogfQorCisKKy8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KKworI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQorCisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorY291bnRjaGFyKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLCBjaGFyIGMsCisgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBjb25zdCBjaGFyICpzdGFydCA9IHRhcmdldDsKKyAgICBjb25zdCBjaGFyICplbmQgPSB0YXJnZXQgKyB0YXJnZXRfbGVuOworCisgICAgd2hpbGUgKChzdGFydCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQgLSBzdGFydCwgYykpICE9IE5VTEwpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCisvKiBBbGdvcml0aG1zIGZvciBkaWZmZXJlbnQgY2FzZXMgb2Ygc3RyaW5nIHJlcGxhY2VtZW50ICovCisKKy8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9pbnRlcmxlYXZlKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3M7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICAvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlcjsKKyAgICAgICBjb3VudCA9IG1pbihtYXhjb3VudCwgc2VsZl9sZW4gKyAxKSAqLworICAgIGlmIChtYXhjb3VudCA8PSBzZWxmX2xlbikgeworICAgICAgICBjb3VudCA9IG1heGNvdW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3c6IHNlbGZfbGVuICsgMSA8PSBtYXhjb3VudCA8PSBQWV9TU0laRV9UX01BWC4gKi8KKyAgICAgICAgY291bnQgPSBzZWxmX2xlbiArIDE7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KKyAgICBhc3NlcnQoY291bnQgPiAwKTsKKyAgICBpZiAodG9fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSBieXRlcyBhcmUgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOworICAgIHJlc3VsdCA9IFNUUklOR0xJQl9ORVcoTlVMTCwgcmVzdWx0X2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBpZiAodG9fbGVuID4gMSkgeworICAgICAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIGNvdW50IC09IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHRfc1swXSA9IHRvX3NbMF07CisgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgY291bnQgLT0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgcmVzdWx0X3NbMF0gPSB0b19zWzBdOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuIC0gaSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBTcGVjaWFsIGNhc2UgZm9yIGRlbGV0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciAqLworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIHRvPSIiLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgc2VsZl9sZW4gPSBTVFJJTkdMSUJfTEVOKHNlbGYpOworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisKKyAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCisgICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOworCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCByZXN1bHRfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworCisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kIC0gc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCArIDE7CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KKworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworCisgICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKKworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKKyAgICBhc3NlcnQgKHJlc3VsdF9sZW4+PTApOworCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCByZXN1bHRfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworCisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OworCisgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQgLSBzdGFydCk7CisKKyAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCArIGZyb21fbGVuOworICAgIH0KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZShQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKm5leHQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKKworICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IGJ5dGVzICovCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCBzZWxmX2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfcyA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOworCisgICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKyAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0IC0gc2VsZl9zKTsKKyAgICAqc3RhcnQgPSB0b19jOworICAgIHN0YXJ0Kys7CisgICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKworICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZCAtIHN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICpuZXh0ID0gdG9fYzsKKyAgICAgICAgc3RhcnQgPSBuZXh0ICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICAvKiBUaGUgcmVzdWx0IGJ5dGVzIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLworCisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgYnl0ZXMgKi8KKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHNlbGZfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisKKyAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLworICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OworICAgIFB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOworICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisKKyAgICB3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7CisgICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0ICsgb2Zmc2V0LCB0b19zLCBmcm9tX2xlbik7CisgICAgICAgIHN0YXJ0ICs9IG9mZnNldCArIGZyb21fbGVuOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KKyAgICBhc3NlcnQoY291bnQgPiAwKTsKKyAgICBpZiAodG9fbGVuIC0gMSA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBieXRlcyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuIC0gMSk7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQgLSBzdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQgLSBzdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9zdWJzdHJpbmcoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7CisKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCisgICAgYXNzZXJ0KGNvdW50ID4gMCk7CisgICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSBmcm9tX2xlbik7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7CisgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0IC0gc3RhcnQpOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCA9IG5leHQgKyBmcm9tX2xlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGlmIChtYXhjb3VudCA8IDApIHsKKyAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKKyAgICB9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgU1RSSU5HTElCX0xFTihzZWxmKSA9PSAwKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCisgICAgaWYgKGZyb21fbGVuID09IDApIHsKKyAgICAgICAgaWYgKHRvX2xlbiA9PSAwKSB7CisgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIGJ5dGVzIGV2ZXJ5d2hlcmUuICAgICovCisgICAgICAgIC8qICAgID4+PiBiIlB5dGhvbiIucmVwbGFjZShiIiIsIGIiLiIpICAqLworICAgICAgICAvKiAgICBiJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfQorCisgICAgLyogRXhjZXB0IGZvciBiIiIucmVwbGFjZShiIiIsIGIiQSIpID09IGIiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCisgICAgLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgYnl0ZXMgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgYnl0ZXMgKi8KKyAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IGJ5dGVzICovCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgaWYgKHRvX2xlbiA9PSAwKSB7CisgICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2Zyb20nIGJ5dGVzICovCisgICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCisgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3N1YnN0cmluZygKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggYnl0ZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KKworICAgIGlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKKyAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgdG9fc1swXSwgbWF4Y291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCisgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoCisgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZygKKyAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0KK30KKworI3VuZGVmIGZpbmRjaGFyCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaAppbmRleCBiZTA5YjVmLi4xNGZhMjhlIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICByZXR1cm4gUHlVbmljb2RlX1N1YnN0cmluZyhzdHItPnN0ciwgc3RyLT5zdGFydCwgc3RyLT5lbmQpOwogfQogCi0vKiByZXR1cm4gYSBuZXcgc3RyaW5nLiAgaWYgc3RyLT5zdHIgaXMgTlVMTCwgcmV0dXJuIE5vbmUgKi8KKy8qIHJldHVybiBhIG5ldyBzdHJpbmcuICBpZiBzdHItPnN0ciBpcyBOVUxMLCByZXR1cm4gYSBuZXcgZW1wdHkgc3RyaW5nICovCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIFN1YlN0cmluZ19uZXdfb2JqZWN0X29yX2VtcHR5KFN1YlN0cmluZyAqc3RyKQogewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYyBiL09iamVjdHMvc3RydWN0c2VxLmMKaW5kZXggNjY0MzQ0Yi4uZTMxNWNiYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYworKysgYi9PYmplY3RzL3N0cnVjdHNlcS5jCkBAIC00LDkgKzQsOSBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi1zdGF0aWMgY2hhciB2aXNpYmxlX2xlbmd0aF9rZXlbXSA9ICJuX3NlcXVlbmNlX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZpc2libGVfbGVuZ3RoX2tleVtdID0gIm5fc2VxdWVuY2VfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJlYWxfbGVuZ3RoX2tleVtdID0gIm5fZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVubmFtZWRfZmllbGRzX2tleVtdID0gIm5fdW5uYW1lZF9maWVsZHMiOwogCiAvKiBGaWVsZHMgd2l0aCB0aGlzIG5hbWUgaGF2ZSBvbmx5IGEgZmllbGQgaW5kZXgsIG5vdCBhIGZpZWxkIG5hbWUuCiAgICBUaGV5IGFyZSBvbmx5IGFsbG93ZWQgZm9yIGluZGljZXMgPCBuX3Zpc2libGVfZmllbGRzLiAqLwpAQCAtMTYsMTQgKzE2LDE0IEBACiBfUHlfSURFTlRJRklFUihuX3VubmFtZWRfZmllbGRzKTsKIAogI2RlZmluZSBWSVNJQkxFX1NJWkUob3ApIFB5X1NJWkUob3ApCi0jZGVmaW5lIFZJU0lCTEVfU0laRV9UUCh0cCkgUHlMb25nX0FzTG9uZyggXAorI2RlZmluZSBWSVNJQkxFX1NJWkVfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3NlcXVlbmNlX2ZpZWxkcykpCiAKLSNkZWZpbmUgUkVBTF9TSVpFX1RQKHRwKSBQeUxvbmdfQXNMb25nKCBcCisjZGVmaW5lIFJFQUxfU0laRV9UUCh0cCkgUHlMb25nX0FzU3NpemVfdCggXAogICAgICAgICAgICAgICAgICAgICAgIF9QeURpY3RfR2V0SXRlbUlkKCh0cCktPnRwX2RpY3QsICZQeUlkX25fZmllbGRzKSkKICNkZWZpbmUgUkVBTF9TSVpFKG9wKSBSRUFMX1NJWkVfVFAoUHlfVFlQRShvcCkpCiAKLSNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc0xvbmcoIFwKKyNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3VubmFtZWRfZmllbGRzKSkKICNkZWZpbmUgVU5OQU1FRF9GSUVMRFMob3ApIFVOTkFNRURfRklFTERTX1RQKFB5X1RZUEUob3ApKQogCkBAIC0xNjQsNyArMTY0LDggQEAKICNkZWZpbmUgVFlQRV9NQVhTSVpFIDEwMAogCiAgICAgUHlUeXBlT2JqZWN0ICp0eXAgPSBQeV9UWVBFKG9iaik7Ci0gICAgaW50IGksIHJlbW92ZWxhc3QgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgcmVtb3ZlbGFzdCA9IDA7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07CiAgICAgY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOwpAQCAtMjM2LDggKzIzNyw3IEBACiAgICAgUHlPYmplY3QqIHR1cCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIGRpY3QgPSBOVUxMOwogICAgIFB5T2JqZWN0KiByZXN1bHQ7Ci0gICAgUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkczsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG5fZmllbGRzLCBuX3Zpc2libGVfZmllbGRzLCBuX3VubmFtZWRfZmllbGRzLCBpOwogCiAgICAgbl9maWVsZHMgPSBSRUFMX1NJWkUoc2VsZik7CiAgICAgbl92aXNpYmxlX2ZpZWxkcyA9IFZJU0lCTEVfU0laRShzZWxmKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogewogICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5TWVtYmVyRGVmKiBtZW1iZXJzOwotICAgIGludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOworICAgIFB5X3NzaXplX3Qgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKICAgICBQeU9iamVjdCAqdjsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKQEAgLTM3Myw5ICszNzMsOSBAQAogICAgIFB5X0lOQ1JFRih0eXBlKTsKIAogICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OwotI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VUX0RJQ1RfRlJPTV9TSVpFKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tU3NpemVfdCh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh2ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdikgPCAwKSB7ICAgICAgICAgICBcCkBAIC0zODUsOSArMzg1LDkgQEAKICAgICAgICAgUHlfREVDUkVGKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAotICAgIFNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7Ci0gICAgU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOwotICAgIFNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOworICAgIFNFVF9ESUNUX0ZST01fU0laRSh2aXNpYmxlX2xlbmd0aF9rZXksIGRlc2MtPm5faW5fc2VxdWVuY2UpOworICAgIFNFVF9ESUNUX0ZST01fU0laRShyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9TSVpFKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggNzkyMGZlYy4uYzBmZjQ5OSAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtMzYsNiArMzYsMTYgQEAKIHN0YXRpYyB2b2lkCiBzaG93X3RyYWNrKHZvaWQpCiB7CisgICAgUHlPYmplY3QgKnhvcHRpb25zLCAqdmFsdWU7CisgICAgX1B5X0lERU5USUZJRVIoc2hvd2FsbG9jY291bnQpOworCisgICAgeG9wdGlvbnMgPSBQeVN5c19HZXRYT3B0aW9ucygpOworICAgIGlmICh4b3B0aW9ucyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgdmFsdWUgPSBfUHlEaWN0X0dldEl0ZW1JZCh4b3B0aW9ucywgJlB5SWRfc2hvd2FsbG9jY291bnQpOworICAgIGlmICh2YWx1ZSAhPSBQeV9UcnVlKQorICAgICAgICByZXR1cm47CisKICAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyBjcmVhdGVkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAogICAgICAgICBjb3VudF90cmFja2VkICsgY291bnRfdW50cmFja2VkKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyB0cmFja2VkIGJ5IHRoZSBHQzogJSIgUFlfRk9STUFUX1NJWkVfVApAQCAtMTQ5LDcgKzE1OSw2IEBACiBpbnQKIFB5VHVwbGVfU2V0SXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0gICAgUHlPYmplY3QgKm9sZGl0ZW07CiAgICAgUHlPYmplY3QgKipwOwogICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkgfHwgb3AtPm9iX3JlZmNudCAhPSAxKSB7CiAgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CkBAIC0xNjMsOSArMTcyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBwID0gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9YU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDQ2LDkgKzQ1Myw5IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICNkZWZpbmUgYiAoKFB5VHVwbGVPYmplY3QgKiliYikKLSAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0gICAgaWYgKHNpemUgPCAwKQorICAgIGlmIChQeV9TSVpFKGEpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKQogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7CiAgICAgbnAgPSAoUHlUdXBsZU9iamVjdCAqKSBQeVR1cGxlX05ldyhzaXplKTsKICAgICBpZiAobnAgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL09iamVjdHMvdHlwZW9iamVjdC5jIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKaW5kZXggMTE4MWQ3Ny4uMjA5ZDRmYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy90eXBlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKQEAgLTQ4LDE1ICs0OCwxOCBAQAogX1B5X0lERU5USUZJRVIoX19hYnN0cmFjdG1ldGhvZHNfXyk7CiBfUHlfSURFTlRJRklFUihfX2NsYXNzX18pOwogX1B5X0lERU5USUZJRVIoX19kZWxpdGVtX18pOworX1B5X0lERU5USUZJRVIoX19kZWZpbml0aW9uX29yZGVyX18pOwogX1B5X0lERU5USUZJRVIoX19kaWN0X18pOwogX1B5X0lERU5USUZJRVIoX19kb2NfXyk7CiBfUHlfSURFTlRJRklFUihfX2dldGF0dHJpYnV0ZV9fKTsKIF9QeV9JREVOVElGSUVSKF9fZ2V0aXRlbV9fKTsKIF9QeV9JREVOVElGSUVSKF9faGFzaF9fKTsKK19QeV9JREVOVElGSUVSKF9faW5pdF9zdWJjbGFzc19fKTsKIF9QeV9JREVOVElGSUVSKF9fbGVuX18pOwogX1B5X0lERU5USUZJRVIoX19tb2R1bGVfXyk7CiBfUHlfSURFTlRJRklFUihfX25hbWVfXyk7CiBfUHlfSURFTlRJRklFUihfX25ld19fKTsKK19QeV9JREVOVElGSUVSKF9fc2V0X25hbWVfXyk7CiBfUHlfSURFTlRJRklFUihfX3NldGl0ZW1fXyk7CiBfUHlfSURFTlRJRklFUihidWlsdGlucyk7CiAKQEAgLTQ2MCw3ICs0NjMsNyBAQAogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19tb2R1bGVfXyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgUHlfWElOQ1JFRihtb2QpOworICAgICAgICBQeV9JTkNSRUYobW9kKTsKICAgICAgICAgcmV0dXJuIG1vZDsKICAgICB9CiAgICAgZWxzZSB7CkBAIC00ODcsNiArNDkwLDIzIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCit0eXBlX2RlZm9yZGVyKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKK3sKKyAgICBpZiAodHlwZS0+dHBfZGVmb3JkZXIgPT0gTlVMTCkKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgUHlfSU5DUkVGKHR5cGUtPnRwX2RlZm9yZGVyKTsKKyAgICByZXR1cm4gdHlwZS0+dHBfZGVmb3JkZXI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGVfc2V0X2RlZm9yZGVyKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQoreworICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgIFB5X1hTRVRSRUYodHlwZS0+dHBfZGVmb3JkZXIsIHZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfYWJzdHJhY3RtZXRob2RzKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKICAgICBQeU9iamVjdCAqbW9kID0gTlVMTDsKQEAgLTUwMCw3ICs1MjAsNyBAQAogICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBtZXNzYWdlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICBQeV9JTkNSRUYobW9kKTsKICAgICByZXR1cm4gbW9kOwogfQogCkBAIC01NDgsNyArNTY4LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKik7CiBQeV9MT0NBTF9JTkxJTkUoaW50KSB0eXBlX2lzX3N1YnR5cGVfYmFzZV9jaGFpbihQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwotc3RhdGljIGludCBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGFkZF9zdWJjbGFzcyhQeVR5cGVPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKIHN0YXRpYyBpbnQgYWRkX2FsbF9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwpAQCAtODMyLDYgKzg1Miw4IEBACiAgICAgeyJfX3F1YWxuYW1lX18iLCAoZ2V0dGVyKXR5cGVfcXVhbG5hbWUsIChzZXR0ZXIpdHlwZV9zZXRfcXVhbG5hbWUsIE5VTEx9LAogICAgIHsiX19iYXNlc19fIiwgKGdldHRlcil0eXBlX2dldF9iYXNlcywgKHNldHRlcil0eXBlX3NldF9iYXNlcywgTlVMTH0sCiAgICAgeyJfX21vZHVsZV9fIiwgKGdldHRlcil0eXBlX21vZHVsZSwgKHNldHRlcil0eXBlX3NldF9tb2R1bGUsIE5VTEx9LAorICAgIHsiX19kZWZpbml0aW9uX29yZGVyX18iLCAoZ2V0dGVyKXR5cGVfZGVmb3JkZXIsCisgICAgIChzZXR0ZXIpdHlwZV9zZXRfZGVmb3JkZXIsIE5VTEx9LAogICAgIHsiX19hYnN0cmFjdG1ldGhvZHNfXyIsIChnZXR0ZXIpdHlwZV9hYnN0cmFjdG1ldGhvZHMsCiAgICAgIChzZXR0ZXIpdHlwZV9zZXRfYWJzdHJhY3RtZXRob2RzLCBOVUxMfSwKICAgICB7Il9fZGljdF9fIiwgIChnZXR0ZXIpdHlwZV9kaWN0LCAgTlVMTCwgTlVMTH0sCkBAIC04ODgsMjUgKzkxMCwzMyBAQAogI2VuZGlmCiAKICAgICBvYmogPSB0eXBlLT50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0gICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCi0gICAgICAgICAgIGRvbid0IGNhbGwgdHBfaW5pdCBvbiB0aGUgcmVzdWx0LiAqLwotICAgICAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKLSAgICAgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCi0gICAgICAgICAgICAoa3dkcyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCi0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICAvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAotICAgICAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KLSAgICAgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2JqKSwgdHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB0eXBlID0gUHlfVFlQRShvYmopOwotICAgICAgICBpZiAodHlwZS0+dHBfaW5pdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgcmVzID0gdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpOwotICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKLSAgICAgICAgICAgICAgICBvYmogPSBOVUxMOwotICAgICAgICAgICAgfQorICAgIG9iaiA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KChQeU9iamVjdCopdHlwZSwgb2JqLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogVWdseSBleGNlcHRpb246IHdoZW4gdGhlIGNhbGwgd2FzIHR5cGUoc29tZXRoaW5nKSwKKyAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KKyAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKKyAgICAgICAgUHlUdXBsZV9DaGVjayhhcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKKyAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAorICAgICAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCisgICAgICAgIHJldHVybiBvYmo7CisKKyAgICAvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAorICAgICAgIGl0IHdvbid0IGJlIGluaXRpYWxpemVkLiAqLworICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKQorICAgICAgICByZXR1cm4gb2JqOworCisgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKKyAgICBpZiAodHlwZS0+dHBfaW5pdCAhPSBOVUxMKSB7CisgICAgICAgIGludCByZXMgPSB0eXBlLT50cF9pbml0KG9iaiwgYXJncywga3dkcyk7CisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIG9iaiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvYmo7CkBAIC0xNDExLDM2ICsxNDQxLDM4IEBACiAgICBhcyBsb29rdXBfbWV0aG9kIHRvIGNhY2hlIHRoZSBpbnRlcm5lZCBuYW1lIHN0cmluZyBvYmplY3QuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX21ldGhvZChQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY2hhciAqZm9ybWF0LCAuLi4pCitjYWxsX21ldGhvZChQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YTsKLSAgICBQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOwotICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTCwgKnJldHZhbDsKIAogICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUobywgbmFtZWlkKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHZhX2VuZCh2YSk7CiAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZWlkLT5vYmplY3QpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpCisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOworCisgICAgICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotICAgIGVsc2UKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICB2YV9lbmQodmEpOwogCi0gICAgdmFfZW5kKHZhKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwogCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR2YWwgPSBfUHlPYmplY3RfQ2FsbE5vQXJnKGZ1bmMpOwogICAgIH0KIAotICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLSAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCi0gICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKIAogICAgIHJldHVybiByZXR2YWw7CkBAIC0xNDQ5LDM2ICsxNDgxLDM4IEBACiAvKiBDbG9uZSBvZiBjYWxsX21ldGhvZCgpIHRoYXQgcmV0dXJucyBOb3RJbXBsZW1lbnRlZCB3aGVuIHRoZSBsb29rdXAgZmFpbHMuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX21heWJlKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjaGFyICpmb3JtYXQsIC4uLikKK2NhbGxfbWF5YmUoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmE7Ci0gICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKLSAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEwsICpyZXR2YWw7CiAKICAgICBmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWVpZCk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewotICAgICAgICB2YV9lbmQodmEpOwogICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisKKyAgICAgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0gICAgZWxzZQotICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIHZhX2VuZCh2YSk7CiAKLSAgICB2YV9lbmQodmEpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CiAKLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHZhbCA9IF9QeU9iamVjdF9DYWxsTm9BcmcoZnVuYyk7CiAgICAgfQogCi0gICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0KLSAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgUHlfREVDUkVGKGZ1bmMpOwogCiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTE1MzAsNyArMTU2NCw2IEBACiAgICAgUHlPYmplY3QgKm5hbWUgPSBfUHlPYmplY3RfR2V0QXR0cklkKGNscywgJlB5SWRfX19uYW1lX18pOwogICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKICAgICAgICAgbmFtZSA9IFB5T2JqZWN0X1JlcHIoY2xzKTsKICAgICB9CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKQEAgLTIwMjQsNiArMjA1Nyw4IEBACiBzdGF0aWMgaW50IG9iamVjdF9pbml0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCB1cGRhdGVfc2xvdChQeVR5cGVPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCBmaXh1cF9zbG90X2Rpc3BhdGNoZXJzKFB5VHlwZU9iamVjdCAqKTsKK3N0YXRpYyBpbnQgc2V0X25hbWVzKFB5VHlwZU9iamVjdCAqKTsKK3N0YXRpYyBpbnQgaW5pdF9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIC8qCiAgKiBIZWxwZXJzIGZvciAgX19kaWN0X18gZGVzY3JpcHRvci4gIFdlIGRvbid0IHdhbnQgdG8gZXhwb3NlIHRoZSBkaWN0cwpAQCAtMjA4OCw3ICsyMTIzLDcgQEAKIHN0YXRpYyBpbnQKIHN1YnR5cGVfc2V0ZGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICoqZGljdHB0cjsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CiAgICAgUHlUeXBlT2JqZWN0ICpiYXNlOwogCiAgICAgYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KFB5X1RZUEUob2JqKSk7CkBAIC0yMTE5LDEwICsyMTU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICJub3QgYSAnJS4yMDBzJyIsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBkaWN0ID0gKmRpY3RwdHI7CiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgKmRpY3RwdHIgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIFB5X1hTRVRSRUYoKmRpY3RwdHIsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjIwMSw3ICsyMjM0LDggQEAKICAgICBhc3NlcnQoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykpOwogICAgIGFzc2VydChrd2RzID09IE5VTEwgfHwgUHlEaWN0X0NoZWNrKGt3ZHMpKTsKIAotICAgIGlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpICE9IDApIHsKKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZS5fX2luaXRfXygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTIyNjgsNyArMjMwMiw2IEBACiB0eXBlX25ldyhQeVR5cGVPYmplY3QgKm1ldGF0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlPYmplY3QgKm5hbWUsICpiYXNlcyA9IE5VTEwsICpvcmlnX2RpY3QsICpkaWN0ID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OwogICAgIFB5T2JqZWN0ICpxdWFsbmFtZSwgKnNsb3RzID0gTlVMTCwgKnRtcCwgKm5ld3Nsb3RzOwogICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IE5VTEwsICpiYXNlLCAqdG1wdHlwZSwgKndpbm5lcjsKICAgICBQeUhlYXBUeXBlT2JqZWN0ICpldDsKQEAgLTIyODIsMTEgKzIzMTUsMTMgQEAKICAgICBhc3NlcnQoa3dkcyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2RzKSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2U6IHR5cGUoeCkgc2hvdWxkIHJldHVybiB4LT5vYl90eXBlICovCi0gICAgeworICAgIC8qIFdlIG9ubHkgd2FudCB0eXBlIGl0c2VsZiB0byBhY2NlcHQgdGhlIG9uZS1hcmd1bWVudCBmb3JtICgjMjcxNTcpCisgICAgICAgTm90ZTogV2UgZG9uJ3QgY2FsbCBQeVR5cGVfQ2hlY2tFeGFjdCBhcyB0aGF0IGFsc28gYWxsb3dzIHN1YmNsYXNzZXMgKi8KKyAgICBpZiAobWV0YXR5cGUgPT0gJlB5VHlwZV9UeXBlKSB7CiAgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbmFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwogICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5rd2RzID0ga3dkcyA9PSBOVUxMID8gMCA6IFB5RGljdF9TaXplKGt3ZHMpOwogCi0gICAgICAgIGlmIChQeVR5cGVfQ2hlY2tFeGFjdChtZXRhdHlwZSkgJiYgbmFyZ3MgPT0gMSAmJiBua3dkcyA9PSAwKSB7CisgICAgICAgIGlmIChuYXJncyA9PSAxICYmIG5rd2RzID09IDApIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp4ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9UWVBFKHgpKTsKICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgUHlfVFlQRSh4KTsKQEAgLTIyOTUsNyArMjMzMCw3IEBACiAgICAgICAgIC8qIFNGIGJ1ZyA0NzUzMjcgLS0gaWYgdGhhdCBkaWRuJ3QgdHJpZ2dlciwgd2UgbmVlZCAzCiAgICAgICAgICAgIGFyZ3VtZW50cy4gYnV0IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBiZWxvdyBtYXkgZ2l2ZQogICAgICAgICAgICBhIG1zZyBzYXlpbmcgdHlwZSgpIG5lZWRzIGV4YWN0bHkgMy4gKi8KLSAgICAgICAgaWYgKG5hcmdzICsgbmt3ZHMgIT0gMykgeworICAgICAgICBpZiAobmFyZ3MgIT0gMykgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHMiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjMwMywxMCArMjMzOCw4IEBACiAgICAgfQogCiAgICAgLyogQ2hlY2sgYXJndW1lbnRzOiAobmFtZSwgYmFzZXMsIGRpY3QpICovCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlVPIU8hOnR5cGUiLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmJhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJm9yaWdfZGljdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVTyFPITp0eXBlLl9fbmV3X18iLCAmbmFtZSwgJlB5VHVwbGVfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2VzLCAmUHlEaWN0X1R5cGUsICZvcmlnX2RpY3QpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIERldGVybWluZSB0aGUgcHJvcGVyIG1ldGF0eXBlIHRvIGRlYWwgd2l0aCB0aGlzOiAqLwpAQCAtMjMzOCw2ICsyMzcxLDcgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKKyAgICAvKiBDb3B5IHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZSBpbnRvIGEgbmV3IGRpY3QuICovCiAgICAgZGljdCA9IFB5RGljdF9Db3B5KG9yaWdfZGljdCk7CiAgICAgaWYgKGRpY3QgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTI1NDYsNiArMjU4MCw0OCBAQAogICAgIGlmIChxdWFsbmFtZSAhPSBOVUxMICYmIFB5RGljdF9EZWxJdGVtKGRpY3QsIFB5SWRfX19xdWFsbmFtZV9fLm9iamVjdCkgPCAwKQogICAgICAgICBnb3RvIGVycm9yOwogCisgICAgLyogU2V0IHRwX2RlZm9yZGVyIHRvIHRoZSBleHRyYWN0ZWQgZGVmaW5pdGlvbiBvcmRlciwgaWYgYW55LiAqLworICAgIHR5cGUtPnRwX2RlZm9yZGVyID0gX1B5RGljdF9HZXRJdGVtSWQoZGljdCwgJlB5SWRfX19kZWZpbml0aW9uX29yZGVyX18pOworICAgIGlmICh0eXBlLT50cF9kZWZvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRih0eXBlLT50cF9kZWZvcmRlcik7CisKKyAgICAgICAgLy8gRHVlIHRvIHN1YmNsYXNzIGxvb2t1cCwgX19kZWZpbml0aW9uX29yZGVyX18gY2FuJ3QgYmUgaW4gX19kaWN0X18uCisgICAgICAgIGlmIChfUHlEaWN0X0RlbEl0ZW1JZChkaWN0LCAmUHlJZF9fX2RlZmluaXRpb25fb3JkZXJfXykgIT0gMCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlLT50cF9kZWZvcmRlciAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG51bW5hbWVzOworCisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodHlwZS0+dHBfZGVmb3JkZXIpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGVmaW5pdGlvbl9vcmRlcl9fIG11c3QgYmUgYSB0dXBsZSBvciBOb25lIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXkgYXJlIGlkZW50aWZlcnMuCisgICAgICAgICAgICBudW1uYW1lcyA9IFB5VHVwbGVfU2l6ZSh0eXBlLT50cF9kZWZvcmRlcik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtbmFtZXM7IGkrKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlLT50cF9kZWZvcmRlciwgaSk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhuYW1lKSB8fCAhUHlVbmljb2RlX0lzSWRlbnRpZmllcihuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGVmaW5pdGlvbl9vcmRlcl9fIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW4gb25seSBpZGVudGlmaWVycywgZ290ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5T0RpY3RfQ2hlY2sob3JpZ19kaWN0KSkgeworICAgICAgICB0eXBlLT50cF9kZWZvcmRlciA9IF9QeU9EaWN0X0tleXNBc1R1cGxlKG9yaWdfZGljdCk7CisgICAgICAgIGlmICh0eXBlLT50cF9kZWZvcmRlciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKICAgICAvKiBTZXQgdHBfZG9jIHRvIGEgY29weSBvZiBkaWN0WydfX2RvY19fJ10sIGlmIHRoZSBsYXR0ZXIgaXMgdGhlcmUKICAgICAgICBhbmQgaXMgYSBzdHJpbmcuICBUaGUgX19kb2NfXyBhY2Nlc3NvciB3aWxsIGZpcnN0IGxvb2sgZm9yIHRwX2RvYzsKICAgICAgICBpZiB0aGF0IGZhaWxzLCBpdCB3aWxsIHN0aWxsIGxvb2sgaW50byBfX2RpY3RfXy4KQEAgLTI1ODYsNiArMjY2MiwyMCBAQAogICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CiAKKyAgICAvKiBTcGVjaWFsLWNhc2UgX19pbml0X3N1YmNsYXNzX186IGlmIGl0J3MgYSBwbGFpbiBmdW5jdGlvbiwKKyAgICAgICBtYWtlIGl0IGEgY2xhc3NtZXRob2QgKi8KKyAgICB0bXAgPSBfUHlEaWN0X0dldEl0ZW1JZChkaWN0LCAmUHlJZF9fX2luaXRfc3ViY2xhc3NfXyk7CisgICAgaWYgKHRtcCAhPSBOVUxMICYmIFB5RnVuY3Rpb25fQ2hlY2sodG1wKSkgeworICAgICAgICB0bXAgPSBQeUNsYXNzTWV0aG9kX05ldyh0bXApOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtSWQoZGljdCwgJlB5SWRfX19pbml0X3N1YmNsYXNzX18sIHRtcCkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorCiAgICAgLyogQWRkIGRlc2NyaXB0b3JzIGZvciBjdXN0b20gc2xvdHMgZnJvbSBfX3Nsb3RzX18sIG9yIGZvciBfX2RpY3RfXyAqLwogICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CiAgICAgc2xvdG9mZnNldCA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKQEAgLTI2NjYsNiArMjc1NiwxMiBAQAogICAgICAgICBldC0+aHRfY2FjaGVkX2tleXMgPSBfUHlEaWN0X05ld0tleXNGb3JDbGFzcygpOwogICAgIH0KIAorICAgIGlmIChzZXRfbmFtZXModHlwZSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKGluaXRfc3ViY2xhc3ModHlwZSwga3dkcykgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCiAgICAgUHlfREVDUkVGKGRpY3QpOwogICAgIHJldHVybiAoUHlPYmplY3QgKil0eXBlOwogCkBAIC0yNjc3LDcgKzI3NzMsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc2hvcnQgc2xvdG9mZnNldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzaG9ydCBzbG90b2Zmc2V0c1tdID0gewogICAgIC0xLCAvKiBpbnZhbGlkIHNsb3QgKi8KICNpbmNsdWRlICJ0eXBlc2xvdHMuaW5jIgogfTsKQEAgLTMwNDAsNiArMzEzNiw3IEBACiAgICAgUHlfWERFQ1JFRih0eXBlLT50cF9tcm8pOwogICAgIFB5X1hERUNSRUYodHlwZS0+dHBfY2FjaGUpOwogICAgIFB5X1hERUNSRUYodHlwZS0+dHBfc3ViY2xhc3Nlcyk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9kZWZvcmRlcik7CiAgICAgLyogQSB0eXBlJ3MgdHBfZG9jIGlzIGhlYXAgYWxsb2NhdGVkLCB1bmxpa2UgdGhlIHRwX2RvYyBzbG90cwogICAgICAqIG9mIG1vc3Qgb3RoZXIgb2JqZWN0cy4gIEl0J3Mgb2theSB0byBjYXN0IGl0IHRvIGNoYXIgKi4KICAgICAgKi8KQEAgLTMwODIsNyArMzE3OSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9wcmVwYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgcmV0dXJuIFB5RGljdF9OZXcoKTsKKyAgICByZXR1cm4gUHlPRGljdF9OZXcoKTsKIH0KIAogLyoKQEAgLTM1OTYsNyArMzY5Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY2hhciogYXR0cikKK2NvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY29uc3QgY2hhciogYXR0cikKIHsKICAgICBQeVR5cGVPYmplY3QgKm5ld2Jhc2UsICpvbGRiYXNlOwogCkBAIC0zNzU5LDcgKzM4NTYsNyBAQAogICAgIC8qIFRyeSB0byBmZXRjaCBjYWNoZWQgY29weSBvZiBjb3B5cmVnIGZyb20gc3lzLm1vZHVsZXMgZmlyc3QgaW4gYW4KICAgICAgICBhdHRlbXB0IHRvIGF2b2lkIHRoZSBpbXBvcnQgb3ZlcmhlYWQuIFByZXZpb3VzbHkgdGhpcyB3YXMgaW1wbGVtZW50ZWQKICAgICAgICBieSBzdG9yaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWNoZWQgbW9kdWxlIGluIGEgc3RhdGljIHZhcmlhYmxlLCBidXQKLSAgICAgICB0aGlzIGJyb2tlIHdoZW4gbXVsdGlwbGUgZW1iZWRlZCBpbnRlcnByZXRlcnMgd2VyZSBpbiB1c2UgKHNlZSBpc3N1ZQorICAgICAgIHRoaXMgYnJva2Ugd2hlbiBtdWx0aXBsZSBlbWJlZGRlZCBpbnRlcnByZXRlcnMgd2VyZSBpbiB1c2UgKHNlZSBpc3N1ZQogICAgICAgICMxNzQwOCBhbmQgIzE5MDg4KS4gKi8KICAgICBjb3B5cmVnX21vZHVsZSA9IFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKGludGVycC0+bW9kdWxlcywgY29weXJlZ19zdHIpOwogICAgIGlmIChjb3B5cmVnX21vZHVsZSAhPSBOVUxMKSB7CkBAIC0zODcyLDYgKzM5NjksMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydChzbG90bmFtZXMgPT0gUHlfTm9uZSB8fCBQeUxpc3RfQ2hlY2soc2xvdG5hbWVzKSk7CisgICAgICAgIGlmIChyZXF1aXJlZCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBiYXNpY3NpemUgPSBQeUJhc2VPYmplY3RfVHlwZS50cF9iYXNpY3NpemU7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF9kaWN0b2Zmc2V0KQorICAgICAgICAgICAgICAgIGJhc2ljc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF93ZWFrbGlzdG9mZnNldCkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaWYgKHNsb3RuYW1lcyAhPSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGJhc2ljc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKikgKiBQeV9TSVpFKHNsb3RuYW1lcyk7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF9iYXNpY3NpemUgPiBiYXNpY3NpemUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2xvdG5hbWVzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBwaWNrbGUgJS4yMDBzIG9iamVjdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKHNsb3RuYW1lcyAhPSBQeV9Ob25lICYmIFB5X1NJWkUoc2xvdG5hbWVzKSA+IDApIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzbG90czsKICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2xvdG5hbWVzX3NpemUsIGk7CkBAIC0zOTI2LDcgKzQwNDEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBJZiB3ZSBmb3VuZCBzb21lIHNsb3QgYXR0cmlidXRlcywgcGFjayB0aGVtIGluIGEgdHVwbGUgYWxvbmcKLSAgICAgICAgICAgICAgIHRoZSBvcmdpbmFsIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LiAqLworICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LiAqLwogICAgICAgICAgICAgaWYgKFB5RGljdF9TaXplKHNsb3RzKSA+IDApIHsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhdGUyOwogCkBAIC00MDk1LDcgKzQyMTAsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotcmVkdWNlX25ld29iaihQeU9iamVjdCAqb2JqLCBpbnQgcHJvdG8pCityZWR1Y2VfbmV3b2JqKFB5T2JqZWN0ICpvYmopCiB7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqa3dhcmdzID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29weXJlZzsKQEAgLTQxNDgsNyArNDI2Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgZWxzZSBpZiAocHJvdG8gPj0gNCkgeworICAgIGVsc2UgewogICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKIAogICAgICAgICBuZXdvYmogPSBfUHlPYmplY3RfR2V0QXR0cklkKGNvcHlyZWcsICZQeUlkX19fbmV3b2JqX2V4X18pOwpAQCAtNDE2NiwxNiArNDI4MSw2IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAibXVzdCB1c2UgcHJvdG9jb2wgNCBvciBncmVhdGVyIHRvIGNvcHkgdGhpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0OyBzaW5jZSBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudHMuIik7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGt3YXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihjb3B5cmVnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAgc3RhdGUgPSBfUHlPYmplY3RfR2V0U3RhdGUob2JqLAogICAgICAgICAgICAgICAgICFoYXNhcmdzICYmICFQeUxpc3RfQ2hlY2sob2JqKSAmJiAhUHlEaWN0X0NoZWNrKG9iaikpOwpAQCAtNDIyMSw3ICs0MzI2LDcgQEAKICAgICBQeU9iamVjdCAqY29weXJlZywgKnJlczsKIAogICAgIGlmIChwcm90byA+PSAyKQotICAgICAgICByZXR1cm4gcmVkdWNlX25ld29iaihzZWxmLCBwcm90byk7CisgICAgICAgIHJldHVybiByZWR1Y2VfbmV3b2JqKHNlbGYpOwogCiAgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CiAgICAgaWYgKCFjb3B5cmVnKQpAQCAtNDMwMyw2ICs0NDA4LDE4IEBACiAiTm90SW1wbGVtZW50ZWQsIHRoZSBub3JtYWwgYWxnb3JpdGhtIGlzIHVzZWQuICBPdGhlcndpc2UsIGl0XG4iCiAib3ZlcnJpZGVzIHRoZSBub3JtYWwgYWxnb3JpdGhtIChhbmQgdGhlIG91dGNvbWUgaXMgY2FjaGVkKS5cbiIpOwogCitzdGF0aWMgUHlPYmplY3QgKgorb2JqZWN0X2luaXRfc3ViY2xhc3MoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZykKK3sKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworUHlEb2NfU1RSVkFSKG9iamVjdF9pbml0X3N1YmNsYXNzX2RvYywKKyJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNsYXNzIGlzIHN1YmNsYXNzZWQuXG4iCisiXG4iCisiVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBJdCBtYXkgYmVcbiIKKyJvdmVycmlkZGVuIHRvIGV4dGVuZCBzdWJjbGFzc2VzLlxuIik7CisKIC8qCiAgICBmcm9tIFBFUCAzMTAxLCB0aGlzIGNvZGUgaW1wbGVtZW50czoKIApAQCAtNDQwNyw2ICs0NTI0LDggQEAKICAgICAgUHlEb2NfU1RSKCJoZWxwZXIgZm9yIHBpY2tsZSIpfSwKICAgICB7Il9fc3ViY2xhc3Nob29rX18iLCBvYmplY3Rfc3ViY2xhc3Nob29rLCBNRVRIX0NMQVNTIHwgTUVUSF9WQVJBUkdTLAogICAgICBvYmplY3Rfc3ViY2xhc3Nob29rX2RvY30sCisgICAgeyJfX2luaXRfc3ViY2xhc3NfXyIsIG9iamVjdF9pbml0X3N1YmNsYXNzLCBNRVRIX0NMQVNTIHwgTUVUSF9OT0FSR1MsCisgICAgIG9iamVjdF9pbml0X3N1YmNsYXNzX2RvY30sCiAgICAgeyJfX2Zvcm1hdF9fIiwgb2JqZWN0X2Zvcm1hdCwgTUVUSF9WQVJBUkdTLAogICAgICBQeURvY19TVFIoImRlZmF1bHQgb2JqZWN0IGZvcm1hdHRlciIpfSwKICAgICB7Il9fc2l6ZW9mX18iLCBvYmplY3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywKQEAgLTUzNTIsNyArNTQ3MSw3IEBACiAvKiBIZWxwZXIgdG8gY2hlY2sgZm9yIG9iamVjdC5fX3NldGF0dHJfXyBvciBfX2RlbGF0dHJfXyBhcHBsaWVkIHRvIGEgdHlwZS4KICAgIFRoaXMgaXMgY2FsbGVkIHRoZSBDYXJsbyBWZXJyZSBoYWNrIGFmdGVyIGl0cyBkaXNjb3ZlcmVyLiAqLwogc3RhdGljIGludAotaGFja2NoZWNrKFB5T2JqZWN0ICpzZWxmLCBzZXRhdHRyb2Z1bmMgZnVuYywgY2hhciAqd2hhdCkKK2hhY2tjaGVjayhQeU9iamVjdCAqc2VsZiwgc2V0YXR0cm9mdW5jIGZ1bmMsIGNvbnN0IGNoYXIgKndoYXQpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKICAgICB3aGlsZSAodHlwZSAmJiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCkBAIC01NjM5LDcgKzU3NTgsNyBAQAogRlVOQ05BTUUoUHlPYmplY3QgKnNlbGYpIFwKIHsgXAogICAgIF9QeV9zdGF0aWNfc3RyaW5nKGlkLCBPUFNUUik7IFwKLSAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgJmlkLCAiKCkiKTsgXAorICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAmaWQsIE5VTEwpOyBcCiB9CiAKICNkZWZpbmUgU0xPVDEoRlVOQ05BTUUsIE9QU1RSLCBBUkcxVFlQRSwgQVJHQ09ERVMpIFwKQEAgLTU3MzIsNyArNTg1MSw3IEBACiBzdGF0aWMgUHlfc3NpemVfdAogc2xvdF9zcV9sZW5ndGgoUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgUHlPYmplY3QgKnJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICZQeUlkX19fbGVuX18sICIoKSIpOworICAgIFB5T2JqZWN0ICpyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAmUHlJZF9fX2xlbl9fLCBOVUxMKTsKICAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGlmIChyZXMgPT0gTlVMTCkKQEAgLTU3NTMsMzggKzU4NzIsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3NxX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSkKIHsKLSAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MgPSBOVUxMLCAqaXZhbCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmdW5jLCAqaXZhbCA9IE5VTEwsICpyZXR2YWwgPSBOVUxMOwogICAgIGRlc2NyZ2V0ZnVuYyBmOwogCiAgICAgZnVuYyA9IF9QeVR5cGVfTG9va3VwSWQoUHlfVFlQRShzZWxmKSwgJlB5SWRfX19nZXRpdGVtX18pOwotICAgIGlmIChmdW5jICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChmID0gUHlfVFlQRShmdW5jKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQotICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZ1bmMgPSBmKGZ1bmMsIHNlbGYsIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKSk7Ci0gICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaXZhbCA9IFB5TG9uZ19Gcm9tU3NpemVfdChpKTsKLSAgICAgICAgaWYgKGl2YWwgIT0gTlVMTCkgewotICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDEpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgaXZhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpnZXRpdGVtX3N0ciA9IF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fZ2V0aXRlbV9fKTsKICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBnZXRpdGVtX3N0cik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeV9YREVDUkVGKGFyZ3MpOwotICAgIFB5X1hERUNSRUYoaXZhbCk7Ci0gICAgUHlfWERFQ1JFRihmdW5jKTsKKworICAgIGYgPSBQeV9UWVBFKGZ1bmMpLT50cF9kZXNjcl9nZXQ7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmdW5jID0gZihmdW5jLCBzZWxmLCAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSkpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGl2YWwgPSBQeUxvbmdfRnJvbVNzaXplX3QoaSk7CisgICAgaWYgKGl2YWwgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldHZhbCA9IF9QeU9iamVjdF9DYWxsQXJnMShmdW5jLCBpdmFsKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGl2YWwpOworICAgIHJldHVybiByZXR2YWw7CisKK2Vycm9yOgorICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtNTgwNiwxOSArNTkyNiwyMCBAQAogc3RhdGljIGludAogc2xvdF9zcV9jb250YWlucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzLCAqYXJnczsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKICAgICBpbnQgcmVzdWx0ID0gLTE7CiAgICAgX1B5X0lERU5USUZJRVIoX19jb250YWluc19fKTsKIAogICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgJlB5SWRfX19jb250YWluc19fKTsKKyAgICBpZiAoZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGEgY29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIGlmIChmdW5jICE9IE5VTEwpIHsKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0gICAgICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgICAgICByZXMgPSBOVUxMOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxBcmcxKGZ1bmMsIHZhbHVlKTsKICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwpAQCAtNTg4OSw0NCArNjAxMCw1NCBAQAogc3RhdGljIGludAogc2xvdF9uYl9ib29sKFB5T2JqZWN0ICpzZWxmKQogewotICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnczsKLSAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgUHlPYmplY3QgKmZ1bmMsICp2YWx1ZTsKKyAgICBpbnQgcmVzdWx0OwogICAgIGludCB1c2luZ19sZW4gPSAwOwogICAgIF9QeV9JREVOVElGSUVSKF9fYm9vbF9fKTsKIAogICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgJlB5SWRfX19ib29sX18pOwogICAgIGlmIChmdW5jID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKwogICAgICAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICZQeUlkX19fbGVuX18pOwotICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDE7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KICAgICAgICAgdXNpbmdfbGVuID0gMTsKICAgICB9Ci0gICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgIGlmIChhcmdzICE9IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICh0ZW1wICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICh1c2luZ19sZW4pIHsKLSAgICAgICAgICAgICAgICAvKiBlbmZvcmNlZCBieSBzbG90X25iX2xlbiAqLwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFB5Qm9vbF9DaGVjayh0ZW1wKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2Jvb2xfXyBzaG91bGQgcmV0dXJuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2wsIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh0ZW1wKS0+dHBfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7Ci0gICAgICAgIH0KKworICAgIHZhbHVlID0gX1B5T2JqZWN0X0NhbGxOb0FyZyhmdW5jKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKworICAgIGlmICh1c2luZ19sZW4pIHsKKyAgICAgICAgLyogYm9vbCB0eXBlIGVuZm9yY2VkIGJ5IHNsb3RfbmJfbGVuICovCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5Qm9vbF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19ib29sX18gc2hvdWxkIHJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAiYm9vbCwgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisKKyAgICBQeV9ERUNSRUYodmFsdWUpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICByZXR1cm4gcmVzdWx0OworCitlcnJvcjoKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIC0xOwogfQogCiAKQEAgLTU5MzQsNyArNjA2NSw3IEBACiBzbG90X25iX2luZGV4KFB5T2JqZWN0ICpzZWxmKQogewogICAgIF9QeV9JREVOVElGSUVSKF9faW5kZXhfXyk7Ci0gICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICZQeUlkX19faW5kZXhfXywgIigpIik7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICZQeUlkX19faW5kZXhfXywgTlVMTCk7CiB9CiAKIApAQCAtNjE3MSwyMCArNjMwMiwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlczsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKIAogICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICZuYW1lX29wW29wXSk7CiAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7CiAgICAgfQotICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgb3RoZXIpOwotICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgIHJlcyA9IE5VTEw7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICB9CisgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxBcmcxKGZ1bmMsIG90aGVyKTsKICAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTYxOTYsMTYgKzYzMjEsMjAgQEAKICAgICBfUHlfSURFTlRJRklFUihfX2l0ZXJfXyk7CiAKICAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAmUHlJZF9fX2l0ZXJfXyk7CisgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgaWYgKGZ1bmMgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqYXJnczsKLSAgICAgICAgYXJncyA9IHJlcyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICB9CisgICAgICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTm9BcmcoZnVuYyk7CiAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisKICAgICBQeUVycl9DbGVhcigpOwogICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICZQeUlkX19fZ2V0aXRlbV9fKTsKICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CkBAIC02MjIyLDcgKzYzNTEsNyBAQAogc2xvdF90cF9pdGVybmV4dChQeU9iamVjdCAqc2VsZikKIHsKICAgICBfUHlfSURFTlRJRklFUihfX25leHRfXyk7Ci0gICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICZQeUlkX19fbmV4dF9fLCAiKCkiKTsKKyAgICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgJlB5SWRfX19uZXh0X18sIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjI5MSwyOSArNjQyMCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICpmdW5jOwotICAgIFB5T2JqZWN0ICpuZXdhcmdzLCAqeDsKLSAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7CiAKICAgICBmdW5jID0gX1B5T2JqZWN0X0dldEF0dHJJZCgoUHlPYmplY3QgKil0eXBlLCAmUHlJZF9fX25ld19fKTsKLSAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgIGlmIChmdW5jID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldyhuKzEpOwotICAgIGlmIChuZXdhcmdzID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X0lOQ1JFRih0eXBlKTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIChQeU9iamVjdCAqKXR5cGUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgeCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0gICAgICAgIFB5X0lOQ1JFRih4KTsKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCBpKzEsIHgpOwogICAgIH0KLSAgICB4ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBuZXdhcmdzLCBrd2RzKTsKLSAgICBQeV9ERUNSRUYobmV3YXJncyk7CisKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfQ2FsbF9QcmVwZW5kKGZ1bmMsIChQeU9iamVjdCAqKXR5cGUsIGFyZ3MsIGt3ZHMpOwogICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICByZXR1cm4geDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjkxNiw2ICs3MDMyLDU3IEBACiAgICAgfQogfQogCisvKiBDYWxsIF9fc2V0X25hbWVfXyBvbiBhbGwgZGVzY3JpcHRvcnMgaW4gYSBuZXdseSBnZW5lcmF0ZWQgdHlwZSAqLworc3RhdGljIGludAorc2V0X25hbWVzKFB5VHlwZU9iamVjdCAqdHlwZSkKK3sKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICp0bXA7CisgICAgUHlfc3NpemVfdCBpID0gMDsKKworICAgIHdoaWxlIChQeURpY3RfTmV4dCh0eXBlLT50cF9kaWN0LCAmaSwgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih2YWx1ZSwgX1B5VW5pY29kZV9Gcm9tSWQoJlB5SWRfX19zZXRfbmFtZV9fKSkpIHsKKyAgICAgICAgICAgIHRtcCA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKAorICAgICAgICAgICAgICAgIHZhbHVlLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX3NldF9uYW1lX18pLAorICAgICAgICAgICAgICAgIHR5cGUsIGtleSwgTlVMTCk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENhbGwgX19pbml0X3N1YmNsYXNzX18gb24gdGhlIHBhcmVudCBvZiBhIG5ld2x5IGdlbmVyYXRlZCB0eXBlICovCitzdGF0aWMgaW50Citpbml0X3N1YmNsYXNzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmplY3QgKnN1cGVyLCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqYXJnc1syXSA9IHsoUHlPYmplY3QgKil0eXBlLCAoUHlPYmplY3QgKil0eXBlfTsKKworICAgIHN1cGVyID0gX1B5T2JqZWN0X0Zhc3RDYWxsKChQeU9iamVjdCAqKSZQeVN1cGVyX1R5cGUsIGFyZ3MsIDIpOworICAgIGlmIChzdXBlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmdW5jID0gX1B5T2JqZWN0X0dldEF0dHJJZChzdXBlciwgJlB5SWRfX19pbml0X3N1YmNsYXNzX18pOworICAgIFB5X0RFQ1JFRihzdXBlcik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisKKyAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KGZ1bmMsIE5VTEwsIDAsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOworfQorCiAvKiByZWN1cnNlX2Rvd25fc3ViY2xhc3NlcygpIGFuZCB1cGRhdGVfc3ViY2xhc3NlcygpIGFyZSBtdXR1YWxseQogICAgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0byBjYWxsIGEgY2FsbGJhY2sgZm9yIGFsbCBzdWJjbGFzc2VzLAogICAgYnV0IHJlZnJhaW5pbmcgZnJvbSByZWN1cnNpbmcgaW50byBzdWJjbGFzc2VzIHRoYXQgZGVmaW5lICduYW1lJy4gKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKaW5kZXggMWZjYzgzZS4uYjk2MzMzYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJ1Y25oYXNoLmgiCiAjaW5jbHVkZSAiYnl0ZXNfbWV0aG9kcy5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9lcS5oIgogCiAjaWZkZWYgTVNfV0lORE9XUwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTE2Miw2ICsxNjMsMTQgQEAKICAgICAgICAgICAgICpfdG8rKyA9ICh0b190eXBlKSAqX2l0ZXIrKzsgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKIC8qIFRoaXMgZGljdGlvbmFyeSBob2xkcyBhbGwgaW50ZXJuZWQgdW5pY29kZSBzdHJpbmdzLiAgTm90ZSB0aGF0IHJlZmVyZW5jZXMKICAgIHRvIHN0cmluZ3MgaW4gdGhpcyBkaWN0aW9uYXJ5IGFyZSAqbm90KiBjb3VudGVkIGluIHRoZSBzdHJpbmcncyBvYl9yZWZjbnQuCiAgICBXaGVuIHRoZSBpbnRlcm5lZCBzdHJpbmcgcmVhY2hlcyBhIHJlZmNudCBvZiAwIHRoZSBzdHJpbmcgZGVhbGxvY2F0aW9uCkBAIC0yNjMsNyArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKIAogLyogU2FtZSBmb3IgbGluZWJyZWFrcyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNjaWlfbGluZWJyZWFrW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc2NpaV9saW5lYnJlYWtbXSA9IHsKICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogLyogICAgICAgICAweDAwMEEsICogTElORSBGRUVEICovCiAvKiAgICAgICAgIDB4MDAwQiwgKiBMSU5FIFRBQlVMQVRJT04gKi8KQEAgLTI5Miw2ICszMDEsNDUgQEAKIAogI2luY2x1ZGUgImNsaW5pYy91bmljb2Rlb2JqZWN0LmMuaCIKIAordHlwZWRlZiBlbnVtIHsKKyAgICBfUHlfRVJST1JfVU5LTk9XTj0wLAorICAgIF9QeV9FUlJPUl9TVFJJQ1QsCisgICAgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRSwKKyAgICBfUHlfRVJST1JfUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfSUdOT1JFLAorICAgIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFLAorICAgIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTLAorICAgIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfT1RIRVIKK30gX1B5X2Vycm9yX2hhbmRsZXI7CisKK3N0YXRpYyBfUHlfZXJyb3JfaGFuZGxlcgorZ2V0X2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqZXJyb3JzKQoreworICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NUUklDVDsKKyAgICB9CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVlc2NhcGUiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOworICAgIH0KKyAgICBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBfUHlfRVJST1JfUkVQTEFDRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBfUHlfRVJST1JfSUdOT1JFOworICAgIH0KKyAgICBpZiAoc3RyY21wKGVycm9ycywgImJhY2tzbGFzaHJlcGxhY2UiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBfUHlfRVJST1JfQkFDS1NMQVNIUkVQTEFDRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVwYXNzIikgPT0gMCkgeworICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NVUlJPR0FURVBBU1M7CisgICAgfQorICAgIGlmIChzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U7CisgICAgfQorICAgIHJldHVybiBfUHlfRVJST1JfT1RIRVI7Cit9CisKIC8qIFRoZSBtYXggdW5pY29kZSB2YWx1ZSBpcyBhbHdheXMgMHgxMEZGRkYgd2hpbGUgdXNpbmcgdGhlIFBFUC0zOTMgQVBJLgogICAgVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBBUEkuICovCiBQeV9VTklDT0RFCkBAIC01MjEsNiArNTY5LDEyOSBAQAogICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Db3B5KHVuaWNvZGUpOwogfQogCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yIGhhbmRsZXIgZm9yIDgtYml0IGVuY29kaW5nczoKKyAgIEFTQ0lJLCBMYXRpbjEsIFVURi04LCBldGMuICovCitzdGF0aWMgY2hhcioKK2JhY2tzbGFzaHJlcGxhY2UoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMHgxMDApCisgICAgICAgICAgICBpbmNyID0gMisyOworICAgICAgICBlbHNlIGlmIChjaCA8IDB4MTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisgICAgICAgICAgICBpbmNyID0gMis4OworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBpbmNyOworICAgIH0KKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAqc3RyKysgPSAnXFwnOworICAgICAgICBpZiAoY2ggPj0gMHgwMDAxMDAwMCkgeworICAgICAgICAgICAgKnN0cisrID0gJ1UnOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjgpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yNCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjIwKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTYpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xMikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjgpJjB4Zl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDApIHsKKyAgICAgICAgICAgICpzdHIrKyA9ICd1JzsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjEyKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+OCkmMHhmXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqc3RyKysgPSAneCc7CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjQpJjB4Zl07CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1tjaCYweGZdOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgInhtbGNoYXJyZWZyZXBsYWNlIiBlcnJvciBoYW5kbGVyIGZvciA4LWJpdCBlbmNvZGluZ3M6CisgICBBU0NJSSwgTGF0aW4xLCBVVEYtOCwgZXRjLiAqLworc3RhdGljIGNoYXIqCit4bWxjaGFycmVmcmVwbGFjZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMTApCisgICAgICAgICAgICBpbmNyID0gMisxKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwKQorICAgICAgICAgICAgaW5jciA9IDIrMisxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCisgICAgICAgICAgICBpbmNyID0gMiszKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0KzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNSsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApCisgICAgICAgICAgICBpbmNyID0gMis2KzE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKyAgICAgICAgICAgIGluY3IgPSAyKzcrMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5jcjsKKyAgICB9CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKIC8qIC0tLSBCbG9vbSBGaWx0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIHN0dWZmIHRvIGltcGxlbWVudCBzaW1wbGUgImJsb29tIGZpbHRlcnMiIGZvciBVbmljb2RlIGNoYXJhY3RlcnMuCkBAIC01ODcsNiArNzU4LDE4IEBACiAjdW5kZWYgQkxPT01fVVBEQVRFCiB9CiAKK3N0YXRpYyBpbnQKK2Vuc3VyZV91bmljb2RlKFB5T2JqZWN0ICpvYmopCit7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIFB5VW5pY29kZV9SRUFEWShvYmopOworfQorCiAvKiBDb21waWxhdGlvbiBvZiB0ZW1wbGF0ZWQgcm91dGluZXMgKi8KIAogI2luY2x1ZGUgInN0cmluZ2xpYi9hc2NpaWxpYi5oIgpAQCAtNjQ3LDI3ICs4MzAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsIFB5X1VDUzQgY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBpbnQgbW9kZSA9IChkaXJlY3Rpb24gPT0gMSkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLQogICAgIHN3aXRjaCAoa2luZCkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFB5X1VDUzEgY2gxID0gKFB5X1VDUzEpIGNoOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9mYXN0c2VhcmNoKChQeV9VQ1MxICopIHMsIHNpemUsICZjaDEsIDEsIDAsIG1vZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBpZiAoKFB5X1VDUzEpIGNoICE9IGNoKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX2ZpbmRfY2hhcigoUHlfVUNTMSAqKSBzLCBzaXplLCAoUHlfVUNTMSkgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9yZmluZF9jaGFyKChQeV9VQ1MxICopIHMsIHNpemUsIChQeV9VQ1MxKSBjaCk7CiAgICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDoKLSAgICAgICAgewotICAgICAgICAgICAgUHlfVUNTMiBjaDIgPSAoUHlfVUNTMikgY2g7Ci0gICAgICAgICAgICBpZiAoY2gyID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiB1Y3MybGliX2Zhc3RzZWFyY2goKFB5X1VDUzIgKikgcywgc2l6ZSwgJmNoMiwgMSwgMCwgbW9kZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGlmICgoUHlfVUNTMikgY2ggIT0gY2gpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfZmluZF9jaGFyKChQeV9VQ1MyICopIHMsIHNpemUsIChQeV9VQ1MyKSBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3MybGliX3JmaW5kX2NoYXIoKFB5X1VDUzIgKikgcywgc2l6ZSwgKFB5X1VDUzIpIGNoKTsKICAgICBjYXNlIFB5VW5pY29kZV80QllURV9LSU5EOgotICAgICAgICByZXR1cm4gdWNzNGxpYl9mYXN0c2VhcmNoKChQeV9VQ1M0ICopIHMsIHNpemUsICZjaCwgMSwgMCwgbW9kZSk7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczRsaWJfZmluZF9jaGFyKChQeV9VQ1M0ICopIHMsIHNpemUsIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczRsaWJfcmZpbmRfY2hhcigoUHlfVUNTNCAqKSBzLCBzaXplLCBjaCk7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXNzZXJ0KDApOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNDU0LDEzICsyNjM2LDExIEBACiAgICAgICAgICAgICBsb25nZmxhZyA9IDE7CiAgICAgICAgICAgICArK2Y7CiAgICAgICAgIH0KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICBlbHNlIGlmIChmWzFdID09ICdsJyAmJgogICAgICAgICAgICAgICAgICAoZlsyXSA9PSAnZCcgfHwgZlsyXSA9PSAndScgfHwgZlsyXSA9PSAnaScpKSB7CiAgICAgICAgICAgICBsb25nbG9uZ2ZsYWcgPSAxOwogICAgICAgICAgICAgZiArPSAyOwogICAgICAgICB9Ci0jZW5kaWYKICAgICB9CiAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KICAgICBlbHNlIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnIHx8IGZbMV0gPT0gJ2knKSkgewpAQCAtMjQ5OCwxMSArMjY3OCw5IEBACiAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlbHUiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgdW5zaWduZWQgbG9uZykpOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICAgICBlbHNlIGlmIChsb25nbG9uZ2ZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfTE9OR19MT05HICJ1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORykpOwotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcoKnZhcmdzLCB1bnNpZ25lZCBsb25nIGxvbmcpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIHNpemVfdCkpOwpAQCAtMjUxNywxMSArMjY5NSw5IEBACiAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlbGkiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKCp2YXJncywgbG9uZykpOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICAgICBlbHNlIGlmIChsb25nbG9uZ2ZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfTE9OR19MT05HICJpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIFBZX0xPTkdfTE9ORykpOwotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcoKnZhcmdzLCBsb25nIGxvbmcpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCiAgICAgICAgICAgICAgICAgbGVuID0gc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZygqdmFyZ3MsIFB5X3NzaXplX3QpKTsKQEAgLTI5MDMsNyArMzA3OSw3IEBACiAgICAgLyogUmV0cmlldmUgYSBieXRlcyBidWZmZXIgdmlldyB0aHJvdWdoIHRoZSBQRVAgMzExOCBidWZmZXIgaW50ZXJmYWNlICovCiAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmosICZidWZmZXIsIFB5QlVGX1NJTVBMRSkgPCAwKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiY29lcmNpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsICUuODBzIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICJkZWNvZGluZyB0byBzdHI6IG5lZWQgYSBieXRlcy1saWtlIG9iamVjdCwgJS44MHMgZm91bmQiLAogICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjkxOCw5ICszMDk0LDkgQEAKICAgICByZXR1cm4gdjsKIH0KIAotLyogQ29udmVydCBlbmNvZGluZyB0byBsb3dlciBjYXNlIGFuZCByZXBsYWNlICdfJyB3aXRoICctJyBpbiBvcmRlciB0bwotICAgY2F0Y2ggZS5nLiBVVEZfOC4gUmV0dXJuIDAgb24gZXJyb3IgKGVuY29kaW5nIGlzIGxvbmdlciB0aGFuIGxvd2VyX2xlbi0xKSwKLSAgIDEgb24gc3VjY2Vzcy4gKi8KKy8qIE5vcm1hbGl6ZSBhbiBlbmNvZGluZyBuYW1lOiBDIGltcGxlbWVudGF0aW9uIG9mCisgICBlbmNvZGluZ3Mubm9ybWFsaXplX2VuY29kaW5nKCkuIFJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZXJyb3IgKGVuY29kaW5nCisgICBpcyBsb25nZXIgdGhhbiBsb3dlcl9sZW4tMSkuICovCiBpbnQKIF9QeV9ub3JtYWxpemVfZW5jb2RpbmcoY29uc3QgY2hhciAqZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxvd2VyLApAQCAtMjkyOSwzMCArMzEwNSwzOSBAQAogICAgIGNvbnN0IGNoYXIgKmU7CiAgICAgY2hhciAqbDsKICAgICBjaGFyICpsX2VuZDsKKyAgICBpbnQgcHVuY3Q7CiAKLSAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewotICAgICAgICAvKiA2ID09IHN0cmxlbigidXRmLTgiKSArIDEgKi8KLSAgICAgICAgaWYgKGxvd2VyX2xlbiA8IDYpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgc3RyY3B5KGxvd2VyLCAidXRmLTgiKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQorICAgIGFzc2VydChlbmNvZGluZyAhPSBOVUxMKTsKKwogICAgIGUgPSBlbmNvZGluZzsKICAgICBsID0gbG93ZXI7CiAgICAgbF9lbmQgPSAmbG93ZXJbbG93ZXJfbGVuIC0gMV07Ci0gICAgd2hpbGUgKCplKSB7Ci0gICAgICAgIGlmIChsID09IGxfZW5kKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChQeV9JU1VQUEVSKCplKSkgewotICAgICAgICAgICAgKmwrKyA9IFB5X1RPTE9XRVIoKmUrKyk7CisgICAgcHVuY3QgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGNoYXIgYyA9ICplOworICAgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqZSA9PSAnXycpIHsKLSAgICAgICAgICAgICpsKysgPSAnLSc7Ci0gICAgICAgICAgICBlKys7CisKKyAgICAgICAgaWYgKFB5X0lTQUxOVU0oYykgfHwgYyA9PSAnLicpIHsKKyAgICAgICAgICAgIGlmIChwdW5jdCAmJiBsICE9IGxvd2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKGwgPT0gbF9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpsKysgPSAnXyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdW5jdCA9IDA7CisKKyAgICAgICAgICAgIGlmIChsID09IGxfZW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbCsrID0gUHlfVE9MT1dFUihjKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICpsKysgPSAqZSsrOworICAgICAgICAgICAgcHVuY3QgPSAxOwogICAgICAgICB9CisKKyAgICAgICAgZSsrOwogICAgIH0KICAgICAqbCA9ICdcMCc7CiAgICAgcmV0dXJuIDE7CkBAIC0yOTY2LDI4ICszMTUxLDUxIEBACiB7CiAgICAgUHlPYmplY3QgKmJ1ZmZlciA9IE5VTEwsICp1bmljb2RlOwogICAgIFB5X2J1ZmZlciBpbmZvOwotICAgIGNoYXIgbG93ZXJbMTFdOyAgLyogRW5vdWdoIGZvciBhbnkgZW5jb2Rpbmcgc2hvcnRjdXQgKi8KKyAgICBjaGFyIGJ1Zmxvd2VyWzExXTsgICAvKiBzdHJsZW4oImlzby04ODU5LTFcMCIpID09IDExLCBsb25nZXN0IHNob3J0Y3V0ICovCisKKyAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bChzLCBzaXplLCBlcnJvcnMsIE5VTEwpOworICAgIH0KIAogICAgIC8qIFNob3J0Y3V0cyBmb3IgY29tbW9uIGRlZmF1bHQgZW5jb2RpbmdzICovCi0gICAgaWYgKF9QeV9ub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcsIGxvd2VyLCBzaXplb2YobG93ZXIpKSkgewotICAgICAgICBpZiAoKHN0cmNtcChsb3dlciwgInV0Zi04IikgPT0gMCkgfHwKLSAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJ1dGY4IikgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bChzLCBzaXplLCBlcnJvcnMsIE5VTEwpOwotICAgICAgICBlbHNlIGlmICgoc3RyY21wKGxvd2VyLCAibGF0aW4tMSIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJsYXRpbjEiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGxvd2VyLCAiaXNvLTg4NTktMSIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJpc284ODU5LTEiKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHMsIHNpemUsIGVycm9ycyk7Ci0jaWZkZWYgSEFWRV9NQkNTCi0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgIm1iY3MiKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVNQkNTKHMsIHNpemUsIGVycm9ycyk7Ci0jZW5kaWYKLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAiYXNjaWkiKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVBU0NJSShzLCBzaXplLCBlcnJvcnMpOwotICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJ1dGYtMTYiKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEYxNihzLCBzaXplLCBlcnJvcnMsIDApOwotICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJ1dGYtMzIiKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEYzMihzLCBzaXplLCBlcnJvcnMsIDApOworICAgIGlmIChfUHlfbm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nLCBidWZsb3dlciwgc2l6ZW9mKGJ1Zmxvd2VyKSkpIHsKKyAgICAgICAgY2hhciAqbG93ZXIgPSBidWZsb3dlcjsKKworICAgICAgICAvKiBGYXN0IHBhdGhzICovCisgICAgICAgIGlmIChsb3dlclswXSA9PSAndScgJiYgbG93ZXJbMV0gPT0gJ3QnICYmIGxvd2VyWzJdID09ICdmJykgeworICAgICAgICAgICAgbG93ZXIgKz0gMzsKKyAgICAgICAgICAgIGlmICgqbG93ZXIgPT0gJ18nKSB7CisgICAgICAgICAgICAgICAgLyogTWF0Y2ggInV0ZjgiIGFuZCAidXRmXzgiICovCisgICAgICAgICAgICAgICAgbG93ZXIrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvd2VyWzBdID09ICc4JyAmJiBsb3dlclsxXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgc2l6ZSwgZXJyb3JzLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxvd2VyWzBdID09ICcxJyAmJiBsb3dlclsxXSA9PSAnNicgJiYgbG93ZXJbMl0gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGMTYocywgc2l6ZSwgZXJyb3JzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxvd2VyWzBdID09ICczJyAmJiBsb3dlclsxXSA9PSAnMicgJiYgbG93ZXJbMl0gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGMzIocywgc2l6ZSwgZXJyb3JzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobG93ZXIsICJhc2NpaSIpID09IDAKKyAgICAgICAgICAgICAgICB8fCBzdHJjbXAobG93ZXIsICJ1c19hc2NpaSIpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZUFTQ0lJKHMsIHNpemUsIGVycm9ycyk7CisgICAgICAgICAgICB9CisgICAgI2lmZGVmIEhBVkVfTUJDUworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAibWJjcyIpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZU1CQ1Mocywgc2l6ZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAjZW5kaWYKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChsb3dlciwgImxhdGluMSIpID09IDAKKyAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChsb3dlciwgImxhdGluXzEiKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAobG93ZXIsICJpc29fODg1OV8xIikgPT0gMAorICAgICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKGxvd2VyLCAiaXNvODg1OV8xIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHMsIHNpemUsIGVycm9ycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBEZWNvZGUgdmlhIHRoZSBjb2RlYyByZWdpc3RyeSAqLwpAQCAtMzE2NywyNCArMzM3NSwyMiBAQAogc3RhdGljIGludAogbG9jYWxlX2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgKnN1cnJvZ2F0ZWVzY2FwZSkKIHsKLSAgICBpZiAoZXJyb3JzID09IE5VTEwpIHsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKyAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpCisgICAgeworICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDA7CiAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewotICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlZXNjYXBlIikgPT0gMCkgeworICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKICAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDE7CiAgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm9ubHkgJ3N0cmljdCcgYW5kICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICJhcmUgc3VwcG9ydGVkLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAib25seSAnc3RyaWN0JyBhbmQgJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlcnMgIgotICAgICAgICAgICAgICAgICAiYXJlIHN1cHBvcnRlZCwgbm90ICclcyciLAotICAgICAgICAgICAgICAgICBlcnJvcnMpOwotICAgIHJldHVybiAtMTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMzMzMiwzNCArMzUzOCw1NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgY2hhciBsb3dlclsxMV07ICAvKiBFbm91Z2ggZm9yIGFueSBlbmNvZGluZyBzaG9ydGN1dCAqLworICAgIGNoYXIgYnVmbG93ZXJbMTFdOyAgIC8qIHN0cmxlbigiaXNvXzg4NTlfMVwwIikgPT0gMTEsIGxvbmdlc3Qgc2hvcnRjdXQgKi8KIAogICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaWNvZGUpKSB7CiAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0FzVVRGOFN0cmluZyh1bmljb2RlLCBlcnJvcnMpOworICAgIH0KKwogICAgIC8qIFNob3J0Y3V0cyBmb3IgY29tbW9uIGRlZmF1bHQgZW5jb2RpbmdzICovCi0gICAgaWYgKF9QeV9ub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcsIGxvd2VyLCBzaXplb2YobG93ZXIpKSkgewotICAgICAgICBpZiAoKHN0cmNtcChsb3dlciwgInV0Zi04IikgPT0gMCkgfHwKLSAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJ1dGY4IikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgTlVMTCk7Ci0gICAgICAgICAgICBlbHNlCisgICAgaWYgKF9QeV9ub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcsIGJ1Zmxvd2VyLCBzaXplb2YoYnVmbG93ZXIpKSkgeworICAgICAgICBjaGFyICpsb3dlciA9IGJ1Zmxvd2VyOworCisgICAgICAgIC8qIEZhc3QgcGF0aHMgKi8KKyAgICAgICAgaWYgKGxvd2VyWzBdID09ICd1JyAmJiBsb3dlclsxXSA9PSAndCcgJiYgbG93ZXJbMl0gPT0gJ2YnKSB7CisgICAgICAgICAgICBsb3dlciArPSAzOworICAgICAgICAgICAgaWYgKCpsb3dlciA9PSAnXycpIHsKKyAgICAgICAgICAgICAgICAvKiBNYXRjaCAidXRmOCIgYW5kICJ1dGZfOCIgKi8KKyAgICAgICAgICAgICAgICBsb3dlcisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG93ZXJbMF0gPT0gJzgnICYmIGxvd2VyWzFdID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxvd2VyWzBdID09ICcxJyAmJiBsb3dlclsxXSA9PSAnNicgJiYgbG93ZXJbMl0gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0VuY29kZVVURjE2KHVuaWNvZGUsIGVycm9ycywgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsb3dlclswXSA9PSAnMycgJiYgbG93ZXJbMV0gPT0gJzInICYmIGxvd2VyWzJdID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9FbmNvZGVVVEYzMih1bmljb2RlLCBlcnJvcnMsIDApOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAobG93ZXIsICJsYXRpbi0xIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChsb3dlciwgImxhdGluMSIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAobG93ZXIsICJpc28tODg1OS0xIikgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0cmNtcChsb3dlciwgImlzbzg4NTktMSIpID09IDApKQotICAgICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcodW5pY29kZSwgZXJyb3JzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGxvd2VyLCAiYXNjaWkiKSA9PSAwCisgICAgICAgICAgICAgICAgfHwgc3RyY21wKGxvd2VyLCAidXNfYXNjaWkiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyh1bmljb2RlLCBlcnJvcnMpOworICAgICAgICAgICAgfQogI2lmZGVmIEhBVkVfTUJDUwotICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJtYmNzIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCB1bmljb2RlLCBlcnJvcnMpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxvd2VyLCAibWJjcyIpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX0FDUCwgdW5pY29kZSwgZXJyb3JzKTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJhc2NpaSIpID09IDApCi0gICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKHVuaWNvZGUsIGVycm9ycyk7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAobG93ZXIsICJsYXRpbjEiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAobG93ZXIsICJsYXRpbl8xIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGxvd2VyLCAiaXNvXzg4NTlfMSIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChsb3dlciwgImlzbzg4NTlfMSIpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZyh1bmljb2RlLCBlcnJvcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyogRW5jb2RlIHZpYSB0aGUgY29kZWMgcmVnaXN0cnkgKi8KQEAgLTM2MTQsNiArMzg0Miw3IEBACiBpbnQKIFB5VW5pY29kZV9GU0NvbnZlcnRlcihQeU9iamVjdCogYXJnLCB2b2lkKiBhZGRyKQogeworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKICAgICBQeU9iamVjdCAqb3V0cHV0ID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgdm9pZCAqZGF0YTsKQEAgLTM2MjIsMjQgKzM4NTEsMjIgQEAKICAgICAgICAgKihQeU9iamVjdCoqKWFkZHIgPSBOVUxMOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSkgewotICAgICAgICBvdXRwdXQgPSBhcmc7Ci0gICAgICAgIFB5X0lOQ1JFRihvdXRwdXQpOworICAgIHBhdGggPSBQeU9TX0ZTUGF0aChhcmcpOworICAgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBhcmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICBpZiAoIWFyZykKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBvdXRwdXQgPSBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0KGFyZyk7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmcpOwotICAgICAgICBpZiAoIW91dHB1dCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sob3V0cHV0KSkgewotICAgICAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2RlciBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzIik7CisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socGF0aCkpIHsKKyAgICAgICAgb3V0cHV0ID0gcGF0aDsKKyAgICB9CisgICAgZWxzZSB7ICAvLyBQeU9TX0ZTUGF0aCgpIGd1YXJhbnRlZXMgaXRzIHJldHVybmVkIHZhbHVlIGlzIGJ5dGVzIG9yIHN0ci4KKyAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdChwYXRoKTsKKyAgICAgICAgUHlfREVDUkVGKHBhdGgpOworICAgICAgICBpZiAoIW91dHB1dCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sob3V0cHV0KSk7CiAgICAgfQorCiAgICAgc2l6ZSA9IFB5Qnl0ZXNfR0VUX1NJWkUob3V0cHV0KTsKICAgICBkYXRhID0gUHlCeXRlc19BU19TVFJJTkcob3V0cHV0KTsKICAgICBpZiAoKHNpemVfdClzaXplICE9IHN0cmxlbihkYXRhKSkgewpAQCAtMzY2Niw3ICszODkzLDEzIEBACiAgICAgICAgIG91dHB1dCA9IGFyZzsKICAgICAgICAgUHlfSU5DUkVGKG91dHB1dCk7CiAgICAgfQotICAgIGVsc2UgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKGFyZykpIHsKKyAgICBlbHNlIGlmIChQeUJ5dGVzX0NoZWNrKGFyZykgfHwgUHlPYmplY3RfQ2hlY2tCdWZmZXIoYXJnKSkgeworICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2soYXJnKSAmJgorICAgICAgICAgICAgUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAicGF0aCBzaG91bGQgYmUgc3RyaW5nIG9yIGJ5dGVzLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIGFyZyA9IFB5Qnl0ZXNfRnJvbU9iamVjdChhcmcpOwogICAgICAgICBpZiAoIWFyZykKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMzY3NSwxMSArMzkwOCw2IEBACiAgICAgICAgIFB5X0RFQ1JFRihhcmcpOwogICAgICAgICBpZiAoIW91dHB1dCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvdXRwdXQpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYob3V0cHV0KTsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkZWNvZGVyIGZhaWxlZCB0byByZXR1cm4gdW5pY29kZSIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0zNzE2LDcgKzM5NDQsNyBAQAogCiAgICAgaWYgKFB5VW5pY29kZV9VVEY4KHVuaWNvZGUpID09IE5VTEwpIHsKICAgICAgICAgYXNzZXJ0KCFQeVVuaWNvZGVfSVNfQ09NUEFDVF9BU0NJSSh1bmljb2RlKSk7Ci0gICAgICAgIGJ5dGVzID0gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgInN0cmljdCIpOworICAgICAgICBieXRlcyA9IF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsIE5VTEwpOwogICAgICAgICBpZiAoYnl0ZXMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBfUHlVbmljb2RlX1VURjgodW5pY29kZSkgPSBQeU9iamVjdF9NQUxMT0MoUHlCeXRlc19HRVRfU0laRShieXRlcykgKyAxKTsKQEAgLTM5ODIsNyArNDIxMCw3IEBACiAgICAgUHlfc3NpemVfdCAqZW5kaW5wb3MsIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LCBjb25zdCBjaGFyICoqaW5wdHIsCiAgICAgUHlPYmplY3QgKipvdXRwdXQsIFB5X3NzaXplX3QgKm91dHBvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlPYmplY3QgKnJlc3R1cGxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7CkBAIC00MDkwLDcgKzQzMTgsNyBAQAogICAgIFB5X3NzaXplX3QgKmVuZGlucG9zLCBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwgY29uc3QgY2hhciAqKmlucHRyLAogICAgIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciAvKiBQeU9iamVjdCAqKm91dHB1dCwgUHlfc3NpemVfdCAqb3V0cG9zICovKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeU9iamVjdCAqcmVzdHVwbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsKQEAgLTQ2OTYsOCArNDkyNCw5IEBACiAgICAgUHlfc3NpemVfdCBzdGFydGlucG9zOwogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgY29uc3QgY2hhciAqZXJybXNnID0gIiI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIGlmIChjb25zdW1lZCkKQEAgLTQ3MjIsNiArNDk1MSw3IEBACiAgICAgd2hpbGUgKHMgPCBlbmQpIHsKICAgICAgICAgUHlfVUNTNCBjaDsKICAgICAgICAgaW50IGtpbmQgPSB3cml0ZXIua2luZDsKKwogICAgICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSSh3cml0ZXIuYnVmZmVyKSkKICAgICAgICAgICAgICAgICBjaCA9IGFzY2lpbGliX3V0ZjhfZGVjb2RlKCZzLCBlbmQsIHdyaXRlci5kYXRhLCAmd3JpdGVyLnBvcyk7CkBAIC00NzYwLDI0ICs0OTkwLDU2IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcl93cml0ZXIoCi0gICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKLSAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZW5kLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKLSAgICAgICAgICAgICAgICAmd3JpdGVyKSkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgorICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgMHhmZmZkKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworCisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgmd3JpdGVyLCBQeVVuaWNvZGVfMkJZVEVfS0lORCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIGZvciAoaT1zdGFydGlucG9zOyBpPGVuZGlucG9zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IChQeV9VQ1M0KSh1bnNpZ25lZCBjaGFyKShzdGFydHNbaV0pOworICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoICsgMHhkYzAwKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKKyAgICAgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCisgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogRW5kOgogICAgIGlmIChjb25zdW1lZCkKICAgICAgICAgKmNvbnN1bWVkID0gcyAtIHN0YXJ0czsKIAotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiBvbkVycm9yOgotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwpAQCAtNTA2OSw3ICs1MzMxLDcgQEAKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIFB5T2JqZWN0ICp2OwotICAgIFBZX1VJTlQzMl9UICpvdXQ7CisgICAgdWludDMyX3QgKm91dDsKICNpZiBQWV9MSVRUTEVfRU5ESUFOCiAgICAgaW50IG5hdGl2ZV9vcmRlcmluZyA9IGJ5dGVvcmRlciA8PSAwOwogI2Vsc2UKQEAgLTUxMDAsNyArNTM2Miw3IEBACiAKICAgICAvKiBvdXRwdXQgYnVmZmVyIGlzIDQtYnl0ZXMgYWxpZ25lZCAqLwogICAgIGFzc2VydChfUHlfSVNfQUxJR05FRChQeUJ5dGVzX0FTX1NUUklORyh2KSwgNCkpOwotICAgIG91dCA9IChQWV9VSU5UMzJfVCAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHYpOworICAgIG91dCA9ICh1aW50MzJfdCAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHYpOwogICAgIGlmIChieXRlb3JkZXIgPT0gMCkKICAgICAgICAgKm91dCsrID0gMHhGRUZGOwogICAgIGlmIChsZW4gPT0gMCkKQEAgLTUxNjYsNyArNTQyOCw3IEBACiAKICAgICAgICAgLyogZm91ciBieXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIGVhY2ggc3Vycm9nYXRlICovCiAgICAgICAgIGlmIChtb3JldW5pdHMgPiAxKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IG91dHBvcyA9IG91dCAtIChQWV9VSU5UMzJfVCopIFB5Qnl0ZXNfQVNfU1RSSU5HKHYpOworICAgICAgICAgICAgUHlfc3NpemVfdCBvdXRwb3MgPSBvdXQgLSAodWludDMyX3QqKSBQeUJ5dGVzX0FTX1NUUklORyh2KTsKICAgICAgICAgICAgIFB5X3NzaXplX3QgbW9yZWJ5dGVzID0gNCAqIChtb3JldW5pdHMgLSAxKTsKICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKHYpID4gUFlfU1NJWkVfVF9NQVggLSBtb3JlYnl0ZXMpIHsKICAgICAgICAgICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCkBAIC01MTc1LDcgKzU0MzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmdiwgUHlCeXRlc19HRVRfU0laRSh2KSArIG1vcmVieXRlcykgPCAwKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICBvdXQgPSAoUFlfVUlOVDMyX1QqKSBQeUJ5dGVzX0FTX1NUUklORyh2KSArIG91dHBvczsKKyAgICAgICAgICAgIG91dCA9ICh1aW50MzJfdCopIFB5Qnl0ZXNfQVNfU1RSSU5HKHYpICsgb3V0cG9zOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgewpAQCAtNTQzMCwzNiArNTY5Miw0NSBAQAogICAgIGlmIChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKSB7CiAgICAgICAgIGNvbnN0IFB5X1VDUzQgKmluID0gKGNvbnN0IFB5X1VDUzQgKilkYXRhOwogICAgICAgICBjb25zdCBQeV9VQ1M0ICplbmQgPSBpbiArIGxlbjsKLSAgICAgICAgd2hpbGUgKGluIDwgZW5kKQotICAgICAgICAgICAgaWYgKCppbisrID49IDB4MTAwMDApCisgICAgICAgIHdoaWxlIChpbiA8IGVuZCkgeworICAgICAgICAgICAgaWYgKCppbisrID49IDB4MTAwMDApIHsKICAgICAgICAgICAgICAgICBwYWlycysrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIgLSBwYWlycyAtIChieXRlb3JkZXIgPT0gMCkpCisgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMiAtIHBhaXJzIC0gKGJ5dGVvcmRlciA9PSAwKSkgewogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiAgICAgbnNpemUgPSBsZW4gKyBwYWlycyArIChieXRlb3JkZXIgPT0gMCk7CiAgICAgdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbnNpemUgKiAyKTsKLSAgICBpZiAodiA9PSBOVUxMKQorICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgLyogb3V0cHV0IGJ1ZmZlciBpcyAyLWJ5dGVzIGFsaWduZWQgKi8KICAgICBhc3NlcnQoX1B5X0lTX0FMSUdORUQoUHlCeXRlc19BU19TVFJJTkcodiksIDIpKTsKICAgICBvdXQgPSAodW5zaWduZWQgc2hvcnQgKilQeUJ5dGVzX0FTX1NUUklORyh2KTsKLSAgICBpZiAoYnl0ZW9yZGVyID09IDApCisgICAgaWYgKGJ5dGVvcmRlciA9PSAwKSB7CiAgICAgICAgICpvdXQrKyA9IDB4RkVGRjsKLSAgICBpZiAobGVuID09IDApCisgICAgfQorICAgIGlmIChsZW4gPT0gMCkgewogICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCiAgICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgdWNzMWxpYl91dGYxNl9lbmNvZGUoKGNvbnN0IFB5X1VDUzEgKilkYXRhLCBsZW4sICZvdXQsIG5hdGl2ZV9vcmRlcmluZyk7CiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSAgICBpZiAoYnl0ZW9yZGVyIDwgMCkKKyAgICBpZiAoYnl0ZW9yZGVyIDwgMCkgewogICAgICAgICBlbmNvZGluZyA9ICJ1dGYtMTYtbGUiOwotICAgIGVsc2UgaWYgKGJ5dGVvcmRlciA+IDApCisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVvcmRlciA+IDApIHsKICAgICAgICAgZW5jb2RpbmcgPSAidXRmLTE2LWJlIjsKLSAgICBlbHNlCisgICAgfQorICAgIGVsc2UgewogICAgICAgICBlbmNvZGluZyA9ICJ1dGYtMTYiOworICAgIH0KIAogICAgIHBvcyA9IDA7CiAgICAgd2hpbGUgKHBvcyA8IGxlbikgewpAQCAtNTg2OCwxMSArNjEzOSwxMCBAQAogUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIHsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgUHlfc3NpemVfdCBleHBhbmRzaXplID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICAvKiBJbml0aWFsIGFsbG9jYXRpb24gaXMgYmFzZWQgb24gdGhlIGxvbmdlc3QtcG9zc2libGUgY2hhcmFjdGVyCiAgICAgICAgZXNjYXBlLgpAQCAtNTg4OCwzNSArNjE1OCwyOCBAQAogICAgIH0KICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSA0OyBicmVhazsKLSAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBleHBhbmRzaXplID0gNjsgYnJlYWs7Ci0gICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDEwOyBicmVhazsKLSAgICB9CiAKLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCi0gICAgaWYgKGxlbiA+IChQWV9TU0laRV9UX01BWCAtIDIgLSAxKSAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCi0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBhbmRzaXplKmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSk7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CiAKICAgICAgICAgLyogRXNjYXBlIGJhY2tzbGFzaGVzICovCiAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAvKiAtMTogc3VidHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgICAgICAgICAgY29udGludWU7CkBAIC01OTI1LDYgKzYxODgsMTEgQEAKICAgICAgICAgLyogTWFwIDIxLWJpdCBjaGFyYWN0ZXJzIHRvICdcVTAweHh4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAweDEwMDAwKSB7CiAgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAxMC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ1UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjgpICYgMHgwMDAwMDAwRl07CkBAIC01OTQwLDYgKzYyMDgsMTAgQEAKIAogICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgaWYgKGNoID49IDI1NikgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHgwMDBGXTsKQEAgLTU5NTAsMjAgKzYyMjIsMzcgQEAKIAogICAgICAgICAvKiBNYXAgc3BlY2lhbCB3aGl0ZXNwYWNlIHRvICdcdCcsIFxuJywgJ1xyJyAqLwogICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndCc7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ24nOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdyJzsKICAgICAgICAgfQogCiAgICAgICAgIC8qIE1hcCBub24tcHJpbnRhYmxlIFVTIEFTQ0lJIHRvICdceGhoJyAqLwogICAgICAgICBlbHNlIGlmIChjaCA8ICcgJyB8fCBjaCA+PSAweDdGKSB7CisgICAgICAgICAgICAvKiAtMTogc3VidHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3gnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweDAwMEZdOwpAQCAtNTk3NSwxMCArNjI2NCwxMSBAQAogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAKLSAgICBhc3NlcnQocCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpID4gMCk7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTYxMDcsMTMgKzYzOTcsMTIgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKLSAgICBjaGFyICpxOwotICAgIFB5X3NzaXplX3QgZXhwYW5kc2l6ZSwgcG9zOworICAgIFB5X3NzaXplX3QgcG9zOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodW5pY29kZSkpIHsKICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKQEAgLTYxMjEsMjggKzY0MTAsMjkgQEAKICAgICB9CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHVuaWNvZGUpOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh1bmljb2RlKTsKICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKLSAgICAvKiA0IGJ5dGUgY2hhcmFjdGVycyBjYW4gdGFrZSB1cCAxMCBieXRlcywgMiBieXRlIGNoYXJhY3RlcnMgY2FuIHRha2UgdXAgNgotICAgICAgIGJ5dGVzLCBhbmQgMSBieXRlIGNoYXJhY3RlcnMgNC4gKi8KLSAgICBleHBhbmRzaXplID0ga2luZCAqIDIgKyAyOwogCi0gICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGV4cGFuZHNpemUgKiBsZW4pOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIHJlcHI7Ci0KLSAgICBwID0gcSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwogICAgIGZvciAocG9zID0gMDsgcG9zIDwgbGVuOyBwb3MrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKTsKICAgICAgICAgLyogTWFwIDMyLWJpdCBjaGFyYWN0ZXJzIHRvICdcVXh4eHh4eHh4JyAqLwogICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKworICAgICAgICAgICAgLyogLTE6IHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtNjE1Niw2ICs2NDQ2LDExIEBACiAgICAgICAgIH0KICAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoID49IDI1NikgeworICAgICAgICAgICAgLyogLTE6IHN1YnRyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07CkBAIC02MTY4LDEwICs2NDYzLDExIEBACiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KIAotICAgIGFzc2VydChwID4gcSk7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgcCAtIHEpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgpAQCAtNjM0OCw3ICs2NjQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgZW5kcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqbmV3cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPbjtlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIvYnl0ZXMsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPbjtlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIvYnl0ZXMsIGludCkgdHVwbGUiOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKICAgICBQeU9iamVjdCAqcmVzdW5pY29kZTsKQEAgLTY0MDIsMjUgKzY2OTgsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VuY29kZV91Y3MxKFB5T2JqZWN0ICp1bmljb2RlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUHlfVUNTNCBsaW1pdCkKIHsKICAgICAvKiBpbnB1dCBzdGF0ZSAqLwogICAgIFB5X3NzaXplX3QgcG9zPTAsIHNpemU7CiAgICAgaW50IGtpbmQ7CiAgICAgdm9pZCAqZGF0YTsKLSAgICAvKiBvdXRwdXQgb2JqZWN0ICovCi0gICAgUHlPYmplY3QgKnJlczsKICAgICAvKiBwb2ludGVyIGludG8gdGhlIG91dHB1dCAqLwogICAgIGNoYXIgKnN0cjsKLSAgICAvKiBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiAqLwotICAgIFB5X3NzaXplX3QgcmVzc2l6ZTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IChsaW1pdCA9PSAyNTYpID8gImxhdGluLTEiIDogImFzY2lpIjsKICAgICBjb25zdCBjaGFyICpyZWFzb24gPSAobGltaXQgPT0gMjU2KSA/ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpIiA6ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIjsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwotICAgIC8qIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBmb3IgY2FjaGluZyBzdHJpbmcgY29tcGFyaXNvbnMKLSAgICAgKiAtMT1ub3QgaW5pdGlhbGl6ZWQsIDA9dW5rbm93biwgMT1zdHJpY3QsIDI9cmVwbGFjZSwgMz1pZ25vcmUsIDQ9eG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICBpbnQga25vd25fZXJyb3JIYW5kbGVyID0gLTE7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOworICAgIFB5T2JqZWN0ICpyZXAgPSBOVUxMOworICAgIC8qIG91dHB1dCBvYmplY3QgKi8KKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTY0MzEsMTg2ICs2NzI0LDE1NyBAQAogICAgICAgIHJlcGxhY2VtZW50cywgaWYgd2UgbmVlZCBtb3JlLCB3ZSdsbCByZXNpemUgKi8KICAgICBpZiAoc2l6ZSA9PSAwKQogICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKLSAgICByZXMgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotICAgIGlmIChyZXMgPT0gTlVMTCkKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgIHJlc3NpemUgPSBzaXplOwogCiAgICAgd2hpbGUgKHBvcyA8IHNpemUpIHsKLSAgICAgICAgUHlfVUNTNCBjID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKTsKKyAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CiAKICAgICAgICAgLyogY2FuIHdlIGVuY29kZSB0aGlzPyAqLwotICAgICAgICBpZiAoYzxsaW1pdCkgeworICAgICAgICBpZiAoY2ggPCBsaW1pdCkgewogICAgICAgICAgICAgLyogbm8gb3ZlcmZsb3cgY2hlY2ssIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBzcGFjZSBpcyBlbm91Z2ggKi8KLSAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKWM7CisgICAgICAgICAgICAqc3RyKysgPSAoY2hhciljaDsKICAgICAgICAgICAgICsrcG9zOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlfc3NpemVfdCByZXF1aXJlZHNpemU7Ci0gICAgICAgICAgICBQeU9iamVjdCAqcmVwdW5pY29kZTsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVwc2l6ZSwgbmV3cG9zLCByZXNwb3MsIGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3BvcywgaTsKICAgICAgICAgICAgIC8qIHN0YXJ0cG9zIGZvciBjb2xsZWN0aW5nIHVuZW5jb2RhYmxlIGNoYXJzICovCiAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxzdGFydCA9IHBvczsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgY29sbGVuZCA9IHBvczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY29sbGVuZCA9IGNvbGxzdGFydCArIDE7CiAgICAgICAgICAgICAvKiBmaW5kIGFsbCB1bmVjb2RhYmxlIGNoYXJhY3RlcnMgKi8KKwogICAgICAgICAgICAgd2hpbGUgKChjb2xsZW5kIDwgc2l6ZSkgJiYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGNvbGxlbmQpID49IGxpbWl0KSkKICAgICAgICAgICAgICAgICArK2NvbGxlbmQ7CisKKyAgICAgICAgICAgIC8qIE9ubHkgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgaWYgaXQncyBub3QgdGhlIGxhc3Qgd3JpdGUgKi8KKyAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAoY29sbGVuZCA8IHNpemUpOworCiAgICAgICAgICAgICAvKiBjYWNoZSBjYWxsYmFjayBuYW1lIGxvb2t1cCAoaWYgbm90IGRvbmUgeWV0LCBpLmUuIGl0J3MgdGhlIGZpcnN0IGVycm9yKSAqLwotICAgICAgICAgICAgaWYgKGtub3duX2Vycm9ySGFuZGxlcj09LTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGVycm9ycz09TlVMTCkgfHwgKCFzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikpCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDM7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJ4bWxjaGFycmVmcmVwbGFjZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSA0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa25vd25fZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0cmljdCAqLworICAgICAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCwgcmVhc29uKTsKICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICBjYXNlIDI6IC8qIHJlcGxhY2UgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoY29sbHN0YXJ0KysgPCBjb2xsZW5kKQotICAgICAgICAgICAgICAgICAgICAqc3RyKysgPSAnPyc7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgY2FzZSAzOiAvKiBpZ25vcmUgKi8KKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBtZW1zZXQoc3RyLCAnPycsIGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIHN0ciArPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIGlnbm9yZSBlcnJvciBoYW5kbGVyICovCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CiAgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IHJlc3BvczsKLSAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaW5jcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMTApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMisxKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMiszKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis0KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNSsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis2KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzcrMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IGluY3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIChzaXplIC0gY29sbGVuZCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHNpemUgLSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiByZXNzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplIDw9IFBZX1NTSVpFX1RfTUFYLzIgJiYgcmVxdWlyZWRzaXplIDwgMipyZXNzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gMipyZXNzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlcXVpcmVkc2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciArPSBzcHJpbnRmKHN0ciwgIiYjJWQ7IiwgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgcmVhc29uLCB1bmljb2RlLCAmZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnQsIGNvbGxlbmQsICZuZXdwb3MpOwotICAgICAgICAgICAgICAgIGlmIChyZXB1bmljb2RlID09IE5VTEwgfHwgKFB5VW5pY29kZV9DaGVjayhyZXB1bmljb2RlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEWShyZXB1bmljb2RlKSA9PSAtMSkpCisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgPSBiYWNrc2xhc2hyZXBsYWNlKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwdW5pY29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0bHkgY29weSBieXRlcyByZXN1bHQgdG8gb3V0cHV0LiAqLwotICAgICAgICAgICAgICAgICAgICByZXBzaXplID0gUHlCeXRlc19TaXplKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVwc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgYWxsIGFkZGl0aW9uYWwgYnl0ZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHJlcHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlc3NpemUrcmVwc2l6ZS0xKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSByZXBzaXplLTE7CisgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgPSB4bWxjaGFycmVmcmVwbGFjZSgmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDB4ZGM4MCB8fCAweGRjZmYgPCBjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGEgVVRGLThiIHN1cnJvZ2F0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN0ciwgUHlCeXRlc19Bc1N0cmluZyhyZXB1bmljb2RlKSwgcmVwc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciArPSByZXBzaXplOwotICAgICAgICAgICAgICAgICAgICBwb3MgPSBuZXdwb3M7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpKGNoIC0gMHhkYzAwKTsKKyAgICAgICAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID49IGNvbGxlbmQpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgc3BhY2U/IChhdCBsZWFzdCBlbm91Z2ggZm9yIHdoYXQgd2UKLSAgICAgICAgICAgICAgICAgICBoYXZlK3RoZSByZXBsYWNlbWVudCt0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLCBzbwotICAgICAgICAgICAgICAgICAgIHdlIHdvbid0IGhhdmUgdG8gY2hlY2sgc3BhY2UgZm9yIGVuY29kYWJsZSBjaGFyYWN0ZXJzKSAqLwotICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IHJlc3BvczsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSByZXBzaXplOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIChzaXplIC0gY29sbGVuZCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHNpemUgLSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiByZXNzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplIDw9IFBZX1NTSVpFX1RfTUFYLzIgJiYgcmVxdWlyZWRzaXplIDwgMipyZXNzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gMipyZXNzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlcXVpcmVkc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBjb2xsc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGNvbGxzdGFydCAhPSBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsYmFjayB0byBnZW5lcmFsIGVycm9yIGhhbmRsaW5nICovCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVwID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnQsIGNvbGxlbmQsICZuZXdwb3MpOworICAgICAgICAgICAgICAgIGlmIChyZXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgLyogc3VidHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdGx5IGNvcHkgYnl0ZXMgcmVzdWx0IHRvIG91dHB1dC4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHJlcCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKSArIHJlc3BvczsKLSAgICAgICAgICAgICAgICAgICAgcmVzc2l6ZSA9IHJlcXVpcmVkc2l6ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdW5lbmNvZGFibGUgaW4gdGhlIHJlcGxhY2VtZW50Ci0gICAgICAgICAgICAgICAgICAgYW5kIGNvcHkgaXQgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IHJlcHNpemUtLT4wOyArK2ksICsrc3RyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHJlcHVuaWNvZGUsIGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSBsaW1pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbigmZXhjLCBlbmNvZGluZywgdW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBwb3MrMSwgcmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhyZXApKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHJlcCkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkocmVwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoOiBhbGwgY2hhcmFjdGVycyBhcmUgc21hbGxlciB0aGFuIGxpbWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobGltaXQgPj0gMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChyZXApID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfREFUQShyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqc3RyID0gKGNoYXIpYzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHN0ciwgcmVwc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB1bmVuY29kYWJsZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50IGFuZCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IHJlcHNpemUtLT4wOyArK2ksICsrc3RyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHJlcCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBwb3MrMSwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyID0gKGNoYXIpY2g7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcG9zID0gbmV3cG9zOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBQeV9DTEVBUihyZXApOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBvdmVyYWxsb2NhdGlvbiB3YXMgZGlzYWJsZWQsIGVuc3VyZSB0aGF0IGl0IHdhcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgcG9zID09IHNpemUpOwogICAgICAgICB9CiAgICAgfQotICAgIC8qIFJlc2l6ZSBpZiB3ZSBhbGxvY2F0ZWQgdG8gbXVjaCAqLwotICAgIHNpemUgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgIGlmIChzaXplIDwgcmVzc2l6ZSkgeyAvKiBJZiB0aGlzIGZhbGxzIHJlcyB3aWxsIGJlIE5VTEwgKi8KLSAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7Ci0gICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgc2l6ZSkgPCAwKQotICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgIH0KIAotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgcmV0dXJuIHJlczsKLQotICBvdmVyZmxvdzoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHN0cik7CiAKICAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHJlcyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYocmVwKTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY2NzAsOCArNjkzNCw5IEBACiAgICAgUHlfc3NpemVfdCBlbmRpbnBvczsKICAgICBQeV9zc2l6ZV90IG91dHBvczsKICAgICBjb25zdCBjaGFyICplOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogCiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCk7CkBAIC02NzAwLDEyICs2OTY1LDQyIEBACiAgICAgICAgICAgICBQeVVuaWNvZGVfV1JJVEUoa2luZCwgZGF0YSwgd3JpdGVyLnBvcywgYyk7CiAgICAgICAgICAgICB3cml0ZXIucG9zKys7CiAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKKworICAgICAgICAvKiBieXRlIG91dHNpemUgcmFuZ2UgMHgwMC4uMHg3ZjogY2FsbCB0aGUgZXJyb3IgaGFuZGxlciAqLworCisgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgICAgICB7CisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgICAgIC8qIEZhc3QtcGF0aDogdGhlIGVycm9yIGhhbmRsZXIgb25seSB3cml0ZXMgb25lIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgIGJ1dCB3ZSBtYXkgc3dpdGNoIHRvIFVDUzIgYXQgdGhlIGZpcnN0IHdyaXRlICovCisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgmd3JpdGVyLCBQeVVuaWNvZGVfMkJZVEVfS0lORCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIGtpbmQgPSB3cml0ZXIua2luZDsKKyAgICAgICAgICAgIGRhdGEgPSB3cml0ZXIuZGF0YTsKKworICAgICAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1JFUExBQ0UpCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIDB4ZmZmZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIGMgKyAweGRjMDApOworICAgICAgICAgICAgd3JpdGVyLnBvcysrOworICAgICAgICAgICAgKytzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgorICAgICAgICAgICAgKytzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXJ0aW5wb3MgPSBzLXN0YXJ0czsKICAgICAgICAgICAgIGVuZGlucG9zID0gc3RhcnRpbnBvcyArIDE7CiAgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLAogICAgICAgICAgICAgICAgICAgICAiYXNjaWkiLCAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSIsCiAgICAgICAgICAgICAgICAgICAgICZzdGFydHMsICZlLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKICAgICAgICAgICAgICAgICAgICAgJndyaXRlcikpCkBAIC02NzE0LDEzICs3MDA5LDEzIEBACiAgICAgICAgICAgICBkYXRhID0gd3JpdGVyLmRhdGE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJndyaXRlcik7CiAKICAgb25FcnJvcjoKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY3NzUsNyArNzA3MCw3IEBACiAjICBkZWZpbmUgV0NfRVJSX0lOVkFMSURfQ0hBUlMgMHgwMDgwCiAjZW5kaWYKIAotc3RhdGljIGNoYXIqCitzdGF0aWMgY29uc3QgY2hhcioKIGNvZGVfcGFnZV9uYW1lKFVJTlQgY29kZV9wYWdlLCBQeU9iamVjdCAqKm9iaikKIHsKICAgICAqb2JqID0gTlVMTDsKQEAgLTY4ODMsNyArNzE3OCw3IEBACiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX29iaiA9IE5VTEw7Ci0gICAgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAgICAgRFdPUkQgZXJyOwogICAgIGludCByZXQgPSAtMTsKIApAQCAtNzExOSw3ICs3NDE0LDYgQEAKICAgICBCT09MIHVzZWREZWZhdWx0Q2hhciA9IEZBTFNFOwogICAgIEJPT0wgKnB1c2VkRGVmYXVsdENoYXIgPSAmdXNlZERlZmF1bHRDaGFyOwogICAgIGludCBvdXRzaXplOwotICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIHdjaGFyX3QgKnA7CiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIGNvbnN0IERXT1JEIGZsYWdzID0gZW5jb2RlX2NvZGVfcGFnZV9mbGFncyhjb2RlX3BhZ2UsIE5VTEwpOwpAQCAtNzIyOCw3ICs3NTIyLDcgQEAKICAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICBQeU9iamVjdCAqZW5jb2Rpbmdfb2JqID0gTlVMTDsKLSAgICBjaGFyICplbmNvZGluZzsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZzsKICAgICBQeV9zc2l6ZV90IG5ld3BvcywgbmV3b3V0c2l6ZTsKICAgICBQeU9iamVjdCAqcmVwOwogICAgIGludCByZXQgPSAtMTsKQEAgLTgwODYsNyArODM4MCw3IEBACiBjaGFybWFwX2VuY29kaW5nX2Vycm9yKAogICAgIFB5T2JqZWN0ICp1bmljb2RlLCBQeV9zc2l6ZV90ICppbnBvcywgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgUHlPYmplY3QgKipleGNlcHRpb25PYmplY3QsCi0gICAgaW50ICprbm93bl9lcnJvckhhbmRsZXIsIFB5T2JqZWN0ICoqZXJyb3JIYW5kbGVyLCBjb25zdCBjaGFyICplcnJvcnMsCisgICAgX1B5X2Vycm9yX2hhbmRsZXIgKmVycm9yX2hhbmRsZXIsIFB5T2JqZWN0ICoqZXJyb3JfaGFuZGxlcl9vYmosIGNvbnN0IGNoYXIgKmVycm9ycywKICAgICBQeU9iamVjdCAqKnJlcywgUHlfc3NpemVfdCAqcmVzcG9zKQogewogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsgLyogaW5pdGlhbGl6ZSB0byBwcmV2ZW50IGdjYyB3YXJuaW5nICovCkBAIC04MTMzLDIzICs4NDI3LDE1IEBACiAgICAgfQogICAgIC8qIGNhY2hlIGNhbGxiYWNrIG5hbWUgbG9va3VwCiAgICAgICogKGlmIG5vdCBkb25lIHlldCwgaS5lLiBpdCdzIHRoZSBmaXJzdCBlcnJvcikgKi8KLSAgICBpZiAoKmtub3duX2Vycm9ySGFuZGxlcj09LTEpIHsKLSAgICAgICAgaWYgKChlcnJvcnM9PU5VTEwpIHx8ICghc3RyY21wKGVycm9ycywgInN0cmljdCIpKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAxOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAyOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgImlnbm9yZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDM7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSA0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMDsKLSAgICB9Ci0gICAgc3dpdGNoICgqa25vd25fZXJyb3JIYW5kbGVyKSB7Ci0gICAgY2FzZSAxOiAvKiBzdHJpY3QgKi8KKyAgICBpZiAoKmVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICplcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgIHN3aXRjaCAoKmVycm9yX2hhbmRsZXIpIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVFJJQ1Q6CiAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oZXhjZXB0aW9uT2JqZWN0LCBlbmNvZGluZywgdW5pY29kZSwgY29sbHN0YXJ0cG9zLCBjb2xsZW5kcG9zLCByZWFzb24pOwogICAgICAgICByZXR1cm4gLTE7Ci0gICAgY2FzZSAyOiAvKiByZXBsYWNlICovCisKKyAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgogICAgICAgICBmb3IgKGNvbGxwb3MgPSBjb2xsc3RhcnRwb3M7IGNvbGxwb3M8Y29sbGVuZHBvczsgKytjb2xscG9zKSB7CiAgICAgICAgICAgICB4ID0gY2hhcm1hcGVuY29kZV9vdXRwdXQoJz8nLCBtYXBwaW5nLCByZXMsIHJlc3Bvcyk7CiAgICAgICAgICAgICBpZiAoeD09ZW5jX0VYQ0VQVElPTikgewpAQCAtODE2MSwxMCArODQ0NywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgMzogLyogaWdub3JlICovCisgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgogICAgICAgICAqaW5wb3MgPSBjb2xsZW5kcG9zOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCisKKyAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKICAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKHRlbXBvcmFyaWx5IChtaXMpdXNlcyBwKSAqLwogICAgICAgICBmb3IgKGNvbGxwb3MgPSBjb2xsc3RhcnRwb3M7IGNvbGxwb3MgPCBjb2xsZW5kcG9zOyArK2NvbGxwb3MpIHsKICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIrMjkrMSsxXTsKQEAgLTgxODIsOCArODQ2OSw5IEBACiAgICAgICAgIH0KICAgICAgICAgKmlucG9zID0gY29sbGVuZHBvczsKICAgICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgotICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCBlcnJvckhhbmRsZXIsCisgICAgICAgIHJlcHVuaWNvZGUgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsIGVycm9yX2hhbmRsZXJfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgZXhjZXB0aW9uT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0cG9zLCBjb2xsZW5kcG9zLCAmbmV3cG9zKTsKICAgICAgICAgaWYgKHJlcHVuaWNvZGUgPT0gTlVMTCkKQEAgLTgyNDYsMTIgKzg1MzQsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICAvKiBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiAqLwogICAgIFB5X3NzaXplX3QgcmVzcG9zID0gMDsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwotICAgIC8qIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBmb3IgY2FjaGluZyBzdHJpbmcgY29tcGFyaXNvbnMKLSAgICAgKiAtMT1ub3QgaW5pdGlhbGl6ZWQsIDA9dW5rbm93biwgMT1zdHJpY3QsIDI9cmVwbGFjZSwKLSAgICAgKiAzPWlnbm9yZSwgND14bWxjaGFycmVmcmVwbGFjZSAqLwotICAgIGludCBrbm93bl9lcnJvckhhbmRsZXIgPSAtMTsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAgICAgdm9pZCAqZGF0YTsKICAgICBpbnQga2luZDsKIApAQCAtODI4Miw3ICs4NTY3LDcgQEAKICAgICAgICAgaWYgKHg9PWVuY19GQUlMRUQpIHsgLyogdW5lbmNvZGFibGUgY2hhcmFjdGVyICovCiAgICAgICAgICAgICBpZiAoY2hhcm1hcF9lbmNvZGluZ19lcnJvcih1bmljb2RlLCAmaW5wb3MsIG1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub3duX2Vycm9ySGFuZGxlciwgJmVycm9ySGFuZGxlciwgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX2hhbmRsZXIsICZlcnJvcl9oYW5kbGVyX29iaiwgZXJyb3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywgJnJlc3BvcykpIHsKICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgICAgICAgICB9CkBAIC04Mjk4LDEzICs4NTgzLDEzIEBACiAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIHJldHVybiByZXM7CiAKICAgb25FcnJvcjoKICAgICBQeV9YREVDUkVGKHJlcyk7CiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtODM3MSw3ICs4NjU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgZW5kcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqbmV3cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO3RyYW5zbGF0aW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeV9zc2l6ZV90IGlfbmV3cG9zOwogICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKQEAgLTg2MjgsNyArODkxMyw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotUHlPYmplY3QgKgorc3RhdGljIFB5T2JqZWN0ICoKIF9QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChQeU9iamVjdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQpAQCAtODY1NywxMCArODk0Miw4IEBACiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKGlucHV0KTsKICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoaW5wdXQpOwogCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQorICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbU9iamVjdChpbnB1dCk7CiAKICAgICAvKiBhbGxvY2F0ZSBlbm91Z2ggZm9yIGEgc2ltcGxlIDE6MSB0cmFuc2xhdGlvbiB3aXRob3V0CiAgICAgICAgcmVwbGFjZW1lbnRzLCBpZiB3ZSBuZWVkIG1vcmUsIHdlJ2xsIHJlc2l6ZSAqLwpAQCAtODc3MSwxNCArOTA1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gX1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpOwogfQogCiBzdGF0aWMgUHlfVUNTNApAQCAtODk2MCw5ICs5MjM4LDEwIEBACiAgICAgfQogCiBzdGF0aWMgUHlfc3NpemVfdAotYW55X2ZpbmRfc2xpY2UoaW50IGRpcmVjdGlvbiwgUHlPYmplY3QqIHMxLCBQeU9iamVjdCogczIsCithbnlfZmluZF9zbGljZShQeU9iamVjdCogczEsIFB5T2JqZWN0KiBzMiwKICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCkKKyAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAorICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwpAQCAtOTEzMSw1NCArOTQxMCwzNSBAQAogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kKQogewogICAgIFB5X3NzaXplX3QgcmVzdWx0OwotICAgIFB5T2JqZWN0KiBzdHJfb2JqOwotICAgIFB5T2JqZWN0KiBzdWJfb2JqOwogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSA9IE5VTEwsICpidWYyID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAKLSAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoIXN0cl9vYmopCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3ViX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1YnN0cik7Ci0gICAgaWYgKCFzdWJfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1Yl9vYmopID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHJfb2JqKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KIAotICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyX29iaik7Ci0gICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJfb2JqKTsKLSAgICBpZiAoa2luZDEgPCBraW5kMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKKyAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHIpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKLSAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyX29iaik7Ci0gICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1Yl9vYmopOworICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOworICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJzdHIpOwogICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbjEpOwotICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCi0gICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cl9vYmopOwotICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJfb2JqKTsKKyAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKyAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3Vic3RyKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKLSAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1Yl9vYmosIGtpbmQxKTsKKyAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1YnN0ciwga2luZDEpOwogICAgICAgICBpZiAoIWJ1ZjIpCiAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6Ci0gICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkoc3RyX29iaikgJiYgUHlVbmljb2RlX0lTX0FTQ0lJKHN1Yl9vYmopKQorICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHN0cikgJiYgUHlVbmljb2RlX0lTX0FTQ0lJKHN1YnN0cikpCiAgICAgICAgICAgICByZXN1bHQgPSBhc2NpaWxpYl9jb3VudCgKICAgICAgICAgICAgICAgICAoKFB5X1VDUzEqKWJ1ZjEpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAogICAgICAgICAgICAgICAgIGJ1ZjIsIGxlbjIsIFBZX1NTSVpFX1RfTUFYCkBAIC05MjA1LDE2ICs5NDY1LDExIEBACiAgICAgICAgIGFzc2VydCgwKTsgcmVzdWx0ID0gMDsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotCiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogICAgIHJldHVybiAtMTsKQEAgLTkyMjIsMzUgKzk0NzcsMTUgQEAKIAogUHlfc3NpemVfdAogUHlVbmljb2RlX0ZpbmQoUHlPYmplY3QgKnN0ciwKLSAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWIsCisgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAogICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKCFzdHIpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTI7Ci0gICAgc3ViID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3ViKTsKLSAgICBpZiAoIXN1YikgewotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIC0yOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoZGlyZWN0aW9uLAotICAgICAgICBzdHIsIHN1Yiwgc3RhcnQsIGVuZAotICAgICAgICApOwotCi0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgUHlfREVDUkVGKHN1Yik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBhbnlfZmluZF9zbGljZShzdHIsIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKIH0KIAogUHlfc3NpemVfdApAQCAtOTM1MywyMiArOTU4OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHN1YnN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1YnN0cik7Ci0gICAgaWYgKHN1YnN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHN0ciwgc3Vic3RyLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIFB5X0RFQ1JFRihzdWJzdHIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHRhaWxtYXRjaChzdHIsIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKIH0KIAogLyogQXBwbHkgZml4ZmN0IGZpbHRlciB0byB0aGUgVW5pY29kZSBvYmplY3Qgc2VsZiBhbmQgcmV0dXJuIGEKQEAgLTk2NzAsMjAgKzk4OTMsMTAgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9Kb2luKFB5T2JqZWN0ICpzZXBhcmF0b3IsIFB5T2JqZWN0ICpzZXEpCiB7Ci0gICAgUHlPYmplY3QgKnNlcCA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCBzZXBsZW47Ci0gICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7IC8qIHRoZSByZXN1bHQgKi8KLSAgICBQeU9iamVjdCAqZnNlcTsgICAgICAgICAgLyogUHlTZXF1ZW5jZV9GYXN0KHNlcSkgKi8KLSAgICBQeV9zc2l6ZV90IHNlcWxlbjsgICAgICAgLyogbGVuKGZzZXEpIC0tIG51bWJlciBvZiBpdGVtcyBpbiBzZXF1ZW5jZSAqLworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmZzZXE7CisgICAgUHlfc3NpemVfdCBzZXFsZW47CiAgICAgUHlPYmplY3QgKippdGVtczsKLSAgICBQeU9iamVjdCAqaXRlbTsKLSAgICBQeV9zc2l6ZV90IHN6LCBpLCByZXNfb2Zmc2V0OwotICAgIFB5X1VDUzQgbWF4Y2hhcjsKLSAgICBQeV9VQ1M0IGl0ZW1fbWF4Y2hhcjsKLSAgICBpbnQgdXNlX21lbWNweTsKLSAgICB1bnNpZ25lZCBjaGFyICpyZXNfZGF0YSA9IE5VTEwsICpzZXBfZGF0YSA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmxhc3Rfb2JqOwotICAgIHVuc2lnbmVkIGludCBraW5kID0gMDsKIAogICAgIGZzZXEgPSBQeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiY2FuIG9ubHkgam9pbiBhbiBpdGVyYWJsZSIpOwogICAgIGlmIChmc2VxID09IE5VTEwpIHsKQEAgLTk2OTQsMjEgKzk5MDcsMzkgQEAKICAgICAgKiBzbyB3ZSBhcmUgc3VyZSB0aGF0IGZzZXEgd29uJ3QgYmUgbXV0YXRlZC4KICAgICAgKi8KIAorICAgIGl0ZW1zID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGZzZXEpOwogICAgIHNlcWxlbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmc2VxKTsKKyAgICByZXMgPSBfUHlVbmljb2RlX0pvaW5BcnJheShzZXBhcmF0b3IsIGl0ZW1zLCBzZXFsZW4pOworICAgIFB5X0RFQ1JFRihmc2VxKTsKKyAgICByZXR1cm4gcmVzOworfQorCitQeU9iamVjdCAqCitfUHlVbmljb2RlX0pvaW5BcnJheShQeU9iamVjdCAqc2VwYXJhdG9yLCBQeU9iamVjdCAqKml0ZW1zLCBQeV9zc2l6ZV90IHNlcWxlbikKK3sKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsgLyogdGhlIHJlc3VsdCAqLworICAgIFB5T2JqZWN0ICpzZXAgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgc2VwbGVuOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3Qgc3osIGksIHJlc19vZmZzZXQ7CisgICAgUHlfVUNTNCBtYXhjaGFyOworICAgIFB5X1VDUzQgaXRlbV9tYXhjaGFyOworICAgIGludCB1c2VfbWVtY3B5OworICAgIHVuc2lnbmVkIGNoYXIgKnJlc19kYXRhID0gTlVMTCwgKnNlcF9kYXRhID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGFzdF9vYmo7CisgICAgdW5zaWduZWQgaW50IGtpbmQgPSAwOworCiAgICAgLyogSWYgZW1wdHkgc2VxdWVuY2UsIHJldHVybiB1IiIuICovCiAgICAgaWYgKHNlcWxlbiA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmc2VxKTsKICAgICAgICAgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCk7CiAgICAgfQogCiAgICAgLyogSWYgc2luZ2xldG9uIHNlcXVlbmNlIHdpdGggYW4gZXhhY3QgVW5pY29kZSwgcmV0dXJuIHRoYXQuICovCiAgICAgbGFzdF9vYmogPSBOVUxMOwotICAgIGl0ZW1zID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGZzZXEpOwogICAgIGlmIChzZXFsZW4gPT0gMSkgewogICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QoaXRlbXNbMF0pKSB7CiAgICAgICAgICAgICByZXMgPSBpdGVtc1swXTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOwotICAgICAgICAgICAgUHlfREVDUkVGKGZzZXEpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICBzZXBsZW4gPSAwOwpAQCAtOTg0MywxMyArMTAwNzQsMTEgQEAKICAgICAgICAgYXNzZXJ0KHJlc19vZmZzZXQgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVzKSk7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKGZzZXEpOwogICAgIFB5X1hERUNSRUYoc2VwKTsKICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHJlcywgMSkpOwogICAgIHJldHVybiByZXM7CiAKICAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoZnNlcSk7CiAgICAgUHlfWERFQ1JFRihzZXApOwogICAgIFB5X1hERUNSRUYocmVzKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTk5NzQsMTMgKzEwMjAzLDggQEAKIHsKICAgICBQeU9iamVjdCAqbGlzdDsKIAotICAgIHN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cmluZyk7Ci0gICAgaWYgKHN0cmluZyA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHJpbmcpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBzd2l0Y2ggKFB5VW5pY29kZV9LSU5EKHN0cmluZykpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgpAQCAtMTAwMDcsNyArMTAyMzEsNiBAQAogICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgIGxpc3QgPSAwOwogICAgIH0KLSAgICBQeV9ERUNSRUYoc3RyaW5nKTsKICAgICByZXR1cm4gbGlzdDsKIH0KIApAQCAtMTA1NjgsMjggKzEwNzkxLDI3IEBACiB9CiAKIAotLyogQXJndW1lbnQgY29udmVydGVyLiAgQ29lcmNlcyB0byBhIHNpbmdsZSB1bmljb2RlIGNoYXJhY3RlciAqLworLyogQXJndW1lbnQgY29udmVydGVyLiBBY2NlcHRzIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyLiAqLwogCiBzdGF0aWMgaW50CiBjb252ZXJ0X3VjKFB5T2JqZWN0ICpvYmosIHZvaWQgKmFkZHIpCiB7CiAgICAgUHlfVUNTNCAqZmlsbGNoYXJsb2MgPSAoUHlfVUNTNCAqKWFkZHI7Ci0gICAgUHlPYmplY3QgKnVuaW9iajsKIAotICAgIHVuaW9iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgaWYgKHVuaW9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbGwgY2hhcmFjdGVyIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSIpOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlsbCBjaGFyYWN0ZXIgbXVzdCBiZSBhIHVuaWNvZGUgY2hhcmFjdGVyLCAiCisgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgodW5pb2JqKSAhPSAxKSB7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaikgIT0gMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBmaWxsIGNoYXJhY3RlciBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3RlciBsb25nIik7Ci0gICAgICAgIFB5X0RFQ1JFRih1bmlvYmopOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgKmZpbGxjaGFybG9jID0gUHlVbmljb2RlX1JFQURfQ0hBUih1bmlvYmosIDApOwotICAgIFB5X0RFQ1JFRih1bmlvYmopOworICAgICpmaWxsY2hhcmxvYyA9IFB5VW5pY29kZV9SRUFEX0NIQVIob2JqLCAwKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTA5MDUsNTkgKzExMTI3LDQ5IEBACiB9CiAKIGludAotUHlVbmljb2RlX0NvbnRhaW5zKFB5T2JqZWN0ICpjb250YWluZXIsIFB5T2JqZWN0ICplbGVtZW50KQorX1B5VW5pY29kZV9FUShQeU9iamVjdCAqYWEsIFB5T2JqZWN0ICpiYikKIHsKLSAgICBQeU9iamVjdCAqc3RyLCAqc3ViOworICAgIHJldHVybiB1bmljb2RlX2VxKGFhLCBiYik7Cit9CisKK2ludAorUHlVbmljb2RlX0NvbnRhaW5zKFB5T2JqZWN0ICpzdHIsIFB5T2JqZWN0ICpzdWJzdHIpCit7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAgICAgaW50IHJlc3VsdDsKIAotICAgIC8qIENvZXJjZSB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgIHN1YiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGVsZW1lbnQpOwotICAgIGlmICghc3ViKSB7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgbm90ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0ciktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3QoY29udGFpbmVyKTsKLSAgICBpZiAoIXN0cikgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cikgPT0gLTEpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cik7Ci0gICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWIpOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1YnN0cik7CisgICAgaWYgKGtpbmQxIDwga2luZDIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KICAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKTsKLSAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3ViKTsKLSAgICBpZiAobGVuMSA8IGxlbjIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJzdHIpOworICAgIGlmIChsZW4xIDwgbGVuMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHIpOwotICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWIpOworICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHIpOwogICAgIGlmIChsZW4yID09IDEpIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQyLCBidWYyLCAwKTsKICAgICAgICAgcmVzdWx0ID0gZmluZGNoYXIoKGNvbnN0IGNoYXIgKilidWYxLCBraW5kMSwgbGVuMSwgY2gsIDEpICE9IC0xOwotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewotICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3ViLCBraW5kMSk7Ci0gICAgICAgIGlmICghYnVmMikgewotICAgICAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1YnN0ciwga2luZDEpOworICAgICAgICBpZiAoIWJ1ZjIpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CkBAIC0xMDk3NSw5ICsxMTE4Nyw2IEBACiAgICAgICAgIGFzc2VydCgwKTsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3ViKTsKLQogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIApAQCAtMTA5ODksNTYgKzExMTk4LDQwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfQ29uY2F0KFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiB7Ci0gICAgUHlPYmplY3QgKnUgPSBOVUxMLCAqdiA9IE5VTEwsICp3OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlfVUNTNCBtYXhjaGFyLCBtYXhjaGFyMjsKLSAgICBQeV9zc2l6ZV90IHVfbGVuLCB2X2xlbiwgbmV3X2xlbjsKKyAgICBQeV9zc2l6ZV90IGxlZnRfbGVuLCByaWdodF9sZW4sIG5ld19sZW47CiAKLSAgICAvKiBDb2VyY2UgdGhlIHR3byBhcmd1bWVudHMgKi8KLSAgICB1ID0gUHlVbmljb2RlX0Zyb21PYmplY3QobGVmdCk7Ci0gICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOwotICAgIHYgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChyaWdodCk7Ci0gICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGlmIChlbnN1cmVfdW5pY29kZShsZWZ0KSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUocmlnaHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBTaG9ydGN1dHMgKi8KLSAgICBpZiAodiA9PSB1bmljb2RlX2VtcHR5KSB7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIHU7Ci0gICAgfQotICAgIGlmICh1ID09IHVuaWNvZGVfZW1wdHkpIHsKLSAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICByZXR1cm4gdjsKLSAgICB9CisgICAgaWYgKGxlZnQgPT0gdW5pY29kZV9lbXB0eSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KHJpZ2h0KTsKKyAgICBpZiAocmlnaHQgPT0gdW5pY29kZV9lbXB0eSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KGxlZnQpOwogCi0gICAgdV9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1KTsKLSAgICB2X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHYpOwotICAgIGlmICh1X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gdl9sZW4pIHsKKyAgICBsZWZ0X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGxlZnQpOworICAgIHJpZ2h0X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJpZ2h0KTsKKyAgICBpZiAobGVmdF9sZW4gPiBQWV9TU0laRV9UX01BWCAtIHJpZ2h0X2xlbikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG5ld19sZW4gPSB1X2xlbiArIHZfbGVuOworICAgIG5ld19sZW4gPSBsZWZ0X2xlbiArIHJpZ2h0X2xlbjsKIAotICAgIG1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUodSk7Ci0gICAgbWF4Y2hhcjIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUodik7CisgICAgbWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRShsZWZ0KTsKKyAgICBtYXhjaGFyMiA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRShyaWdodCk7CiAgICAgbWF4Y2hhciA9IFB5X01BWChtYXhjaGFyLCBtYXhjaGFyMik7CiAKICAgICAvKiBDb25jYXQgdGhlIHR3byBVbmljb2RlIHN0cmluZ3MgKi8KLSAgICB3ID0gUHlVbmljb2RlX05ldyhuZXdfbGVuLCBtYXhjaGFyKTsKLSAgICBpZiAodyA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnModywgMCwgdSwgMCwgdV9sZW4pOwotICAgIF9QeVVuaWNvZGVfRmFzdENvcHlDaGFyYWN0ZXJzKHcsIHVfbGVuLCB2LCAwLCB2X2xlbik7Ci0gICAgUHlfREVDUkVGKHUpOwotICAgIFB5X0RFQ1JFRih2KTsKLSAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHcsIDEpKTsKLSAgICByZXR1cm4gdzsKLQotICBvbkVycm9yOgotICAgIFB5X1hERUNSRUYodSk7Ci0gICAgUHlfWERFQ1JFRih2KTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVVuaWNvZGVfTmV3KG5ld19sZW4sIG1heGNoYXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnMocmVzdWx0LCAwLCBsZWZ0LCAwLCBsZWZ0X2xlbik7CisgICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnMocmVzdWx0LCBsZWZ0X2xlbiwgcmlnaHQsIDAsIHJpZ2h0X2xlbik7CisgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeShyZXN1bHQsIDEpKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkCkBAIC0xMTEyOSw2ICsxMTMyMiwyNSBAQAogICAgIFB5X1hERUNSRUYocmlnaHQpOwogfQogCisvKgorV3JhcHMgc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKSBhbmQgYWRkaXRpb25hbGx5IGVuc3VyZXMgdGhhdCB0aGUKK2ZpcnN0IGFyZ3VtZW50IGlzIGEgdW5pY29kZSBvYmplY3QuCisqLworCitQeV9MT0NBTF9JTkxJTkUoaW50KQorcGFyc2VfYXJnc19maW5kc191bmljb2RlKGNvbnN0IGNoYXIgKiBmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1YnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqZW5kKQoreworICAgIGlmKHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKGZ1bmN0aW9uX25hbWUsIGFyZ3MsIHN1YnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkgeworICAgICAgICBpZiAoZW5zdXJlX3VuaWNvZGUoKnN1YnN0cmluZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogUHlEb2NfU1RSVkFSKGNvdW50X19kb2NfXywKICAgICAgICAgICAgICAiUy5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKIFxuXApAQCAtMTExNDcsMzEgKzExMzU5LDI2IEBACiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yLCBpcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJjb3VudCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImNvdW50IiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHNlbGYpOwogICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3Vic3RyaW5nKTsKLSAgICBpZiAoa2luZDEgPCBraW5kMikgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoa2luZDEgPCBraW5kMikKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKLSAgICB9CisKICAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc2VsZik7CiAgICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1YnN0cmluZyk7CiAgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuMSk7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDApOwotICAgIH0KKwogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzZWxmKTsKICAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3Vic3RyaW5nKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKICAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1YnN0cmluZywga2luZDEpOwotICAgICAgICBpZiAoIWJ1ZjIpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgICAgICBpZiAoIWJ1ZjIpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQogICAgIH0KICAgICBzd2l0Y2ggKGtpbmQxKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKQEAgLTExMjAxLDggKzExNDA4LDYgQEAKICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTExMzM2LDIyICsxMTU0MSwxMyBAQAogICAgIFB5X3NzaXplX3QgZW5kID0gMDsKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKIAotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiZmluZCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImZpbmQiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoMSwgc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kKTsKLQotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgMSk7CiAKICAgICBpZiAocmVzdWx0ID09IC0yKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNDI0LDIyICsxMTYyMCwxMyBAQAogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gMDsKIAotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJpbmRleCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgxLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE5NTMsNyArMTIxNDAsNyBAQAogI2RlZmluZSBCT1RIU1RSSVAgMgogCiAvKiBBcnJheXMgaW5kZXhlZCBieSBhYm92ZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnN0cmlwZm9ybWF0W10gPSB7InxPOmxzdHJpcCIsICJ8Tzpyc3RyaXAiLCAifE86c3RyaXAifTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RyaXBmb3JtYXRbXSA9IHsifE86bHN0cmlwIiwgInxPOnJzdHJpcCIsICJ8TzpzdHJpcCJ9OwogCiAjZGVmaW5lIFNUUklQTkFNRShpKSAoc3RyaXBmb3JtYXRbaV0rMykKIApAQCAtMTIyNDgsNDAgKzEyNDM1LDE1IEBACiB9CiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9SZXBsYWNlKFB5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vib2JqLAotICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcGxvYmosCitQeVVuaWNvZGVfUmVwbGFjZShQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXBsc3RyLAogICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLSAgICBQeU9iamVjdCAqc2VsZjsKLSAgICBQeU9iamVjdCAqc3RyMTsKLSAgICBQeU9iamVjdCAqc3RyMjsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDAgfHwKKyAgICAgICAgICAgIGVuc3VyZV91bmljb2RlKHJlcGxzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN0cjEgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzdHIyID0gUHlVbmljb2RlX0Zyb21PYmplY3QocmVwbG9iaik7Ci0gICAgaWYgKHN0cjIgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEgfHwKLSAgICAgICAgUHlVbmljb2RlX1JFQURZKHN0cjEpID09IC0xIHx8Ci0gICAgICAgIFB5VW5pY29kZV9SRUFEWShzdHIyKSA9PSAtMSkKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IHJlcGxhY2Uoc2VsZiwgc3RyMSwgc3RyMiwgbWF4Y291bnQpOwotICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgUHlfREVDUkVGKHN0cjIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlcGxhY2Uoc3RyLCBzdWJzdHIsIHJlcGxzdHIsIG1heGNvdW50KTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlcGxhY2VfX2RvY19fLApAQCAtMTIyOTcsMjggKzEyNDU5LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cjE7CiAgICAgUHlPYmplY3QgKnN0cjI7CiAgICAgUHlfc3NpemVfdCBtYXhjb3VudCA9IC0xOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfG46cmVwbGFjZSIsICZzdHIxLCAmc3RyMiwgJm1heGNvdW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVVfG46cmVwbGFjZSIsICZzdHIxLCAmc3RyMiwgJm1heGNvdW50KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cjEpOwotICAgIGlmIChzdHIxID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cjIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIyKTsKLSAgICBpZiAoc3RyMiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyMSkgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cjIpID09IC0xKQotICAgICAgICByZXN1bHQgPSBOVUxMOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7Ci0KLSAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgUHlfREVDUkVGKHN0cjIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlcGxhY2Uoc2VsZiwgc3RyMSwgc3RyMiwgbWF4Y291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTI1MDMsMjIgKzEyNjQ5LDEzIEBACiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyZmluZCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoInJmaW5kIiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKC0xLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7CiAKICAgICBpZiAocmVzdWx0ID09IC0yKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyNTQwLDIyICsxMjY3NywxMyBAQAogICAgIFB5X3NzaXplX3QgZW5kID0gMDsKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKIAotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgicmluZGV4IiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgicmluZGV4IiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKC0xLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7CiAKICAgICBpZiAocmVzdWx0ID09IC0yKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyNTk1LDI0ICsxMjcyMywxMCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX1NwbGl0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzID0gUHlVbmljb2RlX0Zyb21PYmplY3Qocyk7Ci0gICAgaWYgKHMgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUocykgPCAwIHx8IChzZXAgIT0gTlVMTCAmJiBlbnN1cmVfdW5pY29kZShzZXApIDwgMCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXAgIT0gTlVMTCkgewotICAgICAgICBzZXAgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXApOwotICAgICAgICBpZiAoc2VwID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7Ci0KLSAgICBQeV9ERUNSRUYocyk7Ci0gICAgUHlfWERFQ1JFRihzZXApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwogfQogCiBQeURvY19TVFJWQVIoc3BsaXRfX2RvY19fLApAQCAtMTI2MzcsMzUgKzEyNzUxLDI2IEBACiAKICAgICBpZiAoc3Vic3RyaW5nID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiBzcGxpdChzZWxmLCBOVUxMLCBtYXhjb3VudCk7Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCiAgICAgICAgIHJldHVybiBzcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfU3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIgb3IgTm9uZSwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9QYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9pbiwgUHlPYmplY3QgKnNlcF9pbikKK1B5VW5pY29kZV9QYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9vYmosIFB5T2JqZWN0ICpzZXBfb2JqKQogewotICAgIFB5T2JqZWN0KiBzdHJfb2JqOwotICAgIFB5T2JqZWN0KiBzZXBfb2JqOwogICAgIFB5T2JqZWN0KiBvdXQ7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAKLSAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyX2luKTsKLSAgICBpZiAoIXN0cl9vYmopCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cl9vYmopIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzZXBfb2JqKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHNlcF9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXBfaW4pOwotICAgIGlmICghc2VwX29iaikgewotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlcF9vYmopID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHJfb2JqKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKICAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHNlcF9vYmopOwpAQCAtMTI2NzksOCArMTI3ODQsNiBAQAogICAgICAgICAgICAgb3V0ID0gUHlUdXBsZV9QYWNrKDMsIHN0cl9vYmosIHVuaWNvZGVfZW1wdHksIHVuaWNvZGVfZW1wdHkpOwogICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGVfZW1wdHkpOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7CkBAIC0xMjY4OCw3ICsxMjc5MSw3IEBACiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7CiAgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzZXBfb2JqLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEyNzA5LDM5ICsxMjgxMiwyMyBAQAogICAgICAgICBvdXQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIG91dDsKLSAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQotICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9SUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfaW4sIFB5T2JqZWN0ICpzZXBfaW4pCitQeVVuaWNvZGVfUlBhcnRpdGlvbihQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHNlcF9vYmo7CiAgICAgUHlPYmplY3QqIG91dDsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJfaW4pOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyX29iaikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHNlcF9vYmopIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc2VwX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcF9pbik7Ci0gICAgaWYgKCFzZXBfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKICAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHNlcF9vYmopOwpAQCAtMTI3NTUsOCArMTI4NDIsNiBAQAogICAgICAgICAgICAgb3V0ID0gUHlUdXBsZV9QYWNrKDMsIHVuaWNvZGVfZW1wdHksIHVuaWNvZGVfZW1wdHksIHN0cl9vYmopOwogICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGVfZW1wdHkpOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7CkBAIC0xMjc2NCw3ICsxMjg0OSw3IEBACiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7CiAgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzZXBfb2JqLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEyNzg1LDE4ICsxMjg3MCwxMCBAQAogICAgICAgICBvdXQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIG91dDsKLSAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQotICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocGFydGl0aW9uX19kb2NfXywKQEAgLTEyODI4LDI0ICsxMjkwNSwxMCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX1JTcGxpdChQeU9iamVjdCAqcywgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgcyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHMpOwotICAgIGlmIChzID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHMpIDwgMCB8fCAoc2VwICE9IE5VTEwgJiYgZW5zdXJlX3VuaWNvZGUoc2VwKSA8IDApKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2VwICE9IE5VTEwpIHsKLSAgICAgICAgc2VwID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwKTsKLSAgICAgICAgaWYgKHNlcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHJlc3VsdCA9IHJzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKLQotICAgIFB5X0RFQ1JFRihzKTsKLSAgICBQeV9YREVDUkVGKHNlcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcnNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwogfQogCiBQeURvY19TVFJWQVIocnNwbGl0X19kb2NfXywKQEAgLTEyODcwLDEwICsxMjkzMywxNCBAQAogCiAgICAgaWYgKHN1YnN0cmluZyA9PSBQeV9Ob25lKQogICAgICAgICByZXR1cm4gcnNwbGl0KHNlbGYsIE5VTEwsIG1heGNvdW50KTsKLSAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKICAgICAgICAgcmV0dXJuIHJzcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfUlNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOworCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyIG9yIE5vbmUsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoc3BsaXRsaW5lc19fZG9jX18sCkBAIC0xMzE1NCwxMSArMTMyMjEsMTUgQEAKICAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CiAgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSkpOwotICAgICAgICAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQorICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBmb3Igc3RhcnRzd2l0aCBtdXN0IG9ubHkgY29udGFpbiBzdHIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkgewpAQCAtMTMxNjgsMTUgKzEzMjM5LDEzIEBACiAgICAgICAgIC8qIG5vdGhpbmcgbWF0Y2hlZCAqLwogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQotICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RhcnRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3RhcnRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJS4xMDBzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7CiAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwpAQCAtMTMyMDYsMTIgKzEzMjc1LDE1IEBACiAgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewogICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3QoCi0gICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpKTsKLSAgICAgICAgICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHVwbGUgZm9yIGVuZHN3aXRoIG11c3Qgb25seSBjb250YWluIHN0ciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CkBAIC0xMzIyMCwxNSArMTMyOTIsMTMgQEAKICAgICAgICAgfQogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQotICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZW5kc3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCisgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgKzEpOwotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CkBAIC0xMzIzNyw0NCArMTMzMDcsNTAgQEAKIFB5X0xPQ0FMX0lOTElORSh2b2lkKQogX1B5VW5pY29kZVdyaXRlcl9VcGRhdGUoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQogewotICAgIGlmICghd3JpdGVyLT5yZWFkb25seSkKKyAgICB3cml0ZXItPm1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUod3JpdGVyLT5idWZmZXIpOworICAgIHdyaXRlci0+ZGF0YSA9IFB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKTsKKworICAgIGlmICghd3JpdGVyLT5yZWFkb25seSkgeworICAgICAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfS0lORCh3cml0ZXItPmJ1ZmZlcik7CiAgICAgICAgIHdyaXRlci0+c2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHdyaXRlci0+YnVmZmVyKTsKKyAgICB9CiAgICAgZWxzZSB7CisgICAgICAgIC8qIHVzZSBhIHZhbHVlIHNtYWxsZXIgdGhhbiBQeVVuaWNvZGVfMUJZVEVfS0lORCgpIHNvCisgICAgICAgICAgIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKSB3aWxsIGNvcHkgdGhlIGJ1ZmZlci4gKi8KKyAgICAgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX1dDSEFSX0tJTkQ7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPD0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworCiAgICAgICAgIC8qIENvcHktb24td3JpdGUgbW9kZTogc2V0IGJ1ZmZlciBzaXplIHRvIDAgc28KICAgICAgICAgICogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlKCkgd2lsbCBjb3B5IChhbmQgZW5sYXJnZSkgdGhlIGJ1ZmZlciBvbgogICAgICAgICAgKiBuZXh0IHdyaXRlLiAqLwogICAgICAgICB3cml0ZXItPnNpemUgPSAwOwogICAgIH0KLSAgICB3cml0ZXItPm1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUod3JpdGVyLT5idWZmZXIpOwotICAgIHdyaXRlci0+ZGF0YSA9IFB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKTsKLSAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfS0lORCh3cml0ZXItPmJ1ZmZlcik7CiB9CiAKIHZvaWQKIF9QeVVuaWNvZGVXcml0ZXJfSW5pdChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIpCiB7CiAgICAgbWVtc2V0KHdyaXRlciwgMCwgc2l6ZW9mKCp3cml0ZXIpKTsKLSNpZmRlZiBQeV9ERUJVRwotICAgIHdyaXRlci0+a2luZCA9IDU7ICAgIC8qIGludmFsaWQga2luZCAqLwotI2VuZGlmCisKKyAgICAvKiBBU0NJSSBpcyB0aGUgYmFyZSBtaW5pbXVtICovCiAgICAgd3JpdGVyLT5taW5fY2hhciA9IDEyNzsKKworICAgIC8qIHVzZSBhIHZhbHVlIHNtYWxsZXIgdGhhbiBQeVVuaWNvZGVfMUJZVEVfS0lORCgpIHNvCisgICAgICAgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgpIHdpbGwgY29weSB0aGUgYnVmZmVyLiAqLworICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9XQ0hBUl9LSU5EOworICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPD0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOwogfQogCiBpbnQKIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9VQ1M0IG1heGNoYXIpCiB7Ci0jaWZkZWYgTVNfV0lORE9XUwotICAgLyogT24gV2luZG93cywgb3ZlcmFsbG9jYXRlIGJ5IDUwJSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KLSMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDIKLSNlbHNlCi0gICAvKiBPbiBMaW51eCwgb3ZlcmFsbG9jYXRlIGJ5IDI1JSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KLSMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDQKLSNlbmRpZgogICAgIFB5X3NzaXplX3QgbmV3bGVuOwogICAgIFB5T2JqZWN0ICpuZXdidWZmZXI7CiAKLSAgICBhc3NlcnQobGVuZ3RoID4gMCk7CisgICAgLyogZW5zdXJlIHRoYXQgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSBtYWNybyB3YXMgdXNlZCAqLworICAgIGFzc2VydCgobWF4Y2hhciA+IHdyaXRlci0+bWF4Y2hhciAmJiBsZW5ndGggPj0gMCkKKyAgICAgICAgICAgfHwgbGVuZ3RoID4gMCk7CiAKICAgICBpZiAobGVuZ3RoID4gUFlfU1NJWkVfVF9NQVggLSB3cml0ZXItPnBvcykgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMTMzNDAsNiArMTM0MTYsMjggQEAKICN1bmRlZiBPVkVSQUxMT0NBVEVfRkFDVE9SCiB9CiAKK2ludAorX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQpCit7CisgICAgUHlfVUNTNCBtYXhjaGFyOworCisgICAgLyogZW5zdXJlIHRoYXQgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQgbWFjcm8gd2FzIHVzZWQgKi8KKyAgICBhc3NlcnQod3JpdGVyLT5raW5kIDwga2luZCk7CisKKyAgICBzd2l0Y2ggKGtpbmQpCisgICAgeworICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IG1heGNoYXIgPSAweGZmOyBicmVhazsKKyAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBtYXhjaGFyID0gMHhmZmZmOyBicmVhazsKKyAgICBjYXNlIFB5VW5pY29kZV80QllURV9LSU5EOiBtYXhjaGFyID0gMHgxMGZmZmY7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwICYmICJpbnZhbGlkIGtpbmQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbCh3cml0ZXIsIDAsIG1heGNoYXIpOworfQorCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLCBQeV9VQ1M0IGNoKQogewpAQCAtMTM1MTAsMTcgKzEzNjA4LDI2IEBACiAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpID09IHdyaXRlci0+cG9zKTsKICAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKHdyaXRlci0+YnVmZmVyKSAhPSB3cml0ZXItPnBvcykgewotICAgICAgICBQeU9iamVjdCAqbmV3YnVmZmVyOwotICAgICAgICBuZXdidWZmZXIgPSByZXNpemVfY29tcGFjdCh3cml0ZXItPmJ1ZmZlciwgd3JpdGVyLT5wb3MpOwotICAgICAgICBpZiAobmV3YnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci0+YnVmZmVyID0gbmV3YnVmZmVyOworICAgIGlmICh3cml0ZXItPnBvcyA9PSAwKSB7CisgICAgICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKKworICAgICAgICAvKiBHZXQgdGhlIGVtcHR5IFVuaWNvZGUgc3RyaW5nIHNpbmdsZXRvbiAoJycpICovCisgICAgICAgIF9QeV9JTkNSRUZfVU5JQ09ERV9FTVBUWSgpOworICAgICAgICBzdHIgID0gdW5pY29kZV9lbXB0eTsKICAgICB9Ci0gICAgc3RyID0gd3JpdGVyLT5idWZmZXI7Ci0gICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzdHIgPSB3cml0ZXItPmJ1ZmZlcjsKKyAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworCisgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICE9IHdyaXRlci0+cG9zKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RyMjsKKyAgICAgICAgICAgIHN0cjIgPSByZXNpemVfY29tcGFjdChzdHIsIHdyaXRlci0+cG9zKTsKKyAgICAgICAgICAgIGlmIChzdHIyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzdHIgPSBzdHIyOworICAgICAgICB9CisgICAgfQorCiAgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeShzdHIsIDEpKTsKICAgICByZXR1cm4gdW5pY29kZV9yZXN1bHRfcmVhZHkoc3RyKTsKIH0KQEAgLTE0NjYxLDEzICsxNDc2OCwxMCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBjdHguZm10c3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3QoZm9ybWF0KTsKLSAgICBpZiAoY3R4LmZtdHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShmb3JtYXQpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShjdHguZm10c3RyKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoY3R4LmZtdHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKworICAgIGN0eC5mbXRzdHIgPSBmb3JtYXQ7CiAgICAgY3R4LmZtdGRhdGEgPSBQeVVuaWNvZGVfREFUQShjdHguZm10c3RyKTsKICAgICBjdHguZm10a2luZCA9IFB5VW5pY29kZV9LSU5EKGN0eC5mbXRzdHIpOwogICAgIGN0eC5mbXRjbnQgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChjdHguZm10c3RyKTsKQEAgLTE0NzI3LDExICsxNDgzMSw5IEBACiAgICAgaWYgKGN0eC5hcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjdHguYXJncyk7CiAgICAgfQotICAgIFB5X0RFQ1JFRihjdHguZm10c3RyKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJmN0eC53cml0ZXIpOwogCiAgIG9uRXJyb3I6Ci0gICAgUHlfREVDUkVGKGN0eC5mbXRzdHIpOwogICAgIF9QeVVuaWNvZGVXcml0ZXJfRGVhbGxvYygmY3R4LndyaXRlcik7CiAgICAgaWYgKGN0eC5hcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjdHguYXJncyk7CkBAIC0xNTAwOSwyNiArMTUxMTEsMTggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiBJdCBtaWdodCBiZSB0aGF0IHRoZSBHZXRJdGVtIGNhbGwgZmFpbHMgZXZlbgotICAgICAgIHRob3VnaCB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGRpY3Rpb25hcnksCi0gICAgICAgbmFtZWx5IHdoZW4gdGhpcyBoYXBwZW5zIGR1cmluZyBhIHN0YWNrIG92ZXJmbG93LiAqLwogICAgIFB5X0FMTE9XX1JFQ1VSU0lPTgotICAgIHQgPSBQeURpY3RfR2V0SXRlbShpbnRlcm5lZCwgcyk7CisgICAgdCA9IFB5RGljdF9TZXREZWZhdWx0KGludGVybmVkLCBzLCBzKTsKICAgICBQeV9FTkRfQUxMT1dfUkVDVVJTSU9OCi0KLSAgICBpZiAodCkgeworICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodCAhPSBzKSB7CiAgICAgICAgIFB5X0lOQ1JFRih0KTsKICAgICAgICAgUHlfU0VUUkVGKCpwLCB0KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIFB5VGhyZWFkU3RhdGVfR0VUKCktPnJlY3Vyc2lvbl9jcml0aWNhbCA9IDE7Ci0gICAgaWYgKFB5RGljdF9TZXRJdGVtKGludGVybmVkLCBzLCBzKSA8IDApIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2NyaXRpY2FsID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fY3JpdGljYWwgPSAwOwogICAgIC8qIFRoZSB0d28gcmVmZXJlbmNlcyBpbiBpbnRlcm5lZCBhcmUgbm90IGNvdW50ZWQgYnkgcmVmY250LgogICAgICAgIFRoZSBkZWFsbG9jYXRvciB3aWxsIHRha2UgY2FyZSBvZiB0aGlzICovCiAgICAgUHlfUkVGQ05UKHMpIC09IDI7CmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IDdlNmYzNjQuLmFiNmIyMzUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogc3RhdGljIGludAotcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAorcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipvYnAsIFB5T2JqZWN0ICoqY2FsbGJhY2twKQogewogICAgIHJldHVybiBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCBmdW5jbmFtZSwgMSwgMiwgb2JwLCBjYWxsYmFja3ApOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAgICAgbWV0aG9kKFB5T2JqZWN0ICpwcm94eSkgeyBcCiAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihzcGVjaWFsKTsgXAogICAgICAgICAgICAgVU5XUkFQKHByb3h5KTsgXAotICAgICAgICAgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHByb3h5LCAmUHlJZF8jI3NwZWNpYWwsICIiKTsgXAorICAgICAgICAgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHByb3h5LCAmUHlJZF8jI3NwZWNpYWwsIE5VTEwpOyBcCiAgICAgICAgIH0KIAogCmRpZmYgLS1naXQgYS9QQy9fbXNpLmMgYi9QQy9fbXNpLmMKaW5kZXggODZhNTk0My4uYjY2YjE4YiAxMDA2NDQKLS0tIGEvUEMvX21zaS5jCisrKyBiL1BDL19tc2kuYwpAQCAtMTAzMiwxMiArMTAzMiwxMiBAQAogICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEVESVJFQ1QiLCAoaW50KU1TSURCT1BFTl9DUkVBVEVESVJFQ1QpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0RJUkVDVCIsIChpbnQpTVNJREJPUEVOX0RJUkVDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9SRUFET05MWSIsIChpbnQpTVNJREJPUEVOX1JFQURPTkxZKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGludClNU0lEQk9QRU5fVFJBTlNBQ1QpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUEFUQ0hGSUxFIiwgKGludClNU0lEQk9QRU5fUEFUQ0hGSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURURJUkVDVCIsIChsb25nKU1TSURCT1BFTl9DUkVBVEVESVJFQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGxvbmcpTVNJREJPUEVOX0NSRUFURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9ESVJFQ1QiLCAobG9uZylNU0lEQk9QRU5fRElSRUNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1JFQURPTkxZIiwgKGxvbmcpTVNJREJPUEVOX1JFQURPTkxZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGxvbmcpTVNJREJPUEVOX1RSQU5TQUNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1BBVENIRklMRSIsIChsb25nKU1TSURCT1BFTl9QQVRDSEZJTEUpOwogCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTVNJQ09MSU5GT19OQU1FUyk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTVNJQ09MSU5GT19UWVBFUyk7CmRpZmYgLS1naXQgYS9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCmluZGV4IGNiMDM3ZmYuLmUwMWRiYTYgMTAwNjQ0Ci0tLSBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCisrKyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCkBAIC03MTgsNyArNzE4LDcgQEAKICAqIDEgaWYgdGhlIFB5dGhvbi1kbGwgZG9lcyBub3QgZXhwb3J0IHRoZSBmdW5jdGlvbnMgd2UgbmVlZAogICogMiBpZiBubyBpbnN0YWxsLXNjcmlwdCBpcyBzcGVjaWZpZWQgaW4gcGF0aG5hbWUKICAqIDMgaWYgdGhlIGluc3RhbGwtc2NyaXB0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZAotICogdGhlIHJldHVybiB2YWx1ZSBvZiBQeVJ1bl9TaW1wbGVTdHJpbmcoKSBvdGhlcndpc2UsCisgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIFB5UnVuX1NpbXBsZVN0cmluZygpIG9yIFB5X0ZpbmFsaXplRXgoKSBvdGhlcndpc2UsCiAgKiB3aGljaCBpcyAwIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIC0xIGlmIGFuIGV4Y2VwdGlvbiBoYWQgb2NjdXJyZWQKICAqIGluIHRoZSBpbnN0YWxsLXNjcmlwdC4KICAqLwpAQCAtNzMxLDcgKzczMSw3IEBACiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5U3lzX1NldEFyZ3YsIChpbnQsIHdjaGFyX3QgKiopKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwotICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlfRmluYWxpemVFeCwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsCiAgICAgICAgICAgICAgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKQEAgLTczOSw3ICs3MzksNyBAQAogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOwogCiAgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeVN5c19TZXRBcmd2Ci0gICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplKQorICAgICAgICB8fCAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeV9GaW5hbGl6ZUV4KQogICAgICAgICByZXR1cm4gMTsKIAogICAgIGlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQpAQCAtNzg2LDcgKzc4Niw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CiAKICAgICBjbG9zZShmaCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTg0OCwxMSArODUwLDExIEBACiAgICAgaW50IHJjOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsICh3Y2hhcl90ICopKTsKLSAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5X0ZpbmFsaXplRXgsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeUVycl9QcmludCwgKHZvaWQpKTsKIAotICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplIHx8CisgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemVFeCB8fAogICAgICAgICAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeUVycl9QcmludCkKICAgICAgICAgcmV0dXJuIC0xOwogCkBAIC04NjIsNyArODY0LDkgQEAKICAgICByYyA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOwogICAgIGlmIChyYykKICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJjID0gLTE7CisgICAgfQogICAgIHJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvY2xpbmljL21zdmNydG1vZHVsZS5jLmggYi9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaAppbmRleCBlN2E3MmM0Li5hNWI0Y2NmIDEwMDY0NAotLS0gYS9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaAorKysgYi9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaApAQCAtNTEsOCArNTEsOSBAQAogICAgIGxvbmcgbmJ5dGVzOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWw6bG9ja2luZyIsCi0gICAgICAgICZmZCwgJm1vZGUsICZuYnl0ZXMpKQorICAgICAgICAmZmQsICZtb2RlLCAmbmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9sb2NraW5nX2ltcGwobW9kdWxlLCBmZCwgbW9kZSwgbmJ5dGVzKTsKIAogZXhpdDoKQEAgLTg1LDExICs4NiwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2V0bW9kZSIsCi0gICAgICAgICZmZCwgJmZsYWdzKSkKKyAgICAgICAgJmZkLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9zZXRtb2RlX2ltcGwobW9kdWxlLCBmZCwgZmxhZ3MpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMjEsMTEgKzEyNCwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIl9QeV9QQVJTRV9JTlRQVFIiaTpvcGVuX29zZmhhbmRsZSIsCi0gICAgICAgICZoYW5kbGUsICZmbGFncykpCisgICAgICAgICZoYW5kbGUsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X29wZW5fb3NmaGFuZGxlX2ltcGwobW9kdWxlLCBoYW5kbGUsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTUzLDExICsxNTgsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgUHlfaW50cHRyX3QgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfb3NmaGFuZGxlIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Z2V0X29zZmhhbmRsZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X2dldF9vc2ZoYW5kbGVfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xODMsOCArMTkwLDkgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X2tiaGl0X2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzExLDggKzMxOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY2hhciBjaGFyX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJjOnB1dGNoIiwgJmNoYXJfdmFsdWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzpwdXRjaCIsICZjaGFyX3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9wdXRjaF9pbXBsKG1vZHVsZSwgY2hhcl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMzcsOCArMzQ2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgdW5pY29kZV9jaGFyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOnB1dHdjaCIsICZ1bmljb2RlX2NoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpwdXR3Y2giLCAmdW5pY29kZV9jaGFyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9wdXR3Y2hfaW1wbChtb2R1bGUsIHVuaWNvZGVfY2hhcik7CiAKIGV4aXQ6CkBAIC0zNjcsOCArMzc3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjaGFyIGNoYXJfdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6dW5nZXRjaCIsICZjaGFyX3ZhbHVlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6dW5nZXRjaCIsICZjaGFyX3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF91bmdldGNoX2ltcGwobW9kdWxlLCBjaGFyX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM5Myw4ICs0MDQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB1bmljb2RlX2NoYXI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6dW5nZXR3Y2giLCAmdW5pY29kZV9jaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6dW5nZXR3Y2giLCAmdW5pY29kZV9jaGFyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF91bmdldHdjaF9pbXBsKG1vZHVsZSwgdW5pY29kZV9jaGFyKTsKIAogZXhpdDoKQEAgLTQyNiwxMSArNDM4LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpDcnRTZXRSZXBvcnRGaWxlIiwKLSAgICAgICAgJnR5cGUsICZmaWxlKSkKKyAgICAgICAgJnR5cGUsICZmaWxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfQ3J0U2V0UmVwb3J0RmlsZV9pbXBsKG1vZHVsZSwgdHlwZSwgZmlsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2NCwxMSArNDc4LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpDcnRTZXRSZXBvcnRNb2RlIiwKLSAgICAgICAgJnR5cGUsICZtb2RlKSkKKyAgICAgICAgJnR5cGUsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfQ3J0U2V0UmVwb3J0TW9kZV9pbXBsKG1vZHVsZSwgdHlwZSwgbW9kZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUwMCwxMSArNTE2LDEzIEBACiAgICAgaW50IG1vZGU7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnNldF9lcnJvcl9tb2RlIiwgJm1vZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRfZXJyb3JfbW9kZSIsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfc2V0X2Vycm9yX21vZGVfaW1wbChtb2R1bGUsIG1vZGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MzEsOCArNTQ5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICB1bnNpZ25lZCBpbnQgbW9kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiSTpTZXRFcnJvck1vZGUiLCAmbW9kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOlNldEVycm9yTW9kZSIsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9TZXRFcnJvck1vZGVfaW1wbChtb2R1bGUsIG1vZGUpOwogCiBleGl0OgpAQCAtNTUwLDQgKzU2OSw0IEBACiAjaWZuZGVmIE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYKICAgICAjZGVmaW5lIE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChNU1ZDUlRfU0VUX0VSUk9SX01PREVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJhNzk0YzUyMGQ2YWU4ODcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVjZTgxMDZjMDU5MmZmMWYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUEMvY2xpbmljL3dpbnJlZy5jLmggYi9QQy9jbGluaWMvd2lucmVnLmMuaAppbmRleCBmNmFlMmMwLi5lNzgzNmU0IDEwMDY0NAotLS0gYS9QQy9jbGluaWMvd2lucmVnLmMuaAorKysgYi9QQy9jbGluaWMvd2lucmVnLmMuaApAQCAtODcsMTQgKzg3LDE2IEBACiB3aW5yZWdfSEtFWVR5cGVfX19leGl0X18oUHlIS0VZT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImV4Y190eXBlIiwgImV4Y192YWx1ZSIsICJ0cmFjZWJhY2siLCBOVUxMfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJleGNfdHlwZSIsICJleGNfdmFsdWUiLCAidHJhY2ViYWNrIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT09POl9fZXhpdF9fIiwgX2tleXdvcmRzLCAwfTsKICAgICBQeU9iamVjdCAqZXhjX3R5cGU7CiAgICAgUHlPYmplY3QgKmV4Y192YWx1ZTsKICAgICBQeU9iamVjdCAqdHJhY2ViYWNrOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT09POl9fZXhpdF9fIiwgX2tleXdvcmRzLAotICAgICAgICAmZXhjX3R5cGUsICZleGNfdmFsdWUsICZ0cmFjZWJhY2spKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgJmV4Y190eXBlLCAmZXhjX3ZhbHVlLCAmdHJhY2ViYWNrKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19IS0VZVHlwZV9fX2V4aXRfX19pbXBsKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk7CiAKIGV4aXQ6CkBAIC0xNDcsMTEgKzE0OSwxMyBAQAogICAgIEhLRVkgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiWk8mOkNvbm5lY3RSZWdpc3RyeSIsCi0gICAgICAgICZjb21wdXRlcl9uYW1lLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgICAgICAmY29tcHV0ZXJfbmFtZSwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfQ29ubmVjdFJlZ2lzdHJ5X2ltcGwobW9kdWxlLCBjb21wdXRlcl9uYW1lLCBrZXkpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE5MiwxMSArMTk2LDEzIEBACiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6Q3JlYXRlS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19DcmVhdGVLZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjM5LDE5ICsyNDUsMjIgQEAKIHdpbnJlZ19DcmVhdGVLZXlFeChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mWnxpaTpDcmVhdGVLZXlFeCIsIF9rZXl3b3JkcywgMH07CiAgICAgSEtFWSBrZXk7CiAgICAgUHlfVU5JQ09ERSAqc3ViX2tleTsKICAgICBpbnQgcmVzZXJ2ZWQgPSAwOwogICAgIFJFR1NBTSBhY2Nlc3MgPSBLRVlfV1JJVEU7CiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZafGlpOkNyZWF0ZUtleUV4IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfQ3JlYXRlS2V5RXhfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgcmVzZXJ2ZWQsIGFjY2Vzcyk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjkwLDggKzI5OSw5IEBACiAgICAgUHlfVU5JQ09ERSAqc3ViX2tleTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ1OkRlbGV0ZUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EZWxldGVLZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSk7CiAKIGV4aXQ6CkBAIC0zMzQsMTUgKzM0NCwxNyBAQAogd2lucmVnX0RlbGV0ZUtleUV4KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAiYWNjZXNzIiwgInJlc2VydmVkIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsia2V5IiwgInN1Yl9rZXkiLCAiYWNjZXNzIiwgInJlc2VydmVkIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiTyZ1fGlpOkRlbGV0ZUtleUV4IiwgX2tleXdvcmRzLCAwfTsKICAgICBIS0VZIGtleTsKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogICAgIFJFR1NBTSBhY2Nlc3MgPSBLRVlfV09XNjRfNjRLRVk7CiAgICAgaW50IHJlc2VydmVkID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mdXxpaTpEZWxldGVLZXlFeCIsIF9rZXl3b3JkcywKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmFjY2VzcywgJnJlc2VydmVkKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZhY2Nlc3MsICZyZXNlcnZlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGVsZXRlS2V5RXhfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgYWNjZXNzLCByZXNlcnZlZCk7CiAKIGV4aXQ6CkBAIC0zNzQsOCArMzg2LDkgQEAKICAgICBQeV9VTklDT0RFICp2YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOkRlbGV0ZVZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmdmFsdWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGVsZXRlVmFsdWVfaW1wbChtb2R1bGUsIGtleSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDExLDggKzQyNCw5IEBACiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6RW51bUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmluZGV4KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0VudW1LZXlfaW1wbChtb2R1bGUsIGtleSwgaW5kZXgpOwogCiBleGl0OgpAQCAtNDU3LDggKzQ3MSw5IEBACiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6RW51bVZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRW51bVZhbHVlX2ltcGwobW9kdWxlLCBrZXksIGluZGV4KTsKIAogZXhpdDoKQEAgLTQ4Myw4ICs0OTgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X1VOSUNPREUgKnN0cmluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidTpFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCAmc3RyaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInU6RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgpAQCAtNTIyLDggKzUzOCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkZsdXNoS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkZsdXNoS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19GbHVzaEtleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKQEAgLTU3NCw4ICs1OTEsOSBAQAogICAgIFB5X1VOSUNPREUgKmZpbGVfbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ1dTpMb2FkS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmZpbGVfbmFtZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZmaWxlX25hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0xvYWRLZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgZmlsZV9uYW1lKTsKIAogZXhpdDoKQEAgLTYxMiwxOSArNjMwLDIyIEBACiB3aW5yZWdfT3BlbktleShQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mWnxpaTpPcGVuS2V5IiwgX2tleXdvcmRzLCAwfTsKICAgICBIS0VZIGtleTsKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogICAgIGludCByZXNlcnZlZCA9IDA7CiAgICAgUkVHU0FNIGFjY2VzcyA9IEtFWV9SRUFEOwogICAgIEhLRVkgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mWnxpaTpPcGVuS2V5IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKQorICAgIGlmICghX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoYXJncywga3dhcmdzLCAmX3BhcnNlciwKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfT3BlbktleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC02NjEsMTkgKzY4MiwyMiBAQAogd2lucmVnX09wZW5LZXlFeChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKLSAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7ImtleSIsICJzdWJfa2V5IiwgInJlc2VydmVkIiwgImFjY2VzcyIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7Ik8mWnxpaTpPcGVuS2V5RXgiLCBfa2V5d29yZHMsIDB9OwogICAgIEhLRVkga2V5OwogICAgIFB5X1VOSUNPREUgKnN1Yl9rZXk7CiAgICAgaW50IHJlc2VydmVkID0gMDsKICAgICBSRUdTQU0gYWNjZXNzID0gS0VZX1JFQUQ7CiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZafGlpOk9wZW5LZXlFeCIsIF9rZXl3b3JkcywKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX09wZW5LZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC03MDcsOCArNzMxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlJbmZvS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlF1ZXJ5SW5mb0tleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlJbmZvS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtNzQ5LDggKzc3NCw5IEBACiAgICAgUHlfVU5JQ09ERSAqc3ViX2tleTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOlF1ZXJ5VmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5KTsKIAogZXhpdDoKQEAgLTc4Nyw4ICs4MTMsOSBAQAogICAgIFB5X1VOSUNPREUgKm5hbWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWjpRdWVyeVZhbHVlRXgiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZuYW1lKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlWYWx1ZUV4X2ltcGwobW9kdWxlLCBrZXksIG5hbWUpOwogCiBleGl0OgpAQCAtODMwLDggKzg1Nyw5IEBACiAgICAgUHlfVU5JQ09ERSAqZmlsZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnU6U2F2ZUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmZpbGVfbmFtZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmZpbGVfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfU2F2ZUtleV9pbXBsKG1vZHVsZSwga2V5LCBmaWxlX25hbWUpOwogCiBleGl0OgpAQCAtODgzLDggKzkxMSw5IEBACiAgICAgUHlfc3NpemVfY2xlYW5fdCB2YWx1ZV9sZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWmt1IzpTZXRWYWx1ZSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZ0eXBlLCAmdmFsdWUsICZ2YWx1ZV9sZW5ndGgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmdHlwZSwgJnZhbHVlLCAmdmFsdWVfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19TZXRWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCB0eXBlLCB2YWx1ZSwgdmFsdWVfbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTkwNyw3ICs5MzYsNyBAQAogIiAgICBBbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhLCBvbmUgb2Y6XG4iCiAiICAgIFJFR19CSU5BUlkgLS0gQmluYXJ5IGRhdGEgaW4gYW55IGZvcm0uXG4iCiAiICAgIFJFR19EV09SRCAtLSBBIDMyLWJpdCBudW1iZXIuXG4iCi0iICAgIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC5cbiIKKyIgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIFJFR19EV09SRFxuIgogIiAgICBSRUdfRFdPUkRfQklHX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuXG4iCiAiICAgIFJFR19FWFBBTkRfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgY29udGFpbnMgdW5leHBhbmRlZFxuIgogIiAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIChmb3IgZXhhbXBsZSxcbiIKQEAgLTkxNyw2ICs5NDYsOCBAQAogIiAgICAgICAgICAgICAgICAgICAgYnkgdHdvIG51bGwgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBQeXRob24gaGFuZGxlc1xuIgogIiAgICAgICAgICAgICAgICAgICAgdGhpcyB0ZXJtaW5hdGlvbiBhdXRvbWF0aWNhbGx5LlxuIgogIiAgICBSRUdfTk9ORSAtLSBObyBkZWZpbmVkIHZhbHVlIHR5cGUuXG4iCisiICAgIFJFR19RV09SRCAtLSBBIDY0LWJpdCBudW1iZXIuXG4iCisiICAgIFJFR19RV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgNjQtYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byBSRUdfUVdPUkQuXG4iCiAiICAgIFJFR19SRVNPVVJDRV9MSVNUIC0tIEEgZGV2aWNlLWRyaXZlciByZXNvdXJjZSBsaXN0LlxuIgogIiAgICBSRUdfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLlxuIgogIiAgdmFsdWVcbiIKQEAgLTk1MCw4ICs5ODEsOSBAQAogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaT2tPOlNldFZhbHVlRXgiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZV9uYW1lLCAmcmVzZXJ2ZWQsICZ0eXBlLCAmdmFsdWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZV9uYW1lLCAmcmVzZXJ2ZWQsICZ0eXBlLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1NldFZhbHVlRXhfaW1wbChtb2R1bGUsIGtleSwgdmFsdWVfbmFtZSwgcmVzZXJ2ZWQsIHR5cGUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTk4NSw4ICsxMDE3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0Rpc2FibGVSZWZsZWN0aW9uS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtMTAxOCw4ICsxMDUxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RW5hYmxlUmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpFbmFibGVSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FbmFibGVSZWZsZWN0aW9uS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtMTA0OSwxMSArMTA4MywxMiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhLRVkga2V5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpRdWVyeVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19RdWVyeVJlZmxlY3Rpb25LZXlfaW1wbChtb2R1bGUsIGtleSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03Yjg5NDBhMjNmNjA1ZGRjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01YjUzZDE5Y2JlM2YzN2NkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1BDL2NsaW5pYy93aW5zb3VuZC5jLmggYi9QQy9jbGluaWMvd2luc291bmQuYy5oCmluZGV4IGIwMGI0NDIuLjc2NjQ3OWEgMTAwNjQ0Ci0tLSBhL1BDL2NsaW5pYy93aW5zb3VuZC5jLmgKKysrIGIvUEMvY2xpbmljL3dpbnNvdW5kLmMuaApAQCAtMyw3ICszLDcgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogUHlEb2NfU1RSVkFSKHdpbnNvdW5kX1BsYXlTb3VuZF9fZG9jX18sCi0iUGxheVNvdW5kKCRtb2R1bGUsIHNvdW5kLCBmbGFncywgLylcbiIKKyJQbGF5U291bmQoJG1vZHVsZSwgLywgc291bmQsIGZsYWdzKVxuIgogIi0tXG4iCiAiXG4iCiAiQSB3cmFwcGVyIGFyb3VuZCB0aGUgV2luZG93cyBQbGF5U291bmQgQVBJLlxuIgpAQCAtMTQsMjEgKzE0LDI0IEBACiAiICAgIEZsYWcgdmFsdWVzLCBvcmVkIHRvZ2V0aGVyLiAgU2VlIG1vZHVsZSBkb2N1bWVudGF0aW9uLiIpOwogCiAjZGVmaW5lIFdJTlNPVU5EX1BMQVlTT1VORF9NRVRIT0RERUYgICAgXAotICAgIHsiUGxheVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKXdpbnNvdW5kX1BsYXlTb3VuZCwgTUVUSF9WQVJBUkdTLCB3aW5zb3VuZF9QbGF5U291bmRfX2RvY19ffSwKKyAgICB7IlBsYXlTb3VuZCIsIChQeUNGdW5jdGlvbil3aW5zb3VuZF9QbGF5U291bmQsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCB3aW5zb3VuZF9QbGF5U291bmRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX1BsYXlTb3VuZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X1VOSUNPREUgKnNvdW5kLCBpbnQgZmxhZ3MpOword2luc291bmRfUGxheVNvdW5kX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnNvdW5kLCBpbnQgZmxhZ3MpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotd2luc291bmRfUGxheVNvdW5kKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQord2luc291bmRfUGxheVNvdW5kKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIFB5X1VOSUNPREUgKnNvdW5kOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7InNvdW5kIiwgImZsYWdzIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT2k6UGxheVNvdW5kIiwgX2tleXdvcmRzLCAwfTsKKyAgICBQeU9iamVjdCAqc291bmQ7CiAgICAgaW50IGZsYWdzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJaaTpQbGF5U291bmQiLAotICAgICAgICAmc291bmQsICZmbGFncykpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmc291bmQsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9QbGF5U291bmRfaW1wbChtb2R1bGUsIHNvdW5kLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC0zNiw3ICszOSw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUih3aW5zb3VuZF9CZWVwX19kb2NfXywKLSJCZWVwKCRtb2R1bGUsIGZyZXF1ZW5jeSwgZHVyYXRpb24sIC8pXG4iCisiQmVlcCgkbW9kdWxlLCAvLCBmcmVxdWVuY3ksIGR1cmF0aW9uKVxuIgogIi0tXG4iCiAiXG4iCiAiQSB3cmFwcGVyIGFyb3VuZCB0aGUgV2luZG93cyBCZWVwIEFQSS5cbiIKQEAgLTQ4LDIxICs1MSwyNCBAQAogIiAgICBIb3cgbG9uZyB0aGUgc291bmQgc2hvdWxkIHBsYXksIGluIG1pbGxpc2Vjb25kcy4iKTsKIAogI2RlZmluZSBXSU5TT1VORF9CRUVQX01FVEhPRERFRiAgICBcCi0gICAgeyJCZWVwIiwgKFB5Q0Z1bmN0aW9uKXdpbnNvdW5kX0JlZXAsIE1FVEhfVkFSQVJHUywgd2luc291bmRfQmVlcF9fZG9jX199LAorICAgIHsiQmVlcCIsIChQeUNGdW5jdGlvbil3aW5zb3VuZF9CZWVwLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgd2luc291bmRfQmVlcF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luc291bmRfQmVlcF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBmcmVxdWVuY3ksIGludCBkdXJhdGlvbik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi13aW5zb3VuZF9CZWVwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQord2luc291bmRfQmVlcChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9rZXl3b3Jkc1tdID0geyJmcmVxdWVuY3kiLCAiZHVyYXRpb24iLCBOVUxMfTsKKyAgICBzdGF0aWMgX1B5QXJnX1BhcnNlciBfcGFyc2VyID0geyJpaTpCZWVwIiwgX2tleXdvcmRzLCAwfTsKICAgICBpbnQgZnJlcXVlbmN5OwogICAgIGludCBkdXJhdGlvbjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6QmVlcCIsCi0gICAgICAgICZmcmVxdWVuY3ksICZkdXJhdGlvbikpCisgICAgaWYgKCFfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChhcmdzLCBrd2FyZ3MsICZfcGFyc2VyLAorICAgICAgICAmZnJlcXVlbmN5LCAmZHVyYXRpb24pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2luc291bmRfQmVlcF9pbXBsKG1vZHVsZSwgZnJlcXVlbmN5LCBkdXJhdGlvbik7CiAKIGV4aXQ6CkBAIC03MCw3ICs3Niw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUih3aW5zb3VuZF9NZXNzYWdlQmVlcF9fZG9jX18sCi0iTWVzc2FnZUJlZXAoJG1vZHVsZSwgeD1NQl9PSywgLylcbiIKKyJNZXNzYWdlQmVlcCgkbW9kdWxlLCAvLCB0eXBlPU1CX09LKVxuIgogIi0tXG4iCiAiXG4iCiAiQ2FsbCBXaW5kb3dzIE1lc3NhZ2VCZWVwKHgpLlxuIgpAQCAtNzgsMjMgKzg0LDI2IEBACiAieCBkZWZhdWx0cyB0byBNQl9PSy4iKTsKIAogI2RlZmluZSBXSU5TT1VORF9NRVNTQUdFQkVFUF9NRVRIT0RERUYgICAgXAotICAgIHsiTWVzc2FnZUJlZXAiLCAoUHlDRnVuY3Rpb24pd2luc291bmRfTWVzc2FnZUJlZXAsIE1FVEhfVkFSQVJHUywgd2luc291bmRfTWVzc2FnZUJlZXBfX2RvY19ffSwKKyAgICB7Ik1lc3NhZ2VCZWVwIiwgKFB5Q0Z1bmN0aW9uKXdpbnNvdW5kX01lc3NhZ2VCZWVwLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgd2luc291bmRfTWVzc2FnZUJlZXBfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX01lc3NhZ2VCZWVwX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IHgpOword2luc291bmRfTWVzc2FnZUJlZXBfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi13aW5zb3VuZF9NZXNzYWdlQmVlcChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3dpbnNvdW5kX01lc3NhZ2VCZWVwKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIGludCB4ID0gTUJfT0s7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsidHlwZSIsIE5VTEx9OworICAgIHN0YXRpYyBfUHlBcmdfUGFyc2VyIF9wYXJzZXIgPSB7InxpOk1lc3NhZ2VCZWVwIiwgX2tleXdvcmRzLCAwfTsKKyAgICBpbnQgdHlwZSA9IE1CX09LOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpNZXNzYWdlQmVlcCIsCi0gICAgICAgICZ4KSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZ0eXBlKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gd2luc291bmRfTWVzc2FnZUJlZXBfaW1wbChtb2R1bGUsIHgpOworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKG1vZHVsZSwgdHlwZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jMGIyOTBkYWYyMzMwZGM5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MGIzZDNlZjJmYWVmYjE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1BDL2NvbmZpZy5jIGIvUEMvY29uZmlnLmMKaW5kZXggNjZiZjQ1OC4uZTAwN2Q0YiAxMDA2NDQKLS0tIGEvUEMvY29uZmlnLmMKKysrIGIvUEMvY29uZmlnLmMKQEAgLTIzLDYgKzIzLDcgQEAKIGV4dGVybiBQeU9iamVjdCogUHlJbml0X19zaGExKHZvaWQpOwogZXh0ZXJuIFB5T2JqZWN0KiBQeUluaXRfX3NoYTI1Nih2b2lkKTsKIGV4dGVybiBQeU9iamVjdCogUHlJbml0X19zaGE1MTIodm9pZCk7CitleHRlcm4gUHlPYmplY3QqIFB5SW5pdF9fYmxha2UyKHZvaWQpOwogZXh0ZXJuIFB5T2JqZWN0KiBQeUluaXRfdGltZSh2b2lkKTsKIGV4dGVybiBQeU9iamVjdCogUHlJbml0X190aHJlYWQodm9pZCk7CiAjaWZkZWYgV0lOMzIKQEAgLTk2LDYgKzk3LDcgQEAKICAgICB7Il9zaGExIiwgUHlJbml0X19zaGExfSwKICAgICB7Il9zaGEyNTYiLCBQeUluaXRfX3NoYTI1Nn0sCiAgICAgeyJfc2hhNTEyIiwgUHlJbml0X19zaGE1MTJ9LAorICAgIHsiX2JsYWtlMiIsIFB5SW5pdF9fYmxha2UyfSwKICAgICB7InRpbWUiLCBQeUluaXRfdGltZX0sCiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICB7Il90aHJlYWQiLCBQeUluaXRfX3RocmVhZH0sCmRpZmYgLS1naXQgYS9QQy9nZXRwYXRocC5jIGIvUEMvZ2V0cGF0aHAuYwppbmRleCBjN2RkZjFlLi5jYjlmMWRiIDEwMDY0NAotLS0gYS9QQy9nZXRwYXRocC5jCisrKyBiL1BDL2dldHBhdGhwLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogc3RhdGljIGludAogaXNtb2R1bGUod2NoYXJfdCAqZmlsZW5hbWUsIGludCB1cGRhdGVfZmlsZW5hbWUpIC8qIElzIG1vZHVsZSAtLSBjaGVjayBmb3IgLnB5Yy8ucHlvIHRvbyAqLwogewotICAgIGludCBuOworICAgIHNpemVfdCBuOwogCiAgICAgaWYgKGV4aXN0cyhmaWxlbmFtZSkpCiAgICAgICAgIHJldHVybiAxOwpAQCAtNTUzLDcgKzU1Myw3IEBACiAgICAgICAgICAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgcHl0aG9uaG9tZSA9IGFyZ3YwX3BhdGg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLyogTG9vayBmb3IgYSAnaG9tZScgdmFyaWFibGUgYW5kIHNldCBhcmd2MF9wYXRoIHRvIGl0LCBpZiBmb3VuZCAqLwogICAgICAgICAgICAgaWYgKGZpbmRfZW52X2NvbmZpZ192YWx1ZShlbnZfZmlsZSwgTCJob21lIiwgdG1wYnVmZmVyKSkgewogICAgICAgICAgICAgICAgIHdjc2NweV9zKGFyZ3YwX3BhdGgsIE1BWFBBVEhMRU4rMSwgdG1wYnVmZmVyKTsKZGlmZiAtLWdpdCBhL1BDL2ljb25zL2xhdW5jaGVyLmljbnMgYi9QQy9pY29ucy9sYXVuY2hlci5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTkxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9sYXVuY2hlci5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL2xhdW5jaGVyLmljbyBiL1BDL2ljb25zL2xhdW5jaGVyLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUzYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvbGF1bmNoZXIuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL2xhdW5jaGVyLnN2ZyBiL1BDL2ljb25zL2xhdW5jaGVyLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkwYjBkCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvbGF1bmNoZXIuc3ZnCkBAIC0wLDAgKzEgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uaWNvbi12cy1vdXR7ZmlsbDojZjZmNmY2fS5pY29uLXdoaXRle2ZpbGw6I2ZmZn0uaWNvbi12c28tYmd7ZmlsbDojNjU2NTY1fS5pY29uLXZpc3VhbHN0dWRpby1vbmxpbmV7ZmlsbDojMDA3YWNjfS5ncmFwaC1saWdodGdyZXl7ZmlsbDojZGZkZmRmfS5zdDB7ZmlsbDojMDA3OGQ3fS5zdDF7ZmlsbDojZmZmfS5zdDJ7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qze2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTMwIDVINVYzaDI1djJ6Ii8+PHBhdGggY2xhc3M9Imljb24tdnNvLWJnIiBkPSJNMjkuOTcyIDI2Ljk3Mkg1LjAyOVY1aC45NDJ2MjEuMDI4aDIzLjA1N1Y1aC45NDN2MjEuOTcyeiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzLW91dCIgZD0iTTI5IDV2MjFINlY1aDIzeiIvPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMjkuMTQxIDRsLjQyOS40MjktLjE0LjE0Mi0uNDMtLjQzLS40My40My0uMTQtLjE0Mi40MjktLjQyOS0uNDI5LS40MjkuMTQxLS4xNDIuNDI5LjQzLjQzLS40My4xNDEuMTQyLS40My40Mjl6TTI3LjYgMy40aC0xLjJ2MS4yaDEuMlYzLjR6bS0xIC4yaC44di44aC0uOHYtLjh6bS0xLjEzOS44aC0xdi4yaDF2LS4yeiIvPjxwYXRoIGNsYXNzPSJncmFwaC1saWdodGdyZXkiIGQ9Ik02IDVoMjN2Mkg2eiIvPjwvZz48ZyBpZD0iaWNvbkZnIj48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNC41IDIzdjYiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTEuNDI5IDEzLjAxOWExOS44OCAxOS44OCAwIDAgMCAuMDcxLTEuNjQ1YzAtNC4yMjMtMS4zMjktOC4xNjUtMy41NTYtMTAuNTQ1TDcuMTcgMEg1LjgzbC0uNzc0LjgyOUMyLjgyOSAzLjIwOSAxLjUgNy4xNTEgMS41IDExLjM3NGMwIC40NTMuMDIzLjkuMDUzIDEuMzQ1Qy44ODcgMTMuNDcyLjM1NyAxNC40MzggMCAxNS41MzN2Ni42MDNMLjIyOSAyM0gzdjdoMnYyaDN2LTFoMnYtOGgyLjc3MmwuMzk0LTEuNDg4Yy4yMjItLjg0Mi4zMzUtMS43MTQuMzM1LTIuNTkyLS4wMDEtMi40MTktLjgwMy00LjUzNC0yLjA3Mi01LjkwMXoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNi41IDIydjlNOC41IDIzdjciLz48cGF0aCBjbGFzcz0iaWNvbi12aXN1YWxzdHVkaW8tb25saW5lIiBkPSJNNSAyOUg0di02aDF2NnptMi02SDZ2OGgxdi04em0yIDBIOHY3aDF2LTd6Ii8+PHBhdGggY2xhc3M9Imljb24tdnNvLWJnIiBkPSJNMTAuMzgxIDEzLjM4Yy4wNy0uNjU4LjExOS0xLjMyNS4xMTktMi4wMDYgMC0zLjk3NS0xLjIyOS03LjY2Mi0zLjI4Ni05Ljg2Mkw2LjUuNzQ4bC0uNzE0Ljc2M0MzLjcyOSAzLjcxMiAyLjUgNy4zOTkgMi41IDExLjM3NGMwIC42ODEuMDQ5IDEuMzQ4LjExOSAyLjAwNkMxLjMzOSAxNC41MjEuNSAxNi41NTIuNSAxOC45MmMwIC43OTMuMTAyIDEuNTc4LjMwMiAyLjMzNkwuOTk5IDIyaDEuOTY2bC4wNzItLjkyMmMuMDgxLTEuMDQ2LjQ3MS0xLjk2Ni45OTMtMi41MDMuNDg3IDEuMDE5IDEuMDcgMS45MjkgMS43NTYgMi42NjJMNi41IDIybC43MTQtLjc2M2MuNjg2LS43MzMgMS4yNjktMS42NDMgMS43NTYtMi42NjIuNTIyLjUzNy45MTIgMS40NTcuOTkzIDIuNTAzbC4wNzIuOTIyaDEuOTY2bC4xOTctLjc0NGMuMi0uNzU4LjMwMi0xLjU0My4zMDItMi4zMzYgMC0yLjM2OC0uODM5LTQuMzk5LTIuMTE5LTUuNTR6Ii8+PHBhdGggY2xhc3M9Imljb24tdnMtb3V0IiBkPSJNMy42MTkgMTcuNjE1Yy0uODU0LjY3Mi0xLjQ2NCAxLjkxMy0xLjU3OSAzLjM4NWgtLjI3MmE4LjE4NCA4LjE4NCAwIDAgMS0uMjY4LTIuMDhjMC0xLjcyMi41MDUtMy4yNTkgMS4yOTctNC4yNzIuMTg3IDEuMDUuNDY1IDIuMDQ1LjgyMiAyLjk2N3ptNi41ODUtMi45NjdhMTYuMTQ1IDE2LjE0NSAwIDAgMS0uODIyIDIuOTY3Yy44NTQuNjcxIDEuNDY0IDEuOTEzIDEuNTc5IDMuMzg1aC4yNzJhOC4xODQgOC4xODQgMCAwIDAgLjI2OC0yLjA4Yy0uMDAxLTEuNzIyLS41MDYtMy4yNTktMS4yOTctNC4yNzJ6TTMuNSAxMS4zNzRjMCAzLjgzNyAxLjE5OCA3LjIgMyA5LjEyOCAxLjgwMi0xLjkyNyAzLTUuMjkxIDMtOS4xMjhzLTEuMTk4LTcuMi0zLTkuMTI4Yy0xLjgwMiAxLjkyOC0zIDUuMjkxLTMgOS4xMjh6Ii8+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTcuNSA3YTEgMSAwIDEgMS0yIDAgMSAxIDAgMCAxIDIgMHoiLz48L2c+PGcgaWQ9ImNvbG9ySW1wb3J0YW5jZSI+PHBhdGggY2xhc3M9Imljb24td2hpdGUiIGQ9Ik0zMS41OTYgMjMuOTYxYy0uMzUgMS4wNTMtMS4wMDEgMy4wMTUtMy4yNDcgMy4wMTVoLTEuM3YxLjMzN2MwIC45MDUtLjM5MiAyLjUzNy0zLjAyMSAzLjI5OGE5LjIxMyA5LjIxMyAwIDAgMS0yLjU5LjM5Yy0uODMgMC0xLjY2OC0uMTI4LTIuNTY0LS4zOTItMS45MTgtLjU2My0zLjAxNy0xLjc2NS0zLjAxNy0zLjI5NnYtMS4zMzdoLTEuMTU1Yy0xLjY5OCAwLTIuOTQzLTEuMTI5LTMuNDE2LTMuMDk4LS40NjktMS45NDYtLjQ2OS0zLjE5NSAwLTUuMTQxLjQ1MS0xLjg4MSAxLjk2LTMuMDk4IDMuODQ1LTMuMDk4aC43MjZ2LTEuMzM3YzAtMi4wMDUuOTA1LTIuOTgyIDMuMTI2LTMuMzc0LjcyOS0uMTMgMS41NDktLjIgMi4zNjctLjIwM2guMDA0Yy45MjUgMCAxLjc2MS4wNjcgMi41Ni4yMDEgMS44MTYuMzAzIDMuMTM0IDEuNzIzIDMuMTM0IDMuMzc2djEuMzM3aDEuM2MxLjE0MiAwIDIuNjM2LjUzNiAzLjI3IDMuMDkyLjUxNiAyLjA3My41MSAzLjYzNy0uMDIyIDUuMjN6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk0OF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MjIuMjA1IiB5MT0iLTI4OC42NjgiIHgyPSI1NDAuOTAyIiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF83XyIgY2xhc3M9InN0MiIgZD0iTTIxLjM1NCAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwNyAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OSAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg2IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODYtLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4xMyIgeTE9Ii0zMTQuNDg5IiB4Mj0iNTQxLjQ1NCIgeTI9Ii0zMDUuMDQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkNDNiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZlODczIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NTBfN18iIGNsYXNzPSJzdDMiIGQ9Ik0yNi42MjMgMTYuNjR2Mi4wNDJjMCAxLjU4My0xLjM0MiAyLjkxNS0yLjg3MyAyLjkxNWgtNC41OTNjLTEuMjU4IDAtMi4yOTkgMS4wNzctMi4yOTkgMi4zMzd2NC4zNzljMCAxLjI0NiAxLjA4NCAxLjk3OSAyLjI5OSAyLjMzNyAxLjQ1Ni40MjggMi44NTEuNTA1IDQuNTkzIDAgMS4xNTgtLjMzNSAyLjI5OS0xLjAxIDIuMjk5LTIuMzM3VjI2LjU2aC00LjU5M3YtLjU4NEgyOC4zNDhjMS4zMzYgMCAxLjgzNC0uOTMyIDIuMjk5LTIuMzMxLjQ4LTEuNDQuNDYtMi44MjYgMC00LjY3My0uMzMtMS4zMy0uOTYxLTIuMzMxLTIuMjk5LTIuMzMxaC0xLjcyNXptLTIuNTg0IDExLjA4OWMuNDc3IDAgLjg2My4zOTEuODYzLjg3NGEuODcxLjg3MSAwIDAgMS0uODYzLjg3OS44NzIuODcyIDAgMCAxLS44NjMtLjg3OS44Ny44NyAwIDAgMSAuODYzLS44NzR6Ii8+PC9nPjwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5LmljbnMgYi9QQy9pY29ucy9weS5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weS5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5LmljbyBiL1BDL2ljb25zL3B5LmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhhNzliCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHkuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5LnN2ZyBiL1BDL2ljb25zL3B5LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI0ZTgzCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHkuc3ZnCkBAIC0wLDAgKzEgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uaWNvbi12cy1vdXR7ZmlsbDojZjZmNmY2fS5pY29uLXZzby1iZ3tmaWxsOiM2NTY1NjV9Lmljb24tdnNvLWxpZ2h0Z3JleXtmaWxsOiNiZmJmYmZ9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5zdDB7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qxe2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9Imljb24tdnMtb3V0IiBkPSJNMjYgOC4wMDlWMjlIN1YzaDE0LjA1M0wyNiA4LjAwOXoiLz48cGF0aCBjbGFzcz0iaWNvbi12c28tYmciIGQ9Ik0yMS40NzEgMkg2djI4aDIxVjcuNTk5TDIxLjQ3MSAyek0yMSAzaC4wNTNsNC45MzkgNUgyMVYzem01IDI2SDdWM2gxM3Y2aDZ2MjB6Ii8+PC9nPjxwYXRoIGNsYXNzPSJpY29uLXZzby1saWdodGdyZXkiIGQ9Ik0xNyA3SDlWNmg4djF6bTAgMkg5djFoOFY5em03IDNIOXYxaDE1di0xem0wIDNIOXYxaDE1di0xem0wIDNIOXYxaDE1di0xem0wIDNIOXYxaDE1di0xem0wIDNIOXYxaDE1di0xeiIgaWQ9Imljb25GZyIvPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMzEuNjYgMjQuMDYzQzMxLjMxMiAyNS4xMTYgMzAuNjYxIDI3IDI4LjQxMyAyN0gyN3YxLjMxM2MwIC45MDUtLjMzNSAyLjUzNy0yLjk2NSAzLjI5OC0uOTA0LjI2MS0xLjY5NC4zODktMi41MzEuMzg5LS44MyAwLTEuNjMtLjEyOC0yLjUyNi0uMzkyQzE3LjA2MSAzMS4wNDUgMTYgMjkuODQ0IDE2IDI4LjMxM1YyN2gtMS4yMzJjLTEuNjk5IDAtMi45NDQtMS4xNDEtMy40MTYtMy4xMS0uNDY5LTEuOTQ2LS40NjktMy4wMjEgMC00Ljk2Ny40NTEtMS44ODEgMS45Ni0yLjkyMyAzLjg0NS0yLjkyM0gxNnYtMS42OTdjMC0yLjAwNS44NjYtMi44NDUgMy4wODctMy4yMzguNzI3LS4xMjggMS41MDYtLjA2NSAyLjMyNy0uMDY1aC4wMDNjLjkyMSAwIDEuNzAzLS4wNyAyLjUwNC4wNjQgMS44MTguMzAyIDMuMDc5IDEuNTg1IDMuMDc5IDMuMjM5VjE2aDEuNDEzYzEuMTQyIDAgMi42MzYuMzU2IDMuMjcgMi45MTIuNTE1IDIuMDcyLjUwOSAzLjU1OS0uMDIzIDUuMTUxeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NDhfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTIyLjMyIiB5MT0iLTI4OC42NjgiIHgyPSI1NDEuMDE3IiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF8yXyIgY2xhc3M9InN0MCIgZD0iTTIxLjQxOSAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwOCAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OCAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg3IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODctLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4yNDUiIHkxPSItMzE0LjQ4OSIgeDI9IjU0MS41NjkiIHkyPSItMzA1LjA0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZDQzYiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZTg3MyIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTUwXzJfIiBjbGFzcz0ic3QxIiBkPSJNMjYuNjg3IDE2LjY0djIuMDQyYzAgMS41ODMtMS4zNDIgMi45MTUtMi44NzMgMi45MTVoLTQuNTkzYy0xLjI1OCAwLTIuMjk5IDEuMDc3LTIuMjk5IDIuMzM3djQuMzc5YzAgMS4yNDYgMS4wODQgMS45NzkgMi4yOTkgMi4zMzcgMS40NTYuNDI4IDIuODUxLjUwNSA0LjU5MyAwIDEuMTU4LS4zMzUgMi4yOTktMS4wMSAyLjI5OS0yLjMzN1YyNi41NkgyMS41MnYtLjU4NEgyOC40MTJjMS4zMzYgMCAxLjgzNC0uOTMyIDIuMjk5LTIuMzMxLjQ4LTEuNDQuNDYtMi44MjYgMC00LjY3My0uMzMtMS4zMy0uOTYxLTIuMzMxLTIuMjk5LTIuMzMxaC0xLjcyNXptLTIuNTgzIDExLjA4OWMuNDc3IDAgLjg2My4zOTEuODYzLjg3NGEuODcxLjg3MSAwIDAgMS0uODYzLjg3OS44NzIuODcyIDAgMCAxLS44NjMtLjg3OWMwLS40ODQuMzg4LS44NzQuODYzLS44NzR6Ii8+PC9nPjwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5Yy5pY25zIGIvUEMvaWNvbnMvcHljLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYTlhMQotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5Yy5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5Yy5pY28gYi9QQy9pY29ucy9weWMuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGRlODEKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weWMuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5Yy5zdmcgYi9QQy9pY29ucy9weWMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjM2U5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weWMuc3ZnCkBAIC0wLDAgKzEgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uaWNvbi12c28tYmd7ZmlsbDojNjU2NTY1fS5pY29uLXZzLWJne2ZpbGw6IzQyNDI0Mn0uaWNvbi12cy1ncmVlbntmaWxsOiMzOTN9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5zdDB7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qxe2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9Imljb24tdnMtYmciIGQ9Ik0yMS4wNTMgM0g3djI2aDE5VjguMDA5eiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzby1iZyIgZD0iTTIxLjQ3MSAySDZ2MjhoMjFWNy41OTlMMjEuNDcxIDJ6TTIxIDNoLjA1M2w0LjkzOSA1SDIxVjN6bTUgMjZIN1YzaDEzdjZoNnYyMHoiLz48L2c+PHBhdGggY2xhc3M9Imljb24tdnMtZ3JlZW4iIGQ9Ik0xMCAxNkg5di0xaDF2MXptMS4wMTEgNUg5djFoMi4wMzJhOC4zNjggOC4zNjggMCAwIDEtLjAyMS0xek0xNCAxMGgyVjloLTJ2MXptLTMtNEg5djFoMlY2em0wIDZIOXYxaDJ2LTF6bTItM0g5djFoNFY5em00LTN2MWgxVjZoLTF6bS0zIDZoLTJ2MWgydi0xem0xLTZoLTJ2MWgyVjZ6bS00IDEwaDF2LTFoLTF2MXptNC00djFoMnYtMWgtMnptLTIgNGgzdi0xaC0zdjF6bS00IDJ2MWgzdi0xSDl6bTAgNnYxaDN2LTFIOXoiIGlkPSJpY29uRmciLz48ZyBpZD0iY29sb3JJbXBvcnRhbmNlIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTMxLjY2IDI0LjA2M0MzMS4zMTIgMjUuMTE2IDMwLjY2MSAyNyAyOC40MTMgMjdIMjd2MS4zMTNjMCAuOTA1LS4zMzUgMi41MzctMi45NjUgMy4yOTgtLjkwNC4yNjEtMS42OTQuMzg5LTIuNTMxLjM4OS0uODMgMC0xLjYzLS4xMjgtMi41MjYtLjM5MkMxNy4wNjEgMzEuMDQ1IDE2IDI5Ljg0NCAxNiAyOC4zMTNWMjdoLTEuMjMyYy0xLjY5OSAwLTIuOTQ0LTEuMTQxLTMuNDE2LTMuMTEtLjQ2OS0xLjk0Ni0uNDY5LTMuMDIxIDAtNC45NjcuNDUxLTEuODgxIDEuOTYtMi45MjMgMy44NDUtMi45MjNIMTZ2LTEuNjk3YzAtMi4wMDUuODY2LTIuODQ1IDMuMDg3LTMuMjM4LjcyNy0uMTI4IDEuNTA2LS4wNjUgMi4zMjctLjA2NWguMDAzYy45MjEgMCAxLjcwMy0uMDcgMi41MDQuMDY0IDEuODE4LjMwMiAzLjA3OSAxLjU4NSAzLjA3OSAzLjIzOVYxNmgxLjQxM2MxLjE0MiAwIDIuNjM2LjM1NiAzLjI3IDIuOTEyLjUxNSAyLjA3Mi41MDkgMy41NTgtLjAyMyA1LjE1MXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTQ4XzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMi4zMiIgeTE9Ii0yODguNjY4IiB4Mj0iNTQxLjAxNyIgeTI9Ii0zMDQuNzU0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjNWE5ZmQ0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzA2OTk4Ii8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NDhfNF8iIGNsYXNzPSJzdDAiIGQ9Ik0yMS40MTkgMTEuNzI1Yy0uNzg2LjAwNC0xLjUzNy4wNzEtMi4xOTcuMTg4LTEuOTQ2LjM0NC0yLjI5OSAxLjA2My0yLjI5OSAyLjM5djEuNzUzaDQuNTk4di41ODRoLTYuMzI0Yy0xLjMzNiAwLTIuNTA3LjgwMy0yLjg3MyAyLjMzMS0uNDIyIDEuNzUxLS40NDEgMi44NDQgMCA0LjY3My4zMjcgMS4zNjEgMS4xMDggMi4zMzEgMi40NDQgMi4zMzFoMS41ODF2LTIuMTAxYzAtMS41MTggMS4zMTMtMi44NTcgMi44NzMtMi44NTdoNC41OTNjMS4yNzggMCAyLjI5OS0xLjA1MyAyLjI5OS0yLjMzN3YtNC4zNzljMC0xLjI0Ni0xLjA1MS0yLjE4Mi0yLjI5OS0yLjM5LS43OS0uMTMtMS42MS0uMTg5LTIuMzk2LS4xODZ6bS0yLjQ4NyAxLjQxYy40NzUgMCAuODYzLjM5NC44NjMuODc5YS44Ny44NyAwIDAgMS0uODYzLjg3NC44NjguODY4IDAgMCAxLS44NjMtLjg3NGMwLS40ODUuMzg3LS44NzkuODYzLS44Nzl6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk1MF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1NDguMjQ1IiB5MT0iLTMxNC40ODkiIHgyPSI1NDEuNTY5IiB5Mj0iLTMwNS4wNDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmQ0M2IiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmU4NzMiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk1MF80XyIgY2xhc3M9InN0MSIgZD0iTTI2LjY4NyAxNi42NHYyLjA0MmMwIDEuNTgzLTEuMzQyIDIuOTE1LTIuODczIDIuOTE1aC00LjU5M2MtMS4yNTggMC0yLjI5OSAxLjA3Ny0yLjI5OSAyLjMzN3Y0LjM3OWMwIDEuMjQ2IDEuMDg0IDEuOTc5IDIuMjk5IDIuMzM3IDEuNDU2LjQyOCAyLjg1MS41MDUgNC41OTMgMCAxLjE1OC0uMzM1IDIuMjk5LTEuMDEgMi4yOTktMi4zMzdWMjYuNTZIMjEuNTJ2LS41ODRIMjguNDEyYzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4MyAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzljMC0uNDg0LjM4OC0uODc0Ljg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWQuaWNucyBiL1BDL2ljb25zL3B5ZC5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2QyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weWQuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWQuaWNvIGIvUEMvaWNvbnMvcHlkLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZjYjYwCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHlkLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weWQuc3ZnIGIvUEMvaWNvbnMvcHlkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2VmZjZhCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvcHlkLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24tdnNvLWJne2ZpbGw6IzY1NjU2NX0uaWNvbi12cy1vdXR7ZmlsbDojZjZmNmY2fS5pY29uLWYxMi1ob3Zlci1iZ3tmaWxsOiNkOWViZjd9Lmljb24tZjEyLWx0Z3JleS1kaXNhYmxlZHtmaWxsOiNhYmFiYWN9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5zdDB7ZmlsbDojOWNhMmE3fS5zdDF7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qye2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9Imljb24tdnMtb3V0IiBkPSJNMjEuMDUzIDNIN3YyNmgxOVY4LjAwOXoiLz48cGF0aCBjbGFzcz0iaWNvbi12c28tYmciIGQ9Ik0yMS40NzEgMkg2djI4aDIxVjcuNTk5TDIxLjQ3MSAyek0yMSAzaC4wNTNsNC45MzkgNUgyMVYzem01IDI2SDdWM2gxM3Y2aDZ2MjB6Ii8+PC9nPjxnIGlkPSJpY29uRmciPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMy43ODQgMTcuNzA1Yy0xLjI5NiAwLTIuMzUtMS4wNTQtMi4zNS0yLjM1czEuMDU0LTIuMzUgMi4zNS0yLjM1IDIuMzUgMS4wNTQgMi4zNSAyLjM1LTEuMDU0IDIuMzUtMi4zNSAyLjM1em0wLTQuNWMtMS4xODYgMC0yLjE1Ljk2NC0yLjE1IDIuMTVzLjk2NCAyLjE1MSAyLjE1IDIuMTUxIDIuMTUtLjk2NSAyLjE1LTIuMTUxLS45NjQtMi4xNS0yLjE1LTIuMTV6Ii8+PHBhdGggY2xhc3M9Imljb24tZjEyLWhvdmVyLWJnIiBkPSJNMTguMDUgMTYuMTIyYy4wMTYtLjA2OS4wMzEtLjEzOS4wNDMtLjIwOWwxLjM3Ni0uNjE4LS4xMDMtMS4wMTUtMS40Ny0uMzNjLS4wMjUtLjA2OC0uMDU2LS4xMzQtLjA4Ni0uMTk5bC0uMDI2LS4wNTYuODkyLTEuMjM2LS41OTUtLjgyNy0xLjQ1LjQ1M2MtLjA2OS0uMDYxLS4xNDEtLjExOC0uMjEzLS4xNzVsLjE1MS0xLjUxMS0uOTI5LS40MTgtMS4wMzIgMS4xMjEtLjA1Ni0uMDEzYTMuMDg5IDMuMDg5IDAgMCAwLS4yMTctLjA0NWwtLjYxOC0xLjM3NC0xLjAxNS4xMDQtLjMyOSAxLjQ3MmMtLjA0OS4wMTktLjA5Ni4wNC0uMTQzLjA2M2wtLjA1Ni4wMjUtMS4yMjUtLjkwNy0uODM1LjU4Ni40MzUgMS40NTdjLS4wNi4wNjctLjEyMy4xMzgtLjE4Mi4yMTJsLTEuNTA2LS4xNzItLjQyOS45MjVMOS41NCAxNC40OGwtLjAwNS4wMjRhNC4xMjcgNC4xMjcgMCAwIDAtLjA1MS4yNDZsLTEuMzg3LjYwNi4wOTIgMS4wMTUgMS40NjMuMzQ2Yy4wMjQuMDY3LjA1NS4xMzIuMDg0LjE5NGwuMDMuMDY3LS44NiAxLjE3LS4wNDIuMDU5LjU4OC44MzIgMS40NTYtLjQ0Yy4wNy4wNjMuMTM4LjEyMi4yMDkuMTc4bC0uMTY3IDEuNTA4LjkyNi40MjdMMTIuOTIgMTkuNmwuMDQ4LjAxYy4wNzQuMDE3LjE0OS4wMzQuMjI2LjA0NmwuNjA5IDEuMzg1IDEuMDE1LS4wOTUuMzQyLTEuNDY2Yy4wNzUtLjAyNy4xNDctLjA2MS4yMTYtLjA5M2wuMDY3LS4wMzEgMS4yMzUuODkyLjgyNy0uNTk1LS40NTItMS40NWMuMDYyLS4wNzEuMTItLjE0Mi4xNzYtLjIxNWwxLjUxMi4xNTEuNDE4LS45MjktMS4xMjItMS4wMzMuMDEzLS4wNTV6bS00LjI2NiAxLjU4M2MtMS4yOTYgMC0yLjM1LTEuMDU0LTIuMzUtMi4zNXMxLjA1NC0yLjM1IDIuMzUtMi4zNSAyLjM1IDEuMDU0IDIuMzUgMi4zNS0xLjA1NCAyLjM1LTIuMzUgMi4zNXoiLz48cGF0aCBjbGFzcz0iaWNvbi1mMTItbHRncmV5LWRpc2FibGVkIiBkPSJNMTMuODAzIDIxLjA0bC0uNjA5LTEuMzg0YTMuMDggMy4wOCAwIDAgMS0uMjM2LS4wNDhsLS4wMzgtLjAwOC0xLjA0MyAxLjExMS0uOTI1LS40MjcuMTY3LTEuNTA3YTQuMDEzIDQuMDEzIDAgMCAxLS4yMDktLjE3OWwtMS40NTYuNDM5LS41ODgtLjgzMi45MDItMS4yMjgtLjAzMy0uMDcyYy0uMDI4LS4wNjEtLjA1OC0uMTI0LS4wODItLjE5bC0xLjQ2My0uMzQ0LS4wOTEtMS4wMTUgMS4zODctLjYwNWMuMDEyLS4wNzguMDMtLjE1NC4wNDctLjIzMWwuMDA5LS4wMzktMS4xMDktMS4wNDUuNDI4LS45MjUgMS41MDcuMTdjLjA1OC0uMDcyLjExOC0uMTQuMTgzLS4yMTFsLS40MzUtMS40NTguODM0LS41ODUgMS4yMjUuOTA3LjA1Mi0uMDI0Yy4wNDgtLjAyMi4wOTctLjA0NC4xNDctLjA2M2wuMzI5LTEuNDczIDEuMDE0LS4xMDQuNjIgMS4zNzVhMi4zODkgMi4zODkgMCAwIDEgLjI3MS4wNThsMS4wMzItMS4xMjIuOTMuNDE4LS4xNTMgMS41MTFjLjA3My4wNTUuMTQzLjExMy4yMTQuMTc0bDEuNDUtLjQ1My41OTUuODI3LS44OTIgMS4yMzZhLjguOCAwIDAgMSAuMDI0LjA1M2MuMDMuMDY0LjA2Mi4xMzEuMDg3LjIwMWwxLjQ3MS4zMzIuMTAzIDEuMDE0LTEuMzc2LjYxOGMtLjAxMi4wNzEtLjAyNy4xNC0uMDQzLjIwOGwtLjAxNC4wNTggMS4xMjIgMS4wMzMtLjQxOS45MjktMS41MTEtLjE1MmEzLjg1MSAzLjg1MSAwIDAgMS0uMTc2LjIxNWwuNDUyIDEuNDUtLjgyNy41OTUtMS4yMzYtLjg5Mi0uMDcuMDMyYTIuOTQgMi45NCAwIDAgMS0uMjEyLjA5MmwtLjM0MSAxLjQ2NS0xLjAxNS4wOTV6bS0uOTUxLTEuNjZsLjE1MS4wMzNjLjA4OS4wMjEuMTc5LjA0Mi4yNzIuMDUzbC4wNTYuMDA3LjU5NyAxLjM1NC43MjgtLjA2Ny4zMzMtMS40MzUuMDU0LS4wMThjLjA4My0uMDI1LjE2MS0uMDYyLjI0NC0uMTAxLjA0Mi0uMDIuMDg0LS4wMzkuMTI3LS4wNTdsLjA1Mi0uMDIyIDEuMjExLjg3NC41OTMtLjQyNy0uNDQyLTEuNDIxLjAzOC0uMDQzYy4wODUtLjA5NC4xNjMtLjE4OC4yMzYtLjI4OGwuMDMzLS4wNDYgMS40OC4xNS4zLS42NjctMS4wOTktMS4wMTIuMDEyLS4wNTUuMDI1LS4xMTdjLjAxOS0uMDguMDM3LS4xNi4wNDctLjI0NGwuMDA3LS4wNTYgMS4zNDgtLjYwNS0uMDczLS43MjgtMS40NDEtLjMyNC0uMDE4LS4wNTVjLS4wMjUtLjA4MS0uMDYxLS4xNTctLjA5Ni0uMjMzYTIuMTQ1IDIuMTQ1IDAgMCAxLS4wNS0uMTA5bC0uMDIyLS4wNTIuODc0LTEuMjEyLS40MjctLjU5My0xLjQyLjQ0My0uMDQyLS4wMzhhMy44OTYgMy44OTYgMCAwIDAtLjI4OC0uMjM1TDE2LjIwNyAxMmwuMTQ5LTEuNDgtLjY2Ny0uMy0xLjAxMiAxLjEtLjA1Ni0uMDExYy0uMDQtLjAwOC0uMDgtLjAxOC0uMTE5LS4wMjctLjA4Mi0uMDE5LS4xNjItLjAzOC0uMjQ2LS4wNDhsLS4wNTYtLjAwNS0uNjA3LTEuMzQ2LS43MjcuMDc0LS4zMjMgMS40NDEtLjA1NC4wMThjLS4wNjMuMDItLjEyMS4wNDctLjE4LjA3NC0uMDM3LjAxNy0uMDczLjAzNC0uMTExLjA0OWwtLjA1Mi4wMjItMS4yLS44OS0uNTk5LjQyLjQyNiAxLjQyOS0uMDM4LjA0MmE0LjA3IDQuMDcgMCAwIDAtLjI0NC4yODRsLS4wMzQuMDQ1LTEuNDc2LS4xNjctLjMwNy42NjMgMS4wODYgMS4wMjQtLjAzNC4xNTFjLS4wMi4wODktLjA0MS4xNzctLjA1Mi4yNjlsLS4wMDcuMDU2LTEuMzU4LjU5My4wNjYuNzI4IDEuNDMxLjMzNy4wMTcuMDU1Yy4wMjQuMDc3LjA1OC4xNDguMDkxLjIyLjAyMS4wNDMuMDQxLjA4Ni4wNTkuMTMxbC4wMjIuMDUyLS44ODUgMS4yMDMuNDIyLjU5OCAxLjQyNi0uNDMyLjA0Mi4wMzhjLjA4My4wNzUuMTc5LjE2My4yODIuMjRsLjA0NS4wMzUtLjE2MyAxLjQ3Ni42NjQuMzA2IDEuMDI0LTEuMDg3ek0yMC45MTggMjIuOTcyYTEuMzUgMS4zNSAwIDEgMSAuMDAxLTIuNjk5IDEuMzUgMS4zNSAwIDAgMS0uMDAxIDIuNjk5em0wLTIuNWMtLjYzNCAwLTEuMTUuNTE3LTEuMTUgMS4xNXMuNTE3IDEuMTUgMS4xNSAxLjE1IDEuMTUtLjUxNyAxLjE1LTEuMTUtLjUxNi0xLjE1LTEuMTUtMS4xNXoiLz48cGF0aCBjbGFzcz0iaWNvbi1mMTItaG92ZXItYmciIGQ9Ik0yNC45MDEgMjIuMDI4di0uODEybC0xLjI2OS0uNDIzYTIuNzQ3IDIuNzQ3IDAgMCAwLS4yMS0uNTA1bC41OTktMS4xOTYtLjU3NC0uNTc0LTEuMTk2LjU5OWEyLjgxIDIuODEgMCAwIDAtLjUwNS0uMjA5bC0uNDIzLTEuMjY4aC0uODExbC0uNDIzIDEuMjY4YTIuODEgMi44MSAwIDAgMC0uNTA1LjIwOWwtMS4xOTctLjU5OS0uNTczLjU3NC41OTkgMS4xOTZhMi43NDcgMi43NDcgMCAwIDAtLjIxLjUwNWwtMS4yNjguNDIzdi44MTJsMS4yNjguNDIyYy4wNTQuMTc1LjEyNC4zNDUuMjEuNTA2bC0uNTk5IDEuMTk2LjU3My41NzQgMS4xOTctLjZjLjE2MS4wODcuMzMxLjE1Ny41MDUuMjFsLjQyMyAxLjI2OWguODExbC40MjMtMS4yNjljLjE3NC0uMDUzLjM0My0uMTIzLjUwNS0uMjFsMS4xOTYuNi41NzQtLjU3NC0uNTk5LTEuMTk2Yy4wODYtLjE2MS4xNTYtLjMzMS4yMS0uNTA2bDEuMjY5LS40MjJ6bS0zLjk4My45NDNjLS43NDQgMC0xLjM1LS42MDYtMS4zNS0xLjM1IDAtLjc0NC42MDUtMS4zNSAxLjM1LTEuMzUuNzQ0IDAgMS4zNS42MDUgMS4zNSAxLjM1IDAgLjc0NS0uNjA2IDEuMzUtMS4zNSAxLjM1eiIvPjxwYXRoIGNsYXNzPSJpY29uLWYxMi1sdGdyZXktZGlzYWJsZWQiIGQ9Ik0yMS4zMjMgMjUuNjA0aC0uODExbC0uNDIzLTEuMjY5YTIuODE0IDIuODE0IDAgMCAxLS41MDUtLjIwOWwtMS4xOTcuNTk5LS41NzMtLjU3NC41OTktMS4xOTZhMi43NDcgMi43NDcgMCAwIDEtLjIxLS41MDVsLTEuMjY5LS40MjN2LS44MTJsMS4yNjktLjQyMmMuMDU0LS4xNzUuMTI0LS4zNDUuMjEtLjUwNmwtLjU5OS0xLjE5Ni41NzMtLjU3MyAxLjE5Ny41OTljLjE2MS0uMDg3LjMzMS0uMTU3LjUwNS0uMjFsLjQyMy0xLjI2OWguODExbC40MjMgMS4yNjljLjE3NC4wNTMuMzQ0LjEyMy41MDUuMjFsMS4xOTYtLjU5OS41NzQuNTczLS41OTkgMS4xOTZjLjA4Ni4xNjEuMTU2LjMzMS4yMS41MDZsMS4yNjkuNDIydi44MTJsLTEuMjY5LjQyM2EyLjc0NyAyLjc0NyAwIDAgMS0uMjEuNTA1bC41OTkgMS4xOTYtLjU3NC41NzQtMS4xOTYtLjU5OWEyLjgxNCAyLjgxNCAwIDAgMS0uNTA1LjIwOWwtLjQyMyAxLjI2OXptLS42NjYtLjE5OWguNTIxbC40MTEtMS4yMzIuMDUxLS4wMTVjLjE5My0uMDU0LjM4Mi0uMTMyLjU2LS4yMzFsLjA0Ni0uMDI2IDEuMTYyLjU4MS4zNjktLjM2OS0uNTgtMS4xNjIuMDI2LS4wNDZjLjA5OS0uMTc4LjE3Ny0uMzY2LjIzMi0uNTZsLjAxNC0uMDUxIDEuMjMyLS40MTF2LS41MjNsLTEuMjMyLS40MS0uMDE0LS4wNTFhMi44MSAyLjgxIDAgMCAwLS4yMzItLjU2MWwtLjAyNi0uMDQ2LjU4LTEuMTYyLS4zNjktLjM2OC0xLjE2Mi41OC0uMDQ2LS4wMjZhMi42MjcgMi42MjcgMCAwIDAtLjU2LS4yMzJsLS4wNS0uMDE0LS40MTEtMS4yMzJoLS41MjFsLS40MTEgMS4yMzItLjA1MS4wMTRhMi43NTggMi43NTggMCAwIDAtLjU2LjIzMmwtLjA0Ni4wMjYtMS4xNjMtLjU4LS4zNjguMzY4LjU4IDEuMTYyLS4wMjYuMDQ2YTIuNjc1IDIuNjc1IDAgMCAwLS4yMzIuNTYxbC0uMDE0LjA1MS0xLjIzMi40MXYuNTIybDEuMjMyLjQxMS4wMTQuMDUxYy4wNTYuMTkzLjEzNC4zODIuMjMyLjU2bC4wMjYuMDQ2LS41OCAxLjE2Mi4zNjguMzY5IDEuMTYzLS41ODEuMDQ2LjAyNmMuMTc4LjEuMzY2LjE3OC41Ni4yMzFsLjA1MS4wMTUuNDEgMS4yMzN6Ii8+PC9nPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMzEuNjYgMjQuMDYzQzMxLjMxMiAyNS4xMTYgMzAuNjYxIDI3IDI4LjQxMyAyN0gyN3YxLjMxM2MwIC45MDUtLjMzNSAyLjUzNy0yLjk2NSAzLjI5OC0uOTA0LjI2MS0xLjY5NC4zODktMi41MzEuMzg5LS44MyAwLTEuNjMtLjEyOC0yLjUyNi0uMzkyQzE3LjA2MSAzMS4wNDUgMTYgMjkuODQ0IDE2IDI4LjMxM1YyN2gtMS4yMzJjLTEuNjk5IDAtMi45NDQtMS4xNDEtMy40MTYtMy4xMS0uNDY5LTEuOTQ2LS40NjktMy4wMjEgMC00Ljk2Ny40NTEtMS44ODEgMS45Ni0yLjkyMyAzLjg0NS0yLjkyM0gxNnYtMS42OTdjMC0yLjAwNS44NjYtMi44NDUgMy4wODctMy4yMzguNzI3LS4xMjggMS41MDYtLjA2NSAyLjMyNy0uMDY1aC4wMDNjLjkyMSAwIDEuNzAzLS4wNyAyLjUwNC4wNjQgMS44MTguMzAyIDMuMDc5IDEuNTg1IDMuMDc5IDMuMjM5VjE2aDEuNDEzYzEuMTQyIDAgMi42MzYuMzU2IDMuMjcgMi45MTIuNTE1IDIuMDcyLjUwOSAzLjU1OC0uMDIzIDUuMTUxeiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NDhfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTIyLjMyIiB5MT0iLTI4OC42NjgiIHgyPSI1NDEuMDE3IiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF81XyIgY2xhc3M9InN0MSIgZD0iTTIxLjQxOSAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwOCAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OCAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg3IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODctLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4yNDUiIHkxPSItMzE0LjQ4OSIgeDI9IjU0MS41NjkiIHkyPSItMzA1LjA0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZDQzYiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmZTg3MyIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTUwXzVfIiBjbGFzcz0ic3QyIiBkPSJNMjYuNjg3IDE2LjY0djIuMDQyYzAgMS41ODMtMS4zNDIgMi45MTUtMi44NzMgMi45MTVoLTQuNTkzYy0xLjI1OCAwLTIuMjk5IDEuMDc3LTIuMjk5IDIuMzM3djQuMzc5YzAgMS4yNDYgMS4wODQgMS45NzkgMi4yOTkgMi4zMzcgMS40NTYuNDI4IDIuODUxLjUwNSA0LjU5MyAwIDEuMTU4LS4zMzUgMi4yOTktMS4wMSAyLjI5OS0yLjMzN1YyNi41NkgyMS41MnYtLjU4NEgyOC40MTJjMS4zMzYgMCAxLjgzNC0uOTMyIDIuMjk5LTIuMzMxLjQ4LTEuNDQuNDYtMi44MjYgMC00LjY3My0uMzMtMS4zMy0uOTYxLTIuMzMxLTIuMjk5LTIuMzMxaC0xLjcyNXptLTIuNTgzIDExLjA4OWMuNDc3IDAgLjg2My4zOTEuODYzLjg3NGEuODcxLjg3MSAwIDAgMS0uODYzLjg3OS44NzIuODcyIDAgMCAxLS44NjMtLjg3OWMwLS40ODQuMzg4LS44NzQuODYzLS44NzR6Ii8+PC9nPjwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5dGhvbi5pY25zIGIvUEMvaWNvbnMvcHl0aG9uLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1M2UwMgotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5dGhvbi5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5dGhvbi5pY28gYi9QQy9pY29ucy9weXRob24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTM4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL2ljb25zL3B5dGhvbi5zdmcgYi9QQy9pY29ucy9weXRob24uc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2U1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob24uc3ZnCkBAIC0wLDAgKzEgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxzdHlsZT4uaWNvbi1jYW52YXMtdHJhbnNwYXJlbnR7b3BhY2l0eTowO2ZpbGw6I2Y2ZjZmNn0uaWNvbi13aGl0ZXtmaWxsOiNmZmZ9Lmljb24tdnNvLWJne2ZpbGw6IzY1NjU2NX0uaWNvbi12aXN1YWxzdHVkaW8tb25saW5le2ZpbGw6IzAwN2FjY30uaWNvbi12cy1iZ3tmaWxsOiM0MjQyNDJ9Lmljb24tdnMtZ3JlZW57ZmlsbDojMzkzfS5zdDB7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qxe2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTMwIDRIMlYyaDI4djJ6Ii8+PHBhdGggY2xhc3M9Imljb24tdnNvLWJnIiBkPSJNMjkgNHYyMUgzVjRIMnYyMmgyOFY0eiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzLWJnIiBkPSJNMTAgNEgzdjIxaDI2VjR6Ii8+PC9nPjxnIGlkPSJpY29uRmciPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMjkuMTQxIDNsLjQyOS40MjktLjE0LjE0Mi0uNDMtLjQzLS40My40My0uMTQtLjE0Mi40MjktLjQyOS0uNDI5LS40MjkuMTQxLS4xNDIuNDI5LjQzLjQzLS40My4xNDEuMTQyLS40My40Mjl6TTI3LjYgMi40aC0xLjJ2MS4yaDEuMlYyLjR6bS0xIC4yaC44di44aC0uOHYtLjh6bS0xLjEzOS44aC0xdi4yaDF2LS4yeiIvPjxwYXRoIGNsYXNzPSJpY29uLXZzLWdyZWVuIiBkPSJNMTYgMTRINXYtMWgxMS4wMzFjLS4wMTQuMDQ0LS4wMzEgMS0uMDMxIDF6bS00LTVINXYxaDdWOXptLTcgOHYxaDh2LTFINXoiLz48L2c+PGcgaWQ9ImNvbG9ySW1wb3J0YW5jZSI+PHBhdGggY2xhc3M9Imljb24td2hpdGUiIGQ9Ik0zMS41OTYgMjQuMDYzQzMxLjI0NiAyNS4xMTYgMzAuNTk1IDI3IDI4LjM0OSAyN0gyN3YxLjMxM2MwIC45MDUtLjM2OCAyLjUzNy0yLjk5NiAzLjI5OC0uOTA0LjI2MS0xLjcyOC4zODktMi41NjYuMzg5LS44MyAwLTEuNTk3LS4xMjgtMi40OTItLjM5MkMxNy4wMjkgMzEuMDQ1IDE2IDI5Ljg0NCAxNiAyOC4zMTNWMjdoLTEuMjk3Yy0xLjY5OCAwLTIuOTQzLTEuMTQxLTMuNDE2LTMuMTEtLjQ2OS0xLjk0Ni0uNDY5LTMuMDIxIDAtNC45NjcuNDUxLTEuODgxIDEuOTYtMi45MjMgMy44NDUtMi45MjNIMTZ2LTEuNjk3YzAtMi4wMDUuODM0LTIuODQ1IDMuMDU0LTMuMjM4LjcyOC0uMTI4IDEuNDc0LS4wNjUgMi4yOTYtLjA2NWguMDAzYy45MjEgMCAxLjczNS0uMDcgMi41MzcuMDY0IDEuODE2LjMwMyAzLjExIDEuNTg1IDMuMTEgMy4yNFYxNmgxLjM0OWMxLjE0MiAwIDIuNjM2LjM1NiAzLjI3IDIuOTEyLjUxNSAyLjA3Mi41MDkgMy41NTgtLjAyMyA1LjE1MXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTQ4XzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMi4yMDUiIHkxPSItMjg4LjY2OCIgeDI9IjU0MC45MDIiIHkyPSItMzA0Ljc1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzVhOWZkNCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMwNjk5OCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTQ4XzNfIiBjbGFzcz0ic3QwIiBkPSJNMjEuMzU0IDExLjcyNWMtLjc4Ni4wMDQtMS41MzcuMDcxLTIuMTk3LjE4OC0xLjk0Ni4zNDQtMi4yOTkgMS4wNjMtMi4yOTkgMi4zOXYxLjc1M2g0LjU5OHYuNTg0aC02LjMyNGMtMS4zMzYgMC0yLjUwNy44MDMtMi44NzMgMi4zMzEtLjQyMiAxLjc1MS0uNDQxIDIuODQ0IDAgNC42NzMuMzI3IDEuMzYxIDEuMTA3IDIuMzMxIDIuNDQ0IDIuMzMxaDEuNTgxdi0yLjEwMWMwLTEuNTE4IDEuMzEzLTIuODU3IDIuODczLTIuODU3aDQuNTkzYzEuMjc5IDAgMi4yOTktMS4wNTMgMi4yOTktMi4zMzd2LTQuMzc5YzAtMS4yNDYtMS4wNTEtMi4xODItMi4yOTktMi4zOS0uNzktLjEzLTEuNjEtLjE4OS0yLjM5Ni0uMTg2em0tMi40ODYgMS40MWMuNDc1IDAgLjg2My4zOTQuODYzLjg3OWEuODcuODcgMCAwIDEtLjg2My44NzQuODY4Ljg2OCAwIDAgMS0uODYzLS44NzRjMC0uNDg1LjM4Ni0uODc5Ljg2My0uODc5eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NTBfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTQ4LjEzIiB5MT0iLTMxNC40ODkiIHgyPSI1NDEuNDU0IiB5Mj0iLTMwNS4wNDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmQ0M2IiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmU4NzMiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk1MF8zXyIgY2xhc3M9InN0MSIgZD0iTTI2LjYyMyAxNi42NHYyLjA0MmMwIDEuNTgzLTEuMzQyIDIuOTE1LTIuODczIDIuOTE1aC00LjU5M2MtMS4yNTggMC0yLjI5OSAxLjA3Ny0yLjI5OSAyLjMzN3Y0LjM3OWMwIDEuMjQ2IDEuMDg0IDEuOTc5IDIuMjk5IDIuMzM3IDEuNDU2LjQyOCAyLjg1MS41MDUgNC41OTMgMCAxLjE1OC0uMzM1IDIuMjk5LTEuMDEgMi4yOTktMi4zMzdWMjYuNTZoLTQuNTkzdi0uNTg0aDYuODkyYzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4NCAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzkuODcuODcgMCAwIDEgLjg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob253LmljbnMgYi9QQy9pY29ucy9weXRob253LmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1NGNmOAotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3B5dGhvbncuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob253LmljbyBiL1BDL2ljb25zL3B5dGhvbncuaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTVkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob253LmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9weXRob253LnN2ZyBiL1BDL2ljb25zL3B5dGhvbncuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYjI2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9pY29ucy9weXRob253LnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5pY29uLXZpc3VhbHN0dWRpby1vbmxpbmV7ZmlsbDojMDA3YWNjfS5ncmFwaC1saWdodGdyZXl7ZmlsbDojZGZkZmRmfS5zdDB7ZmlsbDojZjZmNmY2fS5zdDF7ZmlsbDojNjU2NTY1fS5zdDJ7ZmlsbDojYmZiZmJmfS5zdDN7ZmlsbDojZmZmfS5zdDR7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Q1e2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9ImdyYXBoLWxpZ2h0Z3JleSIgZD0iTTI5IDdIM1Y1aDI2djJ6Ii8+PHBhdGggY2xhc3M9Imljb24tdmlzdWFsc3R1ZGlvLW9ubGluZSIgZD0iTTMwIDVIMlYzaDI4djJ6Ii8+PHBhdGggY2xhc3M9Imljb24td2hpdGUiIGQ9Ik0yOS4xNDEgNGwuNDI5LjQyOS0uMTQuMTQyLS40My0uNDMtLjQzLjQzLS4xNC0uMTQyLjQyOS0uNDI5LS40MjktLjQyOS4xNDEtLjE0Mi40MjkuNDMuNDMtLjQzLjE0MS4xNDItLjQzLjQyOXpNMjcuNiAzLjRoLTEuMnYxLjJoMS4yVjMuNHptLTEgLjJoLjh2LjhoLS44di0uOHptLTEuMTM5LjhoLTF2LjJoMXYtLjJ6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTMgN2gyNnYxOUgzeiIvPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yOSA1djIxSDNWNUgydjIyaDI4VjV6Ii8+PHBhdGggY2xhc3M9InN0MSIgZD0iTTQgNS43NWgydi41SDR6Ii8+PC9nPjxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xMiAxMUg1di0xaDd2MXptLTcgN3YxaDExdi0xSDV6bTAtNHYxaDExdi0xSDV6IiBpZD0iaWNvbkZnIi8+PGcgaWQ9ImNvbG9ySW1wb3J0YW5jZSI+PHBhdGggY2xhc3M9InN0MyIgZD0iTTMxLjYxOCAxOC45MTJDMzAuOTg0IDE2LjM1NiAyOS40OSAxNiAyOC4zNDkgMTZIMjd2LTEuNjk3YzAtMS42NTQtMS4yOTQtMi45MzctMy4xMS0zLjI0LS44MDItLjEzMy0xLjYxNy0uMDYzLTIuNTM3LS4wNjNoLS4wMDNjLS44MjEgMC0xLjU2OC0uMDYzLTIuMjk1LjA2NS0yLjIyMS4zOTMtMy4wNTUgMS4yMzMtMy4wNTUgMy4yMzhWMTZoLS44NjhjLTEuODg1IDAtMy4zOTQgMS4wNDItMy44NDUgMi45MjQtLjQ2OSAxLjk0Ni0uNDY5IDMuMDIyIDAgNC45NjdDMTEuNzYgMjUuODU5IDEzLjAwNSAyNyAxNC43MDMgMjdIMTZ2MS4zMTNjMCAxLjUzMSAxLjAyOSAyLjczMiAyLjk0NiAzLjI5Ni44OTYuMjYzIDEuNjYyLjM5MSAyLjQ5Mi4zOTEuODM4IDAgMS42NjEtLjEyOCAyLjU2NS0uMzlDMjYuNjMyIDMwLjg1IDI3IDI5LjIxOCAyNyAyOC4zMTNWMjdoMS4zNDljMi4yNDYgMCAyLjg5Ny0xLjg4NCAzLjI0Ny0yLjkzNy41MzItMS41OTIuNTM4LTMuMDc5LjAyMi01LjE1MXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTQ4XzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUyMi4yMDUiIHkxPSItMjg4LjY2OCIgeDI9IjU0MC45MDIiIHkyPSItMzA0Ljc1NCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguNTYyNSAwIDAgLS41NjggLTI4Mi4yNzIgLTE1MS42OSkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzVhOWZkNCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMwNjk5OCIvPjwvbGluZWFyR3JhZGllbnQ+PHBhdGggaWQ9InBhdGgxOTQ4XzZfIiBjbGFzcz0ic3Q0IiBkPSJNMjEuMzU0IDExLjcyNWMtLjc4Ni4wMDQtMS41MzcuMDcxLTIuMTk3LjE4OC0xLjk0Ni4zNDQtMi4yOTkgMS4wNjMtMi4yOTkgMi4zOXYxLjc1M2g0LjU5OHYuNTg0aC02LjMyNGMtMS4zMzYgMC0yLjUwNy44MDMtMi44NzMgMi4zMzEtLjQyMiAxLjc1MS0uNDQxIDIuODQ0IDAgNC42NzMuMzI3IDEuMzYxIDEuMTA3IDIuMzMxIDIuNDQ0IDIuMzMxaDEuNTgxdi0yLjEwMWMwLTEuNTE4IDEuMzEzLTIuODU3IDIuODczLTIuODU3aDQuNTkzYzEuMjc4IDAgMi4yOTktMS4wNTMgMi4yOTktMi4zMzd2LTQuMzc5YzAtMS4yNDYtMS4wNTEtMi4xODItMi4yOTktMi4zOS0uNzktLjEzLTEuNjEtLjE4OS0yLjM5Ni0uMTg2em0tMi40ODYgMS40MWMuNDc1IDAgLjg2My4zOTQuODYzLjg3OWEuODcuODcgMCAwIDEtLjg2My44NzQuODY4Ljg2OCAwIDAgMS0uODYzLS44NzRjMC0uNDg1LjM4Ni0uODc5Ljg2My0uODc5eiIvPjxsaW5lYXJHcmFkaWVudCBpZD0icGF0aDE5NTBfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNTQ4LjEzIiB5MT0iLTMxNC40ODkiIHgyPSI1NDEuNDU0IiB5Mj0iLTMwNS4wNDMiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmQ0M2IiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmU4NzMiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk1MF82XyIgY2xhc3M9InN0NSIgZD0iTTI2LjYyMyAxNi42NHYyLjA0MmMwIDEuNTgzLTEuMzQyIDIuOTE1LTIuODczIDIuOTE1aC00LjU5M2MtMS4yNTggMC0yLjI5OSAxLjA3Ny0yLjI5OSAyLjMzN3Y0LjM3OWMwIDEuMjQ2IDEuMDg0IDEuOTc5IDIuMjk5IDIuMzM3IDEuNDU2LjQyOCAyLjg1MS41MDUgNC41OTMgMCAxLjE1OC0uMzM1IDIuMjk5LTEuMDEgMi4yOTktMi4zMzdWMjYuNTZoLTQuNTkzdi0uNTg0aDYuODkyYzEuMzM2IDAgMS44MzQtLjkzMiAyLjI5OS0yLjMzMS40OC0xLjQ0LjQ2LTIuODI2IDAtNC42NzMtLjMzLTEuMzMtLjk2MS0yLjMzMS0yLjI5OS0yLjMzMWgtMS43MjV6bS0yLjU4NCAxMS4wODljLjQ3NyAwIC44NjMuMzkxLjg2My44NzRhLjg3MS44NzEgMCAwIDEtLjg2My44NzkuODcyLjg3MiAwIDAgMS0uODYzLS44NzkuODcuODcgMCAwIDEgLjg2My0uODc0eiIvPjwvZz48L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQy9pY29ucy9zZXR1cC5pY25zIGIvUEMvaWNvbnMvc2V0dXAuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBlNmIwCi0tLSAvZGV2L251bGwKKysrIGIvUEMvaWNvbnMvc2V0dXAuaWNucwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9zZXR1cC5pY28gYi9QQy9pY29ucy9zZXR1cC5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0MzY0YgotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3NldHVwLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9pY29ucy9zZXR1cC5zdmcgYi9QQy9pY29ucy9zZXR1cC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxMzg1NgotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ljb25zL3NldHVwLnN2ZwpAQCAtMCwwICsxIEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIj48c3R5bGU+Lmljb24tY2FudmFzLXRyYW5zcGFyZW50e29wYWNpdHk6MDtmaWxsOiNmNmY2ZjZ9Lmljb24tdmlzdWFsc3R1ZGlvLW9ubGluZXtmaWxsOiMwMDdhY2N9Lmljb24tZGlzYWJsZWQtZ3JleXtmaWxsOiM4NDg0ODR9Lmljb24td2hpdGV7ZmlsbDojZmZmfS5zdDB7ZmlsbDojZjBlZmYxfS5zdDF7ZmlsbDojNDI0MjQyfS5zdDJ7ZmlsbDp1cmwoI3BhdGgxOTQ4XzFfKX0uc3Qze2ZpbGw6dXJsKCNwYXRoMTk1MF8xXyl9PC9zdHlsZT48cGF0aCBjbGFzcz0iaWNvbi1jYW52YXMtdHJhbnNwYXJlbnQiIGQ9Ik0zMiAzMkgwVjBoMzJ2MzJ6IiBpZD0iY2FudmFzIi8+PGcgaWQ9Imljb25CZyI+PHBhdGggY2xhc3M9InN0MCIgZD0iTTE4IDh2MTBIMVY4aDE3em0tMS4xOTEgMTUuNTcyYTEuMDA0IDEuMDA0IDAgMCAwLS45MDMtLjU3MkgyLjkwN2MtLjM4NSAwLS43NC4yMjUtLjkwMy41NzJMLjg4NiAyNS45MjhBLjc0OC43NDggMCAwIDAgMS41NjMgMjdIMTcuMjVhLjc0OC43NDggMCAwIDAgLjY3Ny0xLjA3MmwtMS4xMTgtMi4zNTZ6Ii8+PHBhdGggY2xhc3M9Imljb24tZGlzYWJsZWQtZ3JleSIgZD0iTTE3LjkyNyAyNS45MjlsLTEuMTE4LTIuMzU2YTEuMDAzIDEuMDAzIDAgMCAwLS45MDMtLjU3M0gyLjkwN2MtLjM4NSAwLS43NC4yMjUtLjkwMy41NzJMLjg4NiAyNS45MjhBLjc0OC43NDggMCAwIDAgMS41NjMgMjdIMTcuMjVhLjc0Ny43NDcgMCAwIDAgLjYzMy0uMzQ5Ljc0Ni43NDYgMCAwIDAgLjA0NC0uNzIyek0xLjk1OSAyNmwuOTQ5LTJoMTIuOTk4bC45NDkgMkgxLjk1OXpNNiAyMnYtMWgzdi0yaDF2MmgzdjFINnoiLz48cGF0aCBjbGFzcz0ic3QxIiBkPSJNMCA3djEyaDE5VjdIMHptMTggMTFIMVY4aDE3djEweiIvPjwvZz48ZyBpZD0iaWNvbkZnIj48cGF0aCBjbGFzcz0iaWNvbi13aGl0ZSIgZD0iTTEyIDZWMEg3djZIMi43NTVMOS41IDEzLjQ5NSAxNi4yNDUgNnoiLz48cGF0aCBjbGFzcz0iaWNvbi12aXN1YWxzdHVkaW8tb25saW5lIiBkPSJNOCA0aDN2M2gzbC00LjUgNUw1IDdoM1Y0em0zLTJIOHYxaDNWMnptMC0ySDh2MWgzVjB6Ii8+PC9nPjxnIGlkPSJjb2xvckltcG9ydGFuY2UiPjxwYXRoIGNsYXNzPSJpY29uLXdoaXRlIiBkPSJNMzEuNTk2IDI0LjA2M0MzMS4yNDYgMjUuMTE2IDMwLjU5NSAyNyAyOC4zNDkgMjdIMjd2MS4zMTNjMCAuOTA1LS4zNjggMi41MzctMi45OTcgMy4yOTgtLjkwMy4yNjEtMS43MjcuMzg5LTIuNTY1LjM4OS0uODMgMC0xLjU5Ny0uMTI4LTIuNDkzLS4zOTJDMTcuMDI5IDMxLjA0NSAxNiAyOS44NDQgMTYgMjguMzEzVjI3aC0xLjI5NmMtMS42OTggMC0yLjk0NC0xLjE0MS0zLjQxNy0zLjExLS40NjktMS45NDQtLjQ2OS0zLjAyIDAtNC45NjcuNDUxLTEuODgxIDEuOTYxLTIuOTIzIDMuODQ1LTIuOTIzSDE2di0xLjY5N2MwLTIuMDA1LjgzNC0yLjg0NSAzLjA1NC0zLjIzOC43MjgtLjEyOCAxLjQ3NC0uMDY1IDIuMjk2LS4wNjVoLjAwM2MuOTIxIDAgMS43MzUtLjA3IDIuNTM3LjA2NCAxLjgxNi4zMDMgMy4xMSAxLjU4NSAzLjExIDMuMjRWMTZoMS4zNDljMS4xNDIgMCAyLjYzNi4zNTYgMy4yNyAyLjkxMi41MTUgMi4wNzIuNTA5IDMuNTU5LS4wMjMgNS4xNTF6Ii8+PGxpbmVhckdyYWRpZW50IGlkPSJwYXRoMTk0OF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MjIuMjA1IiB5MT0iLTI4OC42NjgiIHgyPSI1NDAuOTAyIiB5Mj0iLTMwNC43NTQiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLjU2MjUgMCAwIC0uNTY4IC0yODIuMjcyIC0xNTEuNjkpIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1YTlmZDQiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMDY5OTgiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJwYXRoMTk0OF85XyIgY2xhc3M9InN0MiIgZD0iTTIxLjM1NCAxMS43MjVjLS43ODYuMDA0LTEuNTM3LjA3MS0yLjE5Ny4xODgtMS45NDYuMzQ0LTIuMjk5IDEuMDYzLTIuMjk5IDIuMzl2MS43NTNoNC41OTh2LjU4NGgtNi4zMjRjLTEuMzM2IDAtMi41MDcuODAzLTIuODczIDIuMzMxLS40MjIgMS43NTEtLjQ0MSAyLjg0NCAwIDQuNjczLjMyNyAxLjM2MSAxLjEwOCAyLjMzMSAyLjQ0NCAyLjMzMWgxLjU4MXYtMi4xMDFjMC0xLjUxOCAxLjMxMy0yLjg1NyAyLjg3My0yLjg1N2g0LjU5M2MxLjI3OSAwIDIuMjk5LTEuMDUzIDIuMjk5LTIuMzM3di00LjM3OWMwLTEuMjQ2LTEuMDUxLTIuMTgyLTIuMjk5LTIuMzktLjc5LS4xMy0xLjYxLS4xODktMi4zOTYtLjE4NnptLTIuNDg2IDEuNDFjLjQ3NSAwIC44NjMuMzk0Ljg2My44NzlhLjg3Ljg3IDAgMCAxLS44NjMuODc0Ljg2OC44NjggMCAwIDEtLjg2My0uODc0YzAtLjQ4NS4zODYtLjg3OS44NjMtLjg3OXoiLz48bGluZWFyR3JhZGllbnQgaWQ9InBhdGgxOTUwXzFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjU0OC4xMyIgeTE9Ii0zMTQuNDg5IiB4Mj0iNTQxLjQ1NCIgeTI9Ii0zMDUuMDQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC41NjI1IDAgMCAtLjU2OCAtMjgyLjI3MiAtMTUxLjY5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkNDNiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZlODczIi8+PC9saW5lYXJHcmFkaWVudD48cGF0aCBpZD0icGF0aDE5NTBfOV8iIGNsYXNzPSJzdDMiIGQ9Ik0yNi42MjMgMTYuNjR2Mi4wNDJjMCAxLjU4My0xLjM0MiAyLjkxNS0yLjg3MyAyLjkxNWgtNC41OTNjLTEuMjU4IDAtMi4yOTkgMS4wNzctMi4yOTkgMi4zMzd2NC4zNzljMCAxLjI0NiAxLjA4NCAxLjk3OSAyLjI5OSAyLjMzNyAxLjQ1Ni40MjggMi44NTEuNTA1IDQuNTkzIDAgMS4xNTgtLjMzNSAyLjI5OS0xLjAxIDIuMjk5LTIuMzM3VjI2LjU2aC00LjU5M3YtLjU4NEgyOC4zNDhjMS4zMzYgMCAxLjgzNC0uOTMyIDIuMjk5LTIuMzMxLjQ4LTEuNDQuNDYtMi44MjYgMC00LjY3My0uMzMtMS4zMy0uOTYxLTIuMzMxLTIuMjk5LTIuMzMxaC0xLjcyNXptLTIuNTg0IDExLjA4OWMuNDc3IDAgLjg2My4zOTEuODYzLjg3NGEuODcxLjg3MSAwIDAgMS0uODYzLjg3OS44NzIuODcyIDAgMCAxLS44NjMtLjg3OS44Ny44NyAwIDAgMSAuODYzLS44NzR6Ii8+PC9nPjwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BDL2xhdW5jaGVyLmMgYi9QQy9sYXVuY2hlci5jCmluZGV4IDQwZDRjYjUuLjIyMTRiMDggMTAwNjQ0Ci0tLSBhL1BDL2xhdW5jaGVyLmMKKysrIGIvUEMvbGF1bmNoZXIuYwpAQCAtOTgsNyArOTgsNyBAQAogICAgIE1lc3NhZ2VCb3goTlVMTCwgbWVzc2FnZSwgVEVYVCgiUHl0aG9uIExhdW5jaGVyIGlzIHNvcnJ5IHRvIHNheSAuLi4iKSwKICAgICAgICAgICAgICAgIE1CX09LKTsKICNlbmRpZgotICAgIEV4aXRQcm9jZXNzKHJjKTsKKyAgICBleGl0KHJjKTsKIH0KIAogLyoKQEAgLTQ2NSw3ICs0NjUsNyBAQAogfQogCiBzdGF0aWMgSU5TVEFMTEVEX1BZVEhPTiAqCi1sb2NhdGVfcHl0aG9uKHdjaGFyX3QgKiB3YW50ZWRfdmVyKQorbG9jYXRlX3B5dGhvbih3Y2hhcl90ICogd2FudGVkX3ZlciwgQk9PTCBmcm9tX3NoZWJhbmcpCiB7CiAgICAgc3RhdGljIHdjaGFyX3QgY29uZmlnX2tleSBbXSA9IHsgTCJweXRob25YIiB9OwogICAgIHN0YXRpYyB3Y2hhcl90ICogbGFzdF9jaGFyID0gJmNvbmZpZ19rZXlbc2l6ZW9mKGNvbmZpZ19rZXkpIC8KQEAgLTQ5NywxMCArNDk3LDE3IEBACiAgICAgICAgIGNvbmZpZ3VyZWRfdmFsdWUgPSBnZXRfY29uZmlndXJlZF92YWx1ZShjb25maWdfa2V5KTsKICAgICAgICAgaWYgKGNvbmZpZ3VyZWRfdmFsdWUpCiAgICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKGNvbmZpZ3VyZWRfdmFsdWUpOworICAgICAgICAvKiBOb3QgZm91bmQgYSB2YWx1ZSB5ZXQgLSB0cnkgYnkgbWFqb3IgdmVyc2lvbi4KKyAgICAgICAgICogSWYgd2UncmUgbG9va2luZyBmb3IgYW4gaW50ZXJwcmV0ZXIgc3BlY2lmaWVkIGluIGEgc2hlYmFuZyBsaW5lLAorICAgICAgICAgKiB3ZSB3YW50IHRvIHRyeSBQeXRob24gMiBmaXJzdCwgdGhlbiBQeXRob24gMyAoZm9yIFVuaXggYW5kIGJhY2t3YXJkCisgICAgICAgICAqIGNvbXBhdGliaWxpdHkpLiBJZiB3ZSdyZSBiZWluZyBjYWxsZWQgaW50ZXJhY3RpdmVseSwgYXNzdW1lIHRoZSB1c2VyCisgICAgICAgICAqIHdhbnRzIHRoZSBsYXRlc3QgdmVyc2lvbiBhdmFpbGFibGUsIHNvIHRyeSBQeXRob24gMyBmaXJzdCwgdGhlbgorICAgICAgICAgKiBQeXRob24gMi4KKyAgICAgICAgICovCiAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oTCIyIik7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKGZyb21fc2hlYmFuZyA/IEwiMiIgOiBMIjMiKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihMIjMiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oZnJvbV9zaGViYW5nID8gTCIzIiA6IEwiMiIpOwogICAgICAgICBkZWJ1ZyhMInNlYXJjaCBmb3IgZGVmYXVsdCBQeXRob24gZm91bmQgIik7CiAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgIGRlYnVnKEwidmVyc2lvbiAlbHMgYXQgJyVscydcbiIsCkBAIC02NTUsNyArNjYyLDcgQEAKICAgICBpZiAoIW9rKQogICAgICAgICBlcnJvcihSQ19DUkVBVEVfUFJPQ0VTUywgTCJGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzIik7CiAgICAgZGVidWcoTCJjaGlsZCBwcm9jZXNzIGV4aXQgY29kZTogJWRcbiIsIHJjKTsKLSAgICBFeGl0UHJvY2VzcyhyYyk7CisgICAgZXhpdChyYyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDgyLDcgKzEwODksNyBAQAogICAgIHsgMzE5MCwgMzIzMCwgTCIzLjMiIH0sCiAgICAgeyAzMjUwLCAzMzEwLCBMIjMuNCIgfSwKICAgICB7IDMzMjAsIDMzNTEsIEwiMy41IiB9LAotICAgIHsgMzM2MCwgMzM2MSwgTCIzLjYiIH0sCisgICAgeyAzMzYwLCAzMzczLCBMIjMuNiIgfSwKICAgICB7IDAgfQogfTsKIApAQCAtMTA5NCw3ICsxMTAxLDcgQEAKIAogICAgIGZvciAobXAgPSBtYWdpY192YWx1ZXM7IG1wLT5taW47IG1wKyspIHsKICAgICAgICAgaWYgKChtYWdpYyA+PSBtcC0+bWluKSAmJiAobWFnaWMgPD0gbXAtPm1heCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGxvY2F0ZV9weXRob24obXAtPnZlcnNpb24pOworICAgICAgICAgICAgcmVzdWx0ID0gbG9jYXRlX3B5dGhvbihtcC0+dmVyc2lvbiwgRkFMU0UpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTE0LDcgKzExMjEsNyBAQAogICovCiAgICAgRklMRSAqIGZwOwogICAgIGVycm5vX3QgcmMgPSBfd2ZvcGVuX3MoJmZwLCAqYXJndiwgTCJyYiIpOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW0JVRlNJWkVdOworICAgIGNoYXIgYnVmZmVyW0JVRlNJWkVdOwogICAgIHdjaGFyX3Qgc2hlYmFuZ19saW5lW0JVRlNJWkUgKyAxXTsKICAgICBzaXplX3QgcmVhZDsKICAgICBjaGFyICpwOwpAQCAtMTEzNiw3ICsxMTQzLDggQEAKICAgICAgICAgZmNsb3NlKGZwKTsKIAogICAgICAgICBpZiAoKHJlYWQgPj0gNCkgJiYgKGJ1ZmZlclszXSA9PSAnXG4nKSAmJiAoYnVmZmVyWzJdID09ICdccicpKSB7Ci0gICAgICAgICAgICBpcCA9IGZpbmRfYnlfbWFnaWMoKGJ1ZmZlclsxXSA8PCA4IHwgYnVmZmVyWzBdKSAmIDB4RkZGRik7CisgICAgICAgICAgICBpcCA9IGZpbmRfYnlfbWFnaWMoKCgodW5zaWduZWQgY2hhcilidWZmZXJbMV0pIDw8IDggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilidWZmZXJbMF0pICYgMHhGRkZGKTsKICAgICAgICAgICAgIGlmIChpcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZGVidWcoTCJzY3JpcHQgZmlsZSBpcyBjb21waWxlZCBhZ2FpbnN0IFB5dGhvbiAlbHNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaXAtPnZlcnNpb24pOwpAQCAtMTI3OCw3ICsxMjg2LDcgQEAKIGZvbGxvd2VkIGJ5IGEgdmFsaWQgdmVyc2lvbiBzcGVjaWZpZXIuXG5QbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gY291bGQgY2FsbCB2YWxpZGF0ZV92ZXJzaW9uKGNvbW1hbmQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oY29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oY29tbWFuZCwgVFJVRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKFJDX05PX1BZVEhPTiwgTCJSZXF1ZXN0ZWQgUHl0aG9uIHZlcnNpb24gXAogKCVscykgaXMgbm90IGluc3RhbGxlZCIsIGNvbW1hbmQpOwpAQCAtMTM2Miw2ICsxMzcwLDcgQEAKICAgICB3Y2hhcl90ICogYXZbMl07CiAjZW5kaWYKIAorICAgIHNldHZidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwsIF9JT05CRiwgMCk7CiAgICAgd3AgPSBnZXRfZW52KEwiUFlMQVVOQ0hfREVCVUciKTsKICAgICBpZiAoKHdwICE9IE5VTEwpICYmICgqd3AgIT0gTCdcMCcpKQogICAgICAgICBsb2dfZnAgPSBzdGRlcnI7CkBAIC0xNDgzLDcgKzE0OTIsNyBAQAogICAgICAgICBwbGVuID0gd2NzbGVuKHApOwogICAgICAgICB2YWxpZCA9ICgqcCA9PSBMJy0nKSAmJiB2YWxpZGF0ZV92ZXJzaW9uKCZwWzFdKTsKICAgICAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oJnBbMV0pOworICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKCZwWzFdLCBGQUxTRSk7CiAgICAgICAgICAgICBpZiAoaXAgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBlcnJvcihSQ19OT19QWVRIT04sIEwiUmVxdWVzdGVkIFB5dGhvbiB2ZXJzaW9uICglbHMpIG5vdCBcCiBpbnN0YWxsZWQiLCAmcFsxXSk7CkBAIC0xNTEwLDcgKzE1MTksNyBAQAogCiAgICAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIG9uZSwgbG9vayBmb3IgdGhlIGRlZmF1bHQgUHl0aG9uICovCiAgICAgICAgIGlmIChleGVjdXRhYmxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihMIiIpOworICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKEwiIiwgRkFMU0UpOwogICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIkNhbid0IGZpbmQgYSBkZWZhdWx0IFB5dGhvbi4iKTsKICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBpcC0+ZXhlY3V0YWJsZTsKZGlmZiAtLWdpdCBhL1BDL2xhdW5jaGVyLmljbyBiL1BDL2xhdW5jaGVyLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkN2Q1Ny4uMDAwMDAwMAotLS0gYS9QQy9sYXVuY2hlci5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9tc3ZjcnRtb2R1bGUuYyBiL1BDL21zdmNydG1vZHVsZS5jCmluZGV4IGIwNzM5ZDAuLjdhYjhmOGYgMTAwNjQ0Ci0tLSBhL1BDL21zdmNydG1vZHVsZS5jCisrKyBiL1BDL21zdmNydG1vZHVsZS5jCkBAIC0zMywxMiArMzMsMTIgQEAKICNlbmRpZgogCiAvKltweXRob24gaW5wdXRdCi1jbGFzcyBQeV9pbnRwdHJfdF9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeV9pbnRwdHJfdCcKK2NsYXNzIGludHB0cl90X2NvbnZlcnRlcihDQ29udmVydGVyKToKKyAgICB0eXBlID0gJ2ludHB0cl90JwogICAgIGZvcm1hdF91bml0ID0gJyJfUHlfUEFSU0VfSU5UUFRSIicKIAogY2xhc3MgaGFuZGxlX3JldHVybl9jb252ZXJ0ZXIobG9uZ19yZXR1cm5fY29udmVydGVyKToKLSAgICB0eXBlID0gJ1B5X2ludHB0cl90JworICAgIHR5cGUgPSAnaW50cHRyX3QnCiAgICAgY2FzdCA9ICcodm9pZCAqKScKICAgICBjb252ZXJzaW9uX2ZuID0gJ1B5TG9uZ19Gcm9tVm9pZFB0cicKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAvKltjbGluaWMgaW5wdXRdCiBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUgLT4gbG9uZwogCi0gICAgaGFuZGxlOiBQeV9pbnRwdHJfdAorICAgIGhhbmRsZTogaW50cHRyX3QKICAgICBmbGFnczogaW50CiAgICAgLwogCkBAIC0xNjAsNyArMTYwLDcgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIGxvbmcKLW1zdmNydF9vcGVuX29zZmhhbmRsZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2ludHB0cl90IGhhbmRsZSwgaW50IGZsYWdzKQorbXN2Y3J0X29wZW5fb3NmaGFuZGxlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50cHRyX3QgaGFuZGxlLCBpbnQgZmxhZ3MpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmY2NWU0MjIyNDNhMzlmOSBpbnB1dD00ZDg1MTZlZDMyZGI4ZjY1XSovCiB7CiAgICAgaW50IGZkOwpAQCAtMTgzLDExICsxODMsMTEgQEAKIFJhaXNlcyBJT0Vycm9yIGlmIGZkIGlzIG5vdCByZWNvZ25pemVkLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCi1zdGF0aWMgUHlfaW50cHRyX3QKK3N0YXRpYyBpbnRwdHJfdAogbXN2Y3J0X2dldF9vc2ZoYW5kbGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgZmQpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWFjNDc2NDMzMzhjMGJhYSBpbnB1dD1jN2QxOGQwMmM4MDE3ZWMxXSovCiB7Ci0gICAgUHlfaW50cHRyX3QgaGFuZGxlID0gLTE7CisgICAgaW50cHRyX3QgaGFuZGxlID0gLTE7CiAKICAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwpAQCAtNTQwLDcgKzU0MCw2IEBACiAjZW5kaWYKIAogICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGNydCB2ZXJzaW9ucyAqLwotICAgICh2b2lkKXN0OwogI2lmZGVmIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTgogICAgIHN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIlZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTik7CkBAIC01NjYsNiArNTY1LDggQEAKICAgICBzdCA9IFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ1JUX0FTU0VNQkxZX1ZFUlNJT04iLCB2ZXJzaW9uKTsKICAgICBpZiAoc3QgPCAwKSByZXR1cm4gTlVMTDsKICNlbmRpZgorICAgIC8qIG1ha2UgY29tcGlsZXIgd2FybmluZyBxdWlldCBpZiBzdCBpcyB1bnVzZWQgKi8KKyAgICAodm9pZClzdDsKIAogICAgIHJldHVybiBtOwogfQpkaWZmIC0tZ2l0IGEvUEMvcHkuaWNvIGIvUEMvcHkuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU3YWVmLi4wMDAwMDAwCi0tLSBhL1BDL3B5LmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL3B5Yy5pY28gYi9QQy9weWMuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JkMmIxLi4wMDAwMDAwCi0tLSBhL1BDL3B5Yy5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQy9weWNvbi5pY28gYi9QQy9weWNvbi5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjYyOWUuLjAwMDAwMDAKLS0tIGEvUEMvcHljb24uaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvcHljb25maWcuaCBiL1BDL3B5Y29uZmlnLmgKaW5kZXggYWM0ZjhmMi4uNWQzNmYxYyAxMDA2NDQKLS0tIGEvUEMvcHljb25maWcuaAorKysgYi9QQy9weWNvbmZpZy5oCkBAIC0xNCw3ICsxNCw2IEBACiBNU19XSU42NCAtIENvZGUgc3BlY2lmaWMgdG8gdGhlIE1TIFdpbjY0IEFQSQogTVNfV0lOMzIgLSBDb2RlIHNwZWNpZmljIHRvIHRoZSBNUyBXaW4zMiAoYW5kIFdpbjY0KSBBUEkgKG9ic29sZXRlLCB0aGlzIGNvdmVycyBhbGwgc3VwcG9ydGVkIEFQSXMpCiBNU19XSU5ET1dTIC0gQ29kZSBzcGVjaWZpYyB0byBXaW5kb3dzLCBidXQgYWxsIHZlcnNpb25zLgotTVNfV0lOQ0UgLSBDb2RlIHNwZWNpZmljIHRvIFdpbmRvd3MgQ0UKIFB5X0VOQUJMRV9TSEFSRUQgLSBDb2RlIGlmIHRoZSBQeXRob24gY29yZSBpcyBidWlsdCBhcyBhIERMTC4KIAogQWxzbyBub3RlIHRoYXQgbmVpdGhlciAiX01fSVg4NiIgb3IgIl9NU0NfVkVSIiBzaG91bGQgYmUgdXNlZCBmb3IKQEAgLTMwLDEwICsyOSw2IEBACiAKICovCiAKLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIE1TX1dJTkNFCi0jZW5kaWYKLQogLyogRGVwcmVjYXRlZCBVU0VfRExfRVhQT1JUIG1hY3JvIC0gcGxlYXNlIHVzZSBQeV9CVUlMRF9DT1JFICovCiAjaWZkZWYgVVNFX0RMX0VYUE9SVAogIwlkZWZpbmUgUHlfQlVJTERfQ09SRQpAQCAtNTMsOCArNDgsNiBAQAogI2RlZmluZSBfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFIDEKICNlbmRpZgogCi0vKiBXaW5kb3dzIENFIGRvZXMgbm90IGhhdmUgdGhlc2UgKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9JT19ICiAjZGVmaW5lIEhBVkVfU1lTX1VUSU1FX0gKICNkZWZpbmUgSEFWRV9URU1QTkFNCkBAIC02MiwxMSArNTUsOCBAQAogI2RlZmluZSBIQVZFX1RNUE5BTQogI2RlZmluZSBIQVZFX0NMT0NLCiAjZGVmaW5lIEhBVkVfU1RSRVJST1IKLSNlbmRpZgogCi0jaWZkZWYgSEFWRV9JT19ICiAjaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgogCiAjZGVmaW5lIEhBVkVfSFlQT1QKICNkZWZpbmUgSEFWRV9TVFJGVElNRQpAQCAtODYsMTcgKzc2LDYgQEAKICNkZWZpbmUgVVNFX1NPQ0tFVAogI2VuZGlmCiAKLS8qIENFNiBkb2Vzbid0IGhhdmUgc3RyZHVwKCkgYnV0IF9zdHJkdXAoKS4gQXNzdW1lIHRoZSBzYW1lIGZvciBlYXJsaWVyIHZlcnNpb25zLiAqLwotI2lmIGRlZmluZWQoTVNfV0lOQ0UpCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSMgIGRlZmluZSBzdHJkdXAgX3N0cmR1cAotI2VuZGlmCi0KLSNpZmRlZiBNU19XSU5DRQotLyogV2luZG93cyBDRSBkb2VzIG5vdCBzdXBwb3J0IGVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotI2RlZmluZSBnZXRlbnYodikgKE5VTEwpCi0jZGVmaW5lIGVudmlyb24gKE5VTEwpCi0jZW5kaWYKIAogLyogQ29tcGlsZXIgc3BlY2lmaWMgZGVmaW5lcyAqLwogCkBAIC0yODYsNyArMjY1LDYgQEAKICNlbmRpZgogCiAvKiA2NCBiaXQgaW50cyBhcmUgdXN1YWxseSBzcGVsdCBfX2ludDY0IHVubGVzcyBjb21waWxlciBoYXMgb3ZlcnJpZGRlbiAqLwotI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxCiAjaWZuZGVmIFBZX0xPTkdfTE9ORwogIwlkZWZpbmUgUFlfTE9OR19MT05HIF9faW50NjQKICMJZGVmaW5lIFBZX0xMT05HX01BWCBfSTY0X01BWApAQCAtMzEyLDExICsyOTAsMTEgQEAKIAkJCXRoZWlyIE1ha2VmaWxlIChvdGhlciBjb21waWxlcnMgYXJlIGdlbmVyYWxseQogCQkJdGFrZW4gY2FyZSBvZiBieSBkaXN0dXRpbHMuKSAqLwogIwkJCWlmIGRlZmluZWQoX0RFQlVHKQotIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM1X2QubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNl9kLmxpYiIpCiAjCQkJZWxpZiBkZWZpbmVkKFB5X0xJTUlURURfQVBJKQogIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjMubGliIikKICMJCQllbHNlCi0jCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzUubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNi5saWIiKQogIwkJCWVuZGlmIC8qIF9ERUJVRyAqLwogIwkJZW5kaWYgLyogX01TQ19WRVIgKi8KICMJZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwpAQCAtMzg3LDM5ICszNjUsMTAgQEAKIAogLyogZGVmaW5lIHNpZ25lZCBhbmQgdW5zaWduZWQgZXhhY3Qtd2lkdGggMzItYml0IGFuZCA2NC1iaXQgdHlwZXMsIHVzZWQgaW4gdGhlCiAgICBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaW50ZWdlcnMuICovCi0jaWZuZGVmIFBZX1VJTlQzMl9UCi0jaWYgU0laRU9GX0lOVCA9PSA0Ci0jZGVmaW5lIEhBVkVfVUlOVDMyX1QgMQotI2RlZmluZSBQWV9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKLSNlbGlmIFNJWkVPRl9MT05HID09IDQKLSNkZWZpbmUgSEFWRV9VSU5UMzJfVCAxCi0jZGVmaW5lIFBZX1VJTlQzMl9UIHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUFlfVUlOVDY0X1QKLSNpZiBTSVpFT0ZfTE9OR19MT05HID09IDgKLSNkZWZpbmUgSEFWRV9VSU5UNjRfVCAxCi0jZGVmaW5lIFBZX1VJTlQ2NF9UIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBQWV9JTlQzMl9UCi0jaWYgU0laRU9GX0lOVCA9PSA0Ci0jZGVmaW5lIEhBVkVfSU5UMzJfVCAxCi0jZGVmaW5lIFBZX0lOVDMyX1QgaW50Ci0jZWxpZiBTSVpFT0ZfTE9ORyA9PSA0Ci0jZGVmaW5lIEhBVkVfSU5UMzJfVCAxCi0jZGVmaW5lIFBZX0lOVDMyX1QgbG9uZwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBQWV9JTlQ2NF9UCi0jaWYgU0laRU9GX0xPTkdfTE9ORyA9PSA4Ci0jZGVmaW5lIEhBVkVfSU5UNjRfVCAxCi0jZGVmaW5lIFBZX0lOVDY0X1QgUFlfTE9OR19MT05HCi0jZW5kaWYKLSNlbmRpZgorI2RlZmluZSBQWV9VSU5UMzJfVCB1aW50MzJfdAorI2RlZmluZSBQWV9VSU5UNjRfVCB1aW50NjRfdAorI2RlZmluZSBQWV9JTlQzMl9UIGludDMyX3QKKyNkZWZpbmUgUFlfSU5UNjRfVCBpbnQ2NF90CiAKIC8qIEZhaXJseSBzdGFuZGFyZCBmcm9tIGhlcmUhICovCiAKQEAgLTQ0OCwxNCArMzk3LDEwIEBACiAvKiAjZGVmaW5lIGNvbnN0ICAqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0NPTklPX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0RJUkVDVF9IIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZGlyZW50LmguICAqLwogLyogI2RlZmluZSBESVJFTlQgMSAqLwpAQCAtNTI4LDkgKzQ3Myw3IEBACiAvKiAjZGVmaW5lIEhBVkVfQUxUWk9ORSAqLwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfUFVURU5WCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKQEAgLTU1OCw5ICs1MDEsNyBAQAogI2RlZmluZSBIQVZFX0RZTkFNSUNfTE9BRElORwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZnRpbWUuICAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0ZUSU1FCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGdldHBlZXJuYW1lLiAgKi8KICNkZWZpbmUgSEFWRV9HRVRQRUVSTkFNRQpAQCAtNTY5LDkgKzUxMCw3IEBACiAvKiAjdW5kZWYgSEFWRV9HRVRQR1JQICovCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXRwaWQuICAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX0dFVFBJRAotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXR0aW1lb2ZkYXkuICAqLwogLyogI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZICovCkBAIC02MzMsMTQgKzU3MiwxMCBAQAogI2VuZGlmCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2NzY29sbCcgZnVuY3Rpb24uICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfV0NTQ09MTCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3Y3N4ZnJtJyBmdW5jdGlvbi4gKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9XQ1NYRlJNIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgdGhlIHpsaWIgbGlicmFyeSBoYXMgaW5mbGF0ZUNvcHkgKi8KICNkZWZpbmUgSEFWRV9aTElCX0NPUFkgMQpAQCAtNjQ5LDI0ICs1ODQsMTYgQEAKIC8qICN1bmRlZiBIQVZFX0RMRkNOX0ggKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KLSNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9FUlJOT19IIDEKLSNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfRkNOVExfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX1BST0NFU1NfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBwcm90b3R5cGVzLiAgKi8KICNkZWZpbmUgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwpAQCAtNjg0LDkgKzYxMSw3IEBACiAvKiAjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEgKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCi0jZW5kaWYKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMSAqLwpAQCAtNjk1LDkgKzYyMCw3IEBACiAvKiAjZGVmaW5lIEhBVkVfU1lTX1RJTUVTX0ggMSAqLwogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jaWZuZGVmIE1TX1dJTkNFCiAjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1VOX0ggMSAqLwpkaWZmIC0tZ2l0IGEvUEMvcHlsYXVuY2hlci5yYyBiL1BDL3B5bGF1bmNoZXIucmMKaW5kZXggYThkYjBhOC4uM2RhMzQ0NSAxMDA2NDQKLS0tIGEvUEMvcHlsYXVuY2hlci5yYworKysgYi9QQy9weWxhdW5jaGVyLnJjCkBAIC03LDkgKzcsMTMgQEAKICNpbmNsdWRlIDx3aW51c2VyLmg+CiAxIFJUX01BTklGRVNUICJweXRob24ubWFuaWZlc3QiCiAKLTEgSUNPTiBESVNDQVJEQUJMRSAibGF1bmNoZXIuaWNvIiAKLTIgSUNPTiBESVNDQVJEQUJMRSAicHkuaWNvIiAKLTMgSUNPTiBESVNDQVJEQUJMRSAicHljLmljbyIgCisxIElDT04gRElTQ0FSREFCTEUgImljb25zXGxhdW5jaGVyLmljbyIgCisyIElDT04gRElTQ0FSREFCTEUgImljb25zXHB5LmljbyIgCiszIElDT04gRElTQ0FSREFCTEUgImljb25zXHB5Yy5pY28iIAorNCBJQ09OIERJU0NBUkRBQkxFICJpY29uc1xweWQuaWNvIiAKKzUgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9uLmljbyIKKzYgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9udy5pY28iCis3IElDT04gRElTQ0FSREFCTEUgImljb25zXHNldHVwLmljbyIgCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLwpkaWZmIC0tZ2l0IGEvUEMvcHl0aG9uMy5kZWYgYi9QQy9weXRob24zLmRlZgppbmRleCA4OGMwNzQyLi5lOGQyZDhjIDEwMDY0NAotLS0gYS9QQy9weXRob24zLmRlZgorKysgYi9QQy9weXRob24zLmRlZgpAQCAtMiw3MTIgKzIsNzEzIEBACiA7IEl0IGlzIHVzZWQgd2hlbiBidWlsZGluZyBweXRob24zZGxsLnZjeHByb2oKIExJQlJBUlkJInB5dGhvbjMiCiBFWFBPUlRTCi0gIFB5QXJnX1BhcnNlPXB5dGhvbjM1LlB5QXJnX1BhcnNlCi0gIFB5QXJnX1BhcnNlVHVwbGU9cHl0aG9uMzUuUHlBcmdfUGFyc2VUdXBsZQotICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzUuUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCi0gIFB5QXJnX1VucGFja1R1cGxlPXB5dGhvbjM1LlB5QXJnX1VucGFja1R1cGxlCi0gIFB5QXJnX1ZhUGFyc2U9cHl0aG9uMzUuUHlBcmdfVmFQYXJzZQotICBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNS5QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcwotICBQeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHM9cHl0aG9uMzUuUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzCi0gIFB5QmFzZU9iamVjdF9UeXBlPXB5dGhvbjM1LlB5QmFzZU9iamVjdF9UeXBlIERBVEEKLSAgUHlCb29sX0Zyb21Mb25nPXB5dGhvbjM1LlB5Qm9vbF9Gcm9tTG9uZwotICBQeUJvb2xfVHlwZT1weXRob24zNS5QeUJvb2xfVHlwZSBEQVRBCi0gIFB5Qnl0ZUFycmF5SXRlcl9UeXBlPXB5dGhvbjM1LlB5Qnl0ZUFycmF5SXRlcl9UeXBlIERBVEEKLSAgUHlCeXRlQXJyYXlfQXNTdHJpbmc9cHl0aG9uMzUuUHlCeXRlQXJyYXlfQXNTdHJpbmcKLSAgUHlCeXRlQXJyYXlfQ29uY2F0PXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0NvbmNhdAotICBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0Zyb21PYmplY3QKLSAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlCeXRlQXJyYXlfUmVzaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1Jlc2l6ZQotICBQeUJ5dGVBcnJheV9TaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1NpemUKLSAgUHlCeXRlQXJyYXlfVHlwZT1weXRob24zNS5QeUJ5dGVBcnJheV9UeXBlIERBVEEKLSAgUHlCeXRlc0l0ZXJfVHlwZT1weXRob24zNS5QeUJ5dGVzSXRlcl9UeXBlIERBVEEKLSAgUHlCeXRlc19Bc1N0cmluZz1weXRob24zNS5QeUJ5dGVzX0FzU3RyaW5nCi0gIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZXNfQ29uY2F0PXB5dGhvbjM1LlB5Qnl0ZXNfQ29uY2F0Ci0gIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsPXB5dGhvbjM1LlB5Qnl0ZXNfQ29uY2F0QW5kRGVsCi0gIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlPXB5dGhvbjM1LlB5Qnl0ZXNfRGVjb2RlRXNjYXBlCi0gIFB5Qnl0ZXNfRnJvbUZvcm1hdD1weXRob24zNS5QeUJ5dGVzX0Zyb21Gb3JtYXQKLSAgUHlCeXRlc19Gcm9tRm9ybWF0Vj1weXRob24zNS5QeUJ5dGVzX0Zyb21Gb3JtYXRWCi0gIFB5Qnl0ZXNfRnJvbU9iamVjdD1weXRob24zNS5QeUJ5dGVzX0Zyb21PYmplY3QKLSAgUHlCeXRlc19Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbVN0cmluZwotICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlCeXRlc19SZXByPXB5dGhvbjM1LlB5Qnl0ZXNfUmVwcgotICBQeUJ5dGVzX1NpemU9cHl0aG9uMzUuUHlCeXRlc19TaXplCi0gIFB5Qnl0ZXNfVHlwZT1weXRob24zNS5QeUJ5dGVzX1R5cGUgREFUQQotICBQeUNGdW5jdGlvbl9DYWxsPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0NhbGwKLSAgUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdD1weXRob24zNS5QeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0Ci0gIFB5Q0Z1bmN0aW9uX0dldEZsYWdzPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldEZsYWdzCi0gIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uCi0gIFB5Q0Z1bmN0aW9uX0dldFNlbGY9cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0U2VsZgotICBQeUNGdW5jdGlvbl9OZXc9cHl0aG9uMzUuUHlDRnVuY3Rpb25fTmV3Ci0gIFB5Q0Z1bmN0aW9uX05ld0V4PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX05ld0V4Ci0gIFB5Q0Z1bmN0aW9uX1R5cGU9cHl0aG9uMzUuUHlDRnVuY3Rpb25fVHlwZSBEQVRBCi0gIFB5Q2FsbEl0ZXJfTmV3PXB5dGhvbjM1LlB5Q2FsbEl0ZXJfTmV3Ci0gIFB5Q2FsbEl0ZXJfVHlwZT1weXRob24zNS5QeUNhbGxJdGVyX1R5cGUgREFUQQotICBQeUNhbGxhYmxlX0NoZWNrPXB5dGhvbjM1LlB5Q2FsbGFibGVfQ2hlY2sKLSAgUHlDYXBzdWxlX0dldENvbnRleHQ9cHl0aG9uMzUuUHlDYXBzdWxlX0dldENvbnRleHQKLSAgUHlDYXBzdWxlX0dldERlc3RydWN0b3I9cHl0aG9uMzUuUHlDYXBzdWxlX0dldERlc3RydWN0b3IKLSAgUHlDYXBzdWxlX0dldE5hbWU9cHl0aG9uMzUuUHlDYXBzdWxlX0dldE5hbWUKLSAgUHlDYXBzdWxlX0dldFBvaW50ZXI9cHl0aG9uMzUuUHlDYXBzdWxlX0dldFBvaW50ZXIKLSAgUHlDYXBzdWxlX0ltcG9ydD1weXRob24zNS5QeUNhcHN1bGVfSW1wb3J0Ci0gIFB5Q2Fwc3VsZV9Jc1ZhbGlkPXB5dGhvbjM1LlB5Q2Fwc3VsZV9Jc1ZhbGlkCi0gIFB5Q2Fwc3VsZV9OZXc9cHl0aG9uMzUuUHlDYXBzdWxlX05ldwotICBQeUNhcHN1bGVfU2V0Q29udGV4dD1weXRob24zNS5QeUNhcHN1bGVfU2V0Q29udGV4dAotICBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3Rvcj1weXRob24zNS5QeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcgotICBQeUNhcHN1bGVfU2V0TmFtZT1weXRob24zNS5QeUNhcHN1bGVfU2V0TmFtZQotICBQeUNhcHN1bGVfU2V0UG9pbnRlcj1weXRob24zNS5QeUNhcHN1bGVfU2V0UG9pbnRlcgotICBQeUNhcHN1bGVfVHlwZT1weXRob24zNS5QeUNhcHN1bGVfVHlwZSBEQVRBCi0gIFB5Q2xhc3NNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM1LlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlIERBVEEKLSAgUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycwotICBQeUNvZGVjX0RlY29kZT1weXRob24zNS5QeUNvZGVjX0RlY29kZQotICBQeUNvZGVjX0RlY29kZXI9cHl0aG9uMzUuUHlDb2RlY19EZWNvZGVyCi0gIFB5Q29kZWNfRW5jb2RlPXB5dGhvbjM1LlB5Q29kZWNfRW5jb2RlCi0gIFB5Q29kZWNfRW5jb2Rlcj1weXRob24zNS5QeUNvZGVjX0VuY29kZXIKLSAgUHlDb2RlY19JZ25vcmVFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19JZ25vcmVFcnJvcnMKLSAgUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXI9cHl0aG9uMzUuUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIKLSAgUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXI9cHl0aG9uMzUuUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIKLSAgUHlDb2RlY19Lbm93bkVuY29kaW5nPXB5dGhvbjM1LlB5Q29kZWNfS25vd25FbmNvZGluZwotICBQeUNvZGVjX0xvb2t1cEVycm9yPXB5dGhvbjM1LlB5Q29kZWNfTG9va3VwRXJyb3IKLSAgUHlDb2RlY19SZWdpc3Rlcj1weXRob24zNS5QeUNvZGVjX1JlZ2lzdGVyCi0gIFB5Q29kZWNfUmVnaXN0ZXJFcnJvcj1weXRob24zNS5QeUNvZGVjX1JlZ2lzdGVyRXJyb3IKLSAgUHlDb2RlY19SZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfUmVwbGFjZUVycm9ycwotICBQeUNvZGVjX1N0cmVhbVJlYWRlcj1weXRob24zNS5QeUNvZGVjX1N0cmVhbVJlYWRlcgotICBQeUNvZGVjX1N0cmVhbVdyaXRlcj1weXRob24zNS5QeUNvZGVjX1N0cmVhbVdyaXRlcgotICBQeUNvZGVjX1N0cmljdEVycm9ycz1weXRob24zNS5QeUNvZGVjX1N0cmljdEVycm9ycwotICBQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMKLSAgUHlDb21wbGV4X0Zyb21Eb3VibGVzPXB5dGhvbjM1LlB5Q29tcGxleF9Gcm9tRG91YmxlcwotICBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlPXB5dGhvbjM1LlB5Q29tcGxleF9JbWFnQXNEb3VibGUKLSAgUHlDb21wbGV4X1JlYWxBc0RvdWJsZT1weXRob24zNS5QeUNvbXBsZXhfUmVhbEFzRG91YmxlCi0gIFB5Q29tcGxleF9UeXBlPXB5dGhvbjM1LlB5Q29tcGxleF9UeXBlIERBVEEKLSAgUHlEZXNjcl9OZXdDbGFzc01ldGhvZD1weXRob24zNS5QeURlc2NyX05ld0NsYXNzTWV0aG9kCi0gIFB5RGVzY3JfTmV3R2V0U2V0PXB5dGhvbjM1LlB5RGVzY3JfTmV3R2V0U2V0Ci0gIFB5RGVzY3JfTmV3TWVtYmVyPXB5dGhvbjM1LlB5RGVzY3JfTmV3TWVtYmVyCi0gIFB5RGVzY3JfTmV3TWV0aG9kPXB5dGhvbjM1LlB5RGVzY3JfTmV3TWV0aG9kCi0gIFB5RGljdEl0ZW1zX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlbXNfVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJJdGVtX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlckl0ZW1fVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJLZXlfVHlwZT1weXRob24zNS5QeURpY3RJdGVyS2V5X1R5cGUgREFUQQotICBQeURpY3RJdGVyVmFsdWVfVHlwZT1weXRob24zNS5QeURpY3RJdGVyVmFsdWVfVHlwZSBEQVRBCi0gIFB5RGljdEtleXNfVHlwZT1weXRob24zNS5QeURpY3RLZXlzX1R5cGUgREFUQQotICBQeURpY3RQcm94eV9OZXc9cHl0aG9uMzUuUHlEaWN0UHJveHlfTmV3Ci0gIFB5RGljdFByb3h5X1R5cGU9cHl0aG9uMzUuUHlEaWN0UHJveHlfVHlwZSBEQVRBCi0gIFB5RGljdFZhbHVlc19UeXBlPXB5dGhvbjM1LlB5RGljdFZhbHVlc19UeXBlIERBVEEKLSAgUHlEaWN0X0NsZWFyPXB5dGhvbjM1LlB5RGljdF9DbGVhcgotICBQeURpY3RfQ29udGFpbnM9cHl0aG9uMzUuUHlEaWN0X0NvbnRhaW5zCi0gIFB5RGljdF9Db3B5PXB5dGhvbjM1LlB5RGljdF9Db3B5Ci0gIFB5RGljdF9EZWxJdGVtPXB5dGhvbjM1LlB5RGljdF9EZWxJdGVtCi0gIFB5RGljdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9EZWxJdGVtU3RyaW5nCi0gIFB5RGljdF9HZXRJdGVtPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtCi0gIFB5RGljdF9HZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtU3RyaW5nCi0gIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtV2l0aEVycm9yCi0gIFB5RGljdF9JdGVtcz1weXRob24zNS5QeURpY3RfSXRlbXMKLSAgUHlEaWN0X0tleXM9cHl0aG9uMzUuUHlEaWN0X0tleXMKLSAgUHlEaWN0X01lcmdlPXB5dGhvbjM1LlB5RGljdF9NZXJnZQotICBQeURpY3RfTWVyZ2VGcm9tU2VxMj1weXRob24zNS5QeURpY3RfTWVyZ2VGcm9tU2VxMgotICBQeURpY3RfTmV3PXB5dGhvbjM1LlB5RGljdF9OZXcKLSAgUHlEaWN0X05leHQ9cHl0aG9uMzUuUHlEaWN0X05leHQKLSAgUHlEaWN0X1NldEl0ZW09cHl0aG9uMzUuUHlEaWN0X1NldEl0ZW0KLSAgUHlEaWN0X1NldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X1NldEl0ZW1TdHJpbmcKLSAgUHlEaWN0X1NpemU9cHl0aG9uMzUuUHlEaWN0X1NpemUKLSAgUHlEaWN0X1R5cGU9cHl0aG9uMzUuUHlEaWN0X1R5cGUgREFUQQotICBQeURpY3RfVXBkYXRlPXB5dGhvbjM1LlB5RGljdF9VcGRhdGUKLSAgUHlEaWN0X1ZhbHVlcz1weXRob24zNS5QeURpY3RfVmFsdWVzCi0gIFB5RWxsaXBzaXNfVHlwZT1weXRob24zNS5QeUVsbGlwc2lzX1R5cGUgREFUQQotICBQeUVudW1fVHlwZT1weXRob24zNS5QeUVudW1fVHlwZSBEQVRBCi0gIFB5RXJyX0JhZEFyZ3VtZW50PXB5dGhvbjM1LlB5RXJyX0JhZEFyZ3VtZW50Ci0gIFB5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNS5QeUVycl9CYWRJbnRlcm5hbENhbGwKLSAgUHlFcnJfQ2hlY2tTaWduYWxzPXB5dGhvbjM1LlB5RXJyX0NoZWNrU2lnbmFscwotICBQeUVycl9DbGVhcj1weXRob24zNS5QeUVycl9DbGVhcgotICBQeUVycl9EaXNwbGF5PXB5dGhvbjM1LlB5RXJyX0Rpc3BsYXkKLSAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNS5QeUVycl9FeGNlcHRpb25NYXRjaGVzCi0gIFB5RXJyX0ZldGNoPXB5dGhvbjM1LlB5RXJyX0ZldGNoCi0gIFB5RXJyX0Zvcm1hdD1weXRob24zNS5QeUVycl9Gb3JtYXQKLSAgUHlFcnJfRm9ybWF0Vj1weXRob24zNS5QeUVycl9Gb3JtYXRWCi0gIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNS5QeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMKLSAgUHlFcnJfTmV3RXhjZXB0aW9uPXB5dGhvbjM1LlB5RXJyX05ld0V4Y2VwdGlvbgotICBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jPXB5dGhvbjM1LlB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MKLSAgUHlFcnJfTm9NZW1vcnk9cHl0aG9uMzUuUHlFcnJfTm9NZW1vcnkKLSAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbgotICBQeUVycl9PY2N1cnJlZD1weXRob24zNS5QeUVycl9PY2N1cnJlZAotICBQeUVycl9QcmludD1weXRob24zNS5QeUVycl9QcmludAotICBQeUVycl9QcmludEV4PXB5dGhvbjM1LlB5RXJyX1ByaW50RXgKLSAgUHlFcnJfUHJvZ3JhbVRleHQ9cHl0aG9uMzUuUHlFcnJfUHJvZ3JhbVRleHQKLSAgUHlFcnJfUmVzdG9yZT1weXRob24zNS5QeUVycl9SZXN0b3JlCi0gIFB5RXJyX1NldEZyb21FcnJubz1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm8KLSAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lPXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZQotICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3Q9cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0Ci0gIFB5RXJyX1NldEludGVycnVwdD1weXRob24zNS5QeUVycl9TZXRJbnRlcnJ1cHQKLSAgUHlFcnJfU2V0Tm9uZT1weXRob24zNS5QeUVycl9TZXROb25lCi0gIFB5RXJyX1NldE9iamVjdD1weXRob24zNS5QeUVycl9TZXRPYmplY3QKLSAgUHlFcnJfU2V0U3RyaW5nPXB5dGhvbjM1LlB5RXJyX1NldFN0cmluZwotICBQeUVycl9TeW50YXhMb2NhdGlvbj1weXRob24zNS5QeUVycl9TeW50YXhMb2NhdGlvbgotICBQeUVycl9XYXJuRXg9cHl0aG9uMzUuUHlFcnJfV2FybkV4Ci0gIFB5RXJyX1dhcm5FeHBsaWNpdD1weXRob24zNS5QeUVycl9XYXJuRXhwbGljaXQKLSAgUHlFcnJfV2FybkZvcm1hdD1weXRob24zNS5QeUVycl9XYXJuRm9ybWF0Ci0gIFB5RXJyX1dyaXRlVW5yYWlzYWJsZT1weXRob24zNS5QeUVycl9Xcml0ZVVucmFpc2FibGUKLSAgUHlFdmFsX0FjcXVpcmVMb2NrPXB5dGhvbjM1LlB5RXZhbF9BY3F1aXJlTG9jawotICBQeUV2YWxfQWNxdWlyZVRocmVhZD1weXRob24zNS5QeUV2YWxfQWNxdWlyZVRocmVhZAotICBQeUV2YWxfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM1LlB5RXZhbF9DYWxsRnVuY3Rpb24KLSAgUHlFdmFsX0NhbGxNZXRob2Q9cHl0aG9uMzUuUHlFdmFsX0NhbGxNZXRob2QKLSAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHM9cHl0aG9uMzUuUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMKLSAgUHlFdmFsX0V2YWxDb2RlPXB5dGhvbjM1LlB5RXZhbF9FdmFsQ29kZQotICBQeUV2YWxfRXZhbENvZGVFeD1weXRob24zNS5QeUV2YWxfRXZhbENvZGVFeAotICBQeUV2YWxfRXZhbEZyYW1lPXB5dGhvbjM1LlB5RXZhbF9FdmFsRnJhbWUKLSAgUHlFdmFsX0V2YWxGcmFtZUV4PXB5dGhvbjM1LlB5RXZhbF9FdmFsRnJhbWVFeAotICBQeUV2YWxfR2V0QnVpbHRpbnM9cHl0aG9uMzUuUHlFdmFsX0dldEJ1aWx0aW5zCi0gIFB5RXZhbF9HZXRDYWxsU3RhdHM9cHl0aG9uMzUuUHlFdmFsX0dldENhbGxTdGF0cwotICBQeUV2YWxfR2V0RnJhbWU9cHl0aG9uMzUuUHlFdmFsX0dldEZyYW1lCi0gIFB5RXZhbF9HZXRGdW5jRGVzYz1weXRob24zNS5QeUV2YWxfR2V0RnVuY0Rlc2MKLSAgUHlFdmFsX0dldEZ1bmNOYW1lPXB5dGhvbjM1LlB5RXZhbF9HZXRGdW5jTmFtZQotICBQeUV2YWxfR2V0R2xvYmFscz1weXRob24zNS5QeUV2YWxfR2V0R2xvYmFscwotICBQeUV2YWxfR2V0TG9jYWxzPXB5dGhvbjM1LlB5RXZhbF9HZXRMb2NhbHMKLSAgUHlFdmFsX0luaXRUaHJlYWRzPXB5dGhvbjM1LlB5RXZhbF9Jbml0VGhyZWFkcwotICBQeUV2YWxfUmVJbml0VGhyZWFkcz1weXRob24zNS5QeUV2YWxfUmVJbml0VGhyZWFkcwotICBQeUV2YWxfUmVsZWFzZUxvY2s9cHl0aG9uMzUuUHlFdmFsX1JlbGVhc2VMb2NrCi0gIFB5RXZhbF9SZWxlYXNlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9SZWxlYXNlVGhyZWFkCi0gIFB5RXZhbF9SZXN0b3JlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9SZXN0b3JlVGhyZWFkCi0gIFB5RXZhbF9TYXZlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9TYXZlVGhyZWFkCi0gIFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQ9cHl0aG9uMzUuUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZAotICBQeUV4Y19Bcml0aG1ldGljRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXJpdGhtZXRpY0Vycm9yIERBVEEKLSAgUHlFeGNfQXNzZXJ0aW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXNzZXJ0aW9uRXJyb3IgREFUQQotICBQeUV4Y19BdHRyaWJ1dGVFcnJvcj1weXRob24zNS5QeUV4Y19BdHRyaWJ1dGVFcnJvciBEQVRBCi0gIFB5RXhjX0Jhc2VFeGNlcHRpb249cHl0aG9uMzUuUHlFeGNfQmFzZUV4Y2VwdGlvbiBEQVRBCi0gIFB5RXhjX0J1ZmZlckVycm9yPXB5dGhvbjM1LlB5RXhjX0J1ZmZlckVycm9yIERBVEEKLSAgUHlFeGNfQnl0ZXNXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0J5dGVzV2FybmluZyBEQVRBCi0gIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNS5QeUV4Y19EZXByZWNhdGlvbldhcm5pbmcgREFUQQotICBQeUV4Y19FT0ZFcnJvcj1weXRob24zNS5QeUV4Y19FT0ZFcnJvciBEQVRBCi0gIFB5RXhjX0Vudmlyb25tZW50RXJyb3I9cHl0aG9uMzUuUHlFeGNfRW52aXJvbm1lbnRFcnJvciBEQVRBCi0gIFB5RXhjX0V4Y2VwdGlvbj1weXRob24zNS5QeUV4Y19FeGNlcHRpb24gREFUQQotICBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I9cHl0aG9uMzUuUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIERBVEEKLSAgUHlFeGNfRnV0dXJlV2FybmluZz1weXRob24zNS5QeUV4Y19GdXR1cmVXYXJuaW5nIERBVEEKLSAgUHlFeGNfR2VuZXJhdG9yRXhpdD1weXRob24zNS5QeUV4Y19HZW5lcmF0b3JFeGl0IERBVEEKLSAgUHlFeGNfSU9FcnJvcj1weXRob24zNS5QeUV4Y19JT0Vycm9yIERBVEEKLSAgUHlFeGNfSW1wb3J0RXJyb3I9cHl0aG9uMzUuUHlFeGNfSW1wb3J0RXJyb3IgREFUQQotICBQeUV4Y19JbXBvcnRXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0ltcG9ydFdhcm5pbmcgREFUQQotICBQeUV4Y19JbmRlbnRhdGlvbkVycm9yPXB5dGhvbjM1LlB5RXhjX0luZGVudGF0aW9uRXJyb3IgREFUQQotICBQeUV4Y19JbmRleEVycm9yPXB5dGhvbjM1LlB5RXhjX0luZGV4RXJyb3IgREFUQQotICBQeUV4Y19LZXlFcnJvcj1weXRob24zNS5QeUV4Y19LZXlFcnJvciBEQVRBCi0gIFB5RXhjX0tleWJvYXJkSW50ZXJydXB0PXB5dGhvbjM1LlB5RXhjX0tleWJvYXJkSW50ZXJydXB0IERBVEEKLSAgUHlFeGNfTG9va3VwRXJyb3I9cHl0aG9uMzUuUHlFeGNfTG9va3VwRXJyb3IgREFUQQotICBQeUV4Y19NZW1vcnlFcnJvcj1weXRob24zNS5QeUV4Y19NZW1vcnlFcnJvciBEQVRBCi0gIFB5RXhjX01lbW9yeUVycm9ySW5zdD1weXRob24zNS5QeUV4Y19NZW1vcnlFcnJvckluc3QgREFUQQotICBQeUV4Y19OYW1lRXJyb3I9cHl0aG9uMzUuUHlFeGNfTmFtZUVycm9yIERBVEEKLSAgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcj1weXRob24zNS5QeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yIERBVEEKLSAgUHlFeGNfT1NFcnJvcj1weXRob24zNS5QeUV4Y19PU0Vycm9yIERBVEEKLSAgUHlFeGNfT3ZlcmZsb3dFcnJvcj1weXRob24zNS5QeUV4Y19PdmVyZmxvd0Vycm9yIERBVEEKLSAgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNS5QeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKLSAgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0PXB5dGhvbjM1LlB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdCBEQVRBCi0gIFB5RXhjX1JlZmVyZW5jZUVycm9yPXB5dGhvbjM1LlB5RXhjX1JlZmVyZW5jZUVycm9yIERBVEEKLSAgUHlFeGNfUnVudGltZUVycm9yPXB5dGhvbjM1LlB5RXhjX1J1bnRpbWVFcnJvciBEQVRBCi0gIFB5RXhjX1J1bnRpbWVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1J1bnRpbWVXYXJuaW5nIERBVEEKLSAgUHlFeGNfU3RvcEl0ZXJhdGlvbj1weXRob24zNS5QeUV4Y19TdG9wSXRlcmF0aW9uIERBVEEKLSAgUHlFeGNfU3ludGF4RXJyb3I9cHl0aG9uMzUuUHlFeGNfU3ludGF4RXJyb3IgREFUQQotICBQeUV4Y19TeW50YXhXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1N5bnRheFdhcm5pbmcgREFUQQotICBQeUV4Y19TeXN0ZW1FcnJvcj1weXRob24zNS5QeUV4Y19TeXN0ZW1FcnJvciBEQVRBCi0gIFB5RXhjX1N5c3RlbUV4aXQ9cHl0aG9uMzUuUHlFeGNfU3lzdGVtRXhpdCBEQVRBCi0gIFB5RXhjX1RhYkVycm9yPXB5dGhvbjM1LlB5RXhjX1RhYkVycm9yIERBVEEKLSAgUHlFeGNfVHlwZUVycm9yPXB5dGhvbjM1LlB5RXhjX1R5cGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yPXB5dGhvbjM1LlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZURlY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVXYXJuaW5nIERBVEEKLSAgUHlFeGNfVXNlcldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfVXNlcldhcm5pbmcgREFUQQotICBQeUV4Y19WYWx1ZUVycm9yPXB5dGhvbjM1LlB5RXhjX1ZhbHVlRXJyb3IgREFUQQotICBQeUV4Y19XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1dhcm5pbmcgREFUQQotICBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcj1weXRob24zNS5QeUV4Y19aZXJvRGl2aXNpb25FcnJvciBEQVRBCi0gIFB5RXhjZXB0aW9uX0dldENhdXNlPXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldENhdXNlCi0gIFB5RXhjZXB0aW9uX0dldENvbnRleHQ9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0Q29udGV4dAotICBQeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2s9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrCi0gIFB5RXhjZXB0aW9uX1NldENhdXNlPXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldENhdXNlCi0gIFB5RXhjZXB0aW9uX1NldENvbnRleHQ9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0Q29udGV4dAotICBQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2s9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrCi0gIFB5RmlsZV9Gcm9tRmQ9cHl0aG9uMzUuUHlGaWxlX0Zyb21GZAotICBQeUZpbGVfR2V0TGluZT1weXRob24zNS5QeUZpbGVfR2V0TGluZQotICBQeUZpbGVfV3JpdGVPYmplY3Q9cHl0aG9uMzUuUHlGaWxlX1dyaXRlT2JqZWN0Ci0gIFB5RmlsZV9Xcml0ZVN0cmluZz1weXRob24zNS5QeUZpbGVfV3JpdGVTdHJpbmcKLSAgUHlGaWx0ZXJfVHlwZT1weXRob24zNS5QeUZpbHRlcl9UeXBlIERBVEEKLSAgUHlGbG9hdF9Bc0RvdWJsZT1weXRob24zNS5QeUZsb2F0X0FzRG91YmxlCi0gIFB5RmxvYXRfRnJvbURvdWJsZT1weXRob24zNS5QeUZsb2F0X0Zyb21Eb3VibGUKLSAgUHlGbG9hdF9Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5RmxvYXRfRnJvbVN0cmluZwotICBQeUZsb2F0X0dldEluZm89cHl0aG9uMzUuUHlGbG9hdF9HZXRJbmZvCi0gIFB5RmxvYXRfR2V0TWF4PXB5dGhvbjM1LlB5RmxvYXRfR2V0TWF4Ci0gIFB5RmxvYXRfR2V0TWluPXB5dGhvbjM1LlB5RmxvYXRfR2V0TWluCi0gIFB5RmxvYXRfVHlwZT1weXRob24zNS5QeUZsb2F0X1R5cGUgREFUQQotICBQeUZyb3plblNldF9OZXc9cHl0aG9uMzUuUHlGcm96ZW5TZXRfTmV3Ci0gIFB5RnJvemVuU2V0X1R5cGU9cHl0aG9uMzUuUHlGcm96ZW5TZXRfVHlwZSBEQVRBCi0gIFB5R0NfQ29sbGVjdD1weXRob24zNS5QeUdDX0NvbGxlY3QKLSAgUHlHSUxTdGF0ZV9FbnN1cmU9cHl0aG9uMzUuUHlHSUxTdGF0ZV9FbnN1cmUKLSAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGU9cHl0aG9uMzUuUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUKLSAgUHlHSUxTdGF0ZV9SZWxlYXNlPXB5dGhvbjM1LlB5R0lMU3RhdGVfUmVsZWFzZQotICBQeUdldFNldERlc2NyX1R5cGU9cHl0aG9uMzUuUHlHZXRTZXREZXNjcl9UeXBlIERBVEEKLSAgUHlJbXBvcnRfQWRkTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0FkZE1vZHVsZQotICBQeUltcG9ydF9BcHBlbmRJbml0dGFiPXB5dGhvbjM1LlB5SW1wb3J0X0FwcGVuZEluaXR0YWIKLSAgUHlJbXBvcnRfQ2xlYW51cD1weXRob24zNS5QeUltcG9ydF9DbGVhbnVwCi0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlCi0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXg9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeAotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXM9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzCi0gIFB5SW1wb3J0X0dldEltcG9ydGVyPXB5dGhvbjM1LlB5SW1wb3J0X0dldEltcG9ydGVyCi0gIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyPXB5dGhvbjM1LlB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyCi0gIFB5SW1wb3J0X0dldE1hZ2ljVGFnPXB5dGhvbjM1LlB5SW1wb3J0X0dldE1hZ2ljVGFnCi0gIFB5SW1wb3J0X0dldE1vZHVsZURpY3Q9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TW9kdWxlRGljdAotICBQeUltcG9ydF9JbXBvcnQ9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0Ci0gIFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZT1weXRob24zNS5QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZQotICBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbD1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbAotICBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2sKLSAgUHlJbXBvcnRfUmVsb2FkTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X1JlbG9hZE1vZHVsZQotICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXI9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZQotICBQeUludGVycHJldGVyU3RhdGVfTmV3PXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcKLSAgUHlJdGVyX05leHQ9cHl0aG9uMzUuUHlJdGVyX05leHQKLSAgUHlMaXN0SXRlcl9UeXBlPXB5dGhvbjM1LlB5TGlzdEl0ZXJfVHlwZSBEQVRBCi0gIFB5TGlzdFJldkl0ZXJfVHlwZT1weXRob24zNS5QeUxpc3RSZXZJdGVyX1R5cGUgREFUQQotICBQeUxpc3RfQXBwZW5kPXB5dGhvbjM1LlB5TGlzdF9BcHBlbmQKLSAgUHlMaXN0X0FzVHVwbGU9cHl0aG9uMzUuUHlMaXN0X0FzVHVwbGUKLSAgUHlMaXN0X0dldEl0ZW09cHl0aG9uMzUuUHlMaXN0X0dldEl0ZW0KLSAgUHlMaXN0X0dldFNsaWNlPXB5dGhvbjM1LlB5TGlzdF9HZXRTbGljZQotICBQeUxpc3RfSW5zZXJ0PXB5dGhvbjM1LlB5TGlzdF9JbnNlcnQKLSAgUHlMaXN0X05ldz1weXRob24zNS5QeUxpc3RfTmV3Ci0gIFB5TGlzdF9SZXZlcnNlPXB5dGhvbjM1LlB5TGlzdF9SZXZlcnNlCi0gIFB5TGlzdF9TZXRJdGVtPXB5dGhvbjM1LlB5TGlzdF9TZXRJdGVtCi0gIFB5TGlzdF9TZXRTbGljZT1weXRob24zNS5QeUxpc3RfU2V0U2xpY2UKLSAgUHlMaXN0X1NpemU9cHl0aG9uMzUuUHlMaXN0X1NpemUKLSAgUHlMaXN0X1NvcnQ9cHl0aG9uMzUuUHlMaXN0X1NvcnQKLSAgUHlMaXN0X1R5cGU9cHl0aG9uMzUuUHlMaXN0X1R5cGUgREFUQQotICBQeUxvbmdSYW5nZUl0ZXJfVHlwZT1weXRob24zNS5QeUxvbmdSYW5nZUl0ZXJfVHlwZSBEQVRBCi0gIFB5TG9uZ19Bc0RvdWJsZT1weXRob24zNS5QeUxvbmdfQXNEb3VibGUKLSAgUHlMb25nX0FzTG9uZz1weXRob24zNS5QeUxvbmdfQXNMb25nCi0gIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdz1weXRob24zNS5QeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cKLSAgUHlMb25nX0FzTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0xvbmcKLSAgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdz1weXRob24zNS5QeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93Ci0gIFB5TG9uZ19Bc1NpemVfdD1weXRob24zNS5QeUxvbmdfQXNTaXplX3QKLSAgUHlMb25nX0FzU3NpemVfdD1weXRob24zNS5QeUxvbmdfQXNTc2l6ZV90Ci0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmcKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2s9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTWFzawotICBQeUxvbmdfQXNWb2lkUHRyPXB5dGhvbjM1LlB5TG9uZ19Bc1ZvaWRQdHIKLSAgUHlMb25nX0Zyb21Eb3VibGU9cHl0aG9uMzUuUHlMb25nX0Zyb21Eb3VibGUKLSAgUHlMb25nX0Zyb21Mb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tTG9uZwotICBQeUxvbmdfRnJvbUxvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tTG9uZ0xvbmcKLSAgUHlMb25nX0Zyb21TaXplX3Q9cHl0aG9uMzUuUHlMb25nX0Zyb21TaXplX3QKLSAgUHlMb25nX0Zyb21Tc2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Gcm9tU3NpemVfdAotICBQeUxvbmdfRnJvbVN0cmluZz1weXRob24zNS5QeUxvbmdfRnJvbVN0cmluZwotICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZwotICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCi0gIFB5TG9uZ19Gcm9tVm9pZFB0cj1weXRob24zNS5QeUxvbmdfRnJvbVZvaWRQdHIKLSAgUHlMb25nX0dldEluZm89cHl0aG9uMzUuUHlMb25nX0dldEluZm8KLSAgUHlMb25nX1R5cGU9cHl0aG9uMzUuUHlMb25nX1R5cGUgREFUQQotICBQeU1hcF9UeXBlPXB5dGhvbjM1LlB5TWFwX1R5cGUgREFUQQotICBQeU1hcHBpbmdfQ2hlY2s9cHl0aG9uMzUuUHlNYXBwaW5nX0NoZWNrCi0gIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19HZXRJdGVtU3RyaW5nCi0gIFB5TWFwcGluZ19IYXNLZXk9cHl0aG9uMzUuUHlNYXBwaW5nX0hhc0tleQotICBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19IYXNLZXlTdHJpbmcKLSAgUHlNYXBwaW5nX0l0ZW1zPXB5dGhvbjM1LlB5TWFwcGluZ19JdGVtcwotICBQeU1hcHBpbmdfS2V5cz1weXRob24zNS5QeU1hcHBpbmdfS2V5cwotICBQeU1hcHBpbmdfTGVuZ3RoPXB5dGhvbjM1LlB5TWFwcGluZ19MZW5ndGgKLSAgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcKLSAgUHlNYXBwaW5nX1NpemU9cHl0aG9uMzUuUHlNYXBwaW5nX1NpemUKLSAgUHlNYXBwaW5nX1ZhbHVlcz1weXRob24zNS5QeU1hcHBpbmdfVmFsdWVzCi0gIFB5TWVtX0ZyZWU9cHl0aG9uMzUuUHlNZW1fRnJlZQotICBQeU1lbV9NYWxsb2M9cHl0aG9uMzUuUHlNZW1fTWFsbG9jCi0gIFB5TWVtX1JlYWxsb2M9cHl0aG9uMzUuUHlNZW1fUmVhbGxvYwotICBQeU1lbWJlckRlc2NyX1R5cGU9cHl0aG9uMzUuUHlNZW1iZXJEZXNjcl9UeXBlIERBVEEKLSAgUHlNZW1vcnlWaWV3X0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QKLSAgUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXM9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXMKLSAgUHlNZW1vcnlWaWV3X1R5cGU9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X1R5cGUgREFUQQotICBQeU1ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzUuUHlNZXRob2REZXNjcl9UeXBlIERBVEEKLSAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQ9cHl0aG9uMzUuUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQKLSAgUHlNb2R1bGVfQWRkT2JqZWN0PXB5dGhvbjM1LlB5TW9kdWxlX0FkZE9iamVjdAotICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudD1weXRob24zNS5QeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudAotICBQeU1vZHVsZV9DcmVhdGUyPXB5dGhvbjM1LlB5TW9kdWxlX0NyZWF0ZTIKLSAgUHlNb2R1bGVfR2V0RGVmPXB5dGhvbjM1LlB5TW9kdWxlX0dldERlZgotICBQeU1vZHVsZV9HZXREaWN0PXB5dGhvbjM1LlB5TW9kdWxlX0dldERpY3QKLSAgUHlNb2R1bGVfR2V0RmlsZW5hbWU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RmlsZW5hbWUKLSAgUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3Q9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3QKLSAgUHlNb2R1bGVfR2V0TmFtZT1weXRob24zNS5QeU1vZHVsZV9HZXROYW1lCi0gIFB5TW9kdWxlX0dldFN0YXRlPXB5dGhvbjM1LlB5TW9kdWxlX0dldFN0YXRlCi0gIFB5TW9kdWxlX05ldz1weXRob24zNS5QeU1vZHVsZV9OZXcKLSAgUHlNb2R1bGVfVHlwZT1weXRob24zNS5QeU1vZHVsZV9UeXBlIERBVEEKLSAgUHlNb2R1bGVEZWZfSW5pdD1weXRob24zNS5QeU1vZHVsZURlZl9Jbml0Ci0gIFB5TW9kdWxlRGVmX1R5cGU9cHl0aG9uMzUuUHlNb2R1bGVEZWZfVHlwZSBEQVRBCi0gIFB5TnVsbEltcG9ydGVyX1R5cGU9cHl0aG9uMzUuUHlOdWxsSW1wb3J0ZXJfVHlwZSBEQVRBCi0gIFB5TnVtYmVyX0Fic29sdXRlPXB5dGhvbjM1LlB5TnVtYmVyX0Fic29sdXRlCi0gIFB5TnVtYmVyX0FkZD1weXRob24zNS5QeU51bWJlcl9BZGQKLSAgUHlOdW1iZXJfQW5kPXB5dGhvbjM1LlB5TnVtYmVyX0FuZAotICBQeU51bWJlcl9Bc1NzaXplX3Q9cHl0aG9uMzUuUHlOdW1iZXJfQXNTc2l6ZV90Ci0gIFB5TnVtYmVyX0NoZWNrPXB5dGhvbjM1LlB5TnVtYmVyX0NoZWNrCi0gIFB5TnVtYmVyX0Rpdm1vZD1weXRob24zNS5QeU51bWJlcl9EaXZtb2QKLSAgUHlOdW1iZXJfRmxvYXQ9cHl0aG9uMzUuUHlOdW1iZXJfRmxvYXQKLSAgUHlOdW1iZXJfRmxvb3JEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfRmxvb3JEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZUFkZD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlQWRkCi0gIFB5TnVtYmVyX0luUGxhY2VBbmQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUFuZAotICBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUxzaGlmdAotICBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHk9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5Ci0gIFB5TnVtYmVyX0luUGxhY2VPcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlT3IKLSAgUHlOdW1iZXJfSW5QbGFjZVBvd2VyPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VQb3dlcgotICBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIKLSAgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUnNoaWZ0Ci0gIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlU3VidHJhY3QKLSAgUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZVhvcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlWG9yCi0gIFB5TnVtYmVyX0luZGV4PXB5dGhvbjM1LlB5TnVtYmVyX0luZGV4Ci0gIFB5TnVtYmVyX0ludmVydD1weXRob24zNS5QeU51bWJlcl9JbnZlcnQKLSAgUHlOdW1iZXJfTG9uZz1weXRob24zNS5QeU51bWJlcl9Mb25nCi0gIFB5TnVtYmVyX0xzaGlmdD1weXRob24zNS5QeU51bWJlcl9Mc2hpZnQKLSAgUHlOdW1iZXJfTXVsdGlwbHk9cHl0aG9uMzUuUHlOdW1iZXJfTXVsdGlwbHkKLSAgUHlOdW1iZXJfTmVnYXRpdmU9cHl0aG9uMzUuUHlOdW1iZXJfTmVnYXRpdmUKLSAgUHlOdW1iZXJfT3I9cHl0aG9uMzUuUHlOdW1iZXJfT3IKLSAgUHlOdW1iZXJfUG9zaXRpdmU9cHl0aG9uMzUuUHlOdW1iZXJfUG9zaXRpdmUKLSAgUHlOdW1iZXJfUG93ZXI9cHl0aG9uMzUuUHlOdW1iZXJfUG93ZXIKLSAgUHlOdW1iZXJfUmVtYWluZGVyPXB5dGhvbjM1LlB5TnVtYmVyX1JlbWFpbmRlcgotICBQeU51bWJlcl9Sc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfUnNoaWZ0Ci0gIFB5TnVtYmVyX1N1YnRyYWN0PXB5dGhvbjM1LlB5TnVtYmVyX1N1YnRyYWN0Ci0gIFB5TnVtYmVyX1RvQmFzZT1weXRob24zNS5QeU51bWJlcl9Ub0Jhc2UKLSAgUHlOdW1iZXJfVHJ1ZURpdmlkZT1weXRob24zNS5QeU51bWJlcl9UcnVlRGl2aWRlCi0gIFB5TnVtYmVyX1hvcj1weXRob24zNS5QeU51bWJlcl9Yb3IKLSAgUHlPU19BZnRlckZvcms9cHl0aG9uMzUuUHlPU19BZnRlckZvcmsKLSAgUHlPU19Jbml0SW50ZXJydXB0cz1weXRob24zNS5QeU9TX0luaXRJbnRlcnJ1cHRzCi0gIFB5T1NfSW5wdXRIb29rPXB5dGhvbjM1LlB5T1NfSW5wdXRIb29rIERBVEEKLSAgUHlPU19JbnRlcnJ1cHRPY2N1cnJlZD1weXRob24zNS5QeU9TX0ludGVycnVwdE9jY3VycmVkCi0gIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXI9cHl0aG9uMzUuUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciBEQVRBCi0gIFB5T1NfZG91YmxlX3RvX3N0cmluZz1weXRob24zNS5QeU9TX2RvdWJsZV90b19zdHJpbmcKLSAgUHlPU19nZXRzaWc9cHl0aG9uMzUuUHlPU19nZXRzaWcKLSAgUHlPU19teXN0cmljbXA9cHl0aG9uMzUuUHlPU19teXN0cmljbXAKLSAgUHlPU19teXN0cm5pY21wPXB5dGhvbjM1LlB5T1NfbXlzdHJuaWNtcAotICBQeU9TX3NldHNpZz1weXRob24zNS5QeU9TX3NldHNpZwotICBQeU9TX3NucHJpbnRmPXB5dGhvbjM1LlB5T1Nfc25wcmludGYKLSAgUHlPU19zdHJpbmdfdG9fZG91YmxlPXB5dGhvbjM1LlB5T1Nfc3RyaW5nX3RvX2RvdWJsZQotICBQeU9TX3N0cnRvbD1weXRob24zNS5QeU9TX3N0cnRvbAotICBQeU9TX3N0cnRvdWw9cHl0aG9uMzUuUHlPU19zdHJ0b3VsCi0gIFB5T1NfdnNucHJpbnRmPXB5dGhvbjM1LlB5T1NfdnNucHJpbnRmCi0gIFB5T2JqZWN0X0FTQ0lJPXB5dGhvbjM1LlB5T2JqZWN0X0FTQ0lJCi0gIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc0NoYXJCdWZmZXIKLSAgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcj1weXRob24zNS5QeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yCi0gIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc1JlYWRCdWZmZXIKLSAgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc1dyaXRlQnVmZmVyCi0gIFB5T2JqZWN0X0J5dGVzPXB5dGhvbjM1LlB5T2JqZWN0X0J5dGVzCi0gIFB5T2JqZWN0X0NhbGw9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbAotICBQeU9iamVjdF9DYWxsRnVuY3Rpb249cHl0aG9uMzUuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uCi0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncwotICBQeU9iamVjdF9DYWxsTWV0aG9kPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxNZXRob2QKLSAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MKLSAgUHlPYmplY3RfQ2FsbE9iamVjdD1weXRob24zNS5QeU9iamVjdF9DYWxsT2JqZWN0Ci0gIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9DaGVja1JlYWRCdWZmZXIKLSAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcz1weXRob24zNS5QeU9iamVjdF9DbGVhcldlYWtSZWZzCi0gIFB5T2JqZWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfRGVsSXRlbQotICBQeU9iamVjdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcKLSAgUHlPYmplY3RfRGlyPXB5dGhvbjM1LlB5T2JqZWN0X0RpcgotICBQeU9iamVjdF9Gb3JtYXQ9cHl0aG9uMzUuUHlPYmplY3RfRm9ybWF0Ci0gIFB5T2JqZWN0X0ZyZWU9cHl0aG9uMzUuUHlPYmplY3RfRnJlZQotICBQeU9iamVjdF9HQ19EZWw9cHl0aG9uMzUuUHlPYmplY3RfR0NfRGVsCi0gIFB5T2JqZWN0X0dDX1RyYWNrPXB5dGhvbjM1LlB5T2JqZWN0X0dDX1RyYWNrCi0gIFB5T2JqZWN0X0dDX1VuVHJhY2s9cHl0aG9uMzUuUHlPYmplY3RfR0NfVW5UcmFjawotICBQeU9iamVjdF9HZW5lcmljR2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZW5lcmljR2V0QXR0cgotICBQeU9iamVjdF9HZW5lcmljU2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZW5lcmljU2V0QXR0cgotICBQeU9iamVjdF9HZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dldEF0dHIKLSAgUHlPYmplY3RfR2V0QXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9HZXRBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X0dldEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfR2V0SXRlbQotICBQeU9iamVjdF9HZXRJdGVyPXB5dGhvbjM1LlB5T2JqZWN0X0dldEl0ZXIKLSAgUHlPYmplY3RfSGFzQXR0cj1weXRob24zNS5QeU9iamVjdF9IYXNBdHRyCi0gIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfSGFzQXR0clN0cmluZwotICBQeU9iamVjdF9IYXNoPXB5dGhvbjM1LlB5T2JqZWN0X0hhc2gKLSAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkPXB5dGhvbjM1LlB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZAotICBQeU9iamVjdF9Jbml0PXB5dGhvbjM1LlB5T2JqZWN0X0luaXQKLSAgUHlPYmplY3RfSW5pdFZhcj1weXRob24zNS5QeU9iamVjdF9Jbml0VmFyCi0gIFB5T2JqZWN0X0lzSW5zdGFuY2U9cHl0aG9uMzUuUHlPYmplY3RfSXNJbnN0YW5jZQotICBQeU9iamVjdF9Jc1N1YmNsYXNzPXB5dGhvbjM1LlB5T2JqZWN0X0lzU3ViY2xhc3MKLSAgUHlPYmplY3RfSXNUcnVlPXB5dGhvbjM1LlB5T2JqZWN0X0lzVHJ1ZQotICBQeU9iamVjdF9MZW5ndGg9cHl0aG9uMzUuUHlPYmplY3RfTGVuZ3RoCi0gIFB5T2JqZWN0X01hbGxvYz1weXRob24zNS5QeU9iamVjdF9NYWxsb2MKLSAgUHlPYmplY3RfTm90PXB5dGhvbjM1LlB5T2JqZWN0X05vdAotICBQeU9iamVjdF9SZWFsbG9jPXB5dGhvbjM1LlB5T2JqZWN0X1JlYWxsb2MKLSAgUHlPYmplY3RfUmVwcj1weXRob24zNS5QeU9iamVjdF9SZXByCi0gIFB5T2JqZWN0X1JpY2hDb21wYXJlPXB5dGhvbjM1LlB5T2JqZWN0X1JpY2hDb21wYXJlCi0gIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbD1weXRob24zNS5QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wKLSAgUHlPYmplY3RfU2VsZkl0ZXI9cHl0aG9uMzUuUHlPYmplY3RfU2VsZkl0ZXIKLSAgUHlPYmplY3RfU2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9TZXRBdHRyCi0gIFB5T2JqZWN0X1NldEF0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfU2V0QXR0clN0cmluZwotICBQeU9iamVjdF9TZXRJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X1NldEl0ZW0KLSAgUHlPYmplY3RfU2l6ZT1weXRob24zNS5QeU9iamVjdF9TaXplCi0gIFB5T2JqZWN0X1N0cj1weXRob24zNS5QeU9iamVjdF9TdHIKLSAgUHlPYmplY3RfVHlwZT1weXRob24zNS5QeU9iamVjdF9UeXBlIERBVEEKLSAgUHlPRGljdF9EZWxJdGVtPXB5dGhvbjM1LlB5T0RpY3RfRGVsSXRlbQotICBQeU9EaWN0X05ldz1weXRob24zNS5QeU9EaWN0X05ldwotICBQeU9EaWN0X1NldEl0ZW09cHl0aG9uMzUuUHlPRGljdF9TZXRJdGVtCi0gIFB5T0RpY3RfVHlwZT1weXRob24zNS5QeU9EaWN0X1R5cGUgREFUQQotICBQeU9EaWN0SXRlbXNfVHlwZT1weXRob24zNS5QeU9EaWN0SXRlbXNfVHlwZSBEQVRBCi0gIFB5T0RpY3RJdGVyX1R5cGU9cHl0aG9uMzUuUHlPRGljdEl0ZXJfVHlwZSBEQVRBCi0gIFB5T0RpY3RLZXlzX1R5cGU9cHl0aG9uMzUuUHlPRGljdEtleXNfVHlwZSBEQVRBCi0gIFB5T0RpY3RWYWx1ZXNfVHlwZT1weXRob24zNS5QeU9EaWN0VmFsdWVzX1R5cGUgREFUQQotICBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncz1weXRob24zNS5QeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncwotICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzPXB5dGhvbjM1LlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MKLSAgUHlQcm9wZXJ0eV9UeXBlPXB5dGhvbjM1LlB5UHJvcGVydHlfVHlwZSBEQVRBCi0gIFB5UmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzUuUHlSYW5nZUl0ZXJfVHlwZSBEQVRBCi0gIFB5UmFuZ2VfVHlwZT1weXRob24zNS5QeVJhbmdlX1R5cGUgREFUQQotICBQeVJldmVyc2VkX1R5cGU9cHl0aG9uMzUuUHlSZXZlcnNlZF9UeXBlIERBVEEKLSAgUHlTZXFJdGVyX05ldz1weXRob24zNS5QeVNlcUl0ZXJfTmV3Ci0gIFB5U2VxSXRlcl9UeXBlPXB5dGhvbjM1LlB5U2VxSXRlcl9UeXBlIERBVEEKLSAgUHlTZXF1ZW5jZV9DaGVjaz1weXRob24zNS5QeVNlcXVlbmNlX0NoZWNrCi0gIFB5U2VxdWVuY2VfQ29uY2F0PXB5dGhvbjM1LlB5U2VxdWVuY2VfQ29uY2F0Ci0gIFB5U2VxdWVuY2VfQ29udGFpbnM9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db250YWlucwotICBQeVNlcXVlbmNlX0NvdW50PXB5dGhvbjM1LlB5U2VxdWVuY2VfQ291bnQKLSAgUHlTZXF1ZW5jZV9EZWxJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfRGVsSXRlbQotICBQeVNlcXVlbmNlX0RlbFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfRGVsU2xpY2UKLSAgUHlTZXF1ZW5jZV9GYXN0PXB5dGhvbjM1LlB5U2VxdWVuY2VfRmFzdAotICBQeVNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9HZXRJdGVtCi0gIFB5U2VxdWVuY2VfR2V0U2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9HZXRTbGljZQotICBQeVNlcXVlbmNlX0luPXB5dGhvbjM1LlB5U2VxdWVuY2VfSW4KLSAgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdAotICBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0Ci0gIFB5U2VxdWVuY2VfSW5kZXg9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JbmRleAotICBQeVNlcXVlbmNlX0xlbmd0aD1weXRob24zNS5QeVNlcXVlbmNlX0xlbmd0aAotICBQeVNlcXVlbmNlX0xpc3Q9cHl0aG9uMzUuUHlTZXF1ZW5jZV9MaXN0Ci0gIFB5U2VxdWVuY2VfUmVwZWF0PXB5dGhvbjM1LlB5U2VxdWVuY2VfUmVwZWF0Ci0gIFB5U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNS5QeVNlcXVlbmNlX1NldEl0ZW0KLSAgUHlTZXF1ZW5jZV9TZXRTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX1NldFNsaWNlCi0gIFB5U2VxdWVuY2VfU2l6ZT1weXRob24zNS5QeVNlcXVlbmNlX1NpemUKLSAgUHlTZXF1ZW5jZV9UdXBsZT1weXRob24zNS5QeVNlcXVlbmNlX1R1cGxlCi0gIFB5U2V0SXRlcl9UeXBlPXB5dGhvbjM1LlB5U2V0SXRlcl9UeXBlIERBVEEKLSAgUHlTZXRfQWRkPXB5dGhvbjM1LlB5U2V0X0FkZAotICBQeVNldF9DbGVhcj1weXRob24zNS5QeVNldF9DbGVhcgotICBQeVNldF9Db250YWlucz1weXRob24zNS5QeVNldF9Db250YWlucwotICBQeVNldF9EaXNjYXJkPXB5dGhvbjM1LlB5U2V0X0Rpc2NhcmQKLSAgUHlTZXRfTmV3PXB5dGhvbjM1LlB5U2V0X05ldwotICBQeVNldF9Qb3A9cHl0aG9uMzUuUHlTZXRfUG9wCi0gIFB5U2V0X1NpemU9cHl0aG9uMzUuUHlTZXRfU2l6ZQotICBQeVNldF9UeXBlPXB5dGhvbjM1LlB5U2V0X1R5cGUgREFUQQotICBQeVNsaWNlX0dldEluZGljZXM9cHl0aG9uMzUuUHlTbGljZV9HZXRJbmRpY2VzCi0gIFB5U2xpY2VfR2V0SW5kaWNlc0V4PXB5dGhvbjM1LlB5U2xpY2VfR2V0SW5kaWNlc0V4Ci0gIFB5U2xpY2VfTmV3PXB5dGhvbjM1LlB5U2xpY2VfTmV3Ci0gIFB5U2xpY2VfVHlwZT1weXRob24zNS5QeVNsaWNlX1R5cGUgREFUQQotICBQeVNvcnRXcmFwcGVyX1R5cGU9cHl0aG9uMzUuUHlTb3J0V3JhcHBlcl9UeXBlIERBVEEKLSAgUHlTdGF0ZV9GaW5kTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfRmluZE1vZHVsZQotICBQeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNS5QeVN0YXRlX0FkZE1vZHVsZQotICBQeVN0YXRlX1JlbW92ZU1vZHVsZT1weXRob24zNS5QeVN0YXRlX1JlbW92ZU1vZHVsZQotICBQeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtCi0gIFB5U3RydWN0U2VxdWVuY2VfTmV3PXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfTmV3Ci0gIFB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX05ld1R5cGUKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbQotICBQeVN1cGVyX1R5cGU9cHl0aG9uMzUuUHlTdXBlcl9UeXBlIERBVEEKLSAgUHlTeXNfQWRkV2Fybk9wdGlvbj1weXRob24zNS5QeVN5c19BZGRXYXJuT3B0aW9uCi0gIFB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlPXB5dGhvbjM1LlB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlCi0gIFB5U3lzX0Zvcm1hdFN0ZGVycj1weXRob24zNS5QeVN5c19Gb3JtYXRTdGRlcnIKLSAgUHlTeXNfRm9ybWF0U3Rkb3V0PXB5dGhvbjM1LlB5U3lzX0Zvcm1hdFN0ZG91dAotICBQeVN5c19HZXRPYmplY3Q9cHl0aG9uMzUuUHlTeXNfR2V0T2JqZWN0Ci0gIFB5U3lzX0hhc1dhcm5PcHRpb25zPXB5dGhvbjM1LlB5U3lzX0hhc1dhcm5PcHRpb25zCi0gIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnM9cHl0aG9uMzUuUHlTeXNfUmVzZXRXYXJuT3B0aW9ucwotICBQeVN5c19TZXRBcmd2PXB5dGhvbjM1LlB5U3lzX1NldEFyZ3YKLSAgUHlTeXNfU2V0QXJndkV4PXB5dGhvbjM1LlB5U3lzX1NldEFyZ3ZFeAotICBQeVN5c19TZXRPYmplY3Q9cHl0aG9uMzUuUHlTeXNfU2V0T2JqZWN0Ci0gIFB5U3lzX1NldFBhdGg9cHl0aG9uMzUuUHlTeXNfU2V0UGF0aAotICBQeVN5c19Xcml0ZVN0ZGVycj1weXRob24zNS5QeVN5c19Xcml0ZVN0ZGVycgotICBQeVN5c19Xcml0ZVN0ZG91dD1weXRob24zNS5QeVN5c19Xcml0ZVN0ZG91dAotICBQeVRocmVhZFN0YXRlX0NsZWFyPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfQ2xlYXIKLSAgUHlUaHJlYWRTdGF0ZV9EZWxldGU9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9EZWxldGUKLSAgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudAotICBQeVRocmVhZFN0YXRlX0dldD1weXRob24zNS5QeVRocmVhZFN0YXRlX0dldAotICBQeVRocmVhZFN0YXRlX0dldERpY3Q9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9HZXREaWN0Ci0gIFB5VGhyZWFkU3RhdGVfTmV3PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfTmV3Ci0gIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGM9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YwotICBQeVRocmVhZFN0YXRlX1N3YXA9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9Td2FwCi0gIFB5VHJhY2VCYWNrX0hlcmU9cHl0aG9uMzUuUHlUcmFjZUJhY2tfSGVyZQotICBQeVRyYWNlQmFja19QcmludD1weXRob24zNS5QeVRyYWNlQmFja19QcmludAotICBQeVRyYWNlQmFja19UeXBlPXB5dGhvbjM1LlB5VHJhY2VCYWNrX1R5cGUgREFUQQotICBQeVR1cGxlSXRlcl9UeXBlPXB5dGhvbjM1LlB5VHVwbGVJdGVyX1R5cGUgREFUQQotICBQeVR1cGxlX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzUuUHlUdXBsZV9DbGVhckZyZWVMaXN0Ci0gIFB5VHVwbGVfR2V0SXRlbT1weXRob24zNS5QeVR1cGxlX0dldEl0ZW0KLSAgUHlUdXBsZV9HZXRTbGljZT1weXRob24zNS5QeVR1cGxlX0dldFNsaWNlCi0gIFB5VHVwbGVfTmV3PXB5dGhvbjM1LlB5VHVwbGVfTmV3Ci0gIFB5VHVwbGVfUGFjaz1weXRob24zNS5QeVR1cGxlX1BhY2sKLSAgUHlUdXBsZV9TZXRJdGVtPXB5dGhvbjM1LlB5VHVwbGVfU2V0SXRlbQotICBQeVR1cGxlX1NpemU9cHl0aG9uMzUuUHlUdXBsZV9TaXplCi0gIFB5VHVwbGVfVHlwZT1weXRob24zNS5QeVR1cGxlX1R5cGUgREFUQQotICBQeVR5cGVfQ2xlYXJDYWNoZT1weXRob24zNS5QeVR5cGVfQ2xlYXJDYWNoZQotICBQeVR5cGVfRnJvbVNwZWM9cHl0aG9uMzUuUHlUeXBlX0Zyb21TcGVjCi0gIFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcz1weXRob24zNS5QeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMKLSAgUHlUeXBlX0dlbmVyaWNBbGxvYz1weXRob24zNS5QeVR5cGVfR2VuZXJpY0FsbG9jCi0gIFB5VHlwZV9HZW5lcmljTmV3PXB5dGhvbjM1LlB5VHlwZV9HZW5lcmljTmV3Ci0gIFB5VHlwZV9HZXRGbGFncz1weXRob24zNS5QeVR5cGVfR2V0RmxhZ3MKLSAgUHlUeXBlX0dldFNsb3Q9cHl0aG9uMzUuUHlUeXBlX0dldFNsb3QKLSAgUHlUeXBlX0lzU3VidHlwZT1weXRob24zNS5QeVR5cGVfSXNTdWJ0eXBlCi0gIFB5VHlwZV9Nb2RpZmllZD1weXRob24zNS5QeVR5cGVfTW9kaWZpZWQKLSAgUHlUeXBlX1JlYWR5PXB5dGhvbjM1LlB5VHlwZV9SZWFkeQotICBQeVR5cGVfVHlwZT1weXRob24zNS5QeVR5cGVfVHlwZSBEQVRBCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZT1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2RpbmcKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVJdGVyX1R5cGU9cHl0aG9uMzUuUHlVbmljb2RlSXRlcl9UeXBlIERBVEEKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZV9BcHBlbmQ9cHl0aG9uMzUuUHlVbmljb2RlX0FwcGVuZAotICBQeVVuaWNvZGVfQXBwZW5kQW5kRGVsPXB5dGhvbjM1LlB5VW5pY29kZV9BcHBlbmRBbmREZWwKLSAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcKLSAgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdAotICBQeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZT1weXRob24zNS5QeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZQotICBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlCi0gIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcKLSAgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjE2U3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjMyU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjhTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGOFN0cmluZwotICBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKLSAgUHlVbmljb2RlX0FzV2lkZUNoYXI9cHl0aG9uMzUuUHlVbmljb2RlX0FzV2lkZUNoYXIKLSAgUHlVbmljb2RlX0NsZWFyRnJlZWxpc3Q9cHl0aG9uMzUuUHlVbmljb2RlX0NsZWFyRnJlZWxpc3QKLSAgUHlVbmljb2RlX0NvbXBhcmU9cHl0aG9uMzUuUHlVbmljb2RlX0NvbXBhcmUKLSAgUHlVbmljb2RlX0NvbmNhdD1weXRob24zNS5QeVVuaWNvZGVfQ29uY2F0Ci0gIFB5VW5pY29kZV9Db250YWlucz1weXRob24zNS5QeVVuaWNvZGVfQ29udGFpbnMKLSAgUHlVbmljb2RlX0NvdW50PXB5dGhvbjM1LlB5VW5pY29kZV9Db3VudAotICBQeVVuaWNvZGVfRGVjb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGUKLSAgUHlVbmljb2RlX0RlY29kZUFTQ0lJPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVBU0NJSQotICBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcAotICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQKLSAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUKLSAgUHlVbmljb2RlX0RlY29kZUxhdGluMT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlTGF0aW4xCi0gIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYxNj1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMTYKLSAgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVURjMyPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYzMgotICBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVVRGOD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGOAotICBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUKLSAgUHlVbmljb2RlX0ZTQ29udmVydGVyPXB5dGhvbjM1LlB5VW5pY29kZV9GU0NvbnZlcnRlcgotICBQeVVuaWNvZGVfRlNEZWNvZGVyPXB5dGhvbjM1LlB5VW5pY29kZV9GU0RlY29kZXIKLSAgUHlVbmljb2RlX0ZpbmQ9cHl0aG9uMzUuUHlVbmljb2RlX0ZpbmQKLSAgUHlVbmljb2RlX0Zvcm1hdD1weXRob24zNS5QeVVuaWNvZGVfRm9ybWF0Ci0gIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0Zyb21Gb3JtYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21Gb3JtYXQKLSAgUHlVbmljb2RlX0Zyb21Gb3JtYXRWPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRm9ybWF0VgotICBQeVVuaWNvZGVfRnJvbU9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbU9iamVjdAotICBQeVVuaWNvZGVfRnJvbU9yZGluYWw9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21PcmRpbmFsCi0gIFB5VW5pY29kZV9Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tU3RyaW5nCi0gIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcj1weXRob24zNS5QeVVuaWNvZGVfRnJvbVdpZGVDaGFyCi0gIFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZwotICBQeVVuaWNvZGVfR2V0U2l6ZT1weXRob24zNS5QeVVuaWNvZGVfR2V0U2l6ZQotICBQeVVuaWNvZGVfSXNJZGVudGlmaWVyPXB5dGhvbjM1LlB5VW5pY29kZV9Jc0lkZW50aWZpZXIKLSAgUHlVbmljb2RlX0pvaW49cHl0aG9uMzUuUHlVbmljb2RlX0pvaW4KLSAgUHlVbmljb2RlX1BhcnRpdGlvbj1weXRob24zNS5QeVVuaWNvZGVfUGFydGl0aW9uCi0gIFB5VW5pY29kZV9SUGFydGl0aW9uPXB5dGhvbjM1LlB5VW5pY29kZV9SUGFydGl0aW9uCi0gIFB5VW5pY29kZV9SU3BsaXQ9cHl0aG9uMzUuUHlVbmljb2RlX1JTcGxpdAotICBQeVVuaWNvZGVfUmVwbGFjZT1weXRob24zNS5QeVVuaWNvZGVfUmVwbGFjZQotICBQeVVuaWNvZGVfUmVzaXplPXB5dGhvbjM1LlB5VW5pY29kZV9SZXNpemUKLSAgUHlVbmljb2RlX1JpY2hDb21wYXJlPXB5dGhvbjM1LlB5VW5pY29kZV9SaWNoQ29tcGFyZQotICBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcKLSAgUHlVbmljb2RlX1NwbGl0PXB5dGhvbjM1LlB5VW5pY29kZV9TcGxpdAotICBQeVVuaWNvZGVfU3BsaXRsaW5lcz1weXRob24zNS5QeVVuaWNvZGVfU3BsaXRsaW5lcwotICBQeVVuaWNvZGVfVGFpbG1hdGNoPXB5dGhvbjM1LlB5VW5pY29kZV9UYWlsbWF0Y2gKLSAgUHlVbmljb2RlX1RyYW5zbGF0ZT1weXRob24zNS5QeVVuaWNvZGVfVHJhbnNsYXRlCi0gIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwPXB5dGhvbjM1LlB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwCi0gIFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nCi0gIFB5VW5pY29kZV9EZWNvZGVVVEY3PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY3Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0PXB5dGhvbjM1LlB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQKLSAgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcKLSAgUHlVbmljb2RlX0ludGVybkltbW9ydGFsPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbAotICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZT1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuSW5QbGFjZQotICBQeVVuaWNvZGVfVHlwZT1weXRob24zNS5QeVVuaWNvZGVfVHlwZSBEQVRBCi0gIFB5V2Vha3JlZl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlXZWFrcmVmX0dldE9iamVjdCBEQVRBCi0gIFB5V2Vha3JlZl9OZXdQcm94eT1weXRob24zNS5QeVdlYWtyZWZfTmV3UHJveHkKLSAgUHlXZWFrcmVmX05ld1JlZj1weXRob24zNS5QeVdlYWtyZWZfTmV3UmVmCi0gIFB5V3JhcHBlckRlc2NyX1R5cGU9cHl0aG9uMzUuUHlXcmFwcGVyRGVzY3JfVHlwZSBEQVRBCi0gIFB5V3JhcHBlcl9OZXc9cHl0aG9uMzUuUHlXcmFwcGVyX05ldwotICBQeVppcF9UeXBlPXB5dGhvbjM1LlB5WmlwX1R5cGUgREFUQQotICBQeV9BZGRQZW5kaW5nQ2FsbD1weXRob24zNS5QeV9BZGRQZW5kaW5nQ2FsbAotICBQeV9BdEV4aXQ9cHl0aG9uMzUuUHlfQXRFeGl0Ci0gIFB5X0J1aWxkVmFsdWU9cHl0aG9uMzUuUHlfQnVpbGRWYWx1ZQotICBQeV9Db21waWxlU3RyaW5nPXB5dGhvbjM1LlB5X0NvbXBpbGVTdHJpbmcKLSAgUHlfRGVjUmVmPXB5dGhvbjM1LlB5X0RlY1JlZgotICBQeV9FbmRJbnRlcnByZXRlcj1weXRob24zNS5QeV9FbmRJbnRlcnByZXRlcgotICBQeV9FeGl0PXB5dGhvbjM1LlB5X0V4aXQKLSAgUHlfRmF0YWxFcnJvcj1weXRob24zNS5QeV9GYXRhbEVycm9yCi0gIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCi0gIFB5X0ZpbmFsaXplPXB5dGhvbjM1LlB5X0ZpbmFsaXplCi0gIFB5X0dldEJ1aWxkSW5mbz1weXRob24zNS5QeV9HZXRCdWlsZEluZm8KLSAgUHlfR2V0Q29tcGlsZXI9cHl0aG9uMzUuUHlfR2V0Q29tcGlsZXIKLSAgUHlfR2V0Q29weXJpZ2h0PXB5dGhvbjM1LlB5X0dldENvcHlyaWdodAotICBQeV9HZXRFeGVjUHJlZml4PXB5dGhvbjM1LlB5X0dldEV4ZWNQcmVmaXgKLSAgUHlfR2V0UGF0aD1weXRob24zNS5QeV9HZXRQYXRoCi0gIFB5X0dldFBsYXRmb3JtPXB5dGhvbjM1LlB5X0dldFBsYXRmb3JtCi0gIFB5X0dldFByZWZpeD1weXRob24zNS5QeV9HZXRQcmVmaXgKLSAgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoPXB5dGhvbjM1LlB5X0dldFByb2dyYW1GdWxsUGF0aAotICBQeV9HZXRQcm9ncmFtTmFtZT1weXRob24zNS5QeV9HZXRQcm9ncmFtTmFtZQotICBQeV9HZXRQeXRob25Ib21lPXB5dGhvbjM1LlB5X0dldFB5dGhvbkhvbWUKLSAgUHlfR2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuUHlfR2V0UmVjdXJzaW9uTGltaXQKLSAgUHlfR2V0VmVyc2lvbj1weXRob24zNS5QeV9HZXRWZXJzaW9uCi0gIFB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCi0gIFB5X0luY1JlZj1weXRob24zNS5QeV9JbmNSZWYKLSAgUHlfSW5pdGlhbGl6ZT1weXRob24zNS5QeV9Jbml0aWFsaXplCi0gIFB5X0luaXRpYWxpemVFeD1weXRob24zNS5QeV9Jbml0aWFsaXplRXgKLSAgUHlfSXNJbml0aWFsaXplZD1weXRob24zNS5QeV9Jc0luaXRpYWxpemVkCi0gIFB5X01haW49cHl0aG9uMzUuUHlfTWFpbgotICBQeV9NYWtlUGVuZGluZ0NhbGxzPXB5dGhvbjM1LlB5X01ha2VQZW5kaW5nQ2FsbHMKLSAgUHlfTmV3SW50ZXJwcmV0ZXI9cHl0aG9uMzUuUHlfTmV3SW50ZXJwcmV0ZXIKLSAgUHlfUmVwckVudGVyPXB5dGhvbjM1LlB5X1JlcHJFbnRlcgotICBQeV9SZXByTGVhdmU9cHl0aG9uMzUuUHlfUmVwckxlYXZlCi0gIFB5X1NldFByb2dyYW1OYW1lPXB5dGhvbjM1LlB5X1NldFByb2dyYW1OYW1lCi0gIFB5X1NldFB5dGhvbkhvbWU9cHl0aG9uMzUuUHlfU2V0UHl0aG9uSG9tZQotICBQeV9TZXRSZWN1cnNpb25MaW1pdD1weXRob24zNS5QeV9TZXRSZWN1cnNpb25MaW1pdAotICBQeV9TeW10YWJsZVN0cmluZz1weXRob24zNS5QeV9TeW10YWJsZVN0cmluZwotICBQeV9WYUJ1aWxkVmFsdWU9cHl0aG9uMzUuUHlfVmFCdWlsZFZhbHVlCi0gIF9QeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzUuX1B5RXJyX0JhZEludGVybmFsQ2FsbAotICBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUPXB5dGhvbjM1Ll9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKLSAgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQ9cHl0aG9uMzUuX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQKLSAgX1B5T2JqZWN0X0dDX01hbGxvYz1weXRob24zNS5fUHlPYmplY3RfR0NfTWFsbG9jCi0gIF9QeU9iamVjdF9HQ19OZXc9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX05ldwotICBfUHlPYmplY3RfR0NfTmV3VmFyPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19OZXdWYXIKLSAgX1B5T2JqZWN0X0dDX1Jlc2l6ZT1weXRob24zNS5fUHlPYmplY3RfR0NfUmVzaXplCi0gIF9QeU9iamVjdF9OZXc9cHl0aG9uMzUuX1B5T2JqZWN0X05ldwotICBfUHlPYmplY3RfTmV3VmFyPXB5dGhvbjM1Ll9QeU9iamVjdF9OZXdWYXIKLSAgX1B5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM1Ll9QeVN0YXRlX0FkZE1vZHVsZQotICBfUHlUaHJlYWRTdGF0ZV9Jbml0PXB5dGhvbjM1Ll9QeVRocmVhZFN0YXRlX0luaXQKLSAgX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2M9cHl0aG9uMzUuX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MKLSAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyPXB5dGhvbjM1Ll9QeVRyYXNoX2RlbGV0ZV9sYXRlciBEQVRBCi0gIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nPXB5dGhvbjM1Ll9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIERBVEEKLSAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3Q9cHl0aG9uMzUuX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QKLSAgX1B5VHJhc2hfZGVzdHJveV9jaGFpbj1weXRob24zNS5fUHlUcmFzaF9kZXN0cm95X2NoYWluCi0gIF9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSBEQVRBCi0gIF9QeVdlYWtyZWZfUHJveHlUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfUHJveHlUeXBlIERBVEEKLSAgX1B5V2Vha3JlZl9SZWZUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfUmVmVHlwZSBEQVRBCi0gIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9CdWlsZFZhbHVlX1NpemVUCi0gIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1Ll9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0IERBVEEKLSAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbD1weXRob24zNS5fUHlfQ2hlY2tSZWN1cnNpdmVDYWxsCi0gIF9QeV9EZWFsbG9jPXB5dGhvbjM1Ll9QeV9EZWFsbG9jCi0gIF9QeV9FbGxpcHNpc09iamVjdD1weXRob24zNS5fUHlfRWxsaXBzaXNPYmplY3QgREFUQQotICBfUHlfRmFsc2VTdHJ1Y3Q9cHl0aG9uMzUuX1B5X0ZhbHNlU3RydWN0IERBVEEKLSAgX1B5X05vbmVTdHJ1Y3Q9cHl0aG9uMzUuX1B5X05vbmVTdHJ1Y3QgREFUQQotICBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3Q9cHl0aG9uMzUuX1B5X05vdEltcGxlbWVudGVkU3RydWN0IERBVEEKLSAgX1B5X1N3YXBwZWRPcD1weXRob24zNS5fUHlfU3dhcHBlZE9wIERBVEEKLSAgX1B5X1RydWVTdHJ1Y3Q9cHl0aG9uMzUuX1B5X1RydWVTdHJ1Y3QgREFUQQotICBfUHlfVmFCdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZV9TaXplVAotICBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VUdXBsZV9TaXplVAotICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKLSAgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1ZhUGFyc2VfU2l6ZVQKLSAgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAotICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfQnVpbGRWYWx1ZV9TaXplVAorICBQeUFyZ19QYXJzZT1weXRob24zNi5QeUFyZ19QYXJzZQorICBQeUFyZ19QYXJzZVR1cGxlPXB5dGhvbjM2LlB5QXJnX1BhcnNlVHVwbGUKKyAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM2LlB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcworICBQeUFyZ19VbnBhY2tUdXBsZT1weXRob24zNi5QeUFyZ19VbnBhY2tUdXBsZQorICBQeUFyZ19WYVBhcnNlPXB5dGhvbjM2LlB5QXJnX1ZhUGFyc2UKKyAgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzYuUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMKKyAgUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzPXB5dGhvbjM2LlB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cworICBQeUJhc2VPYmplY3RfVHlwZT1weXRob24zNi5QeUJhc2VPYmplY3RfVHlwZSBEQVRBCisgIFB5Qm9vbF9Gcm9tTG9uZz1weXRob24zNi5QeUJvb2xfRnJvbUxvbmcKKyAgUHlCb29sX1R5cGU9cHl0aG9uMzYuUHlCb29sX1R5cGUgREFUQQorICBQeUJ5dGVBcnJheUl0ZXJfVHlwZT1weXRob24zNi5QeUJ5dGVBcnJheUl0ZXJfVHlwZSBEQVRBCisgIFB5Qnl0ZUFycmF5X0FzU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0FzU3RyaW5nCisgIFB5Qnl0ZUFycmF5X0NvbmNhdD1weXRob24zNi5QeUJ5dGVBcnJheV9Db25jYXQKKyAgUHlCeXRlQXJyYXlfRnJvbU9iamVjdD1weXRob24zNi5QeUJ5dGVBcnJheV9Gcm9tT2JqZWN0CisgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplCisgIFB5Qnl0ZUFycmF5X1Jlc2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9SZXNpemUKKyAgUHlCeXRlQXJyYXlfU2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9TaXplCisgIFB5Qnl0ZUFycmF5X1R5cGU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfVHlwZSBEQVRBCisgIFB5Qnl0ZXNJdGVyX1R5cGU9cHl0aG9uMzYuUHlCeXRlc0l0ZXJfVHlwZSBEQVRBCisgIFB5Qnl0ZXNfQXNTdHJpbmc9cHl0aG9uMzYuUHlCeXRlc19Bc1N0cmluZworICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVzX0NvbmNhdD1weXRob24zNi5QeUJ5dGVzX0NvbmNhdAorICBQeUJ5dGVzX0NvbmNhdEFuZERlbD1weXRob24zNi5QeUJ5dGVzX0NvbmNhdEFuZERlbAorICBQeUJ5dGVzX0RlY29kZUVzY2FwZT1weXRob24zNi5QeUJ5dGVzX0RlY29kZUVzY2FwZQorICBQeUJ5dGVzX0Zyb21Gb3JtYXQ9cHl0aG9uMzYuUHlCeXRlc19Gcm9tRm9ybWF0CisgIFB5Qnl0ZXNfRnJvbUZvcm1hdFY9cHl0aG9uMzYuUHlCeXRlc19Gcm9tRm9ybWF0VgorICBQeUJ5dGVzX0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlCeXRlc19Gcm9tT2JqZWN0CisgIFB5Qnl0ZXNfRnJvbVN0cmluZz1weXRob24zNi5QeUJ5dGVzX0Zyb21TdHJpbmcKKyAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCisgIFB5Qnl0ZXNfUmVwcj1weXRob24zNi5QeUJ5dGVzX1JlcHIKKyAgUHlCeXRlc19TaXplPXB5dGhvbjM2LlB5Qnl0ZXNfU2l6ZQorICBQeUJ5dGVzX1R5cGU9cHl0aG9uMzYuUHlCeXRlc19UeXBlIERBVEEKKyAgUHlDRnVuY3Rpb25fQ2FsbD1weXRob24zNi5QeUNGdW5jdGlvbl9DYWxsCisgIFB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzYuUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdAorICBQeUNGdW5jdGlvbl9HZXRGbGFncz1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRGbGFncworICBQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbj1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRGdW5jdGlvbgorICBQeUNGdW5jdGlvbl9HZXRTZWxmPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldFNlbGYKKyAgUHlDRnVuY3Rpb25fTmV3PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX05ldworICBQeUNGdW5jdGlvbl9OZXdFeD1weXRob24zNi5QeUNGdW5jdGlvbl9OZXdFeAorICBQeUNGdW5jdGlvbl9UeXBlPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX1R5cGUgREFUQQorICBQeUNhbGxJdGVyX05ldz1weXRob24zNi5QeUNhbGxJdGVyX05ldworICBQeUNhbGxJdGVyX1R5cGU9cHl0aG9uMzYuUHlDYWxsSXRlcl9UeXBlIERBVEEKKyAgUHlDYWxsYWJsZV9DaGVjaz1weXRob24zNi5QeUNhbGxhYmxlX0NoZWNrCisgIFB5Q2Fwc3VsZV9HZXRDb250ZXh0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXRDb250ZXh0CisgIFB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yCisgIFB5Q2Fwc3VsZV9HZXROYW1lPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXROYW1lCisgIFB5Q2Fwc3VsZV9HZXRQb2ludGVyPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXRQb2ludGVyCisgIFB5Q2Fwc3VsZV9JbXBvcnQ9cHl0aG9uMzYuUHlDYXBzdWxlX0ltcG9ydAorICBQeUNhcHN1bGVfSXNWYWxpZD1weXRob24zNi5QeUNhcHN1bGVfSXNWYWxpZAorICBQeUNhcHN1bGVfTmV3PXB5dGhvbjM2LlB5Q2Fwc3VsZV9OZXcKKyAgUHlDYXBzdWxlX1NldENvbnRleHQ9cHl0aG9uMzYuUHlDYXBzdWxlX1NldENvbnRleHQKKyAgUHlDYXBzdWxlX1NldERlc3RydWN0b3I9cHl0aG9uMzYuUHlDYXBzdWxlX1NldERlc3RydWN0b3IKKyAgUHlDYXBzdWxlX1NldE5hbWU9cHl0aG9uMzYuUHlDYXBzdWxlX1NldE5hbWUKKyAgUHlDYXBzdWxlX1NldFBvaW50ZXI9cHl0aG9uMzYuUHlDYXBzdWxlX1NldFBvaW50ZXIKKyAgUHlDYXBzdWxlX1R5cGU9cHl0aG9uMzYuUHlDYXBzdWxlX1R5cGUgREFUQQorICBQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZT1weXRob24zNi5QeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSBEQVRBCisgIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnMKKyAgUHlDb2RlY19EZWNvZGU9cHl0aG9uMzYuUHlDb2RlY19EZWNvZGUKKyAgUHlDb2RlY19EZWNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfRGVjb2RlcgorICBQeUNvZGVjX0VuY29kZT1weXRob24zNi5QeUNvZGVjX0VuY29kZQorICBQeUNvZGVjX0VuY29kZXI9cHl0aG9uMzYuUHlDb2RlY19FbmNvZGVyCisgIFB5Q29kZWNfSWdub3JlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfSWdub3JlRXJyb3JzCisgIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyCisgIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyCisgIFB5Q29kZWNfS25vd25FbmNvZGluZz1weXRob24zNi5QeUNvZGVjX0tub3duRW5jb2RpbmcKKyAgUHlDb2RlY19Mb29rdXBFcnJvcj1weXRob24zNi5QeUNvZGVjX0xvb2t1cEVycm9yCisgIFB5Q29kZWNfUmVnaXN0ZXI9cHl0aG9uMzYuUHlDb2RlY19SZWdpc3RlcgorICBQeUNvZGVjX1JlZ2lzdGVyRXJyb3I9cHl0aG9uMzYuUHlDb2RlY19SZWdpc3RlckVycm9yCisgIFB5Q29kZWNfUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX1JlcGxhY2VFcnJvcnMKKyAgUHlDb2RlY19TdHJlYW1SZWFkZXI9cHl0aG9uMzYuUHlDb2RlY19TdHJlYW1SZWFkZXIKKyAgUHlDb2RlY19TdHJlYW1Xcml0ZXI9cHl0aG9uMzYuUHlDb2RlY19TdHJlYW1Xcml0ZXIKKyAgUHlDb2RlY19TdHJpY3RFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19TdHJpY3RFcnJvcnMKKyAgUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzCisgIFB5Q29tcGxleF9Gcm9tRG91Ymxlcz1weXRob24zNi5QeUNvbXBsZXhfRnJvbURvdWJsZXMKKyAgUHlDb21wbGV4X0ltYWdBc0RvdWJsZT1weXRob24zNi5QeUNvbXBsZXhfSW1hZ0FzRG91YmxlCisgIFB5Q29tcGxleF9SZWFsQXNEb3VibGU9cHl0aG9uMzYuUHlDb21wbGV4X1JlYWxBc0RvdWJsZQorICBQeUNvbXBsZXhfVHlwZT1weXRob24zNi5QeUNvbXBsZXhfVHlwZSBEQVRBCisgIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q9cHl0aG9uMzYuUHlEZXNjcl9OZXdDbGFzc01ldGhvZAorICBQeURlc2NyX05ld0dldFNldD1weXRob24zNi5QeURlc2NyX05ld0dldFNldAorICBQeURlc2NyX05ld01lbWJlcj1weXRob24zNi5QeURlc2NyX05ld01lbWJlcgorICBQeURlc2NyX05ld01ldGhvZD1weXRob24zNi5QeURlc2NyX05ld01ldGhvZAorICBQeURpY3RJdGVtc19UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZW1zX1R5cGUgREFUQQorICBQeURpY3RJdGVySXRlbV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJJdGVtX1R5cGUgREFUQQorICBQeURpY3RJdGVyS2V5X1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlcktleV9UeXBlIERBVEEKKyAgUHlEaWN0SXRlclZhbHVlX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlclZhbHVlX1R5cGUgREFUQQorICBQeURpY3RLZXlzX1R5cGU9cHl0aG9uMzYuUHlEaWN0S2V5c19UeXBlIERBVEEKKyAgUHlEaWN0UHJveHlfTmV3PXB5dGhvbjM2LlB5RGljdFByb3h5X05ldworICBQeURpY3RQcm94eV9UeXBlPXB5dGhvbjM2LlB5RGljdFByb3h5X1R5cGUgREFUQQorICBQeURpY3RWYWx1ZXNfVHlwZT1weXRob24zNi5QeURpY3RWYWx1ZXNfVHlwZSBEQVRBCisgIFB5RGljdF9DbGVhcj1weXRob24zNi5QeURpY3RfQ2xlYXIKKyAgUHlEaWN0X0NvbnRhaW5zPXB5dGhvbjM2LlB5RGljdF9Db250YWlucworICBQeURpY3RfQ29weT1weXRob24zNi5QeURpY3RfQ29weQorICBQeURpY3RfRGVsSXRlbT1weXRob24zNi5QeURpY3RfRGVsSXRlbQorICBQeURpY3RfRGVsSXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfRGVsSXRlbVN0cmluZworICBQeURpY3RfR2V0SXRlbT1weXRob24zNi5QeURpY3RfR2V0SXRlbQorICBQeURpY3RfR2V0SXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfR2V0SXRlbVN0cmluZworICBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcj1weXRob24zNi5QeURpY3RfR2V0SXRlbVdpdGhFcnJvcgorICBQeURpY3RfSXRlbXM9cHl0aG9uMzYuUHlEaWN0X0l0ZW1zCisgIFB5RGljdF9LZXlzPXB5dGhvbjM2LlB5RGljdF9LZXlzCisgIFB5RGljdF9NZXJnZT1weXRob24zNi5QeURpY3RfTWVyZ2UKKyAgUHlEaWN0X01lcmdlRnJvbVNlcTI9cHl0aG9uMzYuUHlEaWN0X01lcmdlRnJvbVNlcTIKKyAgUHlEaWN0X05ldz1weXRob24zNi5QeURpY3RfTmV3CisgIFB5RGljdF9OZXh0PXB5dGhvbjM2LlB5RGljdF9OZXh0CisgIFB5RGljdF9TZXRJdGVtPXB5dGhvbjM2LlB5RGljdF9TZXRJdGVtCisgIFB5RGljdF9TZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9TZXRJdGVtU3RyaW5nCisgIFB5RGljdF9TaXplPXB5dGhvbjM2LlB5RGljdF9TaXplCisgIFB5RGljdF9UeXBlPXB5dGhvbjM2LlB5RGljdF9UeXBlIERBVEEKKyAgUHlEaWN0X1VwZGF0ZT1weXRob24zNi5QeURpY3RfVXBkYXRlCisgIFB5RGljdF9WYWx1ZXM9cHl0aG9uMzYuUHlEaWN0X1ZhbHVlcworICBQeUVsbGlwc2lzX1R5cGU9cHl0aG9uMzYuUHlFbGxpcHNpc19UeXBlIERBVEEKKyAgUHlFbnVtX1R5cGU9cHl0aG9uMzYuUHlFbnVtX1R5cGUgREFUQQorICBQeUVycl9CYWRBcmd1bWVudD1weXRob24zNi5QeUVycl9CYWRBcmd1bWVudAorICBQeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzYuUHlFcnJfQmFkSW50ZXJuYWxDYWxsCisgIFB5RXJyX0NoZWNrU2lnbmFscz1weXRob24zNi5QeUVycl9DaGVja1NpZ25hbHMKKyAgUHlFcnJfQ2xlYXI9cHl0aG9uMzYuUHlFcnJfQ2xlYXIKKyAgUHlFcnJfRGlzcGxheT1weXRob24zNi5QeUVycl9EaXNwbGF5CisgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzYuUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcworICBQeUVycl9GZXRjaD1weXRob24zNi5QeUVycl9GZXRjaAorICBQeUVycl9Gb3JtYXQ9cHl0aG9uMzYuUHlFcnJfRm9ybWF0CisgIFB5RXJyX0Zvcm1hdFY9cHl0aG9uMzYuUHlFcnJfRm9ybWF0VgorICBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzYuUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzCisgIFB5RXJyX05ld0V4Y2VwdGlvbj1weXRob24zNi5QeUVycl9OZXdFeGNlcHRpb24KKyAgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYz1weXRob24zNi5QeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jCisgIFB5RXJyX05vTWVtb3J5PXB5dGhvbjM2LlB5RXJyX05vTWVtb3J5CisgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbj1weXRob24zNi5QeUVycl9Ob3JtYWxpemVFeGNlcHRpb24KKyAgUHlFcnJfT2NjdXJyZWQ9cHl0aG9uMzYuUHlFcnJfT2NjdXJyZWQKKyAgUHlFcnJfUHJpbnQ9cHl0aG9uMzYuUHlFcnJfUHJpbnQKKyAgUHlFcnJfUHJpbnRFeD1weXRob24zNi5QeUVycl9QcmludEV4CisgIFB5RXJyX1Byb2dyYW1UZXh0PXB5dGhvbjM2LlB5RXJyX1Byb2dyYW1UZXh0CisgIFB5RXJyX1Jlc3RvcmU9cHl0aG9uMzYuUHlFcnJfUmVzdG9yZQorICBQeUVycl9TZXRGcm9tRXJybm89cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vCisgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZT1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUKKyAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdAorICBQeUVycl9TZXRJbnRlcnJ1cHQ9cHl0aG9uMzYuUHlFcnJfU2V0SW50ZXJydXB0CisgIFB5RXJyX1NldE5vbmU9cHl0aG9uMzYuUHlFcnJfU2V0Tm9uZQorICBQeUVycl9TZXRPYmplY3Q9cHl0aG9uMzYuUHlFcnJfU2V0T2JqZWN0CisgIFB5RXJyX1NldFN0cmluZz1weXRob24zNi5QeUVycl9TZXRTdHJpbmcKKyAgUHlFcnJfU3ludGF4TG9jYXRpb249cHl0aG9uMzYuUHlFcnJfU3ludGF4TG9jYXRpb24KKyAgUHlFcnJfV2FybkV4PXB5dGhvbjM2LlB5RXJyX1dhcm5FeAorICBQeUVycl9XYXJuRXhwbGljaXQ9cHl0aG9uMzYuUHlFcnJfV2FybkV4cGxpY2l0CisgIFB5RXJyX1dhcm5Gb3JtYXQ9cHl0aG9uMzYuUHlFcnJfV2FybkZvcm1hdAorICBQeUVycl9Xcml0ZVVucmFpc2FibGU9cHl0aG9uMzYuUHlFcnJfV3JpdGVVbnJhaXNhYmxlCisgIFB5RXZhbF9BY3F1aXJlTG9jaz1weXRob24zNi5QeUV2YWxfQWNxdWlyZUxvY2sKKyAgUHlFdmFsX0FjcXVpcmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX0FjcXVpcmVUaHJlYWQKKyAgUHlFdmFsX0NhbGxGdW5jdGlvbj1weXRob24zNi5QeUV2YWxfQ2FsbEZ1bmN0aW9uCisgIFB5RXZhbF9DYWxsTWV0aG9kPXB5dGhvbjM2LlB5RXZhbF9DYWxsTWV0aG9kCisgIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzPXB5dGhvbjM2LlB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzCisgIFB5RXZhbF9FdmFsQ29kZT1weXRob24zNi5QeUV2YWxfRXZhbENvZGUKKyAgUHlFdmFsX0V2YWxDb2RlRXg9cHl0aG9uMzYuUHlFdmFsX0V2YWxDb2RlRXgKKyAgUHlFdmFsX0V2YWxGcmFtZT1weXRob24zNi5QeUV2YWxfRXZhbEZyYW1lCisgIFB5RXZhbF9FdmFsRnJhbWVFeD1weXRob24zNi5QeUV2YWxfRXZhbEZyYW1lRXgKKyAgUHlFdmFsX0dldEJ1aWx0aW5zPXB5dGhvbjM2LlB5RXZhbF9HZXRCdWlsdGlucworICBQeUV2YWxfR2V0Q2FsbFN0YXRzPXB5dGhvbjM2LlB5RXZhbF9HZXRDYWxsU3RhdHMKKyAgUHlFdmFsX0dldEZyYW1lPXB5dGhvbjM2LlB5RXZhbF9HZXRGcmFtZQorICBQeUV2YWxfR2V0RnVuY0Rlc2M9cHl0aG9uMzYuUHlFdmFsX0dldEZ1bmNEZXNjCisgIFB5RXZhbF9HZXRGdW5jTmFtZT1weXRob24zNi5QeUV2YWxfR2V0RnVuY05hbWUKKyAgUHlFdmFsX0dldEdsb2JhbHM9cHl0aG9uMzYuUHlFdmFsX0dldEdsb2JhbHMKKyAgUHlFdmFsX0dldExvY2Fscz1weXRob24zNi5QeUV2YWxfR2V0TG9jYWxzCisgIFB5RXZhbF9Jbml0VGhyZWFkcz1weXRob24zNi5QeUV2YWxfSW5pdFRocmVhZHMKKyAgUHlFdmFsX1JlSW5pdFRocmVhZHM9cHl0aG9uMzYuUHlFdmFsX1JlSW5pdFRocmVhZHMKKyAgUHlFdmFsX1JlbGVhc2VMb2NrPXB5dGhvbjM2LlB5RXZhbF9SZWxlYXNlTG9jaworICBQeUV2YWxfUmVsZWFzZVRocmVhZD1weXRob24zNi5QeUV2YWxfUmVsZWFzZVRocmVhZAorICBQeUV2YWxfUmVzdG9yZVRocmVhZD1weXRob24zNi5QeUV2YWxfUmVzdG9yZVRocmVhZAorICBQeUV2YWxfU2F2ZVRocmVhZD1weXRob24zNi5QeUV2YWxfU2F2ZVRocmVhZAorICBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkPXB5dGhvbjM2LlB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQKKyAgUHlFeGNfQXJpdGhtZXRpY0Vycm9yPXB5dGhvbjM2LlB5RXhjX0FyaXRobWV0aWNFcnJvciBEQVRBCisgIFB5RXhjX0Fzc2VydGlvbkVycm9yPXB5dGhvbjM2LlB5RXhjX0Fzc2VydGlvbkVycm9yIERBVEEKKyAgUHlFeGNfQXR0cmlidXRlRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXR0cmlidXRlRXJyb3IgREFUQQorICBQeUV4Y19CYXNlRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXhjX0Jhc2VFeGNlcHRpb24gREFUQQorICBQeUV4Y19CdWZmZXJFcnJvcj1weXRob24zNi5QeUV4Y19CdWZmZXJFcnJvciBEQVRBCisgIFB5RXhjX0J5dGVzV2FybmluZz1weXRob24zNi5QeUV4Y19CeXRlc1dhcm5pbmcgREFUQQorICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKKyAgUHlFeGNfRU9GRXJyb3I9cHl0aG9uMzYuUHlFeGNfRU9GRXJyb3IgREFUQQorICBQeUV4Y19FbnZpcm9ubWVudEVycm9yPXB5dGhvbjM2LlB5RXhjX0Vudmlyb25tZW50RXJyb3IgREFUQQorICBQeUV4Y19FeGNlcHRpb249cHl0aG9uMzYuUHlFeGNfRXhjZXB0aW9uIERBVEEKKyAgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yPXB5dGhvbjM2LlB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvciBEQVRBCisgIFB5RXhjX0Z1dHVyZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfRnV0dXJlV2FybmluZyBEQVRBCisgIFB5RXhjX0dlbmVyYXRvckV4aXQ9cHl0aG9uMzYuUHlFeGNfR2VuZXJhdG9yRXhpdCBEQVRBCisgIFB5RXhjX0lPRXJyb3I9cHl0aG9uMzYuUHlFeGNfSU9FcnJvciBEQVRBCisgIFB5RXhjX0ltcG9ydEVycm9yPXB5dGhvbjM2LlB5RXhjX0ltcG9ydEVycm9yIERBVEEKKyAgUHlFeGNfSW1wb3J0V2FybmluZz1weXRob24zNi5QeUV4Y19JbXBvcnRXYXJuaW5nIERBVEEKKyAgUHlFeGNfSW5kZW50YXRpb25FcnJvcj1weXRob24zNi5QeUV4Y19JbmRlbnRhdGlvbkVycm9yIERBVEEKKyAgUHlFeGNfSW5kZXhFcnJvcj1weXRob24zNi5QeUV4Y19JbmRleEVycm9yIERBVEEKKyAgUHlFeGNfS2V5RXJyb3I9cHl0aG9uMzYuUHlFeGNfS2V5RXJyb3IgREFUQQorICBQeUV4Y19LZXlib2FyZEludGVycnVwdD1weXRob24zNi5QeUV4Y19LZXlib2FyZEludGVycnVwdCBEQVRBCisgIFB5RXhjX0xvb2t1cEVycm9yPXB5dGhvbjM2LlB5RXhjX0xvb2t1cEVycm9yIERBVEEKKyAgUHlFeGNfTWVtb3J5RXJyb3I9cHl0aG9uMzYuUHlFeGNfTWVtb3J5RXJyb3IgREFUQQorICBQeUV4Y19NZW1vcnlFcnJvckluc3Q9cHl0aG9uMzYuUHlFeGNfTWVtb3J5RXJyb3JJbnN0IERBVEEKKyAgUHlFeGNfTmFtZUVycm9yPXB5dGhvbjM2LlB5RXhjX05hbWVFcnJvciBEQVRBCisgIFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I9cHl0aG9uMzYuUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciBEQVRBCisgIFB5RXhjX09TRXJyb3I9cHl0aG9uMzYuUHlFeGNfT1NFcnJvciBEQVRBCisgIFB5RXhjX092ZXJmbG93RXJyb3I9cHl0aG9uMzYuUHlFeGNfT3ZlcmZsb3dFcnJvciBEQVRBCisgIFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCisgIFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdD1weXRob24zNi5QeUV4Y19SZWN1cnNpb25FcnJvckluc3QgREFUQQorICBQeUV4Y19SZWZlcmVuY2VFcnJvcj1weXRob24zNi5QeUV4Y19SZWZlcmVuY2VFcnJvciBEQVRBCisgIFB5RXhjX1J1bnRpbWVFcnJvcj1weXRob24zNi5QeUV4Y19SdW50aW1lRXJyb3IgREFUQQorICBQeUV4Y19SdW50aW1lV2FybmluZz1weXRob24zNi5QeUV4Y19SdW50aW1lV2FybmluZyBEQVRBCisgIFB5RXhjX1N0b3BJdGVyYXRpb249cHl0aG9uMzYuUHlFeGNfU3RvcEl0ZXJhdGlvbiBEQVRBCisgIFB5RXhjX1N5bnRheEVycm9yPXB5dGhvbjM2LlB5RXhjX1N5bnRheEVycm9yIERBVEEKKyAgUHlFeGNfU3ludGF4V2FybmluZz1weXRob24zNi5QeUV4Y19TeW50YXhXYXJuaW5nIERBVEEKKyAgUHlFeGNfU3lzdGVtRXJyb3I9cHl0aG9uMzYuUHlFeGNfU3lzdGVtRXJyb3IgREFUQQorICBQeUV4Y19TeXN0ZW1FeGl0PXB5dGhvbjM2LlB5RXhjX1N5c3RlbUV4aXQgREFUQQorICBQeUV4Y19UYWJFcnJvcj1weXRob24zNi5QeUV4Y19UYWJFcnJvciBEQVRBCisgIFB5RXhjX1R5cGVFcnJvcj1weXRob24zNi5QeUV4Y19UeXBlRXJyb3IgREFUQQorICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvcj1weXRob24zNi5QeUV4Y19VbmJvdW5kTG9jYWxFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlV2FybmluZz1weXRob24zNi5QeUV4Y19Vbmljb2RlV2FybmluZyBEQVRBCisgIFB5RXhjX1VzZXJXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1VzZXJXYXJuaW5nIERBVEEKKyAgUHlFeGNfVmFsdWVFcnJvcj1weXRob24zNi5QeUV4Y19WYWx1ZUVycm9yIERBVEEKKyAgUHlFeGNfV2FybmluZz1weXRob24zNi5QeUV4Y19XYXJuaW5nIERBVEEKKyAgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IgREFUQQorICBQeUV4Y2VwdGlvbl9HZXRDYXVzZT1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRDYXVzZQorICBQeUV4Y2VwdGlvbl9HZXRDb250ZXh0PXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldENvbnRleHQKKyAgUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrPXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaworICBQeUV4Y2VwdGlvbl9TZXRDYXVzZT1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRDYXVzZQorICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0PXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldENvbnRleHQKKyAgUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrPXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaworICBQeUZpbGVfRnJvbUZkPXB5dGhvbjM2LlB5RmlsZV9Gcm9tRmQKKyAgUHlGaWxlX0dldExpbmU9cHl0aG9uMzYuUHlGaWxlX0dldExpbmUKKyAgUHlGaWxlX1dyaXRlT2JqZWN0PXB5dGhvbjM2LlB5RmlsZV9Xcml0ZU9iamVjdAorICBQeUZpbGVfV3JpdGVTdHJpbmc9cHl0aG9uMzYuUHlGaWxlX1dyaXRlU3RyaW5nCisgIFB5RmlsdGVyX1R5cGU9cHl0aG9uMzYuUHlGaWx0ZXJfVHlwZSBEQVRBCisgIFB5RmxvYXRfQXNEb3VibGU9cHl0aG9uMzYuUHlGbG9hdF9Bc0RvdWJsZQorICBQeUZsb2F0X0Zyb21Eb3VibGU9cHl0aG9uMzYuUHlGbG9hdF9Gcm9tRG91YmxlCisgIFB5RmxvYXRfRnJvbVN0cmluZz1weXRob24zNi5QeUZsb2F0X0Zyb21TdHJpbmcKKyAgUHlGbG9hdF9HZXRJbmZvPXB5dGhvbjM2LlB5RmxvYXRfR2V0SW5mbworICBQeUZsb2F0X0dldE1heD1weXRob24zNi5QeUZsb2F0X0dldE1heAorICBQeUZsb2F0X0dldE1pbj1weXRob24zNi5QeUZsb2F0X0dldE1pbgorICBQeUZsb2F0X1R5cGU9cHl0aG9uMzYuUHlGbG9hdF9UeXBlIERBVEEKKyAgUHlGcm96ZW5TZXRfTmV3PXB5dGhvbjM2LlB5RnJvemVuU2V0X05ldworICBQeUZyb3plblNldF9UeXBlPXB5dGhvbjM2LlB5RnJvemVuU2V0X1R5cGUgREFUQQorICBQeUdDX0NvbGxlY3Q9cHl0aG9uMzYuUHlHQ19Db2xsZWN0CisgIFB5R0lMU3RhdGVfRW5zdXJlPXB5dGhvbjM2LlB5R0lMU3RhdGVfRW5zdXJlCisgIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlPXB5dGhvbjM2LlB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlCisgIFB5R0lMU3RhdGVfUmVsZWFzZT1weXRob24zNi5QeUdJTFN0YXRlX1JlbGVhc2UKKyAgUHlHZXRTZXREZXNjcl9UeXBlPXB5dGhvbjM2LlB5R2V0U2V0RGVzY3JfVHlwZSBEQVRBCisgIFB5SW1wb3J0X0FkZE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9BZGRNb2R1bGUKKyAgUHlJbXBvcnRfQXBwZW5kSW5pdHRhYj1weXRob24zNi5QeUltcG9ydF9BcHBlbmRJbml0dGFiCisgIFB5SW1wb3J0X0NsZWFudXA9cHl0aG9uMzYuUHlJbXBvcnRfQ2xlYW51cAorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZT1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZQorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4PXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzPXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcworICBQeUltcG9ydF9HZXRJbXBvcnRlcj1weXRob24zNi5QeUltcG9ydF9HZXRJbXBvcnRlcgorICBQeUltcG9ydF9HZXRNYWdpY051bWJlcj1weXRob24zNi5QeUltcG9ydF9HZXRNYWdpY051bWJlcgorICBQeUltcG9ydF9HZXRNYWdpY1RhZz1weXRob24zNi5QeUltcG9ydF9HZXRNYWdpY1RhZworICBQeUltcG9ydF9HZXRNb2R1bGVEaWN0PXB5dGhvbjM2LlB5SW1wb3J0X0dldE1vZHVsZURpY3QKKyAgUHlJbXBvcnRfSW1wb3J0PXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydAorICBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGUKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWw9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaz1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrCisgIFB5SW1wb3J0X1JlbG9hZE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9SZWxvYWRNb2R1bGUKKyAgUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyPXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcgorICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlPXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUKKyAgUHlJbnRlcnByZXRlclN0YXRlX05ldz1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfTmV3CisgIFB5SXRlcl9OZXh0PXB5dGhvbjM2LlB5SXRlcl9OZXh0CisgIFB5TGlzdEl0ZXJfVHlwZT1weXRob24zNi5QeUxpc3RJdGVyX1R5cGUgREFUQQorICBQeUxpc3RSZXZJdGVyX1R5cGU9cHl0aG9uMzYuUHlMaXN0UmV2SXRlcl9UeXBlIERBVEEKKyAgUHlMaXN0X0FwcGVuZD1weXRob24zNi5QeUxpc3RfQXBwZW5kCisgIFB5TGlzdF9Bc1R1cGxlPXB5dGhvbjM2LlB5TGlzdF9Bc1R1cGxlCisgIFB5TGlzdF9HZXRJdGVtPXB5dGhvbjM2LlB5TGlzdF9HZXRJdGVtCisgIFB5TGlzdF9HZXRTbGljZT1weXRob24zNi5QeUxpc3RfR2V0U2xpY2UKKyAgUHlMaXN0X0luc2VydD1weXRob24zNi5QeUxpc3RfSW5zZXJ0CisgIFB5TGlzdF9OZXc9cHl0aG9uMzYuUHlMaXN0X05ldworICBQeUxpc3RfUmV2ZXJzZT1weXRob24zNi5QeUxpc3RfUmV2ZXJzZQorICBQeUxpc3RfU2V0SXRlbT1weXRob24zNi5QeUxpc3RfU2V0SXRlbQorICBQeUxpc3RfU2V0U2xpY2U9cHl0aG9uMzYuUHlMaXN0X1NldFNsaWNlCisgIFB5TGlzdF9TaXplPXB5dGhvbjM2LlB5TGlzdF9TaXplCisgIFB5TGlzdF9Tb3J0PXB5dGhvbjM2LlB5TGlzdF9Tb3J0CisgIFB5TGlzdF9UeXBlPXB5dGhvbjM2LlB5TGlzdF9UeXBlIERBVEEKKyAgUHlMb25nUmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzYuUHlMb25nUmFuZ2VJdGVyX1R5cGUgREFUQQorICBQeUxvbmdfQXNEb3VibGU9cHl0aG9uMzYuUHlMb25nX0FzRG91YmxlCisgIFB5TG9uZ19Bc0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzTG9uZworICBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93CisgIFB5TG9uZ19Bc0xvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdMb25nCisgIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdworICBQeUxvbmdfQXNTaXplX3Q9cHl0aG9uMzYuUHlMb25nX0FzU2l6ZV90CisgIFB5TG9uZ19Bc1NzaXplX3Q9cHl0aG9uMzYuUHlMb25nX0FzU3NpemVfdAorICBQeUxvbmdfQXNVbnNpZ25lZExvbmc9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sKKyAgUHlMb25nX0FzVm9pZFB0cj1weXRob24zNi5QeUxvbmdfQXNWb2lkUHRyCisgIFB5TG9uZ19Gcm9tRG91YmxlPXB5dGhvbjM2LlB5TG9uZ19Gcm9tRG91YmxlCisgIFB5TG9uZ19Gcm9tTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbUxvbmcKKyAgUHlMb25nX0Zyb21Mb25nTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbUxvbmdMb25nCisgIFB5TG9uZ19Gcm9tU2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Gcm9tU2l6ZV90CisgIFB5TG9uZ19Gcm9tU3NpemVfdD1weXRob24zNi5QeUxvbmdfRnJvbVNzaXplX3QKKyAgUHlMb25nX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21TdHJpbmcKKyAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKKyAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZworICBQeUxvbmdfRnJvbVZvaWRQdHI9cHl0aG9uMzYuUHlMb25nX0Zyb21Wb2lkUHRyCisgIFB5TG9uZ19HZXRJbmZvPXB5dGhvbjM2LlB5TG9uZ19HZXRJbmZvCisgIFB5TG9uZ19UeXBlPXB5dGhvbjM2LlB5TG9uZ19UeXBlIERBVEEKKyAgUHlNYXBfVHlwZT1weXRob24zNi5QeU1hcF9UeXBlIERBVEEKKyAgUHlNYXBwaW5nX0NoZWNrPXB5dGhvbjM2LlB5TWFwcGluZ19DaGVjaworICBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfR2V0SXRlbVN0cmluZworICBQeU1hcHBpbmdfSGFzS2V5PXB5dGhvbjM2LlB5TWFwcGluZ19IYXNLZXkKKyAgUHlNYXBwaW5nX0hhc0tleVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfSGFzS2V5U3RyaW5nCisgIFB5TWFwcGluZ19JdGVtcz1weXRob24zNi5QeU1hcHBpbmdfSXRlbXMKKyAgUHlNYXBwaW5nX0tleXM9cHl0aG9uMzYuUHlNYXBwaW5nX0tleXMKKyAgUHlNYXBwaW5nX0xlbmd0aD1weXRob24zNi5QeU1hcHBpbmdfTGVuZ3RoCisgIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19TZXRJdGVtU3RyaW5nCisgIFB5TWFwcGluZ19TaXplPXB5dGhvbjM2LlB5TWFwcGluZ19TaXplCisgIFB5TWFwcGluZ19WYWx1ZXM9cHl0aG9uMzYuUHlNYXBwaW5nX1ZhbHVlcworICBQeU1lbV9GcmVlPXB5dGhvbjM2LlB5TWVtX0ZyZWUKKyAgUHlNZW1fTWFsbG9jPXB5dGhvbjM2LlB5TWVtX01hbGxvYworICBQeU1lbV9SZWFsbG9jPXB5dGhvbjM2LlB5TWVtX1JlYWxsb2MKKyAgUHlNZW1iZXJEZXNjcl9UeXBlPXB5dGhvbjM2LlB5TWVtYmVyRGVzY3JfVHlwZSBEQVRBCisgIFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0CisgIFB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzPXB5dGhvbjM2LlB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzCisgIFB5TWVtb3J5Vmlld19UeXBlPXB5dGhvbjM2LlB5TWVtb3J5Vmlld19UeXBlIERBVEEKKyAgUHlNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM2LlB5TWV0aG9kRGVzY3JfVHlwZSBEQVRBCisgIFB5TW9kdWxlX0FkZEludENvbnN0YW50PXB5dGhvbjM2LlB5TW9kdWxlX0FkZEludENvbnN0YW50CisgIFB5TW9kdWxlX0FkZE9iamVjdD1weXRob24zNi5QeU1vZHVsZV9BZGRPYmplY3QKKyAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQ9cHl0aG9uMzYuUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQKKyAgUHlNb2R1bGVfQ3JlYXRlMj1weXRob24zNi5QeU1vZHVsZV9DcmVhdGUyCisgIFB5TW9kdWxlX0dldERlZj1weXRob24zNi5QeU1vZHVsZV9HZXREZWYKKyAgUHlNb2R1bGVfR2V0RGljdD1weXRob24zNi5QeU1vZHVsZV9HZXREaWN0CisgIFB5TW9kdWxlX0dldEZpbGVuYW1lPXB5dGhvbjM2LlB5TW9kdWxlX0dldEZpbGVuYW1lCisgIFB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM2LlB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0CisgIFB5TW9kdWxlX0dldE5hbWU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0TmFtZQorICBQeU1vZHVsZV9HZXRTdGF0ZT1weXRob24zNi5QeU1vZHVsZV9HZXRTdGF0ZQorICBQeU1vZHVsZV9OZXc9cHl0aG9uMzYuUHlNb2R1bGVfTmV3CisgIFB5TW9kdWxlX1R5cGU9cHl0aG9uMzYuUHlNb2R1bGVfVHlwZSBEQVRBCisgIFB5TW9kdWxlRGVmX0luaXQ9cHl0aG9uMzYuUHlNb2R1bGVEZWZfSW5pdAorICBQeU1vZHVsZURlZl9UeXBlPXB5dGhvbjM2LlB5TW9kdWxlRGVmX1R5cGUgREFUQQorICBQeU51bGxJbXBvcnRlcl9UeXBlPXB5dGhvbjM2LlB5TnVsbEltcG9ydGVyX1R5cGUgREFUQQorICBQeU51bWJlcl9BYnNvbHV0ZT1weXRob24zNi5QeU51bWJlcl9BYnNvbHV0ZQorICBQeU51bWJlcl9BZGQ9cHl0aG9uMzYuUHlOdW1iZXJfQWRkCisgIFB5TnVtYmVyX0FuZD1weXRob24zNi5QeU51bWJlcl9BbmQKKyAgUHlOdW1iZXJfQXNTc2l6ZV90PXB5dGhvbjM2LlB5TnVtYmVyX0FzU3NpemVfdAorICBQeU51bWJlcl9DaGVjaz1weXRob24zNi5QeU51bWJlcl9DaGVjaworICBQeU51bWJlcl9EaXZtb2Q9cHl0aG9uMzYuUHlOdW1iZXJfRGl2bW9kCisgIFB5TnVtYmVyX0Zsb2F0PXB5dGhvbjM2LlB5TnVtYmVyX0Zsb2F0CisgIFB5TnVtYmVyX0Zsb29yRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0Zsb29yRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VBZGQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUFkZAorICBQeU51bWJlcl9JblBsYWNlQW5kPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VBbmQKKyAgUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZQorICBQeU51bWJlcl9JblBsYWNlTHNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VMc2hpZnQKKyAgUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VNdWx0aXBseQorICBQeU51bWJlcl9JblBsYWNlT3I9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZU9yCisgIFB5TnVtYmVyX0luUGxhY2VQb3dlcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUG93ZXIKKyAgUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUmVtYWluZGVyCisgIFB5TnVtYmVyX0luUGxhY2VSc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVJzaGlmdAorICBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Q9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0CisgIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VYb3I9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVhvcgorICBQeU51bWJlcl9JbmRleD1weXRob24zNi5QeU51bWJlcl9JbmRleAorICBQeU51bWJlcl9JbnZlcnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW52ZXJ0CisgIFB5TnVtYmVyX0xvbmc9cHl0aG9uMzYuUHlOdW1iZXJfTG9uZworICBQeU51bWJlcl9Mc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfTHNoaWZ0CisgIFB5TnVtYmVyX011bHRpcGx5PXB5dGhvbjM2LlB5TnVtYmVyX011bHRpcGx5CisgIFB5TnVtYmVyX05lZ2F0aXZlPXB5dGhvbjM2LlB5TnVtYmVyX05lZ2F0aXZlCisgIFB5TnVtYmVyX09yPXB5dGhvbjM2LlB5TnVtYmVyX09yCisgIFB5TnVtYmVyX1Bvc2l0aXZlPXB5dGhvbjM2LlB5TnVtYmVyX1Bvc2l0aXZlCisgIFB5TnVtYmVyX1Bvd2VyPXB5dGhvbjM2LlB5TnVtYmVyX1Bvd2VyCisgIFB5TnVtYmVyX1JlbWFpbmRlcj1weXRob24zNi5QeU51bWJlcl9SZW1haW5kZXIKKyAgUHlOdW1iZXJfUnNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX1JzaGlmdAorICBQeU51bWJlcl9TdWJ0cmFjdD1weXRob24zNi5QeU51bWJlcl9TdWJ0cmFjdAorICBQeU51bWJlcl9Ub0Jhc2U9cHl0aG9uMzYuUHlOdW1iZXJfVG9CYXNlCisgIFB5TnVtYmVyX1RydWVEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfVHJ1ZURpdmlkZQorICBQeU51bWJlcl9Yb3I9cHl0aG9uMzYuUHlOdW1iZXJfWG9yCisgIFB5T1NfQWZ0ZXJGb3JrPXB5dGhvbjM2LlB5T1NfQWZ0ZXJGb3JrCisgIFB5T1NfSW5pdEludGVycnVwdHM9cHl0aG9uMzYuUHlPU19Jbml0SW50ZXJydXB0cworICBQeU9TX0lucHV0SG9vaz1weXRob24zNi5QeU9TX0lucHV0SG9vayBEQVRBCisgIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQ9cHl0aG9uMzYuUHlPU19JbnRlcnJ1cHRPY2N1cnJlZAorICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyPXB5dGhvbjM2LlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgREFUQQorICBQeU9TX2RvdWJsZV90b19zdHJpbmc9cHl0aG9uMzYuUHlPU19kb3VibGVfdG9fc3RyaW5nCisgIFB5T1NfZ2V0c2lnPXB5dGhvbjM2LlB5T1NfZ2V0c2lnCisgIFB5T1NfbXlzdHJpY21wPXB5dGhvbjM2LlB5T1NfbXlzdHJpY21wCisgIFB5T1NfbXlzdHJuaWNtcD1weXRob24zNi5QeU9TX215c3RybmljbXAKKyAgUHlPU19zZXRzaWc9cHl0aG9uMzYuUHlPU19zZXRzaWcKKyAgUHlPU19zbnByaW50Zj1weXRob24zNi5QeU9TX3NucHJpbnRmCisgIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZT1weXRob24zNi5QeU9TX3N0cmluZ190b19kb3VibGUKKyAgUHlPU19zdHJ0b2w9cHl0aG9uMzYuUHlPU19zdHJ0b2wKKyAgUHlPU19zdHJ0b3VsPXB5dGhvbjM2LlB5T1Nfc3RydG91bAorICBQeU9TX3ZzbnByaW50Zj1weXRob24zNi5QeU9TX3ZzbnByaW50ZgorICBQeU9iamVjdF9BU0NJST1weXRob24zNi5QeU9iamVjdF9BU0NJSQorICBQeU9iamVjdF9Bc0NoYXJCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNDaGFyQnVmZmVyCisgIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I9cHl0aG9uMzYuUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcgorICBQeU9iamVjdF9Bc1JlYWRCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNSZWFkQnVmZmVyCisgIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcgorICBQeU9iamVjdF9CeXRlcz1weXRob24zNi5QeU9iamVjdF9CeXRlcworICBQeU9iamVjdF9DYWxsPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGwKKyAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxGdW5jdGlvbgorICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MKKyAgUHlPYmplY3RfQ2FsbE1ldGhvZD1weXRob24zNi5QeU9iamVjdF9DYWxsTWV0aG9kCisgIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzCisgIFB5T2JqZWN0X0NhbGxPYmplY3Q9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE9iamVjdAorICBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyCisgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnM9cHl0aG9uMzYuUHlPYmplY3RfQ2xlYXJXZWFrUmVmcworICBQeU9iamVjdF9EZWxJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X0RlbEl0ZW0KKyAgUHlPYmplY3RfRGVsSXRlbVN0cmluZz1weXRob24zNi5QeU9iamVjdF9EZWxJdGVtU3RyaW5nCisgIFB5T2JqZWN0X0Rpcj1weXRob24zNi5QeU9iamVjdF9EaXIKKyAgUHlPYmplY3RfRm9ybWF0PXB5dGhvbjM2LlB5T2JqZWN0X0Zvcm1hdAorICBQeU9iamVjdF9GcmVlPXB5dGhvbjM2LlB5T2JqZWN0X0ZyZWUKKyAgUHlPYmplY3RfR0NfRGVsPXB5dGhvbjM2LlB5T2JqZWN0X0dDX0RlbAorICBQeU9iamVjdF9HQ19UcmFjaz1weXRob24zNi5QeU9iamVjdF9HQ19UcmFjaworICBQeU9iamVjdF9HQ19VblRyYWNrPXB5dGhvbjM2LlB5T2JqZWN0X0dDX1VuVHJhY2sKKyAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2VuZXJpY0dldEF0dHIKKyAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2VuZXJpY1NldEF0dHIKKyAgUHlPYmplY3RfR2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZXRBdHRyCisgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfR2V0QXR0clN0cmluZworICBQeU9iamVjdF9HZXRJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X0dldEl0ZW0KKyAgUHlPYmplY3RfR2V0SXRlcj1weXRob24zNi5QeU9iamVjdF9HZXRJdGVyCisgIFB5T2JqZWN0X0hhc0F0dHI9cHl0aG9uMzYuUHlPYmplY3RfSGFzQXR0cgorICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0hhc0F0dHJTdHJpbmcKKyAgUHlPYmplY3RfSGFzaD1weXRob24zNi5QeU9iamVjdF9IYXNoCisgIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZD1weXRob24zNi5QeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQKKyAgUHlPYmplY3RfSW5pdD1weXRob24zNi5QeU9iamVjdF9Jbml0CisgIFB5T2JqZWN0X0luaXRWYXI9cHl0aG9uMzYuUHlPYmplY3RfSW5pdFZhcgorICBQeU9iamVjdF9Jc0luc3RhbmNlPXB5dGhvbjM2LlB5T2JqZWN0X0lzSW5zdGFuY2UKKyAgUHlPYmplY3RfSXNTdWJjbGFzcz1weXRob24zNi5QeU9iamVjdF9Jc1N1YmNsYXNzCisgIFB5T2JqZWN0X0lzVHJ1ZT1weXRob24zNi5QeU9iamVjdF9Jc1RydWUKKyAgUHlPYmplY3RfTGVuZ3RoPXB5dGhvbjM2LlB5T2JqZWN0X0xlbmd0aAorICBQeU9iamVjdF9NYWxsb2M9cHl0aG9uMzYuUHlPYmplY3RfTWFsbG9jCisgIFB5T2JqZWN0X05vdD1weXRob24zNi5QeU9iamVjdF9Ob3QKKyAgUHlPYmplY3RfUmVhbGxvYz1weXRob24zNi5QeU9iamVjdF9SZWFsbG9jCisgIFB5T2JqZWN0X1JlcHI9cHl0aG9uMzYuUHlPYmplY3RfUmVwcgorICBQeU9iamVjdF9SaWNoQ29tcGFyZT1weXRob24zNi5QeU9iamVjdF9SaWNoQ29tcGFyZQorICBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w9cHl0aG9uMzYuUHlPYmplY3RfUmljaENvbXBhcmVCb29sCisgIFB5T2JqZWN0X1NlbGZJdGVyPXB5dGhvbjM2LlB5T2JqZWN0X1NlbGZJdGVyCisgIFB5T2JqZWN0X1NldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfU2V0QXR0cgorICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X1NldEF0dHJTdHJpbmcKKyAgUHlPYmplY3RfU2V0SXRlbT1weXRob24zNi5QeU9iamVjdF9TZXRJdGVtCisgIFB5T2JqZWN0X1NpemU9cHl0aG9uMzYuUHlPYmplY3RfU2l6ZQorICBQeU9iamVjdF9TdHI9cHl0aG9uMzYuUHlPYmplY3RfU3RyCisgIFB5T2JqZWN0X1R5cGU9cHl0aG9uMzYuUHlPYmplY3RfVHlwZSBEQVRBCisgIFB5T0RpY3RfRGVsSXRlbT1weXRob24zNi5QeU9EaWN0X0RlbEl0ZW0KKyAgUHlPRGljdF9OZXc9cHl0aG9uMzYuUHlPRGljdF9OZXcKKyAgUHlPRGljdF9TZXRJdGVtPXB5dGhvbjM2LlB5T0RpY3RfU2V0SXRlbQorICBQeU9EaWN0X1R5cGU9cHl0aG9uMzYuUHlPRGljdF9UeXBlIERBVEEKKyAgUHlPRGljdEl0ZW1zX1R5cGU9cHl0aG9uMzYuUHlPRGljdEl0ZW1zX1R5cGUgREFUQQorICBQeU9EaWN0SXRlcl9UeXBlPXB5dGhvbjM2LlB5T0RpY3RJdGVyX1R5cGUgREFUQQorICBQeU9EaWN0S2V5c19UeXBlPXB5dGhvbjM2LlB5T0RpY3RLZXlzX1R5cGUgREFUQQorICBQeU9EaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzYuUHlPRGljdFZhbHVlc19UeXBlIERBVEEKKyAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3M9cHl0aG9uMzYuUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MKKyAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncz1weXRob24zNi5QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzCisgIFB5UHJvcGVydHlfVHlwZT1weXRob24zNi5QeVByb3BlcnR5X1R5cGUgREFUQQorICBQeVJhbmdlSXRlcl9UeXBlPXB5dGhvbjM2LlB5UmFuZ2VJdGVyX1R5cGUgREFUQQorICBQeVJhbmdlX1R5cGU9cHl0aG9uMzYuUHlSYW5nZV9UeXBlIERBVEEKKyAgUHlSZXZlcnNlZF9UeXBlPXB5dGhvbjM2LlB5UmV2ZXJzZWRfVHlwZSBEQVRBCisgIFB5U2VxSXRlcl9OZXc9cHl0aG9uMzYuUHlTZXFJdGVyX05ldworICBQeVNlcUl0ZXJfVHlwZT1weXRob24zNi5QeVNlcUl0ZXJfVHlwZSBEQVRBCisgIFB5U2VxdWVuY2VfQ2hlY2s9cHl0aG9uMzYuUHlTZXF1ZW5jZV9DaGVjaworICBQeVNlcXVlbmNlX0NvbmNhdD1weXRob24zNi5QeVNlcXVlbmNlX0NvbmNhdAorICBQeVNlcXVlbmNlX0NvbnRhaW5zPXB5dGhvbjM2LlB5U2VxdWVuY2VfQ29udGFpbnMKKyAgUHlTZXF1ZW5jZV9Db3VudD1weXRob24zNi5QeVNlcXVlbmNlX0NvdW50CisgIFB5U2VxdWVuY2VfRGVsSXRlbT1weXRob24zNi5QeVNlcXVlbmNlX0RlbEl0ZW0KKyAgUHlTZXF1ZW5jZV9EZWxTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX0RlbFNsaWNlCisgIFB5U2VxdWVuY2VfRmFzdD1weXRob24zNi5QeVNlcXVlbmNlX0Zhc3QKKyAgUHlTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfR2V0SXRlbQorICBQeVNlcXVlbmNlX0dldFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfR2V0U2xpY2UKKyAgUHlTZXF1ZW5jZV9Jbj1weXRob24zNi5QeVNlcXVlbmNlX0luCisgIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdD1weXRob24zNi5QeVNlcXVlbmNlX0luUGxhY2VDb25jYXQKKyAgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdAorICBQeVNlcXVlbmNlX0luZGV4PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5kZXgKKyAgUHlTZXF1ZW5jZV9MZW5ndGg9cHl0aG9uMzYuUHlTZXF1ZW5jZV9MZW5ndGgKKyAgUHlTZXF1ZW5jZV9MaXN0PXB5dGhvbjM2LlB5U2VxdWVuY2VfTGlzdAorICBQeVNlcXVlbmNlX1JlcGVhdD1weXRob24zNi5QeVNlcXVlbmNlX1JlcGVhdAorICBQeVNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9TZXRJdGVtCisgIFB5U2VxdWVuY2VfU2V0U2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9TZXRTbGljZQorICBQeVNlcXVlbmNlX1NpemU9cHl0aG9uMzYuUHlTZXF1ZW5jZV9TaXplCisgIFB5U2VxdWVuY2VfVHVwbGU9cHl0aG9uMzYuUHlTZXF1ZW5jZV9UdXBsZQorICBQeVNldEl0ZXJfVHlwZT1weXRob24zNi5QeVNldEl0ZXJfVHlwZSBEQVRBCisgIFB5U2V0X0FkZD1weXRob24zNi5QeVNldF9BZGQKKyAgUHlTZXRfQ2xlYXI9cHl0aG9uMzYuUHlTZXRfQ2xlYXIKKyAgUHlTZXRfQ29udGFpbnM9cHl0aG9uMzYuUHlTZXRfQ29udGFpbnMKKyAgUHlTZXRfRGlzY2FyZD1weXRob24zNi5QeVNldF9EaXNjYXJkCisgIFB5U2V0X05ldz1weXRob24zNi5QeVNldF9OZXcKKyAgUHlTZXRfUG9wPXB5dGhvbjM2LlB5U2V0X1BvcAorICBQeVNldF9TaXplPXB5dGhvbjM2LlB5U2V0X1NpemUKKyAgUHlTZXRfVHlwZT1weXRob24zNi5QeVNldF9UeXBlIERBVEEKKyAgUHlTbGljZV9HZXRJbmRpY2VzPXB5dGhvbjM2LlB5U2xpY2VfR2V0SW5kaWNlcworICBQeVNsaWNlX0dldEluZGljZXNFeD1weXRob24zNi5QeVNsaWNlX0dldEluZGljZXNFeAorICBQeVNsaWNlX05ldz1weXRob24zNi5QeVNsaWNlX05ldworICBQeVNsaWNlX1R5cGU9cHl0aG9uMzYuUHlTbGljZV9UeXBlIERBVEEKKyAgUHlTb3J0V3JhcHBlcl9UeXBlPXB5dGhvbjM2LlB5U29ydFdyYXBwZXJfVHlwZSBEQVRBCisgIFB5U3RhdGVfRmluZE1vZHVsZT1weXRob24zNi5QeVN0YXRlX0ZpbmRNb2R1bGUKKyAgUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9BZGRNb2R1bGUKKyAgUHlTdGF0ZV9SZW1vdmVNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9SZW1vdmVNb2R1bGUKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbQorICBQeVN0cnVjdFNlcXVlbmNlX05ldz1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX05ldworICBQeVN0cnVjdFNlcXVlbmNlX05ld1R5cGU9cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlCisgIFB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW0KKyAgUHlTdXBlcl9UeXBlPXB5dGhvbjM2LlB5U3VwZXJfVHlwZSBEQVRBCisgIFB5U3lzX0FkZFdhcm5PcHRpb249cHl0aG9uMzYuUHlTeXNfQWRkV2Fybk9wdGlvbgorICBQeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZT1weXRob24zNi5QeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZQorICBQeVN5c19Gb3JtYXRTdGRlcnI9cHl0aG9uMzYuUHlTeXNfRm9ybWF0U3RkZXJyCisgIFB5U3lzX0Zvcm1hdFN0ZG91dD1weXRob24zNi5QeVN5c19Gb3JtYXRTdGRvdXQKKyAgUHlTeXNfR2V0T2JqZWN0PXB5dGhvbjM2LlB5U3lzX0dldE9iamVjdAorICBQeVN5c19IYXNXYXJuT3B0aW9ucz1weXRob24zNi5QeVN5c19IYXNXYXJuT3B0aW9ucworICBQeVN5c19SZXNldFdhcm5PcHRpb25zPXB5dGhvbjM2LlB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMKKyAgUHlTeXNfU2V0QXJndj1weXRob24zNi5QeVN5c19TZXRBcmd2CisgIFB5U3lzX1NldEFyZ3ZFeD1weXRob24zNi5QeVN5c19TZXRBcmd2RXgKKyAgUHlTeXNfU2V0T2JqZWN0PXB5dGhvbjM2LlB5U3lzX1NldE9iamVjdAorICBQeVN5c19TZXRQYXRoPXB5dGhvbjM2LlB5U3lzX1NldFBhdGgKKyAgUHlTeXNfV3JpdGVTdGRlcnI9cHl0aG9uMzYuUHlTeXNfV3JpdGVTdGRlcnIKKyAgUHlTeXNfV3JpdGVTdGRvdXQ9cHl0aG9uMzYuUHlTeXNfV3JpdGVTdGRvdXQKKyAgUHlUaHJlYWRTdGF0ZV9DbGVhcj1weXRob24zNi5QeVRocmVhZFN0YXRlX0NsZWFyCisgIFB5VGhyZWFkU3RhdGVfRGVsZXRlPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfRGVsZXRlCisgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudD1weXRob24zNi5QeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQKKyAgUHlUaHJlYWRTdGF0ZV9HZXQ9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9HZXQKKyAgUHlUaHJlYWRTdGF0ZV9HZXREaWN0PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfR2V0RGljdAorICBQeVRocmVhZFN0YXRlX05ldz1weXRob24zNi5QeVRocmVhZFN0YXRlX05ldworICBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMKKyAgUHlUaHJlYWRTdGF0ZV9Td2FwPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfU3dhcAorICBQeVRyYWNlQmFja19IZXJlPXB5dGhvbjM2LlB5VHJhY2VCYWNrX0hlcmUKKyAgUHlUcmFjZUJhY2tfUHJpbnQ9cHl0aG9uMzYuUHlUcmFjZUJhY2tfUHJpbnQKKyAgUHlUcmFjZUJhY2tfVHlwZT1weXRob24zNi5QeVRyYWNlQmFja19UeXBlIERBVEEKKyAgUHlUdXBsZUl0ZXJfVHlwZT1weXRob24zNi5QeVR1cGxlSXRlcl9UeXBlIERBVEEKKyAgUHlUdXBsZV9DbGVhckZyZWVMaXN0PXB5dGhvbjM2LlB5VHVwbGVfQ2xlYXJGcmVlTGlzdAorICBQeVR1cGxlX0dldEl0ZW09cHl0aG9uMzYuUHlUdXBsZV9HZXRJdGVtCisgIFB5VHVwbGVfR2V0U2xpY2U9cHl0aG9uMzYuUHlUdXBsZV9HZXRTbGljZQorICBQeVR1cGxlX05ldz1weXRob24zNi5QeVR1cGxlX05ldworICBQeVR1cGxlX1BhY2s9cHl0aG9uMzYuUHlUdXBsZV9QYWNrCisgIFB5VHVwbGVfU2V0SXRlbT1weXRob24zNi5QeVR1cGxlX1NldEl0ZW0KKyAgUHlUdXBsZV9TaXplPXB5dGhvbjM2LlB5VHVwbGVfU2l6ZQorICBQeVR1cGxlX1R5cGU9cHl0aG9uMzYuUHlUdXBsZV9UeXBlIERBVEEKKyAgUHlUeXBlX0NsZWFyQ2FjaGU9cHl0aG9uMzYuUHlUeXBlX0NsZWFyQ2FjaGUKKyAgUHlUeXBlX0Zyb21TcGVjPXB5dGhvbjM2LlB5VHlwZV9Gcm9tU3BlYworICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXM9cHl0aG9uMzYuUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzCisgIFB5VHlwZV9HZW5lcmljQWxsb2M9cHl0aG9uMzYuUHlUeXBlX0dlbmVyaWNBbGxvYworICBQeVR5cGVfR2VuZXJpY05ldz1weXRob24zNi5QeVR5cGVfR2VuZXJpY05ldworICBQeVR5cGVfR2V0RmxhZ3M9cHl0aG9uMzYuUHlUeXBlX0dldEZsYWdzCisgIFB5VHlwZV9HZXRTbG90PXB5dGhvbjM2LlB5VHlwZV9HZXRTbG90CisgIFB5VHlwZV9Jc1N1YnR5cGU9cHl0aG9uMzYuUHlUeXBlX0lzU3VidHlwZQorICBQeVR5cGVfTW9kaWZpZWQ9cHl0aG9uMzYuUHlUeXBlX01vZGlmaWVkCisgIFB5VHlwZV9SZWFkeT1weXRob24zNi5QeVR5cGVfUmVhZHkKKyAgUHlUeXBlX1R5cGU9cHl0aG9uMzYuUHlUeXBlX1R5cGUgREFUQQorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGU9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZworICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlSXRlcl9UeXBlPXB5dGhvbjM2LlB5VW5pY29kZUl0ZXJfVHlwZSBEQVRBCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVfQXBwZW5kPXB5dGhvbjM2LlB5VW5pY29kZV9BcHBlbmQKKyAgUHlVbmljb2RlX0FwcGVuZEFuZERlbD1weXRob24zNi5QeVVuaWNvZGVfQXBwZW5kQW5kRGVsCisgIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nCisgIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZworICBQeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGUKKyAgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZworICBQeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZT1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZQorICBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nCisgIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZworICBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEYxNlN0cmluZworICBQeVVuaWNvZGVfQXNVVEYzMlN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEYzMlN0cmluZworICBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjhTdHJpbmcKKyAgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nCisgIFB5VW5pY29kZV9Bc1dpZGVDaGFyPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1dpZGVDaGFyCisgIFB5VW5pY29kZV9DbGVhckZyZWVsaXN0PXB5dGhvbjM2LlB5VW5pY29kZV9DbGVhckZyZWVsaXN0CisgIFB5VW5pY29kZV9Db21wYXJlPXB5dGhvbjM2LlB5VW5pY29kZV9Db21wYXJlCisgIFB5VW5pY29kZV9Db25jYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0NvbmNhdAorICBQeVVuaWNvZGVfQ29udGFpbnM9cHl0aG9uMzYuUHlVbmljb2RlX0NvbnRhaW5zCisgIFB5VW5pY29kZV9Db3VudD1weXRob24zNi5QeVVuaWNvZGVfQ291bnQKKyAgUHlVbmljb2RlX0RlY29kZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlCisgIFB5VW5pY29kZV9EZWNvZGVBU0NJST1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlQVNDSUkKKyAgUHlVbmljb2RlX0RlY29kZUNoYXJtYXA9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUNoYXJtYXAKKyAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0CisgIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplCisgIFB5VW5pY29kZV9EZWNvZGVMYXRpbjE9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUxhdGluMQorICBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQorICBQeVVuaWNvZGVfRGVjb2RlVVRGMTY9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjE2CisgIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVVEYzMj1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMzIKKyAgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVURjg9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjgKKyAgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlCisgIFB5VW5pY29kZV9GU0NvbnZlcnRlcj1weXRob24zNi5QeVVuaWNvZGVfRlNDb252ZXJ0ZXIKKyAgUHlVbmljb2RlX0ZTRGVjb2Rlcj1weXRob24zNi5QeVVuaWNvZGVfRlNEZWNvZGVyCisgIFB5VW5pY29kZV9GaW5kPXB5dGhvbjM2LlB5VW5pY29kZV9GaW5kCisgIFB5VW5pY29kZV9Gb3JtYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0Zvcm1hdAorICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Gcm9tRm9ybWF0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRm9ybWF0CisgIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vj1weXRob24zNi5QeVVuaWNvZGVfRnJvbUZvcm1hdFYKKyAgUHlVbmljb2RlX0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21PYmplY3QKKyAgUHlVbmljb2RlX0Zyb21PcmRpbmFsPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tT3JkaW5hbAorICBQeVVuaWNvZGVfRnJvbVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfRnJvbVN0cmluZworICBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplCisgIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXI9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21XaWRlQ2hhcgorICBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcKKyAgUHlVbmljb2RlX0dldFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0dldFNpemUKKyAgUHlVbmljb2RlX0lzSWRlbnRpZmllcj1weXRob24zNi5QeVVuaWNvZGVfSXNJZGVudGlmaWVyCisgIFB5VW5pY29kZV9Kb2luPXB5dGhvbjM2LlB5VW5pY29kZV9Kb2luCisgIFB5VW5pY29kZV9QYXJ0aXRpb249cHl0aG9uMzYuUHlVbmljb2RlX1BhcnRpdGlvbgorICBQeVVuaWNvZGVfUlBhcnRpdGlvbj1weXRob24zNi5QeVVuaWNvZGVfUlBhcnRpdGlvbgorICBQeVVuaWNvZGVfUlNwbGl0PXB5dGhvbjM2LlB5VW5pY29kZV9SU3BsaXQKKyAgUHlVbmljb2RlX1JlcGxhY2U9cHl0aG9uMzYuUHlVbmljb2RlX1JlcGxhY2UKKyAgUHlVbmljb2RlX1Jlc2l6ZT1weXRob24zNi5QeVVuaWNvZGVfUmVzaXplCisgIFB5VW5pY29kZV9SaWNoQ29tcGFyZT1weXRob24zNi5QeVVuaWNvZGVfUmljaENvbXBhcmUKKyAgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nCisgIFB5VW5pY29kZV9TcGxpdD1weXRob24zNi5QeVVuaWNvZGVfU3BsaXQKKyAgUHlVbmljb2RlX1NwbGl0bGluZXM9cHl0aG9uMzYuUHlVbmljb2RlX1NwbGl0bGluZXMKKyAgUHlVbmljb2RlX1RhaWxtYXRjaD1weXRob24zNi5QeVVuaWNvZGVfVGFpbG1hdGNoCisgIFB5VW5pY29kZV9UcmFuc2xhdGU9cHl0aG9uMzYuUHlVbmljb2RlX1RyYW5zbGF0ZQorICBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcD1weXRob24zNi5QeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcAorICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZworICBQeVVuaWNvZGVfRGVjb2RlVVRGNz1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGNworICBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwKKyAgUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdD1weXRob24zNi5QeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0CisgIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nCisgIFB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbD1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWwKKyAgUHlVbmljb2RlX0ludGVybkluUGxhY2U9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkluUGxhY2UKKyAgUHlVbmljb2RlX1R5cGU9cHl0aG9uMzYuUHlVbmljb2RlX1R5cGUgREFUQQorICBQeVdlYWtyZWZfR2V0T2JqZWN0PXB5dGhvbjM2LlB5V2Vha3JlZl9HZXRPYmplY3QgREFUQQorICBQeVdlYWtyZWZfTmV3UHJveHk9cHl0aG9uMzYuUHlXZWFrcmVmX05ld1Byb3h5CisgIFB5V2Vha3JlZl9OZXdSZWY9cHl0aG9uMzYuUHlXZWFrcmVmX05ld1JlZgorICBQeVdyYXBwZXJEZXNjcl9UeXBlPXB5dGhvbjM2LlB5V3JhcHBlckRlc2NyX1R5cGUgREFUQQorICBQeVdyYXBwZXJfTmV3PXB5dGhvbjM2LlB5V3JhcHBlcl9OZXcKKyAgUHlaaXBfVHlwZT1weXRob24zNi5QeVppcF9UeXBlIERBVEEKKyAgUHlfQWRkUGVuZGluZ0NhbGw9cHl0aG9uMzYuUHlfQWRkUGVuZGluZ0NhbGwKKyAgUHlfQXRFeGl0PXB5dGhvbjM2LlB5X0F0RXhpdAorICBQeV9CdWlsZFZhbHVlPXB5dGhvbjM2LlB5X0J1aWxkVmFsdWUKKyAgUHlfQ29tcGlsZVN0cmluZz1weXRob24zNi5QeV9Db21waWxlU3RyaW5nCisgIFB5X0RlY1JlZj1weXRob24zNi5QeV9EZWNSZWYKKyAgUHlfRW5kSW50ZXJwcmV0ZXI9cHl0aG9uMzYuUHlfRW5kSW50ZXJwcmV0ZXIKKyAgUHlfRXhpdD1weXRob24zNi5QeV9FeGl0CisgIFB5X0ZhdGFsRXJyb3I9cHl0aG9uMzYuUHlfRmF0YWxFcnJvcgorICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQorICBQeV9GaW5hbGl6ZT1weXRob24zNi5QeV9GaW5hbGl6ZQorICBQeV9GaW5hbGl6ZUV4PXB5dGhvbjM2LlB5X0ZpbmFsaXplRXgKKyAgUHlfR2V0QnVpbGRJbmZvPXB5dGhvbjM2LlB5X0dldEJ1aWxkSW5mbworICBQeV9HZXRDb21waWxlcj1weXRob24zNi5QeV9HZXRDb21waWxlcgorICBQeV9HZXRDb3B5cmlnaHQ9cHl0aG9uMzYuUHlfR2V0Q29weXJpZ2h0CisgIFB5X0dldEV4ZWNQcmVmaXg9cHl0aG9uMzYuUHlfR2V0RXhlY1ByZWZpeAorICBQeV9HZXRQYXRoPXB5dGhvbjM2LlB5X0dldFBhdGgKKyAgUHlfR2V0UGxhdGZvcm09cHl0aG9uMzYuUHlfR2V0UGxhdGZvcm0KKyAgUHlfR2V0UHJlZml4PXB5dGhvbjM2LlB5X0dldFByZWZpeAorICBQeV9HZXRQcm9ncmFtRnVsbFBhdGg9cHl0aG9uMzYuUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoCisgIFB5X0dldFByb2dyYW1OYW1lPXB5dGhvbjM2LlB5X0dldFByb2dyYW1OYW1lCisgIFB5X0dldFB5dGhvbkhvbWU9cHl0aG9uMzYuUHlfR2V0UHl0aG9uSG9tZQorICBQeV9HZXRSZWN1cnNpb25MaW1pdD1weXRob24zNi5QeV9HZXRSZWN1cnNpb25MaW1pdAorICBQeV9HZXRWZXJzaW9uPXB5dGhvbjM2LlB5X0dldFZlcnNpb24KKyAgUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKKyAgUHlfSW5jUmVmPXB5dGhvbjM2LlB5X0luY1JlZgorICBQeV9Jbml0aWFsaXplPXB5dGhvbjM2LlB5X0luaXRpYWxpemUKKyAgUHlfSW5pdGlhbGl6ZUV4PXB5dGhvbjM2LlB5X0luaXRpYWxpemVFeAorICBQeV9Jc0luaXRpYWxpemVkPXB5dGhvbjM2LlB5X0lzSW5pdGlhbGl6ZWQKKyAgUHlfTWFpbj1weXRob24zNi5QeV9NYWluCisgIFB5X01ha2VQZW5kaW5nQ2FsbHM9cHl0aG9uMzYuUHlfTWFrZVBlbmRpbmdDYWxscworICBQeV9OZXdJbnRlcnByZXRlcj1weXRob24zNi5QeV9OZXdJbnRlcnByZXRlcgorICBQeV9SZXByRW50ZXI9cHl0aG9uMzYuUHlfUmVwckVudGVyCisgIFB5X1JlcHJMZWF2ZT1weXRob24zNi5QeV9SZXByTGVhdmUKKyAgUHlfU2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzYuUHlfU2V0UHJvZ3JhbU5hbWUKKyAgUHlfU2V0UHl0aG9uSG9tZT1weXRob24zNi5QeV9TZXRQeXRob25Ib21lCisgIFB5X1NldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2LlB5X1NldFJlY3Vyc2lvbkxpbWl0CisgIFB5X1N5bXRhYmxlU3RyaW5nPXB5dGhvbjM2LlB5X1N5bXRhYmxlU3RyaW5nCisgIFB5X1ZhQnVpbGRWYWx1ZT1weXRob24zNi5QeV9WYUJ1aWxkVmFsdWUKKyAgX1B5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNi5fUHlFcnJfQmFkSW50ZXJuYWxDYWxsCisgIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQ9cHl0aG9uMzYuX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVAorICBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVD1weXRob24zNi5fUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAorICBfUHlPYmplY3RfR0NfTWFsbG9jPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19NYWxsb2MKKyAgX1B5T2JqZWN0X0dDX05ldz1weXRob24zNi5fUHlPYmplY3RfR0NfTmV3CisgIF9QeU9iamVjdF9HQ19OZXdWYXI9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX05ld1ZhcgorICBfUHlPYmplY3RfR0NfUmVzaXplPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19SZXNpemUKKyAgX1B5T2JqZWN0X05ldz1weXRob24zNi5fUHlPYmplY3RfTmV3CisgIF9QeU9iamVjdF9OZXdWYXI9cHl0aG9uMzYuX1B5T2JqZWN0X05ld1ZhcgorICBfUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzYuX1B5U3RhdGVfQWRkTW9kdWxlCisgIF9QeVRocmVhZFN0YXRlX0luaXQ9cHl0aG9uMzYuX1B5VGhyZWFkU3RhdGVfSW5pdAorICBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYz1weXRob24zNi5fUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYworICBfUHlUcmFzaF9kZWxldGVfbGF0ZXI9cHl0aG9uMzYuX1B5VHJhc2hfZGVsZXRlX2xhdGVyIERBVEEKKyAgX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc9cHl0aG9uMzYuX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgREFUQQorICBfUHlUcmFzaF9kZXBvc2l0X29iamVjdD1weXRob24zNi5fUHlUcmFzaF9kZXBvc2l0X29iamVjdAorICBfUHlUcmFzaF9kZXN0cm95X2NoYWluPXB5dGhvbjM2Ll9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4KKyAgX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZT1weXRob24zNi5fUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlIERBVEEKKyAgX1B5V2Vha3JlZl9Qcm94eVR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9Qcm94eVR5cGUgREFUQQorICBfUHlXZWFrcmVmX1JlZlR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9SZWZUeXBlIERBVEEKKyAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKKyAgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgREFUQQorICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsPXB5dGhvbjM2Ll9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwKKyAgX1B5X0RlYWxsb2M9cHl0aG9uMzYuX1B5X0RlYWxsb2MKKyAgX1B5X0VsbGlwc2lzT2JqZWN0PXB5dGhvbjM2Ll9QeV9FbGxpcHNpc09iamVjdCBEQVRBCisgIF9QeV9GYWxzZVN0cnVjdD1weXRob24zNi5fUHlfRmFsc2VTdHJ1Y3QgREFUQQorICBfUHlfTm9uZVN0cnVjdD1weXRob24zNi5fUHlfTm9uZVN0cnVjdCBEQVRBCisgIF9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdD1weXRob24zNi5fUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3QgREFUQQorICBfUHlfU3dhcHBlZE9wPXB5dGhvbjM2Ll9QeV9Td2FwcGVkT3AgREFUQQorICBfUHlfVHJ1ZVN0cnVjdD1weXRob24zNi5fUHlfVHJ1ZVN0cnVjdCBEQVRBCisgIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVAorICBfUHlBcmdfUGFyc2VfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlX1NpemVUCisgIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZVR1cGxlX1NpemVUCisgIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAorICBfUHlBcmdfVmFQYXJzZV9TaXplVD1weXRob24zNi5fUHlBcmdfVmFQYXJzZV9TaXplVAorICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCisgIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9CdWlsZFZhbHVlX1NpemVUCmRpZmYgLS1naXQgYS9QQy9weXRob25fZXhlLnJjIGIvUEMvcHl0aG9uX2V4ZS5yYwppbmRleCA5MTc4NWExLi5hZTBiMDI5IDEwMDY0NAotLS0gYS9QQy9weXRob25fZXhlLnJjCisrKyBiL1BDL3B5dGhvbl9leGUucmMKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSA8d2ludXNlci5oPgogMSBSVF9NQU5JRkVTVCAicHl0aG9uLm1hbmlmZXN0IgogCi0xIElDT04gRElTQ0FSREFCTEUgInB5Y29uLmljbyIgCisxIElDT04gRElTQ0FSREFCTEUgImljb25zXHB5dGhvbi5pY28iIAogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9QQy9weXRob253X2V4ZS5yYyBiL1BDL3B5dGhvbndfZXhlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YmYzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9weXRob253X2V4ZS5yYwpAQCAtMCwwICsxLDQ5IEBACisvLyBSZXNvdXJjZSBzY3JpcHQgZm9yIFB5dGhvbiBjb25zb2xlIEVYRXMuCisKKyNpbmNsdWRlICJweXRob25fdmVyX3JjLmgiCisKKy8vIEluY2x1ZGUgdGhlIG1hbmlmZXN0IGZpbGUgdGhhdCBpbmRpY2F0ZXMgd2Ugc3VwcG9ydCBhbGwKKy8vIGN1cnJlbnQgdmVyc2lvbnMgb2YgV2luZG93cy4KKyNpbmNsdWRlIDx3aW51c2VyLmg+CisxIFJUX01BTklGRVNUICJweXRob24ubWFuaWZlc3QiCisKKzEgSUNPTiBESVNDQVJEQUJMRSAiaWNvbnNccHl0aG9udy5pY28iIAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gVmVyc2lvbgorLy8KKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gUFlWRVJTSU9ONjQKKyBQUk9EVUNUVkVSU0lPTiBQWVZFUlNJT042NAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgVlNfRkZfREVCVUcKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyBWT1NfX1dJTkRPV1MzMgorIEZJTEVUWVBFIFZGVF9BUFAKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDAwMDA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCBQWVRIT05fQ09NUEFOWSAiXDAiCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgIlB5dGhvblwwIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgUFlUSE9OX1ZFUlNJT04KKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAiUHl0aG9uIEFwcGxpY2F0aW9uXDAiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCBQWVRIT05fQ09QWVJJR0hUICJcMCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgInB5dGhvbnciIFBZVEhPTl9ERUJVR19FWFQgIi5leGVcMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJQeXRob25cMCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFBZVEhPTl9WRVJTSU9OCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDAsIDEyMDAKKyAgICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvUEMvdGVzdHB5LnB5IGIvUEMvdGVzdHB5LnB5CmluZGV4IDRlZjNkNGYuLjcwOWYzNWMgMTAwNjQ0Ci0tLSBhL1BDL3Rlc3RweS5weQorKysgYi9QQy90ZXN0cHkucHkKQEAgLTI2LDUgKzI2LDUgQEAKICAgICAgICAgICAgICMgQWRkIHRoZSAidGVzdCIgZGlyZWN0b3J5IHRvIFBZVEhPTlBBVEguCiAgICAgICAgICAgICBzeXMucGF0aCA9IHN5cy5wYXRoICsgW3Rlc3RdCiAKLWltcG9ydCByZWdydGVzdCAjIFN0YW5kYXJkIFB5dGhvbiB0ZXN0ZXIuCi1yZWdydGVzdC5tYWluKCkKK2ltcG9ydCBsaWJyZWdydGVzdCAjIFN0YW5kYXJkIFB5dGhvbiB0ZXN0ZXIuCitsaWJyZWdydGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1BDL3dpbnJlZy5jIGIvUEMvd2lucmVnLmMKaW5kZXggZjA4ZDlhNC4uOTUyNDgzOCAxMDA2NDQKLS0tIGEvUEMvd2lucmVnLmMKKysrIGIvUEMvd2lucmVnLmMKQEAgLTU0OSw3ICs1NDksNyBAQAogICAgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5TG9uZ19DaGVjayh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgMSk7Ci0gICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpewogICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQpAQCAtNTYzLDYgKzU2MywyNCBAQAogICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJmQsIHNpemVvZihEV09SRCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX1FXT1JEOgorICAgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQ2NCwgMSk7CisgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSBzaXplb2YoRFdPUkQ2NCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIERXT1JENjQgemVybyA9IDA7CisgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCAmemVybywgc2l6ZW9mKERXT1JENjQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERXT1JENjQgZCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJmQsIHNpemVvZihEV09SRDY0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRUdfU1o6CiAgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKICAgICAgICAgICAgIHsKQEAgLTYxOSw3ICs2MzcsNyBAQAogICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemUgKyAyOwogICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CkBAIC02NjUsNyArNjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhjaGFyLCB2aWV3Lmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC02OTAsNyArNzA4LDEzIEBACiAgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkKICAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygwKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKGludCAqKXJldERhdGFCdWYpOworICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCooRFdPUkQgKilyZXREYXRhQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19RV09SRDoKKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKihEV09SRDY0ICopcmV0RGF0YUJ1Zik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRUdfU1o6CiAgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKQEAgLTE1OTksNyArMTYyMyw3IEBACiAgICAgICAgIEFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEsIG9uZSBvZjoKICAgICAgICAgUkVHX0JJTkFSWSAtLSBCaW5hcnkgZGF0YSBpbiBhbnkgZm9ybS4KICAgICAgICAgUkVHX0RXT1JEIC0tIEEgMzItYml0IG51bWJlci4KLSAgICAgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAgICAgICBSRUdfRFdPUkRfTElUVExFX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX0RXT1JECiAgICAgICAgIFJFR19EV09SRF9CSUdfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBiaWctZW5kaWFuIGZvcm1hdC4KICAgICAgICAgUkVHX0VYUEFORF9TWiAtLSBBIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB1bmV4cGFuZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZvciBleGFtcGxlLApAQCAtMTYwOSw2ICsxNjMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHR3byBudWxsIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgUHl0aG9uIGhhbmRsZXMKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVybWluYXRpb24gYXV0b21hdGljYWxseS4KICAgICAgICAgUkVHX05PTkUgLS0gTm8gZGVmaW5lZCB2YWx1ZSB0eXBlLgorICAgICAgICBSRUdfUVdPUkQgLS0gQSA2NC1iaXQgbnVtYmVyLgorICAgICAgICBSRUdfUVdPUkRfTElUVExFX0VORElBTiAtLSBBIDY0LWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX1FXT1JELgogICAgICAgICBSRUdfUkVTT1VSQ0VfTElTVCAtLSBBIGRldmljZS1kcml2ZXIgcmVzb3VyY2UgbGlzdC4KICAgICAgICAgUkVHX1NaIC0tIEEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KICAgICB2YWx1ZTogb2JqZWN0CkBAIC0xNjMxLDcgKzE2NTcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbnJlZ19TZXRWYWx1ZUV4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgSEtFWSBrZXksIFB5X1VOSUNPREUgKnZhbHVlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXNlcnZlZCwgRFdPUkQgdHlwZSwgUHlPYmplY3QgKnZhbHVlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM4OGM4NDI2YjZjMDBlYzcgaW5wdXQ9ZjFiMTZjYmNjM2VkNDEwMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM4OGM4NDI2YjZjMDBlYzcgaW5wdXQ9OTAwYTllMzk5MGJmYjE5Nl0qLwogewogICAgIEJZVEUgKmRhdGE7CiAgICAgRFdPUkQgbGVuOwpAQCAtMTkxOCw2ICsxOTQ0LDggQEAKICAgICBBRERfSU5UKFJFR19EV09SRCk7CiAgICAgQUREX0lOVChSRUdfRFdPUkRfTElUVExFX0VORElBTik7CiAgICAgQUREX0lOVChSRUdfRFdPUkRfQklHX0VORElBTik7CisgICAgQUREX0lOVChSRUdfUVdPUkQpOworICAgIEFERF9JTlQoUkVHX1FXT1JEX0xJVFRMRV9FTkRJQU4pOwogICAgIEFERF9JTlQoUkVHX0xJTkspOwogICAgIEFERF9JTlQoUkVHX01VTFRJX1NaKTsKICAgICBBRERfSU5UKFJFR19SRVNPVVJDRV9MSVNUKTsKZGlmZiAtLWdpdCBhL1BDL3dpbnNvdW5kLmMgYi9QQy93aW5zb3VuZC5jCmluZGV4IDZiNzlkMjMuLjdmZWViY2IgMTAwNjQ0Ci0tLSBhL1BDL3dpbnNvdW5kLmMKKysrIGIvUEMvd2luc291bmQuYwpAQCAtNTIsNyArNTIsNyBAQAogIlNORF9OT1dBSVQgLSBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIHNvdW5kIGRyaXZlciBpcyBidXN5XG4iIC8vIFdpdGhvdXQgYW55IGVycm9ycwogIlxuIgogIkJlZXAoZnJlcXVlbmN5LCBkdXJhdGlvbikgLSBNYWtlIGEgYmVlcCB0aHJvdWdoIHRoZSBQQyBzcGVha2VyLlxuIgotIk1lc3NhZ2VCZWVwKHgpIC0gQ2FsbCBXaW5kb3dzIE1lc3NhZ2VCZWVwLiIpOworIk1lc3NhZ2VCZWVwKHR5cGUpIC0gQ2FsbCBXaW5kb3dzIE1lc3NhZ2VCZWVwLiIpOwogCiAvKltjbGluaWMgaW5wdXRdCiBtb2R1bGUgd2luc291bmQKQEAgLTY0LDMyICs2NCw1OCBAQAogLypbY2xpbmljIGlucHV0XQogd2luc291bmQuUGxheVNvdW5kCiAKLSAgICBzb3VuZDogUHlfVU5JQ09ERShhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KQorICAgIHNvdW5kOiBvYmplY3QKICAgICAgICAgVGhlIHNvdW5kIHRvIHBsYXk7IGEgZmlsZW5hbWUsIGRhdGEsIG9yIE5vbmUuCiAgICAgZmxhZ3M6IGludAogICAgICAgICBGbGFnIHZhbHVlcywgb3JlZCB0b2dldGhlci4gIFNlZSBtb2R1bGUgZG9jdW1lbnRhdGlvbi4KLSAgICAvCiAKIEEgd3JhcHBlciBhcm91bmQgdGhlIFdpbmRvd3MgUGxheVNvdW5kIEFQSS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbnNvdW5kX1BsYXlTb3VuZF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X1VOSUNPREUgKnNvdW5kLCBpbnQgZmxhZ3MpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWMyNGIzYTJiNDM2ODM3OCBpbnB1dD0zNDExYjFiN2MxZjM2ZDkzXSovCit3aW5zb3VuZF9QbGF5U291bmRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc291bmQsIGludCBmbGFncykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00OWEwZmQxNmEzNzJlYmViIGlucHV0PWM2M2UxZjJkODQ4ZGEyZjJdKi8KIHsKICAgICBpbnQgb2s7CisgICAgd2NoYXJfdCAqd3NvdW5kOworICAgIFB5X2J1ZmZlciB2aWV3ID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKGZsYWdzICYgU05EX0FTWU5DICYmIGZsYWdzICYgU05EX01FTU9SWSkgewotICAgICAgICAvKiBTaWRlc3RlcCByZWZlcmVuY2UgY291bnRpbmcgaGVhZGFjaGU7IHVuZm9ydHVuYXRlbHkgdGhpcyBhbHNvCi0gICAgICAgICAgICBwcmV2ZW50IFNORF9MT09QIGZyb20gbWVtb3J5LiAqLwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwbGF5IGFzeW5jaHJvbm91c2x5IGZyb20gbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzb3VuZCA9PSBQeV9Ob25lKSB7CisgICAgICAgIHdzb3VuZCA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIFNORF9NRU1PUlkpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgU05EX0FTWU5DKSB7CisgICAgICAgICAgICAvKiBTaWRlc3RlcCByZWZlcmVuY2UgY291bnRpbmcgaGVhZGFjaGU7IHVuZm9ydHVuYXRlbHkgdGhpcyBhbHNvCisgICAgICAgICAgICAgICAgcHJldmVudCBTTkRfTE9PUCBmcm9tIG1lbW9yeS4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwbGF5IGFzeW5jaHJvbm91c2x5IGZyb20gbWVtb3J5Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHNvdW5kLCAmdmlldywgUHlCVUZfU0lNUExFKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdzb3VuZCA9ICh3Y2hhcl90ICopdmlldy5idWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc291bmQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICInc291bmQnIG11c3QgYmUgc3RyIG9yIE5vbmUsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNvdW5kKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3c291bmQgPSBQeVVuaWNvZGVfQXNXaWRlQ2hhclN0cmluZyhzb3VuZCwgTlVMTCk7CisgICAgICAgIGlmICh3c291bmQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKKwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICBvayA9IFBsYXlTb3VuZFcoc291bmQsIE5VTEwsIGZsYWdzKTsKKyAgICBvayA9IFBsYXlTb3VuZFcod3NvdW5kLCBOVUxMLCBmbGFncyk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAodmlldy5vYmopIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgfSBlbHNlIGlmIChzb3VuZCAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5TWVtX0ZyZWUod3NvdW5kKTsKKyAgICB9CiAgICAgaWYgKCFvaykgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRmFpbGVkIHRvIHBsYXkgc291bmQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMDUsMTQgKzEzMSwxMyBAQAogICAgICAgICBNdXN0IGJlIGluIHRoZSByYW5nZSAzNyB0aHJvdWdoIDMyLDc2Ny4KICAgICBkdXJhdGlvbjogaW50CiAgICAgICAgIEhvdyBsb25nIHRoZSBzb3VuZCBzaG91bGQgcGxheSwgaW4gbWlsbGlzZWNvbmRzLgotICAgIC8KIAogQSB3cmFwcGVyIGFyb3VuZCB0aGUgV2luZG93cyBCZWVwIEFQSS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbnNvdW5kX0JlZXBfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgZnJlcXVlbmN5LCBpbnQgZHVyYXRpb24pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjMyMzgyZTUyZWU5YjJmYiBpbnB1dD02MjhhOTlkMmRkZjczNzk4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjMyMzgyZTUyZWU5YjJmYiBpbnB1dD00MGUzNjBjZmEwMGE1Y2YwXSovCiB7CiAgICAgQk9PTCBvazsKIApAQCAtMTM2LDggKzE2MSw3IEBACiAvKltjbGluaWMgaW5wdXRdCiB3aW5zb3VuZC5NZXNzYWdlQmVlcAogCi0gICAgeDogaW50KGNfZGVmYXVsdD0iTUJfT0siKSA9IE1CX09LCi0gICAgLworICAgIHR5cGU6IGludChjX2RlZmF1bHQ9Ik1CX09LIikgPSBNQl9PSwogCiBDYWxsIFdpbmRvd3MgTWVzc2FnZUJlZXAoeCkuCiAKQEAgLTE0NSwxMCArMTY5LDIwIEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi13aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCB4KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTFhZDg5ZTRkOGQzMGE5NTcgaW5wdXQ9YTc3NmM4YTg1Yzk4NTNmNl0qLword2luc291bmRfTWVzc2FnZUJlZXBfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBpbnQgdHlwZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xMjA4NzU0NTUxMjExMjFmIGlucHV0PWRiMTg1Zjc0MWFlMjE0MDFdKi8KIHsKLSAgICBNZXNzYWdlQmVlcCh4KTsKKyAgICBCT09MIG9rOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG9rID0gTWVzc2FnZUJlZXAodHlwZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmICghb2spIHsKKyAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlFeGNfUnVudGltZUVycm9yLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL1BDYnVpbGQvYnVpbGRfcGdvLmJhdCBiL1BDYnVpbGQvYnVpbGRfcGdvLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyYzM4Mi4uMDAwMDAwMAotLS0gYS9QQ2J1aWxkL2J1aWxkX3Bnby5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZg0KLWVjaG8uRGVwcmVjYXRpb25XYXJuaW5nOg0KLWVjaG8uICAgIFRoaXMgc2NyaXB0IGlzIGRlcHJlY2F0ZWQsIHVzZSBgYnVpbGQuYmF0IC0tcGdvYCBpbnN0ZWFkLg0KLWVjaG8uDQotDQotY2FsbCAiJX5kcDBidWlsZC5iYXQiIC0tcGdvICUqDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9nZXRfZXh0ZXJuYWxzLmJhdCBiL1BDYnVpbGQvZ2V0X2V4dGVybmFscy5iYXQKaW5kZXggOWIyYTA4NC4uYTQ1ZTczZCAxMDA2NDQKLS0tIGEvUENidWlsZC9nZXRfZXh0ZXJuYWxzLmJhdAorKysgYi9QQ2J1aWxkL2dldF9leHRlcm5hbHMuYmF0CkBAIC01NSw5ICs1NSw5IEBACiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDItMS4wLjYNCiBpZiBOT1QgIiVJbmNsdWRlU1NMJSI9PSJmYWxzZSIgc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSAgICAgbmFzbS0yLjExLjA2DQogaWYgTk9UICIlSW5jbHVkZVNTTCUiPT0iZmFsc2UiIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgICAgIG9wZW5zc2wtMS4wLjJoDQotc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS0zLjguMTEuMA0KLWlmIE5PVCAiJUluY2x1ZGVUa2ludGVyJSI9PSJmYWxzZSIgc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSB0Y2wtY29yZS04LjYuNC4yDQotaWYgTk9UICIlSW5jbHVkZVRraW50ZXIlIj09ImZhbHNlIiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlIHRrLTguNi40LjINCitzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLTMuMTQuMS4wDQoraWYgTk9UICIlSW5jbHVkZVRraW50ZXIlIj09ImZhbHNlIiBzZXQgbGlicmFyaWVzPSVsaWJyYXJpZXMlIHRjbC1jb3JlLTguNi42LjANCitpZiBOT1QgIiVJbmNsdWRlVGtpbnRlciUiPT0iZmFsc2UiIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgdGstOC42LjYuMA0KIGlmIE5PVCAiJUluY2x1ZGVUa2ludGVyJSI9PSJmYWxzZSIgc2V0IGxpYnJhcmllcz0lbGlicmFyaWVzJSB0aXgtOC40LjMuNg0KIHNldCBsaWJyYXJpZXM9JWxpYnJhcmllcyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ei01LjAuNQ0KIA0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHJlcGFyZV9zc2wuYmF0IGIvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKaW5kZXggMWJlNzNlNi4uMmY0MWFlOCAxMDA2NDQKLS0tIGEvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKKysrIGIvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKQEAgLTMsMTAgKzMsMTAgQEAKICAgaWYgIiUxIiBFUVUgIkRlYnVnIiAoDQogICAgIHNoaWZ0DQogICAgIHNldCBIT1NUX1BZVEhPTj1weXRob25fZC5leGUNCi0gICAgaWYgbm90IGV4aXN0IHB5dGhvbjM1X2QuZGxsIGV4aXQgMQ0KKyAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzZfZC5kbGwgZXhpdCAxDQogICApIEVMU0UgKA0KICAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uLmV4ZQ0KLSAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzUuZGxsIGV4aXQgMQ0KKyAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzYuZGxsIGV4aXQgMQ0KICAgKQ0KICkNCiAlSE9TVF9QWVRIT04lICIlfmRwMHByZXBhcmVfc3NsLnB5IiAlMQ0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uLnByb3BzIGIvUENidWlsZC9weXRob24ucHJvcHMKaW5kZXggZWU3MDIxMC4uNWY1ZTc1NiAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob24ucHJvcHMKKysrIGIvUENidWlsZC9weXRob24ucHJvcHMKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAKICAgICA8IS0tIERpcmVjdG9yaWVzIG9mIGV4dGVybmFsIHByb2plY3RzLiB0Y2x0ayBpcyBoYW5kbGVkIGluIHRjbHRrLnByb3BzIC0tPgogICAgIDxFeHRlcm5hbHNEaXI+JChbU3lzdGVtLklPLlBhdGhdOjpHZXRGdWxsUGF0aChgJChQeVNvdXJjZVBhdGgpZXh0ZXJuYWxzXGApKTwvRXh0ZXJuYWxzRGlyPgotICAgIDxzcWxpdGUzRGlyPiQoRXh0ZXJuYWxzRGlyKXNxbGl0ZS0zLjguMTEuMFw8L3NxbGl0ZTNEaXI+CisgICAgPHNxbGl0ZTNEaXI+JChFeHRlcm5hbHNEaXIpc3FsaXRlLTMuMTQuMS4wXDwvc3FsaXRlM0Rpcj4KICAgICA8YnoyRGlyPiQoRXh0ZXJuYWxzRGlyKWJ6aXAyLTEuMC42XDwvYnoyRGlyPgogICAgIDxsem1hRGlyPiQoRXh0ZXJuYWxzRGlyKXh6LTUuMC41XDwvbHptYURpcj4KICAgICA8b3BlbnNzbERpcj4kKEV4dGVybmFsc0RpcilvcGVuc3NsLTEuMC4yaFw8L29wZW5zc2xEaXI+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvaiBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCmluZGV4IDNhMWI1YmEuLjY4YjIxNmUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCisrKyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCkBAIC0xMjQsNiArMTI0LDcgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb2RpY3RvYmplY3QuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3Bjb2RlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9zZGVmcy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc21vZHVsZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwYXJzZXRvay5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwYXRjaGxldmVsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXHBnZW4uaCIgLz4KQEAgLTIwOSw5ICsyMTAsMTMgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblxjb25kdmFyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25caW1wb3J0ZGwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx0aHJlYWRfbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx3b3JkY29kZV9oZWxwZXJzLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmlzZWN0bW9kdWxlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9ibGFrZTJcYmxha2UybW9kdWxlLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9ibGFrZTJcYmxha2UyYl9pbXBsLmMiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9ibGFrZTJcYmxha2Uyc19pbXBsLmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9jb2RlY3Ntb2R1bGUuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2NvbGxlY3Rpb25zbW9kdWxlLmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9jc3YuYyIgLz4KQEAgLTQxNiw0ICs0MjEsNCBAQAogICA8VGFyZ2V0IE5hbWU9Il9XYXJuQWJvdXRUb29sc2V0IiBCZWZvcmVUYXJnZXRzPSJQcmVwYXJlRm9yQnVpbGQiIENvbmRpdGlvbj0iJChQbGF0Zm9ybVRvb2xzZXQpICE9ICd2MTQwJyI+CiAgICAgPFdhcm5pbmcgVGV4dD0iVG9vbHNldCAkKFBsYXRmb3JtVG9vbHNldCkgaXMgbm90IHVzZWQgZm9yIG9mZmljaWFsIGJ1aWxkcy4gWW91ciBidWlsZCBtYXkgaGF2ZSBlcnJvcnMgb3IgaW5jb21wYXRpYmlsaXRpZXMuIiAvPgogICA8L1RhcmdldD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycwppbmRleCA4MzdiNzM2Li44ZTNjY2Y4IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzCisrKyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTE3Nyw2ICsxNzcsOSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc2RlZnMuaCI+CiAgICAgICA8RmlsdGVyPkluY2x1ZGU8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3Ntb2R1bGUuaCI+CisgICAgICA8RmlsdGVyPkluY2x1ZGU8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGFyc2V0b2suaCI+CiAgICAgICA8RmlsdGVyPkluY2x1ZGU8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTQyMCw2ICs0MjMsOSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUHl0aG9uXHRocmVhZF9udC5oIj4KICAgICAgIDxGaWx0ZXI+UHl0aG9uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cd29yZGNvZGVfaGVscGVycy5oIj4KKyAgICAgIDxGaWx0ZXI+UHl0aG9uPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cY29uZHZhci5oIj4KICAgICAgIDxGaWx0ZXI+UHl0aG9uPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC00NDMsNiArNDQ5LDE1IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXF9iaXNlY3Rtb2R1bGUuYyI+CiAgICAgICA8RmlsdGVyPk1vZHVsZXM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2JsYWtlMlxibGFrZTJtb2R1bGUuYyI+CisgICAgICA8RmlsdGVyPk1vZHVsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2JsYWtlMlxibGFrZTJiX2ltcGwuYyI+CisgICAgICA8RmlsdGVyPk1vZHVsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2JsYWtlMlxibGFrZTJzX2ltcGwuYyI+CisgICAgICA8RmlsdGVyPk1vZHVsZXM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2NvZGVjc21vZHVsZS5jIj4KICAgICAgIDxGaWx0ZXI+TW9kdWxlczwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtOTgwLDQgKzk5NSw0IEBACiAgICAgICA8RmlsdGVyPlJlc291cmNlIEZpbGVzPC9GaWx0ZXI+CiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9udy52Y3hwcm9qIGIvUENidWlsZC9weXRob253LnZjeHByb2oKaW5kZXggY2FlZDFlOC4uZTQwZjY2YyAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob253LnZjeHByb2oKKysrIGIvUENidWlsZC9weXRob253LnZjeHByb2oKQEAgLTYyLDcgKzYyLDcgQEAKICAgICA8L0xpbms+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9Ii4uXFBDXHB5dGhvbl9leGUucmMiIC8+CisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSIuLlxQQ1xweXRob253X2V4ZS5yYyIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxQQ1xXaW5NYWluLmMiIC8+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3JlYWRtZS50eHQgYi9QQ2J1aWxkL3JlYWRtZS50eHQKaW5kZXggZDQ1ZWIyNy4uMzRjMmVmZSAxMDA2NDQKLS0tIGEvUENidWlsZC9yZWFkbWUudHh0CisrKyBiL1BDYnVpbGQvcmVhZG1lLnR4dApAQCAtNDgsNyArNDgsNyBAQAogICAgIFVzZWQgdG8gYnVpbGQgUHl0aG9uIHdpdGggZXh0cmEgZGVidWdnaW5nIGNhcGFiaWxpdGllcywgZXF1aXZhbGVudA0KICAgICB0byB1c2luZyAuL2NvbmZpZ3VyZSAtLXdpdGgtcHlkZWJ1ZyBvbiBVTklYLiAgQWxsIGJpbmFyaWVzIGJ1aWx0DQogICAgIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbiBoYXZlICJfZCIgYWRkZWQgdG8gdGhlaXIgbmFtZToNCi0gICAgcHl0aG9uMzVfZC5kbGwsIHB5dGhvbl9kLmV4ZSwgcGFyc2VyX2QucHlkLCBhbmQgc28gb24uICBCb3RoIHRoZQ0KKyAgICBweXRob24zNl9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gIEJvdGggdGhlDQogICAgIGJ1aWxkIGFuZCBydCAocnVuIHRlc3QpIGJhdGNoIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFjY2VwdCBhIC1kDQogICAgIG9wdGlvbiBmb3IgZGVidWcgYnVpbGRzLiAgSWYgeW91IGFyZSBidWlsZGluZyBQeXRob24gdG8gaGVscCB3aXRoDQogICAgIGRldmVsb3BtZW50IG9mIENQeXRob24sIHlvdSB3aWxsIG1vc3QgbGlrZWx5IHVzZSB0aGlzIGNvbmZpZ3VyYXRpb24uDQpAQCAtMjA0LDExICsyMDQsMTEgQEAKICAgICBmdW5jdGlvbmFsaXR5IHRvIF9zc2wgb3IgX2hhc2hsaWIuIFRoZXkgd2lsbCBub3QgY2xlYW4gdXAgdGhlaXIgb3V0cHV0DQogICAgIHdpdGggdGhlIG5vcm1hbCBDbGVhbiB0YXJnZXQ7IENsZWFuQWxsIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuDQogX3NxbGl0ZTMNCi0gICAgV3JhcHMgU1FMaXRlIDMuOC4xMS4wLCB3aGljaCBpcyBpdHNlbGYgYnVpbHQgYnkgc3FsaXRlMy52Y3hwcm9qDQorICAgIFdyYXBzIFNRTGl0ZSAzLjE0LjEuMCwgd2hpY2ggaXMgaXRzZWxmIGJ1aWx0IGJ5IHNxbGl0ZTMudmN4cHJvag0KICAgICBIb21lcGFnZToNCiAgICAgICAgIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy8NCiBfdGtpbnRlcg0KLSAgICBXcmFwcyB2ZXJzaW9uIDguNi40IG9mIHRoZSBUayB3aW5kb3dpbmcgc3lzdGVtLg0KKyAgICBXcmFwcyB2ZXJzaW9uIDguNi42IG9mIHRoZSBUayB3aW5kb3dpbmcgc3lzdGVtLg0KICAgICBIb21lcGFnZToNCiAgICAgICAgIGh0dHA6Ly93d3cudGNsLnRrLw0KIA0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcnQuYmF0IGIvUENidWlsZC9ydC5iYXQKaW5kZXggMmQ5M2I4MC4uN2Q0ZDA3MSAxMDA2NDQKLS0tIGEvUENidWlsZC9ydC5iYXQKKysrIGIvUENidWlsZC9ydC5iYXQKQEAgLTQyLDcgKzQyLDcgQEAKIGlmIE5PVCAiJTEiPT0iIiAoc2V0IHJlZ3J0ZXN0YXJncz0lcmVncnRlc3RhcmdzJSAlMSkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzDQogDQogc2V0IGV4ZT0lcHJlZml4JXB5dGhvbiVzdWZmaXglLmV4ZQ0KLXNldCBjbWQ9IiVleGUlIiAlZGFzaE8lIC1XZCAtRSAtYmIgIiVwY2J1aWxkJS4uXGxpYlx0ZXN0XHJlZ3J0ZXN0LnB5IiAlcmVncnRlc3RhcmdzJQ0KK3NldCBjbWQ9IiVleGUlIiAlZGFzaE8lIC1XZCAtRSAtYmIgLW0gdGVzdCAlcmVncnRlc3RhcmdzJQ0KIGlmIGRlZmluZWQgcW1vZGUgZ290byBRbW9kZQ0KIA0KIGVjaG8gRGVsZXRpbmcgLnB5Yy8ucHlvIGZpbGVzIC4uLg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvc3FsaXRlMy52Y3hwcm9qIGIvUENidWlsZC9zcWxpdGUzLnZjeHByb2oKaW5kZXggYzg0MWM1YS4uNGY1YjE5NiAxMDA2NDQKLS0tIGEvUENidWlsZC9zcWxpdGUzLnZjeHByb2oKKysrIGIvUENidWlsZC9zcWxpdGUzLnZjeHByb2oKQEAgLTY2LDcgKzY2LDcgQEAKICAgPEl0ZW1EZWZpbml0aW9uR3JvdXA+CiAgICAgPENsQ29tcGlsZT4KICAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoc3FsaXRlM0Rpcik7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5TUUxJVEVfQVBJPV9fZGVjbHNwZWMoZGxsZXhwb3J0KTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+U1FMSVRFX0VOQUJMRV9GVFM0O1NRTElURV9FTkFCTEVfRlRTNTtTUUxJVEVfQVBJPV9fZGVjbHNwZWMoZGxsZXhwb3J0KTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgICA8V2FybmluZ0xldmVsPkxldmVsMTwvV2FybmluZ0xldmVsPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxSZXNvdXJjZUNvbXBpbGU+CkBAIC04Niw0ICs4Niw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC90Y2x0ay5wcm9wcyBiL1BDYnVpbGQvdGNsdGsucHJvcHMKaW5kZXggMTFkYmZmYi4uNTdiYjk4YSAxMDA2NDQKLS0tIGEvUENidWlsZC90Y2x0ay5wcm9wcworKysgYi9QQ2J1aWxkL3RjbHRrLnByb3BzCkBAIC00LDggKzQsOCBAQAogICA8UHJvcGVydHlHcm91cD4KICAgICA8VGNsTWFqb3JWZXJzaW9uPjg8L1RjbE1ham9yVmVyc2lvbj4KICAgICA8VGNsTWlub3JWZXJzaW9uPjY8L1RjbE1pbm9yVmVyc2lvbj4KLSAgICA8VGNsUGF0Y2hMZXZlbD40PC9UY2xQYXRjaExldmVsPgotICAgIDxUY2xSZXZpc2lvbj4yPC9UY2xSZXZpc2lvbj4KKyAgICA8VGNsUGF0Y2hMZXZlbD42PC9UY2xQYXRjaExldmVsPgorICAgIDxUY2xSZXZpc2lvbj4wPC9UY2xSZXZpc2lvbj4KICAgICA8VGtNYWpvclZlcnNpb24+JChUY2xNYWpvclZlcnNpb24pPC9Ua01ham9yVmVyc2lvbj4KICAgICA8VGtNaW5vclZlcnNpb24+JChUY2xNaW5vclZlcnNpb24pPC9Ua01pbm9yVmVyc2lvbj4KICAgICA8VGtQYXRjaExldmVsPiQoVGNsUGF0Y2hMZXZlbCk8L1RrUGF0Y2hMZXZlbD4KQEAgLTQyLDQgKzQyLDQgQEAKICAgICA8QnVpbGREaXJUb3AgQ29uZGl0aW9uPSIkKFBsYXRmb3JtVG9vbHNldCkgPT0gJ3YxMTAnIj4kKEJ1aWxkRGlyVG9wKV9WQzExPC9CdWlsZERpclRvcD4KICAgICA8QnVpbGREaXJUb3AgQ29uZGl0aW9uPSIkKFBsYXRmb3JtVG9vbHNldCkgPT0gJ3YxMDAnIj4kKEJ1aWxkRGlyVG9wKV9WQzEwPC9CdWlsZERpclRvcD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2ogYi9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCmluZGV4IDAxNDRmYTkuLjlkYmRjNzcgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKKysrIGIvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagpAQCAtNjIsNyArNjIsNyBAQAogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwPgogICAgIDxDbENvbXBpbGU+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk7UHlfTElNSVRFRF9BUEk9MHgwMzA1MDAwMDwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk7UHlfTElNSVRFRF9BUEk9MHgwMzA2MDAwMDwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz53c29jazMyLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPgpkaWZmIC0tZ2l0IGEvUGFyc2VyL1B5dGhvbi5hc2RsIGIvUGFyc2VyL1B5dGhvbi5hc2RsCmluZGV4IGNkMDgzMmQuLmFhZGRmNjEgMTAwNjQ0Ci0tLSBhL1BhcnNlci9QeXRob24uYXNkbAorKysgYi9QYXJzZXIvUHl0aG9uLmFzZGwKQEAgLTEsNCArMSw4IEBACi0tLSBBU0RMJ3Mgc2l4IGJ1aWx0aW4gdHlwZXMgYXJlIGlkZW50aWZpZXIsIGludCwgc3RyaW5nLCBieXRlcywgb2JqZWN0LCBzaW5nbGV0b24KKy0tIEFTREwncyA3IGJ1aWx0aW4gdHlwZXMgYXJlOgorLS0gaWRlbnRpZmllciwgaW50LCBzdHJpbmcsIGJ5dGVzLCBvYmplY3QsIHNpbmdsZXRvbiwgY29uc3RhbnQKKy0tCistLSBzaW5nbGV0b246IE5vbmUsIFRydWUgb3IgRmFsc2UKKy0tIGNvbnN0YW50IGNhbiBiZSBOb25lLCB3aGVyZWFzIE5vbmUgbWVhbnMgIm5vIHZhbHVlIiBmb3Igb2JqZWN0LgogCiBtb2R1bGUgUHl0aG9uCiB7CkBAIC03MSw5ICs3NSwxMiBAQAogICAgICAgICAgfCBDYWxsKGV4cHIgZnVuYywgZXhwciogYXJncywga2V5d29yZCoga2V5d29yZHMpCiAgICAgICAgICB8IE51bShvYmplY3QgbikgLS0gYSBudW1iZXIgYXMgYSBQeU9iamVjdC4KICAgICAgICAgIHwgU3RyKHN0cmluZyBzKSAtLSBuZWVkIHRvIHNwZWNpZnkgcmF3LCB1bmljb2RlLCBldGM/CisgICAgICAgICB8IEZvcm1hdHRlZFZhbHVlKGV4cHIgdmFsdWUsIGludD8gY29udmVyc2lvbiwgZXhwcj8gZm9ybWF0X3NwZWMpCisgICAgICAgICB8IEpvaW5lZFN0cihleHByKiB2YWx1ZXMpCiAgICAgICAgICB8IEJ5dGVzKGJ5dGVzIHMpCiAgICAgICAgICB8IE5hbWVDb25zdGFudChzaW5nbGV0b24gdmFsdWUpCiAgICAgICAgICB8IEVsbGlwc2lzCisgICAgICAgICB8IENvbnN0YW50KGNvbnN0YW50IHZhbHVlKQogCiAgICAgICAgICAtLSB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gY2FuIGFwcGVhciBpbiBhc3NpZ25tZW50IGNvbnRleHQKICAgICAgICAgIHwgQXR0cmlidXRlKGV4cHIgdmFsdWUsIGlkZW50aWZpZXIgYXR0ciwgZXhwcl9jb250ZXh0IGN0eCkKZGlmZiAtLWdpdCBhL1BhcnNlci9hc2RsLnB5IGIvUGFyc2VyL2FzZGwucHkKaW5kZXggMTIxY2RhYi4uNjJmNWMxOSAxMDA2NDQKLS0tIGEvUGFyc2VyL2FzZGwucHkKKysrIGIvUGFyc2VyL2FzZGwucHkKQEAgLTMzLDcgKzMzLDggQEAKICMgU2VlIHRoZSBFQk5GIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgdG8gdW5kZXJzdGFuZCB0aGUgbG9naWNhbCBjb25uZWN0aW9uCiAjIGJldHdlZW4gdGhlIHZhcmlvdXMgbm9kZSB0eXBlcy4KIAotYnVpbHRpbl90eXBlcyA9IHsnaWRlbnRpZmllcicsICdzdHJpbmcnLCAnYnl0ZXMnLCAnaW50JywgJ29iamVjdCcsICdzaW5nbGV0b24nfQorYnVpbHRpbl90eXBlcyA9IHsnaWRlbnRpZmllcicsICdzdHJpbmcnLCAnYnl0ZXMnLCAnaW50JywgJ29iamVjdCcsICdzaW5nbGV0b24nLAorICAgICAgICAgICAgICAgICAnY29uc3RhbnQnfQogCiBjbGFzcyBBU1Q6CiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvUGFyc2VyL2FzZGxfYy5weSBiL1BhcnNlci9hc2RsX2MucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMzhjMjUzLi4xN2M4NTE3Ci0tLSBhL1BhcnNlci9hc2RsX2MucHkKKysrIGIvUGFyc2VyL2FzZGxfYy5weQpAQCAtODM0LDYgKzgzNCw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopbzsKIH0KICNkZWZpbmUgYXN0Mm9ial9zaW5nbGV0b24gYXN0Mm9ial9vYmplY3QKKyNkZWZpbmUgYXN0Mm9ial9jb25zdGFudCBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2lkZW50aWZpZXIgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9zdHJpbmcgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9ieXRlcyBhc3Qyb2JqX29iamVjdApAQCAtODcxLDYgKzg3MiwxOSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9iajJhc3RfY29uc3RhbnQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQoreworICAgIGlmIChvYmopIHsKKyAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYXJlbmEsIG9iaikgPCAwKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICB9CisgICAgKm91dCA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBvYmoyYXN0X2lkZW50aWZpZXIoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQogewogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSAmJiBvYmogIT0gUHlfTm9uZSkgewpAQCAtOTA2LDcgKzkyMCw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGkgPSAoaW50KVB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICBpID0gX1B5TG9uZ19Bc0ludChvYmopOwogICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAxOwogICAgICpvdXQgPSBpOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL2dyYW1tYXIuYyBiL1BhcnNlci9ncmFtbWFyLmMKaW5kZXggYjU5ODI5NC4uODQyMjNjNiAxMDA2NDQKLS0tIGEvUGFyc2VyL2dyYW1tYXIuYworKysgYi9QYXJzZXIvZ3JhbW1hci5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgcy0+c191cHBlciA9IDA7CiAgICAgcy0+c19hY2NlbCA9IE5VTEw7CiAgICAgcy0+c19hY2NlcHQgPSAwOwotICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKHMgLSBkLT5kX3N0YXRlLCBQeV9pbnRwdHJfdCwgaW50KTsKKyAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChzIC0gZC0+ZF9zdGF0ZSwgaW50cHRyX3QsIGludCk7CiB9CiAKIHZvaWQKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCiAgICAgICAgIHByaW50ZigiTGFiZWwgQCAlOHAsICVkOiAlc1xuIiwgbGwsIGxsLT5sbF9ubGFiZWxzLAogICAgICAgICAgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOwotICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKGxiIC0gbGwtPmxsX2xhYmVsLCBQeV9pbnRwdHJfdCwgaW50KTsKKyAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChsYiAtIGxsLT5sbF9sYWJlbCwgaW50cHRyX3QsIGludCk7CiB9CiAKIC8qIFNhbWUsIGJ1dCByYXRoZXIgZGllcyB0aGFuIGFkZHMgKi8KQEAgLTEyMiw3ICsxMjIsMTMgQEAKICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJMYWJlbCAlZC8nJXMnIG5vdCBmb3VuZFxuIiwgdHlwZSwgc3RyKTsKICAgICBQeV9GYXRhbEVycm9yKCJncmFtbWFyLmM6ZmluZGxhYmVsKCkiKTsKKworICAgIC8qIFB5X0ZhdGFsRXJyb3IoKSBpcyBkZWNsYXJlZCB3aXRoIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpLgorICAgICAgIEdDQyBlbWl0cyBhIHdhcm5pbmcgd2l0aG91dCAicmV0dXJuIDA7IiAoY29tcGlsZXIgYnVnISksIGJ1dCBDbGFuZyBpcworICAgICAgIHNtYXJ0ZXIgYW5kIGVtaXRzIGEgd2FybmluZyBvbiB0aGUgcmV0dXJuLi4uICovCisjaWZuZGVmIF9fY2xhbmdfXwogICAgIHJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLworI2VuZGlmCiB9CiAKIC8qIEZvcndhcmQgKi8KZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXIuYyBiL1BhcnNlci9wYXJzZXIuYwppbmRleCA1NmVjNTE0Li40MTA3MmM0IDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2VyLmMKKysrIGIvUGFyc2VyL3BhcnNlci5jCkBAIC0xNDAsMjEgKzE0MCwyMCBAQAogICAgIGludCBuID0gZy0+Z19sbC5sbF9ubGFiZWxzOwogCiAgICAgaWYgKHR5cGUgPT0gTkFNRSkgewotICAgICAgICBjb25zdCBjaGFyICpzID0gc3RyOwogICAgICAgICBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKICAgICAgICAgICAgIGlmIChsLT5sYl90eXBlICE9IE5BTUUgfHwgbC0+bGJfc3RyID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICBsLT5sYl9zdHJbMF0gIT0gc1swXSB8fAotICAgICAgICAgICAgICAgIHN0cmNtcChsLT5sYl9zdHIsIHMpICE9IDApCisgICAgICAgICAgICAgICAgbC0+bGJfc3RyWzBdICE9IHN0clswXSB8fAorICAgICAgICAgICAgICAgIHN0cmNtcChsLT5sYl9zdHIsIHN0cikgIT0gMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKICNpZiAwCiAgICAgICAgICAgICAvKiBMZWF2aW5nIHRoaXMgaW4gYXMgYW4gZXhhbXBsZSAqLwogICAgICAgICAgICAgaWYgKCEocHMtPnBfZmxhZ3MgJiBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ3cnICYmIHN0cmNtcChzLCAid2l0aCIpID09IDApCisgICAgICAgICAgICAgICAgaWYgKHN0clswXSA9PSAndycgJiYgc3RyY21wKHN0ciwgIndpdGgiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbm90IGEga2V5d29yZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzBdID09ICdhJyAmJiBzdHJjbXAocywgImFzIikgPT0gMCkKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJbMF0gPT0gJ2EnICYmIHN0cmNtcChzdHIsICJhcyIpID09IDApCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBub3QgYSBrZXl3b3JkIHlldCAqLwogICAgICAgICAgICAgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2V0b2suYyBiL1BhcnNlci9wYXJzZXRvay5jCmluZGV4IDYyOWRlZTUuLjFmNDY3ZDYgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXRvay5jCisrKyBiL1BhcnNlci9wYXJzZXRvay5jCkBAIC0xNjEsMTAgKzE2MSwxMCBAQAogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiAjaWYgMAotc3RhdGljIGNoYXIgd2l0aF9tc2dbXSA9CitzdGF0aWMgY29uc3QgY2hhciB3aXRoX21zZ1tdID0KICIlczolZDogV2FybmluZzogJ3dpdGgnIHdpbGwgYmVjb21lIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBQeXRob24gMi42XG4iOwogCi1zdGF0aWMgY2hhciBhc19tc2dbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhc19tc2dbXSA9CiAiJXM6JWQ6IFdhcm5pbmc6ICdhcycgd2lsbCBiZWNvbWUgYSByZXNlcnZlZCBrZXl3b3JkIGluIFB5dGhvbiAyLjZcbiI7CiAKIHN0YXRpYyB2b2lkCkBAIC0yNTUsNyArMjU1LDcgQEAKICNlbmRpZgogICAgICAgICBpZiAoYSA+PSB0b2stPmxpbmVfc3RhcnQpCiAgICAgICAgICAgICBjb2xfb2Zmc2V0ID0gUHlfU0FGRV9ET1dOQ0FTVChhIC0gdG9rLT5saW5lX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfaW50cHRyX3QsIGludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCwgaW50KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgY29sX29mZnNldCA9IC0xOwogCmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbi5jIGIvUGFyc2VyL3BnZW4uYwppbmRleCBmMzAzMWFlLi5iZTM1ZTAyIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbi5jCisrKyBiL1BhcnNlci9wZ2VuLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAjaWZkZWYgUHlfREVCVUcKIAotc3RhdGljIGNoYXIgUkVRTkZNVFtdID0gIm1ldGFjb21waWxlOiBsZXNzIHRoYW4gJWQgY2hpbGRyZW5cbiI7CitzdGF0aWMgY29uc3QgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKIAogI2RlZmluZSBSRVFOKGksIGNvdW50KSBkbyB7IFwKICAgICBpZiAoaSA8IGNvdW50KSB7IFwKQEAgLTM3OSw3ICszNzksNyBAQAogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgdm9pZCBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY29uc3QgY2hhciAqbXNnKTsKIHN0YXRpYyB2b2lkIHNpbXBsaWZ5KGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogc3RhdGljIHZvaWQgY29udmVydChkZmEgKmQsIGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogCkBAIC00OTQsNyArNDk0LDcgQEAKIAogc3RhdGljIHZvaWQKIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjaGFyICptc2cpCisgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNvbnN0IGNoYXIgKm1zZykKIHsKICAgICBpbnQgaSwgaWJpdCwgaWFyYzsKICAgICBzc19zdGF0ZSAqeXk7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbm1haW4uYyBiL1BhcnNlci9wZ2VubWFpbi5jCmluZGV4IDBmMDU1ZDYuLmU5ZDMwODIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VubWFpbi5jCisrKyBiL1BhcnNlci9wZ2VubWFpbi5jCkBAIC0yNyw3ICsyNyw3IEBACiBpbnQgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnOwogCiAvKiBGb3J3YXJkICovCi1ncmFtbWFyICpnZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKTsKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogCiB2b2lkIFB5X0V4aXQoaW50KSBfUHlfTk9fUkVUVVJOOwogCkBAIC0zNyw2ICszNywxNSBAQAogICAgIGV4aXQoc3RzKTsKIH0KIAorI2lmZGVmIFdJVEhfVEhSRUFECisvKiBOZWVkZWQgYnkgb2JtYWxsb2MuYyAqLworaW50IFB5R0lMU3RhdGVfQ2hlY2sodm9pZCkKK3sgcmV0dXJuIDE7IH0KKyNlbmRpZgorCit2b2lkIF9QeU1lbV9EdW1wVHJhY2ViYWNrKGludCBmZCwgY29uc3Qgdm9pZCAqcHRyKQore30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKQEAgLTc2LDcgKzg1LDcgQEAKIH0KIAogZ3JhbW1hciAqCi1nZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQorZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBGSUxFICpmcDsKICAgICBub2RlICpuOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IDE4NGZmZTcuLjkwYTgyNzAgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTIwMiw4ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfbm9ybWFsX25hbWUoY29uc3QgY2hhciAqcykgIC8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLwogewogICAgIGNoYXIgYnVmWzEzXTsKICAgICBpbnQgaTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7CiAgICAgICAgICAgICAgICAgY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbiwgdG9rKTsKLSAgICAgICAgICAgICAgICBjaGFyKiBxOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHE7CiAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwpAQCAtMTQ3NSwxNyArMTQ3NSwxOSBAQAogICAgIG5vbmFzY2lpID0gMDsKICAgICBpZiAoaXNfcG90ZW50aWFsX2lkZW50aWZpZXJfc3RhcnQoYykpIHsKICAgICAgICAgLyogUHJvY2VzcyBiIiIsIHIiIiwgdSIiLCBiciIiIGFuZCByYiIiICovCi0gICAgICAgIGludCBzYXdfYiA9IDAsIHNhd19yID0gMCwgc2F3X3UgPSAwOworICAgICAgICBpbnQgc2F3X2IgPSAwLCBzYXdfciA9IDAsIHNhd191ID0gMCwgc2F3X2YgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCEoc2F3X2IgfHwgc2F3X3UpICYmIChjID09ICdiJyB8fCBjID09ICdCJykpCisgICAgICAgICAgICBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfZikgJiYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSkKICAgICAgICAgICAgICAgICBzYXdfYiA9IDE7CiAgICAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBsaXRlcmFsIHdlIGRvbid0CiAgICAgICAgICAgICAgICB3YW50IHRvIHN1cHBvcnQgaXQgaW4gYXJiaXRyYXJ5IG9yZGVyIGxpa2UgYnl0ZSBsaXRlcmFscy4gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X3IpICYmIChjID09ICd1JyB8fCBjID09ICdVJykpCisgICAgICAgICAgICBlbHNlIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19yIHx8IHNhd19mKSAmJiAoYyA9PSAndScgfHwgYyA9PSAnVScpKQogICAgICAgICAgICAgICAgIHNhd191ID0gMTsKICAgICAgICAgICAgIC8qIHVyIiIgYW5kIHJ1IiIgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X3IgfHwgc2F3X3UpICYmIChjID09ICdyJyB8fCBjID09ICdSJykpCiAgICAgICAgICAgICAgICAgc2F3X3IgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfZiB8fCBzYXdfYiB8fCBzYXdfdSkgJiYgKGMgPT0gJ2YnIHx8IGMgPT0gJ0YnKSkKKyAgICAgICAgICAgICAgICBzYXdfZiA9IDE7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CkBAIC0xNTg1LDEwICsxNTg3LDYgQEAKICAgICAgICAgaWYgKGMgPT0gJzAnKSB7CiAgICAgICAgICAgICAvKiBIZXgsIG9jdGFsIG9yIGJpbmFyeSAtLSBtYXliZS4gKi8KICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJykKLSAgICAgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOwotICAgICAgICAgICAgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotICAgICAgICAgICAgICAgIGdvdG8gaW1hZ2luYXJ5OwogICAgICAgICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CiAKICAgICAgICAgICAgICAgICAvKiBIZXggKi8KQEAgLTE3MzksNyArMTczNyw3IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBlbmRfcXVvdGVfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykKLSAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL190ZXN0ZW1iZWQuYyBiL1Byb2dyYW1zL190ZXN0ZW1iZWQuYwppbmRleCBhYjZhOGM3Li4zOTY4Mzk5IDEwMDY0NAotLS0gYS9Qcm9ncmFtcy9fdGVzdGVtYmVkLmMKKysrIGIvUHJvZ3JhbXMvX3Rlc3RlbWJlZC5jCkBAIC00MSw3ICs0MSw3IEBACiAjZW5kaWYKICAgICBpbnQgaSwgajsKIAotICAgIGZvciAoaT0wOyBpPDM7IGkrKykgeworICAgIGZvciAoaT0wOyBpPDE1OyBpKyspIHsKICAgICAgICAgcHJpbnRmKCItLS0gUGFzcyAlZCAtLS1cbiIsIGkpOwogICAgICAgICBfdGVzdGVtYmVkX1B5X0luaXRpYWxpemUoKTsKICAgICAgICAgbWFpbnN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL3B5dGhvbi5jIGIvUHJvZ3JhbXMvcHl0aG9uLmMKaW5kZXggMzdiMTBiOC4uYTdhZmJjNyAxMDA2NDQKLS0tIGEvUHJvZ3JhbXMvcHl0aG9uLmMKKysrIGIvUHJvZ3JhbXMvcHl0aG9uLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAgICBpbnQgaSwgcmVzOwogICAgIGNoYXIgKm9sZGxvYzsKIAorICAgIC8qIEZvcmNlIG1hbGxvYygpIGFsbG9jYXRvciB0byBib290c3RyYXAgUHl0aG9uICovCisgICAgKHZvaWQpX1B5TWVtX1NldHVwQWxsb2NhdG9ycygibWFsbG9jIik7CisKICAgICBhcmd2X2NvcHkgPSAod2NoYXJfdCAqKilQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIChhcmdjKzEpKTsKICAgICBhcmd2X2NvcHkyID0gKHdjaGFyX3QgKiopUHlNZW1fUmF3TWFsbG9jKHNpemVvZih3Y2hhcl90KikgKiAoYXJnYysxKSk7CiAgICAgaWYgKCFhcmd2X2NvcHkgfHwgIWFyZ3ZfY29weTIpIHsKQEAgLTYyLDcgKzY1LDEzIEBACiAKICAgICBzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2MpOwogICAgIFB5TWVtX1Jhd0ZyZWUob2xkbG9jKTsKKwogICAgIHJlcyA9IFB5X01haW4oYXJnYywgYXJndl9jb3B5KTsKKworICAgIC8qIEZvcmNlIGFnYWluIG1hbGxvYygpIGFsbG9jYXRvciB0byByZWxlYXNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICAgYmVmb3JlIFB5X01haW4oKSAqLworICAgICh2b2lkKV9QeU1lbV9TZXR1cEFsbG9jYXRvcnMoIm1hbGxvYyIpOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weTJbaV0pOwogICAgIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9QeXRob24tYXN0LmMgYi9QeXRob24vUHl0aG9uLWFzdC5jCmluZGV4IGVkZmNiYWQuLjExOTNjN2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9QeXRob24tYXN0LmMKKysrIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwpAQCAtMjg1LDYgKzI4NSwxOCBAQAogc3RhdGljIGNoYXIgKlN0cl9maWVsZHNbXT17CiAgICAgInMiLAogfTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgKkZvcm1hdHRlZFZhbHVlX3R5cGU7CitfUHlfSURFTlRJRklFUihjb252ZXJzaW9uKTsKK19QeV9JREVOVElGSUVSKGZvcm1hdF9zcGVjKTsKK3N0YXRpYyBjaGFyICpGb3JtYXR0ZWRWYWx1ZV9maWVsZHNbXT17CisgICAgInZhbHVlIiwKKyAgICAiY29udmVyc2lvbiIsCisgICAgImZvcm1hdF9zcGVjIiwKK307CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpKb2luZWRTdHJfdHlwZTsKK3N0YXRpYyBjaGFyICpKb2luZWRTdHJfZmllbGRzW109eworICAgICJ2YWx1ZXMiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkJ5dGVzX3R5cGU7CiBzdGF0aWMgY2hhciAqQnl0ZXNfZmllbGRzW109ewogICAgICJzIiwKQEAgLTI5NCw2ICszMDYsMTAgQEAKICAgICAidmFsdWUiLAogfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkVsbGlwc2lzX3R5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpDb25zdGFudF90eXBlOworc3RhdGljIGNoYXIgKkNvbnN0YW50X2ZpZWxkc1tdPXsKKyAgICAidmFsdWUiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkF0dHJpYnV0ZV90eXBlOwogX1B5X0lERU5USUZJRVIoYXR0cik7CiBfUHlfSURFTlRJRklFUihjdHgpOwpAQCAtNjk3LDYgKzcxMyw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopbzsKIH0KICNkZWZpbmUgYXN0Mm9ial9zaW5nbGV0b24gYXN0Mm9ial9vYmplY3QKKyNkZWZpbmUgYXN0Mm9ial9jb25zdGFudCBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2lkZW50aWZpZXIgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9zdHJpbmcgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9ieXRlcyBhc3Qyb2JqX29iamVjdApAQCAtNzM0LDYgKzc1MSwxOSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9iajJhc3RfY29uc3RhbnQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQoreworICAgIGlmIChvYmopIHsKKyAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYXJlbmEsIG9iaikgPCAwKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICB9CisgICAgKm91dCA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBvYmoyYXN0X2lkZW50aWZpZXIoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQogewogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSAmJiBvYmogIT0gUHlfTm9uZSkgewpAQCAtNzY5LDcgKzc5OSw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGkgPSAoaW50KVB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICBpID0gX1B5TG9uZ19Bc0ludChvYmopOwogICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAxOwogICAgICpvdXQgPSBpOwpAQCAtOTE3LDYgKzk0NywxMSBAQAogICAgIGlmICghTnVtX3R5cGUpIHJldHVybiAwOwogICAgIFN0cl90eXBlID0gbWFrZV90eXBlKCJTdHIiLCBleHByX3R5cGUsIFN0cl9maWVsZHMsIDEpOwogICAgIGlmICghU3RyX3R5cGUpIHJldHVybiAwOworICAgIEZvcm1hdHRlZFZhbHVlX3R5cGUgPSBtYWtlX3R5cGUoIkZvcm1hdHRlZFZhbHVlIiwgZXhwcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVkVmFsdWVfZmllbGRzLCAzKTsKKyAgICBpZiAoIUZvcm1hdHRlZFZhbHVlX3R5cGUpIHJldHVybiAwOworICAgIEpvaW5lZFN0cl90eXBlID0gbWFrZV90eXBlKCJKb2luZWRTdHIiLCBleHByX3R5cGUsIEpvaW5lZFN0cl9maWVsZHMsIDEpOworICAgIGlmICghSm9pbmVkU3RyX3R5cGUpIHJldHVybiAwOwogICAgIEJ5dGVzX3R5cGUgPSBtYWtlX3R5cGUoIkJ5dGVzIiwgZXhwcl90eXBlLCBCeXRlc19maWVsZHMsIDEpOwogICAgIGlmICghQnl0ZXNfdHlwZSkgcmV0dXJuIDA7CiAgICAgTmFtZUNvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIk5hbWVDb25zdGFudCIsIGV4cHJfdHlwZSwKQEAgLTkyNCw2ICs5NTksOCBAQAogICAgIGlmICghTmFtZUNvbnN0YW50X3R5cGUpIHJldHVybiAwOwogICAgIEVsbGlwc2lzX3R5cGUgPSBtYWtlX3R5cGUoIkVsbGlwc2lzIiwgZXhwcl90eXBlLCBOVUxMLCAwKTsKICAgICBpZiAoIUVsbGlwc2lzX3R5cGUpIHJldHVybiAwOworICAgIENvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIkNvbnN0YW50IiwgZXhwcl90eXBlLCBDb25zdGFudF9maWVsZHMsIDEpOworICAgIGlmICghQ29uc3RhbnRfdHlwZSkgcmV0dXJuIDA7CiAgICAgQXR0cmlidXRlX3R5cGUgPSBtYWtlX3R5cGUoIkF0dHJpYnV0ZSIsIGV4cHJfdHlwZSwgQXR0cmlidXRlX2ZpZWxkcywgMyk7CiAgICAgaWYgKCFBdHRyaWJ1dGVfdHlwZSkgcmV0dXJuIDA7CiAgICAgU3Vic2NyaXB0X3R5cGUgPSBtYWtlX3R5cGUoIlN1YnNjcmlwdCIsIGV4cHJfdHlwZSwgU3Vic2NyaXB0X2ZpZWxkcywgMyk7CkBAIC0yMDYzLDYgKzIxMDAsNDIgQEAKIH0KIAogZXhwcl90eQorRm9ybWF0dGVkVmFsdWUoZXhwcl90eSB2YWx1ZSwgaW50IGNvbnZlcnNpb24sIGV4cHJfdHkgZm9ybWF0X3NwZWMsIGludCBsaW5lbm8sCisgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgdmFsdWUgaXMgcmVxdWlyZWQgZm9yIEZvcm1hdHRlZFZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEZvcm1hdHRlZFZhbHVlX2tpbmQ7CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSA9IHZhbHVlOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbiA9IGNvbnZlcnNpb247CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyA9IGZvcm1hdF9zcGVjOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQorSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIHAgPSAoZXhwcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gSm9pbmVkU3RyX2tpbmQ7CisgICAgcC0+di5Kb2luZWRTdHIudmFsdWVzID0gdmFsdWVzOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQogQnl0ZXMoYnl0ZXMgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewogICAgIGV4cHJfdHkgcDsKQEAgLTIxMTQsNiArMjE4NywyNSBAQAogfQogCiBleHByX3R5CitDb25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBDb25zdGFudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBDb25zdGFudF9raW5kOworICAgIHAtPnYuQ29uc3RhbnQudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEF0dHJpYnV0ZShleHByX3R5IHZhbHVlLCBpZGVudGlmaWVyIGF0dHIsIGV4cHJfY29udGV4dF90eSBjdHgsIGludCBsaW5lbm8sIGludAogICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewpAQCAtMzE2NCw2ICszMjU2LDM0IEBACiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhGb3JtYXR0ZWRWYWx1ZV90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdmFsdWUsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfaW50KG8tPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbik7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2NvbnZlcnNpb24sIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfZm9ybWF0X3NwZWMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhKb2luZWRTdHJfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2xpc3Qoby0+di5Kb2luZWRTdHIudmFsdWVzLCBhc3Qyb2JqX2V4cHIpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZXMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEJ5dGVzX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC0zMTg2LDYgKzMzMDYsMTUgQEAKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoRWxsaXBzaXNfdHlwZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhDb25zdGFudF90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfY29uc3RhbnQoby0+di5Db25zdGFudC52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQXR0cmlidXRlX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC02MDI1LDYgKzYxNTQsODYgQEAKICAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgIGludCBjb252ZXJzaW9uOworICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworCisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVcIiBtaXNzaW5nIGZyb20gRm9ybWF0dGVkVmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9jb252ZXJzaW9uKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF9jb252ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2ludCh0bXAsICZjb252ZXJzaW9uLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnNpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9mb3JtYXRfc3BlYykpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfZm9ybWF0X3NwZWMpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcih0bXAsICZmb3JtYXRfc3BlYywgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXRfc3BlYyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IEZvcm1hdHRlZFZhbHVlKHZhbHVlLCBjb252ZXJzaW9uLCBmb3JtYXRfc3BlYywgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgYXJlbmEpOworICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilKb2luZWRTdHJfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGFzZGxfc2VxKiB2YWx1ZXM7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZXMpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayh0bXApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkpvaW5lZFN0ciBmaWVsZCBcInZhbHVlc1wiIG11c3QgYmUgYSBsaXN0LCBub3QgYSAlLjIwMHMiLCB0bXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gUHlMaXN0X0dFVF9TSVpFKHRtcCk7CisgICAgICAgICAgICB2YWx1ZXMgPSBfUHlfYXNkbF9zZXFfbmV3KGxlbiwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKFB5TGlzdF9HRVRfSVRFTSh0bXAsIGkpLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVCh2YWx1ZXMsIGksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZXNcIiBtaXNzaW5nIGZyb20gSm9pbmVkU3RyIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gSm9pbmVkU3RyKHZhbHVlcywgbGluZW5vLCBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUJ5dGVzX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNjA3OSw2ICs2Mjg4LDI4IEBACiAgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUNvbnN0YW50X3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBjb25zdGFudCB2YWx1ZTsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9jb25zdGFudCh0bXAsICZ2YWx1ZSwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZVwiIG1pc3NpbmcgZnJvbSBDb25zdGFudCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IENvbnN0YW50KHZhbHVlLCBsaW5lbm8sIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNzM0NiwxMiArNzU3NywxOCBAQAogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ2FsbCIsIChQeU9iamVjdCopQ2FsbF90eXBlKSA8IDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTnVtIiwgKFB5T2JqZWN0KilOdW1fdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0ciIsIChQeU9iamVjdCopU3RyX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3JtYXR0ZWRWYWx1ZSIsCisgICAgICAgIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpvaW5lZFN0ciIsIChQeU9iamVjdCopSm9pbmVkU3RyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCeXRlcyIsIChQeU9iamVjdCopQnl0ZXNfdHlwZSkgPCAwKSByZXR1cm4KICAgICAgICAgTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5hbWVDb25zdGFudCIsIChQeU9iamVjdCopTmFtZUNvbnN0YW50X3R5cGUpIDwKICAgICAgICAgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFbGxpcHNpcyIsIChQeU9iamVjdCopRWxsaXBzaXNfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbnN0YW50IiwgKFB5T2JqZWN0KilDb25zdGFudF90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXR0cmlidXRlIiwgKFB5T2JqZWN0KilBdHRyaWJ1dGVfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YnNjcmlwdCIsIChQeU9iamVjdCopU3Vic2NyaXB0X3R5cGUpIDwgMCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9fd2FybmluZ3MuYyBiL1B5dGhvbi9fd2FybmluZ3MuYwppbmRleCA5NzhiYWQxLi40MGY1YzhlIDEwMDY0NAotLS0gYS9QeXRob24vX3dhcm5pbmdzLmMKKysrIGIvUHl0aG9uL193YXJuaW5ncy5jCkBAIC00MCwxMiArNDAsMTEgQEAKICAgIEEgTlVMTCByZXR1cm4gdmFsdWUgY2FuIG1lYW4gZmFsc2Ugb3IgYW4gZXJyb3IuCiAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWdldF93YXJuaW5nc19hdHRyKGNvbnN0IGNoYXIgKmF0dHIpCitnZXRfd2FybmluZ3NfYXR0cihjb25zdCBjaGFyICphdHRyLCBpbnQgdHJ5X2ltcG9ydCkKIHsKICAgICBzdGF0aWMgUHlPYmplY3QgKndhcm5pbmdzX3N0ciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFsbF9tb2R1bGVzOwotICAgIFB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGU7Ci0gICAgaW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlLCAqb2JqOwogCiAgICAgaWYgKHdhcm5pbmdzX3N0ciA9PSBOVUxMKSB7CiAgICAgICAgIHdhcm5pbmdzX3N0ciA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCJ3YXJuaW5ncyIpOwpAQCAtNTMsMTUgKzUyLDM0IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLSAgICByZXN1bHQgPSBQeURpY3RfQ29udGFpbnMoYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSB8fCByZXN1bHQgPT0gMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKLSAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKSkKKyAgICAvKiBkb24ndCB0cnkgdG8gaW1wb3J0IGFmdGVyIHRoZSBzdGFydCBvZiB0aGUgUHl0aG9uIGZpbmFsbGl6YXRpb24gKi8KKyAgICBpZiAodHJ5X2ltcG9ydCAmJiBfUHlfRmluYWxpemluZyA9PSBOVUxMKSB7CisgICAgICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydCh3YXJuaW5nc19zdHIpOworICAgICAgICBpZiAod2FybmluZ3NfbW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHRoZSBDIGltcGxlbWVudGF0aW9uIGlmIHdlIGNhbm5vdCBnZXQKKyAgICAgICAgICAgICAgIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKworICAgICAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKKyAgICAgICAgaWYgKHdhcm5pbmdzX21vZHVsZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgUHlfSU5DUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgfQorCisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cikpIHsKKyAgICAgICAgUHlfREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKTsKKyAgICBQeV9ERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiAKQEAgLTcwLDcgKzg4LDcgQEAKIHsKICAgICBQeU9iamVjdCAqcmVnaXN0cnk7CiAKLSAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiKTsKKyAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiLCAwKTsKICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODcsNyArMTA1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqZGVmYXVsdF9hY3Rpb247CiAKLSAgICBkZWZhdWx0X2FjdGlvbiA9IGdldF93YXJuaW5nc19hdHRyKCJkZWZhdWx0YWN0aW9uIik7CisgICAgZGVmYXVsdF9hY3Rpb24gPSBnZXRfd2FybmluZ3NfYXR0cigiZGVmYXVsdGFjdGlvbiIsIDApOwogICAgIGlmIChkZWZhdWx0X2FjdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExMCw3ICsxMjgsNyBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCAqd2FybmluZ3NfZmlsdGVyczsKIAotICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIpOworICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIsIDApOwogICAgIGlmICh3YXJuaW5nc19maWx0ZXJzID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4Nyw4ICszMDUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotc2hvd193YXJuaW5nKFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKnRleHQsIFB5T2JqZWN0Ci0gICAgICAgICAgICAgICAgKmNhdGVnb3J5LCBQeU9iamVjdCAqc291cmNlbGluZSkKK3Nob3dfd2FybmluZyhQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICp0ZXh0LAorICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUpCiB7CiAgICAgUHlPYmplY3QgKmZfc3RkZXJyOwogICAgIFB5T2JqZWN0ICpuYW1lOwpAQCAtMzU5LDEwICszNzcsNjQgQEAKICAgICBQeUVycl9DbGVhcigpOwogfQogCitzdGF0aWMgaW50CitjYWxsX3Nob3dfd2FybmluZyhQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICp0ZXh0LCBQeU9iamVjdCAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKmxpbmVub19vYmosCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlbGluZSwgUHlPYmplY3QgKnNvdXJjZSkKK3sKKyAgICBQeU9iamVjdCAqc2hvd19mbiwgKm1zZywgKnJlcywgKndhcm5tc2dfY2xzID0gTlVMTDsKKworICAgIC8qIElmIHRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzIHNldCwgdHJ5IHRvIGdldCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorICAgICAgIFRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byBsb2cgdGhlIHRyYWNlYmFjayB3aGVyZSB0aGUgc291cmNlCisgICAgICAgd2FzIGFsbG9jYXRlZCwgd2hlcmVhcyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBkb2VzbnQuICovCisgICAgc2hvd19mbiA9IGdldF93YXJuaW5nc19hdHRyKCJfc2hvd3dhcm5tc2ciLCBzb3VyY2UgIT0gTlVMTCk7CisgICAgaWYgKHNob3dfZm4gPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHNob3dfZm4pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIndhcm5pbmdzLl9zaG93d2Fybm1zZygpIG11c3QgYmUgc2V0IHRvIGEgY2FsbGFibGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB3YXJubXNnX2NscyA9IGdldF93YXJuaW5nc19hdHRyKCJXYXJuaW5nTWVzc2FnZSIsIDApOworICAgIGlmICh3YXJubXNnX2NscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgInVuYWJsZSB0byBnZXQgd2FybmluZ3MuV2FybmluZ01lc3NhZ2UiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtc2cgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHdhcm5tc2dfY2xzLCBtZXNzYWdlLCBjYXRlZ29yeSwKKyAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm9fb2JqLCBQeV9Ob25lLCBQeV9Ob25lLCBzb3VyY2UsCisgICAgICAgICAgICBOVUxMKTsKKyAgICBQeV9ERUNSRUYod2Fybm1zZ19jbHMpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19mbiwgbXNnLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoc2hvd19mbik7CisgICAgUHlfREVDUkVGKG1zZyk7CisKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHNob3dfZm4pOworICAgIHJldHVybiAtMTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5fZXhwbGljaXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKICAgICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLAotICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lKQorICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lLAorICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlKQogewogICAgIFB5T2JqZWN0ICprZXkgPSBOVUxMLCAqdGV4dCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMLCAqbGluZW5vX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKml0ZW0gPSBOVUxMOwpAQCAtNDcwLDMxICs1NDIsOSBAQAogICAgIGlmIChyYyA9PSAxKSAgLyogQWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgbW9kdWxlLiAqLwogICAgICAgICBnb3RvIHJldHVybl9ub25lOwogICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpzaG93X2Z4biA9IGdldF93YXJuaW5nc19hdHRyKCJzaG93d2FybmluZyIpOwotICAgICAgICBpZiAoc2hvd19meG4gPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0KLSAgICAgICAgICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhzaG93X2Z4bikpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxhYmxlIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19meG4sIG1lc3NhZ2UsIGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisgICAgICAgIGlmIChjYWxsX3Nob3dfd2FybmluZyhjYXRlZ29yeSwgdGV4dCwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVub19vYmosIHNvdXJjZWxpbmUsIHNvdXJjZSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KICAgICBlbHNlIC8qIGlmIChyYyA9PSAtMSkgKi8KICAgICAgICAgZ290byBjbGVhbnVwOwpAQCAtNzM4LDcgKzc4OCw4IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCitkb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgICAgIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCAqbW9kdWxlLCAqcmVnaXN0cnksICpyZXM7CiAgICAgaW50IGxpbmVubzsKQEAgLTc0Nyw3ICs3OTgsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNvdXJjZSk7CiAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICAgICBQeV9ERUNSRUYocmVnaXN0cnkpOwogICAgIFB5X0RFQ1JFRihtb2R1bGUpOwpAQCAtNzU3LDI1ICs4MDgsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3YXJuaW5nc193YXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmt3X2xpc3RbXSA9IHsgIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAic3RhY2tsZXZlbCIsIDAgfTsKLSAgICBQeU9iamVjdCAqbWVzc2FnZSwgKmNhdGVnb3J5ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dfbGlzdFtdID0geyJtZXNzYWdlIiwgImNhdGVnb3J5IiwgInN0YWNrbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICptZXNzYWdlLCAqY2F0ZWdvcnkgPSBOVUxMLCAqc291cmNlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9uOndhcm4iLCBrd19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T25POndhcm4iLCBrd19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCwgJnNvdXJjZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgY2F0ZWdvcnkgPSBnZXRfY2F0ZWdvcnkobWVzc2FnZSwgY2F0ZWdvcnkpOwogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJldHVybiBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCwgc291cmNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5pbmdzX3dhcm5fZXhwbGljaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dkX2xpc3RbXSA9IHsibWVzc2FnZSIsICJjYXRlZ29yeSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIiwgInJlZ2lzdHJ5IiwgIm1vZHVsZV9nbG9iYWxzIiwgMH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUiLCAicmVnaXN0cnkiLCAibW9kdWxlX2dsb2JhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwgMH07CiAgICAgUHlPYmplY3QgKm1lc3NhZ2U7CiAgICAgUHlPYmplY3QgKmNhdGVnb3J5OwogICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKQEAgLTc4MywxMCArODM2LDExIEBACiAgICAgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlZ2lzdHJ5ID0gTlVMTDsKICAgICBQeU9iamVjdCAqbW9kdWxlX2dsb2JhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzb3VyY2VvYmogPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PVWl8T09POndhcm5fZXhwbGljaXQiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT1VpfE9PT086d2Fybl9leHBsaWNpdCIsCiAgICAgICAgICAgICAgICAga3dkX2xpc3QsICZtZXNzYWdlLCAmY2F0ZWdvcnksICZmaWxlbmFtZSwgJmxpbmVubywgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAmcmVnaXN0cnksICZtb2R1bGVfZ2xvYmFscykpCisgICAgICAgICAgICAgICAgJnJlZ2lzdHJ5LCAmbW9kdWxlX2dsb2JhbHMsICZzb3VyY2VvYmopKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChtb2R1bGVfZ2xvYmFscykgewpAQCAtODQyLDE0ICs4OTYsMTQgQEAKIAogICAgICAgICAvKiBIYW5kbGUgdGhlIHdhcm5pbmcuICovCiAgICAgICAgIHJldHVybmVkID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIHNvdXJjZV9saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSwgc291cmNlb2JqKTsKICAgICAgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKICAgICAgICAgcmV0dXJuIHJldHVybmVkOwogICAgIH0KIAogIHN0YW5kYXJkX2NhbGw6CiAgICAgcmV0dXJuIHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIE5VTEwsIHNvdXJjZW9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC04NjQsMTQgKzkxOCwxNCBAQAogCiBzdGF0aWMgaW50CiB3YXJuX3VuaWNvZGUoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKLSAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKQorICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKIAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogCi0gICAgcmVzID0gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJlcyA9IGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsLCBzb3VyY2UpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtODc5LDEyICs5MzMsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorX1B5RXJyX1dhcm5Gb3JtYXRWKFB5T2JqZWN0ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKK3sKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBpbnQgcmVzOworCisgICAgbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXMgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsLCBzb3VyY2UpOworICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKKyAgICByZXR1cm4gcmVzOworfQorCiBpbnQKIFB5RXJyX1dhcm5Gb3JtYXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLSAgICBpbnQgcmV0OwotICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIGludCByZXM7CiAgICAgdmFfbGlzdCB2YXJnczsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKQEAgLTg5MiwyNSArOTYyLDM4IEBACiAjZWxzZQogICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgotICAgIG1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICByZXQgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsKTsKLSAgICAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldCA9IC0xOworICAgIHJlcyA9IF9QeUVycl9XYXJuRm9ybWF0VihOVUxMLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwsIGZvcm1hdCwgdmFyZ3MpOwogICAgIHZhX2VuZCh2YXJncyk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKK1B5RXJyX1Jlc291cmNlV2FybmluZyhQeU9iamVjdCAqc291cmNlLCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIGludCByZXM7CisgICAgdmFfbGlzdCB2YXJnczsKKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCisgICAgcmVzID0gX1B5RXJyX1dhcm5Gb3JtYXRWKHNvdXJjZSwgUHlFeGNfUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19sZXZlbCwgZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK2ludAogUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqdGV4dCwgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKIHsKICAgICBpbnQgcmV0OwogICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodGV4dCk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwpOworICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwsIE5VTEwpOwogICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtOTIxLDcgKzEwMDQsNyBAQAogI3VuZGVmIFB5RXJyX1dhcm4KIAogUHlBUElfRlVOQyhpbnQpCi1QeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqdGV4dCkKK1B5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjb25zdCBjaGFyICp0ZXh0KQogewogICAgIHJldHVybiBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIHRleHQsIDEpOwogfQpAQCAtOTM2LDcgKzEwMTksNyBAQAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwsIE5VTEwpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtMTAwMCw3ICsxMDgzLDcgQEAKICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9hc3QuYyBiL1B5dGhvbi9hc3QuYwppbmRleCA2ZGEzM2Y3Li4wZjljMTkzIDEwMDY0NAotLS0gYS9QeXRob24vYXN0LmMKKysrIGIvUHl0aG9uL2FzdC5jCkBAIC0xMzIsNiArMTMyLDUyIEBACiB9CiAKIHN0YXRpYyBpbnQKK3ZhbGlkYXRlX2NvbnN0YW50KFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSB8fCB2YWx1ZSA9PSBQeV9FbGxpcHNpcykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUZsb2F0X0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5Qm9vbF9DaGVjayh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlCeXRlc19DaGVja0V4YWN0KHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHZhbHVlKSB8fCBQeUZyb3plblNldF9DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICBQeU9iamVjdCAqaXQ7CisKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHZhbHVlKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAogdmFsaWRhdGVfZXhwcihleHByX3R5IGV4cCwgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKICAgICBpbnQgY2hlY2tfY3R4ID0gMTsKQEAgLTI0MCw2ICsyODYsMTQgQEAKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIoZXhwLT52LkNhbGwuZnVuYywgTG9hZCkgJiYKICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHJzKGV4cC0+di5DYWxsLmFyZ3MsIExvYWQsIDApICYmCiAgICAgICAgICAgICB2YWxpZGF0ZV9rZXl3b3JkcyhleHAtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGV4cC0+di5Db25zdGFudC52YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBhbiBpbnZhbGlkIHR5cGUgaW4gQ29uc3RhbnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGV4cC0+di5Db25zdGFudC52YWx1ZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSBOdW1fa2luZDogewogICAgICAgICBQeU9iamVjdCAqbiA9IGV4cC0+di5OdW0ubjsKICAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2tFeGFjdChuKSAmJiAhUHlGbG9hdF9DaGVja0V4YWN0KG4pICYmCkBAIC0yNTcsNiArMzExLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQorICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHBycyhleHAtPnYuSm9pbmVkU3RyLnZhbHVlcywgTG9hZCwgMCk7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICBpZiAodmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUsIExvYWQpID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYywgTG9hZCk7CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgQnl0ZXNfa2luZDogewogICAgICAgICBQeU9iamVjdCAqYiA9IGV4cC0+di5CeXRlcy5zOwogICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2tFeGFjdChiKSkgewpAQCAtNDEzLDggKzQ3NSw4IEBACiAgICAgY2FzZSBJbXBvcnRfa2luZDoKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25vbmVtcHR5X3NlcShzdG10LT52LkltcG9ydC5uYW1lcywgIm5hbWVzIiwgIkltcG9ydCIpOwogICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgotICAgICAgICBpZiAoc3RtdC0+di5JbXBvcnRGcm9tLmxldmVsIDwgLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW1wb3J0RnJvbSBsZXZlbCBsZXNzIHRoYW4gLTEiKTsKKyAgICAgICAgaWYgKHN0bXQtPnYuSW1wb3J0RnJvbS5sZXZlbCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiTmVnYXRpdmUgSW1wb3J0RnJvbSBsZXZlbCIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25vbmVtcHR5X3NlcShzdG10LT52LkltcG9ydEZyb20ubmFtZXMsICJuYW1lcyIsICJJbXBvcnRGcm9tIik7CkBAIC01MTIsOCArNTc0LDcgQEAKIAogLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbnRlcm5hbGx5ICovCiBzdHJ1Y3QgY29tcGlsaW5nIHsKLSAgICBjaGFyICpjX2VuY29kaW5nOyAvKiBzb3VyY2UgZW5jb2RpbmcgKi8KLSAgICBQeUFyZW5hICpjX2FyZW5hOyAvKiBhcmVuYSBmb3IgYWxsb2NhdGluZyBtZW1lb3J5ICovCisgICAgUHlBcmVuYSAqY19hcmVuYTsgLyogQXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LiAqLwogICAgIFB5T2JqZWN0ICpjX2ZpbGVuYW1lOyAvKiBmaWxlbmFtZSAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZTsgLyogTm9ybWFsaXphdGlvbiBmdW5jdGlvbiBmcm9tIHVuaWNvZGVkYXRhLiAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZV9hcmdzOyAvKiBOb3JtYWxpemF0aW9uIGFyZ3VtZW50IHR1cGxlLiAqLwpAQCAtNTM1LDkgKzU5Niw3IEBACiBzdGF0aWMgZXhwcl90eSBhc3RfZm9yX2NhbGwoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICosIGV4cHJfdHkpOwogCiBzdGF0aWMgUHlPYmplY3QgKnBhcnNlbnVtYmVyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBQeU9iamVjdCAqcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSk7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RycGx1cyhzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ5dGVzbW9kZSk7CitzdGF0aWMgZXhwcl90eSBwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuKTsKIAogI2RlZmluZSBDT01QX0dFTkVYUCAgIDAKICNkZWZpbmUgQ09NUF9MSVNUQ09NUCAxCkBAIC03MDEsMjMgKzc2MCwxMSBAQAogICAgIGMuY19hcmVuYSA9IGFyZW5hOwogICAgIC8qIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwogICAgIGMuY19maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIGMuY19ub3JtYWxpemUgPSBjLmNfbm9ybWFsaXplX2FyZ3MgPSBOVUxMOwotICAgIGlmIChmbGFncyAmJiBmbGFncy0+Y2ZfZmxhZ3MgJiBQeUNGX1NPVVJDRV9JU19VVEY4KSB7Ci0gICAgICAgIGMuY19lbmNvZGluZyA9ICJ1dGYtOCI7Ci0gICAgICAgIGlmIChUWVBFKG4pID09IGVuY29kaW5nX2RlY2wpIHsKLSNpZiAwCi0gICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImVuY29kaW5nIGRlY2xhcmF0aW9uIGluIFVuaWNvZGUgc3RyaW5nIik7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSNlbmRpZgotICAgICAgICAgICAgbiA9IENISUxEKG4sIDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChUWVBFKG4pID09IGVuY29kaW5nX2RlY2wpIHsKLSAgICAgICAgYy5jX2VuY29kaW5nID0gU1RSKG4pOworICAgIGMuY19ub3JtYWxpemUgPSBOVUxMOworICAgIGMuY19ub3JtYWxpemVfYXJncyA9IE5VTEw7CisKKyAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKQogICAgICAgICBuID0gQ0hJTEQobiwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogUEVQIDMxMjAgKi8KLSAgICAgICAgYy5jX2VuY29kaW5nID0gInV0Zi04IjsKLSAgICB9CiAKICAgICBrID0gMDsKICAgICBzd2l0Y2ggKFRZUEUobikpIHsKQEAgLTg2NCw3ICs5MTEsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIqIEZPUkJJRERFTltdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBGT1JCSURERU5bXSA9IHsKICAgICAiTm9uZSIsCiAgICAgIlRydWUiLAogICAgICJGYWxzZSIsCkBAIC04ODEsNyArOTI4LDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGlmIChmdWxsX2NoZWNrcykgewotICAgICAgICBjb25zdCBjaGFyICoqcDsKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwogICAgICAgICBmb3IgKHAgPSBGT1JCSURERU47ICpwOyBwKyspIHsKICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhuYW1lLCAqcCkgPT0gMCkgewogICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiYXNzaWdubWVudCB0byBrZXl3b3JkIik7CkBAIC05NDMsMTMgKzk5MCw4IEBACiAgICAgICAgICAgICBzID0gZS0+di5MaXN0LmVsdHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUdXBsZV9raW5kOgotICAgICAgICAgICAgaWYgKGFzZGxfc2VxX0xFTihlLT52LlR1cGxlLmVsdHMpKSAgewotICAgICAgICAgICAgICAgIGUtPnYuVHVwbGUuY3R4ID0gY3R4OwotICAgICAgICAgICAgICAgIHMgPSBlLT52LlR1cGxlLmVsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleHByX25hbWUgPSAiKCkiOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZS0+di5UdXBsZS5jdHggPSBjdHg7CisgICAgICAgICAgICBzID0gZS0+di5UdXBsZS5lbHRzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTGFtYmRhX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAibGFtYmRhIjsKQEAgLTk4Niw2ICsxMDI4LDggQEAKICAgICAgICAgY2FzZSBOdW1fa2luZDoKICAgICAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgY2FzZSBCeXRlc19raW5kOgorICAgICAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAibGl0ZXJhbCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKQEAgLTEyNTksMTYgKzEzMDMsMjAgQEAKICAgICAgICBhbmQgdmFyYXJnc2xpc3QgKGxhbWJkYSBkZWZpbml0aW9uKS4KIAogICAgICAgIHBhcmFtZXRlcnM6ICcoJyBbdHlwZWRhcmdzbGlzdF0gJyknCi0gICAgICAgdHlwZWRhcmdzbGlzdDogKCh0ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICAgICAgICAgICAoJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXQotICAgICAgICAgICB8ICcqKicgdGZwZGVmKQotICAgICAgICAgICB8IHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKKyAgICAgICB0eXBlZGFyZ3NsaXN0OiAodGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAgICAgICAgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKionIHRmcGRlZiBbJywnXSkKICAgICAgICB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotICAgICAgIHZhcmFyZ3NsaXN0OiAoKHZmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gICAgICAgICAgICgnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqICBbJywnICcqKicgdmZwZGVmXQotICAgICAgICAgICB8ICcqKicgdmZwZGVmKQotICAgICAgICAgICB8IHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKKyAgICAgICB2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgICAgICAgICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgICAgIHwgJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyoqJyB2ZnBkZWYgWycsJ10KKyAgICAgICApCiAgICAgICAgdmZwZGVmOiBOQU1FCisKICAgICAqLwogICAgIGludCBpLCBqLCBrLCBucG9zYXJncyA9IDAsIG5rd29ubHlhcmdzID0gMDsKICAgICBpbnQgbnBvc2RlZmF1bHRzID0gMCwgZm91bmRfZGVmYXVsdCA9IDA7CkBAIC0xMzcwLDcgKzE0MTgsOCBAQAogICAgICAgICAgICAgICAgIGkgKz0gMjsgLyogdGhlIG5hbWUgYW5kIHRoZSBjb21tYSAqLwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFSOgotICAgICAgICAgICAgICAgIGlmIChpKzEgPj0gTkNIKG4pKSB7CisgICAgICAgICAgICAgICAgaWYgKGkrMSA+PSBOQ0gobikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGkrMiA9PSBOQ0gobikgJiYgVFlQRShDSElMRChuLCBpKzEpKSA9PSBDT01NQSkpIHsKICAgICAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIENISUxEKG4sIGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICoiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xOTkzLDcgKzIwNDIsNiBAQAogICAgICAgIHwgJy4uLicgfCAnTm9uZScgfCAnVHJ1ZScgfCAnRmFsc2UnCiAgICAgKi8KICAgICBub2RlICpjaCA9IENISUxEKG4sIDApOwotICAgIGludCBieXRlc21vZGUgPSAwOwogCiAgICAgc3dpdGNoIChUWVBFKGNoKSkgewogICAgIGNhc2UgTkFNRTogewpAQCAtMjAxNSw3ICsyMDYzLDcgQEAKICAgICAgICAgcmV0dXJuIE5hbWUobmFtZSwgTG9hZCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KICAgICBjYXNlIFNUUklORzogewotICAgICAgICBQeU9iamVjdCAqc3RyID0gcGFyc2VzdHJwbHVzKGMsIG4sICZieXRlc21vZGUpOworICAgICAgICBleHByX3R5IHN0ciA9IHBhcnNlc3RycGx1cyhjLCBuKTsKICAgICAgICAgaWYgKCFzdHIpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnR5cGUgPSBOVUxMOwogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVW5pY29kZUVycm9yKSkKQEAgLTIwMzIsNiArMjA4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiglcykgJXMiLCBlcnJ0eXBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVycnN0cik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiKCVzKSB1bmtub3duIGVycm9yIiwgZXJydHlwZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCBidWYpOwpAQCAtMjA0MSwxNCArMjA5MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzdHIpIDwgMCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXNtb2RlKQotICAgICAgICAgICAgcmV0dXJuIEJ5dGVzKHN0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gU3RyKHN0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICByZXR1cm4gc3RyOwogICAgIH0KICAgICBjYXNlIE5VTUJFUjogewogICAgICAgICBQeU9iamVjdCAqcHludW0gPSBwYXJzZW51bWJlcihjLCBTVFIoY2gpKTsKQEAgLTMyMDgsMTQgKzMyNTAsMTQgQEAKICAgICAgICAgICAgIGFsaWFzX3R5IGltcG9ydF9hbGlhcyA9IGFsaWFzX2Zvcl9pbXBvcnRfbmFtZShjLCBuLCAxKTsKICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCAwLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIDAsIGltcG9ydF9hbGlhcyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICBhbGlhc190eSBpbXBvcnRfYWxpYXMgPSBhbGlhc19mb3JfaW1wb3J0X25hbWUoYywgQ0hJTEQobiwgaSksIDEpOwogICAgICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIGkgLyAyLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCBpIC8gMiwgaW1wb3J0X2FsaWFzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobW9kICE9IE5VTEwpCkBAIC0zOTM1LDgyICszOTc3LDkzMiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVjb2RlX3VuaWNvZGUoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50IHJhd21vZGUsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQorZGVjb2RlX3VuaWNvZGVfd2l0aF9lc2NhcGVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnYsICp1OwogICAgIGNoYXIgKmJ1ZjsKICAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKIAotICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgIGlmIChsZW4gPiBQWV9TSVpFX01BWCAvIDYpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgLyogIsOkIiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1Ci0gICAgICAgICAgICJcw6QiICgzIGJ5dGVzKSBtYXkgYmVjb21lICJcdTAwNWNcVTAwMDAwMEU0IiAoMTYgYnl0ZXMpLCBvciB+MTo2ICovCi0gICAgICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7Ci0gICAgICAgIGlmICh1ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7Ci0gICAgICAgIGVuZCA9IHMgKyBsZW47Ci0gICAgICAgIHdoaWxlIChzIDwgZW5kKSB7Ci0gICAgICAgICAgICBpZiAoKnMgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICpwKysgPSAqcysrOwotICAgICAgICAgICAgICAgIGlmICgqcyAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCpzICYgMHg4MCkgeyAvKiBYWFggaW5lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdzsKLSAgICAgICAgICAgICAgICBpbnQga2luZDsKLSAgICAgICAgICAgICAgICB2b2lkICpkYXRhOwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBpOwotICAgICAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKLSAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh3KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7Ci0gICAgICAgICAgICAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxcVSUwOHgiLCBjaHIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBTaG91bGQgYmUgaW1wb3NzaWJsZSB0byBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgIGFzc2VydChwIC0gYnVmIDw9IFB5X1NJWkUodSkpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICBpZiAobGVuID4gUFlfU0laRV9NQVggLyA2KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiAiw6QiICgyIGJ5dGVzKSBtYXkgYmVjb21lICJcVTAwMDAwMEU0IiAoMTAgYnl0ZXMpLCBvciAxOjUKKyAgICAgICAiXMOkIiAoMyBieXRlcykgbWF5IGJlY29tZSAiXHUwMDVjXFUwMDAwMDBFNCIgKDE2IGJ5dGVzKSwgb3IgfjE6NiAqLworICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7CisgICAgZW5kID0gcyArIGxlbjsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBpZiAoKnMgPT0gJ1xcJykgeworICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICBpZiAoKnMgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOworICAgICAgICAgICAgICAgIHAgKz0gNTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBsZW4gPSBwIC0gYnVmOwotICAgICAgICBzID0gYnVmOworICAgICAgICBpZiAoKnMgJiAweDgwKSB7IC8qIFhYWCBpbmVmZmljaWVudCAqLworICAgICAgICAgICAgUHlPYmplY3QgKnc7CisgICAgICAgICAgICBpbnQga2luZDsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKKyAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodyk7CisgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7CisgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFxVJTA4eCIsIGNocik7CisgICAgICAgICAgICAgICAgcCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIG92ZXJmbG93ICovCisgICAgICAgICAgICBhc3NlcnQocCAtIGJ1ZiA8PSBQeV9TSVpFKHUpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwKysgPSAqcysrOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChyYXdtb2RlKQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOworICAgIGxlbiA9IHAgLSBidWY7CisgICAgcyA9IGJ1ZjsKKworICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOwogICAgIFB5X1hERUNSRUYodSk7CiAgICAgcmV0dXJuIHY7CiB9CiAKLS8qIHMgaXMgYSBQeXRob24gc3RyaW5nIGxpdGVyYWwsIGluY2x1ZGluZyB0aGUgYnJhY2tldGluZyBxdW90ZSBjaGFyYWN0ZXJzLAotICogYW5kIHIgJi9vciBiIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQgZXNjYXBlIHNlcXVlbmNlcyAoaWYgYW55KS4KLSAqIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlIGRlY29kZWQgUHl0aG9uIHN0cmluZyBvYmplY3QuCi0gKi8KKy8qIENvbXBpbGUgdGhpcyBleHByZXNzaW9uIGluIHRvIGFuIGV4cHJfdHkuIFdlIGtub3cgdGhhdCB3ZSBjYW4KKyAgIHRlbXBvcmFyaWx5IG1vZGlmeSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhpcyBzdHJpbmcKKyAgIChpdCdzICd7JyksIGFuZCB3ZSBrbm93IHdlIGNhbiB0ZW1wb3JhcmlseSBtb2RpZnkgdGhlIGNoYXJhY3RlcgorICAgYWZ0ZXIgdGhpcyBzdHJpbmcgKGl0IGlzIGEgJ30nKS4gIExldmVyYWdlIHRoaXMgdG8gY3JlYXRlIGEKKyAgIHN1Yi1zdHJpbmcgd2l0aCBlbm91Z2ggcm9vbSBmb3IgdXMgdG8gYWRkIHBhcmVucyBhcm91bmQgdGhlCisgICBleHByZXNzaW9uLiBUaGlzIGlzIHRvIGFsbG93IHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcywgZm9yCisgICBleGFtcGxlLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfY29tcGlsZV9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgZXhwcl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZXhwcl9lbmQsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCisKK3sKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgbW9kX3R5IG1vZDsKKyAgICBjaGFyICp1dGZfZXhwcjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfVUNTNCBlbmRfY2ggPSAtMTsKKyAgICBpbnQgYWxsX3doaXRlc3BhY2U7CisgICAgUHlPYmplY3QgKnN1YiA9IE5VTEw7CisKKyAgICAvKiBXZSBvbmx5IGRlY3JlZiBzdWIgaWYgd2UgYWxsb2NhdGVkIGl0IHdpdGggYSBQeVVuaWNvZGVfU3Vic3RyaW5nLgorICAgICAgIGRlY3JlZl9zdWIgcmVjb3JkcyB0aGF0LiAqLworICAgIGludCBkZWNyZWZfc3ViID0gMDsKKworICAgIGFzc2VydChzdHIpOworCisgICAgYXNzZXJ0KGV4cHJfc3RhcnQgPj0gMCAmJiBleHByX3N0YXJ0IDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kID49IDAgJiYgZXhwcl9lbmQgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPj0gZXhwcl9zdGFydCk7CisKKyAgICAvKiBUaGVyZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvbiBlYWNoIHNpZGUgb2YgdGhlCisgICAgICAgZXhwcmVzc2lvbiBpbnNpZGUgdGhpcyBzdHIuIFRoaXMgd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGJlZm9yZQorICAgICAgIHdlJ3JlIGNhbGxlZC4gKi8KKyAgICBhc3NlcnQoZXhwcl9zdGFydCA+PSAxKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKS0xKTsKKworICAgIC8qIElmIHRoZSBzdWJzdHJpbmcgaXMgYWxsIHdoaXRlc3BhY2UsIGl0J3MgYW4gZXJyb3IuIFdlIG5lZWQgdG8KKyAgICAgICAgY2F0Y2ggdGhpcyBoZXJlLCBhbmQgbm90IHdoZW4gd2UgY2FsbCBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nLAorICAgICAgICBiZWNhdXNlIHR1cm5pbmcgdGhlIGV4cHJlc3Npb24gJycgaW4gdG8gJygpJyB3b3VsZCBnbyBmcm9tCisgICAgICAgIGJlaW5nIGludmFsaWQgdG8gdmFsaWQuICovCisgICAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSBzYXlzIGFuIGVtcHR5IHN0cmluZyBpcyBhbGwKKyAgICAgICAgd2hpdGVzcGFjZS4gVGhhdCdzIGltcG9ydGFudC4gVGhlcmUncyBhIHRlc3QgZm9yIGl0OiBmJ3t9Jy4gKi8KKyAgICBhbGxfd2hpdGVzcGFjZSA9IDE7CisgICAgZm9yIChpID0gZXhwcl9zdGFydDsgaSA8IGV4cHJfZW5kOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeV9VTklDT0RFX0lTU1BBQ0UoUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsIGkpKSkgeworICAgICAgICAgICAgYWxsX3doaXRlc3BhY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsbF93aGl0ZXNwYWNlKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nLCB3ZSBjYW4ndCB1c2UKKyAgICAgICAgUHlVbmljb2RlX1N1YnN0cmluZywgc2luY2UgaXQgd2lsbCByZXR1cm4gYW5vdGhlciByZWZlcmVuY2UgdG8KKyAgICAgICAgb3VyIG9yaWdpbmFsIHN0cmluZy4gQmVjYXVzZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHN0cmluZyBpbgorICAgICAgICBwbGFjZSwgdGhhdCdzIGEgbm8tbm8uIFNvLCBkZXRlY3QgdGhhdCBjYXNlIGFuZCBqdXN0IHVzZSBvdXIKKyAgICAgICAgc3RyaW5nIGRpcmVjdGx5LiAqLworCisgICAgaWYgKGV4cHJfc3RhcnQtMSA9PSAwICYmIGV4cHJfZW5kKzEgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICAvKiBJZiBzdHIgaXMgd2VsbCBmb3JtZWQsIHRoZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJzIG11c3QKKyAgICAgICAgICAgYmUgJ3snIGFuZCAnfScsIHJlc3BlY3RpdmVseS4gQnV0LCBpZiB0aGVyZSdzIGEgc3ludGF4CisgICAgICAgICAgIGVycm9yLCBmb3IgZXhhbXBsZSBmJ3szIScsIHRoZW4gdGhlIGxhc3QgY2hhciB3b24ndCBiZSBhCisgICAgICAgICAgIGNsb3NpbmcgYnJhY2UuIFNvLCByZW1lbWJlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZCBpbgorICAgICAgICAgICBvcmRlciBmb3IgdXMgdG8gcmVzdG9yZSBpdC4gKi8KKyAgICAgICAgZW5kX2NoID0gUHlVbmljb2RlX1JlYWRDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxKTsKKyAgICAgICAgYXNzZXJ0KGVuZF9jaCAhPSAoUHlfVUNTNCktMSk7CisKKyAgICAgICAgLyogSW4gYWxsIGNhc2VzLCBob3dldmVyLCBzdGFydF9jaCBtdXN0IGJlICd7Jy4gKi8KKyAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9SZWFkQ2hhcihzdHIsIDApID09ICd7Jyk7CisKKyAgICAgICAgc3ViID0gc3RyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBhIHN1YnN0cmluZyBvYmplY3QuIEl0IG11c3QgYmUgYSBuZXcgb2JqZWN0LCB3aXRoCisgICAgICAgICAgIHJlZmNvdW50PT0xLCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICovCisgICAgICAgIHN1YiA9IFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLCBleHByX3N0YXJ0LTEsIGV4cHJfZW5kKzEpOworICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGFzc2VydChzdWIgIT0gc3RyKTsgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgbmV3IHN0cmluZy4gKi8KKyAgICAgICAgZGVjcmVmX3N1YiA9IDE7ICAgICAgLyogUmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSBpdCBvbiBlcnJvci4gKi8KKyAgICB9CisKKyAgICAvKiBQdXQgKCkgYXJvdW5kIHRoZSBleHByZXNzaW9uLiAqLworICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN1YiwgMCwgJygnKSA8IDAgfHwKKyAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdWIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgJyknKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBObyBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSByZXR1cm5lZCBoZXJlOiBpdCdzIG1hbmFnZWQgYnkgdGhlCisgICAgICAgc3RyaW5nLiAqLworICAgIHV0Zl9leHByID0gUHlVbmljb2RlX0FzVVRGOChzdWIpOworICAgIGlmICghdXRmX2V4cHIpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjZi5jZl9mbGFncyA9IFB5Q0ZfT05MWV9BU1Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyh1dGZfZXhwciwgIjxmc3RyaW5nPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ldmFsX2lucHV0LCAmY2YsIGMtPmNfYXJlbmEpOworICAgIGlmICghbW9kKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHN1YiAhPSBzdHIpCisgICAgICAgIC8qIENsZWFyIGluc3RlYWQgb2YgZGVjcmVmIGluIGNhc2Ugd2UgZXZlciBtb2RpZnkgdGhpcyBjb2RlIHRvIGNoYW5nZQorICAgICAgICAgICB0aGUgZXJyb3IgaGFuZGxpbmc6IHRoaXMgaXMgc2FmZXN0IGJlY2F1c2UgdGhlIFhERUNSRUYgd29uJ3QgdHJ5CisgICAgICAgICAgIGFuZCBkZWNyZWYgaXQgd2hlbiBpdCdzIE5VTEwuICovCisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgY2hhcnMgaW4gc3ViLCBzaW5jZSB3ZSBrbm93IGl0J3MgZ2V0dGluZworICAgICAgICAgICByZWFkeSB0byBnZXQgZGVsZXRlZCAocmVmY291bnQgbXVzdCBiZSAxLCBzaW5jZSB3ZSBnb3QgYSBuZXcgc3RyaW5nCisgICAgICAgICAgIGluIFB5VW5pY29kZV9TdWJzdHJpbmcpLiAqLworICAgICAgICBQeV9DTEVBUihzdWIpOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIWRlY3JlZl9zdWIpOworICAgICAgICBhc3NlcnQoZW5kX2NoICE9IChQeV9VQ1M0KS0xKTsKKyAgICAgICAgLyogUmVzdG9yZSBzdHIsIHdoaWNoIHdlIGVhcmxpZXIgbW9kaWZpZWQgZGlyZWN0bHkuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgMCwgJ3snKSA8IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEsIGVuZF9jaCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG1vZC0+di5FeHByZXNzaW9uLmJvZHk7CisKK2Vycm9yOgorICAgIC8qIE9ubHkgZGVjcmVmIHN1YiBpZiBpdCB3YXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gU3ViU3RyaW5nLiAqLworICAgIGlmIChkZWNyZWZfc3ViKQorICAgICAgICBQeV9YREVDUkVGKHN1Yik7CisKKyAgICBpZiAoZW5kX2NoICE9IChQeV9VQ1M0KS0xKSB7CisgICAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgbW9kaWZpZWQgc3RyLiBNYWtlIHN1cmUgdGhhdCdzIHRoZQorICAgICAgICAgICBjYXNlOiBzdHIgd2lsbCBiZSBlcXVhbCB0byBzdWIuICovCisgICAgICAgIGlmIChzdHIgPT0gc3ViKSB7CisgICAgICAgICAgICAvKiBEb24ndCBjaGVjayB0aGUgZXJyb3IsIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBzZXQgdGhlCisgICAgICAgICAgICAgICBlcnJvciBzdGF0ZSAodGhhdCdzIHdoeSB3ZSdyZSBpbiAnZXJyb3InLCBhZnRlcgorICAgICAgICAgICAgICAgYWxsKS4gKi8KKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCAwLCAneycpOworICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgZW5kX2NoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwuCisKKyAgIFJldHVybiAxIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsLCBidXQgd2Ugd2FudAorICAgdGhlIGNhbGxlciB0byBwcm9jZXNzIHRoZSBsaXRlcmFsIHVwIHRvIHRoaXMgcG9pbnQuIFVzZWQgZm9yCisgICBkb3VibGVkIGJyYWNlcy4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbChQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIFB5T2JqZWN0ICoqbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNlX2x2bCwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICAvKiBHZXQgYW55IGxpdGVyYWwgc3RyaW5nLiBJdCBlbmRzIHdoZW4gd2UgaGl0IGFuIHVuLWRvdWJsZWQgYnJhY2UsIG9yIHRoZQorICAgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworCisgICAgUHlfc3NpemVfdCBsaXRlcmFsX3N0YXJ0LCBsaXRlcmFsX2VuZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKKyAgICBhc3NlcnQoKmxpdGVyYWwgPT0gTlVMTCk7CisKKyAgICBsaXRlcmFsX3N0YXJ0ID0gKm9mczsKKyAgICBmb3IgKDsgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7ICpvZnMgKz0gMSkgeworICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgZG91YmxlZCBicmFjZXMsIGJ1dCBvbmx5IGF0IHRoZSB0b3AgbGV2ZWwuIElmCisgICAgICAgICAgICAgICB3ZSBjaGVja2VkIGF0IGV2ZXJ5IGxldmVsLCB0aGVuIGYnezA6ezN9fScgd291bGQgZmFpbAorICAgICAgICAgICAgICAgd2l0aCB0aGUgdHdvIGNsb3NpbmcgYnJhY2VzLiAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2VfbHZsID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKm9mcyArIDEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMgKyAxKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBnb2luZyB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB0aGUgbGl0ZXJhbCBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGJ1dCB0aGF0IHRoZXkgc2hvdWxkIGNvbnRpbnVlIHNjYW5uaW5nLiBCdXQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICBza2lwIG92ZXIgdGhlIHNlY29uZCBicmFjZSB3aGVuIHdlIHJlc3VtZSBzY2FubmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbF9lbmQgPSAqb2ZzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2hlcmUgYSBzaW5nbGUgJ3snIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBleHByZXNzaW9uLCBhCisgICAgICAgICAgICAgICAgICAgc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UncmUgZWl0aGVyIGF0IGEgJ3snLCB3aGljaCBtZWFucyB3ZSdyZSBzdGFydGluZyBhbm90aGVyCisgICAgICAgICAgICAgICBleHByZXNzaW9uOyBvciBhICd9Jywgd2hpY2ggbWVhbnMgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgICAgICAgICBmLXN0cmluZyAoZm9yIGEgbmVzdGVkIGZvcm1hdF9zcGVjKS4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxpdGVyYWxfZW5kID0gKm9mczsKKworICAgIGFzc2VydCgqb2ZzID09IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ3snIHx8CisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd9Jyk7Citkb25lOgorICAgIGlmIChsaXRlcmFsX3N0YXJ0ICE9IGxpdGVyYWxfZW5kKSB7CisgICAgICAgICpsaXRlcmFsID0gUHlVbmljb2RlX1N1YnN0cmluZyhzdHIsIGxpdGVyYWxfc3RhcnQsIGxpdGVyYWxfZW5kKTsKKyAgICAgICAgaWYgKCEqbGl0ZXJhbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGJlY2F1c2UgcGFyc2luZyBpcyByZWN1cnNpdmUuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19wYXJzZShQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbik7CisKKy8qIFBhcnNlIHRoZSBmLXN0cmluZyBzdHIsIHN0YXJ0aW5nIGF0IG9mcy4gV2Uga25vdyAqb2ZzIHN0YXJ0cyBhbgorICAgZXhwcmVzc2lvbiAoc28gaXQgbXVzdCBiZSBhICd7JykuIFJldHVybnMgdGhlIEZvcm1hdHRlZFZhbHVlIG5vZGUsCisgICB3aGljaCBpbmNsdWRlcyB0aGUgZXhwcmVzc2lvbiwgY29udmVyc2lvbiBjaGFyYWN0ZXIsIGFuZAorICAgZm9ybWF0X3NwZWMgZXhwcmVzc2lvbi4KKworICAgTm90ZSB0aGF0IEkgZG9uJ3QgZG8gYSBwZXJmZWN0IGpvYiBoZXJlOiBJIGRvbid0IG1ha2Ugc3VyZSB0aGF0IGEKKyAgIGNsb3NpbmcgYnJhY2UgZG9lc24ndCBtYXRjaCBhbiBvcGVuaW5nIHBhcmVuLCBmb3IgZXhhbXBsZS4gSXQKKyAgIGRvZXNuJ3QgbmVlZCB0byBlcnJvciBvbiBhbGwgaW52YWxpZCBleHByZXNzaW9ucywganVzdCBjb3JyZWN0bHkKKyAgIGZpbmQgdGhlIGVuZCBvZiBhbGwgdmFsaWQgb25lcy4gQW55IGVycm9ycyBpbnNpZGUgdGhlIGV4cHJlc3Npb24KKyAgIHdpbGwgYmUgY2F1Z2h0IHdoZW4gd2UgcGFyc2UgaXQgbGF0ZXIuICovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgIGV4cHJfdHkgKmV4cHJlc3Npb24sIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgLyogUmV0dXJuIC0xIG9uIGVycm9yLCBlbHNlIDAuICovCisKKyAgICBQeV9zc2l6ZV90IGV4cHJfc3RhcnQ7CisgICAgUHlfc3NpemVfdCBleHByX2VuZDsKKyAgICBleHByX3R5IHNpbXBsZV9leHByZXNzaW9uOworICAgIGV4cHJfdHkgZm9ybWF0X3NwZWMgPSBOVUxMOyAvKiBPcHRpb25hbCBmb3JtYXQgc3BlY2lmaWVyLiAqLworICAgIFB5X1VDUzQgY29udmVyc2lvbiA9IC0xOyAvKiBUaGUgY29udmVyc2lvbiBjaGFyLiAtMSBpZiBub3Qgc3BlY2lmaWVkLiAqLworCisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKworICAgIC8qIDAgaWYgd2UncmUgbm90IGluIGEgc3RyaW5nLCBlbHNlIHRoZSBxdW90ZSBjaGFyIHdlJ3JlIHRyeWluZyB0bworICAgICAgIG1hdGNoIChzaW5nbGUgb3IgZG91YmxlIHF1b3RlKS4gKi8KKyAgICBQeV9VQ1M0IHF1b3RlX2NoYXIgPSAwOworCisgICAgLyogSWYgd2UncmUgaW5zaWRlIGEgc3RyaW5nLCAxPW5vcm1hbCwgMz10cmlwbGUtcXVvdGVkLiAqLworICAgIGludCBzdHJpbmdfdHlwZSA9IDA7CisKKyAgICAvKiBLZWVwIHRyYWNrIG9mIG5lc3RpbmcgbGV2ZWwgZm9yIGJyYWNlcy9wYXJlbnMvYnJhY2tldHMgaW4KKyAgICAgICBleHByZXNzaW9ucy4gKi8KKyAgICBQeV9zc2l6ZV90IG5lc3RlZF9kZXB0aCA9IDA7CisKKyAgICAvKiBDYW4gb25seSBuZXN0IG9uZSBsZXZlbCBkZWVwLiAqLworICAgIGlmIChyZWN1cnNlX2x2bCA+PSAyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cHJlc3Npb25zIG5lc3RlZCB0b28gZGVlcGx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgZmlyc3QgY2hhciBtdXN0IGJlIGEgbGVmdCBicmFjZSwgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3R0ZW4KKyAgICAgICBoZXJlLiBTa2lwIG92ZXIgaXQuICovCisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd7Jyk7CisgICAgKm9mcyArPSAxOworCisgICAgZXhwcl9zdGFydCA9ICpvZnM7CisgICAgZm9yICg7ICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOyAqb2ZzICs9IDEpIHsKKyAgICAgICAgUHlfVUNTNCBjaDsKKworICAgICAgICAvKiBMb29wIGludmFyaWFudHMuICovCisgICAgICAgIGFzc2VydChuZXN0ZWRfZGVwdGggPj0gMCk7CisgICAgICAgIGFzc2VydCgqb2ZzID49IGV4cHJfc3RhcnQpOworICAgICAgICBpZiAocXVvdGVfY2hhcikKKyAgICAgICAgICAgIGFzc2VydChzdHJpbmdfdHlwZSA9PSAxIHx8IHN0cmluZ190eXBlID09IDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoc3RyaW5nX3R5cGUgPT0gMCk7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgaWYgKHF1b3RlX2NoYXIpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZy4gU2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQuICovCisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgbmVlZHMgdG8gaW1wbGVtZW50IHRoZSBzYW1lIG5vbi1lcnJvciBsb2dpYworICAgICAgICAgICAgICAgYXMgdG9rX2dldCBmcm9tIHRva2VuaXplci5jLCBhdCB0aGUgbGV0dGVyX3F1b3RlCisgICAgICAgICAgICAgICBsYWJlbC4gVG8gYWN0dWFsbHkgc2hhcmUgdGhhdCBjb2RlIHdvdWxkIGJlIGEKKyAgICAgICAgICAgICAgIG5pZ2h0bWFyZS4gQnV0LCBpdCdzIHVubGlrZWx5IHRvIGNoYW5nZSBhbmQgaXMgc21hbGwsCisgICAgICAgICAgICAgICBzbyBkdXBsaWNhdGUgaXQgaGVyZS4gTm90ZSB3ZSBkb24ndCBuZWVkIHRvIGNhdGNoIGFsbAorICAgICAgICAgICAgICAgb2YgdGhlIGVycm9ycywgc2luY2UgdGhleSdsbCBiZSBjYXVnaHQgd2hlbiBwYXJzaW5nIHRoZQorICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4gV2UganVzdCBuZWVkIHRvIG1hdGNoIHRoZSBub24tZXJyb3IKKyAgICAgICAgICAgICAgIGNhc2VzLiBUaHVzIHdlIGNhbiBpZ25vcmUgXG4gaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdzLAorICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuIE9yIG5vbi10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gcXVvdGVfY2hhcikgeworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyBtYXRjaCB0aGUgc3RyaW5nX3R5cGUgKHNpbmdsZSBvciB0cmlwbGUKKyAgICAgICAgICAgICAgICAgICBxdW90ZWQpPyAqLworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqb2ZzKzIgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09IGNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBhIG5vcm1hbCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZywgYW5kIG5vdCBmaW5pc2hlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgc3RyaW5nLiBJZiB0aGlzIGlzIGEgYmFja3NsYXNoLCBza2lwIHRoZSBuZXh0IGNoYXIgKGl0CisgICAgICAgICAgICAgICBtaWdodCBiZSBhbiBlbmQgcXVvdGUgdGhhdCBuZWVkcyBza2lwcGluZykuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIGp1c3QgY29uc3VtZSB0aGlzIGNoYXJhY3RlciBub3JtYWxseS4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmICpvZnMrMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIG5leHQgY2hhciwgd2hhdGV2ZXIgaXQgaXMuICovCisgICAgICAgICAgICAgICAgKm9mcyArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKSB7CisgICAgICAgICAgICAvKiBJcyB0aGlzIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmc/ICovCisgICAgICAgICAgICBpZiAoKm9mcysyIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gY2ggJiYKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAzOworICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgYSBub3JtYWwgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBjaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnWycgfHwgY2ggPT0gJ3snIHx8IGNoID09ICcoJykgeworICAgICAgICAgICAgbmVzdGVkX2RlcHRoKys7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJ10nIHx8IGNoID09ICd9JyB8fCBjaCA9PSAnKScpKSB7CisgICAgICAgICAgICBuZXN0ZWRfZGVwdGgtLTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIEVycm9yOiBjYW4ndCBpbmNsdWRlIGEgY29tbWVudCBjaGFyYWN0ZXIsIGluc2lkZSBwYXJlbnMKKyAgICAgICAgICAgICAgIG9yIG5vdC4gKi8KKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJyEnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnfScpKSB7CisgICAgICAgICAgICAvKiBGaXJzdCwgdGVzdCBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiIT0iLiBTaW5jZSAnPScgaXMKKyAgICAgICAgICAgICAgIG5vdCBhbiBhbGxvd2VkIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBub3RoaW5nIGlzIGxvc3QgaW4KKyAgICAgICAgICAgICAgIHRoaXMgdGVzdC4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnIScgJiYgKm9mcysxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSAnPScpCisgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCBhIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBqdXN0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBOb3JtYWwgd2F5IG91dCBvZiB0aGlzIGxvb3AuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEp1c3QgY29uc3VtZSB0aGlzIGNoYXIgYW5kIGxvb3AgYXJvdW5kLiAqLworICAgICAgICB9CisgICAgfQorICAgIGV4cHJfZW5kID0gKm9mczsKKyAgICAvKiBJZiB3ZSBsZWF2ZSB0aGlzIGxvb3AgaW4gYSBzdHJpbmcgb3Igd2l0aCBtaXNtYXRjaGVkIHBhcmVucywgd2UKKyAgICAgICBkb24ndCBjYXJlLiBXZSdsbCBnZXQgYSBzeW50YXggZXJyb3Igd2hlbiBjb21waWxpbmcgdGhlCisgICAgICAgZXhwcmVzc2lvbi4gQnV0LCB3ZSBjYW4gcHJvZHVjZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLCBzbworICAgICAgIGxldCdzIGp1c3QgZG8gdGhhdC4qLworICAgIGlmIChxdW90ZV9jaGFyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobmVzdGVkX2RlcHRoKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAvKiBDb21waWxlIHRoZSBleHByZXNzaW9uIGFzIHNvb24gYXMgcG9zc2libGUsIHNvIHdlIHNob3cgZXJyb3JzCisgICAgICAgcmVsYXRlZCB0byB0aGUgZXhwcmVzc2lvbiBiZWZvcmUgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlCisgICAgICAgY29udmVyc2lvbiBvciBmb3JtYXRfc3BlYy4gKi8KKyAgICBzaW1wbGVfZXhwcmVzc2lvbiA9IGZzdHJpbmdfY29tcGlsZV9leHByKHN0ciwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGMsIG4pOworICAgIGlmICghc2ltcGxlX2V4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBhIGNvbnZlcnNpb24gY2hhciwgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJyEnKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIGNvbnZlcnNpb24gPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgKm9mcyArPSAxOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBjb252ZXJzaW9uLiAqLworICAgICAgICBpZiAoIShjb252ZXJzaW9uID09ICdzJyB8fCBjb252ZXJzaW9uID09ICdyJworICAgICAgICAgICAgICB8fCBjb252ZXJzaW9uID09ICdhJykpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJ3MnLCAncicsIG9yICdhJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBmb3JtYXQgc3BlYywgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJzonKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIC8qIFBhcnNlIHRoZSBmb3JtYXQgc3BlYy4gKi8KKyAgICAgICAgZm9ybWF0X3NwZWMgPSBmc3RyaW5nX3BhcnNlKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCsxLCBjLCBuKTsKKyAgICAgICAgaWYgKCFmb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgIT0gJ30nKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgIC8qIFdlJ3JlIGF0IGEgcmlnaHQgYnJhY2UuIENvbnN1bWUgaXQuICovCisgICAgYXNzZXJ0KCpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ30nKTsKKyAgICAqb2ZzICs9IDE7CisKKyAgICAvKiBBbmQgbm93IGNyZWF0ZSB0aGUgRm9ybWF0dGVkVmFsdWUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBlbnRpcmUKKyAgICAgICBleHByZXNzaW9uIHdpdGggdGhlIGNvbnZlcnNpb24gYW5kIGZvcm1hdCBzcGVjLiAqLworICAgICpleHByZXNzaW9uID0gRm9ybWF0dGVkVmFsdWUoc2ltcGxlX2V4cHJlc3Npb24sIChpbnQpY29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgIGlmICghKmV4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworCit1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc6CisgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCAocG9zc2libGUgemVybyBsZW5ndGgpIGFuZCBhbgorICAgZXhwcmVzc2lvbiAoemVybyBsZW5ndGggaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCisgICBSZXR1cm4gMSBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCwgYnV0IG5vIGV4cHJlc3Npb24sIGFuZCB3ZSB3YW50IHRoZQorICAgY2FsbGVyIHRvIGNhbGwgdXMgYWdhaW4uIFRoaXMgaXMgdXNlZCB0byBkZWFsIHdpdGggZG91YmxlZAorICAgYnJhY2VzLgorCisgICBXaGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc3RyaW5nICdhe3tiezB9YycsIHRoaXMgZnVuY3Rpb24KKyAgIHdpbGwgcmV0dXJuOgorCisgICAxLiB0aGUgbGl0ZXJhbCAnYXsnIHdpdGggbm8gZXhwcmVzc2lvbiwgYW5kIGEgcmV0dXJuIHZhbHVlCisgICAgICBvZiAxLiBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlcmUncyBubyBleHByZXNzaW9uLCB0aGUgcmV0dXJuCisgICAgICB2YWx1ZSBvZiAxIG1lYW5zIHdlJ3JlIG5vdCBmaW5pc2hlZCB5ZXQuCisKKyAgIDIuIHRoZSBsaXRlcmFsICdiJyBhbmQgdGhlIGV4cHJlc3Npb24gJzAnLCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mCisgICAgICAwLiBUaGUgZmFjdCB0aGF0IHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBtZWFucyB3ZSdyZSBub3QgZmluaXNoZWQuCisKKyAgIDMuIGxpdGVyYWwgJ2MnIHdpdGggbm8gZXhwcmVzc2lvbiBhbmQgYSByZXR1cm4gdmFsdWUgb2YgMC4gVGhlCisgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIDAgd2l0aCBubyBleHByZXNzaW9uIG1lYW5zCisgICAgICB3ZSdyZSBmaW5pc2hlZC4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbF9hbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqbGl0ZXJhbCwgZXhwcl90eSAqZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIGFzc2VydCgqbGl0ZXJhbCA9PSBOVUxMICYmICpleHByZXNzaW9uID09IE5VTEwpOworCisgICAgLyogR2V0IGFueSBsaXRlcmFsIHN0cmluZy4gKi8KKyAgICByZXN1bHQgPSBmc3RyaW5nX2ZpbmRfbGl0ZXJhbChzdHIsIG9mcywgbGl0ZXJhbCwgcmVjdXJzZV9sdmwsIGMsIG4pOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAxKTsKKworICAgIGlmIChyZXN1bHQgPT0gMSkKKyAgICAgICAgLyogV2UgaGF2ZSBhIGxpdGVyYWwsIGJ1dCBkb24ndCBsb29rIGF0IHRoZSBleHByZXNzaW9uLiAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ30nKQorICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlIGVuZCBvZiBhIG5lc3RlZAorICAgICAgICAgICBmLXN0cmluZzogbm8gZXhwcmVzc2lvbi4gVGhlIHRvcC1sZXZlbCBlcnJvciBjYXNlIHdoZXJlIHdlCisgICAgICAgICAgIGV4cGVjdCB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYnV0IHdlJ3JlIGF0IGEgJ30nIGlzCisgICAgICAgICAgIGhhbmRsZWQgbGF0ZXIuICovCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogV2UgbXVzdCBub3cgYmUgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sIG9uIGEgJ3snLiAqLworICAgIGFzc2VydCgqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ3snKTsKKworICAgIGlmIChmc3RyaW5nX2ZpbmRfZXhwcihzdHIsIG9mcywgcmVjdXJzZV9sdmwsIGV4cHJlc3Npb24sIGMsIG4pIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9DTEVBUigqbGl0ZXJhbCk7CisgICAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIEVYUFJMSVNUX05fQ0FDSEVEICA2NAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogSW5jcmVtZW50YWxseSBidWlsZCBhbiBhcnJheSBvZiBleHByX3R5LCBzbyBiZSB1c2VkIGluIGFuCisgICAgICAgYXNkbF9zZXEuIENhY2hlIHNvbWUgc21hbGwgYnV0IHJlYXNvbmFibHkgc2l6ZWQgbnVtYmVyIG9mCisgICAgICAgZXhwcl90eSdzLCBhbmQgdGhlbiBhZnRlciB0aGF0IHN0YXJ0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcsCisgICAgICAgZG91YmxpbmcgdGhlIG51bWJlciBhbGxvY2F0ZWQgZWFjaCB0aW1lLiBOb3RlIHRoYXQgdGhlIGYtc3RyaW5nCisgICAgICAgZid7MH1hezF9JyBjb250YWlucyAzIGV4cHJfdHknczogMiBGb3JtYXR0ZWRWYWx1ZSdzLCBhbmQgb25lCisgICAgICAgU3RyIGZvciB0aGUgbGl0ZXJhbCAnYScuIFNvIHlvdSBhZGQgZXhwcl90eSdzIGFib3V0IHR3aWNlIGFzCisgICAgICAgZmFzdCBhcyB5b3UgYWRkIGV4cmVzc2lvbnMgaW4gYW4gZi1zdHJpbmcuICovCisKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsgIC8qIE51bWJlciB3ZSd2ZSBhbGxvY2F0ZWQuICovCisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAvKiBOdW1iZXIgd2UndmUgdXNlZC4gKi8KKyAgICBleHByX3R5ICAgICpwOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB3ZSdyZSBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcuIFdpbGwgcG9pbnQgdG8gJ2RhdGEnIHVudGlsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nLiAqLworICAgIGV4cHJfdHkgICAgZGF0YVtFWFBSTElTVF9OX0NBQ0hFRF07Cit9IEV4cHJMaXN0OworCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCkKKyNlbHNlCitzdGF0aWMgdm9pZAorRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhFeHByTGlzdCAqbCkKK3sKKyAgICAvKiBDaGVjayBvdXIgaW52YXJpYW50cy4gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzICJsaXZlIiwgYW5kCisgICAgICAgaGFzbid0IGJlZW4gZGVhbGxvY2F0ZWQuICovCisgICAgYXNzZXJ0KGwtPnNpemUgPj0gMCk7CisgICAgYXNzZXJ0KGwtPnAgIT0gTlVMTCk7CisgICAgaWYgKGwtPnNpemUgPD0gRVhQUkxJU1RfTl9DQUNIRUQpCisgICAgICAgIGFzc2VydChsLT5kYXRhID09IGwtPnApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9Jbml0KEV4cHJMaXN0ICpsKQoreworICAgIGwtPmFsbG9jYXRlZCA9IEVYUFJMSVNUX05fQ0FDSEVEOworICAgIGwtPnNpemUgPSAwOworCisgICAgLyogVW50aWwgd2Ugc3RhcnQgYWxsb2NhdGluZyBkeW5hbWljYWxseSwgcCBwb2ludHMgdG8gZGF0YS4gKi8KKyAgICBsLT5wID0gbC0+ZGF0YTsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7Cit9CisKK3N0YXRpYyBpbnQKK0V4cHJMaXN0X0FwcGVuZChFeHByTGlzdCAqbCwgZXhwcl90eSBleHApCit7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKyAgICBpZiAobC0+c2l6ZSA+PSBsLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBhbGxvYyAob3IgcmVhbGxvYykgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGwtPmFsbG9jYXRlZCAqIDI7CisKKyAgICAgICAgLyogU2VlIGlmIHdlJ3ZlIGV2ZXIgYWxsb2NhdGVkIGFueXRoaW5nIGR5bmFtaWNhbGx5LiAqLworICAgICAgICBpZiAobC0+cCA9PSBsLT5kYXRhKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAvKiBXZSdyZSBzdGlsbCB1c2luZyB0aGUgY2FjaGVkIGRhdGEuIFN3aXRjaCB0bworICAgICAgICAgICAgICAgYWxsb2MtaW5nLiAqLworICAgICAgICAgICAgbC0+cCA9IFB5TWVtX1Jhd01hbGxvYyhzaXplb2YoZXhwcl90eSkgKiBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWwtPnApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogQ29weSB0aGUgY2FjaGVkIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5zaXplOyBpKyspCisgICAgICAgICAgICAgICAgbC0+cFtpXSA9IGwtPmRhdGFbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IHJlYWxsb2MuICovCisgICAgICAgICAgICBleHByX3R5ICp0bXAgPSBQeU1lbV9SYXdSZWFsbG9jKGwtPnAsIHNpemVvZihleHByX3R5KSAqIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghdG1wKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fUmF3RnJlZShsLT5wKTsKKyAgICAgICAgICAgICAgICBsLT5wID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLT5wID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgbC0+YWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgIGFzc2VydChsLT5hbGxvY2F0ZWQgPT0gMiAqIGwtPnNpemUpOworICAgIH0KKworICAgIGwtPnBbbC0+c2l6ZSsrXSA9IGV4cDsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9EZWFsbG9jKEV4cHJMaXN0ICpsKQoreworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisKKyAgICAvKiBJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIG9yIHdlJ3ZlIG5ldmVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwKKyAgICAgICBkbyBub3RoaW5nLiAqLworICAgIGlmICghbC0+cCB8fCBsLT5wID09IGwtPmRhdGEpIHsKKyAgICAgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gRnJlZSB0aGUgbWVtb3J5LiAqLworICAgICAgICBQeU1lbV9SYXdGcmVlKGwtPnApOworICAgIH0KKyAgICBsLT5wID0gTlVMTDsKKyAgICBsLT5zaXplID0gLTE7Cit9CisKK3N0YXRpYyBhc2RsX3NlcSAqCitFeHByTGlzdF9GaW5pc2goRXhwckxpc3QgKmwsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGFzZGxfc2VxICpzZXE7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGFzZGxfc2VxIGFuZCBjb3B5IHRoZSBleHByZXNzaW9ucyBpbiB0byBpdC4gKi8KKyAgICBzZXEgPSBfUHlfYXNkbF9zZXFfbmV3KGwtPnNpemUsIGFyZW5hKTsKKyAgICBpZiAoc2VxKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGwtPnNpemU7IGkrKykKKyAgICAgICAgICAgIGFzZGxfc2VxX1NFVChzZXEsIGksIGwtPnBbaV0pOworICAgIH0KKyAgICBFeHByTGlzdF9EZWFsbG9jKGwpOworICAgIHJldHVybiBzZXE7Cit9CisKKy8qIFRoZSBGc3RyaW5nUGFyc2VyIGlzIGRlc2lnbmVkIHRvIGFkZCBhIG1peCBvZiBzdHJpbmdzIGFuZAorICAgZi1zdHJpbmdzLCBhbmQgY29uY2F0IHRoZW0gdG9nZXRoZXIgYXMgbmVlZGVkLiBVbHRpbWF0ZWx5LCBpdAorICAgZ2VuZXJhdGVzIGFuIGV4cHJfdHkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyOworICAgIEV4cHJMaXN0IGV4cHJfbGlzdDsKK30gRnN0cmluZ1BhcnNlcjsKKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhdGUtPmxhc3Rfc3RyKSk7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cygmc3RhdGUtPmV4cHJfbGlzdCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfSW5pdChGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBzdGF0ZS0+bGFzdF9zdHIgPSBOVUxMOworICAgIEV4cHJMaXN0X0luaXQoJnN0YXRlLT5leHByX2xpc3QpOworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX0RlYWxsb2MoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIFB5X1hERUNSRUYoc3RhdGUtPmxhc3Rfc3RyKTsKKyAgICBFeHByTGlzdF9EZWFsbG9jKCZzdGF0ZS0+ZXhwcl9saXN0KTsKK30KKworLyogTWFrZSBhIFN0ciBub2RlLCBidXQgZGVjcmVmIHRoZSBQeVVuaWNvZGUgb2JqZWN0IGJlaW5nIGFkZGVkLiAqLworc3RhdGljIGV4cHJfdHkKK21ha2Vfc3RyX25vZGVfYW5kX2RlbChQeU9iamVjdCAqKnN0ciwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSogbikKK3sKKyAgICBQeU9iamVjdCAqcyA9ICpzdHI7CisgICAgKnN0ciA9IE5VTEw7CisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKyAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFN0cihzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Cit9CisKKy8qIEFkZCBhIG5vbi1mLXN0cmluZyAodGhhdCBpcywgYSByZWd1bGFyIGxpdGVyYWwgc3RyaW5nKS4gc3RyIGlzCisgICBkZWNyZWYnZC4gKi8KK3N0YXRpYyBpbnQKK0ZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RyKSk7CisKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAvKiBXZSBkaWRuJ3QgaGF2ZSBhIHN0cmluZyBiZWZvcmUsIHNvIGp1c3QgcmVtZW1iZXIgdGhpcyBvbmUuICovCisgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25jYXRlbmF0ZSB0aGlzIHdpdGggdGhlIHByZXZpb3VzIHN0cmluZy4gKi8KKyAgICAgICAgUHlVbmljb2RlX0FwcGVuZEFuZERlbCgmc3RhdGUtPmxhc3Rfc3RyLCBzdHIpOworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgYW4gZi1zdHJpbmcuIFRoZSBmLXN0cmluZyBpcyBpbiBzdHIsIHN0YXJ0aW5nIGF0IG9mcywgd2l0aCBubyAnZicKKyAgIG9yIHF1b3Rlcy4gc3RyIGlzIG5vdCBkZWNyZWYnZCwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlLgorICAgQW5kIGlmIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBhIHBhcnQgb2YgYSBzdHJpbmcsIHRoZW4gZGVjcmVmJ2luZyBpcworICAgZGVmaW5pdGVseSBub3QgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvISAqLworc3RhdGljIGludAorRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIC8qIFBhcnNlIHRoZSBmLXN0cmluZy4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBQeU9iamVjdCAqbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbiA9IE5VTEw7CisKKyAgICAgICAgLyogSWYgdGhlcmUncyBhIHplcm8gbGVuZ3RoIGxpdGVyYWwgaW4gZnJvbnQgb2YgdGhlCisgICAgICAgICAgIGV4cHJlc3Npb24sIGxpdGVyYWwgd2lsbCBiZSBOVUxMLiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mCisgICAgICAgICAgIHRoZSBmLXN0cmluZywgZXhwcmVzc2lvbiB3aWxsIGJlIE5VTEwgKHVubGVzcyByZXN1bHQgPT0gMSwKKyAgICAgICAgICAgc2VlIGJlbG93KS4gKi8KKyAgICAgICAgaW50IHJlc3VsdCA9IGZzdHJpbmdfZmluZF9saXRlcmFsX2FuZF9leHByKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXRlcmFsLCAmZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIG4pOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvKiBBZGQgdGhlIGxpdGVyYWwsIGlmIGFueS4gKi8KKyAgICAgICAgaWYgKCFsaXRlcmFsKSB7CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiBKdXN0IGxlYXZlIGxhc3Rfc3RyIGFsb25lIChhbmQgcG9zc2libHkKKyAgICAgICAgICAgICAgIE5VTEwpLiAqLworICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IGxpdGVyYWw7CisgICAgICAgICAgICBsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBsaXRlcmFsLCBjb25jYXRlbmF0ZSBpdC4gKi8KKyAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChsaXRlcmFsKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbChzdGF0ZSwgbGl0ZXJhbCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGxpdGVyYWwgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydCghc3RhdGUtPmxhc3Rfc3RyIHx8CisgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdGF0ZS0+bGFzdF9zdHIpICE9IDApOworCisgICAgICAgIC8qIFdlJ3ZlIGRlYWx0IHdpdGggdGhlIGxpdGVyYWwgbm93LiBJdCBjYW4ndCBiZSBsZWFrZWQgb24gZnVydGhlcgorICAgICAgICAgICBlcnJvcnMuICovCisgICAgICAgIGFzc2VydChsaXRlcmFsID09IE5VTEwpOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSBzaG91bGQganVzdCBsb29wIGFyb3VuZCB0byBnZXQgdGhlIG5leHQgbGl0ZXJhbAorICAgICAgICAgICBhbmQgZXhwcmVzc2lvbiwgd2hpbGUgaWdub3JpbmcgdGhlIGV4cHJlc3Npb24gdGhpcworICAgICAgICAgICB0aW1lLiBUaGlzIGlzIHVzZWQgZm9yIHVuLWRvdWJsaW5nIGJyYWNlcywgYXMgYW4KKyAgICAgICAgICAgb3B0aW1pemF0aW9uLiAqLworICAgICAgICBpZiAocmVzdWx0ID09IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIWV4cHJlc3Npb24pCisgICAgICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBmLXN0cmluZy4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFdlIGtub3cgd2UgaGF2ZSBhbiBleHByZXNzaW9uLiBDb252ZXJ0IGFueSBleGlzdGluZyBzdHJpbmcKKyAgICAgICAgICAgdG8gYSBTdHIgbm9kZS4gKi8KKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcuIE5vIHByZXZpb3VzIGxpdGVyYWwuICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRoZSBleGlzdGluZyBsYXN0X3N0ciBsaXRlcmFsIHRvIGEgU3RyIG5vZGUuICovCisgICAgICAgICAgICBleHByX3R5IHN0ciA9IG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICAgICAgICAgIGlmICghc3RyIHx8IEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgc3RyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgZXhwcmVzc2lvbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgLyogSWYgcmVjdXJzZV9sdmwgaXMgemVybywgdGhlbiB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgc3RyaW5nLiBPdGhlcndpc2UsIHdlIG11c3QgYmUgYXQgYSByaWdodCBicmFjZS4gKi8KKworICAgIGlmIChyZWN1cnNlX2x2bCA9PSAwICYmICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZWN1cnNlX2x2bCAhPSAwICYmIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSAhPSAnfScpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCB0aGUgcGFydGlhbCBzdGF0ZSByZWZsZWN0ZWQgaW4gbGFzdF9zdHIgYW5kIGV4cHJfbGlzdCB0byBhbgorICAgZXhwcl90eS4gVGhlIGV4cHJfdHkgY2FuIGJlIGEgU3RyLCBvciBhIEpvaW5lZFN0ci4gKi8KK3N0YXRpYyBleHByX3R5CitGc3RyaW5nUGFyc2VyX0ZpbmlzaChGc3RyaW5nUGFyc2VyICpzdGF0ZSwgc3RydWN0IGNvbXBpbGluZyAqYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgKm4pCit7CisgICAgYXNkbF9zZXEgKnNlcTsKKworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICAvKiBJZiB3ZSdyZSBqdXN0IGEgY29uc3RhbnQgc3RyaW5nIHdpdGggbm8gZXhwcmVzc2lvbnMsIHJldHVybgorICAgICAgIHRoYXQuICovCisgICAgaWYoc3RhdGUtPmV4cHJfbGlzdC5zaXplID09IDApIHsKKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIHplcm8gbGVuZ3RoIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBTdHIgbm9kZSBvdXQgb2YgbGFzdF9zdHIsIGlmIG5lZWRlZC4gSXQgd2lsbCBiZSB0aGUKKyAgICAgICBsYXN0IG5vZGUgaW4gb3VyIGV4cHJlc3Npb24gbGlzdC4gKi8KKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgIGV4cHJfdHkgc3RyID0gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgICAgICBpZiAoIXN0ciB8fCBFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIHN0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICAgIGFzc2VydChzdGF0ZS0+bGFzdF9zdHIgPT0gTlVMTCk7CisKKyAgICBzZXEgPSBFeHByTGlzdF9GaW5pc2goJnN0YXRlLT5leHByX2xpc3QsIGMtPmNfYXJlbmEpOworICAgIGlmICghc2VxKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogSWYgdGhlcmUncyBvbmx5IG9uZSBleHByZXNzaW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgd2UgbmVlZAorICAgICAgIHRvIGpvaW4gdGhlbSB0b2dldGhlci4gKi8KKyAgICBpZiAoc2VxLT5zaXplID09IDEpCisgICAgICAgIHJldHVybiBzZXEtPmVsZW1lbnRzWzBdOworCisgICAgcmV0dXJuIEpvaW5lZFN0cihzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKworZXJyb3I6CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKHN0YXRlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYW4gZi1zdHJpbmcgKHdpdGggbm8gJ2YnIG9yIHF1b3RlcykgdGhhdCdzIGluIHN0ciBzdGFydGluZyBhdAorICAgb2ZzLCBwYXJzZSBpdCBpbnRvIGFuIGV4cHJfdHkuIFJldHVybiBOVUxMIG9uIGVycm9yLiBEb2VzIG5vdAorICAgZGVjcmVmIHN0ci4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX3BhcnNlKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisKKyAgICBGc3RyaW5nUGFyc2VyX0luaXQoJnN0YXRlKTsKKyAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKCZzdGF0ZSwgc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgbikgPCAwKSB7CisgICAgICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKK30KKworLyogbiBpcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgaW5jbHVkaW5nIHRoZSBicmFja2V0aW5nIHF1b3RlCisgICBjaGFyYWN0ZXJzLCBhbmQgciwgYiwgdSwgJi9vciBmIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQKKyAgIGVzY2FwZSBzZXF1ZW5jZXMgKGlmIGFueSkuIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlCisgICBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHN0cmluZyBpcyBhbiBmLXN0cmluZywgc2V0CisgICAqZm1vZGUgYW5kIHJldHVybiB0aGUgdW5wYXJzZWQgc3RyaW5nIG9iamVjdC4KKyovCiBzdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCitwYXJzZXN0cihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSwgaW50ICpmbW9kZSkKIHsKICAgICBzaXplX3QgbGVuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBTVFIobik7CiAgICAgaW50IHF1b3RlID0gUHlfQ0hBUk1BU0soKnMpOwogICAgIGludCByYXdtb2RlID0gMDsKLSAgICBpbnQgbmVlZF9lbmNvZGluZzsKICAgICBpZiAoUHlfSVNBTFBIQShxdW90ZSkpIHsKICAgICAgICAgd2hpbGUgKCEqYnl0ZXNtb2RlIHx8ICFyYXdtb2RlKSB7CiAgICAgICAgICAgICBpZiAocXVvdGUgPT0gJ2InIHx8IHF1b3RlID09ICdCJykgewpAQCAtNDAyNCwxNSArNDkxNiwyNCBAQAogICAgICAgICAgICAgICAgIHF1b3RlID0gKisrczsKICAgICAgICAgICAgICAgICByYXdtb2RlID0gMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1b3RlID09ICdmJyB8fCBxdW90ZSA9PSAnRicpIHsKKyAgICAgICAgICAgICAgICBxdW90ZSA9ICorK3M7CisgICAgICAgICAgICAgICAgKmZtb2RlID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIGlmICgqZm1vZGUgJiYgKmJ5dGVzbW9kZSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmIChxdW90ZSAhPSAnXCcnICYmIHF1b3RlICE9ICdcIicpIHsKICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICAvKiBTa2lwIHRoZSBsZWFkaW5nIHF1b3RlIGNoYXIuICovCiAgICAgcysrOwogICAgIGxlbiA9IHN0cmxlbihzKTsKICAgICBpZiAobGVuID4gSU5UX01BWCkgewpAQCAtNDA0MSwyMiArNDk0MiwzNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKHNbLS1sZW5dICE9IHF1b3RlKSB7CisgICAgICAgIC8qIExhc3QgcXVvdGUgY2hhciBtdXN0IG1hdGNoIHRoZSBmaXJzdC4gKi8KICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobGVuID49IDQgJiYgc1swXSA9PSBxdW90ZSAmJiBzWzFdID09IHF1b3RlKSB7CisgICAgICAgIC8qIEEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuIFdlJ3ZlIGFscmVhZHkgc2tpcHBlZCBvbmUgcXVvdGUgYXQKKyAgICAgICAgICAgdGhlIHN0YXJ0IGFuZCBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiBOb3cgc2tpcCB0aGUKKyAgICAgICAgICAgdHdvIGF0IHRoZSBzdGFydC4gKi8KICAgICAgICAgcyArPSAyOwogICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgLyogQW5kIGNoZWNrIHRoYXQgdGhlIGxhc3QgdHdvIG1hdGNoLiAqLwogICAgICAgICBpZiAoc1stLWxlbl0gIT0gcXVvdGUgfHwgc1stLWxlbl0gIT0gcXVvdGUpIHsKICAgICAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCEqYnl0ZXNtb2RlICYmICFyYXdtb2RlKSB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZShjLCBzLCBsZW4sIHJhd21vZGUsIGMtPmNfZW5jb2RpbmcpOworCisgICAgLyogVGVtcG9yYXJ5IGhhY2s6IGlmIHRoaXMgaXMgYW4gZi1zdHJpbmcsIG5vIGJhY2tzbGFzaGVzIGFyZSBhbGxvd2VkLiAqLworICAgIC8qIFNlZSBpc3N1ZSAyNzkyMS4gKi8KKyAgICBpZiAoKmZtb2RlICYmIHN0cmNocihzLCAnXFwnKSAhPSBOVUxMKSB7CisgICAgICAgIC8qIFN5bnRheCBlcnJvci4gQXQgYSBsYXRlciBkYXRlIGZpeCB0aGlzIHNvIGl0IG9ubHkgY2hlY2tzIGZvcgorICAgICAgICAgICBiYWNrc2xhc2hlcyB3aXRoaW4gdGhlIGJyYWNlcy4gKi8KKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJiYWNrc2xhc2hlcyBub3QgYWxsb3dlZCBpbiBmLXN0cmluZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgLyogQXZvaWQgaW52b2tpbmcgZXNjYXBlIGRlY29kaW5nIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAqLworICAgIHJhd21vZGUgPSByYXdtb2RlIHx8IHN0cmNocihzLCAnXFwnKSA9PSBOVUxMOwogICAgIGlmICgqYnl0ZXNtb2RlKSB7Ci0gICAgICAgIC8qIERpc2FsbG93IG5vbi1hc2NpaSBjaGFyYWN0ZXJzIChidXQgbm90IGVzY2FwZXMpICovCisgICAgICAgIC8qIERpc2FsbG93IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiAqLwogICAgICAgICBjb25zdCBjaGFyICpjaDsKICAgICAgICAgZm9yIChjaCA9IHM7ICpjaDsgY2grKykgewogICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCpjaCkgPj0gMHg4MCkgewpAQCAtNDA2NSw3MSArNDk4MCw5MyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIG5lZWRfZW5jb2RpbmcgPSAoISpieXRlc21vZGUgJiYgYy0+Y19lbmNvZGluZyAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICBzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgIT0gMCk7Ci0gICAgaWYgKHJhd21vZGUgfHwgc3RyY2hyKHMsICdcXCcpID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG5lZWRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp2LCAqdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAodSA9PSBOVUxMIHx8ICEqYnl0ZXNtb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiB1OwotICAgICAgICAgICAgdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgYy0+Y19lbmNvZGluZywgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgfSBlbHNlIGlmICgqYnl0ZXNtb2RlKSB7CisgICAgICAgIGlmIChyYXdtb2RlKQogICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocywgbGVuLCBOVUxMKTsKLSAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAvKiBpZ25vcmVkICovIDAsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYXdtb2RlKQorICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgbGVuLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZV91bmljb2RlX3dpdGhfZXNjYXBlcyhjLCBzLCBsZW4pOwogICAgIH0KLSAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9lbmNvZGluZyA/IGMtPmNfZW5jb2RpbmcgOiBOVUxMKTsKIH0KIAotLyogQnVpbGQgYSBQeXRob24gc3RyaW5nIG9iamVjdCBvdXQgb2YgYSBTVFJJTkcrIGF0b20uICBUaGlzIHRha2VzIGNhcmUgb2YKLSAqIGNvbXBpbGUtdGltZSBsaXRlcmFsIGNhdGVuYXRpb24sIGNhbGxpbmcgcGFyc2VzdHIoKSBvbiBlYWNoIHBpZWNlLCBhbmQKLSAqIHBhc3RpbmcgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvZ2V0aGVyLgotICovCi1zdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCAqYnl0ZXNtb2RlKQorLyogQWNjZXB0cyBhIFNUUklORysgYXRvbSwgYW5kIHByb2R1Y2VzIGFuIGV4cHJfdHkgbm9kZS4gUnVuIHRocm91Z2gKKyAgIGVhY2ggU1RSSU5HIGF0b20sIGFuZCBwcm9jZXNzIGl0IGFzIG5lZWRlZC4gRm9yIGJ5dGVzLCBqdXN0CisgICBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIGEgQnl0ZXMgbm9kZS4gRm9yCisgICBub3JtYWwgc3RyaW5ncyBhbmQgZi1zdHJpbmdzLCBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLiBUaGUgcmVzdWx0CisgICB3aWxsIGJlIGEgU3RyIG5vZGUgaWYgdGhlcmUgd2VyZSBubyBmLXN0cmluZ3M7IGEgRm9ybWF0dGVkVmFsdWUKKyAgIG5vZGUgaWYgdGhlcmUncyBqdXN0IGFuIGYtc3RyaW5nICh3aXRoIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcKKyAgIGxpdGVyYWxzKSwgb3IgYSBKb2luZWRTdHIgbm9kZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZi1zdHJpbmdzIG9yCisgICBhbnkgbGl0ZXJhbHMgaW52b2x2ZWQuICovCitzdGF0aWMgZXhwcl90eQorcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCiB7Ci0gICAgUHlPYmplY3QgKnY7CisgICAgaW50IGJ5dGVzbW9kZSA9IDA7CisgICAgUHlPYmplY3QgKmJ5dGVzX3N0ciA9IE5VTEw7CiAgICAgaW50IGk7Ci0gICAgUkVRKENISUxEKG4sIDApLCBTVFJJTkcpOwotICAgIHYgPSBwYXJzZXN0cihjLCBDSElMRChuLCAwKSwgYnl0ZXNtb2RlKTsKLSAgICBpZiAodiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24gKi8KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IE5DSChuKTsgaSsrKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqczsKLSAgICAgICAgICAgIGludCBzdWJibSA9IDA7Ci0gICAgICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZzdWJibSk7Ci0gICAgICAgICAgICBpZiAocyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIGlmICgqYnl0ZXNtb2RlICE9IHN1YmJtKSB7Ci0gICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFscyIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICBGc3RyaW5nUGFyc2VyIHN0YXRlOworICAgIEZzdHJpbmdQYXJzZXJfSW5pdCgmc3RhdGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKSB7CisgICAgICAgIGludCB0aGlzX2J5dGVzbW9kZSA9IDA7CisgICAgICAgIGludCB0aGlzX2Ztb2RlID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnM7CisKKyAgICAgICAgUkVRKENISUxEKG4sIGkpLCBTVFJJTkcpOworICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZ0aGlzX2J5dGVzbW9kZSwgJnRoaXNfZm1vZGUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIC8qIENoZWNrIHRoYXQgd2UncmUgbm90IG1peGluZyBieXRlcyB3aXRoIHVuaWNvZGUuICovCisgICAgICAgIGlmIChpICE9IDAgJiYgYnl0ZXNtb2RlICE9IHRoaXNfYnl0ZXNtb2RlKSB7CisgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJ5dGVzbW9kZSA9IHRoaXNfYnl0ZXNtb2RlOworCisgICAgICAgIGFzc2VydChieXRlc21vZGUgPyBQeUJ5dGVzX0NoZWNrRXhhY3QocykgOiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzKSk7CisKKyAgICAgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAgICAgLyogRm9yIGJ5dGVzLCBjb25jYXQgYXMgd2UgZ28uICovCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwganVzdCByZW1lbWJlciB0aGlzIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIGJ5dGVzX3N0ciA9IHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZieXRlc19zdHIsIHMpOworICAgICAgICAgICAgICAgIGlmICghYnl0ZXNfc3RyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2sodikgJiYgUHlCeXRlc19DaGVjayhzKSkgewotICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZ2LCBzKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5VW5pY29kZV9Db25jYXQodiwgcyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICB2ID0gdGVtcDsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodGhpc19mbW9kZSkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBmLXN0cmluZy4gQ29uY2F0ZW5hdGUgYW5kIGRlY3JlZiBpdC4gKi8KKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb2ZzID0gMDsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBGc3RyaW5nUGFyc2VyX0NvbmNhdEZzdHJpbmcoJnN0YXRlLCBzLCAmb2ZzLCAwLCBjLCBuKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGEgcmVndWxhciBzdHJpbmcuIENvbmNhdGVuYXRlIGl0LiAqLworICAgICAgICAgICAgaWYgKEZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKCZzdGF0ZSwgcykgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHY7CisgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAvKiBKdXN0IHJldHVybiB0aGUgYnl0ZXMgb2JqZWN0IGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBieXRlc19zdHIpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJldHVybiBCeXRlcyhieXRlc19zdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICB9CiAKLSAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHYpOworICAgIC8qIFdlJ3JlIG5vdCBhIGJ5dGVzIHN0cmluZywgYnl0ZXNfc3RyIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gc2V0LiAqLworICAgIGFzc2VydChieXRlc19zdHIgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihieXRlc19zdHIpOworICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOwogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2JsdGlubW9kdWxlLmMgYi9QeXRob24vYmx0aW5tb2R1bGUuYwppbmRleCA5ZjVkYjJhLi5iZTE0NTYwIDEwMDY0NAotLS0gYS9QeXRob24vYmx0aW5tb2R1bGUuYworKysgYi9QeXRob24vYmx0aW5tb2R1bGUuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgaWYgKHByZXAgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICBucyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIG5zID0gUHlPRGljdF9OZXcoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRhKTsKQEAgLTE1NSwxNiArMTU1LDggQEAKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlPYmplY3QgKnBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIGJhc2VzKTsKLSAgICAgICAgaWYgKHBhcmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihwcmVwKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtZXRhKTsKLSAgICAgICAgICAgIFB5X1hERUNSRUYobWt3KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBucyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKHByZXAsIHBhcmdzLCBta3cpOwotICAgICAgICBQeV9ERUNSRUYocGFyZ3MpOworICAgICAgICBQeU9iamVjdCAqcGFyZ3NbMl0gPSB7bmFtZSwgYmFzZXN9OworICAgICAgICBucyA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QocHJlcCwgcGFyZ3MsIDIsIG1rdyk7CiAgICAgICAgIFB5X0RFQ1JFRihwcmVwKTsKICAgICB9CiAgICAgaWYgKG5zID09IE5VTEwpIHsKQEAgLTE3NywxMiArMTY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiAgICAgaWYgKGNlbGwgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqbWFyZ3M7Ci0gICAgICAgIG1hcmdzID0gUHlUdXBsZV9QYWNrKDMsIG5hbWUsIGJhc2VzLCBucyk7Ci0gICAgICAgIGlmIChtYXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjbHMgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhtZXRhLCBtYXJncywgbWt3KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtYXJncyk7Ci0gICAgICAgIH0KKyAgICAgICAgUHlPYmplY3QgKm1hcmdzWzNdID0ge25hbWUsIGJhc2VzLCBuc307CisgICAgICAgIGNscyA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QobWV0YSwgbWFyZ3MsIDMsIG1rdyk7CiAgICAgICAgIGlmIChjbHMgIT0gTlVMTCAmJiBQeUNlbGxfQ2hlY2soY2VsbCkpCiAgICAgICAgICAgICBQeUNlbGxfU2V0KGNlbGwsIGNscyk7CiAgICAgICAgIFB5X0RFQ1JFRihjZWxsKTsKQEAgLTMzMSw3ICszMTksNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjbXAgPT0gMSkgeworICAgICAgICBpZiAoY21wID4gMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwogICAgICAgICB9CkBAIC00NjksNiArNDU3LDcgQEAKICAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CiAgICAgbG9uZyBvazsKICAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgaW50IGNoZWNrdHJ1ZSA9IGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlOwogCiAgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogICAgIGZvciAoOzspIHsKQEAgLTQ3NiwxMiArNDY1LDExIEBACiAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgaWYgKGNoZWNrdHJ1ZSkgewogICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKLSAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE2OCwyNiArMTE1Niw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcF9uZXh0KG1hcG9iamVjdCAqbHopCiB7Ci0gICAgUHlPYmplY3QgKnZhbDsKLSAgICBQeU9iamVjdCAqYXJndHVwbGU7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICBQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CisgICAgUHlPYmplY3QgKnNtYWxsX3N0YWNrWzVdOworICAgIFB5T2JqZWN0ICoqc3RhY2s7CisgICAgUHlfc3NpemVfdCBuaXRlcnMsIG5hcmdzLCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0gICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOwotICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7Ci0gICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLSAgICAgICAgdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKLSAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworICAgIG5pdGVycyA9IFB5VHVwbGVfR0VUX1NJWkUobHotPml0ZXJzKTsKKyAgICBpZiAobml0ZXJzIDw9IChQeV9zc2l6ZV90KVB5X0FSUkFZX0xFTkdUSChzbWFsbF9zdGFjaykpIHsKKyAgICAgICAgc3RhY2sgPSBzbWFsbF9zdGFjazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YWNrID0gUHlNZW1fTWFsbG9jKG5pdGVycyAqIHNpemVvZihzdGFja1swXSkpOworICAgICAgICBpZiAoc3RhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJndHVwbGUsIGksIHZhbCk7CiAgICAgfQotICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3R1cGxlLCBOVUxMKTsKLSAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworCisgICAgbmFyZ3MgPSAwOworICAgIGZvciAoaT0wOyBpIDwgbml0ZXJzOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpOworICAgICAgICBQeU9iamVjdCAqdmFsID0gUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tbaV0gPSB2YWw7CisgICAgICAgIG5hcmdzKys7CisgICAgfQorCisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGx6LT5mdW5jLCBzdGFjaywgbmFyZ3MpOworCitleGl0OgorICAgIGZvciAoaT0wOyBpIDwgbmFyZ3M7IGkrKykgeworICAgICAgICBQeV9ERUNSRUYoc3RhY2tbaV0pOworICAgIH0KKyAgICBpZiAoc3RhY2sgIT0gc21hbGxfc3RhY2spIHsKKyAgICAgICAgUHlNZW1fRnJlZShzdGFjayk7CisgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE3NzksNyArMTc4NCw3IEBACiAgICAgICAgIGlmIChkb19mbHVzaCA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBlbHNlIGlmIChkb19mbHVzaCkgewotICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgIiIpOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaWxlLCAmUHlJZF9mbHVzaCwgTlVMTCk7CiAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBlbHNlCkBAIC0xODQ1LDcgKzE4NTAsNyBAQAogICAgIH0KIAogICAgIC8qIEZpcnN0IG9mIGFsbCwgZmx1c2ggc3RkZXJyICovCi0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmVyciwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICBlbHNlCkBAIC0xODU0LDcgKzE4NTksNyBAQAogICAgIC8qIFdlIHNob3VsZCBvbmx5IHVzZSAoR05VKSByZWFkbGluZSBpZiBQeXRob24ncyBzeXMuc3RkaW4gYW5kCiAgICAgICAgc3lzLnN0ZG91dCBhcmUgdGhlIHNhbWUgYXMgQydzIHN0ZGluIGFuZCBzdGRvdXQsIGJlY2F1c2Ugd2UKICAgICAgICBuZWVkIHRvIHBhc3MgaXQgdGhvc2UuICovCi0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmaW4sICZQeUlkX2ZpbGVubywgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmluLCAmUHlJZF9maWxlbm8sIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICB0dHkgPSAwOwpAQCAtMTg2Nyw3ICsxODcyLDcgQEAKICAgICAgICAgdHR5ID0gZmQgPT0gZmlsZW5vKHN0ZGluKSAmJiBpc2F0dHkoZmQpOwogICAgIH0KICAgICBpZiAodHR5KSB7Ci0gICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmlsZW5vLCAiIik7CisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmlsZW5vLCBOVUxMKTsKICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgdHR5ID0gMDsKQEAgLTE5MDIsNyArMTkwNyw3IEBACiAgICAgICAgIHN0ZGluX2Vycm9yc19zdHIgPSBfUHlVbmljb2RlX0FzU3RyaW5nKHN0ZGluX2Vycm9ycyk7CiAgICAgICAgIGlmICghc3RkaW5fZW5jb2Rpbmdfc3RyIHx8ICFzdGRpbl9lcnJvcnNfc3RyKQogICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOwotICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZvdXQsICZQeUlkX2ZsdXNoLCAiIik7CisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgICAgICBpZiAodG1wID09IE5VTEwpCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlCkBAIC0xOTI5LDkgKzE5MzQsOCBAQAogICAgICAgICAgICAgUHlfQ0xFQVIoc3RyaW5ncG8pOwogICAgICAgICAgICAgaWYgKHBvID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOwotICAgICAgICAgICAgcHJvbXB0c3RyID0gUHlCeXRlc19Bc1N0cmluZyhwbyk7Ci0gICAgICAgICAgICBpZiAocHJvbXB0c3RyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOworICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2socG8pKTsKKyAgICAgICAgICAgIHByb21wdHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHBvKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHBvID0gTlVMTDsKQEAgLTE5ODMsNyArMTk4Nyw3IEBACiAgICAgICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3QocHJvbXB0LCBmb3V0LCBQeV9QUklOVF9SQVcpICE9IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb3V0LCAmUHlJZF9mbHVzaCwgIiIpOworICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICBlbHNlCkBAIC0yMDg3LDEwICsyMDkxLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9zb3J0ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBQeU9iamVjdCAqbmV3bGlzdCwgKnYsICpzZXEsICprZXlmdW5jPU5VTEwsICpuZXdhcmdzOworICAgIFB5T2JqZWN0ICpuZXdsaXN0LCAqdiwgKnNlcSwgKmtleWZ1bmM9TlVMTCwgKipuZXdhcmdzOwogICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgImtleSIsICJyZXZlcnNlIiwgMH07CiAgICAgaW50IHJldmVyc2U7CisgICAgUHlfc3NpemVfdCBuYXJnczsKIAogICAgIC8qIGFyZ3MgMS0zIHNob3VsZCBtYXRjaCBsaXN0c29ydCBpbiBPYmplY3RzL2xpc3RvYmplY3QuYyAqLwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9pOnNvcnRlZCIsCkBAIC0yMTA3LDE1ICsyMTEyLDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgNCk7Ci0gICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYobmV3bGlzdCk7Ci0gICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHYgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBuZXdhcmdzLCBrd2RzKTsKLSAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgbmV3YXJncyA9ICZQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAtIDE7CisgICAgdiA9IF9QeU9iamVjdF9GYXN0Q2FsbERpY3QoY2FsbGFibGUsIG5ld2FyZ3MsIG5hcmdzLCBrd2RzKTsKICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2xpc3QpOwpAQCAtMjcxMCwxMCArMjcwOSwxMCBAQAogICAgIFNFVEJVSUxUSU4oInppcCIsICAgICAgICAgICAgICAgICAgICZQeVppcF9UeXBlKTsKICAgICBkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgICAgICBQeV9ERUNSRUYoZGVidWcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfWERFQ1JFRihkZWJ1Zyk7CisgICAgUHlfREVDUkVGKGRlYnVnKTsKIAogICAgIHJldHVybiBtb2Q7CiAjdW5kZWYgQUREX1RPX0FMTApkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA4ZTM5NmZkLi5iZjE5YTViIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMTEzLDE5ICsxMTMsMTkgQEAKICNlbHNlCiBzdGF0aWMgUHlPYmplY3QgKiBjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKiwgaW50KTsKICNlbmRpZgotc3RhdGljIFB5T2JqZWN0ICogZmFzdF9mdW5jdGlvbihQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50LCBpbnQpOwotc3RhdGljIFB5T2JqZWN0ICogZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqIGV4dF9kb19jYWxsKFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKiwgaW50LCBpbnQsIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICosIGludCwgUHlPYmplY3QgKioqLAorc3RhdGljIFB5T2JqZWN0ICogZmFzdF9mdW5jdGlvbihQeU9iamVjdCAqLCBQeU9iamVjdCAqKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCk7CitzdGF0aWMgUHlPYmplY3QgKiBkb19jYWxsKFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCk7CitzdGF0aWMgUHlPYmplY3QgKiBleHRfZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCk7CitzdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICoqKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKik7Ci1zdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfc3Rhcl9hcmdzKGludCwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKiopOwotc3RhdGljIFB5T2JqZWN0ICogbG9hZF9hcmdzKFB5T2JqZWN0ICoqKiwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCAqIHVwZGF0ZV9zdGFyX2FyZ3MoUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKioqKTsKK3N0YXRpYyBQeU9iamVjdCAqIGxvYWRfYXJncyhQeU9iamVjdCAqKiosIFB5X3NzaXplX3QpOwogI2RlZmluZSBDQUxMX0ZMQUdfVkFSIDEKICNkZWZpbmUgQ0FMTF9GTEFHX0tXIDIKIAogI2lmZGVmIExMVFJBQ0UKIHN0YXRpYyBpbnQgbGx0cmFjZTsKLXN0YXRpYyBpbnQgcHJ0cmFjZShQeU9iamVjdCAqLCBjaGFyICopOworc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIHN0YXRpYyBpbnQgY2FsbF90cmFjZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqLCBQeUZyYW1lT2JqZWN0ICosCkBAIC0xMzksMTIgKzEzOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqLCBQeUZyYW1lT2JqZWN0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogCiBzdGF0aWMgUHlPYmplY3QgKiBjbXBfb3V0Y29tZShpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICogaW1wb3J0X25hbWUoUHlGcmFtZU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGltcG9ydF9mcm9tKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBpbXBvcnRfYWxsX2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgZm9ybWF0X2V4Y191bmJvdW5kKFB5Q29kZU9iamVjdCAqY28sIGludCBvcGFyZyk7CiBzdGF0aWMgUHlPYmplY3QgKiB1bmljb2RlX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIHNwZWNpYWxfbG9va3VwKFB5T2JqZWN0ICosIF9QeV9JZGVudGlmaWVyICopOwogCiAjZGVmaW5lIE5BTUVfRVJST1JfTVNHIFwKQEAgLTc5NiwxMSArNzk3LDE4IEBACiBQeU9iamVjdCAqCiBQeUV2YWxfRXZhbEZyYW1lRXgoUHlGcmFtZU9iamVjdCAqZiwgaW50IHRocm93ZmxhZykKIHsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHJldHVybiB0c3RhdGUtPmludGVycC0+ZXZhbF9mcmFtZShmLCB0aHJvd2ZsYWcpOworfQorCitQeU9iamVjdCAqCitfUHlFdmFsX0V2YWxGcmFtZURlZmF1bHQoUHlGcmFtZU9iamVjdCAqZiwgaW50IHRocm93ZmxhZykKK3sKICNpZmRlZiBEWFBBSVJTCiAgICAgaW50IGxhc3RvcGNvZGUgPSAwOwogI2VuZGlmCiAgICAgUHlPYmplY3QgKipzdGFja19wb2ludGVyOyAgLyogTmV4dCBmcmVlIHNsb3QgaW4gdmFsdWUgc3RhY2sgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpuZXh0X2luc3RyOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpuZXh0X2luc3RyOwogICAgIGludCBvcGNvZGU7ICAgICAgICAvKiBDdXJyZW50IG9wY29kZSAqLwogICAgIGludCBvcGFyZzsgICAgICAgICAvKiBDdXJyZW50IG9wY29kZSBhcmd1bWVudCwgaWYgYW55ICovCiAgICAgZW51bSB3aHlfY29kZSB3aHk7IC8qIFJlYXNvbiBmb3IgYmxvY2sgc3RhY2sgdW53aW5kICovCkBAIC04MTgsNyArODI2LDcgQEAKICAgICAgICB0aW1lIGl0IGlzIHRlc3RlZC4gKi8KICAgICBpbnQgaW5zdHJfdWIgPSAtMSwgaW5zdHJfbGIgPSAwLCBpbnN0cl9wcmV2ID0gLTE7CiAKLSAgICB1bnNpZ25lZCBjaGFyICpmaXJzdF9pbnN0cjsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZmlyc3RfaW5zdHI7CiAgICAgUHlPYmplY3QgKm5hbWVzOwogICAgIFB5T2JqZWN0ICpjb25zdHM7CiAKQEAgLTg4NiwyNCArODk0LDEwIEBACiAvKiBJbXBvcnQgdGhlIHN0YXRpYyBqdW1wIHRhYmxlICovCiAjaW5jbHVkZSAib3Bjb2RlX3RhcmdldHMuaCIKIAotLyogVGhpcyBtYWNybyBpcyB1c2VkIHdoZW4gc2V2ZXJhbCBvcGNvZGVzIGRlZmVyIHRvIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uCi0gICAoZS5nLiBTRVRVUF9MT09QLCBTRVRVUF9GSU5BTExZKSAqLwotI2RlZmluZSBUQVJHRVRfV0lUSF9JTVBMKG9wLCBpbXBsKSBcCi0gICAgVEFSR0VUXyMjb3A6IFwKLSAgICAgICAgb3Bjb2RlID0gb3A7IFwKLSAgICAgICAgaWYgKEhBU19BUkcob3ApKSBcCi0gICAgICAgICAgICBvcGFyZyA9IE5FWFRBUkcoKTsgXAotICAgIGNhc2Ugb3A6IFwKLSAgICAgICAgZ290byBpbXBsOyBcCi0KICNkZWZpbmUgVEFSR0VUKG9wKSBcCiAgICAgVEFSR0VUXyMjb3A6IFwKLSAgICAgICAgb3Bjb2RlID0gb3A7IFwKLSAgICAgICAgaWYgKEhBU19BUkcob3ApKSBcCi0gICAgICAgICAgICBvcGFyZyA9IE5FWFRBUkcoKTsgXAogICAgIGNhc2Ugb3A6CiAKLQogI2RlZmluZSBESVNQQVRDSCgpIFwKICAgICB7IFwKICAgICAgICAgaWYgKCFfUHlfYXRvbWljX2xvYWRfcmVsYXhlZCgmZXZhbF9icmVha2VyKSkgeyAgICAgIFwKQEAgLTkxNyw3ICs5MTEsOCBAQAogICAgIHsgXAogICAgICAgICBpZiAoIWxsdHJhY2UgJiYgIV9QeV9UcmFjaW5nUG9zc2libGUpIHsgXAogICAgICAgICAgICAgZi0+Zl9sYXN0aSA9IElOU1RSX09GRlNFVCgpOyBcCi0gICAgICAgICAgICBnb3RvICpvcGNvZGVfdGFyZ2V0c1sqbmV4dF9pbnN0cisrXTsgXAorICAgICAgICAgICAgTkVYVE9QQVJHKCk7IFwKKyAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzW29wY29kZV07IFwKICAgICAgICAgfSBcCiAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsgXAogICAgIH0KQEAgLTkyNiw3ICs5MjEsOCBAQAogICAgIHsgXAogICAgICAgICBpZiAoIV9QeV9UcmFjaW5nUG9zc2libGUpIHsgXAogICAgICAgICAgICAgZi0+Zl9sYXN0aSA9IElOU1RSX09GRlNFVCgpOyBcCi0gICAgICAgICAgICBnb3RvICpvcGNvZGVfdGFyZ2V0c1sqbmV4dF9pbnN0cisrXTsgXAorICAgICAgICAgICAgTkVYVE9QQVJHKCk7IFwKKyAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzW29wY29kZV07IFwKICAgICAgICAgfSBcCiAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsgXAogICAgIH0KQEAgLTkzNSwxMCArOTMxLDcgQEAKICNlbHNlCiAjZGVmaW5lIFRBUkdFVChvcCkgXAogICAgIGNhc2Ugb3A6Ci0jZGVmaW5lIFRBUkdFVF9XSVRIX0lNUEwob3AsIGltcGwpIFwKLSAgICAvKiBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGBpbXBsYCB1bnVzZWQgKi8gXAotICAgIGlmICgwKSBnb3RvIGltcGw7IFwKLSAgICBjYXNlIG9wOgorCiAjZGVmaW5lIERJU1BBVENIKCkgY29udGludWUKICNkZWZpbmUgRkFTVF9ESVNQQVRDSCgpIGdvdG8gZmFzdF9uZXh0X29wY29kZQogI2VuZGlmCkBAIC05OTQsMjggKzk4NywzOCBAQAogCiAvKiBDb2RlIGFjY2VzcyBtYWNyb3MgKi8KIAotI2RlZmluZSBJTlNUUl9PRkZTRVQoKSAgKChpbnQpKG5leHRfaW5zdHIgLSBmaXJzdF9pbnN0cikpCi0jZGVmaW5lIE5FWFRPUCgpICAgICAgICAoKm5leHRfaW5zdHIrKykKLSNkZWZpbmUgTkVYVEFSRygpICAgICAgIChuZXh0X2luc3RyICs9IDIsIChuZXh0X2luc3RyWy0xXTw8OCkgKyBuZXh0X2luc3RyWy0yXSkKLSNkZWZpbmUgUEVFS0FSRygpICAgICAgICgobmV4dF9pbnN0clsyXTw8OCkgKyBuZXh0X2luc3RyWzFdKQotI2RlZmluZSBKVU1QVE8oeCkgICAgICAgKG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArICh4KSkKLSNkZWZpbmUgSlVNUEJZKHgpICAgICAgIChuZXh0X2luc3RyICs9ICh4KSkKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICAjZGVmaW5lIE9QQ09ERSh3b3JkKSAoKHdvcmQpID4+IDgpCisgICAgI2RlZmluZSBPUEFSRyh3b3JkKSAoKHdvcmQpICYgMjU1KQorI2Vsc2UKKyAgICAjZGVmaW5lIE9QQ09ERSh3b3JkKSAoKHdvcmQpICYgMjU1KQorICAgICNkZWZpbmUgT1BBUkcod29yZCkgKCh3b3JkKSA+PiA4KQorI2VuZGlmCisvKiBUaGUgaW50ZWdlciBvdmVyZmxvdyBpcyBjaGVja2VkIGJ5IGFuIGFzc2VydGlvbiBiZWxvdy4gKi8KKyNkZWZpbmUgSU5TVFJfT0ZGU0VUKCkgICgyKihpbnQpKG5leHRfaW5zdHIgLSBmaXJzdF9pbnN0cikpCisjZGVmaW5lIE5FWFRPUEFSRygpICBkbyB7IFwKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgd29yZCA9ICpuZXh0X2luc3RyOyBcCisgICAgICAgIG9wY29kZSA9IE9QQ09ERSh3b3JkKTsgXAorICAgICAgICBvcGFyZyA9IE9QQVJHKHdvcmQpOyBcCisgICAgICAgIG5leHRfaW5zdHIrKzsgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIEpVTVBUTyh4KSAgICAgICAobmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgKHgpLzIpCisjZGVmaW5lIEpVTVBCWSh4KSAgICAgICAobmV4dF9pbnN0ciArPSAoeCkvMikKIAogLyogT3BDb2RlIHByZWRpY3Rpb24gbWFjcm9zCiAgICAgU29tZSBvcGNvZGVzIHRlbmQgdG8gY29tZSBpbiBwYWlycyB0aHVzIG1ha2luZyBpdCBwb3NzaWJsZSB0bwogICAgIHByZWRpY3QgdGhlIHNlY29uZCBjb2RlIHdoZW4gdGhlIGZpcnN0IGlzIHJ1bi4gIEZvciBleGFtcGxlLAotICAgIENPTVBBUkVfT1AgaXMgb2Z0ZW4gZm9sbG93ZWQgYnkgSlVNUF9JRl9GQUxTRSBvciBKVU1QX0lGX1RSVUUuICBBbmQsCi0gICAgdGhvc2Ugb3Bjb2RlcyBhcmUgb2Z0ZW4gZm9sbG93ZWQgYnkgYSBQT1BfVE9QLgorICAgIENPTVBBUkVfT1AgaXMgb2Z0ZW4gZm9sbG93ZWQgYnkgUE9QX0pVTVBfSUZfRkFMU0Ugb3IgUE9QX0pVTVBfSUZfVFJVRS4KIAogICAgIFZlcmlmeWluZyB0aGUgcHJlZGljdGlvbiBjb3N0cyBhIHNpbmdsZSBoaWdoLXNwZWVkIHRlc3Qgb2YgYSByZWdpc3RlcgogICAgIHZhcmlhYmxlIGFnYWluc3QgYSBjb25zdGFudC4gIElmIHRoZSBwYWlyaW5nIHdhcyBnb29kLCB0aGVuIHRoZQogICAgIHByb2Nlc3NvcidzIG93biBpbnRlcm5hbCBicmFuY2ggcHJlZGljYXRpb24gaGFzIGEgaGlnaCBsaWtlbGlob29kIG9mCiAgICAgc3VjY2VzcywgcmVzdWx0aW5nIGluIGEgbmVhcmx5IHplcm8tb3ZlcmhlYWQgdHJhbnNpdGlvbiB0byB0aGUKICAgICBuZXh0IG9wY29kZS4gIEEgc3VjY2Vzc2Z1bCBwcmVkaWN0aW9uIHNhdmVzIGEgdHJpcCB0aHJvdWdoIHRoZSBldmFsLWxvb3AKLSAgICBpbmNsdWRpbmcgaXRzIHR3byB1bnByZWRpY3RhYmxlIGJyYW5jaGVzLCB0aGUgSEFTX0FSRyB0ZXN0IGFuZCB0aGUKLSAgICBzd2l0Y2gtY2FzZS4gIENvbWJpbmVkIHdpdGggdGhlIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLAotICAgIGEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmCi0gICAgdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgorICAgIGluY2x1ZGluZyBpdHMgdW5wcmVkaWN0YWJsZSBzd2l0Y2gtY2FzZSBicmFuY2guICBDb21iaW5lZCB3aXRoIHRoZQorICAgIHByb2Nlc3NvcidzIGludGVybmFsIGJyYW5jaCBwcmVkaWN0aW9uLCBhIHN1Y2Nlc3NmdWwgUFJFRElDVCBoYXMgdGhlCisgICAgZWZmZWN0IG9mIG1ha2luZyB0aGUgdHdvIG9wY29kZXMgcnVuIGFzIGlmIHRoZXkgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlCisgICAgd2l0aCB0aGUgYm9kaWVzIGNvbWJpbmVkLgogCiAgICAgSWYgY29sbGVjdGluZyBvcGNvZGUgc3RhdGlzdGljcywgeW91ciBjaG9pY2VzIGFyZSB0byBlaXRoZXIga2VlcCB0aGUKICAgICBwcmVkaWN0aW9ucyB0dXJuZWQtb24gYW5kIGludGVycHJldCB0aGUgcmVzdWx0cyBhcyBpZiBzb21lIG9wY29kZXMKQEAgLTEwMzAsMTMgKzEwMzMsMTkgQEAKIAogI2lmIGRlZmluZWQoRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRSkgfHwgVVNFX0NPTVBVVEVEX0dPVE9TCiAjZGVmaW5lIFBSRURJQ1Qob3ApICAgICAgICAgICAgIGlmICgwKSBnb3RvIFBSRURfIyNvcAotI2RlZmluZSBQUkVESUNURUQob3ApICAgICAgICAgICBQUkVEXyMjb3A6Ci0jZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkgIFBSRURfIyNvcDoKICNlbHNlCi0jZGVmaW5lIFBSRURJQ1Qob3ApICAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBvcCkgZ290byBQUkVEXyMjb3AKLSNkZWZpbmUgUFJFRElDVEVEKG9wKSAgICAgICAgICAgUFJFRF8jI29wOiBuZXh0X2luc3RyKysKLSNkZWZpbmUgUFJFRElDVEVEX1dJVEhfQVJHKG9wKSAgUFJFRF8jI29wOiBvcGFyZyA9IFBFRUtBUkcoKTsgbmV4dF9pbnN0ciArPSAzCisjZGVmaW5lIFBSRURJQ1Qob3ApIFwKKyAgICBkb3sgXAorICAgICAgICB1bnNpZ25lZCBzaG9ydCB3b3JkID0gKm5leHRfaW5zdHI7IFwKKyAgICAgICAgb3Bjb2RlID0gT1BDT0RFKHdvcmQpOyBcCisgICAgICAgIGlmIChvcGNvZGUgPT0gb3ApeyBcCisgICAgICAgICAgICBvcGFyZyA9IE9QQVJHKHdvcmQpOyBcCisgICAgICAgICAgICBuZXh0X2luc3RyKys7IFwKKyAgICAgICAgICAgIGdvdG8gUFJFRF8jI29wOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUoMCkKICNlbmRpZgorI2RlZmluZSBQUkVESUNURUQob3ApICAgICAgICAgICBQUkVEXyMjb3A6CiAKIAogLyogU3RhY2sgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLwpAQCAtMTEwMCw3ICsxMTA5LDcgQEAKICAgICB9CiAKICNkZWZpbmUgVU5XSU5EX0VYQ0VQVF9IQU5ETEVSKGIpIFwKLSAgICB7IFwKKyAgICBkbyB7IFwKICAgICAgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjazsgXAogICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA+PSAoYiktPmJfbGV2ZWwgKyAzKTsgXAogICAgICAgICB3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IChiKS0+Yl9sZXZlbCArIDMpIHsgXApAQCAtMTExNiw3ICsxMTI1LDcgQEAKICAgICAgICAgUHlfWERFQ1JFRih0eXBlKTsgXAogICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsgXAogICAgICAgICBQeV9YREVDUkVGKHRyYWNlYmFjayk7IFwKLSAgICB9CisgICAgfSB3aGlsZSgwKQogCiAvKiBTdGFydCBvZiBjb2RlICovCiAKQEAgLTExNjUsMTYgKzExNzQsMTYgQEAKICAgICBjb25zdHMgPSBjby0+Y29fY29uc3RzOwogICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAgICAgZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKLSAgICBmaXJzdF9pbnN0ciA9ICh1bnNpZ25lZCBjaGFyKikgUHlCeXRlc19BU19TVFJJTkcoY28tPmNvX2NvZGUpOwotICAgIC8qIEFuIGV4cGxhbmF0aW9uIGlzIGluIG9yZGVyIGZvciB0aGUgbmV4dCBsaW5lLgorICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGNvLT5jb19jb2RlKSk7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfR0VUX1NJWkUoY28tPmNvX2NvZGUpIDw9IElOVF9NQVgpOworICAgIGFzc2VydChQeUJ5dGVzX0dFVF9TSVpFKGNvLT5jb19jb2RlKSAlIDIgPT0gMCk7CisgICAgYXNzZXJ0KF9QeV9JU19BTElHTkVEKFB5Qnl0ZXNfQVNfU1RSSU5HKGNvLT5jb19jb2RlKSwgMikpOworICAgIGZpcnN0X2luc3RyID0gKHVuc2lnbmVkIHNob3J0KikgUHlCeXRlc19BU19TVFJJTkcoY28tPmNvX2NvZGUpOworICAgIC8qCisgICAgICAgZi0+Zl9sYXN0aSByZWZlcnMgdG8gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluc3RydWN0aW9uLAorICAgICAgIHVubGVzcyBpdCdzIC0xIGluIHdoaWNoIGNhc2UgbmV4dF9pbnN0ciBzaG91bGQgYmUgZmlyc3RfaW5zdHIuCiAKLSAgICAgICBmLT5mX2xhc3RpIG5vdyByZWZlcnMgdG8gdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluc3RydWN0aW9uCi0gICAgICAgZXhlY3V0ZWQuICBZb3UgbWlnaHQgdGhpbmsgdGhpcyB3YXMgb2J2aW91cyBmcm9tIHRoZSBuYW1lLCBidXQKLSAgICAgICB0aGlzIHdhc24ndCBhbHdheXMgdHJ1ZSBiZWZvcmUgMi4zISAgUHlGcmFtZV9OZXcgbm93IHNldHMKLSAgICAgICBmLT5mX2xhc3RpIHRvIC0xIChpLmUuIHRoZSBpbmRleCAqYmVmb3JlKiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCi0gICAgICAgYW5kIFlJRUxEX1ZBTFVFIGRvZXNuJ3QgZmlkZGxlIHdpdGggZl9sYXN0aSBhbnkgbW9yZS4gIFNvIHRoaXMKLSAgICAgICBkb2VzIHdvcmsuICBQcm9taXNlLgotICAgICAgIFlJRUxEX0ZST00gc2V0cyBmX2xhc3RpIHRvIGl0c2VsZiwgaW4gb3JkZXIgdG8gcmVwZWF0ZWQgeWllbGQKKyAgICAgICBZSUVMRF9GUk9NIHNldHMgZl9sYXN0aSB0byBpdHNlbGYsIGluIG9yZGVyIHRvIHJlcGVhdGVkbHkgeWllbGQKICAgICAgICBtdWx0aXBsZSB2YWx1ZXMuCiAKICAgICAgICBXaGVuIHRoZSBQUkVESUNUKCkgbWFjcm9zIGFyZSBlbmFibGVkLCBzb21lIG9wY29kZSBwYWlycyBmb2xsb3cgaW4KQEAgLTExODMsOSArMTE5MiwxMyBAQAogICAgICAgIHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZTsgYWNjb3JkaW5nbHksZi0+Zl9sYXN0aSB3aWxsIHBvaW50IHRvCiAgICAgICAgdGhlIGZpcnN0IGNvZGUgaW4gdGhlIHBhaXIgKGZvciBpbnN0YW5jZSwgR0VUX0lURVIgZm9sbG93ZWQgYnkKICAgICAgICBGT1JfSVRFUiBpcyBlZmZlY3RpdmVseSBhIHNpbmdsZSBvcGNvZGUgYW5kIGYtPmZfbGFzdGkgd2lsbCBwb2ludAotICAgICAgIGF0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQorICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbWJpbmVkIHBhaXIuKQogICAgICovCi0gICAgbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgZi0+Zl9sYXN0aSArIDE7CisgICAgbmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyOworICAgIGlmIChmLT5mX2xhc3RpID49IDApIHsKKyAgICAgICAgYXNzZXJ0KGYtPmZfbGFzdGkgJSAyID09IDApOworICAgICAgICBuZXh0X2luc3RyICs9IGYtPmZfbGFzdGkvMiArIDE7CisgICAgfQogICAgIHN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOwogICAgIGFzc2VydChzdGFja19wb2ludGVyICE9IE5VTEwpOwogICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOyAgICAgICAvKiByZW1haW5zIE5VTEwgdW5sZXNzIHlpZWxkIHN1c3BlbmRzIGZyYW1lICovCkBAIC0xMjQ5LDcgKzEyNjIsNyBAQAogICAgICAgICAgICBQeV9NYWtlUGVuZGluZ0NhbGxzKCkgYWJvdmUuICovCiAKICAgICAgICAgaWYgKF9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZldmFsX2JyZWFrZXIpKSB7Ci0gICAgICAgICAgICBpZiAoKm5leHRfaW5zdHIgPT0gU0VUVVBfRklOQUxMWSkgeworICAgICAgICAgICAgaWYgKE9QQ09ERSgqbmV4dF9pbnN0cikgPT0gU0VUVVBfRklOQUxMWSkgewogICAgICAgICAgICAgICAgIC8qIE1ha2UgdGhlIGxhc3Qgb3Bjb2RlIGJlZm9yZQogICAgICAgICAgICAgICAgICAgIGEgdHJ5OiBmaW5hbGx5OiBibG9jayB1bmludGVycnVwdGlibGUuICovCiAgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwpAQCAtMTMyMiwxMSArMTMzNSw3IEBACiAKICAgICAgICAgLyogRXh0cmFjdCBvcGNvZGUgYW5kIGFyZ3VtZW50ICovCiAKLSAgICAgICAgb3Bjb2RlID0gTkVYVE9QKCk7Ci0gICAgICAgIG9wYXJnID0gMDsgICAvKiBhbGxvd3Mgb3BhcmcgdG8gYmUgc3RvcmVkIGluIGEgcmVnaXN0ZXIgYmVjYXVzZQotICAgICAgICAgICAgaXQgZG9lc24ndCBoYXZlIHRvIGJlIHJlbWVtYmVyZWQgYWNyb3NzIGEgZnVsbCBsb29wICovCi0gICAgICAgIGlmIChIQVNfQVJHKG9wY29kZSkpCi0gICAgICAgICAgICBvcGFyZyA9IE5FWFRBUkcoKTsKKyAgICAgICAgTkVYVE9QQVJHKCk7CiAgICAgZGlzcGF0Y2hfb3Bjb2RlOgogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKICNpZmRlZiBEWFBBSVJTCkBAIC0xMzc3LDYgKzEzODYsNyBAQAogICAgICAgICAgICAgRkFTVF9ESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgUFJFRElDVEVEKExPQURfQ09OU1QpOwogICAgICAgICBUQVJHRVQoTE9BRF9DT05TVCkgewogICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gR0VUSVRFTShjb25zdHMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CkBAIC0xMzg0LDcgKzEzOTQsNyBAQAogICAgICAgICAgICAgRkFTVF9ESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFNUT1JFX0ZBU1QpOworICAgICAgICBQUkVESUNURUQoU1RPUkVfRkFTVCk7CiAgICAgICAgIFRBUkdFVChTVE9SRV9GQVNUKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBQT1AoKTsKICAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCB2YWx1ZSk7CkBAIC0yMDA2LDYgKzIwMTYsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTRVRfVE9QKGF3YWl0YWJsZSk7CisgICAgICAgICAgICBQUkVESUNUKExPQURfQ09OU1QpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0yMDQ4LDkgKzIwNTksMTEgQEAKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV4dF9pdGVyKTsKIAogICAgICAgICAgICAgUFVTSChhd2FpdGFibGUpOworICAgICAgICAgICAgUFJFRElDVChMT0FEX0NPTlNUKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoR0VUX0FXQUlUQUJMRSk7CiAgICAgICAgIFRBUkdFVChHRVRfQVdBSVRBQkxFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBUT1AoKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVyID0gX1B5Q29yb19HZXRBd2FpdGFibGVJdGVyKGl0ZXJhYmxlKTsKQEAgLTIwNzgsMjEgKzIwOTEsMjIgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBQUkVESUNUKExPQURfQ09OU1QpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCiAgICAgICAgIFRBUkdFVChZSUVMRF9GUk9NKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFBPUCgpOwotICAgICAgICAgICAgUHlPYmplY3QgKnJlY2lldmVyID0gVE9QKCk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVjZWl2ZXIgPSBUT1AoKTsKICAgICAgICAgICAgIGludCBlcnI7Ci0gICAgICAgICAgICBpZiAoUHlHZW5fQ2hlY2tFeGFjdChyZWNpZXZlcikgfHwgUHlDb3JvX0NoZWNrRXhhY3QocmVjaWV2ZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gX1B5R2VuX1NlbmQoKFB5R2VuT2JqZWN0ICopcmVjaWV2ZXIsIHYpOworICAgICAgICAgICAgaWYgKFB5R2VuX0NoZWNrRXhhY3QocmVjZWl2ZXIpIHx8IFB5Q29yb19DaGVja0V4YWN0KHJlY2VpdmVyKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IF9QeUdlbl9TZW5kKChQeUdlbk9iamVjdCAqKXJlY2VpdmVyLCB2KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoc2VuZCk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUHlfVFlQRShyZWNpZXZlciktPnRwX2l0ZXJuZXh0KHJlY2lldmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUHlfVFlQRShyZWNlaXZlciktPnRwX2l0ZXJuZXh0KHJlY2VpdmVyKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWRPYmpBcmdzKHJlY2lldmVyLCAmUHlJZF9zZW5kLCB2LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZE9iakFyZ3MocmVjZWl2ZXIsICZQeUlkX3NlbmQsIHYsIE5VTEwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBOVUxMKSB7CkBAIC0yMTAzLDcgKzIxMTcsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IF9QeUdlbl9GZXRjaFN0b3BJdGVyYXRpb25WYWx1ZSgmdmFsKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVjaWV2ZXIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZWNlaXZlcik7CiAgICAgICAgICAgICAgICAgU0VUX1RPUCh2YWwpOwogICAgICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgICAgICB9CkBAIC0yMTExLDcgKzIxMjUsNyBAQAogICAgICAgICAgICAgZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7CiAgICAgICAgICAgICB3aHkgPSBXSFlfWUlFTEQ7CiAgICAgICAgICAgICAvKiBhbmQgcmVwZWF0Li4uICovCi0gICAgICAgICAgICBmLT5mX2xhc3RpLS07CisgICAgICAgICAgICBmLT5mX2xhc3RpIC09IDI7CiAgICAgICAgICAgICBnb3RvIGZhc3RfeWllbGQ7CiAgICAgICAgIH0KIApAQCAtMjEzMyw2ICsyMTQ3LDcgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoUE9QX0JMT0NLKTsKICAgICAgICAgVEFSR0VUKFBPUF9CTE9DSykgewogICAgICAgICAgICAgUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7CiAgICAgICAgICAgICBVTldJTkRfQkxPQ0soYik7CkBAIC0yMjQ5LDcgKzIyNjQsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICBQUkVESUNURUQoVU5QQUNLX1NFUVVFTkNFKTsKICAgICAgICAgVEFSR0VUKFVOUEFDS19TRVFVRU5DRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKnNlcSA9IFBPUCgpLCAqaXRlbSwgKippdGVtczsKICAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3Qoc2VxKSAmJgpAQCAtMjM1OCw3ICsyMzczLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCAmJiBfUHlFcnJfT0NDVVJSRUQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0yMzk4LDI2ICsyNDEzLDMzIEBACiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwogICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGYtPmZfZ2xvYmFscykKLSAgICAgICAgICAgICAgICAmJiBQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2J1aWx0aW5zKSkgeworICAgICAgICAgICAgICAgICYmIFB5RGljdF9DaGVja0V4YWN0KGYtPmZfYnVpbHRpbnMpKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHYgPSBfUHlEaWN0X0xvYWRHbG9iYWwoKFB5RGljdE9iamVjdCAqKWYtPmZfZ2xvYmFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURpY3RPYmplY3QgKilmLT5mX2J1aWx0aW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBfUHlEaWN0X0xvYWRHbG9iYWwoKSByZXR1cm5zIE5VTEwgd2l0aG91dCByYWlzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbiBleGNlcHRpb24gaWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FX0VSUk9SX01TRywgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogU2xvdy1wYXRoIGlmIGdsb2JhbHMgb3IgYnVpbHRpbnMgaXMgbm90IGEgZGljdCAqLworCisgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KICAgICAgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIG5hbWUpOwogICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKKyAgICAgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDI6IGJ1aWx0aW5zICovCiAgICAgICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCkBAIC0yNDc3LDcgKzI0OTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMjUxNiw2ICsyNTM4LDI0IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgVEFSR0VUKEJVSUxEX1NUUklORykgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplbXB0eSA9IFB5VW5pY29kZV9OZXcoMCwgMCk7CisgICAgICAgICAgICBpZiAoZW1wdHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHIgPSBfUHlVbmljb2RlX0pvaW5BcnJheShlbXB0eSwgc3RhY2tfcG9pbnRlciAtIG9wYXJnLCBvcGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZW1wdHkpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB3aGlsZSAoLS1vcGFyZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHN0cik7CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKICAgICAgICAgVEFSR0VUKEJVSUxEX1RVUExFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcob3BhcmcpOwogICAgICAgICAgICAgaWYgKHR1cCA9PSBOVUxMKQpAQCAtMjU0MCwxMSArMjU4MCwxMCBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQlVJTERfVFVQTEVfVU5QQUNLLCBfYnVpbGRfbGlzdF91bnBhY2spCi0gICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykKLSAgICAgICAgX2J1aWxkX2xpc3RfdW5wYWNrOiB7CisgICAgICAgIFRBUkdFVChCVUlMRF9UVVBMRV9VTlBBQ0spCisgICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykgewogICAgICAgICAgICAgaW50IGNvbnZlcnRfdG9fdHVwbGUgPSBvcGNvZGUgPT0gQlVJTERfVFVQTEVfVU5QQUNLOwotICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3VtID0gUHlMaXN0X05ldygwKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWU7CiAgICAgICAgICAgICBpZiAoc3VtID09IE5VTEwpCkBAIC0yNTk3LDcgKzI2MzYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgVEFSR0VUKEJVSUxEX1NFVF9VTlBBQ0spIHsKLSAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOwogICAgICAgICAgICAgUHlPYmplY3QgKnN1bSA9IFB5U2V0X05ldyhOVUxMKTsKICAgICAgICAgICAgIGlmIChzdW0gPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjYxNiw3ICsyNjU1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIFRBUkdFVChCVUlMRF9NQVApIHsKLSAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOwogICAgICAgICAgICAgUHlPYmplY3QgKm1hcCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQoKFB5X3NzaXplX3Qpb3BhcmcpOwogICAgICAgICAgICAgaWYgKG1hcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yNjM5LDEzICsyNjc4LDQ1IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChCVUlMRF9NQVBfVU5QQUNLX1dJVEhfQ0FMTCwgX2J1aWxkX21hcF91bnBhY2spCi0gICAgICAgIFRBUkdFVChCVUlMRF9NQVBfVU5QQUNLKQotICAgICAgICBfYnVpbGRfbWFwX3VucGFjazogeworICAgICAgICBUQVJHRVQoQlVJTERfQ09OU1RfS0VZX01BUCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgUHlPYmplY3QgKm1hcDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXlzID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChrZXlzKSB8fAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoa2V5cykgIT0gKFB5X3NzaXplX3Qpb3BhcmcpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgQlVJTERfQ09OU1RfS0VZX01BUCBrZXlzIGFyZ3VtZW50Iik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQoKFB5X3NzaXplX3Qpb3BhcmcpOworICAgICAgICAgICAgaWYgKG1hcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IG9wYXJnOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShrZXlzLCBvcGFyZyAtIGkpOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFBFRUsoaSArIDEpOworICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKG1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXApOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHlfREVDUkVGKFBPUCgpKTsKKyAgICAgICAgICAgIHdoaWxlIChvcGFyZy0tKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKFBPUCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0gobWFwKTsKKyAgICAgICAgICAgIERJU1BBVENIKCk7CisgICAgICAgIH0KKworICAgICAgICBUQVJHRVQoQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwpCisgICAgICAgIFRBUkdFVChCVUlMRF9NQVBfVU5QQUNLKSB7CiAgICAgICAgICAgICBpbnQgd2l0aF9jYWxsID0gb3Bjb2RlID09IEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMOwogICAgICAgICAgICAgaW50IG51bV9tYXBzOwogICAgICAgICAgICAgaW50IGZ1bmN0aW9uX2xvY2F0aW9uOwotICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3VtID0gUHlEaWN0X05ldygpOwogICAgICAgICAgICAgaWYgKHN1bSA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yNzYzLDQ1ICsyODM0LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBUQVJHRVQoSU1QT1JUX05BTUUpIHsKLSAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9faW1wb3J0X18pOwogICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7Ci0gICAgICAgICAgICBQeU9iamVjdCAqZnVuYyA9IF9QeURpY3RfR2V0SXRlbUlkKGYtPmZfYnVpbHRpbnMsICZQeUlkX19faW1wb3J0X18pOwotICAgICAgICAgICAgUHlPYmplY3QgKmZyb20sICpsZXZlbCwgKmFyZ3MsICpyZXM7Ci0gICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19pbXBvcnRfXyBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwotICAgICAgICAgICAgZnJvbSA9IFBPUCgpOwotICAgICAgICAgICAgbGV2ZWwgPSBUT1AoKTsKLSAgICAgICAgICAgIGlmIChQeUxvbmdfQXNMb25nKGxldmVsKSAhPSAtMSB8fCBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjayg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUgOiBmLT5mX2xvY2FscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihsZXZlbCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoZnJvbSk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlPYmplY3QgKmZyb21saXN0ID0gUE9QKCk7CisgICAgICAgICAgICBQeU9iamVjdCAqbGV2ZWwgPSBUT1AoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0gICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgICAgIHJlcyA9IGltcG9ydF9uYW1lKGYsIG5hbWUsIGZyb21saXN0LCBsZXZlbCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgICAgICAgICAgUHlfREVDUkVGKGZyb21saXN0KTsKICAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKICAgICAgICAgICAgIFNFVF9UT1AocmVzKTsKICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjg0OCw3ICsyODg5LDcgQEAKICAgICAgICAgICAgIEZBU1RfRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhQT1BfSlVNUF9JRl9GQUxTRSk7CisgICAgICAgIFBSRURJQ1RFRChQT1BfSlVNUF9JRl9GQUxTRSk7CiAgICAgICAgIFRBUkdFVChQT1BfSlVNUF9JRl9GQUxTRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKmNvbmQgPSBQT1AoKTsKICAgICAgICAgICAgIGludCBlcnI7CkBAIC0yODcyLDcgKzI5MTMsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhQT1BfSlVNUF9JRl9UUlVFKTsKKyAgICAgICAgUFJFRElDVEVEKFBPUF9KVU1QX0lGX1RSVUUpOwogICAgICAgICBUQVJHRVQoUE9QX0pVTVBfSUZfVFJVRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKmNvbmQgPSBQT1AoKTsKICAgICAgICAgICAgIGludCBlcnI7CkBAIC0yOTQ5LDcgKzI5OTAsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0FCU09MVVRFKTsKKyAgICAgICAgUFJFRElDVEVEKEpVTVBfQUJTT0xVVEUpOwogICAgICAgICBUQVJHRVQoSlVNUF9BQlNPTFVURSkgewogICAgICAgICAgICAgSlVNUFRPKG9wYXJnKTsKICNpZiBGQVNUX0xPT1BTCkBAIC0yOTc1LDYgKzMwMTYsNyBAQAogICAgICAgICAgICAgaWYgKGl0ZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgUFJFRElDVChGT1JfSVRFUik7CisgICAgICAgICAgICBQUkVESUNUKENBTExfRlVOQ1RJT04pOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMDAzLDEwICszMDQ1LDExIEBACiAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEZPUl9JVEVSKTsKKyAgICAgICAgUFJFRElDVEVEKEZPUl9JVEVSKTsKICAgICAgICAgVEFSR0VUKEZPUl9JVEVSKSB7CiAgICAgICAgICAgICAvKiBiZWZvcmU6IFtpdGVyXTsgYWZ0ZXI6IFtpdGVyLCBpdGVyKCldICpvciogW10gKi8KICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVyID0gVE9QKCk7CkBAIC0zMDI4LDYgKzMwNzEsNyBAQAogICAgICAgICAgICAgU1RBQ0tBREooLTEpOwogICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOwogICAgICAgICAgICAgSlVNUEJZKG9wYXJnKTsKKyAgICAgICAgICAgIFBSRURJQ1QoUE9QX0JMT0NLKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzA0NCwxMCArMzA4OCw5IEBACiAgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChTRVRVUF9MT09QLCBfc2V0dXBfZmluYWxseSkKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChTRVRVUF9FWENFUFQsIF9zZXR1cF9maW5hbGx5KQotICAgICAgICBUQVJHRVQoU0VUVVBfRklOQUxMWSkKLSAgICAgICAgX3NldHVwX2ZpbmFsbHk6IHsKKyAgICAgICAgVEFSR0VUKFNFVFVQX0xPT1ApCisgICAgICAgIFRBUkdFVChTRVRVUF9FWENFUFQpCisgICAgICAgIFRBUkdFVChTRVRVUF9GSU5BTExZKSB7CiAgICAgICAgICAgICAvKiBOT1RFOiBJZiB5b3UgYWRkIGFueSBuZXcgYmxvY2stc2V0dXAgb3Bjb2RlcyB0aGF0CiAgICAgICAgICAgICAgICBhcmUgbm90IHRyeS9leGNlcHQvZmluYWxseSBoYW5kbGVycywgeW91IG1heSBuZWVkCiAgICAgICAgICAgICAgICB0byB1cGRhdGUgdGhlIFB5R2VuX05lZWRzRmluYWxpemluZygpIGZ1bmN0aW9uLgpAQCAtMzA3OCw2ICszMTIxLDcgQEAKICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgUFVTSChyZXMpOworICAgICAgICAgICAgUFJFRElDVChHRVRfQVdBSVRBQkxFKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzIyNiw2ICszMjcwLDcgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoQ0FMTF9GVU5DVElPTik7CiAgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqKnNwLCAqcmVzOwogICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKQEAgLTMyNDIsMjAgKzMyODcsMjMgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKENBTExfRlVOQ1RJT05fVkFSLCBfY2FsbF9mdW5jdGlvbl92YXJfa3cpCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQ0FMTF9GVU5DVElPTl9LVywgX2NhbGxfZnVuY3Rpb25fdmFyX2t3KQotICAgICAgICBUQVJHRVQoQ0FMTF9GVU5DVElPTl9WQVJfS1cpCi0gICAgICAgIF9jYWxsX2Z1bmN0aW9uX3Zhcl9rdzogewotICAgICAgICAgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOwotICAgICAgICAgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7CisgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OX1ZBUikKKyAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fS1cpCisgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OX1ZBUl9LVykgeworICAgICAgICAgICAgUHlfc3NpemVfdCBuYXJncyA9IG9wYXJnICYgMHhmZjsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgbmt3YXJncyA9IChvcGFyZz4+OCkgJiAweGZmOwogICAgICAgICAgICAgaW50IGZsYWdzID0gKG9wY29kZSAtIENBTExfRlVOQ1RJT04pICYgMzsKLSAgICAgICAgICAgIGludCBuID0gbmEgKyAyICogbms7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG47CiAgICAgICAgICAgICBQeU9iamVjdCAqKnBmdW5jLCAqZnVuYywgKipzcCwgKnJlczsKICAgICAgICAgICAgIFBDQUxMKFBDQUxMX0FMTCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfVkFSKQorCisgICAgICAgICAgICBuID0gbmFyZ3MgKyAyICogbmt3YXJnczsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIENBTExfRkxBR19WQVIpIHsKICAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpIHsKICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwZnVuYyA9IHN0YWNrX3BvaW50ZXIgLSBuIC0gMTsKICAgICAgICAgICAgIGZ1bmMgPSAqcGZ1bmM7CiAKQEAgLTMyNjYsMTMgKzMzMTQsMTQgQEAKICAgICAgICAgICAgICAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOwogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKICAgICAgICAgICAgICAgICBQeV9TRVRSRUYoKnBmdW5jLCBzZWxmKTsKLSAgICAgICAgICAgICAgICBuYSsrOwotICAgICAgICAgICAgICAgIC8qIG4rKzsgKi8KLSAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG5hcmdzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcCA9IHN0YWNrX3BvaW50ZXI7CiAgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0gICAgICAgICAgICByZXMgPSBleHRfZG9fY2FsbChmdW5jLCAmc3AsIGZsYWdzLCBuYSwgbmspOworICAgICAgICAgICAgcmVzID0gZXh0X2RvX2NhbGwoZnVuYywgJnNwLCBmbGFncywgbmFyZ3MsIG5rd2FyZ3MpOwogICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOwogICAgICAgICAgICAgc3RhY2tfcG9pbnRlciA9IHNwOwogICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwpAQCAtMzI4NywxMTcgKzMzMzYsMzYgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKE1BS0VfQ0xPU1VSRSwgX21ha2VfZnVuY3Rpb24pCi0gICAgICAgIFRBUkdFVChNQUtFX0ZVTkNUSU9OKQotICAgICAgICBfbWFrZV9mdW5jdGlvbjogewotICAgICAgICAgICAgaW50IHBvc2RlZmF1bHRzID0gb3BhcmcgJiAweGZmOwotICAgICAgICAgICAgaW50IGt3ZGVmYXVsdHMgPSAob3Bhcmc+PjgpICYgMHhmZjsKLSAgICAgICAgICAgIGludCBudW1fYW5ub3RhdGlvbnMgPSAob3BhcmcgPj4gMTYpICYgMHg3ZmZmOworICAgICAgICBUQVJHRVQoTUFLRV9GVU5DVElPTikgeworICAgICAgICAgICAgUHlPYmplY3QgKnF1YWxuYW1lID0gUE9QKCk7CisgICAgICAgICAgICBQeU9iamVjdCAqY29kZW9iaiA9IFBPUCgpOworICAgICAgICAgICAgUHlGdW5jdGlvbk9iamVjdCAqZnVuYyA9IChQeUZ1bmN0aW9uT2JqZWN0ICopCisgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9OZXdXaXRoUXVhbE5hbWUoY29kZW9iaiwgZi0+Zl9nbG9iYWxzLCBxdWFsbmFtZSk7CiAKLSAgICAgICAgICAgIFB5T2JqZWN0ICpxdWFsbmFtZSA9IFBPUCgpOyAvKiBxdWFsbmFtZSAqLwotICAgICAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBQT1AoKTsgLyogY29kZSBvYmplY3QgKi8KLSAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gUHlGdW5jdGlvbl9OZXdXaXRoUXVhbE5hbWUoY29kZSwgZi0+Zl9nbG9iYWxzLCBxdWFsbmFtZSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY29kZW9iaik7CiAgICAgICAgICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gTUFLRV9DTE9TVVJFKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmNsb3N1cmUgPSBQT1AoKTsKLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRDbG9zdXJlKGZ1bmMsIGNsb3N1cmUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcyBieXRlY29kZSBpcyBjb3JydXB0LiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjbG9zdXJlKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGNsb3N1cmUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobnVtX2Fubm90YXRpb25zID4gMCkgewotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmFtZV9peDsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMgPSBQT1AoKTsgLyogbmFtZXMgb2YgYXJncyB3aXRoIGFubm90YXRpb25zICovCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmFubnMgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubnMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVfaXggPSBQeVR1cGxlX1NpemUobmFtZXMpOwotICAgICAgICAgICAgICAgIGFzc2VydChudW1fYW5ub3RhdGlvbnMgPT0gbmFtZV9peCsxKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobmFtZV9peCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVycjsKLSAgICAgICAgICAgICAgICAgICAgLS1uYW1lX2l4OwotICAgICAgICAgICAgICAgICAgICBuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShuYW1lcywgbmFtZV9peCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUE9QKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKGFubnMsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0QW5ub3RhdGlvbnMoZnVuYywgYW5ucykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBoYXBwZW4gdW5sZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fU2V0QW5ub3RhdGlvbnMgY2hhbmdlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubnMpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5zKTsKKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDgpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYyAtPmZ1bmNfY2xvc3VyZSA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwNCkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChUT1AoKSkpOworICAgICAgICAgICAgICAgIGZ1bmMtPmZ1bmNfYW5ub3RhdGlvbnMgPSBQT1AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDIpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jLT5mdW5jX2t3ZGVmYXVsdHMgPSBQT1AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDEpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYy0+ZnVuY19kZWZhdWx0cyA9IFBPUCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBvcGNvZGU/ICovCi0gICAgICAgICAgICBpZiAoa3dkZWZhdWx0cyA+IDApIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVmcyA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0ta3dkZWZhdWx0cyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUE9QKCk7IC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IFBPUCgpOyAvKiBrdyBvbmx5IGFyZyBuYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBQeURpY3RfU2V0SXRlbShkZWZzLCBrZXksIHYpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0S3dEZWZhdWx0cyhmdW5jLCBkZWZzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXRLd0RlZmF1bHRzIGNoYW5nZXMuICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9zZGVmYXVsdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlZnMgPSBQeVR1cGxlX05ldyhwb3NkZWZhdWx0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZnMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgtLXBvc2RlZmF1bHRzID49IDApCi0gICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oZGVmcywgcG9zZGVmYXVsdHMsIFBPUCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXREZWZhdWx0cyhmdW5jLCBkZWZzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUFVTSChmdW5jKTsKKyAgICAgICAgICAgIFBVU0goKFB5T2JqZWN0ICopZnVuYyk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTM0MTksOSArMzM4Nyw2OCBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFRBUkdFVChGT1JNQVRfVkFMVUUpIHsKKyAgICAgICAgICAgIC8qIEhhbmRsZXMgZi1zdHJpbmcgdmFsdWUgZm9ybWF0dGluZy4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBQeU9iamVjdCAqZm10X3NwZWM7CisgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgICAgICAgICBQeU9iamVjdCAqKCpjb252X2ZuKShQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGludCB3aGljaF9jb252ZXJzaW9uID0gb3BhcmcgJiBGVkNfTUFTSzsKKyAgICAgICAgICAgIGludCBoYXZlX2ZtdF9zcGVjID0gKG9wYXJnICYgRlZTX01BU0spID09IEZWU19IQVZFX1NQRUM7CisKKyAgICAgICAgICAgIGZtdF9zcGVjID0gaGF2ZV9mbXRfc3BlYyA/IFBPUCgpIDogTlVMTDsKKyAgICAgICAgICAgIHZhbHVlID0gUE9QKCk7CisKKyAgICAgICAgICAgIC8qIFNlZSBpZiBhbnkgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQuICovCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoX2NvbnZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRlZDX1NUUjogICBjb252X2ZuID0gUHlPYmplY3RfU3RyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVkNfUkVQUjogIGNvbnZfZm4gPSBQeU9iamVjdF9SZXByOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZWQ19BU0NJSTogY29udl9mbiA9IFB5T2JqZWN0X0FTQ0lJOyBicmVhazsKKworICAgICAgICAgICAgLyogTXVzdCBiZSAwIChtZWFuaW5nIG5vIGNvbnZlcnNpb24pLCBzaW5jZSBvbmx5IGZvdXIKKyAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgYWxsb3dlZCBieSAob3BhcmcgJiBGVkNfTUFTSykuICovCisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgY29udl9mbiA9IE5VTEw7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGNvbnZlcnNpb24gZnVuY3Rpb24sIGNhbGwgaXQgYW5kIHJlcGxhY2UKKyAgICAgICAgICAgICAgIHZhbHVlIHdpdGggdGhhdCByZXN1bHQuIE90aGVyd2lzZSwganVzdCB1c2UgdmFsdWUsCisgICAgICAgICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24uICovCisgICAgICAgICAgICBpZiAoY29udl9mbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udl9mbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB2YWx1ZSBpcyBhIHVuaWNvZGUgb2JqZWN0LCBhbmQgdGhlcmUncyBubyBmbXRfc3BlYywKKyAgICAgICAgICAgICAgIHRoZW4gd2Uga25vdyB0aGUgcmVzdWx0IG9mIGZvcm1hdCh2YWx1ZSkgaXMgdmFsdWUKKyAgICAgICAgICAgICAgIGl0c2VsZi4gSW4gdGhhdCBjYXNlLCBza2lwIGNhbGxpbmcgZm9ybWF0KCkuIEkgcGxhbiB0bworICAgICAgICAgICAgICAgbW92ZSB0aGlzIG9wdGltaXphdGlvbiBpbiB0byBQeU9iamVjdF9Gb3JtYXQoKQorICAgICAgICAgICAgICAgaXRzZWxmLiAqLworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKSAmJiBmbXRfc3BlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZywganVzdCB0cmFuc2ZlciBvd25lcnNoaXAgdG8gcmVzdWx0LiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBBY3R1YWxseSBjYWxsIGZvcm1hdCgpLiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0Zvcm1hdCh2YWx1ZSwgZm10X3NwZWMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQVVNIKHJlc3VsdCk7CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKICAgICAgICAgVEFSR0VUKEVYVEVOREVEX0FSRykgewotICAgICAgICAgICAgb3Bjb2RlID0gTkVYVE9QKCk7Ci0gICAgICAgICAgICBvcGFyZyA9IG9wYXJnPDwxNiB8IE5FWFRBUkcoKTsKKyAgICAgICAgICAgIGludCBvbGRvcGFyZyA9IG9wYXJnOworICAgICAgICAgICAgTkVYVE9QQVJHKCk7CisgICAgICAgICAgICBvcGFyZyB8PSBvbGRvcGFyZyA8PCA4OwogICAgICAgICAgICAgZ290byBkaXNwYXRjaF9vcGNvZGU7CiAgICAgICAgIH0KIApAQCAtMzU4Miw5ICszNjA5LDExIEBACiAgICAgICAgICAgIHN0YXRlIGNhbWUgaW50byBleGlzdGVuY2UgaW4gdGhpcyBmcmFtZS4gKEFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgogICAgICAgICAgICB3b3VsZCBoYXZlIHdoeSA9PSBXSFlfRVhDRVBUSU9OLCBhbmQgd2Ugd291bGRuJ3QgYmUgaGVyZSkuICovCiAgICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZi0+Zl9pYmxvY2s7IGkrKykKLSAgICAgICAgICAgIGlmIChmLT5mX2Jsb2Nrc3RhY2tbaV0uYl90eXBlID09IEVYQ0VQVF9IQU5ETEVSKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZi0+Zl9pYmxvY2s7IGkrKykgeworICAgICAgICAgICAgaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgPT0gRVhDRVBUX0hBTkRMRVIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoaSA9PSBmLT5mX2libG9jaykKICAgICAgICAgICAgIC8qIFdlIGRpZCBub3QgY3JlYXRlIHRoaXMgZXhjZXB0aW9uLiAqLwogICAgICAgICAgICAgcmVzdG9yZV9hbmRfY2xlYXJfZXhjX3N0YXRlKHRzdGF0ZSwgZik7CkBAIC0zNjk1LDEyICszNzI0LDEyIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1taXNzaW5nX2FyZ3VtZW50cyhQeUNvZGVPYmplY3QgKmNvLCBpbnQgbWlzc2luZywgaW50IGRlZmNvdW50LAorbWlzc2luZ19hcmd1bWVudHMoUHlDb2RlT2JqZWN0ICpjbywgUHlfc3NpemVfdCBtaXNzaW5nLCBQeV9zc2l6ZV90IGRlZmNvdW50LAogICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzKQogewotICAgIGludCBpLCBqID0gMDsKLSAgICBpbnQgc3RhcnQsIGVuZDsKLSAgICBpbnQgcG9zaXRpb25hbCA9IGRlZmNvdW50ICE9IC0xOworICAgIFB5X3NzaXplX3QgaSwgaiA9IDA7CisgICAgUHlfc3NpemVfdCBzdGFydCwgZW5kOworICAgIGludCBwb3NpdGlvbmFsID0gKGRlZmNvdW50ICE9IC0xKTsKICAgICBjb25zdCBjaGFyICpraW5kID0gcG9zaXRpb25hbCA/ICJwb3NpdGlvbmFsIiA6ICJrZXl3b3JkLW9ubHkiOwogICAgIFB5T2JqZWN0ICptaXNzaW5nX25hbWVzOwogCkBAIC0zNzMzLDMzICszNzYyLDM5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi10b29fbWFueV9wb3NpdGlvbmFsKFB5Q29kZU9iamVjdCAqY28sIGludCBnaXZlbiwgaW50IGRlZmNvdW50LCBQeU9iamVjdCAqKmZhc3Rsb2NhbHMpCit0b29fbWFueV9wb3NpdGlvbmFsKFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgZ2l2ZW4sIFB5X3NzaXplX3QgZGVmY291bnQsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqZmFzdGxvY2FscykKIHsKICAgICBpbnQgcGx1cmFsOwotICAgIGludCBrd29ubHlfZ2l2ZW4gPSAwOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3Qga3dvbmx5X2dpdmVuID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlPYmplY3QgKnNpZywgKmt3b25seV9zaWc7CisgICAgUHlfc3NpemVfdCBjb19hcmdjb3VudCA9IGNvLT5jb19hcmdjb3VudDsKIAogICAgIGFzc2VydCgoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgPT0gMCk7CiAgICAgLyogQ291bnQgbWlzc2luZyBrZXl3b3JkLW9ubHkgYXJncy4gKi8KLSAgICBmb3IgKGkgPSBjby0+Y29fYXJnY291bnQ7IGkgPCBjby0+Y29fYXJnY291bnQgKyBjby0+Y29fa3dvbmx5YXJnY291bnQ7IGkrKykKLSAgICAgICAgaWYgKEdFVExPQ0FMKGkpICE9IE5VTEwpCisgICAgZm9yIChpID0gY29fYXJnY291bnQ7IGkgPCBjb19hcmdjb3VudCArIGNvLT5jb19rd29ubHlhcmdjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChHRVRMT0NBTChpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBrd29ubHlfZ2l2ZW4rKzsKKyAgICAgICAgfQorICAgIH0KICAgICBpZiAoZGVmY291bnQpIHsKLSAgICAgICAgaW50IGF0bGVhc3QgPSBjby0+Y29fYXJnY291bnQgLSBkZWZjb3VudDsKKyAgICAgICAgUHlfc3NpemVfdCBhdGxlYXN0ID0gY29fYXJnY291bnQgLSBkZWZjb3VudDsKICAgICAgICAgcGx1cmFsID0gMTsKLSAgICAgICAgc2lnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoImZyb20gJWQgdG8gJWQiLCBhdGxlYXN0LCBjby0+Y29fYXJnY291bnQpOworICAgICAgICBzaWcgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiZnJvbSAlemQgdG8gJXpkIiwgYXRsZWFzdCwgY29fYXJnY291bnQpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgcGx1cmFsID0gY28tPmNvX2FyZ2NvdW50ICE9IDE7Ci0gICAgICAgIHNpZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlZCIsIGNvLT5jb19hcmdjb3VudCk7CisgICAgICAgIHBsdXJhbCA9IChjb19hcmdjb3VudCAhPSAxKTsKKyAgICAgICAgc2lnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiV6ZCIsIGNvX2FyZ2NvdW50KTsKICAgICB9CiAgICAgaWYgKHNpZyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAgICAgaWYgKGt3b25seV9naXZlbikgewotICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAiIHBvc2l0aW9uYWwgYXJndW1lbnQlcyAoYW5kICVkIGtleXdvcmQtb25seSBhcmd1bWVudCVzKSI7Ci0gICAgICAgIGt3b25seV9zaWcgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdChmb3JtYXQsIGdpdmVuICE9IDEgPyAicyIgOiAiIiwga3dvbmx5X2dpdmVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seV9naXZlbiAhPSAxID8gInMiIDogIiIpOworICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAiIHBvc2l0aW9uYWwgYXJndW1lbnQlcyAoYW5kICV6ZCBrZXl3b3JkLW9ubHkgYXJndW1lbnQlcykiOworICAgICAgICBrd29ubHlfc2lnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gIT0gMSA/ICJzIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dvbmx5X2dpdmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dvbmx5X2dpdmVuICE9IDEgPyAicyIgOiAiIik7CiAgICAgICAgIGlmIChrd29ubHlfc2lnID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihzaWcpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzc3MSw3ICszODA2LDcgQEAKICAgICAgICAgYXNzZXJ0KGt3b25seV9zaWcgIT0gTlVMTCk7CiAgICAgfQogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICIlVSgpIHRha2VzICVVIHBvc2l0aW9uYWwgYXJndW1lbnQlcyBidXQgJWQlVSAlcyBnaXZlbiIsCisgICAgICAgICAgICAgICAgICIlVSgpIHRha2VzICVVIHBvc2l0aW9uYWwgYXJndW1lbnQlcyBidXQgJXpkJVUgJXMgZ2l2ZW4iLAogICAgICAgICAgICAgICAgICBjby0+Y29fbmFtZSwKICAgICAgICAgICAgICAgICAgc2lnLAogICAgICAgICAgICAgICAgICBwbHVyYWwgPyAicyIgOiAiIiwKQEAgLTM3ODIsMjYgKzM4MTcsMzAgQEAKICAgICBQeV9ERUNSRUYoa3dvbmx5X3NpZyk7CiB9CiAKKwogLyogVGhpcyBpcyBnb25uYSBzZWVtICpyZWFsIHdlaXJkKiwgYnV0IGlmIHlvdSBwdXQgc29tZSBvdGhlciBjb2RlIGJldHdlZW4KICAgIFB5RXZhbF9FdmFsRnJhbWUoKSBhbmQgUHlFdmFsX0V2YWxDb2RlRXgoKSB5b3Ugd2lsbCBuZWVkIHRvIGFkanVzdAogICAgdGhlIHRlc3QgaW4gdGhlIGlmIHN0YXRlbWVudHMgaW4gTWlzYy9nZGJpbml0IChweXN0YWNrIGFuZCBweXN0YWNrdikuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfUHlFdmFsX0V2YWxDb2RlV2l0aE5hbWUoUHlPYmplY3QgKl9jbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0gICAgICAgICAgIFB5T2JqZWN0ICoqYXJncywgaW50IGFyZ2NvdW50LCBQeU9iamVjdCAqKmt3cywgaW50IGt3Y291bnQsCi0gICAgICAgICAgIFB5T2JqZWN0ICoqZGVmcywgaW50IGRlZmNvdW50LCBQeU9iamVjdCAqa3dkZWZzLCBQeU9iamVjdCAqY2xvc3VyZSwKKyAgICAgICAgICAgUHlPYmplY3QgKiphcmdzLCBQeV9zc2l6ZV90IGFyZ2NvdW50LAorICAgICAgICAgICBQeU9iamVjdCAqKmt3cywgUHlfc3NpemVfdCBrd2NvdW50LAorICAgICAgICAgICBQeU9iamVjdCAqKmRlZnMsIFB5X3NzaXplX3QgZGVmY291bnQsCisgICAgICAgICAgIFB5T2JqZWN0ICprd2RlZnMsIFB5T2JqZWN0ICpjbG9zdXJlLAogICAgICAgICAgICBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnF1YWxuYW1lKQogewogICAgIFB5Q29kZU9iamVjdCogY28gPSAoUHlDb2RlT2JqZWN0KilfY287CiAgICAgUHlGcmFtZU9iamVjdCAqZjsKICAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqZnJlZXZhcnM7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CiAgICAgUHlPYmplY3QgKngsICp1OwotICAgIGludCB0b3RhbF9hcmdzID0gY28tPmNvX2FyZ2NvdW50ICsgY28tPmNvX2t3b25seWFyZ2NvdW50OwotICAgIGludCBpOwotICAgIGludCBuID0gYXJnY291bnQ7Ci0gICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgY29uc3QgUHlfc3NpemVfdCB0b3RhbF9hcmdzID0gY28tPmNvX2FyZ2NvdW50ICsgY28tPmNvX2t3b25seWFyZ2NvdW50OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqa3dkaWN0OworCisgICAgYXNzZXJ0KChrd2NvdW50ID09IDApIHx8IChrd3MgIT0gTlVMTCkpOwogCiAgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCkBAIC0zODA5LDM2ICszODQ4LDUwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIC8qIENyZWF0ZSB0aGUgZnJhbWUgKi8KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogICAgIGFzc2VydCh0c3RhdGUgIT0gTlVMTCk7Ci0gICAgYXNzZXJ0KGdsb2JhbHMgIT0gTlVMTCk7CiAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIGxvY2Fscyk7Ci0gICAgaWYgKGYgPT0gTlVMTCkKKyAgICBpZiAoZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwotCisgICAgfQogICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAgICAgZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKIAotICAgIC8qIFBhcnNlIGFyZ3VtZW50cy4gKi8KKyAgICAvKiBDcmVhdGUgYSBkaWN0aW9uYXJ5IGZvciBrZXl3b3JkIHBhcmFtZXRlcnMgKCoqa3dhZ3MpICovCiAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUktFWVdPUkRTKSB7CiAgICAgICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKICAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBpID0gdG90YWxfYXJnczsKLSAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpCisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSB7CiAgICAgICAgICAgICBpKys7CisgICAgICAgIH0KICAgICAgICAgU0VUTE9DQUwoaSwga3dkaWN0KTsKICAgICB9Ci0gICAgaWYgKGFyZ2NvdW50ID4gY28tPmNvX2FyZ2NvdW50KQorICAgIGVsc2UgeworICAgICAgICBrd2RpY3QgPSBOVUxMOworICAgIH0KKworICAgIC8qIENvcHkgcG9zaXRpb25hbCBhcmd1bWVudHMgaW50byBsb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpZiAoYXJnY291bnQgPiBjby0+Y29fYXJnY291bnQpIHsKICAgICAgICAgbiA9IGNvLT5jb19hcmdjb3VudDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG4gPSBhcmdjb3VudDsKKyAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICB4ID0gYXJnc1tpXTsKICAgICAgICAgUHlfSU5DUkVGKHgpOwogICAgICAgICBTRVRMT0NBTChpLCB4KTsKICAgICB9CisKKyAgICAvKiBQYWNrIG90aGVyIHBvc2l0aW9uYWwgYXJndW1lbnRzIGludG8gdGhlICphcmdzIGFyZ3VtZW50ICovCiAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHsKICAgICAgICAgdSA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50IC0gbik7Ci0gICAgICAgIGlmICh1ID09IE5VTEwpCisgICAgICAgIGlmICh1ID09IE5VTEwpIHsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogICAgICAgICBTRVRMT0NBTCh0b3RhbF9hcmdzLCB1KTsKICAgICAgICAgZm9yIChpID0gbjsgaSA8IGFyZ2NvdW50OyBpKyspIHsKICAgICAgICAgICAgIHggPSBhcmdzW2ldOwpAQCAtMzg0Niw2OSArMzg5OSw4MSBAQAogICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh1LCBpLW4sIHgpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyogSGFuZGxlIGtleXdvcmQgYXJndW1lbnRzIChwYXNzZWQgYXMgYW4gYXJyYXkgb2YgKGtleSwgdmFsdWUpKSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBrd2NvdW50OyBpKyspIHsKICAgICAgICAgUHlPYmplY3QgKipjb192YXJuYW1lczsKICAgICAgICAgUHlPYmplY3QgKmtleXdvcmQgPSBrd3NbMippXTsKICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0ga3dzWzIqaSArIDFdOwotICAgICAgICBpbnQgajsKKyAgICAgICAgUHlfc3NpemVfdCBqOworCiAgICAgICAgIGlmIChrZXl3b3JkID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayhrZXl3b3JkKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJVUoKSBrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvLT5jb19uYW1lKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQorCiAgICAgICAgIC8qIFNwZWVkIGhhY2s6IGRvIHJhdyBwb2ludGVyIGNvbXBhcmVzLiBBcyBuYW1lcyBhcmUKICAgICAgICAgICAgbm9ybWFsbHkgaW50ZXJuZWQgdGhpcyBzaG91bGQgYWxtb3N0IGFsd2F5cyBoaXQuICovCiAgICAgICAgIGNvX3Zhcm5hbWVzID0gKChQeVR1cGxlT2JqZWN0ICopKGNvLT5jb192YXJuYW1lcykpLT5vYl9pdGVtOwogICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG90YWxfYXJnczsgaisrKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKLSAgICAgICAgICAgIGlmIChubSA9PSBrZXl3b3JkKQorICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBjb192YXJuYW1lc1tqXTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IGtleXdvcmQpIHsKICAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOworICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgLyogU2xvdyBmYWxsYmFjaywganVzdCBpbiBjYXNlICovCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b3RhbF9hcmdzOyBqKyspIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOwotICAgICAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCgKLSAgICAgICAgICAgICAgICBrZXl3b3JkLCBubSwgUHlfRVEpOwotICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IGNvX3Zhcm5hbWVzW2pdOworICAgICAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCgga2V5d29yZCwgbmFtZSwgUHlfRVEpOworICAgICAgICAgICAgaWYgKGNtcCA+IDApIHsKICAgICAgICAgICAgICAgICBnb3RvIGt3X2ZvdW5kOwotICAgICAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApIHsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBpZiAoaiA+PSB0b3RhbF9hcmdzICYmIGt3ZGljdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICIlVSgpIGdvdCBhbiB1bmV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudCAnJVMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjby0+Y29fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJVUoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclUyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvLT5jb19uYW1lLCBrZXl3b3JkKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQorCiAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShrd2RpY3QsIGtleXdvcmQsIHZhbHVlKSA9PSAtMSkgewogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICBrd19mb3VuZDoKICAgICAgICAgaWYgKEdFVExPQ0FMKGopICE9IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVVKCkgZ290IG11bHRpcGxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIGZvciBhcmd1bWVudCAnJVMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjby0+Y29fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJVUoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnJVMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjby0+Y29fbmFtZSwga2V5d29yZCk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKICAgICAgICAgU0VUTE9DQUwoaiwgdmFsdWUpOwogICAgIH0KKworICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgKi8KICAgICBpZiAoYXJnY291bnQgPiBjby0+Y29fYXJnY291bnQgJiYgIShjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSkgewogICAgICAgICB0b29fbWFueV9wb3NpdGlvbmFsKGNvLCBhcmdjb3VudCwgZGVmY291bnQsIGZhc3Rsb2NhbHMpOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQorCisgICAgLyogQWRkIG1pc3NpbmcgcG9zaXRpb25hbCBhcmd1bWVudHMgKGNvcHkgZGVmYXVsdCB2YWx1ZXMgZnJvbSBkZWZzKSAqLwogICAgIGlmIChhcmdjb3VudCA8IGNvLT5jb19hcmdjb3VudCkgewotICAgICAgICBpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OwotICAgICAgICBpbnQgbWlzc2luZyA9IDA7Ci0gICAgICAgIGZvciAoaSA9IGFyZ2NvdW50OyBpIDwgbTsgaSsrKQotICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGkpID09IE5VTEwpCisgICAgICAgIFB5X3NzaXplX3QgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OworICAgICAgICBQeV9zc2l6ZV90IG1pc3NpbmcgPSAwOworICAgICAgICBmb3IgKGkgPSBhcmdjb3VudDsgaSA8IG07IGkrKykgeworICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtaXNzaW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKG1pc3NpbmcpIHsKICAgICAgICAgICAgIG1pc3NpbmdfYXJndW1lbnRzKGNvLCBtaXNzaW5nLCBkZWZjb3VudCwgZmFzdGxvY2Fscyk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC0zOTI1LDggKzM5OTAsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIC8qIEFkZCBtaXNzaW5nIGtleXdvcmQgYXJndW1lbnRzIChjb3B5IGRlZmF1bHQgdmFsdWVzIGZyb20ga3dkZWZzKSAqLwogICAgIGlmIChjby0+Y29fa3dvbmx5YXJnY291bnQgPiAwKSB7Ci0gICAgICAgIGludCBtaXNzaW5nID0gMDsKKyAgICAgICAgUHlfc3NpemVfdCBtaXNzaW5nID0gMDsKICAgICAgICAgZm9yIChpID0gY28tPmNvX2FyZ2NvdW50OyBpIDwgdG90YWxfYXJnczsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZTsKICAgICAgICAgICAgIGlmIChHRVRMT0NBTChpKSAhPSBOVUxMKQpAQCAtMzk2NywxMiArNDAzNCwxNSBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBTRVRMT0NBTChjby0+Y29fbmxvY2FscyArIGksIGMpOwogICAgIH0KKworICAgIC8qIENvcHkgY2xvc3VyZSB2YXJpYWJsZXMgdG8gZnJlZSB2YXJpYWJsZXMgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGNsb3N1cmUsIGkpOwogICAgICAgICBQeV9JTkNSRUYobyk7CiAgICAgICAgIGZyZWV2YXJzW1B5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSArIGldID0gbzsKICAgICB9CiAKKyAgICAvKiBIYW5kbGUgZ2VuZXJhdG9yL2Nvcm91dGluZSAqLwogICAgIGlmIChjby0+Y29fZmxhZ3MgJiAoQ09fR0VORVJBVE9SIHwgQ09fQ09ST1VUSU5FKSkgewogICAgICAgICBQeU9iamVjdCAqZ2VuOwogICAgICAgICBQeU9iamVjdCAqY29yb193cmFwcGVyID0gdHN0YXRlLT5jb3JvdXRpbmVfd3JhcHBlcjsKQEAgLTQwMzcsOCArNDEwNywxMCBAQAogICAgICAgICAgICBQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjb3VudCwgUHlPYmplY3QgKmt3ZGVmcywgUHlPYmplY3QgKmNsb3N1cmUpCiB7CiAgICAgcmV0dXJuIF9QeUV2YWxfRXZhbENvZGVXaXRoTmFtZShfY28sIGdsb2JhbHMsIGxvY2FscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGFyZ2NvdW50LCBrd3MsIGt3Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZzLCBkZWZjb3VudCwga3dkZWZzLCBjbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgYXJnY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd3MsIGt3Y291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZzLCBkZWZjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3ZGVmcywgY2xvc3VyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogfQogCkBAIC00Mjk3LDcgKzQzNjksNyBAQAogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludAotcHJ0cmFjZShQeU9iamVjdCAqdiwgY2hhciAqc3RyKQorcHJ0cmFjZShQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqc3RyKQogewogICAgIHByaW50ZigiJXMgIiwgc3RyKTsKICAgICBpZiAoUHlPYmplY3RfUHJpbnQodiwgc3Rkb3V0LCAwKSAhPSAwKQpAQCAtNDU0NiwxMCArNDYxOCw4IEBACiAgICBUaGUgYXJnIG11c3QgYmUgYSB0dXBsZSBvciBOVUxMLiAgVGhlIGt3IG11c3QgYmUgYSBkaWN0IG9yIE5VTEwuICovCiAKIFB5T2JqZWN0ICoKLVB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCitQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQogI2lmZGVmIFB5X0RFQlVHCiAgICAgLyogUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24KICAgICAgICBzZXQuIEl0IHJhaXNlcyBhIG5ldyBleGNlcHRpb24gaWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZCBvciBpZgpAQCAtNDU1NywzMCArNDYyNywyMyBAQAogICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CiAjZW5kaWYKIAotICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICBhcmcgPSBQeVR1cGxlX05ldygwKTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0Zhc3RDYWxsRGljdChmdW5jLCBOVUxMLCAwLCBrd2FyZ3MpOwogICAgIH0KLSAgICBlbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmcpKSB7CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBsaXN0IG11c3QgYmUgYSB0dXBsZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYoYXJnKTsKIAotICAgIGlmIChrdyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3cpKSB7CisgICAgaWYgKGt3YXJncyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa3dhcmdzKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmQgbGlzdCBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotICAgICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KTsKLSAgICBQeV9ERUNSRUYoYXJnKTsKLQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywga3dhcmdzKTsKIH0KIAogY29uc3QgY2hhciAqCkBAIC00NjEwLDE2ICs0NjczLDE2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1lcnJfYXJncyhQeU9iamVjdCAqZnVuYywgaW50IGZsYWdzLCBpbnQgbmFyZ3MpCitlcnJfYXJncyhQeU9iamVjdCAqZnVuYywgaW50IGZsYWdzLCBQeV9zc2l6ZV90IG5hcmdzKQogewogICAgIGlmIChmbGFncyAmIE1FVEhfTk9BUkdTKQogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAogICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgbmFyZ3MpOwogICAgIGVsc2UKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJXpkIGdpdmVuKSIsCiAgICAgICAgICAgICAgICAgICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICBuYXJncyk7CiB9CkBAIC00NjYyLDkgKzQ3MjUsOSBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICAgKQogewotICAgIGludCBuYSA9IG9wYXJnICYgMHhmZjsKLSAgICBpbnQgbmsgPSAob3Bhcmc+PjgpICYgMHhmZjsKLSAgICBpbnQgbiA9IG5hICsgMiAqIG5rOworICAgIFB5X3NzaXplX3QgbmFyZ3MgPSBvcGFyZyAmIDB4ZmY7CisgICAgUHlfc3NpemVfdCBua3dhcmdzID0gKG9wYXJnPj44KSAmIDB4ZmY7CisgICAgaW50IG4gPSBuYXJncyArIDIgKiBua3dhcmdzOwogICAgIFB5T2JqZWN0ICoqcGZ1bmMgPSAoKnBwX3N0YWNrKSAtIG4gLSAxOwogICAgIFB5T2JqZWN0ICpmdW5jID0gKnBmdW5jOwogICAgIFB5T2JqZWN0ICp4LCAqdzsKQEAgLTQ2NzIsNyArNDczNSw3IEBACiAgICAgLyogQWx3YXlzIGRpc3BhdGNoIFB5Q0Z1bmN0aW9uIGZpcnN0LCBiZWNhdXNlIHRoZXNlIGFyZQogICAgICAgIHByZXN1bWVkIHRvIGJlIHRoZSBtb3N0IGZyZXF1ZW50IGNhbGxhYmxlIG9iamVjdC4KICAgICAqLwotICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSAmJiBuayA9PSAwKSB7CisgICAgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpICYmIG5rd2FyZ3MgPT0gMCkgewogICAgICAgICBpbnQgZmxhZ3MgPSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYyk7CiAgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKQEAgLTQ2ODAsMTIgKzQ3NDMsMTIgQEAKICAgICAgICAgaWYgKGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgewogICAgICAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYXJncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsTlVMTCkpOwogCiAgICAgICAgICAgICAgICAgeCA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHgsIE5VTEwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmEgPT0gMSkgeworICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CiAgICAgICAgICAgICAgICAgQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsYXJnKSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CkBAIC00NjkzLDEzICs0NzU2LDEzIEBACiAgICAgICAgICAgICAgICAgeCA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KGZ1bmMsIHgsIE5VTEwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyX2FyZ3MoZnVuYywgZmxhZ3MsIG5hKTsKKyAgICAgICAgICAgICAgICBlcnJfYXJncyhmdW5jLCBmbGFncywgbmFyZ3MpOwogICAgICAgICAgICAgICAgIHggPSBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxhcmdzOwotICAgICAgICAgICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKKyAgICAgICAgICAgIGNhbGxhcmdzID0gbG9hZF9hcmdzKHBwX3N0YWNrLCBuYXJncyk7CiAgICAgICAgICAgICBpZiAoY2FsbGFyZ3MgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjApOwogICAgICAgICAgICAgICAgIENfVFJBQ0UoeCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLGNhbGxhcmdzLE5VTEwpKTsKQEAgLTQ3MjEsMTUgKzQ3ODQsMTkgQEAKICAgICAgICAgICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7CiAgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CiAgICAgICAgICAgICBQeV9TRVRSRUYoKnBmdW5jLCBzZWxmKTsKLSAgICAgICAgICAgIG5hKys7CisgICAgICAgICAgICBuYXJncysrOwogICAgICAgICAgICAgbisrOwotICAgICAgICB9IGVsc2UKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICAgICAgfQogICAgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKLSAgICAgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0gICAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBwcF9zdGFjaywgbiwgbmEsIG5rKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7CisgICAgICAgIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgICAgICB4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCAoKnBwX3N0YWNrKSAtIG4sIG5hcmdzLCBua3dhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHggPSBkb19jYWxsKGZ1bmMsIHBwX3N0YWNrLCBuYXJncywgbmt3YXJncyk7CisgICAgICAgIH0KICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7CiAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKIApAQCAtNDc1OSw2NiArNDgyNiwxODcgQEAKICAgIGRvbmUgYmVmb3JlIGV2YWx1YXRpbmcgdGhlIGZyYW1lLgogKi8KIAorc3RhdGljIFB5T2JqZWN0KgorX1B5RnVuY3Rpb25fRmFzdENhbGxOb0t3KFB5Q29kZU9iamVjdCAqY28sIFB5T2JqZWN0ICoqYXJncywgUHlfc3NpemVfdCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFscykKK3sKKyAgICBQeUZyYW1lT2JqZWN0ICpmOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgUENBTEwoUENBTExfRkFTVEVSX0ZVTkNUSU9OKTsKKyAgICBhc3NlcnQoZ2xvYmFscyAhPSBOVUxMKTsKKyAgICAvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKKyAgICAgICBQeUZyYW1lX05ldygpIHRoYXQgZG9lc24ndCB0YWtlIGxvY2FscywgYnV0IGRvZXMKKyAgICAgICB0YWtlIGJ1aWx0aW5zIHdpdGhvdXQgc2FuaXR5IGNoZWNraW5nIHRoZW0uCisgICAgICAgKi8KKyAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgIGYgPSBQeUZyYW1lX05ldyh0c3RhdGUsIGNvLCBnbG9iYWxzLCBOVUxMKTsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgeworICAgICAgICBQeV9JTkNSRUYoKmFyZ3MpOworICAgICAgICBmYXN0bG9jYWxzW2ldID0gKmFyZ3MrKzsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlFdmFsX0V2YWxGcmFtZUV4KGYsMCk7CisKKyAgICArK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworICAgIFB5X0RFQ1JFRihmKTsKKyAgICAtLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogU2ltaWxhciB0byBfUHlGdW5jdGlvbl9GYXN0Q2FsbCgpIGJ1dCBrZXl3b3JkcyBhcmUgcGFzc2VkIGEgKGtleSwgdmFsdWUpCisgICBwYWlycyBpbiBzdGFjayAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWZhc3RfZnVuY3Rpb24oUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBpbnQgbiwgaW50IG5hLCBpbnQgbmspCitmYXN0X2Z1bmN0aW9uKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKnN0YWNrLCBQeV9zc2l6ZV90IG5hcmdzLCBQeV9zc2l6ZV90IG5rd2FyZ3MpCiB7CiAgICAgUHlDb2RlT2JqZWN0ICpjbyA9IChQeUNvZGVPYmplY3QgKilQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpOwogICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gUHlGdW5jdGlvbl9HRVRfR0xPQkFMUyhmdW5jKTsKICAgICBQeU9iamVjdCAqYXJnZGVmcyA9IFB5RnVuY3Rpb25fR0VUX0RFRkFVTFRTKGZ1bmMpOwotICAgIFB5T2JqZWN0ICprd2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9LV19ERUZBVUxUUyhmdW5jKTsKLSAgICBQeU9iamVjdCAqbmFtZSA9ICgoUHlGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IGZ1bmNfbmFtZTsKLSAgICBQeU9iamVjdCAqcXVhbG5hbWUgPSAoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX3F1YWxuYW1lOwotICAgIFB5T2JqZWN0ICoqZCA9IE5VTEw7Ci0gICAgaW50IG5kID0gMDsKKyAgICBQeU9iamVjdCAqa3dkZWZzLCAqY2xvc3VyZSwgKm5hbWUsICpxdWFsbmFtZTsKKyAgICBQeU9iamVjdCAqKmQ7CisgICAgaW50IG5kOworCisgICAgYXNzZXJ0KGZ1bmMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5hcmdzID49IDApOworICAgIGFzc2VydChua3dhcmdzID49IDApOworICAgIGFzc2VydCgobmFyZ3MgPT0gMCAmJiBua3dhcmdzID09IDApIHx8IHN0YWNrICE9IE5VTEwpOwogCiAgICAgUENBTEwoUENBTExfRlVOQ1RJT04pOwogICAgIFBDQUxMKFBDQUxMX0ZBU1RfRlVOQ1RJT04pOwotICAgIGlmIChhcmdkZWZzID09IE5VTEwgJiYgY28tPmNvX2FyZ2NvdW50ID09IG4gJiYKLSAgICAgICAgY28tPmNvX2t3b25seWFyZ2NvdW50ID09IDAgJiYgbms9PTAgJiYKLSAgICAgICAgY28tPmNvX2ZsYWdzID09IChDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMgfCBDT19OT0ZSRUUpKSB7Ci0gICAgICAgIFB5RnJhbWVPYmplY3QgKmY7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOwotICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqc3RhY2s7Ci0gICAgICAgIGludCBpOwogCi0gICAgICAgIFBDQUxMKFBDQUxMX0ZBU1RFUl9GVU5DVElPTik7Ci0gICAgICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOwotICAgICAgICAvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgY3JlYXRlIGEgc3BlY2lhbGl6ZWQKLSAgICAgICAgICAgUHlGcmFtZV9OZXcoKSB0aGF0IGRvZXNuJ3QgdGFrZSBsb2NhbHMsIGJ1dCBkb2VzCi0gICAgICAgICAgIHRha2UgYnVpbHRpbnMgd2l0aG91dCBzYW5pdHkgY2hlY2tpbmcgdGhlbS4KLSAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLSAgICAgICAgZiA9IFB5RnJhbWVfTmV3KHRzdGF0ZSwgY28sIGdsb2JhbHMsIE5VTEwpOwotICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLSAgICAgICAgc3RhY2sgPSAoKnBwX3N0YWNrKSAtIG47Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgUHlfSU5DUkVGKCpzdGFjayk7Ci0gICAgICAgICAgICBmYXN0bG9jYWxzW2ldID0gKnN0YWNrKys7CisgICAgaWYgKGNvLT5jb19rd29ubHlhcmdjb3VudCA9PSAwICYmIG5rd2FyZ3MgPT0gMCAmJgorICAgICAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpCisgICAgeworICAgICAgICBpZiAoYXJnZGVmcyA9PSBOVUxMICYmIGNvLT5jb19hcmdjb3VudCA9PSBuYXJncykgeworICAgICAgICAgICAgcmV0dXJuIF9QeUZ1bmN0aW9uX0Zhc3RDYWxsTm9Ldyhjbywgc3RhY2ssIG5hcmdzLCBnbG9iYWxzKTsKICAgICAgICAgfQotICAgICAgICByZXR2YWwgPSBQeUV2YWxfRXZhbEZyYW1lRXgoZiwwKTsKLSAgICAgICAgKyt0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLSAgICAgICAgUHlfREVDUkVGKGYpOwotICAgICAgICAtLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICBlbHNlIGlmIChuYXJncyA9PSAwICYmIGFyZ2RlZnMgIT0gTlVMTAorICAgICAgICAgICAgICAgICAmJiBjby0+Y29fYXJnY291bnQgPT0gUHlfU0laRShhcmdkZWZzKSkgeworICAgICAgICAgICAgLyogZnVuY3Rpb24gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCBidXQgYWxsIHBhcmFtZXRlcnMgaGF2ZQorICAgICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlOiB1c2UgZGVmYXVsdCB2YWx1ZXMgYXMgYXJndW1lbnRzIC4qLworICAgICAgICAgICAgc3RhY2sgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdkZWZzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBfUHlGdW5jdGlvbl9GYXN0Q2FsbE5vS3coY28sIHN0YWNrLCBQeV9TSVpFKGFyZ2RlZnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzKTsKKyAgICAgICAgfQogICAgIH0KKworICAgIGt3ZGVmcyA9IFB5RnVuY3Rpb25fR0VUX0tXX0RFRkFVTFRTKGZ1bmMpOworICAgIGNsb3N1cmUgPSBQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpOworICAgIG5hbWUgPSAoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX25hbWU7CisgICAgcXVhbG5hbWUgPSAoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX3F1YWxuYW1lOworCiAgICAgaWYgKGFyZ2RlZnMgIT0gTlVMTCkgewogICAgICAgICBkID0gJlB5VHVwbGVfR0VUX0lURU0oYXJnZGVmcywgMCk7CiAgICAgICAgIG5kID0gUHlfU0laRShhcmdkZWZzKTsKICAgICB9Ci0gICAgcmV0dXJuIF9QeUV2YWxfRXZhbENvZGVXaXRoTmFtZSgoUHlPYmplY3QqKWNvLCBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgKCpwcF9zdGFjayktbiwgbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBwX3N0YWNrKS0yKm5rLCBuaywgZCwgbmQsIGt3ZGVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fR0VUX0NMT1NVUkUoZnVuYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBxdWFsbmFtZSk7CisgICAgZWxzZSB7CisgICAgICAgIGQgPSBOVUxMOworICAgICAgICBuZCA9IDA7CisgICAgfQorICAgIHJldHVybiBfUHlFdmFsX0V2YWxDb2RlV2l0aE5hbWUoKFB5T2JqZWN0KiljbywgZ2xvYmFscywgKFB5T2JqZWN0ICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrICsgbmFyZ3MsIG5rd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLCBuZCwga3dkZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSwgbmFtZSwgcXVhbG5hbWUpOworfQorCitQeU9iamVjdCAqCitfUHlGdW5jdGlvbl9GYXN0Q2FsbERpY3QoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICoqYXJncywgUHlfc3NpemVfdCBuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIFB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKTsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyk7CisgICAgUHlPYmplY3QgKmFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqa3dkZWZzLCAqY2xvc3VyZSwgKm5hbWUsICpxdWFsbmFtZTsKKyAgICBQeU9iamVjdCAqa3d0dXBsZSwgKiprOworICAgIFB5T2JqZWN0ICoqZDsKKyAgICBQeV9zc2l6ZV90IG5kLCBuazsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgYXNzZXJ0KGZ1bmMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5hcmdzID49IDApOworICAgIGFzc2VydChuYXJncyA9PSAwIHx8IGFyZ3MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGt3YXJncyA9PSBOVUxMIHx8IFB5RGljdF9DaGVjayhrd2FyZ3MpKTsKKworICAgIFBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKKyAgICBQQ0FMTChQQ0FMTF9GQVNUX0ZVTkNUSU9OKTsKKworICAgIGlmIChjby0+Y29fa3dvbmx5YXJnY291bnQgPT0gMCAmJgorICAgICAgICAoa3dhcmdzID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3dhcmdzKSA9PSAwKSAmJgorICAgICAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpCisgICAgeworICAgICAgICAvKiBGYXN0IHBhdGhzICovCisgICAgICAgIGlmIChhcmdkZWZzID09IE5VTEwgJiYgY28tPmNvX2FyZ2NvdW50ID09IG5hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gX1B5RnVuY3Rpb25fRmFzdENhbGxOb0t3KGNvLCBhcmdzLCBuYXJncywgZ2xvYmFscyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmFyZ3MgPT0gMCAmJiBhcmdkZWZzICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgJiYgY28tPmNvX2FyZ2NvdW50ID09IFB5X1NJWkUoYXJnZGVmcykpIHsKKyAgICAgICAgICAgIC8qIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgYnV0IGFsbCBwYXJhbWV0ZXJzIGhhdmUKKyAgICAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZTogdXNlIGRlZmF1bHQgdmFsdWVzIGFzIGFyZ3VtZW50cyAuKi8KKyAgICAgICAgICAgIGFyZ3MgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdkZWZzLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBfUHlGdW5jdGlvbl9GYXN0Q2FsbE5vS3coY28sIGFyZ3MsIFB5X1NJWkUoYXJnZGVmcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGt3YXJncyAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgcG9zLCBpOworICAgICAgICBuayA9IFB5RGljdF9TaXplKGt3YXJncyk7CisKKyAgICAgICAga3d0dXBsZSA9IFB5VHVwbGVfTmV3KDIgKiBuayk7CisgICAgICAgIGlmIChrd3R1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgayA9ICZQeVR1cGxlX0dFVF9JVEVNKGt3dHVwbGUsIDApOworICAgICAgICBwb3MgPSBpID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KGt3YXJncywgJnBvcywgJmtbaV0sICZrW2krMV0pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoa1tpXSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoa1tpKzFdKTsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgfQorICAgICAgICBuayA9IGkgLyAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAga3d0dXBsZSA9IE5VTEw7CisgICAgICAgIGsgPSBOVUxMOworICAgICAgICBuayA9IDA7CisgICAgfQorCisgICAga3dkZWZzID0gUHlGdW5jdGlvbl9HRVRfS1dfREVGQVVMVFMoZnVuYyk7CisgICAgY2xvc3VyZSA9IFB5RnVuY3Rpb25fR0VUX0NMT1NVUkUoZnVuYyk7CisgICAgbmFtZSA9ICgoUHlGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IGZ1bmNfbmFtZTsKKyAgICBxdWFsbmFtZSA9ICgoUHlGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IGZ1bmNfcXVhbG5hbWU7CisKKyAgICBpZiAoYXJnZGVmcyAhPSBOVUxMKSB7CisgICAgICAgIGQgPSAmUHlUdXBsZV9HRVRfSVRFTShhcmdkZWZzLCAwKTsKKyAgICAgICAgbmQgPSBQeV9TSVpFKGFyZ2RlZnMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZCA9IE5VTEw7CisgICAgICAgIG5kID0gMDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBfUHlFdmFsX0V2YWxDb2RlV2l0aE5hbWUoKFB5T2JqZWN0KiljbywgZ2xvYmFscywgKFB5T2JqZWN0ICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGssIG5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLCBuZCwga3dkZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLCBuYW1lLCBxdWFsbmFtZSk7CisgICAgUHlfWERFQ1JFRihrd3R1cGxlKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdXBkYXRlX2tleXdvcmRfYXJncyhQeU9iamVjdCAqb3JpZ19rd2RpY3QsIGludCBuaywgUHlPYmplY3QgKioqcHBfc3RhY2ssCit1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICpvcmlnX2t3ZGljdCwgUHlfc3NpemVfdCBuaywgUHlPYmplY3QgKioqcHBfc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jKQogewogICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwpAQCAtNDg1OCwyMyArNTA0Niw0MCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdXBkYXRlX3N0YXJfYXJncyhpbnQgbnN0YWNrLCBpbnQgbnN0YXIsIFB5T2JqZWN0ICpzdGFyYXJnLAordXBkYXRlX3N0YXJfYXJncyhQeV9zc2l6ZV90IG5zdGFjaywgUHlfc3NpemVfdCBuc3RhciwgUHlPYmplY3QgKnN0YXJhcmcsCiAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqKnBwX3N0YWNrKQogewogICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKnc7CiAKKyAgICBpZiAoIW5zdGFjaykgeworICAgICAgICBpZiAoIXN0YXJhcmcpIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBubyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgYW5kIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAgICBzZXF1ZW5jZSB0byBiZSB1bnBhY2tlZC4gKi8KKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHN0YXJhcmcpKSB7CisgICAgICAgICAgICAvKiBObyBhcmd1bWVudHMgYXJlIHBhc3NlZCBvbiB0aGUgc3RhY2sgYW5kIHRoZSBzZXF1ZW5jZSBpcyBub3QgYQorICAgICAgICAgICAgICAgdHVwbGUgc3ViY2xhc3Mgc28gd2UgY2FuIGp1c3QgcGFzcyB0aGUgc3RhcmFyZyB0dXBsZSBkaXJlY3RseQorICAgICAgICAgICAgICAgdG8gdGhlIGZ1bmN0aW9uLiAqLworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJhcmcpOworICAgICAgICAgICAgcmV0dXJuIHN0YXJhcmc7CisgICAgICAgIH0KKyAgICB9CisKICAgICBjYWxsYXJncyA9IFB5VHVwbGVfTmV3KG5zdGFjayArIG5zdGFyKTsKICAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisKICAgICBpZiAobnN0YXIpIHsKLSAgICAgICAgaW50IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zdGFyOyBpKyspIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICphID0gUHlUdXBsZV9HRVRfSVRFTShzdGFyYXJnLCBpKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihhKTsKLSAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjayArIGksIGEpOworICAgICAgICAgICAgUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfR0VUX0lURU0oc3RhcmFyZywgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjayArIGksIGFyZyk7CiAgICAgICAgIH0KICAgICB9CisKICAgICB3aGlsZSAoLS1uc3RhY2sgPj0gMCkgewogICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOwogICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2ssIHcpOwpAQCAtNDg4Myw3ICs1MDg4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWxvYWRfYXJncyhQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG5hKQorbG9hZF9hcmdzKFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBQeV9zc2l6ZV90IG5hKQogewogICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcobmEpOwogICAgIFB5T2JqZWN0ICp3OwpAQCAtNDg5OCwxOCArNTEwMywxOCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBuYSwgaW50IG5rKQorZG9fY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKioqcHBfc3RhY2ssIFB5X3NzaXplX3QgbmFyZ3MsIFB5X3NzaXplX3Qgbmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqY2FsbGFyZ3MgPSBOVUxMOwogICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0gICAgaWYgKG5rID4gMCkgewotICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKE5VTEwsIG5rLCBwcF9zdGFjaywgZnVuYyk7CisgICAgaWYgKG5rd2FyZ3MgPiAwKSB7CisgICAgICAgIGt3ZGljdCA9IHVwZGF0ZV9rZXl3b3JkX2FyZ3MoTlVMTCwgbmt3YXJncywgcHBfc3RhY2ssIGZ1bmMpOwogICAgICAgICBpZiAoa3dkaWN0ID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGNhbGxfZmFpbDsKICAgICB9Ci0gICAgY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKKyAgICBjYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmFyZ3MpOwogICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQogICAgICAgICBnb3RvIGNhbGxfZmFpbDsKICNpZmRlZiBDQUxMX1BST0ZJTEUKQEAgLTQ5NDEsOSArNTE0NiwxMCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZXh0X2RvX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBpbnQgZmxhZ3MsIGludCBuYSwgaW50IG5rKQorZXh0X2RvX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICoqKnBwX3N0YWNrLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBQeV9zc2l6ZV90IG5hcmdzLCBQeV9zc2l6ZV90IG5rd2FyZ3MpCiB7Ci0gICAgaW50IG5zdGFyID0gMDsKKyAgICBQeV9zc2l6ZV90IG5zdGFyOwogICAgIFB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN0YXJhcmcgPSBOVUxMOwogICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwpAQCAtNDk1MSw3ICs1MTU3LDcgQEAKIAogICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykgewogICAgICAgICBrd2RpY3QgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0gICAgICAgIGlmICghUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKKyAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2tFeGFjdChrd2RpY3QpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZDsKICAgICAgICAgICAgIGQgPSBQeURpY3RfTmV3KCk7CiAgICAgICAgICAgICBpZiAoZCA9PSBOVUxMKQpAQCAtNDk3OCw4ICs1MTg0LDkgQEAKICAgICAgICAgICAgIGt3ZGljdCA9IGQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG5rID4gMCkgewotICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKGt3ZGljdCwgbmssIHBwX3N0YWNrLCBmdW5jKTsKKworICAgIGlmIChua3dhcmdzID4gMCkgeworICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKGt3ZGljdCwgbmt3YXJncywgcHBfc3RhY2ssIGZ1bmMpOwogICAgICAgICBpZiAoa3dkaWN0ID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CiAgICAgfQpAQCAtNTAwNyw5ICs1MjE0LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgbnN0YXIgPSBQeVR1cGxlX0dFVF9TSVpFKHN0YXJhcmcpOwogICAgIH0KLSAgICBjYWxsYXJncyA9IHVwZGF0ZV9zdGFyX2FyZ3MobmEsIG5zdGFyLCBzdGFyYXJnLCBwcF9zdGFjayk7Ci0gICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgZWxzZSB7CisgICAgICAgIG5zdGFyID0gMDsKKyAgICB9CisKKyAgICBjYWxsYXJncyA9IHVwZGF0ZV9zdGFyX2FyZ3MobmFyZ3MsIG5zdGFyLCBzdGFyYXJnLCBwcF9zdGFjayk7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpIHsKICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgIH0KKwogI2lmZGVmIENBTExfUFJPRklMRQogICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG8gbG9vayBhdCB0aGUgdHlwZSBvZiBmdW5jIHRvCiAgICAgICAgdXBkYXRlIHRoZSBjYWxsIHN0YXRzIHByb3Blcmx5LiAgRG8gaXQgaGVyZSBzbyBhcyB0byBhdm9pZApAQCAtNTAzMCw4ICs1MjQzLDEwIEBACiAgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAgICAgICAgIENfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKICAgICB9Ci0gICAgZWxzZQorICAgIGVsc2UgewogICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOworICAgIH0KKwogZXh0X2NhbGxfZmFpbDoKICAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKICAgICBQeV9YREVDUkVGKGt3ZGljdCk7CkBAIC01MTI2LDYgKzUzNDEsNDYgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKK2ltcG9ydF9uYW1lKFB5RnJhbWVPYmplY3QgKmYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqZnJvbWxpc3QsIFB5T2JqZWN0ICpsZXZlbCkKK3sKKyAgICBfUHlfSURFTlRJRklFUihfX2ltcG9ydF9fKTsKKyAgICBQeU9iamVjdCAqaW1wb3J0X2Z1bmMsICpyZXM7CisgICAgUHlPYmplY3QqIHN0YWNrWzVdOworCisgICAgaW1wb3J0X2Z1bmMgPSBfUHlEaWN0X0dldEl0ZW1JZChmLT5mX2J1aWx0aW5zLCAmUHlJZF9fX2ltcG9ydF9fKTsKKyAgICBpZiAoaW1wb3J0X2Z1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBGYXN0IHBhdGggZm9yIG5vdCBvdmVybG9hZGVkIF9faW1wb3J0X18uICovCisgICAgaWYgKGltcG9ydF9mdW5jID09IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+aW1wb3J0X2Z1bmMpIHsKKyAgICAgICAgaW50IGlsZXZlbCA9IF9QeUxvbmdfQXNJbnQobGV2ZWwpOworICAgICAgICBpZiAoaWxldmVsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPyBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlsZXZlbCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGltcG9ydF9mdW5jKTsKKworICAgIHN0YWNrWzBdID0gbmFtZTsKKyAgICBzdGFja1sxXSA9IGYtPmZfZ2xvYmFsczsKKyAgICBzdGFja1syXSA9IGYtPmZfbG9jYWxzID09IE5VTEwgPyBQeV9Ob25lIDogZi0+Zl9sb2NhbHM7CisgICAgc3RhY2tbM10gPSBmcm9tbGlzdDsKKyAgICBzdGFja1s0XSA9IGxldmVsOworICAgIHJlcyA9IF9QeU9iamVjdF9GYXN0Q2FsbChpbXBvcnRfZnVuYywgc3RhY2ssIDUpOworICAgIFB5X0RFQ1JFRihpbXBvcnRfZnVuYyk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKIGltcG9ydF9mcm9tKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSkKIHsKICAgICBQeU9iamVjdCAqeDsKQEAgLTUyNjEsNyArNTUxNiw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywKLSAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cikKKyAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgY29uc3QgdW5zaWduZWQgc2hvcnQgKm5leHRfaW5zdHIpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKICAgICBpZiAoUHlfUkVGQ05UKHYpID09IDIpIHsKQEAgLTUyNzEsMTAgKzU1MjYsMTEgQEAKICAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFdlIHRyeSB0byBkZWxldGUgdGhlIHZhcmlhYmxlIG5vdyB0byByZWR1Y2UKICAgICAgICAgICogdGhlIHJlZmNudCB0byAxLgogICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoICgqbmV4dF9pbnN0cikgeworICAgICAgICBpbnQgb3Bjb2RlLCBvcGFyZzsKKyAgICAgICAgTkVYVE9QQVJHKCk7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAgICAgICAgIGNhc2UgU1RPUkVfRkFTVDoKICAgICAgICAgewotICAgICAgICAgICAgaW50IG9wYXJnID0gUEVFS0FSRygpOwogICAgICAgICAgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwogICAgICAgICAgICAgaWYgKEdFVExPQ0FMKG9wYXJnKSA9PSB2KQogICAgICAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKQEAgLTUyODQsNyArNTU0MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICoqZnJlZXZhcnMgPSAoZi0+Zl9sb2NhbHNwbHVzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9jb2RlLT5jb19ubG9jYWxzKTsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gZnJlZXZhcnNbUEVFS0FSRygpXTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gZnJlZXZhcnNbb3BhcmddOwogICAgICAgICAgICAgaWYgKFB5Q2VsbF9HRVQoYykgPT0gdikKICAgICAgICAgICAgICAgICBQeUNlbGxfU2V0KGMsIE5VTEwpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MjkyLDcgKzU1NDgsNyBAQAogICAgICAgICBjYXNlIFNUT1JFX05BTUU6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7Ci0gICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBmLT5mX2xvY2FsczsKICAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpICYmCiAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKSA9PSB2KSB7CmRpZmYgLS1naXQgYS9QeXRob24vY2V2YWxfZ2lsLmggYi9QeXRob24vY2V2YWxfZ2lsLmgKaW5kZXggOGQzOGVlOS4uYTNiNDUwYiAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsX2dpbC5oCisrKyBiL1B5dGhvbi9jZXZhbF9naWwuaApAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgIC8qIFN1Yi1pbnRlcnByZXRlciBzdXBwb3J0OiB0aHJlYWRzIG1pZ2h0IGhhdmUgYmVlbiBzd2l0Y2hlZAogICAgICAgICAgICB1bmRlciBvdXIgZmVldCB1c2luZyBQeVRocmVhZFN0YXRlX1N3YXAoKS4gRml4IHRoZSBHSUwgbGFzdAogICAgICAgICAgICBob2xkZXIgdmFyaWFibGUgc28gdGhhdCBvdXIgaGV1cmlzdGljcyB3b3JrLiAqLwotICAgICAgICBfUHlfYXRvbWljX3N0b3JlX3JlbGF4ZWQoJmdpbF9sYXN0X2hvbGRlciwgKFB5X3VpbnRwdHJfdCl0c3RhdGUpOworICAgICAgICBfUHlfYXRvbWljX3N0b3JlX3JlbGF4ZWQoJmdpbF9sYXN0X2hvbGRlciwgKHVpbnRwdHJfdCl0c3RhdGUpOwogICAgIH0KIAogICAgIE1VVEVYX0xPQ0soZ2lsX211dGV4KTsKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgIF9QeV9BTk5PVEFURV9SV0xPQ0tfQUNRVUlSRUQoJmdpbF9sb2NrZWQsIC8qaXNfd3JpdGU9Ki8xKTsKIAogICAgIGlmICh0c3RhdGUgIT0gKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIpKSB7Ci0gICAgICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmZ2lsX2xhc3RfaG9sZGVyLCAoUHlfdWludHB0cl90KXRzdGF0ZSk7CisgICAgICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmZ2lsX2xhc3RfaG9sZGVyLCAodWludHB0cl90KXRzdGF0ZSk7CiAgICAgICAgICsrZ2lsX3N3aXRjaF9udW1iZXI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9QeXRob24vY2xpbmljL2JsdGlubW9kdWxlLmMuaCBiL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCmluZGV4IDRlMmIxZjEuLjRjNDQzNDAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCisrKyBiL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCkBAIC05Myw4ICs5Myw5IEBACiAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xVOmZvcm1hdCIsCi0gICAgICAgICZ2YWx1ZSwgJmZvcm1hdF9zcGVjKSkKKyAgICAgICAgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9mb3JtYXRfaW1wbChtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYyk7CiAKIGV4aXQ6CkBAIC0xMTksOCArMTIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgaTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpjaHIiLCAmaSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmNociIsICZpKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fY2hyX2ltcGwobW9kdWxlLCBpKTsKIAogZXhpdDoKQEAgLTE1Nyw3ICsxNTksOCBAQAogYnVpbHRpbl9jb21waWxlKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic291cmNlIiwgImZpbGVuYW1lIiwgIm1vZGUiLCAiZmxhZ3MiLCAiZG9udF9pbmhlcml0IiwgIm9wdGltaXplIiwgTlVMTH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfa2V5d29yZHNbXSA9IHsic291cmNlIiwgImZpbGVuYW1lIiwgIm1vZGUiLCAiZmxhZ3MiLCAiZG9udF9pbmhlcml0IiwgIm9wdGltaXplIiwgTlVMTH07CisgICAgc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHsiT08mc3xpaWk6Y29tcGlsZSIsIF9rZXl3b3JkcywgMH07CiAgICAgUHlPYmplY3QgKnNvdXJjZTsKICAgICBQeU9iamVjdCAqZmlsZW5hbWU7CiAgICAgY29uc3QgY2hhciAqbW9kZTsKQEAgLTE2NSw5ICsxNjgsMTAgQEAKICAgICBpbnQgZG9udF9pbmhlcml0ID0gMDsKICAgICBpbnQgb3B0aW1pemUgPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PJnN8aWlpOmNvbXBpbGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZzb3VyY2UsIFB5VW5pY29kZV9GU0RlY29kZXIsICZmaWxlbmFtZSwgJm1vZGUsICZmbGFncywgJmRvbnRfaW5oZXJpdCwgJm9wdGltaXplKSkKKyAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICZzb3VyY2UsIFB5VW5pY29kZV9GU0RlY29kZXIsICZmaWxlbmFtZSwgJm1vZGUsICZmbGFncywgJmRvbnRfaW5oZXJpdCwgJm9wdGltaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fY29tcGlsZV9pbXBsKG1vZHVsZSwgc291cmNlLCBmaWxlbmFtZSwgbW9kZSwgZmxhZ3MsIGRvbnRfaW5oZXJpdCwgb3B0aW1pemUpOwogCiBleGl0OgpAQCAtMTk1LDggKzE5OSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXZtb2QiLAogICAgICAgICAyLCAyLAotICAgICAgICAmeCwgJnkpKQorICAgICAgICAmeCwgJnkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9kaXZtb2RfaW1wbChtb2R1bGUsIHgsIHkpOwogCiBleGl0OgpAQCAtMjMyLDggKzIzNyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJldmFsIiwKICAgICAgICAgMSwgMywKLSAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKQorICAgICAgICAmc291cmNlLCAmZ2xvYmFscywgJmxvY2FscykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2V2YWxfaW1wbChtb2R1bGUsIHNvdXJjZSwgZ2xvYmFscywgbG9jYWxzKTsKIAogZXhpdDoKQEAgLTI2OSw4ICsyNzUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhlYyIsCiAgICAgICAgIDEsIDMsCi0gICAgICAgICZzb3VyY2UsICZnbG9iYWxzLCAmbG9jYWxzKSkKKyAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9leGVjX2ltcGwobW9kdWxlLCBzb3VyY2UsIGdsb2JhbHMsIGxvY2Fscyk7CiAKIGV4aXQ6CkBAIC0zMjEsOCArMzI4LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhhc2F0dHIiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmbmFtZSkpCisgICAgICAgICZvYmosICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faGFzYXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lKTsKIAogZXhpdDoKQEAgLTM2Niw4ICszNzQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0YXR0ciIsCiAgICAgICAgIDMsIDMsCi0gICAgICAgICZvYmosICZuYW1lLCAmdmFsdWUpKQorICAgICAgICAmb2JqLCAmbmFtZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fc2V0YXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zOTcsOCArNDA2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlbGF0dHIiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmbmFtZSkpCisgICAgICAgICZvYmosICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fZGVsYXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lKTsKIAogZXhpdDoKQEAgLTUwNiw4ICs1MTYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwKICAgICAgICAgMiwgMywKLSAgICAgICAgJngsICZ5LCAmeikpCisgICAgICAgICZ4LCAmeSwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9wb3dfaW1wbChtb2R1bGUsIHgsIHksIHopOwogCiBleGl0OgpAQCAtNTQwLDggKzU1MSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpbnB1dCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZwcm9tcHQpKQorICAgICAgICAmcHJvbXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faW5wdXRfaW1wbChtb2R1bGUsIHByb21wdCk7CiAKIGV4aXQ6CkBAIC01ODQsOCArNTk2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN1bSIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZpdGVyYWJsZSwgJnN0YXJ0KSkKKyAgICAgICAgJml0ZXJhYmxlLCAmc3RhcnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9zdW1faW1wbChtb2R1bGUsIGl0ZXJhYmxlLCBzdGFydCk7CiAKIGV4aXQ6CkBAIC02MTgsOCArNjMxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzaW5zdGFuY2UiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmY2xhc3Nfb3JfdHVwbGUpKQorICAgICAgICAmb2JqLCAmY2xhc3Nfb3JfdHVwbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9pc2luc3RhbmNlX2ltcGwobW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlKTsKIAogZXhpdDoKQEAgLTY1MiwxMSArNjY2LDEyIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc3N1YmNsYXNzIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJmNscywgJmNsYXNzX29yX3R1cGxlKSkKKyAgICAgICAgJmNscywgJmNsYXNzX29yX3R1cGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faXNzdWJjbGFzc19pbXBsKG1vZHVsZSwgY2xzLCBjbGFzc19vcl90dXBsZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MDMxMjcwYjY0Yzc5NGI4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03OTBjYjNkMjY1MzFkZmRhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaCBiL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaAppbmRleCAwNWQ3OWFjLi5iMzQ2MGIwIDEwMDY0NAotLS0gYS9QeXRob24vY2xpbmljL2ltcG9ydC5jLmgKKysrIGIvUHl0aG9uL2NsaW5pYy9pbXBvcnQuYy5oCkBAIC04OSw4ICs4OSw5IEBACiAgICAgUHlPYmplY3QgKnBhdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hVTpfZml4X2NvX2ZpbGVuYW1lIiwKLSAgICAgICAgJlB5Q29kZV9UeXBlLCAmY29kZSwgJnBhdGgpKQorICAgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX19maXhfY29fZmlsZW5hbWVfaW1wbChtb2R1bGUsIGNvZGUsIHBhdGgpOwogCiBleGl0OgpAQCAtMTQyLDggKzE0Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aW5pdF9mcm96ZW4iLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmluaXRfZnJvemVuIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9pbml0X2Zyb3plbl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0xNjgsOCArMTcwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpnZXRfZnJvemVuX29iamVjdCIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6Z2V0X2Zyb3plbl9vYmplY3QiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2dldF9mcm96ZW5fb2JqZWN0X2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTE5NCw4ICsxOTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbl9wYWNrYWdlIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW5fcGFja2FnZSIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfZnJvemVuX3BhY2thZ2VfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMjIwLDggKzIyNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfYnVpbHRpbiIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfYnVpbHRpbiIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfYnVpbHRpbl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0yNDYsOCArMjUxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW4iLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbiIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfZnJvemVuX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTI3Nyw4ICsyODMsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3JlYXRlX2R5bmFtaWMiLAogICAgICAgICAxLCAyLAotICAgICAgICAmc3BlYywgJmZpbGUpKQorICAgICAgICAmc3BlYywgJmZpbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9jcmVhdGVfZHluYW1pY19pbXBsKG1vZHVsZSwgc3BlYywgZmlsZSk7CiAKIGV4aXQ6CkBAIC0zMDgsOCArMzE1LDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfaW1wX2V4ZWNfZHluYW1pY19pbXBsKG1vZHVsZSwgbW9kKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzM3LDggKzM0NSw5IEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX2ltcF9leGVjX2J1aWx0aW5faW1wbChtb2R1bGUsIG1vZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1Miw0ICszNjEsNCBAQAogI2lmbmRlZiBfSU1QX0VYRUNfRFlOQU1JQ19NRVRIT0RERUYKICAgICAjZGVmaW5lIF9JTVBfRVhFQ19EWU5BTUlDX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9JTVBfRVhFQ19EWU5BTUlDX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MGFkNmU1ODMzZTYxNzBkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMjRkN2Y3MzcwMmE5MDdmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IDkzZjQ3ZTAuLjZmZTVkNWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgImNvZGUuaCIKICNpbmNsdWRlICJzeW10YWJsZS5oIgogI2luY2x1ZGUgIm9wY29kZS5oIgorI2luY2x1ZGUgIndvcmRjb2RlX2hlbHBlcnMuaCIKIAogI2RlZmluZSBERUZBVUxUX0JMT0NLX1NJWkUgMTYKICNkZWZpbmUgREVGQVVMVF9CTE9DS1MgOApAQCAtNDMsNyArNDQsNiBAQAogc3RydWN0IGluc3RyIHsKICAgICB1bnNpZ25lZCBpX2phYnMgOiAxOwogICAgIHVuc2lnbmVkIGlfanJlbCA6IDE7Ci0gICAgdW5zaWduZWQgaV9oYXNhcmcgOiAxOwogICAgIHVuc2lnbmVkIGNoYXIgaV9vcGNvZGU7CiAgICAgaW50IGlfb3Bhcmc7CiAgICAgc3RydWN0IGJhc2ljYmxvY2tfICppX3RhcmdldDsgLyogdGFyZ2V0IGJsb2NrIChpZiBqdW1wIGluc3RydWN0aW9uKSAqLwpAQCAtMTcxLDcgKzE3MSw2IEBACiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX28oc3RydWN0IGNvbXBpbGVyICosIGludCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX2koc3RydWN0IGNvbXBpbGVyICosIGludCwgUHlfc3NpemVfdCk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX2ooc3RydWN0IGNvbXBpbGVyICosIGludCwgYmFzaWNibG9jayAqLCBpbnQpOwotc3RhdGljIGJhc2ljYmxvY2sgKmNvbXBpbGVyX3VzZV9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICopOwogc3RhdGljIGludCBjb21waWxlcl9lcnJvcihzdHJ1Y3QgY29tcGlsZXIgKiwgY29uc3QgY2hhciAqKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfbmFtZW9wKHN0cnVjdCBjb21waWxlciAqLCBpZGVudGlmaWVyLCBleHByX2NvbnRleHRfdHkpOwogCkBAIC0xOTYsNyArMTk1LDcgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfZm9yKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKLXN0YXRpYyBpbnQgY29tcGlsZXJfY2FsbF9oZWxwZXIoc3RydWN0IGNvbXBpbGVyICpjLCBQeV9zc2l6ZV90IG4sCitzdGF0aWMgaW50IGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywgaW50IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa2V5d29yZHMpOwogc3RhdGljIGludCBjb21waWxlcl90cnlfZXhjZXB0KHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKQEAgLTQ3Nyw5ICs0NzYsOSBAQAogewogICAgIGJhc2ljYmxvY2sgKmJsb2NrOwogICAgIGZvciAoYmxvY2sgPSB1LT51X2Jsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+Yl9saXN0KSB7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhjYmNiY2JjYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhmYmZiZmJmYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhkYmRiZGJkYik7CisgICAgICAgIGFzc2VydCgodWludHB0cl90KWJsb2NrICE9IDB4Y2JjYmNiY2JVKTsKKyAgICAgICAgYXNzZXJ0KCh1aW50cHRyX3QpYmxvY2sgIT0gMHhmYmZiZmJmYlUpOworICAgICAgICBhc3NlcnQoKHVpbnRwdHJfdClibG9jayAhPSAweGRiZGJkYmRiVSk7CiAgICAgICAgIGlmIChibG9jay0+Yl9pbnN0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaWFsbG9jID4gMCk7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaXVzZWQgPiAwKTsKQEAgLTUyMyw2ICs1MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgaW50IHNjb3BlX3R5cGUsIHZvaWQgKmtleSwgaW50IGxpbmVubykKIHsKICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKKyAgICBiYXNpY2Jsb2NrICpibG9jazsKIAogICAgIHUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwpAQCAtNjIwLDggKzYyMCwxMSBAQAogICAgIGMtPnUgPSB1OwogCiAgICAgYy0+Y19uZXN0bGV2ZWwrKzsKLSAgICBpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jayhjKSA9PSBOVUxMKQorCisgICAgYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJsb2NrID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOworICAgIGMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKIAogICAgIGlmICh1LT51X3Njb3BlX3R5cGUgIT0gQ09NUElMRVJfU0NPUEVfTU9EVUxFKSB7CiAgICAgICAgIGlmICghY29tcGlsZXJfc2V0X3F1YWxuYW1lKGMpKQpAQCAtNzMxLDYgKzczNCw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogLyogQWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCiAgICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpAQCAtNzU1LDE2ICs3NTksNiBAQAogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCi1jb21waWxlcl91c2VfbmV3X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKLXsKLSAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLSAgICBpZiAoYmxvY2sgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotICAgIHJldHVybiBibG9jazsKLX0KLQotc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfbmV4dF9ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7CiAgICAgYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CkBAIC05NzYsNiArOTcwLDcgQEAKICAgICAgICAgY2FzZSBCVUlMRF9UVVBMRToKICAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgogICAgICAgICBjYXNlIEJVSUxEX1NFVDoKKyAgICAgICAgY2FzZSBCVUlMRF9TVFJJTkc6CiAgICAgICAgICAgICByZXR1cm4gMS1vcGFyZzsKICAgICAgICAgY2FzZSBCVUlMRF9MSVNUX1VOUEFDSzoKICAgICAgICAgY2FzZSBCVUlMRF9UVVBMRV9VTlBBQ0s6CkBAIC05ODYsNiArOTgxLDggQEAKICAgICAgICAgICAgIHJldHVybiAxIC0gKG9wYXJnICYgMHhGRik7CiAgICAgICAgIGNhc2UgQlVJTERfTUFQOgogICAgICAgICAgICAgcmV0dXJuIDEgLSAyKm9wYXJnOworICAgICAgICBjYXNlIEJVSUxEX0NPTlNUX0tFWV9NQVA6CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOwogICAgICAgICBjYXNlIExPQURfQVRUUjoKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjYXNlIENPTVBBUkVfT1A6CkBAIC0xMDM0LDExICsxMDMxLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKS0xOwogICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgogICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMjsKLSAgICAgICAgY2FzZSBNQUtFX0ZVTkNUSU9OOgotICAgICAgICAgICAgcmV0dXJuIC0xIC1OQVJHUyhvcGFyZykgLSAoKG9wYXJnID4+IDE2KSAmIDB4ZmZmZik7Ci0gICAgICAgIGNhc2UgTUFLRV9DTE9TVVJFOgotICAgICAgICAgICAgcmV0dXJuIC0yIC0gTkFSR1Mob3BhcmcpIC0gKChvcGFyZyA+PiAxNikgJiAweGZmZmYpOwogI3VuZGVmIE5BUkdTCisgICAgICAgIGNhc2UgTUFLRV9GVU5DVElPTjoKKyAgICAgICAgICAgIHJldHVybiAtMSAtICgob3BhcmcgJiAweDAxKSAhPSAwKSAtICgob3BhcmcgJiAweDAyKSAhPSAwKSAtCisgICAgICAgICAgICAgICAgKChvcGFyZyAmIDB4MDQpICE9IDApIC0gKChvcGFyZyAmIDB4MDgpICE9IDApOwogICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgogICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0yOwpAQCAtMTA2Niw2ICsxMDYyLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBHRVRfWUlFTERfRlJPTV9JVEVSOgogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRk9STUFUX1ZBTFVFOgorICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGZtdF9zcGVjIG9uIHRoZSBzdGFjaywgd2UgZ28gZnJvbSAyLT4xLAorICAgICAgICAgICAgICAgZWxzZSAxLT4xLiAqLworICAgICAgICAgICAgcmV0dXJuIChvcGFyZyAmIEZWU19NQVNLKSA9PSBGVlNfSEFWRV9TUEVDID8gLTEgOiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFBZX0lOVkFMSURfU1RBQ0tfRUZGRUNUOwogICAgIH0KQEAgLTEwODIsMTMgKzEwODIsMTQgQEAKICAgICBiYXNpY2Jsb2NrICpiOwogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOworICAgIGFzc2VydCghSEFTX0FSRyhvcGNvZGUpKTsKICAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwogICAgIGlmIChvZmYgPCAwKQogICAgICAgICByZXR1cm4gMDsKICAgICBiID0gYy0+dS0+dV9jdXJibG9jazsKICAgICBpID0gJmItPmJfaW5zdHJbb2ZmXTsKICAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKLSAgICBpLT5pX2hhc2FyZyA9IDA7CisgICAgaS0+aV9vcGFyZyA9IDA7CiAgICAgaWYgKG9wY29kZSA9PSBSRVRVUk5fVkFMVUUpCiAgICAgICAgIGItPmJfcmV0dXJuID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CkBAIC0xMTY1LDEwICsxMTY2LDE1IEBACiAgICAgc3RydWN0IGluc3RyICppOwogICAgIGludCBvZmY7CiAKLSAgICAvKiBJbnRlZ2VyIGFyZ3VtZW50cyBhcmUgbGltaXQgdG8gMTYtYml0LiBUaGVyZSBpcyBhbiBleHRlbnNpb24gZm9yIDMyLWJpdAotICAgICAgIGludGVnZXIgYXJndW1lbnRzLiAqLwotICAgIGFzc2VydCgoLTIxNDc0ODM2NDctMSkgPD0gb3BhcmcpOwotICAgIGFzc2VydChvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKKyAgICAvKiBvcGFyZyB2YWx1ZSBpcyB1bnNpZ25lZCwgYnV0IGEgc2lnbmVkIEMgaW50IGlzIHVzdWFsbHkgdXNlZCB0byBzdG9yZQorICAgICAgIGl0IGluIHRoZSBDIGNvZGUgKGxpa2UgUHl0aG9uL2NldmFsLmMpLgorCisgICAgICAgTGltaXQgdG8gMzItYml0IHNpZ25lZCBDIGludCAocmF0aGVyIHRoYW4gSU5UX01BWCkgZm9yIHBvcnRhYmlsaXR5LgorCisgICAgICAgVGhlIGFyZ3VtZW50IG9mIGEgY29uY3JldGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gaXMgbGltaXRlZCB0byA4LWJpdC4KKyAgICAgICBFWFRFTkRFRF9BUkcgaXMgdXNlZCBmb3IgMTYsIDI0LCBhbmQgMzItYml0IGFyZ3VtZW50cy4gKi8KKyAgICBhc3NlcnQoSEFTX0FSRyhvcGNvZGUpKTsKKyAgICBhc3NlcnQoMCA8PSBvcGFyZyAmJiBvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKIAogICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CiAgICAgaWYgKG9mZiA8IDApCkBAIC0xMTc2LDcgKzExODIsNiBAQAogICAgIGkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwogICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOwogICAgIGktPmlfb3BhcmcgPSBQeV9TQUZFX0RPV05DQVNUKG9wYXJnLCBQeV9zc2l6ZV90LCBpbnQpOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0xMTg3LDYgKzExOTIsNyBAQAogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOwogCisgICAgYXNzZXJ0KEhBU19BUkcob3Bjb2RlKSk7CiAgICAgYXNzZXJ0KGIgIT0gTlVMTCk7CiAgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKICAgICBpZiAob2ZmIDwgMCkKQEAgLTExOTQsNyArMTIwMCw2IEBACiAgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CiAgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CiAgICAgaS0+aV90YXJnZXQgPSBiOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBpZiAoYWJzb2x1dGUpCiAgICAgICAgIGktPmlfamFicyA9IDE7CiAgICAgZWxzZQpAQCAtMTIwMywyMiArMTIwOCwxMiBAQAogICAgIHJldHVybiAxOwogfQogCi0vKiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBORVdfQkxPQ0sgYW5kIE5FWFRfQkxPQ0sgaXMgc3VidGxlLiAgKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pICBORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCi0gICBpdCBhcyB0aGUgY3VycmVudCBibG9jay4gIE5FWFRfQkxPQ0soKSBhbHNvIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcAotICAgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrLgorLyogTkVYVF9CTE9DSygpIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcCBmcm9tIHRoZSBjdXJyZW50IGJsb2NrCisgICB0byB0aGUgbmV3IGJsb2NrLgorCisgICBUaGUgcmV0dXJucyBpbnNpZGUgdGhpcyBtYWNybyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKKyAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiBMb2NhbCBvYmplY3RzIHNob3VsZCB1c2UgdGhlIGFyZW5hLgogKi8KLQotLyogVGhlIHJldHVybnMgaW5zaWRlIHRoZXNlIG1hY3JvcyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKLSAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiAgTG9jYWwgb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBhcmVuYS4KLSovCi0KLQotI2RlZmluZSBORVdfQkxPQ0soQykgeyBcCi0gICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0gICAgICAgIHJldHVybiAwOyBcCi19Ci0KICNkZWZpbmUgTkVYVF9CTE9DSyhDKSB7IFwKICAgICBpZiAoY29tcGlsZXJfbmV4dF9ibG9jaygoQykpID09IE5VTEwpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEyNDEsNiArMTIzNiwxNSBAQAogICAgICAgICByZXR1cm4gMDsgXAogfQogCisvKiBTYW1lIGFzIEFERE9QX08sIGJ1dCBzdGVhbHMgYSByZWZlcmVuY2UuICovCisjZGVmaW5lIEFERE9QX04oQywgT1AsIE8sIFRZUEUpIHsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgeyBcCisgICAgICAgIFB5X0RFQ1JFRigoTykpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgUHlfREVDUkVGKChPKSk7IFwKK30KKwogI2RlZmluZSBBRERPUF9OQU1FKEMsIE9QLCBPLCBUWVBFKSB7IFwKICAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX25hbWUoKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEzMDksNyArMTMxMyw0OSBAQAogewogICAgIGlmIChzLT5raW5kICE9IEV4cHJfa2luZCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZDsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzLT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc19jb25zdChleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9jb25zdF92YWx1ZShleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICBjYXNlIE51bV9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5OdW0ubjsKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5TdHIuczsKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgICAgIHJldHVybiBlLT52LkJ5dGVzLnM7CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgICAgICByZXR1cm4gUHlfRWxsaXBzaXM7CisgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuTmFtZUNvbnN0YW50LnZhbHVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghaXNfY29uc3QoZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIC8qIENvbXBpbGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCBjaGVja2luZyBmb3IgYSBkb2NzdHJpbmcuICovCkBAIC0xNDI2LDUzICsxNDcyLDUwIEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBpbGVyX21ha2VfY2xvc3VyZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgYXJncywgUHlPYmplY3QgKnF1YWxuYW1lKQorY29tcGlsZXJfbWFrZV9jbG9zdXJlKHN0cnVjdCBjb21waWxlciAqYywgUHlDb2RlT2JqZWN0ICpjbywgUHlfc3NpemVfdCBmbGFncywgUHlPYmplY3QgKnF1YWxuYW1lKQogewogICAgIFB5X3NzaXplX3QgaSwgZnJlZSA9IFB5Q29kZV9HZXROdW1GcmVlKGNvKTsKICAgICBpZiAocXVhbG5hbWUgPT0gTlVMTCkKICAgICAgICAgcXVhbG5hbWUgPSBjby0+Y29fbmFtZTsKIAotICAgIGlmIChmcmVlID09IDApIHsKLSAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwotICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIHF1YWxuYW1lLCBjb25zdHMpOwotICAgICAgICBBRERPUF9JKGMsIE1BS0VfRlVOQ1RJT04sIGFyZ3MpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGZyZWU7ICsraSkgewotICAgICAgICAvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCi0gICAgICAgICAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuCi0gICAgICAgICovCi0gICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOwotICAgICAgICBpbnQgYXJnLCByZWZ0eXBlOworICAgIGlmIChmcmVlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKKyAgICAgICAgICAgIC8qIEJ5cGFzcyBjb21fYWRkb3BfdmFybmFtZSBiZWNhdXNlIGl0IHdpbGwgZ2VuZXJhdGUKKyAgICAgICAgICAgICAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgaSk7CisgICAgICAgICAgICBpbnQgYXJnLCByZWZ0eXBlOwogCi0gICAgICAgIC8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKLSAgICAgICAgICAgZnJlZSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbWV0aG9kLAotICAgICAgICAgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKLSAgICAgICAgICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKLSAgICAgICAgICAgd2VsbCBhcyBieSB0aGUgbm9ybWFsIG5hbWUgbG9vb2t1cCBsb2dpYy4KLSAgICAgICAgKi8KLSAgICAgICAgcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKLSAgICAgICAgaWYgKHJlZnR5cGUgPT0gQ0VMTCkKLSAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7Ci0gICAgICAgIGVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KLSAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9mcmVldmFycywgbmFtZSk7Ci0gICAgICAgIGlmIChhcmcgPT0gLTEpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICJsb29rdXAgJXMgaW4gJXMgJWQgJWRcbiIKLSAgICAgICAgICAgICAgICAiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihuYW1lKSksCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjLT51LT51X25hbWUpLAotICAgICAgICAgICAgICAgIHJlZnR5cGUsIGFyZywKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGNvLT5jb19uYW1lKSwKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIoY28tPmNvX2ZyZWV2YXJzKSkpOwotICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKKyAgICAgICAgICAgICAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKKyAgICAgICAgICAgICAgIHRoZSBuYW1lIHdpbGwgYmUgY29uc2lkZXJlZCBmcmVlICphbmQqIGxvY2FsIGluIHRoZQorICAgICAgICAgICAgICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKKyAgICAgICAgICAgICAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZWZ0eXBlID09IENFTEwpCisgICAgICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2NlbGx2YXJzLCBuYW1lKTsKKyAgICAgICAgICAgIGVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KKyAgICAgICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOworICAgICAgICAgICAgaWYgKGFyZyA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAibG9va3VwICVzIGluICVzICVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICJmcmVldmFycyBvZiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihuYW1lKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoYy0+dS0+dV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgcmVmdHlwZSwgYXJnLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChQeU9iamVjdF9SZXByKGNvLT5jb19mcmVldmFycykpKTsKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjb21waWxlcl9tYWtlX2Nsb3N1cmUoKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7CiAgICAgICAgIH0KLSAgICAgICAgQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7CisgICAgICAgIGZsYWdzIHw9IDB4MDg7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIGZyZWUpOwogICAgIH0KLSAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7CiAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBxdWFsbmFtZSwgY29uc3RzKTsKLSAgICBBRERPUF9JKGMsIE1BS0VfQ0xPU1VSRSwgYXJncyk7CisgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBmbGFncyk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE0OTQsMjYgKzE1MzcsNjAgQEAKIGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKmt3b25seWFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa3dfZGVmYXVsdHMpCiB7Ci0gICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdHMgKyAxLgotICAgICAgIFJldHVybnMgMCBvbiBlcnJvci4KLSAgICAgKi8KLSAgICBpbnQgaSwgZGVmYXVsdF9jb3VudCA9IDA7CisgICAgLyogUHVzaCBhIGRpY3Qgb2Yga2V5d29yZC1vbmx5IGRlZmF1bHQgdmFsdWVzLgorCisgICAgICAgUmV0dXJuIDAgb24gZXJyb3IsIC0xIGlmIG5vIGRpY3QgcHVzaGVkLCAxIGlmIGEgZGljdCBpcyBwdXNoZWQuCisgICAgICAgKi8KKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqa2V5cyA9IE5VTEw7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGt3b25seWFyZ3MpOyBpKyspIHsKICAgICAgICAgYXJnX3R5IGFyZyA9IGFzZGxfc2VxX0dFVChrd29ubHlhcmdzLCBpKTsKICAgICAgICAgZXhwcl90eSBkZWZhdWx0XyA9IGFzZGxfc2VxX0dFVChrd19kZWZhdWx0cywgaSk7CiAgICAgICAgIGlmIChkZWZhdWx0XykgewogICAgICAgICAgICAgUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKGMtPnUtPnVfcHJpdmF0ZSwgYXJnLT5hcmcpOwotICAgICAgICAgICAgaWYgKCFtYW5nbGVkKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBtYW5nbGVkLCBjb25zdHMpOwotICAgICAgICAgICAgUHlfREVDUkVGKG1hbmdsZWQpOwotICAgICAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9leHByKGMsIGRlZmF1bHRfKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKCFtYW5nbGVkKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHRfY291bnQrKzsKKyAgICAgICAgICAgIGlmIChrZXlzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBrZXlzID0gUHlMaXN0X05ldygxKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShrZXlzLCAwLCBtYW5nbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXMgPSBQeUxpc3RfQXBwZW5kKGtleXMsIG1hbmdsZWQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9leHByKGMsIGRlZmF1bHRfKSkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRfY291bnQgKyAxOworICAgIGlmIChrZXlzICE9IE5VTEwpIHsKKyAgICAgICAgUHlfc3NpemVfdCBkZWZhdWx0X2NvdW50ID0gUHlMaXN0X0dFVF9TSVpFKGtleXMpOworICAgICAgICBQeU9iamVjdCAqa2V5c190dXBsZSA9IFB5TGlzdF9Bc1R1cGxlKGtleXMpOworICAgICAgICBQeV9ERUNSRUYoa2V5cyk7CisgICAgICAgIGlmIChrZXlzX3R1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5c190dXBsZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBkZWZhdWx0X2NvdW50KTsKKyAgICAgICAgYXNzZXJ0KGRlZmF1bHRfY291bnQgPiAwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGtleXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNTU2LDExICsxNjMzLDEwIEBACiBjb21waWxlcl92aXNpdF9hbm5vdGF0aW9ucyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSByZXR1cm5zKQogewotICAgIC8qIFB1c2ggYXJnIGFubm90YXRpb25zIGFuZCBhIGxpc3Qgb2YgdGhlIGFyZ3VtZW50IG5hbWVzLiBSZXR1cm4gdGhlICMKLSAgICAgICBvZiBpdGVtcyBwdXNoZWQgKyAxLiBUaGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBvdXQtb2Ytb3JkZXIgd3J0IHRoZQotICAgICAgIHNvdXJjZSBjb2RlLgorICAgIC8qIFB1c2ggYXJnIGFubm90YXRpb24gZGljdC4KKyAgICAgICBUaGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBvdXQtb2Ytb3JkZXIgd3J0IHRoZSBzb3VyY2UgY29kZS4KIAotICAgICAgIE1vcmUgdGhhbiAyXjE2LTEgYW5ub3RhdGlvbnMgaXMgYSBTeW50YXhFcnJvci4gUmV0dXJucyAwIG9uIGVycm9yLgorICAgICAgIFJldHVybiAwIG9uIGVycm9yLCAtMSBpZiBubyBkaWN0IHB1c2hlZCwgMSBpZiBhIGRpY3QgaXMgcHVzaGVkLgogICAgICAgICovCiAgICAgc3RhdGljIGlkZW50aWZpZXIgcmV0dXJuX3N0cjsKICAgICBQeU9iamVjdCAqbmFtZXM7CkBAIC0xNTkyLDMyICsxNjY4LDIwIEBACiAgICAgfQogCiAgICAgbGVuID0gUHlMaXN0X0dFVF9TSVpFKG5hbWVzKTsKLSAgICBpZiAobGVuID4gNjU1MzQpIHsKLSAgICAgICAgLyogbGVuIG11c3QgZml0IGluIDE2IGJpdHMsIGFuZCBsZW4gaXMgaW5jcmVtZW50ZWQgYmVsb3cgKi8KLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IGFubm90YXRpb25zIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQogICAgIGlmIChsZW4pIHsKLSAgICAgICAgLyogY29udmVydCBuYW1lcyB0byBhIHR1cGxlIGFuZCBwbGFjZSBvbiBzdGFjayAqLwotICAgICAgICBQeU9iamVjdCAqZWx0OwotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIFB5T2JqZWN0ICpzID0gUHlUdXBsZV9OZXcobGVuKTsKLSAgICAgICAgaWYgKCFzKQotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBlbHQgPSBQeUxpc3RfR0VUX0lURU0obmFtZXMsIGkpOwotICAgICAgICAgICAgUHlfSU5DUkVGKGVsdCk7Ci0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHMsIGksIGVsdCk7CisgICAgICAgIFB5T2JqZWN0ICprZXl0dXBsZSA9IFB5TGlzdF9Bc1R1cGxlKG5hbWVzKTsKKyAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgaWYgKGtleXR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgcywgY29uc3RzKTsKLSAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICBsZW4rKzsgLyogaW5jbHVkZSB0aGUganVzdC1wdXNoZWQgdHVwbGUgKi8KKyAgICAgICAgQURET1BfTihjLCBMT0FEX0NPTlNULCBrZXl0dXBsZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBsZW4pOworICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgUHlfREVDUkVGKG5hbWVzKTsKLQotICAgIC8qIFdlIGp1c3QgY2hlY2tlZCB0aGF0IGxlbiA8PSA2NTUzNSwgc2VlIGFib3ZlICovCi0gICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QobGVuICsgMSwgUHlfc3NpemVfdCwgaW50KTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogZXJyb3I6CiAgICAgUHlfREVDUkVGKG5hbWVzKTsKQEAgLTE2MjUsNiArMTY4OSwzNiBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl92aXNpdF9kZWZhdWx0cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzKQoreworICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7CisgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBQeV9zc2l6ZV90Citjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzKQoreworICAgIFB5X3NzaXplX3QgZnVuY2ZsYWdzID0gMDsKKyAgICBpZiAoYXJncy0+ZGVmYXVsdHMgJiYgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSA+IDApIHsKKyAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9kZWZhdWx0cyhjLCBhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDE7CisgICAgfQorICAgIGlmIChhcmdzLT5rd29ubHlhcmdzKSB7CisgICAgICAgIGludCByZXMgPSBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhjLCBhcmdzLT5rd29ubHlhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+a3dfZGVmYXVsdHMpOworICAgICAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZXMgPiAwKSB7CisgICAgICAgICAgICBmdW5jZmxhZ3MgfD0gMHgwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnVuY2ZsYWdzOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl9mdW5jdGlvbihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcywgaW50IGlzX2FzeW5jKQogewogICAgIFB5Q29kZU9iamVjdCAqY287CkBAIC0xNjM1LDEyICsxNzI5LDExIEBACiAgICAgYXNkbF9zZXEqIGRlY29zOwogICAgIGFzZGxfc2VxICpib2R5OwogICAgIHN0bXRfdHkgc3Q7Ci0gICAgUHlfc3NpemVfdCBpLCBuLCBhcmdsZW5ndGg7Ci0gICAgaW50IGRvY3N0cmluZywga3dfZGVmYXVsdF9jb3VudCA9IDA7Ci0gICAgaW50IG51bV9hbm5vdGF0aW9uczsKKyAgICBQeV9zc2l6ZV90IGksIG4sIGZ1bmNmbGFnczsKKyAgICBpbnQgZG9jc3RyaW5nOworICAgIGludCBhbm5vdGF0aW9uczsKICAgICBpbnQgc2NvcGVfdHlwZTsKIAotCiAgICAgaWYgKGlzX2FzeW5jKSB7CiAgICAgICAgIGFzc2VydChzLT5raW5kID09IEFzeW5jRnVuY3Rpb25EZWZfa2luZCk7CiAKQEAgLTE2NjUsMzAgKzE3NTgsMzIgQEAKIAogICAgIGlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCiAgICAgICAgIHJldHVybiAwOwotICAgIGlmIChhcmdzLT5kZWZhdWx0cykKLSAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBpZiAoYXJncy0+a3dvbmx5YXJncykgewotICAgICAgICBpbnQgcmVzID0gY29tcGlsZXJfdmlzaXRfa3dvbmx5ZGVmYXVsdHMoYywgYXJncy0+a3dvbmx5YXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPmt3X2RlZmF1bHRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGt3X2RlZmF1bHRfY291bnQgPSByZXMgLSAxOwotICAgIH0KLSAgICBudW1fYW5ub3RhdGlvbnMgPSBjb21waWxlcl92aXNpdF9hbm5vdGF0aW9ucyhjLCBhcmdzLCByZXR1cm5zKTsKLSAgICBpZiAobnVtX2Fubm90YXRpb25zID09IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIG51bV9hbm5vdGF0aW9ucy0tOwotICAgIGFzc2VydCgobnVtX2Fubm90YXRpb25zICYgMHhGRkZGKSA9PSBudW1fYW5ub3RhdGlvbnMpOwogCi0gICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVfdHlwZSwgKHZvaWQgKilzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKSkKKyAgICBmdW5jZmxhZ3MgPSBjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICBpZiAoZnVuY2ZsYWdzID09IC0xKSB7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFubm90YXRpb25zID0gY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoYywgYXJncywgcmV0dXJucyk7CisgICAgaWYgKGFubm90YXRpb25zID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKGFubm90YXRpb25zID4gMCkgeworICAgICAgICBmdW5jZmxhZ3MgfD0gMHgwNDsKKyAgICB9CisKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsIHNjb3BlX3R5cGUsICh2b2lkICopcywgcy0+bGluZW5vKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChib2R5LCAwKTsKICAgICBkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7Ci0gICAgaWYgKGRvY3N0cmluZyAmJiBjLT5jX29wdGltaXplIDwgMikKLSAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIGlmIChkb2NzdHJpbmcgJiYgYy0+Y19vcHRpbWl6ZSA8IDIpIHsKKyAgICAgICAgaWYgKHN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZCkKKyAgICAgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIH0KICAgICBpZiAoY29tcGlsZXJfYWRkX28oYywgYy0+dS0+dV9jb25zdHMsIGZpcnN0X2NvbnN0KSA8IDApICAgICAgewogICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTE3MTIsMTIgKzE4MDcsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBhcmdsZW5ndGggPSBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpOwotICAgIGFyZ2xlbmd0aCB8PSBrd19kZWZhdWx0X2NvdW50IDw8IDg7Ci0gICAgYXJnbGVuZ3RoIHw9IG51bV9hbm5vdGF0aW9ucyA8PCAxNjsKICAgICBpZiAoaXNfYXN5bmMpCiAgICAgICAgIGNvLT5jb19mbGFncyB8PSBDT19DT1JPVVRJTkU7Ci0gICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhcmdsZW5ndGgsIHF1YWxuYW1lKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGZ1bmNmbGFncywgcXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihxdWFsbmFtZSk7CiAgICAgUHlfREVDUkVGKGNvKTsKIApAQCAtMTg3Nyw4ICsxOTY5LDcgQEAKICAgICBQeUNvZGVPYmplY3QgKmNvOwogICAgIFB5T2JqZWN0ICpxdWFsbmFtZTsKICAgICBzdGF0aWMgaWRlbnRpZmllciBuYW1lOwotICAgIGludCBrd19kZWZhdWx0X2NvdW50ID0gMDsKLSAgICBQeV9zc2l6ZV90IGFyZ2xlbmd0aDsKKyAgICBQeV9zc2l6ZV90IGZ1bmNmbGFnczsKICAgICBhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7CiAgICAgYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOwogCkBAIC0xODg4LDE0ICsxOTc5LDExIEBACiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoYXJncy0+ZGVmYXVsdHMpCi0gICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0gICAgaWYgKGFyZ3MtPmt3b25seWFyZ3MpIHsKLSAgICAgICAgaW50IHJlcyA9IGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKGMsIGFyZ3MtPmt3b25seWFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5rd19kZWZhdWx0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICAgIGt3X2RlZmF1bHRfY291bnQgPSByZXMgLSAxOworICAgIGZ1bmNmbGFncyA9IGNvbXBpbGVyX2RlZmF1bHRfYXJndW1lbnRzKGMsIGFyZ3MpOworICAgIGlmIChmdW5jZmxhZ3MgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCiAgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCBDT01QSUxFUl9TQ09QRV9MQU1CREEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWUsIGUtPmxpbmVubykpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTkyMSw5ICsyMDA5LDcgQEAKICAgICBpZiAoY28gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBhcmdsZW5ndGggPSBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpOwotICAgIGFyZ2xlbmd0aCB8PSBrd19kZWZhdWx0X2NvdW50IDw8IDg7Ci0gICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhcmdsZW5ndGgsIHF1YWxuYW1lKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGZ1bmNmbGFncywgcXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihxdWFsbmFtZSk7CiAgICAgUHlfREVDUkVGKGNvKTsKIApAQCAtMjU5OSw2ICsyNjg1LDI1IEBACiB9CiAKIHN0YXRpYyBpbnQKK2NvbXBpbGVyX3Zpc2l0X3N0bXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgdmFsdWUpCit7CisgICAgaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgeworICAgICAgICBWSVNJVChjLCBleHByLCB2YWx1ZSk7CisgICAgICAgIEFERE9QKGMsIFBSSU5UX0VYUFIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfY29uc3QodmFsdWUpKSB7CisgICAgICAgIC8qIGlnbm9yZSBjb25zdGFudCBzdGF0ZW1lbnQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgVklTSVQoYywgZXhwciwgdmFsdWUpOworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl92aXNpdF9zdG10KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewogICAgIFB5X3NzaXplX3QgaSwgbjsKQEAgLTI2NjgsMTYgKzI3NzMsNyBAQAogICAgIGNhc2UgTm9ubG9jYWxfa2luZDoKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFeHByX2tpbmQ6Ci0gICAgICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0gICAgICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gU3RyX2tpbmQgJiYKLSAgICAgICAgICAgICAgICAgcy0+di5FeHByLnZhbHVlLT5raW5kICE9IE51bV9raW5kKSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBjb21waWxlcl92aXNpdF9zdG10X2V4cHIoYywgcy0+di5FeHByLnZhbHVlKTsKICAgICBjYXNlIFBhc3Nfa2luZDoKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCcmVha19raW5kOgpAQCAtMzA3OSw5ICszMTc1LDUzIEBACiB9CiAKIHN0YXRpYyBpbnQKK2FyZV9hbGxfaXRlbXNfY29uc3QoYXNkbF9zZXEgKnNlcSwgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpOworICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBrZXkgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMIHx8ICFpc19jb25zdChrZXkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citjb21waWxlcl9zdWJkaWN0KHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlLCBQeV9zc2l6ZV90IGJlZ2luLCBQeV9zc2l6ZV90IGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBlbmQgLSBiZWdpbjsKKyAgICBQeU9iamVjdCAqa2V5cywgKmtleTsKKyAgICBpZiAobiA+IDEgJiYgYXJlX2FsbF9pdGVtc19jb25zdChlLT52LkRpY3Qua2V5cywgYmVnaW4sIGVuZCkpIHsKKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBrZXlzID0gUHlUdXBsZV9OZXcobik7CisgICAgICAgIGlmIChrZXlzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGtleSA9IGdldF9jb25zdF92YWx1ZSgoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LmtleXMsIGkpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShrZXlzLCBpIC0gYmVnaW4sIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfTihjLCBMT0FEX0NPTlNULCBrZXlzLCBjb25zdHMpOworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX0NPTlNUX0tFWV9NQVAsIG4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LnZhbHVlcywgaSkpOworICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKIGNvbXBpbGVyX2RpY3Qoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBuLCBjb250YWluZXJzLCBlbGVtZW50czsKKyAgICBQeV9zc2l6ZV90IGksIG4sIGVsZW1lbnRzOworICAgIGludCBjb250YWluZXJzOwogICAgIGludCBpc191bnBhY2tpbmcgPSAwOwogICAgIG4gPSBhc2RsX3NlcV9MRU4oZS0+di5EaWN0LnZhbHVlcyk7CiAgICAgY29udGFpbmVycyA9IDA7CkBAIC0zMDg5LDcgKzMyMjksOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgaXNfdW5wYWNraW5nID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSA9PSBOVUxMOwogICAgICAgICBpZiAoZWxlbWVudHMgPT0gMHhGRkZGIHx8IChlbGVtZW50cyAmJiBpc191bnBhY2tpbmcpKSB7Ci0gICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgZWxlbWVudHMpOworICAgICAgICAgICAgaWYgKCFjb21waWxlcl9zdWJkaWN0KGMsIGUsIGkgLSBlbGVtZW50cywgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBjb250YWluZXJzKys7CiAgICAgICAgICAgICBlbGVtZW50cyA9IDA7CiAgICAgICAgIH0KQEAgLTMwOTgsMTMgKzMyMzksMTIgQEAKICAgICAgICAgICAgIGNvbnRhaW5lcnMrKzsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOwotICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKICAgICAgICAgICAgIGVsZW1lbnRzKys7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGVsZW1lbnRzIHx8IGNvbnRhaW5lcnMgPT0gMCkgewotICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgZWxlbWVudHMpOworICAgICAgICBpZiAoIWNvbXBpbGVyX3N1YmRpY3QoYywgZSwgbiAtIGVsZW1lbnRzLCBuKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjb250YWluZXJzKys7CiAgICAgfQogICAgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGljdCwgdGhleSBuZWVkIHRvIGJlIG1lcmdlZCBpbnRvIGEgbmV3CkBAIC0zMTczLDE1ICszMzEzLDEwNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkNhbGwua2V5d29yZHMpOwogfQogCitzdGF0aWMgaW50Citjb21waWxlcl9qb2luZWRfc3RyKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQoreworICAgIFZJU0lUX1NFUShjLCBleHByLCBlLT52LkpvaW5lZFN0ci52YWx1ZXMpOworICAgIEFERE9QX0koYywgQlVJTERfU1RSSU5HLCBhc2RsX3NlcV9MRU4oZS0+di5Kb2luZWRTdHIudmFsdWVzKSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFVzZWQgdG8gaW1wbGVtZW50IGYtc3RyaW5ncy4gRm9ybWF0IGEgc2luZ2xlIHZhbHVlLiAqLworc3RhdGljIGludAorY29tcGlsZXJfZm9ybWF0dGVkX3ZhbHVlKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQoreworICAgIC8qIE91ciBvcGFyZyBlbmNvZGVzIDIgcGllY2VzIG9mIGluZm9ybWF0aW9uOiB0aGUgY29udmVyc2lvbgorICAgICAgIGNoYXJhY3RlciwgYW5kIHdoZXRoZXIgb3Igbm90IGEgZm9ybWF0X3NwZWMgd2FzIHByb3ZpZGVkLgorCisgICAgICAgQ29udmVydCB0aGUgY29udmVyc2lvbiBjaGFyIHRvIDIgYml0czoKKyAgICAgICBOb25lOiAwMDAgIDB4MCAgRlZDX05PTkUKKyAgICAgICAhcyAgOiAwMDEgIDB4MSAgRlZDX1NUUgorICAgICAgICFyICA6IDAxMCAgMHgyICBGVkNfUkVQUgorICAgICAgICFhICA6IDAxMSAgMHgzICBGVkNfQVNDSUkKKworICAgICAgIG5leHQgYml0IGlzIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSBmb3JtYXQgc3BlYzoKKyAgICAgICB5ZXMgOiAxMDAgIDB4NAorICAgICAgIG5vICA6IDAwMCAgMHgwCisgICAgKi8KKworICAgIGludCBvcGFyZzsKKworICAgIC8qIEV2YWx1YXRlIHRoZSBleHByZXNzaW9uIHRvIGJlIGZvcm1hdHRlZC4gKi8KKyAgICBWSVNJVChjLCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKworICAgIHN3aXRjaCAoZS0+di5Gb3JtYXR0ZWRWYWx1ZS5jb252ZXJzaW9uKSB7CisgICAgY2FzZSAncyc6IG9wYXJnID0gRlZDX1NUUjsgICBicmVhazsKKyAgICBjYXNlICdyJzogb3BhcmcgPSBGVkNfUkVQUjsgIGJyZWFrOworICAgIGNhc2UgJ2EnOiBvcGFyZyA9IEZWQ19BU0NJSTsgYnJlYWs7CisgICAgY2FzZSAtMTogIG9wYXJnID0gRlZDX05PTkU7ICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGNvbnZlcnNpb24gY2hhcmFjdGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYykgeworICAgICAgICAvKiBFdmFsdWF0ZSB0aGUgZm9ybWF0IHNwZWMsIGFuZCB1cGRhdGUgb3VyIG9wY29kZSBhcmcuICovCisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpOworICAgICAgICBvcGFyZyB8PSBGVlNfSEFWRV9TUEVDOworICAgIH0KKworICAgIC8qIEFuZCBwdXNoIG91ciBvcGNvZGUgYW5kIG9wYXJnICovCisgICAgQURET1BfSShjLCBGT1JNQVRfVkFMVUUsIG9wYXJnKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY29tcGlsZXJfc3Via3dhcmdzKHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKmtleXdvcmRzLCBQeV9zc2l6ZV90IGJlZ2luLCBQeV9zc2l6ZV90IGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBlbmQgLSBiZWdpbjsKKyAgICBrZXl3b3JkX3R5IGt3OworICAgIFB5T2JqZWN0ICprZXlzLCAqa2V5OworICAgIGFzc2VydChuID4gMCk7CisgICAgaWYgKG4gPiAxKSB7CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGt3ID0gYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGt3LT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAga2V5cyA9IFB5VHVwbGVfTmV3KG4pOworICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrZXkgPSAoKGtleXdvcmRfdHkpIGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSkpLT5hcmc7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oa2V5cywgaSAtIGJlZ2luLCBrZXkpOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5cywgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBuKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGEgZm9yIGxvb3Agb25seSBleGVjdXRlcyBvbmNlICovCisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGt3ID0gYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKTsKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwga3ctPmFyZywgY29uc3RzKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGt3LT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIG4pOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKwogLyogc2hhcmVkIGNvZGUgYmV0d2VlbiBjb21waWxlcl9jYWxsIGFuZCBjb21waWxlcl9jbGFzcyAqLwogc3RhdGljIGludAogY29tcGlsZXJfY2FsbF9oZWxwZXIoc3RydWN0IGNvbXBpbGVyICpjLAotICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuLCAvKiBBcmdzIGFscmVhZHkgcHVzaGVkICovCisgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgLyogQXJncyBhbHJlYWR5IHB1c2hlZCAqLwogICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa2V5d29yZHMpCiB7CiAgICAgaW50IGNvZGUgPSAwOwotICAgIFB5X3NzaXplX3QgbmVsdHMsIGksIG5zZWVuLCBua3c7CisgICAgUHlfc3NpemVfdCBuZWx0cywgaSwgbnNlZW47CisgICAgaW50IG5rdzsKIAogICAgIC8qIHRoZSBudW1iZXIgb2YgdHVwbGVzIGFuZCBkaWN0aW9uYXJpZXMgb24gdGhlIHN0YWNrICovCiAgICAgUHlfc3NpemVfdCBuc3ViYXJncyA9IDAsIG5zdWJrd2FyZ3MgPSAwOwpAQCAtMzIzOCwyOSArMzQ2NywzOCBAQAogICAgICAgICBpZiAoa3ctPmFyZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvKiBBIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nLiAqLwogICAgICAgICAgICAgaWYgKG5zZWVuKSB7Ci0gICAgICAgICAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIG5zZWVuKTsKKyAgICAgICAgICAgICAgICBpZiAobnN1Ymt3YXJncykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX3N1Ymt3YXJncyhjLCBrZXl3b3JkcywgaSAtIG5zZWVuLCBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBuc3Via3dhcmdzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGo7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuc2VlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWSVNJVChjLCBrZXl3b3JkLCBhc2RsX3NlcV9HRVQoa2V5d29yZHMsIGopKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBua3cgPSBuc2VlbjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbnNlZW4gPSAwOwotICAgICAgICAgICAgICAgIG5zdWJrd2FyZ3MrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGt3LT52YWx1ZSk7CiAgICAgICAgICAgICBuc3Via3dhcmdzKys7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobnN1Ymt3YXJncykgewotICAgICAgICAgICAgLyogQSBrZXl3b3JkIGFyZ3VtZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgYSBkaWN0LiAqLwotICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBrdy0+YXJnLCBjb25zdHMpOwotICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKLSAgICAgICAgICAgIG5zZWVuKys7Ci0gICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBrZXl3b3JkIGFyZ3VtZW50ICovCi0gICAgICAgICAgICBWSVNJVChjLCBrZXl3b3JkLCBrdykKLSAgICAgICAgICAgIG5rdysrOworICAgICAgICAgICAgbnNlZW4rKzsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobnNlZW4pIHsKLSAgICAgICAgLyogUGFjayB1cCBhbnkgdHJhaWxpbmcga2V5d29yZCBhcmd1bWVudHMuICovCi0gICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuc2Vlbik7Ci0gICAgICAgIG5zdWJrd2FyZ3MrKzsKKyAgICAgICAgaWYgKG5zdWJrd2FyZ3MpIHsKKyAgICAgICAgICAgIC8qIFBhY2sgdXAgYW55IHRyYWlsaW5nIGtleXdvcmQgYXJndW1lbnRzLiAqLworICAgICAgICAgICAgaWYgKCFjb21waWxlcl9zdWJrd2FyZ3MoYywga2V5d29yZHMsIG5lbHRzIC0gbnNlZW4sIG5lbHRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIG5zdWJrd2FyZ3MrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZJU0lUX1NFUShjLCBrZXl3b3JkLCBrZXl3b3Jkcyk7CisgICAgICAgICAgICBua3cgPSBuc2VlbjsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAobnN1Ymt3YXJncykgewogICAgICAgICBjb2RlIHw9IDI7CkBAIC0zNTQ5LDYgKzM3ODcsOCBAQAogICAgIHN3aXRjaCAoZS0+a2luZCkgewogICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKICAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuQ29uc3RhbnQudmFsdWUpOwogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5OdW0ubik7CiAgICAgY2FzZSBTdHJfa2luZDoKQEAgLTM1OTIsOSArMzgzMiw5IEBACiAgICAgICAgQkxPQ0sKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQ6Ci0gICAgICAgZXhjID0gY29weSBvZiAoZXhjZXB0aW9uLCBpbnN0YW5jZSwgdHJhY2ViYWNrKQorICAgICAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCiAgICAgICAgZWxzZToKLSAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgaWYgbm90IChhd2FpdCBleGl0KCpleGMpKToKICAgICAgICAgICAgcmFpc2UKICAqLwpAQCAtMzgzNiwxMiArNDA3NiwxOSBAQAogICAgICAgICByZXR1cm4gY29tcGlsZXJfY29tcGFyZShjLCBlKTsKICAgICBjYXNlIENhbGxfa2luZDoKICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NhbGwoYywgZSk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQ29uc3RhbnQudmFsdWUsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfam9pbmVkX3N0cihjLCBlKTsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoYywgZSk7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQnl0ZXMucywgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CkBAIC00Mjk1LDE4ICs0NTQyLDYgQEAKICAgICAgICAgUHlPYmplY3RfRnJlZShhLT5hX3Bvc3RvcmRlcik7CiB9CiAKLS8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIGJhc2ljIGJsb2NrIGluIGJ5dGVzLiAqLwotCi1zdGF0aWMgaW50Ci1pbnN0cnNpemUoc3RydWN0IGluc3RyICppbnN0cikKLXsKLSAgICBpZiAoIWluc3RyLT5pX2hhc2FyZykKLSAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLyogMSBieXRlIGZvciB0aGUgb3Bjb2RlKi8KLSAgICBpZiAoaW5zdHItPmlfb3BhcmcgPiAweGZmZmYpCi0gICAgICAgIHJldHVybiA2OyAgICAgICAgICAgICAgIC8qIDEgKG9wY29kZSkgKyAxIChFWFRFTkRFRF9BUkcgb3Bjb2RlKSArIDIgKG9wYXJnKSArIDIob3BhcmcgZXh0ZW5kZWQpICovCi0gICAgcmV0dXJuIDM7ICAgICAgICAgICAgICAgICAgIC8qIDEgKG9wY29kZSkgKyAyIChvcGFyZykgKi8KLX0KLQogc3RhdGljIGludAogYmxvY2tzaXplKGJhc2ljYmxvY2sgKmIpCiB7CkBAIC00MzE0LDcgKzQ1NDksNyBAQAogICAgIGludCBzaXplID0gMDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspCi0gICAgICAgIHNpemUgKz0gaW5zdHJzaXplKCZiLT5iX2luc3RyW2ldKTsKKyAgICAgICAgc2l6ZSArPSBpbnN0cnNpemUoYi0+Yl9pbnN0cltpXS5pX29wYXJnKTsKICAgICByZXR1cm4gc2l6ZTsKIH0KIApAQCAtNDMzMyw3ICs0NTY4LDYgQEAKICAgICBkX2xpbmVubyA9IGktPmlfbGluZW5vIC0gYS0+YV9saW5lbm87CiAKICAgICBhc3NlcnQoZF9ieXRlY29kZSA+PSAwKTsKLSAgICBhc3NlcnQoZF9saW5lbm8gPj0gMCk7CiAKICAgICBpZihkX2J5dGVjb2RlID09IDAgJiYgZF9saW5lbm8gPT0gMCkKICAgICAgICAgcmV0dXJuIDE7CkBAIC00MzYzLDkgKzQ1OTcsMjEgQEAKICAgICAgICAgZF9ieXRlY29kZSAtPSBuY29kZXMgKiAyNTU7CiAgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwogICAgIH0KLSAgICBhc3NlcnQoZF9ieXRlY29kZSA8PSAyNTUpOwotICAgIGlmIChkX2xpbmVubyA+IDI1NSkgewotICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMgPSBkX2xpbmVubyAvIDI1NTsKKyAgICBhc3NlcnQoMCA8PSBkX2J5dGVjb2RlICYmIGRfYnl0ZWNvZGUgPD0gMjU1KTsKKworICAgIGlmIChkX2xpbmVubyA8IC0xMjggfHwgMTI3IDwgZF9saW5lbm8pIHsKKyAgICAgICAgaW50IGosIG5ieXRlcywgbmNvZGVzLCBrOworICAgICAgICBpZiAoZF9saW5lbm8gPCAwKSB7CisgICAgICAgICAgICBrID0gLTEyODsKKyAgICAgICAgICAgIC8qIHVzZSBkaXZpc2lvbiBvbiBwb3NpdGl2ZSBudW1iZXJzICovCisgICAgICAgICAgICBuY29kZXMgPSAoLWRfbGluZW5vKSAvIDEyODsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGsgPSAxMjc7CisgICAgICAgICAgICBuY29kZXMgPSBkX2xpbmVubyAvIDEyNzsKKyAgICAgICAgfQorICAgICAgICBkX2xpbmVubyAtPSBuY29kZXMgKiBrOworICAgICAgICBhc3NlcnQobmNvZGVzID49IDEpOwogICAgICAgICBuYnl0ZXMgPSBhLT5hX2xub3RhYl9vZmYgKyAyICogbmNvZGVzOwogICAgICAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKICAgICAgICAgaWYgKG5ieXRlcyA+PSBsZW4pIHsKQEAgLTQzODMsMTUgKzQ2MjksMTUgQEAKICAgICAgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CiAgICAgICAgICpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7Ci0gICAgICAgICpsbm90YWIrKyA9IDI1NTsKKyAgICAgICAgKmxub3RhYisrID0gazsKICAgICAgICAgZF9ieXRlY29kZSA9IDA7CiAgICAgICAgIGZvciAoaiA9IDE7IGogPCBuY29kZXM7IGorKykgewogICAgICAgICAgICAgKmxub3RhYisrID0gMDsKLSAgICAgICAgICAgICpsbm90YWIrKyA9IDI1NTsKKyAgICAgICAgICAgICpsbm90YWIrKyA9IGs7CiAgICAgICAgIH0KLSAgICAgICAgZF9saW5lbm8gLT0gbmNvZGVzICogMjU1OwogICAgICAgICBhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKICAgICB9CisgICAgYXNzZXJ0KC0xMjggPD0gZF9saW5lbm8gJiYgZF9saW5lbm8gPD0gMTI3KTsKIAogICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwogICAgIGlmIChhLT5hX2xub3RhYl9vZmYgKyAyID49IGxlbikgewpAQCAtNDQyMywxNSArNDY2OSwxMiBAQAogc3RhdGljIGludAogYXNzZW1ibGVfZW1pdChzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgaW5zdHIgKmkpCiB7Ci0gICAgaW50IHNpemUsIGFyZyA9IDAsIGV4dCA9IDA7CisgICAgaW50IHNpemUsIGFyZyA9IDA7CiAgICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKGEtPmFfYnl0ZWNvZGUpOwogICAgIGNoYXIgKmNvZGU7CiAKLSAgICBzaXplID0gaW5zdHJzaXplKGkpOwotICAgIGlmIChpLT5pX2hhc2FyZykgewotICAgICAgICBhcmcgPSBpLT5pX29wYXJnOwotICAgICAgICBleHQgPSBhcmcgPj4gMTY7Ci0gICAgfQorICAgIGFyZyA9IGktPmlfb3Bhcmc7CisgICAgc2l6ZSA9IGluc3Ryc2l6ZShhcmcpOwogICAgIGlmIChpLT5pX2xpbmVubyAmJiAhYXNzZW1ibGVfbG5vdGFiKGEsIGkpKQogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoYS0+YV9vZmZzZXQgKyBzaXplID49IGxlbikgewpAQCAtNDQ0MiwxOSArNDY4NSw3IEBACiAgICAgfQogICAgIGNvZGUgPSBQeUJ5dGVzX0FTX1NUUklORyhhLT5hX2J5dGVjb2RlKSArIGEtPmFfb2Zmc2V0OwogICAgIGEtPmFfb2Zmc2V0ICs9IHNpemU7Ci0gICAgaWYgKHNpemUgPT0gNikgewotICAgICAgICBhc3NlcnQoaS0+aV9oYXNhcmcpOwotICAgICAgICAqY29kZSsrID0gKGNoYXIpRVhURU5ERURfQVJHOwotICAgICAgICAqY29kZSsrID0gZXh0ICYgMHhmZjsKLSAgICAgICAgKmNvZGUrKyA9IGV4dCA+PiA4OwotICAgICAgICBhcmcgJj0gMHhmZmZmOwotICAgIH0KLSAgICAqY29kZSsrID0gaS0+aV9vcGNvZGU7Ci0gICAgaWYgKGktPmlfaGFzYXJnKSB7Ci0gICAgICAgIGFzc2VydChzaXplID09IDMgfHwgc2l6ZSA9PSA2KTsKLSAgICAgICAgKmNvZGUrKyA9IGFyZyAmIDB4ZmY7Ci0gICAgICAgICpjb2RlKysgPSBhcmcgPj4gODsKLSAgICB9CisgICAgd3JpdGVfb3BfYXJnKCh1bnNpZ25lZCBjaGFyKiljb2RlLCBpLT5pX29wY29kZSwgYXJnLCBzaXplKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtNDQ2Miw3ICs0NjkzLDcgQEAKIGFzc2VtYmxlX2p1bXBfb2Zmc2V0cyhzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7CiAgICAgYmFzaWNibG9jayAqYjsKLSAgICBpbnQgYnNpemUsIHRvdHNpemUsIGV4dGVuZGVkX2FyZ19jb3VudCA9IDAsIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50OworICAgIGludCBic2l6ZSwgdG90c2l6ZSwgZXh0ZW5kZWRfYXJnX3JlY29tcGlsZTsKICAgICBpbnQgaTsKIAogICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBibG9jayBhbmQgZml4dXAganVtcCBhcmdzLgpAQCAtNDQ3NSwyNyArNDcwNiwyNiBAQAogICAgICAgICAgICAgYi0+Yl9vZmZzZXQgPSB0b3RzaXplOwogICAgICAgICAgICAgdG90c2l6ZSArPSBic2l6ZTsKICAgICAgICAgfQotICAgICAgICBsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCA9IGV4dGVuZGVkX2FyZ19jb3VudDsKLSAgICAgICAgZXh0ZW5kZWRfYXJnX2NvdW50ID0gMDsKKyAgICAgICAgZXh0ZW5kZWRfYXJnX3JlY29tcGlsZSA9IDA7CiAgICAgICAgIGZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKICAgICAgICAgICAgIGJzaXplID0gYi0+Yl9vZmZzZXQ7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IGluc3RyICppbnN0ciA9ICZiLT5iX2luc3RyW2ldOworICAgICAgICAgICAgICAgIGludCBpc2l6ZSA9IGluc3Ryc2l6ZShpbnN0ci0+aV9vcGFyZyk7CiAgICAgICAgICAgICAgICAgLyogUmVsYXRpdmUganVtcHMgYXJlIGNvbXB1dGVkIHJlbGF0aXZlIHRvCiAgICAgICAgICAgICAgICAgICAgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgYWZ0ZXIgZmV0Y2hpbmcKICAgICAgICAgICAgICAgICAgICB0aGUganVtcCBpbnN0cnVjdGlvbi4KICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJzaXplICs9IGluc3Ryc2l6ZShpbnN0cik7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RyLT5pX2phYnMpCisgICAgICAgICAgICAgICAgYnNpemUgKz0gaXNpemU7CisgICAgICAgICAgICAgICAgaWYgKGluc3RyLT5pX2phYnMgfHwgaW5zdHItPmlfanJlbCkgewogICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5zdHItPmlfanJlbCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0IC0gYnNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnID0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9qcmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyAtPSBic2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJzaXplKGluc3RyLT5pX29wYXJnKSAhPSBpc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnX3JlY29tcGlsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfb3BhcmcgPiAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZ19jb3VudCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ1MDUsNyArNDczNSw3IEBACiAKICAgICAgICAgVGhlIGlzc3VlIGlzIHRoYXQgaW4gdGhlIGZpcnN0IGxvb3AgYmxvY2tzaXplKCkgaXMgY2FsbGVkCiAgICAgICAgIHdoaWNoIGNhbGxzIGluc3Ryc2l6ZSgpIHdoaWNoIHJlcXVpcmVzIGlfb3BhcmcgYmUgc2V0Ci0gICAgICAgIGFwcHJvcHJpYXRlbHkuICAgICAgICAgIFRoZXJlIGlzIGEgYm9vdHN0cmFwIHByb2JsZW0gYmVjYXVzZQorICAgICAgICBhcHByb3ByaWF0ZWx5LiBUaGVyZSBpcyBhIGJvb3RzdHJhcCBwcm9ibGVtIGJlY2F1c2UKICAgICAgICAgaV9vcGFyZyBpcyBjYWxjdWxhdGVkIGluIHRoZSBzZWNvbmQgbG9vcCBhYm92ZS4KIAogICAgICAgICBTbyB3ZSBsb29wIHVudGlsIHdlIHN0b3Agc2VlaW5nIG5ldyBFWFRFTkRFRF9BUkdzLgpAQCAtNDUxMyw3ICs0NzQzLDcgQEAKICAgICAgICAgb25lcyBpbiBqdW1wIGluc3RydWN0aW9ucy4gIFNvIHRoaXMgc2hvdWxkIGNvbnZlcmdlCiAgICAgICAgIGZhaXJseSBxdWlja2x5LgogICAgICovCi0gICAgfSB3aGlsZSAobGFzdF9leHRlbmRlZF9hcmdfY291bnQgIT0gZXh0ZW5kZWRfYXJnX2NvdW50KTsKKyAgICB9IHdoaWxlIChleHRlbmRlZF9hcmdfcmVjb21waWxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ2NTksOSArNDg4OSw5IEBACiAgICAgY2hhciBhcmdbMTI4XTsKIAogICAgICphcmcgPSAnXDAnOwotICAgIGlmIChpLT5pX2hhc2FyZykKKyAgICBpZiAoSEFTX0FSRyhpLT5pX29wY29kZSkpIHsKICAgICAgICAgc3ByaW50ZihhcmcsICJhcmc6ICVkICIsIGktPmlfb3BhcmcpOwotCisgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAibGluZTogJWQsIG9wY29kZTogJWQgJXMlcyVzXG4iLAogICAgICAgICAgICAgICAgICAgICBpLT5pX2xpbmVubywgaS0+aV9vcGNvZGUsIGFyZywgamFicywganJlbCk7CiB9CkBAIC00NzExLDcgKzQ5NDEsNyBAQAogCiAgICAgLyogU2V0IGZpcnN0bGluZW5vIGlmIGl0IHdhc24ndCBleHBsaWNpdGx5IHNldC4gKi8KICAgICBpZiAoIWMtPnUtPnVfZmlyc3RsaW5lbm8pIHsKLSAgICAgICAgaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0cikKKyAgICAgICAgaWYgKGVudHJ5YmxvY2sgJiYgZW50cnlibG9jay0+Yl9pbnN0ciAmJiBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubykKICAgICAgICAgICAgIGMtPnUtPnVfZmlyc3RsaW5lbm8gPSBlbnRyeWJsb2NrLT5iX2luc3RyLT5pX2xpbmVubzsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYy0+dS0+dV9maXJzdGxpbmVubyA9IDE7CkBAIC00NzQ5LDQgKzQ5NzksMyBAQAogewogICAgIHJldHVybiBQeUFTVF9Db21waWxlRXgobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIC0xLCBhcmVuYSk7CiB9Ci0KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb25kdmFyLmggYi9QeXRob24vY29uZHZhci5oCmluZGV4IGJiNWIxYjYuLjlhNzFiMTcgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb25kdmFyLmgKKysrIGIvUHl0aG9uL2NvbmR2YXIuaApAQCAtODksNyArODksNyBAQAogCiAvKiByZXR1cm4gMCBmb3Igc3VjY2VzcywgMSBvbiB0aW1lb3V0LCAtMSBvbiBlcnJvciAqLwogUHlfTE9DQUxfSU5MSU5FKGludCkKLVB5Q09ORF9USU1FRFdBSVQoUHlDT05EX1QgKmNvbmQsIFB5TVVURVhfVCAqbXV0LCBQWV9MT05HX0xPTkcgdXMpCitQeUNPTkRfVElNRURXQUlUKFB5Q09ORF9UICpjb25kLCBQeU1VVEVYX1QgKm11dCwgbG9uZyBsb25nIHVzKQogewogICAgIGludCByOwogICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgIGN2LT53YWl0aW5nKys7CiAgICAgUHlNVVRFWF9VTkxPQ0soY3MpOwogICAgIC8qICJsb3N0IHdha2V1cCBidWciIHdvdWxkIG9jY3VyIGlmIHRoZSBjYWxsZXIgd2VyZSBpbnRlcnJ1cHRlZCBoZXJlLAotICAgICAqIGJ1dCB3ZSBhcmUgc2FmZSBiZWNhdXNlIHdlIGFyZSB1c2luZyBhIHNlbWFwaG9yZSB3aWNoIGhhcyBhbiBpbnRlcm5hbAorICAgICAqIGJ1dCB3ZSBhcmUgc2FmZSBiZWNhdXNlIHdlIGFyZSB1c2luZyBhIHNlbWFwaG9yZSB3aGljaCBoYXMgYW4gaW50ZXJuYWwKICAgICAgKiBjb3VudC4KICAgICAgKi8KICAgICB3YWl0ID0gV2FpdEZvclNpbmdsZU9iamVjdEV4KGN2LT5zZW0sIG1zLCBGQUxTRSk7CkBAIC0yNzAsNyArMjcwLDcgQEAKIH0KIAogUHlfTE9DQUxfSU5MSU5FKGludCkKLVB5Q09ORF9USU1FRFdBSVQoUHlDT05EX1QgKmN2LCBQeU1VVEVYX1QgKmNzLCBQWV9MT05HX0xPTkcgdXMpCitQeUNPTkRfVElNRURXQUlUKFB5Q09ORF9UICpjdiwgUHlNVVRFWF9UICpjcywgbG9uZyBsb25nIHVzKQogewogICAgIHJldHVybiBfUHlDT05EX1dBSVRfTVMoY3YsIGNzLCAoRFdPUkQpKHVzLzEwMDApKTsKIH0KQEAgLTM2Myw3ICszNjMsNyBAQAogICogMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGtub3cuCiAgKi8KIFB5X0xPQ0FMX0lOTElORShpbnQpCi1QeUNPTkRfVElNRURXQUlUKFB5Q09ORF9UICpjdiwgUHlNVVRFWF9UICpjcywgUFlfTE9OR19MT05HIHVzKQorUHlDT05EX1RJTUVEV0FJVChQeUNPTkRfVCAqY3YsIFB5TVVURVhfVCAqY3MsIGxvbmcgbG9uZyB1cykKIHsKICAgICByZXR1cm4gU2xlZXBDb25kaXRpb25WYXJpYWJsZVNSVyhjdiwgY3MsIChEV09SRCkodXMvMTAwMCksIDApID8gMiA6IC0xOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R0b2EuYyBiL1B5dGhvbi9kdG9hLmMKaW5kZXggM2RhNTQ2ZS4uZWZjYWRjMyAxMDA2NDQKLS0tIGEvUHl0aG9uL2R0b2EuYworKysgYi9QeXRob24vZHRvYS5jCkBAIC0xNTEsMTggKzE1MSw5IEBACiAjZW5kaWYKIAogCi0jaWYgZGVmaW5lZChIQVZFX1VJTlQzMl9UKSAmJiBkZWZpbmVkKEhBVkVfSU5UMzJfVCkKLXR5cGVkZWYgUFlfVUlOVDMyX1QgVUxvbmc7Ci10eXBlZGVmIFBZX0lOVDMyX1QgTG9uZzsKLSNlbHNlCi0jZXJyb3IgIkZhaWxlZCB0byBmaW5kIGFuIGV4YWN0LXdpZHRoIDMyLWJpdCBpbnRlZ2VyIHR5cGUiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoSEFWRV9VSU5UNjRfVCkKLSNkZWZpbmUgVUxMb25nIFBZX1VJTlQ2NF9UCi0jZWxzZQotI3VuZGVmIFVMTG9uZwotI2VuZGlmCit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwordHlwZWRlZiBpbnQzMl90IExvbmc7Cit0eXBlZGVmIHVpbnQ2NF90IFVMTG9uZzsKIAogI3VuZGVmIERFQlVHCiAjaWZkZWYgUHlfREVCVUcKQEAgLTQ1NywxMyArNDQ4LDggQEAKIG11bHRhZGQoQmlnaW50ICpiLCBpbnQgbSwgaW50IGEpICAgICAgIC8qIG11bHRpcGx5IGJ5IG0gYW5kIGFkZCBhICovCiB7CiAgICAgaW50IGksIHdkczsKLSNpZmRlZiBVTExvbmcKICAgICBVTG9uZyAqeDsKICAgICBVTExvbmcgY2FycnksIHk7Ci0jZWxzZQotICAgIFVMb25nIGNhcnJ5LCAqeCwgeTsKLSAgICBVTG9uZyB4aSwgejsKLSNlbmRpZgogICAgIEJpZ2ludCAqYjE7CiAKICAgICB3ZHMgPSBiLT53ZHM7CkBAIC00NzEsMTcgKzQ1Nyw5IEBACiAgICAgaSA9IDA7CiAgICAgY2FycnkgPSBhOwogICAgIGRvIHsKLSNpZmRlZiBVTExvbmcKICAgICAgICAgeSA9ICp4ICogKFVMTG9uZyltICsgY2Fycnk7CiAgICAgICAgIGNhcnJ5ID0geSA+PiAzMjsKICAgICAgICAgKngrKyA9IChVTG9uZykoeSAmIEZGRkZGRkZGKTsKLSNlbHNlCi0gICAgICAgIHhpID0gKng7Ci0gICAgICAgIHkgPSAoeGkgJiAweGZmZmYpICogbSArIGNhcnJ5OwotICAgICAgICB6ID0gKHhpID4+IDE2KSAqIG0gKyAoeSA+PiAxNik7Ci0gICAgICAgIGNhcnJ5ID0geiA+PiAxNjsKLSAgICAgICAgKngrKyA9ICh6IDw8IDE2KSArICh5ICYgMHhmZmZmKTsKLSNlbmRpZgogICAgIH0KICAgICB3aGlsZSgrK2kgPCB3ZHMpOwogICAgIGlmIChjYXJyeSkgewpAQCAtNjQyLDEyICs2MjAsNyBAQAogICAgIGludCBrLCB3YSwgd2IsIHdjOwogICAgIFVMb25nICp4LCAqeGEsICp4YWUsICp4YiwgKnhiZSwgKnhjLCAqeGMwOwogICAgIFVMb25nIHk7Ci0jaWZkZWYgVUxMb25nCiAgICAgVUxMb25nIGNhcnJ5LCB6OwotI2Vsc2UKLSAgICBVTG9uZyBjYXJyeSwgejsKLSAgICBVTG9uZyB6MjsKLSNlbmRpZgogCiAgICAgaWYgKCghYS0+eFswXSAmJiBhLT53ZHMgPT0gMSkgfHwgKCFiLT54WzBdICYmIGItPndkcyA9PSAxKSkgewogICAgICAgICBjID0gQmFsbG9jKDApOwpAQCAtNjc5LDcgKzY1Miw2IEBACiAgICAgeGIgPSBiLT54OwogICAgIHhiZSA9IHhiICsgd2I7CiAgICAgeGMwID0gYy0+eDsKLSNpZmRlZiBVTExvbmcKICAgICBmb3IoOyB4YiA8IHhiZTsgeGMwKyspIHsKICAgICAgICAgaWYgKCh5ID0gKnhiKyspKSB7CiAgICAgICAgICAgICB4ID0geGE7CkBAIC02OTQsMzkgKzY2Niw2IEBACiAgICAgICAgICAgICAqeGMgPSAoVUxvbmcpY2Fycnk7CiAgICAgICAgIH0KICAgICB9Ci0jZWxzZQotICAgIGZvcig7IHhiIDwgeGJlOyB4YisrLCB4YzArKykgewotICAgICAgICBpZiAoeSA9ICp4YiAmIDB4ZmZmZikgewotICAgICAgICAgICAgeCA9IHhhOwotICAgICAgICAgICAgeGMgPSB4YzA7Ci0gICAgICAgICAgICBjYXJyeSA9IDA7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgeiA9ICgqeCAmIDB4ZmZmZikgKiB5ICsgKCp4YyAmIDB4ZmZmZikgKyBjYXJyeTsKLSAgICAgICAgICAgICAgICBjYXJyeSA9IHogPj4gMTY7Ci0gICAgICAgICAgICAgICAgejIgPSAoKngrKyA+PiAxNikgKiB5ICsgKCp4YyA+PiAxNikgKyBjYXJyeTsKLSAgICAgICAgICAgICAgICBjYXJyeSA9IHoyID4+IDE2OwotICAgICAgICAgICAgICAgIFN0b3JlaW5jKHhjLCB6Miwgeik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSh4IDwgeGFlKTsKLSAgICAgICAgICAgICp4YyA9IGNhcnJ5OwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ID0gKnhiID4+IDE2KSB7Ci0gICAgICAgICAgICB4ID0geGE7Ci0gICAgICAgICAgICB4YyA9IHhjMDsKLSAgICAgICAgICAgIGNhcnJ5ID0gMDsKLSAgICAgICAgICAgIHoyID0gKnhjOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHogPSAoKnggJiAweGZmZmYpICogeSArICgqeGMgPj4gMTYpICsgY2Fycnk7Ci0gICAgICAgICAgICAgICAgY2FycnkgPSB6ID4+IDE2OwotICAgICAgICAgICAgICAgIFN0b3JlaW5jKHhjLCB6LCB6Mik7Ci0gICAgICAgICAgICAgICAgejIgPSAoKngrKyA+PiAxNikgKiB5ICsgKCp4YyAmIDB4ZmZmZikgKyBjYXJyeTsKLSAgICAgICAgICAgICAgICBjYXJyeSA9IHoyID4+IDE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUoeCA8IHhhZSk7Ci0gICAgICAgICAgICAqeGMgPSB6MjsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgogICAgIGZvcih4YzAgPSBjLT54LCB4YyA9IHhjMCArIHdjOyB3YyA+IDAgJiYgISotLXhjOyAtLXdjKSA7CiAgICAgYy0+d2RzID0gd2M7CiAgICAgcmV0dXJuIGM7CkBAIC03NDcsNyArNjg2LDcgQEAKIHsKICAgICBCaWdpbnQgKmIxLCAqcDUsICpwNTE7CiAgICAgaW50IGk7Ci0gICAgc3RhdGljIGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OwogCiAgICAgaWYgKChpID0gayAmIDMpKSB7CiAgICAgICAgIGIgPSBtdWx0YWRkKGIsIHAwNVtpLTFdLCAwKTsKQEAgLTgwMyw3ICs3NDIsNyBAQAogewogICAgIEJpZ2ludCAqYjEsICpwNSwgKnA1MTsKICAgICBpbnQgaTsKLSAgICBzdGF0aWMgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CiAKICAgICBpZiAoKGkgPSBrICYgMykpIHsKICAgICAgICAgYiA9IG11bHRhZGQoYiwgcDA1W2ktMV0sIDApOwpAQCAtOTM1LDEyICs4NzQsNyBAQAogICAgIEJpZ2ludCAqYzsKICAgICBpbnQgaSwgd2EsIHdiOwogICAgIFVMb25nICp4YSwgKnhhZSwgKnhiLCAqeGJlLCAqeGM7Ci0jaWZkZWYgVUxMb25nCiAgICAgVUxMb25nIGJvcnJvdywgeTsKLSNlbHNlCi0gICAgVUxvbmcgYm9ycm93LCB5OwotICAgIFVMb25nIHo7Ci0jZW5kaWYKIAogICAgIGkgPSBjbXAoYSxiKTsKICAgICBpZiAoIWkpIHsKQEAgLTk3MSw3ICs5MDUsNiBAQAogICAgIHhiZSA9IHhiICsgd2I7CiAgICAgeGMgPSBjLT54OwogICAgIGJvcnJvdyA9IDA7Ci0jaWZkZWYgVUxMb25nCiAgICAgZG8gewogICAgICAgICB5ID0gKFVMTG9uZykqeGErKyAtICp4YisrIC0gYm9ycm93OwogICAgICAgICBib3Jyb3cgPSB5ID4+IDMyICYgKFVMb25nKTE7CkBAIC05ODMsMjMgKzkxNiw2IEBACiAgICAgICAgIGJvcnJvdyA9IHkgPj4gMzIgJiAoVUxvbmcpMTsKICAgICAgICAgKnhjKysgPSAoVUxvbmcpKHkgJiBGRkZGRkZGRik7CiAgICAgfQotI2Vsc2UKLSAgICBkbyB7Ci0gICAgICAgIHkgPSAoKnhhICYgMHhmZmZmKSAtICgqeGIgJiAweGZmZmYpIC0gYm9ycm93OwotICAgICAgICBib3Jyb3cgPSAoeSAmIDB4MTAwMDApID4+IDE2OwotICAgICAgICB6ID0gKCp4YSsrID4+IDE2KSAtICgqeGIrKyA+PiAxNikgLSBib3Jyb3c7Ci0gICAgICAgIGJvcnJvdyA9ICh6ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgIFN0b3JlaW5jKHhjLCB6LCB5KTsKLSAgICB9Ci0gICAgd2hpbGUoeGIgPCB4YmUpOwotICAgIHdoaWxlKHhhIDwgeGFlKSB7Ci0gICAgICAgIHkgPSAoKnhhICYgMHhmZmZmKSAtIGJvcnJvdzsKLSAgICAgICAgYm9ycm93ID0gKHkgJiAweDEwMDAwKSA+PiAxNjsKLSAgICAgICAgeiA9ICgqeGErKyA+PiAxNikgLSBib3Jyb3c7Ci0gICAgICAgIGJvcnJvdyA9ICh6ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgIFN0b3JlaW5jKHhjLCB6LCB5KTsKLSAgICB9Ci0jZW5kaWYKICAgICB3aGlsZSghKi0teGMpCiAgICAgICAgIHdhLS07CiAgICAgYy0+d2RzID0gd2E7CkBAIC0xMjQ0LDEyICsxMTYwLDcgQEAKIHsKICAgICBpbnQgbjsKICAgICBVTG9uZyAqYngsICpieGUsIHEsICpzeCwgKnN4ZTsKLSNpZmRlZiBVTExvbmcKICAgICBVTExvbmcgYm9ycm93LCBjYXJyeSwgeSwgeXM7Ci0jZWxzZQotICAgIFVMb25nIGJvcnJvdywgY2FycnksIHksIHlzOwotICAgIFVMb25nIHNpLCB6LCB6czsKLSNlbmRpZgogCiAgICAgbiA9IFMtPndkczsKICNpZmRlZiBERUJVRwpAQCAtMTI3MSwyMyArMTE4MiwxMSBAQAogICAgICAgICBib3Jyb3cgPSAwOwogICAgICAgICBjYXJyeSA9IDA7CiAgICAgICAgIGRvIHsKLSNpZmRlZiBVTExvbmcKICAgICAgICAgICAgIHlzID0gKnN4KysgKiAoVUxMb25nKXEgKyBjYXJyeTsKICAgICAgICAgICAgIGNhcnJ5ID0geXMgPj4gMzI7CiAgICAgICAgICAgICB5ID0gKmJ4IC0gKHlzICYgRkZGRkZGRkYpIC0gYm9ycm93OwogICAgICAgICAgICAgYm9ycm93ID0geSA+PiAzMiAmIChVTG9uZykxOwogICAgICAgICAgICAgKmJ4KysgPSAoVUxvbmcpKHkgJiBGRkZGRkZGRik7Ci0jZWxzZQotICAgICAgICAgICAgc2kgPSAqc3grKzsKLSAgICAgICAgICAgIHlzID0gKHNpICYgMHhmZmZmKSAqIHEgKyBjYXJyeTsKLSAgICAgICAgICAgIHpzID0gKHNpID4+IDE2KSAqIHEgKyAoeXMgPj4gMTYpOwotICAgICAgICAgICAgY2FycnkgPSB6cyA+PiAxNjsKLSAgICAgICAgICAgIHkgPSAoKmJ4ICYgMHhmZmZmKSAtICh5cyAmIDB4ZmZmZikgLSBib3Jyb3c7Ci0gICAgICAgICAgICBib3Jyb3cgPSAoeSAmIDB4MTAwMDApID4+IDE2OwotICAgICAgICAgICAgeiA9ICgqYnggPj4gMTYpIC0gKHpzICYgMHhmZmZmKSAtIGJvcnJvdzsKLSAgICAgICAgICAgIGJvcnJvdyA9ICh6ICYgMHgxMDAwMCkgPj4gMTY7Ci0gICAgICAgICAgICBTdG9yZWluYyhieCwgeiwgeSk7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICB3aGlsZShzeCA8PSBzeGUpOwogICAgICAgICBpZiAoISpieGUpIHsKQEAgLTEzMDQsMjMgKzEyMDMsMTEgQEAKICAgICAgICAgYnggPSBiLT54OwogICAgICAgICBzeCA9IFMtPng7CiAgICAgICAgIGRvIHsKLSNpZmRlZiBVTExvbmcKICAgICAgICAgICAgIHlzID0gKnN4KysgKyBjYXJyeTsKICAgICAgICAgICAgIGNhcnJ5ID0geXMgPj4gMzI7CiAgICAgICAgICAgICB5ID0gKmJ4IC0gKHlzICYgRkZGRkZGRkYpIC0gYm9ycm93OwogICAgICAgICAgICAgYm9ycm93ID0geSA+PiAzMiAmIChVTG9uZykxOwogICAgICAgICAgICAgKmJ4KysgPSAoVUxvbmcpKHkgJiBGRkZGRkZGRik7Ci0jZWxzZQotICAgICAgICAgICAgc2kgPSAqc3grKzsKLSAgICAgICAgICAgIHlzID0gKHNpICYgMHhmZmZmKSArIGNhcnJ5OwotICAgICAgICAgICAgenMgPSAoc2kgPj4gMTYpICsgKHlzID4+IDE2KTsKLSAgICAgICAgICAgIGNhcnJ5ID0genMgPj4gMTY7Ci0gICAgICAgICAgICB5ID0gKCpieCAmIDB4ZmZmZikgLSAoeXMgJiAweGZmZmYpIC0gYm9ycm93OwotICAgICAgICAgICAgYm9ycm93ID0gKHkgJiAweDEwMDAwKSA+PiAxNjsKLSAgICAgICAgICAgIHogPSAoKmJ4ID4+IDE2KSAtICh6cyAmIDB4ZmZmZikgLSBib3Jyb3c7Ci0gICAgICAgICAgICBib3Jyb3cgPSAoeiAmIDB4MTAwMDApID4+IDE2OwotICAgICAgICAgICAgU3RvcmVpbmMoYngsIHosIHkpOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgd2hpbGUoc3ggPD0gc3hlKTsKICAgICAgICAgYnggPSBiLT54OwpAQCAtMjMxNSw3ICsyMjAyLDcgQEAKIH0KIAogc3RhdGljIGNoYXIgKgotbnJ2X2FsbG9jKGNoYXIgKnMsIGNoYXIgKipydmUsIGludCBuKQorbnJ2X2FsbG9jKGNvbnN0IGNoYXIgKnMsIGNoYXIgKipydmUsIGludCBuKQogewogICAgIGNoYXIgKnJ2LCAqdDsKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfd2luLmMgYi9QeXRob24vZHlubG9hZF93aW4uYwppbmRleCBmMmM3OTZlLi4wNTA1MGNmIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF93aW4uYworKysgYi9QeXRob24vZHlubG9hZF93aW4uYwpAQCAtMjQsMTIgKzI0LDEwIEBACiAjZGVmaW5lIFBZRF9ERUJVR19TVUZGSVggIiIKICNlbmRpZgogCi0jZGVmaW5lIFNUUklOR0laRTIoeCkgI3gKLSNkZWZpbmUgU1RSSU5HSVpFKHgpIFNUUklOR0laRTIoeCkKICNpZmRlZiBQWURfUExBVEZPUk1fVEFHCi0jZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgU1RSSU5HSVpFKFBZX01BSk9SX1ZFUlNJT04pIFNUUklOR0laRShQWV9NSU5PUl9WRVJTSU9OKSAiLSIgUFlEX1BMQVRGT1JNX1RBRyAiLnB5ZCIKKyNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pICItIiBQWURfUExBVEZPUk1fVEFHICIucHlkIgogI2Vsc2UKLSNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBTVFJJTkdJWkUoUFlfTUFKT1JfVkVSU0lPTikgU1RSSU5HSVpFKFBZX01JTk9SX1ZFUlNJT04pICIucHlkIgorI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFB5X1NUUklOR0lGWShQWV9NQUpPUl9WRVJTSU9OKSBQeV9TVFJJTkdJRlkoUFlfTUlOT1JfVkVSU0lPTikgIi5weWQiCiAjZW5kaWYKIAogI2RlZmluZSBQWURfVU5UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5weWQiCkBAIC00Myw3ICs0MSw3IEBACiAvKiBDYXNlIGluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlLCB0byBhdm9pZCBhbnkgZGVwZW5kZW5jaWVzIG9uIHBhcnRpY3VsYXIKICAgIEMgUlRMIGltcGxlbWVudGF0aW9ucyAqLwogCi1zdGF0aWMgaW50IHN0cmNhc2VjbXAgKGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpCitzdGF0aWMgaW50IHN0cmNhc2VjbXAgKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIpCiB7CiAgICAgaW50IGZpcnN0LCBzZWNvbmQ7CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9lcnJvcnMuYyBiL1B5dGhvbi9lcnJvcnMuYwppbmRleCBlMTUxY2FiLi5lNjI4NWU4IDEwMDY0NAotLS0gYS9QeXRob24vZXJyb3JzLmMKKysrIGIvUHl0aG9uL2Vycm9ycy5jCkBAIC01Miw2ICs1MiwyMCBAQAogICAgIFB5X1hERUNSRUYob2xkdHJhY2ViYWNrKTsKIH0KIAorc3RhdGljIFB5T2JqZWN0KgorX1B5RXJyX0NyZWF0ZUV4Y2VwdGlvbihQeU9iamVjdCAqZXhjZXB0aW9uLCBQeU9iamVjdCAqdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0NhbGxOb0FyZyhleGNlcHRpb24pOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbChleGNlcHRpb24sIHZhbHVlLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbEFyZzEoZXhjZXB0aW9uLCB2YWx1ZSk7CisgICAgfQorfQorCiB2b2lkCiBQeUVycl9TZXRPYmplY3QoUHlPYmplY3QgKmV4Y2VwdGlvbiwgUHlPYmplY3QgKnZhbHVlKQogewpAQCAtNjYsNiArODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwogICAgIGV4Y192YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwogICAgIGlmIChleGNfdmFsdWUgIT0gTlVMTCAmJiBleGNfdmFsdWUgIT0gUHlfTm9uZSkgewpAQCAtNzMsMjggKzg4LDIxIEBACiAgICAgICAgIFB5X0lOQ1JFRihleGNfdmFsdWUpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh2YWx1ZSkpIHsKICAgICAgICAgICAgIC8qIFdlIG11c3Qgbm9ybWFsaXplIHRoZSB2YWx1ZSByaWdodCBub3cgKi8KLSAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqZml4ZWRfdmFsdWU7CisgICAgICAgICAgICBQeU9iamVjdCAqZml4ZWRfdmFsdWU7CiAKLSAgICAgICAgICAgIC8qIElzc3VlICMyMzU3MTogUHlFdmFsX0NhbGxPYmplY3QoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbgorICAgICAgICAgICAgLyogSXNzdWUgIzIzNTcxOiBmdW5jdGlvbnMgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4KICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBzZXQgKi8KICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8IHZhbHVlID09IFB5X05vbmUpCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICAgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICAgICAgICAgIGFyZ3MgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKLSAgICAgICAgICAgIGZpeGVkX3ZhbHVlID0gYXJncyA/Ci0gICAgICAgICAgICAgICAgUHlFdmFsX0NhbGxPYmplY3QoZXhjZXB0aW9uLCBhcmdzKSA6IE5VTEw7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgZml4ZWRfdmFsdWUgPSBfUHlFcnJfQ3JlYXRlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgdmFsdWUpOwogICAgICAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoZml4ZWRfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGlmIChmaXhlZF92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB2YWx1ZSA9IGZpeGVkX3ZhbHVlOwogICAgICAgICB9CisKICAgICAgICAgLyogQXZvaWQgcmVmZXJlbmNlIGN5Y2xlcyB0aHJvdWdoIHRoZSBjb250ZXh0IGNoYWluLgogICAgICAgICAgICBUaGlzIGlzIE8oY2hhaW4gbGVuZ3RoKSBidXQgY29udGV4dCBjaGFpbnMgYXJlCiAgICAgICAgICAgIHVzdWFsbHkgdmVyeSBzaG9ydC4gU2Vuc2l0aXZlIHJlYWRlcnMgbWF5IHRyeQpAQCAtMTEwLDcgKzExOCw4IEBACiAgICAgICAgICAgICAgICAgbyA9IGNvbnRleHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0KHZhbHVlLCBleGNfdmFsdWUpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUHlfREVDUkVGKGV4Y192YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTgsMjUgKzI2NywxNSBAQAogICAgICAgICAgICBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICAgaWYgKCFpbmNsYXNzIHx8ICFpc19zdWJjbGFzcykgewotICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgICAgICAgICBQeU9iamVjdCAqZml4ZWRfdmFsdWU7CiAKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBhcmdzID0gdmFsdWU7CisgICAgICAgICAgICBmaXhlZF92YWx1ZSA9IF9QeUVycl9DcmVhdGVFeGNlcHRpb24odHlwZSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKGZpeGVkX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7CiAKLSAgICAgICAgICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QodHlwZSwgYXJncyk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKLSAgICAgICAgICAgIHZhbHVlID0gcmVzOworICAgICAgICAgICAgdmFsdWUgPSBmaXhlZF92YWx1ZTsKICAgICAgICAgfQogICAgICAgICAvKiBpZiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhhY3RseSBtYXRjaCB0aGUKICAgICAgICAgICAgY2xhc3Mgb2YgdGhlIHR5cGUsIGJlbGlldmUgdGhlIGluc3RhbmNlCkBAIC03MDAsMTggKzY5OSwxNCBAQAogUHlPYmplY3QgKgogUHlFcnJfU2V0SW1wb3J0RXJyb3IoUHlPYmplY3QgKm1zZywgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICpwYXRoKQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqa3dhcmdzLCAqZXJyb3I7CisgICAgUHlPYmplY3QgKmt3YXJncywgKmVycm9yOwogCi0gICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIGlmIChtc2cgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBrd2FyZ3MgPSBQeURpY3RfTmV3KCk7CiAgICAgaWYgKGt3YXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MjMsMjIgKzcxOCwyMCBAQAogICAgICAgICBwYXRoID0gUHlfTm9uZTsKICAgICB9CiAKLSAgICBQeV9JTkNSRUYobXNnKTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIG1zZyk7Ci0KLSAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoa3dhcmdzLCAibmFtZSIsIG5hbWUpIDwgMCkKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoa3dhcmdzLCAibmFtZSIsIG5hbWUpIDwgMCkgewogICAgICAgICBnb3RvIGRvbmU7Ci0gICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGt3YXJncywgInBhdGgiLCBwYXRoKSA8IDApCisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhrd2FyZ3MsICJwYXRoIiwgcGF0aCkgPCAwKSB7CiAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLSAgICBlcnJvciA9IFB5T2JqZWN0X0NhbGwoUHlFeGNfSW1wb3J0RXJyb3IsIGFyZ3MsIGt3YXJncyk7CisgICAgZXJyb3IgPSBfUHlPYmplY3RfRmFzdENhbGxEaWN0KFB5RXhjX0ltcG9ydEVycm9yLCAmbXNnLCAxLCBrd2FyZ3MpOwogICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldE9iamVjdCgoUHlPYmplY3QgKilQeV9UWVBFKGVycm9yKSwgZXJyb3IpOwogICAgICAgICBQeV9ERUNSRUYoZXJyb3IpOwogICAgIH0KIAogZG9uZToKLSAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgUHlfREVDUkVGKGt3YXJncyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZmlsZXV0aWxzLmMgYi9QeXRob24vZmlsZXV0aWxzLmMKaW5kZXggMjNlZWQ3MS4uMDY1MzFkOSAxMDA2NDQKLS0tIGEvUHl0aG9uL2ZpbGV1dGlscy5jCisrKyBiL1B5dGhvbi9maWxldXRpbHMuYwpAQCAtNjgzLDYgKzY4MywxMCBAQAogewogICAgIGludCByZXM7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgcmVzID0gX1B5X2ZzdGF0X25vcmFpc2UoZmQsIHN0YXR1cyk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKQEAgLTc5NCw3ICs3OTgsNyBAQAogICAgIGludCByZXF1ZXN0OwogICAgIGludCBlcnI7CiAjZW5kaWYKLSAgICBpbnQgZmxhZ3M7CisgICAgaW50IGZsYWdzLCBuZXdfZmxhZ3M7CiAgICAgaW50IHJlczsKICNlbmRpZgogCkBAIC04ODUsMTAgKzg4OSwxOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGluaGVyaXRhYmxlKQotICAgICAgICBmbGFncyAmPSB+RkRfQ0xPRVhFQzsKLSAgICBlbHNlCi0gICAgICAgIGZsYWdzIHw9IEZEX0NMT0VYRUM7CisgICAgaWYgKGluaGVyaXRhYmxlKSB7CisgICAgICAgIG5ld19mbGFncyA9IGZsYWdzICYgfkZEX0NMT0VYRUM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdfZmxhZ3MgPSBmbGFncyB8IEZEX0NMT0VYRUM7CisgICAgfQorCisgICAgaWYgKG5ld19mbGFncyA9PSBmbGFncykgeworICAgICAgICAvKiBGRF9DTE9FWEVDIGZsYWcgYWxyZWFkeSBzZXQvY2xlYXJlZDogbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICByZXMgPSBmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MpOwogICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIGlmIChyYWlzZSkKQEAgLTExNjksNiArMTE4MSwxMCBAQAogICAgIGludCBlcnI7CiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICAvKiBfUHlfcmVhZCgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQsIG90aGVyd2lzZSB0aGUKICAgICAgKiBjYWxsZXIgbWF5IHRoaW5rIHRoYXQgcmVhZCgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KQEAgLTEzMjQsNiArMTM0MCwxMCBAQAogUHlfc3NpemVfdAogX1B5X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCiB7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgLyogX1B5X3dyaXRlKCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwgb3RoZXJ3aXNlIHRoZQogICAgICAqIGNhbGxlciBtYXkgdGhpbmsgdGhhdCB3cml0ZSgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KQEAgLTE0NzMsNiArMTQ5MywxMCBAQAogICAgIERXT1JEIGZ0eXBlOwogI2VuZGlmCiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCmluZGV4IDhlOWM1MDIuLmRiOWY1YjggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCisrKyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCkBAIC00OCwxNiArNDgsMTcgQEAKICAgICByZXR1cm5zIC0xIG9uIGVycm9yLgogKi8KIHN0YXRpYyBpbnQKLWdldF9pbnRlZ2VyKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKnBvcywgUHlfc3NpemVfdCBlbmQsCitnZXRfaW50ZWdlcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpwcG9zLCBQeV9zc2l6ZV90IGVuZCwKICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnJlc3VsdCkKIHsKLSAgICBQeV9zc2l6ZV90IGFjY3VtdWxhdG9yLCBkaWdpdHZhbDsKKyAgICBQeV9zc2l6ZV90IGFjY3VtdWxhdG9yLCBkaWdpdHZhbCwgcG9zID0gKnBwb3M7CiAgICAgaW50IG51bWRpZ2l0czsKKyAgICBpbnQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKICAgICBhY2N1bXVsYXRvciA9IG51bWRpZ2l0cyA9IDA7Ci0gICAgZm9yICg7OygqcG9zKSsrLCBudW1kaWdpdHMrKykgewotICAgICAgICBpZiAoKnBvcyA+PSBlbmQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGlnaXR2YWwgPSBQeV9VTklDT0RFX1RPREVDSU1BTChQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKnBvcykpOworICAgIGZvciAoOyBwb3MgPCBlbmQ7IHBvcysrLCBudW1kaWdpdHMrKykgeworICAgICAgICBkaWdpdHZhbCA9IFB5X1VOSUNPREVfVE9ERUNJTUFMKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcykpOwogICAgICAgICBpZiAoZGlnaXR2YWwgPCAwKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8qCkBAIC02OSwxMCArNzAsMTIgQEAKICAgICAgICAgaWYgKGFjY3VtdWxhdG9yID4gKFBZX1NTSVpFX1RfTUFYIC0gZGlnaXR2YWwpIC8gMTApIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJUb28gbWFueSBkZWNpbWFsIGRpZ2l0cyBpbiBmb3JtYXQgc3RyaW5nIik7CisgICAgICAgICAgICAqcHBvcyA9IHBvczsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogMTAgKyBkaWdpdHZhbDsKICAgICB9CisgICAgKnBwb3MgPSBwb3M7CiAgICAgKnJlc3VsdCA9IGFjY3VtdWxhdG9yOwogICAgIHJldHVybiBudW1kaWdpdHM7CiB9CkBAIC0xMTgsNyArMTIxLDcgQEAKIH0gSW50ZXJuYWxGb3JtYXRTcGVjOwogCiAjaWYgMAotLyogT2NjYXNzaW9uYWxseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gU2hvdWxkIG5vcm1hbGx5IGJlIGNvbW1lbnRlZCBvdXQuICovCisvKiBPY2Nhc2lvbmFsbHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuIFNob3VsZCBub3JtYWxseSBiZSBjb21tZW50ZWQgb3V0LiAqLwogc3RhdGljIHZvaWQKIERFQlVHX1BSSU5UX0ZPUk1BVF9TUEVDKEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0KQogewpAQCAtMTUwLDkgKzE1MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGVmYXVsdF9hbGlnbikKIHsKICAgICBQeV9zc2l6ZV90IHBvcyA9IHN0YXJ0OworICAgIGludCBraW5kID0gUHlVbmljb2RlX0tJTkQoZm9ybWF0X3NwZWMpOworICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShmb3JtYXRfc3BlYyk7CiAgICAgLyogZW5kLXBvcyBpcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBjb2RlIHRvIHNwZWNpZnkgdGhlIGxlbmd0aCBvZgogICAgICAgIHRoZSBpbnB1dCBzdHJpbmcgKi8KLSNkZWZpbmUgUkVBRF9zcGVjKGluZGV4KSBQeVVuaWNvZGVfUkVBRF9DSEFSKGZvcm1hdF9zcGVjLCBpbmRleCkKKyNkZWZpbmUgUkVBRF9zcGVjKGluZGV4KSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpbmRleCkKIAogICAgIFB5X3NzaXplX3QgY29uc3VtZWQ7CiAgICAgaW50IGFsaWduX3NwZWNpZmllZCA9IDA7CkBAIC00MDIsMTMgKzQwNywxNSBAQAogICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5fcmVtYWluZGVyLCBpbnQgKmhhc19kZWNpbWFsKQogewogICAgIFB5X3NzaXplX3QgcmVtYWluZGVyOworICAgIGludCBraW5kID0gUHlVbmljb2RlX0tJTkQocyk7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHMpOwogCi0gICAgd2hpbGUgKHBvczxlbmQgJiYgUHlfSVNESUdJVChQeVVuaWNvZGVfUkVBRF9DSEFSKHMsIHBvcykpKQorICAgIHdoaWxlIChwb3M8ZW5kICYmIFB5X0lTRElHSVQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKSkpCiAgICAgICAgICsrcG9zOwogICAgIHJlbWFpbmRlciA9IHBvczsKIAogICAgIC8qIERvZXMgcmVtYWluZGVyIHN0YXJ0IHdpdGggYSBkZWNpbWFsIHBvaW50PyAqLwotICAgICpoYXNfZGVjaW1hbCA9IHBvczxlbmQgJiYgUHlVbmljb2RlX1JFQURfQ0hBUihzLCByZW1haW5kZXIpID09ICcuJzsKKyAgICAqaGFzX2RlY2ltYWwgPSBwb3M8ZW5kICYmIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHJlbWFpbmRlcikgPT0gJy4nOwogCiAgICAgLyogU2tpcCB0aGUgZGVjaW1hbCBwb2ludC4gKi8KICAgICBpZiAoKmhhc19kZWNpbWFsKQpAQCAtNjU2LDcgKzY2Myw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKK3N0YXRpYyBjb25zdCBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKIAogLyogRmluZCB0aGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIocz8pLCB0aG91c2FuZHNfc2VwYXJhdG9yKHM/KSwgYW5kCiAgICBncm91cGluZyBkZXNjcmlwdGlvbiwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBsb2NhbGUgaWYgdHlwZSBpcwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbi5jIGIvUHl0aG9uL2Zyb3plbi5jCmluZGV4IDY3NmYzOTUuLjdlMDRmM2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW4uYworKysgYi9QeXRob24vZnJvemVuLmMKQEAgLTE0LDE3ICsxNCwxNSBAQAogICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGZyb20gTV9fX21haW5fXy5jLiAqLwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBNX19faGVsbG9fX1tdID0gewotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwLDAsMCwwLDEwMCwyLDAsOTAsMSwwLAotICAgIDEwMSwyLDAsMTAwLDAsMCwxMzEsMSwwLDEsMTAwLDEsMCw4Myw0MCwzLAotICAgIDAsMCwwLDExNywxMiwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LDExMSwKLSAgICAxMTQsMTA4LDEwMCwzMyw3OCw4NCw0MCwzLDAsMCwwLDExNyw0LDAsMCwwLAotICAgIDg0LDExNCwxMTcsMTAxLDExNywxMSwwLDAsMCwxMDUsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwKLSAgICAxMDUsMTIyLDEwMSwxMDAsMTE3LDUsMCwwLDAsMTEyLDExNCwxMDUsMTEwLDExNiw0MCwwLAotICAgIDAsMCwwLDQwLDAsMCwwLDAsNDAsMCwwLDAsMCwxMTcsNywwLAotICAgIDAsMCwxMDIsMTA4LDk3LDEwMyw0NiwxMTIsMTIxLDExNyw4LDAsMCwwLDYwLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDYyLDEsMCwwLDAsMTE1LDIsMCwwLDAsNiwKLSAgICAxLAorICAgIDIyNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMCw5MCwwLDEwMSwxLAorICAgIDEwMCwxLDEzMSwxLDEsMCwxMDAsMiw4MywwLDQxLDMsODQsMTIyLDEyLDcyLAorICAgIDEwMSwxMDgsMTA4LDExMSwzMiwxMTksMTExLDExNCwxMDgsMTAwLDMzLDc4LDQxLDIsMjE4LDExLAorICAgIDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwyMTgsNSwxMTIsMTE0LDEwNSwKKyAgICAxMTAsMTE2LDE2OSwwLDExNCwzLDAsMCwwLDExNCwzLDAsMCwwLDI1MCwyMiwKKyAgICA0Niw0Nyw4NCwxMTEsMTExLDEwOCwxMTUsNDcsMTAyLDExNCwxMDEsMTAxLDEyMiwxMDEsNDcsMTAyLAorICAgIDEwOCw5NywxMDMsNDYsMTEyLDEyMSwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2MiwKKyAgICAxLDAsMCwwLDExNSwyLDAsMCwwLDQsMSwKIH07CiAKICNkZWZpbmUgU0laRSAoaW50KXNpemVvZihNX19faGVsbG9fXykKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW5tYWluLmMgYi9QeXRob24vZnJvemVubWFpbi5jCmluZGV4IGRlOGJkMzUuLjc2OWIzM2QgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW5tYWluLmMKKysrIGIvUHl0aG9uL2Zyb3plbm1haW4uYwpAQCAtOTksNyArOTksOSBAQAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeVdpbkZyZWV6ZV9FeGVUZXJtKCk7CiAjZW5kaWYKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHN0cyA9IDEyMDsKKyAgICB9CiAKIGVycm9yOgogICAgIFB5TWVtX1Jhd0ZyZWUoYXJndl9jb3B5KTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCAxNjNmODdmLi43NWYyMTA3IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC03OSw3ICs3OSwxMCBAQAogCiAgICAgaSA9IDA7CiAgICAgZmlyc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKLSAgICBpZiAoZmlyc3QtPmtpbmQgPT0gRXhwcl9raW5kICYmIGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCisgICAgaWYgKGZpcnN0LT5raW5kID09IEV4cHJfa2luZAorICAgICAgICAmJiAoZmlyc3QtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZAorICAgICAgICAgICAgfHwgKGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZAorICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGZpcnN0LT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpKSkpCiAgICAgICAgIGkrKzsKIAogCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCA4YWFiMDY3Li4wODU0Y2M0IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTE4LDE2ICsxOCwyNiBAQAogaW50IFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CiAKK2ludCBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqLCAuLi4pOworaW50IF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3QoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7CisKICNpZmRlZiBIQVZFX0RFQ0xTUEVDX0RMTAogLyogRXhwb3J0IGZ1bmN0aW9ucyAqLwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIC4uLik7Ci1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCAuLi4pOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlfQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICosIC4uLik7Ci1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCB2YV9saXN0KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwogUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc0Zhc3RfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKiwgdmFfbGlzdCk7CiAjZW5kaWYKIAogI2RlZmluZSBGTEFHX0NPTVBBVCAxCkBAIC01NiwxOCArNjYsMjAgQEAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBpbnQgdmdldGFyZ3MxKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgc2V0ZXJyb3IoUHlfc3NpemVfdCwgY29uc3QgY2hhciAqLCBpbnQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGNoYXIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNoYXIgKiopOwotc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNoYXIqKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnR0dXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIGZyZWVsaXN0X3QgKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydHNpbXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIFB5X3NzaXplX3QgY29udmVydGJ1ZmZlcihQeU9iamVjdCAqLCB2b2lkICoqcCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgaW50IGdldGJ1ZmZlcihQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgY29uc3QgY2hhcioqKTsKIAogc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqc2tpcGl0ZW0oY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOworc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzZmFzdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICosIHZhX2xpc3QgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpza2lwaXRlbShjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiAKIGludAogUHlBcmdfUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtODIsNyArOTQsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCitfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEwNyw3ICsxMTksNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICBpbnQgcmV0dmFsOwogICAgIHZhX2xpc3QgdmE7CkBAIC0xMzAsNyArMTQyLDcgQEAKIH0KIAogaW50Ci1fUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQorX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKICAgICB2YV9saXN0IGx2YTsKIApAQCAtMjA4LDcgKzIyMCw3IEBACiAgICAgaW50IGVuZGZtdCA9IDA7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOwogICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CiAgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKQEAgLTM5NCw3ICs0MDYsMTIgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwogICAgICAgICBtZXNzYWdlID0gYnVmOwogICAgIH0KLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAobXNnWzBdID09ICcoJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsIG1lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgfQogfQogCiAKQEAgLTQxNiw3ICs0MzMsNyBAQAogICAgICAgYW5kIG1zZ2J1ZiBpcyByZXR1cm5lZC4KICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnR0dXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICBpbnQgKmxldmVscywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IHRvcGxldmVsLAogICAgICAgICAgICAgIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQpAQCAtNDc0LDcgKzQ5MSw3IEBACiAKICAgICBmb3JtYXQgPSAqcF9mb3JtYXQ7CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBjaGFyICptc2c7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewpAQCAtNTAxLDExICs1MTgsMTEgQEAKIAogLyogQ29udmVydCBhIHNpbmdsZSBpdGVtLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKIAogICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKQEAgLTUzMCw3ICs1NDcsNyBAQAogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewogICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKQEAgLTU3Miw3ICs1ODksNyBAQAogICAgV2hlbiB5b3UgYWRkIG5ldyBmb3JtYXQgY29kZXMsIHBsZWFzZSBkb24ndCBmb3JnZXQgcG9vciBza2lwaXRlbSgpIGJlbG93LgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCiB7CkBAIC03NTIsMTQgKzc2OSwxMyBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGNhc2UgJ0wnOiB7LyogUFlfTE9OR19MT05HICovCi0gICAgICAgIFBZX0xPTkdfTE9ORyAqcCA9IHZhX2FyZyggKnBfdmEsIFBZX0xPTkdfTE9ORyAqICk7Ci0gICAgICAgIFBZX0xPTkdfTE9ORyBpdmFsOworICAgIGNhc2UgJ0wnOiB7LyogbG9uZyBsb25nICovCisgICAgICAgIGxvbmcgbG9uZyAqcCA9IHZhX2FyZyggKnBfdmEsIGxvbmcgbG9uZyAqICk7CisgICAgICAgIGxvbmcgbG9uZyBpdmFsOwogICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKICAgICAgICAgICAgIFJFVFVSTl9FUlJfT0NDVVJSRUQ7CiAgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhhcmcpOwotICAgICAgICBpZiAoaXZhbCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGlmIChpdmFsID09IChsb25nIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIFJFVFVSTl9FUlJfT0NDVVJSRUQ7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICpwID0gaXZhbDsKQEAgLTc2Nyw4ICs3ODMsOCBAQAogICAgIH0KIAogICAgIGNhc2UgJ0snOiB7IC8qIGxvbmcgbG9uZyBzaXplZCBiaXRmaWVsZCAqLwotICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKTsKLSAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyBsb25nICopOworICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaXZhbDsKICAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKQogICAgICAgICAgICAgaXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKGFyZyk7CiAgICAgICAgIGVsc2UKQEAgLTc3Niw3ICs3OTIsNiBAQAogICAgICAgICAqcCA9IGl2YWw7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSNlbmRpZgogCiAgICAgY2FzZSAnZic6IHsvKiBmbG9hdCAqLwogICAgICAgICBmbG9hdCAqcCA9IHZhX2FyZygqcF92YSwgZmxvYXQgKik7CkBAIC04NTcsNyArODcyLDcgQEAKIAogICAgIGNhc2UgJ3knOiB7LyogYW55IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLSAgICAgICAgY2hhciAqYnVmOworICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CiAgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgewogICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsICZidWYpIDwgMCkKQEAgLTkwNCw3ICs5MTksNyBAQAogICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywgc2FyZywgbGVuLCAxLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICAgICAgfQpAQCAtOTM0LDcgKzk0OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsgLyogcmVhZC1vbmx5IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgICAgICAgICAgLyogWFhYIFJlYWxseT8gKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CkBAIC0xMDUxLDM1ICsxMDY2LDI1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihBc0NoYXJCdWZmZXIgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnU7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLSAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKLSAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLwotICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgIHMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7CiAgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAotICAgICAgICAgICAgICAgICAgICAiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhzKSk7CiAgICAgICAgICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShzKTsKICAgICAgICAgICAgIHB0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHMpOwogICAgICAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHB0ciA9ICIiOwogICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPyAic3RyIiA6ICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLyogV3JpdGUgb3V0cHV0OyBvdXRwdXQgaXMgZ3VhcmFudGVlZCB0byBiZSAwLXRlcm1pbmF0ZWQgKi8KICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CkBAIC0xMTI5LDcgKzExMzQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSArIDEgPiBCVUZGRVJfTEVOKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCBzdHJpbmcgdG9vIGxvbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3Qpc2l6ZSwgKFB5X3NzaXplX3QpKEJVRkZFUl9MRU4tMSkpOwpAQCAtMTI4Myw3ICsxMjg4LDcgQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLWNvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNoYXIgKiplcnJtc2cpCitjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gUHlfVFlQRShhcmcpLT50cF9hc19idWZmZXI7CiAgICAgUHlfc3NpemVfdCBjb3VudDsKQEAgLTEzMDUsNyArMTMxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldGJ1ZmZlcihQeU9iamVjdCAqYXJnLCBQeV9idWZmZXIgKnZpZXcsIGNoYXIgKiplcnJtc2cpCitnZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCB2aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApIHsKICAgICAgICAgKmVycm1zZyA9ICJieXRlcy1saWtlIG9iamVjdCI7CkBAIC0xNDIzLDYgKzE0MjgsOTEgQEAKIH0KIAogaW50CitfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIC4uLikKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICBpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKKyAgICAgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8CisgICAgICAgIHBhcnNlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhX3N0YXJ0KHZhLCBwYXJzZXIpOworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZ2YSwgMCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKK19QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0X1NpemVUKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF9QeUFyZ19QYXJzZXIgKnBhcnNlciwgLi4uKQoreworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCB2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmFfc3RhcnQodmEsIHBhcnNlcik7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3Jkc2Zhc3QoYXJncywga2V5d29yZHMsIHBhcnNlciwgJnZhLCBGTEFHX1NJWkVfVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKK2ludAorX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIHZhX2xpc3QgdmEpCit7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKKworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZsdmEsIDApOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK2ludAorX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzRmFzdF9TaXplVChQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsIHZhX2xpc3QgdmEpCit7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IGx2YTsKKworICAgIGlmICgoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB8fAorICAgICAgICAoa2V5d29yZHMgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXdvcmRzKSkgfHwKKyAgICAgICAgcGFyc2VyID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKKworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHNmYXN0KGFyZ3MsIGtleXdvcmRzLCBwYXJzZXIsICZsdmEsIEZMQUdfU0laRV9UKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQKIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cyhQeU9iamVjdCAqa3dhcmdzKQogewogICAgIGlmICghUHlEaWN0X0NoZWNrKGt3YXJncykpIHsKQEAgLTE0NDgsNyArMTUzOCw4IEBACiAgICAgY29uc3QgY2hhciAqZm5hbWUsICptc2csICpjdXN0b21fbXNnLCAqa2V5d29yZDsKICAgICBpbnQgbWluID0gSU5UX01BWDsKICAgICBpbnQgbWF4ID0gSU5UX01BWDsKLSAgICBpbnQgaSwgbGVuOworICAgIGludCBpLCBwb3MsIGxlbjsKKyAgICBpbnQgc2tpcCA9IDA7CiAgICAgUHlfc3NpemVfdCBuYXJncywgbmtleXdvcmRzOwogICAgIFB5T2JqZWN0ICpjdXJyZW50X2FyZzsKICAgICBmcmVlbGlzdGVudHJ5X3Qgc3RhdGljX2VudHJpZXNbU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVNdOwpAQCAtMTQ3Niw5ICsxNTY3LDE3IEBACiAgICAgICAgICAgICBjdXN0b21fbXNnKys7CiAgICAgfQogCisgICAgLyogc2NhbiBrd2xpc3QgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgKi8KKyAgICBmb3IgKHBvcyA9IDA7IGt3bGlzdFtwb3NdICYmICEqa3dsaXN0W3Bvc107IHBvcysrKSB7CisgICAgfQogICAgIC8qIHNjYW4ga3dsaXN0IGFuZCBnZXQgZ3JlYXRlc3QgcG9zc2libGUgbmJyIG9mIGFyZ3MgKi8KLSAgICBmb3IgKGxlbj0wOyBrd2xpc3RbbGVuXTsgbGVuKyspCi0gICAgICAgIGNvbnRpbnVlOworICAgIGZvciAobGVuID0gcG9zOyBrd2xpc3RbbGVuXTsgbGVuKyspIHsKKyAgICAgICAgaWYgKCEqa3dsaXN0W2xlbl0pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkga2V5d29yZCBwYXJhbWV0ZXIgbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAobGVuID4gU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVMpIHsKICAgICAgICAgZnJlZWxpc3QuZW50cmllcyA9IFB5TWVtX05FVyhmcmVlbGlzdGVudHJ5X3QsIGxlbik7CkBAIC0xNTA3LDcgKzE2MDYsNyBAQAogICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOwogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKICAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICh8IHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MTYsMTQgKzE2MTUsMTQgQEAKICAgICAgICAgICAgIGZvcm1hdCsrOwogCiAgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAoJCBiZWZvcmUgfCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJCcpIHsKICAgICAgICAgICAgIGlmIChtYXggIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICgkIHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MzEsNiArMTYzMCwxNyBAQAogICAgICAgICAgICAgbWF4ID0gaTsKICAgICAgICAgICAgIGZvcm1hdCsrOwogCisgICAgICAgICAgICBpZiAobWF4IDwgcG9zKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgcGFyYW1ldGVyIG5hbWUgYWZ0ZXIgJCIpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICAvKiBOb3cgd2Uga25vdyB0aGUgbWluaW1hbCBhbmQgdGhlIG1heGltYWwgbnVtYmVycyBvZgorICAgICAgICAgICAgICAgICAqIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCBjYW4gcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGl2ZSBtZXNzYWdlIChzZWUgYmVsb3cpLiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1heCA8IG5hcmdzKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzICVzICVkIHBvc2l0aW9uYWwgYXJndW1lbnRzIgpAQCAtMTU0MSw2NiArMTY1MSw5MCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIGtleXdvcmQgbGlzdCBlbnRyaWVzICglZCkgdGhhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOwogICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgIH0KLSAgICAgICAgY3VycmVudF9hcmcgPSBOVUxMOwotICAgICAgICBpZiAobmtleXdvcmRzKSB7Ci0gICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKLSAgICAgICAgICAgIC0tbmtleXdvcmRzOwotICAgICAgICAgICAgaWYgKGkgPCBuYXJncykgewotICAgICAgICAgICAgICAgIC8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCi0gICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGdpdmVuIGJ5IG5hbWUgKCclcycpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgaWYgKCFza2lwKSB7CisgICAgICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7CisgICAgICAgICAgICBpZiAobmtleXdvcmRzICYmIGkgPj0gcG9zKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrZXl3b3Jkcywga2V5d29yZCk7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50X2FyZyAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgICAgIC0tbmtleXdvcmRzOworICAgICAgICAgICAgICAgIGlmIChpIDwgbmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXJnIHByZXNlbnQgaW4gdHVwbGUgYW5kIGluIGRpY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJXMnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHBvc2l0aW9uICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBsZXZlbHMsIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IHBvcykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKG1pbiA9PSBJTlRfTUFYKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChtYXggPT0gSU5UX01BWCk7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBBdCB0aGF0IG1vbWVudCB3ZSBzdGlsbCBkb24ndCBrbm93IHRoZSBtaW5pbWFsIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbWF4aW1hbCBudW1iZXJzIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgUmFpc2luZworICAgICAgICAgICAgICAgICAgICAgKiBhbiBleGNlcHRpb24gaXMgZGVmZXJyZWQgdW50aWwgd2UgZW5jb3VudGVyIHwgYW5kICQKKyAgICAgICAgICAgICAgICAgICAgICogb3IgdGhlIGVuZCBvZiB0aGUgZm9ybWF0LiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCisgICAgICAgICAgICAgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKKyAgICAgICAgICAgICAqIHZhbGlkYXRpb24uIFhYWCBNYXliZSBza2lwIHRoaXMgaW4gZGVidWcgYnVpbGQgPworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW5rZXl3b3JkcyAmJiAhc2tpcCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigxLCAmZnJlZWxpc3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5rZXl3b3JkcyAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7Ci0gICAgICAgIGVsc2UgaWYgKGkgPCBuYXJncykKLSAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQotICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKLSAgICAgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKGN1cnJlbnRfYXJnLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywKLSAgICAgICAgICAgICAgICBsZXZlbHMsIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7Ci0gICAgICAgICAgICBpZiAobXNnKSB7Ci0gICAgICAgICAgICAgICAgc2V0ZXJyb3IoaSsxLCBtc2csIGxldmVscywgZm5hbWUsIGN1c3RvbV9tc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IG1pbikgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAocG9zICVkKSBub3QgZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7Ci0gICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKLSAgICAgICAgfQotICAgICAgICAvKiBjdXJyZW50IGNvZGUgcmVwb3J0cyBzdWNjZXNzIHdoZW4gYWxsIHJlcXVpcmVkIGFyZ3MKLSAgICAgICAgICogZnVsZmlsbGVkIGFuZCBubyBrZXl3b3JkIGFyZ3MgbGVmdCwgd2l0aCBubyBmdXJ0aGVyCi0gICAgICAgICAqIHZhbGlkYXRpb24uIFhYWCBNYXliZSBza2lwIHRoaXMgaW4gZGVidWcgYnVpbGQgPwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFua2V5d29yZHMpCi0gICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgJmZyZWVsaXN0KTsKIAogICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZwogICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KICAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOwogICAgICAgICBpZiAobXNnKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICIlczogJyVzJyIsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2tpcCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzICVzICVkIHBvc2l0aW9uYWwgYXJndW1lbnRzIgorICAgICAgICAgICAgICAgICAgICAgIiAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9NSU4ocG9zLCBtaW4pIDwgaSkgPyAiYXQgbGVhc3QiIDogImV4YWN0bHkiLAorICAgICAgICAgICAgICAgICAgICAgUHlfTUlOKHBvcywgbWluKSwgbmFyZ3MpOworICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICB9CisKICAgICBpZiAoIUlTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkgJiYgKCpmb3JtYXQgIT0gJ3wnKSAmJiAoKmZvcm1hdCAhPSAnJCcpKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICJtb3JlIGFyZ3VtZW50IHNwZWNpZmllcnMgdGhhbiBrZXl3b3JkIGxpc3QgZW50cmllcyAiCiAgICAgICAgICAgICAiKHJlbWFpbmluZyBmb3JtYXQ6JyVzJykiLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKQEAgLTE2MTgsNyArMTc1Miw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKGtleSwga3dsaXN0W2ldKSkgeworICAgICAgICAgICAgICAgIGlmICgqa3dsaXN0W2ldICYmICFQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhrZXksIGt3bGlzdFtpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xNjM3LDcgKzE3NzEsMzAxIEBACiB9CiAKIAotc3RhdGljIGNoYXIgKgorLyogTGlzdCBvZiBzdGF0aWMgcGFyc2Vycy4gKi8KK3N0YXRpYyBzdHJ1Y3QgX1B5QXJnX1BhcnNlciAqc3RhdGljX2FyZ19wYXJzZXJzID0gTlVMTDsKKworc3RhdGljIGludAorcGFyc2VyX2luaXQoc3RydWN0IF9QeUFyZ19QYXJzZXIgKnBhcnNlcikKK3sKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXdvcmRzOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgKm1zZzsKKyAgICBpbnQgaSwgbGVuLCBtaW4sIG1heCwgbmt3OworICAgIFB5T2JqZWN0ICprd3R1cGxlOworCisgICAgYXNzZXJ0KHBhcnNlci0+Zm9ybWF0ICE9IE5VTEwpOworICAgIGFzc2VydChwYXJzZXItPmtleXdvcmRzICE9IE5VTEwpOworICAgIGlmIChwYXJzZXItPmt3dHVwbGUgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBncmFiIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGN1c3RvbSBlcnJvciBtc2cgZmlyc3QgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKi8KKyAgICBwYXJzZXItPmZuYW1lID0gc3RyY2hyKHBhcnNlci0+Zm9ybWF0LCAnOicpOworICAgIGlmIChwYXJzZXItPmZuYW1lKSB7CisgICAgICAgIHBhcnNlci0+Zm5hbWUrKzsKKyAgICAgICAgcGFyc2VyLT5jdXN0b21fbXNnID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhcnNlci0+Y3VzdG9tX21zZyA9IHN0cmNocihwYXJzZXItPmZvcm1hdCwnOycpOworICAgICAgICBpZiAocGFyc2VyLT5jdXN0b21fbXNnKQorICAgICAgICAgICAgcGFyc2VyLT5jdXN0b21fbXNnKys7CisgICAgfQorCisgICAga2V5d29yZHMgPSBwYXJzZXItPmtleXdvcmRzOworICAgIC8qIHNjYW4ga2V5d29yZHMgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBrZXl3b3Jkc1tpXSAmJiAhKmtleXdvcmRzW2ldOyBpKyspIHsKKyAgICB9CisgICAgcGFyc2VyLT5wb3MgPSBpOworICAgIC8qIHNjYW4ga2V5d29yZHMgYW5kIGdldCBncmVhdGVzdCBwb3NzaWJsZSBuYnIgb2YgYXJncyAqLworICAgIGZvciAoOyBrZXl3b3Jkc1tpXTsgaSsrKSB7CisgICAgICAgIGlmICghKmtleXdvcmRzW2ldKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGtleXdvcmQgcGFyYW1ldGVyIG5hbWUiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGxlbiA9IGk7CisKKyAgICBtaW4gPSBtYXggPSBJTlRfTUFYOworICAgIGZvcm1hdCA9IHBhcnNlci0+Zm9ybWF0OworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAofCBzcGVjaWZpZWQgdHdpY2UpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcm1hdCBzdHJpbmcgKCQgYmVmb3JlIHwpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtaW4gPSBpOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyQnKSB7CisgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcm1hdCBzdHJpbmcgKCQgc3BlY2lmaWVkIHR3aWNlKSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCBwYXJzZXItPnBvcykgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyICQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heCA9IGk7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIGtleXdvcmQgbGlzdCBlbnRyaWVzICglZCkgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBtc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiJXM6ICclcyciLCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHBhcnNlci0+bWluID0gUHlfTUlOKG1pbiwgbGVuKTsKKyAgICBwYXJzZXItPm1heCA9IFB5X01JTihtYXgsIGxlbik7CisKKyAgICBpZiAoIUlTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkgJiYgKCpmb3JtYXQgIT0gJ3wnKSAmJiAoKmZvcm1hdCAhPSAnJCcpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJtb3JlIGFyZ3VtZW50IHNwZWNpZmllcnMgdGhhbiBrZXl3b3JkIGxpc3QgZW50cmllcyAiCisgICAgICAgICAgICAiKHJlbWFpbmluZyBmb3JtYXQ6JyVzJykiLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBua3cgPSBsZW4gLSBwYXJzZXItPnBvczsKKyAgICBrd3R1cGxlID0gUHlUdXBsZV9OZXcobmt3KTsKKyAgICBpZiAoa3d0dXBsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBrZXl3b3JkcyA9IHBhcnNlci0+a2V5d29yZHMgKyBwYXJzZXItPnBvczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmt3OyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKGtleXdvcmRzW2ldKTsKKyAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoa3d0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZSgmc3RyKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShrd3R1cGxlLCBpLCBzdHIpOworICAgIH0KKyAgICBwYXJzZXItPmt3dHVwbGUgPSBrd3R1cGxlOworCisgICAgYXNzZXJ0KHBhcnNlci0+bmV4dCA9PSBOVUxMKTsKKyAgICBwYXJzZXItPm5leHQgPSBzdGF0aWNfYXJnX3BhcnNlcnM7CisgICAgc3RhdGljX2FyZ19wYXJzZXJzID0gcGFyc2VyOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VyX2NsZWFyKHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIpCit7CisgICAgUHlfQ0xFQVIocGFyc2VyLT5rd3R1cGxlKTsKK30KKworc3RhdGljIGludAordmdldGFyZ3NrZXl3b3Jkc2Zhc3QoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCit7CisgICAgUHlPYmplY3QgKmt3dHVwbGU7CisgICAgY2hhciBtc2didWZbNTEyXTsKKyAgICBpbnQgbGV2ZWxzWzMyXTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgY29uc3QgY2hhciAqbXNnOworICAgIFB5T2JqZWN0ICprZXl3b3JkOworICAgIGludCBpLCBwb3MsIGxlbjsKKyAgICBQeV9zc2l6ZV90IG5hcmdzLCBua2V5d29yZHM7CisgICAgUHlPYmplY3QgKmN1cnJlbnRfYXJnOworICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CisgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKKworICAgIGZyZWVsaXN0LmVudHJpZXMgPSBzdGF0aWNfZW50cmllczsKKyAgICBmcmVlbGlzdC5maXJzdF9hdmFpbGFibGUgPSAwOworICAgIGZyZWVsaXN0LmVudHJpZXNfbWFsbG9jZWQgPSAwOworCisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa2V5d29yZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa2V5d29yZHMpKTsKKyAgICBhc3NlcnQocGFyc2VyICE9IE5VTEwpOworICAgIGFzc2VydChwX3ZhICE9IE5VTEwpOworCisgICAgaWYgKCFwYXJzZXJfaW5pdChwYXJzZXIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGt3dHVwbGUgPSBwYXJzZXItPmt3dHVwbGU7CisgICAgcG9zID0gcGFyc2VyLT5wb3M7CisgICAgbGVuID0gcG9zICsgUHlUdXBsZV9HRVRfU0laRShrd3R1cGxlKTsKKworICAgIGlmIChsZW4gPiBTVEFUSUNfRlJFRUxJU1RfRU5UUklFUykgeworICAgICAgICBmcmVlbGlzdC5lbnRyaWVzID0gUHlNZW1fTkVXKGZyZWVsaXN0ZW50cnlfdCwgbGVuKTsKKyAgICAgICAgaWYgKGZyZWVsaXN0LmVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZyZWVsaXN0LmVudHJpZXNfbWFsbG9jZWQgPSAxOworICAgIH0KKworICAgIG5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBua2V5d29yZHMgPSAoa2V5d29yZHMgPT0gTlVMTCkgPyAwIDogUHlEaWN0X1NpemUoa2V5d29yZHMpOworICAgIGlmIChuYXJncyArIG5rZXl3b3JkcyA+IGxlbikgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzJXMgdGFrZXMgYXQgbW9zdCAlZCBhcmd1bWVudCVzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIChwYXJzZXItPmZuYW1lID09IE5VTEwpID8gImZ1bmN0aW9uIiA6IHBhcnNlci0+Zm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAocGFyc2VyLT5mbmFtZSA9PSBOVUxMKSA/ICIiIDogIigpIiwKKyAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIChsZW4gPT0gMSkgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hcmdzICsgbmtleXdvcmRzKTsKKyAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgfQorICAgIGlmIChwYXJzZXItPm1heCA8IG5hcmdzKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgJXMgJWQgcG9zaXRpb25hbCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAocGFyc2VyLT5taW4gIT0gSU5UX01BWCkgPyAiYXQgbW9zdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPm1heCwgbmFyZ3MpOworICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICB9CisKKyAgICBmb3JtYXQgPSBwYXJzZXItPmZvcm1hdDsKKyAgICAvKiBjb252ZXJ0IHR1cGxlIGFyZ3MgYW5kIGtleXdvcmQgYXJncyBpbiBzYW1lIGxvb3AsIHVzaW5nIGt3dHVwbGUgdG8gZHJpdmUgcHJvY2VzcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBrZXl3b3JkID0gKGkgPj0gcG9zKSA/IFB5VHVwbGVfR0VUX0lURU0oa3d0dXBsZSwgaSAtIHBvcykgOiBOVUxMOworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9CisgICAgICAgIGlmICgqZm9ybWF0ID09ICckJykgeworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKTsKKworICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7CisgICAgICAgIGlmIChua2V5d29yZHMgJiYgaSA+PSBwb3MpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW0oa2V5d29yZHMsIGtleXdvcmQpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X2FyZyAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICAtLW5rZXl3b3JkczsKKyAgICAgICAgICAgIGlmIChpIDwgbmFyZ3MpIHsKKyAgICAgICAgICAgICAgICAvKiBhcmcgcHJlc2VudCBpbiB0dXBsZSBhbmQgaW4gZGljdCAqLworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJVUnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQorICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworCisgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAorICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBwYXJzZXItPmZuYW1lLCBwYXJzZXItPmN1c3RvbV9tc2cpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IHBhcnNlci0+bWluKSB7CisgICAgICAgICAgICAvKiBMZXNzIGFyZ3VtZW50cyB0aGFuIHJlcXVpcmVkICovCisgICAgICAgICAgICBpZiAoaSA8IHBvcykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyAlcyAlZCBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X01JTihwb3MsIHBhcnNlci0+bWluKSA8IHBhcnNlci0+bWF4KSA/ICJhdCBsZWFzdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X01JTihwb3MsIHBhcnNlci0+bWluKSwgbmFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlJlcXVpcmVkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclVScgKHBvcyAlZCkgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICB9CisgICAgICAgIC8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncworICAgICAgICAgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKKyAgICAgICAgICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/CisgICAgICAgICAqLworICAgICAgICBpZiAoIW5rZXl3b3JkcykgeworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsICZmcmVlbGlzdCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZworICAgICAgICAgKiBrZXl3b3JkIGFyZ3MgKi8KKyAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBhc3NlcnQobXNnID09IE5VTEwpOworICAgIH0KKworICAgIGFzc2VydChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpIHx8ICgqZm9ybWF0ID09ICd8JykgfHwgKCpmb3JtYXQgPT0gJyQnKSk7CisKKyAgICAvKiBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGV4dHJhbmVvdXMga2V5d29yZCBhcmd1bWVudHMgKi8KKyAgICBpZiAobmtleXdvcmRzID4gMCkgeworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KGtleXdvcmRzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgbWF0Y2g7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhrZXkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2ggPSBQeVNlcXVlbmNlX0NvbnRhaW5zKGt3dHVwbGUsIGtleSk7CisgICAgICAgICAgICBpZiAobWF0Y2ggPD0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJVUnIGlzIGFuIGludmFsaWQga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgJmZyZWVsaXN0KTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CkBAIC0xNjU4LDEwICsyMDg2LDggQEAKICAgICBjYXNlICdJJzogLyogaW50IHNpemVkIGJpdGZpZWxkICovCiAgICAgY2FzZSAnbCc6IC8qIGxvbmcgaW50ICovCiAgICAgY2FzZSAnayc6IC8qIGxvbmcgaW50IHNpemVkIGJpdGZpZWxkICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBjYXNlICdMJzogLyogUFlfTE9OR19MT05HICovCi0gICAgY2FzZSAnSyc6IC8qIFBZX0xPTkdfTE9ORyBzaXplZCBiaXRmaWVsZCAqLwotI2VuZGlmCisgICAgY2FzZSAnTCc6IC8qIGxvbmcgbG9uZyAqLworICAgIGNhc2UgJ0snOiAvKiBsb25nIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KICAgICBjYXNlICduJzogLyogUHlfc3NpemVfdCAqLwogICAgIGNhc2UgJ2YnOiAvKiBmbG9hdCAqLwogICAgIGNhc2UgJ2QnOiAvKiBkb3VibGUgKi8KQEAgLTE2NzMsNyArMjA5OSw5IEBACiAgICAgY2FzZSAnWSc6IC8qIHN0cmluZyBvYmplY3QgKi8KICAgICBjYXNlICdVJzogLyogdW5pY29kZSBzdHJpbmcgb2JqZWN0ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICBpZiAocF92YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2ODEsNyArMjEwOSw5IEBACiAKICAgICBjYXNlICdlJzogLyogc3RyaW5nIHdpdGggZW5jb2RpbmcgKi8KICAgICAgICAgewotICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCEoKmZvcm1hdCA9PSAncycgfHwgKmZvcm1hdCA9PSAndCcpKQogICAgICAgICAgICAgICAgIC8qIGFmdGVyICdlJywgb25seSAncycgYW5kICd0JyBpcyBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0xNjk2LDEyICsyMTI2LDE2IEBACiAgICAgY2FzZSAnWic6IC8qIHVuaWNvZGUgc3RyaW5nIG9yIE5vbmUgKi8KICAgICBjYXNlICd3JzogLyogYnVmZmVyLCByZWFkLXdyaXRlICovCiAgICAgICAgIHsKLSAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgaWYgKHBfdmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCi0gICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBpbnQgKik7CisgICAgICAgICAgICAgICAgaWYgKHBfdmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QgKik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGludCAqKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9ybWF0Kys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09ICdzJyB8fCBjID09ICd6JyB8fCBjID09ICd5JykgJiYgKmZvcm1hdCA9PSAnKicpIHsKICAgICAgICAgICAgICAgICBmb3JtYXQrKzsKQEAgLTE3MTMsMjQgKzIxNDcsMzAgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyEnKSB7CiAgICAgICAgICAgICAgICAgZm9ybWF0Kys7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmICgqZm9ybWF0ID09ICcmJykgewogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqY29udmVydGVyKShQeU9iamVjdCAqLCB2b2lkICopOwotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICBpZiAocF92YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvcm1hdCsrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIGlmIChwX3ZhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICBjYXNlICcoJzogICAgICAgICAgIC8qIGJ5cGFzcyB0dXBsZSwgbm90IGhhbmRsZWQgYXQgYWxsIHByZXZpb3VzbHkgKi8KICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqbXNnOworICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIGlmICgqZm9ybWF0PT0nKScpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc2NiwxNiArMjIwNiw5IEBACiAgICAgUHlPYmplY3QgKipvOwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCi0gICAgdmFfc3RhcnQodmFyZ3MsIG1heCk7Ci0jZWxzZQotICAgIHZhX3N0YXJ0KHZhcmdzKTsKLSNlbmRpZgotCiAgICAgYXNzZXJ0KG1pbiA+PSAwKTsKICAgICBhc3NlcnQobWluIDw9IG1heCk7CiAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICJQeUFyZ19VbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzkzLDkgKzIyMjYsMTAgQEAKICAgICAgICAgICAgICAgICAidW5wYWNrZWQgdHVwbGUgc2hvdWxkIGhhdmUgJXMlemQgZWxlbWVudHMsIgogICAgICAgICAgICAgICAgICIgYnV0IGhhcyAlemQiLAogICAgICAgICAgICAgICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpZiAobCA9PSAwKQorICAgICAgICByZXR1cm4gMTsKICAgICBpZiAobCA+IG1heCkgewogICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KApAQCAtMTgwOCw5ICsyMjQyLDE0IEBACiAgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKICAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKICAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgbWF4KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCiAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7CiAgICAgICAgICpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKQEAgLTE4NjAsNiArMjI5OSwxOSBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkCitfUHlBcmdfRmluaSh2b2lkKQoreworICAgIHN0cnVjdCBfUHlBcmdfUGFyc2VyICp0bXAsICpzID0gc3RhdGljX2FyZ19wYXJzZXJzOworICAgIHdoaWxlIChzKSB7CisgICAgICAgIHRtcCA9IHMtPm5leHQ7CisgICAgICAgIHMtPm5leHQgPSBOVUxMOworICAgICAgICBwYXJzZXJfY2xlYXIocyk7CisgICAgICAgIHMgPSB0bXA7CisgICAgfQorICAgIHN0YXRpY19hcmdfcGFyc2VycyA9IE5VTEw7Cit9CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dyYW1pbml0LmMgYi9QeXRob24vZ3JhbWluaXQuYwppbmRleCA4MjEyYjJhLi4zNTRkYzEyIDEwMDY0NAotLS0gYS9QeXRob24vZ3JhbWluaXQuYworKysgYi9QeXRob24vZ3JhbWluaXQuYwpAQCAtMjA0LDExICsyMDQsMTMgQEAKICAgICB7MzIsIDd9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzlfN1szXSA9IHsKICAgICB7MzAsIDEyfSwKICAgICB7MzQsIDN9LAorICAgIHswLCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV84WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfOVsyXSA9IHsKQEAgLTIyMSwzNSArMjIzLDM5IEBACiAgICAgezAsIDEwfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xMVszXSA9IHsKLSAgICB7MzAsIDEzfSwKLSAgICB7MzIsIDE0fSwKKyAgICB7MzAsIDE0fSwKKyAgICB7MzIsIDE1fSwKICAgICB7MCwgMTF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xM1syXSA9IHsKLSAgICB7MzIsIDE0fSwKK3N0YXRpYyBhcmMgYXJjc185XzEzWzFdID0gewogICAgIHswLCAxM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTRbMl0gPSB7Ci0gICAgezMwLCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE1WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfMTVbM10gPSB7CisgICAgezMwLCAxN30sCisgICAgezM0LCAzfSwKKyAgICB7MCwgMTV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc185XzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTZbM10gPSB7Ci0gICAgezMyLCAxNH0sCi0gICAgezMxLCAxN30sCi0gICAgezAsIDE2fSwKK3N0YXRpYyBhcmMgYXJjc185XzE3WzNdID0geworICAgIHszMiwgMTV9LAorICAgIHszMSwgMTh9LAorICAgIHswLCAxN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfOV8xOFsxXSA9IHsKKyAgICB7MjYsIDE0fSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzlbMThdID0geworc3RhdGljIHN0YXRlIHN0YXRlc185WzE5XSA9IHsKICAgICB7MywgYXJjc185XzB9LAogICAgIHszLCBhcmNzXzlfMX0sCiAgICAgezMsIGFyY3NfOV8yfSwKQEAgLTI1NywxNyArMjYzLDE4IEBACiAgICAgezEsIGFyY3NfOV80fSwKICAgICB7NCwgYXJjc185XzV9LAogICAgIHsyLCBhcmNzXzlfNn0sCi0gICAgezIsIGFyY3NfOV83fSwKLSAgICB7MSwgYXJjc185Xzh9LAorICAgIHszLCBhcmNzXzlfN30sCisgICAgezIsIGFyY3NfOV84fSwKICAgICB7MiwgYXJjc185Xzl9LAogICAgIHszLCBhcmNzXzlfMTB9LAogICAgIHszLCBhcmNzXzlfMTF9LAogICAgIHszLCBhcmNzXzlfMTJ9LAotICAgIHsyLCBhcmNzXzlfMTN9LAorICAgIHsxLCBhcmNzXzlfMTN9LAogICAgIHsyLCBhcmNzXzlfMTR9LAotICAgIHsxLCBhcmNzXzlfMTV9LAotICAgIHszLCBhcmNzXzlfMTZ9LAotICAgIHsxLCBhcmNzXzlfMTd9LAorICAgIHszLCBhcmNzXzlfMTV9LAorICAgIHsxLCBhcmNzXzlfMTZ9LAorICAgIHszLCBhcmNzXzlfMTd9LAorICAgIHsxLCBhcmNzXzlfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMF8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC0zMTksMTEgKzMyNiwxMyBAQAogICAgIHszMiwgN30sCiAgICAgezAsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzExXzdbM10gPSB7CiAgICAgezM2LCAxMn0sCiAgICAgezM0LCAzfSwKKyAgICB7MCwgN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzhbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzlbMl0gPSB7CkBAIC0zMzYsMzUgKzM0NSwzOSBAQAogICAgIHswLCAxMH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzExWzNdID0gewotICAgIHszNiwgMTN9LAotICAgIHszMiwgMTR9LAorICAgIHszNiwgMTR9LAorICAgIHszMiwgMTV9LAogICAgIHswLCAxMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTNbMl0gPSB7Ci0gICAgezMyLCAxNH0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTNbMV0gPSB7CiAgICAgezAsIDEzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfMTRbMl0gPSB7Ci0gICAgezM2LCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV8xNVszXSA9IHsKKyAgICB7MzYsIDE3fSwKKyAgICB7MzQsIDN9LAorICAgIHswLCAxNX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzExXzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE2WzNdID0gewotICAgIHszMiwgMTR9LAotICAgIHszMSwgMTd9LAotICAgIHswLCAxNn0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTdbM10gPSB7CisgICAgezMyLCAxNX0sCisgICAgezMxLCAxOH0sCisgICAgezAsIDE3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfMTFfMThbMV0gPSB7CisgICAgezI2LCAxNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18xMVsxOF0gPSB7CitzdGF0aWMgc3RhdGUgc3RhdGVzXzExWzE5XSA9IHsKICAgICB7MywgYXJjc18xMV8wfSwKICAgICB7MywgYXJjc18xMV8xfSwKICAgICB7MywgYXJjc18xMV8yfSwKQEAgLTM3MiwxNyArMzg1LDE4IEBACiAgICAgezEsIGFyY3NfMTFfNH0sCiAgICAgezQsIGFyY3NfMTFfNX0sCiAgICAgezIsIGFyY3NfMTFfNn0sCi0gICAgezIsIGFyY3NfMTFfN30sCi0gICAgezEsIGFyY3NfMTFfOH0sCisgICAgezMsIGFyY3NfMTFfN30sCisgICAgezIsIGFyY3NfMTFfOH0sCiAgICAgezIsIGFyY3NfMTFfOX0sCiAgICAgezMsIGFyY3NfMTFfMTB9LAogICAgIHszLCBhcmNzXzExXzExfSwKICAgICB7MywgYXJjc18xMV8xMn0sCi0gICAgezIsIGFyY3NfMTFfMTN9LAorICAgIHsxLCBhcmNzXzExXzEzfSwKICAgICB7MiwgYXJjc18xMV8xNH0sCi0gICAgezEsIGFyY3NfMTFfMTV9LAotICAgIHszLCBhcmNzXzExXzE2fSwKLSAgICB7MSwgYXJjc18xMV8xN30sCisgICAgezMsIGFyY3NfMTFfMTV9LAorICAgIHsxLCBhcmNzXzExXzE2fSwKKyAgICB7MywgYXJjc18xMV8xN30sCisgICAgezEsIGFyY3NfMTFfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMl8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC0xODc5LDExICsxODkzLDExIEBACiAgICAgICJcMDAwXDAwMFwxMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2NCwgInBhcmFtZXRlcnMiLCAwLCA0LCBzdGF0ZXNfOCwKICAgICAgIlwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MjY1LCAidHlwZWRhcmdzbGlzdCIsIDAsIDE4LCBzdGF0ZXNfOSwKKyAgICB7MjY1LCAidHlwZWRhcmdzbGlzdCIsIDAsIDE5LCBzdGF0ZXNfOSwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY2LCAidGZwZGVmIiwgMCwgNCwgc3RhdGVzXzEwLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNjcsICJ2YXJhcmdzbGlzdCIsIDAsIDE4LCBzdGF0ZXNfMTEsCisgICAgezI2NywgInZhcmFyZ3NsaXN0IiwgMCwgMTksIHN0YXRlc18xMSwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY4LCAidmZwZGVmIiwgMCwgMiwgc3RhdGVzXzEyLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LApkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IDcwMThkNTkuLjNiYWM1YjggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTM4LDE0ICszOCw2IEBACiAKICNpbmNsdWRlICJjbGluaWMvaW1wb3J0LmMuaCIKIAotLypbcHl0aG9uIGlucHV0XQotY2xhc3MgZnNfdW5pY29kZV9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeU9iamVjdCAqJwotICAgIGNvbnZlcnRlciA9ICdQeVVuaWNvZGVfRlNEZWNvZGVyJwotCi1bcHl0aG9uIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltweXRob24gZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD05ZDY3ODYyMzAxNjYwMDZlXSovCi0KIC8qIEluaXRpYWxpemUgdGhpbmdzICovCiAKIHZvaWQKQEAgLTMyMCw3ICszMTIsNyBAQAogCiAKIC8qIExpc3Qgb2YgbmFtZXMgdG8gY2xlYXIgaW4gc3lzICovCi1zdGF0aWMgY2hhciogc3lzX2RlbGV0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2RlbGV0ZXNbXSA9IHsKICAgICAicGF0aCIsICJhcmd2IiwgInBzMSIsICJwczIiLAogICAgICJsYXN0X3R5cGUiLCAibGFzdF92YWx1ZSIsICJsYXN0X3RyYWNlYmFjayIsCiAgICAgInBhdGhfaG9va3MiLCAicGF0aF9pbXBvcnRlcl9jYWNoZSIsICJtZXRhX3BhdGgiLApAQCAtMzMwLDcgKzMyMiw3IEBACiAgICAgTlVMTAogfTsKIAotc3RhdGljIGNoYXIqIHN5c19maWxlc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZmlsZXNbXSA9IHsKICAgICAic3RkaW4iLCAiX19zdGRpbl9fIiwKICAgICAic3Rkb3V0IiwgIl9fc3Rkb3V0X18iLAogICAgICJzdGRlcnIiLCAiX19zdGRlcnJfXyIsCkBAIC0zNDcsNyArMzM5LDcgQEAKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBQeU9iamVjdCAqbW9kdWxlcyA9IGludGVycC0+bW9kdWxlczsKICAgICBQeU9iamVjdCAqd2Vha2xpc3QgPSBOVUxMOwotICAgIGNoYXIgKipwOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKIAogICAgIGlmIChtb2R1bGVzID09IE5VTEwpCiAgICAgICAgIHJldHVybjsgLyogQWxyZWFkeSBkb25lICovCkBAIC04ODMsMTAgKzg3NSw4IEBACiAgICAgaWYgKFB5VW5pY29kZV9Db21wYXJlKGNvLT5jb19maWxlbmFtZSwgb2xkbmFtZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIHRtcCA9IGNvLT5jb19maWxlbmFtZTsKLSAgICBjby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOwotICAgIFB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X0lOQ1JFRihuZXduYW1lKTsKKyAgICBQeV9YU0VUUkVGKGNvLT5jb19maWxlbmFtZSwgbmV3bmFtZSk7CiAKICAgICBjb25zdGFudHMgPSBjby0+Y29fY29uc3RzOwogICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNvbnN0YW50cyk7CkBAIC05NjAsMTIgKzk1MCwxMyBAQAogfQogCiAKLS8qIFJldHVybiBhbiBpbXBvcnRlciBvYmplY3QgZm9yIGEgc3lzLnBhdGgvcGtnLl9fcGF0aF9fIGl0ZW0gJ3AnLAorLyogUmV0dXJuIGEgZmluZGVyIG9iamVjdCBmb3IgYSBzeXMucGF0aC9wa2cuX19wYXRoX18gaXRlbSAncCcsCiAgICBwb3NzaWJseSBieSBmZXRjaGluZyBpdCBmcm9tIHRoZSBwYXRoX2ltcG9ydGVyX2NhY2hlIGRpY3QuIElmIGl0CiAgICB3YXNuJ3QgeWV0IGNhY2hlZCwgdHJhdmVyc2UgcGF0aF9ob29rcyB1bnRpbCBhIGhvb2sgaXMgZm91bmQKICAgIHRoYXQgY2FuIGhhbmRsZSB0aGUgcGF0aCBpdGVtLiBSZXR1cm4gTm9uZSBpZiBubyBob29rIGNvdWxkOwotICAgdGhpcyB0ZWxscyBvdXIgY2FsbGVyIGl0IHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIGJ1aWx0aW4KLSAgIGltcG9ydCBtZWNoYW5pc20uIENhY2hlIHRoZSByZXN1bHQgaW4gcGF0aF9pbXBvcnRlcl9jYWNoZS4KKyAgIHRoaXMgdGVsbHMgb3VyIGNhbGxlciB0aGF0IHRoZSBwYXRoIGJhc2VkIGZpbmRlciBjb3VsZCBub3QgZmluZAorICAgYSBmaW5kZXIgZm9yIHRoaXMgcGF0aCBpdGVtLiBDYWNoZSB0aGUgcmVzdWx0IGluCisgICBwYXRoX2ltcG9ydGVyX2NhY2hlLgogICAgUmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZS4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzMzEsMTAgKzEzMjIsOCBAQAogICAgICAgICAgICAgKGFsd2F5c190cmltIHx8CiAgICAgICAgICAgICAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoY29kZS0+Y29fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnJhbWVzKSA9PSAwKSkgewotICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9ICpvdXRlcl9saW5rOwotICAgICAgICAgICAgKm91dGVyX2xpbmsgPSBuZXh0OwogICAgICAgICAgICAgUHlfWElOQ1JFRihuZXh0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgUHlfWFNFVFJFRigqb3V0ZXJfbGluaywgbmV4dCk7CiAgICAgICAgICAgICBwcmV2X2xpbmsgPSBvdXRlcl9saW5rOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewpAQCAtMTM0Nyw2MSArMTMzNiwxNzAgQEAKIH0KIAogCi1QeU9iamVjdCAqCi1QeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbE9iamVjdChQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKmdpdmVuX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZ2l2ZW5fZnJvbWxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpCitzdGF0aWMgUHlPYmplY3QgKgorcmVzb2x2ZV9uYW1lKFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywgaW50IGxldmVsKQogewotICAgIF9QeV9JREVOVElGSUVSKF9faW1wb3J0X18pOwogICAgIF9QeV9JREVOVElGSUVSKF9fc3BlY19fKTsKLSAgICBfUHlfSURFTlRJRklFUihfaW5pdGlhbGl6aW5nKTsKICAgICBfUHlfSURFTlRJRklFUihfX3BhY2thZ2VfXyk7CiAgICAgX1B5X0lERU5USUZJRVIoX19wYXRoX18pOwogICAgIF9QeV9JREVOVElGSUVSKF9fbmFtZV9fKTsKKyAgICBfUHlfSURFTlRJRklFUihwYXJlbnQpOworICAgIFB5T2JqZWN0ICphYnNfbmFtZTsKKyAgICBQeU9iamVjdCAqcGFja2FnZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNwZWM7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgUHlfc3NpemVfdCBsYXN0X2RvdDsKKyAgICBQeU9iamVjdCAqYmFzZTsKKyAgICBpbnQgbGV2ZWxfdXA7CisKKyAgICBpZiAoZ2xvYmFscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgIidfX25hbWVfXycgbm90IGluIGdsb2JhbHMiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFQeURpY3RfQ2hlY2soZ2xvYmFscykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdsb2JhbHMgbXVzdCBiZSBhIGRpY3QiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcGFja2FnZSA9IF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fcGFja2FnZV9fKTsKKyAgICBpZiAocGFja2FnZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIHBhY2thZ2UgPSBOVUxMOworICAgIH0KKyAgICBzcGVjID0gX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19zcGVjX18pOworCisgICAgaWYgKHBhY2thZ2UgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CisgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFja2FnZSBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNwZWMgIT0gTlVMTCAmJiBzcGVjICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGludCBlcXVhbDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJlbnQgPSBfUHlPYmplY3RfR2V0QXR0cklkKHNwZWMsICZQeUlkX3BhcmVudCk7CisgICAgICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcXVhbCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChwYWNrYWdlLCBwYXJlbnQsIFB5X0VRKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJlbnQpOworICAgICAgICAgICAgaWYgKGVxdWFsIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlcXVhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudCIsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChzcGVjICE9IE5VTEwgJiYgc3BlYyAhPSBQeV9Ob25lKSB7CisgICAgICAgIHBhY2thZ2UgPSBfUHlPYmplY3RfR2V0QXR0cklkKHNwZWMsICZQeUlkX3BhcmVudCk7CisgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIl9fc3BlY19fLnBhcmVudCBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0ltcG9ydFdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCByZXNvbHZlIHBhY2thZ2UgZnJvbSBfX3NwZWNfXyBvciBfX3BhY2thZ2VfXywgIgorICAgICAgICAgICAgICAgICAgICAiZmFsbGluZyBiYWNrIG9uIF9fbmFtZV9fIGFuZCBfX3BhdGhfXyIsIDEpIDwgMCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX25hbWVfXyk7CisgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgIidfX25hbWVfXycgbm90IGluIGdsb2JhbHMiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CisgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhdGhfXykgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBkb3Q7CisKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocGFja2FnZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKHBhY2thZ2UsICcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBQeVVuaWNvZGVfR0VUX0xFTkdUSChwYWNrYWdlKSwgLTEpOworICAgICAgICAgICAgaWYgKGRvdCA9PSAtMikgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkb3QgPj0gMCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHBhY2thZ2UsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgaWYgKHN1YnN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X1NFVFJFRihwYWNrYWdlLCBzdWJzdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbGFzdF9kb3QgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChwYWNrYWdlKTsKKyAgICBpZiAobGFzdF9kb3QgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgImF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgd2l0aCBubyBrbm93biBwYXJlbnQgcGFja2FnZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChQeURpY3RfR2V0SXRlbShpbnRlcnAtPm1vZHVsZXMsIHBhY2thZ2UpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJQYXJlbnQgbW9kdWxlICVSIG5vdCBsb2FkZWQsIGNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlICIKKyAgICAgICAgICAgICAgICAiaW1wb3J0IiwgcGFja2FnZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZm9yIChsZXZlbF91cCA9IDE7IGxldmVsX3VwIDwgbGV2ZWw7IGxldmVsX3VwICs9IDEpIHsKKyAgICAgICAgbGFzdF9kb3QgPSBQeVVuaWNvZGVfRmluZENoYXIocGFja2FnZSwgJy4nLCAwLCBsYXN0X2RvdCwgLTEpOworICAgICAgICBpZiAobGFzdF9kb3QgPT0gLTIpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGFzdF9kb3QgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3AtbGV2ZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgYmFzZSA9IFB5VW5pY29kZV9TdWJzdHJpbmcocGFja2FnZSwgMCwgbGFzdF9kb3QpOworICAgIFB5X0RFQ1JFRihwYWNrYWdlKTsKKyAgICBpZiAoYmFzZSA9PSBOVUxMIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgfQorCisgICAgYWJzX25hbWUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVUuJVUiLCBiYXNlLCBuYW1lKTsKKyAgICBQeV9ERUNSRUYoYmFzZSk7CisgICAgcmV0dXJuIGFic19uYW1lOworCisgIGVycm9yOgorICAgIFB5X1hERUNSRUYocGFja2FnZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1B5T2JqZWN0ICoKK1B5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsT2JqZWN0KFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMsIFB5T2JqZWN0ICpmcm9tbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkKK3sKICAgICBfUHlfSURFTlRJRklFUihfZmluZF9hbmRfbG9hZCk7CiAgICAgX1B5X0lERU5USUZJRVIoX2hhbmRsZV9mcm9tbGlzdCk7Ci0gICAgX1B5X0lERU5USUZJRVIoX2xvY2tfdW5sb2NrX21vZHVsZSk7Ci0gICAgX1B5X3N0YXRpY19zdHJpbmcoc2luZ2xlX2RvdCwgIi4iKTsKICAgICBQeU9iamVjdCAqYWJzX25hbWUgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpidWlsdGluc19pbXBvcnQgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpmaW5hbF9tb2QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptb2QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpwYWNrYWdlID0gTlVMTDsKLSAgICBQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpbnQgaGFzX2Zyb207CiAKLSAgICAvKiBNYWtlIHN1cmUgdG8gdXNlIGRlZmF1bHQgdmFsdWVzIHNvIGFzIHRvIG5vdCBoYXZlCi0gICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoKSB0cnVuY2F0ZSB0aGUgcGFyYW1ldGVyIGxpc3QgYmVjYXVzZSBvZiBhCi0gICAgICAgTlVMTCBhcmd1bWVudC4gKi8KLSAgICBpZiAoZ2l2ZW5fZ2xvYmFscyA9PSBOVUxMKSB7Ci0gICAgICAgIGdsb2JhbHMgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgIGlmIChnbG9iYWxzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIE9ubHkgaGF2ZSB0byBjYXJlIHdoYXQgZ2l2ZW5fZ2xvYmFscyBpcyBpZiBpdCB3aWxsIGJlIHVzZWQKLSAgICAgICAgICAgZm9yIHNvbWV0aGluZy4gKi8KLSAgICAgICAgaWYgKGxldmVsID4gMCAmJiAhUHlEaWN0X0NoZWNrKGdpdmVuX2dsb2JhbHMpKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZ2xvYmFscyBtdXN0IGJlIGEgZGljdCIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBnbG9iYWxzID0gZ2l2ZW5fZ2xvYmFsczsKLSAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOwotICAgIH0KLQotICAgIGlmIChnaXZlbl9mcm9tbGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIGZyb21saXN0ID0gUHlMaXN0X05ldygwKTsKLSAgICAgICAgaWYgKGZyb21saXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZyb21saXN0ID0gZ2l2ZW5fZnJvbWxpc3Q7Ci0gICAgICAgIFB5X0lOQ1JFRihmcm9tbGlzdCk7Ci0gICAgfQogICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJFbXB0eSBtb2R1bGUgbmFtZSIpOwogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTQxNCwxMjggKzE1MTIsMjggQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1vZHVsZSBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX1JFQURZKG5hbWUpIDwgMCkgeworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkobmFtZSkgPCAwKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIGlmIChsZXZlbCA8IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsZXZlbCBtdXN0IGJlID49IDAiKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgZWxzZSBpZiAobGV2ZWwgPiAwKSB7Ci0gICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhY2thZ2VfXyk7Ci0gICAgICAgIGlmIChwYWNrYWdlICE9IE5VTEwgJiYgcGFja2FnZSAhPSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7Ci0gICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwYWNrYWdlIG11c3QgYmUgYSBzdHJpbmciKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcGFja2FnZSA9IF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fbmFtZV9fKTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICInX19uYW1lX18nIG5vdCBpbiBnbG9iYWxzIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CiAKLSAgICAgICAgICAgIGlmIChfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhdGhfXykgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJ0aXRpb24gPSBOVUxMOwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpib3Jyb3dlZF9kb3QgPSBfUHlVbmljb2RlX0Zyb21JZCgmc2luZ2xlX2RvdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJvcnJvd2VkX2RvdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcnRpdGlvbiA9IFB5VW5pY29kZV9SUGFydGl0aW9uKHBhY2thZ2UsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYWNrYWdlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJ0aXRpb24sIDApOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihwYWNrYWdlKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFydGl0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShpbnRlcnAtPm1vZHVsZXMsIHBhY2thZ2UpID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIlBhcmVudCBtb2R1bGUgJVIgbm90IGxvYWRlZCwgY2Fubm90IHBlcmZvcm0gcmVsYXRpdmUgIgotICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IiwgcGFja2FnZSk7CisgICAgaWYgKGxldmVsID4gMCkgeworICAgICAgICBhYnNfbmFtZSA9IHJlc29sdmVfbmFtZShuYW1lLCBnbG9iYWxzLCBsZXZlbCk7CisgICAgICAgIGlmIChhYnNfbmFtZSA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsgIC8qIGxldmVsID09IDAgKi8KICAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID09IDApIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiRW1wdHkgbW9kdWxlIG5hbWUiKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgcGFja2FnZSA9IFB5X05vbmU7Ci0gICAgICAgIFB5X0lOQ1JFRihwYWNrYWdlKTsKLSAgICB9Ci0KLSAgICBpZiAobGV2ZWwgPiAwKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgbGFzdF9kb3QgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChwYWNrYWdlKTsKLSAgICAgICAgUHlPYmplY3QgKmJhc2UgPSBOVUxMOwotICAgICAgICBpbnQgbGV2ZWxfdXAgPSAxOwotCi0gICAgICAgIGZvciAobGV2ZWxfdXAgPSAxOyBsZXZlbF91cCA8IGxldmVsOyBsZXZlbF91cCArPSAxKSB7Ci0gICAgICAgICAgICBsYXN0X2RvdCA9IFB5VW5pY29kZV9GaW5kQ2hhcihwYWNrYWdlLCAnLicsIDAsIGxhc3RfZG90LCAtMSk7Ci0gICAgICAgICAgICBpZiAobGFzdF9kb3QgPT0gLTIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobGFzdF9kb3QgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kIHRvcC1sZXZlbCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJhc2UgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHBhY2thZ2UsIDAsIGxhc3RfZG90KTsKLSAgICAgICAgaWYgKGJhc2UgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID4gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCwgKnNlcSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKLSAgICAgICAgICAgIHNlcSA9IFB5VHVwbGVfUGFjaygyLCBiYXNlLCBuYW1lKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlKTsKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCB8fCBzZXEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFic19uYW1lID0gUHlVbmljb2RlX0pvaW4oYm9ycm93ZWRfZG90LCBzZXEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7Ci0gICAgICAgICAgICBpZiAoYWJzX25hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhYnNfbmFtZSA9IGJhc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7CiAgICAgICAgIGFic19uYW1lID0gbmFtZTsKICAgICAgICAgUHlfSU5DUkVGKGFic19uYW1lKTsKICAgICB9CiAKLSNpZmRlZiBXSVRIX1RIUkVBRAotICAgIF9QeUltcG9ydF9BY3F1aXJlTG9jaygpOwotI2VuZGlmCi0gICAvKiBGcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCwgZ290byBlcnJvcl93aXRoX3VubG9jayEgKi8KLSAgICAvKiBYWFggaW50ZXJwLT5idWlsdGluc19jb3B5IGlzIE5VTEwgaW4gc3ViaW50ZXJwcmV0ZXIhICovCi0gICAgYnVpbHRpbnNfaW1wb3J0ID0gX1B5RGljdF9HZXRJdGVtSWQoaW50ZXJwLT5idWlsdGluc19jb3B5ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAtPmJ1aWx0aW5zX2NvcHkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycC0+YnVpbHRpbnMsICZQeUlkX19faW1wb3J0X18pOwotICAgIGlmIChidWlsdGluc19pbXBvcnQgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOwotICAgICAgICBnb3RvIGVycm9yX3dpdGhfdW5sb2NrOwotICAgIH0KLSAgICBQeV9JTkNSRUYoYnVpbHRpbnNfaW1wb3J0KTsKLQogICAgIG1vZCA9IFB5RGljdF9HZXRJdGVtKGludGVycC0+bW9kdWxlcywgYWJzX25hbWUpOwogICAgIGlmIChtb2QgPT0gUHlfTm9uZSkgewogICAgICAgICBQeU9iamVjdCAqbXNnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoImltcG9ydCBvZiAlUiBoYWx0ZWQ7ICIKQEAgLTE1NDUsOSArMTU0MywxMiBAQAogICAgICAgICAgICAgUHlfREVDUkVGKG1zZyk7CiAgICAgICAgIH0KICAgICAgICAgbW9kID0gTlVMTDsKLSAgICAgICAgZ290byBlcnJvcl93aXRoX3VubG9jazsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgZWxzZSBpZiAobW9kICE9IE5VTEwpIHsKKyAgICAgICAgX1B5X0lERU5USUZJRVIoX19zcGVjX18pOworICAgICAgICBfUHlfSURFTlRJRklFUihfaW5pdGlhbGl6aW5nKTsKKyAgICAgICAgX1B5X0lERU5USUZJRVIoX2xvY2tfdW5sb2NrX21vZHVsZSk7CiAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CiAgICAgICAgIFB5T2JqZWN0ICpzcGVjOwogICAgICAgICBpbnQgaW5pdGlhbGl6aW5nID0gMDsKQEAgLTE1NzAsOTEgKzE1NzEsODMgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6aW5nID09IC0xKQogICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluaXRpYWxpemluZyA+IDApIHsKLSAgICAgICAgICAgIC8qIF9ib290c3RyYXAuX2xvY2tfdW5sb2NrX21vZHVsZSgpIHJlbGVhc2VzIHRoZSBpbXBvcnQgbG9jayAqLwotICAgICAgICAgICAgdmFsdWUgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkT2JqQXJncyhpbnRlcnAtPmltcG9ydGxpYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfX2xvY2tfdW5sb2NrX21vZHVsZSwgYWJzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6aW5nID4gMCkgewogI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgICAgICAgICBpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX1B5SW1wb3J0X0FjcXVpcmVMb2NrKCk7CiAjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBfYm9vdHN0cmFwLl9sb2NrX3VubG9ja19tb2R1bGUoKSByZWxlYXNlcyB0aGUgaW1wb3J0IGxvY2sgKi8KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWRPYmpBcmdzKGludGVycC0+aW1wb3J0bGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfX2xvY2tfdW5sb2NrX21vZHVsZSwgYWJzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgeworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgICAgIF9QeUltcG9ydF9BY3F1aXJlTG9jaygpOworI2VuZGlmCiAgICAgICAgIC8qIF9ib290c3RyYXAuX2ZpbmRfYW5kX2xvYWQoKSByZWxlYXNlcyB0aGUgaW1wb3J0IGxvY2sgKi8KICAgICAgICAgbW9kID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZE9iakFyZ3MoaW50ZXJwLT5pbXBvcnRsaWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUlkX19maW5kX2FuZF9sb2FkLCBhYnNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbnNfaW1wb3J0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwLT5pbXBvcnRfZnVuYywgTlVMTCk7CiAgICAgICAgIGlmIChtb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiBGcm9tIG5vdyBvbiB3ZSBkb24ndCBob2xkIHRoZSBpbXBvcnQgbG9jayBhbnltb3JlLiAqLwogCi0gICAgaGFzX2Zyb20gPSBQeU9iamVjdF9Jc1RydWUoZnJvbWxpc3QpOwotICAgIGlmIChoYXNfZnJvbSA8IDApCi0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgaGFzX2Zyb20gPSAwOworICAgIGlmIChmcm9tbGlzdCAhPSBOVUxMICYmIGZyb21saXN0ICE9IFB5X05vbmUpIHsKKyAgICAgICAgaGFzX2Zyb20gPSBQeU9iamVjdF9Jc1RydWUoZnJvbWxpc3QpOworICAgICAgICBpZiAoaGFzX2Zyb20gPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAgICAgaWYgKCFoYXNfZnJvbSkgewotICAgICAgICBpZiAobGV2ZWwgPT0gMCB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSA+IDApIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9udCA9IE5VTEw7Ci0gICAgICAgICAgICBQeU9iamVjdCAqcGFydGl0aW9uID0gTlVMTDsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpib3Jyb3dlZF9kb3QgPSBfUHlVbmljb2RlX0Zyb21JZCgmc2luZ2xlX2RvdCk7CisgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgobmFtZSk7CisgICAgICAgIGlmIChsZXZlbCA9PSAwIHx8IGxlbiA+IDApIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgZG90OwogCi0gICAgICAgICAgICBpZiAoYm9ycm93ZWRfZG90ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRvdCA9IFB5VW5pY29kZV9GaW5kQ2hhcihuYW1lLCAnLicsIDAsIGxlbiwgMSk7CisgICAgICAgICAgICBpZiAoZG90ID09IC0yKSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGFydGl0aW9uID0gUHlVbmljb2RlX1BhcnRpdGlvbihuYW1lLCBib3Jyb3dlZF9kb3QpOwotICAgICAgICAgICAgaWYgKHBhcnRpdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKFB5VHVwbGVfR0VUX0lURU0ocGFydGl0aW9uLCAxKSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRvdCA9PSAtMSkgewogICAgICAgICAgICAgICAgIC8qIE5vIGRvdCBpbiBtb2R1bGUgbmFtZSwgc2ltcGxlIGV4aXQgKi8KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFydGl0aW9uKTsKICAgICAgICAgICAgICAgICBmaW5hbF9tb2QgPSBtb2Q7CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKG1vZCk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZnJvbnQgPSBQeVR1cGxlX0dFVF9JVEVNKHBhcnRpdGlvbiwgMCk7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoZnJvbnQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHBhcnRpdGlvbik7Ci0KICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWxfbW9kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhidWlsdGluc19pbXBvcnQsIGZyb250LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnJvbnQgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKG5hbWUsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgaWYgKGZyb250ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbF9tb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbE9iamVjdChmcm9udCwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZyb250KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY3V0X29mZiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChmcm9udCk7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjdXRfb2ZmID0gbGVuIC0gZG90OwogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgYWJzX25hbWVfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoYWJzX25hbWUpOwogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0b19yZXR1cm4gPSBQeVVuaWNvZGVfU3Vic3RyaW5nKGFic19uYW1lLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNfbmFtZV9sZW4gLSBjdXRfb2ZmKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnJvbnQpOwogICAgICAgICAgICAgICAgIGlmICh0b19yZXR1cm4gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZpbmFsX21vZCA9IFB5RGljdF9HZXRJdGVtKGludGVycC0+bW9kdWxlcywgdG9fcmV0dXJuKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG9fcmV0dXJuKTsKICAgICAgICAgICAgICAgICBpZiAoZmluYWxfbW9kID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVSIG5vdCBpbiBzeXMubW9kdWxlcyBhcyBleHBlY3RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19yZXR1cm4pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZpbmFsX21vZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0b19yZXR1cm4pOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihmaW5hbF9tb2QpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewpAQCAtMTY2NSwyNCArMTY1OCwxNCBAQAogICAgIGVsc2UgewogICAgICAgICBmaW5hbF9tb2QgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkT2JqQXJncyhpbnRlcnAtPmltcG9ydGxpYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfX2hhbmRsZV9mcm9tbGlzdCwgbW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdCwgYnVpbHRpbnNfaW1wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdCwgaW50ZXJwLT5pbXBvcnRfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfQotICAgIGdvdG8gZXJyb3I7CiAKLSAgZXJyb3Jfd2l0aF91bmxvY2s6Ci0jaWZkZWYgV0lUSF9USFJFQUQKLSAgICBpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJub3QgaG9sZGluZyB0aGUgaW1wb3J0IGxvY2siKTsKLSAgICB9Ci0jZW5kaWYKICAgZXJyb3I6CiAgICAgUHlfWERFQ1JFRihhYnNfbmFtZSk7Ci0gICAgUHlfWERFQ1JFRihidWlsdGluc19pbXBvcnQpOwogICAgIFB5X1hERUNSRUYobW9kKTsKICAgICBQeV9YREVDUkVGKHBhY2thZ2UpOwotICAgIFB5X1hERUNSRUYoZ2xvYmFscyk7Ci0gICAgUHlfWERFQ1JFRihmcm9tbGlzdCk7CiAgICAgaWYgKGZpbmFsX21vZCA9PSBOVUxMKQogICAgICAgICByZW1vdmVfaW1wb3J0bGliX2ZyYW1lcygpOwogICAgIHJldHVybiBmaW5hbF9tb2Q7CmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0ZGwuYyBiL1B5dGhvbi9pbXBvcnRkbC5jCmluZGV4IDFhYTU4NWQuLmFjMDMyODkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRkbC5jCisrKyBiL1B5dGhvbi9pbXBvcnRkbC5jCkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgY2hhciAqYXNjaWlfb25seV9wcmVmaXggPSAiUHlJbml0IjsKLXN0YXRpYyBjb25zdCBjaGFyICpub25hc2NpaV9wcmVmaXggPSAiUHlJbml0VSI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzY2lpX29ubHlfcHJlZml4ID0gIlB5SW5pdCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5vbmFzY2lpX3ByZWZpeCA9ICJQeUluaXRVIjsKIAogLyogR2V0IHRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgbW9kdWxlJ3MgZXhwb3J0IHN5bWJvbCBuYW1lLgogICogUmV0dXJucyBhIGJ5dGVzIGluc3RhbmNlLiBGb3Igbm9uLUFTQ0lJLW5hbWVkIG1vZHVsZXMsIHRoZSBuYW1lIGlzCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0bGliLmggYi9QeXRob24vaW1wb3J0bGliLmgKaW5kZXggN2Y2Yjc1My4uNTA5Mzc0NyAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGxpYi5oCisrKyBiL1B5dGhvbi9pbXBvcnRsaWIuaApAQCAtMSw4NSArMSw3MiBAQAogLyogQXV0by1nZW5lcmF0ZWQgYnkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYyAqLwogY29uc3QgdW5zaWduZWQgY2hhciBfUHlfTV9faW1wb3J0bGliW10gPSB7Ci0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNiwwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMTY5LDIsMCwwLDEwMCwwLDAsOTAsMCwwLAotICAgIDEwMCwxLDAsOTcsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLDkwLAotICAgIDIsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwzLDAsNzEsMTAwLAotICAgIDYsMCwxMDAsNywwLDEzMiwwLDAsMTAwLDcsMCwxMzEsMiwwLDkwLDQsCi0gICAgMCwxMDUsMCwwLDkwLDUsMCwxMDUsMCwwLDkwLDYsMCw3MSwxMDAsOCwKLSAgICAwLDEwMCw5LDAsMTMyLDAsMCwxMDAsOSwwLDEwMSw3LDAsMTMxLDMsMCwKLSAgICA5MCw4LDAsNzEsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsMCwxMDAsMTEsMCwKLSAgICAxMzEsMiwwLDkwLDksMCw3MSwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLAotICAgIDEwMCwxMywwLDEzMSwyLDAsOTAsMTAsMCw3MSwxMDAsMTQsMCwxMDAsMTUsMCwKLSAgICAxMzIsMCwwLDEwMCwxNSwwLDEzMSwyLDAsOTAsMTEsMCwxMDAsMTYsMCwxMDAsCi0gICAgMTcsMCwxMzIsMCwwLDkwLDEyLDAsMTAwLDE4LDAsMTAwLDE5LDAsMTMyLDAsCi0gICAgMCw5MCwxMywwLDEwMCwyMCwwLDEwMCwyMSwwLDEzMiwwLDAsOTAsMTQsMCwKLSAgICAxMDAsMjIsMCwxMDAsMjMsMCwxMDAsMjQsMCwxMDAsMjUsMCwxMzIsMCwxLDkwLAotICAgIDE1LDAsMTAwLDI2LDAsMTAwLDI3LDAsMTMyLDAsMCw5MCwxNiwwLDEwMCwyOCwKLSAgICAwLDEwMCwyOSwwLDEzMiwwLDAsOTAsMTcsMCwxMDAsMzAsMCwxMDAsMzEsMCwKLSAgICAxMzIsMCwwLDkwLDE4LDAsMTAwLDMyLDAsMTAwLDMzLDAsMTMyLDAsMCw5MCwKLSAgICAxOSwwLDcxLDEwMCwzNCwwLDEwMCwzNSwwLDEzMiwwLDAsMTAwLDM1LDAsMTMxLAotICAgIDIsMCw5MCwyMCwwLDcxLDEwMCwzNiwwLDEwMCwzNywwLDEzMiwwLDAsMTAwLAotICAgIDM3LDAsMTMxLDIsMCw5MCwyMSwwLDEwMCwzOCwwLDEwMCwxLDAsMTAwLDM5LAotICAgIDAsMTAwLDEsMCwxMDAsNDAsMCwxMDAsNDEsMCwxMzIsMCwyLDkwLDIyLDAsCi0gICAgMTAxLDIzLDAsMTMxLDAsMCw5MCwyNCwwLDEwMCwxLDAsMTAwLDEsMCwxMDAsCi0gICAgNDIsMCwxMDAsNDMsMCwxMzIsMiwwLDkwLDI1LDAsMTAwLDQ0LDAsMTAwLDQ1LAotICAgIDAsMTAwLDQ2LDAsMTAwLDQ3LDAsMTMyLDAsMSw5MCwyNiwwLDEwMCw0OCwwLAotICAgIDEwMCw0OSwwLDEzMiwwLDAsOTAsMjcsMCwxMDAsNTAsMCwxMDAsNTEsMCwxMzIsCi0gICAgMCwwLDkwLDI4LDAsMTAwLDUyLDAsMTAwLDUzLDAsMTMyLDAsMCw5MCwyOSwKLSAgICAwLDEwMCw1NCwwLDEwMCw1NSwwLDEzMiwwLDAsOTAsMzAsMCwxMDAsNTYsMCwKLSAgICAxMDAsNTcsMCwxMzIsMCwwLDkwLDMxLDAsMTAwLDU4LDAsMTAwLDU5LDAsMTMyLAotICAgIDAsMCw5MCwzMiwwLDcxLDEwMCw2MCwwLDEwMCw2MSwwLDEzMiwwLDAsMTAwLAotICAgIDYxLDAsMTMxLDIsMCw5MCwzMywwLDcxLDEwMCw2MiwwLDEwMCw2MywwLDEzMiwKLSAgICAwLDAsMTAwLDYzLDAsMTMxLDIsMCw5MCwzNCwwLDcxLDEwMCw2NCwwLDEwMCwKLSAgICA2NSwwLDEzMiwwLDAsMTAwLDY1LDAsMTMxLDIsMCw5MCwzNSwwLDEwMCw2NiwKLSAgICAwLDEwMCw2NywwLDEzMiwwLDAsOTAsMzYsMCwxMDAsNjgsMCwxMDAsNjksMCwKLSAgICAxMzIsMCwwLDkwLDM3LDAsMTAwLDEsMCwxMDAsNzAsMCwxMDAsNzEsMCwxMzIsCi0gICAgMSwwLDkwLDM4LDAsMTAwLDcyLDAsMTAwLDczLDAsMTMyLDAsMCw5MCwzOSwKLSAgICAwLDEwMCw3NCwwLDkwLDQwLDAsMTAxLDQwLDAsMTAwLDc1LDAsMjMsOTAsNDEsCi0gICAgMCwxMDAsNzYsMCwxMDAsNzcsMCwxMzIsMCwwLDkwLDQyLDAsMTAwLDc4LDAsCi0gICAgMTAwLDc5LDAsMTMyLDAsMCw5MCw0MywwLDEwMCwxLDAsMTAwLDgwLDAsMTAwLAotICAgIDgxLDAsMTAwLDgyLDAsMTMyLDIsMCw5MCw0NCwwLDEwMCw4MywwLDEwMCw4NCwKLSAgICAwLDEzMiwwLDAsOTAsNDUsMCwxMDAsODUsMCwxMDAsODYsMCwxMzIsMCwwLAotICAgIDkwLDQ2LDAsMTAwLDEsMCwxMDAsMSwwLDEwMiwwLDAsMTAwLDgwLDAsMTAwLAotICAgIDg3LDAsMTAwLDg4LDAsMTMyLDQsMCw5MCw0NywwLDEwMCw4OSwwLDEwMCw5MCwKLSAgICAwLDEzMiwwLDAsOTAsNDgsMCwxMDAsOTEsMCwxMDAsOTIsMCwxMzIsMCwwLAotICAgIDkwLDQ5LDAsMTAwLDkzLDAsMTAwLDk0LDAsMTMyLDAsMCw5MCw1MCwwLDEwMCwKLSAgICAxLDAsODMsNDEsOTUsOTcsODMsMSwwLDAsNjcsMTExLDExNCwxMDEsMzIsMTA1LAotICAgIDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTAsMTAsODQsMTA0LDEwNSwxMTUsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw3OCw3OSw4NCwzMiwxMDksMTAxLDk3LAotICAgIDExMCwxMTYsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMDgsCi0gICAgMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzMsMzIsNzMsMTE2LDMyLDEwNCwKLSAgICA5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTAwLDEwMSwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwKLSAgICAzMiwxMTUsMTE3LDk5LDEwNCwxMCwxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTE2LDMyLDk5LDk3LAotICAgIDExMCwzMiw5OCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExMiwxMDEsCi0gICAgMTAwLDMyLDEwNSwxMTAsMTE2LDExMSwzMiw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDk3LDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw2NSwKLSAgICAxMTUsMTAsMTE1LDExNyw5OSwxMDQsMzIsMTA1LDExNiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwKLSAgICAxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsCi0gICAgMzIsMTExLDEwMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LAotICAgIDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLDExNCwzMiwxMTYsMTExLDEwLAotICAgIDExOSwxMTEsMTE0LDEwNyw0NiwzMiw3OSwxMTAsMTAxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLAotICAgIDMyLDExNywxMTUsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsCi0gICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTcsOTgsMTA4LDEwNSw5OSw0NSwxMDIsOTcsOTksCi0gICAgMTA1LDExMCwxMDMsMzIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE2LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDc4LDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDcsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDkyLDAsMCwwLDEyMCw2NiwwLDEwMCwxLDAsMTAwLDIsCi0gICAgMCwxMDAsMywwLDEwMCw0LDAsMTAzLDQsMCw2OCw5Myw0NiwwLDEyNSwyLAotICAgIDAsMTE2LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMTQsMTksMCwKLSAgICAxMTYsMSwwLDEyNCwwLDAsMTI0LDIsMCwxMTYsMiwwLDEyNCwxLDAsMTI0LAotICAgIDIsMCwxMzEsMiwwLDEzMSwzLDAsMSwxMTMsMTksMCw4NywxMjQsMCwwLAotICAgIDEwNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDEwNiwzLDAsMTMxLDEsMCwxLAotICAgIDEwMCw1LDAsODMsNDEsNiwxMjIsNDcsODMsMTA1LDEwOSwxMTIsMTA4LDEwMSwzMiwxMTUsCi0gICAgMTE3LDk4LDExNSwxMTYsMTA1LDExNiwxMTcsMTE2LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDIsMTE3LAotICAgIDExMCw5OSwxMTYsMTExLDExMSwxMDgsMTE1LDQ2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsOTUsMTE5LAotICAgIDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNDYsMjE4LDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDk1LDk1LDIxOCw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwxMiw5NSwKLSAgICA5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwxMDAsCi0gICAgMTExLDk5LDk1LDk1LDc4LDQxLDUsMjE4LDcsMTA0LDk3LDExNSw5NywxMTYsMTE2LDExNCwKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwyMDIsMSwwLDAsMTAwLDAsOTAsMCwxMDAsMSwKKyAgICA5NywxLDEwMCwyLDEwMCwzLDEzMiwwLDkwLDIsMTAwLDQsMTAwLDUsMTMyLDAsCisgICAgOTAsMywxMDUsMCw5MCw0LDEwNSwwLDkwLDUsNzEsMCwxMDAsNiwxMDAsNywKKyAgICAxMzIsMCwxMDAsNywxMDEsNiwxMzEsMyw5MCw3LDcxLDAsMTAwLDgsMTAwLDksCisgICAgMTMyLDAsMTAwLDksMTMxLDIsOTAsOCw3MSwwLDEwMCwxMCwxMDAsMTEsMTMyLDAsCisgICAgMTAwLDExLDEzMSwyLDkwLDksNzEsMCwxMDAsMTIsMTAwLDEzLDEzMiwwLDEwMCwxMywKKyAgICAxMzEsMiw5MCwxMCwxMDAsMTQsMTAwLDE1LDEzMiwwLDkwLDExLDEwMCwxNiwxMDAsMTcsCisgICAgMTMyLDAsOTAsMTIsMTAwLDE4LDEwMCwxOSwxMzIsMCw5MCwxMywxMDAsMjAsMTAwLDIxLAorICAgIDE1NiwxLDEwMCwyMiwxMDAsMjMsMTMyLDIsOTAsMTQsMTAwLDI0LDEwMCwyNSwxMzIsMCwKKyAgICA5MCwxNSwxMDAsMjYsMTAwLDI3LDEzMiwwLDkwLDE2LDEwMCwyOCwxMDAsMjksMTMyLDAsCisgICAgOTAsMTcsMTAwLDMwLDEwMCwzMSwxMzIsMCw5MCwxOCw3MSwwLDEwMCwzMiwxMDAsMzMsCisgICAgMTMyLDAsMTAwLDMzLDEzMSwyLDkwLDE5LDcxLDAsMTAwLDM0LDEwMCwzNSwxMzIsMCwKKyAgICAxMDAsMzUsMTMxLDIsOTAsMjAsMTAwLDEsMTAwLDEsMTAwLDM2LDE1NiwyLDEwMCwzNywKKyAgICAxMDAsMzgsMTMyLDIsOTAsMjEsMTAxLDIyLDEzMSwwLDkwLDIzLDEwMCw5MiwxMDAsMzksCisgICAgMTAwLDQwLDEzMiwxLDkwLDI0LDEwMCw0MSwxMDAsNDIsMTU2LDEsMTAwLDQzLDEwMCw0NCwKKyAgICAxMzIsMiw5MCwyNSwxMDAsNDUsMTAwLDQ2LDEzMiwwLDkwLDI2LDEwMCw0NywxMDAsNDgsCisgICAgMTMyLDAsOTAsMjcsMTAwLDQ5LDEwMCw1MCwxMzIsMCw5MCwyOCwxMDAsNTEsMTAwLDUyLAorICAgIDEzMiwwLDkwLDI5LDEwMCw1MywxMDAsNTQsMTMyLDAsOTAsMzAsMTAwLDU1LDEwMCw1NiwKKyAgICAxMzIsMCw5MCwzMSw3MSwwLDEwMCw1NywxMDAsNTgsMTMyLDAsMTAwLDU4LDEzMSwyLAorICAgIDkwLDMyLDcxLDAsMTAwLDU5LDEwMCw2MCwxMzIsMCwxMDAsNjAsMTMxLDIsOTAsMzMsCisgICAgNzEsMCwxMDAsNjEsMTAwLDYyLDEzMiwwLDEwMCw2MiwxMzEsMiw5MCwzNCwxMDAsNjMsCisgICAgMTAwLDY0LDEzMiwwLDkwLDM1LDEwMCw2NSwxMDAsNjYsMTMyLDAsOTAsMzYsMTAwLDkzLAorICAgIDEwMCw2NywxMDAsNjgsMTMyLDEsOTAsMzcsMTAwLDY5LDEwMCw3MCwxMzIsMCw5MCwzOCwKKyAgICAxMDAsNzEsOTAsMzksMTAxLDM5LDEwMCw3MiwyMywwLDkwLDQwLDEwMCw3MywxMDAsNzQsCisgICAgMTMyLDAsOTAsNDEsMTAwLDc1LDEwMCw3NiwxMzIsMCw5MCw0MiwxMDAsOTQsMTAwLDc4LAorICAgIDEwMCw3OSwxMzIsMSw5MCw0MywxMDAsODAsMTAwLDgxLDEzMiwwLDkwLDQ0LDEwMCw4MiwKKyAgICAxMDAsODMsMTMyLDAsOTAsNDUsMTAwLDEsMTAwLDEsMTAyLDAsMTAwLDc3LDEwMiw0LAorICAgIDEwMCw4NCwxMDAsODUsMTMyLDEsOTAsNDYsMTAwLDg2LDEwMCw4NywxMzIsMCw5MCw0NywKKyAgICAxMDAsODgsMTAwLDg5LDEzMiwwLDkwLDQ4LDEwMCw5MCwxMDAsOTEsMTMyLDAsOTAsNDksCisgICAgMTAwLDEsODMsMCw0MSw5NSw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLAorICAgIDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsCisgICAgOTcsMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LAorICAgIDEwOCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsCisgICAgMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsCisgICAgMTAwLDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksCisgICAgOTcsMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLAorICAgIDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsCisgICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLAorICAgIDY1LDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLAorICAgIDExMCwzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwKKyAgICAxMTcsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsCisgICAgMTAsMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwKKyAgICAxMDAsMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiwKKyAgICA5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5NywKKyAgICA5OSwxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICAxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNjAsMCwwLDAsMTIwLDQwLDEwMCw2LDY4LDAsOTMsCisgICAgMzIsMTI1LDIsMTE2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTE0LDYsMTE2LDEsMTI0LAorICAgIDAsMTI0LDIsMTE2LDIsMTI0LDEsMTI0LDIsMTMxLDIsMTMxLDMsMSwwLDExMywKKyAgICA2LDg3LDAsMTI0LDAsMTA2LDMsMTA2LDQsMTI0LDEsMTA2LDMsMTMxLDEsMSwKKyAgICAwLDEwMCw1LDgzLDAsNDEsNywxMjIsNDcsODMsMTA1LDEwOSwxMTIsMTA4LDEwMSwzMiwKKyAgICAxMTUsMTE3LDk4LDExNSwxMTYsMTA1LDExNiwxMTcsMTE2LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDIsCisgICAgMTE3LDExMCw5OSwxMTYsMTExLDExMSwxMDgsMTE1LDQ2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsOTUsCisgICAgMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNDYsMjE4LDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDk1LDk1LDIxOCw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwxMiwKKyAgICA5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwKKyAgICAxMDAsMTExLDk5LDk1LDk1LDc4LDQxLDQsMTIyLDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDk1LDk1LDEyMiw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiwxMiwKKyAgICA5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwxMjIsNyw5NSw5NSwKKyAgICAxMDAsMTExLDk5LDk1LDk1LDQxLDUsMjE4LDcsMTA0LDk3LDExNSw5NywxMTYsMTE2LDExNCwKICAgICAyMTgsNywxMTUsMTAxLDExNiw5NywxMTYsMTE2LDExNCwyMTgsNywxMDMsMTAxLDExNiw5NywxMTYsCiAgICAgMTE2LDExNCwyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LDExNiw5NSw5NSwyMTgsNiwxMTcsMTEyLAogICAgIDEwMCw5NywxMTYsMTAxLDQxLDMsOTAsMywxMTAsMTAxLDExOSw5MCwzLDExMSwxMDgsMTAwLApAQCAtODcsMTkwMyArNzQsMTc1OCBAQAogICAgIDI1MCwyOSw2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKICAgICAxMDgsMTA1LDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw2MiwyMTgsCiAgICAgNSw5NSwxMTksMTE0LDk3LDExMiwyNywwLDAsMCwxMTUsOCwwLDAsMCwwLAotICAgIDIsMjUsMSwxNSwxLDI5LDEsMTE0LDEyLDAsMCwwLDk5LDEsMCwwLAorICAgIDIsMTAsMSwxMCwxLDIyLDEsMTE0LDEyLDAsMCwwLDk5LDEsMCwwLAogICAgIDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwwLDEyNCwKLSAgICAwLDAsMTMxLDEsMCw4Myw0MSwxLDc4LDQxLDIsMjE4LDQsMTE2LDEyMSwxMTIsCi0gICAgMTAxLDIxOCwzLDExNSwxMjEsMTE1LDQxLDEsMjE4LDQsMTEwLDk3LDEwOSwxMDEsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDExLDk1LAotICAgIDExMCwxMDEsMTE5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM1LDAsMCwwLDExNSwyLAotICAgIDAsMCwwLDAsMSwxMTQsMTYsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNTgsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCw4Myw0MSw5LAotICAgIDIxOCwxMyw5NSw3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LDExMSw5NywxMDAsMTIyLAotICAgIDYzLDc3LDk3LDExMCw5NywxMDMsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTExLDExNSwKLSAgICAxMTUsMTA1LDk4LDEwOCwxMDEsMzIsOTksMTA4LDEwMSw5NywxMTAsNDUsMTE3LDExMiwzMiwxMTEsCi0gICAgMTAyLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSw0NiwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMjQsMSwwLDEyNCwwLDAsCi0gICAgOTUsMCwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwxLDIxOCw1LDk1LDExMCwKLSAgICA5NywxMDksMTAxLDQxLDIsMjE4LDQsMTE1LDEwMSwxMDgsMTAyLDExNCwxNSwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDMsMCwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCwxLDEyMiwyMiw5NSw3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LAotICAgIDExMSw5NywxMDAsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDI1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMTYsMSwwLDEwNiwKLSAgICAyLDAsMTA3LDYsMCwxMjQsMCwwLDk1LDMsMCwxMDAsMCwwLDgzLDQxLAotICAgIDEsNzgsNDEsNCwxMTQsMTgsMCwwLDAsMTE0LDE0LDAsMCwwLDIxOCw3LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwyMTgsMTAsOTUsMTA1LDExNSw5NSwxMTQsMTAxLDEwOCwKLSAgICAxMTEsOTcsMTAwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw5LDk1LDk1LDEwMSwxMTAsMTE2LAotICAgIDEwMSwxMTQsOTUsOTUsNDYsMCwwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwKLSAgICAyMyw5NSw3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LDExMSw5NywxMDAsNDYsOTUsCi0gICAgOTUsMTAxLDExMCwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwxMSwwLDAsMCw3MSwwLDAsMCwxMTUsNzcsMCwKLSAgICAwLDAsMTE2LDAsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjQsMSwKLSAgICAwLDY4LDEzMSwxLDAsMTMxLDEsMCwxMTQsNzMsMCwxMjQsMCwwLDEwNiwxLAotICAgIDAsMTIsMTE0LDczLDAsMTIxLDE3LDAsMTE2LDIsMCwxMDYsMywwLDEyNCwwLAotICAgIDAsMTA2LDQsMCw2MSw4NywxMTAsMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsCi0gICAgMTE0LDcyLDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMDAsMCwwLDgzLDQxLAotICAgIDMsNzgsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywKLSAgICAwLDAsMCwxMTUsMCwwLDAsMTE1LDI3LDAsMCwwLDEyNCwwLDAsOTMsCi0gICAgMTcsMCwxMjUsMSwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOSwwLDg2LDEsCi0gICAgMTEzLDMsMCwxMDAsMCwwLDgzLDQxLDEsNzgsMTE0LDEwLDAsMCwwLDQxLAotICAgIDIsMjE4LDIsNDYsNDgsMjE4LDMsOTcsMTE0LDEwMywxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyNTAsOSw2MCwxMDMsMTAxLDExMCwxMDEsCi0gICAgMTIwLDExMiwxMTQsNjIsNTAsMCwwLDAsMTE1LDIsMCwwLDAsNiwwLDEyMiwKLSAgICA0MSw5NSw3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LDExMSw5NywxMDAsNDYsOTUsCi0gICAgOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2MiwKLSAgICA0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNDEsNiwyMTgsMyw5NywxMTAsCi0gICAgMTIxLDExNCwyMiwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLAotICAgIDExNCwxOCwwLDAsMCwyMTgsOCw3NSwxMDEsMTIxLDY5LDExNCwxMTQsMTExLDExNCw0MSwKLSAgICAyLDExNCwxOSwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMDEsCi0gICAgMTIwLDEwNSwxMTYsOTUsOTUsNDksMCwwLDAsMTE1LDEwLDAsMCwwLDAsMSwKLSAgICAzNSwxLDMsMSwxNywxLDEzLDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsCi0gICAgMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsCi0gICAgNzgsNDEsNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLAotICAgIDAsMCwxMTQsMywwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsMCwKLSAgICAwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE3LDAsMCwwLDM5LAotICAgIDAsMCwwLDExNSw4LDAsMCwwLDEyLDIsNiwyLDEyLDMsMTIsMywKLSAgICAxMTQsMTcsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMSwwLDAsMCw2NCwwLDAsMCwxMTUsMTYsMCwwLDAsMTAxLAotICAgIDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDIxOCwxNCw5NSw2OCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDY5LDExNCwxMTQsMTExLAotICAgIDExNCw3OCw0MSwzLDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwxMTQsMzEsMCwwLDAsNjQsMCwwLDAsCi0gICAgMTE1LDIsMCwwLDAsMTIsMSwxMTQsMzEsMCwwLDAsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsODIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAotICAgIDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwKLSAgICAxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwxMDAsCi0gICAgOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDEwMCwxMSwwLDEzMiwwLAotICAgIDAsOTAsOCwwLDEwMCwxMiwwLDgzLDQxLDEzLDIxOCwxMSw5NSw3NywxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsMTIyLDE2OSw2NSwzMiwxMTQsMTAxLDk5LDExNywxMTQsCi0gICAgMTE1LDEwNSwxMTgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTA1LAotICAgIDExNSwzMiw5Nyw5OCwxMDgsMTAxLDMyLDExNiwxMTEsMzIsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiwKLSAgICAzMiwxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywxMTUsMTAsMzIsMzIsMzIsMzIsNDAsCi0gICAgMTAxLDQ2LDEwMyw0NiwzMiwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDMyLDQ5LDMyLDExNiwxMTQsCi0gICAgMTIxLDEwNSwxMTAsMTAzLDMyLDExNiwxMTEsMzIsMTE2LDk3LDEwNywxMDEsMzIsMTA4LDExMSw5OSwKLSAgICAxMDcsMTE1LDMyLDY1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw2Niw0NCwzMiw5NywxMTAsMTAwLAotICAgIDMyLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsMzIsNTAsMzIsMTE2LDExNCwxMjEsMTA1LDExMCwxMDMsCi0gICAgMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTYsOTcsMTA3LDEwMSwzMiwxMDgsMTExLDk5LAotICAgIDEwNywxMTUsMzIsNjYsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDY1LDQxLDQ2LDEwLDMyLDMyLAotICAgIDMyLDMyLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDcwLDAsMCwwLDExNiwwLDAsMTA2LAotICAgIDEsMCwxMzEsMCwwLDEyNCwwLDAsOTUsMiwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSw0LDAsMTAwLDAsMCwxMjQsMCwwLDk1LDUsMCwxMDAsMSwwLDEyNCwKLSAgICAwLDAsOTUsNiwwLDEwMCwxLDAsMTI0LDAsMCw5NSw3LDAsMTAwLDAsCi0gICAgMCw4Myw0MSwyLDc4LDIzMywwLDAsMCwwLDQxLDgsMjE4LDcsOTUsMTE2LAotICAgIDEwNCwxMTQsMTAxLDk3LDEwMCw5MCwxMyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTAxLDk1LAotICAgIDEwOCwxMTEsOTksMTA3LDIxOCw0LDEwOCwxMTEsOTksMTA3LDIxOCw2LDExOSw5NywxMDcsMTAxLAotICAgIDExNywxMTIsMTE0LDE1LDAsMCwwLDIxOCw1LDExMSwxMTksMTEwLDEwMSwxMTQsMjE4LDUsCi0gICAgOTksMTExLDExNywxMTAsMTE2LDIxOCw3LDExOSw5NywxMDUsMTE2LDEwMSwxMTQsMTE1LDQxLDIsCi0gICAgMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsNzQsMCwKLSAgICAwLDAsMTE1LDEyLDAsMCwwLDAsMSwxNSwxLDE1LDEsOSwxLDksCi0gICAgMSw5LDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKLSAgICA0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDQsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsODgsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDEsMCwxMjQsCi0gICAgMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjAsNjAsMCwxMTYsMywwLDEwNiw0LAotICAgIDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsMCwwLAotICAgIDEwNyw4LDAsMTE0LDU1LDAsMTAwLDEsMCw4MywxMjQsMywwLDEwNiwyLDAsCi0gICAgMTI1LDIsMCwxMjQsMiwwLDEyNCwxLDAsMTA3LDIsMCwxMTQsMjQsMCwxMDAsCi0gICAgMiwwLDgzLDExMywyNCwwLDg3LDEwMCwwLDAsODMsNDEsMyw3OCw3MCw4NCwKLSAgICA0MSw1LDExNCwzNCwwLDAsMCwyMTgsOSwxMDMsMTAxLDExNiw5NSwxMDUsMTAwLDEwMSwKLSAgICAxMTAsMTE2LDExNCwzNywwLDAsMCwyMTgsMTIsOTUsOTgsMTA4LDExMSw5OSwxMDcsMTA1LAotICAgIDExMCwxMDMsOTUsMTExLDExMCwyMTgsMywxMDMsMTAxLDExNiw0MSw0LDExNCwxOSwwLDAsCi0gICAgMCw5MCwyLDEwOSwxMDEsMjE4LDMsMTE2LDEwNSwxMDAsMTE0LDM1LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMiwKLSAgICAxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDgyLDAsMCwwLAotICAgIDExNSwxOCwwLDAsMCwwLDIsMTIsMSw5LDEsMywxLDE1LDEsMTIsCi0gICAgMSw0LDEsOSwxLDEyLDEsMTIyLDI0LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzYsMTExLDk5LDEwNyw0NiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksCi0gICAgMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDE2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwyMTAsMCwwLDAsMTE2LDAsMCwxMDYsMSwKLSAgICAwLDEzMSwwLDAsMTI1LDEsMCwxMjQsMCwwLDExNiwyLDAsMTI0LDEsMCwKLSAgICA2MCwxMjIsMTczLDAsMTIwLDE2NiwwLDEyNCwwLDAsMTA2LDMsMCwxNDMsMTI0LDAsCi0gICAgMSwxMjQsMCwwLDEwNiw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNSw2OCwwLAotICAgIDEyNCwwLDAsMTA2LDUsMCwxMjQsMSwwLDEwNywyLDAsMTE0LDk2LDAsMTI0LAotICAgIDEsMCwxMjQsMCwwLDk1LDUsMCwxMjQsMCwwLDQsMTA2LDQsMCwxMDAsCi0gICAgMiwwLDU1LDIsOTUsNCwwLDEwMCwzLDAsODMsMTI0LDAsMCwxMDYsNiwKLSAgICAwLDEzMSwwLDAsMTE0LDEyNCwwLDExNiw3LDAsMTAwLDQsMCwxMjQsMCwwLAotICAgIDIyLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwKLSAgICAxMDAsNSwwLDEzMSwxLDAsMTE0LDE1NywwLDEyNCwwLDAsNCwxMDYsMTAsMCwKLSAgICAxMDAsMiwwLDU1LDIsOTUsMTAsMCw4NywxMDAsNiwwLDgxLDgyLDg4LDEyNCwKLSAgICAwLDAsMTA2LDgsMCwxMDYsOSwwLDEzMSwwLDAsMSwxMjQsMCwwLDEwNiwKLSAgICA4LDAsMTA2LDExLDAsMTMxLDAsMCwxLDExMywyOCwwLDg3LDg3LDEwMCw2LAotICAgIDAsMTE2LDIsMCwxMjQsMSwwLDYxLDg4LDEwMCw2LDAsODMsNDEsNywxMjIsCi0gICAgMTg1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDY1LDk5LDExMywxMTcsMTA1LDExNCwKLSAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5OSwKLSAgICAxMDcsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSwKLSAgICA5NywxMDgsMzIsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiwxMDAsCi0gICAgMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsOTcsMzIsOTUsNjgsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiw5NywxMDgsMTE5LDk3LAotICAgIDEyMSwxMTUsMzIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICA4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsCi0gICAgNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDMzLDAsMCwwLDIzMywKLSAgICAxLDAsMCwwLDg0LDEyMiwyMywxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywzMiwKLSAgICAxMDAsMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDM3LDExNCw3MCw3OCwKLSAgICA0MSwxMiwxMTQsMzQsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw0MSwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCwzNywwLDAsMCwKLSAgICAxMTQsNDQsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwzNiwwLDAsMCwyMTgsCi0gICAgNyw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNCwzOSwwLDAsMCwyMTgsNywxMTQsCi0gICAgMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwKKyAgICAwLDExNSwxMiwwLDAsMCwxMTYsMCwxMTYsMSwxMzEsMSwxMjQsMCwxMzEsMSwKKyAgICA4MywwLDQxLDEsNzgsNDEsMiwyMTgsNCwxMTYsMTIxLDExMiwxMDEsMjE4LDMsMTE1LAorICAgIDEyMSwxMTUsNDEsMSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTEsOTUsMTEwLDEwMSwxMTksOTUsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzUsMCwwLDAsMTE1LDIsMCwwLDAsMCwKKyAgICAxLDExNCwxNiwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDY0LDAsMCwwLDExNSwxMiwwLDAsMCwKKyAgICAxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsODMsMCw0MSwyLDIxOCwxNCwKKyAgICA5NSw2OCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDY5LDExNCwxMTQsMTExLDExNCw3OCw0MSwKKyAgICAzLDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwxMTQsMTcsMCwwLDAsNDcsMCwwLDAsMTE1LDIsMCwKKyAgICAwLDAsOCwxLDExNCwxNywwLDAsMCw5OSwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSw1NiwKKyAgICAwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsCisgICAgMiwxMDAsMywxMzIsMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLAorICAgIDYsMTAwLDcsMTMyLDAsOTAsNiwxMDAsOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwKKyAgICAxMCwxMDAsMTEsMTMyLDAsOTAsOCwxMDAsMTIsODMsMCw0MSwxMywyMTgsMTEsOTUsCisgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDEyMiwxNjksNjUsMzIsMTE0LDEwMSwKKyAgICA5OSwxMTcsMTE0LDExNSwxMDUsMTE4LDEwMSwzMiwxMDgsMTExLDk5LDEwNywzMiwxMDUsMTA5LDExMiwKKyAgICAxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE5LDEwNCwxMDUsOTksCisgICAgMTA0LDMyLDEwNSwxMTUsMzIsOTcsOTgsMTA4LDEwMSwzMiwxMTYsMTExLDMyLDEwMCwxMDEsMTE2LAorICAgIDEwMSw5OSwxMTYsMzIsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMTE1LDEwLDMyLDMyLAorICAgIDMyLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCwzMiw0OSwKKyAgICAzMiwxMTYsMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMTYsMTExLDMyLDExNiw5NywxMDcsMTAxLDMyLAorICAgIDEwOCwxMTEsOTksMTA3LDExNSwzMiw2NSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNjYsNDQsMzIsCisgICAgOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDMyLDUwLDMyLDExNiwxMTQsMTIxLAorICAgIDEwNSwxMTAsMTAzLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE2LDk3LDEwNywxMDEsMzIsCisgICAgMTA4LDExMSw5OSwxMDcsMTE1LDMyLDY2LDMyLDExNiwxMDQsMTAxLDExMCwzMiw2NSw0MSw0NiwKKyAgICAxMCwzMiwzMiwzMiwzMiw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMTYsCisgICAgMCwxMDYsMSwxMzEsMCwxMjQsMCw5NSwyLDExNiwwLDEwNiwxLDEzMSwwLDEyNCwKKyAgICAwLDk1LDMsMTI0LDEsMTI0LDAsOTUsNCwxMDAsMCwxMjQsMCw5NSw1LDEwMCwKKyAgICAxLDEyNCwwLDk1LDYsMTAwLDEsMTI0LDAsOTUsNywxMDAsMCw4MywwLDQxLAorICAgIDIsNzgsMjMzLDAsMCwwLDAsNDEsOCwyMTgsNyw5NSwxMTYsMTA0LDExNCwxMDEsCisgICAgOTcsMTAwLDkwLDEzLDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMDEsOTUsMTA4LDExMSw5OSwKKyAgICAxMDcsMjE4LDQsMTA4LDExMSw5OSwxMDcsMjE4LDYsMTE5LDk3LDEwNywxMDEsMTE3LDExMiwxMTQsCisgICAgMTUsMCwwLDAsMjE4LDUsMTExLDExOSwxMTAsMTAxLDExNCwyMTgsNSw5OSwxMTEsMTE3LAorICAgIDExMCwxMTYsMjE4LDcsMTE5LDk3LDEwNSwxMTYsMTAxLDExNCwxMTUsNDEsMiwyMTgsNCwxMTUsCisgICAgMTAxLDEwOCwxMDIsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCw4LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSwKKyAgICA5NSw1NywwLDAsMCwxMTUsMTIsMCwwLDAsMCwxLDEwLDEsMTAsMSwKKyAgICA2LDEsNiwxLDYsMSwxMjIsMjAsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTksMTA3LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsNCwwLDAsMCwyLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw2NCwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxMjUsMSwxMjQsMCwKKyAgICAxMDYsMiwxMjUsMiwxMjAsNDQsMTE2LDMsMTA2LDQsMTI0LDIsMTMxLDEsMTI1LDMsCisgICAgMTI0LDMsMTAwLDAsMTA3LDgsMTE0LDM4LDEwMCwxLDgzLDAsMTI0LDMsMTA2LDIsCisgICAgMTI1LDIsMTI0LDIsMTI0LDEsMTA3LDIsMTE0LDE2LDEwMCwyLDgzLDAsMTEzLDE2LAorICAgIDg3LDAsMTAwLDAsODMsMCw0MSwzLDc4LDcwLDg0LDQxLDUsMTE0LDIwLDAsCisgICAgMCwwLDIxOCw5LDEwMywxMDEsMTE2LDk1LDEwNSwxMDAsMTAxLDExMCwxMTYsMTE0LDIzLDAsCisgICAgMCwwLDIxOCwxMiw5NSw5OCwxMDgsMTExLDk5LDEwNywxMDUsMTEwLDEwMyw5NSwxMTEsMTEwLAorICAgIDIxOCwzLDEwMywxMDEsMTE2LDQxLDQsMTE0LDI2LDAsMCwwLDkwLDIsMTA5LDEwMSwKKyAgICAyMTgsMywxMTYsMTA1LDEwMCwxMTQsMjEsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEyLDEwNCw5NywxMTUsOTUsMTAwLAorICAgIDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsNjUsMCwwLDAsMTE1LDE4LDAsMCwwLAorICAgIDAsMiw4LDEsNiwxLDIsMSwxMCwxLDgsMSw0LDEsNiwxLAorICAgIDgsMSwxMjIsMjQsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LAorICAgIDEwNCw5NywxMTUsOTUsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMTYsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDE2OCwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxMjUsMSwxMjQsMCwKKyAgICAxMTYsMiwxMjQsMSw2MCwwLDEyMiwxMzgsMTIwLDEzMiwxMjQsMCwxMDYsMywxNDMsOTYsCisgICAgMSwwLDEyNCwwLDEwNiw0LDEwMCwxLDEwNywyLDExNSw0OCwxMjQsMCwxMDYsNSwKKyAgICAxMjQsMSwxMDcsMiwxMTQsNzIsMTI0LDEsMTI0LDAsOTUsNSwxMjQsMCw0LDAsCisgICAgMTA2LDQsMTAwLDIsNTUsMCwyLDAsOTUsNCwxMDAsMyw4MywwLDEyNCwwLAorICAgIDEwNiw2LDEzMSwwLDExNCw5MiwxMTYsNywxMDAsNCwxMjQsMCwyMiwwLDEzMSwxLAorICAgIDEzMCwxLDEyNCwwLDEwNiw4LDEwNiw5LDEwMCw1LDEzMSwxLDExNCwxMTgsMTI0LDAsCisgICAgNCwwLDEwNiwxMCwxMDAsMiw1NSwwLDIsMCw5NSwxMCw4NywwLDEwMCw2LAorICAgIDgxLDAsODIsMCw4OCwwLDEyNCwwLDEwNiw4LDEwNiw5LDEzMSwwLDEsMCwKKyAgICAxMjQsMCwxMDYsOCwxMDYsMTEsMTMxLDAsMSwwLDExMywyMCw4NywwLDg3LDAsCisgICAgMTAwLDYsMTE2LDIsMTI0LDEsNjEsMCw4OCwwLDEwMCw2LDgzLDAsNDEsNywKKyAgICAxMjIsMTg1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDY1LDk5LDExMywxMTcsMTA1LAorICAgIDExNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSwKKyAgICA5OSwxMDcsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LAorICAgIDEwNSw5NywxMDgsMzIsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiwKKyAgICAxMDAsMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsOTcsMzIsOTUsNjgsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LAorICAgIDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDQsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiw5NywxMDgsMTE5LAorICAgIDk3LDEyMSwxMTUsMzIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsOTcsMTEwLDEwMCwKKyAgICAzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwKKyAgICAxMDAsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDE5LDAsMCwwLAorICAgIDIzMywxLDAsMCwwLDg0LDEyMiwyMywxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywKKyAgICAzMiwxMDAsMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDM3LDExNCw3MCwKKyAgICA3OCw0MSwxMiwxMTQsMjAsMCwwLDAsMTE0LDI4LDAsMCwwLDExNCwyOSwwLAorICAgIDAsMCwxMTQsMjEsMCwwLDAsMTE0LDI0LDAsMCwwLDExNCwyMywwLDAsCisgICAgMCwxMTQsMzIsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwyMiwwLDAsMCwKKyAgICAyMTgsNyw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNCwyNSwwLDAsMCwyMTgsNywKKyAgICAxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw0MSwyLDExNCwyNiwwLDAsMCwxMTQsMzEsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKKyAgICAwLDAsMTE0LDM0LDAsMCwwLDc3LDAsMCwwLDExNSwzMiwwLDAsMCwKKyAgICAwLDYsOCwxLDgsMSwyLDEsMiwxLDgsMSwyMCwxLDYsMSwKKyAgICAxNCwxLDQsMSw4LDEsMTIsMSwxMiwxLDI0LDIsMTAsMSwxOCwyLAorICAgIDEyMiwxOSw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTcsOTksCisgICAgMTEzLDExNywxMDUsMTE0LDEwMSw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCwxMCwwLDAsMCw2NywwLDAsMCwxMTUsMTIyLDAsMCwwLDExNiwKKyAgICAwLDEwNiwxLDEzMSwwLDEyNSwxLDEyNCwwLDEwNiwyLDE0Myw5OCwxLDAsMTI0LAorICAgIDAsMTA2LDMsMTI0LDEsMTA3LDMsMTE0LDM0LDExNiw0LDEwMCwxLDEzMSwxLDEzMCwKKyAgICAxLDEyNCwwLDEwNiw1LDEwMCwyLDEwNyw0LDExNSw0OCwxMTYsNiwxMzAsMSwxMjQsCisgICAgMCw0LDAsMTA2LDUsMTAwLDMsNTYsMCwyLDAsOTUsNSwxMjQsMCwxMDYsCisgICAgNSwxMDAsMiwxMDcsMiwxMTQsMTA4LDEwMCwwLDEyNCwwLDk1LDMsMTI0LDAsMTA2LAorICAgIDcsMTE0LDEwOCwxMjQsMCw0LDAsMTA2LDcsMTAwLDMsNTYsMCwyLDAsOTUsCisgICAgNywxMjQsMCwxMDYsOCwxMDYsOSwxMzEsMCwxLDAsODcsMCwxMDAsMCw4MSwKKyAgICAwLDgyLDAsODgsMCwxMDAsMCw4MywwLDQxLDQsNzgsMTIyLDMxLDk5LDk3LAorICAgIDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTcsMTEwLDQ1LAorICAgIDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwxMTEsOTksMTA3LDExNCwxOSwwLAorICAgIDAsMCwxMTQsMzMsMCwwLDAsNDEsMTAsMTE0LDIwLDAsMCwwLDExNCwyOCwKKyAgICAwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDIzLDAsMCwwLDIxOCwxMiw4MiwKKyAgICAxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDI0LDAsMCwwLAorICAgIDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwKKyAgICAxMTQsMjUsMCwwLDAsMTE0LDIyLDAsMCwwLDExNCwzNSwwLDAsMCw0MSwKKyAgICAyLDExNCwyNiwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDM1LDAsMCwwLDEwMiwKKyAgICAwLDAsMCwxMTUsMjIsMCwwLDAsMCwxLDgsMSw4LDEsMTAsMSwKKyAgICA4LDEsMTQsMSwxNCwxLDEwLDEsNiwxLDYsMSwxNCwxLDEyMiwxOSwKKyAgICA5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsMTE0LDEwMSwxMDgsMTAxLAorICAgIDk3LDExNSwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisgICAgNCwwLDAsMCw2NywwLDAsMCwxMTUsMTgsMCwwLDAsMTAwLDEsMTA2LAorICAgIDAsMTI0LDAsMTA2LDEsMTE2LDIsMTI0LDAsMTMxLDEsMTMxLDIsODMsMCw0MSwKKyAgICAyLDc4LDEyMiwyMyw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDAsCisgICAgMTIzLDMzLDExNCwxMjUsNDEsMzIsOTcsMTE2LDMyLDEyMywxMjUsNDEsMywyMTgsNiwxMDIsCisgICAgMTExLDExNCwxMDksOTcsMTE2LDExNCwxNSwwLDAsMCwyMTgsMiwxMDUsMTAwLDQxLDEsCisgICAgMTE0LDI2LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDIxOCw4LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSwxMTUsMCwKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMCw5NSw3NywxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDc4LAorICAgIDQxLDksMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLAorICAgIDAsMTE0LDMsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwzMiwwLDAsMCwKKyAgICAxMTQsMzQsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMTE0LDE4LDAsMCwwLDUxLDAsMCwwLDExNSwxMiwwLDAsCisgICAgMCw4LDQsNCwyLDgsOCw4LDEyLDgsMjUsOCwxMywxMTQsMTgsMCwKKyAgICAwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCw2NCwwLDAsMCwxMTUsNDgsMCwwLDAsMTAxLDAsOTAsMSwKKyAgICAxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwKKyAgICAxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDEzMiwwLDkwLDYsCisgICAgMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsODMsMCw0MSwxMSwyMTgsMTYsCisgICAgOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKKyAgICAxMjIsODYsNjUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsMzIsOTUsNzcsMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsCisgICAgMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTgsMTE3LDEwNSwKKyAgICAxMDgsMTAwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMTExLDExNywxMTYsMTAsMzIsMzIsMzIsMzIsCisgICAgMTA5LDExNywxMDgsMTE2LDEwNSw0NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLAorICAgIDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiw0Niw5OSwyLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLAorICAgIDAsMCwxMjQsMSwxMjQsMCw5NSwwLDEwMCwxLDEyNCwwLDk1LDEsMTAwLDAsCisgICAgODMsMCw0MSwyLDc4LDExNCwxOSwwLDAsMCw0MSwyLDExNCwxNSwwLDAsCisgICAgMCwxMTQsMjQsMCwwLDAsNDEsMiwxMTQsMjYsMCwwLDAsMTE0LDE1LDAsCiAgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCw0NiwwLDAsMCw5NCwwLDAsMCwxMTUsMzIsMCwwLDAsMCwKLSAgICA2LDEyLDEsMTAsMSwzLDEsMywxLDEwLDEsMzAsMSw5LDEsMTUsCi0gICAgMSw0LDEsMTIsMSwxNiwxLDE4LDEsMjIsMiwxMywxLDIxLDIsMTIyLAotICAgIDE5LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsCi0gICAgMTE3LDEwNSwxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSwxNTcsMCwwLDAsMTE2LDAsCi0gICAgMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDEsMCwxMjQsMCwwLDEwNiwyLDAsCi0gICAgMTQzLDEyOSwwLDEsMTI0LDAsMCwxMDYsMywwLDEyNCwxLDAsMTA3LDMsMCwKLSAgICAxMTQsNDksMCwxMTYsNCwwLDEwMCwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwKLSAgICAwLDAsMTA2LDUsMCwxMDAsMiwwLDEwNyw0LDAsMTE1LDcwLDAsMTE2LDYsCi0gICAgMCwxMzAsMSwwLDEyNCwwLDAsNCwxMDYsNSwwLDEwMCwzLDAsNTYsMiwKLSAgICA5NSw1LDAsMTI0LDAsMCwxMDYsNSwwLDEwMCwyLDAsMTA3LDIsMCwxMTQsCi0gICAgMTQ2LDAsMTAwLDAsMCwxMjQsMCwwLDk1LDMsMCwxMjQsMCwwLDEwNiw3LAotICAgIDAsMTE0LDE0NiwwLDEyNCwwLDAsNCwxMDYsNywwLDEwMCwzLDAsNTYsMiwKLSAgICA5NSw3LDAsMTI0LDAsMCwxMDYsOCwwLDEwNiw5LDAsMTMxLDAsMCwxLAotICAgIDg3LDEwMCwwLDAsODEsODIsODgsMTAwLDAsMCw4Myw0MSw0LDc4LDEyMiwzMSwKLSAgICA5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE3LAotICAgIDExMCw0NSw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwxMDgsMTExLDk5LDEwNywxMTQsCi0gICAgMzMsMCwwLDAsMTE0LDQ1LDAsMCwwLDQxLDEwLDExNCwzNCwwLDAsMCwKLSAgICAxMTQsNDAsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwzNywwLDAsMCwyMTgsCi0gICAgMTIsODIsMTE3LDExMCwxMTYsMTA1LDEwOSwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwzOCwwLAotICAgIDAsMCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwxMDUsMTExLDExMCw2OSwxMTQsMTE0LAotICAgIDExMSwxMTQsMTE0LDM5LDAsMCwwLDExNCwzNiwwLDAsMCwxMTQsNDcsMCwwLAotICAgIDAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LDQzLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0NywwLDAsCi0gICAgMCwxMTksMCwwLDAsMTE1LDIyLDAsMCwwLDAsMSwxMiwxLDEwLDEsCi0gICAgMTUsMSwxMiwxLDIxLDEsMTUsMSwxNSwxLDksMSw5LDEsMTUsMSwKLSAgICAxMjIsMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDExNCwxMDEsCi0gICAgMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCi0gICAgMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDI1LDAsMCwwLDEwMCwKLSAgICAxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTE2LDIsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsMTMxLDIsMCw4Myw0MSwyLDc4LDEyMiwyMyw5NSw3NywxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDAsMTIzLDMzLDExNCwxMjUsNDEsMzIsOTcsCi0gICAgMTE2LDMyLDEyMywxMjUsNDEsMywyMTgsNiwxMDIsMTExLDExNCwxMDksOTcsMTE2LDExNCwxNSwKLSAgICAwLDAsMCwyMTgsMiwxMDUsMTAwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw4LDk1LAotICAgIDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSwxMzIsMCwwLDAsMTE1LDIsMCwwLDAsCi0gICAgMCwxLDEyMiwyMCw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsCi0gICAgOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDc4LDQxLDksMTE0LDEsMCwwLDAsCi0gICAgMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDMsMCwwLDAsMTE0LAotICAgIDIwLDAsMCwwLDExNCw0NCwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDQ3LAotICAgIDAsMCwwLDExNCw1MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDMyLDAsMCwKLSAgICAwLDY4LDAsMCwwLDExNSwxMiwwLDAsMCwxMiw0LDYsMiwxMiw4LAotICAgIDEyLDEyLDEyLDI1LDEyLDEzLDExNCwzMiwwLDAsMCw5OSwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLAotICAgIDExNSw3MCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsCi0gICAgMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCwKLSAgICA5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCwKLSAgICA2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDEwMCw5LAotICAgIDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsODMsNDEsMTEsMjE4LDE2LDk1LAotICAgIDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsMTIyLAotICAgIDg2LDY1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTAxLDMyLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsNzYsMTExLDk5LDEwNywzMiwxMDEsMTEzLDExNywxMDUsMTE4LDk3LDEwOCwxMDEsMTEwLDExNiwKLSAgICAzMiwxMDIsMTExLDExNCwzMiw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDk4LDExNywxMDUsMTA4LAotICAgIDEwMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LDExMSwxMTcsMTE2LDEwLDMyLDMyLDMyLDMyLDEwOSwKLSAgICAxMTcsMTA4LDExNiwxMDUsNDUsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsCi0gICAgMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjIsMCwwLAotICAgIDAsMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMDAsMSwwLDEyNCwwLDAsCi0gICAgOTUsMSwwLDEwMCwwLDAsODMsNDEsMiw3OCwxMTQsMzMsMCwwLDAsNDEsCi0gICAgMiwxMTQsMTUsMCwwLDAsMTE0LDM4LDAsMCwwLDQxLDIsMTE0LDE5LDAsCi0gICAgMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTQwLDAsMCwwLDExNSwKLSAgICA0LDAsMCwwLDAsMSw5LDEsMTIyLDI1LDk1LDY4LDExNywxMDksMTA5LDEyMSwKLSAgICA3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTA1LDExMCwxMDUsCi0gICAgMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAotICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE5LDAsMCwwLDEyNCwwLDAsCi0gICAgNCwxMDYsMCwwLDEwMCwxLDAsNTUsMiw5NSwwLDAsMTAwLDIsMCw4MywKLSAgICA0MSwzLDc4LDExNCw0NSwwLDAsMCw4NCw0MSwxLDExNCwzOCwwLDAsMCwKLSAgICA0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsNDYsMCwwLDAsMTQ0LDAsMCwwLDExNSwKLSAgICA0LDAsMCwwLDAsMSwxNSwxLDEyMiwyNCw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsCi0gICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywxMTcsMTA1LAotICAgIDExNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNDYsMCwwLDAsMTI0LDAsMCwxMDYsCi0gICAgMCwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsMjcsMCwxMTYsMSwwLDEwMCwyLAotICAgIDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwwLDAsNCwxMDYsMCwwLDEwMCwzLAotICAgIDAsNTYsMiw5NSwwLDAsMTAwLDAsMCw4Myw0MSw0LDc4LDExNCwzMywwLAorICAgIDAsMTE0LDI3LDAsMCwwLDEyMywwLDAsMCwxMTUsNCwwLDAsMCwwLAorICAgIDEsNiwxLDEyMiwyNSw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwxOCwwLDAsMCwxMjQsMCw0LDAsMTA2LDAsMTAwLDEsCisgICAgNTUsMCwyLDAsOTUsMCwxMDAsMiw4MywwLDQxLDMsNzgsMTE0LDMzLDAsCisgICAgMCwwLDg0LDQxLDEsMTE0LDI0LDAsMCwwLDQxLDEsMTE0LDI2LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDExNCwzNCwwLDAsMCwxMjcsMCwwLDAsMTE1LDQsMCwwLDAsMCwxLAorICAgIDE0LDEsMTIyLDI0LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDc2LDExMSw5OSwxMDcsNDYsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwzNiwwLDAsMCwxMjQsMCwxMDYsMCwxMDAsMSwxMDcsMiwxMTQsMTgsCisgICAgMTE2LDEsMTAwLDIsMTMxLDEsMTMwLDEsMTI0LDAsNCwwLDEwNiwwLDEwMCwzLAorICAgIDU2LDAsMiwwLDk1LDAsMTAwLDAsODMsMCw0MSw0LDc4LDExNCwxOSwwLAogICAgIDAsMCwxMjIsMzEsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDExNCwxMDEsMTA4LDEwMSw5NywKICAgICAxMTUsMTAxLDMyLDExNywxMTAsNDUsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMTE0LDQ1LDAsMCwwLDQxLDIsMTE0LDM4LDAsMCwwLDExNCwKLSAgICA0OCwwLDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNDcsMCwwLDAsMTQ4LAotICAgIDAsMCwwLDExNSw2LDAsMCwwLDAsMSwxNSwxLDEyLDEsMTIyLDI0LAorICAgIDExMSw5OSwxMDcsMTE0LDMzLDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLDExNCwKKyAgICAzNiwwLDAsMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzUsMCwwLDAsMTMxLAorICAgIDAsMCwwLDExNSw2LDAsMCwwLDAsMSwxMCwxLDgsMSwxMjIsMjQsCiAgICAgOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKICAgICA0NiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwyNSwwLAotICAgIDAsMCwxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDExNiwyLAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwyLDAsODMsNDEsMiw3OCwxMjIsMjgsCi0gICAgOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKLSAgICA0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywxMTYsMzIsMTIzLDEyNSw0MSwzLDExNCw1MCwKLSAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDUxLDAsMCwwLDQxLDEsMTE0LAotICAgIDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCw1MiwwLDAsMCwxNTMsMCwwLDAsMTE1LDIsMCwwLAotICAgIDAsMCwxLDEyMiwyNSw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw3OCw0MSwKLSAgICA4LDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLAotICAgIDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LAotICAgIDQ3LDAsMCwwLDExNCw1MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUzLDAsCi0gICAgMCwwLDEzNiwwLDAsMCwxMTUsMTAsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNCwxMiw0LDEyLDUsMTE0LDUzLDAsMCwwLDk5LDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LAotICAgIDUyLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLAotICAgIDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLDMsMCwxMDAsMywwLDEwMCwKLSAgICA0LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLAotICAgIDAsOTAsNSwwLDEwMCw3LDAsODMsNDEsOCwyMTgsMTgsOTUsNzcsMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw5OSwyLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwKLSAgICAwLDEwMCwwLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDAsMCw4Myw0MSwxLAotICAgIDc4LDQxLDIsMTE0LDE4LDAsMCwwLDIxOCw1LDk1LDEwOCwxMTEsOTksMTA3LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTU5LAotICAgIDAsMCwwLDExNSw0LDAsMCwwLDAsMSw5LDEsMTIyLDI3LDk1LDc3LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsCi0gICAgNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSw1MywKLSAgICAwLDAsMCwxMjIsMjIsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDEyNCwwLDAsOTUsMiwwLDg3LDEwMCwwLDAsMTE2LDMsMCwxMDYsCi0gICAgNCwwLDEzMSwwLDAsMSw4OCwxMjQsMCwwLDEwNiwyLDAsMTA2LDUsMCwKLSAgICAxMzEsMCwwLDEsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDE2LDk1LAotICAgIDEwMywxMDEsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAxOCwwLDAsMCwxMTQsNTUsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwxMTIsMjE4LAotICAgIDEyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCw0NiwwLAotICAgIDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjMsMCwwLDAsMTYzLDAsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMSwzLDEsMjIsMiwxMSwxLDEyMiwyOCwKKyAgICAwLDEsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTgsMCwKKyAgICAwLDAsMTAwLDEsMTA2LDAsMTI0LDAsMTA2LDEsMTE2LDIsMTI0LDAsMTMxLDEsCisgICAgMTMxLDIsODMsMCw0MSwyLDc4LDEyMiwyOCw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQwLDEyMywzMywxMTQsMTI1LDQxLDMyLAorICAgIDk3LDExNiwzMiwxMjMsMTI1LDQxLDMsMTE0LDM4LDAsMCwwLDExNCwxNSwwLDAsCisgICAgMCwxMTQsMzksMCwwLDAsNDEsMSwxMTQsMjYsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQwLDAsMCwKKyAgICAwLDEzNiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LDY4LAorICAgIDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsCisgICAgOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDc4LDQxLDgsMTE0LDEsMCwwLDAsMTE0LAorICAgIDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDI3LAorICAgIDAsMCwwLDExNCwzNCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE5LDAsMCwwLDExNSwKKyAgICAxMCwwLDAsMCw4LDIsNCwyLDgsNCw4LDQsOCw1LDExNCw0MSwKKyAgICAwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDY0LDAsMCwwLDExNSwzNiwwLDAsMCwxMDEsMCw5MCwKKyAgICAxLDEwMCwwLDkwLDIsMTAwLDEsMTAwLDIsMTMyLDAsOTAsMywxMDAsMywxMDAsCisgICAgNCwxMzIsMCw5MCw0LDEwMCw1LDEwMCw2LDEzMiwwLDkwLDUsMTAwLDcsODMsCisgICAgMCw0MSw4LDIxOCwxOCw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsCisgICAgNzcsOTcsMTEwLDk3LDEwMywxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwKKyAgICAwLDEyNCwxLDEyNCwwLDk1LDAsMTAwLDAsMTI0LDAsOTUsMSwxMDAsMCw4MywKKyAgICAwLDQxLDEsNzgsNDEsMiwyMTgsNSw5NSwxMTAsOTcsMTA5LDEwMSwyMTgsNSw5NSwKKyAgICAxMDgsMTExLDk5LDEwNyw0MSwyLDExNCwyNiwwLDAsMCwxMTQsMTUsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAorICAgIDI3LDAsMCwwLDE0MiwwLDAsMCwxMTUsNCwwLDAsMCwwLDEsNiwKKyAgICAxLDEyMiwyNyw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNzcsOTcsCisgICAgMTEwLDk3LDEwMywxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxMCwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsNDIsMCwwLDAsMTIyLDE2LDExNiwwLDEyNCwwLDEwNiwxLAorICAgIDEzMSwxLDEyNCwwLDk1LDIsODcsMCwxMDAsMCwxMTYsMywxMDYsNCwxMzEsMCwKKyAgICAxLDAsODgsMCwxMjQsMCwxMDYsMiwxMDYsNSwxMzEsMCwxLDAsMTAwLDAsCisgICAgODMsMCw0MSwxLDc4LDQxLDYsMjE4LDE2LDk1LDEwMywxMDEsMTE2LDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCw0MywwLDAsMCwxMTQsNDQsCisgICAgMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwxMTIsMjE4LDEyLDExNCwxMDEsMTA4LDEwMSw5NywKKyAgICAxMTUsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCwzNCwwLDAsMCw0MSwxLDExNCwyNiwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwyMTgsOSw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDE0NiwwLDAsCisgICAgMCwxMTUsOCwwLDAsMCwwLDEsMiwxLDE2LDIsMTAsMSwxMjIsMjgsCiAgICAgOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsCiAgICAgMTAxLDExNCw0Niw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLAogICAgIDAsMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNzksMCwwLAotICAgIDAsMTE1LDE3LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAwLDAsMSwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsNTUsMCwwLAotICAgIDAsMTE0LDQ3LDAsMCwwLDQxLDMsMTE0LDE5LDAsMCwwLDExNCwyOSwwLAotICAgIDAsMCw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDMwLDAsMCwwLDE3MCwwLAotICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LDk1LDc3LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsNDYsOTUsOTUsCi0gICAgMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLDAsMTE0LDAsCi0gICAgMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCwyMywwLAotICAgIDAsMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw1NCwwLDAsMCwKLSAgICAxNTcsMCwwLDAsMTE1LDYsMCwwLDAsMTIsMiwxMiw0LDEyLDcsMTE0LAotICAgIDU0LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwKLSAgICAwLDExLDAsMCwwLDMsMCwwLDAsMTE1LDEzOSwwLDAsMCwxMDAsMSwKLSAgICAwLDEyNSwxLDAsMTIxLDE3LDAsMTE2LDAsMCwxMzYsMCwwLDI1LDEzMSwwLAotICAgIDAsMTI1LDEsMCw4NywxMTAsMTgsMCw0LDExNiwxLDAsMTA3LDEwLDAsMTE0LAotICAgIDQzLDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDgsMCwxMTQsMTM1LDAsMTE2LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDgzLDAsMTE2LDMsMCwxMzYsMCwwLDEzMSwxLDAsMTI1LDEsMCwxMTAsMTIsCi0gICAgMCwxMTYsNCwwLDEzNiwwLDAsMTMxLDEsMCwxMjUsMSwwLDEzNSwwLDAsCi0gICAgMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDAsMCwxMjUsMiwwLDExNiwKLSAgICA1LDAsMTA2LDYsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMTYsMCwKLSAgICAwLDEzNiwwLDAsNjAsMTI0LDEsMCw4Myw0MSw0LDEyMiwxMDksNzEsMTAxLDExNiwKLSAgICAzMiwxMTEsMTE0LDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk5LDEwNywzMiwxMDIsMTExLDExNCwzMiw5NywKLSAgICAzMiwxMDMsMTA1LDExOCwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywKLSAgICAxMDksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDgzLDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCi0gICAgMTExLDExMCwxMDgsMTIxLDMyLDk4LDEwMSwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTE5LAotICAgIDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwKLSAgICAxMTEsOTksMTA3LDMyLDExNiw5NywxMDcsMTAxLDExMCw0Niw3OCw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDE5LDAsMCwwLAotICAgIDExNSwxMSwwLDAsMCwxMTYsMCwwLDEzNiwwLDAsNjEsMTAwLDAsMCw4MywKLSAgICA0MSwxLDc4LDQxLDEsMjE4LDEzLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwKLSAgICAxMTEsOTksMTA3LDExNSw0MSwxLDIxOCwxLDk1LDQxLDEsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDIsOTksOTgsMTkwLDAsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjgsOTUsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LDExMSw5OSwxMDcsNDYsNjAsMTA4LDExMSw5OSwKLSAgICA5NywxMDgsMTE1LDYyLDQ2LDk5LDk4LDQxLDcsMTE0LDU5LDAsMCwwLDExNCwyOCwKLSAgICAwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwzMiwwLAotICAgIDAsMCwyMTgsOCw5NSwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCwzLDExNCwxMDEsCi0gICAgMTAyLDQxLDMsMTE0LDE1LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNjEsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDQxLDEsMTE0LDE1LDAsMCwwLDExNCwxMSwKLSAgICAwLDAsMCwxMTQsNTYsMCwwLDAsMTc2LDAsMCwwLDExNSwyNCwwLDAsCi0gICAgMCwwLDQsNiwxLDMsMSwxNywxLDEzLDEsNSwxLDEyLDEsMTIsCi0gICAgMSwxNSwyLDEyLDEsMTgsMiwyMiwxLDExNCw1NiwwLDAsMCw5OSwxLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNzEsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLAotICAgIDAsMTI1LDEsMCwxMTYsMSwwLDEwNiwyLDAsMTMxLDAsMCwxLDEyMSwxNCwKLSAgICAwLDEyNCwxLDAsMTA2LDMsMCwxMzEsMCwwLDEsODcsMTEwLDE4LDAsNCwKLSAgICAxMTYsNCwwLDEwNywxMCwwLDExNCw1NiwwLDEsMSwxLDg5LDExMCwxMSwwLAotICAgIDg4LDEyNCwxLDAsMTA2LDUsMCwxMzEsMCwwLDEsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDk3LDIxLDEsMCwwLDgyLDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDEwOCwxMTEsOTksMTA3LDQ0LDMyLDk3LDExMCwxMDAsMzIsOTcsOTksMTEzLDExNywxMDUsMTE0LAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLAotICAgIDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwKLSAgICAxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMzIsMzIsMzIsCi0gICAgMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LDExMSwKLSAgICAzMiwxMDEsMTEwLDExNSwxMTcsMTE0LDEwMSwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAzMiwxMDUsMTE1LDMyLDk5LDExMSwxMDksMTEyLDEwOCwxMDEsMTE2LDEwMSwxMDgsMTIxLDMyLDEwNSwKLSAgICAxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCw0NCwzMiwxMDUsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwMSwxMTgsMTAxLDExMCwxMTYsMzIsMTA1LDExNiwzMiwKLSAgICAxMDUsMTE1LDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTAwLDMyLDk4LDEyMSwzMiw5NywxMTAsMTExLDExNiwxMDQsMTAxLDExNCwzMiwxMTYsMTA0LDExNCwKLSAgICAxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDgzLDEwNCwxMTEsMTE3LDEwOCwxMDAsCi0gICAgMzIsMTExLDExMCwxMDgsMTIxLDMyLDk4LDEwMSwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsCi0gICAgMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDEwOCwxMTEsOTksMTA3LDMyLDExNiw5NywxMDcsMTAxLDExMCw0Niw3OCw0MSw2LDExNCw1NiwKLSAgICAwLDAsMCwxMTQsNTcsMCwwLDAsMTE0LDU4LDAsMCwwLDExNCw0NiwwLAotICAgIDAsMCwxMTQsMzEsMCwwLDAsMTE0LDQ3LDAsMCwwLDQxLDIsMTE0LDE1LAotICAgIDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTksOTUsMTA4LDExMSw5OSwxMDcsOTUsMTE3LAotICAgIDExMCwxMDgsMTExLDk5LDEwNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxOTUsMCwwLDAsCi0gICAgMTE1LDE0LDAsMCwwLDAsNywxMiwxLDEwLDEsMywxLDE0LDEsMTMsCi0gICAgMyw1LDIsMTE0LDYzLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwzLDAsMCwwLDMsMCwwLDAsNzksMCwwLDAsMTE1LDEzLDAsCi0gICAgMCwwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDE0MiwwLDAsODMsNDEsCi0gICAgMSw5Nyw0NiwxLDAsMCwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSw5NSwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0Niw5OSwzMiwxMTksMTA1LDEwOCwxMDgsMzIsOTcsCi0gICAgMTA4LDExOSw5NywxMjEsMTE1LDMyLDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDMyLDExNSwxMDEsMTEzLAotICAgIDExNywxMDEsMTEwLDk5LDEwMSwxMTUsMTAsMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTE2LAotICAgIDEwNCw5NywxMTYsMzIsMTAxLDExMCwxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDk3LDMyLDk5LAotICAgIDk3LDEwOCwxMDgsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksCi0gICAgMTE2LDEwNSwxMTEsMTEwLDEwLDEwLDMyLDMyLDMyLDMyLDg1LDExNSwxMDEsMzIsMTA1LDExNiwKLSAgICAzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwzMiwxMTEsMTAyLDMyLDk3LDMyLDExMCwxMTEsCi0gICAgMTE0LDEwOSw5NywxMDgsMzIsOTksOTcsMTA4LDEwOCwzMiwxMDUsMTEwLDMyLDExMiwxMDgsOTcsCi0gICAgOTksMTAxLDExNSwzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTAsOTksMTA4LDExNywxMDAsCi0gICAgMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSwKLSAgICA5OCwxMCwzMiwzMiwzMiwzMiwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDEwNSwxMTAsMTE2LAotICAgIDExNCwxMTEsMTAwLDExNyw5OSwxMDEsMTE1LDMyLDExNywxMTAsMTE5LDk3LDExMCwxMTYsMTAxLDEwMCwKLSAgICAzMiwxMTAsMTExLDEwNSwxMTUsMTAxLDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTYsMTE0LDk3LDk5LDEwMSw5OCw5Nyw5OSwxMDcsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiwKLSAgICAxMTksMTA0LDEwMSwxMTAsMzIsMTAxLDEyMCwxMDEsOTksMTE3LDExNiwxMDUsMTEwLDEwMywxMCwzMiwKLSAgICAzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0MSwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMTQsMTAsMCwwLDAsNDEsMywyMTgsMSwxMDIsMTE0LDI5LAotICAgIDAsMCwwLDkwLDQsMTA3LDExOSwxMDAsMTE1LDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSw5OSw5NywxMDgsMTA4LDk1LAotICAgIDExOSwxMDUsMTE2LDEwNCw5NSwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDk1LDExNCwxMDEsMTA5LDExMSwKLSAgICAxMTgsMTAxLDEwMCwyMTQsMCwwLDAsMTE1LDIsMCwwLDAsMCw4LDExNCw2NSwKLSAgICAwLDAsMCwyMTgsOSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwNSwxMTYsMTIxLDExNCw0NSwKLSAgICAwLDAsMCw5OSwxLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwKLSAgICA0LDAsMCwwLDcxLDAsMCwwLDExNSw3NSwwLDAsMCwxMTYsMCwwLAotICAgIDEwNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDEwNyw1LDAsMTE0LDcxLDAsMTI0LAotICAgIDAsMCwxMDYsMywwLDEwMCw2LDAsMTMxLDEsMCwxMTUsNDMsMCwxMDAsMywKLSAgICAwLDEyNCwwLDAsMjMsMTI1LDAsMCwxMTYsNCwwLDEyNCwwLDAsMTA2LDUsCi0gICAgMCwxMjQsMiwwLDE0MCwwLDAsMTAwLDQsMCwxMTYsMCwwLDEwNiw2LDAsCi0gICAgMTMxLDEsMSwxLDEwMCw1LDAsODMsNDEsNywxMjIsNjEsODAsMTE0LDEwNSwxMTAsCi0gICAgMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDMyLDExNiwxMTEsCi0gICAgMzIsMTE1LDExNiwxMDAsMTAxLDExNCwxMTQsMzIsMTA1LDEwMiwzMiw0NSwxMTgsNDcsODAsODksCi0gICAgODQsNzIsNzksNzgsODYsNjksODIsNjYsNzksODMsNjksMzIsMTA1LDExNSwzMiwxMTYsCi0gICAgMTE3LDExNCwxMTAsMTAxLDEwMCwzMiwxMTEsMTEwLDQ2LDI1MCwxLDM1LDI1MCw3LDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDMyLDEyMiwyLDM1LDMyLDkwLDQsMTAyLDEwNSwxMDgsMTAxLDc4LAotICAgIDQxLDIsMTE0LDY3LDAsMCwwLDExNCw2OCwwLDAsMCw0MSw3LDExNCwxNCwKLSAgICAwLDAsMCwyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsMjE4LDcsMTE4LDEwMSwxMTQsOTgsCi0gICAgMTExLDExNSwxMDEsMjE4LDEwLDExNSwxMTYsOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCwKLSAgICA1LDExMiwxMTQsMTA1LDExMCwxMTYsMTE0LDUwLDAsMCwwLDIxOCw2LDExNSwxMTYsMTAwLAotICAgIDEwMSwxMTQsMTE0LDQxLDMsMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE0LDY2LAotICAgIDAsMCwwLDExNCwyOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwKLSAgICAxMDEsOTUsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjI1LDAsMCwwLDExNSw4LDAsCi0gICAgMCwwLDAsMiwxOCwxLDE1LDEsMTAsMSwxMTQsNzUsMCwwLDAsOTksCi0gICAgMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwKLSAgICAzLDAsMCwwLDExNSwzNSwwLDAsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLAotICAgIDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwxLAotICAgIDAsMTM2LDAsMCwxMzEsMiwwLDEsMTI0LDEsMCw4Myw0MSwzLDEyMiw0OSwKKyAgICAwLDExNSwxNCwwLDAsMCwxMjQsMCwxMDYsMCwxMDYsMSwxMzEsMCwxLDAsCisgICAgMTAwLDAsODMsMCw0MSwxLDc4LDQxLDIsMTE0LDQ0LDAsMCwwLDExNCwzNSwKKyAgICAwLDAsMCw0MSwzLDExNCwyNiwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSwKKyAgICA5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LAorICAgIDk1LDE1MywwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LDk1LDc3LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsCisgICAgNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLAorICAgIDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDI3LDAsMCwwLAorICAgIDExNCw0OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0MiwKKyAgICAwLDAsMCwxNDAsMCwwLDAsMTE1LDYsMCwwLDAsOCwyLDgsNCwKKyAgICA4LDcsMTE0LDQyLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDExLDAsMCwwLDMsMCwwLDAsMTE1LDEwNiwwLDAsCisgICAgMCwxMDAsMSwxMjUsMSwxMjEsMTQsMTE2LDAsMTM2LDAsMjUsMCwxMzEsMCwxMjUsCisgICAgMSw4NywwLDExMCwyMCw0LDAsMTE2LDEsMTA3LDEwLDExNCwzOCwxLDAsMSwKKyAgICAwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDEsMTAwLDEsMTA3LDgsMTE0LAorICAgIDEwMiwxMTYsMiwxMDAsMSwxMDcsOCwxMTQsNjYsMTE2LDMsMTM2LDAsMTMxLDEsMTI1LAorICAgIDEsMTEwLDgsMTE2LDQsMTM2LDAsMTMxLDEsMTI1LDEsMTM1LDAsMTAyLDEsMTAwLAorICAgIDIsMTAwLDMsMTMyLDgsMTI1LDIsMTE2LDUsMTA2LDYsMTI0LDEsMTI0LDIsMTMxLAorICAgIDIsMTE2LDAsMTM2LDAsNjAsMCwxMjQsMSw4MywwLDQxLDQsMTIyLDEwOSw3MSwKKyAgICAxMDEsMTE2LDMyLDExMSwxMTQsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LAorICAgIDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTEwLDk3LDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LAorICAgIDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwKKyAgICAzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMzIsMTA4LDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMTksMCwKKyAgICAwLDAsMTE1LDEwLDAsMCwwLDExNiwwLDEzNiwwLDYxLDAsMTAwLDAsODMsCisgICAgMCw0MSwxLDc4LDQxLDEsMjE4LDEzLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAorICAgIDEwOCwxMTEsOTksMTA3LDExNSw0MSwxLDIxOCwxLDk1LDQxLDEsMTE0LDE1LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDIsOTksOTgsMTczLAorICAgIDAsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjgsOTUsMTAzLDEwMSwxMTYsCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LDExMSw5OSwxMDcsNDYsNjAsMTA4LDExMSwKKyAgICA5OSw5NywxMDgsMTE1LDYyLDQ2LDk5LDk4LDQxLDcsMTE0LDUxLDAsMCwwLDIxOCwKKyAgICA4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwyMCwwLDAsMCwxMTQsNDEsCisgICAgMCwwLDAsMTE0LDE4LDAsMCwwLDIxOCw4LDk1LDExOSwxMDEsOTcsMTA3LDExNCwKKyAgICAxMDEsMTAyLDkwLDMsMTE0LDEwMSwxMDIsNDEsMywxMTQsMTUsMCwwLDAsMTE0LDIxLAorICAgIDAsMCwwLDExNCw1MywwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsCisgICAgMTUsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0NSwwLDAsMCwxNTksMCwKKyAgICAwLDAsMTE1LDI0LDAsMCwwLDAsNCw0LDEsMiwxLDE0LDEsMTQsCisgICAgMSw2LDEsOCwxLDgsMSwxMCwyLDgsMSwxMiwyLDE2LDEsMTE0LAorICAgIDQ1LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw2MiwwLDAsMCwxMTYsMCwKKyAgICAxMjQsMCwxMzEsMSwxMjUsMSwxMTYsMSwxMDYsMiwxMzEsMCwxLDAsMTIxLDEyLAorICAgIDEyNCwxLDEwNiwzLDEzMSwwLDEsMCw4NywwLDExMCwyMCw0LDAsMTE2LDQsCisgICAgMTA3LDEwLDExNCw0OCwxLDAsMSwwLDEsMCw4OSwwLDExMCwxMCw4OCwwLAorICAgIDEyNCwxLDEwNiw1LDEzMSwwLDEsMCwxMDAsMSw4MywwLDQxLDIsOTcsMjEsCisgICAgMSwwLDAsODIsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDMsCisgICAgMTA4LDExMSw5OCw5NywxMDgsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwKKyAgICAxMDcsNDQsMzIsOTcsMTEwLDEwMCwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwKKyAgICAxMTYsMTA0LDEwMSwxMTAsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsCisgICAgMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsCisgICAgMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMTAsCisgICAgMTE1LDExNywxMTQsMTAxLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsCisgICAgMzIsOTksMTExLDEwOSwxMTIsMTA4LDEwMSwxMTYsMTAxLDEwOCwxMjEsMzIsMTA1LDExMCwxMDUsMTE2LAorICAgIDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMTAwLDQ0LDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMTAsCisgICAgMzIsMzIsMzIsMzIsMTAxLDExOCwxMDEsMTEwLDExNiwzMiwxMDUsMTE2LDMyLDEwNSwxMTUsMzIsCisgICAgOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzIsOTgsCisgICAgMTIxLDMyLDk3LDExMCwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTEsMTEwLAorICAgIDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwKKyAgICAxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwKKyAgICAxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDQxLDYsMTE0LDQ1LDAsMCwwLAorICAgIDExNCw0NiwwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDM0LDAsMCwwLDExNCwKKyAgICAxNywwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsMTUsMCwwLDAsCisgICAgMTE0LDIxLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDIxOCwxOSw5NSwxMDgsMTExLDk5LDEwNyw5NSwxMTcsMTEwLDEwOCwxMTEsCisgICAgOTksMTA3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE3OCwwLDAsMCwxMTUsMTQsMCwKKyAgICAwLDAsMCw3LDgsMSw4LDEsMiwxLDEyLDEsMTQsMyw2LDIsCisgICAgMTE0LDU2LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsCisgICAgMCwwLDMsMCwwLDAsNzksMCwwLDAsMTE1LDEwLDAsMCwwLDEyNCwKKyAgICAwLDEyNCwxLDEyNCwyLDE0MiwwLDgzLDAsNDEsMSw5Nyw0NiwxLDAsMCwKKyAgICAxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LAorICAgIDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw0Niw5OSwzMiwxMTksMTA1LDEwOCwxMDgsMzIsOTcsMTA4LDExOSw5NywxMjEsMTE1LDMyLAorICAgIDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDMyLDExNSwxMDEsMTEzLDExNywxMDEsMTEwLDk5LDEwMSwxMTUsCisgICAgMTAsMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTAxLDExMCwKKyAgICAxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsMzIsMTE2LDExMSwKKyAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDg1LDExNSwxMDEsMzIsMTA1LDExNiwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAorICAgIDk3LDEwMCwzMiwxMTEsMTAyLDMyLDk3LDMyLDExMCwxMTEsMTE0LDEwOSw5NywxMDgsMzIsOTksCisgICAgOTcsMTA4LDEwOCwzMiwxMDUsMTEwLDMyLDExMiwxMDgsOTcsOTksMTAxLDExNSwzMiwxMTksMTA0LAorICAgIDEwMSwxMTQsMTAxLDMyLDEwNSwxMTAsOTksMTA4LDExNywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDEwNSwxMTAsMTE2LDExNCwxMTEsMTAwLDExNyw5OSwxMDEsCisgICAgMTE1LDMyLDExNywxMTAsMTE5LDk3LDExMCwxMTYsMTAxLDEwMCwzMiwxMTAsMTExLDEwNSwxMTUsMTAxLAorICAgIDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTYsMTE0LDk3LDk5LDEwMSw5OCwKKyAgICA5Nyw5OSwxMDcsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTAxLAorICAgIDEyMCwxMDEsOTksMTE3LDExNiwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0MSwxMCwzMiwzMiwzMiwzMiwxMTQsMTAsCisgICAgMCwwLDAsNDEsMywyMTgsMSwxMDIsMTE0LDQ5LDAsMCwwLDkwLDQsMTA3LAorICAgIDExOSwxMDAsMTE1LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDIxOCwyNSw5NSw5OSw5NywxMDgsMTA4LDk1LDExOSwxMDUsMTE2LDEwNCw5NSwxMDIsCisgICAgMTE0LDk3LDEwOSwxMDEsMTE1LDk1LDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDEwMCwxOTcsMCwwLAorICAgIDAsMTE1LDIsMCwwLDAsMCw4LDExNCw1OCwwLDAsMCwxMTQsMzMsMCwKKyAgICAwLDAsNDEsMSwyMTgsOSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwNSwxMTYsMTIxLDk5LAorICAgIDEsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDQsMCwwLDAsCisgICAgNzEsMCwwLDAsMTE1LDU2LDAsMCwwLDExNiwwLDEwNiwxLDEwNiwyLDEyNCwKKyAgICAxLDEwNyw1LDExNCw1MiwxMjQsMCwxMDYsMywxMDAsNiwxMzEsMSwxMTUsMzAsMTAwLAorICAgIDMsMTI0LDAsMjMsMCwxMjUsMCwxMTYsNCwxMjQsMCwxMDYsNSwxMjQsMiwxNDAsCisgICAgMCwxMDAsNCwxMTYsMCwxMDYsNiwxNDQsMSwxMzEsMSwxLDAsMTAwLDUsODMsCisgICAgMCw0MSw3LDEyMiw2MSw4MCwxMTQsMTA1LDExMCwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMzIsMTE2LDExMSwzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwKKyAgICAzMiwxMDUsMTAyLDMyLDQ1LDExOCw0Nyw4MCw4OSw4NCw3Miw3OSw3OCw4Niw2OSw4MiwKKyAgICA2Niw3OSw4Myw2OSwzMiwxMDUsMTE1LDMyLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwKKyAgICAxMTAsNDYsMjUwLDEsMzUsMjUwLDcsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsCisgICAgMzUsMzIsOTAsNCwxMDIsMTA1LDEwOCwxMDEsNzgsNDEsMiwxMTQsNjAsMCwwLDAsCisgICAgMTE0LDYxLDAsMCwwLDQxLDcsMTE0LDE0LDAsMCwwLDIxOCw1LDEwMiwxMDgsCisgICAgOTcsMTAzLDExNSwyMTgsNywxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSwyMTgsMTAsMTE1LDExNiwKKyAgICA5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTEyLDExNCwxMDUsMTEwLDExNiwxMTQsCisgICAgMzgsMCwwLDAsMjE4LDYsMTE1LDExNiwxMDAsMTAxLDExNCwxMTQsNDEsMywyMTgsNywKKyAgICAxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsNTksMCwwLDAsMTE0LDQ5LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsCisgICAgMTAzLDEwMSwyMDgsMCwwLDAsMTE1LDgsMCwwLDAsMCwyLDEyLDEsMTAsCisgICAgMSw4LDEsMTE0LDY4LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwxMTUsMjYsMCwKKyAgICAwLDAsMTM1LDAsMTAyLDEsMTAwLDEsMTAwLDIsMTMyLDgsMTI1LDEsMTE2LDAsCisgICAgMTI0LDEsMTM2LDAsMTMxLDIsMSwwLDEyNCwxLDgzLDAsNDEsMywxMjIsNDksCiAgICAgNjgsMTAxLDk5LDExMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsMTE2LDExMSwzMiwxMTgsMTAxLDExNCwKICAgICAxMDUsMTAyLDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsMzIsMTA5LDExMSwKICAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwKICAgICA0Niw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw0LDAsCi0gICAgMCwwLDE5LDAsMCwwLDExNSw1NSwwLDAsMCwxMjQsMSwwLDExNiwwLAotICAgIDAsMTA2LDEsMCwxMDcsNywwLDExNCw0MiwwLDExNiwyLDAsMTAwLDEsMCwKLSAgICAxMDYsMywwLDEyNCwxLDAsMTMxLDEsMCwxMDAsMiwwLDEyNCwxLDAsMTMxLAotICAgIDEsMSwxMzAsMSwwLDEzNiwwLDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsODMsNDEsMyw3OCwxMjIsMjksMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsCi0gICAgMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsNCwxMTQsMTQsMCwwLDAsCi0gICAgMjE4LDIwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDk1LDExMCw5NywxMDksMTAxLDExNSwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsCi0gICAgMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDIxOCwKLSAgICA4LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSw0MSwxLDIxOCwzLDEwMiwxMjAsMTEwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDExNCwxMDEsMTEzLAotICAgIDExNywxMDUsMTE0LDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTE5LDExNCwKLSAgICA5NywxMTIsMTEyLDEwMSwxMTQsMjM1LDAsMCwwLDExNSw4LDAsMCwwLDAsMSwKLSAgICAxNSwxLDE4LDEsOSwxLDEyMiw1Miw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsCi0gICAgMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LAotICAgIDExNSw2Miw0Niw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsCi0gICAgMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDQxLDEsMTE0LDEyLAotICAgIDAsMCwwLDQxLDIsMTE0LDc5LDAsMCwwLDExNCw4MCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMSwxMTQsNzksMCwwLDAsMTE0LDExLDAsMCwwLAotICAgIDIxOCwxNyw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDIzMywwLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTgsNSwKLSAgICAxMywxLDExNCw4MSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsMTE1LDM1LDAsMCwKLSAgICAwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMSwwLDEwMCwyLDAsMTM0LDAsMCwKLSAgICAxMjUsMSwwLDExNiwwLDAsMTI0LDEsMCwxMzYsMCwwLDEzMSwyLDAsMSwKLSAgICAxMjQsMSwwLDgzLDQxLDMsMTIyLDQ3LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsCi0gICAgMTE0LDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsCi0gICAgMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsNCwwLDAsMCwxOSwwLDAsMCwxMTUsNTUsMCwwLAotICAgIDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTUsNDIsMCwKLSAgICAxMTYsMiwwLDEwMCwxLDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwxMjQsMSwwLDEzMSwxLDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLDMsNzgsMTIyLDI3LDEyMywzMywxMTQsCi0gICAgMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwKLSAgICAxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LAotICAgIDU3LDAsMCwwLDIxOCw5LDEwNSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMTE0LAotICAgIDc3LDAsMCwwLDExNCw1MCwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwKLSAgICAxMTQsNzgsMCwwLDAsNDEsMSwxMTQsNzksMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwyMTgsMjQsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAotICAgIDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCwKLSAgICAyNDYsMCwwLDAsMTE1LDgsMCwwLDAsMCwxLDE1LDEsMTgsMSw5LAotICAgIDEsMTIyLDUwLDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsCi0gICAgMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCwKLSAgICA5NywxMTIsMTEyLDEwMSwxMTQsNDEsMSwxMTQsMTIsMCwwLDAsNDEsMiwxMTQsNzksCi0gICAgMCwwLDAsMTE0LDgzLDAsMCwwLDExNCwxMCwwLDAsMCw0MSwxLDExNCwKLSAgICA3OSwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDk1LDExNCwxMDEsMTEzLDExNywKLSAgICAxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMjQ0LDAsMCwwLDExNSwKLSAgICA2LDAsMCwwLDAsMiwxOCw1LDEzLDEsMTE0LDg0LDAsMCwwLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDgxLDAsMCwwLDExNiwwLDAsMTI0LDEsMCwxMjQsCi0gICAgMCwwLDEzMSwyLDAsMTI1LDIsMCwxMjQsMSwwLDExNiwxLDAsMTA2LDIsCi0gICAgMCwxMDcsNiwwLDExNCw2NywwLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLAotICAgIDI1LDEyNSwzLDAsMTE2LDMsMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDIsMCwKLSAgICAxLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDI1LDgzLDExNiw0LDAsMTI0LAotICAgIDIsMCwxMzEsMSwwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsMTI4LDc2LDExMSwKLSAgICA5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE1LDEyMSwxMTUsCi0gICAgNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsCi0gICAgMTE3LDExNCwxMTAsMzIsMTA1LDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LAotICAgIDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwKLSAgICAxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAotICAgIDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDQxLAotICAgIDUsMjE4LDE2LDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMjE4LDUsOTUsCi0gICAgMTAxLDEyMCwxMDEsOTksMjE4LDUsOTUsMTA4LDExMSw5NywxMDAsNDEsNCwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDc4LDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCw2LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwxMDksMCwxLDAsMCwxMTUsMTIsMCwwLDAsCi0gICAgMCw2LDE1LDEsMTUsMSwxMywxLDEzLDEsMTEsMiwxMTQsOTAsMCwwLAotICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMzUsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDYsMSwwLDAsMTE2LDAsMCwxMjQsMCwKLSAgICAwLDEwMCwxLDAsMTAwLDAsMCwxMzEsMywwLDEyNSwxLDAsMTE2LDEsMCwKLSAgICAxMjQsMSwwLDEwMCwyLDAsMTMxLDIsMCwxMTQsNzEsMCwxMjEsMTcsMCwxMjQsCi0gICAgMSwwLDEwNiwyLDAsMTI0LDAsMCwxMzEsMSwwLDgzLDg3LDExMCwxOCwwLAotICAgIDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNzAsMCwxLDEsMSw4OSwxMTAsMSwKLSAgICAwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTA2LDQsMCwxMjUsMiwwLDg3LDExMCwKLSAgICAxOCwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTA0LDAsMSwxLDEsODksCi0gICAgMTEwLDIzLDAsODgsMTI0LDIsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDEyNywwLAotICAgIDExNiw2LDAsMTI0LDIsMCwxMzEsMSwwLDgzLDEyMSwxMywwLDEyNCwwLDAsCi0gICAgMTA2LDcsMCwxMjUsMywwLDg3LDExMCwyNCwwLDQsMTE2LDUsMCwxMDcsMTAsCi0gICAgMCwxMTQsMTY2LDAsMSwxLDEsMTAwLDMsMCwxMjUsMywwLDg5LDExMCwxLAotICAgIDAsODgsMTIxLDEzLDAsMTI0LDAsMCwxMDYsOCwwLDEyNSw0LDAsODcsMTEwLAotICAgIDU5LDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwyNDEsMCwxLDEsMSwxMjQsCi0gICAgMSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMjIxLDAsMTAwLDQsMCwxMDYsOSwKLSAgICAwLDEyNCwzLDAsMTMxLDEsMCw4MywxMDAsNSwwLDEwNiw5LDAsMTI0LDMsCi0gICAgMCwxMjQsMSwwLDEzMSwyLDAsODMsODksMTEwLDE3LDAsODgsMTAwLDYsMCwKLSAgICAxMDYsOSwwLDEyNCwzLDAsMTI0LDQsMCwxMzEsMiwwLDgzLDEwMCwwLDAsCi0gICAgODMsNDEsNyw3OCwyMTgsMTAsOTUsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSw5NSwKKyAgICAwLDAsMTksMCwwLDAsMTE1LDQwLDAsMCwwLDEyNCwxLDExNiwwLDEwNiwKKyAgICAxLDEwNyw3LDExNCwzMCwxMTYsMiwxMDAsMSwxMDYsMywxMjQsMSwxMzEsMSwxMDAsCisgICAgMiwxMjQsMSwxNDQsMSwxMzEsMSwxMzAsMSwxMzYsMCwxMjQsMCwxMjQsMSwxMzEsCisgICAgMiw4MywwLDQxLDMsNzgsMTIyLDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsCisgICAgMTEwLDExMSwxMTYsMzIsOTcsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDE0LDAsMCwKKyAgICAwLDIxOCwyMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDExNCwzOCwwLDAsMCw0MSwyLDExNCwyNiwwLDAsMCwKKyAgICAyMTgsOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsNDEsMSwyMTgsMywxMDIsMTIwLAorICAgIDExMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMTQsMTAxLAorICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwKKyAgICAxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDIxOCwwLDAsMCwxMTUsOCwwLDAsMCwwLAorICAgIDEsMTAsMSwxMiwxLDgsMSwxMjIsNTIsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsCisgICAgMTAxLDExNSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0Niw2MCwxMDgsMTExLDk5LDk3LAorICAgIDEwOCwxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsCisgICAgMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0MSwxLDExNCwKKyAgICAxMiwwLDAsMCw0MSwyLDExNCw3MiwwLDAsMCwxMTQsNzMsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDQxLDEsMTE0LDcyLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwyMTgsMTcsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LAorICAgIDEwOCwxMTYsMTA1LDExMCwyMTYsMCwwLDAsMTE1LDYsMCwwLDAsMCwyLDEyLAorICAgIDUsMTAsMSwxMTQsNzQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDExNSwyNiwwLAorICAgIDAsMCwxMzUsMCwxMDIsMSwxMDAsMSwxMDAsMiwxMzIsOCwxMjUsMSwxMTYsMCwKKyAgICAxMjQsMSwxMzYsMCwxMzEsMiwxLDAsMTI0LDEsODMsMCw0MSwzLDEyMiw0NywKKyAgICA2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LAorICAgIDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQ2LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsCisgICAgMTksMCwwLDAsMTE1LDQwLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwxLDEzMSwKKyAgICAxLDExNSwzMCwxMTYsMiwxMDAsMSwxMDYsMywxMjQsMSwxMzEsMSwxMDAsMiwxMjQsCisgICAgMSwxNDQsMSwxMzEsMSwxMzAsMSwxMzYsMCwxMjQsMCwxMjQsMSwxMzEsMiw4MywKKyAgICAwLDQxLDMsNzgsMTIyLDI3LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwKKyAgICAxMTYsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDQ2LDAsMCwwLDIxOCw5LDEwNSwKKyAgICAxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMTE0LDcwLDAsMCwwLDExNCwzOCwwLAorICAgIDAsMCw0MSwyLDExNCwyNiwwLDAsMCwxMTQsNzEsMCwwLDAsNDEsMSwKKyAgICAxMTQsNzIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCisgICAgMjQsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLAorICAgIDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCwyMjksMCwwLDAsMTE1LDgsMCwKKyAgICAwLDAsMCwxLDEwLDEsMTIsMSw4LDEsMTIyLDUwLDk1LDExNCwxMDEsMTEzLAorICAgIDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsNDYsNjAsMTA4LDExMSwKKyAgICA5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsCisgICAgMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsNDEsMSwKKyAgICAxMTQsMTIsMCwwLDAsNDEsMiwxMTQsNzIsMCwwLDAsMTE0LDc2LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCw0MSwxLDExNCw3MiwwLDAsMCwxMTQsMTEsMCwKKyAgICAwLDAsMjE4LDE2LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsMTAyLDExNCwKKyAgICAxMTEsMTIyLDEwMSwxMTAsMjI3LDAsMCwwLDExNSw2LDAsMCwwLDAsMiwxMiwKKyAgICA1LDEwLDEsMTE0LDc3LDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsCisgICAgMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDY0LDAsCisgICAgMCwwLDExNiwwLDEyNCwxLDEyNCwwLDEzMSwyLDEyNSwyLDEyNCwxLDExNiwxLAorICAgIDEwNiwyLDEwNyw2LDExNCw1MiwxMTYsMSwxMDYsMiwxMjQsMSwyNSwwLDEyNSwzLAorICAgIDExNiwzLDEyNCwyLDEyNCwzLDEzMSwyLDEsMCwxMTYsMSwxMDYsMiwxMjQsMSwKKyAgICAyNSwwLDgzLDAsMTEwLDgsMTE2LDQsMTI0LDIsMTMxLDEsODMsMCwxMDAsMSwKKyAgICA4MywwLDQxLDIsMTIyLDEyOCw3NiwxMTEsOTcsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTA1LDExMCwxMTYsMTExLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwKKyAgICAzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDEwNSwxMTYsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsCisgICAgMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLAorICAgIDMyLDg1LDExNSwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwKKyAgICAxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMTQsMCwwLDAsCisgICAgMjE4LDcsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCw1LDk1LDEwMSwxMjAsMTAxLDk5LAorICAgIDIxOCw1LDk1LDEwOCwxMTEsOTcsMTAwLDQxLDQsMTE0LDI2LDAsMCwwLDExNCw3MSwKKyAgICAwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsNiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKKyAgICAyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LAorICAgIDEwNCwxMDUsMTA5LDIzOSwwLDAsMCwxMTUsMTIsMCwwLDAsMCw2LDEwLDEsCisgICAgMTAsMSwxMCwxLDEwLDEsMTIsMiwxMTQsODQsMCwwLDAsOTksMSwwLAorICAgIDAsMCwwLDAsMCwwLDUsMCwwLDAsMzUsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDIxOCwwLDAsMCwxMTYsMCwxMjQsMCwxMDAsMSwxMDAsMCwxMzEsCisgICAgMywxMjUsMSwxMTYsMSwxMjQsMSwxMDAsMiwxMzEsMiwxMTQsNTQsMTIxLDEwLDEyNCwKKyAgICAxLDEwNiwyLDEyNCwwLDEzMSwxLDgzLDAsNCwwLDExNiwzLDEwNywxMCwxMTQsCisgICAgNTIsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyMSwxMCwxMjQsCisgICAgMCwxMDYsNCwxMjUsMiw4NywwLDExMCwyMCw0LDAsMTE2LDUsMTA3LDEwLDExNCwKKyAgICA4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwxOCw4OCwwLDEyNCwyLDEwMCwKKyAgICAwLDEwNyw5LDExNCwxMDIsMTE2LDYsMTI0LDIsMTMxLDEsODMsMCwxMjEsMTAsMTI0LAorICAgIDAsMTA2LDcsMTI1LDMsODcsMCwxMTAsMjQsNCwwLDExNiw1LDEwNywxMCwxMTQsCisgICAgMTM2LDEsMCwxLDAsMSwwLDEwMCwzLDEyNSwzLDg5LDAsMTEwLDIsODgsCisgICAgMCwxMjEsMTAsMTI0LDAsMTA2LDgsMTI1LDQsODcsMCwxMTAsNTIsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsMjAwLDEsMCwxLDAsMSwwLDEyNCwxLDEwMCwwLDEwNywKKyAgICA4LDExNCwxODQsMTAwLDQsMTA2LDksMTI0LDMsMTMxLDEsODMsMCwxMTAsMTIsMTAwLAorICAgIDUsMTA2LDksMTI0LDMsMTI0LDEsMTMxLDIsODMsMCw4OSwwLDExMCwxNCw4OCwKKyAgICAwLDEwMCw2LDEwNiw5LDEyNCwzLDEyNCw0LDEzMSwyLDgzLDAsMTAwLDAsODMsCisgICAgMCw0MSw3LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk1LAogICAgIDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjUwLDEsNjMsCiAgICAgMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwKICAgICAyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsCiAgICAgMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLAogICAgIDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDYyLDQxLDEwLAotICAgIDExNCw2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw5MiwwLDAsMCwyMTgsCisgICAgMTE0LDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDg2LDAsMCwwLDIxOCwKICAgICA5LDY5LDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCwyMTgsOCw5NSw5NSwxMTUsMTEyLAogICAgIDEwMSw5OSw5NSw5NSwyMTgsMTQsNjUsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDY5LAogICAgIDExNCwxMTQsMTExLDExNCwyMTgsMjIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwKICAgICAxMTIsMTE0LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTEyLDEwMSw5OSwxMTQsMSwwLDAsCi0gICAgMCwyMTgsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsMTE0LDUwLDAsMCwwLAotICAgIDQxLDUsMTE0LDg5LDAsMCwwLDIxOCw2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLAorICAgIDAsMjE4LDgsOTUsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDk1LDExNCwzOCwwLDAsMCwKKyAgICA0MSw1LDExNCw4MywwLDAsMCwyMTgsNiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwKKyAgICA4MiwwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LDgsMTAyLDEwNSwxMDgsMTAxLDExMCwKICAgICA5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCiAgICAgMCwwLDIxOCwxMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsCi0gICAgMTYsMSwwLDAsMTE1LDQ2LDAsMCwwLDAsMiwxOCwxLDE1LDQsMywKLSAgICAxLDE3LDEsMTMsMSw1LDEsMywxLDEzLDEsMTMsMSw1LDIsMTIsCi0gICAgMSwxMCw0LDMsMSwxMywxLDEzLDEsMTEsMSwzLDEsMTMsMSwxMywKLSAgICAxLDEyLDEsMTMsMiwyMSwyLDExNCwxMDEsMCwwLDAsOTksMCwwLDAsCisgICAgMjU1LDAsMCwwLDExNSw0NiwwLDAsMCwwLDIsMTIsMSwxMCw0LDIsCisgICAgMSwxMCwxLDE0LDEsNiwxLDIsMSwxMCwxLDE0LDEsNiwyLDgsCisgICAgMSw4LDQsMiwxLDEwLDEsMTQsMSwxMCwxLDIsMSwxMCwxLDE0LAorICAgIDEsOCwxLDEyLDIsMTgsMiwxMTQsOTUsMCwwLDAsOTksMCwwLDAsCiAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsNTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsMywwLDEwMCwzLAotICAgIDAsMTAwLDQsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNSwwLDEwMCw2LDAsCi0gICAgMTMyLDAsMCw5MCw1LDAsMTAwLDcsMCw4Myw0MSw4LDIxOCwxNyw5NSwxMDUsCisgICAgMCwxMTUsMzYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLAorICAgIDEwMCwyLDEzMiwwLDkwLDMsMTAwLDMsMTAwLDQsMTMyLDAsOTAsNCwxMDAsNSwKKyAgICAxMDAsNiwxMzIsMCw5MCw1LDEwMCw3LDgzLDAsNDEsOCwyMTgsMTcsOTUsMTA1LAogICAgIDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDk5LAogICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDI1LDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwKLSAgICAwLDAsMTI0LDEsMCwxMDYsMSwwLDEyNCwwLDAsOTUsMiwwLDEwMCwwLAotICAgIDAsODMsNDEsMSw3OCw0MSwzLDIxOCw3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNCw5NSwwLDAsMCwyMTgsNSw5NSwxMTUsMTEyLDEwMSw5OSw0MSwyLDExNCwxOSwKLSAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIwLDAsMCwwLDU0LDEsMCwwLAotICAgIDExNSw0LDAsMCwwLDAsMSw5LDEsMTIyLDI2LDk1LDEwNSwxMTAsMTE1LDExNiwKLSAgICA5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwxMDUsCi0gICAgMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMzgsMCwwLDAsMTAwLAotICAgIDEsMCwxMjQsMCwwLDEwNiwwLDAsOTUsMSwwLDEyNCwwLDAsMTA2LDIsCi0gICAgMCwxMTYsMywwLDEwNiw0LDAsMTI0LDAsMCwxMDYsMCwwLDEwNiw1LDAsCi0gICAgNjAsMTAwLDAsMCw4Myw0MSwyLDc4LDg0LDQxLDYsMTE0LDEwNCwwLDAsMCwKLSAgICAyMTgsMTMsOTUsMTA1LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDUsMTEwLDEwMywxMTQsCi0gICAgMTAzLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDE1LAotICAgIDAsMCwwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMywwLDAsMCw1OCwxLAotICAgIDAsMCwxMTUsNCwwLDAsMCwwLDQsMTIsMSwxMjIsMjcsOTUsMTA1LDExMCwKLSAgICAxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LAotICAgIDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsMTcsMCwwLDAsNzEsMCwwLDAsMTE1LDEyMSwwLAotICAgIDAsMCwxMjIsMTAxLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsMTE2LDEsCi0gICAgMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjQsMSwwLDY4LDEzMSwxLAotICAgIDAsMTMxLDEsMCwxMTQsNzgsMCwxMjEsMTcsMCwxMTYsMiwwLDEwNiwzLDAsCi0gICAgMTI0LDIsMCwxMDYsNCwwLDYxLDg3LDExMywxMDAsMCw0LDExNiw1LDAsMTA3LAotICAgIDEwLDAsMTE0LDc0LDAsMSwxLDEsODksMTEzLDEwMCwwLDg4LDExMCwyMiwwLAotICAgIDExNiw2LDAsMTAwLDMsMCwxMjQsMiwwLDEwNiw0LDAsMTI0LDIsMCwxMDYsCi0gICAgNywwLDEzMSwzLDAsMSw4NywxMDAsMCwwLDEwMCw0LDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDk1LDgsMCw4OCwxMDAsMCwwLDgzLDQxLDUsNzgsOTksMSwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsCi0gICAgMCwwLDAsMTE1LDI3LDAsMCwwLDEyNCwwLDAsOTMsMTcsMCwxMjUsMSwKLSAgICAwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOSwwLDg2LDEsMTEzLDMsMCwxMDAsCi0gICAgMCwwLDgzLDQxLDEsNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDI0LDAsCi0gICAgMCwwLDExNCwyNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMjYsMCwwLDAsNjgsMSwwLDAsMTE1LAotICAgIDIsMCwwLDAsNiwwLDEyMiw0NSw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwKLSAgICAxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LAotICAgIDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwKLSAgICAxMDEsMTIwLDExMiwxMTQsNjIsMTIyLDE4LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEyMywzMywKLSAgICAxMTQsMTI1LDMyLDM1LDMyLDEyMywzMywxMTQsMTI1LDcwLDQxLDksMTE0LDEwNCwwLDAsCi0gICAgMCwxMTQsMjcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwKLSAgICAxMTQsMTUsMCwwLDAsMTE0LDI4LDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsCi0gICAgOTksMCwwLDAsMTE0LDEwNSwwLDAsMCw0MSwzLDExNCwxOSwwLDAsMCwKLSAgICAxMTQsMjksMCwwLDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzMCwwLDAsMCw2NSwxLAotICAgIDAsMCwxMTUsMTgsMCwwLDAsMCwxLDMsMSw5LDEsMjUsMSwzLAotICAgIDEsMTcsMSwxMywxLDgsMiwyNiwyLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsCi0gICAgOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTAxLAotICAgIDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLDAsMTE0LDAsMCwKLSAgICAwLDAsMTE0LDIsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCwyMywwLDAsCi0gICAgMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDIsMCwwLDAsNTIsCi0gICAgMSwwLDAsMTE1LDYsMCwwLDAsMTIsMiwxMiw0LDEyLDcsMTE0LDEwMiwKLSAgICAwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICA4LDAsMCwwLDY0LDAsMCwwLDExNSwxNzIsMCwwLDAsMTAxLDAsMCwKLSAgICA5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLAotICAgIDIsMCwxMDAsMywwLDEwMCw0LDAsMTAwLDMsMCwxMDAsNSwwLDEwMCwzLAotICAgIDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDMsOTAsNCwwLDEwMCw4LDAsCi0gICAgMTAwLDksMCwxMzIsMCwwLDkwLDUsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsCi0gICAgMCwwLDkwLDYsMCwxMDEsNywwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLAotICAgIDAsMTMxLDEsMCw5MCw4LDAsMTAxLDgsMCwxMDYsOSwwLDEwMCwxNCwwLAotICAgIDEwMCwxMywwLDEzMiwwLDAsMTMxLDEsMCw5MCw4LDAsMTAxLDcsMCwxMDAsCi0gICAgMTUsMCwxMDAsMTYsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNywKLSAgICAwLDEwMCwxNywwLDEwMCwxOCwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMSwwLAotICAgIDEwMSwxMSwwLDEwNiw5LDAsMTAwLDE5LDAsMTAwLDE4LDAsMTMyLDAsMCwxMzEsCi0gICAgMSwwLDkwLDExLDAsMTAwLDMsMCw4Myw0MSwyMCwyMTgsMTAsNzcsMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDk3LDIwOCw1LDAsMCw4NCwxMDQsMTAxLDMyLAotICAgIDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTExLAotICAgIDExNCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMTcsMTE1LDEwMSwxMDAsCi0gICAgMzIsMTAyLDExMSwxMTQsMzIsMTA4LDExMSw5NywxMDAsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNjUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExNSwxMTIsCi0gICAgMTAxLDk5LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICAzMiwxMDIsMTExLDExNCwzMiwxMDUsMTEwLDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTA1LDExMSwxMTAsCi0gICAgMzIsOTcsOTgsMTExLDExNywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsNDYsMzIsMzIsNzAsMTExLDExNCwxMCwzMiwzMiwzMiwzMiwxMDAsOTcsMTE2LDk3LAotICAgIDMyLDk3LDExNSwxMTUsMTExLDk5LDEwNSw5NywxMTYsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTA1LDExMCw5OSwKLSAgICAxMDgsMTE3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ0LDMyLDExNywKLSAgICAxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwxMCwzMiwzMiwKLSAgICAzMiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LAotICAgIDExMCw5NywxMDksMTAxLDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsOTcsOTgsMTE1LAotICAgIDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw5NiwxMDgsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLAotICAgIDExNCwxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDExOSwxMDQsMTAxLAotICAgIDExMCwzMiwxMDgsMTExLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw5NiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk2LDMyLAotICAgIDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDQ2LAotICAgIDMyLDMyLDg0LDEwNCwxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLAotICAgIDEwMCwxMDEsMTE0LDEwNSwxMTgsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTA1LDExNSw5NSwKLSAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTYsMzIsMTAwLDEwMSwxMTYsMTAxLDExNCwxMDksMTA1LAotICAgIDExMCwxMDEsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTA1LDExNSwzMiw5OSwxMTEsMTEwLDExNSwxMDUsMTAwLDEwMSwxMTQsMTAxLDEwMCwzMiwKLSAgICA5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTExLDExNCwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTAsMTExLDExNiw0NiwzMiwzMiw3OSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTAyLDEwOCwxMDEsOTksCi0gICAgMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDk2LDk1LDk1LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCw5NiwzMiwxMDUsCi0gICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOCwKLSAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNywxMTUsMTAxLDEwMCwzMiw5OCwxMjEsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsMTE0LDExMSwxMDksMzIsCi0gICAgMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTA1LDEwMiwKLSAgICAzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTEwLDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTA1LDExMSwKLSAgICAxMTAsMzIsMTA1LDExNSwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDQ2LDMyLAotICAgIDMyLDg3LDEwNCwxMDEsMTEwLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDUsCi0gICAgMTE1LDEwLDMyLDMyLDMyLDMyLDExNSwxMDEsMTE2LDQ0LDMyLDExMSwxMTQsMTA1LDEwMywxMDUsCi0gICAgMTEwLDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMDksOTcsMTE2LDk5LDEwNCw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw5NiwxMDQsOTcsMTE1LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDk2LDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDExNSwzMiwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzOSwxMTUsMzIsMzQsMTExLDExNCwxMDUsMTAzLDEwNSwKLSAgICAxMTAsMzQsMzIsMTE0LDEwMSwxMDIsMTA4LDEwMSw5OSwxMTYsMTE1LDMyLDk3LDMyLDEwOCwxMTEsCi0gICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDEwLDMyLDMyLDMyLDMyLDg3LDEwNCwxMDEsMTEwLAotICAgIDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDg0LDExNCwxMTcsMTAxLDQ0LDMyLDk2LAotICAgIDk1LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSw5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsCi0gICAgMTE3LDExNiwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMDEsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5OSwKLSAgICA5Nyw5OSwxMDQsMTAxLDEwMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsCi0gICAgMTA1LDEwOCwxMDEsNDQsMzIsMTA1LDEwMiwzMiw5NywxMTAsMTIxLDQ2LDMyLDMyLDczLDExNiwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwxMTEsMTE0LDExNCwxMDEsMTE1LDExMiwxMTEsMTEwLDEwMCwxMTUsCi0gICAgMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiw5Niw5NSw5NSw5OSw5Nyw5OSwxMDQsMTAxLAotICAgIDEwMCw5NSw5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsNDYsMTAsCi0gICAgMTAsMzIsMzIsMzIsMzIsOTYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwKLSAgICAxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LAotICAgIDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksCi0gICAgMTAxLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEwNSwxMDEsCi0gICAgMTE1LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSw5NywxMTQsOTksMTA0LDMyLAotICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTUsCi0gICAgMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NiwzMiwzMiw3MywxMDIsMzIsMTE1LAotICAgIDEwMSwxMTYsNDQsMzIsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE1LAotICAgIDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLDg0LDExNCwxMTcsCi0gICAgMTAxLDQ1LDQ1LDk3LDExMCwxMDAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTExLDExNiwxMDQsCi0gICAgMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODAsOTcsOTksCi0gICAgMTA3LDk3LDEwMywxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDMyLDQwLDEwOSwKLSAgICA5NywxMjEsNDEsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwxMTUsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDEwLAotICAgIDMyLDMyLDMyLDMyLDEwNCw5NywxMTUsMzIsOTcsMzIsMTEwLDExMSwxMTAsNDUsNzgsMTExLAotICAgIDExMCwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTAsMzIsOTYsMTE1LDExNyw5OCwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSwKLSAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk2LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLAotICAgIDExOSwxMDUsMTA4LDEwOCwzMiw5OSwxMTEsMTEwLDExNSwxMDUsMTAwLDEwMSwxMTQsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsCi0gICAgMTA5LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDk3LDExNSwzMiwxMTIsOTcsCi0gICAgOTksMTA3LDk3LDEwMywxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExMCwxMDgsCi0gICAgMTIxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNSwzMiw0MCwxMTUsMTAxLDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LDk5LDQ2LDc3LDEwMSwxMTYsCi0gICAgOTcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5Nyw5OCwKLSAgICA5OSw0Niw4MCw5NywxMTYsMTA0LDY5LDExMCwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTIxLAotICAgIDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSwzMiwxMDUsMTEwLDExNSwxMTYsCi0gICAgOTcsMTEwLDk5LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMjE4LDYsMTExLDExNCwKLSAgICAxMDUsMTAzLDEwNSwxMTAsNzgsMjE4LDEyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsMTE1LDExNiwKKyAgICA2NywwLDAsMCwxMTUsMTgsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMjQsCisgICAgMSwxMDYsMSwxMjQsMCw5NSwyLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwzLAorICAgIDIxOCw3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCw4OSwwLDAsMCwyMTgsNSwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw0MSwyLDExNCwyNiwwLDAsMCwxMTQsODMsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDI3LDAsMCwwLDM3LDEsMCwwLDExNSw0LDAsMCwwLDAsMSwKKyAgICA2LDEsMTIyLDI2LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LAorICAgIDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwKKyAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMjgsMCwwLDAsMTAwLDEsMTI0LDAsMTA2LDAsOTUsMSwKKyAgICAxMjQsMCwxMDYsMiwxMTYsMywxMDYsNCwxMjQsMCwxMDYsMCwxMDYsNSw2MCwwLAorICAgIDEwMCwwLDgzLDAsNDEsMiw3OCw4NCw0MSw2LDExNCw5OCwwLDAsMCwyMTgsCisgICAgMTMsOTUsMTA1LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDUsMTEwLDEwMywxMTQsOTcsCisgICAgMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw3OSwwLDAsMCwxMTQsMTUsMCwKKyAgICAwLDAsNDEsMSwxMTQsMjYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ4LDAsMCwwLDQxLDEsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsNCw4LDEsMTIyLDI3LDk1LDEwNSwxMTAsMTE1LAorICAgIDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwKKyAgICAxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDE3LDAsMCwwLDcxLDAsMCwwLDExNSw5OCwwLDAsCisgICAgMCwxMjIsODIsMTI0LDAsMTA2LDAsMTI1LDIsMTE2LDEsMTAwLDEsMTAwLDIsMTMyLAorICAgIDAsMTI0LDEsNjgsMCwxMzEsMSwxMzEsMSwxMTQsNjQsMTIxLDE0LDExNiwyLDEwNiwKKyAgICAzLDEyNCwyLDEwNiw0LDYxLDAsODcsMCwxMTMsODAsNCwwLDExNiw1LDEwNywKKyAgICAxMCwxMTQsNjAsMSwwLDEsMCwxLDAsODksMCwxMTMsODAsODgsMCwxMTAsCisgICAgMTYsMTE2LDYsMTAwLDMsMTI0LDIsMTA2LDQsMTI0LDIsMTA2LDcsMTMxLDMsMSwKKyAgICAwLDg3LDAsMTAwLDAsMTAwLDQsMTI0LDAsMTA2LDAsOTUsOCw4OCwwLDEwMCwKKyAgICAwLDgzLDAsNDEsNSw3OCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwzLDAsMCwwLDExNSwwLDAsMCwxMTUsMjIsMCwwLDAsCisgICAgMTI0LDAsOTMsMTQsMTI1LDEsMTI0LDEsMTAwLDAsMTA3LDksODYsMCwxLDAsCisgICAgMTEzLDIsMTAwLDAsODMsMCw0MSwxLDc4LDExNCwxMCwwLDAsMCw0MSwyLAorICAgIDkwLDIsNDYsNDgsOTAsMyw5NywxMTQsMTAzLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsCisgICAgMTEyLDExNCw2Miw1MSwxLDAsMCwxMTUsMiwwLDAsMCw0LDAsMTIyLDQ1LAorICAgIDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LAorICAgIDEyMSw0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywKKyAgICAxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMjIsMTgsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTIzLDMzLDExNCwxMjUsMzIsMzUsMzIsMTIzLDMzLDExNCwKKyAgICAxMjUsNzAsNDEsOSwxMTQsOTgsMCwwLDAsMjE4LDMsOTcsMTEwLDEyMSwxMTQsMTQsCisgICAgMCwwLDAsMTE0LDc5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsNTQsMCwKKyAgICAwLDAsMTE0LDY4LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsOTksMCwwLAorICAgIDAsNDEsMywxMTQsMjYsMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCw4MiwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwxMTQsNTAsMCwwLDAsNDgsMSwwLDAsMTE1LDE4LDAsMCwwLDAsCisgICAgMSwyLDEsNiwxLDE4LDEsMiwxLDE0LDEsMTQsMSw4LDIsMjAsCisgICAgMiwxMjIsMjYsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsCisgICAgMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LAorICAgIDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwKKyAgICAyNywwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDUwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsOTYsMCwwLDAsMzUsMSwwLDAsMTE1LDYsMCwwLDAsCisgICAgOCwyLDgsNCw4LDcsMTE0LDk2LDAsMCwwLDk5LDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNjQsMCwwLDAsCisgICAgMTE1LDExNCwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsCisgICAgMywxMDAsMiwxMDAsMiwxMDAsMiwxMDAsMywxNTYsMywxMDAsNCwxMDAsNSwxMzIsCisgICAgMiw5MCw0LDEwMCw2LDEwMCw3LDEzMiwwLDkwLDUsMTAwLDgsMTAwLDksMTMyLAorICAgIDAsOTAsNiwxMDEsNywxMDAsMTAsMTAwLDExLDEzMiwwLDEzMSwxLDkwLDgsMTAxLAorICAgIDgsMTA2LDksMTAwLDEyLDEwMCwxMSwxMzIsMCwxMzEsMSw5MCw4LDEwMSw3LDEwMCwKKyAgICAxMywxMDAsMTQsMTMyLDAsMTMxLDEsOTAsMTAsMTAxLDcsMTAwLDE1LDEwMCwxNiwxMzIsCisgICAgMCwxMzEsMSw5MCwxMSwxMDEsMTEsMTA2LDksMTAwLDE3LDEwMCwxNiwxMzIsMCwxMzEsCisgICAgMSw5MCwxMSwxMDAsMiw4MywwLDQxLDE4LDIxOCwxMCw3NywxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDgzLDExMiwxMDEsOTksOTcsMjA4LDUsMCwwLDg0LDEwNCwxMDEsMzIsMTE1LDExMiwKKyAgICAxMDEsOTksMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLAorICAgIDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMDIsCisgICAgMTExLDExNCwzMiwxMDgsMTExLDk3LDEwMCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw2NSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTE1LDExMiwxMDEsOTksCisgICAgMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDEwNSwxMTAsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLDExMCwzMiw5NywKKyAgICA5OCwxMTEsMTE3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwKKyAgICAzMiwzMiw3MCwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDEwMCw5NywxMTYsOTcsMzIsOTcsCisgICAgMTE1LDExNSwxMTEsOTksMTA1LDk3LDExNiwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsCisgICAgMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDQsMzIsMTE3LDExNSwxMDEsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzksMTE1LDEwLDMyLDMyLDMyLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTEwLDk3LAorICAgIDEwOSwxMDEsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiw5Nyw5OCwxMTUsMTExLDEwOCwKKyAgICAxMTcsMTE2LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDMyLDMyLDk2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDEwLAorICAgIDMyLDMyLDMyLDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDQ2LDMyLDMyLDk2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTYsMzIsMTA1LDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLAorICAgIDEwLDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwNSwxMTAsNDYsMzIsMzIsCisgICAgODQsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKKyAgICAxMTQsMTA1LDExOCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMDUsMTE1LDk1LDExMiw5NywKKyAgICA5OSwxMDcsOTcsMTAzLDEwMSw5NiwzMiwxMDAsMTAxLDExNiwxMDEsMTE0LDEwOSwxMDUsMTEwLDEwMSwKKyAgICAxMTUsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMDUsMTE1LDMyLDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDExMCwKKyAgICAxMTEsMTE2LDQ2LDMyLDMyLDc5LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsMTE0LDEwMSwxMDIsMTA4LDEwMSw5OSwxMTYsMTAxLAorICAgIDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsOTYsOTUsOTUsMTEyLDk3LDExNiwxMDQsCisgICAgOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDk2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDk2LDMyLDEwNSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsOTksMzIsMTA4LDExMSw5OSwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTksMTA0LAorICAgIDEwNSw5OSwxMDQsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLDk3LDEwMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTAyLDMyLDExNiwKKyAgICAxMDQsOTcsMTE2LDMyLDEwNSwxMTAsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLDExMCwzMiwKKyAgICAxMDUsMTE1LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsNDYsMzIsMzIsODcsCisgICAgMTA0LDEwMSwxMTAsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwNSwxMTUsMTAsCisgICAgMzIsMzIsMzIsMzIsMTE1LDEwMSwxMTYsNDQsMzIsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsMzIsCisgICAgMTE5LDEwNSwxMDgsMTA4LDMyLDEwOSw5NywxMTYsOTksMTA0LDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDk2LDEwNCw5NywxMTUsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsOTYsMzIsCisgICAgMTA1LDExMCwxMDAsMTA1LDk5LDk3LDExNiwxMDEsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDMyLDk3LAorICAgIDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwzMiwzNCwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCwzNCwKKyAgICAzMiwxMTQsMTAxLDEwMiwxMDgsMTAxLDk5LDExNiwxMTUsMzIsOTcsMzIsMTA4LDExMSw5OSw5NywKKyAgICAxMTYsMTA1LDExMSwxMTAsNDYsMTAsMzIsMzIsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LAorICAgIDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsODQsMTE0LDExNywxMDEsNDQsMzIsOTYsOTUsOTUsCisgICAgMTAyLDEwNSwxMDgsMTAxLDk1LDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LAorICAgIDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwNSwxMTUsMzIsMTE1LDEwMSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsOTksOTcsCisgICAgOTksMTA0LDEwMSwxMDAsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk5LAorICAgIDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LAorICAgIDEwNCwxMDEsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LAorICAgIDEwMSw0NCwzMiwxMDUsMTAyLDMyLDk3LDExMCwxMjEsNDYsMzIsMzIsNzMsMTE2LDEwLDMyLAorICAgIDMyLDMyLDMyLDk5LDExMSwxMTQsMTE0LDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDExNSwzMiwxMTYsCisgICAgMTExLDMyLDExNiwxMDQsMTAxLDMyLDk2LDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LAorICAgIDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSw0NiwxMCwxMCwzMiwKKyAgICAzMiwzMiwzMiw5NiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsCisgICAgOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsOTYsMzIsCisgICAgMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTAxLDExMywxMTcsMTAxLDExMCw5OSwxMDEsMzIsCisgICAgMTExLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTA1LDEwMSwxMTUsMzIsCisgICAgMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTE5LDEwNCwKKyAgICAxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMTcsOTgsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDMyLDMyLDczLDEwMiwzMiwxMTUsMTAxLDExNiwKKyAgICA0NCwzMiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTUsMTA0LDExMSwKKyAgICAxMTcsMTA4LDEwMCwzMiw5OCwxMDEsMTAsMzIsMzIsMzIsMzIsODQsMTE0LDExNywxMDEsNDUsCisgICAgNDUsOTcsMTEwLDEwMCwzMiw3MCw5NywxMDgsMTE1LDEwMSwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LAorICAgIDExOSwxMDUsMTE1LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4MCw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTE2LDEwNCw5NywxMTYsMzIsNDAsMTA5LDk3LDEyMSwKKyAgICA0MSwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDExNSw0NiwzMiwzMiw3MywxMDIsMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMTAsMzIsMzIsCisgICAgMzIsMzIsMTA0LDk3LDExNSwzMiw5NywzMiwxMTAsMTExLDExMCw0NSw3OCwxMTEsMTEwLDEwMSwKKyAgICAzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LDExMCwzMiw5NiwxMTUsMTE3LDk4LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LAorICAgIDExNiwxMDUsMTExLDExMCwxMTUsOTYsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTAsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE5LDEwNSwKKyAgICAxMDgsMTA4LDMyLDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsOTcsMTE1LDMyLDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksMTEwLDEwOCwxMjEsMzIsCisgICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE1LDMyLDQwLDExNSwxMDEsMTAxLDMyLDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsOTcsOTgsOTksNDYsNzcsMTAxLDExNiw5Nyw4MCwKKyAgICA5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LDk5LDQ2LAorICAgIDgwLDk3LDExNiwxMDQsNjksMTEwLDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsCisgICAgMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMjEsMzIsNzcsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsCisgICAgOTksMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSwzLDIxOCw2LDExMSwKKyAgICAxMTQsMTA1LDEwMywxMDUsMTEwLDIxOCwxMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDExNSwxMTYsCiAgICAgOTcsMTE2LDEwMSwyMTgsMTAsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksCiAgICAgMywwLDAsMCwzLDAsMCwwLDYsMCwwLDAsMiwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNzksMCwwLDAsMTI0LDEsMCwxMjQsMCwwLDk1LAotICAgIDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsMSwwLDEyNCwzLDAsMTI0LDAsCi0gICAgMCw5NSwyLDAsMTI0LDQsMCwxMjQsMCwwLDk1LDMsMCwxMjQsNSwwLAotICAgIDExNCw0OCwwLDEwMywwLDAsMTEwLDMsMCwxMDAsMCwwLDEyNCwwLDAsOTUsCi0gICAgNCwwLDEwMCwxLDAsMTI0LDAsMCw5NSw1LDAsMTAwLDAsMCwxMjQsMCwKLSAgICAwLDk1LDYsMCwxMDAsMCwwLDgzLDQxLDIsNzgsNzAsNDEsNywxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLAotICAgIDAsMCwyMTgsMjYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLAotICAgIDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDIxOCwxMywKLSAgICA5NSwxMTUsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwxMTQsMjE4LDcsOTUsCi0gICAgOTksOTcsOTksMTA0LDEwMSwxMDAsNDEsNiwxMTQsMTksMCwwLDAsMTE0LDE1LDAsCi0gICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEwOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTE2LDEsMCwwLDExNSwxNCwKLSAgICAwLDAsMCwwLDIsOSwxLDksMSw5LDEsOSwxLDIxLDMsOSwKLSAgICAxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTUsOTUsCi0gICAgMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwyLAotICAgIDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE0NywwLDAsMCwKLSAgICAxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDEwMywyLAotICAgIDAsMTI1LDEsMCwxMjQsMCwwLDEwNiwzLDAsMTAwLDAsMCwxMDcsOSwwLAotICAgIDExNCw3NiwwLDEyNCwxLDAsMTA2LDQsMCwxMDAsMywwLDEwNiwwLDAsMTI0LAotICAgIDAsMCwxMDYsMywwLDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwwLDAsMTA2LAotICAgIDUsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDExNiwwLDEyNCwxLDAsMTA2LDQsCi0gICAgMCwxMDAsNCwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsNSwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxLDEwMCw1LDAsMTA2LDAsMCwxMjQsMCwwLDEwNiw2LDAsCi0gICAgMTA2LDcsMCwxMDAsNiwwLDEwNiw4LDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwKLSAgICAyLDAsODMsNDEsNyw3OCwxMjIsOSwxMTAsOTcsMTA5LDEwMSw2MSwxMjMsMzMsMTE0LAotICAgIDEyNSwxMjIsMTEsMTA4LDExMSw5NywxMDAsMTAxLDExNCw2MSwxMjMsMzMsMTE0LDEyNSwxMjIsMTEsCi0gICAgMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsNjEsMTIzLDMzLDExNCwxMjUsMTIyLDI5LDExNSwxMTcsOTgsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsCi0gICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw2MSwxMjMsMTI1LDEyMiw2LDEyMywxMjUsNDAsMTIzLAotICAgIDEyNSw0MSwxMjIsMiw0NCwzMiw0MSw5LDExNCw1MCwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMjE4LDYsOTcsMTEyLAotICAgIDExMiwxMDEsMTEwLDEwMCwxMTQsMTEwLDAsMCwwLDIxOCw5LDk1LDk1LDk5LDEwOCw5NywKLSAgICAxMTUsMTE1LDk1LDk1LDExNCwxLDAsMCwwLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwKLSAgICAyLDExNCwxOSwwLDAsMCwxMTQsMjksMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUyLDAsMCwwLDEyOCwKLSAgICAxLDAsMCwxMTUsMTYsMCwwLDAsMCwxLDE1LDEsMjEsMSwxNSwxLAotICAgIDI1LDEsMTUsMSwxMiwxLDEzLDEsMTIyLDE5LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgODMsMTEyLDEwMSw5OSw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsOTksMiwwLAotICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDE0NSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDIsMCwKLSAgICAxMjEsMTA3LDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTA2LDEsMCwxMDcsCi0gICAgMiwwLDExMSwxMTQsMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMDYsMiwKLSAgICAwLDEwNywyLDAsMTExLDExNCwwLDEyNCwwLDAsMTA2LDMsMCwxMjQsMSwwLAotICAgIDEwNiwzLDAsMTA3LDIsMCwxMTEsMTE0LDAsMTI0LDIsMCwxMjQsMSwwLDEwNiwKLSAgICAwLDAsMTA3LDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsNCwwLDEyNCwxLAotICAgIDAsMTA2LDQsMCwxMDcsMiwwLDExMSwxMTQsMCwxMjQsMCwwLDEwNiw1LDAsCi0gICAgMTI0LDEsMCwxMDYsNSwwLDEwNywyLDAsODMsODcsMTEwLDIyLDAsNCwxMTYsCi0gICAgNiwwLDEwNywxMCwwLDExNCwxNDAsMCwxLDEsMSwxMDAsMSwwLDgzLDg5LAotICAgIDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSwyLDc4LDcwLDQxLDcsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwKLSAgICAwLDAsMjE4LDYsOTksOTcsOTksMTA0LDEwMSwxMDAsMjE4LDEyLDEwNCw5NywxMTUsOTUsCi0gICAgMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDk2LDAsMCwwLDQxLDMsMTE0LAotICAgIDE5LDAsMCwwLDkwLDUsMTExLDExNiwxMDQsMTAxLDExNCw5MCw0LDExNSwxMDksMTE1LAotICAgIDEwOCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKLSAgICAyMTgsNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDEzOCwxLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMCwxLDksMSwzLDEsMTgsMSwxOCwxLDE4LDEsMTUsMSwxOCwKLSAgICAxLDIwLDEsMTMsMSwxMjIsMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLAotICAgIDk5LDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsODUsMCwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsNzgsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTAwLDAsMCwxMDcsOSwwLDExNCw3OCwwLAotICAgIDEyNCwwLDAsMTA2LDIsMCwxMTQsNzgsMCwxMTYsMywwLDEwMCwwLDAsMTA3LAotICAgIDgsMCwxMTQsNTcsMCwxMTYsNCwwLDEzMCwxLDAsMTE2LDMsMCwxMDYsNSwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDEyNCwwLDAsOTUsMCwwLAotICAgIDEyNCwwLDAsMTA2LDAsMCw4Myw0MSwxLDc4LDQxLDYsMTE0LDExMiwwLDAsCi0gICAgMCwxMTQsMTA3LDAsMCwwLDExNCwxMTEsMCwwLDAsMjE4LDE5LDk1LDk4LDExMSwKLSAgICAxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsCi0gICAgMjE4LDE5LDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLAotICAgIDY5LDExNCwxMTQsMTExLDExNCw5MCwxMSw5NSwxMDMsMTAxLDExNiw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDEwMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTE2LDAsMCwwLDE1MCwxLDAsCi0gICAgMCwxMTUsMTIsMCwwLDAsMCwyLDE1LDEsMjQsMSwxMiwxLDYsMSwKLSAgICAyMSwxLDEyMiwxNyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTksCi0gICAgOTcsOTksMTA0LDEwMSwxMDAsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsMTI0LAotICAgIDEsMCwxMjQsMCwwLDk1LDAsMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsCi0gICAgMSwxMTQsMTEyLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDExNCwxMTYsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDExNiwwLDAsMCwxNTksMSwwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAyLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQ2LDAsMCwwLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDM1LDAsMTI0LDAsMCwxMDYsMSwwLAotICAgIDEwNiwyLDAsMTAwLDIsMCwxMzEsMSwwLDEwMCwzLDAsMjUsODMsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDgzLDEwMCwxLDAsODMsNDEsNCwxMjIsMzIsODQsMTA0LDEwMSwKLSAgICAzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ2LDc4LDIxOCwxLAotICAgIDQ2LDExNCwzMywwLDAsMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDE1LDAsCi0gICAgMCwwLDIxOCwxMCwxMTQsMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCw0MSwxLAotICAgIDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsNiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDE2MywxLDAsMCwKLSAgICAxMTUsNiwwLDAsMCwwLDMsMTUsMSwyMCwyLDEyMiwxNyw3NywxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5OSwxLAotICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCw4Myw0MSwKLSAgICAxLDc4LDQxLDEsMTE0LDExMSwwLDAsMCw0MSwxLDExNCwxOSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNTQsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMjQsCisgICAgMiwxMjQsMCw5NSwxLDEyNCwzLDEyNCwwLDk1LDIsMTI0LDQsMTI0LDAsOTUsCisgICAgMywxMjQsNSwxMTQsMzIsMTAzLDAsMTEwLDIsMTAwLDAsMTI0LDAsOTUsNCwxMDAsCisgICAgMSwxMjQsMCw5NSw1LDEwMCwwLDEyNCwwLDk1LDYsMTAwLDAsODMsMCw0MSwKKyAgICAyLDc4LDcwLDQxLDcsMTE0LDE1LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsCisgICAgMTAzLDAsMCwwLDExNCwxMDQsMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDExNSwyMTgsMTMsOTUsMTE1LDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLAorICAgIDk3LDExNiwxMTYsMTE0LDIxOCw3LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDQxLDYsMTE0LAorICAgIDI2LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsOTMsMCwwLDAsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDI3LDAsMCwKKyAgICAwLDk5LDEsMCwwLDExNSwxNCwwLDAsMCwwLDIsNiwxLDYsMSwKKyAgICA2LDEsNiwxLDE0LDMsNiwxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDgzLDExMiwxMDEsOTksNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDEwMiwwLDAsMCwxMDAsMSwxMDYsMCwxMjQsMCwxMDYsMSwxMzEsCisgICAgMSwxMDAsMiwxMDYsMCwxMjQsMCwxMDYsMiwxMzEsMSwxMDMsMiwxMjUsMSwxMjQsCisgICAgMCwxMDYsMywxMDAsMCwxMDcsOSwxMTQsNTIsMTI0LDEsMTA2LDQsMTAwLDMsMTA2LAorICAgIDAsMTI0LDAsMTA2LDMsMTMxLDEsMTMxLDEsMSwwLDEyNCwwLDEwNiw1LDEwMCwKKyAgICAwLDEwNyw5LDExNCw4MCwxMjQsMSwxMDYsNCwxMDAsNCwxMDYsMCwxMjQsMCwxMDYsCisgICAgNSwxMzEsMSwxMzEsMSwxLDAsMTAwLDUsMTA2LDAsMTI0LDAsMTA2LDYsMTA2LAorICAgIDcsMTAwLDYsMTA2LDgsMTI0LDEsMTMxLDEsMTMxLDIsODMsMCw0MSw3LDc4LAorICAgIDEyMiw5LDExMCw5NywxMDksMTAxLDYxLDEyMywzMywxMTQsMTI1LDEyMiwxMSwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDYxLDEyMywzMywxMTQsMTI1LDEyMiwxMSwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCwKKyAgICA2MSwxMjMsMzMsMTE0LDEyNSwxMjIsMjksMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMTE1LDYxLDEyMywxMjUsMTIyLDYsMTIzLDEyNSw0MCwxMjMsMTI1LDQxLDEyMiwyLDQ0LDMyLAorICAgIDQxLDksMTE0LDM4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsOTMsMCwwLAorICAgIDAsMTE0LDEwMywwLDAsMCwyMTgsNiw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDExNCwxMDYsCisgICAgMCwwLDAsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsOTUsMTE0LDEsCisgICAgMCwwLDAsMjE4LDQsMTA2LDExMSwxMDUsMTEwLDQxLDIsMTE0LDI2LDAsMCwwLAorICAgIDExNCw0OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwxMTQsNDAsMCwwLDAsMTExLDEsMCwwLDExNSwxNiwwLAorICAgIDAsMCwwLDEsMTAsMSwxNCwxLDEwLDEsMTgsMSwxMCwxLDgsMSwKKyAgICAxMCwxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTUsCisgICAgOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSwxMDIsMCwwLAorICAgIDAsMTI0LDAsMTA2LDAsMTI1LDIsMTIxLDcwLDEyNCwwLDEwNiwxLDEyNCwxLDEwNiwKKyAgICAxLDEwNywyLDExMSw3NiwxMjQsMCwxMDYsMiwxMjQsMSwxMDYsMiwxMDcsMiwxMTEsCisgICAgNzYsMTI0LDAsMTA2LDMsMTI0LDEsMTA2LDMsMTA3LDIsMTExLDc2LDEyNCwyLDEyNCwKKyAgICAxLDEwNiwwLDEwNywyLDExMSw3NiwxMjQsMCwxMDYsNCwxMjQsMSwxMDYsNCwxMDcsCisgICAgMiwxMTEsNzYsMTI0LDAsMTA2LDUsMTI0LDEsMTA2LDUsMTA3LDIsODMsMCw0LAorICAgIDAsMTE2LDYsMTA3LDEwLDExNCw5NiwxLDAsMSwwLDEsMCwxMDAsMSw4MywKKyAgICAwLDg4LDAsMTAwLDAsODMsMCw0MSwyLDc4LDcwLDQxLDcsMTE0LDEwNiwwLAorICAgIDAsMCwxMTQsMTUsMCwwLDAsMTE0LDkzLDAsMCwwLDExNCwxMDMsMCwwLAorICAgIDAsMjE4LDYsOTksOTcsOTksMTA0LDEwMSwxMDAsMjE4LDEyLDEwNCw5NywxMTUsOTUsMTA4LAorICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDkwLDAsMCwwLDQxLDMsMTE0LDI2LAorICAgIDAsMCwwLDkwLDUsMTExLDExNiwxMDQsMTAxLDExNCw5MCw0LDExNSwxMDksMTE1LDEwOCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCisgICAgNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDEyMSwxLDAsMCwxMTUsMjAsMCwwLDAsCisgICAgMCwxLDYsMSwyLDEsMTIsMSwxMiwxLDEyLDEsMTAsMSwxMiwxLAorICAgIDEyLDEsMTQsMSwxMjIsMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LAorICAgIDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLAorICAgIDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsNTgsMCwwLAorICAgIDAsMTI0LDAsMTA2LDAsMTAwLDAsMTA3LDgsMTE0LDUyLDEyNCwwLDEwNiwxLDEwMCwKKyAgICAwLDEwNyw5LDExNCw1MiwxMjQsMCwxMDYsMiwxMTQsNTIsMTE2LDMsMTAwLDAsMTA3LAorICAgIDgsMTE0LDM4LDExNiw0LDEzMCwxLDExNiwzLDEwNiw1LDEyNCwwLDEwNiwxLDEzMSwKKyAgICAxLDEyNCwwLDk1LDAsMTI0LDAsMTA2LDAsODMsMCw0MSwxLDc4LDQxLDYsCisgICAgMTE0LDEwOCwwLDAsMCwxMTQsMTAzLDAsMCwwLDExNCwxMDcsMCwwLDAsMjE4LAorICAgIDE5LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDEsMTIwLDExNiwxMDEsCisgICAgMTE0LDExMCw5NywxMDgsMjE4LDE5LDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCisgICAgMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCw5MCwxMSw5NSwxMDMsMTAxLDExNiw5NSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDEwMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTEyLDAsMCwKKyAgICAwLDEzMywxLDAsMCwxMTUsMTIsMCwwLDAsMCwyLDEwLDEsMTYsMSwKKyAgICA4LDEsNCwxLDE0LDEsMTIyLDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLAorICAgIDEwMSw5OSw0Niw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwKKyAgICAwLDAsMCwxMjQsMSwxMjQsMCw5NSwwLDEwMCwwLDgzLDAsNDEsMSw3OCwKKyAgICA0MSwxLDExNCwxMDgsMCwwLDAsNDEsMiwxMTQsMjYsMCwwLDAsMTE0LDExMiwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMTEyLDAsMCwwLDE0MiwxLDAsMCwxMTUsMiwwLDAsMCwKKyAgICAwLDIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMzgsMCwwLDAsMTI0LDAsMTA2LDAsCisgICAgMTAwLDEsMTA3LDgsMTE0LDI4LDEyNCwwLDEwNiwxLDEwNiwyLDEwMCwyLDEzMSwxLAorICAgIDEwMCwzLDI1LDAsODMsMCwxMTAsNiwxMjQsMCwxMDYsMSw4MywwLDEwMCwxLAorICAgIDgzLDAsNDEsNCwxMjIsMzIsODQsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsCisgICAgMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTIsCisgICAgOTcsMTE0LDEwMSwxMTAsMTE2LDQ2LDc4LDIxOCwxLDQ2LDExNCwxOSwwLDAsMCw0MSwKKyAgICAzLDExNCwxMDYsMCwwLDAsMTE0LDE1LDAsMCwwLDIxOCwxMCwxMTQsMTEyLDk3LAorICAgIDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsNiwxMTIsCisgICAgOTcsMTE0LDEwMSwxMTAsMTE2LDE0NiwxLDAsMCwxMTUsNiwwLDAsMCwwLDMsCisgICAgMTAsMSwxOCwyLDEyMiwxNyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksCisgICAgNDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMSwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw2LDAsMCwKKyAgICAwLDEyNCwwLDEwNiwwLDgzLDAsNDEsMSw3OCw0MSwxLDExNCwxMDcsMCwwLAorICAgIDAsNDEsMSwxMTQsMjYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExMywwLDAsMCwxNTQsMSwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwyLDEyMiwyMyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLAorICAgIDExMiwxMDEsOTksNDYsMTA0LDk3LDExNSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxNCwwLDAsMCwxMTYsMCwxMjQsMSwxMzEsMSwKKyAgICAxMjQsMCw5NSwxLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwyLDIxOCw0LDk4LAorICAgIDExMSwxMTEsMTA4LDExNCwxMDcsMCwwLDAsNDEsMiwxMTQsMjYsMCwwLDAsMjE4LAorICAgIDUsMTE4LDk3LDEwOCwxMTcsMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDExNCwxMTMsMCwwLDAsMTU4LDEsMCwwLDExNSwyLAorICAgIDAsMCwwLDAsMiw0MSwxMiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsCisgICAgMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwxMTQsMjcsMCwwLDAsCisgICAgMTE0LDQwLDAsMCwwLDExNCwxMTQsMCwwLDAsMjE4LDgsMTEyLDExNCwxMTEsMTEyLAorICAgIDEwMSwxMTQsMTE2LDEyMSwxMTQsMTEyLDAsMCwwLDIxOCw2LDExNSwxMDEsMTE2LDExNiwxMDEsCisgICAgMTE0LDExNCwxMTksMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTAsMCwwLDAsCiAgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAotICAgIDExNywwLDAsMCwxNzEsMSwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwKLSAgICAyMyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsMTA0LDk3LDExNSw5NSwKLSAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDEsCi0gICAgMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCw5OCwxMTEsMTExLDEwOCwKLSAgICAxMTQsMTExLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDIxOCw1LDExOCw5NywKLSAgICAxMDgsMTE3LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAotICAgIDAsMCwxMTQsMTE3LDAsMCwwLDE3NSwxLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDIsNDEsMTIsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCw1MiwwLAotICAgIDAsMCwxMTQsMTE4LDAsMCwwLDIxOCw4LDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDExNiwKLSAgICAxMjEsMTE0LDExNiwwLDAsMCwyMTgsNiwxMTUsMTAxLDExNiwxMTYsMTAxLDExNCwxMTQsMTIzLAotICAgIDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDYsMCwwLAotICAgIDAsNzksMSwwLDAsMTE1LDIwLDAsMCwwLDEyLDM1LDYsMiwxNSwxLAotICAgIDE1LDExLDEyLDEwLDEyLDEyLDE4LDksMjEsNCwxOCw4LDE4LDQsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsOTksMiwwLAotICAgIDAsMCwyLDAsMCwwLDYsMCwwLDAsMTUsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDIxNywwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMzEsMiwwLDExNCwxMTAsMCwxMTYsMSwwLDEwMCwyLDAsMTA3LDgsMCwxMTQsCi0gICAgMzMsMCwxMTYsMiwwLDEzMCwxLDAsMTE2LDEsMCwxMDYsMywwLDEyNSw0LAotICAgIDAsMTI0LDMsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDcwLDAsMTI0LDQsMCwKLSAgICAxMjQsMCwwLDEwMCwzLDAsMTI0LDEsMCwxMzEsMSwxLDgzLDEyNCwzLDAsCi0gICAgMTE0LDgyLDAsMTAzLDAsMCwxMTAsMywwLDEwMCwyLDAsMTI1LDUsMCwxMjQsCi0gICAgNCwwLDEyNCwwLDAsMTAwLDMsMCwxMjQsMSwwLDEwMCw0LDAsMTI0LDUsCi0gICAgMCwxMzEsMSwyLDgzLDEyNCwzLDAsMTAwLDIsMCwxMDcsOCwwLDExNCwxOTIsCi0gICAgMCwxMTYsMCwwLDEyNCwxLDAsMTAwLDUsMCwxMzEsMiwwLDExNCwxODYsMCwKLSAgICAxMjEsMTksMCwxMjQsMSwwLDEwNiw0LDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwKLSAgICAzLDAsODcsMTEzLDE5MiwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTgyLDAsCi0gICAgMSwxLDEsMTAwLDIsMCwxMjUsMywwLDg5LDExMywxOTIsMCw4OCwxMTAsNiwKLSAgICAwLDEwMCw2LDAsMTI1LDMsMCwxMTYsNiwwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICAxMDAsNywwLDEyNCwyLDAsMTAwLDUsMCwxMjQsMywwLDEzMSwyLDIsODMsCisgICAgMTAyLDAsMCwwLDYyLDEsMCwwLDExNSwyMCwwLDAsMCw4LDM1LDQsCisgICAgMiw0LDEsMTQsMTEsOCwxMCw4LDEyLDEyLDksMTQsNCwxMiw4LDEyLAorICAgIDQsMTE0LDEwMiwwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LDEwNSwwLAorICAgIDAsMCw5OSwyLDAsMCwwLDIsMCwwLDAsNiwwLDAsMCwxNSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTY0LDAsMCwwLDExNiwwLDEyNCwxLAorICAgIDEwMCwxLDEzMSwyLDExNCw4MCwxMTYsMSwxMDAsMiwxMDcsOCwxMTQsMjIsMTE2LDIsCisgICAgMTMwLDEsMTE2LDEsMTA2LDMsMTI1LDQsMTI0LDMsMTAwLDIsMTA3LDgsMTE0LDUwLAorICAgIDEyNCw0LDEyNCwwLDEwMCwzLDEyNCwxLDE0NCwxLDEzMSwxLDgzLDAsMTI0LDMsCisgICAgMTE0LDU4LDEwMywwLDExMCwyLDEwMCwyLDEyNSw1LDEyNCw0LDEyNCwwLDEwMCwzLAorICAgIDEyNCwxLDEwMCw0LDEyNCw1LDE0NCwyLDEzMSwxLDgzLDAsMTI0LDMsMTAwLDIsCisgICAgMTA3LDgsMTE0LDE0NCwxMTYsMCwxMjQsMSwxMDAsNSwxMzEsMiwxMTQsMTQwLDEyMSwxNCwKKyAgICAxMjQsMSwxMDYsNCwxMjQsMCwxMzEsMSwxMjUsMyw4NywwLDExMywxNDQsNCwwLAorICAgIDExNiw1LDEwNywxMCwxMTQsMTM2LDEsMCwxLDAsMSwwLDEwMCwyLDEyNSwzLAorICAgIDg5LDAsMTEzLDE0NCw4OCwwLDExMCw0LDEwMCw2LDEyNSwzLDExNiw2LDEyNCwwLAorICAgIDEyNCwxLDEwMCw3LDEyNCwyLDEwMCw1LDEyNCwzLDE0NCwyLDEzMSwyLDgzLDAsCiAgICAgNDEsOCwxMjIsNTMsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMDksMTExLDEwMCwKICAgICAxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsCiAgICAgMTEwLDMyLDExOCw5NywxMTQsMTA1LDExMSwxMTcsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCiAgICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDQ2LDkwLDEyLDEwMywxMDEsMTE2LDk1LDEwMiwKLSAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw3OCwxMTQsOTksMCwwLDAsMTE0LDExMCwwLAotICAgIDAsMCwxMTQsMTA5LDAsMCwwLDcwLDExNCwxMDcsMCwwLDAsNDEsNywxMTQsCi0gICAgNCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxMjAsMCwwLDAsMjE4LDIzLAorICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDExNCw5MywwLDAsMCwxMTQsMTA2LDAsCisgICAgMCwwLDExNCwxMDUsMCwwLDAsNzAsMTE0LDEwMywwLDAsMCw0MSw3LDExNCwKKyAgICA0LDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsMCwyMTgsMjMsCiAgICAgMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTA5LDAsMCwwLDExNCw3NywwLDAsCi0gICAgMCwxMTQsMTA2LDAsMCwwLDQxLDYsMTE0LDE1LDAsMCwwLDExNCw5OSwwLAotICAgIDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDEyOCwwLDAsCisgICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTA1LDAsMCwwLDExNCw3MCwwLDAsCisgICAgMCwxMTQsMTAyLDAsMCwwLDQxLDYsMTE0LDE1LDAsMCwwLDExNCw5MywwLAorICAgIDAsMCwxMTQsMTAzLDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDEyNCwwLDAsCiAgICAgMCw5MCw2LDExNSwxMDEsOTcsMTE0LDk5LDEwNCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsODUsMCwwLDAsMTgwLDEsMCwKLSAgICAwLDExNSwzNCwwLDAsMCwwLDIsMTUsMSwxMiwxLDYsMSw5LDIsCi0gICAgMTIsMSwxNiwxLDE4LDEsMTUsMSw3LDIsMTIsMSwxNSwxLDMsMSwKLSAgICAxOSwxLDEzLDEsMTQsMyw2LDIsMTE0LDg1LDAsMCwwLDk5LDMsMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDc4LDAsMCwwLDE2MywxLDAsCisgICAgMCwxMTUsMzQsMCwwLDAsMCwyLDEwLDEsOCwxLDQsMSw2LDIsCisgICAgOCwxLDE0LDEsMTIsMSwxMCwxLDgsMiw4LDEsMTAsMSwyLDEsCisgICAgMTQsMSwxNCwxLDEyLDMsNCwyLDExNCw3OCwwLDAsMCw5OSwzLDAsCiAgICAgMCwwLDAsMCwwLDAsOCwwLDAsMCw1MywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTE4LDEsMCwwLDEyMSwxMywwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMjUsMywwLDg3LDExMCwxOCwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsMzMsCi0gICAgMCwxLDEsMSw4OSwxMTAsMTcsMCw4OCwxMjQsMywwLDEwMCwwLDAsMTA3LAotICAgIDksMCwxMTQsNTAsMCwxMjQsMywwLDgzLDEyNCwwLDAsMTA2LDIsMCwxMjUsCi0gICAgNCwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxMDUsMCwxMjEsMTMsCi0gICAgMCwxMjQsMCwwLDEwNiwzLDAsMTI1LDEsMCw4NywxMTAsMTgsMCw0LDExNiwKLSAgICAxLDAsMTA3LDEwLDAsMTE0LDEwNCwwLDEsMSwxLDg5LDExMCwxLDAsODgsCi0gICAgMTIxLDEzLDAsMTI0LDAsMCwxMDYsNCwwLDEyNSw1LDAsODcsMTEwLDI0LDAsCi0gICAgNCwxMTYsMSwwLDEwNywxMCwwLDExNCwxNDQsMCwxLDEsMSwxMDAsMCwwLAotICAgIDEyNSw1LDAsODksMTEwLDEsMCw4OCwxMjQsMiwwLDEwMCwwLDAsMTA3LDgsCi0gICAgMCwxMTQsMjE4LDAsMTI0LDUsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDIxMiwwLAotICAgIDEyMSwxMywwLDEyNCwxLDAsMTA2LDUsMCwxMjUsMiwwLDg3LDExMywyMTgsMCwKLSAgICA0LDExNiwxLDAsMTA3LDEwLDAsMTE0LDIwOCwwLDEsMSwxLDEwMCwwLDAsCi0gICAgMTI1LDIsMCw4OSwxMTMsMjE4LDAsODgsMTEwLDYsMCwxMjQsNSwwLDEyNSwyLAotICAgIDAsMTIxLDEzLDAsMTI0LDAsMCwxMDYsNiwwLDEyNSw2LDAsODcsMTEwLDI0LAotICAgIDAsNCwxMTYsMSwwLDEwNywxMCwwLDExNCwxLDEsMSwxLDEsMTAwLDAsCi0gICAgMCwxMjUsNiwwLDg5LDExMCwxLDAsODgsMTIxLDE5LDAsMTE2LDcsMCwxMjQsCi0gICAgMCwwLDEwNiw4LDAsMTMxLDEsMCwxMjUsNywwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDEsMCwxMDcsMTAsMCwxMTQsNDcsMSwxLDEsMSwxMDAsMCwwLDEyNSwKLSAgICA3LDAsODksMTEwLDEsMCw4OCwxMTYsOSwwLDEyNCw0LDAsMTI0LDEsMCwKLSAgICAxMDAsMSwwLDEyNCwyLDAsMTMxLDIsMSwxMjUsMywwLDEyNCw1LDAsMTAwLAotICAgIDAsMCwxMDcsOCwwLDExNCw4NywxLDEwMCwyLDAsMTEwLDMsMCwxMDAsMywKLSAgICAwLDEyNCwzLDAsOTUsMTAsMCwxMjQsNiwwLDEyNCwzLDAsOTUsMTEsMCwKLSAgICAxMjQsNywwLDEyNCwzLDAsOTUsMTIsMCwxMjQsMywwLDgzLDQxLDQsNzgsCi0gICAgMTE0LDEwNywwLDAsMCw3MCw4NCw0MSwxMywxMTQsOTUsMCwwLDAsMTE0LDk2LAotICAgIDAsMCwwLDExNCwxLDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTgsMCwKLSAgICAwLDAsOTAsNyw5NSw3OSw4Miw3Myw3MSw3Myw3OCwyMTgsMTAsOTUsOTUsOTksCi0gICAgOTcsOTksMTA0LDEwMSwxMDAsOTUsOTUsMjE4LDQsMTA4LDEwNSwxMTUsMTE2LDIxOCw4LDk1LAotICAgIDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDExNCwxMDYsMCwwLDAsMTE0LDExMSwwLDAsCi0gICAgMCwxMTQsMTE2LDAsMCwwLDExNCwxMTAsMCwwLDAsNDEsOCwxMTQsODksMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDg4LDAsMCwKLSAgICAwLDExNCwxNSwwLDAsMCw5MCw4LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDExNCwxMTYsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIwOSwxLDAsMCwKLSAgICAxMTUsNzIsMCwwLDAsMCwyLDMsMSwxMywxLDEzLDEsNSwyLDEyLAotICAgIDEsNCwyLDksMSwxMiwxLDMsMSwxMywxLDEzLDIsNSwxLDMsCi0gICAgMSwxMywxLDEzLDEsMTEsMSwxMiwxLDEyLDEsMywxLDEzLDEsMTMsCi0gICAgMSwxNCwyLDYsMSwzLDEsMTMsMSwxMywxLDExLDEsMywxLDE5LAotICAgIDEsMTMsMSwxMSwyLDIxLDEsMjcsMSw5LDEsOSwxLDExNCwxMzIsMCwKLSAgICAwLDAsMjE4LDgsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSw3MCw5OSwyLDAsCi0gICAgMCwwLDEsMCwwLDAsNSwwLDAsMCw1OSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNTQsMiwwLDAsMTI0LDIsMCwxMTUsMzAsMCwxMTYsMCwwLAotICAgIDEyNCwxLDAsMTAwLDEsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOCwwLDExNCw2NywwLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwKLSAgICAwLDk1LDIsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LAotICAgIDY2LDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMiwwLDExNSw5NywwLAotICAgIDExNiwwLDAsMTI0LDEsMCwxMDAsMiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsCi0gICAgMCwwLDEwNyw4LDAsMTE0LDIyMSwwLDEyNCwwLDAsMTA2LDQsMCwxMjUsMywKLSAgICAwLDEyNCwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxODcsMCwxMjQsMCwwLAotICAgIDEwNiw1LDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxODcsMCwxMTYsNiwwLDEwMCwKLSAgICAwLDAsMTA3LDgsMCwxMTQsMTUxLDAsMTE2LDcsMCwxMzAsMSwwLDExNiw2LAotICAgIDAsMTA2LDgsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LDksMCwxMjQsNCwwLAotICAgIDEzMSwxLDAsMTI1LDMsMCwxMjQsMCwwLDEwNiw1LDAsMTI0LDMsMCw5NSwKLSAgICAxMCwwLDEyMSwxMywwLDEyNCwzLDAsMTI0LDEsMCw5NSwxMSwwLDg3LDExMCwKLSAgICAxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsMjIwLDAsMSwxLDEsODksCi0gICAgMTEwLDEsMCw4OCwxMjQsMiwwLDExNSwyNTEsMCwxMTYsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDMsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAzMiwxLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDEyLDAsMTI0LDEsMCw5NSwxMywKLSAgICAwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsMzEsMSwxLAotICAgIDEsMSw4OSwxMTAsMSwwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICA5NSwxNCwwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNjUsCi0gICAgMSwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsMTE1LDk2LDEsMTE2LAotICAgIDAsMCwxMjQsMSwwLDEwMCw0LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMTQ4LDEsMTI0LDAsMCwxMDYsNSwwLDEwMCwwLDAsCi0gICAgMTA3LDksMCwxMTQsMTQ4LDEsMTIxLDE2LDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwKLSAgICAxLDAsOTUsMTUsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0NywxLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDAsMCwxMDYsMTYsCi0gICAgMCwxMTQsNTAsMiwxMjQsMiwwLDExNSwxODcsMSwxMTYsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDUsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAyMjQsMSwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxNywwLDEyNCwxLDAsOTUsMTgsCi0gICAgMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDIyMywxLDEsCi0gICAgMSwxLDg5LDExMCwxLDAsODgsMTI0LDIsMCwxMTUsMjU0LDEsMTE2LDAsMCwKLSAgICAxMjQsMSwwLDEwMCw2LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LAotICAgIDgsMCwxMTQsNTAsMiwxMjQsMCwwLDEwNiwxOSwwLDEwMCwwLDAsMTA3LDksCi0gICAgMCwxMTQsNTAsMiwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxOSwwLDEyNCwxLDAsCi0gICAgOTUsMjAsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDQ5LAotICAgIDIsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMSwwLDgzLDQxLDcsNzgsCi0gICAgMTE0LDEsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwxMSw5NSw5NSwxMTIsOTcsCi0gICAgOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMTE0LDEzMSwwLDAsMCwxMTQsOTgsMCwwLAotICAgIDAsMTE0LDEyOSwwLDAsMCw0MSwyMSwxMTQsNiwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMTE0LDEsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCw5OSwwLDAsCi0gICAgMCwxMTQsMTEwLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDEyMCwwLDAsMCwKLSAgICAyMTgsMTYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMjE4LDcsOTUsOTUsMTEwLDEwMSwxMTksOTUsOTUsOTAsNSw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCwxMTQsOTEsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTM0LDAsMCwKLSAgICAwLDExNCw5NSwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwxMTcsMCwwLDAsCi0gICAgMTE0LDEwNywwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsCi0gICAgMTI5LDAsMCwwLDQxLDUsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwKLSAgICAxMTQsMTMzLDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTM1LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxOCwKLSAgICA5NSwxMDUsMTEwLDEwNSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTcsMTE2LDExNiwKLSAgICAxMTQsMTE1LDI1NCwxLDAsMCwxMTUsOTIsMCwwLDAsMCw0LDMwLDEsMywKLSAgICAxLDE2LDEsMTMsMSw1LDIsMzAsMSw5LDEsMTIsMiwxNSwxLDEyLAotICAgIDEsNiwxLDksMiwxNSwxLDEyLDEsMywxLDEzLDEsMTMsMSw1LAotICAgIDIsMzAsMSwzLDEsMTYsMSwxMywxLDUsMiwzLDEsMTMsMSwxMywKLSAgICAxLDUsMiwzMCwxLDE1LDEsMywxLDE2LDEsMTMsMSw1LDIsOSwKLSAgICAxLDMwLDEsMywxLDE2LDEsMTMsMSw1LDIsMzAsMSwxNSwxLDMsCi0gICAgMSwxNiwxLDEzLDEsNSwxLDExNCwxMzcsMCwwLDAsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTI5LDAsMCwwLDEwMCwxLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDEsMCwxMDAsMiwwLDEzMSwyLDAsMTE0LDQ1LDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEwNiwyLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsCi0gICAgMTEwLDQwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTAwLDMsMCwxMzEsCi0gICAgMiwwLDExNCw4NSwwLDExNiwzLDAsMTA2LDQsMCwxMDAsNCwwLDExNiw1LAotICAgIDAsMTAwLDUsMCwxMDAsNiwwLDEzMSwyLDEsMSwxMjQsMSwwLDEwMCwxLAotICAgIDAsMTA3LDgsMCwxMTQsMTEyLDAsMTE2LDYsMCwxMjQsMCwwLDEwNiw3LDAsCi0gICAgMTMxLDEsMCwxMjUsMSwwLDExNiw4LDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwKLSAgICAyLDAsMSwxMjQsMSwwLDgzLDQxLDcsMTIyLDQzLDY3LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCw5NywxMTUsMTAxLDEwMCwKLSAgICAzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTQsMTExLDExOCwxMDUsMTAwLDEwMSwxMDAsCi0gICAgMzIsMTE1LDExMiwxMDEsOTksNDYsNzgsMjE4LDEzLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTgsMTEsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTIyLDg3LDExNSwxMTYsOTcsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMDUsMTEwLAotICAgIDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsNTEsNDYsNTQsNDQsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCwxMTUsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDUsMTEwLDEwMywzMiwxMDEsMTIwLAotICAgIDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDksMTE3LDExNSwxMTYsCi0gICAgMzIsOTcsMTA4LDExNSwxMTEsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTksMTE0LDEwMSwKLSAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDkwLDEwLDExNSwxMTYsCi0gICAgOTcsOTksMTA3LDEwOCwxMDEsMTE4LDEwMSwxMDgsMjMzLDIsMCwwLDAsNDEsOSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEzOCwwLDAsMCwyMTgsOSwKLSAgICA5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMjE4LDQsMTE5LDk3LDExNCwxMTAsMjE4LAotICAgIDE4LDY4LDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsODcsOTcsMTE0LDExMCwKLSAgICAxMDUsMTEwLDEwMywxMTQsMTYsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzcsMCwKLSAgICAwLDAsNDEsMiwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTE1LDExMiwxMDEsOTksNTgsCi0gICAgMiwwLDAsMTE1LDIwLDAsMCwwLDAsMyw2LDEsMTgsMywyMSwxLAotICAgIDE4LDEsOSwyLDEzLDEsMTIsMSwxNSwxLDEzLDEsMTE0LDE0NCwwLDAsCi0gICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxNDksMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMDAsMiwwLDExMCw2LDAsCi0gICAgMTI0LDAsMCwxMDYsMCwwLDEyNSwxLDAsMTI0LDAsMCwxMDYsMSwwLDEwMCwKLSAgICAxLDAsMTA3LDgsMCwxMTQsOTUsMCwxMjQsMCwwLDEwNiwyLDAsMTAwLDEsCi0gICAgMCwxMDcsOCwwLDExNCw3MywwLDEwMCwzLDAsMTA2LDMsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsODMsMTAwLDQsMCwxMDYsMywwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICAxMDYsMiwwLDEzMSwyLDAsODMsMTEwLDUwLDAsMTI0LDAsMCwxMDYsNCwwLAotICAgIDExNCwxMjMsMCwxMDAsNSwwLDEwNiwzLDAsMTI0LDEsMCwxMjQsMCwwLDEwNiwKLSAgICAxLDAsMTMxLDIsMCw4MywxMDAsNiwwLDEwNiwzLDAsMTI0LDAsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMiwwLDgzLDEwMCwxLDAsODMsCi0gICAgNDEsNywxMjIsMzgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTQsCi0gICAgMTAxLDExMiwxMTQsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMTQsOTMsMCwwLDAsCi0gICAgMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwKLSAgICAyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsCi0gICAgMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLAotICAgIDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwxOCwKLSAgICA2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsMTI1LAotICAgIDQxLDYyLDQxLDUsMTE0LDE1LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDk5LAotICAgIDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTE3LDAsMCwwLDQxLDIsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTcsMCwwLDAsNzYsMiwwLAotICAgIDAsMTE1LDE2LDAsMCwwLDAsMywzMCwxLDE1LDEsMTUsMSwxMywyLAotICAgIDIyLDIsOSwxLDE5LDIsMTE0LDk3LDAsMCwwLDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCw0LDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwyNTMsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsMTE2LDEsCi0gICAgMCwxMDYsMiwwLDEzMSwwLDAsMSwxMTYsMywwLDEyNCwyLDAsMTMxLDEsCi0gICAgMCwxNDMsMjA4LDAsMSwxMTYsNCwwLDEwNiw1LDAsMTA2LDYsMCwxMjQsMiwKLSAgICAwLDEzMSwxLDAsMTI0LDEsMCwxMDcsOSwwLDExNCw4OSwwLDEwMCwxLDAsCi0gICAgMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsOCwwLDEyNCwKLSAgICAzLDAsMTAwLDIsMCwxMjQsMiwwLDEzMSwxLDEsMTMwLDEsMCwxMjQsMCwKLSAgICAwLDEwNiw5LDAsMTAwLDMsMCwxMDcsOCwwLDExNCwxNjMsMCwxMjQsMCwwLAotICAgIDEwNiwxMCwwLDEwMCwzLDAsMTA3LDgsMCwxMTQsMTQwLDAsMTE2LDgsMCwxMDAsCi0gICAgNCwwLDEwMCwyLDAsMTI0LDAsMCwxMDYsMCwwLDEzMSwxLDEsMTMwLDEsCi0gICAgMCwxMTYsMTEsMCwxMjQsMCwwLDEyNCwxLDAsMTAwLDUsMCwxMDAsNiwwLAotICAgIDEzMSwyLDEsMSwxMjQsMSwwLDgzLDExNiwxMSwwLDEyNCwwLDAsMTI0LDEsCi0gICAgMCwxMDAsNSwwLDEwMCw2LDAsMTMxLDIsMSwxLDExNiwxMiwwLDEyNCwwLAotICAgIDAsMTA2LDksMCwxMDAsNywwLDEzMSwyLDAsMTE1LDIxOSwwLDEyNCwwLDAsCi0gICAgMTA2LDksMCwxMDYsMTMsMCwxMjQsMiwwLDEzMSwxLDAsMSwxMTAsMTYsMCwKLSAgICAxMjQsMCwwLDEwNiw5LDAsMTA2LDE0LDAsMTI0LDEsMCwxMzEsMSwwLDEsCi0gICAgODcsMTAwLDMsMCw4MSw4Miw4OCwxMTYsNCwwLDEwNiw1LDAsMTI0LDIsMCwKLSAgICAyNSw4Myw0MSw4LDEyMiw1MSw2OSwxMjAsMTAxLDk5LDExNywxMTYsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDEwNSwxMTAsMzIsOTcsMTEwLDMyLDEwMSwxMjAsMTA1LAorICAgIDAsMCwxMTUsNTgsMSwwLDAsMTIxLDEwLDEyNCwwLDEwNiwwLDEyNSwzLDg3LAorICAgIDAsMTEwLDIwLDQsMCwxMTYsMSwxMDcsMTAsMTE0LDMwLDEsMCwxLDAsMSwKKyAgICAwLDg5LDAsMTEwLDE0LDg4LDAsMTI0LDMsMTAwLDAsMTA3LDksMTE0LDQ0LDEyNCwKKyAgICAzLDgzLDAsMTI0LDAsMTA2LDIsMTI1LDQsMTI0LDEsMTAwLDAsMTA3LDgsMTE0LAorICAgIDkwLDEyMSwxMCwxMjQsMCwxMDYsMywxMjUsMSw4NywwLDExMCwyMCw0LDAsMTE2LAorICAgIDEsMTA3LDEwLDExNCw4OCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LAorICAgIDAsMTIxLDEwLDEyNCwwLDEwNiw0LDEyNSw1LDg3LDAsMTEwLDI0LDQsMCwxMTYsCisgICAgMSwxMDcsMTAsMTE0LDEyNCwxLDAsMSwwLDEsMCwxMDAsMCwxMjUsNSw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDIsMTAwLDAsMTA3LDgsMTE0LDE4NCwxMjQsNSwxMDAsCisgICAgMCwxMDcsOCwxMTQsMTgwLDEyMSwxMCwxMjQsMSwxMDYsNSwxMjUsMiw4NywwLDExMywKKyAgICAxODQsNCwwLDExNiwxLDEwNywxMCwxMTQsMTc2LDEsMCwxLDAsMSwwLDEwMCwKKyAgICAwLDEyNSwyLDg5LDAsMTEzLDE4NCw4OCwwLDExMCw0LDEyNCw1LDEyNSwyLDEyMSwKKyAgICAxMCwxMjQsMCwxMDYsNiwxMjUsNiw4NywwLDExMCwyNCw0LDAsMTE2LDEsMTA3LAorICAgIDEwLDExNCwyMTgsMSwwLDEsMCwxLDAsMTAwLDAsMTI1LDYsODksMCwxMTAsCisgICAgMiw4OCwwLDEyMSwxNCwxMTYsNywxMjQsMCwxMDYsOCwxMzEsMSwxMjUsNyw4NywKKyAgICAwLDExMCwyNiw0LDAsMTE2LDEsMTA3LDEwLDE0NCwxLDExNCw0LDEsMCwxLAorICAgIDAsMSwwLDEwMCwwLDEyNSw3LDg5LDAsMTEwLDIsODgsMCwxMTYsOSwxMjQsCisgICAgNCwxMjQsMSwxMDAsMSwxMjQsMiwxNDQsMSwxMzEsMiwxMjUsMywxMjQsNSwxMDAsCisgICAgMCwxMDcsOCwxNDQsMSwxMTQsMzYsMTAwLDIsMTEwLDIsMTAwLDMsMTI0LDMsOTUsCisgICAgMTAsMTI0LDYsMTI0LDMsOTUsMTEsMTI0LDcsMTI0LDMsOTUsMTIsMTI0LDMsODMsCisgICAgMCw0MSw0LDc4LDExNCwxMDMsMCwwLDAsNzAsODQsNDEsMTMsMTE0LDg5LDAsCisgICAgMCwwLDExNCw5MCwwLDAsMCwxMTQsMSwwLDAsMCwxMTQsODUsMCwwLAorICAgIDAsMTE0LDkyLDAsMCwwLDkwLDcsOTUsNzksODIsNzMsNzEsNzMsNzgsMjE4LAorICAgIDEwLDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LDk1LDIxOCw0LDEwOCwxMDUsMTE1LAorICAgIDExNiwyMTgsOCw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSwxMTQsMTAyLDAsMCwwLAorICAgIDExNCwxMDcsMCwwLDAsMTE0LDExMiwwLDAsMCwxMTQsMTA2LDAsMCwwLDQxLAorICAgIDgsMTE0LDgzLDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTAzLDAsMCwwLAorICAgIDExNCw4MiwwLDAsMCwxMTQsMTUsMCwwLDAsOTAsOCwxMDgsMTExLDk5LDk3LAorICAgIDExNiwxMDUsMTExLDExMCwxMTQsMTEyLDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LDk1LAorICAgIDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxOTIsMSwwLDAsMTE1LDcyLDAsMCwwLDAsMiwyLDEsMTAsMSwxNCwKKyAgICAxLDYsMiw4LDEsNCwyLDYsMSw4LDEsMiwxLDEwLDEsMTQsCisgICAgMiw2LDEsMiwxLDEwLDEsMTQsMSwxMCwxLDgsMSw4LDEsMiwKKyAgICAxLDEwLDEsMTQsMSwxMiwyLDQsMSwyLDEsMTAsMSwxNCwxLDEwLAorICAgIDEsMiwxLDE0LDEsMTYsMSwxMCwyLDE2LDEsMjAsMSw2LDEsNiwKKyAgICAxLDExNCwxMjgsMCwwLDAsNzAsNDEsMSwyMTgsOCwxMTEsMTE4LDEwMSwxMTQsMTE0LAorICAgIDEwNSwxMDAsMTAxLDk5LDIsMCwwLDAsMSwwLDAsMCw1LDAsMCwwLAorICAgIDU5LDAsMCwwLDY3LDAsMCwwLDExNSwyMTIsMSwwLDAsMTI0LDIsMTE1LAorICAgIDIwLDExNiwwLDEyNCwxLDEwMCwxLDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDExNCwKKyAgICA1NCwxMjEsMTIsMTI0LDAsMTA2LDEsMTI0LDEsOTUsMiw4NywwLDExMCwyMCw0LAorICAgIDAsMTE2LDMsMTA3LDEwLDExNCw1MiwxLDAsMSwwLDEsMCw4OSwwLDExMCwKKyAgICAyLDg4LDAsMTI0LDIsMTE1LDc0LDExNiwwLDEyNCwxLDEwMCwyLDEwMCwwLDEzMSwKKyAgICAzLDEwMCwwLDEwNyw4LDExNCwxNjYsMTI0LDAsMTA2LDQsMTI1LDMsMTI0LDMsMTAwLAorICAgIDAsMTA3LDgsMTE0LDEzNCwxMjQsMCwxMDYsNSwxMDAsMCwxMDcsOSwxMTQsMTM0LDExNiwKKyAgICA2LDEwMCwwLDEwNyw4LDExNCwxMTAsMTE2LDcsMTMwLDEsMTE2LDYsMTA2LDgsMTI1LAorICAgIDQsMTI0LDQsMTA2LDksMTI0LDQsMTMxLDEsMTI1LDMsMTI0LDAsMTA2LDUsMTI0LAorICAgIDMsOTUsMTAsMTIxLDEwLDEyNCwzLDEyNCwxLDk1LDExLDg3LDAsMTEwLDIwLDQsCisgICAgMCwxMTYsMywxMDcsMTAsMTE0LDE2NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwKKyAgICAyLDg4LDAsMTI0LDIsMTE1LDE4NiwxMTYsMCwxMjQsMSwxMDAsMywxMDAsMCwxMzEsCisgICAgMywxMDAsMCwxMDcsOCwxMTQsMjIwLDEyMSwxMiwxMjQsMCwxMDYsMTIsMTI0LDEsOTUsCisgICAgMTMsODcsMCwxMTAsMjAsNCwwLDExNiwzLDEwNywxMCwxMTQsMjE4LDEsMCwxLAorICAgIDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjEsMTAsMTI0LDAsMTI0LDEsOTUsCisgICAgMTQsODcsMCwxMTAsMjAsNCwwLDExNiwzLDEwNywxMCwxMTQsMjUwLDEsMCwxLAorICAgIDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMiwxNDQsMSwxMTUsMjAsMTE2LAorICAgIDAsMTI0LDEsMTAwLDQsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTQ0LDEsMTE0LAorICAgIDY4LDEyNCwwLDEwNiw1LDEwMCwwLDEwNyw5LDE0NCwxLDExNCw2OCwxMjEsMTIsMTI0LAorICAgIDAsMTA2LDUsMTI0LDEsOTUsMTUsODcsMCwxMTAsMjIsNCwwLDExNiwzLDEwNywKKyAgICAxMCwxNDQsMSwxMTQsNjYsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwKKyAgICAwLDEyNCwwLDEwNiwxNiwxNDQsMSwxMTQsMjA4LDEyNCwyLDE0NCwxLDExNSwxMDAsMTE2LAorICAgIDAsMTI0LDEsMTAwLDUsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTQ0LDEsMTE0LAorICAgIDEzNiwxMjEsMTIsMTI0LDAsMTA2LDE3LDEyNCwxLDk1LDE4LDg3LDAsMTEwLDIyLDQsCisgICAgMCwxMTYsMywxMDcsMTAsMTQ0LDEsMTE0LDEzNCwxLDAsMSwwLDEsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDIsMTQ0LDEsMTE1LDE2MCwxMTYsMCwxMjQsMSwxMDAsCisgICAgNiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxNDQsMSwxMTQsMjA4LDEyNCwwLDEwNiwKKyAgICAxOSwxMDAsMCwxMDcsOSwxNDQsMSwxMTQsMjA4LDEyMSwxMiwxMjQsMCwxMDYsMTksMTI0LAorICAgIDEsOTUsMjAsODcsMCwxMTAsMjIsNCwwLDExNiwzLDEwNywxMCwxNDQsMSwxMTQsCisgICAgMjA2LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMSw4MywKKyAgICAwLDQxLDcsNzgsMTE0LDEsMCwwLDAsMTE0LDg1LDAsMCwwLDIxOCwxMSwKKyAgICA5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMTE0LDEyNywwLDAsMCwKKyAgICAxMTQsOTIsMCwwLDAsMTE0LDEyNSwwLDAsMCw0MSwyMSwxMTQsNiwwLDAsCisgICAgMCwxMTQsMTUsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDkwLDAsMCwwLAorICAgIDExNCw5MywwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LAorICAgIDExNiwwLDAsMCwyMTgsMTYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMjE4LDcsOTUsOTUsMTEwLDEwMSwxMTksOTUsOTUsOTAsCisgICAgNSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsODUsMCwwLDAsMTE0LDExOSwwLDAsMCwKKyAgICAxMTQsMTMwLDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwKKyAgICAxMTMsMCwwLDAsMTE0LDEwMywwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDExMiwKKyAgICAwLDAsMCwxMTQsMTI1LDAsMCwwLDQxLDUsMTE0LDgyLDAsMCwwLDExNCwKKyAgICA4MywwLDAsMCwxMTQsMTI5LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTMxLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDIxOCwxOCw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTUsOTcsMTE2LDExNiwxMTQsMTE1LDIzNywxLDAsMCwxMTUsOTIsMCwwLDAsMCwKKyAgICA0LDIwLDEsMiwxLDEyLDEsMTQsMSw2LDIsMjAsMSw2LDEsOCwKKyAgICAyLDEwLDEsOCwxLDQsMSw2LDIsMTAsMSw4LDEsMiwxLDEwLAorICAgIDEsMTQsMSw2LDIsMjAsMSwyLDEsMTIsMSwxNCwxLDYsMiwyLAorICAgIDEsMTAsMSwxNCwxLDYsMiwyNCwxLDEyLDEsMiwxLDEyLDEsMTYsCisgICAgMSw2LDIsOCwxLDI0LDEsMiwxLDEyLDEsMTYsMSw2LDIsMjQsCisgICAgMSwxMiwxLDIsMSwxMiwxLDE2LDEsNiwxLDExNCwxMzMsMCwwLDAsCisgICAgOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNSwwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsOTIsMCwwLDAsMTAwLDEsMTI1LDEsMTE2LDAsCisgICAgMTI0LDAsMTA2LDEsMTAwLDIsMTMxLDIsMTE0LDMwLDEyNCwwLDEwNiwxLDEwNiwyLAorICAgIDEyNCwwLDEzMSwxLDEyNSwxLDExMCwzMCwxMTYsMCwxMjQsMCwxMDYsMSwxMDAsMywKKyAgICAxMzEsMiwxMTQsNjAsMTE2LDMsMTA2LDQsMTAwLDQsMTE2LDUsMTAwLDUsMTAwLDYsCisgICAgMTQ0LDEsMTMxLDIsMSwwLDEyNCwxLDEwMCwxLDEwNyw4LDExNCw3OCwxMTYsNiwKKyAgICAxMjQsMCwxMDYsNywxMzEsMSwxMjUsMSwxMTYsOCwxMjQsMCwxMjQsMSwxMzEsMiwKKyAgICAxLDAsMTI0LDEsODMsMCw0MSw3LDEyMiw0Myw2NywxMTQsMTAxLDk3LDExNiwxMDEsCisgICAgMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsCisgICAgMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE0LDExMSwxMTgsMTA1LDEwMCwxMDEsMTAwLDMyLAorICAgIDExNSwxMTIsMTAxLDk5LDQ2LDc4LDIxOCwxMyw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDEyMiw4NywxMTUsMTE2LDk3LDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTA1LDExMCwzMiwKKyAgICA4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDUxLDQ2LDU0LDQ0LDMyLDEwOCwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsMTE1LDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTAxLDEyMCwxMDEsCisgICAgOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLAorICAgIDk3LDEwOCwxMTUsMTExLDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDMyLDk5LDExNCwxMDEsOTcsCisgICAgMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwyMTgsMTAsMTE1LDExNiw5NywKKyAgICA5OSwxMDcsMTA4LDEwMSwxMTgsMTAxLDEwOCwyMzMsMiwwLDAsMCw0MSw5LDExNCw0LAorICAgIDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTM0LDAsMCwwLDIxOCw5LDk1LAorICAgIDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwyMTgsNCwxMTksOTcsMTE0LDExMCwyMTgsMTgsCisgICAgNjgsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDUsMTExLDExMCw4Nyw5NywxMTQsMTEwLDEwNSwKKyAgICAxMTAsMTAzLDExNCwxNiwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEzMywwLDAsCisgICAgMCw0MSwyLDExNCw4MiwwLDAsMCwxMTQsODMsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTEyLDEwMSw5OSw0MSwyLAorICAgIDAsMCwxMTUsMjAsMCwwLDAsMCwzLDQsMSwxMiwzLDE0LDEsMTIsCisgICAgMSw2LDIsMTIsMSw4LDEsMTAsMSwxMCwxLDExNCwxNDEsMCwwLDAsCisgICAgOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTEwLDAsMCwwLDEyNCwwLDEwNiwwLDEwMCwxLAorICAgIDEwNyw4LDExNCwxNCwxMDAsMiwxMTAsNCwxMjQsMCwxMDYsMCwxMjUsMSwxMjQsMCwKKyAgICAxMDYsMSwxMDAsMSwxMDcsOCwxMTQsNjgsMTI0LDAsMTA2LDIsMTAwLDEsMTA3LDgsCisgICAgMTE0LDUyLDEwMCwzLDEwNiwzLDEyNCwxLDEzMSwxLDgzLDAsMTEzLDEwNiwxMDAsNCwKKyAgICAxMDYsMywxMjQsMSwxMjQsMCwxMDYsMiwxMzEsMiw4MywwLDExMCwzOCwxMjQsMCwKKyAgICAxMDYsNCwxMTQsOTAsMTAwLDUsMTA2LDMsMTI0LDEsMTI0LDAsMTA2LDEsMTMxLDIsCisgICAgODMsMCwxMTAsMTYsMTAwLDYsMTA2LDMsMTI0LDAsMTA2LDAsMTI0LDAsMTA2LDEsCisgICAgMTMxLDIsODMsMCwxMDAsMSw4MywwLDQxLDcsMTIyLDM4LDgyLDEwMSwxMTYsMTE3LAorICAgIDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLDExNiwxMTEsMzIsMTE3LAorICAgIDExNSwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsNDYsNzgsMTE0LDg3LDAsMCwwLDEyMiwxMyw2MCwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw2MiwxMjIsMjAsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTIzLDMzLDExNCwxMjUsNDEsNjIsMTIyLDIzLDYwLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwMiwxMTQsMTExLDEwOSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw2MiwxMjIsMTgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMzIsNDAsMTIzLDEyNSw0MSw2Miw0MSw1LDExNCwxNSwwLDAsCisgICAgMCwxMTQsMTAzLDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMzgsMCwwLDAsCisgICAgMTE0LDExMywwLDAsMCw0MSwyLDExNCw4MiwwLDAsMCwxMTQsMTUsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDkxLDAsMCwwLDU5LDIsMCwwLDExNSwxNiwwLDAsMCwwLDMsCisgICAgMjAsMSwxMCwxLDEwLDEsMTIsMiwxNiwyLDYsMSwxNiwyLDExNCw5MSwKKyAgICAwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwKKyAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsMTk0LDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDEyNSwyLDExNiwxLDEwNiwyLDEzMSwwLDEsMCwxMTYsMywxMjQsMiwxMzEsCisgICAgMSwxNDMsMTU2LDEsMCwxMTYsNCwxMDYsNSwxMDYsNiwxMjQsMiwxMzEsMSwxMjQsCisgICAgMSwxMDcsOSwxMTQsNjQsMTAwLDEsMTA2LDcsMTI0LDIsMTMxLDEsMTI1LDMsMTE2LAorICAgIDgsMTI0LDMsMTAwLDIsMTI0LDIsMTQ0LDEsMTMxLDEsMTMwLDEsMTI0LDAsMTA2LAorICAgIDksMTAwLDMsMTA3LDgsMTE0LDEyMCwxMjQsMCwxMDYsMTAsMTAwLDMsMTA3LDgsMTE0LAorICAgIDEwMCwxMTYsOCwxMDAsNCwxMDAsMiwxMjQsMCwxMDYsMCwxNDQsMSwxMzEsMSwxMzAsCisgICAgMSwxMTYsMTEsMTI0LDAsMTI0LDEsMTAwLDUsMTAwLDYsMTQ0LDEsMTMxLDIsMSwKKyAgICAwLDEyNCwxLDgzLDAsMTE2LDExLDEyNCwwLDEyNCwxLDEwMCw1LDEwMCw2LDE0NCwKKyAgICAxLDEzMSwyLDEsMCwxMTYsMTIsMTI0LDAsMTA2LDksMTAwLDcsMTMxLDIsMTE1LAorICAgIDE2MiwxMjQsMCwxMDYsOSwxMDYsMTMsMTI0LDIsMTMxLDEsMSwwLDExMCwxMiwxMjQsCisgICAgMCwxMDYsOSwxMDYsMTQsMTI0LDEsMTMxLDEsMSwwLDg3LDAsMTAwLDMsODEsCisgICAgMCw4MiwwLDg4LDAsMTE2LDQsMTA2LDUsMTI0LDIsMjUsMCw4MywwLDQxLAorICAgIDgsMTIyLDcwLDY5LDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAorICAgIDExMiwxMDEsOTksMzksMTE1LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwzMiw5NywxMTAsMzIsMTAxLDEyMCwxMDUsCiAgICAgMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEwLAogICAgIDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTIyLDMwLDEwOSwxMTEsMTAwLDExNywxMDgsCiAgICAgMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwKICAgICAxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDExNCwxNSwwLDAsMCw3OCwxMjIsCiAgICAgMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LAotICAgIDEzMywwLDAsMCw4NCwxMTQsMTM5LDAsMCwwLDQxLDE1LDExNCwxNSwwLDAsCi0gICAgMCwxMTQsNTcsMCwwLDAsMjE4LDEyLDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsOTUsCi0gICAgMTA4LDExMSw5OSwxMDcsMTE0LDU0LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsCi0gICAgMCwwLDAsMTE0LDQyLDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsNzcsMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDEzNywwLDAsCisgICAgMTI5LDAsMCwwLDg0LDExNCwxMzUsMCwwLDAsNDEsMTUsMTE0LDE1LDAsMCwKKyAgICAwLDExNCw0NiwwLDAsMCwyMTgsMTIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSw5NSwKKyAgICAxMDgsMTExLDk5LDEwNywxMTQsNDIsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw3OSwKKyAgICAwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCw3MCwwLAorICAgIDAsMCwxMTQsOTMsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMTMzLDAsMCwKICAgICAwLDExNCw0LDAsMCwwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwxMTQsMTM5LDAsMCwwLDQxLDQsMTE0LDg4LDAsMCwwLDExNCwKLSAgICA4OSwwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LDMsMTA5LDExNSwxMDMsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg2LDAsCi0gICAgMCwwLDkzLDIsMCwwLDExNSwzMiwwLDAsMCwwLDIsOSwxLDEwLAotICAgIDEsMTMsMSwyNCwxLDE1LDEsMTgsMSwxNSwxLDE1LDEsMjEsMiwxOSwKLSAgICAxLDQsMSwxOSwxLDE4LDQsMTksMiwyMywxLDExNCw4NiwwLDAsMCwKKyAgICAxMTcsMTA4LDEwMSwxMTQsMTM1LDAsMCwwLDQxLDQsMTE0LDgyLDAsMCwwLDExNCwKKyAgICA4MywwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LDMsMTA5LDExNSwxMDMsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDgwLDAsCisgICAgMCwwLDc2LDIsMCwwLDExNSwzMiwwLDAsMCwwLDIsNiwxLDgsCisgICAgMSwxMCwxLDE2LDEsMTAsMSwxNCwxLDEwLDEsMTAsMSwxNiwyLDE2LAorICAgIDEsNCwxLDE2LDEsMTIsNCwxNCwyLDIyLDEsMTE0LDgwLDAsMCwwLAogICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDI3LDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwzLDEsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMDYsMSwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDEsMTE2LDMsMCwKLSAgICAxMDYsNCwwLDEyNCwwLDAsMTA2LDIsMCwyNSwxMjUsMSwwLDExNiw1LDAsCi0gICAgMTI0LDEsMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDk2LDAsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLAotICAgIDAsOTUsNiwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsCi0gICAgOTUsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDExNiw1LDAsMTI0LDEsMCwKLSAgICAxMDAsMiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LAotICAgIDE5NywwLDEyMSw1NiwwLDEyNCwxLDAsMTA2LDgsMCwxMjQsMSwwLDk1LDksCi0gICAgMCwxMTYsMTAsMCwxMjQsMSwwLDEwMCwzLDAsMTMxLDIsMCwxMTUsMTc1LDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDEwNiwxMSwwLDEwMCw0LDAsMTMxLDEsMCwxMDAsCi0gICAgNSwwLDI1LDEyNCwxLDAsOTUsOSwwLDg3LDExMCwxOCwwLDQsMTE2LDcsCi0gICAgMCwxMDcsMTAsMCwxMTQsMTk2LDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMTYsCi0gICAgNSwwLDEyNCwxLDAsMTAwLDYsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsCi0gICAgMCwxMDcsOCwwLDExNCwyNTUsMCwxMjEsMTMsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgOTUsMTIsMCw4NywxMTAsMTgsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LDI1NCwKLSAgICAwLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDEsMCw4Myw0MSw3LDc4LAotICAgIDExNCw5MSwwLDAsMCwxMTQsMTM0LDAsMCwwLDExNCwxMzEsMCwwLDAsMTE0LAotICAgIDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsMTE0LDk1LDAsMCwwLDQxLDEzLAotICAgIDExNCw5OSwwLDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsCi0gICAgMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCw2LDAsMCwwLDExNCw5MSwKLSAgICAwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDEzNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCw5NSwwLDAsCi0gICAgMCw0MSwyLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDEwOCwKLSAgICAxMTEsOTcsMTAwLDk1LDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCw5NSw5OSwxMTEsMTA5LAotICAgIDExMiw5NywxMTYsMTA1LDk4LDEwOCwxMDEsMTE4LDIsMCwwLDExNSw0MCwwLDAsMCwKLSAgICAwLDQsMTksMiwxNiwxLDI0LDEsMywxLDE2LDEsMTMsMSw1LDEsCi0gICAgMjQsMSwzLDQsMTIsMSwxNSwxLDI5LDEsMTMsMSw1LDEsMjQsMSwKLSAgICAzLDEsMTMsMSwxMywxLDUsMSwxMTQsMTQ4LDAsMCwwLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNTksMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwwLDAsCi0gICAgMTA3LDksMCwxMTQsNDMsMCwxMTYsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsCi0gICAgMSwwLDEzMSwyLDAsMTE1LDQzLDAsMTE2LDIsMCwxMjQsMCwwLDEzMSwxLAotICAgIDAsODMsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCwxMTYsNCwKLSAgICAwLDEyNCwxLDAsMTMxLDEsMCwxNDMsNzUsMCwxLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDEyMiwwLDEyNCwwLDAsMTA2LDUsMCwKLSAgICAxMDAsMCwwLDEwNyw4LDAsMTE0LDEzOCwwLDExNiw2LDAsMTAwLDIsMCwxMDAsCi0gICAgMywwLDEyNCwwLDAsMTA2LDcsMCwxMzEsMSwxLDEzMCwxLDAsMTEwLDE2LAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEwNiw4LDAsMTI0LDEsMCwxMzEsMSwwLAotICAgIDEsODcsMTAwLDAsMCw4MSw4Miw4OCwxMTYsOSwwLDEwNiwxMCwwLDEyNCwwLAotICAgIDAsMTA2LDcsMCwyNSw4Myw0MSw0LDc4LDExNCwxMzksMCwwLDAsMTIyLDE0LAotICAgIDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwxNSwKLSAgICAwLDAsMCw0MSwxMSwxMTQsOTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDE0OCwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzksMCwKLSAgICAwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCw0MSwyLDExNCw4OCwKLSAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywKLSAgICAxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNDcsMiwwLDAsMTE1LDIwLDAsMCwwLAotICAgIDAsMiwxNSwyLDE4LDEsMTAsMiwxMiwxLDEzLDEsMTUsMSwxNSwxLAotICAgIDI0LDMsMjMsNSwxMTQsMTQ5LDAsMCwwLDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTE2LDIsMCwKLSAgICAxMjQsMCwwLDEwNiwzLDAsMTMxLDEsMCwxNDMsMTUsMCwxLDExNiw0LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDgzLDg3LDEwMCwxLDAsODEsODIsODgsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiwxOTEsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMTAsCi0gICAgMTAxLDExOSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsCi0gICAgNDQsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwMCwxMDAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNSwKLSAgICAxMTYsMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgNzMsMTAyLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsCi0gICAgMTA4LDExNCwxMDEsOTcsMTAwLDEyMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDEsMTIwLDEwNSwxMTUsCi0gICAgMTE2LDEwNSwxMTAsMTAzLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMywxMDEsMTE2LDExNSwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwxMDgsMTExLDk4LDk4LDEwMSwxMTQsMTAxLDEwMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsCi0gICAgMCwwLDExNCw1NCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE0OSwwLDAsCi0gICAgMCw0MSwxLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwxMTQsODcsMCwwLDAsMTcwLDIsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsOSwxMCwxLDE2LDEsMTE0LDg3LDAsMCwwLAotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwNSwwLDAsMCwxMDEsMCwwLDkwLDEsMCwKLSAgICAxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDEsNCwwLDEwMCwKLSAgICAyLDAsMTAwLDMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMSw2LAotICAgIDAsMTAwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMiwwLAotICAgIDEzMSwxLDAsOTAsNywwLDEwMSw2LDAsMTAwLDQsMCwxMDAsNywwLDEwMCwKLSAgICA4LDAsMTMyLDEsMCwxMzEsMSwwLDkwLDgsMCwxMDEsNiwwLDEwMCw5LAotICAgIDAsMTAwLDEwLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDksMCwxMDEsNiwwLAotICAgIDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSwKLSAgICA2LDAsMTAxLDExLDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDAsMCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsOTAsMTIsMCwxMDEsNiwwLDEwMSwxMSwwLDEwMCwxNSwwLAotICAgIDEwMCwxNiwwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDEzLDAsMTAxLAotICAgIDYsMCwxMDEsMTEsMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCw5MCwxNCwwLDEwMSw2LDAsMTAxLDE1LDAsMTMxLDEsMCwKLSAgICA5MCwxNiwwLDEwMCw0LDAsODMsNDEsMTksMjE4LDE1LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsOTcsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LAotICAgIDExMSwxMDAsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksCi0gICAgMTA4LDk3LDExNSwxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LAotICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLAotICAgIDEwNSwxMTAsMTE1LDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwKLSAgICAxLDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwKLSAgICAzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLAotICAgIDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLAotICAgIDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLAotICAgIDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDI0LDYwLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDk4LDExNywxMDUsCi0gICAgMTA4LDExNiw0NSwxMDUsMTEwLDQxLDYyLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwxLAotICAgIDAsMCwwLDQxLDEsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw5MiwwLDAsMCwxOTUsMiwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNyw2NiwxMTcsMTA1LDEwOCwxMTYsCi0gICAgMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDc4LDk5LDQsMCwwLDAsMCwwLDAsMCwKLSAgICA0LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDU4LDAsMCwKLSAgICAwLDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxNiwwLDEwMCwwLDAsCi0gICAgODMsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTQsNTAsMCwKLSAgICAxMTYsMiwwLDEyNCwxLDAsMTI0LDAsMCwxMDAsMSwwLDEwMCwyLDAsMTMxLAotICAgIDIsMSw4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMyw3OCwxMTQsMTA3LAotICAgIDAsMCwwLDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDQxLDMsMTE0LAotICAgIDU3LDAsMCwwLDkwLDEwLDEwNSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCi0gICAgMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDMsOTksMTA4LDExNSwxMTQsNzgsMCwwLAotICAgIDAsMjE4LDQsMTEyLDk3LDExNiwxMDQsMjE4LDYsMTE2LDk3LDExNCwxMDMsMTAxLDExNiwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOSwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMjA0LDIsMCwwLDExNSwxMCwwLAotICAgIDAsMCwwLDIsMTIsMSw0LDEsMTUsMSwxOSwyLDEyMiwyNSw2NiwxMTcsCi0gICAgMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLDAsMCwKLSAgICA0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDQxLDAsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwKLSAgICAxMjUsMywwLDEyNCwzLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwzNywwLDEyNCwKLSAgICAzLDAsMTA2LDEsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDE3NSw3MCwxMDUsCi0gICAgMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwKKyAgICAwLDY3LDAsMCwwLDExNSwyMDYsMCwwLDAsMTI0LDAsMTA2LDAsMTA2LDEsCisgICAgMTI0LDAsMTA2LDIsMTMxLDEsMSwwLDExNiwzLDEwNiw0LDEyNCwwLDEwNiwyLAorICAgIDI1LDAsMTI1LDEsMTE2LDUsMTI0LDEsMTAwLDEsMTAwLDAsMTMxLDMsMTAwLDAsCisgICAgMTA3LDgsMTE0LDc2LDEyMSwxMiwxMjQsMCwxMDYsMCwxMjQsMSw5NSw2LDg3LDAsCisgICAgMTEwLDIwLDQsMCwxMTYsNywxMDcsMTAsMTE0LDc0LDEsMCwxLDAsMSwwLAorICAgIDg5LDAsMTEwLDIsODgsMCwxMTYsNSwxMjQsMSwxMDAsMiwxMDAsMCwxMzEsMywKKyAgICAxMDAsMCwxMDcsOCwxMTQsMTU0LDEyMSw0MCwxMjQsMSwxMDYsOCwxMjQsMSw5NSw5LAorICAgIDExNiwxMCwxMjQsMSwxMDAsMywxMzEsMiwxMTUsMTMwLDEyNCwwLDEwNiwyLDEwNiwxMSwKKyAgICAxMDAsNCwxMzEsMSwxMDAsNSwyNSwwLDEyNCwxLDk1LDksODcsMCwxMTAsMjAsCisgICAgNCwwLDExNiw3LDEwNywxMCwxMTQsMTUyLDEsMCwxLDAsMSwwLDg5LDAsCisgICAgMTEwLDIsODgsMCwxMTYsNSwxMjQsMSwxMDAsNiwxMDAsMCwxMzEsMywxMDAsMCwKKyAgICAxMDcsOCwxMTQsMjAyLDEyMSwxMCwxMjQsMCwxMjQsMSw5NSwxMiw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDcsMTA3LDEwLDExNCwyMDAsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsMiw4OCwwLDEyNCwxLDgzLDAsNDEsNyw3OCwxMTQsODUsMCwwLDAsCisgICAgMTE0LDEzMCwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LAorICAgIDE5LDAsMCwwLDExNCw4OSwwLDAsMCw0MSwxMywxMTQsOTMsMCwwLDAsCisgICAgMTE0LDE0MywwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwKKyAgICA3OSwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsODUsMCwwLDAsMTE0LDkwLAorICAgIDAsMCwwLDExNCwxLDAsMCwwLDExNCwxMzAsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDExOCwwLDAsMCwxMTQsODksMCwwLDAsNDEsMiwxMTQsODIsCisgICAgMCwwLDAsMTE0LDgzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMDgsMTExLDk3LDEwMCw5NSw5OCwKKyAgICA5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsOTUsOTksMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwKKyAgICAxMDgsMTAxLDEwMSwyLDAsMCwxMTUsNDAsMCwwLDAsMCw0LDE0LDIsMTIsCisgICAgMSwxNiwxLDIsMSwxMiwxLDE0LDEsNiwxLDE2LDEsMiw0LDgsCisgICAgMSwxMCwxLDIyLDEsMTQsMSw2LDEsMTYsMSwyLDEsMTAsMSwxNCwKKyAgICAxLDYsMSwxMTQsMTQ1LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSwxMjAsMCwKKyAgICAwLDAsMTI0LDAsMTA2LDAsMTAwLDAsMTA3LDksMTE0LDMwLDExNiwxLDEyNCwwLAorICAgIDEwNiwwLDEwMCwxLDEzMSwyLDExNSwzMCwxMTYsMiwxMjQsMCwxMzEsMSw4MywwLAorICAgIDExNiwzLDEyNCwwLDEzMSwxLDEyNSwxLDExNiw0LDEyNCwxLDEzMSwxLDE0Myw1NiwKKyAgICAxLDAsMTI0LDAsMTA2LDAsMTAwLDAsMTA3LDgsMTE0LDg2LDEyNCwwLDEwNiw1LAorICAgIDEwMCwwLDEwNyw4LDExNCw5OCwxMTYsNiwxMDAsMiwxMDAsMywxMjQsMCwxMDYsNywKKyAgICAxNDQsMSwxMzEsMSwxMzAsMSwxMTAsMTIsMTI0LDAsMTA2LDAsMTA2LDgsMTI0LDEsCisgICAgMTMxLDEsMSwwLDg3LDAsMTAwLDAsODEsMCw4MiwwLDg4LDAsMTE2LDksCisgICAgMTA2LDEwLDEyNCwwLDEwNiw3LDI1LDAsODMsMCw0MSw0LDc4LDExNCwxMzUsMCwKKyAgICAwLDAsMTIyLDE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDExNCwxNSwwLDAsMCw0MSwxMSwxMTQsOTMsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTQxLDAsMCwwLDExNCw5NiwwLAorICAgIDAsMCwxMTQsMTA2LDAsMCwwLDExNCw3MCwwLDAsMCwxMTQsMTUsMCwwLAorICAgIDAsMTE0LDEzNSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDc5LDAsMCwwLAorICAgIDQxLDIsMTE0LDgyLDAsMCwwLDExNCw4MywwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTQsOTUsMTA4LDExMSwKKyAgICA5NywxMDAsOTUsMTE3LDExMCwxMDgsMTExLDk5LDEwNywxMDEsMTAwLDEzMCwyLDAsMCwxMTUsCisgICAgMjAsMCwwLDAsMCwyLDEwLDIsMTIsMSw4LDIsOCwxLDEwLDEsCisgICAgMTAsMSwxMCwxLDE4LDMsMjIsNSwxMTQsMTQ2LDAsMCwwLDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDksMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDM4LDAsMCwwLDExNiwwLDEwNiwxLDEzMSwwLDEsMCwxMTYsCisgICAgMiwxMjQsMCwxMDYsMywxMzEsMSwxNDMsMTAsMSwwLDExNiw0LDEyNCwwLDEzMSwKKyAgICAxLDgzLDAsODEsMCw4MiwwLDg4LDAsMTAwLDEsODMsMCw0MSwyLDEyMiwKKyAgICAxOTEsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMTAsMTAxLDExOSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsNDQsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzksCisgICAgMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsCisgICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LAorICAgIDMyLDk3LDEwMCwxMDAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMTA4LDExNCwxMDEsOTcsMTAwLAorICAgIDEyMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwKKyAgICA0NCwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDEwNSwxMTAsMTAzLDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMywxMDEsMTE2LDExNSwxMCwzMiwzMiwzMiwzMiwKKyAgICA5OSwxMDgsMTExLDk4LDk4LDEwMSwxMTQsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICA3OCw0MSw1LDExNCw0NiwwLDAsMCwxMTQsMTQyLDAsMCwwLDExNCw0MiwwLAorICAgIDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE0NiwwLDAsMCw0MSwxLDExNCw4MiwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsODEsMCwwLDAsMTUzLDIsMCwwLDExNSw2LDAsMCwwLAorICAgIDAsOSw4LDEsMTIsMSwxMTQsODEsMCwwLDAsOTksMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw2NCwwLDAsMCwKKyAgICAxMTUsMTM2LDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwKKyAgICAzLDEwMSw0LDEwMCwyLDEwMCwzLDEzMiwwLDEzMSwxLDkwLDUsMTAxLDYsMTAwLAorICAgIDE5LDEwMCw1LDEwMCw2LDEzMiwxLDEzMSwxLDkwLDcsMTAxLDYsMTAwLDIwLDEwMCwKKyAgICA3LDEwMCw4LDEzMiwxLDEzMSwxLDkwLDgsMTAxLDYsMTAwLDksMTAwLDEwLDEzMiwKKyAgICAwLDEzMSwxLDkwLDksMTAxLDYsMTAwLDExLDEwMCwxMiwxMzIsMCwxMzEsMSw5MCwKKyAgICAxMCwxMDEsNiwxMDEsMTEsMTAwLDEzLDEwMCwxNCwxMzIsMCwxMzEsMSwxMzEsMSw5MCwKKyAgICAxMiwxMDEsNiwxMDEsMTEsMTAwLDE1LDEwMCwxNiwxMzIsMCwxMzEsMSwxMzEsMSw5MCwKKyAgICAxMywxMDEsNiwxMDEsMTEsMTAwLDE3LDEwMCwxOCwxMzIsMCwxMzEsMSwxMzEsMSw5MCwKKyAgICAxNCwxMDEsNiwxMDEsMTUsMTMxLDEsOTAsMTYsMTAwLDQsODMsMCw0MSwyMSwyMTgsCisgICAgMTUsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LAorICAgIDEyMiwxNDQsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwzMiwxMDIsMTExLDExNCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LAorICAgIDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LAorICAgIDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsCisgICAgOTcsMTE2LDEwNSw5OSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiwKKyAgICA5NywxMTgsMTExLDEwNSwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwKKyAgICAxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwKKyAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsCisgICAgMTI0LDAsMTA2LDEsMTMxLDEsODMsMCw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsCiAgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwKLSAgICAxMDEsMTE0LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsCi0gICAgMTA4LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAotICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxNTQsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsCi0gICAgMCwxMTQsNzgsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsODgsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTMsMiwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCw5LDE4LDEsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNjcsMCwwLDAsCi0gICAgMTI0LDEsMCwxMDYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMDcsNywwLDExNCwKLSAgICA1MSwwLDExNiwzLDAsMTAwLDEsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDAsCi0gICAgMCwxMzEsMSwwLDEwMCwyLDAsMTI0LDEsMCwxMDYsMCwwLDEzMSwxLDEsCi0gICAgMTMwLDEsMCwxMTYsNSwwLDExNiw2LDAsMTA2LDcsMCwxMjQsMSwwLDEzMSwKLSAgICAyLDAsODMsNDEsMywxMjIsMjQsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLAotICAgIDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyMiwKLSAgICAyOSwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwKLSAgICAwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LAotICAgIDc2LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDY1LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCi0gICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMjI1LDIsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMywxOCwxLDIxLDEsMTIsMSwxMjIsMjksNjYsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLAotICAgIDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDIyLDY5LDEyMCwxMDEsOTksMzIsOTcsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzgsNDEsMywxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDEyLDEwMSwKLSAgICAxMjAsMTAxLDk5LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQxLDIsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDIzMywyLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDMsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsCi0gICAgODMsNDEsMiwxMjIsNTcsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICAzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsCi0gICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwyMzgsMiwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNCw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDU2LAotICAgIDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKLSAgICAxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMjQ0LDIsMCwwLDExNSwyLDAsMCwwLDAsNCwKLSAgICAxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUyLDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsOTcsMTE1LDMyLDk4LDExNywKLSAgICAxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywKLSAgICAxMTQsMTAxLDMyLDExMCwxMDEsMTE4LDEwMSwxMTQsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAotICAgIDExNSw0Niw3MCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKLSAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDI1MCwyLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDQsMTIyLDI2LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKLSAgICAxNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwyMTgsMTIsMTE1LDExNiw5NywxMTYsMTA1LDk5LDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDExNCw5MiwwLDAsMCwyMTgsMTEsOTksMTA4LDk3LDExNSwxMTUsMTA5LAotICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDE1NCwwLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwKLSAgICAxMzgsMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDE1NiwKLSAgICAwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDkwLDAsCi0gICAgMCwwLDExNCwxNDYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTAsMCwwLDAsCi0gICAgMTg2LDIsMCwwLDExNSwzMCwwLDAsMCwxMiw3LDYsMiwxOCw5LDMsCi0gICAgMSwyMSw4LDMsMSwxOCwxMSwxOCw4LDE4LDUsMywxLDIxLDUsMywKLSAgICAxLDIxLDUsMywxLDIxLDUsMTE0LDE1MCwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSwyMTEsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAxLDQsMCwxMDAsMiwwLDEwMCwzLAotICAgIDAsMTMyLDAsMCwxMzEsMSwwLDkwLDUsMCwxMDEsNiwwLDEwMCw0LDAsCi0gICAgMTAwLDQsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDIsMCwxMzEsMSwwLDkwLAotICAgIDcsMCwxMDEsNiwwLDEwMCw0LDAsMTAwLDcsMCwxMDAsOCwwLDEzMiwxLAotICAgIDAsMTMxLDEsMCw5MCw4LDAsMTAxLDYsMCwxMDAsOSwwLDEwMCwxMCwwLAotICAgIDEzMiwwLDAsMTMxLDEsMCw5MCw5LDAsMTAxLDQsMCwxMDAsMTEsMCwxMDAsCi0gICAgMTIsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNiwwLDEwMCwxMywKLSAgICAwLDEwMCwxNCwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMSwwLDEwMSw2LDAsCi0gICAgMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsOTAsMTMsMCwxMDEsNiwwLDEwMSwxMiwwLDEwMCwxNywwLDEwMCwxOCwKLSAgICAwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDE0LDAsMTAxLDYsMCwKLSAgICAxMDEsMTIsMCwxMDAsMTksMCwxMDAsMjAsMCwxMzIsMCwwLDEzMSwxLDAsMTMxLAotICAgIDEsMCw5MCwxNSwwLDEwMCw0LDAsODMsNDEsMjEsMjE4LDE0LDcwLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDIsNzcsMTAxLDExNiwKLSAgICA5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMDgsCi0gICAgOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksMTAxLAotICAgIDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiw5NywxMTgsMTExLDEwNSwxMDAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMSwwLDgzLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAotICAgIDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCi0gICAgMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LAotICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LAotICAgIDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjIsNjAsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTAyLDExNCwxMTEsMTIyLAotICAgIDEwMSwxMTAsNDEsNjIsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDEsMCwwLDAsCi0gICAgNDEsMSwyMTgsMSwxMDksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMTE0LDkyLDAsMCwwLDEyLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsNywxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LAotICAgIDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDUsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTE0LDM0LDAsMTE2LDIsMCwxMjQsMSwwLAotICAgIDEyNCwwLDAsMTAwLDEsMCwxMDAsMiwwLDEzMSwyLDEsODMsMTAwLDAsMCwKLSAgICA4MywxMDAsMCwwLDgzLDQxLDMsNzgsMTE0LDEwNywwLDAsMCw5MCw2LDEwMiwKLSAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDQxLDMsMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsCi0gICAgMCwxMTQsODUsMCwwLDAsNDEsNCwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLAotICAgIDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NCwwLDAsMCwKLSAgICAyMSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTUsMSwxOSwyLDEyMiwKLSAgICAyNCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjMsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTQsCi0gICAgMTksMCwxMjQsMCwwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsOTMsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDU3LAotICAgIDAsMCwwLDExNCw4MiwwLDAsMCw0MSwzLDExNCwxNTEsMCwwLDAsMTE0LAotICAgIDc4LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NSwwLDAsMCwyOCwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCi0gICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LAotICAgIDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsODgsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDEzOCwwLDAsMCwzNywzLDAsMCwxMTUsMCwwLDAsMCwxMjIsCi0gICAgMjgsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDkyLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLAotICAgIDEyNSwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMTMxLDEsMCwxMTUsCi0gICAgNTQsMCwxMTYsNCwwLDEwMCwxLDAsMTA2LDUsMCwxMjQsMSwwLDEzMSwxLAotICAgIDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwxLDEsMTMwLDEsMCwxMTYsNiwwLAotICAgIDExNiwyLDAsMTA2LDcsMCwxMjQsMSwwLDEzMSwyLDAsMTI1LDIsMCwxMTYsCi0gICAgOCwwLDEyNCwyLDAsMTI0LDAsMCwxMDYsOSwwLDEzMSwyLDAsMSwxMDAsCi0gICAgMCwwLDgzLDQxLDMsNzgsMTIyLDI3LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsCi0gICAgMTEwLDExMSwxMTYsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDEwLDExNCw5NSwwLDAsMCwxMTQsCi0gICAgMTUsMCwwLDAsMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsNzcsCi0gICAgMCwwLDAsMTE0LDUwLDAsMCwwLDExNCw2NSwwLDAsMCwyMTgsMTcsMTAzLAotICAgIDEwMSwxMTYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTExLDk4LDEwNiwxMDEsOTksMTE2LAotICAgIDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCw3LDAsMCwwLDQxLDMsMTE0LDg5LDAsCi0gICAgMCwwLDExNCwxNSwwLDAsMCwyMTgsNCw5OSwxMTEsMTAwLDEwMSwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwKLSAgICAwLDQxLDMsMCwwLDExNSwxMiwwLDAsMCwwLDIsMTIsMSwxNSwxLAotICAgIDE4LDEsOSwxLDE4LDEsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDExNiwwLDAsMTI0LAotICAgIDAsMCwxMjQsMSwwLDEzMSwyLDAsODMsNDEsMSwxMjIsOTUsNzYsMTExLDk3LAotICAgIDEwMCwzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsCisgICAgMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLAorICAgIDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsCisgICAgMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwKKyAgICAyNCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCw5OCwKKyAgICAxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCw0MSw2Miw0MSwyLDExNCwzOCwwLDAsMCwKKyAgICAxMTQsMSwwLDAsMCw0MSwxLDExNCw4MywwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsODYsMCwwLDAsCisgICAgMTc4LDIsMCwwLDExNSwyLDAsMCwwLDAsNywxMjIsMjcsNjYsMTE3LDEwNSwKKyAgICAxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw3OCw5OSw0LDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw0OCwKKyAgICAwLDAsMCwxMjQsMiwxMDAsMCwxMDcsOSwxMTQsMTIsMTAwLDAsODMsMCwxMTYsCisgICAgMCwxMDYsMSwxMjQsMSwxMzEsMSwxMTQsNDAsMTE2LDIsMTI0LDEsMTI0LDAsMTAwLAorICAgIDEsMTAwLDIsMTQ0LDEsMTMxLDIsODMsMCwxMTAsNCwxMDAsMCw4MywwLDEwMCwKKyAgICAwLDgzLDAsNDEsMyw3OCwxMTQsMTAzLDAsMCwwLDEyMiw4LDk4LDExNywxMDUsCisgICAgMTA4LDExNiw0NSwxMDUsMTEwLDQxLDMsMTE0LDQ2LDAsMCwwLDkwLDEwLDEwNSwxMTUsCisgICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE0LDc4LDAsMCwwLDQxLDQsMjE4LAorICAgIDMsOTksMTA4LDExNSwxMTQsNzEsMCwwLDAsMjE4LDQsMTEyLDk3LDExNiwxMDQsMjE4LAorICAgIDYsMTE2LDk3LDExNCwxMDMsMTAxLDExNiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsCisgICAgOTksMTg3LDIsMCwwLDExNSwxMCwwLDAsMCwwLDIsOCwxLDQsMSwKKyAgICAxMCwxLDE4LDIsMTIyLDI1LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksCisgICAgMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMzAsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTI0LAorICAgIDIsMTMxLDIsMTI1LDMsMTI0LDMsMTAwLDEsMTA3LDksMTE0LDI2LDEyNCwzLDEwNiwKKyAgICAxLDgzLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwxNzUsNzAsMTA1LDExMCwxMDAsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLAorICAgIDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwxMDEsMTE0LDMyLAorICAgIDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDk5LDExMSwxMTAsCisgICAgMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsMTA4LDExNywxMTQsCiAgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LAogICAgIDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSwKLSAgICA5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLDk5LAotICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsCi0gICAgMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQxLDEsMTE0LDkwLAotICAgIDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE0NiwKLSAgICAwLDAsMCw1MCwzLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LAotICAgIDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwOCwKLSAgICAxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDEzLDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsCi0gICAgODMsNDEsMSwxMjIsNDUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsNDYsNDEsMiwxMTQsNTcsMCwwLDAsMTE0LDE2MiwwLDAsMCw0MSwyLAotICAgIDExNCwxNTEsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTYsMCwwLDAsNTksMywKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyMyw3MCwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsCi0gICAgMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsCi0gICAgNDEsMiwxMjIsNTQsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiwKLSAgICA5NywxMTUsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsMTAsMCwwLDAsCi0gICAgNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTU3LDAsMCwwLAotICAgIDY1LDMsMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjUsNzAsMTE0LDExMSwKLSAgICAxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLDEsMTIyLAotICAgIDQ2LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw0MSwKLSAgICAyLDExNCw1NywwLDAsMCw5MCwxNywxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDExNCwxNTEsMCwwLDAsCi0gICAgMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDExNCwxMDksMCwwLDAsNzEsMywwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKLSAgICAxNiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw5MiwwLDAsMCwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsMTM4LAotICAgIDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsODQsMCwKLSAgICAwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDExLDAsMCwwLDExNCwxNjAsMCwwLDAsMywzLDAsMCwxMTUsMzAsCi0gICAgMCwwLDAsMTIsNyw2LDIsMTgsOSwzLDEsMjEsNiwzLDEsMTgsCi0gICAgOCwxOCw0LDE4LDksMTgsOSwzLDEsMjEsNSwzLDEsMjEsNSwzLAotICAgIDEsMTE0LDE2MCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSw0NiwwLDAsMCwKLSAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAotICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LDAsODMsNDEsNywKLSAgICAyMTgsMTgsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsCi0gICAgMTE2LDEwMSwxMjAsMTE2LDEyMiwzNiw2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiwzMiwxMDksOTcsCi0gICAgMTEwLDk3LDEwMywxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCwxLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDE0LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiwyNCw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LDQxLAotICAgIDIsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwwLDAsNDEsMSwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDIzLDAsMCwwLDg0LDMsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwKLSAgICAxMTAsMTE2LDEwMSwxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksCi0gICAgNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMSwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsMTQsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAwLDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDYwLDgyLDEwMSwxMDgsMTAxLDk3LAotICAgIDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSwKLSAgICA5OSwxMDcsMzIsMTE0LDEwMSwxMDMsOTcsMTE0LDEwMCwxMDgsMTAxLDExNSwxMTUsMzIsMTExLDEwMiwKLSAgICAzMiw5NywxMTAsMTIxLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTAxLDEyMCw5OSwxMDEsCi0gICAgMTEyLDExNiwxMDUsMTExLDExMCwxMTUsNDYsNzgsNDEsMiwxMTQsNTcsMCwwLDAsMTE0LAotICAgIDU4LDAsMCwwLDQxLDQsMTE0LDE5LDAsMCwwLDkwLDgsMTAxLDEyMCw5OSwKLSAgICA5NSwxMTYsMTIxLDExMiwxMDEsOTAsOSwxMDEsMTIwLDk5LDk1LDExOCw5NywxMDgsMTE3LDEwMSwKLSAgICA5MCwxMywxMDEsMTIwLDk5LDk1LDExNiwxMTQsOTcsOTksMTAxLDk4LDk3LDk5LDEwNywxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsCi0gICAgMCwwLDAsODgsMywwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwyNywKLSAgICA5NSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDc2LDExMSw5OSwxMDcsNjcsMTExLDExMCwxMTYsMTAxLAotICAgIDEyMCwxMTYsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsCi0gICAgMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDMsMCwKLSAgICAwLDAsMTE0LDIzLDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCi0gICAgMTE0LDE2NSwwLDAsMCw4MCwzLDAsMCwxMTUsNiwwLDAsMCwxMiwyLAotICAgIDYsMiwxMiw0LDExNCwxNjUsMCwwLDAsOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDUsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODgsCi0gICAgMCwwLDAsMTI0LDEsMCwxMDYsMCwwLDEwMCwxLDAsMTI0LDIsMCwxMDAsCi0gICAgMiwwLDI0LDEzMSwyLDAsMTI1LDMsMCwxMTYsMSwwLDEyNCwzLDAsMTMxLAotICAgIDEsMCwxMjQsMiwwLDEwNywwLDAsMTE0LDUyLDAsMTE2LDIsMCwxMDAsMywKLSAgICAwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMywwLDEwMCw0LDAsMjUsMTI1LDQsCi0gICAgMCwxMjQsMCwwLDExNCw4NCwwLDEwMCw1LDAsMTA2LDMsMCwxMjQsNCwwLAotICAgIDEyNCwwLDAsMTMxLDIsMCw4MywxMjQsNCwwLDgzLDQxLDYsMTIyLDUwLDgyLAotICAgIDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLDk3LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LAotICAgIDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTYsMTExLAotICAgIDMyLDk3LDExMCwzMiw5Nyw5OCwxMTUsMTExLDEwOCwxMTcsMTE2LDEwMSwzMiwxMTEsMTEwLDEwMSwKLSAgICA0NiwxMTQsMTIxLDAsMCwwLDExNCw0NSwwLDAsMCwxMjIsNTAsOTcsMTE2LDExNiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTAxLDEwMCwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTgsMTAxLDEyMSwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLAotICAgIDExMiw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsCi0gICAgMzMsMCwwLDAsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDQxLDQsMjE4LDYsMTE0LAotICAgIDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDMsMTA4LDEwMSwxMTAsMjE4LDEwLDg2LDk3LDEwOCwxMTcsCi0gICAgMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsNDEsNSwxMTQsMTUsMCwKLSAgICAwLDAsMjE4LDcsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDIxOCw1LDEwOCwxMDEsMTE4LAotICAgIDEwMSwxMDgsOTAsNCw5OCwxMDUsMTE2LDExNSw5MCw0LDk4LDk3LDExNSwxMDEsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LAotICAgIDExNCwxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSw5NSwxMTAsOTcsMTA5LDEwMSw5MywzLDAsMCwKLSAgICAxMTUsMTAsMCwwLDAsMCwyLDIyLDEsMTgsMSwxMiwxLDEwLDEsMTE0LAotICAgIDE3MSwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0NywwLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDMsMCwKLSAgICAxMjQsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMzQsMCwxMDAsMCwwLDgzLAotICAgIDExNiwxLDAsMTI0LDEsMCwxMjQsMywwLDEzMSwyLDAsODMsNDEsMSw3OCwKLSAgICA0MSwyLDExNCwxNTUsMCwwLDAsMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDYsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDE1LDAsMCwwLDExNCwxNTIsMCwwLDAsCi0gICAgMTE0LDk5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgOTUsMTA4LDEwMSwxMDMsOTcsOTksMTIxLDEwMiwzLDAsMCwxMTUsOCwwLDAsMCwKLSAgICAwLDMsMTgsMSwxMiwxLDQsMSwxMTQsMTczLDAsMCwwLDk5LDMsMCwKLSAgICAwLDAsMCwwLDAsMCw5LDAsMCwwLDI3LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw0MiwxLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOSwwLDExNCw0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwKLSAgICAxMjQsMCwwLDExNiwwLDAsMTA2LDUsMCwxMDcsNiwwLDEyNSwzLDAsMTIwLAotICAgIDIzNSwwLDExNiwwLDAsMTA2LDEsMCw2OCw5MywyMjAsMCwxMjUsNCwwLDExNiwKLSAgICA2LDAsMTMxLDAsMCwxNDMsOTAsMCwxLDEyMSwxMywwLDEyNCw0LDAsMTA2LAotICAgIDcsMCwxMjUsNSwwLDg3LDExMCw1MSwwLDQsMTE2LDgsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTQ4LDAsMSwxLDEsMTE2LDksMCwxMjQsNCwwLDEyNCwwLDAsMTI0LAotICAgIDEsMCwxMzEsMywwLDEyNSw2LDAsMTI0LDYsMCwxMDAsMSwwLDEwNyw4LAotICAgIDAsMTE0LDE0NCwwLDExOSw2NiwwLDg5LDExMCwxOSwwLDg4LDEyNCw1LDAsMTI0LAotICAgIDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDMsMCwxMjUsNiwwLDg3LDEwMCwKLSAgICAxLDAsODEsODIsODgsMTI0LDYsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDY2LAotICAgIDAsMTI0LDMsMCwxMiwxMTQsMjYsMSwxMjQsMCwwLDExNiwwLDAsMTA2LDUsCi0gICAgMCwxMDcsNiwwLDExNCwyNiwxLDExNiwwLDAsMTA2LDUsMCwxMjQsMCwwLAotICAgIDI1LDEyNSw3LDAsMTIxLDEzLDAsMTI0LDcsMCwxMDYsMTAsMCwxMjUsOCwwLAotICAgIDg3LDExMCwyMiwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMiwxLDEsMSwKLSAgICAxLDEyNCw2LDAsODMsODksMTEzLDMwLDEsODgsMTI0LDgsMCwxMDAsMSwwLAotICAgIDEwNyw4LDAsMTE0LDE5LDEsMTI0LDYsMCw4MywxMjQsOCwwLDgzLDExMyw2NiwKLSAgICAwLDEyNCw2LDAsODMsMTEzLDY2LDAsODcsMTAwLDEsMCw4MywxMDAsMSwwLAotICAgIDgzLDQxLDMsMTIyLDIzLDcwLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDM5LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDc4LDEyMiwyMiwxMTUsCi0gICAgMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDEwMSwxMDksMTEyLDExNiwxMjEsNDEsMTEsMTE0LDE0LDAsMCwwLDIxOCw5LDEwOSwxMDEsCi0gICAgMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDExNCwxNDEsMCwwLDAsMTE0LDE0MiwwLDAsCi0gICAgMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLAotICAgIDExNCwyMSwwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LAotICAgIDk2LDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDk1LDAsMCwwLDQxLDksCi0gICAgMTE0LDE1LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDE1MywwLDAsMCw5MCwKLSAgICA5LDEwNSwxMTUsOTUsMTE0LDEwMSwxMDgsMTExLDk3LDEwMCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxNTQsMCwwLDAsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTUsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDEwLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMTEsMywKLSAgICAwLDAsMTE1LDQ4LDAsMCwwLDAsMiwyNSwxLDE2LDQsMTUsMSwxNiwKLSAgICAxLDEwLDEsMywxLDEzLDEsMTMsMSwxOCwxLDEyLDEsOCwyLDI1LAotICAgIDEsMTIsMiwyMiwxLDEzLDEsMywxLDEzLDEsMTMsNCw5LDIsMTIsCi0gICAgMSw0LDIsNywyLDgsMiwxMTQsMTc2LDAsMCwwLDk5LDMsMCwwLAotICAgIDAsMCwwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE4NSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTE2LDEsMCwxMzEsCi0gICAgMiwwLDExNSw0MiwwLDExNiwyLDAsMTAwLDEsMCwxMDYsMywwLDExNiw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLAotICAgIDEyNCwyLDAsMTAwLDIsMCwxMDcsMCwwLDExNCw2NiwwLDExNiw1LDAsMTAwLAotICAgIDMsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNyw0LAotICAgIDAsMTE0LDE1MCwwLDExNiwwLDAsMTI0LDEsMCwxMTYsMSwwLDEzMSwyLDAsCi0gICAgMTE1LDEwOCwwLDExNiwyLDAsMTAwLDQsMCwxMzEsMSwwLDEzMCwxLDAsMTEwLAotICAgIDQyLDAsMTI0LDEsMCwxMTYsNiwwLDEwNiw3LDAsMTA3LDcsMCwxMTQsMTUwLAotICAgIDAsMTAwLDUsMCwxMjUsMywwLDExNiw4LDAsMTI0LDMsMCwxMDYsMywwLAotICAgIDEyNCwxLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDAsMCwxMiwKLSAgICAxMTQsMTgxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNywyLDAsMTE0LDE4MSwwLDExNiwKLSAgICA1LDAsMTAwLDYsMCwxMzEsMSwwLDEzMCwxLDAsMTAwLDcsMCw4Myw0MSwKLSAgICA4LDEyMiwyOCw4NiwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwzNCwxMTUsOTcsMTEwLDEwMSwzNCw0NiwxMjIsCi0gICAgMzEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTA5LDExNywxMTUsCi0gICAgMTE2LDMyLDk4LDEwMSwzMiwxMTUsMTE2LDExNCw0NCwzMiwxMTAsMTExLDExNiwzMiwxMjMsMTI1LAotICAgIDExNCwzMywwLDAsMCwxMjIsMTgsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksMTE3LDExNSwKLSAgICAxMTYsMzIsOTgsMTAxLDMyLDYyLDYxLDMyLDQ4LDEyMiwzMSw5NSw5NSwxMTIsOTcsOTksCi0gICAgMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LAotICAgIDExMSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMjIsNjEsODAsOTcsMTE0LDEwMSwKLSAgICAxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsNDQsMzIsOTksOTcsMTEwLDExMCwxMTEsCi0gICAgMTE2LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LAotICAgIDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTIyLDE3LDY5LDEwOSwxMTIsMTE2LDEyMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw3OCw0MSw5LDIxOCwKLSAgICAxMCwxMDUsMTE1LDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDIxOCwzLDExNSwxMTYsMTE0LAotICAgIDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsCi0gICAgMTE0LDEzLDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwKLSAgICAyMSwwLDAsMCwyMTgsMTEsODMsMTIxLDExNSwxMTYsMTAxLDEwOSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsNDEsNCwxMTQsMTUsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTcwLDAsCi0gICAgMCwwLDExNCwxNDcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNSw5NywxMTAsMTA1LDExNiwxMjEsOTUsCi0gICAgOTksMTA0LDEwMSw5OSwxMDcsMTUxLDMsMCwwLDExNSwyNCwwLDAsMCwwLDIsCi0gICAgMTUsMSwyNywxLDEyLDEsMTIsMSwxMiwxLDE1LDEsMTUsMSwxNSwxLAotICAgIDYsMiwyMSwxLDE5LDEsMTE0LDE4MSwwLDAsMCwxMjIsMTYsNzgsMTExLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMjIsNCwxMjMsCi0gICAgMzMsMTE0LDEyNSw5OSwyLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwKLSAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsNDAsMSwwLDAsMTAwLDAsMCwKLSAgICAxMjUsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwyNSwxMjUsMywwLDEyNCwzLDAsMTE0LDE3NSwwLDEyNCwzLDAsMTE2LAotICAgIDEsMCwxMDYsMiwwLDEwNyw3LDAsMTE0LDU5LDAsMTE2LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCwxLDEyNCwwLDAsMTE2LDEsMCwxMDYsMiwKLSAgICAwLDEwNyw2LDAsMTE0LDg1LDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwwLDAsCi0gICAgMjUsODMsMTE2LDEsMCwxMDYsMiwwLDEyNCwzLDAsMjUsMTI1LDQsMCwxMjEsCi0gICAgMTMsMCwxMjQsNCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsNjEsMCw0LAotICAgIDExNiw1LDAsMTA3LDEwLDAsMTE0LDE3NCwwLDEsMSwxLDExNiw2LDAsMTAwLAotICAgIDMsMCwyMywxMDYsNywwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSwKLSAgICA1LDAsMTE2LDgsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwKLSAgICAxLDEwMCwwLDAsMTMwLDIsMCw4OSwxMTAsMSwwLDg4LDExNiw5LDAsMTI0LAotICAgIDAsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMjMyLDAsMTE2LDgsMCwxMTYsNiwwLDEwNiw3LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwKLSAgICAxLDAsMTEwLDEyLDAsMTE2LDEwLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LAotICAgIDAsMTI0LDMsMCwxMTQsMzYsMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDMsMCwKLSAgICAyNSwxMjUsNCwwLDExNiwxMSwwLDEyNCw0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEwMCwxLDAsMTMxLDEsMCwxMDAsNSwwLDI1LDEyNCw3LDAsMTMxLDMsMCwKLSAgICAxLDEyNCw3LDAsODMsNDEsNiw3OCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLAotICAgIDAsMCwxMjIsMjMsNTksMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDExNiwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxNDAsMCwwLDAsNDEsMTIsMTE0LDEyMiwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsMTMxLDAsMCwwLAotICAgIDExNCw5NiwwLDAsMCwyMTgsOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsCi0gICAgNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzYsMCwwLDAsMTE0LDE0OSwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsCi0gICAgNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMTQsMTUyLDAsMCwwLDExNCwxMjMsMCwKLSAgICAwLDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxMTQsMTQ3LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCisgICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsCisgICAgOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsNDEsMiwxMTQsMTUxLDAsCisgICAgMCwwLDExNCw5MywwLDAsMCw0MSw0LDExNCwxNDgsMCwwLDAsMTE0LDcxLAorICAgIDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDgyLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMSwxMDIsMTA1LAorICAgIDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTk2LDIsMCwwLDExNSw0LDAsCisgICAgMCwwLDAsOSwxMiwxLDEyMiwyNyw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDQsMCwwLDAsNjcsMCwwLDAsMTE1LDQ4LDAsMCwwLDEyNCwxLDEwNiwKKyAgICAwLDExNiwxLDEwNiwyLDEwNyw3LDExNCwzNiwxMTYsMywxMDAsMSwxMDYsNCwxMjQsCisgICAgMSwxMDYsMCwxMzEsMSwxMDAsMiwxMjQsMSwxMDYsMCwxNDQsMSwxMzEsMSwxMzAsCisgICAgMSwxMTYsNSwxMTYsNiwxMDYsNywxMjQsMSwxMzEsMiw4MywwLDQxLDMsMTIyLAorICAgIDI0LDY3LDExNCwxMDEsOTcsMTE2LDEwMSwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsMjksMTIzLDMzLDExNCwxMjUsMzIsCisgICAgMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LAorICAgIDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsOCwxMTQsCisgICAgMTUsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw2OSwwLDAsMCwxMTQsNzAsCisgICAgMCwwLDAsMTE0LDM4LDAsMCwwLDExNCw1OCwwLDAsMCwxMTQsNDYsMCwKKyAgICAwLDAsOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDk4LDExNywxMDUsMTA4LDExNiwKKyAgICAxMDUsMTEwLDQxLDIsMTE0LDI2LDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTM0LDAsCisgICAgMCwwLDIwOCwyLDAsMCwxMTUsOCwwLDAsMCwwLDMsMTIsMSwxNCwKKyAgICAxLDEwLDEsMTIyLDI5LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTAxLDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTE2LDAsMTE2LDEsCisgICAgMTA2LDIsMTI0LDEsMTMxLDIsMSwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMjIsCisgICAgNjksMTIwLDEwMSw5OSwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSwzLDExNCw1OCwwLDAsMCwxMTQsNDYsCisgICAgMCwwLDAsOTAsMTIsMTAxLDEyMCwxMDEsOTksOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwKKyAgICAxMTAsNDEsMiwxMTQsMjYsMCwwLDAsMTE0LDgzLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMzUsMCwwLAorICAgIDAsMjE2LDIsMCwwLDExNSwyLDAsMCwwLDAsMywxMjIsMjcsNjYsMTE3LAorICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMSwxMjAsCisgICAgMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsCisgICAgMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1Nyw4MiwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAwLDExMSwzMiwxMTAsMTExLAorICAgIDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSwKKyAgICA5OSwxMTYsMTE1LDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNDgsMCwwLAorICAgIDAsMTE0LDcxLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDIyMSwKKyAgICAyLDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDI0LDY2LDExNywxMDUsMTA4LAorICAgIDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwKKyAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAorICAgIDgzLDAsNDEsMiwxMjIsNTYsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLAorICAgIDEwMSwzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwKKyAgICAxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsCisgICAgMTAsMCwwLDAsNDEsMiwxMTQsMTQ4LDAsMCwwLDExNCw3MSwwLDAsMCwKICAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDk3LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsOTUsCi0gICAgMTE3LDExMCwxMDgsMTExLDk5LDEwNywxMDEsMTAwLDE3MSwzLDAsMCwxMTUsNDIsMCwwLAotICAgIDAsMCwxLDYsMSwxOSwxLDYsMSwxNSwxLDEzLDIsMTUsMSwxMSwKLSAgICAxLDEzLDEsMywxLDEzLDEsMTMsMSwyMiwxLDI2LDEsMTUsMSwxMiwKLSAgICAxLDMwLDIsMTIsMSw2LDIsMTMsMSwyOSwxLDExNCwxODQsMCwwLDAsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTAsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDM3LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDE0MywxOCwwLDEsMTE2LDEsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgMTMxLDIsMCw4Myw4NywxMDAsMSwwLDgxLDgyLDg4LDEwMCwxLDAsODMsNDEsCi0gICAgMiwxMjIsNTQsNzAsMTA1LDExMCwxMDAsMzIsOTcsMTEwLDEwMCwzMiwxMDgsMTExLDk3LDEwMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiw5NywxMTAsMTAwLAotICAgIDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LDQxLDIsMTE0LDU0LDAsMCwKLSAgICAwLDExNCwxODQsMCwwLDAsNDEsMiwxMTQsMTUsMCwwLDAsMTE0LDE4MywwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCi0gICAgMCwyMTgsMTQsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDk3LDExMCwxMDAsOTUsMTA4LDExMSw5NywKLSAgICAxMDAsMTk4LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxMywxLDExNCwxODUsCi0gICAgMCwwLDAsMTE0LDMzLDAsMCwwLDk5LDMsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE2NiwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLAotICAgIDAsMSwxMjQsMiwwLDEwMCwxLDAsMTA3LDQsMCwxMTQsNDYsMCwxMTYsMSwKLSAgICAwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDAsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTMxLDAsMCwxLDEyNCwwLDAsMTE2LDQsMCwKLSAgICAxMDYsNSwwLDEwNyw3LDAsMTE0LDg0LDAsMTE2LDYsMCwxMjQsMCwwLDExNiwKLSAgICA3LDAsMTMxLDIsMCw4MywxMTYsNCwwLDEwNiw1LDAsMTI0LDAsMCwyNSwKLSAgICAxMjUsMywwLDEyNCwzLDAsMTAwLDIsMCwxMDcsOCwwLDExNCwxNTIsMCwxMTYsCi0gICAgMiwwLDEwNiw4LDAsMTMxLDAsMCwxLDEwMCwzLDAsMTA2LDksMCwxMjQsCi0gICAgMCwwLDEzMSwxLDAsMTI1LDQsMCwxMTYsMTAsMCwxMjQsNCwwLDEwMCw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwxLDAsMTE2LDExLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDEsMTI0LDMsMCw4Myw0MSw1LDk3LDUwLDEsMCwwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCw5NywxMTUsMTAxLAotICAgIDEwMCwzMiwxMTEsMTEwLDMyLDEwNSwxMTYsMTE1LDMyLDExMCw5NywxMDksMTAxLDQ0LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTYsMTA0LDEwMSwzMiw5OSwKLSAgICA5NywxMDgsMTA4LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLAotICAgIDMyLDEwOSw5NywxMDAsMTAxLDMyLDEwMiwxMTQsMTExLDEwOSw0NCwzMiw5NywxMTAsMTAwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsOTcsMTAwLDEwNiwxMTcsMTE1LDExNiwKLSAgICAxMDksMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsCi0gICAgMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwKLSAgICAxMTAsMTE2LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDMsMTE0LDEwMSw5NywxMTYsMTAxLDExNSwxMTYsCi0gICAgMzIsOTksMTExLDEwOSwxMDksMTExLDExMCwzMiwxMDAsMTAxLDExMCwxMTEsMTA5LDEwNSwxMTAsOTcsCi0gICAgMTE2LDExMSwxMTQsMzIsMTExLDEwMiwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsOTcsCi0gICAgMTA4LDEwNSwxMTYsMTIxLDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMTYsMTE5LDEwMSwxMDEsMTEwLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk3LAotICAgIDExMCwxMDAsMzIsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsOTUsNDYsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwxMDEsMTE1LDMyLDExNSwxMDEsMTE2LAotICAgIDExNiwxMDUsMTEwLDEwMywzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsCi0gICAgMzIsMTA1LDEwMiwxMCwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDMyLDEwMCwxMDUsMTAwLDMyLDExMCwxMTEsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNCwzMywwLDAsMCw3OCwxMjIsNDAsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTExLDEwMiwzMiwxMjMsMTI1LDMyLDEwNCw5NywxMDgsMTE2LDEwMSwxMDAsNTksMzIsNzgsMTExLAotICAgIDExMCwxMDEsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMTE0LDE1LDAsMCwwLDQxLDEyLDExNCwxODEsMCwwLDAsMTE0LDE3MSwwLAotICAgIDAsMCwxMTQsNTcsMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCwxODUsMCwwLDAsMjE4LDExLDk1LDEwMyw5OSwKLSAgICAxMDAsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE0LDU4LDAsMCwwLDExNCw1MCwwLAotICAgIDAsMCwxMTQsNzcsMCwwLDAsMTE0LDYzLDAsMCwwLDQxLDUsMTE0LDE1LAotICAgIDAsMCwwLDExNCwxNjksMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsODksMCwKLSAgICAwLDAsMTE0LDc0LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCwxODYsMCwwLDAsMjA0LDMsMCwwLDExNSwKLSAgICAyOCwwLDAsMCwwLDksMTYsMSwxMiwxLDE4LDEsMTAsMSwxNSwxLAotICAgIDEzLDEsMTMsMSwxMiwxLDEwLDEsNiwxLDksMSwxOCwxLDEwLDEsCi0gICAgMTE0LDE4NiwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLAotICAgIDAsMCwxNywwLDAsMCw2NywwLDAsMCwxMTUsMjM5LDAsMCwwLDExNiwKLSAgICAwLDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwyLDAsMTE0LDIzNSwwLDEwMCwyLAotICAgIDAsMTI0LDEsMCwxMDcsNiwwLDExNCw4MywwLDExNiwxLDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDEyNSwxLDAsMTI0LDEsMCwxMDYsMiwwLDEwMCwyLDAsMTMxLAotICAgIDEsMCwxLDExNiwwLDAsMTI0LDAsMCwxMDAsMywwLDEzMSwyLDAsMTE0LAotICAgIDgzLDAsMTI0LDEsMCwxMDYsMywwLDEyNCwwLDAsMTA2LDQsMCwxMzEsMSwKLSAgICAwLDEsMTIwLDE0OSwwLDEyNCwxLDAsNjgsOTMsMTQxLDAsMTI1LDMsMCwxMTYsCi0gICAgMCwwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDExNSw5MCwwLDEwMCw0LAotICAgIDAsMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMzEsMiwwLAotICAgIDEyNSw0LDAsMTIxLDE3LDAsMTE2LDcsMCwxMjQsMiwwLDEyNCw0LDAsMTMxLAotICAgIDIsMCwxLDg3LDExMyw5MCwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMjMwLAotICAgIDAsMSwxMjUsNSwwLDEsMTIyLDQ3LDAsMTE2LDksMCwxMjQsNSwwLDEzMSwKLSAgICAxLDAsMTA2LDEwLDAsMTE2LDExLDAsMTMxLDEsMCwxMTQsMjA5LDAsMTI0LDUsCi0gICAgMCwxMDYsMTIsMCwxMjQsNCwwLDEwNywyLDAsMTE0LDIwOSwwLDExOSw5MCwwLAotICAgIDEzMCwwLDAsODcsODksMTAwLDUsMCwxMDAsNSwwLDEyNSw1LDAsMTI2LDUsCi0gICAgMCw4OCwxMTMsOTAsMCw4OCwxMTMsOTAsMCw4NywxMjQsMCwwLDgzLDQxLDYsCi0gICAgMTIyLDIzOCw3MCwxMDUsMTAzLDExNywxMTQsMTAxLDMyLDExMSwxMTcsMTE2LDMyLDExOSwxMDQsOTcsCi0gICAgMTE2LDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDMyLDExNSwxMDQsMTExLAotICAgIDExNywxMDgsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMzIsMTEyLDk3LDExNCwKLSAgICA5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsMzIsOTksOTcsMTA4LDEwOCwKLSAgICA5Nyw5OCwxMDgsMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsOTcsMTA3LDEwMSwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDQ2LDMyLDczLDExNiwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKLSAgICAxMDAsMzIsMTE2LDExMSwzMiwxMDAsMTAxLDk5LDExMSwxMTcsMTEyLDEwOCwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKLSAgICA5NywxMTUsMTE1LDExNywxMDksMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LAotICAgIDEwNSw5OCwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwNSwKLSAgICAxMTUsMzIsMTAwLDEwMSwxMTUsMTA1LDExNCwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAotICAgIDExNCwxMzEsMCwwLDAsMjUwLDEsNDIsMjE4LDcsOTUsOTUsOTcsMTA4LDEwOCw5NSwKLSAgICA5NSwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsNzgsNDEsMTMsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDEzMCwwLDAsMCwyMTgsNiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwyMTgsNiwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDEwMCwxMTQsMTg4LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsCi0gICAgMSwwLDAsMCwxMTQsNjUsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzgsCi0gICAgMCwwLDAsMTE0LDcxLDAsMCwwLDIxOCwxNSw5NSw2OSw4Miw4Miw5NSw3NywKLSAgICA4Myw3MSw5NSw4MCw4Miw2OSw3MCw3Myw4OCwxMTQsMTUsMCwwLDAsNDEsNiwKLSAgICAxMTQsODksMCwwLDAsMjE4LDgsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwxMTQsCi0gICAgMTgzLDAsMCwwLDIxOCwxLDEyMCw5MCw5LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSw5MCwzLDEwMSwxMjAsOTksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDk1LDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsOTUsCi0gICAgMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwyMjgsMywwLDAsMTE1LDM0LDAsMCwKLSAgICAwLDAsMTAsMTUsMSwxMiwxLDEyLDEsMTMsMSwxNSwxLDE2LDEsMTMsCi0gICAgMSwxNSwxLDIxLDEsMywxLDE3LDEsMTgsNCwyMSwxLDE1LDEsMywKLSAgICAxLDI2LDEsMTE0LDE5NCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw3MiwwLAotICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDEsMCwxMzEsMSwwLDEyNSwxLAotICAgIDAsMTI0LDEsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDY4LDAsMTI0LDAsMCwKLSAgICAxMDAsMywwLDI1LDEyNSwxLDAsMTAwLDQsMCwxMjQsMCwwLDEwNyw3LDAsCi0gICAgMTE0LDY4LDAsMTI0LDEsMCwxMDYsMSwwLDEwMCw1LDAsMTMxLDEsMCwxMDAsCi0gICAgNiwwLDI1LDEyNSwxLDAsMTI0LDEsMCw4Myw0MSw3LDEyMiwxNjcsNjcsOTcsCi0gICAgMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwxMTIsCi0gICAgOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCi0gICAgOTgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSw5NSw5NSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwMywxMTcsOTcsMTE0LAotICAgIDk3LDExMCwxMTYsMTAxLDEwMSwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwMSwxMDIsCi0gICAgMTA1LDExMCwxMDEsMTAwLDMyLDExMSwxMTQsMzIsOTksMTExLDExNywxMDgsMTAwLDMyLDk4LDEwMSwKLSAgICAzMiwxMTUsMTAxLDExNiwzMiwxMTYsMTExLDMyLDc4LDExMSwxMTAsMTAxLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMTEsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMzIsMTE2LDEwNCwKLSAgICA5NywxMTYsMzIsMTA1LDExNiwxMTUsMzIsMTEyLDExNCwxMTEsMTEyLDEwMSwxMTQsMzIsMTE4LDk3LAotICAgIDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNCwxMzQsMCwwLDAsNzgsMTE0LDEsMCwwLDAsCi0gICAgMTE0LDEzMSwwLDAsMCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLDAsMCw0MSwKLSAgICAyLDExNCw0MiwwLDAsMCwxMTQsMTIyLDAsMCwwLDQxLDIsMjE4LDcsMTAzLAotICAgIDEwOCwxMTEsOTgsOTcsMTA4LDExNSwxMTQsMTY5LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNyw5NSw5OSw5NywxMDgsCi0gICAgOTksOTUsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDQsNCwwLAotICAgIDAsMTE1LDEyLDAsMCwwLDAsNywxNSwxLDEyLDEsMTAsMSwxMiwxLAotICAgIDE5LDEsMTE0LDE5NiwwLDAsMCw5OSw1LDAsMCwwLDAsMCwwLDAsCi0gICAgOSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwyMjcsMCwwLAotICAgIDAsMTI0LDQsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDI3LDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTI1LDUsMCwxMTAsNTQsMCwxMjQsMSwwLDEwMCwKLSAgICAyLDAsMTA3LDksMCwxMTQsNDUsMCwxMjQsMSwwLDExMCwzLDAsMTA1LDAsCi0gICAgMCwxMjUsNiwwLDExNiwxLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LDAsCi0gICAgMTE2LDAsMCwxMjQsMCwwLDEyNCw3LDAsMTI0LDQsMCwxMzEsMywwLDEyNSwKLSAgICA1LDAsMTI0LDMsMCwxMTUsMjA3LDAsMTI0LDQsMCwxMDAsMSwwLDEwNywyLAotICAgIDAsMTE0LDEyMiwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEwMCwzLDAsCi0gICAgMTMxLDEsMCwxMDAsMSwwLDI1LDEzMSwxLDAsODMsMTI0LDAsMCwxMTUsMTMyLAotICAgIDAsMTI0LDUsMCw4MywxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwxMTYsMywKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMywwLDEzMSwxLDAsMTAwLDEsMCwKLSAgICAyNSwxMzEsMSwwLDI0LDEyNSw4LDAsMTE2LDQsMCwxMDYsNSwwLDEyNCw1LAotICAgIDAsMTA2LDYsMCwxMDAsMiwwLDExNiwzLDAsMTI0LDUsMCwxMDYsNiwwLAotICAgIDEzMSwxLDAsMTI0LDgsMCwyNCwxMzMsMiwwLDI1LDI1LDgzLDExMCwxNiwwLAotICAgIDExNiw3LDAsMTI0LDUsMCwxMjQsMywwLDExNiwwLDAsMTMxLDMsMCw4MywKLSAgICAxMDAsMiwwLDgzLDQxLDQsOTcsMjE1LDEsMCwwLDczLDEwOSwxMTIsMTExLDExNCwKLSAgICAxMTYsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsODQsMTA0LDEwMSwzMiwzOSwxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDM5LDMyLDk3LAotICAgIDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwKLSAgICAxMTYsMTExLDMyLDEwNSwxMTAsMTAyLDEwMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDUsMTE1LDMyLDExMSw5OSw5OSwKLSAgICAxMTcsMTE0LDExNCwxMDUsMTEwLDEwMywzMiwxMDIsMTE0LDExMSwxMDksMTAsMzIsMzIsMzIsMzIsCi0gICAgMTE2LDExMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsCi0gICAgMTE4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMzIsODQsMTA0LDEwMSwzMiwKLSAgICAzOSwxMDgsMTExLDk5LDk3LDEwOCwxMTUsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsCi0gICAgMTE2LDMyLDEwNSwxMTUsMzIsMTA1LDEwMywxMTAsMTExLDExNCwxMDEsMTAwLDQ2LDMyLDg0LDEwNCwKLSAgICAxMDEsMTAsMzIsMzIsMzIsMzIsMzksMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwzOSwKLSAgICAzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwKLSAgICAxMDUsMTAxLDExNSwzMiwxMTksMTA0LDk3LDExNiwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKLSAgICAxMDEsMTIwLDEwNSwxMTUsMTE2LDMyLDk3LDExNSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LAotICAgIDExNiwxMDEsMTE1LDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMTAsMzIsMzIsMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMDAsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwKLSAgICAxMDksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgNjAsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiw2Miw5Niw5Niw0MSw0NiwzMiwzMiwKLSAgICA4NCwxMDQsMTAxLDMyLDM5LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzksMTAsMzIsMzIsMzIsMzIsCi0gICAgOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwKLSAgICAxMTAsMTE2LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsCi0gICAgMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDUsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTA1LDExMCwzMiw5NywzMiwxMTQsMTAxLDEwOCwKLSAgICA5NywxMTYsMTA1LDExOCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCi0gICAgMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsNDYsNDYsCi0gICAgMTEyLDEwNywxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDExMSwxMDAsOTYsOTYsCi0gICAgMzIsMTE5LDExMSwxMTcsMTA4LDEwMCwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5NywzMiwzOSwxMDgsCi0gICAgMTAxLDExOCwxMDEsMTA4LDM5LDMyLDExMSwxMDIsMzIsNTAsNDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTE0LDMzLDAsMCwwLDc4LDExNCwxMjEsMCwwLDAsNDEsOCwxMTQsCi0gICAgMTg2LDAsMCwwLDExNCwxOTYsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LAotICAgIDExNiwxMDUsMTExLDExMCwxMTQsMTY3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsCi0gICAgMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDE5NCwwLDAsMCw0MSw5LDExNCwKLSAgICAxNSwwLDAsMCwxMTQsMTk1LDAsMCwwLDIxOCw2LDEwOCwxMTEsOTksOTcsMTA4LAotICAgIDExNSwxMTQsMTkyLDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LDg5LDAsMCwwLAotICAgIDkwLDgsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSw5NSwxMTQsMTY5LDAsMCwwLDkwLAotICAgIDcsOTksMTE3LDExNiw5NSwxMTEsMTAyLDEwMiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTAsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwKLSAgICAxMTYsOTUsOTUsMTksNCwwLDAsMTE1LDI2LDAsMCwwLDAsMTEsMTIsMSwKLSAgICAxNSwyLDI0LDEsMTIsMSwxOCwxLDYsMywxMiwxLDIzLDEsNiwxLAotICAgIDQsNCwzNSwzLDQwLDIsMTE0LDE5OSwwLDAsMCw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSw1MywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwKLSAgICAwLDEyNSwxLDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDQzLDAsCi0gICAgMTE2LDIsMCwxMDAsMSwwLDEyNCwwLDAsMjMsMTMxLDEsMCwxMzAsMSwwLAotICAgIDExNiwzLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDI1LDExMCwKLSAgICAxMTEsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDQxLDQsMTE0LDE1MCwwLDAsMCwxMTQsCi0gICAgMTU0LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTQ5LDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTgsOTUsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDU0LDQsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMSwxNSwxLDEyLDEsMTYsMSwxMTQsMjAwLAotICAgIDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCwxMiwwLDAsMCwKLSAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsNzQsMSwwLDAsMTI0LDEsMCwKLSAgICA5NywwLDAsMTI0LDAsMCw5NywxLDAsMTE2LDIsMCwxMTYsMSwwLDEzMSwKLSAgICAxLDAsMTI1LDIsMCwxMjAsMTIzLDAsMTE2LDEsMCwxMDYsMywwLDEwNiw0LAotICAgIDAsMTMxLDAsMCw2OCw5MywxMDYsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwKLSAgICAwLDExNiw1LDAsMTI0LDQsMCwxMjQsMiwwLDEzMSwyLDAsMTE0LDQwLDAsCi0gICAgMTI0LDMsMCwxMTYsMSwwLDEwNiw2LDAsMTA3LDYsMCwxMTQsOTEsMCwxMTYsCi0gICAgNywwLDEyNSw1LDAsMTEwLDI3LDAsMTE2LDAsMCwxMDYsOCwwLDEyNCwzLAotICAgIDAsMTMxLDEsMCwxMTQsNDAsMCwxMTYsOSwwLDEyNSw1LDAsMTEwLDMsMCwKLSAgICAxMTMsNDAsMCwxMTYsMTAsMCwxMjQsNCwwLDEyNCw1LDAsMTMxLDIsMCwxMjUsCi0gICAgNiwwLDExNiwxMSwwLDEyNCw2LDAsMTI0LDQsMCwxMzEsMiwwLDEsMTEzLAotICAgIDQwLDAsODcsMTE2LDEsMCwxMDYsMywwLDExNiwxMiwwLDI1LDEyNSw3LDAsCi0gICAgMTIwLDczLDAsMTAwLDUsMCw2OCw5Myw2NSwwLDEyNSw4LDAsMTI0LDgsMCwKLSAgICAxMTYsMSwwLDEwNiwzLDAsMTA3LDcsMCwxMTQsMjA2LDAsMTE2LDEzLDAsMTI0LAotICAgIDgsMCwxMzEsMSwwLDEyNSw5LDAsMTEwLDEzLDAsMTE2LDEsMCwxMDYsMywKLSAgICAwLDEyNCw4LDAsMjUsMTI1LDksMCwxMTYsMTQsMCwxMjQsNywwLDEyNCw4LAotICAgIDAsMTI0LDksMCwxMzEsMywwLDEsMTEzLDE3MCwwLDg3LDEyMSwxNiwwLDExNiwKLSAgICAxMywwLDEwMCwyLDAsMTMxLDEsMCwxMjUsMTAsMCw4NywxMTAsMjQsMCw0LAotICAgIDExNiwxNSwwLDEwNywxMCwwLDExNCwyNSwxLDEsMSwxLDEwMCwzLDAsMTI1LAotICAgIDEwLDAsODksMTEwLDEsMCw4OCwxMTYsMTQsMCwxMjQsNywwLDEwMCwyLDAsCi0gICAgMTI0LDEwLDAsMTMxLDMsMCwxLDExNiwxMywwLDEwMCw0LDAsMTMxLDEsMCwKLSAgICAxMjUsMTEsMCwxMTYsMTQsMCwxMjQsNywwLDEwMCw0LDAsMTI0LDExLDAsMTMxLAotICAgIDMsMCwxLDEwMCwzLDAsODMsNDEsNiwxMjIsMjUwLDgzLDEwMSwxMTYsMTE3LDExMiwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiw5OCwKLSAgICAxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsCi0gICAgMTAxLDEwOSwxMCwzMiwzMiwzMiwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDExNSwzMiwxMTUsMTIxLDExNSwzMiwxMDUsMTE1LAotICAgIDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5Nyw5OSw5OSwxMDEsMTE1LDExNSwzMiw5NywKLSAgICAxMTAsMTAwLDMyLDk1LDEwNSwxMDksMTEyLDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwKLSAgICAxMDAsMzIsMTE2LDExMSwzMiwxMDgsMTExLDk3LDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCi0gICAgMTA1LDExMCwxMCwzMiwzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsCi0gICAgMTE2LDEwNCwxMTEsMTE1LDEwMSwzMiwxMTYsMTE5LDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMDEsMTIwLDExMiwxMDgsMTA1LDk5LAotICAgIDEwNSwxMTYsMTA4LDEyMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsNDYsMTAsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTE0LDE0MSwwLDAsMCwxMTQsMzQsMCwwLDAsNzgsCi0gICAgMTE0LDYyLDAsMCwwLDQxLDEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwKLSAgICAxMDMsMTE1LDQxLDE2LDExNCw1NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDEzLAotICAgIDAsMCwwLDExNCwyMSwwLDAsMCwyMTgsNSwxMDUsMTE2LDEwMSwxMDksMTE1LDExNCwKLSAgICAxNzcsMCwwLDAsMTE0LDc2LDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDgyLAotICAgIDAsMCwwLDExNCwxNjAsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsCi0gICAgMCwwLDExNCwxLDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LDUsMCwwLAotICAgIDAsMTE0LDc3LDAsMCwwLDQxLDEyLDIxOCwxMCwxMTUsMTIxLDExNSw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwyMTgsMTEsOTUsMTA1LDEwOSwxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTAsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDExNCwxNSwKLSAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDk5LDAsMCwwLDExNCw4OCwwLAotICAgIDAsMCw5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsCi0gICAgMTIsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE2LAotICAgIDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxNCwxMTksMTAxLAotICAgIDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsNiw5NSwxMTUsMTAxLAotICAgIDExNiwxMTcsMTEyLDYxLDQsMCwwLDExNSw1MCwwLDAsMCwwLDksNiwxLAotICAgIDYsMywxMiwxLDI4LDEsMTUsMSwxNSwxLDksMSwxNSwxLDksMiwKLSAgICAzLDEsMTUsMSwxNywzLDEzLDEsMTMsMSwxNSwxLDE1LDIsMTMsMSwKLSAgICAyMCwzLDMsMSwxNiwxLDEzLDIsMTEsMSwxNiwzLDEyLDEsMTE0LDIwNCwKLSAgICAwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSw4NywwLDAsMCwxMTYsMCwwLAotICAgIDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDEsMCwxMDYsMiwwLAotICAgIDEwNiwzLDAsMTE2LDQsMCwxMzEsMSwwLDEsMTE2LDEsMCwxMDYsMiwwLAotICAgIDEwNiwzLDAsMTE2LDUsMCwxMzEsMSwwLDEsMTAwLDEsMCwxMDAsMiwwLAotICAgIDEwOCw2LDAsMTI1LDIsMCwxMjQsMiwwLDk3LDcsMCwxMjQsMiwwLDEwNiwKLSAgICA4LDAsMTE2LDEsMCwxMDYsOSwwLDExNiwxMCwwLDI1LDEzMSwxLDAsMSwKLSAgICAxMDAsMiwwLDgzLDQxLDMsMTIyLDUwLDczLDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLAotICAgIDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTE0LDMzLDAsMCwwLDc4LAotICAgIDQxLDExLDExNCwyMDQsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwxNzQsMCwwLAotICAgIDAsMTE0LDExMywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwxNjAsMCwwLDAsCi0gICAgMjE4LDI2LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDEwOCwxMDUsOTgsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDExNCwxMTksMCwwLAotICAgIDAsMjE4LDgsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTE0LDIxLDAsMCwwLAotICAgIDExNCwxLDAsMCwwLDQxLDMsMTE0LDIwMiwwLDAsMCwxMTQsMjAzLDAsMCwKLSAgICAwLDExNCwyMDUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTEsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMDgsNCwwLDAsMTE1LDEyLAotICAgIDAsMCwwLDAsMiwxMywyLDE2LDEsMTYsMywxMiwxLDYsMSwxMTQsCi0gICAgMjA2LDAsMCwwLDQxLDUxLDExNCwzLDAsMCwwLDExNCwxMTksMCwwLDAsCi0gICAgMTE0LDEyLDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LAotICAgIDU5LDAsMCwwLDExNCw0MSwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDMxLAotICAgIDAsMCwwLDExNCwzMiwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDU0LDAsCi0gICAgMCwwLDExNCw1NiwwLDAsMCwxMTQsNjMsMCwwLDAsMTE0LDY1LDAsMCwKLSAgICAwLDExNCw3NSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDg0LDAsMCwwLAotICAgIDExNCw5MCwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LAotICAgIDEwNiwwLDAsMCwxMTQsODUsMCwwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksCi0gICAgMTE2LDkwLDksOTUsODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LDEzMiwwLDAsCi0gICAgMCwxMTQsMTM3LDAsMCwwLDExNCwxNDQsMCwwLDAsMTE0LDk3LDAsMCwwLAotICAgIDExNCw4NiwwLDAsMCwxMTQsMTQ4LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LAotICAgIDg3LDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMTY1LAotICAgIDAsMCwwLDExNCwxNzEsMCwwLDAsMTE0LDE3MywwLDAsMCwxMTQsMTc2LDAsCi0gICAgMCwwLDExNCwxODEsMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsMTgyLDAsMCwKLSAgICAwLDExNCwxODQsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsMTg2LDAsMCwwLAotICAgIDExNCwxOTQsMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwKLSAgICAyMDAsMCwwLDAsMTE0LDIwNCwwLDAsMCwxMTQsMjA2LDAsMCwwLDExNCwxMCwKKyAgICAxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDIyNywyLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDQsMTIyLDI2LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCwKKyAgICA0MSwyLDEyMiw1Miw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDcwLDk3LDEwOCwxMTUsMTAxLAorICAgIDMyLDk3LDExNSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTAsMTAxLDExOCwxMDEsMTE0LDMyLDExMiwKKyAgICA5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTUsNDYsNzAsMTE0LDEwLDAsMCwwLDQxLDIsCisgICAgMTE0LDE0OCwwLDAsMCwxMTQsNzEsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEwNSwwLDAsMCwyMzMsMiwKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyNiw2NiwxMTcsMTA1LDEwOCwxMTYsCisgICAgMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsCisgICAgOTksMTA3LDk3LDEwMywxMDEsNDEsMiw3OCw3OCw0MSwxLDc4LDQxLDE3LDExNCwxLAorICAgIDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsCisgICAgMCwwLDIxOCwxMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsCisgICAgMTE0LDg2LDAsMCwwLDIxOCwxMSw5OSwxMDgsOTcsMTE1LDExNSwxMDksMTAxLDExNiwxMDQsCisgICAgMTExLDEwMCwxMTQsMTUxLDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDEzNCwwLDAsCisgICAgMCwxMTQsMTM1LDAsMCwwLDExNCw3NCwwLDAsMCwxMTQsMTUzLDAsMCwwLAorICAgIDExNCwxNTQsMCwwLDAsMTE0LDEwNSwwLDAsMCwxMTQsODQsMCwwLDAsMTE0LAorICAgIDE0MywwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE0NywwLDAsMCwxNjksMiwwLAorICAgIDAsMTE1LDMwLDAsMCwwLDgsNyw0LDIsMTIsOSwyLDEsMTIsOCwKKyAgICAyLDEsMTIsMTEsMTIsOCwxMiw1LDIsMSwxNCw1LDIsMSwxNCw1LAorICAgIDIsMSwxNCw1LDExNCwxNDcsMCwwLDAsOTksMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsMTQwLAorICAgIDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMSwKKyAgICA0LDEwMCwyLDEwMCwzLDEzMiwwLDEzMSwxLDkwLDUsMTAxLDYsMTAwLDIxLDEwMCwKKyAgICA1LDEwMCw2LDEzMiwxLDEzMSwxLDkwLDcsMTAxLDYsMTAwLDIyLDEwMCw3LDEwMCwKKyAgICA4LDEzMiwxLDEzMSwxLDkwLDgsMTAxLDYsMTAwLDksMTAwLDEwLDEzMiwwLDEzMSwKKyAgICAxLDkwLDksMTAxLDQsMTAwLDExLDEwMCwxMiwxMzIsMCwxMzEsMSw5MCwxMCwxMDEsCisgICAgNiwxMDAsMTMsMTAwLDE0LDEzMiwwLDEzMSwxLDkwLDExLDEwMSw2LDEwMSwxMiwxMDAsCisgICAgMTUsMTAwLDE2LDEzMiwwLDEzMSwxLDEzMSwxLDkwLDEzLDEwMSw2LDEwMSwxMiwxMDAsCisgICAgMTcsMTAwLDE4LDEzMiwwLDEzMSwxLDEzMSwxLDkwLDE0LDEwMSw2LDEwMSwxMiwxMDAsCisgICAgMTksMTAwLDIwLDEzMiwwLDEzMSwxLDEzMSwxLDkwLDE1LDEwMCw0LDgzLDAsNDEsCisgICAgMjMsMjE4LDE0LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTE0LDEyMiwxNDIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwKKyAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwKKyAgICAxMDQsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsCisgICAgMTE2LDEwNSw5OSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiw5NywKKyAgICAxMTgsMTExLDEwNSwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsCisgICAgMTAsMzIsMzIsMzIsMzIsMTA1LDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwxMDEsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsMTI0LAorICAgIDAsMTA2LDEsMTMxLDEsODMsMCw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LAorICAgIDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsCisgICAgMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsCisgICAgMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsCisgICAgMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDIyLAorICAgIDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEwMiwxMTQsCisgICAgMTExLDEyMiwxMDEsMTEwLDQxLDYyLDQxLDIsMTE0LDM4LDAsMCwwLDExNCwxLDAsCisgICAgMCwwLDQxLDEsMjE4LDEsMTA5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDExLDAsMCwwLDExNCw4NiwwLDAsMCwyNTEsMiwwLDAsMTE1LAorICAgIDIsMCwwLDAsMCw3LDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwKKyAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLAorICAgIDExMiwxMTQsNzgsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCisgICAgNSwwLDAsMCw2NywwLDAsMCwxMTUsMzYsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTI0LDEsMTMxLDEsMTE0LDI4LDExNiwyLDEyNCwxLDEyNCwwLDEwMCwxLDEwMCwKKyAgICAyLDE0NCwxLDEzMSwyLDgzLDAsMTEwLDQsMTAwLDAsODMsMCwxMDAsMCw4MywKKyAgICAwLDQxLDMsNzgsMTE0LDEwMywwLDAsMCw5MCw2LDEwMiwxMTQsMTExLDEyMiwxMDEsCisgICAgMTEwLDQxLDMsMTE0LDQ2LDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsNzgsMCwKKyAgICAwLDAsNDEsNCwxMTQsMTQ4LDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsMTQ5LAorICAgIDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1MSwwLDAsMCw0LDMsMCwwLAorICAgIDExNSw2LDAsMCwwLDAsMiwxMCwxLDE4LDIsMTIyLDI0LDcwLDExNCwxMTEsCisgICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMTYsCisgICAgMCwxMDYsMSwxMjQsMSwxMzEsMSwxMTQsMTQsMTI0LDAsODMsMCwxMDAsMSw4MywKKyAgICAwLDQxLDIsMTIyLDkzLDcwLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwKKyAgICAxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLAorICAgIDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiwKKyAgICA4NSwxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwKKyAgICAxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw3OCw0MSwyLDExNCw0NiwwLDAsMCwxMTQsNzUsMCwwLDAsNDEsCisgICAgMywxMTQsMTQ4LDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsMTQ5LDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwKKyAgICAxNTIsMCwwLDAsMTEsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwKKyAgICAyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKKyAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwKKyAgICAwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsCisgICAgMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsCisgICAgOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwKKyAgICAxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwKKyAgICAxNDgsMCwwLDAsMTE0LDgyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMzQsMCwwLDAsMjAsMywwLAorICAgIDAsMTE1LDAsMCwwLDAsMTIyLDI4LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LAorICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsCisgICAgMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw2NiwwLDAsMCwxMjQsMCwKKyAgICAxMDYsMCwxMDYsMSwxMjUsMSwxMTYsMiwxMDYsMywxMjQsMSwxMzEsMSwxMTUsMzgsCisgICAgMTE2LDQsMTAwLDEsMTA2LDUsMTI0LDEsMTMxLDEsMTAwLDIsMTI0LDEsMTQ0LDEsCisgICAgMTMxLDEsMTMwLDEsMTE2LDYsMTE2LDIsMTA2LDcsMTI0LDEsMTMxLDIsMTI1LDIsCisgICAgMTE2LDgsMTI0LDIsMTI0LDAsMTA2LDksMTMxLDIsMSwwLDEwMCwwLDgzLDAsCisgICAgNDEsMyw3OCwxMjIsMjcsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwKKyAgICAzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTQsMTUsMCwwLDAsNDEsMTAsMTE0LDg5LDAsMCwwLDExNCwxNSwwLDAsCisgICAgMCwxMTQsNDYsMCwwLDAsMTE0LDc1LDAsMCwwLDExNCw3MCwwLDAsMCwKKyAgICAxMTQsMzgsMCwwLDAsMTE0LDU4LDAsMCwwLDIxOCwxNywxMDMsMTAxLDExNiw5NSwKKyAgICAxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMjE4LDQsMTAxLAorICAgIDEyMCwxMDEsOTksMTE0LDcsMCwwLDAsNDEsMywxMTQsODMsMCwwLDAsMTE0LAorICAgIDE1LDAsMCwwLDIxOCw0LDk5LDExMSwxMDAsMTAxLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMzUsMCwwLDAsMjQsMywKKyAgICAwLDAsMTE1LDEyLDAsMCwwLDAsMiw4LDEsMTAsMSwxMiwxLDgsCisgICAgMSwxMiwxLDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSwxMCwwLDAsMCwxMTYsMCwxMjQsMCwxMjQsMSwxMzEsCisgICAgMiw4MywwLDQxLDEsMTIyLDk1LDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTAyLDExNCwKKyAgICAxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKKyAgICAxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LAorICAgIDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwxMTQsODQsMCwwLDAsNDEsMiwxMTQsCisgICAgMTQ4LDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTQzLDAsMCwwLDMzLDMsMCwKKyAgICAwLDExNSwyLDAsMCwwLDAsNywxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICA3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LDAsCisgICAgMTA2LDEsMTI0LDEsMTMxLDEsODMsMCw0MSwxLDEyMiw0NSw4MiwxMDEsMTE2LDExNywKKyAgICAxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLAorICAgIDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLAorICAgIDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw0MSwyLDExNCw0NiwwLDAsMCwKKyAgICAxMTQsMTU5LDAsMCwwLDQxLDIsMTE0LDE0OCwwLDAsMCwxMTQsNzEsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDE1MywwLDAsMCw0MiwzLDAsMCwxMTUsMiwwLDAsMCwwLDQsCisgICAgMTIyLDIzLDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LAorICAgIDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsCisgICAgMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1NCw4MiwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAwLDExMSwzMiwxMTAsMTExLDExNiwzMiwKKyAgICAxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLAorICAgIDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNDgsMCwwLDAsMTE0LDcxLAogICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCi0gICAgMCwwLDIxOCw4LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDYyLDgsMCwwLDAsCi0gICAgMTE1LDk2LDAsMCwwLDYsMTcsNiwyLDEyLDgsMTIsNCwxOSwyMCw2LAotICAgIDIsNiwzLDIyLDQsMTksNjgsMTksMjEsMTksMTksMTIsMTksMTIsMTksMTIsCi0gICAgMTEsMTgsOCwxMiwxMSwxMiwxMiwxMiwxNiwxMiwzNiwxOSwyNywxOSwxMDEsMjQsCi0gICAgMjYsOSwzLDE4LDQ1LDE4LDYwLDEyLDE4LDEyLDE3LDEyLDI1LDEyLDI5LDEyLAotICAgIDIzLDEyLDE2LDE5LDczLDE5LDc3LDE5LDEzLDEyLDksMTIsOSwxNSw0MCwxMiwKLSAgICAxNyw2LDEsMTAsMiwxMiwyNywxMiw2LDE4LDI0LDEyLDMyLDEyLDE1LDI0LAotICAgIDM1LDEyLDcsMTIsNDcsCisgICAgMCwwLDExNCwxNTQsMCwwLDAsNDgsMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDEwLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwxLDEzMSwxLDgzLAorICAgIDAsNDEsMSwxMjIsNDYsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw4NCwxMTQsMTE3LDEwMSwKKyAgICAzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywKKyAgICAxMDMsMTAxLDQ2LDQxLDIsMTE0LDQ2LDAsMCwwLDkwLDE3LDEwNSwxMTUsOTUsMTAyLAorICAgIDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQxLDIsMTE0LAorICAgIDE0OCwwLDAsMCwxMTQsNzEsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEwNSwwLDAsMCw1NCwzLDAsCisgICAgMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDI1LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCisgICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDQxLDIsNzgsNzgsNDEsMSw3OCw0MSwxNiwxMTQsMSwwLDAsCisgICAgMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwKKyAgICAxMTQsMTU1LDAsMCwwLDExNCw4NiwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwKKyAgICAxNTEsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsMTM0LDAsMCwwLDExNCwxMzUsCisgICAgMCwwLDAsMTE0LDE0MywwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE1MywwLAorICAgIDAsMCwxMTQsMTU0LDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDExNCwxNTcsMCwwLDAsMjQyLDIsMCwwLDExNSwzMCwwLDAsMCw4LDcsCisgICAgNCwyLDEyLDksMiwxLDEyLDYsMiwxLDEyLDgsMTIsNCwxMiw5LAorICAgIDEyLDksMiwxLDE0LDUsMiwxLDE0LDUsMiwxLDExNCwxNTcsMCwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsMzIsMCwwLDAsMTAxLDAsOTAsMSwxMDAsCisgICAgMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsCisgICAgNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDgzLDAsNDEsNywyMTgsMTgsOTUsCisgICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwxMjAsCisgICAgMTE2LDEyMiwzNiw2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiwzMiwxMDksOTcsMTEwLDk3LDEwMywKKyAgICAxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAxLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwKKyAgICAwLDExNiwwLDEwNiwxLDEzMSwwLDEsMCwxMDAsMSw4MywwLDQxLDIsMTIyLAorICAgIDI0LDY1LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwxMDcsNDYsNzgsNDEsMiwxMTQsNDYsMCwwLAorICAgIDAsMTE0LDE0MiwwLDAsMCw0MSwxLDExNCwyNiwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNDgsMCwwLAorICAgIDAsNjcsMywwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwyOCw5NSw3MywKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDc2LDExMSw5OSwxMDcsNjcsMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsCisgICAgNDYsOTUsOTUsMTAxLDExMCwxMTYsMTAxLDExNCw5NSw5NSw5OSw0LDAsMCwwLDAsCisgICAgMCwwLDAsNCwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAxMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxLDAsMTAwLDEsODMsMCwKKyAgICA0MSwyLDEyMiw2MCw4MiwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDMyLDExNCwxMDEsMTAzLDk3LAorICAgIDExNCwxMDAsMTA4LDEwMSwxMTUsMTE1LDMyLDExMSwxMDIsMzIsOTcsMTEwLDEyMSwzMiwxMTQsOTcsCisgICAgMTA1LDExNSwxMDEsMTAwLDMyLDEwMSwxMjAsOTksMTAxLDExMiwxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LAorICAgIDc4LDQxLDIsMTE0LDQ2LDAsMCwwLDExNCw0NywwLDAsMCw0MSw0LDExNCwKKyAgICAyNiwwLDAsMCw5MCw4LDEwMSwxMjAsOTksOTUsMTE2LDEyMSwxMTIsMTAxLDkwLDksCisgICAgMTAxLDEyMCw5OSw5NSwxMTgsOTcsMTA4LDExNywxMDEsOTAsMTMsMTAxLDEyMCw5OSw5NSwxMTYsCisgICAgMTE0LDk3LDk5LDEwMSw5OCw5Nyw5OSwxMDcsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUwLDAsMCwwLDcxLDMsMCwwLAorICAgIDExNSwyLDAsMCwwLDAsMiwxMjIsMjcsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICA3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMjAsCisgICAgMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLDAsMCwwLDExNCwwLDAsMCwKKyAgICAwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwwLDExNCw0OCwwLDAsMCwKKyAgICAxMTQsNTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNjIsMCwwLDAsNjMsMywKKyAgICAwLDAsMTE1LDYsMCwwLDAsOCwyLDQsMiw4LDQsMTE0LDE2MiwwLAorICAgIDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw0LAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw2NCwwLDAsMCwxMjQsMSwxMDYsMCwKKyAgICAxMDAsMSwxMjQsMiwxMDAsMiwyNCwwLDEzMSwyLDEyNSwzLDExNiwxLDEyNCwzLAorICAgIDEzMSwxLDEyNCwyLDEwNywwLDExNCwzNiwxMTYsMiwxMDAsMywxMzEsMSwxMzAsMSwKKyAgICAxMjQsMywxMDAsNCwyNSwwLDEyNSw0LDEyNCwwLDExNCw2MCwxMDAsNSwxMDYsMywKKyAgICAxMjQsNCwxMjQsMCwxMzEsMiw4MywwLDEyNCw0LDgzLDAsNDEsNiwxMjIsNTAsCisgICAgODIsMTAxLDExNSwxMTEsMTA4LDExOCwxMDEsMzIsOTcsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwKKyAgICAxMTgsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExNiwKKyAgICAxMTEsMzIsOTcsMTEwLDMyLDk3LDk4LDExNSwxMTEsMTA4LDExNywxMTYsMTAxLDMyLDExMSwxMTAsCisgICAgMTAxLDQ2LDExNCwxMTcsMCwwLDAsMTE0LDMzLDAsMCwwLDEyMiw1MCw5NywxMTYsCisgICAgMTE2LDEwMSwxMDksMTEyLDExNiwxMDEsMTAwLDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5OCwxMDEsMTIxLDExMSwxMTAsMTAwLDMyLDExNiwKKyAgICAxMTEsMTEyLDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAorICAgIDExNCwxOSwwLDAsMCwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsNDEsNCwyMTgsNiwKKyAgICAxMTQsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMywxMDgsMTAxLDExMCwyMTgsMTAsODYsOTcsMTA4LAorICAgIDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwzOCwwLDAsMCw0MSw1LDExNCwxNSwKKyAgICAwLDAsMCwyMTgsNywxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMjE4LDUsMTA4LDEwMSwKKyAgICAxMTgsMTAxLDEwOCw5MCw0LDk4LDEwNSwxMTYsMTE1LDkwLDQsOTgsOTcsMTE1LDEwMSwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTMsCisgICAgOTUsMTE0LDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDk1LDExMCw5NywxMDksMTAxLDc2LDMsMCwKKyAgICAwLDExNSwxMCwwLDAsMCwwLDIsMTYsMSwxMiwxLDgsMSw4LDEsCisgICAgMTE0LDE2OCwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMjQsCisgICAgMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsMywxMjQsMywxMDAsMCwxMDcsCisgICAgOCwxMTQsMjQsMTAwLDAsODMsMCwxMTYsMSwxMjQsMSwxMjQsMywxMzEsMiw4MywKKyAgICAwLDQxLDEsNzgsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwKKyAgICA0MSw0LDIxOCw2LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCwxNSwwLDAsMCwxMTQsCisgICAgMTQ5LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LAorICAgIDExNSwxMTIsMTAxLDk5LDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw4NSwzLDAsMCwxMTUsCisgICAgOCwwLDAsMCwwLDMsMTIsMSw4LDEsNCwxLDExNCwxNzAsMCwwLAorICAgIDAsOTksMywwLDAsMCwwLDAsMCwwLDEwLDAsMCwwLDI3LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwyNDQsMCwwLDAsMTE2LDAsMTA2LDEsMTI1LAorICAgIDMsMTI0LDMsMTAwLDEsMTA3LDgsMTE0LDIyLDExNiwyLDEwMCwyLDEzMSwxLDEzMCwKKyAgICAxLDEyNCwzLDExNSwzOCwxMTYsMywxMDYsNCwxMDAsMywxMTYsNSwxMzEsMiwxLAorICAgIDAsMTI0LDAsMTE2LDAsMTA2LDYsMTA3LDYsMTI1LDQsMTIwLDE5MCwxMjQsMyw2OCwKKyAgICAwLDkzLDE3OCwxMjUsNSwxMTYsNywxMzEsMCwxNDMsNzIsMSwwLDEyMSwxMCwxMjQsCisgICAgNSwxMDYsOCwxMjUsNiw4NywwLDExMCw0Miw0LDAsMTE2LDksMTA3LDEwLDExNCwKKyAgICAxMTgsMSwwLDEsMCwxLDAsMTE2LDEwLDEyNCw1LDEyNCwwLDEyNCwxLDEzMSwKKyAgICAzLDEyNSw3LDEyNCw3LDEwMCwxLDEwNyw4LDExNCwxMTQsMTE5LDU0LDg5LDAsMTEwLAorICAgIDE0LDg4LDAsMTI0LDYsMTI0LDAsMTI0LDEsMTI0LDIsMTMxLDMsMTI1LDcsODcsCisgICAgMCwxMDAsMSw4MSwwLDgyLDAsODgsMCwxMjQsNywxMDAsMSwxMDcsOSwxMTQsCisgICAgNTQsMTI0LDQsMTIsMCwxMTQsMjI4LDEyNCwwLDExNiwwLDEwNiw2LDEwNyw2LDExNCwKKyAgICAyMjgsMTE2LDAsMTA2LDYsMTI0LDAsMjUsMCwxMjUsOCwxMjEsMTAsMTI0LDgsMTA2LAorICAgIDExLDEyNSw5LDg3LDAsMTEwLDIwLDQsMCwxMTYsOSwxMDcsMTAsMTE0LDIwNiwxLAorICAgIDAsMSwwLDEsMCwxMjQsNyw4MywwLDg4LDAsMTI0LDksMTAwLDEsMTA3LAorICAgIDgsMTE0LDIyMiwxMjQsNyw4MywwLDExMywyMzIsMTI0LDksODMsMCwxMTMsNTQsMTI0LAorICAgIDcsODMsMCwxMTMsNTQsODcsMCwxMDAsMSw4MywwLDEwMCwxLDgzLDAsNDEsCisgICAgNCwxMjIsMjEsNzAsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMzksMTE1LDMyLDExNSwxMTIsMTAxLDk5LDQ2LDc4LDEyMiw1MywxMTUsMTIxLDExNSw0NiwxMDksCisgICAgMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLAorICAgIDQ0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsMTA1LDExNSwzMiwxMDgsMTA1LDEwNywxMDEsCisgICAgMTA4LDEyMSwzMiwxMTUsMTA0LDExNywxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDEwMCwxMTEsMTE5LDExMCwKKyAgICAxMjIsMjIsMTE1LDEyMSwxMTUsNDYsMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LDExNiwxMDQsMzIsCisgICAgMTA1LDExNSwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDEyLDExNCwxNCwwLDAsMCwyMTgsCisgICAgOSwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsNzAsMCwwLDAsMTE0LAorICAgIDEzOCwwLDAsMCwxMTQsMTM5LDAsMCwwLDIxOCwxMyw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE0LDc5LDAsMCwwLDExNCwxNjIsMCwKKyAgICAwLDAsMTE0LDE1MSwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDE3MCwwLDAsCisgICAgMCwxMTQsODksMCwwLDAsNDEsMTAsMTE0LDE1LDAsMCwwLDExNCwxNDksMCwKKyAgICAwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMTcxLDAsMCwwLDkwLDksMTA1LDExNSwKKyAgICA5NSwxMTQsMTAxLDEwOCwxMTEsOTcsMTAwLDExNCwxNjksMCwwLDAsMTE0LDE1MSwwLDAsCisgICAgMCwxMTQsODIsMCwwLDAsMTE0LDgzLDAsMCwwLDExNCw4OSwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCisgICAgMTAsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk0LDMsMCwwLDExNSwKKyAgICA1NCwwLDAsMCwwLDIsNiwxLDgsMiw4LDMsNCwxLDEyLDUsCisgICAgMTAsMSwxMCwxLDgsMSwyLDEsMTAsMSwxNCwxLDEyLDEsOCwxLAorICAgIDgsMiwyMiwxLDgsMiwxNiwxLDEwLDEsMiwxLDEwLDEsMTQsNCwKKyAgICA2LDIsOCwxLDYsMiw2LDIsOCwyLDExNCwxNzMsMCwwLDAsOTksCisgICAgMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNCwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTQwLDAsMCwwLDExNiwwLDEyNCwwLDExNiwxLDEzMSwKKyAgICAyLDExNSwyOCwxMTYsMiwxMDAsMSwxMDYsMywxMTYsNCwxMjQsMCwxMzEsMSwxMzEsCisgICAgMSwxMzEsMSwxMzAsMSwxMjQsMiwxMDAsMiwxMDcsMCwxMTQsNDQsMTE2LDUsMTAwLAorICAgIDMsMTMxLDEsMTMwLDEsMTI0LDIsMTAwLDIsMTA3LDQsMTE0LDExNCwxMTYsMCwxMjQsCisgICAgMSwxMTYsMSwxMzEsMiwxMTUsNzIsMTE2LDIsMTAwLDQsMTMxLDEsMTMwLDEsMTEwLAorICAgIDQyLDEyNCwxLDExNSw4NiwxMTYsNiwxMDAsNSwxMzEsMSwxMzAsMSwxMTAsMjgsMTI0LAorICAgIDEsMTE2LDcsMTA2LDgsMTA3LDcsMTE0LDExNCwxMDAsNiwxMjUsMywxMTYsOSwxMjQsCisgICAgMywxMDYsMywxMjQsMSwxMzEsMSwxMzEsMSwxMzAsMSwxMjQsMCwxMiwwLDExNCwKKyAgICAxMzYsMTI0LDIsMTAwLDIsMTA3LDIsMTE0LDEzNiwxMTYsNSwxMDAsNywxMzEsMSwxMzAsCisgICAgMSwxMDAsOCw4MywwLDQxLDksMTIyLDI4LDg2LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsCisgICAgOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDM0LDExNSwKKyAgICA5NywxMTAsMTAxLDM0LDQ2LDEyMiwzMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsCisgICAgMTA5LDEwMSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDExNSwxMTYsMTE0LDQ0LDMyLAorICAgIDExMCwxMTEsMTE2LDMyLDEyMywxMjUsMTE0LDE5LDAsMCwwLDEyMiwxOCwxMDgsMTAxLDExOCwKKyAgICAxMDEsMTA4LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsNjIsNjEsMzIsNDgsMTIyLAorICAgIDMxLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMTAsMTExLDExNiwKKyAgICAzMiwxMTUsMTAxLDExNiwzMiwxMTYsMTExLDMyLDk3LDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLAorICAgIDEyMiw1NCw5NywxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwxMDEsMTAwLDMyLDExNCwxMDEsMTA4LDk3LAorICAgIDExNiwxMDUsMTE4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsCisgICAgMzIsMTEwLDExMSwzMiwxMDcsMTEwLDExMSwxMTksMTEwLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsCisgICAgMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDEyMiw2MSw4MCw5NywxMTQsMTAxLDExMCwxMTYsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTEwLDExMSwxMTYsCisgICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCw0NCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsCisgICAgMTEyLDEwMSwxMTQsMTAyLDExMSwxMTQsMTA5LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMjIsMTcsNjksMTA5LDExMiwxMTYsMTIxLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDc4LDQxLDEwLDIxOCwxMCwxMDUsCisgICAgMTE1LDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDIxOCwzLDExNSwxMTYsMTE0LDIxOCw5LAorICAgIDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMzgsMCwwLDAsMTE0LDEzLAorICAgIDAsMCwwLDExNCwxNjUsMCwwLDAsMTE0LDcwLDAsMCwwLDExNCwxNCwwLAorICAgIDAsMCwxMTQsNzksMCwwLDAsMjE4LDExLDgzLDEyMSwxMTUsMTE2LDEwMSwxMDksNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDQxLDQsMTE0LDE1LDAsMCwwLDExNCwxNjYsMCwwLDAsCisgICAgMTE0LDE2NywwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMyw5NSwxMTUsOTcsMTEwLDEwNSwKKyAgICAxMTYsMTIxLDk1LDk5LDEwNCwxMDEsOTksMTA3LDE0MSwzLDAsMCwxMTUsMjgsMCwwLAorICAgIDAsMCwyLDEwLDEsMTgsMSw4LDEsOCwxLDgsMSwxMCwxLDEwLAorICAgIDEsNCwxLDEwLDIsMTAsMSw0LDIsMTQsMSwxNCwxLDExNCwxNzgsMCwKKyAgICAwLDAsMTIyLDE2LDc4LDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsCisgICAgMTA5LDEwMSwxMDAsMzIsMTIyLDQsMTIzLDMzLDExNCwxMjUsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDgsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDIyNCwwLDAsMCwxMDAsMCwxMjUsMiwxMjQsMCwxMDYsMCwxMDAsMSwxMzEsMSwKKyAgICAxMDAsMiwyNSwwLDEyNSwzLDEyNCwzLDExNCwxMzYsMTI0LDMsMTE2LDEsMTA2LDIsCisgICAgMTA3LDcsMTE0LDQyLDExNiwzLDEyNCwxLDEyNCwzLDEzMSwyLDEsMCwxMjQsMCwKKyAgICAxMTYsMSwxMDYsMiwxMDcsNiwxMTQsNjIsMTE2LDEsMTA2LDIsMTI0LDAsMjUsMCwKKyAgICA4MywwLDExNiwxLDEwNiwyLDEyNCwzLDI1LDAsMTI1LDQsMTIxLDEwLDEyNCw0LAorICAgIDEwNiw0LDEyNSwyLDg3LDAsMTEwLDUyLDQsMCwxMTYsNSwxMDcsMTAsMTE0LDEzNCwKKyAgICAxLDAsMSwwLDEsMCwxMTYsNiwxMDAsMywyMywwLDEwNiw3LDEyNCwwLAorICAgIDEyNCwzLDEzMSwyLDEyNSw1LDExNiw4LDEyNCw1LDEwMCw0LDEyNCwwLDE0NCwxLAorICAgIDEzMSwxLDEwMCwwLDEzMCwyLDg5LDAsMTEwLDIsODgsMCwxMTYsOSwxMjQsMCwKKyAgICAxMjQsMiwxMzEsMiwxMjUsNiwxMjQsNiwxMDAsMCwxMDcsOCwxMTQsMTc2LDExNiw4LAorICAgIDExNiw2LDEwNiw3LDEyNCwwLDEzMSwxLDEwMCw0LDEyNCwwLDE0NCwxLDEzMSwxLAorICAgIDEzMCwxLDExMCw4LDExNiwxMCwxMjQsNiwxMzEsMSwxMjUsNywxMjQsMywxMTQsMjIwLAorICAgIDExNiwxLDEwNiwyLDEyNCwzLDI1LDAsMTI1LDQsMTE2LDExLDEyNCw0LDEyNCwwLAorICAgIDEwNiwwLDEwMCwxLDEzMSwxLDEwMCw1LDI1LDAsMTI0LDcsMTMxLDMsMSwwLAorICAgIDEyNCw3LDgzLDAsNDEsNiw3OCwxMTQsMTE3LDAsMCwwLDExNCwxOSwwLDAsCisgICAgMCwxMjIsMjMsNTksMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwKKyAgICAzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLDExNCwKKyAgICAxMzcsMCwwLDAsNDEsMTIsMTE0LDExOCwwLDAsMCwxMTQsMTQsMCwwLDAsCisgICAgMTE0LDc5LDAsMCwwLDExNCw1OCwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwKKyAgICA5MCwwLDAsMCwyMTgsOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsMzgsCisgICAgMCwwLDAsMTE0LDcwLDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDE0NiwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsNywKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMTQsMTQ5LDAsMCwwLDExNCwxMTksMCwwLAorICAgIDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTQsMTQ0LDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsODMsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDIzLAorICAgIDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywKKyAgICAxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNjQsMywwLDAsMTE1LDQyLDAsMCwwLAorICAgIDAsMSw0LDEsMTQsMSw0LDEsMTAsMSwxMCwyLDEwLDEsMTAsMSwKKyAgICAxMCwxLDIsMSwxMCwxLDE0LDEsMTYsMSwyMiwxLDEwLDEsOCwxLAorICAgIDIyLDIsOCwxLDQsMiwxMCwxLDIyLDEsMTE0LDE4MSwwLDAsMCw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxMCwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMzAsMCwwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTQzLAorICAgIDEyLDEsMCwxMTYsMSwxMjQsMCwxMjQsMSwxMzEsMiw4MywwLDgxLDAsODIsCisgICAgMCw4OCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNTQsNzAsMTA1LDExMCwxMDAsMzIsCisgICAgOTcsMTEwLDEwMCwzMiwxMDgsMTExLDk3LDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw0NCwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LAorICAgIDQ2LDc4LDQxLDIsMTE0LDQyLDAsMCwwLDExNCwxODEsMCwwLDAsNDEsMiwKKyAgICAxMTQsMTUsMCwwLDAsMTE0LDE4MCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTQsOTUsMTAyLDEwNSwxMTAsMTAwLAorICAgIDk1LDk3LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTkxLDMsMCwwLDExNSw0LDAsCisgICAgMCwwLDAsMiwxMCwxLDExNCwxODIsMCwwLDAsMTE0LDE5LDAsMCwwLAorICAgIDk5LDMsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDQsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDEyMiwwLDAsMCwxMTYsMCwxMjQsMCwxMjQsMSwKKyAgICAxMjQsMiwxMzEsMywxLDAsMTI0LDIsMTAwLDEsMTA3LDQsMTE0LDMyLDExNiwxLAorICAgIDEyNCwwLDEyNCwxLDEyNCwyLDEzMSwzLDEyNSwwLDExNiwyLDEwNiwzLDEzMSwwLAorICAgIDEsMCwxMjQsMCwxMTYsNCwxMDYsNSwxMDcsNywxMTQsNjAsMTE2LDYsMTI0LDAsCisgICAgMTE2LDcsMTMxLDIsODMsMCwxMTYsNCwxMDYsNSwxMjQsMCwyNSwwLDEyNSwzLAorICAgIDEyNCwzLDEwMCwyLDEwNyw4LDExNCwxMTAsMTE2LDIsMTA2LDgsMTMxLDAsMSwwLAorICAgIDEwMCwzLDEwNiw5LDEyNCwwLDEzMSwxLDEyNSw0LDExNiwxMCwxMjQsNCwxMDAsNCwKKyAgICAxMjQsMCwxNDQsMSwxMzEsMSwxMzAsMSwxMTYsMTEsMTI0LDAsMTMxLDEsMSwwLAorICAgIDEyNCwzLDgzLDAsNDEsNSw5Nyw1MCwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwKKyAgICAzMiwxMDUsMTE2LDExNSwzMiwxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsMTA4LDEwOCwzMiwKKyAgICAxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDksOTcsMTAwLAorICAgIDEwMSwzMiwxMDIsMTE0LDExMSwxMDksNDQsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDk3LDEwMCwxMDYsMTE3LDExNSwxMTYsMTA5LDEwMSwxMTAsMTE2LAorICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTAzLDExNCwxMDEsOTcsMTE2LDEwMSwxMTUsMTE2LDMyLDk5LDExMSwxMDksCisgICAgMTA5LDExMSwxMTAsMzIsMTAwLDEwMSwxMTAsMTExLDEwOSwxMDUsMTEwLDk3LDExNiwxMTEsMTE0LDMyLAorICAgIDExMSwxMDIsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwxMDUsMTE2LDEyMSwKKyAgICAxMCwzMiwzMiwzMiwzMiw5OCwxMDEsMTE2LDExOSwxMDEsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5NywxMTAsMTAwLDMyLDk1LAorICAgIDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDQ2LDMyLDg0LDEwNCwxMDUsMTE1LDMyLAorICAgIDEwNSwxMTAsOTksMTA4LDExNywxMDAsMTAxLDExNSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsCisgICAgMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMDIsMTAsCisgICAgMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDAsCisgICAgMTA1LDEwMCwzMiwxMTAsMTExLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTksMCwKKyAgICAwLDAsNzgsMTIyLDQwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExMSwxMDIsMzIsMTIzLAorICAgIDEyNSwzMiwxMDQsOTcsMTA4LDExNiwxMDEsMTAwLDU5LDMyLDc4LDExMSwxMTAsMTAxLDMyLDEwNSwKKyAgICAxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDExNCwxNSwwLAorICAgIDAsMCw0MSwxMiwxMTQsMTc4LDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LDQ2LAorICAgIDAsMCwwLDExNCwxNDIsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCw3OSwwLAorICAgIDAsMCwxMTQsMTgyLDAsMCwwLDIxOCwxMSw5NSwxMDMsOTksMTAwLDk1LDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDExNCw0NywwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDcwLAorICAgIDAsMCwwLDExNCw1NiwwLDAsMCw0MSw1LDExNCwxNSwwLDAsMCwxMTQsCisgICAgMTY2LDAsMCwwLDExNCwxNjcsMCwwLDAsMTE0LDgzLDAsMCwwLDExNCw2NywKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMTgzLDAsMCwwLDE5NywzLDAsMCwxMTUsMjgsMCwwLDAsCisgICAgMCw5LDEyLDEsOCwxLDEyLDEsOCwxLDEwLDEsMTAsMSwxMCwxLAorICAgIDgsMSw4LDEsNCwxLDYsMSwxNCwxLDgsMSwxMTQsMTgzLDAsMCwKKyAgICAwLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDE3LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxNzgsMCwwLDAsMTE2LDAsMTI0LDAsMTAwLAorICAgIDEsMTMxLDIsMTE0LDE3NCwxMDAsMiwxMjQsMSwxMDcsNiwxMTQsNTgsMTE2LDEsMTI0LAorICAgIDEsMTMxLDEsMTI1LDEsMTI0LDEsMTA2LDIsMTAwLDIsMTMxLDEsMSwwLDExNiwKKyAgICAwLDEyNCwwLDEwMCwzLDEzMSwyLDExNCw1OCwxMjQsMSwxMDYsMywxMjQsMCwxMDYsCisgICAgNCwxMzEsMSwxLDAsMTIwLDExNCwxMjQsMSw2OCwwLDkzLDEwNiwxMjUsMywxMTYsCisgICAgMCwxMjQsMCwxMjQsMywxMzEsMiwxMTUsNjQsMTAwLDQsMTA2LDUsMTI0LDAsMTA2LAorICAgIDYsMTI0LDMsMTMxLDIsMTI1LDQsMTIxLDE0LDExNiw3LDEyNCwyLDEyNCw0LDEzMSwKKyAgICAyLDEsMCw4NywwLDExMyw2NCw0LDAsMTE2LDgsMTA3LDEwLDExNCwxNjgsMSwKKyAgICAwLDEyNSw1LDEsMCwxMjIsMzQsMTE2LDksMTI0LDUsMTMxLDEsMTA2LDEwLDExNiwKKyAgICAxMSwxMzEsMSwxMTQsMTUwLDEyNCw1LDEwNiwxMiwxMjQsNCwxMDcsMiwxMTQsMTUwLDExOSwKKyAgICA2NCwxMzAsMCw4NywwLDg5LDAsMTAwLDUsMTAwLDUsMTI1LDUsMTI2LDUsODgsCisgICAgMCwxMTMsNjQsODgsMCwxMTMsNjQsODcsMCwxMjQsMCw4MywwLDQxLDYsMTIyLAorICAgIDIzOCw3MCwxMDUsMTAzLDExNywxMTQsMTAxLDMyLDExMSwxMTcsMTE2LDMyLDExOSwxMDQsOTcsMTE2LAorICAgIDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDMyLDExNSwxMDQsMTExLDExNywKKyAgICAxMDgsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMzIsMTEyLDk3LDExNCw5NywKKyAgICAxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsMzIsOTksOTcsMTA4LDEwOCw5NywKKyAgICA5OCwxMDgsMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsOTcsMTA3LDEwMSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDQ2LDMyLDczLDExNiwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsCisgICAgMzIsMTE2LDExMSwzMiwxMDAsMTAxLDk5LDExMSwxMTcsMTEyLDEwOCwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywKKyAgICAxMTUsMTE1LDExNywxMDksMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSwKKyAgICA5OCwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LAorICAgIDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwNSwxMTUsCisgICAgMzIsMTAwLDEwMSwxMTUsMTA1LDExNCwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCwKKyAgICAxMjcsMCwwLDAsMjUwLDEsNDIsMjE4LDcsOTUsOTUsOTcsMTA4LDEwOCw5NSw5NSwKKyAgICAxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsNzgsNDEsMTMsMTE0LDQsMCwwLDAsMTE0LAorICAgIDEyNiwwLDAsMCwyMTgsNiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwyMTgsNiwxMDEsMTIwLAorICAgIDExNiwxMDEsMTEwLDEwMCwxMTQsMTg1LDAsMCwwLDExNCwzOCwwLDAsMCwxMTQsMSwKKyAgICAwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDcwLDAsMCwwLDExNCwxNzUsMCwKKyAgICAwLDAsMTE0LDY0LDAsMCwwLDIxOCwxNSw5NSw2OSw4Miw4Miw5NSw3Nyw4MywKKyAgICA3MSw5NSw4MCw4Miw2OSw3MCw3Myw4OCwxMTQsMTUsMCwwLDAsNDEsNiwxMTQsCisgICAgODMsMCwwLDAsMjE4LDgsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwxMTQsMTgwLAorICAgIDAsMCwwLDIxOCwxLDEyMCw5MCw5LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LAorICAgIDEwMSw5MCwzLDEwMSwxMjAsOTksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMjE4LDE2LDk1LDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsOTUsMTAyLAorICAgIDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwyMjEsMywwLDAsMTE1LDM0LDAsMCwwLAorICAgIDAsMTAsMTAsMSw4LDEsOCwxLDEwLDEsMTAsMSwxMiwxLDEwLDEsCisgICAgMTAsMSwxNCwxLDIsMSwxNCwxLDE2LDQsMTQsMSwxMCwxLDIsMSwKKyAgICAyNCwxLDExNCwxOTEsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsMTU0LDAsMCwKKyAgICAwLDEyNCwwLDEwNiwwLDEwMCwxLDEzMSwxLDEyNSwxLDEyNCwwLDEwNiwwLDEwMCwKKyAgICAyLDEzMSwxLDEyNSwyLDEyNCwxLDEwMCwzLDEwNyw5LDExNCw4NiwxMjQsMiwxMDAsCisgICAgMywxMDcsOSwxMTQsODAsMTI0LDEsMTI0LDIsMTA2LDEsMTA3LDMsMTE0LDgwLDExNiwKKyAgICAyLDEwNiwzLDEwMCw0LDEyNCwxLDE1NSwyLDEwMCw1LDEyNCwyLDEwNiwxLDE1NSwKKyAgICAyLDEwMCw2LDE1Nyw1LDExNiw0LDEwMCw3LDEwMCw4LDE0NCwxLDEzMSwyLDEsCisgICAgMCwxMjQsMSw4MywwLDExMCw2NCwxMjQsMiwxMDAsMywxMDcsOSwxMTQsMTAyLDEyNCwKKyAgICAyLDEwNiwxLDgzLDAsMTEwLDQ4LDExNiwyLDEwNiwzLDEwMCw5LDExNiw0LDEwMCwKKyAgICA3LDEwMCw4LDE0NCwxLDEzMSwyLDEsMCwxMjQsMCwxMDAsMTAsMjUsMCwxMjUsCisgICAgMSwxMDAsMTEsMTI0LDAsMTA3LDcsMTE0LDE1MCwxMjQsMSwxMDYsNSwxMDAsMTIsMTMxLAorICAgIDEsMTAwLDEzLDI1LDAsMTI1LDEsMTI0LDEsODMsMCw0MSwxNCwxMjIsMTY3LDY3LAorICAgIDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE5LDEwNCw5NywxMTYsMzIsOTUsOTUsCisgICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLAorICAgIDMyLDk4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LAorICAgIDk3LDEwMywxMDEsOTUsOTUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDMsMTE3LDk3LAorICAgIDExNCw5NywxMTAsMTE2LDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwxMDEsCisgICAgMTAyLDEwNSwxMTAsMTAxLDEwMCwzMiwxMTEsMTE0LDMyLDk5LDExMSwxMTcsMTA4LDEwMCwzMiw5OCwKKyAgICAxMDEsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiw3OCwxMTEsMTEwLDEwMSwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMTYsMTExLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDMyLDExNiwKKyAgICAxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMTE1LDMyLDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDMyLDExOCwKKyAgICA5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTMwLDAsMCwwLDExNCw4OSwwLDAsMCwKKyAgICA3OCwxMjIsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDMzLAorICAgIDYxLDMyLDk1LDk1LDExNSwxMTIsMTAxLDk5LDk1LDk1LDQ2LDExMiw5NywxMTQsMTAxLDExMCwKKyAgICAxMTYsMzIsNDAsMTIyLDQsMzIsMzMsNjEsMzIsMjUwLDEsNDEsMTE0LDEzNiwwLDAsCisgICAgMCwyMzMsMywwLDAsMCwxMjIsODksOTksOTcsMTEwLDM5LDExNiwzMiwxMTQsMTAxLAorICAgIDExNSwxMTEsMTA4LDExOCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDEwMiwxMTQsCisgICAgMTExLDEwOSwzMiw5NSw5NSwxMTUsMTEyLDEwMSw5OSw5NSw5NSwzMiwxMTEsMTE0LDMyLDk1LAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSw0NCwzMiwxMDIsOTcsMTA4LDEwOCwKKyAgICAxMDUsMTEwLDEwMywzMiw5OCw5Nyw5OSwxMDcsMzIsMTExLDExMCwzMiw5NSw5NSwxMTAsOTcsCisgICAgMTA5LDEwMSw5NSw5NSwzMiw5NywxMTAsMTAwLDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDk1LDExNCwxLDAsMCwwLDExNCwxMjcsMCwwLDAsMTE0LDExNywwLDAsMCwKKyAgICAxMTQsMTksMCwwLDAsNDEsNiwxMTQsMzAsMCwwLDAsMTE0LDExOSwwLDAsCisgICAgMCwxMTQsMTM4LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE3MiwwLDAsMCwKKyAgICAxMTQsMTE4LDAsMCwwLDQxLDMsMjE4LDcsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwKKyAgICAxMTQsMTY2LDAsMCwwLDExNCw4MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsOTksOTcsMTA4LDk5LAorICAgIDk1LDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwyNTMsMywwLDAsCisgICAgMTE1LDMwLDAsMCwwLDAsNywxMCwxLDEwLDEsOCwxLDE4LDEsMjIsCisgICAgMiwxMiwxLDYsMSw4LDEsOCwyLDYsMiwxMiwxLDgsMSw4LAorICAgIDEsMTQsMSwxMTQsMTk1LDAsMCwwLDk5LDUsMCwwLDAsMCwwLDAsCisgICAgMCw5LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDE3MCwwLAorICAgIDAsMCwxMjQsNCwxMDAsMSwxMDcsMiwxMTQsMTgsMTE2LDAsMTI0LDAsMTMxLDEsCisgICAgMTI1LDUsMTEwLDM2LDEyNCwxLDEwMCwyLDEwNyw5LDExNCwzMCwxMjQsMSwxMTAsMiwKKyAgICAxMDUsMCwxMjUsNiwxMTYsMSwxMjQsNiwxMzEsMSwxMjUsNywxMTYsMCwxMjQsMCwKKyAgICAxMjQsNywxMjQsNCwxMzEsMywxMjUsNSwxMjQsMywxMTUsMTU0LDEyNCw0LDEwMCwxLAorICAgIDEwNywyLDExNCw4NiwxMTYsMCwxMjQsMCwxMDYsMiwxMDAsMywxMzEsMSwxMDAsMSwKKyAgICAyNSwwLDEzMSwxLDgzLDAsMTEzLDE2NiwxMjQsMCwxMTUsOTYsMTI0LDUsODMsMCwKKyAgICAxMTMsMTY2LDExNiwzLDEyNCwwLDEzMSwxLDExNiwzLDEyNCwwLDEwNiwyLDEwMCwzLAorICAgIDEzMSwxLDEwMCwxLDI1LDAsMTMxLDEsMjQsMCwxMjUsOCwxMTYsNCwxMDYsNSwKKyAgICAxMjQsNSwxMDYsNiwxMDAsMiwxMTYsMywxMjQsNSwxMDYsNiwxMzEsMSwxMjQsOCwKKyAgICAyNCwwLDEzMywyLDI1LDAsMjUsMCw4MywwLDExMCwxMiwxMTYsNywxMjQsNSwKKyAgICAxMjQsMywxMTYsMCwxMzEsMyw4MywwLDEwMCwyLDgzLDAsNDEsNCw5NywyMTUsCisgICAgMSwwLDAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDM5LDEwMywxMDgsCisgICAgMTExLDk4LDk3LDEwOCwxMTUsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLAorICAgIDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA1LDExMCwxMDIsMTAxLDExNCwKKyAgICAzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDEwNSwxMTUsMzIsMTExLDk5LDk5LDExNywxMTQsMTE0LDEwNSwxMTAsMTAzLDMyLDEwMiwKKyAgICAxMTQsMTExLDEwOSwxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwKKyAgICAxMDEsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDExNSw0NiwzMiw4NCwxMDQsMTAxLDMyLDM5LDEwOCwxMTEsOTksOTcsMTA4LDExNSwzOSwKKyAgICAzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMDUsMTAzLDExMCwKKyAgICAxMTEsMTE0LDEwMSwxMDAsNDYsMzIsODQsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzOSwxMDIsCisgICAgMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsMTE2LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLAorICAgIDExNiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTE1LDMyLDExOSwxMDQsOTcsMTE2LAorICAgIDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMzIsOTcsMTE1LAorICAgIDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsMzIsMTExLDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMCwzMiwzMiwzMiwzMiw5OCwxMDEsCisgICAgMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMiw0MCwxMDEsNDYsCisgICAgMTAzLDQ2LDMyLDk2LDk2LDEwMiwxMTQsMTExLDEwOSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw2MCwxMDIsMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsCisgICAgMTE2LDYyLDk2LDk2LDQxLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTA4LDEwMSwxMTgsCisgICAgMTAxLDEwOCwzOSwxMCwzMiwzMiwzMiwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsCisgICAgMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTYsMTExLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKKyAgICAxMDUsMTEwLDMyLDk3LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDk2LAorICAgIDk2LDEwMiwxMTQsMTExLDEwOSwzMiw0Niw0NiwxMTIsMTA3LDEwMywzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwzMiwxMDksMTExLDEwMCw5Niw5NiwzMiwxMTksMTExLDExNywxMDgsMTAwLDMyLDEwNCwKKyAgICA5NywxMTgsMTAxLDMyLDk3LDMyLDM5LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzksMzIsMTExLDEwMiwKKyAgICAzMiw1MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTksMCwwLDAsNzgsCisgICAgMTE0LDExNywwLDAsMCw0MSw4LDExNCwxODMsMCwwLDAsMTE0LDE5NSwwLDAsCisgICAgMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwxNjQsMCwwLAorICAgIDAsMTE0LDE0LDAsMCwwLDExNCw3OSwwLDAsMCwxMTQsMSwwLDAsMCwKKyAgICAxMTQsMTkxLDAsMCwwLDQxLDksMTE0LDE1LDAsMCwwLDExNCwxOTQsMCwwLAorICAgIDAsMjE4LDYsMTA4LDExMSw5OSw5NywxMDgsMTE1LDExNCwxODksMCwwLDAsMTE0LDE2NywKKyAgICAwLDAsMCwxMTQsODMsMCwwLDAsOTAsOCwxMDMsMTA4LDExMSw5OCw5NywxMDgsCisgICAgMTE1LDk1LDExNCwxNjYsMCwwLDAsOTAsNyw5OSwxMTcsMTE2LDk1LDExMSwxMDIsMTAyLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKKyAgICAxMCw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw5NSwyNCw0LDAsMCwxMTUsCisgICAgMjYsMCwwLDAsMCwxMSw4LDEsMTAsMiwxNiwxLDgsMSwxMiwxLAorICAgIDQsMyw4LDEsMjAsMSw0LDEsNiw0LDI2LDMsMzIsMiwxMTQsMTk4LAorICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLDExNiwwLDEwNiwKKyAgICAxLDEyNCwwLDEzMSwxLDEyNSwxLDEyNCwxLDEwMCwwLDEwNyw4LDExNCwzMCwxMTYsCisgICAgMiwxMDAsMSwxMjQsMCwyMywwLDEzMSwxLDEzMCwxLDExNiwzLDEyNCwxLDEzMSwKKyAgICAxLDgzLDAsNDEsMiw3OCwxMjIsMjUsMTEwLDExMSwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsCisgICAgNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsCisgICAgMzIsNDEsNCwxMTQsMTQ3LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDcwLDAsCisgICAgMCwwLDExNCwxNDYsMCwwLDAsNDEsMiwxMTQsMTUsMCwwLDAsMTE0LDgyLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDIxOCwxOCw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDIsMTE0LDExMSwKKyAgICAxMDksOTUsMTEwLDk3LDEwOSwxMDEsNTksNCwwLDAsMTE1LDgsMCwwLDAsMCwKKyAgICAxLDEwLDEsOCwxLDEyLDEsMTE0LDE5OSwwLDAsMCw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMTIsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDI0NCwwLDAsMCwxMjQsMSw5NywwLDEyNCwwLDk3LDEsMTE2LDIsCisgICAgMTE2LDEsMTMxLDEsMTI1LDIsMTIwLDg2LDExNiwxLDEwNiwzLDEwNiw0LDEzMSwwLAorICAgIDY4LDAsOTMsNzIsOTIsMiwxMjUsMywxMjUsNCwxMTYsNSwxMjQsNCwxMjQsMiwKKyAgICAxMzEsMiwxMTQsMjgsMTI0LDMsMTE2LDEsMTA2LDYsMTA3LDYsMTE0LDYyLDExNiw3LAorICAgIDEyNSw1LDExMCwxOCwxMTYsMCwxMDYsOCwxMjQsMywxMzEsMSwxMTQsMjgsMTE2LDksCisgICAgMTI1LDUsMTEwLDIsMTEzLDI4LDExNiwxMCwxMjQsNCwxMjQsNSwxMzEsMiwxMjUsNiwKKyAgICAxMTYsMTEsMTI0LDYsMTI0LDQsMTMxLDIsMSwwLDExMywyOCw4NywwLDExNiwxLAorICAgIDEwNiwzLDExNiwxMiwyNSwwLDEyNSw3LDEyMCw1NCwxMDAsNSw2OCwwLDkzLDQ2LAorICAgIDEyNSw4LDEyNCw4LDExNiwxLDEwNiwzLDEwNyw3LDExNCwxNDQsMTE2LDEzLDEyNCw4LAorICAgIDEzMSwxLDEyNSw5LDExMCwxMCwxMTYsMSwxMDYsMywxMjQsOCwyNSwwLDEyNSw5LAorICAgIDExNiwxNCwxMjQsNywxMjQsOCwxMjQsOSwxMzEsMywxLDAsMTEzLDEyMCw4NywwLAorICAgIDEyMSwxMiwxMTYsMTMsMTAwLDIsMTMxLDEsMTI1LDEwLDg3LDAsMTEwLDI0LDQsMCwKKyAgICAxMTYsMTUsMTA3LDEwLDExNCwyMDYsMSwwLDEsMCwxLDAsMTAwLDMsMTI1LDEwLAorICAgIDg5LDAsMTEwLDIsODgsMCwxMTYsMTQsMTI0LDcsMTAwLDIsMTI0LDEwLDEzMSwzLAorICAgIDEsMCwxMTYsMTMsMTAwLDQsMTMxLDEsMTI1LDExLDExNiwxNCwxMjQsNywxMDAsNCwKKyAgICAxMjQsMTEsMTMxLDMsMSwwLDEwMCwzLDgzLDAsNDEsNiwxMjIsMjUwLDgzLDEwMSwKKyAgICAxMTYsMTE3LDExMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLAorICAgIDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLAorICAgIDMyLDExNiwxMDQsMTAxLDEwOSwxMCwzMiwzMiwzMiwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsCisgICAgOTcsOTksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDExNSwzMiwxMTUsMTIxLDExNSwKKyAgICAzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwKKyAgICAxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5Nyw5OSw5OSwxMDEsMTE1LAorICAgIDExNSwzMiw5NywxMTAsMTAwLDMyLDk1LDEwNSwxMDksMTEyLDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwKKyAgICAxMDEsMTAwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDgsMTExLDk3LDEwMCwzMiw5OCwxMTcsMTA1LAorICAgIDEwOCwxMTYsNDUsMTA1LDExMCwxMCwzMiwzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTUsNDQsMzIsMTE2LDEwNCwxMTEsMTE1LDEwMSwzMiwxMTYsMTE5LDExMSwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMDEsMTIwLDExMiwKKyAgICAxMDgsMTA1LDk5LDEwNSwxMTYsMTA4LDEyMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDMyLDEwNSwKKyAgICAxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDEzOCwwLDAsMCwxMTQsMjAsMCwKKyAgICAwLDAsNzgsMTE0LDU1LDAsMCwwLDQxLDEsMTIyLDksOTUsMTE5LDk3LDExNCwKKyAgICAxMTAsMTA1LDExMCwxMDMsMTE1LDQxLDE2LDExNCw0NiwwLDAsMCwxMTQsMTQsMCwwLAorICAgIDAsMTE0LDEzLDAsMCwwLDExNCw3OSwwLDAsMCwyMTgsNSwxMDUsMTE2LDEwMSwKKyAgICAxMDksMTE1LDExNCwxNzQsMCwwLDAsMTE0LDY5LDAsMCwwLDExNCwxNDcsMCwwLAorICAgIDAsMTE0LDc1LDAsMCwwLDExNCwxNTcsMCwwLDAsMTE0LDEyOCwwLDAsMCwKKyAgICAxMTQsMTMzLDAsMCwwLDExNCwxLDAsMCwwLDExNCwxOTksMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDcwLDAsMCwwLDQxLDEyLDIxOCwxMCwxMTUsMTIxLDExNSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTgsMTEsOTUsMTA1LDEwOSwxMTIsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTAsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE2LDEyMSwxMTIsCisgICAgMTAxLDExNCwxNSwwLDAsMCwxMTQsODMsMCwwLDAsMTE0LDkzLDAsMCwwLAorICAgIDExNCw4MiwwLDAsMCw5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTAsMTIsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsCisgICAgOTAsMTQsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwKKyAgICAxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsNiwKKyAgICA5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDY2LDQsMCwwLDExNSw1MCwwLDAsMCwwLAorICAgIDksNCwxLDQsMyw4LDEsMjAsMSwxMCwxLDEwLDEsNiwxLDEwLAorICAgIDEsNiwyLDIsMSwxMCwxLDE0LDMsMTAsMSwxMCwxLDEwLDEsMTAsCisgICAgMiwxMCwxLDE2LDMsMiwxLDEyLDEsMTQsMiwxMCwxLDEyLDMsOCwKKyAgICAxLDExNCwyMDMsMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDMsCisgICAgMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNjYsMCwwLDAsCisgICAgMTE2LDAsMTI0LDAsMTI0LDEsMTMxLDIsMSwwLDExNiwxLDEwNiwyLDEwNiwzLAorICAgIDExNiw0LDEzMSwxLDEsMCwxMTYsMSwxMDYsMiwxMDYsMywxMTYsNSwxMzEsMSwKKyAgICAxLDAsMTAwLDEsMTAwLDIsMTA4LDYsMTI1LDIsMTI0LDIsOTcsNywxMjQsMiwKKyAgICAxMDYsOCwxMTYsMSwxMDYsOSwxMTYsMTAsMjUsMCwxMzEsMSwxLDAsMTAwLDIsCisgICAgODMsMCw0MSwzLDEyMiw1MCw3MywxMTAsMTE1LDExNiw5NywxMDgsMTA4LDMyLDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwKKyAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAorICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDExNCwxOSwwLDAsMCw3OCw0MSwxMSwKKyAgICAxMTQsMjAzLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTcxLDAsMCwwLDExNCwKKyAgICAxMDksMCwwLDAsMTE0LDE0NywwLDAsMCwxMTQsMTU3LDAsMCwwLDIxOCwyNiwKKyAgICA5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwxMTQsMTE1LDAsMCwwLDIxOCwKKyAgICA4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDExNCw3OSwwLDAsMCwxMTQsMSwKKyAgICAwLDAsMCw0MSwzLDExNCwyMDEsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsCisgICAgMjA0LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDExNCwyMDUsMCwwLDAsMTEzLDQsMCwwLDExNSwxMiwwLDAsCisgICAgMCwwLDIsMTAsMiwxMiwxLDEyLDMsOCwxLDQsMSwxMTQsMjA1LDAsCisgICAgMCwwLDQxLDIsNzgsNzgsNDEsMSw3OCw0MSwyLDc4LDExNCwxOSwwLDAsCisgICAgMCw0MSw1MCwxMTQsMywwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMiwwLAorICAgIDAsMCwxMTQsMTYsMCwwLDAsMTE0LDUxLDAsMCwwLDExNCwyOSwwLDAsCisgICAgMCwxMTQsMzYsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwxOCwwLDAsMCwKKyAgICAxMTQsNDEsMCwwLDAsMTE0LDQyLDAsMCwwLDExNCw0NSwwLDAsMCwxMTQsCisgICAgNTYsMCwwLDAsMTE0LDU4LDAsMCwwLDExNCw2OCwwLDAsMCwxMTQsNzQsCisgICAgMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw4NCwwLDAsMCwxMTQsOTUsMCwKKyAgICAwLDAsMTE0LDk2LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDc4LDAsMCwKKyAgICAwLDIxOCw2LDExMSw5OCwxMDYsMTAxLDk5LDExNiw5MCw5LDk1LDgwLDc5LDgwLDg1LAorICAgIDc2LDY1LDg0LDY5LDExNCwxMjgsMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsMTQxLAorICAgIDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LDE0NSwwLAorICAgIDAsMCwxMTQsMTQ2LDAsMCwwLDExNCw4MSwwLDAsMCwxMTQsMTQ3LDAsMCwKKyAgICAwLDExNCwxNTcsMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTY4LDAsMCwwLAorICAgIDExNCwxNzAsMCwwLDAsMTE0LDE3MywwLDAsMCwxMTQsMTc4LDAsMCwwLDExNCwKKyAgICAxODgsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxODIsCisgICAgMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxOTUsMCwKKyAgICAwLDAsMTE0LDE5OCwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwyMDMsMCwwLAorICAgIDAsMTE0LDIwNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNjIsOCwwLDAsMCwxMTUsOTQsMCwwLDAsNCwxNyw0LAorICAgIDIsOCw4LDgsNyw0LDIsNCwzLDE2LDQsMTQsNjgsMTQsMjEsMTQsCisgICAgMTksOCwxOSw4LDE5LDgsMTEsMTQsOCw4LDExLDgsMTIsOCwxNiw4LAorICAgIDM2LDE0LDI3LDE0LDEwMSwxNiwyNiw2LDMsMTAsNDUsMTQsNjAsOCwxOCw4LAorICAgIDE3LDgsMjUsOCwyOSw4LDIzLDgsMTYsMTQsNzMsMTQsNzcsMTQsMTMsOCwKKyAgICA5LDgsOSwxMCw0Nyw4LDIwLDQsMSw4LDIsOCwyNyw4LDYsMTAsCisgICAgMjQsOCwzMiw4LDI3LDE4LDM1LDgsNyw4LDQ3LAogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaCBiL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAppbmRleCAyN2Q3YzhhLi5hNzkwMTJmIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKKysrIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCkBAIC0xLDEwMDQgKzEsOTE1IEBACiAvKiBBdXRvLWdlbmVyYXRlZCBieSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIF9QeV9NX19pbXBvcnRsaWJfZXh0ZXJuYWxbXSA9IHsKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3LDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwyNDQsMiwwLDAsMTAwLDAsMCw5MCwwLDAsCi0gICAgMTAwLDk2LDAsOTAsMSwwLDEwMCw5NywwLDkwLDIsMCwxMDEsMiwwLDEwMSwKLSAgICAxLDAsMjMsOTAsMywwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLAotICAgIDQsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsNiwwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsCi0gICAgOCwwLDEwMCwxNCwwLDEwMCwxNSwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxNiwKLSAgICAwLDEwMCwxNywwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTgsMCwxMDAsMTksMCwKLSAgICAxMzIsMCwwLDkwLDExLDAsMTAwLDIwLDAsMTAwLDIxLDAsMTMyLDAsMCw5MCwKLSAgICAxMiwwLDEwMCwyMiwwLDEwMCwyMywwLDEwMCwyNCwwLDEzMiwxLDAsOTAsMTMsCi0gICAgMCwxMDEsMTQsMCwxMDEsMTMsMCwxMDYsMTUsMCwxMzEsMSwwLDkwLDE2LDAsCi0gICAgMTAwLDI1LDAsMTA2LDE3LDAsMTAwLDI2LDAsMTAwLDI3LDAsMTMxLDIsMCwxMDAsCi0gICAgMjgsMCwyMyw5MCwxOCwwLDEwMSwxOSwwLDEwNiwyMCwwLDEwMSwxOCwwLDEwMCwKLSAgICAyNywwLDEzMSwyLDAsOTAsMjEsMCwxMDAsMjksMCw5MCwyMiwwLDEwMCwzMCwKLSAgICAwLDkwLDIzLDAsMTAwLDMxLDAsMTAzLDEsMCw5MCwyNCwwLDEwMCwzMiwwLAotICAgIDEwMywxLDAsOTAsMjUsMCwxMDEsMjUsMCw0LDkwLDI2LDAsOTAsMjcsMCwKLSAgICAxMDAsMzMsMCwxMDAsMzQsMCwxMDAsMzMsMCwxMDAsMzUsMCwxMDAsMzYsMCwxMzIsCi0gICAgMSwxLDkwLDI4LDAsMTAwLDM3LDAsMTAwLDM4LDAsMTMyLDAsMCw5MCwyOSwKLSAgICAwLDEwMCwzOSwwLDEwMCw0MCwwLDEzMiwwLDAsOTAsMzAsMCwxMDAsNDEsMCwKLSAgICAxMDAsNDIsMCwxMzIsMCwwLDkwLDMxLDAsMTAwLDQzLDAsMTAwLDQ0LDAsMTMyLAotICAgIDAsMCw5MCwzMiwwLDEwMCw0NSwwLDEwMCw0NiwwLDEwMCw0NywwLDEwMCw0OCwKLSAgICAwLDEzMiwwLDEsOTAsMzMsMCwxMDAsNDksMCwxMDAsNTAsMCwxMzIsMCwwLAotICAgIDkwLDM0LDAsMTAwLDUxLDAsMTAwLDUyLDAsMTMyLDAsMCw5MCwzNSwwLDEwMCwKLSAgICAzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCw1MywwLDEwMCw1NCwwLDEzMiwzLAotICAgIDAsOTAsMzYsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsNTUsMCwKLSAgICAxMDAsNTYsMCwxMzIsMywwLDkwLDM3LDAsMTAwLDU3LDAsMTAwLDU3LDAsMTAwLAotICAgIDU4LDAsMTAwLDU5LDAsMTMyLDIsMCw5MCwzOCwwLDEwMCw2MCwwLDEwMCw2MSwKLSAgICAwLDEzMiwwLDAsOTAsMzksMCwxMDEsNDAsMCwxMzEsMCwwLDkwLDQxLDAsCi0gICAgMTAwLDMzLDAsMTAwLDYyLDAsMTAwLDMzLDAsMTAwLDYzLDAsMTAxLDQxLDAsMTAwLAotICAgIDY0LDAsMTAwLDY1LDAsMTMyLDEsMiw5MCw0MiwwLDcxLDEwMCw2NiwwLDEwMCwKLSAgICA2NywwLDEzMiwwLDAsMTAwLDY3LDAsMTMxLDIsMCw5MCw0MywwLDcxLDEwMCwKLSAgICA2OCwwLDEwMCw2OSwwLDEzMiwwLDAsMTAwLDY5LDAsMTMxLDIsMCw5MCw0NCwKLSAgICAwLDcxLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwwLDAsMTAwLDcxLDAsMTAxLDQ0LAotICAgIDAsMTMxLDMsMCw5MCw0NSwwLDcxLDEwMCw3MiwwLDEwMCw3MywwLDEzMiwwLAotICAgIDAsMTAwLDczLDAsMTMxLDIsMCw5MCw0NiwwLDcxLDEwMCw3NCwwLDEwMCw3NSwKLSAgICAwLDEzMiwwLDAsMTAwLDc1LDAsMTAxLDQ2LDAsMTAxLDQ1LDAsMTMxLDQsMCwKLSAgICA5MCw0NywwLDcxLDEwMCw3NiwwLDEwMCw3NywwLDEzMiwwLDAsMTAwLDc3LDAsCi0gICAgMTAxLDQ2LDAsMTAxLDQ0LDAsMTMxLDQsMCw5MCw0OCwwLDEwMywwLDAsOTAsCi0gICAgNDksMCw3MSwxMDAsNzgsMCwxMDAsNzksMCwxMzIsMCwwLDEwMCw3OSwwLDEwMSwKLSAgICA0NiwwLDEwMSw0NCwwLDEzMSw0LDAsOTAsNTAsMCw3MSwxMDAsODAsMCwxMDAsCi0gICAgODEsMCwxMzIsMCwwLDEwMCw4MSwwLDEzMSwyLDAsOTAsNTEsMCw3MSwxMDAsCi0gICAgODIsMCwxMDAsODMsMCwxMzIsMCwwLDEwMCw4MywwLDEzMSwyLDAsOTAsNTIsCi0gICAgMCw3MSwxMDAsODQsMCwxMDAsODUsMCwxMzIsMCwwLDEwMCw4NSwwLDEzMSwyLAotICAgIDAsOTAsNTMsMCw3MSwxMDAsODYsMCwxMDAsODcsMCwxMzIsMCwwLDEwMCw4NywKLSAgICAwLDEzMSwyLDAsOTAsNTQsMCwxMDAsMzMsMCwxMDAsODgsMCwxMDAsODksMCwKLSAgICAxMzIsMSwwLDkwLDU1LDAsMTAwLDkwLDAsMTAwLDkxLDAsMTMyLDAsMCw5MCwKLSAgICA1NiwwLDEwMCw5MiwwLDEwMCw5MywwLDEzMiwwLDAsOTAsNTcsMCwxMDAsOTQsCi0gICAgMCwxMDAsOTUsMCwxMzIsMCwwLDkwLDU4LDAsMTAwLDMzLDAsODMsNDEsOTgsCi0gICAgOTcsOTQsMSwwLDAsNjcsMTExLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTAsMTAsCi0gICAgODQsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw3OCwKLSAgICA3OSw4NCwzMiwxMDksMTAxLDk3LDExMCwxMTYsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLAotICAgIDEwNSwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsCi0gICAgMzMsMzIsNzMsMTE2LDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTAwLDEwMSwKLSAgICAxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTUsMTE3LDk5LDEwNCwxMCwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiwxMDUsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LAotICAgIDExNiwxMTQsOTcsMTEyLDExMiwxMDEsMTAwLDMyLDEwNSwxMTAsMTE2LDExMSwzMiw4MCwxMjEsMTE2LAotICAgIDEwNCwxMTEsMTEwLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLAotICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiw0NiwzMiw2NSwxMTUsMTAsMTE1LDExNyw5OSwxMDQsMzIsMTA1LDExNiwzMiwKLSAgICAxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTA2LAotICAgIDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLAotICAgIDEwNSw5OSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NywKLSAgICAxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsCi0gICAgMTAxLDExNCwzMiwxMTYsMTExLDEwLDExOSwxMTEsMTE0LDEwNyw0NiwzMiw3OSwxMTAsMTAxLDMyLAotICAgIDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDExNywxMTUsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTcsOTgsMTA4LAotICAgIDEwNSw5OSw0NSwxMDIsOTcsOTksMTA1LDExMCwxMDMsMzIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsCi0gICAgMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDQ2LDEwLDEwLDIxOCwzLDExOSwxMDUsMTEwLDIxOCw2LDk5LDEyMSwxMDMsMTE5LDEwNSwxMTAsCi0gICAgMjE4LDYsMTAwLDk3LDExNCwxMTksMTA1LDExMCw5OSwwLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsMTE1LDg4LDAsCi0gICAgMCwwLDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDExNiwzLDAsMTMxLDEsCi0gICAgMCwxMTQsNzIsMCwxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMTYsNCwwLAotICAgIDEzMSwxLDAsMTE0LDQ1LDAsMTAwLDEsMCwxMzcsMCwwLDExMCw2LDAsMTAwLAotICAgIDIsMCwxMzcsMCwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMywwLDEwMCw0LAotICAgIDAsMTM0LDAsMCwxMjUsMCwwLDExMCwxMiwwLDEwMCw1LDAsMTAwLDQsMCwKLSAgICAxMzIsMCwwLDEyNSwwLDAsMTI0LDAsMCw4Myw0MSw2LDc4LDkwLDEyLDgwLAotICAgIDg5LDg0LDcyLDc5LDc4LDY3LDY1LDgzLDY5LDc5LDc1LDExNSwxMiwwLDAsMCwKLSAgICA4MCw4OSw4NCw3Miw3OSw3OCw2Nyw2NSw4Myw2OSw3OSw3NSw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDE5LDAsMCwKLSAgICAwLDExNSwxMywwLDAsMCwxMzYsMCwwLDExNiwwLDAsMTA2LDEsMCwxMDcsCi0gICAgNiwwLDgzLDQxLDEsMTIyLDUzLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLAotICAgIDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwMSwxMDAsMzIsOTksOTcsMTE1LDEwMSw0NSwxMDUsMTEwLAotICAgIDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LDEwNSwxMTgsMTAxLDEwOCwxMjEsNDYsNDEsMiwyMTgsMywKLSAgICA5NSwxMTEsMTE1LDkwLDcsMTAxLDExMCwxMTgsMTA1LDExNCwxMTEsMTEwLDE2OSwwLDQxLDEsCi0gICAgMjE4LDMsMTA3LDEwMSwxMjEsMTE0LDQsMCwwLDAsMjUwLDM4LDYwLDEwMiwxMTQsMTExLAotICAgIDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsOTUsOTgsCi0gICAgMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LAotICAgIDEwOCw2MiwyMTgsMTEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsMzcsCi0gICAgMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwzNyw5NSwxMDksOTcsMTA3LAotICAgIDEwMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSw0Niw2MCwxMDgsMTExLAotICAgIDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwKLSAgICAxMDEsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAotICAgIDAsMCw4MywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMTIyLDUzLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCwKLSAgICA5NywxMDksMTAxLDExNSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDk5LDEwNCwxMDEsCi0gICAgOTksMTA3LDEwMSwxMDAsMzIsOTksOTcsMTE1LDEwMSw0NSwxMDUsMTEwLDExNSwxMDEsMTEwLDExNSwKLSAgICAxMDUsMTE2LDEwNSwxMTgsMTAxLDEwOCwxMjEsNDYsNzAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMTE0LDcsMCwwLDAsNDEsMCwwLDAsMTE1LDIsMCwwLDAsCi0gICAgMCwyLDQxLDUsMjE4LDMsMTE1LDEyMSwxMTUsMjE4LDgsMTEyLDEwOCw5NywxMTYsMTAyLAotICAgIDExMSwxMTQsMTA5LDIxOCwxMCwxMTUsMTE2LDk3LDExNCwxMTYsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsCi0gICAgMjcsOTUsNjcsNjUsODMsNjksOTUsNzMsNzgsODMsNjksNzgsODMsNzMsODQsNzMsCi0gICAgODYsNjksOTUsODAsNzYsNjUsODQsNzAsNzksODIsNzcsODMsMjE4LDM1LDk1LDY3LAotICAgIDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LAotICAgIDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDk1LDgzLDg0LDgyLDk1LDc1LDY5LAotICAgIDg5LDQxLDEsMTE0LDcsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsCi0gICAgNSwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTYsOTUsMTA5LDk3LDEwNywxMDEsCi0gICAgOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsMzAsMCwwLDAsMTE1LAotICAgIDE0LDAsMCwwLDAsMSwxOCwxLDE4LDEsOSwyLDYsMiwyMSw0LAotICAgIDEyLDMsMTE0LDEzLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwKLSAgICAwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLDEwMCwxLDAsNjQsMTA2LDEsCi0gICAgMCwxMDAsMiwwLDEwMCwzLDAsMTMxLDIsMCw4Myw0MSw0LDEyMiw0Miw2NywKLSAgICAxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywzMiw1MSw1MCw0NSw5OCwxMDUsMTE2LDMyLAotICAgIDEwNSwxMTAsMTE2LDEwMSwxMDMsMTAxLDExNCwzMiwxMTYsMTExLDMyLDEwOCwxMDUsMTE2LDExNiwxMDgsCi0gICAgMTAxLDQ1LDEwMSwxMTAsMTAwLDEwNSw5NywxMTAsNDYsMTA4LDMsMCwwLDAsMjU1LDEyNywKLSAgICAyNTUsMTI3LDMsMCwyMzMsNCwwLDAsMCwyMTgsNiwxMDgsMTA1LDExNiwxMTYsMTA4LAotICAgIDEwMSw0MSwyLDIxOCwzLDEwNSwxMTAsMTE2LDIxOCw4LDExNiwxMTEsOTUsOTgsMTIxLDExNiwKLSAgICAxMDEsMTE1LDQxLDEsMjE4LDEsMTIwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw2LDAsMCwwLDIxOCw3LDk1LDExOSw5NSwxMDgsMTExLDExMCwxMDMsNDcsCi0gICAgMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDExNCwxOSwwLDAsMCw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LAotICAgIDAsMCwxMDAsMSwwLDEzMSwyLDAsODMsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwKLSAgICAxMTgsMTAxLDExNCwxMTYsMzIsNTIsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsCi0gICAgMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLAotICAgIDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNiwxMDEsMTAzLDEwMSwxMTQsNDYsMTE0LDE1LDAsMCwKLSAgICAwLDQxLDIsMTE0LDE2LDAsMCwwLDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsCi0gICAgMTIxLDExNiwxMDEsMTE1LDQxLDEsOTAsOSwxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwKLSAgICAxMTUsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDcsOTUsMTE0LDk1LDEwOCwxMTEsMTEwLDEwMyw1MiwwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDIsMTE0LDIxLDAsMCwwLDk5LDAsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDMsMCwwLDAsNzEsMCwwLDAsMTE1LDI2LAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLAotICAgIDAsMCwxMjQsMCwwLDY4LDEzMSwxLDAsMTMxLDEsMCw4Myw0MSwzLDEyMiwKLSAgICAzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA2LDExMSwxMDUsMTEwLDQwLDQxLDQ2LAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAotICAgIDAsODMsMCwwLDAsMTE1LDM3LDAsMCwwLDEwMywwLDAsMTI0LDAsMCwKLSAgICA5MywyNywwLDEyNSwxLDAsMTI0LDEsMCwxMTQsNiwwLDEyNCwxLDAsMTA2LAotICAgIDAsMCwxMTYsMSwwLDEzMSwxLDAsMTQ1LDIsMCwxMTMsNiwwLDgzLDExNCwKLSAgICA0LDAsMCwwLDQxLDIsMjE4LDYsMTE0LDExNSwxMTYsMTE0LDEwNSwxMTIsMjE4LDE1LAotICAgIDExMiw5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDk3LDExNCw5NywxMTYsMTExLDExNCwxMTUsNDEsCi0gICAgMiwyMTgsMiw0Niw0OCwyMTgsNCwxMTIsOTcsMTE0LDExNiwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyNTAsMTAsNjAsMTA4LDEwNSwxMTUsCi0gICAgMTE2LDk5LDExMSwxMDksMTEyLDYyLDU5LDAsMCwwLDExNSwyLDAsMCwwLDksCi0gICAgMSwxMjIsMzAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA2LDExMSwxMDUsMTEwLDQ2LDYwLDEwOCwKLSAgICAxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsCi0gICAgNjIsNDEsMiwyMTgsOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTAxLDExMiwyMTgsNCwxMDYsCi0gICAgMTExLDEwNSwxMTAsNDEsMSwyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTEyLDk3LDExNCwxMTYsCi0gICAgMTE1LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCwxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNTcsMCwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCwyLDE1LDEsMTE0LDMwLDAsMCwwLDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDUsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDEzNCwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTMxLDEsCi0gICAgMCwxMDAsMSwwLDEwNywyLDAsMTE0LDUyLDAsMTI0LDAsMCwxMDYsMiwwLAotICAgIDExNiwzLDAsMTMxLDEsMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwKLSAgICAzLDAsMTI0LDEsMCwxMjQsMywwLDEwMiwyLDAsODMsMTIwLDY5LDAsMTE2LAotICAgIDQsMCwxMjQsMCwwLDEzMSwxLDAsNjgsOTMsNTUsMCwxMjUsNCwwLDEyNCwKLSAgICA0LDAsMTE2LDEsMCwxMDcsNiwwLDExNCw2NSwwLDEyNCwwLDAsMTA2LDUsCi0gICAgMCwxMjQsNCwwLDEwMCwyLDAsMTAwLDEsMCwxMzEsMSwxLDkyLDIsMCwKLSAgICAxMjUsMSwwLDEyNSwzLDAsMTI0LDEsMCwxMjQsMywwLDEwMiwyLDAsODMsCi0gICAgMTEzLDY1LDAsODcsMTAwLDMsMCwxMjQsMCwwLDEwMiwyLDAsODMsNDEsNCwKLSAgICAxMjIsMzIsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDExNSwxMTIsMTA4LDEwNSwxMTYsNDAsCi0gICAgNDEsNDYsMjMzLDEsMCwwLDAsOTAsOCwxMDksOTcsMTIwLDExNSwxMTIsMTA4LDEwNSwKLSAgICAxMTYsMjE4LDAsNDEsNiwyMTgsMywxMDgsMTAxLDExMCwxMTQsMjMsMCwwLDAsMjE4LAotICAgIDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyNywwLDAsMCwKLSAgICAyMTgsOCwxMTQsMTAxLDExOCwxMDEsMTE0LDExNSwxMDEsMTAwLDIxOCw2LDExNCwxMTUsMTEyLDEwOCwKLSAgICAxMDUsMTE2LDQxLDUsMjE4LDQsMTEyLDk3LDExNiwxMDQsOTAsNSwxMDIsMTE0LDExMSwxMTAsCi0gICAgMTE2LDIxOCwxLDk1LDIxOCw0LDExNiw5NywxMDUsMTA4LDExNCwxOCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExMiwxMDgsMTA1LDExNiw2MywwLDAsMCwxMTUsCi0gICAgMTYsMCwwLDAsMCwyLDE4LDEsMjQsMSwxMCwxLDE5LDEsMTIsMSwKLSAgICAyNywxLDE0LDEsMTE0LDQwLDAsMCwwLDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsODMsCi0gICAgNDEsMSwxMjIsMTI2LDgzLDExNiw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKLSAgICAxMDQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzcsOTcsMTAwLDEwMSwzMiw5NywzMiwxMTUsCi0gICAgMTAxLDExMiw5NywxMTQsOTcsMTE2LDEwMSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsCi0gICAgMzIsMTE2LDExMSwzMiwxMDksOTcsMTA3LDEwMSwzMiwxMDUsMTE2LDMyLDEwMSw5NywxMTUsMTA1LAotICAgIDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDEwNSwKLSAgICAxMTAsMzIsMTAxLDEyMCwxMTIsMTAxLDExNCwxMDUsMTA5LDEwMSwxMTAsMTE2LDExNSwxMCwzMiwzMiwKLSAgICAzMiwzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDk5LDk3LDk5LDEwNCwxMDEsMzIsMTE1LDExNiwKLSAgICA5NywxMTYsMzIsMTE0LDEwMSwxMTUsMTE3LDEwOCwxMTYsMTE1LDQxLDQ2LDEwLDEwLDMyLDMyLAotICAgIDMyLDMyLDQxLDIsMTE0LDMsMCwwLDAsOTAsNCwxMTUsMTE2LDk3LDExNiw0MSwKLSAgICAxLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNiwwLDAsMCwyMTgsMTAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywKLSAgICAxMTYsNzUsMCwwLDAsMTE1LDIsMCwwLDAsMCw3LDExNCw0MSwwLDAsCi0gICAgMCw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsNTgsMCwwLDAsMTIxLDE2LDAsMTE2LDAsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDIsMCw4NywxMTAsMjIsMCw0LDExNiwKLSAgICAxLDAsMTA3LDEwLDAsMTE0LDQwLDAsMSwxLDEsMTAwLDEsMCw4Myw4OSwKLSAgICAxMTAsMSwwLDg4LDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLDY0LDEyNCwxLAotICAgIDAsMTA3LDIsMCw4Myw0MSwzLDEyMiw0OSw4NCwxMDEsMTE1LDExNiwzMiwxMTksMTA0LAotICAgIDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LAotICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLAotICAgIDEwOSwxMTEsMTAwLDEwMSwzMiwxMTYsMTIxLDExMiwxMDEsNDYsNzAsMTA1LDAsMjQwLDAsMCwKLSAgICA0MSwzLDExNCw0MSwwLDAsMCwyMTgsNyw3OSw4Myw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMjE4LDcsMTE1LDExNiw5NSwxMDksMTExLDEwMCwxMDEsNDEsMywxMTQsMzcsMCwwLDAsCi0gICAgMjE4LDQsMTA5LDExMSwxMDAsMTAxLDkwLDksMTE1LDExNiw5NywxMTYsOTUsMTA1LDExMCwxMDIsCi0gICAgMTExLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCwxOCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwKLSAgICAxMTYsMTIxLDExMiwxMDEsODUsMCwwLDAsMTE1LDEwLDAsMCwwLDAsMiwzLAotICAgIDEsMTYsMSwxMywxLDksMSwxMTQsNDUsMCwwLDAsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTMsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCw4Myw0MSwyLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwKLSAgICAxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LAotICAgIDExNSwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDAsMTI4LDAsMCw0MSwxLDExNCw0NSwwLAotICAgIDAsMCw0MSwxLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsOTQsMCwwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAyLDExNCw0NiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwKLSAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzMSwwLDAsMCwKLSAgICAxMjQsMCwwLDExNSwxOCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEyNSwKLSAgICAwLDAsMTE2LDIsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwKLSAgICAyLDEyMiwzMCw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDAsMTA1LDExNCwKLSAgICA0NiwxMDUsMCw2NCwwLDAsNDEsMywxMTQsMywwLDAsMCwyMTgsNiwxMDMsCi0gICAgMTAxLDExNiw5OSwxMTksMTAwLDExNCw0NSwwLDAsMCw0MSwxLDExNCwzNywwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDAsMTA1LDExNCw5OSwwLDAsCi0gICAgMCwxMTUsNiwwLDAsMCwwLDIsNiwxLDEyLDEsMTE0LDQ4LDAsMCwKLSAgICAwLDEwNSwxODIsMSwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDYsCi0gICAgMCwwLDAsMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDE5MywwLDAsMCwKLSAgICAxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMTYsMSwwLDEyNCwwLDAsMTMxLAotICAgIDEsMCwxMzEsMiwwLDEyNSwzLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwzLAotICAgIDAsMTE2LDIsMCwxMDYsNCwwLDExNiwyLDAsMTA2LDUsMCw2NiwxMTYsMiwKLSAgICAwLDEwNiw2LDAsNjYsMTI0LDIsMCwxMDAsMiwwLDY0LDEzMSwzLDAsMTI1LAotICAgIDQsMCwxMjEsNjEsMCwxMTYsNywwLDEwNiw4LDAsMTI0LDQsMCwxMDAsMywKLSAgICAwLDEzMSwyLDAsMTQzLDIwLDAsMTI1LDUsMCwxMjQsNSwwLDEwNiw5LDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEsODcsMTAwLDQsMCw4MSw4Miw4OCwxMTYsMiwKLSAgICAwLDEwNiwxMCwwLDEyNCwzLDAsMTI0LDAsMCwxMzEsMiwwLDEsODcsMTEwLAotICAgIDU5LDAsNCwxMTYsMTEsMCwxMDcsMTAsMCwxMTQsMTg4LDAsMSwxLDEsMTIxLAotICAgIDE3LDAsMTE2LDIsMCwxMDYsMTIsMCwxMjQsMywwLDEzMSwxLDAsMSw4NywKLSAgICAxMTAsMTgsMCw0LDExNiwxMSwwLDEwNywxMCwwLDExNCwxODAsMCwxLDEsMSwKLSAgICA4OSwxMTAsMSwwLDg4LDEzMCwwLDAsODksMTEwLDEsMCw4OCwxMDAsNCwwLAotICAgIDgzLDQxLDUsMTIyLDE2Miw2NiwxMDEsMTE1LDExNiw0NSwxMDEsMTAyLDEwMiwxMTEsMTE0LDExNiwKLSAgICAzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMTksMTE0LDEwNSwKLSAgICAxMTYsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMTIsOTcsMTE2LAotICAgIDEwNCwzMiw5NywxMTYsMTExLDEwOSwxMDUsOTksOTcsMTA4LDEwOCwxMjEsNDYsMTAsMzIsMzIsCi0gICAgMzIsMzIsNjYsMTAxLDMyLDExMiwxMTQsMTAxLDExMiw5NywxMTQsMTAxLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMzIsOTcsMzIsNzAsMTA1LDEwOCwxMDEsNjksMTIwLAotICAgIDEwNSwxMTUsMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDEwMiwzMiw5OSwxMTEsMTEwLAotICAgIDk5LDExNywxMTQsMTE0LDEwMSwxMTAsMTE2LDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwKLSAgICAxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMDEsMTA5LDExMiwxMTEsCi0gICAgMTE0LDk3LDExNCwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMTE2LDExNiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTAxLDEwMCw0NiwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsMTA1LDE4MiwKLSAgICAxLDAsMCw5MCwyLDExOSw5OCw3OCw0MSwxMywyMTgsNiwxMDIsMTExLDExNCwxMDksCi0gICAgOTcsMTE2LDIxOCwyLDEwNSwxMDAsMTE0LDMsMCwwLDAsOTAsNCwxMTEsMTEyLDEwMSwKLSAgICAxMTAsOTAsNiw3OSw5NSw2OSw4OCw2Nyw3Niw5MCw3LDc5LDk1LDY3LDgyLDY5LAotICAgIDY1LDg0LDkwLDgsNzksOTUsODcsODIsNzksNzgsNzYsODksMjE4LDMsOTUsMTA1LAotICAgIDExMSwyMTgsNiw3MCwxMDUsMTA4LDEwMSw3Myw3OSwyMTgsNSwxMTksMTE0LDEwNSwxMTYsMTAxLAotICAgIDIxOCw3LDExNCwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTE0LDQyLDAsMCwwLDkwLDYsCi0gICAgMTE3LDExMCwxMDgsMTA1LDExMCwxMDcsNDEsNiwxMTQsMzcsMCwwLDAsMjE4LDQsMTAwLAotICAgIDk3LDExNiw5NywxMTQsNDQsMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTYsCi0gICAgMTA5LDExMiw5MCwyLDEwMiwxMDAsMjE4LDQsMTAyLDEwNSwxMDgsMTAxLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMyw5NSwxMTksMTE0LAotICAgIDEwNSwxMTYsMTAxLDk1LDk3LDExNiwxMTEsMTA5LDEwNSw5OSwxMDYsMCwwLDAsMTE1LDI2LAotICAgIDAsMCwwLDAsNSwyNCwxLDksMSwzMywxLDMsMywyMSwxLDIwLAotICAgIDEsMjAsMSwxMywxLDMsMSwxNywxLDEzLDEsNSwxLDExNCw1NywwLAotICAgIDAsMCwxMDUsMjMsMTMsMCwwLDIzMywyLDAsMCwwLDExNCwxNSwwLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LAotICAgIDk5LDEwNCwxMDEsOTUsOTUsMTIyLDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwKLSAgICAxMjIsNCw0NiwxMTIsMTIxLDk5LDc4LDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsCi0gICAgOTcsMTE2LDEwNSwxMTEsMTEwLDk5LDIsMCwwLDAsMSwwLDAsMCwxMSwwLAotICAgIDAsMCw2LDAsMCwwLDY3LDAsMCwwLDExNSw4NywxLDAsMCwxMjQsCi0gICAgMSwwLDEwMCwxLDAsMTA3LDksMCwxMTQsNzYsMCwxMTYsMCwwLDEwNiwxLAotICAgIDAsMTAwLDIsMCwxMTYsMiwwLDEzMSwyLDAsMSwxMjQsMiwwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsNTgsMCwxMDAsMywwLDEyNSwzLDAsMTE2LDMsMCwKLSAgICAxMjQsMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMSwwLDExNCw3MCwwLDEwMCwKLSAgICA0LDAsMTEwLDMsMCwxMDAsNSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMjQsNSwwLAotICAgIDEwNiw1LDAsMTAwLDYsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNiwwLDEyNSwKLSAgICA3LDAsMTI1LDgsMCwxMTYsNiwwLDEwNiw3LDAsMTA2LDgsMCwxMjUsOSwKLSAgICAwLDEyNCw5LDAsMTAwLDEsMCwxMDcsOCwwLDExNCwxNTQsMCwxMTYsOSwwLAotICAgIDEwMCw3LDAsMTMxLDEsMCwxMzAsMSwwLDEwMCw0LDAsMTA2LDEwLDAsMTI0LAotICAgIDYsMCwxMTQsMTcyLDAsMTI0LDYsMCwxMTAsMywwLDEyNCw4LDAsMTI0LDcsCi0gICAgMCwxMjQsOSwwLDEwMywzLDAsMTMxLDEsMCwxMjUsMTAsMCwxMjQsMiwwLAotICAgIDEwMCwxLDAsMTA3LDgsMCwxMTQsMjQxLDAsMTE2LDYsMCwxMDYsMTEsMCwxMDYsCi0gICAgMTIsMCwxMDAsOCwwLDEwNywyLDAsMTE0LDIyOSwwLDEwMCw0LDAsMTI1LDIsCi0gICAgMCwxMTAsMTIsMCwxMTYsNiwwLDEwNiwxMSwwLDEwNiwxMiwwLDEyNSwyLDAsCi0gICAgMTE2LDEzLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsCi0gICAgNCwwLDEwNywzLDAsMTE0LDYzLDEsMTI0LDIsMCwxMDYsMTQsMCwxMzEsMCwKLSAgICAwLDExNSw0MiwxLDExNiwxNSwwLDEwMCw5LDAsMTA2LDE2LDAsMTI0LDIsMCwKLSAgICAxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwxMDAsMTAsMCwxMDYsMTYsMCwxMjQsCi0gICAgMTAsMCwxMTYsMTcsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDEwLDAsMTE2LDE4LAotICAgIDAsMTI0LDQsMCwxMTYsMTksMCwxMjQsMTAsMCwxMTYsMjAsMCwxMDAsOCwwLAotICAgIDI1LDIzLDEzMSwzLDAsODMsNDEsMTEsOTcsMjU0LDIsMCwwLDcxLDEwNSwxMTgsCi0gICAgMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LAotICAgIDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwKLSAgICAxMTUsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsODQsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsCi0gICAgMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsCi0gICAgMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLAotICAgIDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwKLSAgICA5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsNDYsCi0gICAgMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsCi0gICAgMTE2LDEwMSwxMDAsMzIsOTcsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLAotICAgIDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE5LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwKLSAgICAxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExMiw5NywKLSAgICAxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiw5OSwxMTEsMTEwLDExNiwxMTQsMTExLDEwOCwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNCwxMDEsMTE1LDExNywxMDksMTAxLDEwMCwzMiwxMTEsMTEyLAotICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsCi0gICAgMzIsMTExLDEwMiwxMCwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwKLSAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsNzMsMTAyLDMyLDM5LDExMSwKLSAgICAxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExNSwzMiwKLSAgICAxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LAotICAgIDExNCwxMDUsMTEwLDEwMywzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMTAsMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5NywKLSAgICAxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTYsOTcsMTA3LDEwMSwxMTAsCi0gICAgMzIsOTcsMTEwLDEwMCwzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExNiwxMTEsCi0gICAgMzIsOTgsMTAxLDMyLDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LAotICAgIDMyLDQwLDEwMSwxMDgsMTE1LDEwMSwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLAotICAgIDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLAotICAgIDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLAotICAgIDEwMCw0NiwzMiw3MywxMDIsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwKLSAgICAxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICA0NCwxMCwzMiwzMiwzMiwzMiw5NywzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMTgsOTcsMTA4LAotICAgIDExNywxMDEsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsOTcsMTA5LDEwMSwzMiw5NywKLSAgICAxMTUsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLAotICAgIDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsOTcsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTE4LAotICAgIDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLAotICAgIDExMCwxMTYsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLAotICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLAotICAgIDM5LDQ5LDM5LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTUsMTIxLDExNSwKLSAgICA0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwKLSAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwKLSAgICAxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywKLSAgICAxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDcwLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLAotICAgIDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsCi0gICAgMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNTksMzIsMTE3LDExNSwxMDEsMzIsMzksMTExLAotICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTEwLDExNSwKLSAgICAxMTYsMTAxLDk3LDEwMCwxMjIsNTAsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwKLSAgICAxMTQsMTA1LDEwMCwxMDEsMzIsMTExLDExNCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsCi0gICAgMzIsMTE2LDExMSwzMiw3OCwxMTEsMTEwLDEwMSwxMTQsMzIsMCwwLDAsMTE0LDMxLDAsCi0gICAgMCwwLDIxOCwxLDQ2LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLAotICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwKLSAgICAxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMjMzLDAsMCwwLDAsCi0gICAgMTIyLDI0LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTA4LAotICAgIDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMTIyLDcsMTIzLDEyNSw0NiwxMjMsCi0gICAgMTI1LDEyMywxMjUsNDEsMjEsMjE4LDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LAotICAgIDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwxOCw2OCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMjE4LDksODQsMTIxLDExMiwxMDEsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDExNCw0MCwwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LAotICAgIDgsMCwwLDAsMjE4LDE0LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAotICAgIDExNiwxMDUsMTExLDExMCwyMTgsOSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMjE4LAotICAgIDE5LDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LAotICAgIDExNCwxMTQsMTExLDExNCwxMTQsMjgsMCwwLDAsMjE4LDUsMTAyLDEwOCw5NywxMDMsMTE1LAotICAgIDIxOCw4LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LAotICAgIDcsMTA1LDExNSw5NywxMDgsMTEwLDExNywxMDksMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LAotICAgIDExNCwxMTQsMTExLDExNCwxMTQsNDksMCwwLDAsMjE4LDQsOTUsNzksODAsODQsMTE0LAotICAgIDMwLDAsMCwwLDIxOCw4LDk1LDgwLDg5LDY3LDY1LDY3LDcyLDY5LDIxOCwxNywKLSAgICA2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSwKLSAgICA4Myw0MSwxMSwxMTQsMzcsMCwwLDAsOTAsMTQsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LAotICAgIDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMTE0LDU5LDAsMCwwLDIxOCw3LDEwOSwKLSAgICAxMDEsMTE1LDExNSw5NywxMDMsMTAxLDIxOCw0LDEwNCwxMDEsOTcsMTAwLDExNCwzOSwwLDAsCi0gICAgMCw5MCw0LDk4LDk3LDExNSwxMDEsMjE4LDMsMTE1LDEwMSwxMTIsMjE4LDQsMTE0LDEwMSwKLSAgICAxMTUsMTE2LDkwLDMsMTE2LDk3LDEwMyw5MCwxNSw5NywxMDgsMTA5LDExMSwxMTUsMTE2LDk1LAotICAgIDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsCi0gICAgMTE0LDExMSwxMDksOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyNTQsMCwwLDAsMTE1LDQ2LAotICAgIDAsMCwwLDAsMTgsMTIsMSw5LDEsNywxLDEyLDEsNiwxLDEyLAotICAgIDEsMTgsMSwxOCwxLDI0LDEsMTIsMSwxMiwxLDEyLDEsMzYsMSwxMiwKLSAgICAxLDE4LDEsOSwyLDEyLDEsMTIsMSwxMiwxLDEyLDEsMjEsMSwyMSwKLSAgICAxLDExNCw4MSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsOCwKLSAgICAwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw2MiwxLDAsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDMwLDAsMTE2LDMsMCwxMDAsMiwwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDEsMCwxMjUsMiwwLAotICAgIDExNiw0LDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsMCwxMjUsMSwwLDEyNSwKLSAgICAzLDAsMTI0LDMsMCwxMTYsNSwwLDEwNywzLDAsMTE0LDEwMiwwLDExNiw2LAotICAgIDAsMTAwLDMsMCwxMDYsNywwLDExNiw1LDAsMTI0LDAsMCwxMzEsMiwwLAotICAgIDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwNiw4LDAsMTAwLDQsMCwxMzEsCi0gICAgMSwwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMTEsMCwxMDcsNywwLDExNCwxNTMsCi0gICAgMCwxMTYsNiwwLDEwMCw3LDAsMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDExMCwxMjUsMCwxMjQsNCwwLDEwMCw2LDAsMTA3LAotICAgIDIsMCwxMTQsMjIsMSwxMjQsMiwwLDEwNiw5LDAsMTAwLDQsMCwxMDAsNSwKLSAgICAwLDEzMSwyLDAsMTAwLDEyLDAsMjUsMTI1LDUsMCwxMjQsNSwwLDEwNiwxMCwKLSAgICAwLDExNiwxMSwwLDEzMSwxLDAsMTE1LDIyMywwLDExNiw2LDAsMTAwLDgsMCwKLSAgICAxMDYsNywwLDExNiwxMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwKLSAgICA1LDAsMTE2LDEyLDAsMTE2LDExLDAsMTMxLDEsMCwxMDAsMSwwLDEzMywyLAotICAgIDAsMjUsMTI1LDYsMCwxMjQsNiwwLDEwNiwxMywwLDEzMSwwLDAsMTE1LDIyLAotICAgIDEsMTE2LDYsMCwxMDAsOSwwLDEwNiw3LDAsMTI0LDUsMCwxMzEsMSwwLAotICAgIDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwNiwxNCwwLDEwMCw0LDAsMTMxLAotICAgIDEsMCwxMDAsMTAsMCwyNSwxMjUsNywwLDExNiwxNSwwLDEyNCwxLDAsMTI0LAotICAgIDcsMCwxMTYsMTYsMCwxMDAsMTAsMCwyNSwyMywxMzEsMiwwLDgzLDQxLDEzLAotICAgIDk3LDExMCwxLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDk5LDQ2LDMyLDEwMiwKLSAgICAxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsCi0gICAgMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsCi0gICAgMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksCi0gICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDExNiwxMTEsMzIsCi0gICAgOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMzIsMTE2LDExMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiwzMiw3MywxMDIsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAwLDExMSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDk5LDExMSwxMTAsMTAyLDExMSwxMTQsMTA5LDMyLDExNiwxMTEsMzIsODAsNjksCi0gICAgODAsMzIsNTEsNDksNTIsNTUsNDcsNTIsNTYsNTYsMzIsMTAyLDExMSwxMTQsMTA5LDk3LAotICAgIDExNiw0NCwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNSwKLSAgICAxMDgsMTA4LDMyLDk4LDEwMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDMyLDczLDEwMiwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCi0gICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsCi0gICAgMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LAotICAgIDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzgsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiwKLSAgICA5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwxMjIsMzcsMTIzLDEyNSwzMiwxMTAsCi0gICAgMTExLDExNiwzMiw5OCwxMTEsMTE2LDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsCi0gICAgMTI1LDExNCw2MCwwLDAsMCwxMTQsNTgsMCwwLDAsMjMzLDMsMCwwLDAsCi0gICAgMTIyLDMzLDEwMSwxMjAsMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsCi0gICAgNTAsMzIsMTExLDExNCwzMiw1MSwzMiwxMDAsMTExLDExNiwxMTUsMzIsMTA1LDExMCwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSwxMjIsNTcsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLAotICAgIDExMCwzMiwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwKLSAgICAxMTYsOTcsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDUyLAotICAgIDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwxMTgsCi0gICAgMTAxLDEwOCwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LAotICAgIDExMCwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwxMTgsCi0gICAgOTcsMTA4LDExNywxMDEsMTE0LDYxLDAsMCwwLDYyLDIsMCwwLDAsMTE0LDU4LAotICAgIDAsMCwwLDExNCw4MiwwLDAsMCwyMzMsMjU0LDI1NSwyNTUsMjU1LDQxLDE3LDExNCwKLSAgICA4LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsNjcsMCwwLDAsMTE0LDY4LAotICAgIDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDczLDAsCi0gICAgMCwwLDExNCw0OSwwLDAsMCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDM2LAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsNzQsMCwwLDAsMTE0LDMzLDAsCi0gICAgMCwwLDExNCw3MiwwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDExNCwzMCwwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksOTUsCi0gICAgODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsOCwxMTQsMzcsMCwwLDAsMTE0LAotICAgIDc4LDAsMCwwLDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTA1LAotICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTAsCi0gICAgOSwxMDAsMTExLDExNiw5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDU5LDAsMCwwLDkwLAotICAgIDksMTExLDExMiwxMTYsOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsMTAxLAotICAgIDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICA5NSwxMDIsMTE0LDExMSwxMDksOTUsOTksOTcsOTksMTA0LDEwMSw0MiwxLDAsMCwxMTUsCi0gICAgNDQsMCwwLDAsMCw5LDE4LDEsMTIsMSwxOCwxLDE4LDEsMTIsMSwKLSAgICA5LDEsMTUsMSwxNSwxLDEyLDEsOSwxLDE1LDEsMTIsMSwyMiwxLAotICAgIDE1LDEsOSwxLDEyLDEsMjIsMSwxMiwxLDksMSwxMiwxLDE5LDEsCi0gICAgMTE0LDg3LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsCi0gICAgMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwxNjQsMCwwLDAsMTE2LAotICAgIDAsMCwxMjQsMCwwLDEzMSwxLDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyMiwKLSAgICAwLDEwMCwyLDAsODMsMTI0LDAsMCwxMDYsMSwwLDEwMCwzLDAsMTMxLDEsCi0gICAgMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsMCwKLSAgICAxMiwxMTUsODEsMCwxMjQsMywwLDEwNiwyLDAsMTMxLDAsMCwxMDAsNywwLAotICAgIDEwMCw4LDAsMTMzLDIsMCwyNSwxMDAsNiwwLDEwNywzLDAsMTE0LDg1LDAsCi0gICAgMTI0LDAsMCw4MywxMjEsMTYsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwKLSAgICAxMjUsNCwwLDg3LDExMCw0MCwwLDQsMTE2LDQsMCwxMTYsNSwwLDEwMiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDE0MywwLDEsMSwxLDEyNCwwLDAsMTAwLDIsMCwKLSAgICAxMDAsOSwwLDEzMywyLDAsMjUsMTI1LDQsMCw4OSwxMTAsMSwwLDg4LDExNiwKLSAgICA2LDAsMTI0LDQsMCwxMzEsMSwwLDExNCwxNjAsMCwxMjQsNCwwLDgzLDEyNCwKLSAgICAwLDAsODMsNDEsMTAsMTIyLDE4OCw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDQwLDEwNSwxMDIsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsCi0gICAgMTAxLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsCi0gICAgMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDExNSwzMiwxMTIsMTE3LAotICAgIDExNCwxMDEsMTA4LDEyMSwzMiwxMDIsMTExLDExNCwzMiw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwKLSAgICAxMDAsMTE1LDQ1LDk5LDExMSwxMDksMTEyLDk3LDExNiwxMDUsOTgsMTA1LDEwOCwxMDUsMTE2LDEyMSwKLSAgICAzMiwxMDIsMTExLDExNCwxMCwzMiwzMiwzMiwzMiw4MCwxMjEsNzMsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw5NSw2OSwxMjAsMTAxLDk5LDY3LDExMSwxMDAsMTAxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgODcsMTA1LDExNiwxMDQsNzAsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDQwLDQxLDMyLAotICAgIDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsNjcsMzIsNjUsODAsNzMsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTE0LDYxLDAsMCwwLDc4LDExNCw2MCwwLDAsMCwxMTQsODIsCi0gICAgMCwwLDAsMTE0LDMxLDAsMCwwLDkwLDIsMTEyLDEyMSwyMzMsMjUzLDI1NSwyNTUsCi0gICAgMjU1LDIzMywyNTUsMjU1LDI1NSwyNTUsMTE0LDg5LDAsMCwwLDQxLDcsMTE0LDMzLDAsCi0gICAgMCwwLDExNCwzNCwwLDAsMCwyMTgsNSwxMDgsMTExLDExOSwxMDEsMTE0LDExNCw4NywKLSAgICAwLDAsMCwxMTQsNjgsMCwwLDAsMTE0LDczLDAsMCwwLDExNCw0NiwwLAotICAgIDAsMCw0MSw1LDIxOCwxMyw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTIsCi0gICAgOTcsMTE2LDEwNCwxMTQsODAsMCwwLDAsMTE0LDM4LDAsMCwwLDkwLDksMTAxLAotICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDYsMCwwLDAsMjE4LDE1LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwKLSAgICAxMDEsMTAyLDEwNSwxMDgsMTAxLDc1LDEsMCwwLDExNSwyMCwwLDAsMCwwLDcsCi0gICAgMTgsMSw0LDEsMjQsMSwzNSwxLDQsMSwzLDEsMTYsMSwxOSwxLAotICAgIDIxLDEsMTE0LDkzLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw5MiwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTE2LDEsMCwxMTYsMiwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxMTQsNTksMCwxMjEsMTQsMCwxMTYsMywwLDEyNCwwLDAsMTMxLAotICAgIDEsMCw4Myw4NywxMTMsODgsMCw0LDExNiw0LDAsMTA3LDEwLDAsMTE0LDU1LAotICAgIDAsMSwxLDEsODksMTEzLDg4LDAsODgsMTEwLDI5LDAsMTI0LDAsMCwxMDYsCi0gICAgMCwwLDExNiwxLDAsMTE2LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDg0LAotICAgIDAsMTI0LDAsMCw4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSw2LDIxOCw4LDEwMSwxMTAsMTAwLDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTE2LDExNywKLSAgICAxMTIsMTA4LDEwMSwxMTQsODYsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCw2OCwwLAotICAgIDAsMCwxMTQsNzYsMCwwLDAsNDEsMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDExLDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk0LAotICAgIDEsMCwwLDExNSwxNiwwLDAsMCwwLDEsMjEsMSwzLDEsMTQsMSwKLSAgICAxMywxLDgsMSwyMSwxLDQsMiwxMTQsOTcsMCwwLDAsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDYwLDAsMCwwLDEyMSwxOSwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDEwNiwxLDAsMTI1LDEsMCw4NywxMTAsMjQsMCw0LDExNiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDQ1LDAsMSwxLDEsMTAwLDEsMCwxMjUsMSwwLAotICAgIDg5LDExMCwxLDAsODgsMTI0LDEsMCwxMDAsMiwwLDc5LDEyNSwxLDAsMTI0LAotICAgIDEsMCw4Myw0MSwzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwKLSAgICAxMTUsMTA1LDExMSwxMTAsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsMCwwLDIzMywKLSAgICAxMjgsMCwwLDAsNDEsMywxMTQsNDEsMCwwLDAsMTE0LDQzLDAsMCwwLAotICAgIDExNCw0MiwwLDAsMCw0MSwyLDExNCwzNywwLDAsMCwxMTQsNDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDEwLDk1LDk5LDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsMTA2LDEsMCwwLAotICAgIDExNSwxMiwwLDAsMCwwLDIsMywxLDE5LDEsMTMsMSwxMSwzLDEwLAotICAgIDEsMTE0LDk5LDAsMCwwLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwKLSAgICAxMjEsMTE0LDMxLDAsMCwwLDk5LDEsMCwwLDAsMSwwLDAsMCwzLAotICAgIDAsMCwwLDQsMCwwLDAsNzEsMCwwLDAsMTE1LDc1LDAsMCwwLAotICAgIDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDEyNCwxLDAsMTA3LDUsMCwxMTQsCi0gICAgNzEsMCwxMjQsMCwwLDEwNiwzLDAsMTAwLDYsMCwxMzEsMSwwLDExNSw0MywKLSAgICAwLDEwMCwzLDAsMTI0LDAsMCwyMywxMjUsMCwwLDExNiw0LDAsMTI0LDAsCi0gICAgMCwxMDYsNSwwLDEyNCwyLDAsMTQwLDAsMCwxMDAsNCwwLDExNiwwLDAsCi0gICAgMTA2LDYsMCwxMzEsMSwxLDEsMTAwLDUsMCw4Myw0MSw3LDEyMiw2MSw4MCwKLSAgICAxMTQsMTA1LDExMCwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsCi0gICAgMzIsMTE2LDExMSwzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwzMiwxMDUsMTAyLDMyLDQ1LDExOCwKLSAgICA0Nyw4MCw4OSw4NCw3Miw3OSw3OCw4Niw2OSw4Miw2Niw3OSw4Myw2OSwzMiwxMDUsCi0gICAgMTE1LDMyLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwxMTAsNDYsMjUwLDEsMzUsMjUwLAotICAgIDcsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsMzUsMzIsMTE0LDU2LDAsMCwKLSAgICAwLDc4LDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDQxLDcsCi0gICAgMTE0LDgsMCwwLDAsMTE0LDY5LDAsMCwwLDIxOCw3LDExOCwxMDEsMTE0LDk4LAotICAgIDExMSwxMTUsMTAxLDExNCwxMCwwLDAsMCwyMTgsNSwxMTIsMTE0LDEwNSwxMTAsMTE2LDExNCwKLSAgICA0OSwwLDAsMCwyMTgsNiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCw0MSwzLDExNCw3NywKLSAgICAwLDAsMCwxMTQsMTAwLDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwKLSAgICAxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTgsCi0gICAgMSwwLDAsMTE1LDgsMCwwLDAsMCwyLDE4LDEsMTUsMSwxMCwxLAotICAgIDExNCwxMDcsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKLSAgICAwLDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsODQsMCwwLDAsMTAwLAotICAgIDEsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDIsMCwxMDAsMywwLDEzNCwxLAotICAgIDAsMTI1LDEsMCwxMjEsMTMsMCwxMTYsMCwwLDEwNiwxLDAsMTI1LDIsMCwKLSAgICA4NywxMTAsMzAsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDY2LDAsMSwxLAotICAgIDEsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsMTI1LDIsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDEyNCwyLDAsMTI0LDEsMCwxMzYsMCwwLDEzMSwyLDAsMSwxMjQsCi0gICAgMSwwLDgzLDQxLDYsMTIyLDI1Miw2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLDExNCwKLSAgICAzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsOTcsMTE2LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywKLSAgICAzMiwxMTQsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMTAxLDEwMCwzMiwxMDksOTcsMTE2LDk5LDEwNCwKLSAgICAxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDEwLDMyLAotICAgIDMyLDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksOTcsMTEwLDMyLDEwNCw5NywKLSAgICAxMTAsMTAwLDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDIsCi0gICAgMTA1LDExNCwxMTUsMTE2LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiw0MCwxMTUsCi0gICAgMTAxLDEwOCwxMDIsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLAotICAgIDMyLDk1LDExMCw5NywxMDksMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTUsMTAxLDk5LDExMSwxMTAsMTAwLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwKLSAgICAzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDEsMTAwLAotICAgIDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsNDYsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDUsMTE1LDExMSwxMTAsMzIsMTAyLDk3LDEwNSwxMDgsCi0gICAgMTE1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzgsOTksMiwwLDAsMCwwLDAsMCwwLDQsMCwwLAotICAgIDAsNSwwLDAsMCwzMSwwLDAsMCwxMTUsODksMCwwLDAsMTI0LDEsCi0gICAgMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDI0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEyNSwxLDAsMTEwLDQ2LDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA3LAotICAgIDMsMCwxMTQsNzAsMCwxMTYsMSwwLDEwMCwxLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTAyLDIsMCwyMiwxMDAsMiwwLDEyNCwxLDAsMTMxLDEsCi0gICAgMSwxMzAsMSwwLDEzNiwwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsCi0gICAgMTI0LDMsMCwxNDIsMiwwLDgzLDQxLDMsNzgsMTIyLDMwLDEwOCwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMzcsMTE1LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwKLSAgICAzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDM3LDExNSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwKLSAgICA0MSwyLDExNCwxMDgsMCwwLDAsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksCi0gICAgMTE0LDExNCwxMTEsMTE0LDQxLDQsMjE4LDQsMTE1LDEwMSwxMDgsMTAyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEwNiwwLDAsMCw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsMSwKLSAgICAyMTgsNiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMTksOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsCi0gICAgMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsMTM0LDEsMCwwLDExNSwxMiwwLDAsMCwKLSAgICAwLDEsMTIsMSwxMiwxLDE1LDEsNiwxLDI1LDEsMTIyLDQwLDk1LDk5LAotICAgIDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LAotICAgIDExNSw2Miw0Niw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw5NSwxMTksCi0gICAgMTE0LDk3LDExMiwxMTIsMTAxLDExNCw5OSwyLDAsMCwwLDAsMCwwLDAsMywKLSAgICAwLDAsMCw3LDAsMCwwLDgzLDAsMCwwLDExNSw5MiwwLDAsMCwKLSAgICAxMjAsNjYsMCwxMDAsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMDAsNCwwLDEwMywKLSAgICA0LDAsNjgsOTMsNDYsMCwxMjUsMiwwLDExNiwwLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTE0LDE5LDAsMTE2LDEsMCwxMjQsMCwwLDEyNCwyLAotICAgIDAsMTE2LDIsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMzEsMywwLAotICAgIDEsMTEzLDE5LDAsODcsMTI0LDAsMCwxMDYsMywwLDEwNiw0LDAsMTI0LDEsCi0gICAgMCwxMDYsMywwLDEzMSwxLDAsMSwxMDAsMCwwLDgzLDQxLDUsNzgsMjE4LAotICAgIDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDk1LDIxOCw4LDk1LDk1LDExMCwKLSAgICA5NywxMDksMTAxLDk1LDk1LDIxOCwxMiw5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LAotICAgIDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwxMDAsMTExLDk5LDk1LDk1LDQxLDUsMjE4LDcsCi0gICAgMTA0LDk3LDExNSw5NywxMTYsMTE2LDExNCwyMTgsNywxMTUsMTAxLDExNiw5NywxMTYsMTE2LDExNCwKLSAgICAyMTgsNywxMDMsMTAxLDExNiw5NywxMTYsMTE2LDExNCwyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LAotICAgIDExNiw5NSw5NSwyMTgsNiwxMTcsMTEyLDEwMCw5NywxMTYsMTAxLDQxLDMsOTAsMywxMTAsCi0gICAgMTAxLDExOSw5MCwzLDExMSwxMDgsMTAwLDExNCw1NCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsNSw5NSwxMTksMTE0LAotICAgIDk3LDExMiwxNDUsMSwwLDAsMTE1LDgsMCwwLDAsMCwxLDI1LDEsMTUsCi0gICAgMSwyOSwxLDEyMiwyNiw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwKLSAgICA0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE5LDExNCw5NywxMTIsNDEsCi0gICAgMywyMTgsMTAsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExNCwxMjIsMCwKLSAgICAwLDAsMjE4LDksNzgsOTcsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsNDEsMywxMTQsCi0gICAgMTExLDAsMCwwLDExNCwxMTIsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCw0MSwxLDExNCwxMTEsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LAotICAgIDExLDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDEyNiwxLDAsMCwKLSAgICAxMTUsMTQsMCwwLDAsMCw4LDIxLDcsMywxLDEzLDEsMTMsMiwxNywKLSAgICA1LDEzLDEsMTE0LDEyNSwwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw4NCwwLAotICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsCi0gICAgMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsCi0gICAgMTE0LDgwLDAsMTE2LDEsMCwxMjQsMywwLDEzMSwxLDAsMTE0LDgwLDAsMTAwLAotICAgIDIsMCwxMjUsNCwwLDExNiwyLDAsMTA2LDMsMCwxMjQsNCwwLDEwNiw0LAotICAgIDAsMTI0LDMsMCwxMDAsMywwLDI1LDEzMSwxLDAsMTE2LDUsMCwxMzEsMiwKLSAgICAwLDEsMTI0LDIsMCw4Myw0MSw0LDEyMiwxNTUsODQsMTE0LDEyMSwzMiwxMTYsMTExLAotICAgIDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTIxLDMyLDEwMCwxMDEsMTA4LDEwMSwxMDMsCi0gICAgOTcsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSwxMDgsCi0gICAgMTAyLDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQwLDQxLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsCi0gICAgMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCwzMiwKLSAgICAxMDUsMTEwLDMyLDEwMiw5NywxMTgsMTExLDExNCwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw3OCwxMjIsNDQsNzgsMTExLDExNiwzMiwxMDUsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLAotICAgIDEyMywxMjUsNTgsMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDk1LDk1LDEwNSwxMTAsCi0gICAgMTA1LDExNiw5NSw5NSwxMTQsNjEsMCwwLDAsNDEsNiwyMTgsMTEsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LDMzLDAsMCwwLDExNCw2MiwwLAotICAgIDAsMCwxMTQsNjMsMCwwLDAsMTE0LDQ5LDAsMCwwLDIxOCwxMyw3MywxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsNDEsNSwxMTQsMTEwLDAsCi0gICAgMCwwLDIxOCw4LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwyMTgsNiwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDIxOCw4LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsMjE4LDMsCi0gICAgMTA5LDExNSwxMDMsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDE3LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5NSwxMTUsMTA0LDEwNSwxMDksMTU0LDEsMCwwLDExNSwxMCwwLDAsMCwwLDEwLAotICAgIDIxLDEsMjQsMSw2LDEsMjksMSwxMTQsMTMyLDAsMCwwLDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCwxMSwwLDAsMCwxOSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMjQwLDEsMCwwLDEwNSwwLDAsMTI1LDQsMCwxMjQsMiwwLAotICAgIDEwMCwxLDAsMTA3LDksMCwxMTQsMzEsMCwxMjQsMiwwLDEyNCw0LDAsMTAwLAotICAgIDIsMCw2MCwxMTAsNiwwLDEwMCwzLDAsMTI1LDIsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTA3LDksMCwxMTQsNTksMCwxMjQsMywwLDEyNCw0LDAsMTAwLDQsCi0gICAgMCw2MCwxMjQsMCwwLDEwMCwxLDAsMTAwLDUsMCwxMzMsMiwwLDI1LDEyNSwKLSAgICA1LDAsMTI0LDAsMCwxMDAsNSwwLDEwMCw2LDAsMTMzLDIsMCwyNSwxMjUsCi0gICAgNiwwLDEyNCwwLDAsMTAwLDYsMCwxMDAsNywwLDEzMywyLDAsMjUsMTI1LAotICAgIDcsMCwxMjQsNSwwLDExNiwwLDAsMTA3LDMsMCwxMTQsMTY4LDAsMTAwLDgsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDUsMCwxMzEsMiwwLDEyNSw4LDAsCi0gICAgMTE2LDIsMCwxMDAsOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwzLDAsCi0gICAgMTI0LDgsMCwxMjQsNCwwLDE0MSwxLDAsMTMwLDEsMCwxMTAsMTE5LDAsMTE2LAotICAgIDQsMCwxMjQsNiwwLDEzMSwxLDAsMTAwLDUsMCwxMDcsMywwLDExNCwyMjksCi0gICAgMCwxMDAsMTAsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLAotICAgIDExNiwyLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNSwwLAotICAgIDEyNCw4LDAsMTMxLDEsMCwxMzAsMSwwLDExMCw1OCwwLDExNiw0LDAsMTI0LAotICAgIDcsMCwxMzEsMSwwLDEwMCw1LDAsMTA3LDMsMCwxMTQsMzEsMSwxMDAsMTEsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLDExNiwyLDAsCi0gICAgMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNSwwLDEyNCw4LDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDEyNCwxLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwKLSAgICAyMjYsMSwxMjEsMjAsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDEyLDAsMjUsMTMxLAotICAgIDEsMCwxMjUsOSwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwKLSAgICAxMTQsODMsMSwxLDEsMSw4OSwxMTAsNjIsMCw4OCwxMTYsOCwwLDEyNCw2LAotICAgIDAsMTMxLDEsMCwxMjQsOSwwLDEwNywzLDAsMTE0LDE0NSwxLDEwMCwxMywwLAotICAgIDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsCi0gICAgOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwzLDAsMTI0LDgsMCwxMjQsCi0gICAgNCwwLDE0MSwxLDAsMTMwLDEsMCwxMjEsMTgsMCwxMjQsMSwwLDEwMCwxNCwKLSAgICAwLDI1LDEwMCwxNSwwLDY0LDEyNSwxMCwwLDg3LDExMCwxOCwwLDQsMTE2LDcsCi0gICAgMCwxMDcsMTAsMCwxMTQsMTgzLDEsMSwxLDEsODksMTEwLDQzLDAsODgsMTE2LAotICAgIDgsMCwxMjQsNywwLDEzMSwxLDAsMTI0LDEwLDAsMTA3LDMsMCwxMTQsMjI2LAotICAgIDEsMTE2LDMsMCwxMDAsMTMsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwKLSAgICAxMjQsNCwwLDE0MSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEwMCw3LDAsMTAwLAotICAgIDEsMCwxMzMsMiwwLDI1LDgzLDQxLDE2LDk3LDEyMiwxLDAsMCw4Niw5NywKLSAgICAxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDQ1LAotICAgIDEwNSwxMTAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsOTcsMTAzLDk3LDEwNSwKLSAgICAxMTAsMTE1LDExNiwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMTYsOTcsMTE2LDExNSwKLSAgICAzMiw0MCwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsNDEsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAotICAgIDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiwKLSAgICA5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwzMiwKLSAgICA5OCwxMjEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsNDEsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDk3LDExNCwxMDMsCi0gICAgMTE3LDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsCi0gICAgMTE2LDExMSwzMiwxMDEsMTEwLDEwNCw5NywxMTAsOTksMTAxLDMyLDEwMSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMzIsMTE0LDEwMSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwKLSAgICAxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsCi0gICAgMTA1LDExMCw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDMyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDExNSwxMTYsOTcsCi0gICAgMTA4LDEwMSw0NiwzMiw2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwKLSAgICAxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDAsOTcsMTE2LDk3LDMyLDEwNSwxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDk4LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTE0LDExNywxMTAsOTksOTcsMTE2LDEwMSwKLSAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTE0LDEwOCwwLDAsMCwxMjIsMTAsCi0gICAgNjAsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsNjIsMTE0LDM3LDAsMCwwLDExNCwKLSAgICAxNCwwLDAsMCwyMzMsOCwwLDAsMCwyMzMsMTIsMCwwLDAsMTIyLDMwLAotICAgIDk4LDk3LDEwMCwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LAotICAgIDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsNTgsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDIsCi0gICAgMTIzLDEyNSwxMjIsNDMsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwKLSAgICAxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDUsCi0gICAgMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsCi0gICAgNDgsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwKLSAgICAxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwxMDUsMTIyLDEwMSwzMiwKLSAgICAxMTEsMTAyLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LAotICAgIDEyNSwyMTgsNSwxMDksMTE2LDEwNSwxMDksMTAxLDEyMiwyNiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCi0gICAgMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMTYsOTcsMTA4LDEwMSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMjMsMzMsMTE0LDEyNSwyMTgsNCwxMTUsMTA1LDEyMiwxMDEsMTA4LDMsMCwwLDAsMjU1LAotICAgIDEyNywyNTUsMTI3LDMsMCw0MSw5LDIxOCwxMiw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCwKLSAgICA4NSw3Nyw2Niw2OSw4MiwxMTQsNDksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsCi0gICAgMTA5LDAsMCwwLDExNCwzMywwLDAsMCwyMTgsOCw2OSw3OSw3MCw2OSwxMTQsCi0gICAgMTE0LDExMSwxMTQsMTE0LDE2LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwKLSAgICAxMTEsMTE0LDExNCwyMSwwLDAsMCw0MSwxMSwxMTQsNTUsMCwwLDAsMjE4LDEyLAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDM3LDAsMCwwLDkwLDExLDEwMSwxMjAsOTksOTUsMTAwLDEwMSwxMTYsOTcsCi0gICAgMTA1LDEwOCwxMTUsOTAsNSwxMDksOTcsMTAzLDEwNSw5OSw5MCwxMywxMTQsOTcsMTE5LDk1LAotICAgIDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsOTAsOCwxMTQsOTcsMTE5LDk1LDExNSwKLSAgICAxMDUsMTIyLDEwMSwxMTQsNzcsMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsCi0gICAgMTA1LDEyMiwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDI1LDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwKLSAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMTcxLDEsMCwKLSAgICAwLDExNSw3NiwwLDAsMCwwLDExLDYsMSwxMiwxLDEzLDMsNiwxLAotICAgIDEyLDEsMTAsMSwxNiwxLDE2LDEsMTYsMSwxMiwxLDE4LDEsMTMsMSwKLSAgICAxOCwxLDE4LDEsMTUsMSwxMywxLDE1LDEsMTgsMSwxNSwxLDEzLDEsCi0gICAgMTIsMSwxMiwxLDMsMSwyMCwxLDEzLDEsNSwyLDE4LDEsMTUsMSwKLSAgICAxMywxLDE1LDEsMywxLDE4LDEsMTMsMSw1LDIsMTgsMSwxNSwxLAotICAgIDksMSwxMTQsMTQzLDAsMCwwLDk5LDQsMCwwLDAsMCwwLDAsMCwKLSAgICA1LDAsMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LDExMiwwLDAsCi0gICAgMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsCi0gICAgMTE2LDIsMCwxMjQsNCwwLDExNiwzLDAsMTMxLDIsMCwxMTQsNzUsMCwxMTYsCi0gICAgNCwwLDEwMCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEsMTI0LDMsMCwxMDAsCi0gICAgMiwwLDEwNyw5LDAsMTE0LDcxLDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LAotICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEsMTI0LDQsMCw4MywxMTYsNywwLDEwMCwKLSAgICAzLDAsMTA2LDgsMCwxMjQsMiwwLDEzMSwxLDAsMTAwLDQsMCwxMjQsMSwKLSAgICAwLDEwMCw1LDAsMTI0LDIsMCwxMzEsMSwyLDEzMCwxLDAsMTAwLDIsMCwKLSAgICA4Myw0MSw2LDEyMiw2MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLAotICAgIDEwMCwzMiw5OCwxMjEsMzIsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsCi0gICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSwKLSAgICA0NiwxMjIsMjEsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwKLSAgICAxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwKLSAgICAxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCw0MSw5LDIxOCw3LAotICAgIDEwOSw5NywxMTQsMTE1LDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLAotICAgIDEwNSwxMTUsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsCi0gICAgMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTA3LDAsMCwwLDIxOCw0LDk1LDEwNSwxMDksCi0gICAgMTEyLDkwLDE2LDk1LDEwMiwxMDUsMTIwLDk1LDk5LDExMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE0LDEwOSwwLDAsMCwxMTQsNDksMCwwLDAsNDEsNSwxMTQsCi0gICAgNTUsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDkyLAotICAgIDAsMCwwLDIxOCw0LDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNyw5NSw5OSwxMTEsMTA5LDExMiwxMDUsCi0gICAgMTA4LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMjYsMSwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDAsMiwxNSwxLDE1LDEsMTMsMSwxMiwxLDE2LDEsCi0gICAgNCwyLDE4LDEsMTE0LDE0OSwwLDAsMCwxMTQsNjEsMCwwLDAsOTksMywKLSAgICAwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNzYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLAotICAgIDAsMTI1LDMsMCwxMjQsMywwLDEwNiwyLDAsMTE2LDMsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLAotICAgIDEyNCwyLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsMiwwLAotICAgIDExNiw0LDAsMTA2LDUsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsMCwxLAotICAgIDEyNCwzLDAsODMsNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsCi0gICAgOTcsMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsCi0gICAgMTE2LDExMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDExNywxMTYsMzIsMTE2LDExMSwzMiw5NywKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSw0NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDQxLDYsMjE4LDksOTgsMTIxLDExNiwxMDEsCi0gICAgOTcsMTE0LDExNCw5NywxMjEsMTE0LDEzNywwLDAsMCwyMTgsNiwxMDEsMTIwLDExNiwxMDEsCi0gICAgMTEwLDEwMCwxMTQsMTksMCwwLDAsMTE0LDE0NCwwLDAsMCw5MCw1LDEwMCwxMTcsCi0gICAgMTA5LDExMiwxMTUsNDEsNCwxMTQsMTQ4LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LAotICAgIDE0MiwwLDAsMCwxMTQsNTUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDAsMTAxLDk1LAotICAgIDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjM4LDEsMCwwLDExNSwKLSAgICAxMCwwLDAsMCwwLDMsMTIsMSwxOSwxLDE5LDEsMjIsMSwxMTQsMTUyLAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLAotICAgIDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg5LDAsMCwwLDEwMCwxLDAsCi0gICAgMTAwLDIsMCwxMDgsMCwwLDEyNSwxLDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwKLSAgICAwLDAsMTMxLDEsMCwxMDYsMywwLDEyNSwyLDAsMTI0LDEsMCwxMDYsNCwKLSAgICAwLDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDExNiwxLDAsMTA2LDUsMCwKLSAgICAxMDAsMiwwLDEwMCwzLDAsMTMxLDIsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LAotICAgIDYsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMDAsMSwwLDI1LDEzMSwKLSAgICAxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiwxMjEsNjgsMTAxLDk5LDExMSwxMDAsMTAxLAotICAgIDMyLDk4LDEyMSwxMTYsMTAxLDExNSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAotICAgIDExNiwxMTQsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTEwLDEwNSwxMTgsCi0gICAgMTAxLDExNCwxMTUsOTcsMTA4LDMyLDExMCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSwzMiwxMTUsMTE3LAotICAgIDExMiwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTA1LDExMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsNDYsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTE0LDYxLDAsMCwwLDc4LDg0LDQxLDcsMjE4LDgsMTE2LDExMSwKLSAgICAxMDcsMTAxLDExMCwxMDUsMTIyLDEwMSwxMTQsNTEsMCwwLDAsOTAsNyw2NiwxMjEsMTE2LAotICAgIDEwMSwxMTUsNzMsNzksOTAsOCwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsOTAsMTUsCi0gICAgMTAwLDEwMSwxMTYsMTAxLDk5LDExNiw5NSwxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsOTAsCi0gICAgMjUsNzMsMTEwLDk5LDExNCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDEwOCw3OCwxMDEsMTE5LDEwOCwKLSAgICAxMDUsMTEwLDEwMSw2OCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDIxOCw2LDEwMCwxMDEsOTksMTExLAotICAgIDEwMCwxMDEsNDEsNSwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsMTE0LDE1MywwLDAsMCw5MCwyMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LAotICAgIDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsMjE4LDgsCi0gICAgMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDkwLDE1LDExMCwxMDEsMTE5LDEwOCwxMDUsMTEwLAotICAgIDEwMSw5NSwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTMsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICA5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDI0OCwxLDAsMCwxMTUsMTAsMCwwLDAsCi0gICAgMCw1LDEyLDEsMTgsMSwxNSwxLDE4LDEsMTE0LDE1NywwLDAsMCwxMTQsCi0gICAgMTI5LDAsMCwwLDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAotICAgIDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsCi0gICAgOTksMiwwLDAsMCwyLDAsMCwwLDksMCwwLDAsMTksMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDg5LDEsMCwwLDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCw3MywwLDEwMCwyLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwKLSAgICAyLDAsMTAwLDMsMCwxMzEsMiwwLDExNCw3MywwLDEyMSwxOSwwLDEyNCwyLAotICAgIDAsMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCw4NywxMTAsMTgsCi0gICAgMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDcyLDAsMSwxLDEsODksMTEwLAotICAgIDEsMCw4OCwxMTYsMywwLDEwNiw0LDAsMTI0LDAsMCwxMjQsMiwwLDEwMCwKLSAgICA0LDAsMTI0LDEsMCwxMzEsMiwxLDEyNSw0LDAsMTAwLDUsMCwxMjQsNCwKLSAgICAwLDk1LDUsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTk0LDAsCi0gICAgMTIwLDczLDAsMTE2LDYsMCwxMzEsMCwwLDY4LDkzLDU4LDAsOTIsMiwwLAotICAgIDEyNSw1LDAsMTI1LDYsMCwxMjQsMSwwLDEwNiw3LDAsMTE2LDgsMCwxMjQsCi0gICAgNiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsMTI4LDAsMTI0LDUsMCwxMjQsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDIsMCwxMjUsMiwwLDEyNCwyLDAsMTI0LDQsMCwKLSAgICA5NSw5LDAsODAsMTEzLDEyOCwwLDg3LDEwMCwxLDAsODMsMTI0LDMsMCwxMTYsCi0gICAgMTAsMCwxMDcsOCwwLDExNCwyMywxLDExNiwwLDAsMTI0LDIsMCwxMDAsNiwKLSAgICAwLDEzMSwyLDAsMTE0LDMyLDEsMTIxLDE5LDAsMTI0LDIsMCwxMDYsMTEsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTI1LDcsMCw4NywxMTAsMTgsMCw0LDExNiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDQsMSwxLDEsMSw4OSwxMTMsMzIsMSw4OCwxMjQsCi0gICAgNywwLDExNCwzMiwxLDEwMywwLDAsMTI0LDQsMCw5NSwxMiwwLDExMCw5LAotICAgIDAsMTI0LDMsMCwxMjQsNCwwLDk1LDEyLDAsMTI0LDQsMCwxMDYsMTIsMCwKLSAgICAxMDMsMCwwLDEwNywyLDAsMTE0LDg1LDEsMTI0LDEsMCwxMTQsODUsMSwxMTYsCi0gICAgMTMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDcsMCwyNSwxMjUsOCwwLDEyNCwKLSAgICA0LDAsMTA2LDEyLDAsMTA2LDE0LDAsMTI0LDgsMCwxMzEsMSwwLDEsMTI0LAotICAgIDQsMCw4Myw0MSw4LDk3LDYxLDEsMCwwLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsOTgsCi0gICAgOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTExLAotICAgIDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLAotICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LDEwLDMyLDMyLDMyLDMyLAotICAgIDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LAotICAgIDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTYsMTExLDMyLDk3LDMyLAotICAgIDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwKLSAgICAxMjEsMzIsMTEyLDk3LDExNiwxMDQsMTE1LDQ2LDMyLDMyLDY1LDExMCwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMDUsMTE1LDMyLDExNSwKLSAgICAxMTcsMTAyLDEwMiwxMDUsOTksMTA1LDEwMSwxMTAsMTE2LDQ0LDMyLDExNiwxMDQsMTExLDExNywxMDMsCi0gICAgMTA0LDMyLDEwNSwxMTYsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMTE5LAotICAgIDEwNSwxMTUsMTAxLDMyLDExNywxMTUsMTAxLDEwMiwxMTcsMTA4LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTE1LDEyMSwxMTUsCi0gICAgMTE2LDEwMSwxMDksNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMTYsOTcsMTA3LDEwMSwzMiw5NywKLSAgICAzMiwxMTUsMTEyLDEwMSw5OSwzMiw5NywxMTUsMzIsMTA1LDExNiwxMTUsMzIsMTExLDExMCwxMDgsCi0gICAgMTIxLDMyLDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCw0MSwzMiw5NywxMTQsMTAzLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw5LDYwLDExNywxMTAsMTA3LDExMCwxMTEsCi0gICAgMTE5LDExMCw2MiwyMTgsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksCi0gICAgMTAxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LDk1LDExMiwKLSAgICA5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNjEsMCwwLDAsNDEsMTUsMTE0LDExNywwLAotICAgIDAsMCwxMTQsMTU5LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDEyMywwLDAsCi0gICAgMCwyMTgsMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDkwLDEzLDk1LAotICAgIDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsMjcsOTUsMTAzLAotICAgIDEwMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw5NCwwLDAsMCwxMTQsOTUsCi0gICAgMCwwLDAsMTE0LDEyOSwwLDAsMCwyMTgsOSw5NSw4MCw3OSw4MCw4NSw3NiwKLSAgICA2NSw4NCw2OSwxMTQsMTYxLDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDQwLDAsCi0gICAgMCwwLDIxOCw2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNDEsOSwxMTQsMTA4LDAsMCwKLSAgICAwLDkwLDgsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDEyOSwwLDAsMCwKLSAgICAxMTQsMTU4LDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCwxMiwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDk1LDk5LDEwOCw5NywxMTUsMTE1LDIxOCw4LDExNSwxMTcsMTAyLDEwMiwxMDUsCi0gICAgMTIwLDEwMSwxMTUsMTE0LDE2MSwwLDAsMCw5MCw3LDEwMCwxMDUsMTE0LDExMCw5NywxMDksCi0gICAgMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCwyMywxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTAyLDEwNSwxMDgsMTAxLAotICAgIDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDksMiwwLDAsMTE1LDYwLDAsCi0gICAgMCwwLDAsMTIsMTIsNCw2LDEsMTUsMiwzLDEsMTksMSwxMywxLAotICAgIDUsOCwyNCwxLDksMywxMiwxLDIyLDEsMjEsMSwxNSwxLDksMSwKLSAgICA1LDIsNCwzLDEyLDIsMTUsMSwzLDEsMTksMSwxMywxLDUsMiwKLSAgICA2LDEsMTIsMiw5LDEsMTUsMSw2LDEsMTYsMSwxNiwyLDExNCwxNjksCi0gICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgNSwwLDAsMCw2NCwwLDAsMCwxMTUsMTIxLDAsMCwwLDEwMSwwLDAsCi0gICAgOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwKLSAgICAyLDAsOTAsNCwwLDEwMCwzLDAsOTAsNSwwLDEwMCw0LDAsOTAsNiwKLSAgICAwLDEwMSw3LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsMTMxLDEsMCwKLSAgICA5MCw4LDAsMTAxLDcsMCwxMDAsNywwLDEwMCw4LDAsMTMyLDAsMCwxMzEsCi0gICAgMSwwLDkwLDksMCwxMDEsNywwLDEwMCw5LDAsMTAwLDksMCwxMDAsMTAsCi0gICAgMCwxMDAsMTEsMCwxMzIsMiwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNywwLAotICAgIDEwMCw5LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDEsMCwxMzEsMSwwLDkwLAotICAgIDExLDAsMTAwLDksMCw4Myw0MSwxNCwyMTgsMjEsODcsMTA1LDExMCwxMDAsMTExLDExOSwKLSAgICAxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLAotICAgIDYyLDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMDEsCi0gICAgOTksMTA4LDk3LDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsODcsMTA1LAotICAgIDExMCwxMDAsMTExLDExOSwxMTUsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMjIsCi0gICAgNTksODMsMTExLDEwMiwxMTYsMTE5LDk3LDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCwKLSAgICA5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsMTIxLDExNSwKLSAgICA5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMTI1LDEyMiw2NSw4MywxMTEsCi0gICAgMTAyLDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDkyLDgwLDEyMSwKLSAgICAxMTYsMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsCi0gICAgMTE0LDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsOTIsMTIzLAotICAgIDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsOTIsNjgsMTAxLDk4LDExNywxMDMsNzAsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDY3LDAsMCwwLDEyMSwyMywwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMTYsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMiwwLDgzLAotICAgIDg3LDExMCwzNywwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNjIsMCwxLDEsCi0gICAgMSwxMTYsMCwwLDEwNiwxLDAsMTE2LDAsMCwxMDYsNCwwLDEyNCwxLDAsCi0gICAgMTMxLDIsMCw4Myw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSw1LDIxOCw3LDk1LDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDkwLDcsNzksMTEyLDEwMSwKLSAgICAxMTAsNzUsMTAxLDEyMSw5MCwxNyw3Miw3NSw2OSw4OSw5NSw2Nyw4NSw4Miw4Miw2OSwKLSAgICA3OCw4NCw5NSw4NSw4Myw2OSw4MiwxMTQsNDIsMCwwLDAsOTAsMTgsNzIsNzUsCi0gICAgNjksODksOTUsNzYsNzksNjcsNjUsNzYsOTUsNzcsNjUsNjcsNzIsNzMsNzgsNjksCi0gICAgNDEsMiwyMTgsMyw5OSwxMDgsMTE1LDExNCw1LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCw5NSwxMTEsMTEyLAotICAgIDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw4NywyLDAsMCwxMTUsCi0gICAgOCwwLDAsMCwwLDIsMywxLDIzLDEsMTMsMSwxMjIsMzYsODcsMTA1LAotICAgIDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsCi0gICAgMTAwLDEwMSwxMTQsNDYsOTUsMTExLDExMiwxMDEsMTEwLDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LAotICAgIDExNCwxMjEsOTksMiwwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMTYsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDE0MywwLDAsMCwxMjQsMCwwLDEwNiwKLSAgICAwLDAsMTE0LDIxLDAsMTI0LDAsMCwxMDYsMSwwLDEyNSwyLDAsMTEwLDksCi0gICAgMCwxMjQsMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjQsMiwwLDEwNiwzLDAsCi0gICAgMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTE2LDQsMCwxMDYsNSwwLDEwMCwKLSAgICAwLDAsMTAwLDMsMCwxMzMsMiwwLDI1LDEzMSwwLDIsMTI1LDMsMCwxMjEsCi0gICAgNDcsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMzEsMSwwLDE0MywyNSwKLSAgICAwLDEyNSw0LDAsMTE2LDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLDQsMCwKLSAgICAxMzEsMiwwLDEyNSw1LDAsODcsMTAwLDAsMCw4MSw4Miw4OCw4NywxMTAsMjIsCi0gICAgMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDEzOCwwLDEsMSwxLDEwMCwwLAotICAgIDAsODMsODksMTEwLDEsMCw4OCwxMjQsNSwwLDgzLDQxLDUsNzgsMTE0LDEyOCwKLSAgICAwLDAsMCw5MCwxMSwxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMTE0LDgyLDAsMCwwLDExNCwzMiwwLDAsMCw0MSwxMCwyMTgsMTEsNjgsNjksCi0gICAgNjYsODUsNzEsOTUsNjYsODUsNzMsNzYsNjgsMjE4LDE4LDgyLDY5LDcxLDczLDgzLAotICAgIDg0LDgyLDg5LDk1LDc1LDY5LDg5LDk1LDY4LDY5LDY2LDg1LDcxLDIxOCwxMiw4MiwKLSAgICA2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSw3NSw2OSw4OSwxMTQsNDksMCwwLDAsCi0gICAgMTE0LDgsMCwwLDAsMjE4LDcsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDExNCwxNzMsCi0gICAgMCwwLDAsMTE0LDE3MSwwLDAsMCw5MCwxMCw4MSwxMTcsMTAxLDExNCwxMjEsODYsCi0gICAgOTcsMTA4LDExNywxMDEsMTE0LDQyLDAsMCwwLDQxLDYsMTE0LDE3MiwwLDAsMCwKLSAgICAxMTQsMTI4LDAsMCwwLDkwLDEyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsOTUsCi0gICAgMTA3LDEwMSwxMjEsMTE0LDUsMCwwLDAsOTAsNCwxMDQsMTA3LDEwMSwxMjEsMjE4LDgsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDExMiw5NywxMTYsMTA0LDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsCi0gICAgOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NCwyLDAsMCwxMTUsMjIsMCwKLSAgICAwLDAsMCwyLDksMSwxMiwyLDksMSwxNSwxLDIyLDEsMywxLAotICAgIDE4LDEsMjksMSwxMywxLDksMSwxMjIsMzgsODcsMTA1LDExMCwxMDAsMTExLDExOSwKLSAgICAxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsCi0gICAgNzgsOTksNCwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsMTQsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDE1OCwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTI0LDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMCwwLAotICAgIDEwNyw4LDAsMTE0LDMxLDAsMTAwLDAsMCw4MywxMjEsMTQsMCwxMTYsMSwwLAotICAgIDEyNCw0LDAsMTMxLDEsMCwxLDg3LDExMCwyMiwwLDQsMTE2LDIsMCwxMDcsCi0gICAgMTAsMCwxMTQsNjksMCwxLDEsMSwxMDAsMCwwLDgzLDg5LDExMCwxLDAsCi0gICAgODgsMTIwLDgxLDAsMTE2LDMsMCwxMzEsMCwwLDY4LDkzLDcwLDAsOTIsMiwKLSAgICAwLDEyNSw1LDAsMTI1LDYsMCwxMjQsNCwwLDEwNiw0LDAsMTE2LDUsMCwKLSAgICAxMjQsNiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsODAsMCwxMTYsNiwwLDEwNiwKLSAgICA3LDAsMTI0LDEsMCwxMjQsNSwwLDEyNCwxLDAsMTI0LDQsMCwxMzEsMiwKLSAgICAwLDEwMCwxLDAsMTI0LDQsMCwxMzEsMiwxLDEyNSw3LDAsMTI0LDcsMCwKLSAgICA4MywxMTMsODAsMCw4NywxMDAsMCwwLDgzLDQxLDIsNzgsMTE0LDE2MCwwLDAsCi0gICAgMCw0MSw4LDExNCwxNzksMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MiwwLAotICAgIDAsMCwxMTQsMTYzLDAsMCwwLDExNCw5NCwwLDAsMCwxMTQsOTUsMCwwLAotICAgIDAsMTE0LDEyMywwLDAsMCwyMTgsMTYsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsCi0gICAgMTA5LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsOCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwKLSAgICAxMTYsMTE0LDE3OCwwLDAsMCwxMTQsMTI5LDAsMCwwLDExNCwxNjgsMCwwLDAsCi0gICAgMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTA5LAotICAgIDIsMCwwLDExNSwyNiwwLDAsMCwwLDIsMTUsMSwxMiwxLDQsMSwKLSAgICAzLDEsMTQsMSwxMywxLDksMSwyMiwxLDIxLDEsOSwxLDE1LDEsCi0gICAgOSwxLDEyMiwzMSw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsCi0gICAgMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LAotICAgIDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsNDUsMCwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsMTI0LAotICAgIDMsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDM3LDAsMTI0LDMsMCwxMDYsMSwKLSAgICAwLDgzLDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxMDgsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLAotICAgIDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksCi0gICAgMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsCi0gICAgMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxODIsMCwKLSAgICAwLDAsMTE0LDEyOSwwLDAsMCw0MSw0LDExNCwxNzIsMCwwLDAsMTE0LDEyOCwKLSAgICAwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyNSwyLDAsMCwxMTUsOCwwLAotICAgIDAsMCwwLDcsMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsCi0gICAgMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwKLSAgICAxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsCi0gICAgMCwwLDAsMTE0LDE3NiwwLDAsMCwxMTQsMTc1LDAsMCwwLDExNCwxNzQsMCwKLSAgICAwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwKLSAgICAxNzMsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxODMsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNSwwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsMjQ4LDEsMCwwLDEwMCwwLDkwLDAsMTAwLDkxLAorICAgIDkwLDEsMTAwLDkyLDkwLDIsMTAxLDIsMTAxLDEsMjMsMCw5MCwzLDEwMCw0LAorICAgIDEwMCw1LDEzMiwwLDkwLDQsMTAwLDYsMTAwLDcsMTMyLDAsOTAsNSwxMDAsOCwKKyAgICAxMDAsOSwxMzIsMCw5MCw2LDEwMCwxMCwxMDAsMTEsMTMyLDAsOTAsNywxMDAsMTIsCisgICAgMTAwLDEzLDEzMiwwLDkwLDgsMTAwLDE0LDEwMCwxNSwxMzIsMCw5MCw5LDEwMCwxNiwKKyAgICAxMDAsMTcsMTMyLDAsOTAsMTAsMTAwLDE4LDEwMCwxOSwxMzIsMCw5MCwxMSwxMDAsMjAsCisgICAgMTAwLDIxLDEzMiwwLDkwLDEyLDEwMCw5MywxMDAsMjMsMTAwLDI0LDEzMiwxLDkwLDEzLAorICAgIDEwMSwxNCwxMDEsMTMsMTA2LDE1LDEzMSwxLDkwLDE2LDEwMCwyNSwxMDYsMTcsMTAwLDI2LAorICAgIDEwMCwyNywxMzEsMiwxMDAsMjgsMjMsMCw5MCwxOCwxMDEsMTksMTA2LDIwLDEwMSwxOCwKKyAgICAxMDAsMjcsMTMxLDIsOTAsMjEsMTAwLDI5LDkwLDIyLDEwMCwzMCw5MCwyMywxMDAsMzEsCisgICAgMTAzLDEsOTAsMjQsMTAwLDMyLDEwMywxLDkwLDI1LDEwMSwyNSw0LDAsOTAsMjYsCisgICAgOTAsMjcsMTAwLDk0LDEwMCwzMywxMDAsMzQsMTU2LDEsMTAwLDM1LDEwMCwzNiwxMzIsMywKKyAgICA5MCwyOCwxMDAsMzcsMTAwLDM4LDEzMiwwLDkwLDI5LDEwMCwzOSwxMDAsNDAsMTMyLDAsCisgICAgOTAsMzAsMTAwLDQxLDEwMCw0MiwxMzIsMCw5MCwzMSwxMDAsNDMsMTAwLDQ0LDEzMiwwLAorICAgIDkwLDMyLDEwMCw0NSwxMDAsNDYsMTMyLDAsOTAsMzMsMTAwLDQ3LDEwMCw0OCwxMzIsMCwKKyAgICA5MCwzNCwxMDAsOTUsMTAwLDQ5LDEwMCw1MCwxMzIsMSw5MCwzNSwxMDAsOTYsMTAwLDUxLAorICAgIDEwMCw1MiwxMzIsMSw5MCwzNiwxMDAsOTcsMTAwLDU0LDEwMCw1NSwxMzIsMSw5MCwzNywKKyAgICAxMDAsNTYsMTAwLDU3LDEzMiwwLDkwLDM4LDEwMSwzOSwxMzEsMCw5MCw0MCwxMDAsOTgsCisgICAgMTAwLDMzLDEwMSw0MCwxMDAsNTgsMTU2LDIsMTAwLDU5LDEwMCw2MCwxMzIsMyw5MCw0MSwKKyAgICA3MSwwLDEwMCw2MSwxMDAsNjIsMTMyLDAsMTAwLDYyLDEzMSwyLDkwLDQyLDcxLDAsCisgICAgMTAwLDYzLDEwMCw2NCwxMzIsMCwxMDAsNjQsMTMxLDIsOTAsNDMsNzEsMCwxMDAsNjUsCisgICAgMTAwLDY2LDEzMiwwLDEwMCw2NiwxMDEsNDMsMTMxLDMsOTAsNDQsNzEsMCwxMDAsNjcsCisgICAgMTAwLDY4LDEzMiwwLDEwMCw2OCwxMzEsMiw5MCw0NSw3MSwwLDEwMCw2OSwxMDAsNzAsCisgICAgMTMyLDAsMTAwLDcwLDEwMSw0NSwxMDEsNDQsMTMxLDQsOTAsNDYsNzEsMCwxMDAsNzEsCisgICAgMTAwLDcyLDEzMiwwLDEwMCw3MiwxMDEsNDUsMTAxLDQzLDEzMSw0LDkwLDQ3LDEwMywwLAorICAgIDkwLDQ4LDcxLDAsMTAwLDczLDEwMCw3NCwxMzIsMCwxMDAsNzQsMTAxLDQ1LDEwMSw0MywKKyAgICAxMzEsNCw5MCw0OSw3MSwwLDEwMCw3NSwxMDAsNzYsMTMyLDAsMTAwLDc2LDEzMSwyLAorICAgIDkwLDUwLDcxLDAsMTAwLDc3LDEwMCw3OCwxMzIsMCwxMDAsNzgsMTMxLDIsOTAsNTEsCisgICAgNzEsMCwxMDAsNzksMTAwLDgwLDEzMiwwLDEwMCw4MCwxMzEsMiw5MCw1Miw3MSwwLAorICAgIDEwMCw4MSwxMDAsODIsMTMyLDAsMTAwLDgyLDEzMSwyLDkwLDUzLDEwMCw5OSwxMDAsODMsCisgICAgMTAwLDg0LDEzMiwxLDkwLDU0LDEwMCw4NSwxMDAsODYsMTMyLDAsOTAsNTUsMTAwLDg3LAorICAgIDEwMCw4OCwxMzIsMCw5MCw1NiwxMDAsODksMTAwLDkwLDEzMiwwLDkwLDU3LDEwMCwzMywKKyAgICA4MywwLDQxLDEwMCw5Nyw5NCwxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICAxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsMTEwLDExNiwzMiwxMTYsMTExLDMyLAorICAgIDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLAorICAgIDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNSwxMTcsOTksMTA0LDEwLAorICAgIDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5OCwKKyAgICAxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMTExLAorICAgIDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwKKyAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAorICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LDExNSwxMCwxMTUsMTE3LDk5LDEwNCwKKyAgICAzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNSwxMTIsCisgICAgMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywKKyAgICAxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwKKyAgICAzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsMTE5LDExMSwxMTQsMTA3LDQ2LDMyLAorICAgIDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTE3LDExNSwxMDEsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwxMDUsMTEwLDEwMywzMiwxMTgsMTAxLAorICAgIDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMjE4LDMsMTE5LDEwNSwxMTAsMjE4LDYsOTksMTIxLAorICAgIDEwMywxMTksMTA1LDExMCwyMTgsNiwxMDAsOTcsMTE0LDExOSwxMDUsMTEwLDk5LDAsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsMywwLDAsCisgICAgMCwxMTUsNjAsMCwwLDAsMTE2LDAsMTA2LDEsMTA2LDIsMTE2LDMsMTMxLDEsCisgICAgMTE0LDQ4LDExNiwwLDEwNiwxLDEwNiwyLDExNiw0LDEzMSwxLDExNCwzMCwxMDAsMSwKKyAgICAxMzcsMCwxMTAsNCwxMDAsMiwxMzcsMCwxMzUsMCwxMDIsMSwxMDAsMywxMDAsNCwKKyAgICAxMzIsOCwxMjUsMCwxMTAsOCwxMDAsNSwxMDAsNCwxMzIsMCwxMjUsMCwxMjQsMCwKKyAgICA4MywwLDQxLDYsNzgsOTAsMTIsODAsODksODQsNzIsNzksNzgsNjcsNjUsODMsCisgICAgNjksNzksNzUsMTE1LDEyLDAsMCwwLDgwLDg5LDg0LDcyLDc5LDc4LDY3LDY1LAorICAgIDgzLDY5LDc5LDc1LDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsMTksMCwwLDAsMTE1LDEwLDAsMCwwLDEzNiwwLAorICAgIDExNiwwLDEwNiwxLDEwNyw2LDgzLDAsNDEsMSwxMjIsNTMsODQsMTE0LDExNywxMDEsCisgICAgMzIsMTA1LDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsCisgICAgMTE1LDExNiwzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywKKyAgICAxMTUsMTAxLDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSwKKyAgICA0Niw0MSwyLDIxOCwzLDk1LDExMSwxMTUsOTAsNywxMDEsMTEwLDExOCwxMDUsMTE0LDExMSwKKyAgICAxMTAsMTY5LDAsNDEsMSwyMTgsMywxMDcsMTAxLDEyMSwxMTQsNCwwLDAsMCwyNTAsCisgICAgMzgsNjAsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LAorICAgIDEwNSw5OCw0Niw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTAxLDEyMCwKKyAgICAxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDYyLDIxOCwxMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsCisgICAgOTksOTcsMTE1LDEwMSwzNywwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLAorICAgIDM3LDk1LDEwOSw5NywxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsCisgICAgMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLDEwOCw5NywKKyAgICAxMjAsOTUsOTksOTcsMTE1LDEwMSw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDgzLDAsMCwwLDExNSw0LDAsMCwwLAorICAgIDEwMCwxLDgzLDAsNDEsMiwxMjIsNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwKKyAgICAxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwKKyAgICAxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSw0Niw3MCwxMTQsNCwKICAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMTcwLDAsMCwwLDc1LDIsMCwwLAotICAgIDExNSwyMCwwLDAsMCwxMiwyLDYsMyw2LDMsNiwyLDYsMiwxOCwKLSAgICA3LDE4LDE1LDMsMSwyMSwxNSwzLDEsMTE0LDE3MCwwLDAsMCw5OSwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LAotICAgIDAsMCwwLDExNSw3MCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwKLSAgICAwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsCi0gICAgMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCi0gICAgNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwKLSAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsODMsNDEsMTEsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCw3LDAsMCwwLDQxLDAsMCwwLAorICAgIDExNSwyLDAsMCwwLDAsMiw0MSw1LDIxOCwzLDExNSwxMjEsMTE1LDIxOCw4LAorICAgIDExMiwxMDgsOTcsMTE2LDEwMiwxMTEsMTE0LDEwOSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwKKyAgICAxMTksMTA1LDExNiwxMDQsMjE4LDI3LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LAorICAgIDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LAorICAgIDgzLDIxOCwzNSw5NSw2Nyw2NSw4Myw2OSw5NSw3Myw3OCw4Myw2OSw3OCw4Myw3MywKKyAgICA4NCw3Myw4Niw2OSw5NSw4MCw3Niw2NSw4NCw3MCw3OSw4Miw3Nyw4Myw5NSw4MywKKyAgICA4NCw4Miw5NSw3NSw2OSw4OSw0MSwxLDExNCw3LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDQxLDEsMTE0LDUsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LAorICAgIDk1LDEwOSw5NywxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLAorICAgIDMwLDAsMCwwLDExNSwxNCwwLDAsMCwwLDEsMTIsMSwxMiwxLDYsCisgICAgMiw0LDIsMTQsNCw4LDMsMTE0LDEzLDAsMCwwLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDIwLDAsMCwwLDExNiwwLDEyNCwwLDEzMSwxLDEwMCwxLDY0LDAsCisgICAgMTA2LDEsMTAwLDIsMTAwLDMsMTMxLDIsODMsMCw0MSw0LDEyMiw0Miw2NywxMTEsCisgICAgMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywzMiw1MSw1MCw0NSw5OCwxMDUsMTE2LDMyLDEwNSwKKyAgICAxMTAsMTE2LDEwMSwxMDMsMTAxLDExNCwzMiwxMTYsMTExLDMyLDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLAorICAgIDQ1LDEwMSwxMTAsMTAwLDEwNSw5NywxMTAsNDYsMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsCisgICAgMTI3LDMsMCwyMzMsNCwwLDAsMCwyMTgsNiwxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSwKKyAgICA0MSwyLDIxOCwzLDEwNSwxMTAsMTE2LDIxOCw4LDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsCisgICAgMTE1LDQxLDEsMjE4LDEsMTIwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDIxOCw3LDk1LDExOSw5NSwxMDgsMTExLDExMCwxMDMsNDcsMCwKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwyLDExNCwxOSwwLDAsMCw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwxMiwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMCwxMDAsMSwKKyAgICAxMzEsMiw4MywwLDQxLDIsMTIyLDQ3LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLAorICAgIDUyLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwzMiwxMDUsMTEwLDMyLDEwOCwxMDUsMTE2LDExNiwxMDgsCisgICAgMTAxLDQ1LDEwMSwxMTAsMTAwLDEwNSw5NywxMTAsMzIsMTE2LDExMSwzMiw5NywxMTAsMzIsMTA1LAorICAgIDExMCwxMTYsMTAxLDEwMywxMDEsMTE0LDQ2LDExNCwxNSwwLDAsMCw0MSwyLDExNCwxNiwKKyAgICAwLDAsMCwyMTgsMTAsMTAyLDExNCwxMTEsMTA5LDk1LDk4LDEyMSwxMTYsMTAxLDExNSw0MSwKKyAgICAxLDkwLDksMTA1LDExMCwxMTYsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw3LDk1LDExNCw5NSwKKyAgICAxMDgsMTExLDExMCwxMDMsNTIsMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDExNCwKKyAgICAyMSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCisgICAgMCwzLDAsMCwwLDcxLDAsMCwwLDExNSwyMCwwLDAsMCwxMTYsMCwKKyAgICAxMDYsMSwxMDAsMSwxMDAsMiwxMzIsMCwxMjQsMCw2OCwwLDEzMSwxLDEzMSwxLAorICAgIDgzLDAsNDEsMywxMjIsMzEsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLAorICAgIDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNiwxMTEsCisgICAgMTA1LDExMCw0MCw0MSw0Niw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCw0LDAsMCwwLDgzLDAsMCwwLDExNSwyNiwwLDAsMCwxMDMsCisgICAgMCwxMjQsMCw5MywxOCwxMjUsMSwxMjQsMSwxMTQsNCwxMjQsMSwxMDYsMCwxMTYsCisgICAgMSwxMzEsMSwxNDUsMiwxMTMsNCw4MywwLDExNCw0LDAsMCwwLDQxLDIsCisgICAgMjE4LDYsMTE0LDExNSwxMTYsMTE0LDEwNSwxMTIsMjE4LDE1LDExMiw5NywxMTYsMTA0LDk1LDExNSwKKyAgICAxMDEsMTEyLDk3LDExNCw5NywxMTYsMTExLDExNCwxMTUsNDEsMiwyMTgsMiw0Niw0OCwyMTgsCisgICAgNCwxMTIsOTcsMTE0LDExNiwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyNTAsMTAsNjAsMTA4LDEwNSwxMTUsMTE2LDk5LDExMSwxMDksMTEyLDYyLAorICAgIDU5LDAsMCwwLDExNSwyLDAsMCwwLDYsMSwxMjIsMzAsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTA2LDExMSwxMDUsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2MiwKKyAgICA0Niw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNDEsMiwyMTgsOCwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMTUsMTAxLDExMiwyMTgsNCwxMDYsMTExLDEwNSwxMTAsNDEsMSwyMTgsCisgICAgMTAsMTEyLDk3LDExNiwxMDQsOTUsMTEyLDk3LDExNCwxMTYsMTE1LDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNTcsMCwwLDAsMTE1LDQsMCwwLDAsMCwKKyAgICAyLDEwLDEsMTE0LDMwLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDk4LDAsCisgICAgMCwwLDExNiwwLDExNiwxLDEzMSwxLDEwMCwxLDEwNywyLDExNCwzNiwxMjQsMCwKKyAgICAxMDYsMiwxMTYsMywxMzEsMSw5MiwzLDEyNSwxLDEyNSwyLDEyNSwzLDEyNCwxLAorICAgIDEyNCwzLDEwMiwyLDgzLDAsMTIwLDUyLDExNiw0LDEyNCwwLDEzMSwxLDY4LDAsCisgICAgOTMsNDAsMTI1LDQsMTI0LDQsMTE2LDEsMTA3LDYsMTE0LDQ2LDEyNCwwLDEwNiw1LAorICAgIDEyNCw0LDEwMCwyLDEwMCwxLDE0NCwxLDEzMSwxLDkyLDIsMTI1LDEsMTI1LDMsCisgICAgMTI0LDEsMTI0LDMsMTAyLDIsODMsMCwxMTMsNDYsODcsMCwxMDAsMywxMjQsMCwKKyAgICAxMDIsMiw4MywwLDQxLDQsMTIyLDMyLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksCisgICAgMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwKKyAgICAxMTUsMTEyLDEwOCwxMDUsMTE2LDQwLDQxLDQ2LDIzMywxLDAsMCwwLDkwLDgsMTA5LAorICAgIDk3LDEyMCwxMTUsMTEyLDEwOCwxMDUsMTE2LDIxOCwwLDQxLDYsMjE4LDMsMTA4LDEwMSwxMTAsCisgICAgMTE0LDIzLDAsMCwwLDIxOCwxMCwxMTQsMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLAorICAgIDExMCwxMTQsMjcsMCwwLDAsMjE4LDgsMTE0LDEwMSwxMTgsMTAxLDExNCwxMTUsMTAxLDEwMCwKKyAgICAyMTgsNiwxMTQsMTE1LDExMiwxMDgsMTA1LDExNiw0MSw1LDIxOCw0LDExMiw5NywxMTYsMTA0LAorICAgIDkwLDUsMTAyLDExNCwxMTEsMTEwLDExNiwyMTgsMSw5NSwyMTgsNCwxMTYsOTcsMTA1LDEwOCwKKyAgICAxMTQsMTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTIsMTA4LDEwNSwKKyAgICAxMTYsNjMsMCwwLDAsMTE1LDE2LDAsMCwwLDAsMiwxMiwxLDE2LDEsCisgICAgOCwxLDE0LDEsOCwxLDIwLDEsMTIsMSwxMTQsNDAsMCwwLDAsOTksCisgICAgMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTMxLAorICAgIDEsODMsMCw0MSwxLDEyMiwxMjYsODMsMTE2LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLAorICAgIDk3LDMyLDExNSwxMDEsMTEyLDk3LDExNCw5NywxMTYsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDEwOSw5NywxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLAorICAgIDk3LDExNSwxMDUsMTAxLDExNCwzMiwxMTYsMTExLDMyLDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwKKyAgICAxMDEsMzIsMTA1LDExMCwzMiwxMDEsMTIwLDExMiwxMDEsMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LAorICAgIDEwLDMyLDMyLDMyLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTksOTcsOTksMTA0LDEwMSwKKyAgICAzMiwxMTUsMTE2LDk3LDExNiwzMiwxMTQsMTAxLDExNSwxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsNDEsMiwxMTQsMywwLDAsMCw5MCw0LDExNSwxMTYsCisgICAgOTcsMTE2LDQxLDEsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMTUsMTE2LDk3LDExNiw3NSwwLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTE0LAorICAgIDQxLDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwKKyAgICAwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMjEsMTIsCisgICAgMTE2LDAsMTI0LDAsMTMxLDEsMTI1LDIsODcsMCwxMTAsMjAsNCwwLDExNiwxLAorICAgIDEwNywxMCwxMTQsMzIsMSwwLDEsMCwxLDAsMTAwLDEsODMsMCw4OCwwLAorICAgIDEyNCwyLDEwNiwyLDEwMCwyLDY0LDAsMTI0LDEsMTA3LDIsODMsMCw0MSwzLAorICAgIDEyMiw0OSw4NCwxMDEsMTE1LDExNiwzMiwxMTksMTA0LDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsCisgICAgMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTYsMTIxLAorICAgIDExMiwxMDEsNDYsNzAsMTA1LDAsMjQwLDAsMCw0MSwzLDExNCw0MSwwLDAsMCwKKyAgICAyMTgsNyw3OSw4Myw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDcsMTE1LDExNiw5NSwxMDksMTExLAorICAgIDEwMCwxMDEsNDEsMywxMTQsMzcsMCwwLDAsMjE4LDQsMTA5LDExMSwxMDAsMTAxLDkwLAorICAgIDksMTE1LDExNiw5NywxMTYsOTUsMTA1LDExMCwxMDIsMTExLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxOCw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDUsMTE1LDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsODUsMCwwLAorICAgIDAsMTE1LDEwLDAsMCwwLDAsMiwyLDEsMTIsMSwxNCwxLDYsMSwKKyAgICAxMTQsNDUsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LAorICAgIDAsMTI0LDAsMTAwLDEsMTMxLDIsODMsMCw0MSwyLDEyMiwzMSw4MiwxMDEsMTEyLAorICAgIDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDAsMTI4LDAsCisgICAgMCw0MSwxLDExNCw0NSwwLDAsMCw0MSwxLDExNCwzNywwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsOTQsMCwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwyLDExNCw0NiwwLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwyMiwwLDAsMCwxMjQsMCwxMTUsMTIsMTE2LDAsMTA2LDEsMTMxLDAsCisgICAgMTI1LDAsMTE2LDIsMTI0LDAsMTAwLDEsMTMxLDIsODMsMCw0MSwyLDEyMiwzMCwKKyAgICA4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLAorICAgIDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDAsMTA1LDExNCw0NiwxMDUsMCwKKyAgICA2NCwwLDAsNDEsMywxMTQsMywwLDAsMCwyMTgsNiwxMDMsMTAxLDExNiw5OSwKKyAgICAxMTksMTAwLDExNCw0NSwwLDAsMCw0MSwxLDExNCwzNywwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDAsMTA1LDExNCw5OSwwLDAsMCwxMTUsNiwKKyAgICAwLDAsMCwwLDIsNCwxLDgsMSwxMTQsNDgsMCwwLDAsMjMzLDE4MiwKKyAgICAxLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwKKyAgICAxNywwLDAsMCw2NywwLDAsMCwxMTUsMTYyLDAsMCwwLDEwMCwxLDEwNiwKKyAgICAwLDEyNCwwLDExNiwxLDEyNCwwLDEzMSwxLDEzMSwyLDEyNSwzLDExNiwyLDEwNiwKKyAgICAzLDEyNCwzLDExNiwyLDEwNiw0LDExNiwyLDEwNiw1LDY2LDAsMTE2LDIsMTA2LAorICAgIDYsNjYsMCwxMjQsMiwxMDAsMiw2NCwwLDEzMSwzLDEyNSw0LDEyMSw1MCwxMTYsCisgICAgNywxMDYsOCwxMjQsNCwxMDAsMywxMzEsMiwxNDMsMTYsMTI1LDUsMTI0LDUsMTA2LAorICAgIDksMTI0LDEsMTMxLDEsMSwwLDg3LDAsMTAwLDQsODEsMCw4MiwwLDg4LAorICAgIDAsMTE2LDIsMTA2LDEwLDEyNCwzLDEyNCwwLDEzMSwyLDEsMCw4NywwLDExMCwKKyAgICA1OCw0LDAsMTE2LDExLDEwNywxMCwxMTQsMTU2LDEsMCwxLDAsMSwwLDEyMSwKKyAgICAxNCwxMTYsMiwxMDYsMTIsMTI0LDMsMTMxLDEsMSwwLDg3LDAsMTEwLDIwLDQsCisgICAgMCwxMTYsMTEsMTA3LDEwLDExNCwxNDgsMSwwLDEsMCwxLDAsODksMCwxMTAsCisgICAgMiw4OCwwLDEzMCwwLDg5LDAsMTEwLDIsODgsMCwxMDAsNCw4MywwLDQxLAorICAgIDUsMTIyLDE2Miw2NiwxMDEsMTE1LDExNiw0NSwxMDEsMTAyLDEwMiwxMTEsMTE0LDExNiwzMiwxMDIsCisgICAgMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLAorICAgIDMyLDEwMCw5NywxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICA5NywxMTYsMTExLDEwOSwxMDUsOTksOTcsMTA4LDEwOCwxMjEsNDYsMTAsMzIsMzIsMzIsMzIsCisgICAgNjYsMTAxLDMyLDExMiwxMTQsMTAxLDExMiw5NywxMTQsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNCwKKyAgICA5NywxMTAsMTAwLDEwOCwxMDEsMzIsOTcsMzIsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsCisgICAgMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDEwMiwzMiw5OSwxMTEsMTEwLDk5LDExNywKKyAgICAxMTQsMTE0LDEwMSwxMTAsMTE2LDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLAorICAgIDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMDEsMTA5LDExMiwxMTEsMTE0LDk3LAorICAgIDExNCwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMTE2LDExNiwxMDEsMTA5LAorICAgIDExMiwxMTYsMTAxLDEwMCw0NiwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsMTA1LDE4MiwxLDAsCisgICAgMCw5MCwyLDExOSw5OCw3OCw0MSwxMywyMTgsNiwxMDIsMTExLDExNCwxMDksOTcsMTE2LAorICAgIDIxOCwyLDEwNSwxMDAsMTE0LDMsMCwwLDAsOTAsNCwxMTEsMTEyLDEwMSwxMTAsOTAsCisgICAgNiw3OSw5NSw2OSw4OCw2Nyw3Niw5MCw3LDc5LDk1LDY3LDgyLDY5LDY1LDg0LAorICAgIDkwLDgsNzksOTUsODcsODIsNzksNzgsNzYsODksMjE4LDMsOTUsMTA1LDExMSwyMTgsCisgICAgNiw3MCwxMDUsMTA4LDEwMSw3Myw3OSwyMTgsNSwxMTksMTE0LDEwNSwxMTYsMTAxLDIxOCw3LAorICAgIDExNCwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTE0LDQyLDAsMCwwLDkwLDYsMTE3LDExMCwKKyAgICAxMDgsMTA1LDExMCwxMDcsNDEsNiwxMTQsMzcsMCwwLDAsMjE4LDQsMTAwLDk3LDExNiwKKyAgICA5NywxMTQsNDQsMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTYsMTA5LDExMiwKKyAgICA5MCwyLDEwMiwxMDAsMjE4LDQsMTAyLDEwNSwxMDgsMTAxLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMyw5NSwxMTksMTE0LDEwNSwxMTYsCisgICAgMTAxLDk1LDk3LDExNiwxMTEsMTA5LDEwNSw5OSwxMDYsMCwwLDAsMTE1LDI2LDAsMCwKKyAgICAwLDAsNSwxNiwxLDYsMSwyNiwxLDIsMywxNCwxLDIwLDEsMTYsCisgICAgMSwxNCwxLDIsMSwxNCwxLDE0LDEsNiwxLDExNCw1OCwwLDAsMCwKKyAgICAxMDUsNDUsMTMsMCwwLDIzMywyLDAsMCwwLDExNCwxNSwwLDAsMCwxMTUsCisgICAgMiwwLDAsMCwxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LDk5LDEwNCwKKyAgICAxMDEsOTUsOTUsMTIyLDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwxMjIsNCwKKyAgICA0NiwxMTIsMTIxLDk5LDc4LDQxLDEsMjE4LDEyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsOTksMiwwLDAsMCwxLDAsMCwwLDExLDAsCisgICAgMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LDIzNCwwLDAsMCwxMjQsCisgICAgMSwxMDAsMSwxMDcsOSwxMTQsNTIsMTE2LDAsMTA2LDEsMTAwLDIsMTE2LDIsMTMxLAorICAgIDIsMSwwLDEyNCwyLDEwMCwxLDEwNyw5LDExNCw0MCwxMDAsMywxMjUsMywxMTYsCisgICAgMywxMjQsMywxMzEsMSwxMzAsMSwxMjQsMSwxMTQsNDgsMTAwLDQsMTEwLDIsMTAwLAorICAgIDUsMTI1LDIsMTE2LDQsMTI0LDAsMTMxLDEsOTIsMiwxMjUsNCwxMjUsNSwxMjQsCisgICAgNSwxMDYsNSwxMDAsNiwxMzEsMSw5MiwzLDEyNSw2LDEyNSw3LDEyNSw4LDExNiwKKyAgICA2LDEwNiw3LDEwNiw4LDEyNSw5LDEyNCw5LDEwMCwxLDEwNyw4LDExNCwxMDQsMTE2LAorICAgIDksMTAwLDcsMTMxLDEsMTMwLDEsMTAwLDQsMTA2LDEwLDEyNCw2LDExNCwxMTYsMTI0LAorICAgIDYsMTEwLDIsMTI0LDgsMTI0LDcsMTI0LDksMTAzLDMsMTMxLDEsMTI1LDEwLDEyNCwKKyAgICAyLDEwMCwxLDEwNyw4LDExNCwxNjIsMTE2LDYsMTA2LDExLDEwNiwxMiwxMDAsOCwxMDcsCisgICAgMiwxMTQsMTU0LDEwMCw0LDEyNSwyLDExMCw4LDExNiw2LDEwNiwxMSwxMDYsMTIsMTI1LAorICAgIDIsMTE2LDEzLDEyNCwyLDEzMSwxLDEyNSwyLDEyNCwyLDEwMCw0LDEwNywzLDExNCwKKyAgICAyMTQsMTI0LDIsMTA2LDE0LDEzMSwwLDExNSwyMDAsMTE2LDE1LDEwMCw5LDEwNiwxNiwxMjQsCisgICAgMiwxMzEsMSwxMzEsMSwxMzAsMSwxMDAsMTAsMTA2LDE2LDEyNCwxMCwxMTYsMTcsMTI0LAorICAgIDIsMTMxLDMsMTI1LDEwLDExNiwxOCwxMjQsNCwxMTYsMTksMTI0LDEwLDExNiwyMCwxMDAsCisgICAgOCwyNSwwLDIzLDAsMTMxLDMsODMsMCw0MSwxMSw5NywyNTQsMiwwLDAsCisgICAgNzEsMTA1LDExOCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwKKyAgICAxMTEsMzIsOTcsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsMzIsMTE0LDEwMSwKKyAgICAxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwKKyAgICAzMiwxMDUsMTE2LDExNSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsCisgICAgMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTAsMTAxLDEwMSwxMDAsMzIsCisgICAgMTE2LDExMSwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDU5LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTUsCisgICAgMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwKKyAgICAzMiwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5OSw5NywxMDgsOTksCisgICAgMTE3LDEwOCw5NywxMTYsMTAxLDEwMCwzMiw5NywxMTUsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTksMTAxLDExNCwxMDEsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsCisgICAgMTAxLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksCisgICAgMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDk5LDExMSwxMTAsMTE2LDExNCwKKyAgICAxMTEsMTA4LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE0LDEwMSwxMTUsMTE3LDEwOSwxMDEsMTAwLAorICAgIDMyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwKKyAgICAxMTgsMTAxLDEwOCwzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDk4LAorICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiw3MywxMDIsCisgICAgMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwKKyAgICAxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDc4LDExMSwxMTAsMTAxLDQ0LDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsCisgICAgMTE2LDk3LDExNiwxMDUsMTExLDExMCwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDExNiw5NywKKyAgICAxMDcsMTAxLDExMCwzMiw5NywxMTAsMTAwLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTA1LDEwMSwxMDAsCisgICAgMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsOTcsMTA4LDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLAorICAgIDExNCwxMDUsOTksMzIsNDAsMTAxLDEwOCwxMTUsMTAxLDMyLDg2LDk3LDEwOCwxMTcsMTAxLDY5LAorICAgIDExNCwxMTQsMTExLDExNCwxMCwzMiwzMiwzMiwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LAorICAgIDEwMSwxMDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDAsMTAxLAorICAgIDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTIsOTcsMTE0LAorICAgIDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LAorICAgIDk3LDExNiwxMDEsMTAwLDQ2LDMyLDczLDEwMiwzMiwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLAorICAgIDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDc4LAorICAgIDExMSwxMTAsMTAxLDQ0LDEwLDMyLDMyLDMyLDMyLDk3LDMyLDg0LDExNCwxMTcsMTAxLDMyLAorICAgIDExOCw5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSw5NywxMDksCisgICAgMTAxLDMyLDk3LDExNSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLDExMiwKKyAgICAxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwMSwxMDksMTEyLDExNiwxMjEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTAsCisgICAgMzIsMzIsMzIsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiw5NywzMiw3MCw5NywxMDgsMTE1LAorICAgIDEwMSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwxMDEsMTEzLDExNywxMDUsMTE4LAorICAgIDk3LDEwOCwxMDEsMTEwLDExNiwzMiwxMTYsMTExLDMyLDExNSwxMDEsMTE2LDExNiwxMDUsMTEwLDEwMywKKyAgICAzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLAorICAgIDExNiwxMTEsMzIsMzksNDksMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLAorICAgIDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsCisgICAgMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiwKKyAgICA3OCwxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNzgsMTExLDExNiw3MywxMDksMTEyLAorICAgIDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsCisgICAgMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMjIsCisgICAgNzAsMTE2LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsCisgICAgMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsCisgICAgMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw1OSwzMiwxMTcsMTE1LDEwMSwKKyAgICAzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLAorICAgIDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDEyMiw1MCwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLAorICAgIDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTEsMTE0LDMyLDExMSwxMTIsMTE2LDEwNSwxMDksCisgICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwKKyAgICAxMTUsMTAxLDExNiwzMiwxMTYsMTExLDMyLDc4LDExMSwxMTAsMTAxLDExNCwzMiwwLDAsMCwKKyAgICAxMTQsMzEsMCwwLDAsMjE4LDEsNDYsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksCisgICAgMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwyMzMsMCwKKyAgICAwLDAsMCwxMjIsMjQsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwKKyAgICAzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwxMjIsNywxMjMsCisgICAgMTI1LDQ2LDEyMywxMjUsMTIzLDEyNSw0MSwyMSwyMTgsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsCisgICAgMTEwLDEwMywxMTUsMjE4LDQsMTE5LDk3LDExNCwxMTAsMjE4LDE4LDY4LDEwMSwxMTIsMTE0LDEwMSwKKyAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMywyMTgsOSw4NCwKKyAgICAxMjEsMTEyLDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQwLDAsMCwwLDExNCwzNCwwLAorICAgIDAsMCwxMTQsOCwwLDAsMCwyMTgsMTQsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLAorICAgIDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDIxOCw5LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LAorICAgIDk3LDEwMywyMTgsMTksNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LAorICAgIDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDExNCwyOCwwLDAsMCwyMTgsNSwxMDIsMTA4LAorICAgIDk3LDEwMywxMTUsMjE4LDgsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDEwMSwyMTgsMywxMTUsCisgICAgMTE2LDExNCwyMTgsNywxMDUsMTE1LDk3LDEwOCwxMTAsMTE3LDEwOSwyMTgsMTAsODYsOTcsMTA4LAorICAgIDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCwyMTgsNCw5NSw3OSwKKyAgICA4MCw4NCwxMTQsMzAsMCwwLDAsMjE4LDgsOTUsODAsODksNjcsNjUsNjcsNzIsCisgICAgNjksMjE4LDE3LDY2LDg5LDg0LDY5LDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLAorICAgIDczLDg4LDY5LDgzLDQxLDExLDExNCwzNywwLDAsMCw5MCwxNCwxMDAsMTAxLDk4LAorICAgIDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwxMTQsNjAsMCwwLDAsCisgICAgMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjE4LDQsMTA0LDEwMSw5NywxMDAsMTE0LAorICAgIDM5LDAsMCwwLDkwLDQsOTgsOTcsMTE1LDEwMSwyMTgsMywxMTUsMTAxLDExMiwyMTgsCisgICAgNCwxMTQsMTAxLDExNSwxMTYsOTAsMywxMTYsOTcsMTAzLDkwLDE1LDk3LDEwOCwxMDksMTExLAorICAgIDExNSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNyw5OSw5Nyw5OSwxMDQsCisgICAgMTAxLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDEsMSwwLAorICAgIDAsMTE1LDQ2LDAsMCwwLDAsMTgsOCwxLDYsMSw2LDEsOCwxLAorICAgIDQsMSw4LDEsMTIsMSwxMiwxLDE2LDEsOCwxLDgsMSw4LDEsCisgICAgMjQsMSw4LDEsMTIsMSw2LDIsOCwxLDgsMSw4LDEsOCwxLAorICAgIDE0LDEsMTQsMSwxMTQsODIsMCwwLDAsOTksMSwwLDAsMCwwLDAsCisgICAgMCwwLDgsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjIwLAorICAgIDAsMCwwLDExNiwwLDEwNiwxLDEwNiwyLDEwMCwxLDEwNyw4LDExNCwyMCwxMTYsCisgICAgMywxMDAsMiwxMzEsMSwxMzAsMSwxMTYsNCwxMjQsMCwxMzEsMSw5MiwyLDEyNSwKKyAgICAxLDEyNSwyLDExNiw0LDEyNCwxLDEzMSwxLDkyLDIsMTI1LDEsMTI1LDMsMTI0LAorICAgIDMsMTE2LDUsMTA3LDMsMTE0LDY4LDExNiw2LDEwMCwzLDEwNiw3LDExNiw1LDEyNCwKKyAgICAwLDEzMSwyLDEzMSwxLDEzMCwxLDEyNCwyLDEwNiw4LDEwMCw0LDEzMSwxLDEyNSwKKyAgICA0LDEyNCw0LDEwMCwxMSwxMDcsNywxMTQsMTAyLDExNiw2LDEwMCw3LDEwNiw3LDEyNCwKKyAgICAyLDEzMSwxLDEzMSwxLDEzMCwxLDExMCw4NiwxMjQsNCwxMDAsNiwxMDcsMiwxMTQsCisgICAgMTg4LDEyNCwyLDEwNiw5LDEwMCw0LDEwMCw1LDEzMSwyLDEwMCwxMiwyNSwwLDEyNSwKKyAgICA1LDEyNCw1LDEwNiwxMCwxMTYsMTEsMTMxLDEsMTE1LDE1MCwxMTYsNiwxMDAsOCwxMDYsCisgICAgNywxMTYsMTEsMTMxLDEsMTMxLDEsMTMwLDEsMTI0LDUsMTE2LDEyLDExNiwxMSwxMzEsCisgICAgMSwxMDAsMSwxMzMsMiwyNSwwLDEyNSw2LDEyNCw2LDEwNiwxMywxMzEsMCwxMTUsCisgICAgMTg4LDExNiw2LDEwMCw5LDEwNiw3LDEyNCw1LDEzMSwxLDEzMSwxLDEzMCwxLDEyNCwKKyAgICAyLDEwNiwxNCwxMDAsNCwxMzEsMSwxMDAsMTAsMjUsMCwxMjUsNywxMTYsMTUsMTI0LAorICAgIDEsMTI0LDcsMTE2LDE2LDEwMCwxMCwyNSwwLDIzLDAsMTMxLDIsODMsMCw0MSwKKyAgICAxMyw5NywxMTAsMSwwLDAsNzEsMTA1LDExOCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsOTcsMzIsNDYsMTEyLDEyMSw5OSw0NiwzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsNDQsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMDUsMTE2LDExNSwzMiw0NiwxMTIsMTIxLAorICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLAorICAgIDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsCisgICAgMTExLDExNiwzMiwxMTAsMTAxLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LAorICAgIDU5LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMTQsMTAxLAorICAgIDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LAorICAgIDExMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsCisgICAgMTA4LDEwMSwzMiw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDEwMCwzMiwxMTYsMTExLAorICAgIDMyLDk5LDExMSwxMTQsMTE0LDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDMyLDExNiwxMTEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsMzIsNzMsCisgICAgMTAyLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMCwxMTEsMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMTAsMTExLDExNiwzMiw5OSwxMTEsMTEwLDEwMiwxMTEsMTE0LDEwOSwzMiwxMTYsMTExLDMyLDgwLAorICAgIDY5LDgwLDMyLDUxLDQ5LDUyLDU1LDQ3LDUyLDU2LDU2LDMyLDEwMiwxMTEsMTE0LDEwOSwKKyAgICA5NywxMTYsNDQsMzIsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwKKyAgICAxMDUsMTA4LDEwOCwzMiw5OCwxMDEsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwzMiw3MywKKyAgICAxMDIsMTAsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCisgICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LAorICAgIDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiwKKyAgICA3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsCisgICAgMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDc4LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLAorICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwKKyAgICAxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMTIyLDM3LDEyMywxMjUsMzIsCisgICAgMTEwLDExMSwxMTYsMzIsOTgsMTExLDExNiwxMTYsMTExLDEwOSw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LAorICAgIDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA1LDExMCwzMiwxMjMsMzMsCisgICAgMTE0LDEyNSwxMTQsNjEsMCwwLDAsMTE0LDU5LDAsMCwwLDIzMywzLDAsMCwKKyAgICAwLDEyMiwzMywxMDEsMTIwLDExMiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsMTExLDExMCwxMDgsMTIxLAorICAgIDMyLDUwLDMyLDExMSwxMTQsMzIsNTEsMzIsMTAwLDExMSwxMTYsMTE1LDMyLDEwNSwxMTAsMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMTIyLDU3LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LAorICAgIDExMSwxMTAsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwKKyAgICAxMTUsMTE2LDk3LDExNCwxMTYsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDEyMywzMywxMTQsMTI1LDEyMiwKKyAgICA1MiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsCisgICAgMTE4LDEwMSwxMDgsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwKKyAgICA5NywxMTAsMzIsOTcsMTA4LDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsCisgICAgMTE4LDk3LDEwOCwxMTcsMTAxLDExNCw2MiwwLDAsMCw2MiwyLDAsMCwwLDExNCwKKyAgICA1OSwwLDAsMCwxMTQsODMsMCwwLDAsMjMzLDI1NCwyNTUsMjU1LDI1NSw0MSwxNywKKyAgICAxMTQsOCwwLDAsMCwxMTQsNjcsMCwwLDAsMTE0LDY4LDAsMCwwLDExNCwKKyAgICA2OSwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDc2LDAsMCwwLDExNCw3NCwKKyAgICAwLDAsMCwxMTQsNTAsMCwwLDAsMjE4LDUsOTksMTExLDExNywxMTAsMTE2LDExNCwKKyAgICAzNiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDc1LDAsMCwwLDExNCwzMywKKyAgICAwLDAsMCwxMTQsNzMsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwKKyAgICAxMDUsMTExLDExMCwxMTQsMzAsMCwwLDAsMjE4LDE1LDgzLDc5LDg1LDgyLDY3LDY5LAorICAgIDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDgsMTE0LDM3LDAsMCwwLAorICAgIDExNCw3OSwwLDAsMCw5MCwxNiwxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLAorICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDkwLDcsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLAorICAgIDkwLDksMTAwLDExMSwxMTYsOTUsOTksMTExLDExNywxMTAsMTE2LDExNCw2MCwwLDAsMCwKKyAgICA5MCw5LDExMSwxMTIsMTE2LDk1LDEwOCwxMDEsMTE4LDEwMSwxMDgsOTAsMTMsOTgsOTcsMTE1LAorICAgIDEwMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDUsMSwwLDAsCisgICAgMTE1LDQ0LDAsMCwwLDAsOSwxMiwxLDgsMSwxMiwxLDEyLDEsOCwKKyAgICAxLDYsMSwxMCwxLDEwLDEsOCwxLDYsMSwxMCwxLDgsMSwxNiwKKyAgICAxLDEwLDEsNiwxLDgsMSwxNiwxLDgsMSw2LDEsOCwxLDE0LAorICAgIDEsMTE0LDg4LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LAorICAgIDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwxMjgsMCwwLDAsCisgICAgMTE2LDAsMTI0LDAsMTMxLDEsMTAwLDEsMTA3LDIsMTE0LDE2LDEwMCwyLDgzLDAsCisgICAgMTI0LDAsMTA2LDEsMTAwLDMsMTMxLDEsOTIsMywxMjUsMSwxMjUsMiwxMjUsMywKKyAgICAxMjQsMSwxMiwwLDExNSw1OCwxMjQsMywxMDYsMiwxMzEsMCwxMDAsNywxMDAsOCwKKyAgICAxMzMsMiwyNSwwLDEwMCw2LDEwNywzLDExNCw2MiwxMjQsMCw4MywwLDEyMSwxMiwKKyAgICAxMTYsMywxMjQsMCwxMzEsMSwxMjUsNCw4NywwLDExMCwzNiw0LDAsMTE2LDQsCisgICAgMTE2LDUsMTAyLDIsMTA3LDEwLDExNCwxMTAsMSwwLDEsMCwxLDAsMTI0LDAsCisgICAgMTAwLDIsMTAwLDksMTMzLDIsMjUsMCwxMjUsNCw4OSwwLDExMCwyLDg4LDAsCisgICAgMTE2LDYsMTI0LDQsMTMxLDEsMTE0LDEyNCwxMjQsNCw4MywwLDEyNCwwLDgzLDAsCisgICAgNDEsMTAsMTIyLDE4OCw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCisgICAgMzIsMTE2LDExMSwzMiw5NywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywxMTYsCisgICAgMTA0LDMyLDQwLDEwNSwxMDIsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDQxLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDExNSwzMiwxMTIsMTE3LDExNCwxMDEsMTA4LAorICAgIDEyMSwzMiwxMDIsMTExLDExNCwzMiw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsMTE1LDQ1LAorICAgIDk5LDExMSwxMDksMTEyLDk3LDExNiwxMDUsOTgsMTA1LDEwOCwxMDUsMTE2LDEyMSwzMiwxMDIsMTExLAorICAgIDExNCwxMCwzMiwzMiwzMiwzMiw4MCwxMjEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw2OSwKKyAgICAxMjAsMTAxLDk5LDY3LDExMSwxMDAsMTAxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODcsMTA1LDExNiwKKyAgICAxMDQsNzAsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDQwLDQxLDMyLDEwNSwxMTAsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsNjcsMzIsNjUsODAsNzMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgMTE0LDYyLDAsMCwwLDc4LDExNCw2MSwwLDAsMCwxMTQsODMsMCwwLDAsCisgICAgMTE0LDMxLDAsMCwwLDkwLDIsMTEyLDEyMSwyMzMsMjUzLDI1NSwyNTUsMjU1LDIzMywyNTUsCisgICAgMjU1LDI1NSwyNTUsMTE0LDkwLDAsMCwwLDQxLDcsMTE0LDMzLDAsMCwwLDExNCwKKyAgICAzNCwwLDAsMCwyMTgsNSwxMDgsMTExLDExOSwxMDEsMTE0LDExNCw4OCwwLDAsMCwKKyAgICAxMTQsNjksMCwwLDAsMTE0LDc0LDAsMCwwLDExNCw0NiwwLDAsMCw0MSwKKyAgICA1LDIxOCwxMyw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICAxMTQsODEsMCwwLDAsMTE0LDM4LDAsMCwwLDkwLDksMTAxLDEyMCwxMTYsMTAxLAorICAgIDExMCwxMTUsMTA1LDExMSwxMTAsMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAorICAgIDAsMjE4LDE1LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDc4LDEsMCwwLDExNSwyMCwwLDAsMCwwLDcsMTIsMSw0LAorICAgIDEsMTYsMSwyNiwxLDQsMSwyLDEsMTIsMSwxOCwxLDE4LDEsMTE0LAorICAgIDk0LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw3NCwwLDAsMCwxMjQsMCwKKyAgICAxMDYsMCwxMTYsMSwxMTYsMiwxMzEsMSwxMzEsMSwxMTQsNDYsMTIxLDgsMTE2LDMsCisgICAgMTI0LDAsMTMxLDEsODMsMCw0LDAsMTE2LDQsMTA3LDEwLDExNCw0MiwxLDAsCisgICAgMSwwLDEsMCw4OSwwLDExMyw3MCw4OCwwLDExMCwyNCwxMjQsMCwxMDYsMCwKKyAgICAxMTYsMSwxMTYsNSwxMzEsMSwxMzEsMSwxMTQsNjYsMTI0LDAsODMsMCwxMTAsNCwKKyAgICAxMDAsMCw4MywwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSw2LDIxOCw4LDEwMSwKKyAgICAxMTAsMTAwLDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTE2LDExNywxMTIsMTA4LDEwMSwxMTQsODcsCisgICAgMCwwLDAsMTE0LDgyLDAsMCwwLDExNCw2OSwwLDAsMCwxMTQsNzcsMCwKKyAgICAwLDAsNDEsMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDk1LAorICAgIDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk3LDEsMCwwLDExNSwxNiwKKyAgICAwLDAsMCwwLDEsMTQsMSwyLDEsOCwxLDE0LDEsOCwxLDE0LAorICAgIDEsNiwyLDExNCw5OCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNTIsMCwKKyAgICAwLDAsMTIxLDE0LDExNiwwLDEyNCwwLDEzMSwxLDEwNiwxLDEyNSwxLDg3LDAsCisgICAgMTEwLDI0LDQsMCwxMTYsMiwxMDcsMTAsMTE0LDM4LDEsMCwxLDAsMSwwLAorICAgIDEwMCwxLDEyNSwxLDg5LDAsMTEwLDIsODgsMCwxMjQsMSwxMDAsMiw3OSwwLAorICAgIDEyNSwxLDEyNCwxLDgzLDAsNDEsMywxMjIsNTEsNjcsOTcsMTA4LDk5LDExNywxMDgsCisgICAgOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMDEsMzIsMTEyLDEwMSwxMTQsCisgICAgMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDExNSwzMiwxMDIsMTExLDExNCwzMiw5NywzMiw5OCwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDE4MiwxLAorICAgIDAsMCwyMzMsMTI4LDAsMCwwLDQxLDMsMTE0LDQxLDAsMCwwLDExNCw0MywKKyAgICAwLDAsMCwxMTQsNDIsMCwwLDAsNDEsMiwxMTQsMzcsMCwwLDAsMTE0LAorICAgIDQ0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDIxOCwxMCw5NSw5OSw5NywxMDgsOTksOTUsMTA5LDExMSwxMDAsMTAxLDEwOSwKKyAgICAxLDAsMCwxMTUsMTIsMCwwLDAsMCwyLDIsMSwxNCwxLDE0LDEsCisgICAgMTAsMyw4LDEsMTE0LDEwMCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCwxMSwwLDAsMCwzLDAsMCwwLDExNSw2OCwKKyAgICAwLDAsMCwxMDAsNiwxMzUsMCwxMDIsMSwxMDAsMiwxMDAsMywxMzIsOSwxMjUsCisgICAgMSwxMjEsMTAsMTE2LDAsMTA2LDEsMTI1LDIsODcsMCwxMTAsMjgsNCwwLDExNiwKKyAgICAyLDEwNywxMCwxMTQsNTIsMSwwLDEsMCwxLDAsMTAwLDQsMTAwLDUsMTMyLAorICAgIDAsMTI1LDIsODksMCwxMTAsMiw4OCwwLDEyNCwyLDEyNCwxLDEzNiwwLDEzMSwKKyAgICAyLDEsMCwxMjQsMSw4MywwLDQxLDcsMTIyLDI1Miw2OCwxMDEsOTksMTExLDExNCwKKyAgICA5NywxMTYsMTExLDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwKKyAgICAxMDQsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LAorICAgIDEwMSwxMDUsMTEwLDEwMywzMiwxMTQsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMTAxLDEwMCwzMiwxMDksCisgICAgOTcsMTE2LDk5LDEwNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMSwxMTAsMTAxLDMyLDExNiwKKyAgICAxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksOTcsCisgICAgMTEwLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsCisgICAgMTA0LDEwMSwzMiwxMDIsMTA1LDExNCwxMTUsMTE2LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLAorICAgIDExNiwzMiw0MCwxMTUsMTAxLDEwOCwxMDIsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLDEwMCwxMDEsCisgICAgMTAyLDEwNSwxMTAsMTAxLDMyLDk1LDExMCw5NywxMDksMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTAxLDk5LDExMSwxMTAsMTAwLDMyLDk3LDExNCwxMDMsMTE3LAorICAgIDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk5LDExMSwxMDksMTEyLAorICAgIDk3LDExNCwxMDEsMTAwLDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsNDYsMzIsNzMsMTAyLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDksMTEyLDk3LDExNCwxMDUsMTE1LDExMSwxMTAsMzIsCisgICAgMTAyLDk3LDEwNSwxMDgsMTE1LDMyLDExNiwxMDQsMTAxLDExMCwzMiw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDQsMCwwLDAsNSwwLDAsMCwzMSwwLDAsMCwxMTUsNjQsMCwKKyAgICAwLDAsMTI0LDEsMTAwLDAsMTA3LDgsMTE0LDE2LDEyNCwwLDEwNiwwLDEyNSwxLAorICAgIDExMCwzNCwxMjQsMCwxMDYsMCwxMjQsMSwxMDcsMywxMTQsNTAsMTE2LDEsMTAwLDEsCisgICAgMTI0LDAsMTA2LDAsMTI0LDEsMTAyLDIsMjIsMCwxMDAsMiwxMjQsMSwxNDQsMSwKKyAgICAxMzEsMSwxMzAsMSwxMzYsMCwxMjQsMCwxMjQsMSwxMjQsMiwxMjQsMywxNDIsMiwKKyAgICA4MywwLDQxLDMsNzgsMTIyLDMwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMzcsMTE1LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMDQsOTcsMTEwLDEwMCwKKyAgICAxMDgsMTAxLDMyLDM3LDExNSwyMTgsNCwxMTAsOTcsMTA5LDEwMSw0MSwyLDExNCwxMDEsMCwKKyAgICAwLDAsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDQxLAorICAgIDQsMjE4LDQsMTE1LDEwMSwxMDgsMTAyLDExNCwxMDEsMCwwLDAsMjE4LDQsOTcsMTE0LAorICAgIDEwMywxMTUsOTAsNiwxMDcsMTE5LDk3LDExNCwxMDMsMTE1LDQxLDEsMjE4LDYsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE5LAorICAgIDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwxMTQsOTcsMTEyLAorICAgIDExMiwxMDEsMTE0LDEyOSwxLDAsMCwxMTUsMTIsMCwwLDAsMCwxLDgsMSwKKyAgICA4LDEsMTAsMSw0LDEsMjAsMSwxMjIsNDAsOTUsOTksMTA0LDEwMSw5OSwxMDcsCisgICAgOTUsMTEwLDk3LDEwOSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LAorICAgIDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwxMTQsOTcsMTEyLDExMiwKKyAgICAxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDcsCisgICAgMCwwLDAsODMsMCwwLDAsMTE1LDYwLDAsMCwwLDEyMCw0MCwxMDAsNSwKKyAgICA2OCwwLDkzLDMyLDEyNSwyLDExNiwwLDEyNCwxLDEyNCwyLDEzMSwyLDExNCw2LAorICAgIDExNiwxLDEyNCwwLDEyNCwyLDExNiwyLDEyNCwxLDEyNCwyLDEzMSwyLDEzMSwzLAorICAgIDEsMCwxMTMsNiw4NywwLDEyNCwwLDEwNiwzLDEwNiw0LDEyNCwxLDEwNiwzLAorICAgIDEzMSwxLDEsMCwxMDAsMCw4MywwLDQxLDYsNzgsMjE4LDEwLDk1LDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDk1LDIxOCw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LAorICAgIDk1LDIxOCwxMiw5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwyMTgsCisgICAgNyw5NSw5NSwxMDAsMTExLDk5LDk1LDk1LDQxLDQsMTIyLDEwLDk1LDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk1LDk1LDEyMiw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LAorICAgIDEyMiwxMiw5NSw5NSwxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwxMjIsNywKKyAgICA5NSw5NSwxMDAsMTExLDk5LDk1LDk1LDQxLDUsMjE4LDcsMTA0LDk3LDExNSw5NywxMTYsCisgICAgMTE2LDExNCwyMTgsNywxMTUsMTAxLDExNiw5NywxMTYsMTE2LDExNCwyMTgsNywxMDMsMTAxLDExNiwKKyAgICA5NywxMTYsMTE2LDExNCwyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LDExNiw5NSw5NSwyMTgsNiwKKyAgICAxMTcsMTEyLDEwMCw5NywxMTYsMTAxLDQxLDMsOTAsMywxMTAsMTAxLDExOSw5MCwzLDExMSwKKyAgICAxMDgsMTAwLDExNCw1NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwyMTgsNSw5NSwxMTksMTE0LDk3LDExMiwxNDAsMSwwLAorICAgIDAsMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsMSwyMiwxLDEyMiwyNiwKKyAgICA5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw0Niw2MCwxMDgsMTExLDk5LAorICAgIDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE5LDExNCw5NywxMTIsNDEsMSw3OCw0MSwzLDIxOCwKKyAgICAxMCw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTE0LDExNiwwLDAsMCwKKyAgICAyMTgsOSw3OCw5NywxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCw0MSwzLDExNCwxMDUsMCwKKyAgICAwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDQxLDEsMTE0LDEwNSwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsCisgICAgOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsMTIxLDEsMCwwLDExNSwxNCwKKyAgICAwLDAsMCwwLDgsMTQsNywyLDEsMTAsMSwxNCwyLDE0LDUsMTAsCisgICAgMSwxMTQsMTE5LDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCw1LAorICAgIDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDYwLDAsMCwwLAorICAgIDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDkyLDIsMTI1LDIsMTI1LDMsMTI0LDIsCisgICAgMTAwLDEsMTA3LDgsMTE0LDU2LDExNiwxLDEyNCwzLDEzMSwxLDExNCw1NiwxMDAsMiwKKyAgICAxMjUsNCwxMTYsMiwxMDYsMywxMjQsNCwxMDYsNCwxMjQsMywxMDAsMywyNSwwLAorICAgIDEzMSwxLDExNiw1LDEzMSwyLDEsMCwxMjQsMiw4MywwLDQxLDQsMTIyLDE1NSwKKyAgICA4NCwxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsCisgICAgOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCwxMjEsCisgICAgMzIsMTAwLDEwMSwxMDgsMTAxLDEwMyw5NywxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDExMSwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsCisgICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLAorICAgIDk5LDk3LDExNiwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTAyLDk3LDExOCwxMTEsMTE0LDMyLDExMSwKKyAgICAxMDIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsCisgICAgMTAxLDk5LDQwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw0NCw3OCwxMTEsCisgICAgMTE2LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDEwMCwxMDUsMTE0LDEwMSwKKyAgICA5OSwxMTYsMTExLDExNCwxMjEsMzIsMTIzLDEyNSw1OCwzMiwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwKKyAgICAxMDMsMzIsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDExNCw2MiwwLDAsMCw0MSwKKyAgICA2LDIxOCwxMSwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMzMsCisgICAgMCwwLDAsMTE0LDYzLDAsMCwwLDExNCw2NCwwLDAsMCwxMTQsNTAsMCwKKyAgICAwLDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsODcsOTcsMTE0LDExMCwxMDUsMTEwLAorICAgIDEwMyw0MSw1LDExNCwxMDMsMCwwLDAsMjE4LDgsMTAyLDExNywxMDgsMTA4LDExMCw5NywKKyAgICAxMDksMTAxLDIxOCw2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMjE4LDgsMTEyLDExMSwxMTQsMTE2LAorICAgIDEwNSwxMTEsMTEwLDExNSwyMTgsMywxMDksMTE1LDEwMywxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDQsMTA1LDEwOSwxNDksMSwwLDAsMTE1LAorICAgIDEwLDAsMCwwLDAsMTAsMTQsMSwxNiwxLDQsMSwyMiwxLDExNCwxMjYsCisgICAgMCwwLDAsOTksNCwwLDAsMCwwLDAsMCwwLDExLDAsMCwwLAorICAgIDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxMjgsMSwwLDAsMTA1LDAsMTI1LAorICAgIDQsMTI0LDIsMTAwLDEsMTA3LDksMTE0LDIyLDEyNCwyLDEyNCw0LDEwMCwyLDYwLAorICAgIDAsMTEwLDQsMTAwLDMsMTI1LDIsMTI0LDMsMTAwLDEsMTA3LDksMTE0LDQyLDEyNCwKKyAgICAzLDEyNCw0LDEwMCw0LDYwLDAsMTI0LDAsMTAwLDEsMTAwLDUsMTMzLDIsMjUsCisgICAgMCwxMjUsNSwxMjQsMCwxMDAsNSwxMDAsNiwxMzMsMiwyNSwwLDEyNSw2LDEyNCwKKyAgICAwLDEwMCw2LDEwMCw3LDEzMywyLDI1LDAsMTI1LDcsMTI0LDUsMTE2LDAsMTA3LAorICAgIDMsMTE0LDEyMiwxMDAsOCwxMDYsMSwxMjQsMiwxMjQsNSwxMzEsMiwxMjUsOCwxMTYsCisgICAgMiwxMDYsMywxMDAsOSwxMjQsOCwxMzEsMiwxLDAsMTE2LDQsMTI0LDgsMTI0LAorICAgIDQsMTQxLDEsMTMwLDEsMTEwLDg2LDExNiw1LDEyNCw2LDEzMSwxLDEwMCw1LDEwNywKKyAgICAzLDExNCwxNjYsMTAwLDEwLDEwNiwxLDEyNCwyLDEzMSwxLDEyNSw4LDExNiwyLDEwNiwKKyAgICAzLDEwMCw5LDEyNCw4LDEzMSwyLDEsMCwxMTYsNiwxMjQsOCwxMzEsMSwxMzAsCisgICAgMSwxMTAsNDIsMTE2LDUsMTI0LDcsMTMxLDEsMTAwLDUsMTA3LDMsMTE0LDIwOCwxMDAsCisgICAgMTEsMTA2LDEsMTI0LDIsMTMxLDEsMTI1LDgsMTE2LDIsMTA2LDMsMTAwLDksMTI0LAorICAgIDgsMTMxLDIsMSwwLDExNiw2LDEyNCw4LDEzMSwxLDEzMCwxLDEyNCwxLDEwMCwKKyAgICAxLDEwNyw5LDE0NCwxLDExNCwxMTYsMTIxLDE2LDExNiw3LDEyNCwxLDEwMCwxMiwyNSwKKyAgICAwLDEzMSwxLDEyNSw5LDg3LDAsMTEwLDIwLDQsMCwxMTYsOCwxMDcsMTAsMTE0LAorICAgIDI1NCwxLDAsMSwwLDEsMCw4OSwwLDExMCw0OCw4OCwwLDExNiw5LDEyNCwKKyAgICA2LDEzMSwxLDEyNCw5LDEwNywzLDE0NCwxLDExNCw0NiwxMDAsMTMsMTA2LDEsMTI0LAorICAgIDIsMTMxLDEsMTI1LDgsMTE2LDIsMTA2LDMsMTAwLDksMTI0LDgsMTMxLDIsMSwKKyAgICAwLDExNiw0LDEyNCw4LDEyNCw0LDE0MSwxLDEzMCwxLDEyMSwxNiwxMjQsMSwxMDAsCisgICAgMTQsMjUsMCwxMDAsMTUsNjQsMCwxMjUsMTAsODcsMCwxMTAsMjIsNCwwLDExNiwKKyAgICA4LDEwNywxMCwxNDQsMSwxMTQsODQsMSwwLDEsMCwxLDAsODksMCwxMTAsCisgICAgMzIsODgsMCwxMTYsOSwxMjQsNywxMzEsMSwxMjQsMTAsMTA3LDMsMTQ0LDEsMTE0LAorICAgIDExNiwxMTYsNCwxMDAsMTMsMTA2LDEsMTI0LDIsMTMxLDEsMTI0LDQsMTQxLDEsMTMwLAorICAgIDEsMTI0LDAsMTAwLDcsMTAwLDEsMTMzLDIsMjUsMCw4MywwLDQxLDE2LDk3LAorICAgIDEyMiwxLDAsMCw4Niw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE1LDExNSwxMDEsMTAwLDQ1LDEwNSwxMTAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwKKyAgICAxMDEsMzIsOTcsMTAzLDk3LDEwNSwxMTAsMTE1LDExNiwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAorICAgIDk1LDExNSwxMTYsOTcsMTE2LDExNSwzMiw0MCwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDEwMywKKyAgICAxMDUsMTE4LDEwMSwxMTAsNDEsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKKyAgICAzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk5LDExMSwxMDksCisgICAgMTEyLDEwNSwxMDgsMTAxLDEwMCwzMiw5OCwxMjEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsCisgICAgNDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMTEsMTE2LDEwNCwKKyAgICAxMDEsMTE0LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwKKyAgICAzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDEsMTEwLDEwNCw5NywxMTAsOTksMTAxLAorICAgIDMyLDEwMSwxMTQsMTE0LDExMSwxMTQsMzIsMTE0LDEwMSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LAorICAgIDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLAorICAgIDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwKKyAgICAxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTA1LDExMCw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDMyLAorICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsCisgICAgMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsCisgICAgOTgsMTAxLDMyLDExNSwxMTYsOTcsMTA4LDEwMSw0NiwzMiw2OSw3OSw3MCw2OSwxMTQsMTE0LAorICAgIDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLAorICAgIDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsOTcsMTE2LDk3LDMyLDEwNSwxMTUsMzIsMTAyLDExMSwKKyAgICAxMTcsMTEwLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTE0LAorICAgIDExNywxMTAsOTksOTcsMTE2LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTE0LAorICAgIDEwMSwwLDAsMCwxMjIsMTAsNjAsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsNjIsCisgICAgMTE0LDM3LDAsMCwwLDExNCwxNCwwLDAsMCwyMzMsOCwwLDAsMCwyMzMsCisgICAgMTIsMCwwLDAsMTIyLDMwLDk4LDk3LDEwMCwzMiwxMDksOTcsMTAzLDEwNSw5OSwzMiwKKyAgICAxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsNTgsMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMTIyLDIsMTIzLDEyNSwxMjIsNDMsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLAorICAgIDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLAorICAgIDEwNSwxMTAsMTAzLDMyLDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsMTA1LDExMCwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNDgsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSwKKyAgICA3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLAorICAgIDMyLDExNSwxMDUsMTIyLDEwMSwzMiwxMTEsMTAyLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsCisgICAgMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwyMTgsNSwxMDksMTE2LDEwNSwxMDksMTAxLDEyMiwyNiwKKyAgICA5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMTYsOTcsMTA4LAorICAgIDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMjMsMzMsMTE0LDEyNSwyMTgsNCwxMTUsMTA1LDEyMiwxMDEsCisgICAgMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsMTI3LDMsMCw0MSwxMCwyMTgsMTIsNzcsCisgICAgNjUsNzEsNzMsNjcsOTUsNzgsODUsNzcsNjYsNjksODIsMTE0LDUwLDAsMCwwLAorICAgIDExNCwxMTcsMCwwLDAsMjE4LDE2LDk1LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTAxLDk1LAorICAgIDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDExNCwxMDIsMCwwLDAsMTE0LDMzLDAsMCwKKyAgICAwLDIxOCw4LDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTYsMCwwLDAsCisgICAgMjE4LDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDIxLDAsMCwwLDQxLAorICAgIDExLDExNCw1NiwwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsCisgICAgMTE2LDk3LDExNiwxMTUsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsOTAsMTEsCisgICAgMTAxLDEyMCw5OSw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCw1LDEwOSw5NywxMDMsCisgICAgMTA1LDk5LDkwLDEzLDExNCw5NywxMTksOTUsMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsOTcsMTA5LAorICAgIDExMiw5MCw4LDExNCw5NywxMTksOTUsMTE1LDEwNSwxMjIsMTAxLDExNCw3OCwwLDAsMCwKKyAgICAyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDIxOCwxMSwKKyAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjUsOTUsMTE4LDk3LDEwOCwKKyAgICAxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTA0LAorICAgIDEwMSw5NywxMDAsMTAxLDExNCwxNjYsMSwwLDAsMTE1LDc2LDAsMCwwLDAsMTEsCisgICAgNCwxLDgsMSwxMCwzLDQsMSw4LDEsOCwxLDEyLDEsMTIsMSwKKyAgICAxMiwxLDgsMSwxMiwxLDEyLDEsMTIsMSwxMiwxLDEwLDEsMTIsMSwKKyAgICAxMCwxLDEyLDEsMTAsMSwxMiwxLDgsMSwxMCwxLDIsMSwxNiwxLAorICAgIDE0LDEsNiwyLDE0LDEsMTAsMSwxMiwxLDEwLDEsMiwxLDE2LDEsCisgICAgMTYsMSw2LDIsMTQsMSwxMCwxLDYsMSwxMTQsMTM4LDAsMCwwLDk5LAorICAgIDQsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDYsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDg2LDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEzMSwKKyAgICAxLDEyNSw0LDExNiwyLDEyNCw0LDExNiwzLDEzMSwyLDExNCw1OCwxMTYsNCwxMDYsCisgICAgNSwxMDAsMSwxMjQsMiwxMzEsMiwxLDAsMTI0LDMsMTAwLDIsMTA3LDksMTE0LAorICAgIDUyLDExNiw2LDEwNiw3LDEyNCw0LDEyNCwzLDEzMSwyLDEsMCwxMjQsNCw4MywKKyAgICAwLDExMCwyNCwxMTYsOCwxMDAsMywxMDYsOSwxMjQsMiwxMzEsMSwxMDAsNCwxMjQsCisgICAgMSwxMDAsNSwxMjQsMiwxNDQsMiwxMzEsMSwxMzAsMSwxMDAsMiw4MywwLDQxLAorICAgIDYsMTIyLDYwLDY3LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDk3LDExNSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLAorICAgIDk4LDEyMSwzMiw5NSwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LAorICAgIDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDQwLDQxLDQ2LDEyMiwKKyAgICAyMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExNCwxMTEsCisgICAgMTA5LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwyMyw3OCwxMTEsMTEwLDQ1LDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LAorICAgIDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEwLDIxOCw3LDEwOSw5NywKKyAgICAxMTQsMTE1LDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLDEwNSwxMTUsCisgICAgMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsMTAxLDk1LAorICAgIDExNiwxMjEsMTEyLDEwMSwxMTQsMTE3LDAsMCwwLDExNCwxMzIsMCwwLDAsMjE4LDQsCisgICAgOTUsMTA1LDEwOSwxMTIsOTAsMTYsOTUsMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwxMDUsCisgICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsMTAyLDAsMCwwLDExNCw1MCwwLDAsMCwKKyAgICA0MSw1LDExNCw1NiwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCw5MiwwLDAsCisgICAgMCwxMTQsOTMsMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwKKyAgICAxMDksMTEyLDEwNSwxMDgsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIyMSwxLAorICAgIDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEwLDEsMTAsMSwxMiwxLDgsCisgICAgMSwxMiwxLDYsMiwxMiwxLDExNCwxNDQsMCwwLDAsMTE0LDYyLDAsMCwKKyAgICAwLDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDU2LDAsMCwwLDExNiwwLDExNiwxLDEzMSwKKyAgICAxLDEyNSwzLDEyNCwzLDEwNiwyLDExNiwzLDEyNCwxLDEzMSwxLDEzMSwxLDEsCisgICAgMCwxMjQsMywxMDYsMiwxMTYsMywxMjQsMiwxMzEsMSwxMzEsMSwxLDAsMTI0LAorICAgIDMsMTA2LDIsMTE2LDQsMTA2LDUsMTI0LDAsMTMxLDEsMTMxLDEsMSwwLDEyNCwKKyAgICAzLDgzLDAsNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsOTcsCisgICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsMTE2LAorICAgIDExMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMTksCisgICAgMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDExNywxMTYsMzIsMTE2LDExMSwzMiw5NywzMiwKKyAgICA5OCwxMjEsMTE2LDEwMSw0NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMTAsMzIsMzIsCisgICAgMzIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDQxLDYsMjE4LDksOTgsMTIxLDExNiwxMDEsOTcsCisgICAgMTE0LDExNCw5NywxMjEsMTE0LDEzMSwwLDAsMCwyMTgsNiwxMDEsMTIwLDExNiwxMDEsMTEwLAorICAgIDEwMCwxMTQsMTksMCwwLDAsMTE0LDEzOSwwLDAsMCw5MCw1LDEwMCwxMTcsMTA5LAorICAgIDExMiwxMTUsNDEsNCwxMTQsMTQzLDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDEzNywKKyAgICAwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDAsMTAxLDk1LDExNiwKKyAgICAxMTEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjMzLDEsMCwwLDExNSwxMCwKKyAgICAwLDAsMCwwLDMsOCwxLDE0LDEsMTQsMSwxNiwxLDExNCwxNDcsMCwKKyAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsNCwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsNjIsMCwwLDAsMTAwLDEsMTAwLDIsCisgICAgMTA4LDAsMTI1LDEsMTE2LDEsMTA2LDIsMTI0LDAsMTMxLDEsMTA2LDMsMTI1LDIsCisgICAgMTI0LDEsMTA2LDQsMTI0LDIsMTMxLDEsMTI1LDMsMTE2LDEsMTA2LDUsMTAwLDIsCisgICAgMTAwLDMsMTMxLDIsMTI1LDQsMTI0LDQsMTA2LDYsMTI0LDAsMTA2LDYsMTI0LDMsCisgICAgMTAwLDEsMjUsMCwxMzEsMSwxMzEsMSw4MywwLDQxLDQsMTIyLDEyMSw2OCwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsCisgICAgMTE1LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksCisgICAgMTExLDEwMCwxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICA4NSwxMTAsMTA1LDExOCwxMDEsMTE0LDExNSw5NywxMDgsMzIsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsCisgICAgMTAxLDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLAorICAgIDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsOTksMTExLDEwMCwxMDUsMTEwLAorICAgIDEwMyw0NiwxMCwzMiwzMiwzMiwzMiwxMTQsNjIsMCwwLDAsNzgsODQsNDEsNywKKyAgICAyMTgsOCwxMTYsMTExLDEwNywxMDEsMTEwLDEwNSwxMjIsMTAxLDExNCw1MiwwLDAsMCw5MCwKKyAgICA3LDY2LDEyMSwxMTYsMTAxLDExNSw3Myw3OSw5MCw4LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsCisgICAgMTEwLDEwMSw5MCwxNSwxMDAsMTAxLDExNiwxMDEsOTksMTE2LDk1LDEwMSwxMTAsOTksMTExLDEwMCwKKyAgICAxMDUsMTEwLDEwMyw5MCwyNSw3MywxMTAsOTksMTE0LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTA4LAorICAgIDc4LDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDY4LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE4LDYsCisgICAgMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSw0MSw1LDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAorICAgIDk1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMTQ4LDAsMCwwLDkwLDIxLDExNSwxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDk1LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsCisgICAgMTEwLDEwMSwyMTgsOCwxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsOTAsMTUsMTEwLDEwMSwKKyAgICAxMTksMTA4LDEwNSwxMTAsMTAxLDk1LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMywxMDAsMTAxLAorICAgIDk5LDExMSwxMDAsMTAxLDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjQzLDEsMCwwLDExNSwKKyAgICAxMCwwLDAsMCwwLDUsOCwxLDEyLDEsMTAsMSwxMiwxLDExNCwxNTIsCisgICAgMCwwLDAsNDEsMiwxMTQsMTIzLDAsMCwwLDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LAorICAgIDk3LDExNiwxMDUsMTExLDExMCwxMTUsOTksMiwwLDAsMCwyLDAsMCwwLDksCisgICAgMCwwLDAsMTksMCwwLDAsNjcsMCwwLDAsMTE1LDgsMSwwLDAsCisgICAgMTI0LDEsMTAwLDEsMTA3LDgsMTE0LDU4LDEwMCwyLDEyNSwxLDExNiwwLDEyNCwyLAorICAgIDEwMCwzLDEzMSwyLDExNCw1OCwxMjEsMTQsMTI0LDIsMTA2LDEsMTI0LDAsMTMxLDEsCisgICAgMTI1LDEsODcsMCwxMTAsMjAsNCwwLDExNiwyLDEwNywxMCwxMTQsNTYsMSwwLAorICAgIDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDExNiwzLDEwNiw0LDEyNCwwLAorICAgIDEyNCwyLDEwMCw0LDEyNCwxLDE0NCwxLDEzMSwyLDEyNSw0LDEwMCw1LDEyNCw0LAorICAgIDk1LDUsMTI0LDIsMTAwLDEsMTA3LDgsMTE0LDE0NiwxMjAsNTQsMTE2LDYsMTMxLDAsCisgICAgNjgsMCw5Myw0MCw5MiwyLDEyNSw1LDEyNSw2LDEyNCwxLDEwNiw3LDExNiw4LAorICAgIDEyNCw2LDEzMSwxLDEzMSwxLDExNCw5OCwxMjQsNSwxMjQsMCwxMjQsMSwxMzEsMiwKKyAgICAxMjUsMiwxMjQsMiwxMjQsNCw5NSw5LDgwLDAsMTEzLDk4LDg3LDAsMTAwLDEsCisgICAgODMsMCwxMjQsMywxMTYsMTAsMTA3LDgsMTE0LDIxMiwxMTYsMCwxMjQsMiwxMDAsNiwKKyAgICAxMzEsMiwxMTQsMjE4LDEyMSwxNCwxMjQsMiwxMDYsMTEsMTI0LDAsMTMxLDEsMTI1LDcsCisgICAgODcsMCwxMTAsMjAsNCwwLDExNiwyLDEwNywxMCwxMTQsMTk4LDEsMCwxLDAsCisgICAgMSwwLDg5LDAsMTEzLDIxOCw4OCwwLDEyNCw3LDExNCwyMTgsMTAzLDAsMTI0LDQsCisgICAgOTUsMTIsMTEwLDYsMTI0LDMsMTI0LDQsOTUsMTIsMTI0LDQsMTA2LDEyLDEwMywwLAorICAgIDEwNywyLDE0NCwxLDExNCw0LDEyNCwxLDE0NCwxLDExNCw0LDExNiwxMywxMjQsMSwKKyAgICAxMzEsMSwxMDAsNywyNSwwLDEyNSw4LDEyNCw0LDEwNiwxMiwxMDYsMTQsMTI0LDgsCisgICAgMTMxLDEsMSwwLDEyNCw0LDgzLDAsNDEsOCw5Nyw2MSwxLDAsMCw4MiwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsOTcsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDMyLDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDg0LDExMSwzMiwxMDUsMTEwLDEwMCwxMDUsOTksOTcsMTE2LDEwMSwzMiwxMTYsCisgICAgMTA0LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCisgICAgMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0NCwzMiwxMTUsMTAxLDExNiwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwKKyAgICAxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsMzIsCisgICAgMTE2LDExMSwzMiw5NywzMiwxMDgsMTA1LDExNSwxMTYsMzIsMTExLDEwMiwzMiwxMDAsMTA1LDExNCwKKyAgICAxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDExMiw5NywxMTYsMTA0LDExNSw0NiwzMiwzMiw2NSwKKyAgICAxMTAsMTAsMzIsMzIsMzIsMzIsMTAxLDEwOSwxMTIsMTE2LDEyMSwzMiwxMDgsMTA1LDExNSwxMTYsCisgICAgMzIsMTA1LDExNSwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDk5LDEwNSwxMDEsMTEwLDExNiw0NCwzMiwKKyAgICAxMTYsMTA0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDUsMTE2LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTEsCisgICAgMTE2LDEwNCwxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSwzMiwxMTcsMTE1LDEwMSwxMDIsMTE3LDEwOCwzMiwKKyAgICAxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LAorICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDksMTE3LDExNSwxMTYsMzIsMTE2LAorICAgIDk3LDEwNywxMDEsMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMzIsOTcsMTE1LDMyLDEwNSwxMTYsCisgICAgMTE1LDMyLDExMSwxMTAsMTA4LDEyMSwzMiw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDAsCisgICAgNDEsMzIsOTcsMTE0LDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMjIsOSw2MCwKKyAgICAxMTcsMTEwLDEwNywxMTAsMTExLDExOSwxMTAsNjIsMjE4LDEyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsCisgICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwyMTgsNiwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCw4NCwyMTgsCisgICAgMTAsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDYyLDAsMCwwLAorICAgIDQxLDE1LDExNCwxMTEsMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsMTAyLDAsMCwKKyAgICAwLDExNCwxMTcsMCwwLDAsMjE4LDEwLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLAorICAgIDEwMSw5OSw5MCwxMyw5NSwxMTUsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwKKyAgICAxMTQsMjE4LDI3LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTAwLDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsOTUsCisgICAgMCwwLDAsMTE0LDk2LDAsMCwwLDExNCwxMjMsMCwwLDAsMjE4LDksOTUsCisgICAgODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LDE1NiwwLDAsMCwxMTQsMTUzLDAsCisgICAgMCwwLDExNCw0MCwwLDAsMCwyMTgsNiw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDQxLAorICAgIDksMTE0LDEwMSwwLDAsMCw5MCw4LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAorICAgIDExNCwxMjMsMCwwLDAsMTE0LDE1MywwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwKKyAgICAyMTgsMTIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSw5OSwxMDgsOTcsMTE1LDExNSwyMTgsOCwKKyAgICAxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwxNTYsMCwwLDAsOTAsNywxMDAsCisgICAgMTA1LDExNCwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwyMTgsMjMsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LAorICAgIDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw0LDIsCisgICAgMCwwLDExNSw2MCwwLDAsMCwwLDEyLDgsNCw0LDEsMTAsMiwyLAorICAgIDEsMTQsMSwxNCwxLDYsOCwxOCwxLDYsMyw4LDEsMTYsMSwxNCwKKyAgICAxLDEwLDEsNiwxLDYsMiw0LDMsOCwyLDEwLDEsMiwxLDE0LAorICAgIDEsMTQsMSw2LDIsNCwxLDgsMiw2LDEsMTIsMSw2LDEsMTIsCisgICAgMSwxMiwyLDExNCwxNjQsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsODAsMCwKKyAgICAwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsCisgICAgOTAsNCwxMDAsMyw5MCw1LDEwMCw0LDkwLDYsMTAxLDcsMTAwLDUsMTAwLDYsCisgICAgMTMyLDAsMTMxLDEsOTAsOCwxMDEsNywxMDAsNywxMDAsOCwxMzIsMCwxMzEsMSwKKyAgICA5MCw5LDEwMSw3LDEwMCwxNCwxMDAsMTAsMTAwLDExLDEzMiwxLDEzMSwxLDkwLDEwLAorICAgIDEwMSw3LDEwMCwxNSwxMDAsMTIsMTAwLDEzLDEzMiwxLDEzMSwxLDkwLDExLDEwMCw5LAorICAgIDgzLDAsNDEsMTYsMjE4LDIxLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCisgICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LAorICAgIDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDAsMTAxLDk5LDEwOCw5NywxMTQsCisgICAgMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksCisgICAgMTE1LDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTIyLDU5LDgzLDExMSwxMDIsCisgICAgMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwKKyAgICAxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsCisgICAgMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLAorICAgIDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDEyNSwxMjIsNjUsODMsMTExLDEwMiwxMTYsMTE5LDk3LAorICAgIDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLAorICAgIDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwKKyAgICAxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsCisgICAgMTEwLDk3LDEwOSwxMDEsMTI1LDkyLDY4LDEwMSw5OCwxMTcsMTAzLDcwLDk5LDIsMCwwLAorICAgIDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw1MCwwLDAsMCwxMjEsMTQsMTE2LDAsMTA2LDEsMTE2LDAsMTA2LDIsCisgICAgMTI0LDEsMTMxLDIsODMsMCw0LDAsMTE2LDMsMTA3LDEwLDExNCw0NCwxLDAsCisgICAgMSwwLDEsMCwxMTYsMCwxMDYsMSwxMTYsMCwxMDYsNCwxMjQsMSwxMzEsMiwKKyAgICA4MywwLDg4LDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDUsMjE4LDcsOTUsCisgICAgMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsNyw3OSwxMTIsMTAxLDExMCw3NSwxMDEsMTIxLDkwLAorICAgIDE3LDcyLDc1LDY5LDg5LDk1LDY3LDg1LDgyLDgyLDY5LDc4LDg0LDk1LDg1LDgzLAorICAgIDY5LDgyLDExNCw0MiwwLDAsMCw5MCwxOCw3Miw3NSw2OSw4OSw5NSw3Niw3OSwKKyAgICA2Nyw2NSw3Niw5NSw3Nyw2NSw2Nyw3Miw3Myw3OCw2OSw0MSwyLDIxOCwzLDk5LAorICAgIDEwOCwxMTUsMTE0LDUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMjE4LDE0LDk1LDExMSwxMTIsMTAxLDExMCw5NSwxMTQsMTAxLAorICAgIDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDgyLDIsMCwwLDExNSw4LDAsMCwwLDAsCisgICAgMiwyLDEsMTQsMSwxNCwxLDEyMiwzNiw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSwKKyAgICA4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwKKyAgICAxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5OSwyLDAsCisgICAgMCwwLDAsMCwwLDAsNiwwLDAsMCwxNiwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMTE2LDAsMCwwLDEyNCwwLDEwNiwwLDExNCwxNCwxMjQsMCwxMDYsCisgICAgMSwxMjUsMiwxMTAsNiwxMjQsMCwxMDYsMiwxMjUsMiwxMjQsMiwxMDYsMywxMDAsCisgICAgMSwxMjQsMSwxMDAsMiwxMDAsMywxMTYsNCwxMDYsNSwxMDAsMCwxMDAsNCwxMzMsCisgICAgMiwyNSwwLDIyLDAsMTQ0LDIsMTMxLDAsMTI1LDMsMTIxLDM4LDEyNCwwLDEwNiwKKyAgICA2LDEyNCwzLDEzMSwxLDE0MywxOCwxMjUsNCwxMTYsNywxMDYsOCwxMjQsNCwxMDAsCisgICAgNSwxMzEsMiwxMjUsNSw4NywwLDEwMCwwLDgxLDAsODIsMCw4OCwwLDg3LAorICAgIDAsMTEwLDIwLDQsMCwxMTYsOSwxMDcsMTAsMTE0LDExMCwxLDAsMSwwLDEsCisgICAgMCwxMDAsMCw4MywwLDg4LDAsMTI0LDUsODMsMCw0MSw2LDc4LDExNCwxMjIsCisgICAgMCwwLDAsOTAsMTEsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLAorICAgIDEyMiw1LDM3LDEwMCw0NiwzNywxMDAsMTE0LDU5LDAsMCwwLDExNCwzMiwwLDAsCisgICAgMCw0MSwxMCwyMTgsMTEsNjgsNjksNjYsODUsNzEsOTUsNjYsODUsNzMsNzYsNjgsCisgICAgMjE4LDE4LDgyLDY5LDcxLDczLDgzLDg0LDgyLDg5LDk1LDc1LDY5LDg5LDk1LDY4LAorICAgIDY5LDY2LDg1LDcxLDIxOCwxMiw4Miw2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSw3NSwKKyAgICA2OSw4OSwxMTQsNTAsMCwwLDAsMTE0LDgsMCwwLDAsMjE4LDEyLDExOCwxMDEsCisgICAgMTE0LDExNSwxMDUsMTExLDExMCw5NSwxMDUsMTEwLDEwMiwxMTEsMTE0LDE2OCwwLDAsMCwxMTQsCisgICAgMTY2LDAsMCwwLDkwLDEwLDgxLDExNywxMDEsMTE0LDEyMSw4Niw5NywxMDgsMTE3LDEwMSwKKyAgICAxMTQsNDIsMCwwLDAsNDEsNiwxMTQsMTY3LDAsMCwwLDExNCwxMjIsMCwwLAorICAgIDAsOTAsMTIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NSwxMDcsMTAxLDEyMSwxMTQsCisgICAgNSwwLDAsMCw5MCw0LDEwNCwxMDcsMTAxLDEyMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsCisgICAgMTEyLDk3LDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMjE4LDE2LDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywKKyAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDg5LDIsMCwwLDExNSwyMiwwLDAsMCwwLDIsCisgICAgNiwxLDgsMiw2LDEsMTAsMSwyMiwxLDIsMSwxMiwxLDI2LDEsCisgICAgMTQsMSw2LDEsMTIyLDM4LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCisgICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExNSwxMDEsOTcsCisgICAgMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc4LDk5LDQsMCwKKyAgICAwLDAsMCwwLDAsMCw4LDAsMCwwLDE0LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxMjIsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTMxLDEsMTI1LAorICAgIDQsMTI0LDQsMTAwLDAsMTA3LDgsMTE0LDIyLDEwMCwwLDgzLDAsMTIxLDEyLDExNiwKKyAgICAxLDEyNCw0LDEzMSwxLDEsMCw4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LAorICAgIDEwLDExNCw1NCwxLDAsMSwwLDEsMCwxMDAsMCw4MywwLDg4LDAsMTIwLAorICAgIDYwLDExNiwzLDEzMSwwLDY4LDAsOTMsNTAsOTIsMiwxMjUsNSwxMjUsNiwxMjQsCisgICAgNCwxMDYsNCwxMTYsNSwxMjQsNiwxMzEsMSwxMzEsMSwxMTQsNjQsMTE2LDYsMTA2LAorICAgIDcsMTI0LDEsMTI0LDUsMTI0LDEsMTI0LDQsMTMxLDIsMTAwLDEsMTI0LDQsMTQ0LAorICAgIDEsMTMxLDIsMTI1LDcsMTI0LDcsODMsMCwxMTMsNjQsODcsMCwxMDAsMCw4MywKKyAgICAwLDQxLDIsNzgsMTE0LDE1NSwwLDAsMCw0MSw4LDExNCwxNzQsMCwwLDAsCisgICAgMTE0LDQxLDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwKKyAgICA5NSwwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDExNywwLDAsMCwyMTgsMTYsCisgICAgMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDEsOCwxMTQsMTY3LDAsMCwwLDExNCwxMjIsMCwwLDAsMTE0LDM3LDAsMCwKKyAgICAwLDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwxMTYsMTE0LDE3MywwLDAsMCwxMTQsMTIzLAorICAgIDAsMCwwLDExNCwxNjMsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOSwxMDIsMTA1LAorICAgIDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTA0LDIsMCwwLDExNSwyNiwwLDAsMCwKKyAgICAwLDIsMTAsMSw4LDEsNCwxLDIsMSwxMiwxLDE0LDEsNiwxLAorICAgIDE2LDEsMTQsMSw2LDEsMTAsMSw4LDEsMTIyLDMxLDg3LDEwNSwxMTAsMTAwLAorICAgIDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLAorICAgIDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwzNiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsCisgICAgMywxMjQsMywxMDAsMSwxMDcsOSwxMTQsMjgsMTI0LDMsMTA2LDEsODMsMCwxMTAsCisgICAgNCwxMDAsMSw4MywwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTA4LDcwLDEwNSwxMTAsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDUsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwKKyAgICAxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsNDEsMiwxMTQsMTc3LDAsMCwKKyAgICAwLDExNCwxMjMsMCwwLDAsNDEsNCwxMTQsMTY3LDAsMCwwLDExNCwxMjIsMCwKKyAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwMiwxMDUsMTEwLAorICAgIDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjAsMiwwLDAsMTE1LDgsMCwwLAorICAgIDAsMCw3LDEyLDEsOCwxLDgsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsMTExLAorICAgIDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDIsNzgsNzgsCisgICAgNDEsMSw3OCw0MSwxMiwxMTQsMTA4LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LAorICAgIDEwOSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxNzEsMCwwLDAsMTE0LDE3MCwKKyAgICAwLDAsMCwxMTQsMTY5LDAsMCwwLDIxOCwxMSw5OSwxMDgsOTcsMTE1LDExNSwxMDksCisgICAgMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsMTY4LDAsMCwwLDExNCwxNzQsMCwwLDAsMTE0LAorICAgIDE3NywwLDAsMCwxMTQsMTc4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNjUsMCwKKyAgICAwLDAsNzAsMiwwLDAsMTE1LDIwLDAsMCwwLDgsMiw0LDMsNCwKKyAgICAzLDQsMiw0LDIsMTIsNywxMiwxNSwyLDEsMTIsMTUsMiwxLDExNCwKKyAgICAxNjUsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDgsMCwwLDAsMTAxLDAsCisgICAgOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsCisgICAgOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDEzMiwwLAorICAgIDkwLDYsMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsODMsMCw0MSwxMSwKICAgICAyMTgsMTMsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDEyMiwKICAgICA4Myw2Niw5NywxMTUsMTAxLDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExMSwxMDIsMzIsOTksCiAgICAgMTExLDEwOSwxMDksMTExLDExMCwzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLApAQCAtMTAwNiwxMTAgKzkxNywxMDYgQEAKICAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiw4MywKICAgICAxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywKICAgICAxMDAsMTAxLDExNCw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsCi0gICAgMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw4OCwwLDAsMCwxMTYsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTMxLDEsMCwKLSAgICAxMDAsMSwwLDI1LDEyNSwyLDAsMTI0LDIsMCwxMDYsMiwwLDEwMCwyLDAsCi0gICAgMTAwLDEsMCwxMzEsMiwwLDEwMCwzLDAsMjUsMTI1LDMsMCwxMjQsMSwwLAotICAgIDEwNiwzLDAsMTAwLDIsMCwxMzEsMSwwLDEwMCw0LDAsMjUsMTI1LDQsMCwKLSAgICAxMjQsMywwLDEwMCw1LDAsMTA3LDIsMCwxMTEsODcsMCwxMjQsNCwwLDEwMCwKLSAgICA1LDAsMTA3LDMsMCw4Myw0MSw2LDEyMiwxNDEsNjcsMTExLDExMCw5OSwxMTQsMTAxLAotICAgIDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsOTgsMTIxLAotICAgIDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwNSwxMTAsMTAzLDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE0LDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwNCw5NywxMTUsMzIsOTcsMzIsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMzksOTUsOTUsMTA1LDExMCwxMDUsMTE2LAotICAgIDk1LDk1LDQ2LDExMiwxMjEsMzksNDYsMTE0LDMxLDAsMCwwLDExNCw2MCwwLDAsCi0gICAgMCwxMTQsNjEsMCwwLDAsMTE0LDU4LDAsMCwwLDIxOCw4LDk1LDk1LDEwNSwKLSAgICAxMTAsMTA1LDExNiw5NSw5NSw0MSw0LDExNCw0MCwwLDAsMCwxMTQsMTU5LDAsMCwKLSAgICAwLDExNCwzNiwwLDAsMCwxMTQsMzQsMCwwLDAsNDEsNSwxMTQsMTEwLDAsCi0gICAgMCwwLDExNCwxMjgsMCwwLDAsMTE0LDk2LDAsMCwwLDkwLDEzLDEwMiwxMDUsCi0gICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5NSw5OCw5NywxMTUsMTAxLDkwLDksMTE2LDk3LDEwNSwKLSAgICAxMDgsOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDE2MSwwLDAsMCwxNDQsMiwwLDAsMTE1LDgsCi0gICAgMCwwLDAsMCwzLDI1LDEsMjIsMSwxOSwxLDEyMiwyNCw5NSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA1LDExNSw5NSwxMTIsOTcsCi0gICAgOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsCi0gICAgMSwwLDgzLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LAotICAgIDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTY2LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDIxOCwxMyw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMTUyLDIsMCwwLDExNSwwLDAsMCwwLDEyMiwyNyw5NSw3NiwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLAotICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAzLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDgwLDAsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCwKLSAgICAxMjUsMiwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCw1NCwwLDExNiwKLSAgICAyLDAsMTAwLDIsMCwxMDYsMywwLDEyNCwxLDAsMTA2LDEsMCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNCwwLDEwNiw1LDAsMTE2LDYsMCwKLSAgICAxMjQsMiwwLDEyNCwxLDAsMTA2LDcsMCwxMzEsMywwLDEsMTAwLDEsMCwKLSAgICA4Myw0MSwzLDEyMiwxOSw2OSwxMjAsMTAxLDk5LDExNywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAorICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNjQsMCwwLDAsMTE2LDAsCisgICAgMTI0LDAsMTA2LDEsMTI0LDEsMTMxLDEsMTMxLDEsMTAwLDEsMjUsMCwxMjUsMiwKKyAgICAxMjQsMiwxMDYsMiwxMDAsMiwxMDAsMSwxMzEsMiwxMDAsMywyNSwwLDEyNSwzLAorICAgIDEyNCwxLDEwNiwzLDEwMCwyLDEzMSwxLDEwMCw0LDI1LDAsMTI1LDQsMTI0LDMsCisgICAgMTAwLDUsMTA3LDIsMTExLDYyLDEyNCw0LDEwMCw1LDEwNywzLDgzLDAsNDEsNiwKKyAgICAxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsCisgICAgMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsCisgICAgMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDUsMTEwLAorICAgIDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsCisgICAgMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDQsCisgICAgOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLAorICAgIDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0NiwxMTIsMTIxLDM5LDQ2LDExNCwKKyAgICAzMSwwLDAsMCwxMTQsNjEsMCwwLDAsMTE0LDYyLDAsMCwwLDExNCw1OSwKKyAgICAwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDEsNCwxMTQsCisgICAgNDAsMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsMzYsMCwwLDAsMTE0LDM0LAorICAgIDAsMCwwLDQxLDUsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwKKyAgICA5NywwLDAsMCw5MCwxMywxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTUsOTgsCisgICAgOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsMTA4LDk1LDExMCw5NywxMDksMTAxLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNTYsMCwKKyAgICAwLDAsMTM5LDIsMCwwLDExNSw4LDAsMCwwLDAsMywxOCwxLDE2LAorICAgIDEsMTQsMSwxMjIsMjQsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsCisgICAgOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw0Miw4NSwKKyAgICAxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwKKyAgICAxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICA5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwwLDAsMCw0MSwKKyAgICAyLDExNCwxMDMsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTMsOTksMTE0LDEwMSw5NywKKyAgICAxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE0NywyLDAsMCwxMTUsMCwwLAorICAgIDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksCisgICAgMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw0LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw1NiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsCisgICAgMSwxMzEsMSwxMjUsMiwxMjQsMiwxMDAsMSwxMDcsOCwxMTQsMzYsMTE2LDIsMTAwLAorICAgIDIsMTA2LDMsMTI0LDEsMTA2LDEsMTMxLDEsMTMxLDEsMTMwLDEsMTE2LDQsMTA2LAorICAgIDUsMTE2LDYsMTI0LDIsMTI0LDEsMTA2LDcsMTMxLDMsMSwwLDEwMCwxLDgzLAorICAgIDAsNDEsMywxMjIsMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwKICAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsCiAgICAgMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKICAgICAxMTQsMTI1LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwKICAgICA0MCw0MSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsCi0gICAgOCwyMTgsOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDAsMCwwLAotICAgIDExNCwxMDksMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCwxMjMsMCwwLDAsMjE4LAorICAgIDgsMjE4LDgsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsMTE0LDEwOCwwLDAsMCwKKyAgICAxMTQsMTAyLDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTE3LDAsMCwwLDIxOCwKICAgICAyNSw5NSw5OSw5NywxMDgsMTA4LDk1LDExOSwxMDUsMTE2LDEwNCw5NSwxMDIsMTE0LDk3LDEwOSwKICAgICAxMDEsMTE1LDk1LDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDEwMCwyMTgsNCwxMDEsMTIwLDEwMSw5OSwKLSAgICAxMTQsMTIwLDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwyMTgsNiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwxMTQsMTQ4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDExNCwxMTQsMCwwLDAsNDEsMywxMTQsMTAzLDAsMCwwLDIxOCw2LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDExNCwxNDMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCiAgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDE1NSwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLAotICAgIDE4LDEsMTIsMSw5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxNTAsMiwwLDAsMTE1LDEwLDAsMCwwLDAsMiwKKyAgICAxMiwxLDgsMSw2LDEsMTAsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsCiAgICAgMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLAogICAgIDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwxLDc4LAotICAgIDQxLDIsMTE0LDEyMywwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwxNjMsMiwwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSwKLSAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywKLSAgICAxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsOCwxMTQsMTE0LDAsMCwwLAotICAgIDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwKLSAgICAxNjEsMCwwLDAsMTE0LDE4NywwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCwxOTQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMzksMiwwLDAsCi0gICAgMTE1LDEwLDAsMCwwLDEyLDMsNiwyLDEyLDgsMTIsMywxMiw4LDExNCwKLSAgICAxODUsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLAotICAgIDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwKLSAgICAxMzIsMCwwLDkwLDMsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsOTAsNSwwLDEwMCw3LAotICAgIDAsMTAwLDgsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOSwwLDEwMCwxMCwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMSwwLDEwMCwxOCwwLDEwMCwxMywwLDEwMCwKLSAgICAxNCwwLDEzMiwwLDEsOTAsOCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLAotICAgIDAsOTAsOSwwLDEwMCwxNywwLDgzLDQxLDE5LDIxOCwxMiw4MywxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsCi0gICAgMCwwLDExNiwwLDAsMTMwLDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE3OCwKLSAgICA3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwKLSAgICAxMTYsMTA0LDk3LDExNiwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMDUsCi0gICAgMTA5LDEwMSwzMiw0MCw5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExMiwxMDEsOTksCi0gICAgMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwzMiwxMTksMTA0LDEwMSwxMTQsCi0gICAgMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsMTE1LAotICAgIDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LDEwMSwKLSAgICAzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw3OCw0MSwxLDIxOCw3LDczLDc5LDY5LDExNCwxMTQsMTExLDExNCw0MSwyLAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwKLSAgICAxMDksMTE2LDEwNSwxMDksMTAxLDE2OSwyLDAsMCwxMTUsMiwwLDAsMCwwLDYsCi0gICAgMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLAotICAgIDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwKLSAgICAwLDAsMCwxMDAsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDAsMTA1LDEsMCw4Myw0MSwyLDk3LDE3MCwxLDAsMCw3OSwxMTIsMTE2LAorICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDExNiwwLDEwNiwKKyAgICAxLDEyNCwwLDEyNCwxLDEzMSwyLDgzLDAsNDEsMSwxMjIsMjYsODQsMTA0LDEwNSwKKyAgICAxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCisgICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDQxLDIsMTE0LDExNywwLDAsMCwyMTgsMTcsCisgICAgOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsCisgICAgMTA5LDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSwxMDgsMTExLAorICAgIDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxNTgsMiwwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCwyLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LAorICAgIDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsCisgICAgNDEsOCwxMTQsMTA4LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsCisgICAgMCwxMTQsMTEwLDAsMCwwLDExNCwxNTYsMCwwLDAsMTE0LDE4MiwwLDAsMCwKKyAgICAxMTQsMTg3LDAsMCwwLDExNCwxODksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4MCwKKyAgICAwLDAsMCwxMzQsMiwwLDAsMTE1LDEwLDAsMCwwLDgsMyw0LDIsCisgICAgOCw4LDgsMyw4LDgsMTE0LDE4MCwwLDAsMCw5OSwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLAorICAgIDExNSw3NCwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsMTAwLAorICAgIDIsMTMyLDAsOTAsMywxMDAsMywxMDAsNCwxMzIsMCw5MCw0LDEwMCw1LDEwMCwKKyAgICA2LDEzMiwwLDkwLDUsMTAwLDcsMTAwLDgsMTMyLDAsOTAsNiwxMDAsOSwxMDAsCisgICAgMTAsMTMyLDAsOTAsNywxMDAsMTgsMTAwLDEyLDE1NiwxLDEwMCwxMywxMDAsMTQsMTMyLAorICAgIDIsOTAsOCwxMDAsMTUsMTAwLDE2LDEzMiwwLDkwLDksMTAwLDE3LDgzLDAsNDEsCisgICAgMTksMjE4LDEyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsOCwwLDAsMCwxMTYsMCwxMzAsMSwxMDAsMSw4MywKKyAgICAwLDQxLDIsMTIyLDE3OCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDMyLDExNiwxMDUsMTA5LDEwMSwzMiw0MCw5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsCisgICAgMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwKKyAgICAzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsCisgICAgMzIsMTE1LDExNiwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsCisgICAgOTcsMTA1LDExNSwxMDEsMTE1LDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LAorICAgIDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwKKyAgICAxMTEsMTE2LDMyLDk4LDEwMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwxLDIxOCw3LDczLDc5LDY5LDExNCwKKyAgICAxMTQsMTExLDExNCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDE2NSwyLDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDYsMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLAorICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwxNCwwLDAsMCwxMDAsMSwxMjQsMCwxMDYsMCwxMjQsMSwKKyAgICAxMzEsMSwxMDUsMSw4MywwLDQxLDIsOTcsMTcwLDEsMCwwLDc5LDExMiwxMTYsCiAgICAgMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExNCwxMDEsMTE2LAogICAgIDExNywxMTQsMTEwLDEwNSwxMTAsMTAzLDMyLDk3LDMyLDEwOSwxMDEsMTE2LDk3LDEwMCw5NywxMTYsCiAgICAgOTcsMzIsMTAwLDEwNSw5OSwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LApAQCAtMTEzNiwxNDcxICsxMDQzLDEzOTMgQEAKICAgICA5NywxMDUsMTE1LDEwMSwxMTUsMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsCiAgICAgMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLAogICAgIDExMSwxMTYsMzIsOTgsMTAxLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxMzUsMCwwLDAsNDEsMSwxMTQsMTk3LAotICAgIDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxMjksMCwwLDAsNDEsMSwxMTQsMTkyLAorICAgIDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAogICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLAotICAgIDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSwxNzcsMiwwLDAsMTE1LDIsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDE3MywyLDAsMCwxMTUsMiwKICAgICAwLDAsMCwwLDExLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LAogICAgIDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LAogICAgIDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDIsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsODMsNDEsMSwxMjIsMjI4LDc5LDExMiwxMTYsMTA1LAotICAgIDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LAotICAgIDEwNCwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDQwLDk4LAotICAgIDEyMSwxMTYsMTAxLDExNSw0MSwzMiwxMTYsMTExLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiw0MCw5NywzMiwxMTUsMTE2LDExNCw0MSw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LAotICAgIDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwKLSAgICA5NywxMDgsMTA4LDExMSwxMTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExOSwKLSAgICAxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTA1LDExMCwzMiwKLSAgICAxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMzIsOTksMTExLDExNCwxMTQsMTAxLDk5LDExNiwKLSAgICAxMDgsMTIxLDMyLDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTAxLDExNCwzMiwxMTIsMTAxLDExNCwxMDksCi0gICAgMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDQxLDEsMjE4LDgsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSw0LDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDkyLDAsMCwwLDkwLDEwLDk5LDk3LDk5LDEwNCwxMDEsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsMTE0LDU1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNSw5NSw5OSw5Nyw5OSwxMDQsMTAxLAotICAgIDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDE5MCwyLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDgsMTIyLDI4LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNDYsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCi0gICAgMTAwLDEwMSw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsCi0gICAgNDEsMiwxMjIsMTUwLDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDExNSwKLSAgICAzMiwxMDAsOTcsMTE2LDk3LDMyLDQwLDk4LDEyMSwxMTYsMTAxLDExNSw0MSwzMiwxMTYsMTExLAotICAgIDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw0MCw5NywzMiwKLSAgICAxMTUsMTE2LDExNCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTA1LDExNSwKLSAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsCi0gICAgMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTUsCi0gICAgNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTE0LDQsMCwwLDAsCi0gICAgNDEsMywxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsNTUsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMTE0LDE5OSwwLDAsMCwyMDAsMiwwLDAsMTE1LDAsMCwwLDAsMTIyLDIxLAotICAgIDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDEwMSwxMTYsCi0gICAgOTUsMTAwLDk3LDExNiw5Nyw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLAotICAgIDAsMCwxNiwwLDAsMCw2NywwLDAsMCwxMTUsMTA1LDAsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjEsMTksCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsCi0gICAgODcsMTEwLDU4LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw5NCwwLDEsMTI1LAotICAgIDQsMCwxLDEyMiwyNiwwLDExNiwzLDAsMTAwLDEsMCwxMDAsMiwwLDEyNCwKLSAgICAxLDAsMTMxLDEsMSwxMjQsNCwwLDEzMCwyLDAsODcsODksMTAwLDMsMCwKLSAgICAxMDAsMywwLDEyNSw0LDAsMTI2LDQsMCw4OCwxMTAsMSwwLDg4LDExNiw0LAotICAgIDAsMTI0LDMsMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDUyLDY3LDExMSwxMTAsOTksCi0gICAgMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDYsCi0gICAgMTIyLDM5LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTE4LDk3LAotICAgIDEwNSwxMDgsOTcsOTgsMTA4LDEwMSwzMiwxMTYsMTA0LDExNCwxMTEsMTE3LDEwMywxMDQsMzIsMTAzLAotICAgIDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MCw0MSwxMTQsMTA4LDAsMCwwLDc4LDQxLAotICAgIDUsMTE0LDE1OSwwLDAsMCwyMTgsOCwxMDMsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LAotICAgIDExNCw0MiwwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxNTcsMCwwLDAsNDEsCi0gICAgNSwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLAotICAgIDExNCwxNTUsMCwwLDAsMjE4LDMsMTAxLDEyMCw5OSwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTAsMTAzLDEwMSwxMTYsOTUsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwyMDcsMiwwLDAsMTE1LDE0LDAsMCwwLDAsMiwKLSAgICAxNSwxLDMsMSwxOSwxLDE4LDEsOSwxLDMxLDEsMTIyLDIzLDgzLDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwyMTgsOSw5NSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLAotICAgIDExNCwzMSwwLDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsNCwwLAotICAgIDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMTYsCi0gICAgMCwwLDEwNiwxLDAsMTE2LDIsMCwxMjQsMSwwLDEyNCwyLDAsMTAwLDEsCi0gICAgMCwxMDAsMiwwLDEwMCwzLDAsMTAwLDQsMCwxMjQsMywwLDEzMSw0LDIsCi0gICAgODMsNDEsNSwxMjIsMTMwLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDk5LDExMSwxMDksMTEyLAotICAgIDEwNSwxMDgsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDM5LAotICAgIDEwMCw5NywxMTYsOTcsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDk5LAotICAgIDk3LDExMCwzMiw5OCwxMDEsMzIsOTcsMTEwLDEyMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsCi0gICAgMzIsMTE2LDEyMSwxMTIsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDExMSwxMDksMTEyLDEwNSwKLSAgICAxMDgsMTAxLDQwLDQxLDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMTAsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDE5MCwwLDAsMCwyMTgsMTIsMTAwLDExMSwKLSAgICAxMTAsMTE2LDk1LDEwNSwxMTAsMTA0LDEwMSwxMTQsMTA1LDExNiw4NCwxMTQsNzAsMCwwLDAsCi0gICAgNDEsMywxMTQsMTIzLDAsMCwwLDExNCwxODksMCwwLDAsMjE4LDcsOTksMTExLAotICAgIDEwOSwxMTIsMTA1LDEwOCwxMDEsNDEsNCwxMTQsMTEwLDAsMCwwLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsMzcsMCwwLDAsMTE0LDIwNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTQsMTE1LDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSw5NSwxMTYsMTExLDk1LDk5LDExMSwxMDAsMTAxLDIxNywyLDAsMCwxMTUsNCwKLSAgICAwLDAsMCwwLDUsMjEsMSwxMjIsMjcsODMsMTExLDExNywxMTQsOTksMTAxLDc2LAotICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNiwxMTEsOTUsCi0gICAgOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDEwLDAsMCwKLSAgICAwLDQzLDAsMCwwLDY3LDAsMCwwLDExNSwxNzQsMSwwLDAsMTI0LDAsCi0gICAgMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEwMCwxLDAsCi0gICAgMTI1LDMsMCwxMjEsMTYsMCwxMTYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsCi0gICAgNCwwLDg3LDExMCwyNCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjMsMCwKLSAgICAxLDEsMSwxMDAsMSwwLDEyNSw0LDAsODksMTEwLDIwMiwwLDg4LDEyMSwxOSwKLSAgICAwLDEyNCwwLDAsMTA2LDMsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDUsMCwKLSAgICA4NywxMTAsMTgsMCw0LDExNiw0LDAsMTA3LDEwLDAsMTE0LDEwMywwLDEsMSwKLSAgICAxLDg5LDExMCwxNjIsMCw4OCwxMTYsNSwwLDEyNCw1LDAsMTAwLDIsMCwyNSwKLSAgICAxMzEsMSwwLDEyNSwzLDAsMTIxLDE5LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwKLSAgICA0LDAsMTMxLDEsMCwxMjUsNiwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwKLSAgICAxMDcsMTAsMCwxMTQsMTU5LDAsMSwxLDEsODksMTEwLDEwNiwwLDg4LDEyMSwzNCwKLSAgICAwLDExNiw4LDAsMTI0LDYsMCwxMDAsMywwLDEyNCw1LDAsMTAwLDQsMCwKLSAgICAxMjQsMSwwLDEwMCw1LDAsMTI0LDQsMCwxMzEsMSwzLDEyNSw3LDAsODcsCi0gICAgMTEwLDI0LDAsNCwxMTYsOSwwLDExNiwxMCwwLDEwMiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDIyMCwwLDEsMSwxLDg5LDExMCw0NSwwLDg4LDExNiwxMSwwLDEwMCw2LAotICAgIDAsMTI0LDQsMCwxMjQsMiwwLDEzMSwzLDAsMSwxMTYsMTIsMCwxMjQsNywKLSAgICAwLDEwMCw0LDAsMTI0LDEsMCwxMDAsNywwLDEyNCw0LDAsMTAwLDgsMCwKLSAgICAxMjQsMiwwLDEzMSwxLDMsODMsMTI0LDAsMCwxMDYsNiwwLDEyNCwyLDAsCi0gICAgMTMxLDEsMCwxMjUsOCwwLDEyNCwwLDAsMTA2LDEzLDAsMTI0LDgsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTI1LDksMCwxMTYsMTEsMCwxMDAsOSwwLDEyNCwyLAotICAgIDAsMTMxLDIsMCwxLDExNiwxNCwwLDEwNiwxNSwwLDEyLDExNCwxNzAsMSwxMjQsCi0gICAgNCwwLDEwMCwxLDAsMTA3LDksMCwxMTQsMTcwLDEsMTI0LDMsMCwxMDAsMSwKLSAgICAwLDEwNyw5LDAsMTE0LDE3MCwxLDExNiwxNiwwLDEyNCw5LDAsMTI0LDMsMCwKLSAgICAxMTYsMTcsMCwxMjQsOCwwLDEzMSwxLDAsMTMxLDMsMCwxMjUsNiwwLDEyMSwKLSAgICAzNiwwLDEyNCwwLDAsMTA2LDE4LDAsMTI0LDIsMCwxMjQsNCwwLDEyNCw2LAotICAgIDAsMTMxLDMsMCwxLDExNiwxMSwwLDEwMCwxMCwwLDEyNCw0LDAsMTMxLDIsCi0gICAgMCwxLDg3LDExMCwxOCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsMTY5LDEsCi0gICAgMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsOSwwLDgzLDQxLDExLDEyMiwxOTAsCi0gICAgNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLAotICAgIDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLAotICAgIDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwKLSAgICAxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsMTAxLDk3LDEwMCwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLAotICAgIDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiwKLSAgICA5NywxMTYsMTE1LDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDEwMSwxMDAsNDYsMzIsODQsMTExLDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTAsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsCi0gICAgNDQsMzIsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5NywzMiwxMDksMTE3LDExNSwxMTYsMzIsCi0gICAgOTcsMTA4LDExNSwxMTEsMzIsOTgsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCi0gICAgMTE2LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTE0LAotICAgIDEzNSwwLDAsMCwxMTQsMTQwLDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDM3LAotICAgIDAsMCwwLDEyMiwxMywxMjMsMTI1LDMyLDEwOSw5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsCi0gICAgMTIzLDEyNSwxMTQsOTEsMCwwLDAsMTE0LDkyLDAsMCwwLDEyMiwxOSw5OSwxMTEsCi0gICAgMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywKLSAgICAxMjUsMTIyLDEwLDExOSwxMTQsMTExLDExNiwxMDEsMzIsMTIzLDMzLDExNCwxMjUsNDEsMTksMTE0LAotICAgIDE1OSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDY4LDAsMCwwLDExNCwxOTgsCi0gICAgMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTYsMCwwLDAsMTE0LDIwMSwwLAotICAgIDAsMCwxMTQsNDIsMCwwLDAsMTE0LDE0MywwLDAsMCwxMTQsMTA5LDAsMCwKLSAgICAwLDExNCwxMzgsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTQ5LDAsMCwwLAotICAgIDExNCwyMDcsMCwwLDAsMTE0LDgsMCwwLDAsMjE4LDE5LDEwMCwxMTEsMTEwLDExNiwKLSAgICA5NSwxMTksMTE0LDEwNSwxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwKLSAgICAxNTIsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCwyMDAsMCwwLDAsNDEsMTAsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw5MiwwLDAsMCwxMTQsCi0gICAgMTQxLDAsMCwwLDExNCw5MSwwLDAsMCwyMTgsMiwxMTUsMTE2LDExNCw1NSwwLAotICAgIDAsMCwyMTgsMTAsOTgsMTIxLDExNiwxMDEsMTE1LDk1LDEwMCw5NywxMTYsOTcsMTE0LDE1NSwKLSAgICAwLDAsMCw5MCwxMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LAotICAgIDE4OCwwLDAsMCwyMjUsMiwwLDAsMTE1LDc4LDAsMCwwLDAsNywxNSwKLSAgICAxLDYsMSwzLDEsMTYsMSwxMywxLDExLDIsMywxLDE5LDEsMTMsCi0gICAgMSw1LDIsMTYsMSwzLDEsMTksMSwxMywxLDUsMiwzLDEsOSwKLSAgICAxLDEyLDEsMTMsMSwxOSwxLDUsMiw5LDEsNywxLDE1LDEsNiwKLSAgICAxLDcsMSwxNSwxLDE4LDEsMTMsMSwyMiwxLDEyLDEsOSwxLDE1LAotICAgIDEsMywxLDE5LDEsMTcsMSwxMywxLDUsMSwxMjIsMjEsODMsMTExLDExNywKLSAgICAxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsCi0gICAgMTAwLDEwMSw3OCwxMTQsODksMCwwLDAsNDEsMTAsMTE0LDExNCwwLDAsMCwxMTQsCi0gICAgMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDE5NywwLDAsMCwxMTQsMTk4LAotICAgIDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LDE5OSwwLDAsMCwxMTQsMjAzLDAsCi0gICAgMCwwLDExNCwyMDcsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAxMTQsMTk1LDAsMCwwLDE2NywyLDAsMCwxMTUsMTQsMCwwLDAsMTIsMiwKLSAgICAxMiw4LDEyLDEzLDEyLDEwLDEyLDcsMTIsMTAsMTgsOCwxMTQsMTk1LDAsMCwKLSAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwKLSAgICAwLDAsMCwwLDAsMCwxMTUsMTEyLDAsMCwwLDEwMSwwLDAsOTAsMSwKLSAgICAwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsCi0gICAgMTAwLDMsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLAotICAgIDAsMCw5MCw1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwKLSAgICAwLDEwMSw3LDAsMTM1LDAsMCwxMDIsMSwwLDEwMCw4LDAsMTAwLDksMCwKLSAgICAxMzQsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSw3LDAsMTAwLDEwLDAsMTAwLAotICAgIDExLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDksMCwxMDAsMTIsMCwxMDAsMTMsCi0gICAgMCwxMzIsMCwwLDkwLDEwLDAsMTM1LDAsMCw4Myw0MSwxNCwyMTgsMTAsNzAsCi0gICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiwxMDMsNjYsOTcsMTE1LDEwMSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LAotICAgIDExNSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKLSAgICAxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTEyLDExNCwKLSAgICAxMTEsMTE2LDExMSw5OSwxMTEsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNSwzMiwxMTYsCi0gICAgMTA0LDk3LDExNiwxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDExNywxMTUsOTcsMTAzLAotICAgIDEwMSw0Niw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwyLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwKLSAgICAwLDAsOTUsMCwwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiw3NSw2Nyw5Nyw5OSwxMDQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDk3LDExMCwxMDAsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsCi0gICAgNDYsNzgsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NiwKLSAgICAwLDAsMCwyNiwzLDAsMCwxMTUsNCwwLDAsMCwwLDMsOSwxLAotICAgIDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LAotICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsMCwxMTEsMzMsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywyLDAsCi0gICAgODMsNDEsMSw3OCw0MSwyLDIxOCw5LDk1LDk1LDk5LDEwOCw5NywxMTUsMTE1LDk1LAotICAgIDk1LDExNCwxMjAsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDIxOCw1LDExMSwKLSAgICAxMTYsMTA0LDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMjE4LDYsOTUsOTUsMTAxLDExMyw5NSw5NSwzMiwzLDAsMCwxMTUsCi0gICAgNCwwLDAsMCwwLDEsMTgsMSwxMjIsMTcsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMjYsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDY1LDgzLDQxLAotICAgIDEsNzgsNDEsMywyMTgsNCwxMDQsOTcsMTE1LDEwNCwxMTQsMTA4LDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCw0MSwxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDgsOTUsOTUsMTA0LDk3LAotICAgIDExNSwxMDQsOTUsOTUsMzYsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwKLSAgICAxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LAotICAgIDExNSwxMDQsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMywwLDAsMCwzLDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwKLSAgICAwLDExNiwxLDAsMTI0LDAsMCwxMzEsMiwwLDEwNiwyLDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDgzLDQxLDEsMTIyLDEwMCw3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsCi0gICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLAotICAgIDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywKLSAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMywyMTgsNSwKLSAgICAxMTUsMTE3LDExMiwxMDEsMTE0LDExNCwyMTEsMCwwLDAsMTE0LDE5NCwwLDAsMCw0MSwKLSAgICAyLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCw0MSwxLDExNCwyMTIsMCwKKyAgICAwLDAsMCwxMTUsMTIsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDIsMTI0LDMsCisgICAgMTMxLDIsODMsMCw0MSwxLDEyMiwyMjgsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsCisgICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsCisgICAgMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LAorICAgIDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LAorICAgIDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsCisgICAgMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLAorICAgIDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwKKyAgICAxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwKKyAgICAxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LAorICAgIDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLDEwMSwKKyAgICAxMTQsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTE2LAorICAgIDExNCw5NywxMTAsMTE1LDEwMiwxMDEsMTE0LDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsCisgICAgMTExLDExMCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwyMTgsOCwKKyAgICAxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQxLDQsMTE0LDEwMywwLDAsMCwxMTQsCisgICAgOTMsMCwwLDAsOTAsMTAsOTksOTcsOTksMTA0LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICAxMTQsNTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMjE4LDE1LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwKKyAgICAxMDEsOTksMTExLDEwMCwxMDEsMTg2LDIsMCwwLDExNSwyLDAsMCwwLDAsOCwKKyAgICAxMjIsMjgsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk5LDMsCisgICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwxNTAsCisgICAgNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsCisgICAgMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsCisgICAgOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLAorICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwKKyAgICAxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LAorICAgIDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLAorICAgIDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSw0NiwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsNCwwLDAsMCw0MSwzLDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsNCwwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk0LDAsMCwKLSAgICAwLDM5LDMsMCwwLDExNSwyLDAsMCwwLDAsMTAsMTIyLDIyLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLAotICAgIDAsMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwKLSAgICAxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwxNTksMCwwLDAsNTEsMywwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwzLDEyMiwyMyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDksMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwKLSAgICAwLDEwMCwxLDAsMTMxLDIsMCwxNDMsMTcsMCwxMjUsMiwwLDEyNCwyLDAsCi0gICAgMTA2LDIsMCwxMzEsMCwwLDgzLDg3LDEwMCwyLDAsODEsODIsODgsMTAwLDIsCi0gICAgMCw4Myw0MSwzLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwMCw5NywxMTYsOTcsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDk3LDExNSwzMiwxMTQsOTcsMTE5LDMyLDk4LDEyMSwxMTYsMTAxLDExNSw0NiwyMTgsMSwxMTQsCi0gICAgNzgsNDEsMywxMTQsNTEsMCwwLDAsMTE0LDUyLDAsMCwwLDkwLDQsMTE0LAotICAgIDEwMSw5NywxMDAsNDEsMywxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCi0gICAgNTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDIwMSwwLDAsMCw1NiwzLDAsMCwxMTUsNCwwLDAsCi0gICAgMCwwLDIsMjEsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsMTEsMTE0LDExNCwwLDAsCi0gICAgMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsMCwKLSAgICAxMTQsMTg2LDAsMCwwLDExNCwyMTQsMCwwLDAsMTE0LDIxNiwwLDAsMCwxMTQsCi0gICAgMTI1LDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsMjAxLAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LAotICAgIDIxMiwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjExLDAsMCwwLDIxLDMsCi0gICAgMCwwLDExNSwxNCwwLDAsMCwxMiwzLDYsMiwxMiw2LDEyLDQsMTIsCi0gICAgMywyNCwxMiwxOCw1LDExNCwyMTEsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNjQsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDEsOTAsNiwwLAotICAgIDEwMCwxMCwwLDgzLDQxLDExLDIxOCwxNiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw2Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsCi0gICAgMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwKLSAgICAxMTAsMzIsMTExLDEwMiwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLAotICAgIDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDQ2LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsCi0gICAgMCwxMjQsMiwwLDEwNiwxLDAsMTAwLDIsMCwxMjQsMiwwLDEwNiwyLDAsCi0gICAgMTA1LDIsMCw4Myw0MSwzLDEyMiwzMyw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDk3LDEwMCw5NywxMTYsOTcsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDYsMTE0LDEzNSwwLDAsMCwxMTQsMTM2LAotICAgIDAsMCwwLDQxLDMsMTE0LDQxLDAsMCwwLDIxOCw4LDExNSwxMTYsOTUsMTA5LAotICAgIDExNiwxMDUsMTA5LDEwMSw5MCw3LDExNSwxMTYsOTUsMTE1LDEwNSwxMjIsMTAxLDQxLDMsMTE0LAotICAgIDExMCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDIwOSwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk4LDAsCi0gICAgMCwwLDY2LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxMiwxLDEyMiwKLSAgICAyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwKLSAgICAwLDAsMCwwLDAsNSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwzNCwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsCi0gICAgNCwwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTAwLDEsCi0gICAgMCwxMjQsNCwwLDEzMSwyLDEsODMsNDEsMiw3OCwyMTgsNSw5NSwxMDksMTExLAotICAgIDEwMCwxMDEsNDEsMiwxMTQsOTksMCwwLDAsMTE0LDE5OSwwLDAsMCw0MSw1LAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDkyLDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsCi0gICAgNTUsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMDAsMCwwLDAsNzEsMywwLAotICAgIDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLDMyLDgzLDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTksOTcsCi0gICAgOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjIxLDAsMCwKLSAgICAwLDEwNSwxODIsMSwwLDAsOTksMywwLDAsMCwxLDAsMCwwLDksCi0gICAgMCwwLDAsMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDUzLDEsMCwwLAotICAgIDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsMCwxMjUsNCwwLDEyNSwKLSAgICA1LDAsMTAzLDAsMCwxMjUsNiwwLDEyMCw1NCwwLDEyNCw0LDAsMTE0LDgwLAotICAgIDAsMTE2LDEsMCwxMjQsNCwwLDEzMSwxLDAsMTIsMTE0LDgwLDAsMTE2LDAsCi0gICAgMCwxMjQsNCwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDcsMCwKLSAgICAxMjQsNiwwLDEwNiwyLDAsMTI0LDcsMCwxMzEsMSwwLDEsMTEzLDI3LDAsCi0gICAgODcsMTIwLDEzMiwwLDExNiwzLDAsMTI0LDYsMCwxMzEsMSwwLDY4LDkzLDExOCwKLSAgICAwLDEyNSw3LDAsMTE2LDQsMCwxMjQsNCwwLDEyNCw3LDAsMTMxLDIsMCwKLSAgICAxMjUsNCwwLDEyMSwxNywwLDExNiw1LDAsMTA2LDYsMCwxMjQsNCwwLDEzMSwKLSAgICAxLDAsMSw4NywxMTMsOTQsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LDE1NSwKLSAgICAwLDEsMSwxLDExOSw5NCwwLDg5LDExMyw5NCwwLDQsMTE2LDgsMCwxMDcsCi0gICAgMTAsMCwxMTQsMjExLDAsMSwxMjUsOCwwLDEsMTIyLDI1LDAsMTE2LDksMCwKLSAgICAxMDAsMSwwLDEyNCw0LDAsMTI0LDgsMCwxMzEsMywwLDEsMTAwLDIsMCwKLSAgICA4Myw4Nyw4OSwxMDAsMiwwLDEwMCwyLDAsMTI1LDgsMCwxMjYsOCwwLDg4LAotICAgIDExMyw5NCwwLDg4LDExMyw5NCwwLDg3LDEyMSwzMywwLDExNiwxMCwwLDEyNCwxLAotICAgIDAsMTI0LDIsMCwxMjQsMywwLDEzMSwzLDAsMSwxMTYsOSwwLDEwMCwzLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDEsODcsMTEwLDUzLDAsNCwxMTYsOCwwLAotICAgIDEwNywxMCwwLDExNCw0OCwxLDEsMTI1LDgsMCwxLDEyMiwyMSwwLDExNiw5LAotICAgIDAsMTAwLDEsMCwxMjQsMSwwLDEyNCw4LDAsMTMxLDMsMCwxLDg3LDg5LAotICAgIDEwMCwyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsMTEwLDEsMCwKLSAgICA4OCwxMDAsMiwwLDgzLDQxLDQsMTIyLDI3LDg3LDExNCwxMDUsMTE2LDEwMSwzMiw5OCwKLSAgICAxMjEsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiwxMTYsMTExLDMyLDk3LDMyLDEwMiwKLSAgICAxMDUsMTA4LDEwMSw0NiwxMjIsMjcsOTksMTExLDExNywxMDgsMTAwLDMyLDExMCwxMTEsMTE2LDMyLAotICAgIDk5LDExNCwxMDEsOTcsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw1OCwzMiwxMjMsMzMsMTE0LAotICAgIDEyNSw3OCwxMjIsMTIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDEwMCwzMiwxMjMsMzMsMTE0LDEyNSwKLSAgICA0MSwxMSwxMTQsNDAsMCwwLDAsMTE0LDQ4LDAsMCwwLDExNCwxNjUsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsMywwLDAsMCwKLSAgICA5MCw1LDEwOSwxMDcsMTAwLDEwNSwxMTQsMjE4LDE1LDcwLDEwNSwxMDgsMTAxLDY5LDEyMCwxMDUsCi0gICAgMTE1LDExNiwxMTUsNjksMTE0LDExNCwxMTEsMTE0LDExNCw0MiwwLDAsMCwxMTQsMTA3LDAsCi0gICAgMCwwLDExNCw1NywwLDAsMCw0MSw5LDExNCwxMTAsMCwwLDAsMTE0LDM3LAotICAgIDAsMCwwLDExNCw1NSwwLDAsMCwxMTQsMjIxLDAsMCwwLDIxOCw2LDExMiwKLSAgICA5NywxMTQsMTAxLDExMCwxMTYsMTE0LDk2LDAsMCwwLDExNCwyOSwwLDAsMCwxMTQsCi0gICAgMjUsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk5LDAsMCwwLDc2LDMsMCwKLSAgICAwLDExNSwzOCwwLDAsMCwwLDIsMTgsMSw2LDIsMjIsMSwxOCwxLAotICAgIDE3LDIsMTksMSwxNSwxLDMsMSwxNywxLDEzLDIsNywxLDE4LDMsCi0gICAgMTYsMSwyNywxLDMsMSwxNiwxLDE3LDEsMTgsMiwxMjIsMjUsODMsMTExLAotICAgIDExNywxMTQsOTksMTAxLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsCi0gICAgMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDc4LDQxLDcsMTE0LDExNCwwLDAsMCwxMTQsCi0gICAgMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsMTk4LAotICAgIDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LDE5OSwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwxMTQsMjE5LDAsMCwwLDYyLDMsMCwwLDExNSw4LDAsMCwwLDEyLAotICAgIDIsNiwyLDEyLDUsMTIsNSwxMTQsMjE5LDAsMCwwLDk5LDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLAotICAgIDAsMTE1LDQ2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsCi0gICAgMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwKLSAgICAwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsCi0gICAgMTAwLDYsMCw4Myw0MSw3LDIxOCwyMCw4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwKLSAgICAxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsNDUsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsCi0gICAgMTAxLDExNSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSwzMiwxMDIsMTA1LAotICAgIDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCw1LDAsMCwwLDYsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDc2LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLAotICAgIDAsMTI1LDIsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLAotICAgIDEyNSwzLDAsMTE2LDIsMCwxMjQsMywwLDEwMCwxLDAsMTI0LDEsMCwxMDAsCi0gICAgMiwwLDEyNCwyLDAsMTMxLDEsMiwxMjUsNCwwLDExNiwzLDAsMTI0LDQsCi0gICAgMCwxMDAsMSwwLDEyNCwxLDAsMTAwLDMsMCwxMjQsMiwwLDEzMSwxLDIsCi0gICAgODMsNDEsNCw3OCwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsOTEsCi0gICAgMCwwLDAsNDEsNCwxMTQsMTU5LDAsMCwwLDExNCwyMDEsMCwwLDAsMTE0LAotICAgIDE0MywwLDAsMCwxMTQsMTQ5LDAsMCwwLDQxLDUsMTE0LDExMCwwLDAsMCwKLSAgICAxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsNTUsMCwwLDAsMTE0LAotICAgIDIxMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMTg4LDAsMCwwLDEwOSwzLDAsMCwxMTUsOCwwLDAsCi0gICAgMCwwLDEsMTUsMSwxNSwxLDI0LDEsMTIyLDI5LDgzLDExMSwxMTcsMTE0LDk5LAotICAgIDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAotICAgIDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwKLSAgICAwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLAotICAgIDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LAorICAgIDAsMTk2LDIsMCwwLDExNSwwLDAsMCwwLDEyMiwyMSw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsCisgICAgOTcsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMTYsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDg0LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwKKyAgICAxLDEzMSwxLDEyNSwyLDEyMSwxNCwxMjQsMCwxMDYsMSwxMjQsMiwxMzEsMSwxMjUsCisgICAgMyw4NywwLDExMCw1MCw0LDAsMTE2LDIsMTA3LDEwLDExNCw3NCwxLDAsMTI1LAorICAgIDQsMSwwLDEyMiwyMiwxMTYsMywxMDAsMSwxMDAsMiwxMjQsMSwxNDQsMSwxMzEsCisgICAgMSwxMjQsNCwxMzAsMiw4NywwLDg5LDAsMTAwLDMsMTAwLDMsMTI1LDQsMTI2LAorICAgIDQsODgsMCwxMTAsMiw4OCwwLDExNiw0LDEyNCwzLDEzMSwxLDgzLDAsNDEsCisgICAgNCwxMjIsNTIsNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LAorICAgIDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLAorICAgIDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCisgICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwxMjIsMzksMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwKKyAgICAxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDMyLDExNiwxMDQsCisgICAgMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQwLDQxLAorICAgIDExNCwxMDEsMCwwLDAsNzgsNDEsNSwxMTQsMTU0LDAsMCwwLDIxOCw4LDEwMywKKyAgICAxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsMTE0LDQyLDAsMCwwLDExNCwxMDIsMCwwLAorICAgIDAsMTE0LDE1MiwwLDAsMCw0MSw1LDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE1MCwwLDAsMCwyMTgsMywxMDEsMTIwLAorICAgIDk5LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAorICAgIDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDIwMywyLDAsMCwKKyAgICAxMTUsMTQsMCwwLDAsMCwyLDEwLDEsMiwxLDE0LDEsMTYsMSw2LAorICAgIDEsMjgsMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDExNCwzMSwwLDAsCisgICAgMCw0MSwxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsOTksMywKKyAgICAwLDAsMCwxLDAsMCwwLDQsMCwwLDAsOSwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LDAsMTA2LDEsMTE2LDIsMTI0LDEsCisgICAgMTI0LDIsMTAwLDEsMTAwLDIsMTAwLDMsMTAwLDQsMTI0LDMsMTQ0LDIsMTMxLDQsCisgICAgODMsMCw0MSw1LDEyMiwxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwKKyAgICAxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgMzksMTAwLDk3LDExNiw5NywzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsCisgICAgOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LAorICAgIDExNiwzMiwxMTYsMTIxLDExMiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsCisgICAgMTA1LDEwOCwxMDEsNDAsNDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTg1LDAsMCwwLDIxOCwxMiwxMDAsCisgICAgMTExLDExMCwxMTYsOTUsMTA1LDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw3MSwwLDAsCisgICAgMCw0MSwzLDExNCwxMTcsMCwwLDAsMTE0LDE4NCwwLDAsMCwyMTgsNyw5OSwKKyAgICAxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MSw0LDExNCwxMDMsMCwwLDAsMTE0LDU2LDAsCisgICAgMCwwLDExNCwzNywwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDk1LDExNiwxMTEsOTUsOTksMTExLDEwMCwxMDEsMjEzLDIsMCwwLDExNSwKKyAgICA0LDAsMCwwLDAsNSwxNCwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsCisgICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSwKKyAgICA5NSw5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwKKyAgICAwLDAsNDMsMCwwLDAsNjcsMCwwLDAsMTE1LDEwNiwxLDAsMCwxMjQsCisgICAgMCwxMDYsMCwxMjQsMSwxMzEsMSwxMjUsMiwxMDAsMSwxMjUsMywxMjEsMTIsMTE2LAorICAgIDEsMTI0LDIsMTMxLDEsMTI1LDQsODcsMCwxMTAsMjQsNCwwLDExNiwyLDEwNywKKyAgICAxMCwxMTQsNTAsMSwwLDEsMCwxLDAsMTAwLDEsMTI1LDQsODksMCwxMTAsCisgICAgMTc0LDg4LDAsMTIxLDE0LDEyNCwwLDEwNiwzLDEyNCwyLDEzMSwxLDEyNSw1LDg3LAorICAgIDAsMTEwLDIwLDQsMCwxMTYsNCwxMDcsMTAsMTE0LDg2LDEsMCwxLDAsMSwKKyAgICAwLDg5LDAsMTEwLDEzOCw4OCwwLDExNiw1LDEyNCw1LDEwMCwyLDI1LDAsMTMxLAorICAgIDEsMTI1LDMsMTIxLDE0LDEyNCwwLDEwNiw2LDEyNCw0LDEzMSwxLDEyNSw2LDg3LAorICAgIDAsMTEwLDIwLDQsMCwxMTYsNywxMDcsMTAsMTE0LDEzNCwxLDAsMSwwLDEsCisgICAgMCw4OSwwLDExMCw5MCw4OCwwLDEyMSwyNiwxMTYsOCwxMjQsNiwxMDAsMywxMjQsCisgICAgNSwxMDAsNCwxMjQsMSwxMDAsNSwxMjQsNCwxNDQsMywxMzEsMSwxMjUsNyw4NywKKyAgICAwLDExMCwyNCw0LDAsMTE2LDksMTE2LDEwLDEwMiwyLDEwNywxMCwxMTQsMTg2LDEsCisgICAgMCwxLDAsMSwwLDg5LDAsMTEwLDM4LDg4LDAsMTE2LDExLDEwNiwxMiwxMDAsCisgICAgNiwxMjQsNCwxMjQsMiwxMzEsMywxLDAsMTE2LDEzLDEyNCw3LDEwMCw0LDEyNCwKKyAgICAxLDEwMCw3LDEyNCw0LDEwMCw4LDEyNCwyLDE0NCwzLDEzMSwxLDgzLDAsMTI0LAorICAgIDAsMTA2LDYsMTI0LDIsMTMxLDEsMTI1LDgsMTI0LDAsMTA2LDE0LDEyNCw4LDEyNCwKKyAgICAyLDEzMSwyLDEyNSw5LDExNiwxMSwxMDYsMTIsMTAwLDksMTI0LDIsMTMxLDIsMSwKKyAgICAwLDExNiwxNSwxMDYsMTYsMTIsMCwxNDQsMSwxMTQsMTAyLDEyNCw0LDEwMCwxLDEwNywKKyAgICA5LDE0NCwxLDExNCwxMDIsMTI0LDMsMTAwLDEsMTA3LDksMTQ0LDEsMTE0LDEwMiwxMTYsCisgICAgMTcsMTI0LDksMTI0LDMsMTE2LDE4LDEyNCw4LDEzMSwxLDEzMSwzLDEyNSw2LDEyMSwKKyAgICAzMCwxMjQsMCwxMDYsMTksMTI0LDIsMTI0LDQsMTI0LDYsMTMxLDMsMSwwLDExNiwKKyAgICAxMSwxMDYsMTIsMTAwLDEwLDEyNCw0LDEzMSwyLDEsMCw4NywwLDExMCwyMiw0LAorICAgIDAsMTE2LDIsMTA3LDEwLDE0NCwxLDExNCwxMDAsMSwwLDEsMCwxLDAsODksCisgICAgMCwxMTAsMiw4OCwwLDEyNCw5LDgzLDAsNDEsMTEsMTIyLDE5MCw2NywxMTEsMTEwLAorICAgIDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywKKyAgICAxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLAorICAgIDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTE0LDEwMSwxMTMsCisgICAgMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsCisgICAgMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCisgICAgMTAxLDEwMCw0NiwzMiw4NCwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw0NCwzMiwxMTUsCisgICAgMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5NywxMDgsMTE1LAorICAgIDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsMTI5LDAsMCwKKyAgICAwLDExNCwxMzUsMCwwLDAsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsCisgICAgMTIyLDEzLDEyMywxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMjMsMTI1LDExNCwKKyAgICA5MiwwLDAsMCwxMTQsOTMsMCwwLDAsMTIyLDE5LDk5LDExMSwxMDAsMTAxLDMyLAorICAgIDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDEyNSwxMjIsMTAsCisgICAgMTE5LDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwyMCwxMTQsMTU0LDAsMCwKKyAgICAwLDExNCw4MiwwLDAsMCwxMTQsNjksMCwwLDAsMTE0LDE5MywwLDAsMCwKKyAgICAxMTQsMTkxLDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwKKyAgICA0MiwwLDAsMCwxMTQsMTM4LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDEzMywKKyAgICAwLDAsMCwxMTQsMTE3LDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LDE0NCwwLAorICAgIDAsMCwxMTQsMjAyLDAsMCwwLDExNCw4LDAsMCwwLDIxOCwxOSwxMDAsMTExLAorICAgIDExMCwxMTYsOTUsMTE5LDExNCwxMDUsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLAorICAgIDEwMSwxMTQsMTQ3LDAsMCwwLDExNCwzMywwLDAsMCwxMTQsMTk1LDAsMCwwLAorICAgIDQxLDEwLDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsOTMsMCwwLAorICAgIDAsMTE0LDEzNiwwLDAsMCwxMTQsOTIsMCwwLDAsMjE4LDIsMTE1LDExNiwxMTQsCisgICAgNTYsMCwwLDAsMjE4LDEwLDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMDAsOTcsMTE2LDk3LAorICAgIDExNCwxNTAsMCwwLDAsOTAsMTEsOTksMTExLDEwMCwxMDEsOTUsMTExLDk4LDEwNiwxMDEsCisgICAgOTksMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKKyAgICAwLDExNCwxODMsMCwwLDAsMjIxLDIsMCwwLDExNSw3OCwwLDAsMCwwLAorICAgIDcsMTAsMSw0LDEsMiwxLDEyLDEsMTQsMSwxMCwyLDIsMSwxNCwKKyAgICAxLDE0LDEsNiwyLDEyLDEsMiwxLDE0LDEsMTQsMSw2LDIsMiwKKyAgICAxLDYsMSw4LDEsMTIsMSwxOCwxLDYsMiw4LDEsNiwxLDEwLAorICAgIDEsNCwxLDgsMSwxMCwxLDEyLDEsMTIsMSwyMCwxLDEwLDEsNiwKKyAgICAxLDEwLDEsMiwxLDE0LDEsMTYsMSwxNiwxLDYsMSwxMjIsMjEsODMsCisgICAgMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwKKyAgICA5OSwxMTEsMTAwLDEwMSw3OCwxMTQsOTAsMCwwLDAsNDEsMTAsMTE0LDEwOCwwLDAsCisgICAgMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDE5MiwwLDAsMCwKKyAgICAxMTQsMTkzLDAsMCwwLDExNCwxOTUsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsCisgICAgMTk4LDAsMCwwLDExNCwyMDIsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsNCwKICAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwxMTQsMjAzLDAsMCwwLDExNSwzLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDIsMTIyLDMxLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LAotICAgIDExNCw5OSwxMDEsNzgsNDEsNiwxMTQsMTE0LDAsMCwwLDExNCwxMTMsMCwwLDAsCi0gICAgMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxODgsMCwwLDAsMTE0LAotICAgIDIwMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjI0LDAsMCwwLDEwNSwzLDAsCi0gICAgMCwxMTUsNiwwLDAsMCwxMiwyLDYsMiwxMiw2LDExNCwyMjQsMCwwLAorICAgIDAsMCwxMTQsMTkwLDAsMCwwLDE2MywyLDAsMCwxMTUsMTQsMCwwLDAsCisgICAgOCwyLDgsOCw4LDEzLDgsMTAsOCw3LDgsMTAsMTQsOCwxMTQsMTkwLAorICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDQsMCwwLDAsMCwwLDAsMCwxMTUsNzYsMCwwLDAsMTAxLDAsOTAsCisgICAgMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsCisgICAgNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDEzMiwwLDkwLAorICAgIDYsMTAxLDcsMTM1LDAsMTAyLDEsMTAwLDgsMTAwLDksMTMyLDgsMTMxLDEsOTAsCisgICAgOCwxMDEsNywxMDAsMTAsMTAwLDExLDEzMiwwLDEzMSwxLDkwLDksMTAwLDEyLDEwMCwKKyAgICAxMywxMzIsMCw5MCwxMCwxMzUsMCw4MywwLDQxLDE0LDIxOCwxMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLDEwMiwxMDUsCisgICAgMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLAorICAgIDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMTUsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LDExMSwxMTYsCisgICAgMTExLDk5LDExMSwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMDQsOTcsCisgICAgMTE2LDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsMTAxLDQ2LAorICAgIDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsCisgICAgMTI0LDIsMTI0LDAsOTUsMSwxMDAsMSw4MywwLDQxLDIsMTIyLDc1LDY3LDk3LAorICAgIDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLAorICAgIDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDIsMTExLDExNywKKyAgICAxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw3OCw0MSwyLDExNCwxMDEsMCwwLAorICAgIDAsMTE0LDM3LDAsMCwwLDQxLDMsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsCisgICAgMCwwLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTgxLDAsMCwwLDIyLDMsMCwwLDExNSwKKyAgICA0LDAsMCwwLDAsMyw2LDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMjQsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTA2LDAsMTA3LAorICAgIDIsMTExLDIyLDEyNCwwLDEwNiwxLDEyNCwxLDEwNiwxLDEwNywyLDgzLDAsNDEsCisgICAgMSw3OCw0MSwyLDIxOCw5LDk1LDk1LDk5LDEwOCw5NywxMTUsMTE1LDk1LDk1LDExNCwKKyAgICAxMTQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsMCwwLDIxOCw1LDExMSwxMTYsMTA0LAorICAgIDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAorICAgIDAsMjE4LDYsOTUsOTUsMTAxLDExMyw5NSw5NSwyOCwzLDAsMCwxMTUsNCwwLAorICAgIDAsMCwwLDEsMTIsMSwxMjIsMTcsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsCisgICAgMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjAsCisgICAgMCwwLDAsMTE2LDAsMTI0LDAsMTA2LDEsMTMxLDEsMTE2LDAsMTI0LDAsMTA2LAorICAgIDIsMTMxLDEsNjUsMCw4MywwLDQxLDEsNzgsNDEsMywyMTgsNCwxMDQsOTcsCisgICAgMTE1LDEwNCwxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCw0MSwxLDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKKyAgICAwLDAsMjE4LDgsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsMzIsMywwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwzLDAsMCwKKyAgICAwLDExNSwxNiwwLDAsMCwxMTYsMCwxMTYsMSwxMjQsMCwxMzEsMiwxMDYsMiwKKyAgICAxMjQsMSwxMzEsMSw4MywwLDQxLDEsMTIyLDEwMCw3NiwxMTEsOTcsMTAwLDMyLDk3LAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwKKyAgICAxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwKKyAgICAxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LAorICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMywKKyAgICAyMTgsNSwxMTUsMTE3LDExMiwxMDEsMTE0LDExNCwyMDYsMCwwLDAsMTE0LDE4OSwwLDAsCisgICAgMCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCw0MSwxLDExNCwKKyAgICAyMDcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4OSwKKyAgICAwLDAsMCwzNSwzLDAsMCwxMTUsMiwwLDAsMCwwLDEwLDEyMiwyMiwKKyAgICA3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNiwwLDAsMCwKKyAgICAxMjQsMCwxMDYsMCw4MywwLDQxLDEsMTIyLDU4LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5NywxMTUsMzIsCisgICAgMTAyLDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsNDYsNDEsMSwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsMTAzLDAsCisgICAgMCwwLDExNCwxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDE1NCwwLDAsMCw0NywzLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDMsMTIyLDIzLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsCisgICAgMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsOSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMzIsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDEsMTAwLAorICAgIDEsMTMxLDIsMTQzLDEwLDEyNSwyLDEyNCwyLDEwNiwyLDEzMSwwLDgzLDAsODEsCisgICAgMCw4MiwwLDg4LDAsMTAwLDIsODMsMCw0MSwzLDEyMiwzOSw4MiwxMDEsMTE2LAorICAgIDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTAyLDExNCwxMTEsCisgICAgMTA5LDMyLDExMiw5NywxMTYsMTA0LDMyLDk3LDExNSwzMiwxMTQsOTcsMTE5LDMyLDk4LDEyMSwKKyAgICAxMTYsMTAxLDExNSw0NiwyMTgsMSwxMTQsNzgsNDEsMywxMTQsNTIsMCwwLDAsMTE0LAorICAgIDUzLDAsMCwwLDkwLDQsMTE0LDEwMSw5NywxMDAsNDEsMywxMTQsMTAzLDAsMCwKKyAgICAwLDExNCwzNywwLDAsMCwxMTQsNTcsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NiwwLDAsMCw1MiwKKyAgICAzLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTQsMSwxMjIsMTksNzAsMTA1LAorICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsCisgICAgOTcsNDEsMTEsMTE0LDEwOCwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwKKyAgICAwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwyMDksMCwwLAorICAgIDAsMTE0LDIxMSwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxODksMCwwLDAsCisgICAgMTE0LDE1NCwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDQxLDEsMTE0LDIwNywwLDAsMCwxMTQsNiwwLDAsMCwKKyAgICAxMTQsMjA2LDAsMCwwLDE3LDMsMCwwLDExNSwxNCwwLDAsMCw4LDMsCisgICAgNCwyLDgsNiw4LDQsOCwzLDE2LDEyLDEyLDUsMTE0LDIwNiwwLDAsCiAgICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsCi0gICAgMCwwLDY0LDAsMCwwLDExNSwxMzYsMCwwLDAsMTAxLDAsMCw5MCwxLAotICAgIDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwKLSAgICAxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsCi0gICAgMCwwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LAotICAgIDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLAotICAgIDEwMCwxMSwwLDEzMiwwLDAsOTAsOCwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwKLSAgICAwLDAsOTAsOSwwLDEwMCwxNCwwLDEwMCwxNSwwLDEzMiwwLDAsOTAsMTAsCi0gICAgMCwxMDAsMTYsMCwxMDAsMTcsMCwxMzIsMCwwLDkwLDExLDAsMTAxLDEyLDAsCi0gICAgMTAwLDE4LDAsMTAwLDE5LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEzLDAsMTAwLAotICAgIDIwLDAsODMsNDEsMjEsMjE4LDE5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw5Myw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDEsMzIsOTksMTExLDExMCwxMTUsMTE2LDExNCwxMTcsOTksMTE2LDExMSwxMTQsMzIsMTA1LAotICAgIDExNSwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTE5LDExMSwKLSAgICAxMTQsMTA3LDMyLDExOSwxMDUsMTE2LDEwNCwzMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDMsMCwwLDAsMCwwLAotICAgIDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDIyLAotICAgIDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsCi0gICAgMCwwLDk1LDEsMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LAotICAgIDEwOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMzIsMywwLAotICAgIDAsMTE1LDQsMCwwLDAsMCwxLDksMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsCi0gICAgMCwxMTEsMzMsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLAotICAgIDEwNywyLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMTIsMCwwLDAsMTE0LDEyMCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDIxMywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjE0LAotICAgIDAsMCwwLDEzNiwzLDAsMCwxMTUsNCwwLDAsMCwwLDEsMTgsMSwKLSAgICAxMjIsMjYsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwyNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsCi0gICAgNDEsMSw3OCw0MSwzLDExNCwyMTUsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMzcsMCwwLDAsNDEsMSwxMTQsMTEwLDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTYsMCwwLDAsMTQwLAotICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNDcsMCwKLSAgICAwLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsMSwKLSAgICAwLDEzMSwyLDAsMTI1LDIsMCwxMTYsNCwwLDEwMCwxLDAsMTI0LDEsMCwKLSAgICAxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwxMzEsMywwLDEsMTI0LDIsMCwKLSAgICA4Myw0MSwyLDEyMiwzOCw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMTEwLDMyLDExNywKLSAgICAxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLAotICAgIDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsMzgsMTAxLDEyMCwxMTYsCi0gICAgMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLAotICAgIDExNCwxMjUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLAotICAgIDMzLDExNCwxMjUsNDEsNywxMTQsMTIzLDAsMCwwLDExNCwxODksMCwwLDAsMTE0LAotICAgIDE0NywwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTAwLDEyMSwxMTAsCi0gICAgOTcsMTA5LDEwNSw5OSwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDM3LAotICAgIDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwKLSAgICAxOTEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDE4NywwLDAsMCwxNDMsMywwLDAsMTE1LDEwLDAsMCwKLSAgICAwLDAsMiw2LDEsMTUsMSw2LDEsMTYsMSwxMjIsMzMsNjksMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDQ1LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMTYsMiwKLSAgICAwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDQsMCwxMDAsMSwKLSAgICAwLDEyNCwwLDAsMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTMxLDMsMCwKLSAgICAxLDEwMCwyLDAsODMsNDEsMywxMjIsMzAsNzMsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwKLSAgICAxMDUsMTIyLDEwMSwzMiw5NywxMTAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDQwLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwMSwKLSAgICAxMjAsMTAxLDk5LDExNywxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwKLSAgICAxMjUsNzgsNDEsNywxMTQsMTIzLDAsMCwwLDExNCwxODksMCwwLDAsMTE0LDE0NywKLSAgICAwLDAsMCw5MCwxMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDAsMTIxLDExMCw5NywxMDksMTA1LAotICAgIDk5LDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMzcsMCwwLDAsCi0gICAgNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxOTEsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5MiwwLDAsMCwKLSAgICAxNTEsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE5LDEsNiwxLDEyMiwKLSAgICAzMSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw0LDAsMCwKLSAgICAwLDMsMCwwLDAsMTE1LDQ4LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMSwwLDEzMSwxLDAsMTAwLDEsMCwyNSwxMzcsMCwwLDExNiwyLDAsCi0gICAgMTM1LDAsMCwxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMCwwLDExNiwKLSAgICAzLDAsNjgsMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDQ5LDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0NiwxMTQsCi0gICAgMzEsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsNCwwLDAsMCw1MSwwLDAsMCwxMTUsMzEsMCwwLDAsMTI0LDAsCi0gICAgMCw5MywyMSwwLDEyNSwxLDAsMTM2LDAsMCwxMDAsMCwwLDEyNCwxLDAsCi0gICAgMjMsMTA3LDIsMCw4NiwxLDExMywzLDAsMTAwLDEsMCw4Myw0MSwyLDExNCwKLSAgICAxODYsMCwwLDAsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLAotICAgIDAsMjE4LDYsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsNDEsMSwyMTgsOSwxMDIsMTA1LDEwOCwKLSAgICAxMDEsOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjUwLDksNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDE2MCwzLDAsMCwxMTUsCi0gICAgMiwwLDAsMCw2LDEsMTIyLDQ5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKLSAgICAxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLAotICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0NiwKLSAgICA2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNDEsNCwxMTQsNDAsMCwwLDAsCi0gICAgMTE0LDM3LDAsMCwwLDIxOCwzLDk3LDExMCwxMjEsMjE4LDE4LDY5LDg4LDg0LDY5LAotICAgIDc4LDgzLDczLDc5LDc4LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDIsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwwLDQxLAotICAgIDEsMTE0LDIyNywwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTYxLDAsMCwwLAotICAgIDE1NywzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTksMSwxOCwxLDEyMiwKLSAgICAzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsCi0gICAgNjMsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsCi0gICAgOTcsMTEwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLDk3LDExNiwKLSAgICAxMDEsMzIsOTcsMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDQ2LAotICAgIDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwxODgsMCwwLDAsMTYzLDMsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSwKLSAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksCi0gICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLAotICAgIDUzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLAotICAgIDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLAotICAgIDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDIwMywwLDAsMCwxNjcsMywwLDAsCi0gICAgMTE1LDIsMCwwLDAsMCwyLDEyMiwzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiwKLSAgICA5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDcsMCwwLAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDgzLDQxLDEsMTIyLDU4LDgyLDEwMSwxMTYsMTE3LAotICAgIDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5NywKLSAgICAxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsNDEsMSwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE1OSwwLDAsMCwxNzEsMywwLAotICAgIDAsMTE1LDIsMCwwLDAsMCwzLDEyMiwzMiw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LAotICAgIDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLAotICAgIDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsNzgsNDEsMTQsMTE0LDExNCwwLAotICAgIDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsCi0gICAgMCwxMTQsMTg2LDAsMCwwLDExNCwyMTQsMCwwLDAsMTE0LDIxNiwwLDAsMCwKLSAgICAxMTQsMTg3LDAsMCwwLDExNCwxOTIsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsCi0gICAgMTg4LDAsMCwwLDExNCwyMDMsMCwwLDAsMTE0LDEyNSwwLDAsMCwxMTQsMTU5LAorICAgIDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsCisgICAgMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsCisgICAgNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDE1NiwxLDEwMCw4LDEwMCwKKyAgICA5LDEzMiwyLDkwLDYsMTAwLDEwLDgzLDAsNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LAorICAgIDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMjIsMCwwLDAsMTE2LDAsMTI0LDEsMTMxLDEsMTI1LDIsMTI0LAorICAgIDIsMTA2LDEsMTI0LDIsMTA2LDIsMTAwLDEsMTU2LDIsODMsMCw0MSwyLDEyMiwKKyAgICAzMyw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDk3LAorICAgIDEwMCw5NywxMTYsOTcsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsNDYsNDEsMiwxMjIsNSwxMDksMTE2LDEwNSwxMDksMTAxLDEyMiw0LDExNSwxMDUsMTIyLAorICAgIDEwMSw0MSwzLDExNCw0MSwwLDAsMCwyMTgsOCwxMTUsMTE2LDk1LDEwOSwxMTYsMTA1LAorICAgIDEwOSwxMDEsOTAsNywxMTUsMTE2LDk1LDExNSwxMDUsMTIyLDEwMSw0MSwzLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCwyMDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5MywwLDAsMCwKKyAgICA2MiwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsOCwxLDEyMiwyNyw4MywKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLDAsCisgICAgMCwwLDAsNSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAyNiwwLDAsMCwxMTYsMCwxMjQsMSwxMzEsMSwxMjUsNCwxMjQsMCwxMDYsMSwKKyAgICAxMjQsMiwxMjQsMywxMDAsMSwxMjQsNCwxNDQsMSwxMzEsMiw4MywwLDQxLDIsCisgICAgNzgsMjE4LDUsOTUsMTA5LDExMSwxMDAsMTAxLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsCisgICAgMTk0LDAsMCwwLDQxLDUsMTE0LDEwMywwLDAsMCwxMTQsOTMsMCwwLDAsCisgICAgMTE0LDkyLDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsNDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NSwKKyAgICAwLDAsMCw2NywzLDAsMCwxMTUsNCwwLDAsMCwwLDIsOCwxLAorICAgIDEyMiwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLAorICAgIDEwMCwxMDEsMTA1LDE4MiwxLDAsMCw0MSwxLDExNCwyMTYsMCwwLDAsOTksMywKKyAgICAwLDAsMCwxLDAsMCwwLDksMCwwLDAsMTcsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDI1MCwwLDAsMCwxMTYsMCwxMjQsMSwxMzEsMSw5MiwyLAorICAgIDEyNSw0LDEyNSw1LDEwMywwLDEyNSw2LDEyMCw0MCwxMjQsNCwxMTQsNTYsMTE2LDEsCisgICAgMTI0LDQsMTMxLDEsMTIsMCwxMTQsNTYsMTE2LDAsMTI0LDQsMTMxLDEsOTIsMiwKKyAgICAxMjUsNCwxMjUsNywxMjQsNiwxMDYsMiwxMjQsNywxMzEsMSwxLDAsMTEzLDE4LAorICAgIDg3LDAsMTIwLDEwOCwxMTYsMywxMjQsNiwxMzEsMSw2OCwwLDkzLDk2LDEyNSw3LAorICAgIDExNiw0LDEyNCw0LDEyNCw3LDEzMSwyLDEyNSw0LDEyMSwxNCwxMTYsNSwxMDYsNiwKKyAgICAxMjQsNCwxMzEsMSwxLDAsODcsMCwxMTMsNjgsNCwwLDExNiw3LDEwNywxMCwKKyAgICAxMTQsMTE4LDEsMCwxLDAsMSwwLDExOSw2OCw4OSwwLDExMyw2OCw0LDAsCisgICAgMTE2LDgsMTA3LDEwLDExNCwxNjIsMSwwLDEyNSw4LDEsMCwxMjIsMTgsMTE2LDksCisgICAgMTA2LDEwLDEwMCwxLDEyNCw0LDEyNCw4LDEzMSwzLDEsMCwxMDAsMiw4MywwLAorICAgIDEwMCwyLDEyNSw4LDEyNiw4LDg4LDAsMTEzLDY4LDg4LDAsMTEzLDY4LDg3LDAsCisgICAgMTIxLDI4LDExNiwxMSwxMjQsMSwxMjQsMiwxMjQsMywxMzEsMywxLDAsMTE2LDksCisgICAgMTA2LDEwLDEwMCwzLDEyNCwxLDEzMSwyLDEsMCw4NywwLDExMCw0OCw0LDAsCisgICAgMTE2LDgsMTA3LDEwLDExNCwyNDQsMSwwLDEyNSw4LDEsMCwxMjIsMjAsMTE2LDksCisgICAgMTA2LDEwLDEwMCwxLDEyNCwxLDEyNCw4LDEzMSwzLDEsMCw4NywwLDg5LDAsCisgICAgMTAwLDIsMTAwLDIsMTI1LDgsMTI2LDgsODgsMCwxMTAsMiw4OCwwLDEwMCwyLAorICAgIDgzLDAsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLAorICAgIDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLAorICAgIDQ2LDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSwKKyAgICA5NywxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwKKyAgICAxMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LDQxLDEyLDExNCwKKyAgICA0MCwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMzUsCisgICAgMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwzLDAsMCwwLDkwLDUsMTA5LAorICAgIDEwNywxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsMTE2LDExNSwKKyAgICA2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQyLDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LAorICAgIDEzMiwwLDAsMCwxMTQsNTgsMCwwLDAsNDEsOSwxMTQsMTAzLDAsMCwwLAorICAgIDExNCwzNywwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDIxNiwwLDAsMCwyMTgsCisgICAgNiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDExNCw5NywwLDAsMCwxMTQsMjksMCwwLAorICAgIDAsMTE0LDI1LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NCwwLDAsMCw3MiwKKyAgICAzLDAsMCwxMTUsNDIsMCwwLDAsMCwyLDEyLDEsNCwyLDE2LDEsCisgICAgMTIsMSwxNCwyLDE0LDEsMTAsMSwyLDEsMTQsMSwxNCwyLDYsMSwKKyAgICAxNiwzLDYsMSw4LDEsMjAsMSwyLDEsMTIsMSwxNiwxLDE2LDIsCisgICAgOCwxLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNzgsNDEsNywKKyAgICAxMTQsMTA4LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsCisgICAgMTEwLDAsMCwwLDExNCwxOTMsMCwwLDAsMTE0LDE5NSwwLDAsMCwxMTQsMTk0LAogICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDExNCwyMjUsMCwwLDAsMTI0LDMsMCwwLAotICAgIDExNSwyMCwwLDAsMCwxMiw2LDYsMiwxMiw0LDEyLDQsMTIsMywxMiwKLSAgICA4LDEyLDYsMTIsNiwxMiw0LDEyLDQsMTE0LDIyNSwwLDAsMCw5OSwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LAotICAgIDAsMCwwLDExNSwxMzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsCi0gICAgMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLAotICAgIDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLAotICAgIDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEzMiwwLDAsOTAsOCwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsCi0gICAgOSwwLDEwMCwxNCwwLDEwMCwxNSwwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTYsCi0gICAgMCwxMDAsMTcsMCwxMzIsMCwwLDkwLDExLDAsMTAwLDE4LDAsMTAwLDE5LDAsCi0gICAgMTMyLDAsMCw5MCwxMiwwLDEwMCwyMCwwLDgzLDQxLDIxLDIxOCwxNCw5NSw3OCwKLSAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsOTcsMzgsMSwwLAotICAgIDAsODIsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMzIsMTEwLDk3LAotICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDM5LAotICAgIDExNSwzMiwxMTIsOTcsMTE2LDEwNCw0NiwzMiwzMiw3MywxMTYsMzIsMTE3LDExNSwxMDEsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDEwNSwxMTYsMTE1LAotICAgIDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsCi0gICAgMTE2LDMyLDEwOCwxMTEsMTExLDEwNywxMTUsMzIsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCi0gICAgOTcsMTE0LDEwMSwxMTAsMTE2LDM5LDExNSwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSw5NSw0NiwzMiwzMiw4NywxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwNSwxMTUsCi0gICAgMzIsOTksMTA0LDk3LDExMCwxMDMsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNiwxMDQsMzIsCi0gICAgMTA1LDExNSwzMiwxMTQsMTAxLDk5LDExMSwxMDksMTEyLDExNywxMTYsMTAxLDEwMCw0NCwxMCwzMiwKLSAgICAzMiwzMiwzMiwxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsCi0gICAgMTEwLDEwMCwxMDEsMTE0LDQ2LDMyLDMyLDcwLDExMSwxMTQsMzIsMTE2LDExMSwxMTIsNDUsMTA4LAotICAgIDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwKLSAgICAxMTUsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTUsMTIxLAotICAgIDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0Niw5OSw0LDAsMCwwLDAsMCwwLDAsCi0gICAgNCwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw1MiwwLDAsCi0gICAgMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwwLDEyNCwyLDAsMTI0LDAsMCwKLSAgICA5NSwxLDAsMTE2LDIsMCwxMjQsMCwwLDEwNiwzLDAsMTMxLDAsMCwxMzEsCi0gICAgMSwwLDEyNCwwLDAsOTUsNCwwLDEyNCwzLDAsMTI0LDAsMCw5NSw1LAotICAgIDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDUsOTUsMTEwLDk3LDEwOSwKLSAgICAxMDEsMjE4LDUsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDk1LDAsMCwwLDIxOCwxNiw5NSwKLSAgICAxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwKLSAgICAxNyw5NSwxMDgsOTcsMTE1LDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywKLSAgICAxMTYsMTA0LDIxOCwxMiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKLSAgICA0MSw0LDExNCwxMTAsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMzcsMCwwLAotICAgIDAsMjE4LDExLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODYsMCwKLSAgICAwLDAsMTg0LDMsMCwwLDExNSw4LDAsMCwwLDAsMSw5LDEsOSwKLSAgICAxLDIxLDEsMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNTMsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTAwLAotICAgIDEsMCwxMzEsMSwwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsCi0gICAgMCwxMjQsMiwwLDEwMCwyLDAsMTA3LDIsMCwxMTQsNDMsMCwxMDAsNiwwLAotICAgIDgzLDEyNCwxLDAsMTAwLDUsMCwxMDIsMiwwLDgzLDQxLDcsMTIyLDYyLDgyLAotICAgIDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsMTExLAotICAgIDEwMiwzMiw0MCwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDQ1LDExMCw5NywxMDksMTAxLDQ0LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDUsMTEyLDk3LAotICAgIDExNiwxMDQsNDUsOTcsMTE2LDExNiwxMTQsNDUsMTEwLDk3LDEwOSwxMDEsNDEsMTE0LDYwLDAsCi0gICAgMCwwLDExNCwzMiwwLDAsMCwxMTQsOCwwLDAsMCwxMTQsMzcsMCwwLAotICAgIDAsOTAsOCw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSw0MSwyLDEyMiwzLDExNSwKLSAgICAxMjEsMTE1LDEyMiw0LDExMiw5NywxMTYsMTA0LDQxLDIsMTE0LDIzMiwwLDAsMCwxMTQsCi0gICAgMzQsMCwwLDAsNDEsNCwxMTQsMTEwLDAsMCwwLDExNCwyMjMsMCwwLDAsCi0gICAgMjE4LDMsMTAwLDExMSwxMTYsOTAsMiwxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsCi0gICAgMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LDEwMSwKLSAgICAxMTUsMTkwLDMsMCwwLDExNSw4LDAsMCwwLDAsMiwyNywxLDEyLDIsCi0gICAgNCwzLDEyMiwzOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LAotICAgIDExNiwxMDQsNDYsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDM4LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDkyLDIsMCwKLSAgICAxMjUsMSwwLDEyNSwyLDAsMTE2LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LAotICAgIDEsMCwyNSwxMjQsMiwwLDEzMSwyLDAsODMsNDEsMSw3OCw0MSw0LDExNCwKLSAgICAyMzksMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsOCwwLDAsMCwyMTgsNywKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDEsMywxMTQsMTEwLDAsMCwwLDkwLDE4LAotICAgIDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsMTQsMTEyLDk3LDExNiwxMDQsOTUsOTcsMTE2LDExNiwxMTQsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAotICAgIDAsMTE0LDIzNCwwLDAsMCwyMDAsMywwLDAsMTE1LDQsMCwwLDAsMCwKLSAgICAxLDE4LDEsMTIyLDMxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LAotICAgIDExMiw5NywxMTYsMTA0LDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwKLSAgICAwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDExOCwwLDAsMCwxMTYsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsMTI1LDEsMCwKLSAgICAxMjQsMSwwLDEyNCwwLDAsMTA2LDIsMCwxMDcsMywwLDExNCwxMTEsMCwxMjQsCi0gICAgMCwwLDEwNiwzLDAsMTI0LDAsMCwxMDYsNCwwLDEyNCwxLDAsMTMxLDIsCi0gICAgMCwxMjUsMiwwLDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMDIsMCwKLSAgICAxMjQsMiwwLDEwNiw1LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxMDIsMCwxMjQsCi0gICAgMiwwLDEwNiw2LDAsMTE0LDEwMiwwLDEyNCwyLDAsMTA2LDYsMCwxMjQsMCwKLSAgICAwLDk1LDcsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMiwwLDEyNCwwLDAsCi0gICAgMTA2LDcsMCw4Myw0MSwxLDc4LDQxLDgsMTE0LDk1LDAsMCwwLDExNCwyMzQsCi0gICAgMCwwLDAsMTE0LDIzNSwwLDAsMCwxMTQsMjM2LDAsMCwwLDExNCwyMzIsMCwKLSAgICAwLDAsMTE0LDEyOSwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwyMzMsMCwwLAotICAgIDAsNDEsMywxMTQsMTEwLDAsMCwwLDkwLDExLDExMiw5NywxMTQsMTAxLDExMCwxMTYsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsOTUsMTE0LDEwMSw5OSw5NywKLSAgICAxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDIwNCwzLDAsMCwxMTUsMTYsMCwwLDAsCi0gICAgMCwyLDE4LDEsMTUsMSwyMSwzLDI3LDEsOSwxLDEyLDEsOSwxLAotICAgIDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsCi0gICAgNDYsOTUsMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLAotICAgIDEzMSwwLDAsMTMxLDEsMCw4Myw0MSwxLDc4LDQxLDIsMjE4LDQsMTA1LDExNiwKLSAgICAxMDEsMTE0LDExNCwyNDEsMCwwLDAsNDEsMSwxMTQsMTEwLDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw4LDk1LAotICAgIDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSwyMTcsMywwLDAsMTE1LDIsMCwwLDAsCi0gICAgMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LAotICAgIDExNiwxMDQsNDYsOTUsOTUsMTA1LDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwwLAotICAgIDAsMTMxLDEsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDMzLDAsMCwwLDExNCwKLSAgICAyNDEsMCwwLDAsNDEsMSwxMTQsMTEwLDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw3LDk1LDk1LDEwOCwxMDEsCi0gICAgMTEwLDk1LDk1LDIyMCwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIyLAorICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMjE0LDAsMCwwLDU4LDMsMCwwLAorICAgIDExNSw4LDAsMCwwLDgsMiw0LDIsOCw1LDgsNSwxMTQsMjE0LDAsCisgICAgMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsNjQsMCwwLDAsMTE1LDMyLDAsMCwwLDEwMSwwLDkwLDEsCisgICAgMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLDkwLDQsCisgICAgMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiw4MywwLDQxLDcsMjE4LDIwLAorICAgIDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE5LDEwNCwxMDUsCisgICAgOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCisgICAgNiwwLDAsMCw2NywwLDAsMCwxMTUsNTYsMCwwLDAsMTI0LDAsMTA2LAorICAgIDAsMTI0LDEsMTMxLDEsMTI1LDIsMTI0LDAsMTA2LDEsMTI0LDIsMTMxLDEsMTI1LAorICAgIDMsMTE2LDIsMTI0LDMsMTAwLDEsMTI0LDEsMTAwLDIsMTI0LDIsMTQ0LDIsMTMxLAorICAgIDEsMTI1LDQsMTE2LDMsMTI0LDQsMTAwLDEsMTI0LDEsMTAwLDMsMTI0LDIsMTQ0LAorICAgIDIsMTMxLDEsODMsMCw0MSw0LDc4LDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsCisgICAgMCwwLDExNCw5MiwwLDAsMCw0MSw0LDExNCwxNTQsMCwwLDAsMTE0LDE5NiwKKyAgICAwLDAsMCwxMTQsMTM4LDAsMCwwLDExNCwxNDQsMCwwLDAsNDEsNSwxMTQsCisgICAgMTAzLDAsMCwwLDExNCwxMjIsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NiwKKyAgICAwLDAsMCwxMTQsMjA1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCwxODMsMCwwLDAsMTA3LDMsMCwwLAorICAgIDExNSw4LDAsMCwwLDAsMSwxMCwxLDEwLDEsMTgsMSwxMjIsMjksODMsCisgICAgMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDM5LDgyLDEwMSwKKyAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLAorICAgIDExNCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsCisgICAgOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsCisgICAgMCwwLDExNCwxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDE5OCwwLDAsMCwxMTMsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsMCwyLDEyMiwzMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwKKyAgICAxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiwKKyAgICA5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDc4LDQxLDYsMTE0LDEwOCwwLDAsMCwxMTQsCisgICAgMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTgzLAorICAgIDAsMCwwLDExNCwxOTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIxOSwwLDAsCisgICAgMCwxMDMsMywwLDAsMTE1LDYsMCwwLDAsOCwyLDQsMiw4LDYsCisgICAgMTE0LDIxOSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSw5MiwwLDAsMCwxMDEsCisgICAgMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsCisgICAgMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLAorICAgIDAsOTAsNiwxMDAsOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwxMCwxMDAsMTEsMTMyLAorICAgIDAsOTAsOCwxMDAsMTIsMTAwLDEzLDEzMiwwLDkwLDksMTAwLDE0LDEwMCwxNSwxMzIsCisgICAgMCw5MCwxMCwxMDAsMTYsMTAwLDE3LDEzMiwwLDkwLDExLDEwMSwxMiwxMDAsMTgsMTAwLAorICAgIDE5LDEzMiwwLDEzMSwxLDkwLDEzLDEwMCwyMCw4MywwLDQxLDIxLDIxOCwxOSw2OSwKKyAgICAxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsCisgICAgMTAxLDExNCwxMjIsOTMsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDEwMSwKKyAgICAxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDk5LDExMSwxMTAsMTE1LDExNiwKKyAgICAxMTQsMTE3LDk5LDExNiwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTUsMTA1LDEwMywxMTAsCisgICAgMTAxLDEwMCwzMiwxMTYsMTExLDMyLDExOSwxMTEsMTE0LDEwNywzMiwxMTksMTA1LDExNiwxMDQsMzIsCisgICAgNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMSwxMjQsMCw5NSwKKyAgICAwLDEyNCwyLDEyNCwwLDk1LDEsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDIsCisgICAgMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMywxMTQsMTAzLDAsMCwKKyAgICAwLDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODEsMCwwLDAsMTMwLAorICAgIDMsMCwwLDExNSw0LDAsMCwwLDAsMSw2LDEsMTIyLDI4LDY5LDEyMCwKKyAgICAxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAyNCwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMCwxMDcsMiwxMTEsMjIsCisgICAgMTI0LDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsODMsMCw0MSwxLDc4LDQxLAorICAgIDIsMTE0LDIwNywwLDAsMCwxMTQsMTE0LDAsMCwwLDQxLDIsMTE0LDEwMywwLAorICAgIDAsMCwxMTQsMjA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDExNCwyMDksMCwwLDAsMTM0LDMsMCwwLDExNSwKKyAgICA0LDAsMCwwLDAsMSwxMiwxLDEyMiwyNiw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LAorICAgIDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwKKyAgICAxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDIwLDAsMCwwLDExNiwwLAorICAgIDEyNCwwLDEwNiwxLDEzMSwxLDExNiwwLDEyNCwwLDEwNiwyLDEzMSwxLDY1LDAsCisgICAgODMsMCw0MSwxLDc4LDQxLDMsMTE0LDIxMCwwLDAsMCwxMTQsMTAxLDAsMCwKKyAgICAwLDExNCwzNywwLDAsMCw0MSwxLDExNCwxMDMsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIxMSwwLDAsCisgICAgMCwxMzgsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw2OSwxMjAsCisgICAgMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAzNiwwLDAsMCwxMTYsMCwxMDYsMSwxMTYsMiwxMDYsMywxMjQsMSwxMzEsMiwKKyAgICAxMjUsMiwxMTYsMCwxMDYsNCwxMDAsMSwxMjQsMSwxMDYsNSwxMjQsMCwxMDYsNiwKKyAgICAxMzEsMywxLDAsMTI0LDIsODMsMCw0MSwyLDEyMiwzOCw2NywxMTQsMTAxLDk3LAorICAgIDExNiwxMDEsMzIsOTcsMTEwLDMyLDExNywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLAorICAgIDEwMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwxMjIsMzgsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwKKyAgICAzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNDEsNywxMTQsMTE3LDAsMCwKKyAgICAwLDExNCwxODQsMCwwLDAsMTE0LDE0MiwwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLAorICAgIDk3LDExNiwxMDEsOTUsMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSwxMTQsMTMyLDAsMCwwLAorICAgIDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDMsMTE0LDEwMywwLDAsCisgICAgMCwxMTQsMTYxLDAsMCwwLDExNCwxODYsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4MiwwLDAsMCwxNDEsCisgICAgMywwLDAsMTE1LDEwLDAsMCwwLDAsMiw0LDEsMTAsMSw2LDEsCisgICAgMTIsMSwxMjIsMzMsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDExNiwKKyAgICAwLDEwNiwxLDExNiwyLDEwNiwzLDEyNCwxLDEzMSwyLDEsMCwxMTYsMCwxMDYsCisgICAgNCwxMDAsMSwxMjQsMCwxMDYsNSwxMjQsMCwxMDYsNiwxMzEsMywxLDAsMTAwLAorICAgIDIsODMsMCw0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsCisgICAgMTAxLDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAxLDEyMCwxMDEsCisgICAgOTksMTE3LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw3OCwKKyAgICA0MSw3LDExNCwxMTcsMCwwLDAsMTE0LDE4NCwwLDAsMCwxMTQsMTQyLDAsMCwKKyAgICAwLDkwLDEyLDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksMTE0LAorICAgIDEzMiwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCw0MSwyLAorICAgIDExNCwxMDMsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg3LDAsMCwwLDE0OSwzLAorICAgIDAsMCwxMTUsNiwwLDAsMCwwLDIsMTQsMSw2LDEsMTIyLDMxLDY5LAorICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsMywKKyAgICAwLDAsMCwxMTUsMzYsMCwwLDAsMTE2LDAsMTI0LDAsMTA2LDEsMTMxLDEsCisgICAgMTAwLDEsMjUsMCwxMzcsMCwxMTYsMiwxMzUsMCwxMDIsMSwxMDAsMiwxMDAsMywKKyAgICAxMzIsOCwxMTYsMyw2OCwwLDEzMSwxLDEzMSwxLDgzLDAsNDEsNCwxMjIsNDksCisgICAgODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAorICAgIDQ2LDExNCwzMSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCw0LDAsMCwwLDUxLDAsMCwwLDExNSwyNiwwLDAsMCwKKyAgICAxMjQsMCw5MywxOCwxMjUsMSwxMzYsMCwxMDAsMCwxMjQsMSwyMywwLDEwNywyLAorICAgIDg2LDAsMSwwLDExMywyLDEwMCwxLDgzLDAsNDEsMiwxMTQsMTgxLDAsMCwKKyAgICAwLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLDIxOCw2LAorICAgIDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDQxLDEsMjE4LDksMTAyLDEwNSwxMDgsMTAxLDk1LDExMCwKKyAgICA5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDI1MCw5LDYwLAorICAgIDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNTgsMywwLDAsMTE1LDIsMCwwLAorICAgIDAsNCwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwKKyAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwKKyAgICAxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDQwLDAsMCwwLDExNCwzNywwLAorICAgIDAsMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSw4OCw4NCw2OSw3OCw4Myw3MywKKyAgICA3OSw3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwyMjIsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE1NiwwLDAsMCwxNTUsMywwLAorICAgIDAsMTE1LDYsMCwwLDAsMCwyLDE0LDEsMTIsMSwxMjIsMzAsNjksMTIwLAorICAgIDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDYzLDgyLDEwMSwKKyAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk3LDExMCwzMiwKKyAgICAxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LAorICAgIDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiw0Niw3OCwxMTQsNCwKKyAgICAwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgzLAorICAgIDAsMCwwLDE2MSwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI4LAorICAgIDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLAorICAgIDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1Myw4MiwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMDEsMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA0LAorICAgIDk3LDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwKKyAgICAxMDAsMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsMCwKKyAgICAxMTQsMTIyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxOTgsMCwwLDAsMTY1LDMsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwKKyAgICAxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwKKyAgICAxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw2LDAsMCwwLDEyNCwwLAorICAgIDEwNiwwLDgzLDAsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTExLAorICAgIDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0Niw0MSwxLDExNCwzNywwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsCisgICAgMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwxMTQsMTU0LDAsMCwwLDE2OSwzLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDMsMTIyLDMyLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsCisgICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw3OCw0MSwxNCwxMTQsMTA4LDAsMCwwLDExNCwxMDcsCisgICAgMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxODEsMCwKKyAgICAwLDAsMTE0LDIwOSwwLDAsMCwxMTQsMjExLDAsMCwwLDExNCwxODIsMCwwLAorICAgIDAsMTE0LDE4NywwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwxODMsMCwwLDAsCisgICAgMTE0LDE5OCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMTE0LDIyMCwwLDAsMCwxMjIsMywwLDAsMTE1LDIwLDAsMCwKKyAgICAwLDgsNiw0LDIsOCw0LDgsNCw4LDMsOCw4LDgsNiw4LAorICAgIDYsOCw0LDgsNCwxMTQsMjIwLDAsMCwwLDk5LDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LAorICAgIDk2LDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLAorICAgIDEwMCwyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwKKyAgICAxMDAsNiwxMDAsNywxMzIsMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDcsCisgICAgMTAwLDEwLDEwMCwxMSwxMzIsMCw5MCw4LDEwMCwxMiwxMDAsMTMsMTMyLDAsOTAsOSwKKyAgICAxMDAsMTQsMTAwLDE1LDEzMiwwLDkwLDEwLDEwMCwxNiwxMDAsMTcsMTMyLDAsOTAsMTEsCisgICAgMTAwLDE4LDEwMCwxOSwxMzIsMCw5MCwxMiwxMDAsMjAsMTAwLDIxLDEzMiwwLDkwLDEzLAorICAgIDEwMCwyMiw4MywwLDQxLDIzLDIxOCwxNCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsCisgICAgOTksMTAxLDgwLDk3LDExNiwxMDQsOTcsMzgsMSwwLDAsODIsMTAxLDExMiwxMTQsMTAxLAorICAgIDExNSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwKKyAgICAxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDM5LDExNSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICA0NiwzMiwzMiw3MywxMTYsMzIsMTE3LDExNSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwKKyAgICAxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDEwNSwxMTYsMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwKKyAgICAxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwzMiwxMDIsMTE0LAorICAgIDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE2LDMyLDEwOCwxMTEsMTExLDEwNywKKyAgICAxMTUsMzIsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDM5LAorICAgIDExNSwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSw0NiwzMiwKKyAgICAzMiw4NywxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsOTksMTA0LDk3LDExMCwxMDMsCisgICAgMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsCisgICAgMzIsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDk5LAorICAgIDExMSwxMDksMTEyLDExNywxMTYsMTAxLDEwMCw0NCwxMCwzMiwzMiwzMiwzMiwxMTcsMTE1LDEwNSwKKyAgICAxMTAsMTAzLDMyLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDMyLAorICAgIDMyLDcwLDExMSwxMTQsMzIsMTE2LDExMSwxMTIsNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNCwxMDEsCisgICAgMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLDk3LDExNiwxMDQsCisgICAgMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwKKyAgICA0Niw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwzNiwwLDAsMCwxMjQsMSwxMjQsMCw5NSwKKyAgICAwLDEyNCwyLDEyNCwwLDk1LDEsMTE2LDIsMTI0LDAsMTA2LDMsMTMxLDAsMTMxLAorICAgIDEsMTI0LDAsOTUsNCwxMjQsMywxMjQsMCw5NSw1LDEwMCwwLDgzLDAsNDEsCisgICAgMSw3OCw0MSw2LDIxOCw1LDk1LDExMCw5NywxMDksMTAxLDIxOCw1LDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDExNCw5NiwwLDAsMCwyMTgsMTYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LAorICAgIDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTcsOTUsMTA4LDk3LDExNSwxMTYsCisgICAgOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTIsOTUsMTEyLAorICAgIDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsNCwxMTQsMTAzLDAsMCwKKyAgICAwLDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCwxMSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgxLDAsMCwwLDE4MiwzLDAsMCwKKyAgICAxMTUsOCwwLDAsMCwwLDEsNiwxLDYsMSwxNCwxLDEyMiwyMyw5NSwKKyAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsCisgICAgMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCw0LAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLAorICAgIDEyNCwwLDEwNiwwLDEwNiwxLDEwMCwxLDEzMSwxLDkyLDMsMTI1LDEsMTI1LDIsCisgICAgMTI1LDMsMTI0LDIsMTAwLDIsMTA3LDIsMTE0LDMwLDEwMCw2LDgzLDAsMTI0LDEsCisgICAgMTAwLDUsMTAyLDIsODMsMCw0MSw3LDEyMiw2Miw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwxMDIsMzIsNDAsMTEyLDk3LAorICAgIDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NSwxMTAsOTcsMTA5LDEwMSwKKyAgICA0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywxMTYsMTA0LDQ1LDk3LDExNiwKKyAgICAxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw2MSwwLDAsMCwxMTQsMzIsMCwKKyAgICAwLDAsMTE0LDgsMCwwLDAsMTE0LDM3LDAsMCwwLDkwLDgsOTUsOTUsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsMTIxLDExNSwxMjIsNCwxMTIsCisgICAgOTcsMTE2LDEwNCw0MSwyLDExNCwyMjcsMCwwLDAsMTE0LDM0LDAsMCwwLDQxLAorICAgIDQsMTE0LDEwMywwLDAsMCwxMTQsMjE4LDAsMCwwLDIxOCwzLDEwMCwxMTEsMTE2LAorICAgIDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLDExMCwKKyAgICAxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDE4OCwzLDAsMCwKKyAgICAxMTUsOCwwLDAsMCwwLDIsMTgsMSw4LDIsNCwzLDEyMiwzOCw5NSwKKyAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsMTAyLAorICAgIDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTEwLDk3LDEwOSwxMDEsMTE1LDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI4LDAsMCwwLDEyNCwKKyAgICAwLDEwNiwwLDEzMSwwLDkyLDIsMTI1LDEsMTI1LDIsMTE2LDEsMTE2LDIsMTA2LAorICAgIDMsMTI0LDEsMjUsMCwxMjQsMiwxMzEsMiw4MywwLDQxLDEsNzgsNDEsNCwKKyAgICAxMTQsMjM0LDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDgsMCwwLDAsMjE4LAorICAgIDcsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQxLDMsMTE0LDEwMywwLDAsMCw5MCwKKyAgICAxOCwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCwKKyAgICA5NywxMDksMTAxLDkwLDE0LDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsMTE0LDk1LDExMCwKKyAgICA5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCisgICAgMCwwLDExNCwyMjksMCwwLDAsMTk4LDMsMCwwLDExNSw0LDAsMCwwLAorICAgIDAsMSwxMiwxLDEyMiwzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAorICAgIDgwLDk3LDExNiwxMDQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKKyAgICA5NSwxMTIsOTcsMTE2LDEwNCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLDAsMCwxMTYsCisgICAgMCwxMjQsMCwxMDYsMSwxMzEsMCwxMzEsMSwxMjUsMSwxMjQsMSwxMjQsMCwxMDYsCisgICAgMiwxMDcsMywxMTQsNzQsMTI0LDAsMTA2LDMsMTI0LDAsMTA2LDQsMTI0LDEsMTMxLAorICAgIDIsMTI1LDIsMTI0LDIsMTAwLDAsMTA3LDksMTE0LDY4LDEyNCwyLDEwNiw1LDEwMCwKKyAgICAwLDEwNyw4LDExNCw2OCwxMjQsMiwxMDYsNiwxMTQsNjgsMTI0LDIsMTA2LDYsMTI0LAorICAgIDAsOTUsNywxMjQsMSwxMjQsMCw5NSwyLDEyNCwwLDEwNiw3LDgzLDAsNDEsCisgICAgMSw3OCw0MSw4LDExNCw5NiwwLDAsMCwxMTQsMjI5LDAsMCwwLDExNCwyMzAsCisgICAgMCwwLDAsMTE0LDIzMSwwLDAsMCwxMTQsMjI3LDAsMCwwLDExNCwxMjMsMCwKKyAgICAwLDAsMTE0LDE1MywwLDAsMCwxMTQsMjI4LDAsMCwwLDQxLDMsMTE0LDEwMywKKyAgICAwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LAorICAgIDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsCisgICAgMTE2LDEwMSwyMDIsMywwLDAsMTE1LDE2LDAsMCwwLDAsMiwxMiwxLDEwLAorICAgIDEsMTQsMywxOCwxLDYsMSw4LDEsNiwxLDEyMiwyNyw5NSw3OCw5NywKKyAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsMTE0LDEwMSw5OSwKKyAgICA5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsCisgICAgMCwwLDExNiwwLDEyNCwwLDEwNiwxLDEzMSwwLDEzMSwxLDgzLDAsNDEsMSwKKyAgICA3OCw0MSwyLDIxOCw0LDEwNSwxMTYsMTAxLDExNCwxMTQsMjM2LDAsMCwwLDQxLDEsCisgICAgMTE0LDEwMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTE2LDEwMSwxMTQsOTUsOTUsMjE1LDMsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDEwNSwxMTYsMTAxLDExNCwKKyAgICA5NSw5NSw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNCwwLDAsMCwxMjQsMiwxMjQsMCwKKyAgICAxMDYsMCwxMjQsMSw2MCwwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwxLDExNCwKKyAgICAyMjgsMCwwLDAsNDEsMywxMTQsMTAzLDAsMCwwLDIxOCw1LDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMjAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDIxOCwxMSw5NSw5NSwxMTUsMTAxLDExNiwxMDUsMTE2LDEwMSwKKyAgICAxMDksOTUsOTUsMjE4LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjYsCiAgICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDk1LDEwOCwxMDEsMTEwLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAotICAgIDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLAotICAgIDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCw4MywKLSAgICA0MSwyLDc4LDEyMiwyMCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLAotICAgIDk3LDExNiwxMDQsNDAsMTIzLDMzLDExNCwxMjUsNDEsNDEsMiwxMTQsNDksMCwwLDAsCi0gICAgMTE0LDIzMywwLDAsMCw0MSwxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDgsOTUsOTUsMTE0LAotICAgIDEwMSwxMTIsMTE0LDk1LDk1LDIyMywzLDAsMCwxMTUsMiwwLDAsMCwwLDEsCi0gICAgMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCwKLSAgICA0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsOTksMiwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsCi0gICAgMCwwLDAsMTI0LDEsMCwxMjQsMCwwLDEwNiwwLDAsMTMxLDAsMCwxMDcsCi0gICAgNiwwLDgzLDQxLDEsNzgsNDEsMSwxMTQsMjQxLDAsMCwwLDQxLDIsMTE0LAotICAgIDExMCwwLDAsMCwyMTgsNCwxMDUsMTE2LDEwMSwxMDksMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEyLDk1LDk1LDk5LDExMSwxMTAsCi0gICAgMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDIyNiwzLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsCi0gICAgMTE2LDEwNCw0Niw5NSw5NSw5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLDExNSw5NSw5NSw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwyMCwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTA2LAotICAgIDEsMCwxMjQsMSwwLDEzMSwxLDAsMSwxMDAsMCwwLDgzLDQxLDEsNzgsCi0gICAgNDEsMiwxMTQsMjMzLDAsMCwwLDExNCwxNjUsMCwwLDAsNDEsMiwxMTQsMTEwLAotICAgIDAsMCwwLDExNCwyNDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDE2NSwwLDAsMCwyMjksMywwLDAsCi0gICAgMTE1LDIsMCwwLDAsMCwxLDEyMiwyMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsCi0gICAgOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTcsMTEyLDExMiwxMDEsMTEwLDEwMCw3OCw0MSwKLSAgICAxMywxMTQsMTE0LDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwKLSAgICAxMTQsMTE2LDAsMCwwLDExNCwxODYsMCwwLDAsMTE0LDIzOSwwLDAsMCwxMTQsCi0gICAgMjM0LDAsMCwwLDExNCwyNDEsMCwwLDAsMTE0LDI0MywwLDAsMCwxMTQsMjQ0LAotICAgIDAsMCwwLDExNCwyNDUsMCwwLDAsMTE0LDI0NywwLDAsMCwxMTQsMTY1LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw2LDAsMCwwLDExNCwyMzEsMCwwLDAsMTc3LDMsMCwwLDExNSwKLSAgICAyMCwwLDAsMCwxMiw1LDYsMiwxMiw2LDEyLDEwLDEyLDQsMTIsMTMsCi0gICAgMTIsMywxMiwzLDEyLDMsMTIsMywxMTQsMjMxLDAsMCwwLDk5LDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsMCwKLSAgICAwLDAsMTE1LDExOCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLAotICAgIDkwLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCw5MCwzLDAsMTAxLAotICAgIDQsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDUsCi0gICAgMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDcsMCwKLSAgICAxMDAsOCwwLDEzMiwwLDAsOTAsNywwLDEwMCw5LDAsMTAwLDEwLDAsMTMyLAotICAgIDAsMCw5MCw4LDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLDAsMCw5MCw5LAotICAgIDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxNSwwLAotICAgIDEwMCwxNiwwLDEzMiwwLDAsOTAsMTEsMCwxMDAsMTcsMCw4Myw0MSwxOCwyMTgsCisgICAgOTUsMTE1LDEwMSwxMTYsMTA1LDExNiwxMDEsMTA5LDk1LDk1LDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDEyLDAsMCwwLDExNiwwLDEyNCwwLDEwNiwxLDEzMSwwLDEzMSwxLDgzLDAsCisgICAgNDEsMSw3OCw0MSwyLDExNCwzMywwLDAsMCwxMTQsMjM2LDAsMCwwLDQxLAorICAgIDEsMTE0LDEwMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSwyMjEsMywKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMiw5NSw3OCw5NywxMDksMTAxLAorICAgIDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA4LDEwMSwxMTAsOTUsCisgICAgOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsMTI0LAorICAgIDAsMTA2LDEsMTMxLDEsODMsMCw0MSwyLDc4LDEyMiwyMCw5NSw3OCw5NywxMDksCisgICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDAsMTIzLDMzLDExNCwxMjUsNDEsCisgICAgNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDIyOCwwLDAsMCw0MSwxLDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKKyAgICAwLDAsMjE4LDgsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDIyNCwzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDEsMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiwKKyAgICA5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsCisgICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTI0LDEsMTI0LDAsMTA2LDAsCisgICAgMTMxLDAsMTA3LDYsODMsMCw0MSwxLDc4LDQxLDEsMTE0LDIzNiwwLDAsMCwKKyAgICA0MSwyLDExNCwxMDMsMCwwLDAsMjE4LDQsMTA1LDExNiwxMDEsMTA5LDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMiw5NSw5NSwKKyAgICA5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLDExNSw5NSw5NSwyMjcsMywwLDAsMTE1LDIsCisgICAgMCwwLDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsCisgICAgOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDAsMTA2LDAsCisgICAgMTA2LDEsMTI0LDEsMTMxLDEsMSwwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwKKyAgICAyLDExNCwyMjgsMCwwLDAsMTE0LDE2MCwwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDI0MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTYwLDAsMCwwLDIzMCwzLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLDE0LAorICAgIDExNCwxMDgsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwKKyAgICAxMTAsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMjM0LDAsMCwwLDExNCwyMjksCisgICAgMCwwLDAsMTE0LDIzNiwwLDAsMCwxMTQsMjM4LDAsMCwwLDExNCwyNDAsMCwKKyAgICAwLDAsMTE0LDI0MSwwLDAsMCwxMTQsMjQyLDAsMCwwLDExNCwyNDQsMCwwLAorICAgIDAsMTE0LDE2MCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjI2LDAsMCwwLDE3NSwKKyAgICAzLDAsMCwxMTUsMjIsMCwwLDAsOCw1LDQsMiw4LDYsOCwxMCwKKyAgICA4LDQsOCwxMyw4LDMsOCwzLDgsMyw4LDMsOCwzLDExNCwyMjYsCisgICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMywwLDAsMCw2NCwwLDAsMCwxMTUsODAsMCwwLDAsMTAxLDAsOTAsCisgICAgMSwxMDAsMCw5MCwyLDEwMCwxLDEwMCwyLDEzMiwwLDkwLDMsMTAxLDQsMTAwLAorICAgIDMsMTAwLDQsMTMyLDAsMTMxLDEsOTAsNSwxMDAsNSwxMDAsNiwxMzIsMCw5MCwKKyAgICA2LDEwMCw3LDEwMCw4LDEzMiwwLDkwLDcsMTAwLDksMTAwLDEwLDEzMiwwLDkwLAorICAgIDgsMTAwLDExLDEwMCwxMiwxMzIsMCw5MCw5LDEwMCwxMywxMDAsMTQsMTMyLDAsOTAsCisgICAgMTAsMTAwLDE1LDEwMCwxNiwxMzIsMCw5MCwxMSwxMDAsMTcsODMsMCw0MSwxOCwyMTgsCiAgICAgMTYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKICAgICAxMTQsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNCwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMjUsMCwwLDAsMTE2LDAsMCwxMjQsMSwKLSAgICAwLDEyNCwyLDAsMTI0LDMsMCwxMzEsMywwLDEyNCwwLDAsOTUsMSwwLAotICAgIDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMzEsMCwwLDAsMTE0LDIzMywKLSAgICAwLDAsMCw0MSw0LDExNCwxMTAsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMzcsMCwwLDAsMTE0LDIzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg2LDAsMCwwLDIzNSwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LDc4LDk3LDEwOSwxMDEsMTE1LAotICAgIDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAotICAgIDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMSwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsODMsNDEsMiwxMjIsCi0gICAgMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsCi0gICAgMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLAotICAgIDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDk3LDk5LDEwNCwKLSAgICAxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDYsCi0gICAgMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDEyMiwyNSw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwzMiw0MCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0MSw2Miw0MSwKLSAgICAyLDExNCw0OSwwLDAsMCwxMTQsMTE0LDAsMCwwLDQxLDIsMTE0LDE3MiwwLAotICAgIDAsMCwxMTQsMTkxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw2LDAsMCwwLDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsCi0gICAgMTAxLDExMiwxMTQsMjM4LDMsMCwwLDExNSwyLDAsMCwwLDAsNywxMjIsMjgsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDk5LDIsMCwwLAotICAgIDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDc4LDg0LDExNCw0LAotICAgIDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNjEsCi0gICAgMCwwLDAsMjQ3LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsMTE0LDMyLDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMTYsMCwxMjQsMSwxMjQsCisgICAgMiwxMjQsMywxMzEsMywxMjQsMCw5NSwxLDEwMCwwLDgzLDAsNDEsMSw3OCwKKyAgICA0MSwyLDExNCwyMjYsMCwwLDAsMTE0LDIyOCwwLDAsMCw0MSw0LDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDIzMiwwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwxMTQsMjAzLDAsMCwwLDI1MCwzLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNiwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsMjIsMCwwLDAsMTE2LDAsMCwxMDAsMSwwLDEwMCwyLAotICAgIDAsMTAwLDMsMCwxMDAsNCwwLDEwMCw1LDAsMTMxLDMsMSw4Myw0MSw2LAotICAgIDc4LDExNCwzMiwwLDAsMCwxMjIsOCw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw2MiwKLSAgICAxMTQsMTkwLDAsMCwwLDExNCwyMDUsMCwwLDAsODQsNDEsMSwxMTQsMjA2LDAsCi0gICAgMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODgsMCwKLSAgICAwLDAsMjUzLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsCi0gICAgNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLAotICAgIDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwKLSAgICAxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwxODcsMCwwLDAsMCw0LDAsMCwxMTUsMCwKLSAgICAwLDAsMCwxMjIsMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLAorICAgIDAsMTE0LDE4MSwwLDAsMCwyMzYsMywwLDAsMTE1LDIsMCwwLDAsMCwKKyAgICAxLDEyMiwyNSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsMTI0LDEsMTA2LDEsMTMxLDEsCisgICAgODMsMCw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwKKyAgICAxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksCisgICAgMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsCisgICAgMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDI1LDYwLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsCisgICAgOTksMTAxLDQxLDYyLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwxMDgsMCwwLDAsCisgICAgNDEsMiwxMTQsMTY3LDAsMCwwLDExNCwxODYsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwyMzksMywwLDAsMTE1LDIsMCwwLAorICAgIDAsMCw3LDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwKKyAgICAxMTQsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLAorICAgIDIsNzgsODQsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsMCwwLDExNCwKKyAgICAxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMTE0LDE1NiwwLDAsMCwyNDgsMywwLDAsMTE1LDIsMCwwLAorICAgIDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwKKyAgICA3OCwxMTQsMzIsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsCisgICAgMCwwLDExNCwxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDE5OCwwLDAsMCwyNTEsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsCisgICAgOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDYsMCwwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDExNiwwLDEwMCwKKyAgICAxLDEwMCwyLDEwMCwzLDEwMCw0LDEwMCw1LDE0NCwxLDEzMSwzLDgzLDAsNDEsCisgICAgNiw3OCwxMTQsMzIsMCwwLDAsMTIyLDgsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsCisgICAgNjIsMTE0LDE4NSwwLDAsMCwxMTQsMjAwLDAsMCwwLDg0LDQxLDEsMTE0LDIwMSwKKyAgICAwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgzLAorICAgIDAsMCwwLDI1NCwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LAorICAgIDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsCisgICAgMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwKKyAgICAxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LAorICAgIDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTgyLDAsMCwwLDEsNCwwLDAsMTE1LAorICAgIDAsMCwwLDAsMTIyLDMwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCisgICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwwLAorICAgIDgzLDAsNDEsMSw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwwLAorICAgIDAsMTE0LDE4NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwxMTQsMTg3LDAsMCwwLDQsNCwwLDAsMTE1LDIsCisgICAgMCwwLDAsMCwxLDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKICAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwwLDAsCi0gICAgODMsNDEsMSw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsCi0gICAgMTE0LDE5MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwxMTQsMTkyLDAsMCwwLDMsNCwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCwxLDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwzMiwwLDAsMCwxMTYsMCwwLDEwMCwKLSAgICAxLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwyLDAsMSwxMTYsMiwwLDEwNiwKLSAgICAzLDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwyLDAsODMsNDEsMiwxMjIsOTgsCi0gICAgNzYsMTExLDk3LDEwMCwzMiw5NywzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LAotICAgIDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LAotICAgIDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwKLSAgICAxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwxMjIsMzgsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsNDEsNCwxMTQsMTA3LDAsMCwKLSAgICAwLDExNCwyMzMsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTkzLDAsMCwwLAotICAgIDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTQsMCwwLDAsCi0gICAgNiw0LDAsMCwxMTUsNCwwLDAsMCwwLDcsMTYsMSwxMjIsMjgsOTUsCi0gICAgNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsMTIsMTE0LDExNCwKLSAgICAwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDE4NiwwLAotICAgIDAsMCwxMTQsMTg0LDAsMCwwLDExNCwyNDksMCwwLDAsMTE0LDE2MSwwLDAsCi0gICAgMCwxMTQsMjAzLDAsMCwwLDExNCwxODgsMCwwLDAsMTE0LDE4NywwLDAsMCwKLSAgICAxMTQsMTkyLDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDI0OCwKLSAgICAwLDAsMCwyMzQsMywwLDAsMTE1LDE2LDAsMCwwLDEyLDEsMTIsMywKLSAgICAxOCw5LDEyLDMsMTIsMywxMiwzLDEyLDMsMTIsMywxMTQsMjQ4LDAsMCwKLSAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwKLSAgICAwLDAsNjQsMCwwLDAsMTE1LDE2MCwwLDAsMCwxMDEsMCwwLDkwLDEsCi0gICAgMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDEsNCwwLAotICAgIDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMSwKLSAgICA0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsMTMxLDEsMCw5MCw2LAotICAgIDAsMTAxLDQsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCwxMzEsMSwwLAotICAgIDkwLDcsMCwxMDEsNCwwLDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDEzMSwKLSAgICAxLDAsOTAsOCwwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDExLDAsMTAwLDEyLAotICAgIDAsMTMyLDEsMCwxMzEsMSwwLDkwLDksMCwxMDEsNCwwLDEwMCwxMCwwLAotICAgIDEwMCwxMCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwyLDAsMTMxLDEsMCw5MCwKLSAgICAxMCwwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDEsCi0gICAgMCwxMzEsMSwwLDkwLDExLDAsMTAwLDEwLDAsODMsNDEsMTcsMjE4LDEwLDgwLAotICAgIDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsNjIsNzcsMTAxLDExNiw5NywzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwKLSAgICAxMDcsOTcsMTAzLDEwMSwzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSwzMiw5NywxMTYsCi0gICAgMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDQ2LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDU1LAotICAgIDAsMCwwLDEyMCw0OCwwLDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDEzMSwKLSAgICAwLDAsNjgsOTMsMzEsMCwxMjUsMSwwLDExNiwzLDAsMTI0LDEsMCwxMDAsCi0gICAgMSwwLDEzMSwyLDAsMTE0LDE2LDAsMTI0LDEsMCwxMDYsNCwwLDEzMSwwLAotICAgIDAsMSwxMTMsMTYsMCw4NywxMDAsMiwwLDgzLDQxLDMsMTIyLDEyNSw2Nyw5NywKLSAgICAxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwKLSAgICAxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsNDAsNDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKLSAgICAxMDAsMzIsMTExLDExMCwzMiw5NywxMDgsMTA4LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsCi0gICAgMTE2LDExNCwxMjEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE1LDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDExNSwxMTYsMTExLDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwKLSAgICAxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDExNSwzMiw0MCwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNDEsNDYsMjE4LDE3LDEwNSwxMTAsMTE4LAotICAgIDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsNzgsNDEsCi0gICAgNSwxMTQsOCwwLDAsMCwyMTgsMTksMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDIxOCw2LDExOCw5NywxMDgsCi0gICAgMTE3LDEwMSwxMTUsMTE0LDExNywwLDAsMCwxMTQsMjUxLDAsMCwwLDQxLDIsMTE0LAotICAgIDE3MiwwLDAsMCwyMTgsNiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjUxLDAsMCwwLAotICAgIDIzLDQsMCwwLDExNSw2LDAsMCwwLDAsNCwyMiwxLDE1LDEsMTIyLAotICAgIDI4LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLDExOCw5NywKLSAgICAxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LDIsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDEyLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxMDcsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDksMCwxMTQsNDEsMCwxMTYsMCwwLDEwNiwxLDAsMTIsMTE0LDQxLDAsCi0gICAgMTE2LDIsMCwxMDYsMywwLDEwMCwyLDAsMTE2LDQsMCwxMzEsMiwwLDEsCi0gICAgMTIwLDU5LDAsMTE2LDAsMCwxMDYsMSwwLDY4LDkzLDQ0LDAsMTI1LDIsMCwKLSAgICAxMjEsMTQsMCwxMjQsMiwwLDEyNCwxLDAsMTMxLDEsMCw4Myw4NywxMTMsNTEsCi0gICAgMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxLDEsMTE5LDUxLAotICAgIDAsODksMTEzLDUxLDAsODgsMTEzLDUxLDAsODcsMTAwLDEsMCw4MywxMDAsMSwKLSAgICAwLDgzLDQxLDMsMTIyLDExMyw4MywxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMTUsMTAxLDExMywKLSAgICAxMTcsMTAxLDExMCw5OSwxMDEsMzIsMTExLDEwMiwzMiwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDk3LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDM5LDExMiw5NywxMTYsMTA0LDM5LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDczLDEwMiwzMiwzOSwxMDQsMTExLDExMSwxMDcsMTE1LDM5LDMyLDEwNSwxMTUsMzIsMTAyLAotICAgIDk3LDEwOCwxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiwxMTcsMTE1LDEwMSwzMiwxMTUsMTIxLAotICAgIDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDEyMiwyMywxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDEwNSwxMTUsMzIsMTAxLDEwOSwxMTIsMTE2LAotICAgIDEyMSw0MSw2LDExNCw4LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsCi0gICAgMTExLDExMSwxMDcsMTE1LDExNCw2MiwwLDAsMCwxMTQsNjMsMCwwLDAsMTE0LDEyNywKLSAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDQxLDMsMTE0LDE3MiwwLDAsMCwxMTQsCi0gICAgMzcsMCwwLDAsOTAsNCwxMDQsMTExLDExMSwxMDcsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LAotICAgIDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzEsNCwwLDAsMTE1LDE2LDAsMCwwLDAsCi0gICAgNywyNSwxLDE2LDEsMTYsMSwzLDEsMTQsMSwxMywxLDEyLDIsMTIyLAotICAgIDIyLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LAotICAgIDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAzLDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxMjMsMCwwLAotICAgIDAsMTI0LDEsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDUzLDAsMTIxLDE2LDAsCi0gICAgMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDEsMCw4NywxMTAsMjIsMCwKLSAgICA0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDUyLDAsMSwxLDEsMTAwLDIsMCwKLSAgICA4Myw4OSwxMTAsMSwwLDg4LDEyMSwxNywwLDExNiwzLDAsMTA2LDQsMCwxMjQsCi0gICAgMSwwLDI1LDEyNSwyLDAsODcsMTEwLDQ2LDAsNCwxMTYsNSwwLDEwNywxMCwKLSAgICAwLDExNCwxMTgsMCwxLDEsMSwxMjQsMCwwLDEwNiw2LDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMTYsMywwLDEwNiw0LDAsMTI0LAotICAgIDEsMCw2MCw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsODMsNDEsMywxMjIsMjEwLAotICAgIDcxLDEwMSwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LAotICAgIDEyMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwKLSAgICAxMTYsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDQ0LDMyLAotICAgIDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiw5NywxMTIsMTEyLDExNCwxMTEsMTEyLDExNCwKLSAgICAxMDUsOTcsMTE2LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiw5NywxMTAsMTAwLDMyLDk5LDk3LDk5LDEwNCwxMDEsMzIsMTA1LDExNiwKLSAgICA0NiwzMiw3MywxMDIsMzIsMTEwLDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsNDQsMzIsMTE1LDExNiwxMTEsCi0gICAgMTE0LDEwMSwzMiw3OCwxMTEsMTEwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwxMTQsMzIsMCwwLDAsNzgsNDEsNywxMTQsMywwLDAsMCwxMTQsCi0gICAgNDcsMCwwLDAsMjE4LDE3LDcwLDEwNSwxMDgsMTAxLDc4LDExMSwxMTYsNzAsMTExLDExNywKLSAgICAxMTAsMTAwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsOCwwLDAsMCwxMTQsMjUyLDAsMCwKLSAgICAwLDExNCwxMzksMCwwLDAsMTE0LDAsMSwwLDAsNDEsMywxMTQsMTcyLDAsCi0gICAgMCwwLDExNCwzNywwLDAsMCwxMTQsMjU0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwyMCw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsNDgsNCwwLDAsMTE1LDIyLDAsMCwwLDAsOCwxMiwxLDMsMSwKLSAgICAxNiwxLDEzLDMsOSwxLDMsMSwxNywxLDEzLDEsMTUsMSwxOCwxLAotICAgIDEyMiwzMSw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDMsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDExOSwwLDAsMCwxMTYsMCwwLDEyNCwyLAotICAgIDAsMTAwLDEsMCwxMzEsMiwwLDExNCwzOSwwLDEyNCwyLDAsMTA2LDEsMCwKLSAgICAxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSwzLDAsMTI1LDQsMCwxMTAsCi0gICAgMjEsMCwxMjQsMiwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwzLAotICAgIDAsMTAzLDAsMCwxMjUsNCwwLDEyNCwzLDAsMTAwLDAsMCwxMDcsOSwwLAotICAgIDExNCw4OCwwLDExNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDEyNCwzLDAsMTMxLAotICAgIDIsMCw4MywxMTYsMywwLDEwNiw1LDAsMTI0LDEsMCwxMDAsMCwwLDEzMSwKLSAgICAyLDAsMTI1LDUsMCwxMjQsNCwwLDEyNCw1LDAsOTUsNiwwLDEyNCw1LAotICAgIDAsODMsNDEsMiw3OCwxMTQsMTI2LDAsMCwwLDQxLDcsMTE0LDExNywwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCwxODMsMCwwLDAsMTE0LDEyMywwLDAsMCwKLSAgICAxMTQsMTgwLDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LDE1OCwwLDAsMCw0MSwKLSAgICA2LDExNCwxNzIsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsMjU0LDAsMCwwLAotICAgIDExNCwxMjksMCwwLDAsMTE0LDEzMCwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNiwKKyAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsMCwxMTYsMCwxMDYsCisgICAgMSwxMDAsMSwxMjQsMCwxMDYsMiwxMzEsMiwxLDAsMTE2LDAsMTA2LDMsMTI0LAorICAgIDAsMTI0LDEsMTMxLDIsODMsMCw0MSwyLDEyMiw5OCw3NiwxMTEsOTcsMTAwLDMyLAorICAgIDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsCisgICAgMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LAorICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLAorICAgIDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsCisgICAgOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwzOCwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw0MSw0LDExNCwxMTcsMCwwLDAsMTE0LDEzMiwwLDAsCisgICAgMCwxMTQsMjI4LDAsMCwwLDExNCwxODgsMCwwLDAsNDEsMiwxMTQsMTAzLDAsCisgICAgMCwwLDExNCwxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDE4OSwwLDAsMCw3LDQsMCwwLDExNSwKKyAgICA2LDAsMCwwLDAsNyw2LDEsOCwxLDEyMiwyOCw5NSw3OCw5NywxMDksCisgICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LAorICAgIDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSwxMiwxMTQsMTA4LDAsMCwwLAorICAgIDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwKKyAgICAxNzksMCwwLDAsMTE0LDI0NiwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwxOTgsCisgICAgMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxODcsMCwKKyAgICAwLDAsMTE0LDE4OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ1LDAsMCwwLAorICAgIDIzNSwzLDAsMCwxMTUsMTYsMCwwLDAsOCwxLDgsMywxMiw5LDgsCisgICAgMyw4LDMsOCwzLDgsMyw4LDMsMTE0LDI0NSwwLDAsMCw5OSwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDY0LAorICAgIDAsMCwwLDExNSwxMDYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLAorICAgIDEwMCwxLDkwLDMsMTAxLDQsMTAwLDIsMTAwLDMsMTMyLDAsMTMxLDEsOTAsNSwKKyAgICAxMDEsNCwxMDAsNCwxMDAsNSwxMzIsMCwxMzEsMSw5MCw2LDEwMSw0LDEwMCw2LAorICAgIDEwMCw3LDEzMiwwLDEzMSwxLDkwLDcsMTAxLDQsMTAwLDgsMTAwLDksMTMyLDAsCisgICAgMTMxLDEsOTAsOCwxMDEsNCwxMDAsMTcsMTAwLDExLDEwMCwxMiwxMzIsMSwxMzEsMSwKKyAgICA5MCw5LDEwMSw0LDEwMCwxOCwxMDAsMTMsMTAwLDE0LDEzMiwxLDEzMSwxLDkwLDEwLAorICAgIDEwMSw0LDEwMCwxOSwxMDAsMTUsMTAwLDE2LDEzMiwxLDEzMSwxLDkwLDExLDEwMCwxMCwKKyAgICA4MywwLDQxLDIwLDIxOCwxMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgMTIyLDYyLDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsCisgICAgOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsOTUsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsOTUsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDExNSw0NiwKKyAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw0LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSw0MiwwLDAsMCwxMjAsMzYsMTE2LDAsMTA2LDEsCisgICAgMTA2LDIsMTMxLDAsNjgsMCw5MywyMiwxMjUsMSwxMTYsMywxMjQsMSwxMDAsMSwKKyAgICAxMzEsMiwxMTQsMTIsMTI0LDEsMTA2LDQsMTMxLDAsMSwwLDExMywxMiw4NywwLAorICAgIDEwMCwyLDgzLDAsNDEsMywxMjIsMTI1LDY3LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsCisgICAgMTAxLDExNSw0MCw0MSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTEsMTEwLDMyLDk3LAorICAgIDEwOCwxMDgsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDIsMTA1LAorICAgIDExMCwxMDAsMTAxLDExNCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExNiwKKyAgICAxMTEsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LAorICAgIDMyLDQwLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKKyAgICAxMTYsMTAxLDEwMCw0MSw0NiwyMTgsMTcsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LAorICAgIDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw3OCw0MSw1LDExNCw4LDAsMCwwLAorICAgIDIxOCwxOSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LAorICAgIDk5LDk3LDk5LDEwNCwxMDEsMjE4LDYsMTE4LDk3LDEwOCwxMTcsMTAxLDExNSwxMTQsMTExLDAsCisgICAgMCwwLDExNCwyNDgsMCwwLDAsNDEsMiwxMTQsMTY3LDAsMCwwLDIxOCw2LAorICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDExNCwyNDgsMCwwLDAsMjUsNCwwLDAsMTE1LDYsCisgICAgMCwwLDAsMCw0LDE2LDEsMTAsMSwxMjIsMjgsODAsOTcsMTE2LDEwNCw3MCwKKyAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsCisgICAgOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDg2LDAsMCwKKyAgICAwLDExNiwwLDEwNiwxLDEwMCwxLDEwNyw5LDExNCwzMCwxMTYsMCwxMDYsMSwxMiwKKyAgICAwLDExNCwzMCwxMTYsMiwxMDYsMywxMDAsMiwxMTYsNCwxMzEsMiwxLDAsMTIwLAorICAgIDUwLDExNiwwLDEwNiwxLDY4LDAsOTMsMzYsMTI1LDIsMTIxLDgsMTI0LDIsMTI0LAorICAgIDEsMTMxLDEsODMsMCw0LDAsMTE2LDUsMTA3LDEwLDExNCw3MiwxLDAsMSwKKyAgICAwLDEsMCwxMTksMzgsODksMCwxMTMsMzgsODgsMCwxMTMsMzgsODcsMCwxMDAsCisgICAgMSw4MywwLDEwMCwxLDgzLDAsNDEsMywxMjIsNDYsODMsMTAxLDk3LDExNCw5OSwKKyAgICAxMDQsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLAorICAgIDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSw0Niw3OCwxMjIsMjMsMTE1LDEyMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwxMDUsMTE1LDMyLDEwMSwxMDksCisgICAgMTEyLDExNiwxMjEsNDEsNiwxMTQsOCwwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwxMDQsCisgICAgOTUsMTA0LDExMSwxMTEsMTA3LDExNSwxMTQsNjMsMCwwLDAsMTE0LDY0LDAsMCwwLAorICAgIDExNCwxMjEsMCwwLDAsMTE0LDEwMiwwLDAsMCw0MSwzLDExNCwxNjcsMCwwLAorICAgIDAsMTE0LDM3LDAsMCwwLDkwLDQsMTA0LDExMSwxMTEsMTA3LDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMzLDQsMCwwLDExNSwxNiwwLDAsCisgICAgMCwwLDMsMTgsMSwxMiwxLDEyLDEsMiwxLDgsMSwxNCwxLDEyLAorICAgIDIsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwzLDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxMDIsCisgICAgMCwwLDAsMTI0LDEsMTAwLDEsMTA3LDIsMTE0LDQyLDEyMSwxMiwxMTYsMCwxMDYsCisgICAgMSwxMzEsMCwxMjUsMSw4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCwKKyAgICA0MCwxLDAsMSwwLDEsMCwxMDAsMiw4MywwLDg4LDAsMTIxLDE0LDExNiwKKyAgICAzLDEwNiw0LDEyNCwxLDI1LDAsMTI1LDIsODcsMCwxMTAsNDAsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsOTYsMSwwLDEsMCwxLDAsMTI0LDAsMTA2LDYsMTI0LAorICAgIDEsMTMxLDEsMTI1LDIsMTI0LDIsMTE2LDMsMTA2LDQsMTI0LDEsNjAsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDIsODMsMCw0MSwzLDEyMiwyMTAsNzEsMTAxLDExNiwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwMiwKKyAgICAxMTQsMTExLDEwOSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCisgICAgMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDUsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsNDQsMzIsMTAyLDEwNSwxMTAsCisgICAgMTAwLDMyLDExNiwxMDQsMTAxLDMyLDk3LDExMiwxMTIsMTE0LDExMSwxMTIsMTE0LDEwNSw5NywxMTYsCisgICAgMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDk3LDExMCwxMDAsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMDUsMTE2LDQ2LDMyLDczLAorICAgIDEwMiwzMiwxMTAsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsCisgICAgMTE4LDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NCwzMiwxMTUsMTE2LDExMSwxMTQsMTAxLDMyLAorICAgIDc4LDExMSwxMTAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwKKyAgICAzMiwwLDAsMCw3OCw0MSw3LDExNCwzLDAsMCwwLDExNCw0NywwLDAsCisgICAgMCwyMTgsMTcsNzAsMTA1LDEwOCwxMDEsNzgsMTExLDExNiw3MCwxMTEsMTE3LDExMCwxMDAsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDExNCw4LDAsMCwwLDExNCwyNDksMCwwLDAsMTE0LDEzNCwKKyAgICAwLDAsMCwxMTQsMjUzLDAsMCwwLDQxLDMsMTE0LDE2NywwLDAsMCwxMTQsCisgICAgMzcsMCwwLDAsMTE0LDI1MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjAsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDQsCisgICAgMCwwLDExNSwyMiwwLDAsMCwwLDgsOCwxLDIsMSwxMiwxLDE0LAorICAgIDMsNiwxLDIsMSwxNCwxLDE0LDEsMTAsMSwxNiwxLDEyMiwzMSw4MCwKKyAgICA5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDMsCisgICAgMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDgyLDAsMCwwLDExNiwwLDEyNCwyLDEwMCwxLDEzMSwyLAorICAgIDExNCwyNiwxMjQsMiwxMDYsMSwxMjQsMSwxMzEsMSw5MiwyLDEyNSwzLDEyNSw0LAorICAgIDExMCwxNCwxMjQsMiwxMDYsMiwxMjQsMSwxMzEsMSwxMjUsMywxMDMsMCwxMjUsNCwKKyAgICAxMjQsMywxMDAsMCwxMDcsOSwxMTQsNjAsMTE2LDMsMTA2LDQsMTI0LDEsMTI0LDMsCisgICAgMTMxLDIsODMsMCwxMTYsMywxMDYsNSwxMjQsMSwxMDAsMCwxMzEsMiwxMjUsNSwKKyAgICAxMjQsNCwxMjQsNSw5NSw2LDEyNCw1LDgzLDAsNDEsMiw3OCwxMTQsMTIwLDAsCisgICAgMCwwLDQxLDcsMTE0LDExMSwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCwxNzgsCisgICAgMCwwLDAsMTE0LDExNywwLDAsMCwxMTQsMTc1LDAsMCwwLDExNCwxNTcsMCwKKyAgICAwLDAsMTE0LDE1MywwLDAsMCw0MSw2LDExNCwxNjcsMCwwLDAsMTE0LDEyMiwKKyAgICAwLDAsMCwxMTQsMjUxLDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDEyNCwwLAorICAgIDAsMCwxMTQsMTYxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsCisgICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNjgsNCwwLDAsMTE1LDE4LDAsMCwKKyAgICAwLDAsNCwxMCwxLDE2LDIsMTAsMSw0LDEsOCwxLDEyLDEsMTIsCisgICAgMSw2LDEsMTIyLDI3LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKICAgICA5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgNzAsNCwwLDAsMTE1LDE4LDAsMCwwLDAsNCwxNSwxLDI0LDIsMTUsCi0gICAgMSw2LDEsMTIsMSwxNiwxLDE4LDEsOSwxLDEyMiwyNyw4MCw5NywxMTYsCi0gICAgMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTA4LDEwMSwxMDMsOTcsOTksMTIxLDk1LAotICAgIDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDc4LDk5LDQsMCwwLDAsMCwwLAotICAgIDAsMCw5LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDI0MywKLSAgICAwLDAsMCwxMDMsMCwwLDEyNSw0LDAsMTIwLDIzMCwwLDEyNCwyLDAsNjgsCi0gICAgOTMsMTkxLDAsMTI1LDUsMCwxMTYsMCwwLDEyNCw1LDAsMTE2LDEsMCwxMTYsCi0gICAgMiwwLDEwMiwyLDAsMTMxLDIsMCwxMTUsNDMsMCwxMTMsMTMsMCwxMjQsMCwKLSAgICAwLDEwNiwzLDAsMTI0LDUsMCwxMzEsMSwwLDEyNSw2LDAsMTI0LDYsMCwKLSAgICAxMDAsMSwwLDEwNyw5LDAsMTE0LDEzLDAsMTE2LDQsMCwxMjQsNiwwLDEwMCwKLSAgICAyLDAsMTMxLDIsMCwxMTQsMTA2LDAsMTI0LDYsMCwxMDYsNSwwLDEyNCwxLAotICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEyNSw3LDAsMTEwLDE4LDAsMTI0LDAsMCwKLSAgICAxMDYsNiwwLDEyNCwxLDAsMTI0LDYsMCwxMzEsMiwwLDEyNSw3LDAsMTI0LAotICAgIDcsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDEzOSwwLDExMywxMywwLDEyNCw3LAotICAgIDAsMTA2LDcsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDE1OCwwLDEyNCw3LDAsCi0gICAgODMsMTI0LDcsMCwxMDYsOCwwLDEyNSw4LDAsMTI0LDgsMCwxMDAsMSwwLAotICAgIDEwNyw4LDAsMTE0LDE5MSwwLDExNiw5LDAsMTAwLDMsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDQsMCwxMDYsMTAsMCwxMjQsOCwwLDEzMSwxLDAsMSwxMTMsCi0gICAgMTMsMCw4NywxMTYsMTEsMCwxMDYsMTIsMCwxMjQsMSwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCwxMjUsNywwLDEyNCw0LDAsMTI0LDcsMCw5NSw4LDAsMTI0LDcsCi0gICAgMCw4MywxMDAsMSwwLDgzLDQxLDQsMTIyLDYzLDcwLDEwNSwxMTAsMTAwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDExNCwzMiwxMTAsOTcsMTA5LAotICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDcsMTEyLDk3LDk5LDEwNywKLSAgICA5NywxMDMsMTAxLDMyLDExMCw5NywxMDksMTAxLDQ2LDc4LDExNCwxODIsMCwwLDAsMTIyLAotICAgIDE5LDExNSwxMTIsMTAxLDk5LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQxLDEzLDExNCwxNDUsMCwwLDAsMTE0LDcxLDAsMCwwLAotICAgIDIxOCw1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMiwxLDAsMCwxMTQsMTE3LDAsMCwKLSAgICAwLDExNCwxODIsMCwwLDAsMTE0LDMsMSwwLDAsMTE0LDEyOSwwLDAsMCwKLSAgICAxMTQsMTU4LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDE1MSwwLDAsMCwxMTQsCi0gICAgMTIzLDAsMCwwLDExNCwxNjIsMCwwLDAsNDEsOSwxMTQsMTcyLDAsMCwwLAotICAgIDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwxODEsMCwwLDAsMjE4LAotICAgIDE0LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDkwLAotICAgIDUsMTAxLDExMCwxMTYsMTE0LDEyMSwxMTQsMjU0LDAsMCwwLDExNCwxNjYsMCwwLDAsCi0gICAgMTE0LDEzMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwyMTgsOSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw4NSwKLSAgICA0LDAsMCwxMTUsNDAsMCwwLDAsMCw1LDYsMSwxMywxLDIxLDEsCi0gICAgMywxLDE1LDEsMTIsMSwxNSwxLDIxLDIsMTgsMSwxMiwxLDMsMSwKLSAgICAxNSwxLDQsMSw5LDEsMTIsMSwxMiw1LDE3LDIsMTgsMSw5LDEsCi0gICAgMTIyLDIwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDMsMTAxLAotICAgIDExNiw5NSwxMTUsMTEyLDEwMSw5OSw5OSw0LDAsMCwwLDAsMCwwLDAsNiwKLSAgICAwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxNDAsMCwwLDAsCi0gICAgMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDIxLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEyNSwyLDAsMTI0LDAsMCwxMDYsMiwwLDEyNCwxLDAsMTI0LDIsCi0gICAgMCwxMjQsMywwLDEzMSwzLDAsMTI1LDQsMCwxMjQsNCwwLDEwMCwxLDAsCi0gICAgMTA3LDgsMCwxMTQsNTgsMCwxMDAsMSwwLDgzLDEyNCw0LDAsMTA2LDMsMCwKLSAgICAxMDAsMSwwLDEwNyw4LDAsMTE0LDEzMiwwLDEyNCw0LDAsMTA2LDQsMCwxMjUsCi0gICAgNSwwLDEyNCw1LDAsMTE0LDEyNSwwLDEwMCwyLDAsMTI0LDQsMCw5NSw1LAotICAgIDAsMTE2LDYsMCwxMjQsMSwwLDEyNCw1LDAsMTI0LDAsMCwxMDYsMiwwLAotICAgIDEzMSwzLDAsMTI0LDQsMCw5NSw0LDAsMTI0LDQsMCw4MywxMDAsMSwwLAotICAgIDgzLDExMCw0LDAsMTI0LDQsMCw4MywxMDAsMSwwLDgzLDQxLDMsMTIyLDk4LAotICAgIDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICAxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwxMTQsMzIsMzksCi0gICAgMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTUsCi0gICAgMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDk3LDExMCwKLSAgICAxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDQ2LDc4LDkwLDksMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsNywKLSAgICAxMTQsOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDYsMSwwLDAsMTE0LAotICAgIDEyOSwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwxNjAsMCwwLDAsMTE0LDIzMSwKLSAgICAwLDAsMCw0MSw2LDExNCwxNzIsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsCi0gICAgMzcsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCw1LAotICAgIDEsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDExNCwxODIsMCwwLDAsMTE3LDQsMCwwLDExNSwyNiwwLDAsMCwKLSAgICAwLDQsMTIsMSw5LDEsMjEsMSwxMiwxLDQsMSwxNSwxLDksMSwKLSAgICA2LDMsOSwxLDI0LDEsNCwyLDcsMiwxMjIsMjAsODAsOTcsMTE2LDEwNCwKLSAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwKLSAgICA5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSw0MSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDMsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTA3LDgsMCwxMTQsMzQsMCwxMDAsMSwwLDgzLDEyNCwzLDAsMTA2LAotICAgIDEsMCw4Myw0MSwyLDEyMiwxNzAsMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywxMTUsCi0gICAgMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwKLSAgICAxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LAotICAgIDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LAotICAgIDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwKLSAgICAxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDc4LDQxLDIsMTE0LDE4MiwwLDAsMCwxMTQsMTI5LDAsMCwwLDQxLDQsCi0gICAgMTE0LDE3MiwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCi0gICAgMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwxODMsMCwwLDAsMTM5LDQsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsOCwxOCwxLDEyLDEsNCwxLDEyMiwyMiw4MCw5NywxMTYsMTA0LDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDQxLDEyLDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsCi0gICAgMCwwLDExNCwxMTYsMCwwLDAsMTE0LDE4NCwwLDAsMCwxMTQsMjUxLDAsMCwKLSAgICAwLDExNCwwLDEsMCwwLDExNCwyLDEsMCwwLDExNCwzLDEsMCwwLAotICAgIDExNCw2LDEsMCwwLDExNCwxODIsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMjUwLDAsMCwwLDE5LDQsMCwwLDExNSwyMiwwLDAsCi0gICAgMCwxMiwyLDYsMiwxOCw4LDE4LDE3LDE4LDIyLDE4LDE1LDMsMSwxOCwKLSAgICAzMSwzLDEsMjEsMjEsMywxLDExNCwyNTAsMCwwLDAsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsMTMzLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsCi0gICAgMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwKLSAgICAwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsCi0gICAgMTAxLDYsMCw5MCw3LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsCi0gICAgOCwwLDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDkwLDksMCwxMDAsMTAsCi0gICAgMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMSwwLDkwLDEwLDAsMTAwLDEzLDAsCi0gICAgMTAwLDE0LDAsMTMyLDAsMCw5MCwxMSwwLDEwMSwxMiwwLDEwMCwxNSwwLDEwMCwKLSAgICAxNiwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMywwLDEwMCwxNywwLDEwMCwxOCwKLSAgICAwLDEzMiwwLDAsOTAsMTQsMCwxMDAsMTAsMCw4Myw0MSwxOSwyMTgsMTAsNzAsCi0gICAgMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsMTcyLDcwLDEwNSwxMDgsMTAxLDQ1LAotICAgIDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDczLDExMCwxMTYsMTAxLDExNCw5Nyw5OSwxMTYsMTA1LDExMSwxMTAsMTE1LDMyLAotICAgIDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwKLSAgICAxMTUsMTE2LDEwMSwxMDksMzIsOTcsMTE0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiwKLSAgICAxMDIsMTExLDExNCwzMiwxMTIsMTAxLDExNCwxMDIsMTExLDExNCwxMDksOTcsMTEwLDk5LDEwMSw0NCwKLSAgICAzMiw5OCwxMDEsMTA1LDExMCwxMDMsMTAsMzIsMzIsMzIsMzIsMTE0LDEwMSwxMDIsMTE0LDEwMSwKLSAgICAxMTUsMTA0LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsCi0gICAgMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTA1LDExMCwxMDMsMzIsMTA0LAotICAgIDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSwxMDEsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICA1LDAsMCwwLDUsMCwwLDAsNywwLDAsMCwxMTUsMTIyLDAsMCwKLSAgICAwLDEwMywwLDAsMTI1LDMsMCwxMjAsNTIsMCwxMjQsMiwwLDY4LDkzLDQ0LAotICAgIDAsOTIsMiwwLDEzNywwLDAsMTI1LDQsMCwxMjQsMywwLDEwNiwwLDAsCi0gICAgMTM1LDAsMCwxMDIsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMzQsMCwwLDEyNCwKLSAgICA0LDAsNjgsMTMxLDEsMCwxMzEsMSwwLDEsMTEzLDEzLDAsODcsMTI0LDMsCi0gICAgMCwxMjQsMCwwLDk1LDEsMCwxMjQsMSwwLDExMiw3OSwwLDEwMCwzLDAsCi0gICAgMTI0LDAsMCw5NSwyLDAsMTAwLDYsMCwxMjQsMCwwLDk1LDMsMCwxMTYsCi0gICAgNCwwLDEzMSwwLDAsMTI0LDAsMCw5NSw1LDAsMTE2LDQsMCwxMzEsMCwKLSAgICAwLDEyNCwwLDAsOTUsNiwwLDEwMCw1LDAsODMsNDEsNywxMjIsMTU0LDczLAotICAgIDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE1LDEwMSw5NywxMTQsOTksCi0gICAgMTA0LDMyLDExMSwxMTAsMzIsOTcsMTEwLDEwMCwzMiw5NywzMiwxMTgsOTcsMTE0LDEwNSw5NywKLSAgICA5OCwxMDgsMTAxLDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTExLDEwMiwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw1MCw0NSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNSwzMiw5OSwKLSAgICAxMTEsMTEwLDExNiw5NywxMDUsMTEwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsMzIsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxMDEsCi0gICAgOTksMTExLDEwMywxMTAsMTA1LDEyMiwxMDEsMTE1LDQ2LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwyLDAsMCwwLDMsMCwwLDAsNTEsMCwwLDAsMTE1LDI3LAotICAgIDAsMCwwLDEyNCwwLDAsOTMsMTcsMCwxMjUsMSwwLDEyNCwxLDAsMTM2LAotICAgIDAsMCwxMDIsMiwwLDg2LDEsMTEzLDMsMCwxMDAsMCwwLDgzLDQxLDEsCi0gICAgNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsMTE0LDIyNiwwLAotICAgIDAsMCw0MSwxLDExNCwxMjksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDIyOCwwLDAsMCwxNjgsNCwwLDAsMTE1LDIsMCwwLAotICAgIDAsNiwwLDEyMiwzOCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LAotICAgIDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsCi0gICAgNjIsNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDExNCw2MCwwLDAsMCwKLSAgICAxMTQsMzEsMCwwLDAsNzgsMTE0LDg5LDAsMCwwLDQxLDcsMTE0LDE1MSwwLAotICAgIDAsMCwyMTgsOCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsMzcsMCwwLAotICAgIDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMjE4LDMsCi0gICAgMTE1LDEwMSwxMTYsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgMjE4LDE5LDk1LDExNCwxMDEsMTA4LDk3LDEyMCwxMDEsMTAwLDk1LDExMiw5NywxMTYsMTA0LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsNDEsNSwxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsCi0gICAgMCwyMTgsMTQsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LAotICAgIDExNSw5MCw3LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwxNjgsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsNDEsMSwxMTQsMTI5LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDExNCwxODYsMCwwLDAsMTYyLDQsMCwwLDExNSwxNiwwLDAsMCwwLDQsCi0gICAgNiwxLDE5LDEsMzYsMSw5LDIsMTUsMSw5LDEsMTIsMSwxMjIsMTksCi0gICAgNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwKLSAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsMTAwLDMsMCwKLSAgICAxMjQsMCwwLDk1LDAsMCwxMDAsMiwwLDgzLDQxLDQsMTIyLDMxLDczLDExMCwKKyAgICA3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOSwwLDAsMCw1LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxNzAsMCwwLDAsMTAzLDAsMTI1LDQsMTIwLAorICAgIDE2MCwxMjQsMiw2OCwwLDkzLDEzMCwxMjUsNSwxMTYsMCwxMjQsNSwxMTYsMSwxMTYsCisgICAgMiwxMDIsMiwxMzEsMiwxMTUsMzAsMTEzLDEwLDEyNCwwLDEwNiwzLDEyNCw1LDEzMSwKKyAgICAxLDEyNSw2LDEyNCw2LDEwMCwxLDEwNyw5LDExNCwxMCwxMTYsNCwxMjQsNiwxMDAsCisgICAgMiwxMzEsMiwxMTQsNzIsMTI0LDYsMTA2LDUsMTI0LDEsMTI0LDMsMTMxLDIsMTI1LAorICAgIDcsMTEwLDEyLDEyNCwwLDEwNiw2LDEyNCwxLDEyNCw2LDEzMSwyLDEyNSw3LDEyNCwKKyAgICA3LDEwMCwxLDEwNyw4LDExNCw5NCwxMTMsMTAsMTI0LDcsMTA2LDcsMTAwLDEsMTA3LAorICAgIDksMTE0LDEwOCwxMjQsNyw4MywwLDEyNCw3LDEwNiw4LDEyNSw4LDEyNCw4LDEwMCwKKyAgICAxLDEwNyw4LDExNCwxMzAsMTE2LDksMTAwLDMsMTMxLDEsMTMwLDEsMTI0LDQsMTA2LAorICAgIDEwLDEyNCw4LDEzMSwxLDEsMCwxMTMsMTAsODcsMCwxMTYsMTEsMTA2LDEyLDEyNCwKKyAgICAxLDEwMCwxLDEzMSwyLDEyNSw3LDEyNCw0LDEyNCw3LDk1LDgsMTI0LDcsODMsCisgICAgMCwxMDAsMSw4MywwLDQxLDQsMTIyLDYzLDcwLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDExNCwzMiwxMTAsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsCisgICAgMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDcsMTEyLDk3LDk5LDEwNyw5NywKKyAgICAxMDMsMTAxLDMyLDExMCw5NywxMDksMTAxLDQ2LDc4LDExNCwxNzcsMCwwLDAsMTIyLDE5LAorICAgIDExNSwxMTIsMTAxLDk5LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDQxLDEzLDExNCwxNDAsMCwwLDAsMTE0LDcyLDAsMCwwLDIxOCwKKyAgICA1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMjU1LDAsMCwwLDExNCwxMTEsMCwwLDAsCisgICAgMTE0LDE3NywwLDAsMCwxMTQsMCwxLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwKKyAgICAxNTMsMCwwLDAsMTE0LDEwMiwwLDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxMTcsCisgICAgMCwwLDAsMTE0LDE1NywwLDAsMCw0MSw5LDExNCwxNjcsMCwwLDAsMTE0LAorICAgIDEyMiwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE3NiwwLDAsMCwyMTgsMTQsCisgICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsNSwKKyAgICAxMDEsMTEwLDExNiwxMTQsMTIxLDExNCwyNTEsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsCisgICAgMTI0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDIxOCw5LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDgzLDQsCisgICAgMCwwLDExNSw0MCwwLDAsMCwwLDUsNCwxLDEwLDEsMTQsMSwyLAorICAgIDEsMTAsMSw4LDEsMTAsMSwxNCwyLDEyLDEsOCwxLDIsMSwxMCwKKyAgICAxLDQsMSw2LDEsOCwxLDgsNSwxNCwyLDEyLDEsNiwxLDEyMiwKKyAgICAyMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwxMTYsCisgICAgOTUsMTE1LDExMiwxMDEsOTksOTksNCwwLDAsMCwwLDAsMCwwLDYsMCwKKyAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTA0LDAsMCwwLDEyNCwKKyAgICAyLDEwMCwxLDEwNyw4LDExNCwxNCwxMTYsMCwxMDYsMSwxMjUsMiwxMjQsMCwxMDYsCisgICAgMiwxMjQsMSwxMjQsMiwxMjQsMywxMzEsMywxMjUsNCwxMjQsNCwxMDAsMSwxMDcsCisgICAgOCwxMTQsNDIsMTAwLDEsODMsMCwxMTAsNTgsMTI0LDQsMTA2LDMsMTAwLDEsMTA3LAorICAgIDgsMTE0LDk2LDEyNCw0LDEwNiw0LDEyNSw1LDEyNCw1LDExNCw5MCwxMDAsMiwxMjQsCisgICAgNCw5NSw1LDExNiw2LDEyNCwxLDEyNCw1LDEyNCwwLDEwNiwyLDEzMSwzLDEyNCwKKyAgICA0LDk1LDQsMTI0LDQsODMsMCwxMTMsMTAwLDEwMCwxLDgzLDAsMTEwLDQsMTI0LAorICAgIDQsODMsMCwxMDAsMSw4MywwLDQxLDMsMTIyLDE0MSw4NCwxMTQsMTIxLDMyLDExNiwKKyAgICAxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDM5LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwzOSwzMiwxMTEsMTEwLDMyLAorICAgIDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwKKyAgICAxMDQsMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwKKyAgICAzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTA1LDExNSwzMiw5OCw5NywxMTUsMTAxLDEwMCwKKyAgICAzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLAorICAgIDEwNywxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsOTAsOSwxMTAsOTcsMTA5LDEwMSwxMTUsCisgICAgMTEyLDk3LDk5LDEwMSw0MSw3LDExNCw4LDAsMCwwLDExNCwzNywwLDAsMCwKKyAgICAxMTQsMywxLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LAorICAgIDE1NSwwLDAsMCwxMTQsMjI2LDAsMCwwLDQxLDYsMTE0LDE2NywwLDAsMCwKKyAgICAxMTQsMTIyLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwKKyAgICAxNjEsMCwwLDAsMTE0LDIsMSwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE3NywwLDAsMCwxMTUsNCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDAsNiw4LDEsNiwxLDE0LDEsOCwxLAorICAgIDYsMSwxMCwxLDYsMSw0LDMsNiwxLDE2LDEsNiwyLDYsMiwKKyAgICAxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLAorICAgIDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsNCwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzMCwwLDAsMCwKKyAgICAxMjQsMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsMywxMjQsMywxMDAsMSwKKyAgICAxMDcsOCwxMTQsMjQsMTAwLDEsODMsMCwxMjQsMywxMDYsMSw4MywwLDQxLDIsCisgICAgMTIyLDE3MCwxMDIsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiwxMTEsMTE0LAorICAgIDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsCisgICAgMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwKKyAgICA5NywxMTAsMTAwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDQ2LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCisgICAgMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLAorICAgIDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDIsMTA1LAorICAgIDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywKKyAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsNDEsMiwxMTQsCisgICAgMTc3LDAsMCwwLDExNCwxMjMsMCwwLDAsNDEsNCwxMTQsMTY3LDAsMCwwLAorICAgIDExNCwxMjIsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwxNjEsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE3OCwKKyAgICAwLDAsMCwxMzksNCwwLDAsMTE1LDgsMCwwLDAsMCw4LDEyLDEsCisgICAgOCwxLDQsMSwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwxLDc4LDQxLAorICAgIDIsNzgsNzgsNDEsMSw3OCw0MSwxMiwxMTQsMTA4LDAsMCwwLDExNCwxMDcsMCwKKyAgICAwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxNzksMCwwLAorICAgIDAsMTE0LDI0OCwwLDAsMCwxMTQsMjUzLDAsMCwwLDExNCwyNTUsMCwwLDAsCisgICAgMTE0LDAsMSwwLDAsMTE0LDMsMSwwLDAsMTE0LDE3NywwLDAsMCwxMTQsCisgICAgMTc4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwyNDcsMCwwLDAsMjEsNCwwLAorICAgIDAsMTE1LDIyLDAsMCwwLDgsMiw0LDIsMTIsOCwxMiwxMywxMiwyMiwKKyAgICAxMiwxNSwyLDEsMTIsMzEsMiwxLDEyLDIzLDIsMSwxMTQsMjQ3LDAsMCwKKyAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwKKyAgICAwLDAsNjQsMCwwLDAsMTE1LDkwLDAsMCwwLDEwMSwwLDkwLDEsMTAwLAorICAgIDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLAorICAgIDQsMTAwLDUsMTMyLDAsOTAsNSwxMDEsNiw5MCw3LDEwMCw2LDEwMCw3LDEzMiwKKyAgICAwLDkwLDgsMTAwLDgsMTAwLDksMTMyLDAsOTAsOSwxMDAsMTksMTAwLDExLDEwMCwKKyAgICAxMiwxMzIsMSw5MCwxMCwxMDAsMTMsMTAwLDE0LDEzMiwwLDkwLDExLDEwMSwxMiwxMDAsCisgICAgMTUsMTAwLDE2LDEzMiwwLDEzMSwxLDkwLDEzLDEwMCwxNywxMDAsMTgsMTMyLDAsOTAsCisgICAgMTQsMTAwLDEwLDgzLDAsNDEsMjAsMjE4LDEwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsMTIyLDE3Miw3MCwxMDUsMTA4LDEwMSw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwKKyAgICAxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMTAsMTE2LAorICAgIDEwMSwxMTQsOTcsOTksMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDk3LAorICAgIDExNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTEyLDEwMSwKKyAgICAxMTQsMTAyLDExMSwxMTQsMTA5LDk3LDExMCw5OSwxMDEsNDQsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLAorICAgIDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTAyLDExNCwxMDEsMTE1LDEwNCwxMDEsMTAwLDMyLDExOSwKKyAgICAxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsCisgICAgMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsCisgICAgMTA0LDk3LDExMCwxMDAsMTA4LDEwNSwxMTAsMTAzLDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwKKyAgICAxMTAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw1LDAsCisgICAgMCwwLDcsMCwwLDAsMTE1LDg4LDAsMCwwLDEwMywwLDEyNSwzLDEyMCwKKyAgICA0MCwxMjQsMiw2OCwwLDkzLDMyLDkyLDIsMTM3LDAsMTI1LDQsMTI0LDMsMTA2LAorICAgIDAsMTM1LDAsMTAyLDEsMTAwLDEsMTAwLDIsMTMyLDgsMTI0LDQsNjgsMCwxMzEsCisgICAgMSwxMzEsMSwxLDAsMTEzLDEwLDg3LDAsMTI0LDMsMTI0LDAsOTUsMSwxMjQsCisgICAgMSwxMTIsNTgsMTAwLDMsMTI0LDAsOTUsMiwxMDAsNiwxMjQsMCw5NSwzLDExNiwKKyAgICA0LDEzMSwwLDEyNCwwLDk1LDUsMTE2LDQsMTMxLDAsMTI0LDAsOTUsNiwxMDAsCisgICAgNSw4MywwLDQxLDcsMTIyLDE1NCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsCisgICAgMTAxLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMTYsMTExLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMTEsMTEwLDMyLDk3LDExMCwxMDAsCisgICAgMzIsOTcsMzIsMTE4LDk3LDExNCwxMDUsOTcsOTgsMTA4LDEwMSwzMiwxMTAsMTE3LDEwOSw5OCwKKyAgICAxMDEsMTE0LDMyLDExMSwxMDIsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNTAsNDUsCisgICAgMTE2LDExNywxMTIsMTA4LDEwMSwxMTUsMzIsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMDUsMTEwLAorICAgIDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLAorICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDExNSwKKyAgICA0Niw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCisgICAgMCwwLDUxLDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMCw5MywxNCwxMjUsCisgICAgMSwxMjQsMSwxMzYsMCwxMDIsMiw4NiwwLDEsMCwxMTMsMiwxMDAsMCw4MywKKyAgICAwLDQxLDEsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsCisgICAgMTE0LDIyMSwwLDAsMCw0MSwxLDExNCwxMjMsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDIyMywwLDAsMCwxNjgsNCwwLDAsMTE1LAorICAgIDIsMCwwLDAsNCwwLDEyMiwzOCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwKKyAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0Niw2MCwxMDgsMTExLDk5LAorICAgIDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDExNCw2MSwKKyAgICAwLDAsMCwxMTQsMzEsMCwwLDAsNzgsMTE0LDkwLDAsMCwwLDQxLDcsCisgICAgMTE0LDE0NiwwLDAsMCwyMTgsOCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsCisgICAgMzcsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwOSwxMTYsMTA1LDEwOSwKKyAgICAxMDEsMjE4LDMsMTE1LDEwMSwxMTYsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDk5LDk3LAorICAgIDk5LDEwNCwxMDEsMjE4LDE5LDk1LDExNCwxMDEsMTA4LDk3LDEyMCwxMDEsMTAwLDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDEsNSwxMTQsMTAzLDAsMCwwLDExNCwKKyAgICAzNywwLDAsMCwyMTgsMTQsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwxMDAsMTAxLDExNiwKKyAgICA5NywxMDUsMTA4LDExNSw5MCw3LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwxNjMsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMTIzLDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDExNCwxODEsMCwwLDAsMTYyLDQsMCwwLDExNSwxNiwwLDAsCisgICAgMCwwLDQsNCwxLDE0LDEsMjgsMSw2LDIsMTAsMSw2LDEsOCwKKyAgICAxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LAorICAgIDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwKKyAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLDAsMCwKKyAgICAxMDAsMywxMjQsMCw5NSwwLDEwMCwyLDgzLDAsNDEsNCwxMjIsMzEsNzMsMTEwLAogICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LAogICAgIDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA5LDExNiwxMDUsMTA5LDEwMSw0NiwxMTQsMzEsMCwKLSAgICAwLDAsNzgsMTE0LDg5LDAsMCwwLDQxLDEsMTE0LDksMSwwLDAsNDEsCi0gICAgMSwxMTQsMTEwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDExNCwyNTEsMCwwLDAsMTc2LDQsMCwwLDExNSwyLAorICAgIDAsMCw3OCwxMTQsOTAsMCwwLDAsNDEsMSwxMTQsNiwxLDAsMCw0MSwKKyAgICAxLDExNCwxMDMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMTE0LDI0OCwwLDAsMCwxNzYsNCwwLDAsMTE1LDIsCiAgICAgMCwwLDAsMCwyLDEyMiwyOCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCiAgICAgMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksCiAgICAgMTA0LDEwMSwxMTUsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNTksMCwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyNCwyLDAsMTAwLAotICAgIDEsMCwxMDcsOCwwLDExNCwzNywwLDEwMCwxLDAsMTAzLDAsMCwxMDIsMiwKLSAgICAwLDgzLDEyNCwyLDAsMTA2LDEsMCwxMjQsMiwwLDEwNiwyLDAsMTEyLDU1LAotICAgIDAsMTAzLDAsMCwxMDIsMiwwLDgzLDQxLDIsMTIyLDE5Nyw4NCwxMTQsMTIxLDMyLAotICAgIDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsCi0gICAgMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMTEsMTE0LDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTIsMTExLDExNCwxMTYsCi0gICAgMTA1LDExMSwxMTAsMTE1LDQ2LDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDQwLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTA4LDEwNSwxMTUsMTE2LDQ1LDExMSwxMDIsNDUsMTEyLAotICAgIDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsCi0gICAgMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzgsNDEsMywxMTQsMTgyLDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDE1OCwKLSAgICAwLDAsMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsCi0gICAgMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwxMjYsMCwwLDAsMTgyLDQsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsNywxNSwxLDEyLDEsMTAsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLAotICAgIDExNCw5OSw2LDAsMCwwLDAsMCwwLDAsNywwLDAsMCw3LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw0MCwwLDAsMCwxMjQsMSwwLDEyNCwyLAotICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEyNSw2LDAsMTE2LDAsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTAwLDEsMCwxMjQsNiwwLDEwMCwyLDAsMTI0LDQsMCwxMzEsCi0gICAgMiwyLDgzLDQxLDMsNzgsMTE0LDEyOSwwLDAsMCwxMTQsMTU4LDAsMCwwLAotICAgIDQxLDEsMTE0LDE2OSwwLDAsMCw0MSw3LDExNCwxMTAsMCwwLDAsMTE0LDE2NywKLSAgICAwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCw5MCw0LDExNSwKLSAgICAxMDksMTE1LDEwOCwxMTQsMTgxLDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDYsMSwwLAotICAgIDAsMTk0LDQsMCwwLDExNSw2LDAsMCwwLDAsMSwxNSwxLDE4LDEsCi0gICAgMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksMywwLDAsMCwwLDAsMCwwLAotICAgIDE0LDAsMCwwLDE1LDAsMCwwLDY3LDAsMCwwLDExNSwyMzQsMSwwLAotICAgIDAsMTAwLDEsMCwxMjUsMywwLDEyNCwxLDAsMTA2LDAsMCwxMDAsMiwwLAotICAgIDEzMSwxLDAsMTAwLDMsMCwyNSwxMjUsNCwwLDEyMSwzNCwwLDExNiwxLDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDExMiw0OSwwLDExNiwzLDAsMTA2LDQsMCwxMzEsCi0gICAgMCwwLDEzMSwxLDAsMTA2LDUsMCwxMjUsNSwwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDYsMCwxMDcsMTAsMCwxMTQsODUsMCwxLDEsMSwxMDAsMTAsMCwxMjUsCi0gICAgNSwwLDg5LDExMCwxLDAsODgsMTI0LDUsMCwxMjQsMCwwLDEwNiw3LDAsCi0gICAgMTA3LDMsMCwxMTQsMTIwLDAsMTI0LDAsMCwxMDYsOCwwLDEzMSwwLDAsMSwKLSAgICAxMjQsNSwwLDEyNCwwLDAsOTUsNywwLDExNiw5LDAsMTMxLDAsMCwxMTQsCi0gICAgMTUzLDAsMTI0LDAsMCwxMDYsMTAsMCwxMjUsNiwwLDEyNCw0LDAsMTA2LDExLAotICAgIDAsMTMxLDAsMCwxMjUsNywwLDExMCwxNSwwLDEyNCwwLDAsMTA2LDEyLDAsCi0gICAgMTI1LDYsMCwxMjQsNCwwLDEyNSw3LDAsMTI0LDcsMCwxMjQsNiwwLDEwNywKLSAgICA2LDAsMTE0LDQ1LDEsMTE2LDEzLDAsMTI0LDAsMCwxMDYsMiwwLDEyNCw0LAotICAgIDAsMTMxLDIsMCwxMjUsOCwwLDEyMCwxMDAsMCwxMjQsMCwwLDEwNiwxNCwwLAotICAgIDY4LDkzLDc3LDAsOTIsMiwwLDEyNSw5LDAsMTI1LDEwLDAsMTAwLDUsMCwKLSAgICAxMjQsOSwwLDIzLDEyNSwxMSwwLDExNiwxMywwLDEyNCw4LDAsMTI0LDExLDAsCi0gICAgMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTUsMCwxMjQsMTIsMCwxMzEsMSwwLDExNCwKLSAgICAyMDgsMCwxMjQsMCwwLDEwNiwxNiwwLDEyNCwxMCwwLDEyNCwxLDAsMTI0LDEyLAotICAgIDAsMTI0LDgsMCwxMDMsMSwwLDEyNCwyLDAsMTMxLDUsMCw4MywxMTMsMjA4LAotICAgIDAsODcsMTE2LDE3LDAsMTI0LDgsMCwxMzEsMSwwLDEyNSwzLDAsMTIwLDEyMywKLSAgICAwLDEyNCwwLDAsMTA2LDE0LDAsNjgsOTMsMTEyLDAsOTIsMiwwLDEyNSw5LAotICAgIDAsMTI1LDEwLDAsMTE2LDEzLDAsMTI0LDAsMCwxMDYsMiwwLDEyNCw0LDAsCi0gICAgMTI0LDksMCwyMywxMzEsMiwwLDEyNSwxMiwwLDExNiwxOCwwLDEwMCw2LDAsCi0gICAgMTA2LDE5LDAsMTI0LDEyLDAsMTMxLDEsMCwxMDAsNywwLDEwMCwzLDAsMTMxLAotICAgIDEsMSwxLDEyNCw3LDAsMTI0LDksMCwyMywxMjQsNiwwLDEwNyw2LDAsCi0gICAgMTE0LDU1LDEsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsMCwxMTQsNTUsMSwxMjQsCi0gICAgMCwwLDEwNiwxNiwwLDEyNCwxMCwwLDEyNCwxLDAsMTI0LDEyLDAsMTAwLDgsCi0gICAgMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDU1LDEsODcsMTI0LDMsMCwxMTQsCi0gICAgMjMwLDEsMTE2LDE4LDAsMTAwLDksMCwxMDYsMTksMCwxMjQsOCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCwxLDExNiwyMCwwLDEwNiwyMSwwLDEyNCwxLDAsMTAwLDgsCi0gICAgMCwxMzEsMiwwLDEyNSwxMywwLDEyNCw4LDAsMTAzLDEsMCwxMjQsMTMsMCwKLSAgICA5NSwyMiwwLDEyNCwxMywwLDgzLDEwMCw4LDAsODMsNDEsMTEsMTIyLDEwMiw4NCwKLSAgICAxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDExNSwxMTIsMTAxLAotICAgIDk5LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCi0gICAgMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsODIsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMTA5LDk3LDExNiw5OSwxMDQsMTA1LDExMCwxMDMsMzIsMTE1LDExMiwxMDEsOTksNDQsMzIsCi0gICAgMTExLDExNCwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTAyLDMyLDExMCwxMTEsMTE2LDMyLDEwMiwKLSAgICAxMTEsMTE3LDExMCwxMDAsNDYsNzAsMTE0LDYwLDAsMCwwLDExNCw1OCwwLDAsMCwKLSAgICAxMTQsMzEsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMjIsOSwxMTYsMTE0LDEyMSwxMDUsCi0gICAgMTEwLDEwMywzMiwxMjMsMTI1LDExNCwxMDAsMCwwLDAsNzgsMTIyLDI1LDExMiwxMTEsMTE1LAotICAgIDExNSwxMDUsOTgsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwKLSAgICAxMDIsMTExLDExNCwzMiwxMjMsMTI1LDExNCw4OSwwLDAsMCw0MSwyMywxMTQsMzQsMCwKLSAgICAwLDAsMTE0LDQxLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMywwLDAsCi0gICAgMCwxMTQsNDcsMCwwLDAsMTE0LDIyMCwwLDAsMCwxMTQsNDIsMCwwLDAsCi0gICAgMTE0LDksMSwwLDAsMjE4LDExLDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwKLSAgICAxMDQsMTAxLDExNCw3LDAsMCwwLDExNCwxMiwxLDAsMCwxMTQsOTAsMCwwLAotICAgIDAsMTE0LDExLDEsMCwwLDExNCwzMCwwLDAsMCwxMTQsOCwxLDAsMCwKLSAgICAxMTQsNDYsMCwwLDAsMTE0LDYsMSwwLDAsMTE0LDQ4LDAsMCwwLDExNCwKLSAgICAxMDcsMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE2MiwKLSAgICAwLDAsMCwxMTQsMTU4LDAsMCwwLDQxLDE0LDExNCwxMTAsMCwwLDAsMTE0LAotICAgIDEyOCwwLDAsMCwxMTQsMTgxLDAsMCwwLDkwLDEyLDEwNSwxMTUsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTAsMTEsMTE2LDk3LDEwNSwxMDgsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDEzNSwwLDAsMCw5MCw1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgOTAsMTIsOTksOTcsOTksMTA0LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCw5LAotICAgIDk4LDk3LDExNSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDIyNiwwLDAsMCwxMTQsMTY3LAotICAgIDAsMCwwLDkwLDEzLDEwNSwxMTAsMTA1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsOSwxMDIsMTE3LDEwOCwxMDgsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2NiwwLAorICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDEyNCwxLDEzMSwxLDEyNSwyLDEyNCwyLDEwMCwxLDEwNyw4LDExNCwyNiwxMDAsCisgICAgMSwxMDMsMCwxMDIsMiw4MywwLDEyNCwyLDEwNiwxLDEyNCwyLDEwNiwyLDExMiwKKyAgICAzOCwxMDMsMCwxMDIsMiw4MywwLDQxLDIsMTIyLDE5Nyw4NCwxMTQsMTIxLDMyLDExNiwKKyAgICAxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsCisgICAgMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLAorICAgIDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTIsMTExLDExNCwxMTYsMTA1LAorICAgIDExMSwxMTAsMTE1LDQ2LDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDQwLDEwOCwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTA4LDEwNSwxMTUsMTE2LDQ1LDExMSwxMDIsNDUsMTEyLDExMSwKKyAgICAxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LAorICAgIDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LAorICAgIDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LDExMCwKKyAgICAxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgNzgsNDEsMywxMTQsMTc3LDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE1MywwLAorICAgIDAsMCw0MSwzLDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsMTYxLAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCisgICAgMCwwLDExNCwxMjAsMCwwLDAsMTgyLDQsMCwwLDExNSw4LDAsMCwwLAorICAgIDAsNywxMCwxLDgsMSw4LDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgOTksNiwwLDAsMCwwLDAsMCwwLDcsMCwwLDAsNywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMzAsMCwwLDAsMTI0LDEsMTI0LDIsMTI0LDMsCisgICAgMTMxLDIsMTI1LDYsMTE2LDAsMTI0LDIsMTI0LDMsMTAwLDEsMTI0LDYsMTAwLDIsCisgICAgMTI0LDQsMTQ0LDIsMTMxLDIsODMsMCw0MSwzLDc4LDExNCwxMjMsMCwwLDAsCisgICAgMTE0LDE1MywwLDAsMCw0MSwxLDExNCwxNjQsMCwwLDAsNDEsNywxMTQsMTAzLAorICAgIDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsMzcsMCwKKyAgICAwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LDE3NiwwLDAsMCwxMTQsMTIzLDAsCiAgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwxODIsMCwwLDAsMTk5LDQsMCwwLDExNSw2OCwwLDAsMCwwLAotICAgIDMsNiwxLDE5LDEsMywxLDM0LDEsMTMsMSwxMSwxLDE1LDEsMTAsCi0gICAgMSw5LDIsOSwxLDksMSwxNSwyLDksMSw2LDIsMTIsMSwxOCwKLSAgICAxLDIyLDEsMTAsMSwxNSwxLDEyLDEsMzIsNCwxMiwyLDIyLDEsMjIsCi0gICAgMSwyNSwxLDE2LDEsMTIsMSwyOSwxLDYsMSwxOSwxLDE4LDEsMTIsCi0gICAgMSw0LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCw5LDAsMCwwLDEzLDAsMCwwLDY3LDAsMCwwLDExNSwxMSwKLSAgICAxLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMjEsMzEsMCwxMTYsCi0gICAgMSwwLDEwNiwyLDAsMTI0LDEsMCwxMTIsMzMsMCwxMTYsMSwwLDEwNiwzLAotICAgIDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwyLDAsODcsMTEwLDMzLDAsNCwxMTYsCi0gICAgNCwwLDExNiw1LDAsMTE2LDYsMCwxMDIsMywwLDEwNywxMCwwLDExNCw3NSwKLSAgICAwLDEsMSwxLDEwMywwLDAsMTI1LDIsMCw4OSwxMTAsMSwwLDg4LDExNiwKLSAgICA3LDAsMTA2LDgsMCwxMDYsOSwwLDEwMCwxLDAsMTMxLDEsMCwxMTUsMTEyLAotICAgIDAsMTE2LDEwLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCwwLDAsOTUsMTEsMCwKLSAgICAxMTAsMTExLDAsMTE2LDEwLDAsMTMxLDAsMCwxMjUsMywwLDEyMCw5MCwwLDEyNCwKLSAgICAyLDAsNjgsOTMsODIsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LDEyLDAsMTAwLAotICAgIDIsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNSwwLDEyNSw2LDAsMTI1LDcsCi0gICAgMCwxMjQsNiwwLDExNCwxOTEsMCwxMDAsMywwLDEwNiwxMywwLDEyNCw1LDAsCi0gICAgMTI0LDcsMCwxMDYsMTQsMCwxMzEsMCwwLDEzMSwyLDAsMTI1LDgsMCwxMTAsCi0gICAgNiwwLDEyNCw1LDAsMTI1LDgsMCwxMjQsMywwLDEwNiwxNSwwLDEyNCw4LAotICAgIDAsMTMxLDEsMCwxLDExMywxMjgsMCw4NywxMjQsMywwLDEyNCwwLDAsOTUsCi0gICAgMTEsMCwxMTYsNywwLDEwNiw4LDAsMTA2LDksMCwxMTYsMTYsMCwxMzEsMSwKLSAgICAwLDExNCw3LDEsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsMTI0LDIsMCwKLSAgICA2OCwxMzEsMSwwLDEyNCwwLDAsOTUsMTcsMCwxMDAsNiwwLDgzLDQxLDcsCi0gICAgMTIyLDY4LDcwLDEwNSwxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgMzIsMTExLDEwMiwzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLAotICAgIDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMCwxMDUsMTE0LDEwMSwKLSAgICA5OSwxMTYsMTExLDExNCwxMjEsNDYsMTE0LDAsMCwwLDAsMTE0LDYwLDAsMCwwLAotICAgIDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwzLDAsMCwwLDgzLDAsMCwwLDExNSwyOCwwLDAsCi0gICAgMCwxMDQsMCwwLDEyNCwwLDAsOTMsMTgsMCwxMjUsMSwwLDEyNCwxLDAsCi0gICAgMTA2LDAsMCwxMzEsMCwwLDE0NiwyLDAsMTEzLDYsMCw4MywxMTQsNCwwLAotICAgIDAsMCw0MSwxLDExNCw5MCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsMCwKLSAgICA5MCwyLDEwMiwxMTAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMjUwLDksNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsNjIsMTcsNSwKLSAgICAwLDAsMTE1LDIsMCwwLDAsOSwwLDEyMiw0MSw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMTUsMTAxLDExNiw5OSwKLSAgICAxMTEsMTA5LDExMiw2Miw3OCw0MSwxOCwxMTQsMzcsMCwwLDAsMTE0LDMsMCwwLAotICAgIDAsOTAsNywxMDgsMTA1LDExNSwxMTYsMTAwLDEwNSwxMTQsMTE0LDQ3LDAsMCwwLDExNCwKLSAgICAxLDEsMCwwLDIxOCwxNSw4MCwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTExLDExMCwKLSAgICA2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDE4LDc4LDExMSwxMTYsNjUsNjgsMTA1LDExNCwxMDEsOTksCi0gICAgMTE2LDExMSwxMTQsMTIxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsOCwwLDAsMCwxMTQsOSwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDEsMCwwLDExNCwxMSwxLAotICAgIDAsMCwxMTQsODUsMCwwLDAsMTE0LDQ5LDAsMCwwLDExNCw5MCwwLDAsCi0gICAgMCwyMTgsMyw5NywxMDAsMTAwLDExNCwxMSwwLDAsMCwxMTQsMTIsMSwwLDAsCi0gICAgNDEsOSwxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsMCw5MCw4LDk5LDExMSwKLSAgICAxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSw5MCwyMSwxMDgsMTExLDExOSwxMDEsMTE0LDk1LDExNSwxMTcsCi0gICAgMTAyLDEwMiwxMDUsMTIwLDk1LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwxMTQsMjQ2LDAsCi0gICAgMCwwLDExNCwxMDgsMCwwLDAsMTE0LDIzOCwwLDAsMCwxMTQsMjI2LDAsMCwKLSAgICAwLDkwLDgsMTEwLDEwMSwxMTksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE0LDEsMCwwLDI0NCwKLSAgICA0LDAsMCwxMTUsMzQsMCwwLDAsMCwyLDksMSwzLDEsMzEsMSwKLSAgICAyMiwzLDExLDMsMTgsMSwxOCw3LDksMSwxMywxLDI0LDEsNiwxLAotICAgIDI3LDIsNiwxLDE3LDEsOSwxLDE4LDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLAotICAgIDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LAotICAgIDEwNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMywKLSAgICAwLDAsMCw3LDAsMCwwLDExNSwyNSwwLDAsMCwxMzUsMCwwLDEzNSwKLSAgICAxLDAsMTAyLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTM0LDAsMCwxMjUsMiwKLSAgICAwLDEyNCwyLDAsODMsNDEsMyw5NywyMCwxLDAsMCw2NSwzMiw5OSwxMDgsCi0gICAgOTcsMTE1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsCi0gICAgMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDk5LDEwOCwxMTEsMTE1LDExNywKLSAgICAxMTQsMTAxLDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSwKLSAgICA0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMTQsMTAxLAotICAgIDExNiwxMTcsMTE0LDExMCwzMiw5NywxMTAsMzIsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsCi0gICAgMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsCi0gICAgMTAyLDEwNSwxMDEsMTAwLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDMyLDk3LDExMCwxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDk5LDk3LAotICAgIDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwOCwxMTEsMTE1LAotICAgIDExNywxMTQsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsMTAwLDEwNSwxMTQsCi0gICAgMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw0NCwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwKLSAgICAxMTQsMTExLDExNCwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwKLSAgICA5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsNCwwLDAsCi0gICAgMCwxOSwwLDAsMCwxMTUsNDMsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsMTE1LDMwLDAsMTE2LDEsMCwxMDAsMSwwLDEwMCwyLDAsMTI0LAotICAgIDAsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwwLDEzNiwxLAotICAgIDAsMTQwLDEsMCw4Myw0MSwzLDEyMiw0NSw4MCw5NywxMTYsMTA0LDMyLDEwNCwxMTEsCi0gICAgMTExLDEwNywzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LAotICAgIDQ2LDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSw0Niw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEyMiwzMCwxMTEsMTEwLDEwOCwxMjEsMzIsMTAwLDEwNSwxMTQsCi0gICAgMTAxLDk5LDExNiwxMTEsMTE0LDEwNSwxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTE1LDExNywxMTIsCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LDQ4LDAsCi0gICAgMCwwLDExNCwxMDksMCwwLDAsNDEsMSwxMTQsMzcsMCwwLDAsNDEsMiwKLSAgICAxMTQsMTcyLDAsMCwwLDExNCwxMywxLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwyMTgsMjQsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk1LAotICAgIDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMjksNSwKLSAgICAwLDAsMTE1LDYsMCwwLDAsMCwyLDEyLDEsMTgsMSwxMjIsNTQsNzAsCi0gICAgMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsCi0gICAgMTExLDExMSwxMDcsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDExMiw5NywxMTYsCi0gICAgMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5NSwxMDIsMTExLDExNCw5NSw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDQxLDMsMTE0LDE3MiwwLDAsCi0gICAgMCwxMTQsMTMsMSwwLDAsMTE0LDE5LDEsMCwwLDExNCw0LDAsMCwwLAotICAgIDQxLDIsMTE0LDE3MiwwLDAsMCwxMTQsMTMsMSwwLDAsMTE0LDYsMCwwLAotICAgIDAsMjE4LDksMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDE5LDUsMCwwLAotICAgIDExNSw0LDAsMCwwLDAsMTAsMjEsNiwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTksCi0gICAgMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDE2LDcwLDEwNSwKLSAgICAxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDAsMTIzLDMzLDExNCwxMjUsNDEsNDEsMiwKLSAgICAxMTQsNDksMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAxMTQsMjQ1LDAsMCwwLDM3LDUsMCwwLDExNSwyLDAsMCwwLDAsMSwKLSAgICAxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMTQsCi0gICAgMTAxLDExMiwxMTQsOTUsOTUsNDEsMTUsMTE0LDExNCwwLDAsMCwxMTQsMTEzLDAsMCwKLSAgICAwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsMTg2LDAsMCwwLAotICAgIDExNCwyNTEsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTgzLDAsMCwwLDExNCwKLSAgICAxMjYsMCwwLDAsMTE0LDYsMSwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsMTQsCi0gICAgMSwwLDAsMTE0LDE4NCwwLDAsMCwxMTQsMjAsMSwwLDAsMTE0LDI0NSwwLAorICAgIDAsMTE0LDMsMSwwLDAsMTk0LDQsMCwwLDExNSw2LDAsMCwwLDAsCisgICAgMSwxMCwxLDEyLDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksMywwLDAsCisgICAgMCwwLDAsMCwwLDE0LDAsMCwwLDE1LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwxMDAsMSwwLDAsMTAwLDEsMTI1LDMsMTI0LDEsMTA2LDAsMTAwLDIsCisgICAgMTMxLDEsMTAwLDMsMjUsMCwxMjUsNCwxMjEsMjQsMTE2LDEsMTI0LDAsMTA2LDIsCisgICAgMTEyLDM0LDExNiwzLDEwNiw0LDEzMSwwLDEzMSwxLDEwNiw1LDEyNSw1LDg3LDAsCisgICAgMTEwLDI0LDQsMCwxMTYsNiwxMDcsMTAsMTE0LDY2LDEsMCwxLDAsMSwwLAorICAgIDEwMCwxMCwxMjUsNSw4OSwwLDExMCwyLDg4LDAsMTI0LDUsMTI0LDAsMTA2LDcsCisgICAgMTA3LDMsMTE0LDkyLDEyNCwwLDEwNiw4LDEzMSwwLDEsMCwxMjQsNSwxMjQsMCwKKyAgICA5NSw3LDExNiw5LDEzMSwwLDExNCwxMTQsMTI0LDAsMTA2LDEwLDEyNSw2LDEyNCw0LAorICAgIDEwNiwxMSwxMzEsMCwxMjUsNywxMTAsMTAsMTI0LDAsMTA2LDEyLDEyNSw2LDEyNCw0LAorICAgIDEyNSw3LDEyNCw3LDEyNCw2LDEwNyw2LDExNCwyMTgsMTE2LDEzLDEyNCwwLDEwNiwyLAorICAgIDEyNCw0LDEzMSwyLDEyNSw4LDEyMCw3MiwxMjQsMCwxMDYsMTQsNjgsMCw5Myw1NCwKKyAgICA5MiwyLDEyNSw5LDEyNSwxMCwxMDAsNSwxMjQsOSwyMywwLDEyNSwxMSwxMTYsMTMsCisgICAgMTI0LDgsMTI0LDExLDEzMSwyLDEyNSwxMiwxMTYsMTUsMTI0LDEyLDEzMSwxLDExNCwxNTIsCisgICAgMTI0LDAsMTA2LDE2LDEyNCwxMCwxMjQsMSwxMjQsMTIsMTI0LDgsMTAzLDEsMTI0LDIsCisgICAgMTMxLDUsODMsMCwxMTMsMTUyLDg3LDAsMTE2LDE3LDEyNCw4LDEzMSwxLDEyNSwzLAorICAgIDEyMCw5MCwxMjQsMCwxMDYsMTQsNjgsMCw5Myw4MCw5MiwyLDEyNSw5LDEyNSwxMCwKKyAgICAxMTYsMTMsMTI0LDAsMTA2LDIsMTI0LDQsMTI0LDksMjMsMCwxMzEsMiwxMjUsMTIsCisgICAgMTE2LDE4LDEwNiwxOSwxMDAsNiwxMjQsMTIsMTAwLDcsMTAwLDMsMTQ0LDEsMTMxLDIsCisgICAgMSwwLDEyNCw3LDEyNCw5LDIzLDAsMTI0LDYsMTA3LDYsMTE0LDIyNiwxMTYsMTUsCisgICAgMTI0LDEyLDEzMSwxLDExNCwyMjYsMTI0LDAsMTA2LDE2LDEyNCwxMCwxMjQsMSwxMjQsMTIsCisgICAgMTAwLDgsMTI0LDIsMTMxLDUsODMsMCwxMTMsMjI2LDg3LDAsMTI0LDMsMTQ0LDEsCisgICAgMTE0LDk2LDExNiwxOCwxMDYsMTksMTAwLDksMTI0LDgsMTMxLDIsMSwwLDExNiwxOCwKKyAgICAxMDYsMjAsMTI0LDEsMTAwLDgsMTMxLDIsMTI1LDEzLDEyNCw4LDEwMywxLDEyNCwxMywKKyAgICA5NSwyMSwxMjQsMTMsODMsMCwxMDAsOCw4MywwLDQxLDExLDEyMiwxMTEsODQsMTE0LAorICAgIDEyMSwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwKKyAgICAxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwOSw5NywxMTYsOTksMTA0LDEwNSwxMTAsMTAzLDMyLDExNSwxMTIsMTAxLDk5LDQ0LDMyLDExMSwKKyAgICAxMTQsMzIsNzgsMTExLDExMCwxMDEsMzIsMTA1LDEwMiwzMiwxMTAsMTExLDExNiwzMiwxMDIsMTExLAorICAgIDExNywxMTAsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDcwLDExNCw2MSwKKyAgICAwLDAsMCwxMTQsNTksMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwxODEsMCwKKyAgICAwLDAsMTIyLDksMTE2LDExNCwxMjEsMTA1LDExMCwxMDMsMzIsMTIzLDEyNSw5MCw5LDExOCwKKyAgICAxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwxMjEsNzgsMTIyLDI1LDExMiwxMTEsMTE1LDExNSwxMDUsCisgICAgOTgsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMjMsMTI1LDExNCw5MCwwLDAsMCw0MSwyMiwxMTQsMzQsMCwwLDAsCisgICAgMTE0LDQxLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMywwLDAsMCwxMTQsCisgICAgNDcsMCwwLDAsMTE0LDIxNSwwLDAsMCwxMTQsNDIsMCwwLDAsMTE0LDYsCisgICAgMSwwLDAsMjE4LDExLDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLAorICAgIDExNCw3LDAsMCwwLDExNCw5LDEsMCwwLDExNCw5MSwwLDAsMCwxMTQsCisgICAgOCwxLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDUsMSwwLDAsMTE0LDQ2LAorICAgIDAsMCwwLDExNCwzLDEsMCwwLDExNCw0OCwwLDAsMCwxMTQsMTE3LDAsCisgICAgMCwwLDExNCwxMzIsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTUzLDAsMCwKKyAgICAwLDQxLDE0LDExNCwxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsMTc2LDAsCisgICAgMCwwLDkwLDEyLDEwNSwxMTUsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCisgICAgOTAsMTEsMTE2LDk3LDEwNSwxMDgsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDEyOSwwLAorICAgIDAsMCw5MCw1LDk5LDk3LDk5LDEwNCwxMDEsOTAsMTIsOTksOTcsOTksMTA0LDEwMSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCw5LDk4LDk3LDExNSwxMDEsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsMTE0LDIyMSwwLDAsMCwxMTQsMTYyLDAsMCwwLDkwLDEzLDEwNSwxMTAsCisgICAgMTA1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsOSwxMDIsMTE3LDEwOCwKKyAgICAxMDgsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTc3LDAsMCwwLDE5OSwKKyAgICA0LDAsMCwxMTUsNzAsMCwwLDAsMCw1LDQsMSwxNCwxLDIsMSwKKyAgICAyNCwxLDE0LDEsMTAsMSwxMCwxLDgsMSw2LDIsNiwxLDYsMSwKKyAgICAxMCwyLDYsMSw0LDIsOCwxLDEyLDEsMTYsMSw4LDEsMTAsMSwKKyAgICA4LDEsMjQsNCw4LDIsMTYsMSwxNiwxLDE4LDEsMTIsMSw4LDEsCisgICAgMTAsMSwxMiwxLDYsMSwxMiwxLDEyLDEsOCwxLDQsMSwxMjIsMjAsCisgICAgNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgMTE1LDExMiwxMDEsOTksOTksMSwwLDAsMCwwLDAsMCwwLDksMCwwLAorICAgIDAsMTMsMCwwLDAsNjcsMCwwLDAsMTE1LDE5NCwwLDAsMCwxMjQsMCwKKyAgICAxMDYsMCwxMjUsMSwxMjEsMjIsMTE2LDEsMTA2LDIsMTI0LDEsMTEyLDIyLDExNiwxLAorICAgIDEwNiwzLDEzMSwwLDEzMSwxLDEyNSwyLDg3LDAsMTEwLDMwLDQsMCwxMTYsNCwKKyAgICAxMTYsNSwxMTYsNiwxMDIsMywxMDcsMTAsMTE0LDU4LDEsMCwxLDAsMSwwLAorICAgIDEwMywwLDEyNSwyLDg5LDAsMTEwLDIsODgsMCwxMTYsNywxMDYsOCwxMDYsOSwKKyAgICAxMDAsMSwxMzEsMSwxMTUsODQsMTE2LDEwLDEyNCwyLDEzMSwxLDEyNCwwLDk1LDExLAorICAgIDExMCw3OCwxMTYsMTAsMTMxLDAsMTI1LDMsMTIwLDY0LDEyNCwyLDY4LDAsOTMsNTYsCisgICAgMTI1LDQsMTI0LDQsMTA2LDEyLDEwMCwyLDEzMSwxLDkyLDMsMTI1LDUsMTI1LDYsCisgICAgMTI1LDcsMTI0LDYsMTE0LDEzOCwxMDAsMywxMDYsMTMsMTI0LDUsMTI0LDcsMTA2LDE0LAorICAgIDEzMSwwLDEzMSwyLDEyNSw4LDExMCw0LDEyNCw1LDEyNSw4LDEyNCwzLDEwNiwxNSwKKyAgICAxMjQsOCwxMzEsMSwxLDAsMTEzLDk2LDg3LDAsMTI0LDMsMTI0LDAsOTUsMTEsCisgICAgMTE2LDcsMTA2LDgsMTA2LDksMTE2LDE2LDEzMSwxLDExNCwxOTAsMTAwLDQsMTAwLDUsCisgICAgMTMyLDAsMTI0LDIsNjgsMCwxMzEsMSwxMjQsMCw5NSwxNywxMDAsNiw4MywwLAorICAgIDQxLDcsMTIyLDY4LDcwLDEwNSwxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LAorICAgIDEwNCwxMDEsMzIsMTExLDEwMiwzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMCwxMDUsCisgICAgMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDYsMTE0LDAsMCwwLDAsMTE0LDYxLDAsCisgICAgMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwzLDAsMCwwLDgzLDAsMCwwLDExNSwyMCwKKyAgICAwLDAsMCwxMDQsMCwxMjQsMCw5MywxMiwxMjUsMSwxMjQsMSwxMDYsMCwxMzEsCisgICAgMCwxNDYsMiwxMTMsNCw4MywwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDkxLAorICAgIDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLDkwLDIsMTAyLDExMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyNTAsOSw2MCwKKyAgICAxMTUsMTAxLDExNiw5OSwxMTEsMTA5LDExMiw2MiwyMCw1LDAsMCwxMTUsMiwwLDAsCisgICAgMCw2LDAsMTIyLDQxLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCisgICAgOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsNjAsMTA4LDExMSw5OSwKKyAgICA5NywxMDgsMTE1LDYyLDQ2LDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDc4LDQxLAorICAgIDE4LDExNCwzNywwLDAsMCwxMTQsMywwLDAsMCw5MCw3LDEwOCwxMDUsMTE1LAorICAgIDExNiwxMDAsMTA1LDExNCwxMTQsNDcsMCwwLDAsMTE0LDI1NCwwLDAsMCwyMTgsMTUsCisgICAgODAsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsNjksMTE0LDExNCwxMTEsMTE0LDIxOCwKKyAgICAxOCw3OCwxMTEsMTE2LDY1LDY4LDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw2OSwxMTQsCisgICAgMTE0LDExMSwxMTQsMTE0LDgsMCwwLDAsMTE0LDksMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCw3LDEsMCwwLDExNCw4LDEsMCwwLDExNCw4NiwwLDAsCisgICAgMCwxMTQsNTAsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwzLDk3LDEwMCwxMDAsCisgICAgMTE0LDExLDAsMCwwLDExNCw5LDEsMCwwLDQxLDksMTE0LDEwMywwLDAsCisgICAgMCwxMTQsMzcsMCwwLDAsOTAsOCw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsCisgICAgOTAsMjEsMTA4LDExMSwxMTksMTAxLDExNCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCw5NSw5OSwKKyAgICAxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsMTE0LDI0MywwLDAsMCwxMTQsMTAxLDAsMCwKKyAgICAwLDExNCwyMzMsMCwwLDAsMTE0LDIyMSwwLDAsMCw5MCw4LDExMCwxMDEsMTE5LAorICAgIDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxMSwxLDAsMCwyNDcsNCwwLDAsMTE1LDM0LDAsCisgICAgMCwwLDAsMiw2LDEsMiwxLDIyLDEsMjAsMywxMCwzLDEyLDEsCisgICAgMTIsNyw2LDEsMTAsMSwxNiwxLDQsMSwxOCwyLDQsMSwxNCwxLAorICAgIDYsMSwxMiwxLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNywwLDAsCisgICAgMCwxMTUsMTgsMCwwLDAsMTM1LDAsMTM1LDEsMTAyLDIsMTAwLDEsMTAwLDIsCisgICAgMTMyLDgsMTI1LDIsMTI0LDIsODMsMCw0MSwzLDk3LDIwLDEsMCwwLDY1LAorICAgIDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsCisgICAgMTA1LDk5LDEwNCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsOTksMTA4LAorICAgIDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTEsMTEwLDMyLAorICAgIDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDEwNSwxMDgsMTA4LAorICAgIDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNSwxMTYsOTcsCisgICAgMTEwLDk5LDEwMSwzMiwxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsCisgICAgMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMzIsCisgICAgOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwxMTcsMTE0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCisgICAgMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksCisgICAgMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwKKyAgICAxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDQ0LDMyLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKyAgICA0LDAsMCwwLDE5LDAsMCwwLDExNSwzMiwwLDAsMCwxMTYsMCwxMjQsCisgICAgMCwxMzEsMSwxMTUsMjIsMTE2LDEsMTAwLDEsMTAwLDIsMTI0LDAsMTQ0LDEsMTMxLAorICAgIDEsMTMwLDEsMTM2LDAsMTI0LDAsMTM2LDEsMTQwLDEsODMsMCw0MSwzLDEyMiwKKyAgICA0NSw4MCw5NywxMTYsMTA0LDMyLDEwNCwxMTEsMTExLDEwNywzMiwxMDIsMTExLDExNCwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsCisgICAgMTE0LDEyMSw0Niw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEyMiwzMCwKKyAgICAxMTEsMTEwLDEwOCwxMjEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEwNSwxMDEsMTE1LAorICAgIDMyLDk3LDExNCwxMDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMTE0LDM3LAorICAgIDAsMCwwLDQxLDIsMTE0LDQ4LDAsMCwwLDExNCwxMDIsMCwwLDAsNDEsCisgICAgMSwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsMTY3LDAsMCwwLDExNCwxMCwxLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMjQsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk1LDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLAorICAgIDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsNSwwLDAsMTE1LDYsMCwwLDAsMCwKKyAgICAyLDgsMSwxNCwxLDEyMiw1NCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw0Niw2MCwxMDgsMTExLDk5LAorICAgIDk3LDEwOCwxMTUsNjIsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk1LDEwMiwKKyAgICAxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsMCwKKyAgICAwLDAsNDEsMywxMTQsMTY3LDAsMCwwLDExNCwxMCwxLDAsMCwxMTQsMTYsCisgICAgMSwwLDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTY3LDAsMCwwLDExNCwKKyAgICAxMCwxLDAsMCwxMTQsNiwwLDAsMCwyMTgsOSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDQsMTExLDExMSwxMDcsMjIsNSwwLDAsMTE1LDQsMCwwLDAsMCwxMCwxNCwKKyAgICA2LDEyMiwyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDExMiw5NywKKyAgICAxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMiwwLDAsCisgICAgMCwxMDAsMSwxMDYsMCwxMjQsMCwxMDYsMSwxMzEsMSw4MywwLDQxLDIsNzgsCisgICAgMTIyLDE2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDAsMTIzLDMzLDExNCwKKyAgICAxMjUsNDEsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEsCisgICAgMTE0LDEwMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwxMTQsMjQyLDAsMCwwLDQwLDUsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICA0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNDEsMSw3OCw0MSwxNSwxMTQsMTA4LAorICAgIDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTEwLDAsCisgICAgMCwwLDExNCwxODEsMCwwLDAsMTE0LDI0OCwwLDAsMCwxMTQsMTI2LDAsMCwKKyAgICAwLDExNCwxNzgsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMywxLDAsMCwKKyAgICAxMTQsMTc3LDAsMCwwLDExNCwxMSwxLDAsMCwxMTQsMTc5LDAsMCwwLDExNCwKKyAgICAxNywxLDAsMCwxMTQsMjQyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCw0LDEsCisgICAgMCwwLDE1Myw0LDAsMCwxMTUsMjAsMCwwLDAsOCw3LDQsMiw4LAorICAgIDE0LDgsNCw0LDIsOCwxMiw4LDUsMTAsNDgsOCwzMSwxMiwxOCwxMTQsCisgICAgNCwxLDAsMCw5OSw0LDAsMCwwLDAsMCwwLDAsNiwwLDAsCisgICAgMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsMTQ4LDAsMCwwLDEyNCwwLAorICAgIDEwNiwwLDEwMCwxLDEzMSwxLDEyNSw0LDEyNCwwLDEwNiwwLDEwMCwyLDEzMSwxLAorICAgIDEyNSw1LDEyNCw0LDExNSw2NiwxMjQsNSwxMTQsMzYsMTI0LDUsMTA2LDEsMTI1LDQsCisgICAgMTEwLDMwLDEyNCwyLDEyNCwzLDEwNywyLDExNCw1NiwxMTYsMiwxMjQsMSwxMjQsMiwKKyAgICAxMzEsMiwxMjUsNCwxMTAsMTAsMTE2LDMsMTI0LDEsMTI0LDIsMTMxLDIsMTI1LDQsCisgICAgMTI0LDUsMTE1LDg2LDExNiw0LDEyNCwxLDEyNCwyLDEwMCwzLDEyNCw0LDE0NCwxLAorICAgIDEzMSwyLDEyNSw1LDEyMSwzNiwxMjQsNSwxMjQsMCwxMDAsMiw2MCwwLDEyNCw0LAorICAgIDEyNCwwLDEwMCwxLDYwLDAsMTI0LDIsMTI0LDAsMTAwLDQsNjAsMCwxMjQsMywKKyAgICAxMjQsMCwxMDAsNSw2MCwwLDg3LDAsMTEwLDIwLDQsMCwxMTYsNSwxMDcsMTAsCisgICAgMTE0LDE0MiwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTAwLDAsCisgICAgODMsMCw0MSw2LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LAorICAgIDk1LDIxOCw4LDk1LDk1LDExNSwxMTIsMTAxLDk5LDk1LDk1LDExNCwxMjMsMCwwLDAsCisgICAgOTAsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsOTAsMTAsOTUsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSwxMDAsOTUsOTUsNDEsNiwyMTgsMywxMDMsMTAxLDExNiwxMTQsMTIzLDAsCisgICAgMCwwLDExNCwyMTksMCwwLDAsMTE0LDIxNCwwLDAsMCwxMTQsMTY0LDAsMCwKKyAgICAwLDIxOCw5LDY5LDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCw0MSw2LDkwLDIsCisgICAgMTEwLDExNSwxMTQsMTAxLDAsMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwKKyAgICAxMDEsOTAsOSw5OSwxMTIsOTcsMTE2LDEwNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTIzLDAsMCwKKyAgICAwLDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMjE4LDE0LDk1LDEwMiwxMDUsMTIwLDk1LDExNywxMTIsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsNSwwLDAsMTE1LDM0LDAsMCwwLDAsMiwKKyAgICAxMCwxLDEwLDEsNCwxLDQsMSw4LDEsOCwxLDEyLDIsMTAsMSwKKyAgICA0LDEsMTYsMSwyLDEsOCwxLDgsMSw4LDEsMTIsMSwxNCwyLAorICAgIDExNCwyMiwxLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwxMTYsCisgICAgMCwxMTYsMSwxMDYsMiwxMzEsMCwxMDIsMiwxMjUsMCwxMTYsMywxMTYsNCwxMDIsCisgICAgMiwxMjUsMSwxMTYsNSwxMTYsNiwxMDIsMiwxMjUsMiwxMjQsMCwxMjQsMSwxMjQsCisgICAgMiwxMDMsMyw4MywwLDQxLDEsMTIyLDk1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LAorICAgIDMyLDk3LDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSw0NSwKKyAgICA5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2OSw5Nyw5OSwxMDQsMzIsCisgICAgMTA1LDExNiwxMDEsMTA5LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE2LDExNywxMTIsMTA4LDEwMSwzMiwKKyAgICA0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwKKyAgICAxMTUsNDEsNDYsMTAsMzIsMzIsMzIsMzIsNDEsNywxMTQsMjIwLDAsMCwwLDExNCwKKyAgICAxNDIsMCwwLDAsMjE4LDE4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDk1LAorICAgIDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMTE0LDIxNCwwLDAsMCwxMTQsODcsMCwKKyAgICAwLDAsMTE0LDIxOSwwLDAsMCwxMTQsNzcsMCwwLDAsNDEsMyw5MCwxMCwKKyAgICAxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwxMTUsOTAsNiwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDkwLDgsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE1OCwwLDAsMCwKKyAgICA2OSw1LDAsMCwxMTUsOCwwLDAsMCwwLDUsMTIsMSw4LDEsOCwKKyAgICAxLDExNCwxNTgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEyLAorICAgIDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwxODgsMSwwLDAsCisgICAgMTI0LDAsOTcsMCwxMTYsMCwxMDYsMSw5NywxLDExNiwwLDEwNiwyLDk3LDIsCisgICAgMTE2LDEsMTA2LDMsMTE2LDQsMjUsMCwxMjUsMSwxMjAsNTYsMTAwLDI2LDY4LDAsCisgICAgOTMsNDgsMTI1LDIsMTI0LDIsMTE2LDEsMTA2LDMsMTA3LDcsMTE0LDU4LDExNiwwLAorICAgIDEwNiw1LDEyNCwyLDEzMSwxLDEyNSwzLDExMCwxMCwxMTYsMSwxMDYsMywxMjQsMiwKKyAgICAyNSwwLDEyNSwzLDExNiw2LDEyNCwxLDEyNCwyLDEyNCwzLDEzMSwzLDEsMCwKKyAgICAxMTMsMzIsODcsMCwxMDAsNSwxMDAsNiwxMDMsMSwxMDIsMiwxMDAsNywxMDAsOCwKKyAgICAxMDAsNiwxMDMsMiwxMDIsMiwxMDIsMiwxMjUsNCwxMjAsMTE4LDEyNCw0LDY4LDAsCisgICAgOTMsMTAyLDkyLDIsMTI1LDUsMTI1LDYsMTE2LDcsMTAwLDksMTAwLDEwLDEzMiwwLAorICAgIDEyNCw2LDY4LDAsMTMxLDEsMTMxLDEsMTE1LDE0MiwxMTYsOCwxMzAsMSwxMjQsNiwKKyAgICAxMDAsMTEsMjUsMCwxMjUsNywxMjQsNSwxMTYsMSwxMDYsMywxMDcsNiwxMTQsMTc0LAorICAgIDExNiwxLDEwNiwzLDEyNCw1LDI1LDAsMTI1LDgsODAsMCwxMTMsMTEyLDEyMSwxNiwKKyAgICAxMTYsMCwxMDYsNSwxMjQsNSwxMzEsMSwxMjUsOCw4MCwwLDg3LDAsMTEzLDExMiwKKyAgICA0LDAsMTE2LDksMTA3LDEwLDExNCwyMTIsMSwwLDEsMCwxLDAsMTE5LDExMiwKKyAgICA4OSwwLDExMywxMTIsODgsMCwxMTMsMTEyLDg3LDAsMTE2LDksMTAwLDEyLDEzMSwxLAorICAgIDEzMCwxLDExNiw2LDEyNCwxLDEwMCwxMywxMjQsOCwxMzEsMywxLDAsMTE2LDYsCisgICAgMTI0LDEsMTAwLDE0LDEyNCw3LDEzMSwzLDEsMCwxMTYsNiwxMjQsMSwxMDAsMTUsCisgICAgMTAwLDE2LDEwNiwxMCwxMjQsNiwxMzEsMSwxMzEsMywxLDAsMTIxLDE0LDExNiwwLAorICAgIDEwNiw1LDEwMCwxNywxMzEsMSwxMjUsOSw4NywwLDExMCwyNiw0LDAsMTE2LDksCisgICAgMTA3LDEwLDE0NCwxLDExNCw1MiwxLDAsMSwwLDEsMCwxMDAsMTgsMTI1LDksCisgICAgODksMCwxMTAsMiw4OCwwLDExNiw2LDEyNCwxLDEwMCwxNywxMjQsOSwxMzEsMywKKyAgICAxLDAsMTE2LDAsMTA2LDUsMTAwLDE5LDEzMSwxLDEyNSwxMCwxMTYsNiwxMjQsMSwKKyAgICAxMDAsMTksMTI0LDEwLDEzMSwzLDEsMCwxMjQsNSwxMDAsNywxMDcsMiwxNDQsMSwKKyAgICAxMTQsMTIwLDExNiwwLDEwNiw1LDEwMCwyMCwxMzEsMSwxMjUsMTEsMTE2LDYsMTI0LDEsCisgICAgMTAwLDIxLDEyNCwxMSwxMzEsMywxLDAsMTE2LDYsMTI0LDEsMTAwLDIyLDExNiwxMSwKKyAgICAxMzEsMCwxMzEsMywxLDAsMTE2LDEyLDEwNiwxMywxMTYsMiwxMDYsMTQsMTMxLDAsCisgICAgMTMxLDEsMSwwLDEyNCw1LDEwMCw3LDEwNywyLDE0NCwxLDExNCwxODQsMTE2LDE1LAorICAgIDEwNiwxNiwxMDAsMjMsMTMxLDEsMSwwLDEwMCwyNCwxMTYsMTIsMTA3LDYsMTQ0LDEsCisgICAgMTE0LDE4NCwxMDAsMjUsMTE2LDE3LDk1LDE4LDEwMCwxOCw4MywwLDQxLDI3LDEyMiwyMDUsCisgICAgODMsMTAxLDExNiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ1LDk4LAorICAgIDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsMTE1LDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTgsMTIxLDMyLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLAorICAgIDEwLDMyLDMyLDMyLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsCisgICAgMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMTA5LDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksMTE2LDEwNCwxMDEsMTE0LDMyLDk5LAorICAgIDExMSwxMDksMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEyMCwKKyAgICAxMTYsMTE0LDk3LDk5LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw5OSwxMTEsMTE0LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDUyLDAsCisgICAgMCwwLDExNCw2MywwLDAsMCwyMTgsOCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwKKyAgICAxMTUsMTE0LDEzOSwwLDAsMCw5MCw1LDExMiwxMTEsMTE1LDEwNSwxMjAsMjUwLDEsNDcsCisgICAgMjE4LDIsMTEwLDExNiwyNTAsMSw5Miw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwzLDAsMCwwLDExNSwwLDAsMCwxMTUsMjYsMCwwLAorICAgIDAsMTI0LDAsOTMsMTgsMTI1LDEsMTE2LDAsMTI0LDEsMTMxLDEsMTAwLDAsMTA3LAorICAgIDIsODYsMCwxLDAsMTEzLDIsMTAwLDEsODMsMCw0MSwyLDExNCwzMSwwLAorICAgIDAsMCw3OCw0MSwxLDExNCwzMywwLDAsMCw0MSwyLDExNCwyNCwwLDAsCisgICAgMCwxMTQsODAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMTE0LDIyMywwLDAsMCwxMDUsNSwwLDAsMTE1LDIsCisgICAgMCwwLDAsNCwwLDEyMiwyNSw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDQ2LDYwLDEwOCwKKyAgICAxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsCisgICAgMTE0LDYyLDAsMCwwLDEyMiwzMCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LAorICAgIDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTEyLDExMSwxMTUsMTA1LDEyMCwzMiwKKyAgICAxMTEsMTE0LDMyLDExMCwxMTYsMTE0LDMsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwKKyAgICAyMywwLDAsMCwxMTQsMzIsMCwwLDAsOTAsNyw5NSwxMTYsMTA0LDExNCwxMDEsCisgICAgOTcsMTAwLDc4LDkwLDgsOTUsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTAsNiwxMTksCisgICAgMTA1LDExMCwxMTQsMTAxLDEwMywxMTQsMTY2LDAsMCwwLDExNCw3LDAsMCwwLDEyMiwKKyAgICA0LDQ2LDExMiwxMjEsMTE5LDEyMiw2LDk1LDEwMCw0NiwxMTIsMTIxLDEwMCw4NCw0MSw0LAorICAgIDEyMiwzLDk1LDEwNSwxMTEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LAorICAgIDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDExNSwxMjIsNywxMDksOTcsMTE0LDExNSwKKyAgICAxMDQsOTcsMTA4LDQxLDE5LDExNCwxMTcsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LAorICAgIDE0MiwwLDAsMCwxMTQsMjM1LDAsMCwwLDExNCwxMDgsMCwwLDAsOTAsMTgsCisgICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywKKyAgICAxMDksMTAxLDExNCwxMTIsMCwwLDAsMjE4LDMsOTcsMTA4LDEwOCwyMTgsMTQsNjUsMTE1LAorICAgIDExNSwxMDEsMTE0LDExNiwxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDEwMiwwLDAsCisgICAgMCwxMTQsMjgsMCwwLDAsMTE0LDEzLDAsMCwwLDExNCwyMjUsMCwwLDAsCisgICAgMTE0LDE0NiwwLDAsMCwxMTQsMjMsMSwwLDAsMTE0LDg3LDAsMCwwLDExNCwKKyAgICAxNjAsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsMTY5LDAsMCwwLDQxLDEyLAorICAgIDIxOCwxNyw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTAsMTEsMTE1LDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDkwLDEyLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LAorICAgIDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEwLAorICAgIDExMSwxMTUsOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsMTAsOTgsMTE3LDEwNSwxMDgsCisgICAgMTE2LDEwNSwxMTAsOTUsMTExLDExNSwxMTQsMjMsMCwwLDAsMTE0LDI3LDAsMCwwLAorICAgIDkwLDksMTExLDExNSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsMTA0LDExNCwKKyAgICAxMDEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsOTcsMTA3LAorICAgIDExNCwxMDEsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExOSwxMDUsMTEwLDExNCwKKyAgICAxMDEsMTAzLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCw2LDk1LDExNSwxMDEsMTE2LDExNywxMTIsCisgICAgODAsNSwwLDAsMTE1LDgyLDAsMCwwLDAsOCw0LDEsNiwxLDYsCisgICAgMywxMCwxLDEwLDEsMTAsMSwxMiwyLDEwLDEsMTYsMywyMiwxLDE0LAorICAgIDIsMjIsMSw4LDEsMTAsMSwxMCwxLDQsMiwyLDEsMTAsMSw2LAorICAgIDEsMTQsMSwxMiwyLDgsMSwxMiwxLDEyLDEsMTgsMywyLDEsMTQsCisgICAgMSwxNiwyLDEwLDEsMTIsMywxMCwxLDEyLDMsMTAsMSwxMCwxLDEyLAorICAgIDMsMTQsMSwxNCwxLDEwLDEsMTAsMSwxMCwxLDExNCwzMSwxLDAsMCwKKyAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSw4NCwwLDAsMCwxMTYsMCwxMjQsMCwxMzEsMSwKKyAgICAxLDAsMTE2LDEsMTMxLDAsMTI1LDEsMTE2LDIsMTA2LDMsMTA2LDQsMTE2LDUsCisgICAgMTA2LDYsMTI0LDEsMTQwLDAsMTAzLDEsMTMxLDEsMSwwLDExNiw3LDEwNiw4LAorICAgIDEwMCwxLDEwNywyLDExNCw1NiwxMTYsMiwxMDYsOSwxMDYsMTAsMTE2LDExLDEzMSwxLAorICAgIDEsMCwxMTYsMiwxMDYsOSwxMDYsMTAsMTE2LDEyLDEzMSwxLDEsMCwxMTYsNSwKKyAgICAxMjQsMCw5NSw1LDExNiwxMywxMjQsMCw5NSwxMywxMDAsMiw4MywwLDQxLDMsCisgICAgMTIyLDQxLDczLDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAorICAgIDExNiwxMDQsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCisgICAgOTksMTExLDEwOSwxMTIsMTExLDExMCwxMDEsMTEwLDExNiwxMTUsNDYsMTE0LDI2LDEsMCwwLAorICAgIDc4LDQxLDE0LDExNCwzMSwxLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw4LDAsCisgICAgMCwwLDExNCwyNTIsMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsNCwxLDAsCisgICAgMCwxMTQsMTcsMSwwLDAsMTE0LDMsMCwwLDAsMTE0LDEwOCwwLDAsMCwKKyAgICAyMTgsOSwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTYwLDAsMCwwLAorICAgIDExNCwxNjUsMCwwLDAsMTE0LDI0NywwLDAsMCwxMTQsMjE0LDAsMCwwLDQxLAorICAgIDIsMTE0LDMwLDEsMCwwLDkwLDE3LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywKKyAgICAxMDgsMTA4LDE0OCw1LDAsMCwxMTUsMTYsMCwwLDAsMCwyLDgsMSw2LAorICAgIDEsMjAsMSwxMCwxLDEyLDEsMTIsNCw2LDEsMTE0LDMzLDEsMCwwLAorICAgIDQxLDEsMTIyLDMsMTE5LDEwNSwxMTAsNDEsMiwxMTQsMSwwLDAsMCwxMTQsMiwKKyAgICAwLDAsMCw0MSwxLDExNCw0OSwwLDAsMCw0MSwxLDc4LDQxLDMsNzgsCisgICAgNzgsNzgsNDEsMyw3OCw3OCw3OCw0MSwyLDExNCw2MiwwLDAsMCwxMTQsNjIsCisgICAgMCwwLDAsNDEsMSw3OCw0MSwxLDc4LDQxLDU4LDExNCwxMTAsMCwwLDAsCisgICAgMTE0LDEyLDAsMCwwLDkwLDM3LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLAorICAgIDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLAorICAgIDc3LDgzLDk1LDY2LDg5LDg0LDY5LDgzLDk1LDc1LDY5LDg5LDExNCwxMSwwLDAsCisgICAgMCwxMTQsMTMsMCwwLDAsMTE0LDE5LDAsMCwwLDExNCwyMSwwLDAsMCwKKyAgICAxMTQsMzAsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw0MSwwLDAsMCwxMTQsCisgICAgNDUsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw0OCwwLDAsMCwxMTQsNTgsCisgICAgMCwwLDAsMjE4LDQsMTE2LDEyMSwxMTIsMTAxLDIxOCw4LDk1LDk1LDk5LDExMSwxMDAsCisgICAgMTAxLDk1LDk1LDExNCwxNDEsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwxMzEsMCwKKyAgICAwLDAsMTE0LDE2LDAsMCwwLDExNCwyMCwwLDAsMCw5MCwxNyw5NSw4MiwKKyAgICA2NSw4Nyw5NSw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCw4NSw3Nyw2Niw2OSw4MiwxMTQsCisgICAgNzYsMCwwLDAsMTE0LDc1LDAsMCwwLDExNCw4NywwLDAsMCwxMTQsNzcsCisgICAgMCwwLDAsOTAsMjMsNjgsNjksNjYsODUsNzEsOTUsNjYsODksODQsNjksNjcsCisgICAgNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsOTAsMjcsNzksODAsCisgICAgODQsNzMsNzcsNzMsOTAsNjksNjgsOTUsNjYsODksODQsNjksNjcsNzksNjgsNjksCisgICAgOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsMTE0LDgyLDAsMCwwLDExNCw4OCwKKyAgICAwLDAsMCwxMTQsOTQsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCwxMDAsMCwKKyAgICAwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTI2LDAsMCwwLDExNCwxMzgsMCwwLAorICAgIDAsMTE0LDE0NCwwLDAsMCwxMTQsMTQ3LDAsMCwwLDExNCwxNTIsMCwwLDAsCisgICAgMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCwxNTksMCwwLDAsMTE0LDE2NCwwLAorICAgIDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxODAsMCwwLDAsMTE0LDE5MCwwLDAsCisgICAgMCwxMTQsMjA2LDAsMCwwLDExNCwyMTQsMCwwLDAsMTE0LDIxOSwwLDAsMCwKKyAgICAxMTQsMjI1LDAsMCwwLDExNCwyMjAsMCwwLDAsMTE0LDIyNiwwLDAsMCwxMTQsCisgICAgMjQ1LDAsMCwwLDExNCwyNDcsMCwwLDAsMTE0LDQsMSwwLDAsMTE0LDIyLAorICAgIDEsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDMxLDEsMCwwLDExNCwzMywxLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNiwwLDAsMCwxMTQsNywxLDAsMCwxNTMsNCwwLDAsMTE1LAotICAgIDIwLDAsMCwwLDEyLDcsNiwyLDEyLDE0LDEyLDQsNiwyLDEyLDEyLAotICAgIDEyLDUsMTUsNDUsMTIsMzEsMTgsMTgsMTE0LDcsMSwwLDAsOTksNCwwLAotICAgIDAsMCwwLDAsMCwwLDYsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDE5NSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDEsMCwKLSAgICAxMzEsMSwwLDEyNSw0LDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwyLDAsMTMxLAotICAgIDEsMCwxMjUsNSwwLDEyNCw0LDAsMTE1LDk5LDAsMTI0LDUsMCwxMTQsNTQsCi0gICAgMCwxMjQsNSwwLDEwNiwxLDAsMTI1LDQsMCwxMTAsNDUsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTA3LDIsMCwxMTQsODQsMCwxMTYsMiwwLDEyNCwxLDAsMTI0LAotICAgIDIsMCwxMzEsMiwwLDEyNSw0LDAsMTEwLDE1LDAsMTE2LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwyLDAsMTMxLDIsMCwxMjUsNCwwLDEyNCw1LDAsMTE1LDEyNiwwLAotICAgIDExNiw0LDAsMTI0LDEsMCwxMjQsMiwwLDEwMCwzLDAsMTI0LDQsMCwxMzEsCi0gICAgMiwxLDEyNSw1LDAsMTIxLDQ0LDAsMTI0LDUsMCwxMjQsMCwwLDEwMCwyLAotICAgIDAsNjAsMTI0LDQsMCwxMjQsMCwwLDEwMCwxLDAsNjAsMTI0LDIsMCwxMjQsCi0gICAgMCwwLDEwMCw0LDAsNjAsMTI0LDMsMCwxMjQsMCwwLDEwMCw1LDAsNjAsCi0gICAgODcsMTEwLDE4LDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxOTAsMCwxLDEsCi0gICAgMSw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsNiw3OCwyMTgsMTAsOTUsCi0gICAgOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSw5NSwyMTgsOCw5NSw5NSwxMTUsMTEyLDEwMSwKLSAgICA5OSw5NSw5NSwxMTQsMTI5LDAsMCwwLDkwLDgsOTUsOTUsMTAyLDEwNSwxMDgsMTAxLAotICAgIDk1LDk1LDkwLDEwLDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LDk1LDQxLDYsCi0gICAgMjE4LDMsMTAzLDEwMSwxMTYsMTE0LDEyOSwwLDAsMCwxMTQsMjI0LDAsMCwwLDExNCwKLSAgICAyMTksMCwwLDAsMTE0LDE2OSwwLDAsMCwyMTgsOSw2OSwxMjAsOTksMTAxLDExMiwKLSAgICAxMTYsMTA1LDExMSwxMTAsNDEsNiw5MCwyLDExMCwxMTUsMTE0LDEwOCwwLDAsMCw5MCwKLSAgICA4LDExMiw5NywxMTYsMTA0LDExMCw5NywxMDksMTAxLDkwLDksOTksMTEyLDk3LDExNiwxMDQsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTE0LDEyOSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCw5NSwKLSAgICAxMDIsMTA1LDEyMCw5NSwxMTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQzLDUsMCwKLSAgICAwLDExNSwzNCwwLDAsMCwwLDIsMTUsMSwxNSwxLDYsMSw2LDEsCi0gICAgMTIsMSwxMiwxLDE4LDIsMTUsMSw2LDEsMjEsMSwzLDEsMTAsMSwKLSAgICAxMCwxLDEwLDEsMTQsMSwxMywyLDExNCwyNSwxLDAsMCw5OSwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw1NSwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwKLSAgICAxMzEsMCwwLDEwMiwyLDAsMTI1LDAsMCwxMTYsMywwLDExNiw0LDAsMTAyLAotICAgIDIsMCwxMjUsMSwwLDExNiw1LDAsMTE2LDYsMCwxMDIsMiwwLDEyNSwyLAotICAgIDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTAzLDMsMCw4Myw0MSwxLAotICAgIDEyMiw5NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMDgsMTA1LDExNSwxMTYsCi0gICAgMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsNjksOTcsOTksMTA0LDMyLDEwNSwxMTYsMTAxLDEwOSwzMiwxMDUsMTE1LAotICAgIDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsNDAsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NCwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDQxLDQ2LDEwLDMyLDMyLDMyLAotICAgIDMyLDQxLDcsMTE0LDIyNSwwLDAsMCwxMTQsMTQ3LDAsMCwwLDIxOCwxOCwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsCi0gICAgMTE1LDExNCwyMTksMCwwLDAsMTE0LDg2LDAsMCwwLDExNCwyMjQsMCwwLDAsCi0gICAgMTE0LDc2LDAsMCwwLDQxLDMsOTAsMTAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsMTE1LDkwLDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5MCw4LDk4LDEyMSwxMTYsCi0gICAgMTAxLDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDExNCwxNjMsMCwwLDAsNjYsNSwwLDAsMTE1LDgsMCwKLSAgICAwLDAsMCw1LDE4LDEsMTIsMSwxMiwxLDExNCwxNjMsMCwwLDAsOTksCi0gICAgMSwwLDAsMCwwLDAsMCwwLDEyLDAsMCwwLDEyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw3MCwyLDAsMCwxMjQsMCwwLDk3LDAsMCwxMTYsCi0gICAgMCwwLDEwNiwxLDAsOTcsMSwwLDExNiwwLDAsMTA2LDIsMCw5NywyLAotICAgIDAsMTE2LDEsMCwxMDYsMywwLDExNiw0LDAsMjUsMTI1LDEsMCwxMjAsNzYsCi0gICAgMCwxMDAsMjYsMCw2OCw5Myw2OCwwLDEyNSwyLDAsMTI0LDIsMCwxMTYsMSwKLSAgICAwLDEwNiwzLDAsMTA3LDcsMCwxMTQsODMsMCwxMTYsMCwwLDEwNiw1LDAsCi0gICAgMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTEwLDEzLDAsMTE2LDEsMCwxMDYsCi0gICAgMywwLDEyNCwyLDAsMjUsMTI1LDMsMCwxMTYsNiwwLDEyNCwxLDAsMTI0LAotICAgIDIsMCwxMjQsMywwLDEzMSwzLDAsMSwxMTMsNDQsMCw4NywxMDAsNSwwLAotICAgIDEwMCw2LDAsMTAzLDEsMCwxMDIsMiwwLDEwMCw3LDAsMTAwLDgsMCwxMDAsCi0gICAgNiwwLDEwMywyLDAsMTAyLDIsMCwxMDIsMiwwLDEyNSw0LDAsMTIwLDE0OSwKLSAgICAwLDEyNCw0LDAsNjgsOTMsMTI5LDAsOTIsMiwwLDEyNSw1LDAsMTI1LDYsCi0gICAgMCwxMTYsNywwLDEwMCw5LDAsMTAwLDEwLDAsMTMyLDAsMCwxMjQsNiwwLAotICAgIDY4LDEzMSwxLDAsMTMxLDEsMCwxMTUsMTk5LDAsMTE2LDgsMCwxMzAsMSwwLAotICAgIDEyNCw2LDAsMTAwLDExLDAsMjUsMTI1LDcsMCwxMjQsNSwwLDExNiwxLDAsCi0gICAgMTA2LDMsMCwxMDcsNiwwLDExNCwyNDEsMCwxMTYsMSwwLDEwNiwzLDAsMTI0LAotICAgIDUsMCwyNSwxMjUsOCwwLDgwLDExMywxNTYsMCwxMjEsMjAsMCwxMTYsMCwwLAotICAgIDEwNiw1LDAsMTI0LDUsMCwxMzEsMSwwLDEyNSw4LDAsODAsODcsMTEzLDE1NiwKLSAgICAwLDQsMTE2LDksMCwxMDcsMTAsMCwxMTQsMjgsMSwxLDEsMSwxMTksMTU2LAotICAgIDAsODksMTEzLDE1NiwwLDg4LDExMywxNTYsMCw4NywxMTYsOSwwLDEwMCwxMiwwLAotICAgIDEzMSwxLDAsMTMwLDEsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDEzLDAsMTI0LAotICAgIDgsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwxNCwwLDEyNCwKLSAgICA3LDAsMTMxLDMsMCwxLDExNiw2LDAsMTI0LDEsMCwxMDAsMTUsMCwxMDAsCi0gICAgMTYsMCwxMDYsMTAsMCwxMjQsNiwwLDEzMSwxLDAsMTMxLDMsMCwxLDEyMSwKLSAgICAxOSwwLDExNiwwLDAsMTA2LDUsMCwxMDAsMTcsMCwxMzEsMSwwLDEyNSw5LAotICAgIDAsODcsMTEwLDI0LDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwxNDcsMSwxLAotICAgIDEsMSwxMDAsMTgsMCwxMjUsOSwwLDg5LDExMCwxLDAsODgsMTE2LDYsMCwKLSAgICAxMjQsMSwwLDEwMCwxNywwLDEyNCw5LDAsMTMxLDMsMCwxLDExNiwwLDAsCi0gICAgMTA2LDUsMCwxMDAsMTksMCwxMzEsMSwwLDEyNSwxMCwwLDExNiw2LDAsMTI0LAotICAgIDEsMCwxMDAsMTksMCwxMjQsMTAsMCwxMzEsMywwLDEsMTI0LDUsMCwxMDAsCi0gICAgNywwLDEwNywyLDAsMTE0LDIzOCwxLDExNiwwLDAsMTA2LDUsMCwxMDAsMjAsCi0gICAgMCwxMzEsMSwwLDEyNSwxMSwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMjEsMCwKLSAgICAxMjQsMTEsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwyMiwwLAotICAgIDExNiwxMSwwLDEzMSwwLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEwNiwxMywwLAotICAgIDExNiwyLDAsMTA2LDE0LDAsMTMxLDAsMCwxMzEsMSwwLDEsMTI0LDUsMCwKLSAgICAxMDAsNywwLDEwNywyLDAsMTE0LDY2LDIsMTE2LDE1LDAsMTA2LDE2LDAsMTAwLAotICAgIDIzLDAsMTMxLDEsMCwxLDEwMCwyNCwwLDExNiwxMiwwLDEwNyw2LDAsMTE0LAotICAgIDY2LDIsMTAwLDI1LDAsMTE2LDE3LDAsOTUsMTgsMCwxMDAsMTgsMCw4Myw0MSwKLSAgICAyNywxMjIsMjA1LDgzLDEwMSwxMTYsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAotICAgIDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LAotICAgIDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLAotICAgIDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwKLSAgICAxMDAsMTAxLDEwMCwxMCwzMiwzMiwzMiwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwKLSAgICAxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwzMiwxMDUsMTEwLDExNiwxMTEsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLAotICAgIDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLAotICAgIDExNCwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLAotICAgIDMyLDEwMSwxMjAsMTE2LDExNCw5Nyw5OSwxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsOTksMTExLDExNCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsCi0gICAgOTcsMTEyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAotICAgIDExNCw1MSwwLDAsMCwxMTQsNjIsMCwwLDAsMjE4LDgsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTE2LDEwNSwxMTAsMTE1LDExNCwxNDQsMCwwLDAsOTAsNSwxMTIsMTExLDExNSwxMDUsMTIwLAotICAgIDI1MCwxLDQ3LDIxOCwyLDExMCwxMTYsMjUwLDEsOTIsOTksMSwwLDAsMCwwLAotICAgIDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsMCwwLDAsMTE1LAotICAgIDMzLDAsMCwwLDEyNCwwLDAsOTMsMjMsMCwxMjUsMSwwLDExNiwwLDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEwMCwwLDAsMTA3LDIsMCw4NiwxLDExMywzLAotICAgIDAsMTAwLDEsMCw4Myw0MSwyLDExNCwzMSwwLDAsMCw3OCw0MSwxLDExNCwKLSAgICAzMywwLDAsMCw0MSwyLDExNCwyNCwwLDAsMCwxMTQsNzksMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LAotICAgIDIyOCwwLDAsMCwxMDIsNSwwLDAsMTE1LDIsMCwwLDAsNiwwLDEyMiwKLSAgICAyNSw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2MiwKLSAgICA0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDYxLDAsMCwwLDEyMiwKLSAgICAzMCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDExNCwxMDEsMTEzLDExNywxMDUsCi0gICAgMTE0LDEwMSwxMTUsMzIsMTEyLDExMSwxMTUsMTA1LDEyMCwzMiwxMTEsMTE0LDMyLDExMCwxMTYsMTE0LAotICAgIDMsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwxMTQsMzIsCi0gICAgMCwwLDAsOTAsNyw5NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDc4LDkwLDgsOTUsCi0gICAgMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTAsNiwxMTksMTA1LDExMCwxMTQsMTAxLDEwMywxMTQsCi0gICAgMTcxLDAsMCwwLDExNCw3LDAsMCwwLDEyMiw0LDQ2LDExMiwxMjEsMTE5LDEyMiwKLSAgICA2LDk1LDEwMCw0NiwxMTIsMTIxLDEwMCw4NCw0MSw0LDEyMiwzLDk1LDEwNSwxMTEsMTIyLAotICAgIDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDEyMiw4LDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDExNSwxMjIsNywxMDksOTcsMTE0LDExNSwxMDQsOTcsMTA4LDQxLDE5LDExNCwKLSAgICAxMjMsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LDE0NywwLDAsMCwxMTQsMjQwLAotICAgIDAsMCwwLDExNCwxMTQsMCwwLDAsOTAsMTgsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDExNCwxMTgsMCwwLAotICAgIDAsMjE4LDMsOTcsMTA4LDEwOCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwxMDUsMTExLAotICAgIDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDEwOSwwLDAsMCwxMTQsMjgsMCwwLDAsCi0gICAgMTE0LDEzLDAsMCwwLDExNCwyMzAsMCwwLDAsMTE0LDE1MSwwLDAsMCwxMTQsCi0gICAgMjYsMSwwLDAsMTE0LDg2LDAsMCwwLDExNCwxNjUsMCwwLDAsMTE0LDE3MCwKLSAgICAwLDAsMCwxMTQsMTc0LDAsMCwwLDQxLDEyLDIxOCwxNyw5NSw5OCwxMTEsMTExLAotICAgIDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTEsMTE1LAotICAgIDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEyLDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LDExNywxMDUsMTA4LDExNiwxMDUsCi0gICAgMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEwLDExMSwxMTUsOTUsMTAwLDEwMSwxMTYsCi0gICAgOTcsMTA1LDEwOCwxMTUsOTAsMTAsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTExLDExNSwKLSAgICAxMTQsMjMsMCwwLDAsMTE0LDI3LDAsMCwwLDkwLDksMTExLDExNSw5NSwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDk1LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDk1LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDkwLDEzLDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDIxOCw2LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNzcsNSwwLDAsMTE1LDgyLAotICAgIDAsMCwwLDAsOCw2LDEsOSwxLDksMywxMywxLDEzLDEsMTUsCi0gICAgMSwxOCwyLDEzLDEsMjAsMywzMywxLDE5LDIsMzEsMSwxMCwxLDE1LAotICAgIDEsMTMsMSw0LDIsMywxLDE1LDEsNSwxLDEzLDEsMTIsMiwxMiwKLSAgICAxLDE2LDEsMTYsMSwyNSwzLDMsMSwxOSwxLDEzLDIsMTEsMSwxNiwKLSAgICAzLDE1LDEsMTYsMywxMiwxLDE1LDEsMTYsMywxOSwxLDE5LDEsMTIsCi0gICAgMSwxMywxLDEyLDEsMTE0LDM0LDEsMCwwLDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDExNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxLDExNiwxLAotICAgIDAsMTMxLDAsMCwxMjUsMSwwLDExNiwyLDAsMTA2LDMsMCwxMDYsNCwwLAotICAgIDExNiw1LDAsMTA2LDYsMCwxMjQsMSwwLDE0MCwwLDAsMTAzLDEsMCwxMzEsCi0gICAgMSwwLDEsMTE2LDcsMCwxMDYsOCwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsCi0gICAgNzgsMCwxMTYsMiwwLDEwNiw5LDAsMTA2LDEwLDAsMTE2LDExLDAsMTMxLDEsCi0gICAgMCwxLDExNiwyLDAsMTA2LDksMCwxMDYsMTAsMCwxMTYsMTIsMCwxMzEsMSwKLSAgICAwLDEsMTE2LDUsMCwxMjQsMCwwLDk1LDUsMCwxMTYsMTMsMCwxMjQsMCwKLSAgICAwLDk1LDEzLDAsMTAwLDIsMCw4Myw0MSwzLDEyMiw0MSw3MywxMTAsMTE1LDExNiwKLSAgICA5NywxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ1LDk4LDk3LDExNSwKLSAgICAxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk5LDExMSwxMDksMTEyLDExMSwxMTAsCi0gICAgMTAxLDExMCwxMTYsMTE1LDQ2LDExNCwyOSwxLDAsMCw3OCw0MSwxNCwxMTQsMzQsMSwKLSAgICAwLDAsMTE0LDE2MywwLDAsMCwxMTQsOCwwLDAsMCwxMTQsMjU1LDAsMCwKLSAgICAwLDExNCwxNTEsMCwwLDAsMTE0LDcsMSwwLDAsMTE0LDIwLDEsMCwwLAotICAgIDExNCwzLDAsMCwwLDExNCwxMTQsMCwwLDAsMjE4LDksMTA5LDEwMSwxMTYsOTcsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2NSwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCwKLSAgICAyNTAsMCwwLDAsMTE0LDIxOSwwLDAsMCw0MSwyLDExNCwzMywxLDAsMCwKLSAgICA5MCwxNywxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDExNSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsOCw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxNDUsNSwwLDAsCi0gICAgMTE1LDE2LDAsMCwwLDAsMiwxMCwxLDksMSwyOCwxLDE1LDEsMTYsCi0gICAgMSwxNiw0LDksMSwxMTQsMzYsMSwwLDAsNDEsMSwxMjIsMywxMTksMTA1LAotICAgIDExMCw0MSwyLDExNCwxLDAsMCwwLDExNCwyLDAsMCwwLDQxLDU5LDExNCwKLSAgICAxMTYsMCwwLDAsMTE0LDEyLDAsMCwwLDkwLDM3LDk1LDY3LDY1LDgzLDY5LAotICAgIDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LAotICAgIDg0LDcwLDc5LDgyLDc3LDgzLDk1LDY2LDg5LDg0LDY5LDgzLDk1LDc1LDY5LDg5LAotICAgIDExNCwxMSwwLDAsMCwxMTQsMTMsMCwwLDAsMTE0LDE5LDAsMCwwLDExNCwKLSAgICAyMSwwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw0MSwKLSAgICAwLDAsMCwxMTQsNDUsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw0OCwwLAotICAgIDAsMCwxMTQsNTcsMCwwLDAsMjE4LDQsMTE2LDEyMSwxMTIsMTAxLDIxOCw4LDk1LAotICAgIDk1LDk5LDExMSwxMDAsMTAxLDk1LDk1LDExNCwxNDYsMCwwLDAsMTE0LDE3LDAsMCwKLSAgICAwLDExNCwxMzcsMCwwLDAsMTE0LDE2LDAsMCwwLDExNCwyMCwwLDAsMCwKLSAgICA5MCwxNyw5NSw4Miw2NSw4Nyw5NSw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCw4NSw3NywKLSAgICA2Niw2OSw4MiwxMTQsNzUsMCwwLDAsMTE0LDc0LDAsMCwwLDExNCw4NiwwLAotICAgIDAsMCwxMTQsNzYsMCwwLDAsOTAsMjMsNjgsNjksNjYsODUsNzEsOTUsNjYsCi0gICAgODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsCi0gICAgOTAsMjcsNzksODAsODQsNzMsNzcsNzMsOTAsNjksNjgsOTUsNjYsODksODQsNjksCi0gICAgNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsMTE0LDgxLDAsCi0gICAgMCwwLDExNCw4NywwLDAsMCwxMTQsOTMsMCwwLDAsMTE0LDk3LDAsMCwKLSAgICAwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMjUsMCwwLDAsCi0gICAgMTE0LDEzMiwwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LAotICAgIDE1MiwwLDAsMCwxMTQsMTU3LDAsMCwwLDIxOCw2LDExMSw5OCwxMDYsMTAxLDk5LAotICAgIDExNiwxMTQsMTY0LDAsMCwwLDExNCwxNjksMCwwLDAsMTE0LDE3MCwwLDAsMCwKLSAgICAxMTQsMTg1LDAsMCwwLDExNCwxOTUsMCwwLDAsMTE0LDIxMSwwLDAsMCwxMTQsCi0gICAgMjE5LDAsMCwwLDExNCwyMjQsMCwwLDAsMTE0LDIzMCwwLDAsMCwxMTQsMjI1LAotICAgIDAsMCwwLDExNCwyMzEsMCwwLDAsMTE0LDI0OCwwLDAsMCwxMTQsMjUwLDAsCi0gICAgMCwwLDExNCw3LDEsMCwwLDExNCwyNSwxLDAsMCwxMTQsMTYzLDAsMCwKLSAgICAwLDExNCwzNCwxLDAsMCwxMTQsMzYsMSwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LAotICAgIDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsOCwwLDAsMCwxMTUsMTA2LDAsCi0gICAgMCwwLDYsMTYsNiwxLDYsMSwzLDEsNywzLDEyLDE3LDEyLDUsCi0gICAgMTIsNSwxMiw2LDEyLDEyLDEyLDEwLDEyLDksMTIsNSwxMiw3LDE1LDIyLAotICAgIDE1LDExNCwyMiwxLDE4LDIsNiwxLDYsMiw5LDIsOSwyLDEwLDIsCi0gICAgMjEsNDQsMTIsMzMsMTIsMTksMTIsMTIsMTIsMTIsMTgsOCwxMiwyOCwxMiwxNywKLSAgICAyMSw1NSwyMSwxMiwxOCwxMCwxMiwxNCw5LDMsMTIsMSwxNSw2NSwxOSw2NCwKLSAgICAxOSwyOCwyMiwxMTAsMTksNDEsMjUsNDMsMjUsMTYsNiwzLDI1LDUzLDE5LDU3LAotICAgIDE5LDQxLDE5LDEzNCwxOSwxNDYsMTUsMjMsMTIsMTEsMTIsNjgsCisgICAgMCwxMTQsNiwwLDAsMCwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2MiwKKyAgICA4LDAsMCwwLDExNSwxMDgsMCwwLDAsNCwxNiw0LDEsNCwxLDIsCisgICAgMSw2LDMsOCwxNyw4LDUsOCw1LDgsNiw4LDEyLDgsMTAsOCwKKyAgICA5LDgsNSw4LDcsMTAsMjIsMTAsMTE3LDE2LDEsMTIsMiw0LDEsNCwKKyAgICAyLDYsMiw2LDIsOCwyLDE2LDQ0LDgsMzMsOCwxOSw4LDEyLDgsCisgICAgMTIsOCwyOCw4LDE3LDEwLDU1LDEwLDEyLDEwLDEwLDgsMTQsNiwzLDQsCisgICAgMSwxNCw2NSwxNCw2NCwxNCwyOSwxNiwxMTAsMTQsNDEsMTgsNDUsMTgsMTYsNCwKKyAgICAzLDE4LDUzLDE0LDYwLDE0LDQyLDE0LDEyNywwLDUsMTQsMTI3LDAsMjIsMTAsCisgICAgMjMsOCwxMSw4LDY4LAogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weSBiL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weQppbmRleCBkOWEwODU1Li4wMjNjOWU2IDEwMDc1NQotLS0gYS9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkKKysrIGIvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5CkBAIC0zLDI0ICszLDM0IEBACiAoZm9yIGNvbXBpbGVycyBzdXBwb3J0aW5nIGNvbXB1dGVkIGdvdG9zIG9yICJsYWJlbHMtYXMtdmFsdWVzIiwgc3VjaCBhcyBnY2MpLgogIiIiCiAKLSMgVGhpcyBjb2RlIHNob3VsZCBzdGF5IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBhdCBsZWFzdCB3aGlsZQotIyBzb21lIG9mIHRoZSBidWlsZGJvdHMgaGF2ZSBQeXRob24gMi4zIGFzIHRoZWlyIHN5c3RlbSBQeXRob24uCi0KLWltcG9ydCBpbXAKIGltcG9ydCBvcworaW1wb3J0IHN5cwogCiAKLWRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKLSAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KLSAgICAiIiIKLSAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiKQotICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobW9kbmFtZSwgKmltcC5maW5kX21vZHVsZShtb2RuYW1lLCBbbW9kcGF0aF0pKQordHJ5OgorICAgIGZyb20gaW1wb3J0bGliLm1hY2hpbmVyeSBpbXBvcnQgU291cmNlRmlsZUxvYWRlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBpbXAKKworICAgIGRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKKyAgICAgICAgIiIiRmluZHMgYW5kIHJldHVybnMgYSBtb2R1bGUgaW4gdGhlIGxvY2FsIGRpc3QvY2hlY2tvdXQuCisgICAgICAgICIiIgorICAgICAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAiTGliIikKKyAgICAgICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShtb2RuYW1lLCAqaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUsIFttb2RwYXRoXSkpCitlbHNlOgorICAgIGRlZiBmaW5kX21vZHVsZShtb2RuYW1lKToKKyAgICAgICAgIiIiRmluZHMgYW5kIHJldHVybnMgYSBtb2R1bGUgaW4gdGhlIGxvY2FsIGRpc3QvY2hlY2tvdXQuCisgICAgICAgICIiIgorICAgICAgICBtb2RwYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAiTGliIiwgbW9kbmFtZSArICIucHkiKQorICAgICAgICByZXR1cm4gU291cmNlRmlsZUxvYWRlcihtb2RuYW1lLCBtb2RwYXRoKS5sb2FkX21vZHVsZSgpCisKIAogZGVmIHdyaXRlX2NvbnRlbnRzKGYpOgogICAgICIiIldyaXRlIEMgY29kZSBjb250ZW50cyB0byB0aGUgdGFyZ2V0IGZpbGUgb2JqZWN0LgogICAgICIiIgotICAgIG9wY29kZSA9IGZpbmRfbW9kdWxlKCJvcGNvZGUiKQorICAgIG9wY29kZSA9IGZpbmRfbW9kdWxlKCdvcGNvZGUnKQogICAgIHRhcmdldHMgPSBbJ191bmtub3duX29wY29kZSddICogMjU2CiAgICAgZm9yIG9wbmFtZSwgb3AgaW4gb3Bjb2RlLm9wbWFwLml0ZW1zKCk6CiAgICAgICAgIHRhcmdldHNbb3BdID0gIlRBUkdFVF8lcyIgJSBvcG5hbWUKQEAgLTI5LDE1ICszOSwxNyBAQAogICAgIGYud3JpdGUoIlxufTtcbiIpCiAKIAotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBpbXBvcnQgc3lzCi0gICAgYXNzZXJ0IGxlbihzeXMuYXJndikgPCAzLCAiVG9vIG1hbnkgYXJndW1lbnRzIgorZGVmIG1haW4oKToKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID49IDM6CisgICAgICAgIHN5cy5leGl0KCJUb28gbWFueSBhcmd1bWVudHMiKQogICAgIGlmIGxlbihzeXMuYXJndikgPT0gMjoKICAgICAgICAgdGFyZ2V0ID0gc3lzLmFyZ3ZbMV0KICAgICBlbHNlOgogICAgICAgICB0YXJnZXQgPSAiUHl0aG9uL29wY29kZV90YXJnZXRzLmgiCi0gICAgZiA9IG9wZW4odGFyZ2V0LCAidyIpCi0gICAgdHJ5OgorICAgIHdpdGggb3Blbih0YXJnZXQsICJ3IikgYXMgZjoKICAgICAgICAgd3JpdGVfY29udGVudHMoZikKLSAgICBmaW5hbGx5OgotICAgICAgICBmLmNsb3NlKCkKKyAgICBwcmludCgiSnVtcCB0YWJsZSB3cml0dGVuIGludG8gJXMiICUgdGFyZ2V0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9QeXRob24vbWFyc2hhbC5jIGIvUHl0aG9uL21hcnNoYWwuYwppbmRleCA1YjhkZTk5Li42MjdhODQyIDEwMDY0NAotLS0gYS9QeXRob24vbWFyc2hhbC5jCisrKyBiL1B5dGhvbi9tYXJzaGFsLmMKQEAgLTI2MywxMCArMjYzLDEwIEBACiAgICAgaWYgKFB5X1JFRkNOVCh2KSA9PSAxKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkocC0+aGFzaHRhYmxlLCB2KTsKKyAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHAtPmhhc2h0YWJsZSwgdik7CiAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKICAgICAgICAgLyogd3JpdGUgdGhlIHJlZmVyZW5jZSBpbmRleCB0byB0aGUgc3RyZWFtICovCi0gICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHAtPmhhc2h0YWJsZSwgJncsIHNpemVvZih3KSwgZW50cnkpOworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShwLT5oYXNodGFibGUsIGVudHJ5LCB3KTsKICAgICAgICAgLyogd2UgZG9uJ3Qgc3RvcmUgImxvbmciIGluZGljZXMgaW4gdGhlIGRpY3QgKi8KICAgICAgICAgYXNzZXJ0KDAgPD0gdyAmJiB3IDw9IDB4N2ZmZmZmZmYpOwogICAgICAgICB3X2J5dGUoVFlQRV9SRUYsIHApOwpAQCAtNTcxLDcgKzU3MSw4IEBACiB3X2luaXRfcmVmcyhXRklMRSAqd2YsIGludCB2ZXJzaW9uKQogewogICAgIGlmICh2ZXJzaW9uID49IDMpIHsKLSAgICAgICAgd2YtPmhhc2h0YWJsZSA9IF9QeV9oYXNodGFibGVfbmV3KHNpemVvZihpbnQpLCBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAorICAgICAgICB3Zi0+aGFzaHRhYmxlID0gX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5T2JqZWN0ICopLCBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKICAgICAgICAgaWYgKHdmLT5oYXNodGFibGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTU4Miw5ICs1ODMsMTMgQEAKIH0KIAogc3RhdGljIGludAotd19kZWNyZWZfZW50cnkoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqUHlfVU5VU0VEKGRhdGEpKQord19kZWNyZWZfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgIHZvaWQgKlB5X1VOVVNFRChkYXRhKSkKIHsKLSAgICBQeV9YREVDUkVGKGVudHJ5LT5rZXkpOworICAgIFB5T2JqZWN0ICplbnRyeV9rZXk7CisKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgZW50cnlfa2V5KTsKKyAgICBQeV9YREVDUkVGKGVudHJ5X2tleSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY0Myw3ICs2NDgsNyBAQAogICAgIFB5T2JqZWN0ICpyZWZzOyAgLyogYSBsaXN0ICovCiB9IFJGSUxFOwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiByX3N0cmluZyhQeV9zc2l6ZV90IG4sIFJGSUxFICpwKQogewogICAgIFB5X3NzaXplX3QgcmVhZCA9IC0xOwpAQCAtNzI5LDcgKzczNCw3IEBACiAgICAgICAgIGMgPSBnZXRjKHAtPmZwKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGNoYXIgKnB0ciA9IHJfc3RyaW5nKDEsIHApOworICAgICAgICBjb25zdCBjaGFyICpwdHIgPSByX3N0cmluZygxLCBwKTsKICAgICAgICAgaWYgKHB0ciAhPSBOVUxMKQogICAgICAgICAgICAgYyA9ICoodW5zaWduZWQgY2hhciAqKSBwdHI7CiAgICAgfQpAQCAtNzQwLDkgKzc0NSw5IEBACiByX3Nob3J0KFJGSUxFICpwKQogewogICAgIHNob3J0IHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gYnVmZmVyWzFdIDw8IDg7CkBAIC03NTYsOSArNzYxLDkgQEAKIHJfbG9uZyhSRklMRSAqcCkKIHsKICAgICBsb25nIHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gKGxvbmcpYnVmZmVyWzFdIDw8IDg7CkBAIC05NzgsNyArOTgzLDggQEAKIAogICAgIGNhc2UgVFlQRV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBkb3VibGUgZHg7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDAxLDkgKzEwMDcsOSBAQAogCiAgICAgY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwogICAgICAgICAgICAgZG91YmxlIHg7Ci0gICAgICAgICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOwogICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKQEAgLTEwMTYsNyArMTAyMiw4IEBACiAKICAgICBjYXNlIFRZUEVfQ09NUExFWDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBQeV9jb21wbGV4IGM7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDUzLDE1ICsxMDYwLDE1IEBACiAKICAgICBjYXNlIFRZUEVfQklOQVJZX0NPTVBMRVg6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKICAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLnJlYWwgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CiAgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLmltYWcgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CkBAIC0xMDc0LDcgKzEwODEsNyBAQAogCiAgICAgY2FzZSBUWVBFX1NUUklORzoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgbiA9IHJfbG9uZyhwKTsKICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTExOSw3ICsxMTI2LDcgQEAKICAgICAgICAgfQogICAgIF9yZWFkX2FzY2lpOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBwdHIgPSByX3N0cmluZyhuLCBwKTsKICAgICAgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMzcsNyArMTE0NCw3IEBACiAgICAgICAgIGlzX2ludGVybmVkID0gMTsKICAgICBjYXNlIFRZUEVfVU5JQ09ERToKICAgICAgICAgewotICAgICAgICBjaGFyICpidWZmZXI7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKIAogICAgICAgICBuID0gcl9sb25nKHApOwogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTEyNjQsNDEgKzEyNzEsNTIgQEAKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSAoc2V0IHNpemUgb3V0IG9mIHJhbmdlKSIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgdiA9ICh0eXBlID09IFRZUEVfU0VUKSA/IFB5U2V0X05ldyhOVUxMKSA6IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9TRVQpIHsKLSAgICAgICAgICAgIFJfUkVGKHYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogbXVzdCB1c2UgZGVsYXllZCByZWdpc3RyYXRpb24gb2YgZnJvemVuc2V0cyBiZWNhdXNlIHRoZXkgbXVzdAotICAgICAgICAgICAgICogYmUgaW5pdCB3aXRoIGEgcmVmY291bnQgb2YgMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZHggPSByX3JlZl9yZXNlcnZlKGZsYWcsIHApOwotICAgICAgICAgICAgaWYgKGlkeCA8IDApCi0gICAgICAgICAgICAgICAgUHlfQ0xFQVIodik7IC8qIHNpZ25hbCBlcnJvciAqLwotICAgICAgICB9Ci0gICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOwotICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIHNldCIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgaWYgKG4gPT0gMCAmJiB0eXBlID09IFRZUEVfRlJPWkVOU0VUKSB7CisgICAgICAgICAgICAvKiBjYWxsIGZyb3plbnNldCgpIHRvIGdldCB0aGUgZW1wdHkgZnJvemVuc2V0IHNpbmdsZXRvbiAqLworICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZyb3plblNldF9UeXBlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOwotICAgICAgICAgICAgICAgIHYgPSBOVUxMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgIFJfUkVGKHYpOworICAgICAgICAgICAgcmV0dmFsID0gdjsKICAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSBUWVBFX1NFVCkKLSAgICAgICAgICAgIHYgPSByX3JlZl9pbnNlcnQodiwgaWR4LCBmbGFnLCBwKTsKLSAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2ID0gKHR5cGUgPT0gVFlQRV9TRVQpID8gUHlTZXRfTmV3KE5VTEwpIDogUHlGcm96ZW5TZXRfTmV3KE5VTEwpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9TRVQpIHsKKyAgICAgICAgICAgICAgICBSX1JFRih2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbXVzdCB1c2UgZGVsYXllZCByZWdpc3RyYXRpb24gb2YgZnJvemVuc2V0cyBiZWNhdXNlIHRoZXkgbXVzdAorICAgICAgICAgICAgICAgICAqIGJlIGluaXQgd2l0aCBhIHJlZmNvdW50IG9mIDEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZHggPSByX3JlZl9yZXNlcnZlKGZsYWcsIHApOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICBQeV9DTEVBUih2KTsgLyogc2lnbmFsIGVycm9yICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdjIgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3Igc2V0Iik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlICE9IFRZUEVfU0VUKQorICAgICAgICAgICAgICAgIHYgPSByX3JlZl9pbnNlcnQodiwgaWR4LCBmbGFnLCBwKTsKKyAgICAgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFRZUEVfQ09ERToKZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IDBkMDkzNzEuLmYzYWE5MWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMjYwLDEzICsyNjAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhuKTsKICAgICAgICAgfQogCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgUFlfTE9OR19MT05HKSk7CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKXZhX2FyZygqcF92YSwgbG9uZyBsb25nKSk7CiAKICAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpKTsKLSNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygobG9uZyBsb25nKXZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyBsb25nKSk7CisKICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwpAQCAtMzE4LDcgKzMxNyw3IEBACiAgICAgICAgIGNhc2UgJ1UnOiAgIC8qIFhYWCBkZXByZWNhdGVkIGFsaWFzICovCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CkBAIC0zNTEsNyArMzUwLDcgQEAKICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CkBAIC00NjksNyArNDY4LDcgQEAKICAgICBpbnQgbiA9IGNvdW50Zm9ybWF0KGYsICdcMCcpOwogICAgIHZhX2xpc3QgbHZhOwogCi0gICAgICAgIFB5X1ZBX0NPUFkobHZhLCB2YSk7CisgICAgUHlfVkFfQ09QWShsdmEsIHZhKTsKIAogICAgIGlmIChuIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9QeXRob24vbXlzdHJ0b3VsLmMgYi9QeXRob24vbXlzdHJ0b3VsLmMKaW5kZXggOTg0MjlkNC4uYTg1NzkwZSAxMDA2NDQKLS0tIGEvUHl0aG9uL215c3RydG91bC5jCisrKyBiL1B5dGhvbi9teXN0cnRvdWwuYwpAQCAtMTcsNyArMTcsNyBAQAogICogc21hbGxtYXhbYmFzZV0gaXMgdGhlIGxhcmdlc3QgdW5zaWduZWQgbG9uZyBpIHN1Y2ggdGhhdAogICogaSAqIGJhc2UgZG9lc24ndCBvdmVyZmxvdyB1bnNpZ25lZCBsb25nLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzbWFsbG1heFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgc21hbGxtYXhbXSA9IHsKICAgICAwLCAvKiBiYXNlcyAwIGFuZCAxIGFyZSBpbnZhbGlkICovCiAgICAgMCwKICAgICBVTE9OR19NQVggLyAyLApAQCAtNjIsMTQgKzYyLDE0IEBACiAgKiBOb3RlIHRoYXQgdGhpcyBpcyBwZXNzaW1pc3RpYyBpZiBzaXplb2YobG9uZykgPiA0LgogICovCiAjaWYgU0laRU9GX0xPTkcgPT0gNAotc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CitzdGF0aWMgY29uc3QgaW50IGRpZ2l0bGltaXRbXSA9IHsKICAgICAwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLwogICAgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCiAgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLwogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAogLyogW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjY0LCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0gKi8KLXN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0geworc3RhdGljIGNvbnN0IGludCBkaWdpdGxpbWl0W10gPSB7CiAgICAgICAgICAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KICAgICAxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCiAgICAgMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL29wY29kZV90YXJnZXRzLmggYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAppbmRleCAxOTI1OWUxLi45MzM3NDc0IDEwMDY0NAotLS0gYS9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAorKysgYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgJiZUQVJHRVRfQ0FMTF9GVU5DVElPTiwKICAgICAmJlRBUkdFVF9NQUtFX0ZVTkNUSU9OLAogICAgICYmVEFSR0VUX0JVSUxEX1NMSUNFLAotICAgICYmVEFSR0VUX01BS0VfQ0xPU1VSRSwKKyAgICAmJl91bmtub3duX29wY29kZSwKICAgICAmJlRBUkdFVF9MT0FEX0NMT1NVUkUsCiAgICAgJiZUQVJHRVRfTE9BRF9ERVJFRiwKICAgICAmJlRBUkdFVF9TVE9SRV9ERVJFRiwKQEAgLTE1NCw5ICsxNTQsOSBAQAogICAgICYmVEFSR0VUX0JVSUxEX1RVUExFX1VOUEFDSywKICAgICAmJlRBUkdFVF9CVUlMRF9TRVRfVU5QQUNLLAogICAgICYmVEFSR0VUX1NFVFVQX0FTWU5DX1dJVEgsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCisgICAgJiZUQVJHRVRfRk9STUFUX1ZBTFVFLAorICAgICYmVEFSR0VUX0JVSUxEX0NPTlNUX0tFWV9NQVAsCisgICAgJiZUQVJHRVRfQlVJTERfU1RSSU5HLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLApkaWZmIC0tZ2l0IGEvUHl0aG9uL3BlZXBob2xlLmMgYi9QeXRob24vcGVlcGhvbGUuYwppbmRleCA0ZTY1N2ZhLi5iMmMwMjc5IDEwMDY0NAotLS0gYS9QeXRob24vcGVlcGhvbGUuYworKysgYi9QeXRob24vcGVlcGhvbGUuYwpAQCAtOCw4ICs4LDggQEAKICNpbmNsdWRlICJjb2RlLmgiCiAjaW5jbHVkZSAic3ltdGFibGUuaCIKICNpbmNsdWRlICJvcGNvZGUuaCIKKyNpbmNsdWRlICJ3b3JkY29kZV9oZWxwZXJzLmgiCiAKLSNkZWZpbmUgR0VUQVJHKGFyciwgaSkgKChpbnQpKChhcnJbaSsyXTw8OCkgKyBhcnJbaSsxXSkpCiAjZGVmaW5lIFVOQ09ORElUSU9OQUxfSlVNUChvcCkgIChvcD09SlVNUF9BQlNPTFVURSB8fCBvcD09SlVNUF9GT1JXQVJEKQogI2RlZmluZSBDT05ESVRJT05BTF9KVU1QKG9wKSAob3A9PVBPUF9KVU1QX0lGX0ZBTFNFIHx8IG9wPT1QT1BfSlVNUF9JRl9UUlVFIFwKICAgICB8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCkBAIC0xNywyMiArMTcsMTUgQEAKICAgICB8fCBvcD09UE9QX0pVTVBfSUZfRkFMU0UgfHwgb3A9PVBPUF9KVU1QX0lGX1RSVUUgXAogICAgIHx8IG9wPT1KVU1QX0lGX0ZBTFNFX09SX1BPUCB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKICNkZWZpbmUgSlVNUFNfT05fVFJVRShvcCkgKG9wPT1QT1BfSlVNUF9JRl9UUlVFIHx8IG9wPT1KVU1QX0lGX1RSVUVfT1JfUE9QKQotI2RlZmluZSBHRVRKVU1QVEdUKGFyciwgaSkgKEdFVEFSRyhhcnIsaSkgKyAoQUJTT0xVVEVfSlVNUChhcnJbaV0pID8gMCA6IGkrMykpCi0jZGVmaW5lIFNFVEFSRyhhcnIsIGksIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNzZXJ0KDAgPD0gdmFsICYmIHZhbCA8PSAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJyW2krMl0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKT4+OCk7ICAgICBcCi0gICAgYXJyW2krMV0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKSAmIDI1NSk7ICBcCi19IHdoaWxlKDApCi0jZGVmaW5lIENPREVTSVpFKG9wKSAgKEhBU19BUkcob3ApID8gMyA6IDEpCi0jZGVmaW5lIElTQkFTSUNCTE9DSyhibG9ja3MsIHN0YXJ0LCBieXRlcykgXAotICAgIChibG9ja3Nbc3RhcnRdPT1ibG9ja3Nbc3RhcnQrYnl0ZXMtMV0pCisjZGVmaW5lIEdFVEpVTVBUR1QoYXJyLCBpKSAoZ2V0X2FyZyhhcnIsIGkpICsgKEFCU09MVVRFX0pVTVAoYXJyW2ldKSA/IDAgOiBpKzIpKQorI2RlZmluZSBJU0JBU0lDQkxPQ0soYmxvY2tzLCBzdGFydCwgZW5kKSBcCisgICAgKGJsb2Nrc1tzdGFydF09PWJsb2Nrc1tlbmRdKQogCiAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfQ1JFQVRFKCkgeyBcCiAgICAgY29uc3Rfc3RhY2tfc2l6ZSA9IDI1NjsgXAogICAgIGNvbnN0X3N0YWNrID0gUHlNZW1fTmV3KFB5T2JqZWN0ICosIGNvbnN0X3N0YWNrX3NpemUpOyBcCi0gICAgbG9hZF9jb25zdF9zdGFjayA9IFB5TWVtX05ldyhQeV9zc2l6ZV90LCBjb25zdF9zdGFja19zaXplKTsgXAotICAgIGlmICghY29uc3Rfc3RhY2sgfHwgIWxvYWRfY29uc3Rfc3RhY2spIHsgXAorICAgIGlmICghY29uc3Rfc3RhY2spIHsgXAogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOyBcCiAgICAgICAgIGdvdG8gZXhpdEVycm9yOyBcCiAgICAgfSBcCkBAIC00MSwyNyArMzQsMjMgQEAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfREVMRVRFKCkgZG8geyBcCiAgICAgaWYgKGNvbnN0X3N0YWNrKSBcCiAgICAgICAgIFB5TWVtX0ZyZWUoY29uc3Rfc3RhY2spOyBcCi0gICAgaWYgKGxvYWRfY29uc3Rfc3RhY2spIFwKLSAgICAgICAgUHlNZW1fRnJlZShsb2FkX2NvbnN0X3N0YWNrKTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19MRU4oKSAoY29uc3Rfc3RhY2tfdG9wICsgMSkKKyNkZWZpbmUgQ09OU1RfU1RBQ0tfTEVOKCkgKCh1bnNpZ25lZCkoY29uc3Rfc3RhY2tfdG9wICsgMSkpCiAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKSBkbyB7IFwKICAgICBQeU9iamVjdCAqX3g7IFwKICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsgXAotICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUoY29uc3RzKSA+IEdFVEFSRyhjb2Rlc3RyLCBpKSk7IFwKLSAgICBfeCA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCBpKSk7IFwKKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykgPiAoUHlfc3NpemVfdClnZXRfYXJnKGNvZGVzdHIsIGkpKTsgXAorICAgIF94ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgZ2V0X2FyZyhjb2Rlc3RyLCBpKSk7IFwKICAgICBpZiAoKytjb25zdF9zdGFja190b3AgPj0gY29uc3Rfc3RhY2tfc2l6ZSkgeyBcCiAgICAgICAgIGNvbnN0X3N0YWNrX3NpemUgKj0gMjsgXAogICAgICAgICBQeU1lbV9SZXNpemUoY29uc3Rfc3RhY2ssIFB5T2JqZWN0ICosIGNvbnN0X3N0YWNrX3NpemUpOyBcCi0gICAgICAgIFB5TWVtX1Jlc2l6ZShsb2FkX2NvbnN0X3N0YWNrLCBQeV9zc2l6ZV90LCBjb25zdF9zdGFja19zaXplKTsgXAotICAgICAgICBpZiAoIWNvbnN0X3N0YWNrIHx8ICFsb2FkX2NvbnN0X3N0YWNrKSB7IFwKKyAgICAgICAgaWYgKCFjb25zdF9zdGFjaykgeyBcCiAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOyBcCiAgICAgICAgICAgICBnb3RvIGV4aXRFcnJvcjsgXAogICAgICAgICB9IFwKICAgICB9IFwKLSAgICBsb2FkX2NvbnN0X3N0YWNrW2NvbnN0X3N0YWNrX3RvcF0gPSBpOyBcCiAgICAgY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wXSA9IF94OyBcCiAgICAgaW5fY29uc3RzID0gMTsgXAogICAgIH0gd2hpbGUoMCkKQEAgLTcwLDIyICs1OSwxMDggQEAKICAgICBjb25zdF9zdGFja190b3AgPSAtMTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19UT1AoKSBcCi0gICAgY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wXQotCiAjZGVmaW5lIENPTlNUX1NUQUNLX0xBU1ROKGkpIFwKLSAgICAmY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wIC0gaSArIDFdCisgICAgJmNvbnN0X3N0YWNrW0NPTlNUX1NUQUNLX0xFTigpIC0gaV0KIAogI2RlZmluZSBDT05TVF9TVEFDS19QT1AoaSkgZG8geyBcCi0gICAgYXNzZXJ0KGNvbnN0X3N0YWNrX3RvcCArIDEgPj0gaSk7IFwKKyAgICBhc3NlcnQoQ09OU1RfU1RBQ0tfTEVOKCkgPj0gaSk7IFwKICAgICBjb25zdF9zdGFja190b3AgLT0gaTsgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBDT05TVF9TVEFDS19PUF9MQVNUTihpKSBcCi0gICAgKChjb25zdF9zdGFja190b3AgPj0gaSAtIDEpID8gbG9hZF9jb25zdF9zdGFja1tjb25zdF9zdGFja190b3AgLSBpICsgMV0gOiAtMSkKKy8qIFNjYW5zIGJhY2sgTiBjb25zZWN1dGl2ZSBMT0FEX0NPTlNUIGluc3RydWN0aW9ucywgc2tpcHBpbmcgTk9QcywKKyAgIHJldHVybnMgaW5kZXggb2YgdGhlIE50aCBsYXN0J3MgTE9BRF9DT05TVCdzIEVYVEVOREVEX0FSRyBwcmVmaXguCisgICBDYWxsZXJzIGFyZSByZXNwb25zaWJsZSB0byBjaGVjayBDT05TVF9TVEFDS19MRU4gYmVmb3JlaGFuZC4KKyovCitzdGF0aWMgUHlfc3NpemVfdAorbGFzdG5fY29uc3Rfc3RhcnQodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IG4pCit7CisgICAgYXNzZXJ0KG4gPiAwICYmIChpJjEpID09IDApOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaSAtPSAyOworICAgICAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICAgICAgaWYgKGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCkgeworICAgICAgICAgICAgaWYgKCEtLW4pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgY29kZXN0cltpLTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICAgICAgICAgICAgICBpIC09IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTk9QIHx8IGNvZGVzdHJbaV0gPT0gRVhURU5ERURfQVJHKTsKKyAgICAgICAgfQorICAgIH0KK30KIAorLyogU2NhbnMgdGhyb3VnaCBFWFRFTkRFRCBBUkdzLCBzZWVraW5nIHRoZSBpbmRleCBvZiB0aGUgZWZmZWN0aXZlIG9wY29kZSAqLworc3RhdGljIFB5X3NzaXplX3QKK2ZpbmRfb3AodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpKQoreworICAgIGFzc2VydCgoaSYxKSA9PSAwKTsKKyAgICB3aGlsZSAoY29kZXN0cltpXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgaSArPSAyOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KIAotLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIC4uLiBMT0FEX0NPTlNUIGNuIEJVSUxEX1RVUExFIG4KKy8qIEdpdmVuIHRoZSBpbmRleCBvZiB0aGUgZWZmZWN0aXZlIG9wY29kZSwKKyAgIHNjYW4gYmFjayB0byBjb25zdHJ1Y3QgdGhlIG9wYXJnIHdpdGggRVhURU5ERURfQVJHICovCitzdGF0aWMgdW5zaWduZWQgaW50CitnZXRfYXJnKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgaSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgb3BhcmcgPSBjb2Rlc3RyW2krMV07CisgICAgYXNzZXJ0KChpJjEpID09IDApOworICAgIGlmIChpID49IDIgJiYgY29kZXN0cltpLTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktMV0gPDwgODsKKyAgICAgICAgaWYgKGkgPj0gNCAmJiBjb2Rlc3RyW2ktNF0gPT0gRVhURU5ERURfQVJHKSB7CisgICAgICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktM10gPDwgMTY7CisgICAgICAgICAgICBpZiAoaSA+PSA2ICYmIGNvZGVzdHJbaS02XSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgICAgICBvcGFyZyB8PSBjb2Rlc3RyW2ktNV0gPDwgMjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9wYXJnOworfQorCisvKiBHaXZlbiB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdGl2ZSBvcGNvZGUsCisgICBhdHRlbXB0IHRvIHJlcGxhY2UgdGhlIGFyZ3VtZW50LCB0YWtpbmcgaW50byBhY2NvdW50IEVYVEVOREVEX0FSRy4KKyAgIFJldHVybnMgLTEgb24gZmFpbHVyZSwgb3IgdGhlIG5ldyBvcCBpbmRleCBvbiBzdWNjZXNzICovCitzdGF0aWMgUHlfc3NpemVfdAorc2V0X2FyZyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IGksIHVuc2lnbmVkIGludCBvcGFyZykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY3VyYXJnID0gZ2V0X2FyZyhjb2Rlc3RyLCBpKTsKKyAgICBpbnQgY3VyaWxlbiwgbmV3aWxlbjsKKyAgICBpZiAoY3VyYXJnID09IG9wYXJnKQorICAgICAgICByZXR1cm4gaTsKKyAgICBjdXJpbGVuID0gaW5zdHJzaXplKGN1cmFyZyk7CisgICAgbmV3aWxlbiA9IGluc3Ryc2l6ZShvcGFyZyk7CisgICAgaWYgKGN1cmlsZW4gPCBuZXdpbGVuKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3cml0ZV9vcF9hcmcoY29kZXN0ciArIGkgKyAyIC0gY3VyaWxlbiwgY29kZXN0cltpXSwgb3BhcmcsIG5ld2lsZW4pOworICAgIG1lbXNldChjb2Rlc3RyICsgaSArIDIgLSBjdXJpbGVuICsgbmV3aWxlbiwgTk9QLCBjdXJpbGVuIC0gbmV3aWxlbik7CisgICAgcmV0dXJuIGktY3VyaWxlbituZXdpbGVuOworfQorCisvKiBBdHRlbXB0IHRvIHdyaXRlIG9wL2FyZyBhdCBlbmQgb2Ygc3BlY2lmaWVkIHJlZ2lvbiBvZiBtZW1vcnkuCisgICBQcmVjZWRpbmcgbWVtb3J5IGluIHRoZSByZWdpb24gaXMgb3ZlcndyaXR0ZW4gd2l0aCBOT1BzLgorICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLCBvcCBpbmRleCBvbiBzdWNjZXNzICovCitzdGF0aWMgUHlfc3NpemVfdAorY29weV9vcF9hcmcodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpLCB1bnNpZ25lZCBjaGFyIG9wLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG9wYXJnLCBQeV9zc2l6ZV90IG1heGkpCit7CisgICAgaW50IGlsZW4gPSBpbnN0cnNpemUob3BhcmcpOworICAgIGFzc2VydCgoaSYxKSA9PSAwKTsKKyAgICBpZiAoaSArIGlsZW4gPiBtYXhpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd3JpdGVfb3BfYXJnKGNvZGVzdHIgKyBtYXhpIC0gaWxlbiwgb3AsIG9wYXJnLCBpbGVuKTsKKyAgICBtZW1zZXQoY29kZXN0ciArIGksIE5PUCwgbWF4aSAtIGkgLSBpbGVuKTsKKyAgICByZXR1cm4gbWF4aSAtIDI7Cit9CisKKy8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMSwgTE9BRF9DT05TVCBjMiAuLi4gTE9BRF9DT05TVCBjbiwgQlVJTERfVFVQTEUgbgogICAgd2l0aCAgICBMT0FEX0NPTlNUIChjMSwgYzIsIC4uLiBjbikuCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgKGMxLCBjMiwgLi4uIGNuKSBjYW4gYmUgYXBwZW5kZWQuCkBAIC05NCw5ICsxNjksMTAgQEAKICAgIEFsc28gd29ya3MgZm9yIEJVSUxEX0xJU1QgYW5kIEJVSUxUX1NFVCB3aGVuIGZvbGxvd2VkIGJ5IGFuICJpbiIgb3IgIm5vdCBpbiIKICAgIHRlc3Q7IGZvciBCVUlMRF9TRVQgaXQgYXNzZW1ibGVzIGEgZnJvemVuc2V0IHJhdGhlciB0aGFuIGEgdHVwbGUuCiAqLwotc3RhdGljIGludAotdHVwbGVfb2ZfY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgbiwKLSAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqKm9ianMpCitzdGF0aWMgUHlfc3NpemVfdAorZm9sZF90dXBsZV9vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICoqb2JqcywgaW50IG4pCiB7CiAgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqY29uc3RhbnQ7CiAgICAgUHlfc3NpemVfdCBpLCBsZW5fY29uc3RzOwpAQCAtMTA2LDkgKzE4Miw5IEBACiAKICAgICAvKiBCdWlsZHVwIG5ldyB0dXBsZSBvZiBjb25zdGFudHMgKi8KICAgICBuZXdjb25zdCA9IFB5VHVwbGVfTmV3KG4pOwotICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CisgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgewogICAgICAgICBjb25zdGFudCA9IG9ianNbaV07CiAgICAgICAgIFB5X0lOQ1JFRihjb25zdGFudCk7CkBAIC0xMTYsMzAgKzE5MiwyNiBAQAogICAgIH0KIAogICAgIC8qIElmIGl0J3MgYSBCVUlMRF9TRVQsIHVzZSB0aGUgUHlUdXBsZSB3ZSBqdXN0IGJ1aWx0IHRvIGNyZWF0ZSBhCi0gICAgICBQeUZyb3plblNldCwgYW5kIHVzZSB0aGF0IGFzIHRoZSBjb25zdGFudCBpbnN0ZWFkOiAqLwotICAgIGlmIChjb2Rlc3RyWzBdID09IEJVSUxEX1NFVCkgewotICAgICAgICBQeU9iamVjdCAqdHVwbGUgPSBuZXdjb25zdDsKLSAgICAgICAgbmV3Y29uc3QgPSBQeUZyb3plblNldF9OZXcodHVwbGUpOwotICAgICAgICBQeV9ERUNSRUYodHVwbGUpOwotICAgICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIFB5RnJvemVuU2V0LCBhbmQgdXNlIHRoYXQgYXMgdGhlIGNvbnN0YW50IGluc3RlYWQ6ICovCisgICAgaWYgKG9wY29kZSA9PSBCVUlMRF9TRVQpIHsKKyAgICAgICAgUHlfU0VUUkVGKG5ld2NvbnN0LCBQeUZyb3plblNldF9OZXcobmV3Y29uc3QpKTsKKyAgICAgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgb250byBjb25zdHMgKi8KKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotICAgIC8qIFdyaXRlIE5PUHMgb3ZlciBvbGQgTE9BRF9DT05TVFMgYW5kCi0gICAgICAgYWRkIGEgbmV3IExPQURfQ09OU1QgbmV3Y29uc3Qgb24gdG9wIG9mIHRoZSBCVUlMRF9UVVBMRSBuICovCi0gICAgY29kZXN0clswXSA9IExPQURfQ09OU1Q7Ci0gICAgU0VUQVJHKGNvZGVzdHIsIDAsIGxlbl9jb25zdHMpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiBjb3B5X29wX2FyZyhjb2Rlc3RyLCBjX3N0YXJ0LCBMT0FEX0NPTlNULCBsZW5fY29uc3RzLCBvcGNvZGVfZW5kKTsKIH0KIAotLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIEJJTk9QCisvKiBSZXBsYWNlIExPQURfQ09OU1QgYzEsIExPQURfQ09OU1QgYzIsIEJJTk9QCiAgICB3aXRoICAgIExPQURfQ09OU1QgYmlub3AoYzEsYzIpCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgY2FuIGJlIGFwcGVuZGVkLgpAQCAtMTQ5LDIwICsyMjEsMjEgQEAKICAgIGlzIGJlbG93IGEgdGhyZXNob2xkIHZhbHVlLiAgVGhhdCBrZWVwcyBweWMgZmlsZXMgZnJvbQogICAgYmVjb21pbmcgbGFyZ2UgaW4gdGhlIHByZXNlbmNlIG9mIGNvZGUgbGlrZTogIChOb25lLCkqMTAwMC4KICovCi1zdGF0aWMgaW50Ci1mb2xkX2Jpbm9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKipvYmpzKQorc3RhdGljIFB5X3NzaXplX3QKK2ZvbGRfYmlub3BzX29uX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IGNfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqKm9ianMpCiB7CiAgICAgUHlPYmplY3QgKm5ld2NvbnN0LCAqdiwgKnc7CiAgICAgUHlfc3NpemVfdCBsZW5fY29uc3RzLCBzaXplOwotICAgIGludCBvcGNvZGU7CiAKICAgICAvKiBQcmUtY29uZGl0aW9ucyAqLwogICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAKICAgICAvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCiAgICAgdiA9IG9ianNbMF07CiAgICAgdyA9IG9ianNbMV07Ci0gICAgb3Bjb2RlID0gY29kZXN0clswXTsKICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICBjYXNlIEJJTkFSWV9QT1dFUjoKICAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CkBAIC0yMDgsNTAgKzI4MSw0OCBAQAogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBiaW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAogICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpCisgICAgICAgIGlmKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBzaXplID0gUHlPYmplY3RfU2l6ZShuZXdjb25zdCk7CiAgICAgaWYgKHNpemUgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpKQotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgfSBlbHNlIGlmIChzaXplID4gMjApIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCi0gICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwogICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLSAgICAvKiBXcml0ZSBOT1AgTk9QIE5PUCBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLwotICAgIGNvZGVzdHJbLTJdID0gTE9BRF9DT05TVDsKLSAgICBTRVRBUkcoY29kZXN0ciwgLTIsIGxlbl9jb25zdHMpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiBjb3B5X29wX2FyZyhjb2Rlc3RyLCBjX3N0YXJ0LCBMT0FEX0NPTlNULCBsZW5fY29uc3RzLCBvcGNvZGVfZW5kKTsKIH0KIAotc3RhdGljIGludAotZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKnYpCitzdGF0aWMgUHlfc3NpemVfdAorZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvcGNvZGVfZW5kLCB1bnNpZ25lZCBjaGFyIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICp2KQogewogICAgIFB5T2JqZWN0ICpuZXdjb25zdDsKICAgICBQeV9zc2l6ZV90IGxlbl9jb25zdHM7Ci0gICAgaW50IG9wY29kZTsKIAogICAgIC8qIFByZS1jb25kaXRpb25zICovCiAgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KGNvbnN0cykpOwotICAgIGFzc2VydChjb2Rlc3RyWzBdID09IExPQURfQ09OU1QpOworICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKIAogICAgIC8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KLSAgICBvcGNvZGUgPSBjb2Rlc3RyWzNdOwogICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CiAgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOwpAQCAtMjY3LDM1ICszMzgsMzEgQEAKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgdW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAogICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgewotICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpCisgICAgICAgIGlmKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KLSAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKICAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotICAgIC8qIFdyaXRlIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCi0gICAgY29kZXN0clswXSA9IE5PUDsKLSAgICBjb2Rlc3RyWzFdID0gTE9BRF9DT05TVDsKLSAgICBTRVRBUkcoY29kZXN0ciwgMSwgbGVuX2NvbnN0cyk7Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIGNvcHlfb3BfYXJnKGNvZGVzdHIsIGNfc3RhcnQsIExPQURfQ09OU1QsIGxlbl9jb25zdHMsIG9wY29kZV9lbmQpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50ICoKIG1hcmtibG9ja3ModW5zaWduZWQgY2hhciAqY29kZSwgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgdW5zaWduZWQgaW50ICpibG9ja3MgPSBQeU1lbV9OZXcodW5zaWduZWQgaW50LCBsZW4pOwotICAgIGludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOworICAgIGludCBpLCBqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKIAogICAgIGlmIChibG9ja3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMzA0LDcgKzM3MSw3IEBACiAgICAgbWVtc2V0KGJsb2NrcywgMCwgbGVuKnNpemVvZihpbnQpKTsKIAogICAgIC8qIE1hcmsgbGFiZWxzIGluIHRoZSBmaXJzdCBwYXNzICovCi0gICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrPUNPREVTSVpFKG9wY29kZSkpIHsKKyAgICBmb3IgKGk9MCA7IGk8bGVuIDsgaSs9MikgewogICAgICAgICBvcGNvZGUgPSBjb2RlW2ldOwogICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICAgICAgY2FzZSBGT1JfSVRFUjoKQEAgLTMyNiw3ICszOTMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8qIEJ1aWxkIGJsb2NrIG51bWJlcnMgaW4gdGhlIHNlY29uZCBwYXNzICovCi0gICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrKykgeworICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKz0yKSB7CiAgICAgICAgIGJsb2NrY250ICs9IGJsb2Nrc1tpXTsgICAgICAgICAgLyogaW5jcmVtZW50IGJsb2NrY250IG92ZXIgbGFiZWxzICovCiAgICAgICAgIGJsb2Nrc1tpXSA9IGJsb2NrY250OwogICAgIH0KQEAgLTMzNywzMyArNDA0LDI3IEBACiAgICBUaGUgY29uc3RzIG9iamVjdCBzaG91bGQgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHRvIGFsbG93IG5ldyBjb25zdGFudHMKICAgIHRvIGJlIGFwcGVuZGVkLgogCi0gICBUbyBrZWVwIHRoZSBvcHRpbWl6ZXIgc2ltcGxlLCBpdCBiYWlscyBvdXQgKGRvZXMgbm90aGluZykgZm9yIGNvZGUgdGhhdAotICAgaGFzIGEgbGVuZ3RoIG92ZXIgMzIsNzAwLCBhbmQgZG9lcyBub3QgY2FsY3VsYXRlIGV4dGVuZGVkIGFyZ3VtZW50cy4KLSAgIFRoYXQgYWxsb3dzIHVzIHRvIGF2b2lkIG92ZXJmbG93IGFuZCBzaWduIGlzc3Vlcy4gTGlrZXdpc2UsIGl0IGJhaWxzIHdoZW4KLSAgIHRoZSBsaW5lbm8gdGFibGUgaGFzIGNvbXBsZXggZW5jb2RpbmcgZm9yIGdhcHMgPj0gMjU1LiBFWFRFTkRFRF9BUkcgY2FuCi0gICBhcHBlYXIgYmVmb3JlIE1BS0VfRlVOQ1RJT047IGluIHRoaXMgY2FzZSBib3RoIG9wY29kZXMgYXJlIHNraXBwZWQuCi0gICBFWFRFTkRFRF9BUkcgcHJlY2VkaW5nIGFueSBvdGhlciBvcGNvZGUgY2F1c2VzIHRoZSBvcHRpbWl6ZXIgdG8gYmFpbC4KKyAgIFRvIGtlZXAgdGhlIG9wdGltaXplciBzaW1wbGUsIGl0IGJhaWxzIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBoYXMgY29tcGxleAorICAgZW5jb2RpbmcgZm9yIGdhcHMgPj0gMjU1LgogCiAgICBPcHRpbWl6YXRpb25zIGFyZSByZXN0cmljdGVkIHRvIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbnMgb2NjdXJyaW5nIHdpdGhpbiBhCiAgICBzaW5nbGUgYmFzaWMgYmxvY2suICBBbGwgdHJhbnNmb3JtYXRpb25zIGtlZXAgdGhlIGNvZGUgc2l6ZSB0aGUgc2FtZSBvcgogICAgc21hbGxlci4gIEZvciB0aG9zZSB0aGF0IHJlZHVjZSBzaXplLCB0aGUgZ2FwcyBhcmUgaW5pdGlhbGx5IGZpbGxlZCB3aXRoCiAgICBOT1BzLiAgTGF0ZXIgdGhvc2UgTk9QcyBhcmUgcmVtb3ZlZCBhbmQgdGhlIGp1bXAgYWRkcmVzc2VzIHJldGFyZ2V0ZWQgaW4KLSAgIGEgc2luZ2xlIHBhc3MuICBMaW5lIG51bWJlcmluZyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi8KKyAgIGEgc2luZ2xlIHBhc3MuICovCiAKIFB5T2JqZWN0ICoKIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywgUHlPYmplY3QgKm5hbWVzLAotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsaW5lbm9fb2JqKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsbm90YWJfb2JqKQogewotICAgIFB5X3NzaXplX3QgaSwgaiwgY29kZWxlbjsKLSAgICBpbnQgbm9wcywgaCwgYWRqOwotICAgIGludCB0Z3QsIHRndHRndCwgb3Bjb2RlOworICAgIFB5X3NzaXplX3QgaCwgaSwgbmV4dGksIG9wX3N0YXJ0LCBjb2RlbGVuLCB0Z3Q7CisgICAgdW5zaWduZWQgaW50IGosIG5vcHM7CisgICAgdW5zaWduZWQgY2hhciBvcGNvZGUsIG5leHRvcDsKICAgICB1bnNpZ25lZCBjaGFyICpjb2Rlc3RyID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyICpsaW5lbm87Ci0gICAgaW50ICphZGRybWFwID0gTlVMTDsKLSAgICBpbnQgbmV3X2xpbmUsIGN1bV9vcmlnX2xpbmUsIGxhc3RfbGluZTsKKyAgICB1bnNpZ25lZCBjaGFyICpsbm90YWI7CisgICAgdW5zaWduZWQgaW50IGN1bV9vcmlnX29mZnNldCwgbGFzdF9vZmZzZXQ7CiAgICAgUHlfc3NpemVfdCB0YWJzaXo7CiAgICAgUHlPYmplY3QgKipjb25zdF9zdGFjayA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCAqbG9hZF9jb25zdF9zdGFjayA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBjb25zdF9zdGFja190b3AgPSAtMTsKICAgICBQeV9zc2l6ZV90IGNvbnN0X3N0YWNrX3NpemUgPSAwOwogICAgIGludCBpbl9jb25zdHMgPSAwOyAgLyogd2hldGhlciB3ZSBhcmUgaW4gYSBMT0FEX0NPTlNUIHNlcXVlbmNlICovCkBAIC0zNzMsMTggKzQzNCwyMSBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICBnb3RvIGV4aXRFcnJvcjsKIAotICAgIC8qIEJ5cGFzcyBvcHRpbWl6YXRpb24gd2hlbiB0aGUgbGluZW5vIHRhYmxlIGlzIHRvbyBjb21wbGV4ICovCi0gICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sobGluZW5vX29iaikpOwotICAgIGxpbmVubyA9ICh1bnNpZ25lZCBjaGFyKilQeUJ5dGVzX0FTX1NUUklORyhsaW5lbm9fb2JqKTsKLSAgICB0YWJzaXogPSBQeUJ5dGVzX0dFVF9TSVpFKGxpbmVub19vYmopOwotICAgIGlmIChtZW1jaHIobGluZW5vLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkKKyAgICAvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxub3RhYiB0YWJsZSBpcyB0b28gY29tcGxleCAqLworICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGxub3RhYl9vYmopKTsKKyAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciopUHlCeXRlc19BU19TVFJJTkcobG5vdGFiX29iaik7CisgICAgdGFic2l6ID0gUHlCeXRlc19HRVRfU0laRShsbm90YWJfb2JqKTsKKyAgICBhc3NlcnQodGFic2l6ID09IDAgfHwgUHlfUkVGQ05UKGxub3RhYl9vYmopID09IDEpOworICAgIGlmIChtZW1jaHIobG5vdGFiLCAyNTUsIHRhYnNpeikgIT0gTlVMTCkgeworICAgICAgICAvKiAyNTUgdmFsdWUgYXJlIHVzZWQgZm9yIG11bHRpYnl0ZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgKi8KICAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOworICAgIH0KKyAgICAvKiBOb3RlOiAtMTI4IGFuZCAxMjcgc3BlY2lhbCB2YWx1ZXMgZm9yIGxpbmUgbnVtYmVyIGRlbHRhIGFyZSBvaywKKyAgICAgICB0aGUgcGVlcGhvbGUgb3B0aW1pemVyIGRvZXNuJ3QgbW9kaWZ5IGxpbmUgbnVtYmVycy4gKi8KIAotICAgIC8qIEF2b2lkIHNpdHVhdGlvbnMgd2hlcmUganVtcCByZXRhcmdldGluZyBjb3VsZCBvdmVyZmxvdyAqLwogICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGNvZGUpKTsKICAgICBjb2RlbGVuID0gUHlCeXRlc19HRVRfU0laRShjb2RlKTsKLSAgICBpZiAoY29kZWxlbiA+IDMyNzAwKQotICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgYXNzZXJ0KGNvZGVsZW4gJSAyID09IDApOwogCiAgICAgLyogTWFrZSBhIG1vZGlmaWFibGUgY29weSBvZiB0aGUgY29kZSBzdHJpbmcgKi8KICAgICBjb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoY29kZWxlbik7CkBAIC0zOTUsMjEgKzQ1OSw2IEBACiAgICAgY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtY3B5KGNvZGVzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGNvZGUpLCBjb2RlbGVuKTsKIAotICAgIC8qIFZlcmlmeSB0aGF0IFJFVFVSTl9WQUxVRSB0ZXJtaW5hdGVzIHRoZSBjb2Rlc3RyaW5nLiAgICAgIFRoaXMgYWxsb3dzCi0gICAgICAgdGhlIHZhcmlvdXMgdHJhbnNmb3JtYXRpb24gcGF0dGVybnMgdG8gbG9vayBhaGVhZCBzZXZlcmFsCi0gICAgICAgaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIG5vdAotICAgICAgIGxvb2tpbmcgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGNvZGUgc3RyaW5nLgotICAgICovCi0gICAgaWYgKGNvZGVzdHJbY29kZWxlbi0xXSAhPSBSRVRVUk5fVkFMVUUpCi0gICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKLQotICAgIC8qIE1hcHBpbmcgdG8gbmV3IGp1bXAgdGFyZ2V0cyBhZnRlciBOT1BzIGFyZSByZW1vdmVkICovCi0gICAgYWRkcm1hcCA9IFB5TWVtX05ldyhpbnQsIGNvZGVsZW4pOwotICAgIGlmIChhZGRybWFwID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgZ290byBleGl0RXJyb3I7Ci0gICAgfQotCiAgICAgYmxvY2tzID0gbWFya2Jsb2Nrcyhjb2Rlc3RyLCBjb2RlbGVuKTsKICAgICBpZiAoYmxvY2tzID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXhpdEVycm9yOwpAQCAtNDE3LDkgKzQ2NiwxNyBAQAogCiAgICAgQ09OU1RfU1RBQ0tfQ1JFQVRFKCk7CiAKLSAgICBmb3IgKGk9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKLSAgICAgIHJlb3B0aW1pemVfY3VycmVudDoKKyAgICBmb3IgKGk9ZmluZF9vcChjb2Rlc3RyLCAwKSA7IGk8Y29kZWxlbiA7IGk9bmV4dGkpIHsKICAgICAgICAgb3Bjb2RlID0gY29kZXN0cltpXTsKKyAgICAgICAgb3Bfc3RhcnQgPSBpOworICAgICAgICB3aGlsZSAob3Bfc3RhcnQgPj0gMiAmJiBjb2Rlc3RyW29wX3N0YXJ0LTJdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICAgICAgb3Bfc3RhcnQgLT0gMjsKKyAgICAgICAgfQorCisgICAgICAgIG5leHRpID0gaSArIDI7CisgICAgICAgIHdoaWxlIChuZXh0aSA8IGNvZGVsZW4gJiYgY29kZXN0cltuZXh0aV0gPT0gRVhURU5ERURfQVJHKQorICAgICAgICAgICAgbmV4dGkgKz0gMjsKKyAgICAgICAgbmV4dG9wID0gbmV4dGkgPCBjb2RlbGVuID8gY29kZXN0cltuZXh0aV0gOiAwOwogCiAgICAgICAgIGlmICghaW5fY29uc3RzKSB7CiAgICAgICAgICAgICBDT05TVF9TVEFDS19SRVNFVCgpOwpAQCAtNDMwLDE0ICs0ODcsMTIgQEAKICAgICAgICAgICAgIC8qIFJlcGxhY2UgVU5BUllfTk9UIFBPUF9KVU1QX0lGX0ZBTFNFCiAgICAgICAgICAgICAgICB3aXRoICAgIFBPUF9KVU1QX0lGX1RSVUUgKi8KICAgICAgICAgICAgIGNhc2UgVU5BUllfTk9UOgotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krMV0gIT0gUE9QX0pVTVBfSUZfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgfHwgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKzEpOwotICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7Ci0gICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHRvcCAhPSBQT1BfSlVNUF9JRl9GQUxTRQorICAgICAgICAgICAgICAgICAgICB8fCAhSVNCQVNJQ0JMT0NLKGJsb2Nrcywgb3Bfc3RhcnQsIGkrMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQsIE5PUCwgaSAtIG9wX3N0YXJ0ICsgMik7CisgICAgICAgICAgICAgICAgY29kZXN0cltuZXh0aV0gPSBQT1BfSlVNUF9JRl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgLyogbm90IGEgaXMgYiAtLT4gIGEgaXMgbm90IGIKICAgICAgICAgICAgICAgICAgICBub3QgYSBpbiBiIC0tPiAgYSBub3QgaW4gYgpAQCAtNDQ1LDc4ICs1MDAsNzkgQEAKICAgICAgICAgICAgICAgICAgICBub3QgYSBub3QgaW4gYiAtLT4gIGEgaW4gYgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBjYXNlIENPTVBBUkVfT1A6Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoaiA8IDYgIHx8ICBqID4gOSAgfHwKLSAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpKzNdICE9IFVOQVJZX05PVCAgfHwKLSAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIChqXjEpKTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gPSBOT1A7CisgICAgICAgICAgICAgICAgaiA9IGdldF9hcmcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGogPCA2IHx8IGogPiA5IHx8CisgICAgICAgICAgICAgICAgICAgIG5leHRvcCAhPSBVTkFSWV9OT1QgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpICsgMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaSsxXSA9IChqXjEpOworICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgaSArIDIsIE5PUCwgbmV4dGkgLSBpKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBMT0FEX0NPTlNUIHRydWVjb25zdAotICAgICAgICAgICAgICAgICAgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4LiBUaGlzIGltcHJvdmVzCi0gICAgICAgICAgICAgICAgICAgIndoaWxlIDEiIHBlcmZvcm1hbmNlLiAqLworICAgICAgICAgICAgICAgICAgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4LiAgVGhpcyBpbXByb3ZlcworICAgICAgICAgICAgICAgICAgICJ3aGlsZSAxIiBwZXJmb3JtYW5jZS4gICovCiAgICAgICAgICAgICBjYXNlIExPQURfQ09OU1Q6CiAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKTsKLSAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krM10gIT0gUE9QX0pVTVBfSUZfRkFMU0UgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpLCBOT1AsIDYpOwotICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1JFU0VUKCk7CisgICAgICAgICAgICAgICAgaWYgKG5leHRvcCAhPSBQT1BfSlVNUF9JRl9GQUxTRSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpICsgMikgIHx8CisgICAgICAgICAgICAgICAgICAgICFQeU9iamVjdF9Jc1RydWUoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgZ2V0X2FyZyhjb2Rlc3RyLCBpKSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgKyAyKTsKKyAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzIGFuZCBzZXRzCi0gICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgorICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmb2xkIHR1cGxlcyBvZiBjb25zdGFudHMgKGluY2x1ZGVzIGEgY2FzZSBmb3IgbGlzdHMKKyAgICAgICAgICAgICAgICAgICBhbmQgc2V0cyB3aGljaCBhcmUgb25seSB1c2VkIGZvciAiaW4iIGFuZCAibm90IGluIiB0ZXN0cykuCiAgICAgICAgICAgICAgICAgICAgU2tpcCBvdmVyIEJVSUxEX1NFUU4gMSBVTlBBQ0tfU0VRTiAxLgogICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAyIFVOUEFDS19TRVFOIDIgd2l0aCBST1QyLgogICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAzIFVOUEFDS19TRVFOIDMgd2l0aCBST1QzIFJPVDIuICovCiAgICAgICAgICAgICBjYXNlIEJVSUxEX1RVUExFOgogICAgICAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgogICAgICAgICAgICAgY2FzZSBCVUlMRF9TRVQ6Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBoID0gQ09OU1RfU1RBQ0tfT1BfTEFTVE4oaik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KChoID49IDAgfHwgQ09OU1RfU1RBQ0tfTEVOKCkgPCBqKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGggPj0gMCAmJiBqID4gMCAmJiBqIDw9IENPTlNUX1NUQUNLX0xFTigpICYmCi0gICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmCi0gICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgaS1oKzMpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgPT0gQlVJTERfTElTVCB8fCBvcGNvZGUgPT0gQlVJTERfU0VUKSAmJgotICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXT09Q09NUEFSRV9PUCAmJgotICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCs2KSAmJgotICAgICAgICAgICAgICAgICAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2ldLCBqLCBjb25zdHMsIENPTlNUX1NUQUNLX0xBU1ROKGopKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZjb2Rlc3RyW2hdLCBOT1AsIGkgLSBoKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKGopOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBqID0gZ2V0X2FyZyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaiA+IDAgJiYgQ09OU1RfU1RBQ0tfTEVOKCkgPj0gaikgeworICAgICAgICAgICAgICAgICAgICBoID0gbGFzdG5fY29uc3Rfc3RhcnQoY29kZXN0ciwgb3Bfc3RhcnQsIGopOworICAgICAgICAgICAgICAgICAgICBpZiAoKG9wY29kZSA9PSBCVUlMRF9UVVBMRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBvcF9zdGFydCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChvcGNvZGUgPT0gQlVJTERfTElTVCB8fCBvcGNvZGUgPT0gQlVJTERfU0VUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKG5leHRvcD09Q09NUEFSRV9PUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZXN0cltuZXh0aSsxXT09NiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltuZXh0aSsxXT09NykpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRvcCA9PSBHRVRfSVRFUikgJiYgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgaSArIDIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGZvbGRfdHVwbGVfb25fY29uc3RhbnRzKGNvZGVzdHIsIGgsIGkrMiwgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cywgQ09OU1RfU1RBQ0tfTEFTVE4oaiksIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSszXSAhPSBVTlBBQ0tfU0VRVUVOQ0UgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNikgfHwKLSAgICAgICAgICAgICAgICAgICAgaiAhPSBHRVRBUkcoY29kZXN0ciwgaSszKSB8fAorICAgICAgICAgICAgICAgIGlmIChuZXh0b3AgIT0gVU5QQUNLX1NFUVVFTkNFICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2Nrcywgb3Bfc3RhcnQsIGkgKyAyKSB8fAorICAgICAgICAgICAgICAgICAgICBqICE9IGdldF9hcmcoY29kZXN0ciwgbmV4dGkpIHx8CiAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9PSBCVUlMRF9TRVQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChqID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSwgTk9QLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGogPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK29wX3N0YXJ0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgKyAyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gMikgewotICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUk9UX1RXTzsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDUpOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0XSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyAyLCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQpOwogICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19SRVNFVCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBST1RfVEhSRUU7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSsxXSA9IFJPVF9UV087Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMiwgTk9QLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltvcF9zdGFydF0gPSBST1RfVEhSRUU7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAyXSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAzXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyA0LCBOT1AsIG5leHRpIC0gb3Bfc3RhcnQgLSAyKTsKICAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUkVTRVQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAvKiBGb2xkIGJpbmFyeSBvcHMgb24gY29uc3RhbnRzLgotICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgTE9BRF9DT05TVCBjMiBCSU5PUCAtLT4gIExPQURfQ09OU1QgYmlub3AoYzEsYzIpICovCisgICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSBMT0FEX0NPTlNUIGMyIEJJTk9QIC0tPiBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLwogICAgICAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKICAgICAgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgpAQCAtNTMwLDM1ICs1ODYsMzQgQEAKICAgICAgICAgICAgIGNhc2UgQklOQVJZX0FORDoKICAgICAgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKICAgICAgICAgICAgIGNhc2UgQklOQVJZX09SOgotICAgICAgICAgICAgICAgIC8qIE5PVEU6IExPQURfQ09OU1QgaXMgc2F2ZWQgYXQgYGktMmAgc2luY2UgaXQgaGFzIGFuIGFyZwotICAgICAgICAgICAgICAgICAgIHdoaWxlIEJJTk9QIGhhc24ndCAqLwotICAgICAgICAgICAgICAgIGggPSBDT05TVF9TVEFDS19PUF9MQVNUTigyKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoKGggPj0gMCB8fCBDT05TVF9TVEFDS19MRU4oKSA8IDIpKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCsxKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKCZjb2Rlc3RyW2ldLCBjb25zdHMsIENPTlNUX1NUQUNLX0xBU1ROKDIpKSkgewotICAgICAgICAgICAgICAgICAgICBpIC09IDI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgmY29kZXN0cltoXSwgTk9QLCBpIC0gaCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMik7Ci0gICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaSk7CisgICAgICAgICAgICAgICAgaWYgKENPTlNUX1NUQUNLX0xFTigpIDwgMikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaCA9IGxhc3RuX2NvbnN0X3N0YXJ0KGNvZGVzdHIsIG9wX3N0YXJ0LCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgb3Bfc3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGggPSBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoY29kZXN0ciwgaCwgaSsyLCBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzLCBDT05TVF9TVEFDS19MQVNUTigyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAvKiBGb2xkIHVuYXJ5IG9wcyBvbiBjb25zdGFudHMuCi0gICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCBjMSAgVU5BUllfT1AgLS0+ICAgICAgICAgICAgICAgICAgTE9BRF9DT05TVCB1bmFyeV9vcChjKSAqLworICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPiBMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCiAgICAgICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgogICAgICAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CiAgICAgICAgICAgICBjYXNlIFVOQVJZX1BPU0lUSVZFOgotICAgICAgICAgICAgICAgIGggPSBDT05TVF9TVEFDS19PUF9MQVNUTigxKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQoKGggPj0gMCB8fCBDT05TVF9TVEFDS19MRU4oKSA8IDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCsxKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS0zXSwgY29uc3RzLCBDT05TVF9TVEFDS19UT1AoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaSAtPSAyOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKDEpOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGkpOworICAgICAgICAgICAgICAgIGlmIChDT05TVF9TVEFDS19MRU4oKSA8IDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGggPSBsYXN0bl9jb25zdF9zdGFydChjb2Rlc3RyLCBvcF9zdGFydCwgMSk7CisgICAgICAgICAgICAgICAgaWYgKElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIG9wX3N0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICBoID0gZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHMoY29kZXN0ciwgaCwgaSsyLCBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMsICpDT05TVF9TVEFDS19MQVNUTigxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTU3MywzOSArNjI4LDM2IEBACiAgICAgICAgICAgICAgICAgICAgeDpKVU1QX0lGX0ZBTFNFX09SX1BPUCB5ICAgeTpKVU1QX0lGX0ZBTFNFX09SX1BPUCB6CiAgICAgICAgICAgICAgICAgICAgICAgLS0+ICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHoKICAgICAgICAgICAgICAgICAgICB4OkpVTVBfSUZfRkFMU0VfT1JfUE9QIHkgICB5OkpVTVBfSUZfVFJVRV9PUl9QT1AgegotICAgICAgICAgICAgICAgICAgICAgIC0tPiAgeDpQT1BfSlVNUF9JRl9GQUxTRSB5KzMKLSAgICAgICAgICAgICAgICAgICB3aGVyZSB5KzMgaXMgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgc2Vjb25kIHRlc3QuCisgICAgICAgICAgICAgICAgICAgICAgLS0+ICB4OlBPUF9KVU1QX0lGX0ZBTFNFIHkrMgorICAgICAgICAgICAgICAgICAgIHdoZXJlIHkrMiBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBzZWNvbmQgdGVzdC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKICAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLSAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGggPSBnZXRfYXJnKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIHRndCA9IGZpbmRfb3AoY29kZXN0ciwgaCk7CisKICAgICAgICAgICAgICAgICBqID0gY29kZXN0clt0Z3RdOwogICAgICAgICAgICAgICAgIGlmIChDT05ESVRJT05BTF9KVU1QKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGFsbCBwb3NzaWJsZSBqdW1wcyBoZXJlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSEgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogTk9URTogYWxsIHBvc3NpYmxlIGp1bXBzIGhlcmUgYXJlIGFic29sdXRlLiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShqKSA9PSBKVU1QU19PTl9UUlVFKG9wY29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzZWNvbmQganVtcCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgdGFyZ2V0J3Mgc3RhY2sgYmVoYXZpb3VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gajsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgd2lsbCBiZSB0YWtlbiBpZmYgdGhlIGZpcnN0IGlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGN1cnJlbnQgb3Bjb2RlIGluaGVyaXRzIGl0cyB0YXJnZXQncworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgZWZmZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBoID0gc2V0X2FyZyhjb2Rlc3RyLCBpLCBnZXRfYXJnKGNvZGVzdHIsIHRndCkpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBqdW1wIGlzIG5vdCB0YWtlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGZpcnN0IGlzIChzbyBqdW1wIHBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0KSwgYW5kIGFsbCBjb25kaXRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcHMgcG9wIHRoZWlyIGFyZ3VtZW50IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBqdW1wIHRvIHBvcCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHdoZW4gaXQncyB0YWtlbikuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShvcGNvZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCAodGd0ICsgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuIGlmIHRoZSBmaXJzdCBpcyAoc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXAgcGFzdCBpdCksIGFuZCBhbGwgY29uZGl0aW9uYWwganVtcHMgcG9wIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCB3aGVuIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBqdW1wIHRvIHBvcCBpdHMgYXJndW1lbnQgd2hlbiBpdCdzIHRha2VuKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBzZXRfYXJnKGNvZGVzdHIsIGksIHRndCArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG9wY29kZSA9PSBKVU1QX0lGX1RSVUVfT1JfUE9QID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1BfSlVNUF9JRl9UUlVFIDogUE9QX0pVTVBfSUZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0aSA9IGg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW25leHRpXSA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwpAQCAtNjIyLDczICs2NzQsNzMgQEAKICAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKICAgICAgICAgICAgIGNhc2UgU0VUVVBfV0lUSDoKICAgICAgICAgICAgIGNhc2UgU0VUVVBfQVNZTkNfV0lUSDoKLSAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGggPSBHRVRKVU1QVEdUKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIHRndCA9IGZpbmRfb3AoY29kZXN0ciwgaCk7CiAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKVU1QXyogdG8gYSBSRVRVUk4gaW50byBqdXN0IGEgUkVUVVJOICovCiAgICAgICAgICAgICAgICAgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChvcGNvZGUpICYmCiAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbdGd0XSA9PSBSRVRVUk5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJFVFVSTl9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltvcF9zdGFydF0gPSBSRVRVUk5fVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnQgKyAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyICsgb3Bfc3RhcnQgKyAyLCBOT1AsIGkgLSBvcF9zdGFydCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkgeworICAgICAgICAgICAgICAgICAgICBqID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgeyAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IEpVTVBfQUJTT0xVVEU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KWogPCBpICsgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGogLT0gaSArIDI7ICAgICAgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29weV9vcF9hcmcoY29kZXN0ciwgb3Bfc3RhcnQsIG9wY29kZSwgaiwgaSsyKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gSlVNUF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkKLSAgICAgICAgICAgICAgICAgICAgdGd0dGd0IC09IGkgKyAzOyAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KLSAgICAgICAgICAgICAgICBpZiAodGd0dGd0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBiYWNrd2FyZCByZWxhdGl2ZSBqdW1wcyAqLwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gb3Bjb2RlOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKLSAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IE1BS0VfRlVOQ1RJT04pCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKLSAgICAgICAgICAgICAgICAvKiBkb24ndCB2aXNpdCBNQUtFX0ZVTkNUSU9OIGFzIEdFVEFSRyB3aWxsIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgaSArPSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLyogUmVwbGFjZSBSRVRVUk4gTE9BRF9DT05TVCBOb25lIFJFVFVSTiB3aXRoIGp1c3QgUkVUVVJOICovCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIHVucmVhY2hhYmxlIEpVTVBzIGFmdGVyIFJFVFVSTiAqLworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB1bnJlYWNoYWJsZSBvcHMgYWZ0ZXIgUkVUVVJOICovCiAgICAgICAgICAgICBjYXNlIFJFVFVSTl9WQUxVRToKLSAgICAgICAgICAgICAgICBpZiAoaSs0ID49IGNvZGVsZW4pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krNF0gPT0gUkVUVVJOX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw1KSkKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDQpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChjb2Rlc3RyW2krMV0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzEsIE5PUCwgMyk7CisgICAgICAgICAgICAgICAgaCA9IGkgKyAyOworICAgICAgICAgICAgICAgIHdoaWxlIChoICsgMiA8IGNvZGVsZW4gJiYgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaSwgaCArIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIGggKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGggPiBpICsgMikgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIGkgKyAyLCBOT1AsIGggLSBpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dGkgPSBmaW5kX29wKGNvZGVzdHIsIGgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIEZpeHVwIGxpbmVub3RhYiAqLwotICAgIGZvciAoaT0wLCBub3BzPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7CisgICAgLyogRml4dXAgbG5vdGFiICovCisgICAgZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gMikgewogICAgICAgICBhc3NlcnQoaSAtIG5vcHMgPD0gSU5UX01BWCk7Ci0gICAgICAgIGFkZHJtYXBbaV0gPSAoaW50KShpIC0gbm9wcyk7CisgICAgICAgIC8qIG9yaWdpbmFsIGNvZGUgb2Zmc2V0ID0+IG5ldyBjb2RlIG9mZnNldCAqLworICAgICAgICBibG9ja3NbaV0gPSBpIC0gbm9wczsKICAgICAgICAgaWYgKGNvZGVzdHJbaV0gPT0gTk9QKQotICAgICAgICAgICAgbm9wcysrOworICAgICAgICAgICAgbm9wcyArPSAyOwogICAgIH0KLSAgICBjdW1fb3JpZ19saW5lID0gMDsKLSAgICBsYXN0X2xpbmUgPSAwOworICAgIGN1bV9vcmlnX29mZnNldCA9IDA7CisgICAgbGFzdF9vZmZzZXQgPSAwOwogICAgIGZvciAoaT0wIDsgaSA8IHRhYnNpeiA7IGkrPTIpIHsKLSAgICAgICAgY3VtX29yaWdfbGluZSArPSBsaW5lbm9baV07Ci0gICAgICAgIG5ld19saW5lID0gYWRkcm1hcFtjdW1fb3JpZ19saW5lXTsKLSAgICAgICAgYXNzZXJ0IChuZXdfbGluZSAtIGxhc3RfbGluZSA8IDI1NSk7Ci0gICAgICAgIGxpbmVub1tpXSA9KCh1bnNpZ25lZCBjaGFyKShuZXdfbGluZSAtIGxhc3RfbGluZSkpOwotICAgICAgICBsYXN0X2xpbmUgPSBuZXdfbGluZTsKKyAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldF9kZWx0YSwgbmV3X29mZnNldDsKKyAgICAgICAgY3VtX29yaWdfb2Zmc2V0ICs9IGxub3RhYltpXTsKKyAgICAgICAgYXNzZXJ0KChjdW1fb3JpZ19vZmZzZXQgJiAxKSA9PSAwKTsKKyAgICAgICAgbmV3X29mZnNldCA9IGJsb2Nrc1tjdW1fb3JpZ19vZmZzZXRdOworICAgICAgICBvZmZzZXRfZGVsdGEgPSBuZXdfb2Zmc2V0IC0gbGFzdF9vZmZzZXQ7CisgICAgICAgIGFzc2VydChvZmZzZXRfZGVsdGEgPD0gMjU1KTsKKyAgICAgICAgbG5vdGFiW2ldID0gKHVuc2lnbmVkIGNoYXIpb2Zmc2V0X2RlbHRhOworICAgICAgICBsYXN0X29mZnNldCA9IG5ld19vZmZzZXQ7CiAgICAgfQogCiAgICAgLyogUmVtb3ZlIE5PUHMgYW5kIGZpeHVwIGp1bXAgdGFyZ2V0cyAqLwotICAgIGZvciAoaT0wLCBoPTAgOyBpPGNvZGVsZW4gOyApIHsKKyAgICBmb3IgKG9wX3N0YXJ0PTAsIGk9MCwgaD0wIDsgaTxjb2RlbGVuIDsgaSs9Miwgb3Bfc3RhcnQ9aSkgeworICAgICAgICBqID0gY29kZXN0cltpKzFdOworICAgICAgICB3aGlsZSAoY29kZXN0cltpXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGogPSBqPDw4IHwgY29kZXN0cltpKzFdOworICAgICAgICB9CiAgICAgICAgIG9wY29kZSA9IGNvZGVzdHJbaV07CiAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE5PUDoKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIE5PUDpjb250aW51ZTsKIAogICAgICAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgogICAgICAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgpAQCAtNjk2LDggKzc0OCw3IEBACiAgICAgICAgICAgICBjYXNlIFBPUF9KVU1QX0lGX1RSVUU6CiAgICAgICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0VfT1JfUE9QOgogICAgICAgICAgICAgY2FzZSBKVU1QX0lGX1RSVUVfT1JfUE9QOgotICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKV07Ci0gICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGogPSBibG9ja3Nbal07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CkBAIC03MDcsMzQgKzc1OCwzMSBAQAogICAgICAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgogICAgICAgICAgICAgY2FzZSBTRVRVUF9XSVRIOgogICAgICAgICAgICAgY2FzZSBTRVRVUF9BU1lOQ19XSVRIOgotICAgICAgICAgICAgICAgIGogPSBhZGRybWFwW0dFVEFSRyhjb2Rlc3RyLCBpKSArIGkgKyAzXSAtIGFkZHJtYXBbaV0gLSAzOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBqID0gYmxvY2tzW2ogKyBpICsgMl0gLSBibG9ja3NbaV0gLSAyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGFkaiA9IENPREVTSVpFKG9wY29kZSk7Ci0gICAgICAgIHdoaWxlIChhZGotLSkKLSAgICAgICAgICAgIGNvZGVzdHJbaCsrXSA9IGNvZGVzdHJbaSsrXTsKKyAgICAgICAgbmV4dGkgPSBpIC0gb3Bfc3RhcnQgKyAyOworICAgICAgICBpZiAoaW5zdHJzaXplKGopID4gbmV4dGkpCisgICAgICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgICAgIC8qIElmIGluc3Ryc2l6ZShqKSA8IG5leHRpLCB3ZSdsbCBlbWl0IEVYVEVOREVEX0FSRyAwICovCisgICAgICAgIHdyaXRlX29wX2FyZyhjb2Rlc3RyICsgaCwgb3Bjb2RlLCBqLCBuZXh0aSk7CisgICAgICAgIGggKz0gbmV4dGk7CiAgICAgfQotICAgIGFzc2VydChoICsgbm9wcyA9PSBjb2RlbGVuKTsKKyAgICBhc3NlcnQoaCArIChQeV9zc2l6ZV90KW5vcHMgPT0gY29kZWxlbik7CiAKLSAgICBjb2RlID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWNvZGVzdHIsIGgpOwogICAgIENPTlNUX1NUQUNLX0RFTEVURSgpOwotICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7Ci0gICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKICAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgY29kZSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKKyAgICBQeU1lbV9GcmVlKGNvZGVzdHIpOwogICAgIHJldHVybiBjb2RlOwogCiAgZXhpdEVycm9yOgogICAgIGNvZGUgPSBOVUxMOwogCiAgZXhpdFVuY2hhbmdlZDoKLSAgICBDT05TVF9TVEFDS19ERUxFVEUoKTsKLSAgICBpZiAoYmxvY2tzICE9IE5VTEwpCi0gICAgICAgIFB5TWVtX0ZyZWUoYmxvY2tzKTsKLSAgICBpZiAoYWRkcm1hcCAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGFkZHJtYXApOwotICAgIGlmIChjb2Rlc3RyICE9IE5VTEwpCi0gICAgICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CiAgICAgUHlfWElOQ1JFRihjb2RlKTsKKyAgICBDT05TVF9TVEFDS19ERUxFVEUoKTsKKyAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKICAgICByZXR1cm4gY29kZTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weWhhc2guYyBiL1B5dGhvbi9weWhhc2guYwppbmRleCA5N2NiNTQ3Li45MDgwZDI1IDEwMDY0NAotLS0gYS9QeXRob24vcHloYXNoLmMKKysrIGIvUHl0aG9uL3B5aGFzaC5jCkBAIC0zMTgsNDAgKzMxOCwzNyBAQAogCiAgTW9kaWZpZWQgZm9yIFB5dGhvbiBieSBDaHJpc3RpYW4gSGVpbWVzOgogICAgIC0gQzg5IC8gTVNWQyBjb21wYXRpYmlsaXR5Ci0gICAgLSBQWV9VSU5UNjRfVCwgUFlfVUlOVDMyX1QgYW5kIFBZX1VJTlQ4X1QKICAgICAtIF9yb3RsNjQoKSBvbiBXaW5kb3dzCiAgICAgLSBsZXRvaDY0KCkgZmFsbGJhY2sKICovCiAKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBQWV9VSU5UOF9UOwotCiAvKiBieXRlIHN3YXAgbGl0dGxlIGVuZGlhbiB0byBob3N0IGVuZGlhbgogICogRW5kaWFuIGNvbnZlcnNpb24gbm90IG9ubHkgZW5zdXJlcyB0aGF0IHRoZSBoYXNoIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUKICAqIHZhbHVlIG9uIGFsbCBwbGF0Zm9ybXMuIEl0IGlzIGFsc28gcmVxdWlyZWQgdG8gZm9yIGEgZ29vZCBkaXNwZXJzaW9uIG9mCiAgKiB0aGUgaGFzaCB2YWx1ZXMnIGxlYXN0IHNpZ25pZmljYW50IGJpdHMuCiAgKi8KICNpZiBQWV9MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX2xlNjR0b2goeCkgKChQWV9VSU5UNjRfVCkoeCkpCisjICBkZWZpbmUgX2xlNjR0b2goeCkgKCh1aW50NjRfdCkoeCkpCiAjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKICMgIGRlZmluZSBfbGU2NHRvaCh4KSBPU1N3YXBMaXR0bGVUb0hvc3RJbnQ2NCh4KQogI2VsaWYgZGVmaW5lZChIQVZFX0xFVE9INjQpCiAjICBkZWZpbmUgX2xlNjR0b2goeCkgbGU2NHRvaCh4KQogI2Vsc2UKLSMgIGRlZmluZSBfbGU2NHRvaCh4KSAoKChQWV9VSU5UNjRfVCkoeCkgPDwgNTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA8PCA0MCkgJiAweGZmMDAwMDAwMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAoKChQWV9VSU5UNjRfVCkoeCkgPDwgMjQpICYgMHhmZjAwMDAwMDAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA8PCA4KSAgJiAweGZmMDAwMDAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA+PiA4KSAgJiAweGZmMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAoKChQWV9VSU5UNjRfVCkoeCkgPj4gMjQpICYgMHhmZjAwMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoKFBZX1VJTlQ2NF9UKSh4KSA+PiA0MCkgJiAweGZmMDBVTEwpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICgoUFlfVUlOVDY0X1QpKHgpICA+PiA1NikpCisjICBkZWZpbmUgX2xlNjR0b2goeCkgKCgodWludDY0X3QpKHgpIDw8IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNDApICYgMHhmZjAwMDAwMDAwMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpIDw8IDI0KSAmIDB4ZmYwMDAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgOCkgICYgMHhmZjAwMDAwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gOCkgICYgMHhmZjAwMDAwMFVMTCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCgodWludDY0X3QpKHgpID4+IDI0KSAmIDB4ZmYwMDAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gNDApICYgMHhmZjAwVUxMKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSAgPj4gNTYpKQogI2VuZGlmCiAKIAogI2lmZGVmIF9NU0NfVkVSCiAjICBkZWZpbmUgUk9UQVRFKHgsIGIpICBfcm90bDY0KHgsIGIpCiAjZWxzZQotIyAgZGVmaW5lIFJPVEFURSh4LCBiKSAoUFlfVUlOVDY0X1QpKCAoKHgpIDw8IChiKSkgfCAoICh4KSA+PiAoNjQgLSAoYikpKSApCisjICBkZWZpbmUgUk9UQVRFKHgsIGIpICh1aW50NjRfdCkoICgoeCkgPDwgKGIpKSB8ICggKHgpID4+ICg2NCAtIChiKSkpICkKICNlbmRpZgogCiAjZGVmaW5lIEhBTEZfUk9VTkQoYSxiLGMsZCxzLHQpICAgICAgICAgXApAQCAtMzY5LDIyICszNjYsMjIgQEAKIAogc3RhdGljIFB5X2hhc2hfdAogc2lwaGFzaDI0KGNvbnN0IHZvaWQgKnNyYywgUHlfc3NpemVfdCBzcmNfc3opIHsKLSAgICBQWV9VSU5UNjRfVCBrMCA9IF9sZTY0dG9oKF9QeV9IYXNoU2VjcmV0LnNpcGhhc2guazApOwotICAgIFBZX1VJTlQ2NF9UIGsxID0gX2xlNjR0b2goX1B5X0hhc2hTZWNyZXQuc2lwaGFzaC5rMSk7Ci0gICAgUFlfVUlOVDY0X1QgYiA9IChQWV9VSU5UNjRfVClzcmNfc3ogPDwgNTY7Ci0gICAgY29uc3QgUFlfVUlOVDY0X1QgKmluID0gKFBZX1VJTlQ2NF9UKilzcmM7CisgICAgdWludDY0X3QgazAgPSBfbGU2NHRvaChfUHlfSGFzaFNlY3JldC5zaXBoYXNoLmswKTsKKyAgICB1aW50NjRfdCBrMSA9IF9sZTY0dG9oKF9QeV9IYXNoU2VjcmV0LnNpcGhhc2guazEpOworICAgIHVpbnQ2NF90IGIgPSAodWludDY0X3Qpc3JjX3N6IDw8IDU2OworICAgIGNvbnN0IHVpbnQ2NF90ICppbiA9ICh1aW50NjRfdCopc3JjOwogCi0gICAgUFlfVUlOVDY0X1QgdjAgPSBrMCBeIDB4NzM2ZjZkNjU3MDczNjU3NVVMTDsKLSAgICBQWV9VSU5UNjRfVCB2MSA9IGsxIF4gMHg2NDZmNzI2MTZlNjQ2ZjZkVUxMOwotICAgIFBZX1VJTlQ2NF9UIHYyID0gazAgXiAweDZjNzk2NzY1NmU2NTcyNjFVTEw7Ci0gICAgUFlfVUlOVDY0X1QgdjMgPSBrMSBeIDB4NzQ2NTY0NjI3OTc0NjU3M1VMTDsKKyAgICB1aW50NjRfdCB2MCA9IGswIF4gMHg3MzZmNmQ2NTcwNzM2NTc1VUxMOworICAgIHVpbnQ2NF90IHYxID0gazEgXiAweDY0NmY3MjYxNmU2NDZmNmRVTEw7CisgICAgdWludDY0X3QgdjIgPSBrMCBeIDB4NmM3OTY3NjU2ZTY1NzI2MVVMTDsKKyAgICB1aW50NjRfdCB2MyA9IGsxIF4gMHg3NDY1NjQ2Mjc5NzQ2NTczVUxMOwogCi0gICAgUFlfVUlOVDY0X1QgdDsKLSAgICBQWV9VSU5UOF9UICpwdDsKLSAgICBQWV9VSU5UOF9UICptOworICAgIHVpbnQ2NF90IHQ7CisgICAgdWludDhfdCAqcHQ7CisgICAgdWludDhfdCAqbTsKIAogICAgIHdoaWxlIChzcmNfc3ogPj0gOCkgewotICAgICAgICBQWV9VSU5UNjRfVCBtaSA9IF9sZTY0dG9oKCppbik7CisgICAgICAgIHVpbnQ2NF90IG1pID0gX2xlNjR0b2goKmluKTsKICAgICAgICAgaW4gKz0gMTsKICAgICAgICAgc3JjX3N6IC09IDg7CiAgICAgICAgIHYzIF49IG1pOwpAQCAtMzkzLDEzICszOTAsMTMgQEAKICAgICB9CiAKICAgICB0ID0gMDsKLSAgICBwdCA9IChQWV9VSU5UOF9UICopJnQ7Ci0gICAgbSA9IChQWV9VSU5UOF9UICopaW47CisgICAgcHQgPSAodWludDhfdCAqKSZ0OworICAgIG0gPSAodWludDhfdCAqKWluOwogICAgIHN3aXRjaCAoc3JjX3N6KSB7CiAgICAgICAgIGNhc2UgNzogcHRbNl0gPSBtWzZdOwogICAgICAgICBjYXNlIDY6IHB0WzVdID0gbVs1XTsKICAgICAgICAgY2FzZSA1OiBwdFs0XSA9IG1bNF07Ci0gICAgICAgIGNhc2UgNDogUHlfTUVNQ1BZKHB0LCBtLCBzaXplb2YoUFlfVUlOVDMyX1QpKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogUHlfTUVNQ1BZKHB0LCBtLCBzaXplb2YodWludDMyX3QpKTsgYnJlYWs7CiAgICAgICAgIGNhc2UgMzogcHRbMl0gPSBtWzJdOwogICAgICAgICBjYXNlIDI6IHB0WzFdID0gbVsxXTsKICAgICAgICAgY2FzZSAxOiBwdFswXSA9IG1bMF07CmRpZmYgLS1naXQgYS9QeXRob24vcHlsaWZlY3ljbGUuYyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCmluZGV4IGNlNTI5OTAuLjE4OTY4ODggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWxpZmVjeWNsZS5jCisrKyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogR2xvYmFsIGluaXRpYWxpemF0aW9ucy4gIENhbiBiZSB1bmRvbmUgYnkgUHlfRmluYWxpemUoKS4gIERvbid0Ci0gICBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhbiBpbnRlcnZlbmluZyBQeV9GaW5hbGl6ZSgpIGNhbGwuICBXaGVuCisvKiBHbG9iYWwgaW5pdGlhbGl6YXRpb25zLiAgQ2FuIGJlIHVuZG9uZSBieSBQeV9GaW5hbGl6ZUV4KCkuICBEb24ndAorICAgY2FsbCB0aGlzIHR3aWNlIHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgUHlfRmluYWxpemVFeCgpIGNhbGwuICBXaGVuCiAgICBpbml0aWFsaXphdGlvbnMgZmFpbCwgYSBmYXRhbCBlcnJvciBpcyBpc3N1ZWQgYW5kIHRoZSBmdW5jdGlvbiBkb2VzCiAgICBub3QgcmV0dXJuLiAgT24gcmV0dXJuLCB0aGUgZmlyc3QgdGhyZWFkIGFuZCBpbnRlcnByZXRlciBzdGF0ZSBoYXZlCiAgICBiZWVuIGNyZWF0ZWQuCkBAIC0yMjMsNiArMjIzLDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBnZXRfY29kZWNfbmFtZShjb2Rlc2V0KTsKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pCisgICAgcmV0dXJuIGdldF9jb2RlY19uYW1lKCJVVEYtOCIpOwogI2Vsc2UKICAgICBQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOwogICAgIHJldHVybiBOVUxMOwpAQCAtMjUyLDYgKzI1NCwxMSBAQAogICAgIGludGVycC0+aW1wb3J0bGliID0gaW1wb3J0bGliOwogICAgIFB5X0lOQ1JFRihpbnRlcnAtPmltcG9ydGxpYik7CiAKKyAgICBpbnRlcnAtPmltcG9ydF9mdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoaW50ZXJwLT5idWlsdGlucywgIl9faW1wb3J0X18iKTsKKyAgICBpZiAoaW50ZXJwLT5pbXBvcnRfZnVuYyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOworICAgIFB5X0lOQ1JFRihpbnRlcnAtPmltcG9ydF9mdW5jKTsKKwogICAgIC8qIEltcG9ydCB0aGUgX2ltcCBtb2R1bGUgKi8KICAgICBpbXBtb2QgPSBQeUluaXRfaW1wKCk7CiAgICAgaWYgKGltcG1vZCA9PSBOVUxMKSB7CkBAIC0zMjcsMTEgKzMzNCwxMSBAQAogICAgICh2b2lkKSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgLyogV2UgY2FuJ3QgY2FsbCBfUHlFdmFsX0ZpbmlUaHJlYWRzKCkgaW4gUHlfRmluYWxpemUgYmVjYXVzZQorICAgIC8qIFdlIGNhbid0IGNhbGwgX1B5RXZhbF9GaW5pVGhyZWFkcygpIGluIFB5X0ZpbmFsaXplRXggYmVjYXVzZQogICAgICAgIGRlc3Ryb3lpbmcgdGhlIEdJTCBtaWdodCBmYWlsIHdoZW4gaXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBmcm9tCiAgICAgICAgYW5vdGhlciBydW5uaW5nIHRocmVhZCAoc2VlIGlzc3VlICM5OTAxKS4KICAgICAgICBJbnN0ZWFkIHdlIGRlc3Ryb3kgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBHSUwgaGVyZSwgd2hpY2ggZW5zdXJlcwotICAgICAgIHRoYXQgd2UgY2FuIGNhbGwgUHlfSW5pdGlhbGl6ZSAvIFB5X0ZpbmFsaXplIG11bHRpcGxlIHRpbWVzLiAqLworICAgICAgIHRoYXQgd2UgY2FuIGNhbGwgUHlfSW5pdGlhbGl6ZSAvIFB5X0ZpbmFsaXplRXggbXVsdGlwbGUgdGltZXMuICovCiAgICAgX1B5RXZhbF9GaW5pVGhyZWFkcygpOwogCiAgICAgLyogQXV0by10aHJlYWQtc3RhdGUgQVBJICovCkBAIC00NzcsMjggKzQ4NCwzNSBAQAogICAgIHJldHVybiByID4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGZsdXNoX3N0ZF9maWxlcyh2b2lkKQogewogICAgIFB5T2JqZWN0ICpmb3V0ID0gX1B5U3lzX0dldE9iamVjdElkKCZQeUlkX3N0ZG91dCk7CiAgICAgUHlPYmplY3QgKmZlcnIgPSBfUHlTeXNfR2V0T2JqZWN0SWQoJlB5SWRfc3RkZXJyKTsKICAgICBQeU9iamVjdCAqdG1wOworICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgaWYgKGZvdXQgIT0gTlVMTCAmJiBmb3V0ICE9IFB5X05vbmUgJiYgIWZpbGVfaXNfY2xvc2VkKGZvdXQpKSB7Ci0gICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsICIiKTsKLSAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZvdXQsICZQeUlkX2ZsdXNoLCBOVUxMKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZm91dCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CiAKICAgICBpZiAoZmVyciAhPSBOVUxMICYmIGZlcnIgIT0gUHlfTm9uZSAmJiAhZmlsZV9pc19jbG9zZWQoZmVycikpIHsKLSAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgIiIpOwotICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmVyciwgJlB5SWRfZmx1c2gsIE5VTEwpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvKiBVbmRvIHRoZSBlZmZlY3Qgb2YgUHlfSW5pdGlhbGl6ZSgpLgpAQCAtNTE1LDE0ICs1MjksMTUgQEAKIAogKi8KIAotdm9pZAotUHlfRmluYWxpemUodm9pZCkKK2ludAorUHlfRmluYWxpemVFeCh2b2lkKQogewogICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBpbnQgc3RhdHVzID0gMDsKIAogICAgIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKIAogICAgIHdhaXRfZm9yX3RocmVhZF9zaHV0ZG93bigpOwogCkBAIC01NDcsNyArNTYyLDkgQEAKICAgICBpbml0aWFsaXplZCA9IDA7CiAKICAgICAvKiBGbHVzaCBzeXMuc3Rkb3V0IGFuZCBzeXMuc3RkZXJyICovCi0gICAgZmx1c2hfc3RkX2ZpbGVzKCk7CisgICAgaWYgKGZsdXNoX3N0ZF9maWxlcygpIDwgMCkgeworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CiAKICAgICAvKiBEaXNhYmxlIHNpZ25hbCBoYW5kbGluZyAqLwogICAgIFB5T1NfRmluaUludGVycnVwdHMoKTsKQEAgLTU3Niw3ICs1OTMsOSBAQAogICAgIFB5SW1wb3J0X0NsZWFudXAoKTsKIAogICAgIC8qIEZsdXNoIHN5cy5zdGRvdXQgYW5kIHN5cy5zdGRlcnIgKGFnYWluLCBpbiBjYXNlIG1vcmUgd2FzIHByaW50ZWQpICovCi0gICAgZmx1c2hfc3RkX2ZpbGVzKCk7CisgICAgaWYgKGZsdXNoX3N0ZF9maWxlcygpIDwgMCkgeworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CiAKICAgICAvKiBDb2xsZWN0IGZpbmFsIGdhcmJhZ2UuICBUaGlzIGRpc3Bvc2VzIG9mIGN5Y2xlcyBjcmVhdGVkIGJ5CiAgICAgICogY2xhc3MgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlLgpAQCAtNjEyLDcgKzYzMSw3IEBACiAKICAgICAvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLSAgICBkdW1wX2NvdW50cyhzdGRvdXQpOworICAgIGR1bXBfY291bnRzKHN0ZGVycik7CiAjZW5kaWYKICAgICAvKiBkdW1wIGhhc2ggc3RhdHMgKi8KICAgICBfUHlIYXNoX0ZpbmkoKTsKQEAgLTY1NSw2ICs2NzQsNyBAQAogICAgIFB5U2xpY2VfRmluaSgpOwogICAgIF9QeUdDX0ZpbmkoKTsKICAgICBfUHlSYW5kb21fRmluaSgpOworICAgIF9QeUFyZ19GaW5pKCk7CiAKICAgICAvKiBDbGVhbnVwIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gKi8KICAgICBfUHlVbmljb2RlX0ZpbmkoKTsKQEAgLTY4MCw2ICs3MDAsNyBAQAogCiAgICAgLyogRGVsZXRlIGN1cnJlbnQgdGhyZWFkLiBBZnRlciB0aGlzLCBtYW55IEMgQVBJIGNhbGxzIGJlY29tZSBjcmFzaHkuICovCiAgICAgUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpOworCiAgICAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwpAQCAtNjkwLDEyICs3MTEsMjIgQEAKICAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05EVU1QUkVGUyIpKQogICAgICAgICBfUHlfUHJpbnRSZWZlcmVuY2VBZGRyZXNzZXMoc3RkZXJyKTsKICNlbmRpZiAvKiBQeV9UUkFDRV9SRUZTICovCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQotICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyhzdGRlcnIpOworI2lmZGVmIFdJVEhfUFlNQUxMT0MKKyAgICBpZiAoX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCgpKSB7CisgICAgICAgIGNoYXIgKm9wdCA9IFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DU1RBVFMiKTsKKyAgICAgICAgaWYgKG9wdCAhPSBOVUxMICYmICpvcHQgIT0gJ1wwJykKKyAgICAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisgICAgfQogI2VuZGlmCiAKICAgICBjYWxsX2xsX2V4aXRmdW5jcygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK1B5X0ZpbmFsaXplKHZvaWQpCit7CisgICAgUHlfRmluYWxpemVFeCgpOwogfQogCiAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgaW50ZXJwcmV0ZXIgYW5kIHRocmVhZCwgYW5kIHJldHVybiB0aGUKQEAgLTcyMSw2ICs3NTIsMTIgQEAKICAgICBpZiAoIWluaXRpYWxpemVkKQogICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9OZXdJbnRlcnByZXRlcjogY2FsbCBQeV9Jbml0aWFsaXplIGZpcnN0Iik7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIC8qIElzc3VlICMxMDkxNSwgIzE1NzUxOiBUaGUgR0lMIEFQSSBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aXBsZQorICAgICAgIGludGVycHJldGVyczogZGlzYWJsZSBQeUdJTFN0YXRlX0NoZWNrKCkuICovCisgICAgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCA9IDA7CisjZW5kaWYKKwogICAgIGludGVycCA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKTsKICAgICBpZiAoaW50ZXJwID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzc3LDcgKzgxNCw3IEBACiAKICAgICAgICAgaWYgKGluaXRzdGRpbygpIDwgMCkKICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCi0gICAgICAgICAgICAiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBzeXMgc3RhbmRhcmQgc3RyZWFtcyIpOworICAgICAgICAgICAgICAgICJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyBzdGFuZGFyZCBzdHJlYW1zIik7CiAgICAgICAgIGluaXRtYWluKGludGVycCk7CiAgICAgICAgIGlmICghUHlfTm9TaXRlRmxhZykKICAgICAgICAgICAgIGluaXRzaXRlKCk7CkBAIC04MDMsNyArODQwLDcgQEAKICAgIGZyYW1lcywgYW5kIHRoYXQgaXQgaXMgaXRzIGludGVycHJldGVyJ3Mgb25seSByZW1haW5pbmcgdGhyZWFkLgogICAgSXQgaXMgYSBmYXRhbCBlcnJvciB0byB2aW9sYXRlIHRoZXNlIGNvbnN0cmFpbnRzLgogCi0gICAoUHlfRmluYWxpemUoKSBkb2Vzbid0IGhhdmUgdGhlc2UgY29uc3RyYWludHMgLS0gaXQgemFwcworICAgKFB5X0ZpbmFsaXplRXgoKSBkb2Vzbid0IGhhdmUgdGhlc2UgY29uc3RyYWludHMgLS0gaXQgemFwcwogICAgZXZlcnl0aGluZywgcmVnYXJkbGVzcy4pCiAKICAgIExvY2tpbmc6IGFzIGFib3ZlLgpAQCAtOTcyLDYgKzEwMDksOSBAQAogICAgIGlmIChmZCA8IDAgfHwgIV9QeVZlcmlmeV9mZChmZCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKKyAgICAvKiBQcmVmZXIgZHVwKCkgb3ZlciBmc3RhdCgpLiBmc3RhdCgpIGNhbiByZXF1aXJlIGlucHV0L291dHB1dCB3aGVyZWFzCisgICAgICAgZHVwKCkgZG9lc24ndCwgdGhlcmUgaXMgYSBsb3cgcmlzayBvZiBFTUZJTEUvRU5GSUxFIGF0IFB5dGhvbgorICAgICAgIHN0YXJ0dXAuICovCiAgICAgZmQyID0gZHVwKGZkKTsKICAgICBpZiAoZmQyID49IDApCiAgICAgICAgIGNsb3NlKGZkMik7CkBAIC05ODIsOCArMTAyMiw4IEBACiAvKiByZXR1cm5zIFB5X05vbmUgaWYgdGhlIGZkIGlzIG5vdCB2YWxpZCAqLwogc3RhdGljIFB5T2JqZWN0KgogY3JlYXRlX3N0ZGlvKFB5T2JqZWN0KiBpbywKLSAgICBpbnQgZmQsIGludCB3cml0ZV9tb2RlLCBjaGFyKiBuYW1lLAotICAgIGNoYXIqIGVuY29kaW5nLCBjaGFyKiBlcnJvcnMpCisgICAgaW50IGZkLCBpbnQgd3JpdGVfbW9kZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiBlbmNvZGluZywgY29uc3QgY2hhciogZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICpidWYgPSBOVUxMLCAqc3RyZWFtID0gTlVMTCwgKnRleHQgPSBOVUxMLCAqcmF3ID0gTlVMTCwgKnJlczsKICAgICBjb25zdCBjaGFyKiBtb2RlOwpAQCAtMTAxMyw3ICsxMDUzLDggQEAKICAgICAgICAgbW9kZSA9ICJyYiI7CiAgICAgYnVmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChpbywgJlB5SWRfb3BlbiwgImlzaU9PT2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIG1vZGUsIGJ1ZmZlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgLyogZW5jb2RpbmcsIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgMCk7IC8qIG5ld2xpbmUsIGNsb3NlZmQgKi8KICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTEwMzEsNyArMTA3Miw3IEBACiAgICAgdGV4dCA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKG5hbWUpOwogICAgIGlmICh0ZXh0ID09IE5VTEwgfHwgX1B5T2JqZWN0X1NldEF0dHJJZChyYXcsICZQeUlkX25hbWUsIHRleHQpIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKLSAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHJhdywgJlB5SWRfaXNhdHR5LCAiIik7CisgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChyYXcsICZQeUlkX2lzYXR0eSwgTlVMTCk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIGlzYXR0eSA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwpAQCAtMTI0MywyNSArMTI4NCwxMSBAQAogc3RhdGljIHZvaWQKIF9QeV9GYXRhbEVycm9yX0R1bXBUcmFjZWJhY2tzKGludCBmZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0KLSNpZmRlZiBXSVRIX1RIUkVBRAotICAgIC8qIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkgd29ya3MgZXZlbiBpZiB0aGUgR0lMIHdhcyByZWxlYXNlZCAqLwotICAgIHRzdGF0ZSA9IFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk7Ci0jZWxzZQotICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0jZW5kaWYKLSAgICBpZiAodHN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgLyogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKCkgcmVxdWlyZXMgdGhlIHRocmVhZCBzdGF0ZSB0byBkaXNwbGF5Ci0gICAgICAgICAqIGZyYW1lcyAqLwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKICAgICBmZmx1c2goc3RkZXJyKTsKIAogICAgIC8qIGRpc3BsYXkgdGhlIGN1cnJlbnQgUHl0aG9uIHN0YWNrICovCi0gICAgX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCB0c3RhdGUtPmludGVycCwgdHN0YXRlKTsKKyAgICBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIE5VTEwpOwogfQogCiAvKiBQcmludCB0aGUgY3VycmVudCBleGNlcHRpb24gKGlmIGFuIGV4Y2VwdGlvbiBpcyBzZXQpIHdpdGggaXRzIHRyYWNlYmFjaywKQEAgLTEzMTYsNyArMTM0Myw3IEBACiAgICAgUHlfWERFQ1JFRih0Yik7CiAKICAgICAvKiBzeXMuc3RkZXJyIG1heSBiZSBidWZmZXJlZDogY2FsbCBzeXMuc3RkZXJyLmZsdXNoKCkgKi8KLSAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZlcnIsICZQeUlkX2ZsdXNoLCAiIik7CisgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgTlVMTCk7CiAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgIGVsc2UKQEAgLTEzODgsNyArMTQxNSw3IEBACiAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLSNpbmNsdWRlICJweXRocmVhZC5oIgorIyAgaW5jbHVkZSAicHl0aHJlYWQuaCIKICNlbmRpZgogCiBzdGF0aWMgdm9pZCAoKnB5ZXhpdGZ1bmMpKHZvaWQpID0gTlVMTDsKQEAgLTE0MjYsNyArMTQ1Myw3IEBACiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgcmVzdWx0ID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0aHJlYWRpbmcsICZQeUlkX19zaHV0ZG93biwgIiIpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodGhyZWFkaW5nLCAmUHlJZF9fc2h1dGRvd24sIE5VTEwpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUodGhyZWFkaW5nKTsKICAgICB9CkBAIC0xNDYyLDcgKzE0ODksOSBAQAogdm9pZAogUHlfRXhpdChpbnQgc3RzKQogewotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgc3RzID0gMTIwOworICAgIH0KIAogICAgIGV4aXQoc3RzKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IDI0ZTIwYzMuLjJhYjVkNWQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtNiw3ICs2LDcgQEAKICNkZWZpbmUgR0VUX1RTVEFURSgpIFwKICAgICAoKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KSkKICNkZWZpbmUgU0VUX1RTVEFURSh2YWx1ZSkgXAotICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmX1B5VGhyZWFkU3RhdGVfQ3VycmVudCwgKFB5X3VpbnRwdHJfdCkodmFsdWUpKQorICAgIF9QeV9hdG9taWNfc3RvcmVfcmVsYXhlZCgmX1B5VGhyZWFkU3RhdGVfQ3VycmVudCwgKHVpbnRwdHJfdCkodmFsdWUpKQogI2RlZmluZSBHRVRfSU5URVJQX1NUQVRFKCkgXAogICAgIChHRVRfVFNUQVRFKCktPmludGVycCkKIApAQCAtMjUsNyArMjUsNyBAQAogI2lmZGVmIEhBVkVfRExGQ05fSAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjZW5kaWYKLSNpZm5kZWYgUlRMRF9MQVpZCisjaWYgIUhBVkVfREVDTF9SVExEX0xBWlkKICNkZWZpbmUgUlRMRF9MQVpZIDEKICNlbmRpZgogI2VuZGlmCkBAIC0zNCw2ICszNCw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCitpbnQgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCA9IDE7CisKICNpZmRlZiBXSVRIX1RIUkVBRAogI2luY2x1ZGUgInB5dGhyZWFkLmgiCiBzdGF0aWMgUHlUaHJlYWRfdHlwZV9sb2NrIGhlYWRfbXV0ZXggPSBOVUxMOyAvKiBQcm90ZWN0cyBpbnRlcnAtPnRzdGF0ZV9oZWFkICovCkBAIC00NSw3ICs0Nyw3IEBACiAgICBHSUxTdGF0ZSBpbXBsZW1lbnRhdGlvbgogKi8KIHN0YXRpYyBQeUludGVycHJldGVyU3RhdGUgKmF1dG9JbnRlcnByZXRlclN0YXRlID0gTlVMTDsKLXN0YXRpYyBpbnQgYXV0b1RMU2tleSA9IDA7CitzdGF0aWMgaW50IGF1dG9UTFNrZXkgPSAtMTsKICNlbHNlCiAjZGVmaW5lIEhFQURfSU5JVCgpIC8qIE5vdGhpbmcgKi8KICNkZWZpbmUgSEVBRF9MT0NLKCkgLyogTm90aGluZyAqLwpAQCAtODgsOCArOTAsMTAgQEAKICAgICAgICAgaW50ZXJwLT5jb2RlY3NfaW5pdGlhbGl6ZWQgPSAwOwogICAgICAgICBpbnRlcnAtPmZzY29kZWNfaW5pdGlhbGl6ZWQgPSAwOwogICAgICAgICBpbnRlcnAtPmltcG9ydGxpYiA9IE5VTEw7CisgICAgICAgIGludGVycC0+aW1wb3J0X2Z1bmMgPSBOVUxMOworICAgICAgICBpbnRlcnAtPmV2YWxfZnJhbWUgPSBfUHlFdmFsX0V2YWxGcmFtZURlZmF1bHQ7CiAjaWZkZWYgSEFWRV9ETE9QRU4KLSNpZmRlZiBSVExEX05PVworI2lmIEhBVkVfREVDTF9SVExEX05PVwogICAgICAgICBpbnRlcnAtPmRsb3BlbmZsYWdzID0gUlRMRF9OT1c7CiAjZWxzZQogICAgICAgICBpbnRlcnAtPmRsb3BlbmZsYWdzID0gUlRMRF9MQVpZOwpAQCAtMTI2LDYgKzEzMCw3IEBACiAgICAgUHlfQ0xFQVIoaW50ZXJwLT5idWlsdGlucyk7CiAgICAgUHlfQ0xFQVIoaW50ZXJwLT5idWlsdGluc19jb3B5KTsKICAgICBQeV9DTEVBUihpbnRlcnAtPmltcG9ydGxpYik7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5pbXBvcnRfZnVuYyk7CiB9CiAKIApAQCAtNDUxLDEwICs0NTYsMTAgQEAKICAgICBpZiAodHN0YXRlID09IE5VTEwpCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCiAgICAgICAgICAgICAiUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50OiBubyBjdXJyZW50IHRzdGF0ZSIpOwotICAgIFNFVF9UU1RBVEUoTlVMTCk7CisgICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKICAgICBpZiAoYXV0b0ludGVycHJldGVyU3RhdGUgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCiAgICAgICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoYXV0b1RMU2tleSk7Ci0gICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKKyAgICBTRVRfVFNUQVRFKE5VTEwpOwogICAgIFB5RXZhbF9SZWxlYXNlTG9jaygpOwogfQogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCkBAIC02OTgsNyArNzAzLDcgQEAKIH0KIAogLyogSW50ZXJuYWwgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9ucyBjYWxsZWQgYnkKLSAgIFB5X0luaXRpYWxpemUvUHlfRmluYWxpemUKKyAgIFB5X0luaXRpYWxpemUvUHlfRmluYWxpemVFeAogKi8KIHZvaWQKIF9QeUdJTFN0YXRlX0luaXQoUHlJbnRlcnByZXRlclN0YXRlICppLCBQeVRocmVhZFN0YXRlICp0KQpAQCAtNzE0LDEwICs3MTksMTcgQEAKICAgICBfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUodCk7CiB9CiAKK1B5SW50ZXJwcmV0ZXJTdGF0ZSAqCitfUHlHSUxTdGF0ZV9HZXRJbnRlcnByZXRlclN0YXRlVW5zYWZlKHZvaWQpCit7CisgICAgcmV0dXJuIGF1dG9JbnRlcnByZXRlclN0YXRlOworfQorCiB2b2lkCiBfUHlHSUxTdGF0ZV9GaW5pKHZvaWQpCiB7CiAgICAgUHlUaHJlYWRfZGVsZXRlX2tleShhdXRvVExTa2V5KTsKKyAgICBhdXRvVExTa2V5ID0gLTE7CiAgICAgYXV0b0ludGVycHJldGVyU3RhdGUgPSBOVUxMOwogfQogCkBAIC03ODYsOCArNzk4LDE5IEBACiBpbnQKIFB5R0lMU3RhdGVfQ2hlY2sodm9pZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBHRVRfVFNUQVRFKCk7Ci0gICAgcmV0dXJuIHRzdGF0ZSAmJiAodHN0YXRlID09IFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKworICAgIGlmICghX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoYXV0b1RMU2tleSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICB0c3RhdGUgPSBHRVRfVFNUQVRFKCk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAodHN0YXRlID09IFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkpOwogfQogCiBQeUdJTFN0YXRlX1NUQVRFCmRpZmYgLS1naXQgYS9QeXRob24vcHlzdHJ0b2QuYyBiL1B5dGhvbi9weXN0cnRvZC5jCmluZGV4IDIwOWM5MDguLjVmM2FmOTIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0cnRvZC5jCisrKyBiL1B5dGhvbi9weXN0cnRvZC5jCkBAIC04ODEsMTIgKzg4MSwxMiBAQAogI2RlZmluZSBPRlNfRSAyCiAKIC8qIFRoZSBsZW5ndGhzIG9mIHRoZXNlIGFyZSBrbm93biB0byB0aGUgY29kZSBiZWxvdywgc28gZG9uJ3QgY2hhbmdlIHRoZW0gKi8KLXN0YXRpYyBjaGFyICpsY19mbG9hdF9zdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKICAgICAiaW5mIiwKICAgICAibmFuIiwKICAgICAiZSIsCiB9Owotc3RhdGljIGNoYXIgKnVjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWNfZmxvYXRfc3RyaW5nc1tdID0gewogICAgICJJTkYiLAogICAgICJOQU4iLAogICAgICJFIiwKQEAgLTkyNSw3ICs5MjUsOCBAQAogZm9ybWF0X2Zsb2F0X3Nob3J0KGRvdWJsZSBkLCBjaGFyIGZvcm1hdF9jb2RlLAogICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBpbnQgcHJlY2lzaW9uLAogICAgICAgICAgICAgICAgICAgIGludCBhbHdheXNfYWRkX3NpZ24sIGludCBhZGRfZG90XzBfaWZfaW50ZWdlciwKLSAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2FsdF9mb3JtYXR0aW5nLCBjaGFyICoqZmxvYXRfc3RyaW5ncywgaW50ICp0eXBlKQorICAgICAgICAgICAgICAgICAgIGludCB1c2VfYWx0X2Zvcm1hdHRpbmcsIGNvbnN0IGNoYXIgKiBjb25zdCAqZmxvYXRfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICBpbnQgKnR5cGUpCiB7CiAgICAgY2hhciAqYnVmID0gTlVMTDsKICAgICBjaGFyICpwID0gTlVMTDsKQEAgLTExNzYsNyArMTE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlKQogewotICAgIGNoYXIgKipmbG9hdF9zdHJpbmdzID0gbGNfZmxvYXRfc3RyaW5nczsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmZsb2F0X3N0cmluZ3MgPSBsY19mbG9hdF9zdHJpbmdzOwogICAgIGludCBtb2RlOwogCiAgICAgLyogVmFsaWRhdGUgZm9ybWF0X2NvZGUsIGFuZCBtYXAgdXBwZXIgYW5kIGxvd2VyIGNhc2UuIENvbXB1dGUgdGhlCmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggN2ZiZjA2ZS4uMWZjODZjMCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtNDMxLDcgKzQzMSw3IEBACiBwYXJzZV9zeW50YXhfZXJyb3IoUHlPYmplY3QgKmVyciwgUHlPYmplY3QgKiptZXNzYWdlLCBQeU9iamVjdCAqKmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGludCAqbGluZW5vLCBpbnQgKm9mZnNldCwgUHlPYmplY3QgKip0ZXh0KQogewotICAgIGxvbmcgaG9sZDsKKyAgICBpbnQgaG9sZDsKICAgICBQeU9iamVjdCAqdjsKICAgICBfUHlfSURFTlRJRklFUihtc2cpOwogICAgIF9QeV9JREVOVElGSUVSKGZpbGVuYW1lKTsKQEAgLTQ2NCwxMSArNDY0LDExIEBACiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF9saW5lbm8pOwogICAgIGlmICghdikKICAgICAgICAgZ290byBmaW5hbGx5OwotICAgIGhvbGQgPSBQeUxvbmdfQXNMb25nKHYpOworICAgIGhvbGQgPSBfUHlMb25nX0FzSW50KHYpOwogICAgIFB5X0RFQ1JFRih2KTsKICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICpsaW5lbm8gPSAoaW50KWhvbGQ7CisgICAgKmxpbmVubyA9IGhvbGQ7CiAKICAgICB2ID0gX1B5T2JqZWN0X0dldEF0dHJJZChlcnIsICZQeUlkX29mZnNldCk7CiAgICAgaWYgKCF2KQpAQCAtNDc3LDExICs0NzcsMTEgQEAKICAgICAgICAgKm9mZnNldCA9IC0xOwogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaG9sZCA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgIGhvbGQgPSBfUHlMb25nX0FzSW50KHYpOwogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgIGlmIChob2xkIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICAqb2Zmc2V0ID0gKGludClob2xkOworICAgICAgICAqb2Zmc2V0ID0gaG9sZDsKICAgICB9CiAKICAgICB2ID0gX1B5T2JqZWN0X0dldEF0dHJJZChlcnIsICZQeUlkX3RleHQpOwpAQCAtNjMwLDggKzYzMCwxMyBAQAogICAgIH0KICAgICBob29rID0gX1B5U3lzX0dldE9iamVjdElkKCZQeUlkX2V4Y2VwdGhvb2spOwogICAgIGlmIChob29rKSB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9QYWNrKDMsIGV4Y2VwdGlvbiwgdiwgdGIpOwotICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoaG9vaywgYXJncyk7CisgICAgICAgIFB5T2JqZWN0KiBzdGFja1szXTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgICAgICBzdGFja1swXSA9IGV4Y2VwdGlvbjsKKyAgICAgICAgc3RhY2tbMV0gPSB2OworICAgICAgICBzdGFja1syXSA9IHRiOworICAgICAgICByZXN1bHQgPSBfUHlPYmplY3RfRmFzdENhbGwoaG9vaywgc3RhY2ssIDMpOwogICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpleGNlcHRpb24yLCAqdjIsICp0YjI7CiAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgewpAQCAtNjYwLDcgKzY2NSw2IEBACiAgICAgICAgICAgICBQeV9YREVDUkVGKHRiMik7CiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJzeXMuZXhjZXB0aG9vayBpcyBtaXNzaW5nXG4iKTsKICAgICAgICAgUHlFcnJfRGlzcGxheShleGNlcHRpb24sIHYsIHRiKTsKQEAgLTc5MSwxMSArNzk1LDExIEBACiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjYXVzZV9tZXNzYWdlID0KK3N0YXRpYyBjb25zdCBjaGFyIGNhdXNlX21lc3NhZ2VbXSA9CiAgICAgIlxuVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSAiCiAgICAgIm9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuXG4iOwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29udGV4dF9tZXNzYWdlID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbnRleHRfbWVzc2FnZVtdID0KICAgICAiXG5EdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgIgogICAgICJhbm90aGVyIGV4Y2VwdGlvbiBvY2N1cnJlZDpcblxuIjsKIApAQCAtOTQ2LDcgKzk1MCw3IEBACiAKICAgICBmID0gX1B5U3lzX0dldE9iamVjdElkKCZQeUlkX3N0ZGVycik7CiAgICAgaWYgKGYgIT0gTlVMTCkgewotICAgICAgICByID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmLCAmUHlJZF9mbHVzaCwgIiIpOworICAgICAgICByID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmLCAmUHlJZF9mbHVzaCwgTlVMTCk7CiAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgUHlfREVDUkVGKHIpOwogICAgICAgICBlbHNlCkBAIC05NTQsNyArOTU4LDcgQEAKICAgICB9CiAgICAgZiA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9zdGRvdXQpOwogICAgIGlmIChmICE9IE5VTEwpIHsKLSAgICAgICAgciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZiwgJlB5SWRfZmx1c2gsICIiKTsKKyAgICAgICAgciA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZiwgJlB5SWRfZmx1c2gsIE5VTEwpOwogICAgICAgICBpZiAocikKICAgICAgICAgICAgIFB5X0RFQ1JFRihyKTsKICAgICAgICAgZWxzZQpAQCAtMTE0NCw4ICsxMTQ4LDggQEAKIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZU9iamVjdChGSUxFICpmcCwgUHlPYmplY3QgKmZpbGVuYW1lLCBjb25zdCBjaGFyKiBlbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNoYXIgKnBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjb25zdCBjaGFyICpwczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewogICAgIG1vZF90eSBtb2Q7CkBAIC0xMTc3LDggKzExODEsOCBAQAogCiBtb2RfdHkKIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZV9zdHIsIGNvbnN0IGNoYXIqIGVuYywKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY2hhciAqcHMxLAotICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNvbnN0IGNoYXIgKnBzMSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAogICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpCiB7CiAgICAgbW9kX3R5IG1vZDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRpbWUuYyBiL1B5dGhvbi9weXRpbWUuYwppbmRleCA3ZjY1ODI0Li4wMmVmOGVlIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aW1lLmMKKysrIGIvUHl0aG9uL3B5dGltZS5jCkBAIC03LDYgKzcsMTEgQEAKICNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPiAgIC8qIG1hY2hfYWJzb2x1dGVfdGltZSgpLCBtYWNoX3RpbWViYXNlX2luZm8oKSAqLwogI2VuZGlmCiAKKyNkZWZpbmUgX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3coYSwgYikgXAorICAgIChhc3NlcnQoYiA+IDApLCBcCisgICAgIChfUHlUaW1lX3QpKGEpIDwgX1B5VGltZV9NSU4gLyAoX1B5VGltZV90KShiKSBcCisgICAgIHx8IF9QeVRpbWVfTUFYIC8gKF9QeVRpbWVfdCkoYikgPCAoX1B5VGltZV90KShhKSkKKwogLyogVG8gbWlsbGlzZWNvbmQgKDEwXi0zKSAqLwogI2RlZmluZSBTRUNfVE9fTVMgMTAwMAogCkBAIC0zMywxMiArMzgsMTIgQEAKIHRpbWVfdAogX1B5TG9uZ19Bc1RpbWVfdChQeU9iamVjdCAqb2JqKQogewotI2lmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIFNJWkVPRl9USU1FX1QgPT0gU0laRU9GX0xPTkdfTE9ORwotICAgIFBZX0xPTkdfTE9ORyB2YWw7CisjaWYgU0laRU9GX1RJTUVfVCA9PSBTSVpFT0ZfTE9OR19MT05HCisgICAgbG9uZyBsb25nIHZhbDsKICAgICB2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhvYmopOwogI2Vsc2UKICAgICBsb25nIHZhbDsKLSAgICBhc3NlcnQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKICAgICB2YWwgPSBQeUxvbmdfQXNMb25nKG9iaik7CiAjZW5kaWYKICAgICBpZiAodmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKQEAgLTUyLDU4ICs1Nyw5MSBAQAogUHlPYmplY3QgKgogX1B5TG9uZ19Gcm9tVGltZV90KHRpbWVfdCB0KQogewotI2lmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIFNJWkVPRl9USU1FX1QgPT0gU0laRU9GX0xPTkdfTE9ORwotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdCk7CisjaWYgU0laRU9GX1RJTUVfVCA9PSBTSVpFT0ZfTE9OR19MT05HCisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZyl0KTsKICNlbHNlCi0gICAgYXNzZXJ0KHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl0KTsKICNlbmRpZgogfQogCisvKiBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlcgorICAgKF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSAqLworc3RhdGljIGRvdWJsZQorX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGRvdWJsZSB4KQoreworICAgIGRvdWJsZSByb3VuZGVkID0gcm91bmQoeCk7CisgICAgaWYgKGZhYnMoeC1yb3VuZGVkKSA9PSAwLjUpCisgICAgICAgIC8qIGhhbGZ3YXkgY2FzZTogcm91bmQgdG8gZXZlbiAqLworICAgICAgICByb3VuZGVkID0gMi4wKnJvdW5kKHgvMi4wKTsKKyAgICByZXR1cm4gcm91bmRlZDsKK30KKworc3RhdGljIGRvdWJsZQorX1B5VGltZV9Sb3VuZChkb3VibGUgeCwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQoreworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIGQgPSB4OworICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikKKyAgICAgICAgZCA9IF9QeVRpbWVfUm91bmRIYWxmRXZlbihkKTsKKyAgICBlbHNlIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCisgICAgICAgIGQgPSBjZWlsKGQpOworICAgIGVsc2UKKyAgICAgICAgZCA9IGZsb29yKGQpOworICAgIHJldHVybiBkOworfQorCitzdGF0aWMgaW50CitfUHlUaW1lX0RvdWJsZVRvRGVub21pbmF0b3IoZG91YmxlIGQsIHRpbWVfdCAqc2VjLCBsb25nICpudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlbm9taW5hdG9yLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCit7CisgICAgZG91YmxlIGludHBhcnQsIGVycjsKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGZsb2F0cGFydDsKKworICAgIGZsb2F0cGFydCA9IG1vZGYoZCwgJmludHBhcnQpOworCisgICAgZmxvYXRwYXJ0ICo9IGRlbm9taW5hdG9yOworICAgIGZsb2F0cGFydCA9IF9QeVRpbWVfUm91bmQoZmxvYXRwYXJ0LCByb3VuZCk7CisgICAgaWYgKGZsb2F0cGFydCA+PSBkZW5vbWluYXRvcikgeworICAgICAgICBmbG9hdHBhcnQgLT0gZGVub21pbmF0b3I7CisgICAgICAgIGludHBhcnQgKz0gMS4wOworICAgIH0KKyAgICBlbHNlIGlmIChmbG9hdHBhcnQgPCAwKSB7CisgICAgICAgIGZsb2F0cGFydCArPSBkZW5vbWluYXRvcjsKKyAgICAgICAgaW50cGFydCAtPSAxLjA7CisgICAgfQorICAgIGFzc2VydCgwLjAgPD0gZmxvYXRwYXJ0ICYmIGZsb2F0cGFydCA8IGRlbm9taW5hdG9yKTsKKworICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7CisgICAgKm51bWVyYXRvciA9IChsb25nKWZsb2F0cGFydDsKKworICAgIGVyciA9IGludHBhcnQgLSAoZG91YmxlKSpzZWM7CisgICAgaWYgKGVyciA8PSAtMS4wIHx8IGVyciA+PSAxLjApIHsKKyAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgbG9uZyAqbnVtZXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZW5vbWluYXRvciwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewotICAgIGFzc2VydChkZW5vbWluYXRvciA8PSBMT05HX01BWCk7CisgICAgYXNzZXJ0KGRlbm9taW5hdG9yIDw9IChkb3VibGUpTE9OR19NQVgpOworCiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICBkb3VibGUgZCwgaW50cGFydCwgZXJyOwotICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgdW5zYWZlIG9wdGltaXphdGlvbiBvbiBmbG9hdCBlbmFibGVkIGJ5IGdjYyAtTzMgKi8KLSAgICAgICAgdm9sYXRpbGUgZG91YmxlIGZsb2F0cGFydDsKLQotICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBmbG9hdHBhcnQgPSBtb2RmKGQsICZpbnRwYXJ0KTsKLSAgICAgICAgaWYgKGZsb2F0cGFydCA8IDApIHsKLSAgICAgICAgICAgIGZsb2F0cGFydCA9IDEuMCArIGZsb2F0cGFydDsKLSAgICAgICAgICAgIGludHBhcnQgLT0gMS4wOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXRwYXJ0ICo9IGRlbm9taW5hdG9yOwotICAgICAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKSB7Ci0gICAgICAgICAgICBmbG9hdHBhcnQgPSBjZWlsKGZsb2F0cGFydCk7Ci0gICAgICAgICAgICBpZiAoZmxvYXRwYXJ0ID49IGRlbm9taW5hdG9yKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRwYXJ0ID0gMC4wOwotICAgICAgICAgICAgICAgIGludHBhcnQgKz0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmxvYXRwYXJ0ID0gZmxvb3IoZmxvYXRwYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7Ci0gICAgICAgIGVyciA9IGludHBhcnQgLSAoZG91YmxlKSpzZWM7Ci0gICAgICAgIGlmIChlcnIgPD0gLTEuMCB8fCBlcnIgPj0gMS4wKSB7Ci0gICAgICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgICpudW1lcmF0b3IgPSAobG9uZylmbG9hdHBhcnQ7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBkb3VibGUgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKKyAgICAgICAgcmV0dXJuIF9QeVRpbWVfRG91YmxlVG9EZW5vbWluYXRvcihkLCBzZWMsIG51bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwgcm91bmQpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgKnNlYyA9IF9QeUxvbmdfQXNUaW1lX3Qob2JqKTsKKyAgICAgICAgKm51bWVyYXRvciA9IDA7CiAgICAgICAgIGlmICgqc2VjID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgKm51bWVyYXRvciA9IDA7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KQEAgLTExMiwxMyArMTUwLDEyIEBACiBfUHlUaW1lX09iamVjdFRvVGltZV90KFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICBkb3VibGUgZCwgaW50cGFydCwgZXJyOworICAgICAgICBkb3VibGUgaW50cGFydCwgZXJyOworICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgICAgIHZvbGF0aWxlIGRvdWJsZSBkOwogCiAgICAgICAgIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCi0gICAgICAgICAgICBkID0gY2VpbChkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZCA9IGZsb29yKGQpOworICAgICAgICBkID0gX1B5VGltZV9Sb3VuZChkLCByb3VuZCk7CiAgICAgICAgICh2b2lkKW1vZGYoZCwgJmludHBhcnQpOwogCiAgICAgICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7CkBAIC0xNDEsMTQgKzE3OCwyMCBAQAogX1B5VGltZV9PYmplY3RUb1RpbWVzcGVjKFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBsb25nICpuc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKLSAgICByZXR1cm4gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCBuc2VjLCAxZTksIHJvdW5kKTsKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgbnNlYywgMWU5LCByb3VuZCk7CisgICAgYXNzZXJ0KDAgPD0gKm5zZWMgJiYgKm5zZWMgPCBTRUNfVE9fTlMpOworICAgIHJldHVybiByZXM7CiB9CiAKIGludAogX1B5VGltZV9PYmplY3RUb1RpbWV2YWwoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIGxvbmcgKnVzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7Ci0gICAgcmV0dXJuIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgdXNlYywgMWU2LCByb3VuZCk7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIHVzZWMsIDFlNiwgcm91bmQpOworICAgIGFzc2VydCgwIDw9ICp1c2VjICYmICp1c2VjIDwgU0VDX1RPX1VTKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTYyLDIxICsyMDUsMjQgQEAKIF9QeVRpbWVfRnJvbVNlY29uZHMoaW50IHNlY29uZHMpCiB7CiAgICAgX1B5VGltZV90IHQ7CisgICAgdCA9IChfUHlUaW1lX3Qpc2Vjb25kczsKICAgICAvKiBlbnN1cmUgdGhhdCBpbnRlZ2VyIG92ZXJmbG93IGNhbm5vdCBoYXBwZW4sIGludCB0eXBlIHNob3VsZCBoYXZlIDMyCiAgICAgICAgYml0cywgd2hlcmVhcyBfUHlUaW1lX3QgdHlwZSBoYXMgYXQgbGVhc3QgNjQgYml0cyAoU0VDX1RPX01TIHRha2VzIDMwCiAgICAgICAgYml0cykuICovCi0gICAgYXNzZXJ0KChzZWNvbmRzID49IDAgJiYgc2Vjb25kcyA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUykKLSAgICAgICAgICAgfHwgKHNlY29uZHMgPCAwICYmIHNlY29uZHMgPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpKTsKLSAgICB0ID0gKF9QeVRpbWVfdClzZWNvbmRzICogU0VDX1RPX05TOworICAgIFB5X0JVSUxEX0FTU0VSVChJTlRfTUFYIDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoSU5UX01JTiA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUyk7CisgICAgYXNzZXJ0KCh0ID49IDAgJiYgdCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUykKKyAgICAgICAgICAgfHwgKHQgPCAwICYmIHQgPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpKTsKKyAgICB0ICo9IFNFQ19UT19OUzsKICAgICByZXR1cm4gdDsKIH0KIAogX1B5VGltZV90Ci1fUHlUaW1lX0Zyb21OYW5vc2Vjb25kcyhQWV9MT05HX0xPTkcgbnMpCitfUHlUaW1lX0Zyb21OYW5vc2Vjb25kcyhsb25nIGxvbmcgbnMpCiB7CiAgICAgX1B5VGltZV90IHQ7Ci0gICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKLSAgICB0ID0gUHlfU0FGRV9ET1dOQ0FTVChucywgUFlfTE9OR19MT05HLCBfUHlUaW1lX3QpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YobG9uZyBsb25nKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgdCA9IFB5X1NBRkVfRE9XTkNBU1QobnMsIGxvbmcgbG9uZywgX1B5VGltZV90KTsKICAgICByZXR1cm4gdDsKIH0KIApAQCAtMTg3LDEyICsyMzMsMTUgQEAKICAgICBfUHlUaW1lX3QgdDsKICAgICBpbnQgcmVzID0gMDsKIAotICAgIHQgPSAoX1B5VGltZV90KXRzLT50dl9zZWMgKiBTRUNfVE9fTlM7Ci0gICAgaWYgKHQgLyBTRUNfVE9fTlMgIT0gdHMtPnR2X3NlYykgeworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodHMtPnR2X3NlYykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSAoX1B5VGltZV90KXRzLT50dl9zZWM7CisKKyAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3codCwgU0VDX1RPX05TKSkgewogICAgICAgICBpZiAocmFpc2UpCiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgIHJlcyA9IC0xOwogICAgIH0KKyAgICB0ID0gdCAqIFNFQ19UT19OUzsKIAogICAgIHQgKz0gdHMtPnR2X25zZWM7CiAKQEAgLTIwNiwxMiArMjU1LDE1IEBACiAgICAgX1B5VGltZV90IHQ7CiAgICAgaW50IHJlcyA9IDA7CiAKLSAgICB0ID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjICogU0VDX1RPX05TOwotICAgIGlmICh0IC8gU0VDX1RPX05TICE9IHR2LT50dl9zZWMpIHsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHR2LT50dl9zZWMpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjOworCisgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHQsIFNFQ19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICByZXMgPSAtMTsKICAgICB9CisgICAgdCA9IHQgKiBTRUNfVE9fTlM7CiAKICAgICB0ICs9IChfUHlUaW1lX3QpdHYtPnR2X3VzZWMgKiBVU19UT19OUzsKIApAQCAtMjIxLDUwICsyNzMsNTIgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50CitfUHlUaW1lX0Zyb21GbG9hdE9iamVjdChfUHlUaW1lX3QgKnQsIGRvdWJsZSB2YWx1ZSwgX1B5VGltZV9yb3VuZF90IHJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB1bml0X3RvX25zKQoreworICAgIGRvdWJsZSBlcnI7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBkOworCisgICAgLyogY29udmVydCB0byBhIG51bWJlciBvZiBuYW5vc2Vjb25kcyAqLworICAgIGQgPSB2YWx1ZTsKKyAgICBkICo9IChkb3VibGUpdW5pdF90b19uczsKKyAgICBkID0gX1B5VGltZV9Sb3VuZChkLCByb3VuZCk7CisKKyAgICAqdCA9IChfUHlUaW1lX3QpZDsKKyAgICBlcnIgPSBkIC0gKGRvdWJsZSkqdDsKKyAgICBpZiAoZmFicyhlcnIpID49IDEuMCkgeworICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIF9QeVRpbWVfRnJvbU9iamVjdChfUHlUaW1lX3QgKnQsIFB5T2JqZWN0ICpvYmosIF9QeVRpbWVfcm91bmRfdCByb3VuZCwKLSAgICAgICAgICAgICAgICAgICBsb25nIHRvX25hbm9zZWNvbmRzKQorICAgICAgICAgICAgICAgICAgIGxvbmcgdW5pdF90b19ucykKIHsKICAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7Ci0gICAgICAgIC8qIHZvbGF0aWxlIGF2b2lkcyB1bnNhZmUgb3B0aW1pemF0aW9uIG9uIGZsb2F0IGVuYWJsZWQgYnkgZ2NjIC1PMyAqLwotICAgICAgICB2b2xhdGlsZSBkb3VibGUgZCwgZXJyOwotCi0gICAgICAgIC8qIGNvbnZlcnQgdG8gYSBudW1iZXIgb2YgbmFub3NlY29uZHMgKi8KKyAgICAgICAgZG91YmxlIGQ7CiAgICAgICAgIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGQgKj0gdG9fbmFub3NlY29uZHM7Ci0KLSAgICAgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykKLSAgICAgICAgICAgIGQgPSBjZWlsKGQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkID0gZmxvb3IoZCk7Ci0KLSAgICAgICAgKnQgPSAoX1B5VGltZV90KWQ7Ci0gICAgICAgIGVyciA9IGQgLSAoZG91YmxlKSp0OwotICAgICAgICBpZiAoZmFicyhlcnIpID49IDEuMCkgewotICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gX1B5VGltZV9Gcm9tRmxvYXRPYmplY3QodCwgZCwgcm91bmQsIHVuaXRfdG9fbnMpOwogICAgIH0KICAgICBlbHNlIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgICAgICBQWV9MT05HX0xPTkcgc2VjOworICAgICAgICBsb25nIGxvbmcgc2VjOworICAgICAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKGxvbmcgbG9uZykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworCiAgICAgICAgIHNlYyA9IFB5TG9uZ19Bc0xvbmdMb25nKG9iaik7Ci0gICAgICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7Ci0jZWxzZQotICAgICAgICBsb25nIHNlYzsKLSAgICAgICAgc2VjID0gUHlMb25nX0FzTG9uZyhvYmopOwotICAgICAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOwotI2VuZGlmCiAgICAgICAgIGlmIChzZWMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCiAgICAgICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgICp0ID0gc2VjICogdG9fbmFub3NlY29uZHM7Ci0gICAgICAgIGlmICgqdCAvIHRvX25hbm9zZWNvbmRzICE9IHNlYykgeworCisgICAgICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyhzZWMsIHVuaXRfdG9fbnMpKSB7CiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKyAgICAgICAgKnQgPSBzZWMgKiB1bml0X3RvX25zOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CkBAIC0yODQsMjQgKzMzOCwyOCBAQAogZG91YmxlCiBfUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShfUHlUaW1lX3QgdCkKIHsKLSAgICBfUHlUaW1lX3Qgc2VjLCBuczsKLSAgICAvKiBEaXZpZGUgdXNpbmcgaW50ZWdlcnMgdG8gYXZvaWQgcm91bmRpbmcgaXNzdWVzIG9uIHRoZSBpbnRlZ2VyIHBhcnQuCi0gICAgICAgMWUtOSBjYW5ub3QgYmUgc3RvcmVkIGV4YWN0bHkgaW4gSUVFRSA2NC1iaXQuICovCi0gICAgc2VjID0gdCAvIFNFQ19UT19OUzsKLSAgICBucyA9IHQgJSBTRUNfVE9fTlM7Ci0gICAgcmV0dXJuIChkb3VibGUpc2VjICsgKGRvdWJsZSlucyAqIDFlLTk7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBkOworCisgICAgaWYgKHQgJSBTRUNfVE9fTlMgPT0gMCkgeworICAgICAgICBfUHlUaW1lX3Qgc2VjczsKKyAgICAgICAgLyogRGl2aWRlIHVzaW5nIGludGVnZXJzIHRvIGF2b2lkIHJvdW5kaW5nIGlzc3VlcyBvbiB0aGUgaW50ZWdlciBwYXJ0LgorICAgICAgICAgICAxZS05IGNhbm5vdCBiZSBzdG9yZWQgZXhhY3RseSBpbiBJRUVFIDY0LWJpdC4gKi8KKyAgICAgICAgc2VjcyA9IHQgLyBTRUNfVE9fTlM7CisgICAgICAgIGQgPSAoZG91YmxlKXNlY3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkID0gKGRvdWJsZSl0OworICAgICAgICBkIC89IDFlOTsKKyAgICB9CisgICAgcmV0dXJuIGQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeVRpbWVfQXNOYW5vc2Vjb25kc09iamVjdChfUHlUaW1lX3QgdCkKIHsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA+PSBzaXplb2YoX1B5VGltZV90KSk7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl0KTsKLSNlbHNlCi0gICAgYXNzZXJ0KHNpemVvZihsb25nKSA+PSBzaXplb2YoX1B5VGltZV90KSk7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl0KTsKLSNlbmRpZgorICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YobG9uZyBsb25nKSA+PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZyl0KTsKIH0KIAogc3RhdGljIF9QeVRpbWVfdApAQCAtMzA5LDcgKzM2NywyMCBAQAogICAgICAgICAgICAgICAgY29uc3QgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewogICAgIGFzc2VydChrID4gMSk7Ci0gICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgeworICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgeworICAgICAgICBfUHlUaW1lX3QgeCwgciwgYWJzX3I7CisgICAgICAgIHggPSB0IC8gazsKKyAgICAgICAgciA9IHQgJSBrOworICAgICAgICBhYnNfciA9IFB5X0FCUyhyKTsKKyAgICAgICAgaWYgKGFic19yID4gayAvIDIgfHwgKGFic19yID09IGsgLyAyICYmIChQeV9BQlMoeCkgJiAxKSkpIHsKKyAgICAgICAgICAgIGlmICh0ID49IDApCisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKSB7CiAgICAgICAgIGlmICh0ID49IDApCiAgICAgICAgICAgICByZXR1cm4gKHQgKyBrIC0gMSkgLyBrOwogICAgICAgICBlbHNlCkBAIC0zNzMsNyArNDQ0LDcgQEAKIF9QeVRpbWVfQXNUaW1ldmFsU3RydWN0X2ltcGwoX1B5VGltZV90IHQsIHN0cnVjdCB0aW1ldmFsICp0diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VGltZV9yb3VuZF90IHJvdW5kLCBpbnQgcmFpc2UpCiB7Ci0gICAgX1B5VGltZV90IHNlY3M7CisgICAgX1B5VGltZV90IHNlY3MsIHNlY3MyOwogICAgIGludCB1czsKICAgICBpbnQgcmVzOwogCkBAIC0zODYsNyArNDU3LDggQEAKICNlbmRpZgogICAgIHR2LT50dl91c2VjID0gdXM7CiAKLSAgICBpZiAocmVzIDwgMCB8fCAoX1B5VGltZV90KXR2LT50dl9zZWMgIT0gc2VjcykgeworICAgIHNlY3MyID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjOworICAgIGlmIChyZXMgPCAwIHx8IHNlY3MyICE9IHNlY3MpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTQyNCw2ICs0OTYsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKICNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkgfHwgZGVmaW5lZChIQVZFX0tRVUVVRSkKIGludAogX1B5VGltZV9Bc1RpbWVzcGVjKF9QeVRpbWVfdCB0LCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQpAQCAtNDM3LDEzICs1MTAsMTMgQEAKICAgICAgICAgc2VjcyAtPSAxOwogICAgIH0KICAgICB0cy0+dHZfc2VjID0gKHRpbWVfdClzZWNzOwotICAgIGlmICgoX1B5VGltZV90KXRzLT50dl9zZWMgIT0gc2VjcykgewotICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgYXNzZXJ0KDAgPD0gbnNlYyAmJiBuc2VjIDwgU0VDX1RPX05TKTsKICAgICB0cy0+dHZfbnNlYyA9IG5zZWM7CiAKLSAgICBhc3NlcnQoMCA8PSB0cy0+dHZfbnNlYyAmJiB0cy0+dHZfbnNlYyA8PSA5OTk5OTk5OTkpOworICAgIGlmICgoX1B5VGltZV90KXRzLT50dl9zZWMgIT0gc2VjcykgeworICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNTU3LDE5ICs2MzAsMjAgQEAKICAgICByZXR1cm4gcHlnZXR0aW1lb2ZkYXkodCwgaW5mbywgMSk7CiB9CiAKLQogc3RhdGljIGludAogcHltb25vdG9uaWMoX1B5VGltZV90ICp0cCwgX1B5X2Nsb2NrX2luZm9fdCAqaW5mbywgaW50IHJhaXNlKQogewogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKLSAgICBVTE9OR0xPTkcgcmVzdWx0OworICAgIFVMT05HTE9ORyB0aWNrczsKKyAgICBfUHlUaW1lX3QgdDsKIAogICAgIGFzc2VydChpbmZvID09IE5VTEwgfHwgcmFpc2UpOwogCi0gICAgcmVzdWx0ID0gR2V0VGlja0NvdW50NjQoKTsKKyAgICB0aWNrcyA9IEdldFRpY2tDb3VudDY0KCk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aWNrcykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSAoX1B5VGltZV90KXRpY2tzOwogCi0gICAgKnRwID0gcmVzdWx0ICogTVNfVE9fTlM7Ci0gICAgaWYgKCp0cCAvIE1TX1RPX05TICE9IHJlc3VsdCkgeworICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyh0LCBNU19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC01NzcsNiArNjUxLDcgQEAKICAgICAgICAgLyogSGVsbG8sIHRpbWUgdHJhdmVsZXIhICovCiAgICAgICAgIGFzc2VydCgwKTsKICAgICB9CisgICAgKnRwID0gdCAqIE1TX1RPX05TOwogCiAgICAgaWYgKGluZm8pIHsKICAgICAgICAgRFdPUkQgdGltZUFkanVzdG1lbnQsIHRpbWVJbmNyZW1lbnQ7CkBAIC02ODksOCArNzY0LDUgQEAKICAgICBpZiAoX1B5VGltZV9HZXRNb25vdG9uaWNDbG9ja1dpdGhJbmZvKCZ0LCBOVUxMKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIC8qIGNoZWNrIHRoYXQgX1B5VGltZV9Gcm9tU2Vjb25kcygpIGNhbm5vdCBvdmVyZmxvdyAqLwotICAgIGFzc2VydChJTlRfTUFYIDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKTsKLSAgICBhc3NlcnQoSU5UX01JTiA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUyk7CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcmFuZG9tLmMgYi9QeXRob24vcmFuZG9tLmMKaW5kZXggMzExOTg3Mi4uZWE1MDZlZSAxMDA2NDQKLS0tIGEvUHl0aG9uL3JhbmRvbS5jCisrKyBiL1B5dGhvbi9yYW5kb20uYwpAQCAtMSw2ICsxLDkgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpZmRlZiBNU19XSU5ET1dTCiAjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiBBbGwgc2FtcGxlIE1TRE4gd2luY3J5cHQgcHJvZ3JhbXMgaW5jbHVkZSB0aGUgaGVhZGVyIGJlbG93LiBJdCBpcyBhdCBsZWFzdAorICogcmVxdWlyZWQgd2l0aCBNaW4gR1cuICovCisjICBpbmNsdWRlIDx3aW5jcnlwdC5oPgogI2Vsc2UKICMgIGluY2x1ZGUgPGZjbnRsLmg+CiAjICBpZmRlZiBIQVZFX1NZU19TVEFUX0gKQEAgLTM2LDEwICszOSw5IEBACiAgICAgcmV0dXJuIDA7CiAKIGVycm9yOgotICAgIGlmIChyYWlzZSkKKyAgICBpZiAocmFpc2UpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0gICAgZWxzZQotICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXaW5kb3dzIHJhbmRvbSBBUEkgKENyeXB0b0dlbikiKTsKKyAgICB9CiAgICAgcmV0dXJuIC0xOwogfQogCkBAIC01Miw4ICs1NCw5IEBACiAKICAgICBpZiAoaENyeXB0UHJvdiA9PSAwKQogICAgIHsKLSAgICAgICAgaWYgKHdpbjMyX3VyYW5kb21faW5pdChyYWlzZSkgPT0gLTEpCisgICAgICAgIGlmICh3aW4zMl91cmFuZG9tX2luaXQocmFpc2UpID09IC0xKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAoc2l6ZSA+IDApCkBAIC02MiwxMSArNjUsOSBAQAogICAgICAgICBpZiAoIUNyeXB0R2VuUmFuZG9tKGhDcnlwdFByb3YsIChEV09SRCljaHVuaywgYnVmZmVyKSkKICAgICAgICAgewogICAgICAgICAgICAgLyogQ3J5cHRHZW5SYW5kb20oKSBmYWlsZWQgKi8KLSAgICAgICAgICAgIGlmIChyYWlzZSkKKyAgICAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplZCB0aGUgcmFuZG9taXplZCBoYXNoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWNyZXQgdXNpbmcgQ3J5cHRvR2VuKSIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGJ1ZmZlciArPSBjaHVuazsKQEAgLTgzLDI5ICs4NCwyOCBAQAogLyogRmlsbCBidWZmZXIgd2l0aCBzaXplIHBzZXVkby1yYW5kb20gYnl0ZXMgZ2VuZXJhdGVkIGJ5IGdldGVudHJvcHkoKS4KICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG9yIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLgogCi0gICBJZiBmYXRhbCBpcyBub256ZXJvLCBjYWxsIFB5X0ZhdGFsRXJyb3IoKSBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uCi0gICBvbiBlcnJvci4gKi8KKyAgIElmIHJhaXNlIGlzIHplcm8sIGRvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLXB5X2dldGVudHJvcHkodW5zaWduZWQgY2hhciAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUsIGludCBmYXRhbCkKK3B5X2dldGVudHJvcHkoY2hhciAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUsIGludCByYWlzZSkKIHsKICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeV9NSU4oc2l6ZSwgMjU2KTsKICAgICAgICAgaW50IHJlczsKIAotICAgICAgICBpZiAoIWZhdGFsKSB7CisgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICAgcmVzID0gZ2V0ZW50cm9weShidWZmZXIsIGxlbik7CiAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwotCi0gICAgICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXMgPSBnZXRlbnRyb3B5KGJ1ZmZlciwgbGVuKTsKLSAgICAgICAgICAgIGlmIChyZXMgPCAwKQotICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImdldGVudHJvcHkoKSBmYWlsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBpZiAocmFpc2UpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAogICAgICAgICBidWZmZXIgKz0gbGVuOwpAQCAtMTE5LDI0ICsxMTksMzEgQEAKICNpZiBkZWZpbmVkKEhBVkVfR0VUUkFORE9NKSB8fCBkZWZpbmVkKEhBVkVfR0VUUkFORE9NX1NZU0NBTEwpCiAjZGVmaW5lIFBZX0dFVFJBTkRPTSAxCiAKKy8qIENhbGwgZ2V0cmFuZG9tKCkKKyAgIC0gUmV0dXJuIDEgb24gc3VjY2VzcworICAgLSBSZXR1cm4gMCBpZiBnZXRyYW5kb20oKSBzeXNjYWxsIGlzIG5vdCBhdmFpbGFibGUgKGZhaWxzIHdpdGggRU5PU1lTKQorICAgICBvciBpZiBnZXRyYW5kb20oR1JORF9OT05CTE9DSykgZmFpbHMgd2l0aCBFQUdBSU4gKGJsb2NraW5nPTAgYW5kIHN5c3RlbQorICAgICB1cmFuZG9tIG5vdCBpbml0aWFsaXplZCB5ZXQpIGFuZCByYWlzZT0wLgorICAgLSBSYWlzZSBhbiBleGNlcHRpb24gKGlmIHJhaXNlIGlzIG5vbi16ZXJvKSBhbmQgcmV0dXJuIC0xIG9uIGVycm9yOgorICAgICBnZXRyYW5kb20oKSBmYWlsZWQgd2l0aCBFSU5UUiBhbmQgdGhlIFB5dGhvbiBzaWduYWwgaGFuZGxlciByYWlzZWQgYW4KKyAgICAgZXhjZXB0aW9uLCBvciBnZXRyYW5kb20oKSBmYWlsZWQgd2l0aCBhIGRpZmZlcmVudCBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLXB5X2dldHJhbmRvbSh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IHJhaXNlKQorcHlfZ2V0cmFuZG9tKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplLCBpbnQgYmxvY2tpbmcsIGludCByYWlzZSkKIHsKLSAgICAvKiBJcyBnZXRyYW5kb20oKSBzdXBwb3J0ZWQgYnkgdGhlIHJ1bm5pbmcga2VybmVsPwotICAgICAqIE5lZWQgTGludXgga2VybmVsIDMuMTcgb3IgbmV3ZXIsIG9yIFNvbGFyaXMgMTEuMyBvciBuZXdlciAqLworICAgIC8qIElzIGdldHJhbmRvbSgpIHN1cHBvcnRlZCBieSB0aGUgcnVubmluZyBrZXJuZWw/IFNldCB0byAwIGlmIGdldHJhbmRvbSgpCisgICAgICAgZmFpbHMgd2l0aCBFTk9TWVMuIE5lZWQgTGludXgga2VybmVsIDMuMTcgb3IgbmV3ZXIsIG9yIFNvbGFyaXMgMTEuMworICAgICAgIG9yIG5ld2VyICovCiAgICAgc3RhdGljIGludCBnZXRyYW5kb21fd29ya3MgPSAxOwotCi0gICAgLyogZ2V0cmFuZG9tKCkgb24gTGludXggd2lsbCBibG9jayBpZiBjYWxsZWQgYmVmb3JlIHRoZSBrZXJuZWwgaGFzCi0gICAgICogaW5pdGlhbGl6ZWQgdGhlIHVyYW5kb20gZW50cm9weSBwb29sLiBUaGlzIHdpbGwgY2F1c2UgUHl0aG9uCi0gICAgICogdG8gaGFuZyBvbiBzdGFydHVwIGlmIGNhbGxlZCB2ZXJ5IGVhcmx5IGluIHRoZSBib290IHByb2Nlc3MgLQotICAgICAqIHNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI2ODM5LiBUbyBhdm9pZCB0aGlzLCB1c2UgdGhlCi0gICAgICogR1JORF9OT05CTE9DSyBmbGFnLiAqLwotICAgIGNvbnN0IGludCBmbGFncyA9IEdSTkRfTk9OQkxPQ0s7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmRlc3Q7CiAgICAgbG9uZyBuOwogCi0gICAgaWYgKCFnZXRyYW5kb21fd29ya3MpCisgICAgaWYgKCFnZXRyYW5kb21fd29ya3MpIHsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCisgICAgZmxhZ3MgPSBibG9ja2luZyA/IDAgOiBHUk5EX05PTkJMT0NLOworICAgIGRlc3QgPSBidWZmZXI7CiAgICAgd2hpbGUgKDAgPCBzaXplKSB7CiAjaWZkZWYgc3VuCiAgICAgICAgIC8qIElzc3VlICMyNjczNTogT24gU29sYXJpcywgZ2V0cmFuZG9tKCkgaXMgbGltaXRlZCB0byByZXR1cm5pbmcgdXAKQEAgLTE1MCwyMyArMTU3LDIzIEBACiAjaWZkZWYgSEFWRV9HRVRSQU5ET00KICAgICAgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgICAgICBuID0gZ2V0cmFuZG9tKGJ1ZmZlciwgbiwgZmxhZ3MpOworICAgICAgICAgICAgbiA9IGdldHJhbmRvbShkZXN0LCBuLCBmbGFncyk7CiAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgbiA9IGdldHJhbmRvbShidWZmZXIsIG4sIGZsYWdzKTsKKyAgICAgICAgICAgIG4gPSBnZXRyYW5kb20oZGVzdCwgbiwgZmxhZ3MpOwogICAgICAgICB9CiAjZWxzZQogICAgICAgICAvKiBPbiBMaW51eCwgdXNlIHRoZSBzeXNjYWxsKCkgZnVuY3Rpb24gYmVjYXVzZSB0aGUgR05VIGxpYmMgZG9lc24ndAotICAgICAgICAgKiBleHBvc2UgdGhlIExpbnV4IGdldHJhbmRvbSgpIHN5c2NhbGwgeWV0LiBTZWU6Ci0gICAgICAgICAqIGh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MjUyICovCisgICAgICAgICAgIGV4cG9zZSB0aGUgTGludXggZ2V0cmFuZG9tKCkgc3lzY2FsbCB5ZXQuIFNlZToKKyAgICAgICAgICAgaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTcyNTIgKi8KICAgICAgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBidWZmZXIsIG4sIGZsYWdzKTsKKyAgICAgICAgICAgIG4gPSBzeXNjYWxsKFNZU19nZXRyYW5kb20sIGRlc3QsIG4sIGZsYWdzKTsKICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBidWZmZXIsIG4sIGZsYWdzKTsKKyAgICAgICAgICAgIG4gPSBzeXNjYWxsKFNZU19nZXRyYW5kb20sIGRlc3QsIG4sIGZsYWdzKTsKICAgICAgICAgfQogI2VuZGlmCiAKQEAgLTE3NSwzNiArMTgyLDMzIEBACiAgICAgICAgICAgICAgICAgZ2V0cmFuZG9tX3dvcmtzID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKLSAgICAgICAgICAgICAgICAvKiBJZiB3ZSBmYWlsZWQgd2l0aCBFQUdBSU4sIHRoZSBlbnRyb3B5IHBvb2wgd2FzCi0gICAgICAgICAgICAgICAgICogdW5pbml0aWFsaXplZC4gSW4gdGhpcyBjYXNlLCB3ZSByZXR1cm4gZmFpbHVyZSB0byBmYWxsCi0gICAgICAgICAgICAgICAgICogYmFjayB0byByZWFkaW5nIGZyb20gL2Rldi91cmFuZG9tLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogTm90ZTogSW4gdGhpcyBjYXNlIHRoZSBkYXRhIHJlYWQgd2lsbCBub3QgYmUgcmFuZG9tIHNvCi0gICAgICAgICAgICAgICAgICogc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBjcnlwdG9ncmFwaGljIHB1cnBvc2VzLiBSZXRhaW5pbmcKLSAgICAgICAgICAgICAgICAgKiB0aGUgZXhpc3Rpbmcgc2VtYW50aWNzIGZvciBwcmFjdGljYWwgcHVycG9zZXMuICovCi0gICAgICAgICAgICAgICAgZ2V0cmFuZG9tX3dvcmtzID0gMDsKKworICAgICAgICAgICAgLyogZ2V0cmFuZG9tKEdSTkRfTk9OQkxPQ0spIGZhaWxzIHdpdGggRUFHQUlOIGlmIHRoZSBzeXN0ZW0gdXJhbmRvbQorICAgICAgICAgICAgICAgaXMgbm90IGluaXRpYWxpYXplZCB5ZXQuIEZvciBfUHlSYW5kb21fSW5pdCgpLCB3ZSBpZ25vcmUgdGhlaXIKKyAgICAgICAgICAgICAgIGVycm9yIGFuZCBmYWxsIGJhY2sgb24gcmVhZGluZyAvZGV2L3VyYW5kb20gd2hpY2ggbmV2ZXIgYmxvY2tzLAorICAgICAgICAgICAgICAgZXZlbiBpZiB0aGUgc3lzdGVtIHVyYW5kb20gaXMgbm90IGluaXRpYWxpemVkIHlldC4gKi8KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gJiYgIXJhaXNlICYmICFibG9ja2luZykgewogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyYWlzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImdldHJhbmRvbSgpIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBpZiAocmFpc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogcmV0cnkgZ2V0cmFuZG9tKCkgKi8KKworICAgICAgICAgICAgICAgIC8qIHJldHJ5IGdldHJhbmRvbSgpIGlmIGl0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCAqLwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocmFpc2UpCisgICAgICAgICAgICBpZiAocmFpc2UpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiZ2V0cmFuZG9tKCkgZmFpbGVkIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBidWZmZXIgKz0gbjsKKyAgICAgICAgZGVzdCArPSBuOwogICAgICAgICBzaXplIC09IG47CiAgICAgfQogICAgIHJldHVybiAxOwpAQCAtMjE4LDEyNiArMjIyLDExOCBAQAogfSB1cmFuZG9tX2NhY2hlID0geyAtMSB9OwogCiAKLS8qIFJlYWQgc2l6ZSBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSBpbnRvIGJ1ZmZlci4KLSAgIENhbGwgUHlfRmF0YWxFcnJvcigpIG9uIGVycm9yLiAqLwotc3RhdGljIHZvaWQKLWRldl91cmFuZG9tX25vcmFpc2UodW5zaWduZWQgY2hhciAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUpCi17Ci0gICAgaW50IGZkOwotICAgIFB5X3NzaXplX3QgbjsKKy8qIFJlYWQgJ3NpemUnIHJhbmRvbSBieXRlcyBmcm9tIHB5X2dldHJhbmRvbSgpLiBGYWxsIGJhY2sgb24gcmVhZGluZyBmcm9tCisgICAvZGV2L3VyYW5kb20gaWYgZ2V0cmFuZG9tKCkgaXMgbm90IGF2YWlsYWJsZS4KIAotICAgIGFzc2VydCAoMCA8IHNpemUpOwotCi0jaWZkZWYgUFlfR0VUUkFORE9NCi0gICAgaWYgKHB5X2dldHJhbmRvbShidWZmZXIsIHNpemUsIDApID09IDEpCi0gICAgICAgIHJldHVybjsKLSAgICAvKiBnZXRyYW5kb20oKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBydW5uaW5nIGtlcm5lbCwgZmFsbCBiYWNrCi0gICAgICogb24gcmVhZGluZyAvZGV2L3VyYW5kb20gKi8KLSNlbmRpZgotCi0gICAgZmQgPSBfUHlfb3Blbl9ub3JhaXNlKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7Ci0gICAgaWYgKGZkIDwgMCkKLSAgICAgICAgUHlfRmF0YWxFcnJvcigiRmFpbGVkIHRvIG9wZW4gL2Rldi91cmFuZG9tIik7Ci0KLSAgICB3aGlsZSAoMCA8IHNpemUpCi0gICAgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gcmVhZChmZCwgYnVmZmVyLCAoc2l6ZV90KXNpemUpOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgICAgIGlmIChuIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN0b3Agb24gZXJyb3Igb3IgaWYgcmVhZChzaXplKSByZXR1cm5lZCAwICovCi0gICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJGYWlsZWQgdG8gcmVhZCBieXRlcyBmcm9tIC9kZXYvdXJhbmRvbSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyICs9IG47Ci0gICAgICAgIHNpemUgLT0gbjsKLSAgICB9Ci0gICAgY2xvc2UoZmQpOwotfQotCi0vKiBSZWFkIHNpemUgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20gaW50byBidWZmZXIuCi0gICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MuIFJhaXNlIGFuIGV4Y2VwdGlvbiAoaWYgcmFpc2UgaXMgbm9uLXplcm8pIGFuZCByZXR1cm4gLTEKKyAgIG9uIGVycm9yLiAqLwogc3RhdGljIGludAotZGV2X3VyYW5kb21fcHl0aG9uKGNoYXIgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKQorZGV2X3VyYW5kb20oY2hhciAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUsIGludCBibG9ja2luZywgaW50IHJhaXNlKQogewogICAgIGludCBmZDsKICAgICBQeV9zc2l6ZV90IG47Ci0gICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBzdDsKICNpZmRlZiBQWV9HRVRSQU5ET00KICAgICBpbnQgcmVzOwogI2VuZGlmCiAKLSAgICBpZiAoc2l6ZSA8PSAwKQotICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoc2l6ZSA+IDApOwogCiAjaWZkZWYgUFlfR0VUUkFORE9NCi0gICAgcmVzID0gcHlfZ2V0cmFuZG9tKGJ1ZmZlciwgc2l6ZSwgMSk7Ci0gICAgaWYgKHJlcyA8IDApCisgICAgcmVzID0gcHlfZ2V0cmFuZG9tKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcsIHJhaXNlKTsKKyAgICBpZiAocmVzIDwgMCkgewogICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHJlcyA9PSAxKQorICAgIH0KKyAgICBpZiAocmVzID09IDEpIHsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIC8qIGdldHJhbmRvbSgpIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJ1bm5pbmcga2VybmVsLCBmYWxsIGJhY2sKLSAgICAgKiBvbiByZWFkaW5nIC9kZXYvdXJhbmRvbSAqLworICAgICAgIG9uIHJlYWRpbmcgL2Rldi91cmFuZG9tICovCiAjZW5kaWYKIAotICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApIHsKLSAgICAgICAgLyogRG9lcyB0aGUgZmQgcG9pbnQgdG8gdGhlIHNhbWUgdGhpbmcgYXMgYmVmb3JlPyAoaXNzdWUgIzIxMjA3KSAqLwotICAgICAgICBpZiAoX1B5X2ZzdGF0X25vcmFpc2UodXJhbmRvbV9jYWNoZS5mZCwgJnN0KQotICAgICAgICAgICAgfHwgc3Quc3RfZGV2ICE9IHVyYW5kb21fY2FjaGUuc3RfZGV2Ci0gICAgICAgICAgICB8fCBzdC5zdF9pbm8gIT0gdXJhbmRvbV9jYWNoZS5zdF9pbm8pIHsKLSAgICAgICAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkOiBmb3JnZXQgdGhlIGNhY2hlZCBmZCAoYnV0IGRvbid0IGNsb3NlIGl0LAotICAgICAgICAgICAgICAgc2luY2UgaXQgcHJvYmFibHkgcG9pbnRzIHRvIHNvbWV0aGluZyBpbXBvcnRhbnQgZm9yIHNvbWUKLSAgICAgICAgICAgICAgIHRoaXJkLXBhcnR5IGNvZGUpLiAqLwotICAgICAgICAgICAgdXJhbmRvbV9jYWNoZS5mZCA9IC0xOworCisgICAgaWYgKHJhaXNlKSB7CisgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3Q7CisKKyAgICAgICAgaWYgKHVyYW5kb21fY2FjaGUuZmQgPj0gMCkgeworICAgICAgICAgICAgLyogRG9lcyB0aGUgZmQgcG9pbnQgdG8gdGhlIHNhbWUgdGhpbmcgYXMgYmVmb3JlPyAoaXNzdWUgIzIxMjA3KSAqLworICAgICAgICAgICAgaWYgKF9QeV9mc3RhdF9ub3JhaXNlKHVyYW5kb21fY2FjaGUuZmQsICZzdCkKKyAgICAgICAgICAgICAgICB8fCBzdC5zdF9kZXYgIT0gdXJhbmRvbV9jYWNoZS5zdF9kZXYKKyAgICAgICAgICAgICAgICB8fCBzdC5zdF9pbm8gIT0gdXJhbmRvbV9jYWNoZS5zdF9pbm8pIHsKKyAgICAgICAgICAgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZDogZm9yZ2V0IHRoZSBjYWNoZWQgZmQgKGJ1dCBkb24ndCBjbG9zZSBpdCwKKyAgICAgICAgICAgICAgICAgICBzaW5jZSBpdCBwcm9iYWJseSBwb2ludHMgdG8gc29tZXRoaW5nIGltcG9ydGFudCBmb3Igc29tZQorICAgICAgICAgICAgICAgICAgIHRoaXJkLXBhcnR5IGNvZGUpLiAqLworICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuZmQgPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAodXJhbmRvbV9jYWNoZS5mZCA+PSAwKQorICAgICAgICAgICAgZmQgPSB1cmFuZG9tX2NhY2hlLmZkOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZkID0gX1B5X29wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVOWElPIHx8CisgICAgICAgICAgICAgICAgICAgIGVycm5vID09IEVOT0RFViB8fCBlcnJubyA9PSBFQUNDRVMpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvdXJhbmRvbSAob3IgZXF1aXZhbGVudCkgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBrZWVwIHRoZSBPU0Vycm9yIGV4Y2VwdGlvbiByYWlzZWQgYnkgX1B5X29wZW4oKSAqLworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApIHsKKyAgICAgICAgICAgICAgICAvKiB1cmFuZG9tX2ZkIHdhcyBpbml0aWFsaXplZCBieSBhbm90aGVyIHRocmVhZCB3aGlsZSB3ZSB3ZXJlCisgICAgICAgICAgICAgICAgICAgbm90IGhvbGRpbmcgdGhlIEdJTCwga2VlcCBpdC4gKi8KKyAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgZmQgPSB1cmFuZG9tX2NhY2hlLmZkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKF9QeV9mc3RhdChmZCwgJnN0KSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuZmQgPSBmZDsKKyAgICAgICAgICAgICAgICAgICAgdXJhbmRvbV9jYWNoZS5zdF9kZXYgPSBzdC5zdF9kZXY7CisgICAgICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuc3RfaW5vID0gc3Quc3RfaW5vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG4gPSBfUHlfcmVhZChmZCwgYnVmZmVyLCAoc2l6ZV90KXNpemUpOworICAgICAgICAgICAgaWYgKG4gPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgJXppIGJ5dGVzIGZyb20gL2Rldi91cmFuZG9tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyICs9IG47CisgICAgICAgICAgICBzaXplIC09IG47CisgICAgICAgIH0gd2hpbGUgKDAgPCBzaXplKTsKICAgICB9Ci0gICAgaWYgKHVyYW5kb21fY2FjaGUuZmQgPj0gMCkKLSAgICAgICAgZmQgPSB1cmFuZG9tX2NhY2hlLmZkOwogICAgIGVsc2UgewotICAgICAgICBmZCA9IF9QeV9vcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgICAgIGZkID0gX1B5X29wZW5fbm9yYWlzZSgiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOwogICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVOWElPIHx8Ci0gICAgICAgICAgICAgICAgZXJybm8gPT0gRU5PREVWIHx8IGVycm5vID09IEVBQ0NFUykKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvdXJhbmRvbSAob3IgZXF1aXZhbGVudCkgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAvKiBvdGhlcndpc2UsIGtlZXAgdGhlIE9TRXJyb3IgZXhjZXB0aW9uIHJhaXNlZCBieSBfUHlfb3BlbigpICovCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHVyYW5kb21fY2FjaGUuZmQgPj0gMCkgewotICAgICAgICAgICAgLyogdXJhbmRvbV9mZCB3YXMgaW5pdGlhbGl6ZWQgYnkgYW5vdGhlciB0aHJlYWQgd2hpbGUgd2Ugd2VyZQotICAgICAgICAgICAgICAgbm90IGhvbGRpbmcgdGhlIEdJTCwga2VlcCBpdC4gKi8KLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIGZkID0gdXJhbmRvbV9jYWNoZS5mZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChfUHlfZnN0YXQoZmQsICZzdCkpIHsKKworICAgICAgICB3aGlsZSAoMCA8IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBuID0gcmVhZChmZCwgYnVmZmVyLCAoc2l6ZV90KXNpemUpOworICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICAgICAgLyogc3RvcCBvbiBlcnJvciBvciBpZiByZWFkKHNpemUpIHJldHVybmVkIDAgKi8KICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXJhbmRvbV9jYWNoZS5mZCA9IGZkOwotICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuc3RfZGV2ID0gc3Quc3RfZGV2OwotICAgICAgICAgICAgICAgIHVyYW5kb21fY2FjaGUuc3RfaW5vID0gc3Quc3RfaW5vOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXIgKz0gbjsKKyAgICAgICAgICAgIHNpemUgLT0gbjsKICAgICAgICAgfQorICAgICAgICBjbG9zZShmZCk7CiAgICAgfQotCi0gICAgZG8gewotICAgICAgICBuID0gX1B5X3JlYWQoZmQsIGJ1ZmZlciwgKHNpemVfdClzaXplKTsKLSAgICAgICAgaWYgKG4gPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCAlemkgYnl0ZXMgZnJvbSAvZGV2L3VyYW5kb20iLAotICAgICAgICAgICAgICAgICAgICBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlciArPSBuOwotICAgICAgICBzaXplIC09IG47Ci0gICAgfSB3aGlsZSAoMCA8IHNpemUpOwotCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM3MywyOSArMzY5LDYyIEBACiAgICAgfQogfQogCisvKiBJZiByYWlzZSBpcyB6ZXJvOgorICAgLSBEb24ndCByYWlzZSBleGNlcHRpb25zIG9uIGVycm9yCisgICAtIERvbid0IGNhbGwgUHlFcnJfQ2hlY2tTaWduYWxzKCkgb24gRUlOVFIgKHJldHJ5IGRpcmVjdGx5IHRoZSBpbnRlcnJ1cHRlZAorICAgICBzeXNjYWxsKQorICAgLSBEb24ndCByZWxlYXNlIHRoZSBHSUwgdG8gY2FsbCBzeXNjYWxscy4gKi8KK3N0YXRpYyBpbnQKK3B5dXJhbmRvbSh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGJsb2NraW5nLCBpbnQgcmFpc2UpCit7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGlmIChyYWlzZSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGFyZ3VtZW50IG5vdCBhbGxvd2VkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgTVNfV0lORE9XUworICAgIHJldHVybiB3aW4zMl91cmFuZG9tKCh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCBzaXplLCByYWlzZSk7CisjZWxpZiBkZWZpbmVkKFBZX0dFVEVOVFJPUFkpCisgICAgcmV0dXJuIHB5X2dldGVudHJvcHkoYnVmZmVyLCBzaXplLCByYWlzZSk7CisjZWxzZQorICAgIHJldHVybiBkZXZfdXJhbmRvbShidWZmZXIsIHNpemUsIGJsb2NraW5nLCByYWlzZSk7CisjZW5kaWYKK30KKwogLyogRmlsbCBidWZmZXIgd2l0aCBzaXplIHBzZXVkby1yYW5kb20gYnl0ZXMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByYW5kb20KICAgIG51bWJlciBnZW5lcmF0b3IgKFJORykuIEl0IGlzIHN1aXRhYmxlIGZvciBtb3N0IGNyeXB0b2dyYXBoaWMgcHVycG9zZXMKICAgIGV4Y2VwdCBsb25nIGxpdmluZyBwcml2YXRlIGtleXMgZm9yIGFzeW1tZXRyaWMgZW5jcnlwdGlvbi4KIAotICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCisgICBPbiBMaW51eCAzLjE3IGFuZCBuZXdlciwgdGhlIGdldHJhbmRvbSgpIHN5c2NhbGwgaXMgdXNlZCBpbiBibG9ja2luZyBtb2RlOgorICAgYmxvY2sgdW50aWwgdGhlIHN5c3RlbSB1cmFuZG9tIGVudHJvcHkgcG9vbCBpcyBpbml0aWFsaXplZCAoMTI4IGJpdHMgYXJlCisgICBjb2xsZWN0ZWQgYnkgdGhlIGtlcm5lbCkuCisKKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MuIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLwogaW50CiBfUHlPU19VUmFuZG9tKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKQogewotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBhcmd1bWVudCBub3QgYWxsb3dlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBweXVyYW5kb20oYnVmZmVyLCBzaXplLCAxLCAxKTsKK30KIAotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICByZXR1cm4gd2luMzJfdXJhbmRvbSgodW5zaWduZWQgY2hhciAqKWJ1ZmZlciwgc2l6ZSwgMSk7Ci0jZWxpZiBkZWZpbmVkKFBZX0dFVEVOVFJPUFkpCi0gICAgcmV0dXJuIHB5X2dldGVudHJvcHkoYnVmZmVyLCBzaXplLCAwKTsKLSNlbHNlCi0gICAgcmV0dXJuIGRldl91cmFuZG9tX3B5dGhvbigoY2hhciopYnVmZmVyLCBzaXplKTsKLSNlbmRpZgorLyogRmlsbCBidWZmZXIgd2l0aCBzaXplIHBzZXVkby1yYW5kb20gYnl0ZXMgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByYW5kb20KKyAgIG51bWJlciBnZW5lcmF0b3IgKFJORykuIEl0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyBwdXJwb3NlLgorCisgICBPbiBMaW51eCAzLjE3IGFuZCBuZXdlciAod2hlbiBnZXRyYW5kb20oKSBzeXNjYWxsIGlzIHVzZWQpLCBpZiB0aGUgc3lzdGVtCisgICB1cmFuZG9tIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQsIHRoZSBmdW5jdGlvbiByZXR1cm5zICJ3ZWFrIiBlbnRyb3B5IHJlYWQKKyAgIGZyb20gL2Rldi91cmFuZG9tLgorCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KK2ludAorX1B5T1NfVVJhbmRvbU5vbmJsb2NrKHZvaWQgKmJ1ZmZlciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIHJldHVybiBweXVyYW5kb20oYnVmZmVyLCBzaXplLCAwLCAxKTsKIH0KIAogdm9pZApAQCAtNDA0LDcgKzQzMyw3IEBACiAgICAgY2hhciAqZW52OwogICAgIHVuc2lnbmVkIGNoYXIgKnNlY3JldCA9ICh1bnNpZ25lZCBjaGFyICopJl9QeV9IYXNoU2VjcmV0LnVjOwogICAgIFB5X3NzaXplX3Qgc2VjcmV0X3NpemUgPSBzaXplb2YoX1B5X0hhc2hTZWNyZXRfdCk7Ci0gICAgYXNzZXJ0KHNlY3JldF9zaXplID09IHNpemVvZihfUHlfSGFzaFNlY3JldC51YykpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YoX1B5X0hhc2hTZWNyZXRfdCkgPT0gc2l6ZW9mKF9QeV9IYXNoU2VjcmV0LnVjKSk7CiAKICAgICBpZiAoX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQpCiAgICAgICAgIHJldHVybjsKQEAgLTQzNiwxMyArNDY1LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0jaWZkZWYgTVNfV0lORE9XUwotICAgICAgICAodm9pZCl3aW4zMl91cmFuZG9tKHNlY3JldCwgc2VjcmV0X3NpemUsIDApOwotI2VsaWYgZGVmaW5lZChQWV9HRVRFTlRST1BZKQotICAgICAgICAodm9pZClweV9nZXRlbnRyb3B5KHNlY3JldCwgc2VjcmV0X3NpemUsIDEpOwotI2Vsc2UKLSAgICAgICAgZGV2X3VyYW5kb21fbm9yYWlzZShzZWNyZXQsIHNlY3JldF9zaXplKTsKLSNlbmRpZgorICAgICAgICBpbnQgcmVzOworCisgICAgICAgIC8qIF9QeVJhbmRvbV9Jbml0KCkgaXMgY2FsbGVkIHZlcnkgZWFybHkgaW4gdGhlIFB5dGhvbiBpbml0aWFsaXphdGlvbgorICAgICAgICAgICBhbmQgc28gZXhjZXB0aW9ucyBjYW5ub3QgYmUgdXNlZCAodXNlIHJhaXNlPTApLgorCisgICAgICAgICAgIF9QeVJhbmRvbV9Jbml0KCkgbXVzdCBub3QgYmxvY2sgUHl0aG9uIGluaXRpYWxpemF0aW9uOiBjYWxsCisgICAgICAgICAgIHB5dXJhbmRvbSgpIGlzIG5vbi1ibG9ja2luZyBtb2RlIChibG9ja2luZz0wKTogc2VlIHRoZSBQRVAgNTI0LiAqLworICAgICAgICByZXMgPSBweXVyYW5kb20oc2VjcmV0LCBzZWNyZXRfc2l6ZSwgMCwgMCk7CisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJmYWlsZWQgdG8gZ2V0IHJhbmRvbSBudW1iZXJzIHRvIGluaXRpYWxpemUgUHl0aG9uIik7CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYyBiL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYwppbmRleCBhZjAyOTZkLi44NmQ0YzY2IDEwMDY0NAotLS0gYS9QeXRob24vc3RydWN0bWVtYmVyLmMKKysrIGIvUHl0aG9uL3N0cnVjdG1lbWJlci5jCkBAIC03NCwxNCArNzQsMTIgQEAKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbC0+bmFtZSk7CiAgICAgICAgIFB5X1hJTkNSRUYodik7CiAgICAgICAgIGJyZWFrOwotI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgY2FzZSBUX0xPTkdMT05HOgotICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygqKFBZX0xPTkdfTE9ORyAqKWFkZHIpOworICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygqKGxvbmcgbG9uZyAqKWFkZHIpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFRfVUxPTkdMT05HOgotICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCoodW5zaWduZWQgUFlfTE9OR19MT05HICopYWRkcik7CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKih1bnNpZ25lZCBsb25nIGxvbmcgKilhZGRyKTsKICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KICAgICBjYXNlIFRfTk9ORToKICAgICAgICAgdiA9IFB5X05vbmU7CiAgICAgICAgIFB5X0lOQ1JFRih2KTsKQEAgLTI2NiwyNyArMjY0LDI1IEBACiAgICAgY2FzZSBUX1NUUklOR19JTlBMQUNFOgogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVhZG9ubHkgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiAtMTsKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgIGNhc2UgVF9MT05HTE9ORzp7Ci0gICAgICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKLSAgICAgICAgKihQWV9MT05HX0xPTkcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOworICAgICAgICBsb25nIGxvbmcgdmFsdWU7CisgICAgICAgICoobG9uZyBsb25nKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKICAgICAgICAgaWYgKCh2YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBjYXNlIFRfVUxPTkdMT05HOnsKLSAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbHVlOworICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWU7CiAgICAgICAgIC8qID8/PyBQeUxvbmdfQXNMb25nTG9uZyBhY2NlcHRzIGFuIGludCwgYnV0IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKICAgICAgICAgICAgIGRvZXNuJ3QgPz8/ICovCiAgICAgICAgIGlmIChQeUxvbmdfQ2hlY2sodikpCi0gICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKyAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyBsb25nKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzTG9uZyh2KTsKLSAgICAgICAgaWYgKCh2YWx1ZSA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nIGxvbmcqKWFkZHIgPSB2YWx1ZSA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgIGlmICgodmFsdWUgPT0gKHVuc2lnbmVkIGxvbmcgbG9uZyktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLwogICAgIGRlZmF1bHQ6CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJiYWQgbWVtYmVyZGVzY3IgdHlwZSBmb3IgJXMiLCBsLT5uYW1lKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9zeW10YWJsZS5jIGIvUHl0aG9uL3N5bXRhYmxlLmMKaW5kZXggMTU5MWEyMC4uM2YwMzE4NCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5bXRhYmxlLmMKKysrIGIvUHl0aG9uL3N5bXRhYmxlLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogfTsKIAogc3RhdGljIGludCBzeW10YWJsZV9hbmFseXplKHN0cnVjdCBzeW10YWJsZSAqc3QpOwotc3RhdGljIGludCBzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubyk7CitzdGF0aWMgaW50IHN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY29uc3QgY2hhciAqbXNnLCBpbnQgbGluZW5vKTsKIHN0YXRpYyBpbnQgc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfYmxvY2tfdHkgYmxvY2ssIHZvaWQgKmFzdCwgaW50IGxpbmVubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQpOwpAQCAtOTA4LDcgKzkwOCw3IEBACiAKIAogc3RhdGljIGludAotc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjaGFyICptc2csIGludCBsaW5lbm8pCitzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNvbnN0IGNoYXIgKm1zZywgaW50IGxpbmVubykKIHsKICAgICBQeU9iamVjdCAqbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKG1zZyk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKQEAgLTE0NDcsNiArMTQ0NywxNSBAQAogICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuQ2FsbC5hcmdzKTsKICAgICAgICAgVklTSVRfU0VRX1dJVEhfTlVMTChzdCwga2V5d29yZCwgZS0+di5DYWxsLmtleXdvcmRzKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisgICAgICAgIGlmIChlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuSm9pbmVkU3RyLnZhbHVlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKICAgICBjYXNlIE51bV9raW5kOgogICAgIGNhc2UgU3RyX2tpbmQ6CiAgICAgY2FzZSBCeXRlc19raW5kOgpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDhkN2UwNWEuLmE1NGYyNjYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJweXRocmVhZC5oIgogCiAjaW5jbHVkZSAib3NkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CiAKICNpZmRlZiBNU19XSU5ET1dTCiAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KQEAgLTMzLDcgKzM0LDYgQEAKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICi0jaW5jbHVkZSA8bG9jYWxlLmg+CiAjaW5jbHVkZSA8bGFuZ2luZm8uaD4KICNlbmRpZgogCkBAIC0zNDYsOCArMzQ2LDEwIEBACiBzdGF0aWMgaW50CiB0cmFjZV9pbml0KHZvaWQpCiB7Ci0gICAgc3RhdGljIGNoYXIgKndoYXRuYW1lc1s3XSA9IHsiY2FsbCIsICJleGNlcHRpb24iLCAibGluZSIsICJyZXR1cm4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNfY2FsbCIsICJjX2V4Y2VwdGlvbiIsICJjX3JldHVybiJ9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2hhdG5hbWVzWzddID0geworICAgICAgICAiY2FsbCIsICJleGNlcHRpb24iLCAibGluZSIsICJyZXR1cm4iLAorICAgICAgICAiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIgorICAgIH07CiAgICAgUHlPYmplY3QgKm5hbWU7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkgewpAQCAtMzY2LDM0ICszNjgsMjUgQEAKIGNhbGxfdHJhbXBvbGluZShQeU9iamVjdCogY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQogewotICAgIFB5T2JqZWN0ICphcmdzOwotICAgIFB5T2JqZWN0ICp3aGF0c3RyOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnN0YWNrWzNdOwogCi0gICAgYXJncyA9IFB5VHVwbGVfTmV3KDMpOwotICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgaWYgKFB5RnJhbWVfRmFzdFRvTG9jYWxzV2l0aEVycm9yKGZyYW1lKSA8IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5RnJhbWVfRmFzdFRvTG9jYWxzV2l0aEVycm9yKGZyYW1lKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgIFB5X0lOQ1JFRihmcmFtZSk7Ci0gICAgd2hhdHN0ciA9IHdoYXRzdHJpbmdzW3doYXRdOwotICAgIFB5X0lOQ1JFRih3aGF0c3RyKTsKLSAgICBpZiAoYXJnID09IE5VTEwpCi0gICAgICAgIGFyZyA9IFB5X05vbmU7Ci0gICAgUHlfSU5DUkVGKGFyZyk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCAoUHlPYmplY3QgKilmcmFtZSk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB3aGF0c3RyKTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDIsIGFyZyk7CisgICAgc3RhY2tbMF0gPSAoUHlPYmplY3QgKilmcmFtZTsKKyAgICBzdGFja1sxXSA9IHdoYXRzdHJpbmdzW3doYXRdOworICAgIHN0YWNrWzJdID0gKGFyZyAhPSBOVUxMKSA/IGFyZyA6IFB5X05vbmU7CiAKICAgICAvKiBjYWxsIHRoZSBQeXRob24tbGV2ZWwgZnVuY3Rpb24gKi8KLSAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0gICAgUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZnJhbWUsIDEpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgUHlUcmFjZUJhY2tfSGVyZShmcmFtZSk7CisgICAgcmVzdWx0ID0gX1B5T2JqZWN0X0Zhc3RDYWxsKGNhbGxiYWNrLCBzdGFjaywgMyk7CiAKLSAgICAvKiBjbGVhbnVwICovCi0gICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5RnJhbWVfTG9jYWxzVG9GYXN0KGZyYW1lLCAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlUcmFjZUJhY2tfSGVyZShmcmFtZSk7CisgICAgfQorCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNDM0LDEwICs0MjcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gUHlfTm9uZSkgewotICAgICAgICBQeU9iamVjdCAqdGVtcCA9IGZyYW1lLT5mX3RyYWNlOwotICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IE5VTEw7Ci0gICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgIGZyYW1lLT5mX3RyYWNlID0gcmVzdWx0OworICAgICAgICBQeV9YU0VUUkVGKGZyYW1lLT5mX3RyYWNlLCByZXN1bHQpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CkBAIC0xMTUyLDggKzExNDIsMTAgQEAKIHN5c19kZWJ1Z21hbGxvY3N0YXRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBXSVRIX1BZTUFMTE9DCi0gICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKLSAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIGlmIChfUHlNZW1fUHltYWxsb2NFbmFibGVkKCkpIHsKKyAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKKyAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICB9CiAjZW5kaWYKICAgICBfUHlPYmplY3RfRGVidWdUeXBlU3RhdHMoc3RkZXJyKTsKIApAQCAtMTY0MywxNSArMTYzNSwxMSBAQAogLyogc3lzLmltcGxlbWVudGF0aW9uIHZhbHVlcyAqLwogI2RlZmluZSBOQU1FICJjcHl0aG9uIgogY29uc3QgY2hhciAqX1B5U3lzX0ltcGxOYW1lID0gTkFNRTsKLSNkZWZpbmUgUVVPVEUoYXJnKSAjYXJnCi0jZGVmaW5lIFNUUklGWShuYW1lKSBRVU9URShuYW1lKQotI2RlZmluZSBNQUpPUiBTVFJJRlkoUFlfTUFKT1JfVkVSU0lPTikKLSNkZWZpbmUgTUlOT1IgU1RSSUZZKFBZX01JTk9SX1ZFUlNJT04pCisjZGVmaW5lIE1BSk9SIFB5X1NUUklOR0lGWShQWV9NQUpPUl9WRVJTSU9OKQorI2RlZmluZSBNSU5PUiBQeV9TVFJJTkdJRlkoUFlfTUlOT1JfVkVSU0lPTikKICNkZWZpbmUgVEFHIE5BTUUgIi0iIE1BSk9SIE1JTk9SCiBjb25zdCBjaGFyICpfUHlTeXNfSW1wbENhY2hlVGFnID0gVEFHOwogI3VuZGVmIE5BTUUKLSN1bmRlZiBRVU9URQotI3VuZGVmIFNUUklGWQogI3VuZGVmIE1BSk9SCiAjdW5kZWYgTUlOT1IKICN1bmRlZiBUQUcKQEAgLTE2OTYsNiArMTY4NCwxNiBAQAogICAgIGlmIChyZXMgPCAwKQogICAgICAgICBnb3RvIGVycm9yOwogCisjaWZkZWYgTVVMVElBUkNICisgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhNVUxUSUFSQ0gpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHJlcyA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGltcGxfaW5mbywgIl9tdWx0aWFyY2giLCB2YWx1ZSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyNlbmRpZgorCiAgICAgLyogZGljdCByZWFkeSAqLwogCiAgICAgbnMgPSBfUHlOYW1lc3BhY2VfTmV3KGltcGxfaW5mbyk7CkBAIC0yMDAyLDcgKzIwMDAsNyBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX1JFQUxQQVRIKQogICAgIHdjaGFyX3QgZnVsbHBhdGhbTUFYUEFUSExFTl07Ci0jZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTkNFKQorI2VsaWYgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIHdjaGFyX3QgZnVsbHBhdGhbTUFYX1BBVEhdOwogI2VuZGlmCiAKQEAgLTIwNDEsMTAgKzIwMzksOCBAQAogI2lmIFNFUCA9PSAnXFwnIC8qIFNwZWNpYWwgY2FzZSBmb3IgTVMgZmlsZW5hbWUgc3ludGF4ICovCiAgICAgaWYgKF9IQVZFX1NDUklQVF9BUkdVTUVOVChhcmdjLCBhcmd2KSkgewogICAgICAgICB3Y2hhcl90ICpxOwotI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoTVNfV0lOQ0UpCi0gICAgICAgIC8qIFRoaXMgY29kZSBoZXJlIHJlcGxhY2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIGFyZ3Ygd2l0aCB0aGUgZnVsbAotICAgICAgICBwYXRoIHRoYXQgaXQgcmVwcmVzZW50cy4gVW5kZXIgQ0UsIHRoZXJlIGFyZSBubyByZWxhdGl2ZSBwYXRocyBzbwotICAgICAgICB0aGUgYXJndW1lbnQgbXVzdCBiZSB0aGUgZnVsbCBwYXRoIGFueXdheS4gKi8KKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgICAgIC8qIFJlcGxhY2UgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYXJndiB3aXRoIHRoZSBmdWxsIHBhdGguICovCiAgICAgICAgIHdjaGFyX3QgKnB0ZW1wOwogICAgICAgICBpZiAoR2V0RnVsbFBhdGhOYW1lVyhhcmd2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0FSUkFZX0xFTkdUSChmdWxscGF0aCksCkBAIC0yMTE0LDcgKzIxMTAsNyBAQAogc3RhdGljIGludAogc3lzX3B5ZmlsZV93cml0ZV91bmljb2RlKFB5T2JqZWN0ICp1bmljb2RlLCBQeU9iamVjdCAqZmlsZSkKIHsKLSAgICBQeU9iamVjdCAqd3JpdGVyID0gTlVMTCwgKmFyZ3MgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqd3JpdGVyID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CiAgICAgaW50IGVycjsKIAogICAgIGlmIChmaWxlID09IE5VTEwpCkBAIC0yMTI0LDExICsyMTIwLDcgQEAKICAgICBpZiAod3JpdGVyID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKLSAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHVuaWNvZGUpOwotICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh3cml0ZXIsIGFyZ3MpOworICAgIHJlc3VsdCA9IF9QeU9iamVjdF9DYWxsQXJnMSh3cml0ZXIsIHVuaWNvZGUpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0gZWxzZSB7CkBAIC0yMTQwLDcgKzIxMzIsNiBAQAogICAgIGVyciA9IC0xOwogZmluYWxseToKICAgICBQeV9YREVDUkVGKHdyaXRlcik7Ci0gICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfbnQuaCBiL1B5dGhvbi90aHJlYWRfbnQuaAppbmRleCBiMjliMWI2Li43NGE2ZWU4IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX250LmgKKysrIGIvUHl0aG9uL3RocmVhZF9udC5oCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICAgIC8qIHdhaXQgYXQgbGVhc3QgdW50aWwgdGhlIHRhcmdldCAqLwogICAgICAgICBEV09SRCBub3csIHRhcmdldCA9IEdldFRpY2tDb3VudCgpICsgbWlsbGlzZWNvbmRzOwogICAgICAgICB3aGlsZSAobXV0ZXgtPmxvY2tlZCkgewotICAgICAgICAgICAgaWYgKFB5Q09ORF9USU1FRFdBSVQoJm11dGV4LT5jdiwgJm11dGV4LT5jcywgKFBZX0xPTkdfTE9ORyltaWxsaXNlY29uZHMqMTAwMCkgPCAwKSB7CisgICAgICAgICAgICBpZiAoUHlDT05EX1RJTUVEV0FJVCgmbXV0ZXgtPmN2LCAmbXV0ZXgtPmNzLCAobG9uZyBsb25nKW1pbGxpc2Vjb25kcyoxMDAwKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBXQUlUX0ZBSUxFRDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE2MSwxMSArMTYxLDcgQEAKIAogLyogdGh1bmtlciB0byBjYWxsIGFkYXB0IGJldHdlZW4gdGhlIGZ1bmN0aW9uIHR5cGUgdXNlZCBieSB0aGUgc3lzdGVtJ3MKIHRocmVhZCBzdGFydCBmdW5jdGlvbiBhbmQgdGhlIGludGVybmFsbHkgdXNlZCBvbmUuICovCi0jaWYgZGVmaW5lZChNU19XSU5DRSkKLXN0YXRpYyBEV09SRCBXSU5BUEkKLSNlbHNlCiBzdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsCi0jZW5kaWYKIGJvb3RzdHJhcCh2b2lkICpjYWxsKQogewogICAgIGNhbGxvYmogKm9iaiA9IChjYWxsb2JqKiljYWxsOwpAQCAtMTkzLDMyICsxODksMTggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIG9iai0+ZnVuYyA9IGZ1bmM7CiAgICAgb2JqLT5hcmcgPSBhcmc7Ci0jaWYgZGVmaW5lZChNU19XSU5DRSkKLSAgICBoVGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsIFB5X3NzaXplX3QsIFNJWkVfVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXAsIG9iaiwgMCwgJnRocmVhZElEKTsKLSNlbHNlCiAgICAgaFRocmVhZCA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoMCwKICAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LCB1bnNpZ25lZCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcCwgb2JqLAogICAgICAgICAgICAgICAgICAgICAgIDAsICZ0aHJlYWRJRCk7Ci0jZW5kaWYKICAgICBpZiAoaFRocmVhZCA9PSAwKSB7Ci0jaWYgZGVmaW5lZChNU19XSU5DRSkKLSAgICAgICAgLyogU2F2ZSBlcnJvciBpbiB2YXJpYWJsZSwgdG8gcHJldmVudCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50Ci0gICAgICAgICAgIGZyb20gY2xvYmJlcmluZyBpdC4gKi8KLSAgICAgICAgdW5zaWduZWQgZSA9IEdldExhc3RFcnJvcigpOwotICAgICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGZhaWxlZCwgd2luMzIgZXJyb3IgY29kZSAldVxuIiwKLSAgICAgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBlKSk7Ci0jZWxzZQogICAgICAgICAvKiBJJ3ZlIHNlZW4gZXJybm8gPT0gRUFHQUlOIGhlcmUsIHdoaWNoIG1lYW5zICJ0aGVyZSBhcmUKICAgICAgICAgICogdG9vIG1hbnkgdGhyZWFkcyIuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgZSA9IGVycm5vOwogICAgICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGZhaWxlZCwgZXJybm8gJWRcbiIsCiAgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgZSkpOwotI2VuZGlmCiAgICAgICAgIHRocmVhZElEID0gKHVuc2lnbmVkKS0xOwogICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvYmopOwogICAgIH0KQEAgLTI0OSwxMSArMjMxLDcgQEAKICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwogICAgIGlmICghaW5pdGlhbGl6ZWQpCiAgICAgICAgIGV4aXQoMCk7Ci0jaWYgZGVmaW5lZChNU19XSU5DRSkKLSAgICBFeGl0VGhyZWFkKDApOwotI2Vsc2UKICAgICBfZW5kdGhyZWFkZXgoMCk7Ci0jZW5kaWYKIH0KIAogLyoKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCA5NDFkMWNiLi5lOGFhYzFiIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0zMTQsNyArMzE0LDcgQEAKICAgICBpZiAoZm9iID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotICAgICAgICByZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGJpbmFyeSwgJlB5SWRfY2xvc2UsICIiKTsKKyAgICAgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChiaW5hcnksICZQeUlkX2Nsb3NlLCBOVUxMKTsKICAgICAgICAgUHlfREVDUkVGKGJpbmFyeSk7CiAgICAgICAgIGlmIChyZXMpCiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKQEAgLTMzNCw3ICszMzQsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb2IsICZQeUlkX2Nsb3NlLCAiIik7CisgICAgcmVzID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb2IsICZQeUlkX2Nsb3NlLCBOVUxMKTsKICAgICBpZiAocmVzKQogICAgICAgICBQeV9ERUNSRUYocmVzKTsKICAgICBlbHNlCkBAIC00MTIsNiArNDEyLDExIEBACiB7CiAgICAgaW50IGVyciA9IDA7CiAgICAgbG9uZyBkZXB0aCA9IDA7CisgICAgUHlPYmplY3QgKmxhc3RfZmlsZSA9IE5VTEw7CisgICAgaW50IGxhc3RfbGluZSA9IC0xOworICAgIFB5T2JqZWN0ICpsYXN0X25hbWUgPSBOVUxMOworICAgIGxvbmcgY250ID0gMDsKKyAgICBQeU9iamVjdCAqbGluZTsKICAgICBQeVRyYWNlYmFja09iamVjdCAqdGIxID0gdGI7CiAgICAgd2hpbGUgKHRiMSAhPSBOVUxMKSB7CiAgICAgICAgIGRlcHRoKys7CkBAIC00MTksMTYgKzQyNCw0MSBAQAogICAgIH0KICAgICB3aGlsZSAodGIgIT0gTlVMTCAmJiBlcnIgPT0gMCkgewogICAgICAgICBpZiAoZGVwdGggPD0gbGltaXQpIHsKLSAgICAgICAgICAgIGVyciA9IHRiX2Rpc3BsYXlsaW5lKGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUpOworICAgICAgICAgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX2ZpbGVuYW1lID09IGxhc3RfZmlsZSAmJgorICAgICAgICAgICAgICAgIGxhc3RfbGluZSAhPSAtMSAmJiB0Yi0+dGJfbGluZW5vID09IGxhc3RfbGluZSAmJgorICAgICAgICAgICAgICAgIGxhc3RfbmFtZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX25hbWUgPT0gbGFzdF9uYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbnQgPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCAlZCBtb3JlIHRpbWVzXVxuIiwgY250LTMpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGxpbmUsIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdF9maWxlID0gdGItPnRiX2ZyYW1lLT5mX2NvZGUtPmNvX2ZpbGVuYW1lOworICAgICAgICAgICAgICAgICAgICBsYXN0X2xpbmUgPSB0Yi0+dGJfbGluZW5vOworICAgICAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSB0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgY250ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY250IDwgMykKKyAgICAgICAgICAgICAgICBlcnIgPSB0Yl9kaXNwbGF5bGluZShmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dGJfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19uYW1lKTsKICAgICAgICAgfQogICAgICAgICBkZXB0aC0tOwogICAgICAgICB0YiA9IHRiLT50Yl9uZXh0OwogICAgICAgICBpZiAoZXJyID09IDApCiAgICAgICAgICAgICBlcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKICAgICB9CisgICAgaWYgKGNudCA+IDMpIHsKKyAgICAgICAgbGluZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KAorICAgICAgICAiICBbUHJldmlvdXMgbGluZSByZXBlYXRlZCAlZCBtb3JlIHRpbWVzXVxuIiwgY250LTMpOworICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QobGluZSwgZiwgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgIH0KICAgICByZXR1cm4gZXJyOwogfQogCkBAIC00NzksNDAgKzUwOSwyNiBAQAogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLwogCi1zdGF0aWMgdm9pZAotcmV2ZXJzZV9zdHJpbmcoY2hhciAqdGV4dCwgY29uc3Qgc2l6ZV90IGxlbikKK3ZvaWQKK19QeV9EdW1wRGVjaW1hbChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCiB7Ci0gICAgY2hhciB0bXA7Ci0gICAgc2l6ZV90IGksIGo7Ci0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yIChpPTAsIGo9bGVuLTE7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICB0bXAgPSB0ZXh0W2ldOwotICAgICAgICB0ZXh0W2ldID0gdGV4dFtqXTsKLSAgICAgICAgdGV4dFtqXSA9IHRtcDsKLSAgICB9Ci19CisgICAgLyogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCBmb3Igb3V0cHV0IG9mICVsbGQgb3IgJXAuCisgICAgICAgV2UgbmVlZCBhdCBtb3N0IGNlaWwobG9nMTAoMjU2KSpTSVpFT0ZfTE9OR19MT05HKSBkaWdpdHMsCisgICAgICAgcGx1cyAxIGZvciB0aGUgbnVsbCBieXRlLiAgNTMvMjIgaXMgYW4gdXBwZXIgYm91bmQgZm9yIGxvZzEwKDI1NikuICovCisgICAgY2hhciBidWZmZXJbMSArIChzaXplb2YodW5zaWduZWQgbG9uZykqNTMtMSkgLyAyMiArIDFdOworICAgIGNoYXIgKnB0ciwgKmVuZDsKIAotLyogRm9ybWF0IGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDk5OTk5OV0gdG8gZGVjaW1hbCwKLSAgIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBmaWxlIGZkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWNpbWFsKGludCBmZCwgaW50IHZhbHVlKQotewotICAgIGNoYXIgYnVmZmVyWzddOwotICAgIGludCBsZW47Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCA5OTk5OTkgPCB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGxlbiA9IDA7CisgICAgZW5kID0gJmJ1ZmZlcltQeV9BUlJBWV9MRU5HVEgoYnVmZmVyKSAtIDFdOworICAgIHB0ciA9IGVuZDsKKyAgICAqcHRyID0gJ1wwJzsKICAgICBkbyB7Ci0gICAgICAgIGJ1ZmZlcltsZW5dID0gJzAnICsgKHZhbHVlICUgMTApOworICAgICAgICAtLXB0cjsKKyAgICAgICAgYXNzZXJ0KHB0ciA+PSBidWZmZXIpOworICAgICAgICAqcHRyID0gJzAnICsgKHZhbHVlICUgMTApOwogICAgICAgICB2YWx1ZSAvPSAxMDsKLSAgICAgICAgbGVuKys7CiAgICAgfSB3aGlsZSAodmFsdWUpOwotICAgIHJldmVyc2Vfc3RyaW5nKGJ1ZmZlciwgbGVuKTsKLSAgICBfUHlfd3JpdGVfbm9yYWlzZShmZCwgYnVmZmVyLCBsZW4pOworCisgICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIHB0ciwgZW5kIC0gcHRyKTsKIH0KIAogLyogRm9ybWF0IGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDB4ZmZmZmZmZmZdIHRvIGhleGFkZWNpbWFsIG9mICd3aWR0aCcgZGlnaXRzLApAQCAtNTIwLDI3ICs1MzYsMzEgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KIAotc3RhdGljIHZvaWQKLWR1bXBfaGV4YWRlY2ltYWwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgd2lkdGgpCit2b2lkCitfUHlfRHVtcEhleGFkZWNpbWFsKGludCBmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSwgUHlfc3NpemVfdCB3aWR0aCkKIHsKLSAgICBpbnQgbGVuOwotICAgIGNoYXIgYnVmZmVyW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDIgKyAxXTsKLSAgICBsZW4gPSAwOworICAgIGNoYXIgYnVmZmVyW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDIgKyAxXSwgKnB0ciwgKmVuZDsKKyAgICBjb25zdCBQeV9zc2l6ZV90IHNpemUgPSBQeV9BUlJBWV9MRU5HVEgoYnVmZmVyKSAtIDE7CisKKyAgICBpZiAod2lkdGggPiBzaXplKQorICAgICAgICB3aWR0aCA9IHNpemU7CisgICAgLyogaXQncyBvayBpZiB3aWR0aCBpcyBuZWdhdGl2ZSAqLworCisgICAgZW5kID0gJmJ1ZmZlcltzaXplXTsKKyAgICBwdHIgPSBlbmQ7CisgICAgKnB0ciA9ICdcMCc7CiAgICAgZG8gewotICAgICAgICBidWZmZXJbbGVuXSA9IFB5X2hleGRpZ2l0c1t2YWx1ZSAmIDE1XTsKKyAgICAgICAgLS1wdHI7CisgICAgICAgIGFzc2VydChwdHIgPj0gYnVmZmVyKTsKKyAgICAgICAgKnB0ciA9IFB5X2hleGRpZ2l0c1t2YWx1ZSAmIDE1XTsKICAgICAgICAgdmFsdWUgPj49IDQ7Ci0gICAgICAgIGxlbisrOwotICAgIH0gd2hpbGUgKGxlbiA8IHdpZHRoIHx8IHZhbHVlKTsKLSAgICByZXZlcnNlX3N0cmluZyhidWZmZXIsIGxlbik7Ci0gICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIGJ1ZmZlciwgbGVuKTsKKyAgICB9IHdoaWxlICgoZW5kIC0gcHRyKSA8IHdpZHRoIHx8IHZhbHVlKTsKKworICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBwdHIsIGVuZCAtIHB0cik7CiB9CiAKLS8qIFdyaXRlIGFuIHVuaWNvZGUgb2JqZWN0IGludG8gdGhlIGZpbGUgZmQgdXNpbmcgYXNjaWkrYmFja3NsYXNocmVwbGFjZS4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfYXNjaWkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCkKK3ZvaWQKK19QeV9EdW1wQVNDSUkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCkKIHsKICAgICBQeUFTQ0lJT2JqZWN0ICphc2NpaSA9IChQeUFTQ0lJT2JqZWN0ICopdGV4dDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7CkBAIC01NTAsMzIgKzU3MCwzNiBAQAogICAgIHdjaGFyX3QgKndzdHIgPSBOVUxMOwogICAgIFB5X1VDUzQgY2g7CiAKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh0ZXh0KSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgc2l6ZSA9IGFzY2lpLT5sZW5ndGg7CiAgICAga2luZCA9IGFzY2lpLT5zdGF0ZS5raW5kOwotICAgIGlmIChhc2NpaS0+c3RhdGUuY29tcGFjdCkgeworICAgIGlmIChraW5kID09IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSB7CisgICAgICAgIHdzdHIgPSAoKFB5QVNDSUlPYmplY3QgKil0ZXh0KS0+d3N0cjsKKyAgICAgICAgaWYgKHdzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc2l6ZSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCAqKXRleHQpLT53c3RyX2xlbmd0aDsKKyAgICB9CisgICAgZWxzZSBpZiAoYXNjaWktPnN0YXRlLmNvbXBhY3QpIHsKICAgICAgICAgaWYgKGFzY2lpLT5zdGF0ZS5hc2NpaSkKICAgICAgICAgICAgIGRhdGEgPSAoKFB5QVNDSUlPYmplY3QqKXRleHQpICsgMTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZGF0YSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCopdGV4dCkgKyAxOwogICAgIH0KLSAgICBlbHNlIGlmIChraW5kICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSB7CisgICAgZWxzZSB7CiAgICAgICAgIGRhdGEgPSAoKFB5VW5pY29kZU9iamVjdCAqKXRleHQpLT5kYXRhLmFueTsKICAgICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHdzdHIgPSAoKFB5QVNDSUlPYmplY3QgKil0ZXh0KS0+d3N0cjsKLSAgICAgICAgaWYgKHdzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc2l6ZSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCAqKXRleHQpLT53c3RyX2xlbmd0aDsKLSAgICB9CiAKICAgICBpZiAoTUFYX1NUUklOR19MRU5HVEggPCBzaXplKSB7CiAgICAgICAgIHNpemUgPSBNQVhfU1RSSU5HX0xFTkdUSDsKICAgICAgICAgdHJ1bmNhdGVkID0gMTsKICAgICB9Ci0gICAgZWxzZQorICAgIGVsc2UgewogICAgICAgICB0cnVuY2F0ZWQgPSAwOworICAgIH0KIAogICAgIGZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChraW5kICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKQpAQCAtNTg5LDE5ICs2MTMsMjAgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChjaCA8PSAweGZmKSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFx4Iik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgMik7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgMik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPD0gMHhmZmZmKSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFx1Iik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgNCk7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgNCk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFxVIik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgOCk7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgOCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHRydW5jYXRlZCkKKyAgICBpZiAodHJ1bmNhdGVkKSB7CiAgICAgICAgIFBVVFMoZmQsICIuLi4iKTsKKyAgICB9CiB9CiAKIC8qIFdyaXRlIGEgZnJhbWUgaW50byB0aGUgZmlsZSBmZDogIkZpbGUgInh4eCIsIGxpbmUgeHh4IGluIHh4eCIuCkBAIC02MjAsNyArNjQ1LDcgQEAKICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrKGNvZGUtPmNvX2ZpbGVuYW1lKSkKICAgICB7CiAgICAgICAgIFBVVFMoZmQsICJcIiIpOwotICAgICAgICBkdW1wX2FzY2lpKGZkLCBjb2RlLT5jb19maWxlbmFtZSk7CisgICAgICAgIF9QeV9EdW1wQVNDSUkoZmQsIGNvZGUtPmNvX2ZpbGVuYW1lKTsKICAgICAgICAgUFVUUyhmZCwgIlwiIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUFVUUyhmZCwgIj8/PyIpOwpAQCAtNjI5LDE0ICs2NTQsMjEgQEAKICAgICAvKiBQeUZyYW1lX0dldExpbmVOdW1iZXIoKSB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMi43LjAgYW5kIDMuMi4wICovCiAgICAgbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShjb2RlLCBmcmFtZS0+Zl9sYXN0aSk7CiAgICAgUFVUUyhmZCwgIiwgbGluZSAiKTsKLSAgICBkdW1wX2RlY2ltYWwoZmQsIGxpbmVubyk7CisgICAgaWYgKGxpbmVubyA+PSAwKSB7CisgICAgICAgIF9QeV9EdW1wRGVjaW1hbChmZCwgKHVuc2lnbmVkIGxvbmcpbGluZW5vKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKKyAgICB9CiAgICAgUFVUUyhmZCwgIiBpbiAiKTsKIAogICAgIGlmIChjb2RlICE9IE5VTEwgJiYgY29kZS0+Y29fbmFtZSAhPSBOVUxMCi0gICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19uYW1lKSkKLSAgICAgICAgZHVtcF9hc2NpaShmZCwgY29kZS0+Y29fbmFtZSk7Ci0gICAgZWxzZQorICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19uYW1lKSkgeworICAgICAgICBfUHlfRHVtcEFTQ0lJKGZkLCBjb2RlLT5jb19uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKKyAgICB9CiAKICAgICBQVVRTKGZkLCAiXG4iKTsKIH0KQEAgLTY5Miw3ICs3MjQsOSBAQAogICAgICAgICBQVVRTKGZkLCAiQ3VycmVudCB0aHJlYWQgMHgiKTsKICAgICBlbHNlCiAgICAgICAgIFBVVFMoZmQsICJUaHJlYWQgMHgiKTsKLSAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCAodW5zaWduZWQgbG9uZyl0c3RhdGUtPnRocmVhZF9pZCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjIpOworICAgIF9QeV9EdW1wSGV4YWRlY2ltYWwoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0c3RhdGUtPnRocmVhZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDIpOwogICAgIFBVVFMoZmQsICIgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuIik7CiB9CiAKQEAgLTcwNCwxMSArNzM4LDU2IEBACiAgICBoYW5kbGVycyBpZiBzaWduYWxzIHdlcmUgcmVjZWl2ZWQuICovCiBjb25zdCBjaGFyKgogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGludCBmZCwgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90aHJlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90c3RhdGUpCiB7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogICAgIHVuc2lnbmVkIGludCBudGhyZWFkczsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgLyogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKCkgaXMgY2FsbGVkIGZyb20gc2lnbmFsIGhhbmRsZXJzIGJ5CisgICAgICAgICAgIGZhdWx0aGFuZGxlci4KKworICAgICAgICAgICBTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQsIFNJR0JVUyBhbmQgU0lHSUxMIGFyZSBzeW5jaHJvbm91cyBzaWduYWxzCisgICAgICAgICAgIGFuZCBhcmUgdGh1cyBkZWxpdmVyZWQgdG8gdGhlIHRocmVhZCB0aGF0IGNhdXNlZCB0aGUgZmF1bHQuIEdldCB0aGUKKyAgICAgICAgICAgUHl0aG9uIHRocmVhZCBzdGF0ZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCisKKyAgICAgICAgICAgUHlUaHJlYWRTdGF0ZV9HZXQoKSBkb2Vzbid0IGdpdmUgdGhlIHN0YXRlIG9mIHRoZSB0aHJlYWQgdGhhdCBjYXVzZWQKKyAgICAgICAgICAgdGhlIGZhdWx0IGlmIHRoZSB0aHJlYWQgcmVsZWFzZWQgdGhlIEdJTCwgYW5kIHNvIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgY2Fubm90IGJlIHVzZWQuIFJlYWQgdGhlIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIGluc3RlYWQ6IGNhbGwKKyAgICAgICAgICAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKS4gKi8KKyAgICAgICAgY3VycmVudF90c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOworICAgIH0KKworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50ZXJwID0gX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSgpOworICAgICAgICAgICAgaWYgKGludGVycCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgdG8gZ2V0IFB5dGhvbiB0aHJlYWRzICovCisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmFibGUgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnRlcnAgPSBjdXJyZW50X3RzdGF0ZS0+aW50ZXJwOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAvKiBDYWxsIF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpIGluc3RlYWQgb2YgUHlUaHJlYWRTdGF0ZV9HZXQoKQorICAgICAgICAgICB0byBub3QgZmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgdGhlIHRocmVhZCBzdGF0ZSBpcyBOVUxMLiAqLworICAgICAgICBjdXJyZW50X3RzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOworICAgIH0KKworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogV2UgbmVlZCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgdG8gZ2V0IFB5dGhvbiB0aHJlYWRzICovCisgICAgICAgICAgICByZXR1cm4gInVuYWJsZSB0byBnZXQgdGhlIGludGVycHJldGVyIHN0YXRlIjsKKyAgICAgICAgfQorICAgICAgICBpbnRlcnAgPSBjdXJyZW50X3RzdGF0ZS0+aW50ZXJwOworICAgIH0KKyNlbmRpZgorICAgIGFzc2VydChpbnRlcnAgIT0gTlVMTCk7CisKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgKi8KICAgICB0c3RhdGUgPSBQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZChpbnRlcnApOwogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKQEAgLTcyNiw3ICs4MDUsNyBAQAogICAgICAgICAgICAgUFVUUyhmZCwgIi4uLlxuIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB3cml0ZV90aHJlYWRfaWQoZmQsIHRzdGF0ZSwgdHN0YXRlID09IGN1cnJlbnRfdGhyZWFkKTsKKyAgICAgICAgd3JpdGVfdGhyZWFkX2lkKGZkLCB0c3RhdGUsIHRzdGF0ZSA9PSBjdXJyZW50X3RzdGF0ZSk7CiAgICAgICAgIGR1bXBfdHJhY2ViYWNrKGZkLCB0c3RhdGUsIDApOwogICAgICAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05leHQodHN0YXRlKTsKICAgICAgICAgbnRocmVhZHMrKzsKZGlmZiAtLWdpdCBhL1B5dGhvbi93b3JkY29kZV9oZWxwZXJzLmggYi9QeXRob24vd29yZGNvZGVfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9QeXRob24vd29yZGNvZGVfaGVscGVycy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHNoYXJlZCBieSB0aGUgY29tcGlsZXIgYW5kIHRoZSBwZWVwaG9sZQorICAgb3B0aW1pemVyLgorICovCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBlbmNvZGUgaW5zdHJ1Y3Rpb24gd2l0aCBFWFRFTkRFRF9BUkdzICovCitzdGF0aWMgaW50CitpbnN0cnNpemUodW5zaWduZWQgaW50IG9wYXJnKQoreworICAgIHJldHVybiBvcGFyZyA8PSAweGZmID8gMiA6CisgICAgICAgIG9wYXJnIDw9IDB4ZmZmZiA/IDQgOgorICAgICAgICBvcGFyZyA8PSAweGZmZmZmZiA/IDYgOgorICAgICAgICA4OworfQorCisvKiBTcGl0cyBvdXQgb3Avb3BhcmcgcGFpciB1c2luZyBpbGVuIGJ5dGVzLiBjb2Rlc3RyIHNob3VsZCBiZSBwb2ludGVkIGF0IHRoZQorICAgZGVzaXJlZCBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgRVhURU5ERURfQVJHICovCitzdGF0aWMgdm9pZAord3JpdGVfb3BfYXJnKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIHVuc2lnbmVkIGNoYXIgb3Bjb2RlLAorICAgIHVuc2lnbmVkIGludCBvcGFyZywgaW50IGlsZW4pCit7CisgICAgc3dpdGNoIChpbGVuKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDgpICYgMHhmZjsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgKmNvZGVzdHIrKyA9IG9wY29kZTsKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBvcGFyZyAmIDB4ZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggNDgzMTM0ZC4uYTA3YWMyNCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLVRoaXMgaXMgUHl0aG9uIHZlcnNpb24gMy41LjMgcmVsZWFzZSBjYW5kaWRhdGUgMQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNi4wIGFscGhhIDQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsCiAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTI4LDkgKzI4LDkgQEAKIGVsc2V3aGVyZSBpdCdzIGp1c3QgcHl0aG9uLgogCiBPbiBNYWMgT1MgWCwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBQeXRob24gd2l0aCAtLWVuYWJsZS1mcmFtZXdvcmssIHlvdSBzaG91bGQKLXVzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB0byBkbyB0aGUgaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaW5zdGFsbHMKLXRoZSBQeXRob24gZXhlY3V0YWJsZSBpbiBhIHBsYWNlIHRoYXQgaXMgbm90IG5vcm1hbGx5IG9uIHlvdXIgUEFUSCwgeW91IG1heQotd2FudCB0byBzZXQgdXAgYSBzeW1saW5rIGluIC91c3IvbG9jYWwvYmluLgordXNlICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgdGhpcyBpbnN0YWxscyB0aGUKK1B5dGhvbiBleGVjdXRhYmxlIGluIGEgcGxhY2UgdGhhdCBpcyBub3Qgbm9ybWFsbHkgb24geW91ciBQQVRILCB5b3UgbWF5IHdhbnQgdG8KK3NldCB1cCBhIHN5bWxpbmsgaW4gL3Vzci9sb2NhbC9iaW4uCiAKIE9uIFdpbmRvd3MsIHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQuCiAKQEAgLTY4LDcgKzY4LDcgQEAKIEFmdGVyIHRoaXMgaW5zdHJ1bWVudGVkIHZlcnNpb24gb2YgdGhlIGludGVycHJldGVyIGlzIGJ1aWx0LCB0aGUgTWFrZWZpbGUKIHdpbGwgYXV0b21hdGljYWxseSBydW4gYSB0cmFpbmluZyB3b3JrbG9hZC4gVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8KIHByb2ZpbGUgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbi4gTm90ZSBhbHNvIHRoYXQgYW55IG91dHB1dCwgYm90aCBzdGRvdXQKLWFuZCBzdGRlcnIsIHRoYXQgbWF5IGFwcGVhciBhdCB0aGlzIHN0ZXAgaXMgc3VwcmVzc2VkLgorYW5kIHN0ZGVyciwgdGhhdCBtYXkgYXBwZWFyIGF0IHRoaXMgc3RlcCBpcyBzdXBwcmVzc2VkLgogCiBGaW5hbGx5LCB0aGUgbGFzdCBzdGVwIGlzIHRvIHJlYnVpbGQgdGhlIGludGVycHJldGVyLCB1c2luZyB0aGUgaW5mb3JtYXRpb24KIGNvbGxlY3RlZCBpbiB0aGUgcHJldmlvdXMgb25lLiBUaGUgZW5kIHJlc3VsdCB3aWxsIGJlIGEgUHl0aG9uIGJpbmFyeQpAQCAtNzksOSArNzksOSBAQAogLS0tLS0tLS0tLQogCiBXZSBoYXZlIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgIldoYXQncyBOZXcgaW4KLVB5dGhvbiAzLjUiIGRvY3VtZW50LCBmb3VuZCBhdAorUHl0aG9uIDMuNiIgZG9jdW1lbnQsIGZvdW5kIGF0CiAKLSAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNS93aGF0c25ldy8zLjUuaHRtbAorICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuNi93aGF0c25ldy8zLjYuaHRtbAogCiBGb3IgYSBtb3JlIGRldGFpbGVkIGNoYW5nZSBsb2csIHJlYWQgTWlzYy9ORVdTICh0aG91Z2ggdGhpcyBmaWxlLCB0b28sCiBpcyBpbmNvbXBsZXRlLCBhbmQgYWxzbyBkb2Vzbid0IGxpc3QgYW55dGhpbmcgbWVyZ2VkIGluIGZyb20gdGhlIDIuNwpAQCAtOTQsOSArOTQsOSBAQAogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCi1Eb2N1bWVudGF0aW9uIGZvciBQeXRob24gMy41IGlzIG9ubGluZSwgdXBkYXRlZCBkYWlseToKK0RvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAzLjYgaXMgb25saW5lLCB1cGRhdGVkIGRhaWx5OgogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvCisgICAgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy42LwogCiBJdCBjYW4gYWxzbyBiZSBkb3dubG9hZGVkIGluIG1hbnkgZm9ybWF0cyBmb3IgZmFzdGVyIGFjY2Vzcy4gIFRoZSBkb2N1bWVudGF0aW9uCiBpcyBkb3dubG9hZGFibGUgaW4gSFRNTCwgUERGLCBhbmQgcmVTdHJ1Y3R1cmVkVGV4dCBmb3JtYXRzOyB0aGUgbGF0dGVyIHZlcnNpb24KQEAgLTEwNiw3ICsxMDYsNyBAQAogSWYgeW91IHdvdWxkIGxpa2UgdG8gY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgUHl0aG9uLCByZWxldmFudAogZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQ6CiAKLSAgICBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rldmd1aWRlLworICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnL2Rldmd1aWRlLwogCiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgYnVpbGRpbmcgUHl0aG9uJ3MgZG9jdW1lbnRhdGlvbiwgcmVmZXIgdG8gRG9jL1JFQURNRS50eHQuCiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogQSBzb3VyY2UtdG8tc291cmNlIHRyYW5zbGF0aW9uIHRvb2wsICIydG8zIiwgY2FuIHRha2UgY2FyZSBvZiB0aGUgbXVuZGFuZSB0YXNrCiBvZiBjb252ZXJ0aW5nIGxhcmdlIGFtb3VudHMgb2Ygc291cmNlIGNvZGUuICBJdCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBidXQKIGlzIGNvbXBsZW1lbnRlZCBieSB0aGUgZGVwcmVjYXRpb24gd2FybmluZ3MgaW4gMi42LiAgU2VlCi1odHRwOi8vZG9jcy5weXRob24ub3JnLzMuNS9saWJyYXJ5LzJ0bzMuaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK2h0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuNi9saWJyYXJ5LzJ0bzMuaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAogCiBUZXN0aW5nCkBAIC0xNTEsMTYgKzE1MSwxNiBAQAogCiBPbiBVbml4IGFuZCBNYWMgc3lzdGVtcyBpZiB5b3UgaW50ZW5kIHRvIGluc3RhbGwgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uCiB1c2luZyB0aGUgc2FtZSBpbnN0YWxsYXRpb24gcHJlZml4ICgtLXByZWZpeCBhcmd1bWVudCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCkKLXlvdSBtdXN0IHRha2UgY2FyZSB0aGF0IHlvdXIgcHJpbWFyeSBweXRob24gZXhlY3V0YWJsZSBpcyBub3Qgb3ZlcndyaXR0ZW4gYnkKLXRoZSBpbnN0YWxsYXRpb24gb2YgYSBkaWZmZXJlbnQgdmVyc2lvbi4gIEFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkCi11c2luZyAibWFrZSBhbHRpbnN0YWxsIiBjb250YWluIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBhbmQgY2FuIHRodXMgbGl2ZQotc2lkZS1ieS1zaWRlLiAgIm1ha2UgaW5zdGFsbCIgYWxzbyBjcmVhdGVzICR7cHJlZml4fS9iaW4vcHl0aG9uMyB3aGljaCByZWZlcnMKLXRvICR7cHJlZml4fS9iaW4vcHl0aG9uWC5ZLiAgSWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIHVzaW5nCi10aGUgc2FtZSBwcmVmaXggeW91IG11c3QgZGVjaWRlIHdoaWNoIHZlcnNpb24gKGlmIGFueSkgaXMgeW91ciAicHJpbWFyeSIKLXZlcnNpb24uICBJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyCi12ZXJzaW9ucyB1c2luZyAibWFrZSBhbHRpbnN0YWxsIi4KK3lvdSBtdXN0IHRha2UgY2FyZSB0aGF0IHlvdXIgcHJpbWFyeSBweXRob24gZXhlY3V0YWJsZSBpcyBub3Qgb3ZlcndyaXR0ZW4gYnkgdGhlCitpbnN0YWxsYXRpb24gb2YgYSBkaWZmZXJlbnQgdmVyc2lvbi4gIEFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIiBjb250YWluIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBhbmQgY2FuIHRodXMgbGl2ZQorc2lkZS1ieS1zaWRlLiAgIm1ha2UgaW5zdGFsbCIgYWxzbyBjcmVhdGVzICR7cHJlZml4fS9iaW4vcHl0aG9uMyB3aGljaCByZWZlcnMgdG8KKyR7cHJlZml4fS9iaW4vcHl0aG9uWC5ZLiAgSWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIHVzaW5nIHRoZQorc2FtZSBwcmVmaXggeW91IG11c3QgZGVjaWRlIHdoaWNoIHZlcnNpb24gKGlmIGFueSkgaXMgeW91ciAicHJpbWFyeSIgdmVyc2lvbi4KK0luc3RhbGwgdGhhdCB2ZXJzaW9uIHVzaW5nICJtYWtlIGluc3RhbGwiLiAgSW5zdGFsbCBhbGwgb3RoZXIgdmVyc2lvbnMgdXNpbmcKKyJtYWtlIGFsdGluc3RhbGwiLgogCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNSB3aXRoIDIuNyBiZWluZyB0aGUKK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIFB5dGhvbiAyLjYsIDIuNyBhbmQgMy42IHdpdGggMi43IGJlaW5nIHRoZQogcHJpbWFyeSB2ZXJzaW9uLCB5b3Ugd291bGQgZXhlY3V0ZSAibWFrZSBpbnN0YWxsIiBpbiB5b3VyIDIuNyBidWlsZCBkaXJlY3RvcnkKIGFuZCAibWFrZSBhbHRpbnN0YWxsIiBpbiB0aGUgb3RoZXJzLgogCkBAIC0xNzEsNyArMTcxLDcgQEAKIFdlJ3JlIHNvbGljaXRpbmcgYnVnIHJlcG9ydHMgYWJvdXQgYWxsIGFzcGVjdHMgb2YgdGhlIGxhbmd1YWdlLiAgRml4ZXMgYXJlIGFsc28KIHdlbGNvbWUsIHByZWZlcmFibHkgaW4gdW5pZmllZCBkaWZmIGZvcm1hdC4gIFBsZWFzZSB1c2UgdGhlIGlzc3VlIHRyYWNrZXI6CiAKLSAgICBodHRwOi8vYnVncy5weXRob24ub3JnLworICAgIGh0dHBzOi8vYnVncy5weXRob24ub3JnLwogCiBJZiB5b3UncmUgbm90IHN1cmUgd2hldGhlciB5b3UncmUgZGVhbGluZyB3aXRoIGEgYnVnIG9yIGEgZmVhdHVyZSwgdXNlIHRoZQogbWFpbGluZyBsaXN0OgpAQCAtMTgwLDIzICsxODAsMjMgQEAKIAogVG8gc3Vic2NyaWJlIHRvIHRoZSBsaXN0LCB1c2UgdGhlIG1haWxtYW4gZm9ybToKIAotICAgIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9weXRob24tZGV2LworICAgIGh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vcHl0aG9uLWRldi8KIAogCiBQcm9wb3NhbHMgZm9yIGVuaGFuY2VtZW50CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBoYXZlIGEgcHJvcG9zYWwgdG8gY2hhbmdlIFB5dGhvbiwgeW91IG1heSB3YW50IHRvIHNlbmQgYW4gZW1haWwgdG8gdGhlCi1jb21wLmxhbmcucHl0aG9uIG9yIHB5dGhvbi1pZGVhcyBtYWlsaW5nIGxpc3RzIGZvciBpbml0YWwgZmVlZGJhY2suICBBIFB5dGhvbgorY29tcC5sYW5nLnB5dGhvbiBvciBweXRob24taWRlYXMgbWFpbGluZyBsaXN0cyBmb3IgaW5pdGlhbCBmZWVkYmFjay4gIEEgUHl0aG9uCiBFbmhhbmNlbWVudCBQcm9wb3NhbCAoUEVQKSBtYXkgYmUgc3VibWl0dGVkIGlmIHlvdXIgaWRlYSBnYWlucyBncm91bmQuICBBbGwKIGN1cnJlbnQgUEVQcywgYXMgd2VsbCBhcyBndWlkZWxpbmVzIGZvciBzdWJtaXR0aW5nIGEgbmV3IFBFUCwgYXJlIGxpc3RlZCBhdAotaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzLy4KK2h0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvLgogCiAKIFJlbGVhc2UgU2NoZWR1bGUKIC0tLS0tLS0tLS0tLS0tLS0KIAotU2VlIFBFUCA0NzggZm9yIHJlbGVhc2UgZGV0YWlsczogaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDc4LworU2VlIFBFUCA0OTQgZm9yIHJlbGVhc2UgZGV0YWlsczogaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ5NC8KIAogCiBDb3B5cmlnaHQgYW5kIExpY2Vuc2UgSW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0IGIvVG9vbHMvYnVpbGRib3QvdGVzdC5iYXQKaW5kZXggZmY3ZDE2Ny4uN2JjNGRlNSAxMDA2NDQKLS0tIGEvVG9vbHMvYnVpbGRib3QvdGVzdC5iYXQKKysrIGIvVG9vbHMvYnVpbGRib3QvdGVzdC5iYXQKQEAgLTQsNyArNCw3IEBACiANCiBzZXQgaGVyZT0lfmRwMA0KIHNldCBydF9vcHRzPS1xIC1kDQotc2V0IHJlZ3J0ZXN0X2FyZ3M9DQorc2V0IHJlZ3J0ZXN0X2FyZ3M9LWoxDQogDQogOkNoZWNrT3B0cw0KIGlmICIlMSI9PSIteDY0IiAoc2V0IHJ0X29wdHM9JXJ0X29wdHMlICUxKSAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCkBAIC0xNiw0ICsxNiw0IEBACiBpZiBOT1QgIiUxIj09IiIgKHNldCByZWdydGVzdF9hcmdzPSVyZWdydGVzdF9hcmdzJSAlMSkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzDQogDQogZWNobyBvbg0KLWNhbGwgIiVoZXJlJS4uXC4uXFBDYnVpbGRccnQuYmF0IiAlcnRfb3B0cyUgLXVhbGwgLXJ3VyAtLXRpbWVvdXQ9MzYwMCAlcmVncnRlc3RfYXJncyUNCitjYWxsICIlaGVyZSUuLlwuLlxQQ2J1aWxkXHJ0LmJhdCIgJXJ0X29wdHMlIC11YWxsIC1yd1cgLS1zbG93ZXN0IC0tdGltZW91dD05MDAgJXJlZ3J0ZXN0X2FyZ3MlDQpkaWZmIC0tZ2l0IGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weSBiL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkKaW5kZXggZjYxNWVkOS4uMjgyYjFhMCAxMDA3NTUKLS0tIGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weQorKysgYi9Ub29scy9jbGluaWMvY2xpbmljLnB5CkBAIC02NDQsNyArNjQ0LDcgQEAKICAgICAgICAgZGVmYXVsdF9yZXR1cm5fY29udmVydGVyID0gKG5vdCBmLnJldHVybl9jb252ZXJ0ZXIgb3IKICAgICAgICAgICAgIGYucmV0dXJuX2NvbnZlcnRlci50eXBlID09ICdQeU9iamVjdCAqJykKIAotICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgKHBhcmFtZXRlcnNbLTFdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgcGFyYW1ldGVyc1stMV0uaXNfcG9zaXRpb25hbF9vbmx5KCkKICAgICAgICAgYWxsX2JvcmluZ19vYmplY3RzID0gRmFsc2UgIyB5ZXMsIHRoaXMgd2lsbCBiZSBmYWxzZSBpZiB0aGVyZSBhcmUgMCBwYXJhbWV0ZXJzLCBpdCdzIGZpbmUKICAgICAgICAgZmlyc3Rfb3B0aW9uYWwgPSBsZW4ocGFyYW1ldGVycykKICAgICAgICAgZm9yIGksIHAgaW4gZW51bWVyYXRlKHBhcmFtZXRlcnMpOgpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgIG5ld19vcl9pbml0ID0gZi5raW5kIGluIChNRVRIT0RfTkVXLCBNRVRIT0RfSU5JVCkKIAogICAgICAgICBtZXRoX28gPSAobGVuKHBhcmFtZXRlcnMpID09IDEgYW5kCi0gICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkgYW5kCisgICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0uaXNfcG9zaXRpb25hbF9vbmx5KCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBjb252ZXJ0ZXJzWzBdLmlzX29wdGlvbmFsKCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBuZXdfb3JfaW5pdCkKIApAQCAtNzQzLDcgKzc0MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIG91dHB1dCgpCiAKICAgICAgICAgZGVmIGluc2VydF9rZXl3b3JkcyhzKToKLSAgICAgICAgICAgIHJldHVybiBsaW5lYXJfZm9ybWF0KHMsIGRlY2xhcmF0aW9ucz0ic3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0ge3t7a2V5d29yZHN9LCBOVUxMfX07XG57ZGVjbGFyYXRpb25zfSIpCisgICAgICAgICAgICByZXR1cm4gbGluZWFyX2Zvcm1hdChzLCBkZWNsYXJhdGlvbnM9CisgICAgICAgICAgICAgICAgJ3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX2tleXdvcmRzW10gPSB7e3trZXl3b3Jkc30sIE5VTEx9fTtcbicKKyAgICAgICAgICAgICAgICAnc3RhdGljIF9QeUFyZ19QYXJzZXIgX3BhcnNlciA9IHt7Intmb3JtYXRfdW5pdHN9OntuYW1lfSIsIF9rZXl3b3JkcywgMH19O1xuJworICAgICAgICAgICAgICAgICd7ZGVjbGFyYXRpb25zfScpCiAKICAgICAgICAgaWYgbm90IHBhcmFtZXRlcnM6CiAgICAgICAgICAgICAjIG5vIHBhcmFtZXRlcnMsIE1FVEhfTk9BUkdTCkBAIC03OTcsOCArODAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgIiIiICUgYXJnbmFtZSkKIAogICAgICAgICAgICAgICAgIHBhcnNlcl9kZWZpbml0aW9uID0gcGFyc2VyX2JvZHkocGFyc2VyX3Byb3RvdHlwZSwgbm9ybWFsaXplX3NuaXBwZXQoIiIiCi0gICAgICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UoJXMsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UoJXMsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICIiIiAlIGFyZ25hbWUsIGluZGVudD00KSkKIAogICAgICAgICBlbGlmIGhhc19vcHRpb25fZ3JvdXBzOgpAQCAtODIyLDggKzgyNiw5IEBACiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIntuYW1lfSIsCiAgICAgICAgICAgICAgICAgICAgIHt1bnBhY2tfbWlufSwge3VucGFja19tYXh9LAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgZWxpZiBwb3NpdGlvbmFsOgpAQCAtODM1LDggKzg0MCw5IEBACiAKICAgICAgICAgICAgIHBhcnNlcl9kZWZpbml0aW9uID0gcGFyc2VyX2JvZHkocGFyc2VyX3Byb3RvdHlwZSwgbm9ybWFsaXplX3NuaXBwZXQoIiIiCiAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgZWxzZToKQEAgLTg0NiwxNSArODUyLDEyIEBACiAgICAgICAgICAgICBwYXJzZXJfcHJvdG90eXBlID0gcGFyc2VyX3Byb3RvdHlwZV9rZXl3b3JkCiAKICAgICAgICAgICAgIGJvZHkgPSBub3JtYWxpemVfc25pcHBldCgiIiIKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCBfa2V5d29yZHMsCi0gICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkKKyAgICAgICAgICAgICAgICBpZiAoIV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNGYXN0KGFyZ3MsIGt3YXJncywgJl9wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkKLSAgICAgICAgICAgIHBhcnNlcl9kZWZpbml0aW9uID0gcGFyc2VyX2JvZHkocGFyc2VyX3Byb3RvdHlwZSwgbm9ybWFsaXplX3NuaXBwZXQoIiIiCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwgX2tleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICAiIiIsIGluZGVudD00KSkKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpCisgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIGJvZHkpCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IGluc2VydF9rZXl3b3JkcyhwYXJzZXJfZGVmaW5pdGlvbikKIAogCkBAIC04NzgsMTMgKzg4MSwxNSBAQAogCiAgICAgICAgICAgICBpZiBub3QgcGFyc2VzX2tleXdvcmRzOgogICAgICAgICAgICAgICAgIGZpZWxkcy5pbnNlcnQoMCwgbm9ybWFsaXplX3NuaXBwZXQoIiIiCi0gICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9LZXl3b3Jkcygie25hbWV9Iiwga3dhcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHtzZWxmX3R5cGVfY2hlY2t9IV9QeUFyZ19Ob0tleXdvcmRzKCJ7bmFtZX0iLCBrd2FyZ3MpKSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAiIiIsIGluZGVudD00KSkKICAgICAgICAgICAgICAgICBpZiBub3QgcGFyc2VzX3Bvc2l0aW9uYWw6CiAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5pbnNlcnQoMCwgbm9ybWFsaXplX3NuaXBwZXQoIiIiCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoe3NlbGZfdHlwZV9jaGVja30hX1B5QXJnX05vUG9zaXRpb25hbCgie25hbWV9IiwgYXJncykpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoe3NlbGZfdHlwZV9jaGVja30hX1B5QXJnX05vUG9zaXRpb25hbCgie25hbWV9IiwgYXJncykpIHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICAgICAgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsICpmaWVsZHMpCkBAIC0xMDMyLDggKzEwMzcsOSBAQAogCiAgICAgICAgICAgICBzID0gIiIiCiAgICAgY2FzZSB7Y291bnR9OgotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIHtwYXJzZV9hcmd1bWVudHN9KSkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ7Zm9ybWF0X3VuaXRzfTp7bmFtZX0iLCB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH19CiAgICAgICAgIHtncm91cF9ib29sZWFuc30KICAgICAgICAgYnJlYWs7CiAiIiJbMTpdCkBAIC0xMDY3LDcgKzEwNzMsNyBAQAogCiAgICAgICAgIGxhc3RfZ3JvdXAgPSAwCiAgICAgICAgIGZpcnN0X29wdGlvbmFsID0gbGVuKHNlbGZsZXNzKQotICAgICAgICBwb3NpdGlvbmFsID0gc2VsZmxlc3MgYW5kIHNlbGZsZXNzWy0xXS5raW5kID09IGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWQorICAgICAgICBwb3NpdGlvbmFsID0gc2VsZmxlc3MgYW5kIHNlbGZsZXNzWy0xXS5pc19wb3NpdGlvbmFsX29ubHkoKQogICAgICAgICBuZXdfb3JfaW5pdCA9IGYua2luZCBpbiAoTUVUSE9EX05FVywgTUVUSE9EX0lOSVQpCiAgICAgICAgIGRlZmF1bHRfcmV0dXJuX2NvbnZlcnRlciA9IChub3QgZi5yZXR1cm5fY29udmVydGVyIG9yCiAgICAgICAgICAgICBmLnJldHVybl9jb252ZXJ0ZXIudHlwZSA9PSAnUHlPYmplY3QgKicpCkBAIC0yMzU5LDcgKzIzNjUsMTAgQEAKICAgICAgICAgICAgIGRhdGEubW9kaWZpY2F0aW9ucy5hcHBlbmQoJy8qIG1vZGlmaWNhdGlvbnMgZm9yICcgKyBuYW1lICsgJyAqL1xuJyArIG1vZGlmaWNhdGlvbnMucnN0cmlwKCkpCiAKICAgICAgICAgIyBrZXl3b3JkcwotICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZChwYXJhbWV0ZXIubmFtZSkKKyAgICAgICAgaWYgcGFyYW1ldGVyLmlzX3Bvc2l0aW9uYWxfb25seSgpOgorICAgICAgICAgICAgZGF0YS5rZXl3b3Jkcy5hcHBlbmQoJycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZChwYXJhbWV0ZXIubmFtZSkKIAogICAgICAgICAjIGZvcm1hdF91bml0cwogICAgICAgICBpZiBzZWxmLmlzX29wdGlvbmFsKCkgYW5kICd8JyBub3QgaW4gZGF0YS5mb3JtYXRfdW5pdHM6CkBAIC0yNjc2LDcgKzI2ODUsNyBAQAogICAgIGRlZiBjbGVhbnVwKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgogICAgICAgICAgICAgbmFtZSA9IGVuc3VyZV9sZWdhbF9jX2lkZW50aWZpZXIoc2VsZi5uYW1lKQotICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oWyJpZiAoIiwgbmFtZSwgIilcbiAgIFB5TWVtX0ZSRUUoIiwgbmFtZSwgIik7XG4iXSkKKyAgICAgICAgICAgIHJldHVybiAiIi5qb2luKFsiaWYgKCIsIG5hbWUsICIpIHtcbiAgIFB5TWVtX0ZSRUUoIiwgbmFtZSwgIik7XG59XG4iXSkKIAogIwogIyBUaGlzIGlzIHRoZSBmb3VydGggb3IgZmlmdGggcmV3cml0ZSBvZiByZWdpc3RlcmluZyBhbGwgdGhlCkBAIC0yNzg2LDcgKzI3OTUsNyBAQAogCiAgICAgZGVmIGNsZWFudXAoc2VsZik6CiAgICAgICAgIG5hbWUgPSBlbnN1cmVfbGVnYWxfY19pZGVudGlmaWVyKHNlbGYubmFtZSkKLSAgICAgICAgcmV0dXJuICIiLmpvaW4oWyJpZiAoIiwgbmFtZSwgIi5vYmopXG4gICBQeUJ1ZmZlcl9SZWxlYXNlKCYiLCBuYW1lLCAiKTtcbiJdKQorICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiLm9iaikge1xuICAgUHlCdWZmZXJfUmVsZWFzZSgmIiwgbmFtZSwgIik7XG59XG4iXSkKIAogCiBkZWYgY29ycmVjdF9uYW1lX2Zvcl9zZWxmKGYpOgpAQCAtMjk1OSwxMCArMjk2OCwxMCBAQAogICAgICAgICBkYXRhLnJldHVybl92YWx1ZSA9IG5hbWUKIAogICAgIGRlZiBlcnJfb2NjdXJyZWRfaWYoc2VsZiwgZXhwciwgZGF0YSk6Ci0gICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoKHt9KSAmJiBQeUVycl9PY2N1cnJlZCgpKVxuICAgIGdvdG8gZXhpdDtcbicuZm9ybWF0KGV4cHIpKQorICAgICAgICBkYXRhLnJldHVybl9jb252ZXJzaW9uLmFwcGVuZCgnaWYgKCh7fSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkge3tcbiAgICBnb3RvIGV4aXQ7XG59fVxuJy5mb3JtYXQoZXhwcikpCiAKICAgICBkZWYgZXJyX29jY3VycmVkX2lmX251bGxfcG9pbnRlcihzZWxmLCB2YXJpYWJsZSwgZGF0YSk6Ci0gICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoe30gPT0gTlVMTClcbiAgICBnb3RvIGV4aXQ7XG4nLmZvcm1hdCh2YXJpYWJsZSkpCisgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoe30gPT0gTlVMTCkge3tcbiAgICBnb3RvIGV4aXQ7XG59fVxuJy5mb3JtYXQodmFyaWFibGUpKQogCiAgICAgZGVmIHJlbmRlcihzZWxmLCBmdW5jdGlvbiwgZGF0YSk6CiAgICAgICAgICIiIgpAQCAtMjk3Nyw4ICsyOTg2LDkgQEAKICAgICBkZWYgcmVuZGVyKHNlbGYsIGZ1bmN0aW9uLCBkYXRhKToKICAgICAgICAgc2VsZi5kZWNsYXJlKGRhdGEpCiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCcnJwotaWYgKF9yZXR1cm5fdmFsdWUgIT0gUHlfTm9uZSkKK2lmIChfcmV0dXJuX3ZhbHVlICE9IFB5X05vbmUpIHsKICAgICBnb3RvIGV4aXQ7Cit9CiByZXR1cm5fdmFsdWUgPSBQeV9Ob25lOwogUHlfSU5DUkVGKFB5X05vbmUpOwogJycnLnN0cmlwKCkpCkBAIC0zMTgzLDYgKzMxOTMsNyBAQAogICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZV9kc2xfc3RhcnQKICAgICAgICAgc2VsZi5wYXJhbWV0ZXJfaW5kZW50ID0gTm9uZQogICAgICAgICBzZWxmLmtleXdvcmRfb25seSA9IEZhbHNlCisgICAgICAgIHNlbGYucG9zaXRpb25hbF9vbmx5ID0gRmFsc2UKICAgICAgICAgc2VsZi5ncm91cCA9IDAKICAgICAgICAgc2VsZi5wYXJhbWV0ZXJfc3RhdGUgPSBzZWxmLnBzX3N0YXJ0CiAgICAgICAgIHNlbGYuc2Vlbl9wb3NpdGlvbmFsX3dpdGhfZGVmYXVsdCA9IEZhbHNlCkBAIC0zNTYxLDggKzM1NzIsOCBAQAogICAgICMgInBhcmFtZXRlcl9zdGF0ZSIuICAoUHJldmlvdXNseSB0aGUgY29kZSB3YXMgYSBtaWFzbWEgb2YgaWZzIGFuZAogICAgICMgc2VwYXJhdGUgYm9vbGVhbiBzdGF0ZSB2YXJpYWJsZXMuKSAgVGhlIHN0YXRlcyBhcmU6CiAgICAgIwotICAgICMgIFsgWyBhLCBiLCBdIGMsIF0gZCwgZSwgZj0zLCBbIGcsIGgsIFsgaSBdIF0gLyAgIDwtIGxpbmUKLSAgICAjIDAxICAgMiAgICAgICAgICAzICAgICAgIDQgICAgNSAgICAgICAgICAgNiAgIDcgICA8LSBzdGF0ZSB0cmFuc2l0aW9ucworICAgICMgIFsgWyBhLCBiLCBdIGMsIF0gZCwgZSwgZj0zLCBbIGcsIGgsIFsgaSBdIF0gICA8LSBsaW5lCisgICAgIyAwMSAgIDIgICAgICAgICAgMyAgICAgICA0ICAgIDUgICAgICAgICAgIDYgICAgIDwtIHN0YXRlIHRyYW5zaXRpb25zCiAgICAgIwogICAgICMgMDogcHNfc3RhcnQuICBiZWZvcmUgd2UndmUgc2VlbiBhbnl0aGluZy4gIGxlZ2FsIHRyYW5zaXRpb25zIGFyZSB0byAxIG9yIDMuCiAgICAgIyAxOiBwc19sZWZ0X3NxdWFyZV9iZWZvcmUuICBsZWZ0IHNxdWFyZSBicmFja2V0cyBiZWZvcmUgcmVxdWlyZWQgcGFyYW1ldGVycy4KQEAgLTM1NzMsOSArMzU4NCw4IEBACiAgICAgIyAgICBub3cgbXVzdCBoYXZlIGRlZmF1bHQgdmFsdWVzLgogICAgICMgNTogcHNfZ3JvdXBfYWZ0ZXIuICBpbiBhIGdyb3VwLCBhZnRlciByZXF1aXJlZCBwYXJhbWV0ZXJzLgogICAgICMgNjogcHNfcmlnaHRfc3F1YXJlX2FmdGVyLiAgcmlnaHQgc3F1YXJlIGJyYWNrZXRzIGFmdGVyIHJlcXVpcmVkIHBhcmFtZXRlcnMuCi0gICAgIyA3OiBwc19zZWVuX3NsYXNoLiAgc2VlbiBzbGFzaC4KICAgICBwc19zdGFydCwgcHNfbGVmdF9zcXVhcmVfYmVmb3JlLCBwc19ncm91cF9iZWZvcmUsIHBzX3JlcXVpcmVkLCBcCi0gICAgcHNfb3B0aW9uYWwsIHBzX2dyb3VwX2FmdGVyLCBwc19yaWdodF9zcXVhcmVfYWZ0ZXIsIHBzX3NlZW5fc2xhc2ggPSByYW5nZSg4KQorICAgIHBzX29wdGlvbmFsLCBwc19ncm91cF9hZnRlciwgcHNfcmlnaHRfc3F1YXJlX2FmdGVyID0gcmFuZ2UoNykKIAogICAgIGRlZiBzdGF0ZV9wYXJhbWV0ZXJzX3N0YXJ0KHNlbGYsIGxpbmUpOgogICAgICAgICBpZiBzZWxmLmlnbm9yZV9saW5lKGxpbmUpOgpAQCAtMzg1NCw5ICszODY0LDYgQEAKICAgICAgICAgcmV0dXJuIG5hbWUsIEZhbHNlLCBrd2FyZ3MKIAogICAgIGRlZiBwYXJzZV9zcGVjaWFsX3N5bWJvbChzZWxmLCBzeW1ib2wpOgotICAgICAgICBpZiBzZWxmLnBhcmFtZXRlcl9zdGF0ZSA9PSBzZWxmLnBzX3NlZW5fc2xhc2g6Ci0gICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiBzcGVjaWZpZXMgIiArIHN5bWJvbCArICIgYWZ0ZXIgLywgd2hpY2ggaXMgdW5zdXBwb3J0ZWQuIikKLQogICAgICAgICBpZiBzeW1ib2wgPT0gJyonOgogICAgICAgICAgICAgaWYgc2VsZi5rZXl3b3JkX29ubHk6CiAgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgdXNlcyAnKicgbW9yZSB0aGFuIG9uY2UuIikKQEAgLTM4ODMsMTMgKzM4OTAsMTUgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgaGFzIGFuIHVuc3VwcG9ydGVkIGdyb3VwIGNvbmZpZ3VyYXRpb24uIChVbmV4cGVjdGVkIHN0YXRlICIgKyBzdHIoc2VsZi5wYXJhbWV0ZXJfc3RhdGUpICsgIi5jKSIpCiAgICAgICAgIGVsaWYgc3ltYm9sID09ICcvJzoKKyAgICAgICAgICAgIGlmIHNlbGYucG9zaXRpb25hbF9vbmx5OgorICAgICAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIHVzZXMgJy8nIG1vcmUgdGhhbiBvbmNlLiIpCisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uYWxfb25seSA9IFRydWUKICAgICAgICAgICAgICMgcHNfcmVxdWlyZWQgYW5kIHBzX29wdGlvbmFsIGFyZSBhbGxvd2VkIGhlcmUsIHRoYXQgYWxsb3dzIHBvc2l0aW9uYWwtb25seSB3aXRob3V0IG9wdGlvbiBncm91cHMKICAgICAgICAgICAgICMgdG8gd29yayAoYW5kIGhhdmUgZGVmYXVsdCB2YWx1ZXMhKQogICAgICAgICAgICAgaWYgKHNlbGYucGFyYW1ldGVyX3N0YXRlIG5vdCBpbiAoc2VsZi5wc19yZXF1aXJlZCwgc2VsZi5wc19vcHRpb25hbCwgc2VsZi5wc19yaWdodF9zcXVhcmVfYWZ0ZXIsIHNlbGYucHNfZ3JvdXBfYmVmb3JlKSkgb3Igc2VsZi5ncm91cDoKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiBoYXMgYW4gdW5zdXBwb3J0ZWQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKFVuZXhwZWN0ZWQgc3RhdGUgIiArIHN0cihzZWxmLnBhcmFtZXRlcl9zdGF0ZSkgKyAiLmQpIikKICAgICAgICAgICAgIGlmIHNlbGYua2V5d29yZF9vbmx5OgogICAgICAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIG1peGVzIGtleXdvcmQtb25seSBhbmQgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMsIHdoaWNoIGlzIHVuc3VwcG9ydGVkLiIpCi0gICAgICAgICAgICBzZWxmLnBhcmFtZXRlcl9zdGF0ZSA9IHNlbGYucHNfc2Vlbl9zbGFzaAogICAgICAgICAgICAgIyBmaXh1cCBwcmVjZWRpbmcgcGFyYW1ldGVycwogICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5mdW5jdGlvbi5wYXJhbWV0ZXJzLnZhbHVlcygpOgogICAgICAgICAgICAgICAgIGlmIChwLmtpbmQgIT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PUl9LRVlXT1JEIGFuZCBub3QgaXNpbnN0YW5jZShwLmNvbnZlcnRlciwgc2VsZl9jb252ZXJ0ZXIpKToKQEAgLTM5NzcsMjMgKzM5ODYsMjAgQEAKICAgICAgICAgIyBwb3B1bGF0ZSAicmlnaHRfYnJhY2tldF9jb3VudCIgZmllbGQgZm9yIGV2ZXJ5IHBhcmFtZXRlcgogICAgICAgICBhc3NlcnQgcGFyYW1ldGVycywgIldlIHNob3VsZCBhbHdheXMgaGF2ZSBhIHNlbGYgcGFyYW1ldGVyLiAiICsgcmVwcihmKQogICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwYXJhbWV0ZXJzWzBdLmNvbnZlcnRlciwgc2VsZl9jb252ZXJ0ZXIpCisgICAgICAgICMgc2VsZiBpcyBhbHdheXMgcG9zaXRpb25hbC1vbmx5LgorICAgICAgICBhc3NlcnQgcGFyYW1ldGVyc1swXS5pc19wb3NpdGlvbmFsX29ubHkoKQogICAgICAgICBwYXJhbWV0ZXJzWzBdLnJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCi0gICAgICAgIHBhcmFtZXRlcnNfYWZ0ZXJfc2VsZiA9IHBhcmFtZXRlcnNbMTpdCi0gICAgICAgIGlmIHBhcmFtZXRlcnNfYWZ0ZXJfc2VsZjoKLSAgICAgICAgICAgICMgZm9yIG5vdywgdGhlIG9ubHkgd2F5IENsaW5pYyBzdXBwb3J0cyBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycwotICAgICAgICAgICAgIyBpcyBpZiBhbGwgb2YgdGhlbSBhcmUgcG9zaXRpb25hbC1vbmx5Li4uCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIC4uLiBleGNlcHQgZm9yIHNlbGYhICBzZWxmIGlzIGFsd2F5cyBwb3NpdGlvbmFsLW9ubHkuCi0KLSAgICAgICAgICAgIHBvc2l0aW9uYWxfb25seV9wYXJhbWV0ZXJzID0gW3Aua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkgZm9yIHAgaW4gcGFyYW1ldGVyc19hZnRlcl9zZWxmXQotICAgICAgICAgICAgaWYgcGFyYW1ldGVyc19hZnRlcl9zZWxmWzBdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZOgotICAgICAgICAgICAgICAgIGFzc2VydCBhbGwocG9zaXRpb25hbF9vbmx5X3BhcmFtZXRlcnMpCi0gICAgICAgICAgICAgICAgZm9yIHAgaW4gcGFyYW1ldGVyczoKLSAgICAgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gYWJzKHAuZ3JvdXApCisgICAgICAgIHBvc2l0aW9uYWxfb25seSA9IFRydWUKKyAgICAgICAgZm9yIHAgaW4gcGFyYW1ldGVyc1sxOl06CisgICAgICAgICAgICBpZiBub3QgcC5pc19wb3NpdGlvbmFsX29ubHkoKToKKyAgICAgICAgICAgICAgICBwb3NpdGlvbmFsX29ubHkgPSBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgcG9zaXRpb25hbF9vbmx5CisgICAgICAgICAgICBpZiBwb3NpdGlvbmFsX29ubHk6CisgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gYWJzKHAuZ3JvdXApCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgZG9uJ3QgcHV0IGFueSByaWdodCBicmFja2V0cyBhcm91bmQgbm9uLXBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzLCBldmVyLgotICAgICAgICAgICAgICAgIGZvciBwIGluIHBhcmFtZXRlcnNfYWZ0ZXJfc2VsZjoKLSAgICAgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gMAorICAgICAgICAgICAgICAgIHAucmlnaHRfYnJhY2tldF9jb3VudCA9IDAKIAogICAgICAgICByaWdodF9icmFja2V0X2NvdW50ID0gMAogCmRpZmYgLS1naXQgYS9Ub29scy9mcmVlemUvZnJlZXplLnB5IGIvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQppbmRleCA0NGVkZDU3Li5kNjAyZjU4IDEwMDc1NQotLS0gYS9Ub29scy9mcmVlemUvZnJlZXplLnB5CisrKyBiL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKQEAgLTEyNCw5ICsxMjQsNyBAQAogCiAgICAgIyBkZWZhdWx0IHRoZSBleGNsdWRlIGxpc3QgZm9yIGVhY2ggcGxhdGZvcm0KICAgICBpZiB3aW46IGV4Y2x1ZGUgPSBleGNsdWRlICsgWwotICAgICAgICAnZG9zJywgJ2Rvc3BhdGgnLCAnbWFjJywgJ21hY3BhdGgnLCAnbWFjZnMnLCAnTUFDRlMnLCAncG9zaXgnLAotICAgICAgICAnY2UnLAotICAgICAgICBdCisgICAgICAgICdkb3MnLCAnZG9zcGF0aCcsICdtYWMnLCAnbWFjcGF0aCcsICdtYWNmcycsICdNQUNGUycsICdwb3NpeCcsIF0KIAogICAgIGZhaWxfaW1wb3J0ID0gZXhjbHVkZVs6XQogCkBAIC0yMTgsNyArMjE2LDcgQEAKICAgICBpc2hvbWUgPSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocHJlZml4LCAnUHl0aG9uJywgJ2NldmFsLmMnKSkKIAogICAgICMgbG9jYXRpb25zIGRlcml2ZWQgZnJvbSBvcHRpb25zCi0gICAgdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzozXQorICAgIHZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICBmbGFnZ2VkX3ZlcnNpb24gPSB2ZXJzaW9uICsgc3lzLmFiaWZsYWdzCiAgICAgaWYgd2luOgogICAgICAgICBleHRlbnNpb25zX2MgPSAnZnJvemVuX2V4dGVuc2lvbnMuYycKZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5IGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKaW5kZXggZGE0MjQzOC4uOGVmNWZmOCAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9weWdldHRleHQucHkKKysrIGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKQEAgLTE1Niw3ICsxNTYsOCBAQAogIiIiKQogCiBpbXBvcnQgb3MKLWltcG9ydCBpbXAKK2ltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CitpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCBzeXMKIGltcG9ydCBnbG9iCiBpbXBvcnQgdGltZQpAQCAtMjYzLDggKzI2NCw3IEBACiAgICAgIyBnZXQgZXh0ZW5zaW9uIGZvciBweXRob24gc291cmNlIGZpbGVzCiAgICAgaWYgJ19weV9leHQnIG5vdCBpbiBnbG9iYWxzKCk6CiAgICAgICAgIGdsb2JhbCBfcHlfZXh0Ci0gICAgICAgIF9weV9leHQgPSBbdHJpcGxlWzBdIGZvciB0cmlwbGUgaW4gaW1wLmdldF9zdWZmaXhlcygpCi0gICAgICAgICAgICAgICAgICAgaWYgdHJpcGxlWzJdID09IGltcC5QWV9TT1VSQ0VdWzBdCisgICAgICAgIF9weV9leHQgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFU1swXQogCiAgICAgIyBkb24ndCByZWN1cnNlIGludG8gQ1ZTIGRpcmVjdG9yaWVzCiAgICAgaWYgJ0NWUycgaW4gbmFtZXM6CkBAIC0yNzcsNDUgKzI3Nyw2IEBACiAgICAgICAgICkKIAogCi1kZWYgX2dldF9tb2Rwa2dfcGF0aChkb3R0ZWRfbmFtZSwgcGF0aGxpc3Q9Tm9uZSk6Ci0gICAgIiIiR2V0IHRoZSBmaWxlc3lzdGVtIHBhdGggZm9yIGEgbW9kdWxlIG9yIGEgcGFja2FnZS4KLQotICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBhIGZpbGUgZm9yIGEgbW9kdWxlLCBhbmQgdG8gYSBkaXJlY3RvcnkgZm9yCi0gICAgYSBwYWNrYWdlLiBSZXR1cm4gTm9uZSBpZiB0aGUgbmFtZSBpcyBub3QgZm91bmQsIG9yIGlzIGEgYnVpbHRpbiBvcgotICAgIGV4dGVuc2lvbiBtb2R1bGUuCi0gICAgIiIiCi0gICAgIyBzcGxpdCBvZmYgdG9wLW1vc3QgbmFtZQotICAgIHBhcnRzID0gZG90dGVkX25hbWUuc3BsaXQoJy4nLCAxKQotCi0gICAgaWYgbGVuKHBhcnRzKSA+IDE6Ci0gICAgICAgICMgd2UgaGF2ZSBhIGRvdHRlZCBwYXRoLCBpbXBvcnQgdG9wLWxldmVsIHBhY2thZ2UKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKHBhcnRzWzBdLCBwYXRobGlzdCkKLSAgICAgICAgICAgIGlmIGZpbGU6IGZpbGUuY2xvc2UoKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgICMgY2hlY2sgaWYgaXQncyBpbmRlZWQgYSBwYWNrYWdlCi0gICAgICAgIGlmIGRlc2NyaXB0aW9uWzJdID09IGltcC5QS0dfRElSRUNUT1JZOgotICAgICAgICAgICAgIyByZWN1cnNpdmVseSBoYW5kbGUgdGhlIHJlbWFpbmluZyBuYW1lIHBhcnRzCi0gICAgICAgICAgICBwYXRobmFtZSA9IF9nZXRfbW9kcGtnX3BhdGgocGFydHNbMV0sIFtwYXRobmFtZV0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRobmFtZSA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICAjIHBsYWluIG5hbWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKAotICAgICAgICAgICAgICAgIGRvdHRlZF9uYW1lLCBwYXRobGlzdCkKLSAgICAgICAgICAgIGlmIGZpbGU6Ci0gICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSBub3QgaW4gW2ltcC5QWV9TT1VSQ0UsIGltcC5QS0dfRElSRUNUT1JZXToKLSAgICAgICAgICAgICAgICBwYXRobmFtZSA9IE5vbmUKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0KLSAgICByZXR1cm4gcGF0aG5hbWUKLQotCiBkZWYgZ2V0RmlsZXNGb3JOYW1lKG5hbWUpOgogICAgICIiIkdldCBhIGxpc3Qgb2YgbW9kdWxlIGZpbGVzIGZvciBhIGZpbGVuYW1lLCBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUsCiAgICAgb3IgYSBkaXJlY3RvcnkuCkBAIC0zMzAsNyArMjkxLDExIEBACiAgICAgICAgICAgICByZXR1cm4gbGlzdAogCiAgICAgICAgICMgdHJ5IHRvIGZpbmQgbW9kdWxlIG9yIHBhY2thZ2UKLSAgICAgICAgbmFtZSA9IF9nZXRfbW9kcGtnX3BhdGgobmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQorICAgICAgICAgICAgbmFtZSA9IHNwZWMub3JpZ2luCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIG5hbWUgPSBOb25lCiAgICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAgcmV0dXJuIFtdCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLmljbyBiL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiNjI5ZS4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS53eHMgYi9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS53eHMKaW5kZXggMzgzMDdlMC4uYzg5ZTZlZSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUud3hzCisrKyBiL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLnd4cwpAQCAtNCw3ICs0LDcgQEAKICAgPEJ1bmRsZSBOYW1lPSIhKGxvYy5GdWxsUHJvZHVjdE5hbWUpIgogICAgICAgICAgIFVwZ3JhZGVDb2RlPSIkKHZhci5Db3JlVXBncmFkZUNvZGUpIgogICAgICAgICAgIFZlcnNpb249IiQodmFyLlZlcnNpb24pIgotICAgICAgICAgIEljb25Tb3VyY2VGaWxlPSJidW5kbGUuaWNvIgorICAgICAgICAgIEljb25Tb3VyY2VGaWxlPSIuLlwuLlwuLlxQQ1xpY29uc1xzZXR1cC5pY28iCiAgICAgICAgICAgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIgogICAgICAgICAgIEFib3V0VXJsPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIgogICAgICAgICAgIERpc2FibGVNb2RpZnk9ImJ1dHRvbiIKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb21tb24ud3hzIGIvVG9vbHMvbXNpL2NvbW1vbi53eHMKaW5kZXggNGVmYWQ2NS4uYzg5NGViOCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2NvbW1vbi53eHMKKysrIGIvVG9vbHMvbXNpL2NvbW1vbi53eHMKQEAgLTEsNiArMSwxMCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgogICAgIDxGcmFnbWVudD4KKyAgICAgICAgPFByb3BlcnR5IElkPSJST09UUkVHSVNUUllLRVkiIFZhbHVlPSJTb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZSIgLz4KKyAgICA8L0ZyYWdtZW50PgorICAgIAorICAgIDxGcmFnbWVudD4KICAgICAgICAgPFByb3BlcnR5IElkPSJSRUdJU1RSWUtFWSIgVmFsdWU9IlNvZnR3YXJlXFB5dGhvblxQeXRob25Db3JlXCQodmFyLlNob3J0VmVyc2lvbikkKHZhci5QeUFyY2hFeHQpJCh2YXIuUHlUZXN0RXh0KSIgLz4KICAgICA8L0ZyYWdtZW50PgogICAgIApAQCAtNDAsNyArNDQsNyBAQAogICAgIAogICAgIDxGcmFnbWVudD4KICAgICAgICAgPCEtLSBJbmNsdWRlIGFuIGljb24gZm9yIHRoZSBQcm9ncmFtcyBhbmQgRmVhdHVyZXMgZGlhbG9nIC0tPgotICAgICAgICA8SWNvbiBJZD0iQVJQSWNvbiIgU291cmNlRmlsZT0iIShiaW5kcGF0aC5zcmMpUENccHljb24uaWNvIiAvPgorICAgICAgICA8SWNvbiBJZD0iQVJQSWNvbiIgU291cmNlRmlsZT0iIShiaW5kcGF0aC5zcmMpUENcaWNvbnNccHl0aG9uLmljbyIgLz4KICAgICAgICAgPFByb3BlcnR5IElkPSJBUlBQUk9EVUNUSUNPTiIgVmFsdWU9IkFSUEljb24iIC8+CiAgICAgICAgIDxQcm9wZXJ0eSBJZD0iQVJQTk9NT0RJRlkiIFZhbHVlPSIxIiAvPgogICAgICAgICA8UHJvcGVydHkgSWQ9IkRJU0FCTEVBRFZUU0hPUlRDVVRTIiBWYWx1ZT0iMSIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb21tb25fZW4tVVMud3hsX3RlbXBsYXRlIGIvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKaW5kZXggOGQwMzUyNi4uYzk1YzI3MSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKKysrIGIvVG9vbHMvbXNpL2NvbW1vbl9lbi1VUy53eGxfdGVtcGxhdGUKQEAgLTE0LDQgKzE0LDUgQEAKICAgICA8U3RyaW5nIElkPSJOb0Rvd25ncmFkZSI+QSBuZXdlciB2ZXJzaW9uIG9mICEobG9jLlByb2R1Y3ROYW1lKSBpcyBhbHJlYWR5IGluc3RhbGxlZC48L1N0cmluZz4KICAgICA8U3RyaW5nIElkPSJJbmNvcnJlY3RDb3JlIj5BbiBpbmNvcnJlY3QgdmVyc2lvbiBvZiBhIHByZXJlcXVpc2l0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gUGxlYXNlIHVuaW5zdGFsbCBhbnkgb3RoZXIgdmVyc2lvbnMgb2YgIShsb2MuUHJvZHVjdE5hbWUpIGFuZCB0cnkgaW5zdGFsbGluZyB0aGlzIGFnYWluLjwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9Ik5vVGFyZ2V0RGlyIj5UaGUgVEFSR0VURElSIHZhcmlhYmxlIG11c3QgYmUgcHJvdmlkZWQgd2hlbiBpbnZva2luZyB0aGlzIGluc3RhbGxlci48L1N0cmluZz4KKyAgICA8U3RyaW5nIElkPSJNYW51ZmFjdHVyZXJTdXBwb3J0VXJsIj5odHRwOi8vd3d3LnB5dGhvbi5vcmcvPC9TdHJpbmc+CiA8L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2ogYi9Ub29scy9tc2kvZXhlL2V4ZS53aXhwcm9qCmluZGV4IGQyNmE2MDMuLjI0ZGYwZjUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGUud2l4cHJvagpAQCAtMTQsNiArMTQsNyBAQAogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZS53eHMiIC8+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9maWxlcy53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9yZWcud3hzIiAvPgogICAgIDwvSXRlbUdyb3VwPgogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGUud3hzIGIvVG9vbHMvbXNpL2V4ZS9leGUud3hzCmluZGV4IDE1NGNlZTUuLjAzZDQzYzYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlLnd4cworKysgYi9Ub29scy9tc2kvZXhlL2V4ZS53eHMKQEAgLTksNiArOSw3IEBACiAgICAgICAgIAogICAgICAgICA8RmVhdHVyZSBJZD0iRGVmYXVsdEZlYXR1cmUiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uKSI+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImV4ZV9weXRob24iIFByaW1hcnk9InllcyIgLz4KKyAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iZXhlX3JlZyIgUHJpbWFyeT0ieWVzIiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfdHh0IiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfaWNvbnMiIC8+CiAgICAgICAgICAgICA8Q29tcG9uZW50UmVmIElkPSJPcHRpb25hbEZlYXR1cmUiIC8+CkBAIC0yNCw3ICsyNSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtpbmdEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIC8+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZvbGRlciBJZD0iUmVtb3ZlX01lbnVEaXIiIERpcmVjdG9yeT0iTWVudURpciIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgICAgICA8UmVnaXN0cnlLZXkgUm9vdD0iSEtNVSIgS2V5PSJbUkVHSVNUUllLRVldIj4KLSAgICAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgS2V5PSJJbnN0YWxsUGF0aFxJbnN0YWxsR3JvdXAiIFR5cGU9InN0cmluZyIgVmFsdWU9IiEobG9jLlByb2R1Y3ROYW1lKSIgS2V5UGF0aD0ieWVzIiAvPgogICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBLZXk9Ikluc3RhbGxlZEZlYXR1cmVzIiBOYW1lPSJTaG9ydGN1dHMiIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlZlcnNpb24pIiAvPgogICAgICAgICAgICAgICAgIDwvUmVnaXN0cnlLZXk+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX2Qud2l4cHJvaiBiL1Rvb2xzL21zaS9leGUvZXhlX2Qud2l4cHJvagppbmRleCAyNzU0NWNhLi5jZjA4NWJlIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZXhlL2V4ZV9kLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfZC53aXhwcm9qCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX2Qud3hzIiAvPgogICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJleGVfZmlsZXMud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJleGVfcmVnLnd4cyIgLz4KICAgICA8L0l0ZW1Hcm91cD4KICAgICA8SXRlbUdyb3VwPgogICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZSBiL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZQppbmRleCA1NzdmYmU1Li4xZjllMjkwIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZXhlL2V4ZV9lbi1VUy53eGxfdGVtcGxhdGUKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfZW4tVVMud3hsX3RlbXBsYXRlCkBAIC00LDQgKzQsNSBAQAogICAgIDxTdHJpbmcgSWQ9IlNob3J0RGVzY3JpcHRvciI+ZXhlY3V0YWJsZTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0TmFtZSI+UHl0aG9uIHt7U2hvcnRWZXJzaW9ufX0gKHt7Qml0bmVzc319KTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0RGVzY3JpcHRpb24iPkxhdW5jaGVzIHRoZSAhKGxvYy5Qcm9kdWN0TmFtZSkgaW50ZXJwcmV0ZXIuPC9TdHJpbmc+CisgICAgPFN0cmluZyBJZD0iU3VwcG9ydFVybCI+aHR0cDovL3d3dy5weXRob24ub3JnLzwvU3RyaW5nPgogPC9XaXhMb2NhbGl6YXRpb24+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZV9maWxlcy53eHMgYi9Ub29scy9tc2kvZXhlL2V4ZV9maWxlcy53eHMKaW5kZXggOWU0N2I1ZC4uMDEzODU4NyAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2V4ZS9leGVfZmlsZXMud3hzCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX2ZpbGVzLnd4cwpAQCAtMjgsNiArMjgsOSBAQAogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJweXRob253LmV4ZSIgRGlyZWN0b3J5PSJJbnN0YWxsRGlyZWN0b3J5IiBHdWlkPSIkKHZhci5QeXRob253RXhlQ29tcG9uZW50R3VpZCkiPgogICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InB5dGhvbncuZXhlIiBLZXlQYXRoPSJ5ZXMiIC8+CisgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5S2V5IFJvb3Q9IkhLTVUiIEtleT0iW1JFR0lTVFJZS0VZXSI+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIEtleT0iSW5zdGFsbFBhdGgiIE5hbWU9IldpbmRvd2VkRXhlY3V0YWJsZVBhdGgiIFR5cGU9InN0cmluZyIgVmFsdWU9IlsjcHl0aG9udy5leGVdIiBLZXlQYXRoPSJubyIgLz4KKyAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJ2Y3J1bnRpbWUxNDAuZGxsIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IioiPgogICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InZjcnVudGltZTE0MC5kbGwiIFNvdXJjZT0iIShiaW5kcGF0aC5yZWRpc3QpdmNydW50aW1lMTQwLmRsbCIgS2V5UGF0aD0ieWVzIiAvPgpAQCAtNjYsMTAgKzY5LDEzIEBACiAgICAgPEZyYWdtZW50PgogICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImV4ZV9pY29ucyI+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJweS5pY28iIERpcmVjdG9yeT0iRExMcyIgR3VpZD0iKiI+Ci0gICAgICAgICAgICAgICAgPEZpbGUgTmFtZT0icHkuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXHB5LmljbyIgS2V5UGF0aD0ieWVzIiAvPgorICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InB5LmljbyIgU291cmNlPSIhKGJpbmRwYXRoLnNyYylQQ1xpY29uc1xweS5pY28iIEtleVBhdGg9InllcyIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICAgICAgPENvbXBvbmVudCBJZD0icHljLmljbyIgRGlyZWN0b3J5PSJETExzIiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWMuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXHB5Yy5pY28iIEtleVBhdGg9InllcyIgLz4KKyAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWMuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXGljb25zXHB5Yy5pY28iIEtleVBhdGg9InllcyIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0icHlkLmljbyIgRGlyZWN0b3J5PSJETExzIiBHdWlkPSIqIj4KKyAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJweWQuaWNvIiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKVBDXGljb25zXHB5ZC5pY28iIEtleVBhdGg9InllcyIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgogICAgIDwvRnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZV9wZGIud2l4cHJvaiBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCmluZGV4IDRmNGM4NjkuLmJmMTIxM2UgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX3BkYi53eHMiIC8+CiAgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9maWxlcy53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9yZWcud3hzIiAvPgogICAgIDwvSXRlbUdyb3VwPgogICAgIDxJdGVtR3JvdXA+CiAgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGVfcmVnLnd4cyBiL1Rvb2xzL21zaS9leGUvZXhlX3JlZy53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0M2MyMQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX3JlZy53eHMKQEAgLTAsMCArMSwyNSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgorICAgIDxGcmFnbWVudD4KKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJST09UUkVHSVNUUllLRVkiIC8+CisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iUkVHSVNUUllLRVkiIC8+CisgICAgICAgIAorICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImV4ZV9yZWciPgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iQ29tbW9uUHl0aG9uUmVnaXN0cmF0aW9uIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLkNvbW1vblB5dGhvblJlZ0NvbXBvbmVudEd1aWQpIj4KKyAgICAgICAgICAgICAgICA8UmVnaXN0cnlLZXkgUm9vdD0iSEtNVSIgS2V5PSJbUk9PVFJFR0lTVFJZS0VZXSI+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IkRpc3BsYXlOYW1lIiBUeXBlPSJzdHJpbmciIFZhbHVlPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBLZXlQYXRoPSJ5ZXMiIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlN1cHBvcnRVcmwiIFR5cGU9InN0cmluZyIgVmFsdWU9IiEobG9jLk1hbnVmYWN0dXJlclN1cHBvcnRVcmwpIiBLZXlQYXRoPSJubyIgLz4KKyAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJQeXRob25SZWdpc3RyYXRpb24iIERpcmVjdG9yeT0iSW5zdGFsbERpcmVjdG9yeSIgR3VpZD0iJCh2YXIuUHl0aG9uUmVnQ29tcG9uZW50R3VpZCkiPgorICAgICAgICAgICAgICAgIDxSZWdpc3RyeUtleSBSb290PSJIS01VIiBLZXk9IltSRUdJU1RSWUtFWV0iPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZT0ic3RyaW5nIiBWYWx1ZT0iIShsb2MuU2hvcnRjdXROYW1lKSIgS2V5UGF0aD0ieWVzIiAvPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJTdXBwb3J0VXJsIiBUeXBlPSJzdHJpbmciIFZhbHVlPSIhKGxvYy5TdXBwb3J0VXJsKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlZlcnNpb24iIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLkxvbmdWZXJzaW9uKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIE5hbWU9IlN5c1ZlcnNpb24iIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlNob3J0VmVyc2lvbikiIEtleVBhdGg9Im5vIiAvPgorICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBOYW1lPSJTeXNBcmNoaXRlY3R1cmUiIFR5cGU9InN0cmluZyIgVmFsdWU9IiQodmFyLlBsYXRmb3JtQXJjaGl0ZWN0dXJlKSIgS2V5UGF0aD0ibm8iIC8+CisgICAgICAgICAgICAgICAgPC9SZWdpc3RyeUtleT4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgorICAgIDwvRnJhZ21lbnQ+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXIud3hzCmluZGV4IGViZDg3NWMuLmMwZmY1MWEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyLnd4cwpAQCAtNSw3ICs1LDEwIEBACiAgICAgICAgIDxNZWRpYVRlbXBsYXRlIEVtYmVkQ2FiPSJ5ZXMiIENvbXByZXNzaW9uTGV2ZWw9ImhpZ2giIC8+CiAgICAgICAgIAogICAgICAgICA8UHJvcGVydHkgSWQ9IlN1cHByZXNzX1RBUkdFVERJUl9DaGVjayIgVmFsdWU9IjEiIC8+Ci0gICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iQVJQUFJPRFVDVElDT04iIC8+CisgICAgICAgIDxJY29uIElkPSJBUlBJY29uIiBTb3VyY2VGaWxlPSIhKGJpbmRwYXRoLnNyYylQQ1xpY29uc1xsYXVuY2hlci5pY28iIC8+CisgICAgICAgIDxQcm9wZXJ0eSBJZD0iQVJQUFJPRFVDVElDT04iIFZhbHVlPSJBUlBJY29uIiAvPgorICAgICAgICA8UHJvcGVydHkgSWQ9IkFSUE5PTU9ESUZZIiBWYWx1ZT0iMSIgLz4KKyAgICAgICAgPFByb3BlcnR5IElkPSJESVNBQkxFQURWVFNIT1JUQ1VUUyIgVmFsdWU9IjEiIC8+CiAKICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsYXVuY2hlcl9leGUiIFByaW1hcnk9InllcyIgLz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9lbi1VUy53eGwgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXJfZW4tVVMud3hsCmluZGV4IGU0YzFhYWEuLmE3ZTM4MjcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9lbi1VUy53eGwKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX2VuLVVTLnd4bApAQCAtMTEsNiArMTEsNyBAQAogICAgIDxTdHJpbmcgSWQ9IlB5dGhvbkZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIEZpbGU8L1N0cmluZz4KICAgICA8U3RyaW5nIElkPSJQeXRob25Ob0NvbkZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIEZpbGUgKG5vIGNvbnNvbGUpPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uQ29tcGlsZWRGaWxlRGVzY3JpcHRpb24iPkNvbXBpbGVkIFB5dGhvbiBGaWxlPC9TdHJpbmc+CisgICAgPFN0cmluZyBJZD0iUHl0aG9uRXh0ZW5zaW9uRGVzY3JpcHRpb24iPlB5dGhvbiBFeHRlbnNpb24gTW9kdWxlPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uQXJjaGl2ZUZpbGVEZXNjcmlwdGlvbiI+UHl0aG9uIFppcCBBcHBsaWNhdGlvbiBGaWxlPC9TdHJpbmc+CiAgICAgPFN0cmluZyBJZD0iUHl0aG9uTm9Db25BcmNoaXZlRmlsZURlc2NyaXB0aW9uIj5QeXRob24gWmlwIEFwcGxpY2F0aW9uIEZpbGUgKG5vIGNvbnNvbGUpPC9TdHJpbmc+CiA8L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9yZWcud3hzIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKaW5kZXggOTgxOTYxYS4uZGFjZTk3ZSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3JlZy53eHMKQEAgLTI3LDE0ICsyNywxOCBAQAogICAgICAgICAgICAgICAgIDwvUHJvZ0lkPgogICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIFJvb3Q9IkhLQ1IiIEtleT0iUHl0aG9uLkNvbXBpbGVkRmlsZVxzaGVsbGV4XERyb3BIYW5kbGVyIiBWYWx1ZT0ie0JFQTIxOEQyLTY5NTAtNDk3Qi05NDM0LTYxNjgzRUMwNjVGRX0iIFR5cGU9InN0cmluZyIgLz4KIAotICAgICAgICAgICAgICAgIDxQcm9nSWQgSWQ9IlB5dGhvbi5BcmNoaXZlRmlsZSIgRGVzY3JpcHRpb249IiEobG9jLlB5dGhvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iMSI+CisgICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLkV4dGVuc2lvbiIgRGVzY3JpcHRpb249IiEobG9jLlB5dGhvbkV4dGVuc2lvbkRlc2NyaXB0aW9uKSIgQWR2ZXJ0aXNlPSJubyIgSWNvbj0icHkuZXhlIiBJY29uSW5kZXg9IjMiPgorICAgICAgICAgICAgICAgICAgICA8RXh0ZW5zaW9uIElkPSJweWQiIC8+CisgICAgICAgICAgICAgICAgPC9Qcm9nSWQ+CisKKyAgICAgICAgICAgICAgICA8UHJvZ0lkIElkPSJQeXRob24uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25BcmNoaXZlRmlsZURlc2NyaXB0aW9uKSIgQWR2ZXJ0aXNlPSJubyIgSWNvbj0icHkuZXhlIiBJY29uSW5kZXg9IjUiPgogICAgICAgICAgICAgICAgICAgICA8RXh0ZW5zaW9uIElkPSJweXoiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJiIElkPSJvcGVuIiBUYXJnZXRGaWxlPSJweS5leGUiIEFyZ3VtZW50PSImcXVvdDslTCZxdW90OyAlKiIgLz4KICAgICAgICAgICAgICAgICAgICAgPC9FeHRlbnNpb24+CiAgICAgICAgICAgICAgICAgPC9Qcm9nSWQ+CiAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgUm9vdD0iSEtDUiIgS2V5PSJQeXRob24uQXJjaGl2ZUZpbGVcc2hlbGxleFxEcm9wSGFuZGxlciIgVmFsdWU9IntCRUEyMThEMi02OTUwLTQ5N0ItOTQzNC02MTY4M0VDMDY1RkV9IiBUeXBlPSJzdHJpbmciIC8+CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLk5vQ29uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25Ob0NvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iMSI+CisgICAgICAgICAgICAgICAgPFByb2dJZCBJZD0iUHl0aG9uLk5vQ29uQXJjaGl2ZUZpbGUiIERlc2NyaXB0aW9uPSIhKGxvYy5QeXRob25Ob0NvbkFyY2hpdmVGaWxlRGVzY3JpcHRpb24pIiBBZHZlcnRpc2U9Im5vIiBJY29uPSJweS5leGUiIEljb25JbmRleD0iNSI+CiAgICAgICAgICAgICAgICAgICAgIDxFeHRlbnNpb24gSWQ9InB5enciIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJiIElkPSJvcGVuIiBUYXJnZXRGaWxlPSJweXcuZXhlIiBBcmd1bWVudD0iJnF1b3Q7JUwmcXVvdDsgJSoiIC8+CiAgICAgICAgICAgICAgICAgICAgIDwvRXh0ZW5zaW9uPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzIGIvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCmluZGV4IGZhNzlhOGQuLjgwNGFiMDEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cworKysgYi9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKQEAgLTY0LDE2ICs2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICA8UmVnaXN0cnlWYWx1ZSBLZXk9IlB5dGhvblBhdGgiIFR5cGU9InN0cmluZyIgVmFsdWU9IltMaWJdO1tETExzXSIgLz4KICAgICAgICAgICAgICAgICA8L1JlZ2lzdHJ5S2V5PgogICAgICAgICAgICAgPC9Db21wb25lbnQ+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IElkPSJMaWJfc2l0ZV9wYWNrYWdlc19SRUFETUUiIERpcmVjdG9yeT0iTGliX3NpdGVfcGFja2FnZXMiIEd1aWQ9IioiPgotICAgICAgICAgICAgICAgIDxGaWxlIElkPSJMaWJfc2l0ZV9wYWNrYWdlc19SRUFETUUiIE5hbWU9IlJFQURNRS50eHQiIFNvdXJjZT0iIShiaW5kcGF0aC5zcmMpTGliXHNpdGUtcGFja2FnZXNcUkVBRE1FIiBLZXlQYXRoPSJ5ZXMiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZSIgRGlyZWN0b3J5PSJMaWJfbGliMnRvMyIgR3VpZD0iJCh2YXIuUmVtb3ZlTGliMnRvM1BpY2tsZUNvbXBvbmVudEd1aWQpIj4KICAgICAgICAgICAgICAgICA8UmVtb3ZlRmlsZSBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlX2ZpbGVzIiBOYW1lPSIqLnBpY2tsZSIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgICAgICA8UmVtb3ZlRm9sZGVyIElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmVfZm9sZGVyIiBPbj0idW5pbnN0YWxsIiAvPgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgIDwvQ29tcG9uZW50R3JvdXA+Ci0gICAgICAgIDxEaXJlY3RvcnlSZWYgSWQ9IkxpYiI+Ci0gICAgICAgICAgICA8RGlyZWN0b3J5IElkPSJMaWJfc2l0ZV9wYWNrYWdlcyIgTmFtZT0ic2l0ZS1wYWNrYWdlcyIgLz4KLSAgICAgICAgPC9EaXJlY3RvcnlSZWY+CiAgICAgPC9GcmFnbWVudD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaS5wcm9wcyBiL1Rvb2xzL21zaS9tc2kucHJvcHMKaW5kZXggMGNmN2M3Ny4uNzQ1ZmM1NCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaS5wcm9wcworKysgYi9Ub29scy9tc2kvbXNpLnByb3BzCkBAIC02OSw2ICs2OSw4IEBACiAgICAgPFByb3BlcnR5R3JvdXA+CiAgICAgICAgIDxCaXRuZXNzPjMyLWJpdDwvQml0bmVzcz4KICAgICAgICAgPEJpdG5lc3MgQ29uZGl0aW9uPSIkKFBsYXRmb3JtKSA9PSAneDY0JyI+NjQtYml0PC9CaXRuZXNzPgorICAgICAgICA8UGxhdGZvcm1BcmNoaXRlY3R1cmU+MzJiaXQ8L1BsYXRmb3JtQXJjaGl0ZWN0dXJlPgorICAgICAgICA8UGxhdGZvcm1BcmNoaXRlY3R1cmUgQ29uZGl0aW9uPSIkKFBsYXRmb3JtKSA9PSAneDY0JyI+NjRiaXQ8L1BsYXRmb3JtQXJjaGl0ZWN0dXJlPgogICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPgogICAgICAgICAgICAgJChEZWZpbmVDb25zdGFudHMpOwogICAgICAgICAgICAgVmVyc2lvbj0kKEluc3RhbGxlclZlcnNpb24pOwpAQCAtNzksNiArODEsNyBAQAogICAgICAgICAgICAgVXBncmFkZU1pbmltdW1WZXJzaW9uPSQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKE1pbm9yVmVyc2lvbk51bWJlcikuMC4wOwogICAgICAgICAgICAgTmV4dE1ham9yVmVyc2lvbk51bWJlcj0kKE1ham9yVmVyc2lvbk51bWJlcikuJChbbXNidWlsZF06OkFkZCgkKE1pbm9yVmVyc2lvbk51bWJlciksIDEpKS4wLjA7CiAgICAgICAgICAgICBCaXRuZXNzPSQoQml0bmVzcyk7CisgICAgICAgICAgICBQbGF0Zm9ybUFyY2hpdGVjdHVyZT0kKFBsYXRmb3JtQXJjaGl0ZWN0dXJlKTsKICAgICAgICAgICAgIFB5RGVidWdFeHQ9JChQeURlYnVnRXh0KTsKICAgICAgICAgICAgIFB5QXJjaEV4dD0kKFB5QXJjaEV4dCk7CiAgICAgICAgICAgICBQeVRlc3RFeHQ9JChQeVRlc3RFeHQpOwpAQCAtMTU1LDYgKzE1OCwxMiBAQAogICAgICAgICA8X1V1aWQgSW5jbHVkZT0iUmVtb3ZlTGliMnRvM1BpY2tsZUNvbXBvbmVudEd1aWQiPgogICAgICAgICAgICAgPFVyaT5saWIydG8zL3BpY2tsZXM8L1VyaT4KICAgICAgICAgPC9fVXVpZD4KKyAgICAgICAgPF9VdWlkIEluY2x1ZGU9IkNvbW1vblB5dGhvblJlZ0NvbXBvbmVudEd1aWQiPgorICAgICAgICAgICAgPFVyaT5yZWdpc3RyeTwvVXJpPgorICAgICAgICA8L19VdWlkPgorICAgICAgICA8X1V1aWQgSW5jbHVkZT0iUHl0aG9uUmVnQ29tcG9uZW50R3VpZCI+CisgICAgICAgICAgICA8VXJpPnJlZ2lzdHJ5LyQoT3V0cHV0TmFtZSk8L1VyaT4KKyAgICAgICAgPC9fVXVpZD4KICAgICA8L0l0ZW1Hcm91cD4KICAgICA8VGFyZ2V0IE5hbWU9Il9HZW5lcmF0ZUd1aWRzIiBBZnRlclRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCIgQ29uZGl0aW9uPSIkKFRhcmdldE5hbWUpICE9ICdsYXVuY2hlciciPgogICAgICAgICA8UHJvcGVydHlHcm91cD4KZGlmZiAtLWdpdCBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5IGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKaW5kZXggMjg1MDMwZS4uNzIwMzA1NyAxMDA2NDQKLS0tIGEvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKKysrIGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKQEAgLTMyMiw5ICszMjIsNzIgQEAKICAgICBkZWYgX1N0cihzZWxmLCB0cmVlKToKICAgICAgICAgc2VsZi53cml0ZShyZXByKHRyZWUucykpCiAKKyAgICBkZWYgX0pvaW5lZFN0cihzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Kb2luZWRTdHIodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZSh0LCBzdHJpbmcud3JpdGUpCisgICAgICAgIHNlbGYud3JpdGUocmVwcihzdHJpbmcuZ2V0dmFsdWUoKSkpCisKKyAgICBkZWYgX2ZzdHJpbmdfSm9pbmVkU3RyKHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgZm9yIHZhbHVlIGluIHQudmFsdWVzOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHZhbHVlKS5fX25hbWVfXykKKyAgICAgICAgICAgIG1ldGgodmFsdWUsIHdyaXRlKQorCisgICAgZGVmIF9mc3RyaW5nX1N0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHZhbHVlID0gdC5zLnJlcGxhY2UoInsiLCAie3siKS5yZXBsYWNlKCJ9IiwgIn19IikKKyAgICAgICAgd3JpdGUodmFsdWUpCisKKyAgICBkZWYgX2ZzdHJpbmdfQ29uc3RhbnQoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0LnZhbHVlLCBzdHIpCisgICAgICAgIHZhbHVlID0gdC52YWx1ZS5yZXBsYWNlKCJ7IiwgInt7IikucmVwbGFjZSgifSIsICJ9fSIpCisgICAgICAgIHdyaXRlKHZhbHVlKQorCisgICAgZGVmIF9mc3RyaW5nX0Zvcm1hdHRlZFZhbHVlKHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgd3JpdGUoInsiKQorICAgICAgICBleHByID0gaW8uU3RyaW5nSU8oKQorICAgICAgICBVbnBhcnNlcih0LnZhbHVlLCBleHByKQorICAgICAgICBleHByID0gZXhwci5nZXR2YWx1ZSgpLnJzdHJpcCgiXG4iKQorICAgICAgICBpZiBleHByLnN0YXJ0c3dpdGgoInsiKToKKyAgICAgICAgICAgIHdyaXRlKCIgIikgICMgU2VwYXJhdGUgcGFpciBvZiBvcGVuaW5nIGJyYWNrZXRzIGFzICJ7IHsiCisgICAgICAgIHdyaXRlKGV4cHIpCisgICAgICAgIGlmIHQuY29udmVyc2lvbiAhPSAtMToKKyAgICAgICAgICAgIGNvbnZlcnNpb24gPSBjaHIodC5jb252ZXJzaW9uKQorICAgICAgICAgICAgYXNzZXJ0IGNvbnZlcnNpb24gaW4gInNyYSIKKyAgICAgICAgICAgIHdyaXRlKGYiIXtjb252ZXJzaW9ufSIpCisgICAgICAgIGlmIHQuZm9ybWF0X3NwZWM6CisgICAgICAgICAgICB3cml0ZSgiOiIpCisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAiX2ZzdHJpbmdfIiArIHR5cGUodC5mb3JtYXRfc3BlYykuX19uYW1lX18pCisgICAgICAgICAgICBtZXRoKHQuZm9ybWF0X3NwZWMsIHdyaXRlKQorICAgICAgICB3cml0ZSgifSIpCisKICAgICBkZWYgX05hbWUoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUodC5pZCkKIAorICAgIGRlZiBfd3JpdGVfY29uc3RhbnQoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoZmxvYXQsIGNvbXBsZXgpKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUocmVwcih2YWx1ZSkucmVwbGFjZSgiaW5mIiwgSU5GU1RSKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUocmVwcih2YWx1ZSkpCisKKyAgICBkZWYgX0NvbnN0YW50KHNlbGYsIHQpOgorICAgICAgICB2YWx1ZSA9IHQudmFsdWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiKCIpCisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfY29uc3RhbnQodmFsdWVbMF0pCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGludGVybGVhdmUobGFtYmRhOiBzZWxmLndyaXRlKCIsICIpLCBzZWxmLl93cml0ZV9jb25zdGFudCwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIpIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2NvbnN0YW50KHQudmFsdWUpCisKICAgICBkZWYgX05hbWVDb25zdGFudChzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZShyZXByKHQudmFsdWUpKQogCkBAIC00MTMsNyArNDc2LDcgQEAKICAgICBkZWYgX1R1cGxlKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKCIoIikKICAgICAgICAgaWYgbGVuKHQuZWx0cykgPT0gMToKLSAgICAgICAgICAgIChlbHQsKSA9IHQuZWx0cworICAgICAgICAgICAgZWx0ID0gdC5lbHRzWzBdCiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGVsdCkKICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQogICAgICAgICBlbHNlOgpAQCAtNDYwLDcgKzUyMyw4IEBACiAgICAgICAgICMgU3BlY2lhbCBjYXNlOiAzLl9fYWJzX18oKSBpcyBhIHN5bnRheCBlcnJvciwgc28gaWYgdC52YWx1ZQogICAgICAgICAjIGlzIGFuIGludGVnZXIgbGl0ZXJhbCB0aGVuIHdlIG5lZWQgdG8gZWl0aGVyIHBhcmVudGhlc2l6ZQogICAgICAgICAjIGl0IG9yIGFkZCBhbiBleHRyYSBzcGFjZSB0byBnZXQgMyAuX19hYnNfXygpLgotICAgICAgICBpZiBpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KToKKyAgICAgICAgaWYgKChpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KSkKKyAgICAgICAgICAgb3IgKGlzaW5zdGFuY2UodC52YWx1ZSwgYXN0LkNvbnN0YW50KSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLnZhbHVlLCBpbnQpKSk6CiAgICAgICAgICAgICBzZWxmLndyaXRlKCIgIikKICAgICAgICAgc2VsZi53cml0ZSgiLiIpCiAgICAgICAgIHNlbGYud3JpdGUodC5hdHRyKQpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weSBiL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKaW5kZXggZTEwZTQ5YS4uN2NhOTUyNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQorKysgYi9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CkBAIC02LDcgKzYsNyBAQAogQSBoZWxwZXIgZm9yIGFuYWx5emluZyBQWVRIT05EVU1QUkVGUyBvdXRwdXQuCiAKIFdoZW4gdGhlIFBZVEhPTkRVTVBSRUZTIGVudmFyIGlzIHNldCBpbiBhIGRlYnVnIGJ1aWxkLCBhdCBQeXRob24gc2h1dGRvd24KLXRpbWUgUHlfRmluYWxpemUoKSBwcmludHMgdGhlIGxpc3Qgb2YgYWxsIGxpdmUgb2JqZWN0cyB0d2ljZTogIGZpcnN0IGl0Cit0aW1lIFB5X0ZpbmFsaXplRXgoKSBwcmludHMgdGhlIGxpc3Qgb2YgYWxsIGxpdmUgb2JqZWN0cyB0d2ljZTogIGZpcnN0IGl0CiBwcmludHMgdGhlIHJlcHIoKSBvZiBlYWNoIG9iamVjdCB3aGlsZSB0aGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZnVsbHkgaW50YWN0LgogQWZ0ZXIgY2xlYW5pbmcgdXAgZXZlcnl0aGluZyBpdCBjYW4sIGl0IHByaW50cyBhbGwgcmVtYWluaW5nIGxpdmUgb2JqZWN0cwogYWdhaW4sIGJ1dCB0aGUgc2Vjb25kIHRpbWUganVzdCBwcmludHMgdGhlaXIgYWRkcmVzc2VzLCByZWZjb3VudHMsIGFuZCB0eXBlCkBAIC00MSw3ICs0MSw3IEBACiBvYmplY3RzIHNob3duIGluIHRoZSByZXByOiAgdGhlIHJlcHIgd2FzIGNhcHR1cmVkIGZyb20gdGhlIGZpcnN0IG91dHB1dCBibG9jaywKIGFuZCBzb21lIG9mIHRoZSBjb250YWluZWVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgc2luY2UgdGhlbi4gIEZvciBleGFtcGxlLAogaXQncyBjb21tb24gZm9yIHRoZSBsaW5lIHNob3dpbmcgdGhlIGRpY3Qgb2YgaW50ZXJuZWQgc3RyaW5ncyB0byBkaXNwbGF5Ci1zdHJpbmdzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoZSBlbmQgb2YgUHlfRmluYWxpemU7IHRoaXMgY2FuIGJlIHJlY29nbml6ZWQKK3N0cmluZ3MgdGhhdCBubyBsb25nZXIgZXhpc3QgYXQgdGhlIGVuZCBvZiBQeV9GaW5hbGl6ZUV4OyB0aGlzIGNhbiBiZSByZWNvZ25pemVkCiAoYWxiZWl0IHBhaW5mdWxseSkgYmVjYXVzZSBzdWNoIGNvbnRhaW5lZXMgZG9uJ3QgaGF2ZSBhIGxpbmUgb2YgdGhlaXIgb3duLgogCiBUaGUgb2JqZWN0cyBhcmUgbGlzdGVkIGluIGFsbG9jYXRpb24gb3JkZXIsIHdpdGggbW9zdC1yZWNlbnRseSBhbGxvY2F0ZWQKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvZGlmZi5weSBiL1Rvb2xzL3NjcmlwdHMvZGlmZi5weQppbmRleCA5NzIwYTQzLi45NjE5OWI4IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2RpZmYucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9kaWZmLnB5CkBAIC04LDcgKzgsNyBAQAogCiAiIiIKIAotaW1wb3J0IHN5cywgb3MsIHRpbWUsIGRpZmZsaWIsIGFyZ3BhcnNlCitpbXBvcnQgc3lzLCBvcywgZGlmZmxpYiwgYXJncGFyc2UKIGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lem9uZQogCiBkZWYgZmlsZV9tdGltZShwYXRoKToKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvaWRsZTMgYi9Ub29scy9zY3JpcHRzL2lkbGUzCmluZGV4IDhlZTkyYzIuLmQ3MzMyYmMgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvaWRsZTMKKysrIGIvVG9vbHMvc2NyaXB0cy9pZGxlMwpAQCAtMSw1ICsxLDUgQEAKICMhIC91c3IvYmluL2VudiBweXRob24zCiAKLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgbWFpbgogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKaW5kZXggOGYwNzU1OS4uODNiYmNkNyAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKQEAgLTM2LDggKzM2LDggQEAKICIiIgogaW1wb3J0IG9zLCBzeXMKIAotUFlUSE9OTElCID0gJ2xpYnB5dGhvbicrc3lzLnZlcnNpb25bOjNdKycuYScKLVBDX1BZVEhPTkxJQiA9ICdQeXRob24nK3N5cy52ZXJzaW9uWzBdK3N5cy52ZXJzaW9uWzJdKycuZGxsJworUFlUSE9OTElCID0gJ2xpYnB5dGhvbiVkLiVkLmEnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KK1BDX1BZVEhPTkxJQiA9ICdQeXRob24lZCVkLmRsbCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogTk0gPSAnbm0gLXAgLWcgJXMnICAgICAgICAgICAgICAgICAgICAgICMgRm9yIExpbnV4LCB1c2UgIm5tIC1nICVzIgogCiBkZWYgc3ltYm9scyhsaWI9UFlUSE9OTElCLHR5cGVzPSgnVCcsJ0MnLCdEJykpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9weXZlbnYgYi9Ub29scy9zY3JpcHRzL3B5dmVudgppbmRleCA5NzhkNjkxLi4xZmI0MmM2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3B5dmVudgorKysgYi9Ub29scy9zY3JpcHRzL3B5dmVudgpAQCAtMSw2ICsxLDEyIEBACiAjIS91c3IvYmluL2VudiBweXRob24zCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgcGF0aGxpYgorCisgICAgZXhlY3V0YWJsZSA9IHBhdGhsaWIuUGF0aChzeXMuZXhlY3V0YWJsZSBvciAncHl0aG9uMycpLm5hbWUKKyAgICBwcmludCgnV0FSTklORzogdGhlIHB5ZW52IHNjcmlwdCBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiAnCisgICAgICAgICAgZidge2V4ZWN1dGFibGV9IC1tIHZlbnZgJywgZmlsZT1zeXMuc3RkZXJyKQorCiAgICAgcmMgPSAxCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnQgdmVudgpkaWZmIC0tZ2l0IGEvVG9vbHMvc3NsL3Rlc3RfbXVsdGlwbGVfdmVyc2lvbnMucHkgYi9Ub29scy9zc2wvdGVzdF9tdWx0aXBsZV92ZXJzaW9ucy5weQppbmRleCBkZDU3ZGNmLi4zMGQ1ZmNmIDEwMDY0NAotLS0gYS9Ub29scy9zc2wvdGVzdF9tdWx0aXBsZV92ZXJzaW9ucy5weQorKysgYi9Ub29scy9zc2wvdGVzdF9tdWx0aXBsZV92ZXJzaW9ucy5weQpAQCAtMTA1LDExICsxMDUsMTEgQEAKIAogICAgIGRlZiBfc3VicHJvY2Vzc19jYWxsKHNlbGYsIGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuREVWTlVMTCwgZW52PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpOgotICAgICAgICBsb2cuZGVidWcoIkNhbGwgJ3t9JyIuZm9ybWF0KCIgIi5qb2luKGNtZCkpKQorICAgICAgICBsb2cuZGVidWcoIkNhbGwgJyVzJyIsICIgIi5qb2luKGNtZCkpCiAgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kLCBzdGRvdXQ9c3Rkb3V0LCBlbnY9ZW52LCAqKmt3YXJncykKIAogICAgIGRlZiBfc3VicHJvY2Vzc19vdXRwdXQoc2VsZiwgY21kLCBlbnY9Tm9uZSwgKiprd2FyZ3MpOgotICAgICAgICBsb2cuZGVidWcoIkNhbGwgJ3t9JyIuZm9ybWF0KCIgIi5qb2luKGNtZCkpKQorICAgICAgICBsb2cuZGVidWcoIkNhbGwgJyVzJyIsICIgIi5qb2luKGNtZCkpCiAgICAgICAgIG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KGNtZCwgZW52PWVudikKICAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpLmRlY29kZSgidXRmLTgiKQogCkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhhc19zcmM6CiAgICAgICAgICAgICAgICAgc2VsZi5fZG93bmxvYWRfb3BlbnNzbCgpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBoYXMgc3JjIHt9Ii5mb3JtYXQoc2VsZi5zcmNfZmlsZSkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbHJlYWR5IGhhcyBzcmMgJXMiLCBzZWxmLnNyY19maWxlKQogICAgICAgICAgICAgc2VsZi5fdW5wYWNrX29wZW5zc2woKQogICAgICAgICAgICAgc2VsZi5fYnVpbGRfb3BlbnNzbCgpCiAgICAgICAgICAgICBzZWxmLl9pbnN0YWxsX29wZW5zc2woKQpkaWZmIC0tZ2l0IGEvVG9vbHMvdHovemR1bXAucHkgYi9Ub29scy90ei96ZHVtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRiNDgzCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvdHovemR1bXAucHkKQEAgLTAsMCArMSw4MSBAQAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3RydWN0Citmcm9tIGFycmF5IGltcG9ydCBhcnJheQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQorCit0dGluZm8gPSBuYW1lZHR1cGxlKCd0dGluZm8nLCBbJ3R0X2dtdG9mZicsICd0dF9pc2RzdCcsICd0dF9hYmJyaW5kJ10pCisKK2NsYXNzIFRaSW5mbzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNpdGlvbnMsIHR5cGVfaW5kaWNlcywgdHRpcywgYWJicnMpOgorICAgICAgICBzZWxmLnRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnMKKyAgICAgICAgc2VsZi50eXBlX2luZGljZXMgPSB0eXBlX2luZGljZXMKKyAgICAgICAgc2VsZi50dGlzID0gdHRpcworICAgICAgICBzZWxmLmFiYnJzID0gYWJicnMKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tZmlsZShjbHMsIGZpbGVvYmopOgorICAgICAgICBpZiBmaWxlb2JqLnJlYWQoNCkuZGVjb2RlKCkgIT0gIlRaaWYiOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGEgem9uZWluZm8gZmlsZSIpCisgICAgICAgIGZpbGVvYmouc2VlaygyMCkKKyAgICAgICAgaGVhZGVyID0gZmlsZW9iai5yZWFkKDI0KQorICAgICAgICB0emggPSAodHpoX3R0aXNnbXRjbnQsIHR6aF90dGlzc3RkY250LCB0emhfbGVhcGNudCwKKyAgICAgICAgICAgICAgIHR6aF90aW1lY250LCB0emhfdHlwZWNudCwgdHpoX2NoYXJjbnQpID0gc3RydWN0LnVucGFjaygiPjZsIiwgaGVhZGVyKQorICAgICAgICB0cmFuc2l0aW9ucyA9IGFycmF5KCdpJykKKyAgICAgICAgdHJhbnNpdGlvbnMuZnJvbWZpbGUoZmlsZW9iaiwgdHpoX3RpbWVjbnQpCisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgIT0gJ2JpZyc6CisgICAgICAgICAgICB0cmFuc2l0aW9ucy5ieXRlc3dhcCgpCisKKyAgICAgICAgdHlwZV9pbmRpY2VzID0gYXJyYXkoJ0InKQorICAgICAgICB0eXBlX2luZGljZXMuZnJvbWZpbGUoZmlsZW9iaiwgdHpoX3RpbWVjbnQpCisKKyAgICAgICAgdHRpcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKHR6aF90eXBlY250KToKKyAgICAgICAgICAgIHR0aXMuYXBwZW5kKHR0aW5mby5fbWFrZShzdHJ1Y3QudW5wYWNrKCI+bGJiIiwgZmlsZW9iai5yZWFkKDYpKSkpCisKKyAgICAgICAgYWJicnMgPSBmaWxlb2JqLnJlYWQodHpoX2NoYXJjbnQpCisKKyAgICAgICAgc2VsZiA9IGNscyh0cmFuc2l0aW9ucywgdHlwZV9pbmRpY2VzLCB0dGlzLCBhYmJycykKKyAgICAgICAgc2VsZi50emggPSB0emgKKworICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGR1bXAoc2VsZiwgc3RyZWFtLCBzdGFydD1Ob25lLCBlbmQ9Tm9uZSk6CisgICAgICAgIGZvciBqLCAodHJhbnMsIGkpIGluIGVudW1lcmF0ZSh6aXAoc2VsZi50cmFuc2l0aW9ucywgc2VsZi50eXBlX2luZGljZXMpKToKKyAgICAgICAgICAgIHV0YyA9IGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodHJhbnMpCisgICAgICAgICAgICB0dGkgPSBzZWxmLnR0aXNbaV0KKyAgICAgICAgICAgIGxtdCA9IGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodHJhbnMgKyB0dGkudHRfZ210b2ZmKQorICAgICAgICAgICAgYWJicmluZCA9IHR0aS50dF9hYmJyaW5kCisgICAgICAgICAgICBhYmJyID0gc2VsZi5hYmJyc1thYmJyaW5kOnNlbGYuYWJicnMuZmluZCgwLCBhYmJyaW5kKV0uZGVjb2RlKCkKKyAgICAgICAgICAgIGlmIGogPiAwOgorICAgICAgICAgICAgICAgIHByZXZfdHRpID0gc2VsZi50dGlzW3NlbGYudHlwZV9pbmRpY2VzW2ogLSAxXV0KKyAgICAgICAgICAgICAgICBzaGlmdCA9ICIgJStnIiAlICgodHRpLnR0X2dtdG9mZiAtIHByZXZfdHRpLnR0X2dtdG9mZikgLyAzNjAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzaGlmdCA9ICcnCisgICAgICAgICAgICBwcmludCgiJXMgVVRDID0gJXMgJS01cyBpc2RzdD0lZCIgJSAodXRjLCBsbXQsIGFiYnIsIHR0aVsxXSkgKyBzaGlmdCwgZmlsZT1zdHJlYW0pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgem9uZWxpc3QoY2xzLCB6b25lZGlyPScvdXNyL3NoYXJlL3pvbmVpbmZvJyk6CisgICAgICAgIHpvbmVzID0gW10KKyAgICAgICAgZm9yIHJvb3QsIF8sIGZpbGVzIGluIG9zLndhbGsoem9uZWRpcik6CisgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKHJvb3QsIGYpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHAsICdyYicpIGFzIG86CisgICAgICAgICAgICAgICAgICAgIG1hZ2ljID0gIG8ucmVhZCg0KQorICAgICAgICAgICAgICAgIGlmIG1hZ2ljID09IGInVFppZic6CisgICAgICAgICAgICAgICAgICAgIHpvbmVzLmFwcGVuZChwW2xlbih6b25lZGlyKSArIDE6XSkKKyAgICAgICAgcmV0dXJuIHpvbmVzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgICAgIHpvbmVzID0gVFpJbmZvLnpvbmVsaXN0KCkKKyAgICAgICAgZm9yIHogaW4gem9uZXM6CisgICAgICAgICAgICBwcmludCh6KQorICAgICAgICBzeXMuZXhpdCgpCisgICAgZmlsZXBhdGggPSBzeXMuYXJndlsxXQorICAgIGlmIG5vdCBmaWxlcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKCcvdXNyL3NoYXJlL3pvbmVpbmZvJywgZmlsZXBhdGgpCisgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAncmInKSBhcyBmaWxlb2JqOgorICAgICAgICB0emkgPSBUWkluZm8uZnJvbWZpbGUoZmlsZW9iaikKKyAgICB0emkuZHVtcChzeXMuc3Rkb3V0KQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDQ2MmM5NjguLjFlNTVkZGMgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsNiArMSw2IEBACiAjISAvYmluL3NoCiAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNS4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBweXRob24gMy42LgogIwogIyBSZXBvcnQgYnVncyB0byA8aHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvPi4KICMKQEAgLTU4MCw4ICs1ODAsOCBAQAogIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCiBQQUNLQUdFX05BTUU9J3B5dGhvbicKIFBBQ0tBR0VfVEFSTkFNRT0ncHl0aG9uJwotUEFDS0FHRV9WRVJTSU9OPSczLjUnCi1QQUNLQUdFX1NUUklORz0ncHl0aG9uIDMuNScKK1BBQ0tBR0VfVkVSU0lPTj0nMy42JworUEFDS0FHRV9TVFJJTkc9J3B5dGhvbiAzLjYnCiBQQUNLQUdFX0JVR1JFUE9SVD0naHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvJwogUEFDS0FHRV9VUkw9JycKIApAQCAtNzAxLDYgKzcwMSw3IEBACiBCVUlMREVYRUVYVAogRUdSRVAKIE5PX0FTX05FRURFRAorTVVMVElBUkNIX0NQUEZMQUdTCiBQTEFURk9STV9UUklQTEVUCiBQTEFURElSCiBNVUxUSUFSQ0gKQEAgLTEzOTcsNyArMTM5OCw3IEBACiAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgogICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCiAgIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgcHl0aG9uIDMuNSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBweXRob24gMy42IHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KIAogVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCiAKQEAgLTE0NjMsNyArMTQ2NCw3IEBACiAKIGlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCiAgIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgcHl0aG9uIDMuNToiOzsKKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHB5dGhvbiAzLjY6Ijs7CiAgICBlc2FjCiAgIGNhdCA8PFxfQUNFT0YKIApAQCAtMTYyMCw3ICsxNjIxLDcgQEAKIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCi1weXRob24gY29uZmlndXJlIDMuNQorcHl0aG9uIGNvbmZpZ3VyZSAzLjYKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OQogCiBDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0xOTczLDEzNiArMTk3NCw2IEBACiAKIH0gIyBhY19mbl9jX2NoZWNrX3R5cGUKIAotIyBhY19mbl9jX2ZpbmRfdWludFhfdCBMSU5FTk8gQklUUyBWQVIKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEZpbmRzIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSB3aXRoIHdpZHRoIEJJVFMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19maW5kX3VpbnRYX3QgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB1aW50JDJfdCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludCQyX3QuLi4gIiA+JjY7IH0KLWlmIGV2YWwgXCR7JDMrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBldmFsICIkMz1ubyIKLSAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCi0gICAgICMgdGhhbiBoYWxmIG9mIHRoZSBleHBlY3RlZCB0YXJnZXQgd2lkdGguCi0gICAgIGZvciBhY190eXBlIGluIHVpbnQkMl90ICd1bnNpZ25lZCBpbnQnICd1bnNpZ25lZCBsb25nIGludCcgXAotCSAndW5zaWduZWQgbG9uZyBsb25nIGludCcgJ3Vuc2lnbmVkIHNob3J0IGludCcgJ3Vuc2lnbmVkIGNoYXInOyBkbwotICAgICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgoJGFjX3R5cGUpIC0xID4+ICgkMiAvIDIgLSAxKSkgPj4gKCQyIC8gMiAtIDEpID09IDMpXTsKLXRlc3RfYXJyYXkgWzBdID0gMDsKLXJldHVybiB0ZXN0X2FycmF5IFswXTsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0gIGNhc2UgJGFjX3R5cGUgaW4gIygKLSAgdWludCQyX3QpIDoKLSAgICBldmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Ci1lc2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJubyI7IHRoZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19maW5kX3VpbnRYX3QKLQotIyBhY19mbl9jX2ZpbmRfaW50WF90IExJTkVOTyBCSVRTIFZBUgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBGaW5kcyBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgotIyBhY2NvcmRpbmdseS4KLWFjX2ZuX2NfZmluZF9pbnRYX3QgKCkKLXsKLSAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjawotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBpbnQkMl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQkMl90Li4uICIgPiY2OyB9Ci1pZiBldmFsIFwkeyQzKzp9IGZhbHNlOyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgZXZhbCAiJDM9bm8iCi0gICAgICMgT3JkZXIgaXMgaW1wb3J0YW50IC0gbmV2ZXIgY2hlY2sgYSB0eXBlIHRoYXQgaXMgcG90ZW50aWFsbHkgc21hbGxlcgotICAgICAjIHRoYW4gaGFsZiBvZiB0aGUgZXhwZWN0ZWQgdGFyZ2V0IHdpZHRoLgotICAgICBmb3IgYWNfdHlwZSBpbiBpbnQkMl90ICdpbnQnICdsb25nIGludCcgXAotCSAnbG9uZyBsb25nIGludCcgJ3Nob3J0IGludCcgJ3NpZ25lZCBjaGFyJzsgZG8KLSAgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotCSAgICAgZW51bSB7IE4gPSAkMiAvIDIgLSAxIH07Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKDAgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAxKSldOwotdGVzdF9hcnJheSBbMF0gPSAwOwotcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQkgICAgICAgIGVudW0geyBOID0gJDIgLyAyIC0gMSB9OwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAxKQotCQkgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAyKSldOwotdGVzdF9hcnJheSBbMF0gPSAwOwotcmV0dXJuIHRlc3RfYXJyYXkgWzBdOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLQotZWxzZQotICBjYXNlICRhY190eXBlIGluICMoCi0gIGludCQyX3QpIDoKLSAgICBldmFsICIkMz15ZXMiIDs7ICMoCi0gICopIDoKLSAgICBldmFsICIkMz1cJGFjX3R5cGUiIDs7Ci1lc2FjCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgICAgaWYgZXZhbCB0ZXN0IFwieFwkIiQzIlwiID0geCJubyI7IHRoZW4gOgotCi1lbHNlCi0gIGJyZWFrCi1maQotICAgICBkb25lCi1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9Ci0gIGV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVubwotCi19ICMgYWNfZm5fY19maW5kX2ludFhfdAotCiAjIGFjX2ZuX2NfY29tcHV0ZV9pbnQgTElORU5PIEVYUFIgVkFSIElOQ0xVREVTCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRyaWVzIHRvIGZpbmQgdGhlIGNvbXBpbGUtdGltZSB2YWx1ZSBvZiBFWFBSIGluIGEgcHJvZ3JhbSB0aGF0IGluY2x1ZGVzCkBAIC0yNDU5LDcgKzIzMzAsNyBAQAogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKLUl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy42LCB3aGljaCB3YXMKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKQEAgLTMwNDgsNyArMjkxOSw3IEBACiAgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCiAgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24zIHB5dGhvbjsgZG8KIAkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKLQkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3Qgc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDMsMykpJzsgdGhlbgorCSAgICBpZiAkaW50ZXJwIC1jICJpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCAnLicuam9pbihzdHIobikgZm9yIG4gaW4gc3lzLnZlcnNpb25faW5mb1s6Ml0pID09ICckUEFDS0FHRV9WRVJTSU9OJykiOyB0aGVuCiAJICAgICAgICBicmVhawogCSAgICBmaQogICAgICAgICAgICAgaW50ZXJwPQpAQCAtMzA4Niw3ICsyOTU3LDcgQEAKIG12IGNvbmZkZWZzLmgubmV3IGNvbmZkZWZzLmgKIAogCi1WRVJTSU9OPTMuNQorVkVSU0lPTj0zLjYKIAogIyBWZXJzaW9uIG51bWJlciBvZiBQeXRob24ncyBvd24gc2hhcmVkIGxpYnJhcnkgZmlsZS4KIApAQCAtNTI3OCw3ICs1MTQ5LDMxIEBACiAjdW5kZWYgcG93ZXJwYwogI3VuZGVmIHNwYXJjCiAjdW5kZWYgdW5peAotI2lmIGRlZmluZWQoX19saW51eF9fKQorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjIGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0xQNjRfXykKKyAgICAgICAgeDg2XzY0LWxpbnV4LWFuZHJvaWQKKyMgZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorICAgICAgICBpNjg2LWxpbnV4LWFuZHJvaWQKKyMgZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAmJiBkZWZpbmVkKF9fQUFSQ0g2NEVMX18pCisjICBpZiBkZWZpbmVkKF9fSUxQMzJfXykKKyAgICAgICAgYWFyY2g2NF9pbHAzMi1saW51eC1hbmRyb2lkCisjICBlbHNlCisgICAgICAgIGFhcmNoNjQtbGludXgtYW5kcm9pZAorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fQVJNX0VBQklfXykgJiYgZGVmaW5lZChfX0FSTUVMX18pCisgICAgICAgIGFybS1saW51eC1hbmRyb2lkZWFiaQorIyBlbGlmIGRlZmluZWQoX19taXBzX2hhcmRfZmxvYXQpICYmIGRlZmluZWQoX01JUFNFTCkKKyMgIGlmIF9NSVBTX1NJTSA9PSBfQUJJTzMyCisgICAgICAgIG1pcHNlbC1saW51eC1hbmRyb2lkCisjICBlbGlmIF9NSVBTX1NJTSA9PSBfQUJJNjQKKyAgICAgICAgbWlwczY0ZWwtbGludXgtYW5kcm9pZAorIyAgZWxzZQorIyAgIGVycm9yIHVua25vd24gcGxhdGZvcm0gdHJpcGxldAorIyAgZW5kaWYKKyMgZWxzZQorIyAgIGVycm9yIHVua25vd24gcGxhdGZvcm0gdHJpcGxldAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCiAjIGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0xQNjRfXykKICAgICAgICAgeDg2XzY0LWxpbnV4LWdudQogIyBlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX0lMUDMyX18pCkBAIC01Mzk0LDEwICs1Mjg5LDE5IEBACiAgIGlmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUICE9IHgkTVVMVElBUkNIOyB0aGVuCiAgICAgYXNfZm5fZXJyb3IgJD8gImludGVybmFsIGNvbmZpZ3VyZSBlcnJvciBmb3IgdGhlIHBsYXRmb3JtIHRyaXBsZXQsIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCIgIiRMSU5FTk8iIDUKICAgZmkKK2VsaWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgIT0geCAmJiB0ZXN0IHgkTVVMVElBUkNIID0geDsgdGhlbgorICBNVUxUSUFSQ0g9JFBMQVRGT1JNX1RSSVBMRVQKIGZpCi1QTEFURElSPXBsYXQtJE1BQ0hERVAKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBQTEFURElSPXBsYXQtJE1BQ0hERVAKK2Vsc2UKKyAgUExBVERJUj1wbGF0LSRQTEFURk9STV9UUklQTEVUCitmaQogCiAKK2lmIHRlc3QgeCRNVUxUSUFSQ0ggIT0geDsgdGhlbgorICBNVUxUSUFSQ0hfQ1BQRkxBR1M9Ii1ETVVMVElBUkNIPVxcXCIkTVVMVElBUkNIXFxcIiIKK2ZpCiAKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgLVdsLC0tbm8tYXMtbmVlZGVkIiA+JjUKQEAgLTU2OTEsNiArNTU5NSwzMiBAQAogCiAKIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGhlIEFuZHJvaWQgQVBJIGxldmVsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aGUgQW5kcm9pZCBBUEkgbGV2ZWwuLi4gIiA+JjY7IH0KK2NhdCA+PiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorX19BTkRST0lEX0FQSV9fCisjZWxzZQorI2Vycm9yIG5vdCBBbmRyb2lkCisjZW5kaWYKK0VPRgorCitpZiAkQ1BQICRDUFBGTEFHUyBjb25mdGVzdC5jID5jb25mdGVzdC5vdXQgMj4vZGV2L251bGw7IHRoZW4KKyAgQU5EUk9JRF9BUElfTEVWRUw9YGdyZXAgLXYgJ14jJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICdeICokJ2AKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRBTkRST0lEX0FQSV9MRVZFTCIgPiY1CiskYXNfZWNobyAiJEFORFJPSURfQVBJX0xFVkVMIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBBTkRST0lEX0FQSV9MRVZFTCAkQU5EUk9JRF9BUElfTEVWRUwKK19BQ0VPRgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub3QgQW5kcm9pZCIgPiY1CiskYXNfZWNobyAibm90IEFuZHJvaWQiID4mNjsgfQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Qub3V0CisKICMgQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbXMKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCiBhdGhlb3MqfExpbnV4Ki8xKikKQEAgLTY1NTQsMTMgKzY0ODQsMjAgQEAKIGlmIHRlc3QgIiRQeV9MVE8iID0gJ3RydWUnIDsgdGhlbgogICBjYXNlICRDQyBpbgogICAgICpjbGFuZyopCi0gICAgICAjIEFueSBjaGFuZ2VzIG1hZGUgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBHQ0MrRGFyd2luIGNhc2UgYmVsb3cKLSAgICAgIExUT0ZMQUdTPSItZmx0byIKKyAgICAgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KKyAgICAgICAgRGFyd2luKikKKyAgICAgICAgICAjIEFueSBjaGFuZ2VzIG1hZGUgaGVyZSBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBHQ0MrRGFyd2luIGNhc2UgYmVsb3cKKyAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8gLVdsLC1leHBvcnRfZHluYW1pYyIKKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgIExUT0ZMQUdTPSItZmx0byIKKyAgICAgICAgICA7OworICAgICAgZXNhYwogICAgICAgOzsKICAgICAqZ2NjKikKICAgICAgIGNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KICAgICAgICAgRGFyd2luKikKLSAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1XbCwtZXhwb3J0X2R5bmFtaWMiCiAgICAgICAgICAgOzsKICAgICAgICAgKikKICAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8gLWZ1c2UtbGlua2VyLXBsdWdpbiAtZmZhdC1sdG8tb2JqZWN0cyAtZmx0by1wYXJ0aXRpb249bm9uZSIKQEAgLTcwNzYsNyArNzAxMyw3IEBACiAgICAgICAgICMgQ2FsY3VsYXRlIGFuIGFwcHJvcHJpYXRlIGRlcGxveW1lbnQgdGFyZ2V0IGZvciB0aGlzIGJ1aWxkOgogICAgICAgICAjIFRoZSBkZXBsb3ltZW50IHRhcmdldCB2YWx1ZSBpcyB1c2VkIGV4cGxpY2l0bHkgdG8gZW5hYmxlIGNlcnRhaW4KICAgICAgICAgIyBmZWF0dXJlcyBhcmUgZW5hYmxlZCAoc3VjaCBhcyBidWlsdGluIGxpYmVkaXQgc3VwcG9ydCBmb3IgcmVhZGxpbmUpCi0gICAgICAgICMgdGhyb3VnaCB0aGUgdXNlIG9mIEFwcGxlJ3MgQXZhaWxhYmlsaXkgTWFjcm9zIGFuZCBpcyB1c2VkIGFzIGEKKyAgICAgICAgIyB0aHJvdWdoIHRoZSB1c2Ugb2YgQXBwbGUncyBBdmFpbGFiaWxpdHkgTWFjcm9zIGFuZCBpcyB1c2VkIGFzIGEKICAgICAgICAgIyBjb21wb25lbnQgb2YgdGhlIHN0cmluZyByZXR1cm5lZCBieSBkaXN0dXRpbHMuZ2V0X3BsYXRmb3JtKCkuCiAgICAgICAgICMKICAgICAgICAgIyBVc2UgdGhlIHZhbHVlIGZyb206CkBAIC03NTIyLDcgKzc0NTksNyBAQAogZm9yIGFjX2hlYWRlciBpbiBhc20vdHlwZXMuaCBjb25pby5oIGRpcmVjdC5oIGRsZmNuLmggZXJybm8uaCBcCiBmY250bC5oIGdycC5oIFwKIGllZWVmcC5oIGlvLmggbGFuZ2luZm8uaCBsaWJpbnRsLmggcHJvY2Vzcy5oIHB0aHJlYWQuaCBcCi1zY2hlZC5oIHNoYWRvdy5oIHNpZ25hbC5oIHN0ZGludC5oIHN0cm9wdHMuaCB0ZXJtaW9zLmggXAorc2NoZWQuaCBzaGFkb3cuaCBzaWduYWwuaCBzdHJvcHRzLmggdGVybWlvcy5oIFwKIHVuaXN0ZC5oIHV0aW1lLmggXAogcG9sbC5oIHN5cy9kZXZwb2xsLmggc3lzL2Vwb2xsLmggc3lzL3BvbGwuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy94YXR0ci5oIHN5cy9ic2R0dHkuaCBzeXMvZXZlbnQuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIFwKQEAgLTc5NTksNiArNzg5NiwxMSBAQAogICB1c2VfbGZzPW5vCiBmaQogCisjIERvbid0IHVzZSBsYXJnZWZpbGUgc3VwcG9ydCBmb3IgR05VL0h1cmQKK2Nhc2UgJGFjX3N5c19zeXN0ZW0gaW4gR05VKikKKyAgdXNlX2xmcz1ubworZXNhYworCiBpZiB0ZXN0ICIkdXNlX2xmcyIgPSAieWVzIjsgdGhlbgogIyBUd28gZGVmaW5lcyBuZWVkZWQgdG8gZW5hYmxlIGxhcmdlZmlsZSBzdXBwb3J0IG9uIHZhcmlvdXMgcGxhdGZvcm1zCiAjIFRoZXNlIG1heSBhZmZlY3Qgc29tZSB0eXBlZGVmcwpAQCAtODA2NSw5NSArODAwNyw2IEBACiBmaQogCiAKLSMgVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBjaGVja3MgZm9yIGVhY2ggb2YgdGhlIGV4YWN0LXdpZHRoIGludGVnZXIgdHlwZXMgd2UKLSMgbmVlZC4gIEZpcnN0IHdlIGNoZWNrIHdoZXRoZXIgdGhlIHR5cGUgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSB1c3VhbAotIyBBQ19DSEVDS19UWVBFIG1hY3JvIHdpdGggdGhlIGRlZmF1bHQgaW5jbHVkZXMgKHdoaWNoIGluY2x1ZGVzIDxpbnR0eXBlcy5oPgotIyBhbmQgPHN0ZGludC5oPiB3aGVyZSBhdmFpbGFibGUpLiAgV2UgdGhlbiBhbHNvIHVzZSB0aGUgc3BlY2lhbCB0eXBlIGNoZWNrcyBvZgotIyB0aGUgZm9ybSBBQ19UWVBFX1VJTlQzMl9ULCB3aGljaCBpbiB0aGUgY2FzZSB0aGF0IHVpbnQzMl90IGlzIG5vdCBhdmFpbGFibGUKLSMgZGlyZWN0bHksICNkZWZpbmUncyB1aW50MzJfdCB0byBiZSBhIHN1aXRhYmxlIHR5cGUuCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVpbnQzMl90IiAiYWNfY3ZfdHlwZV91aW50MzJfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgotaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQzMl90IiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1hY19mbl9jX2ZpbmRfdWludFhfdCAiJExJTkVOTyIgIjMyIiAiYWNfY3ZfY191aW50MzJfdCIKLWNhc2UgJGFjX2N2X2NfdWludDMyX3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQotCi0kYXNfZWNobyAiI2RlZmluZSBfVUlOVDMyX1QgMSIgPj5jb25mZGVmcy5oCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSB1aW50MzJfdCAkYWNfY3ZfY191aW50MzJfdAotX0FDRU9GCi07OwotICBlc2FjCi0KLQotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludDY0X3QiICJhY19jdl90eXBlX3VpbnQ2NF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDY0X3QiID0geHllczsgdGhlbiA6Ci0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfVUlOVDY0X1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiNjQiICJhY19jdl9jX3VpbnQ2NF90IgotY2FzZSAkYWNfY3ZfY191aW50NjRfdCBpbiAjKAotICBub3x5ZXMpIDs7ICMoCi0gICopCi0KLSRhc19lY2hvICIjZGVmaW5lIF9VSU5UNjRfVCAxIiA+PmNvbmZkZWZzLmgKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIHVpbnQ2NF90ICRhY19jdl9jX3VpbnQ2NF90Ci1fQUNFT0YKLTs7Ci0gIGVzYWMKLQotCi1hY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnQzMl90IiAiYWNfY3ZfdHlwZV9pbnQzMl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCi1pZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50MzJfdCIgPSB4eWVzOyB0aGVuIDoKLQotJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9JTlQzMl9UIDEiID4+Y29uZmRlZnMuaAotCi1maQotCi1hY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiMzIiICJhY19jdl9jX2ludDMyX3QiCi1jYXNlICRhY19jdl9jX2ludDMyX3QgaW4gIygKLSAgbm98eWVzKSA7OyAjKAotICAqKQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGludDMyX3QgJGFjX2N2X2NfaW50MzJfdAotX0FDRU9GCi07OwotZXNhYwotCi0KLWFjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludDY0X3QiICJhY19jdl90eXBlX2ludDY0X3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQ2NF90IiA9IHh5ZXM7IHRoZW4gOgotCi0kYXNfZWNobyAiI2RlZmluZSBIQVZFX0lOVDY0X1QgMSIgPj5jb25mZGVmcy5oCi0KLWZpCi0KLWFjX2ZuX2NfZmluZF9pbnRYX3QgIiRMSU5FTk8iICI2NCIgImFjX2N2X2NfaW50NjRfdCIKLWNhc2UgJGFjX2N2X2NfaW50NjRfdCBpbiAjKAotICBub3x5ZXMpIDs7ICMoCi0gICopCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgaW50NjRfdCAkYWNfY3ZfY19pbnQ2NF90Ci1fQUNFT0YKLTs7Ci1lc2FjCi0KLQogYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAic3NpemVfdCIgImFjX2N2X3R5cGVfc3NpemVfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgogaWYgdGVzdCAieCRhY19jdl90eXBlX3NzaXplX3QiID0geHllczsgdGhlbiA6CiAKQEAgLTgyNDEsNiArODA5NCwzOSBAQAogIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCiAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2ZfbG9uZ19sb25nKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBsb25nKSkiICJhY19jdl9zaXplb2ZfbG9uZ19sb25nIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisKK2Vsc2UKKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorICAgZmkKK2ZpCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nX2xvbmciID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjY7IH0KKworCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZworX0FDRU9GCisKKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgc2l6ZSBvZiB2b2lkICoiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB2b2lkICouLi4gIiA+JjY7IH0KIGlmICR7YWNfY3Zfc2l6ZW9mX3ZvaWRfcCs6fSBmYWxzZTsgdGhlbiA6CkBAIC04NDY4LDY3ICs4MzU0LDM5IEBACiBfQUNFT0YKIAogCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydC4uLiAiID4mNjsgfQotaGF2ZV9sb25nX2xvbmc9bm8KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci1sb25nIGxvbmcgeDsgeCA9IChsb25nIGxvbmcpMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi0KLSRhc19lY2hvICIjZGVmaW5lIEhBVkVfTE9OR19MT05HIDEiID4+Y29uZmRlZnMuaAotCi0gIGhhdmVfbG9uZ19sb25nPXllcwotCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGhhdmVfbG9uZ19sb25nIiA+JjUKLSRhc19lY2hvICIkaGF2ZV9sb25nX2xvbmciID4mNjsgfQotaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcyA7IHRoZW4KICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nLi4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl9sb25nX2xvbmcrOn0gZmFsc2U7IHRoZW4gOgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBzaXplIG9mIHVpbnRwdHJfdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBzaXplIG9mIHVpbnRwdHJfdC4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zaXplb2ZfdWludHB0cl90Kzp9IGZhbHNlOyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgaWYgYWNfZm5fY19jb21wdXRlX2ludCAiJExJTkVOTyIgIihsb25nIGludCkgKHNpemVvZiAobG9uZyBsb25nKSkiICJhY19jdl9zaXplb2ZfbG9uZ19sb25nIiAgICAgICAgIiRhY19pbmNsdWRlc19kZWZhdWx0IjsgdGhlbiA6CisgIGlmIGFjX2ZuX2NfY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIobG9uZyBpbnQpIChzaXplb2YgKHVpbnRwdHJfdCkpIiAiYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCIgICAgICAgICIkYWNfaW5jbHVkZXNfZGVmYXVsdCI7IHRoZW4gOgogCiBlbHNlCi0gIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfdWludHB0cl90IiA9IHllczsgdGhlbgogICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KLWFzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKK2FzX2ZuX2Vycm9yIDc3ICJjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHVpbnRwdHJfdCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1OyB9CiAgICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorICAgICBhY19jdl9zaXplb2ZfdWludHB0cl90PTAKICAgIGZpCiBmaQogCiBmaQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjUKLSRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NpemVvZl91aW50cHRyX3QiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zaXplb2ZfdWludHB0cl90IiA+JjY7IH0KIAogCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZworI2RlZmluZSBTSVpFT0ZfVUlOVFBUUl9UICRhY19jdl9zaXplb2ZfdWludHB0cl90CiBfQUNFT0YKIAogCi1maQogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0Li4uICIgPiY2OyB9CkBAIC04NjUzLDU1ICs4NTExLDYgQEAKIAogZmkKIAotYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidWludHB0cl90IiAiYWNfY3ZfdHlwZV91aW50cHRyX3QiICIjaWZkZWYgSEFWRV9TVERJTlRfSAotICAgICAgICAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0gICAgICAgICNlbmRpZgotICAgICAgICAjaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0gICAgICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotICAgICAgICAjZW5kaWYKLSIKLWlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50cHRyX3QiID0geHllczsgdGhlbiA6Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9VSU5UUFRSX1QgMQotX0FDRU9GCi0KLSMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCi0jIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCi0jIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KLSMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHNpemUgb2YgdWludHB0cl90IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2YgdWludHB0cl90Li4uICIgPiY2OyB9Ci1pZiAke2FjX2N2X3NpemVvZl91aW50cHRyX3QrOn0gZmFsc2U7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiBhY19mbl9jX2NvbXB1dGVfaW50ICIkTElORU5PIiAiKGxvbmcgaW50KSAoc2l6ZW9mICh1aW50cHRyX3QpKSIgImFjX2N2X3NpemVvZl91aW50cHRyX3QiICAgICAgICAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiOyB0aGVuIDoKLQotZWxzZQotICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV91aW50cHRyX3QiID0geWVzOyB0aGVuCi0gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQotJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQotYXNfZm5fZXJyb3IgNzcgImNhbm5vdCBjb21wdXRlIHNpemVvZiAodWludHB0cl90KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDU7IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdD0wCi0gICBmaQotZmkKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3NpemVvZl91aW50cHRyX3QiID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfVUlOVFBUUl9UICRhY19jdl9zaXplb2ZfdWludHB0cl90Ci1fQUNFT0YKLQotCi1maQotCi0KICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KQEAgLTg3NDMsOCArODU1Miw2IEBACiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGFyZ2UgZmlsZSBzdXBwb3J0IiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcwotdGhlbgogaWYgdGVzdCAiJGFjX2N2X3NpemVvZl9vZmZfdCIgLWd0ICIkYWNfY3Zfc2l6ZW9mX2xvbmciIC1hIFwKIAkiJGFjX2N2X3NpemVvZl9sb25nX2xvbmciIC1nZSAiJGFjX2N2X3NpemVvZl9vZmZfdCI7IHRoZW4KIApAQCAtODc1NiwxMCArODU2Myw2IEBACiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQogCiAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwpAQCAtMTI4NDEsNiArMTI2NDQsMzMgQEAKIAogZmkKIAorYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3QgcGFzc3dkIiAicHdfZ2Vjb3MiICJhY19jdl9tZW1iZXJfc3RydWN0X3Bhc3N3ZF9wd19nZWNvcyIgIgorICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxwd2QuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3Bhc3N3ZF9wd19nZWNvcyIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfR0VDT1MgMQorX0FDRU9GCisKKworZmkKK2FjX2ZuX2NfY2hlY2tfbWVtYmVyICIkTElORU5PIiAic3RydWN0IHBhc3N3ZCIgInB3X3Bhc3N3ZCIgImFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X3Bhc3N3ZCIgIgorICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxwd2QuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9tZW1iZXJfc3RydWN0X3Bhc3N3ZF9wd19wYXNzd2QiID0geHllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX1BBU1NXRCAxCitfQUNFT0YKKworCitmaQorCiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHRpbWUuaCB0aGF0IGRlZmluZXMgYWx0em9uZSIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lLi4uICIgPiY2OyB9CkBAIC0xMjk3Miw2ICsxMjgwMiw0MSBAQAogCiBmaQogCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzb2NrYWRkcl9hbGciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHNvY2thZGRyX2FsZy4uLiAiID4mNjsgfQoraWYgJHthY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnKzp9IGZhbHNlOyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMJCWluY2x1ZGUgPGxpbnV4L2lmX2FsZy5oPgoraW50CittYWluICgpCit7CitzdHJ1Y3Qgc29ja2FkZHJfYWxnIHMKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnPXllcworZWxzZQorICBhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9hbGciID4mNQorJGFzX2VjaG8gIiRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9hbGcgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TT0NLQUREUl9BTEcgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKICMgY2hlY2tzIGZvciBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQiID4mNQpAQCAtMTQxNTEsNiArMTQwMTYsODUgQEAKIAogZmkKIAorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9MQVpZIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTEFaWSIgIiNpbmNsdWRlIDxkbGZjbi5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfUlRMRF9MQVpZIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9MQVpZICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9OT1ciICJhY19jdl9oYXZlX2RlY2xfUlRMRF9OT1ciICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9XIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9OT1cgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX0dMT0JBTCIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0dMT0JBTCIgIiNpbmNsdWRlIDxkbGZjbi5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfUlRMRF9HTE9CQUwiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX0dMT0JBTCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTE9DQUwiICJhY19jdl9oYXZlX2RlY2xfUlRMRF9MT0NBTCIgIiNpbmNsdWRlIDxkbGZjbi5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfUlRMRF9MT0NBTCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTE9DQUwgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX05PREVMRVRFIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9ERUxFVEUiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9ERUxFVEUiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX05PREVMRVRFICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9OT0xPQUQiICJhY19jdl9oYXZlX2RlY2xfUlRMRF9OT0xPQUQiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9MT0FEIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9OT0xPQUQgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX0RFRVBCSU5EIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfREVFUEJJTkQiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfREVFUEJJTkQiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX0RFRVBCSU5EICRhY19oYXZlX2RlY2wKK19BQ0VPRgorCisKICMgZGV0ZXJtaW5lIHdoYXQgc2l6ZSBkaWdpdCB0byB1c2UgZm9yIFB5dGhvbidzIGxvbmdzCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGRpZ2l0IHNpemUgZm9yIFB5dGhvbidzIGxvbmdzIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGRpZ2l0IHNpemUgZm9yIFB5dGhvbidzIGxvbmdzLi4uICIgPiY2OyB9CkBAIC0xNDU4NCw3ICsxNDUyOCwxMSBAQAogJGFzX2VjaG8gIiRMRFZFUlNJT04iID4mNjsgfQogCiAKLUxJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIExJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgorZWxzZQorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfS0ke1BMQVRGT1JNX1RSSVBMRVR9IgorZmkKIAogCiAjIENoZWNrIHdoZXRoZXIgcmlnaHQgc2hpZnRpbmcgYSBuZWdhdGl2ZSBpbnRlZ2VyIGV4dGVuZHMgdGhlIHNpZ24gYml0CkBAIC0xNTY1NywzMiArMTU2MDUsMzAgQEAKIAogZmkKIAotaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcwotdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAlbGxkIGFuZCAlbGx1IHByaW50ZigpIGZvcm1hdCBzdXBwb3J0IiA+JjUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICVsbGQgYW5kICVsbHUgcHJpbnRmKCkgZm9ybWF0IHN1cHBvcnQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICVsbGQgYW5kICVsbHUgcHJpbnRmKCkgZm9ybWF0IHN1cHBvcnQuLi4gIiA+JjY7IH0KLSAgaWYgJHthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQrOn0gZmFsc2U7IHRoZW4gOgoraWYgJHthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQrOn0gZmFsc2U7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CiAgIGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD0iY3Jvc3MgLS0gYXNzdW1pbmcgbm8iCi0gICBpZiB0ZXN0IHgkR0NDID0geHllczsgdGhlbgotICAgIHNhdmVfQ0ZMQUdTPSRDRkxBR1MKLSAgICBDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV2Zvcm1hdCIKLSAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0IHgkR0NDID0geHllczsgdGhlbgorc2F2ZV9DRkxBR1M9JENGTEFHUworQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdmb3JtYXQiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLSAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gICAgICAgICNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiBpbnQKIG1haW4gKCkKIHsKIAotICAgICAgY2hhciAqYnVmZmVyOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZyktMTIzKTsKLSAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKTsKK2NoYXIgKmJ1ZmZlcjsKK3NwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpMTIzKTsKK3NwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpLTEyMyk7CitzcHJpbnRmKGJ1ZmZlciwgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKTEyMyk7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTE1NjkzLDQxICsxNTYzOSw0MSBAQAogCiBmaQogcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gICAgQ0ZMQUdTPSRzYXZlX0NGTEFHUwotICAgZmkKK0NGTEFHUz0kc2F2ZV9DRkxBR1MKK2ZpCiBlbHNlCiAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotICAjaW5jbHVkZSA8c3RkaW8uaD4KLSAgI2luY2x1ZGUgPHN0ZGRlZi5oPgotICAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotICAjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0gICNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgogCi0gIGludCBtYWluKCkKLSAgewotICAgICAgY2hhciBidWZmZXJbMjU2XTsKK2ludCBtYWluKCkKK3sKK2NoYXIgYnVmZmVyWzI1Nl07CiAKLSAgICAgIGlmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKTEyMykgPCAwKQotICAgICAgICAgIHJldHVybiAxOwotICAgICAgaWYgKHN0cmNtcChidWZmZXIsICIxMjMiKSkKLSAgICAgICAgICByZXR1cm4gMTsKK2lmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKTEyMykgPCAwKQorcmV0dXJuIDE7CitpZiAoc3RyY21wKGJ1ZmZlciwgIjEyMyIpKQorcmV0dXJuIDE7CiAKLSAgICAgIGlmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKS0xMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiLTEyMyIpKQotICAgICAgICAgIHJldHVybiAxOworaWYgKHNwcmludGYoYnVmZmVyLCAiJWxsZCIsIChsb25nIGxvbmcpLTEyMykgPCAwKQorcmV0dXJuIDE7CitpZiAoc3RyY21wKGJ1ZmZlciwgIi0xMjMiKSkKK3JldHVybiAxOwogCi0gICAgICBpZiAoc3ByaW50ZihidWZmZXIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykxMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiMTIzIikpCi0gICAgICAgICAgcmV0dXJuIDE7CitpZiAoc3ByaW50ZihidWZmZXIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykxMjMpIDwgMCkKK3JldHVybiAxOworaWYgKHN0cmNtcChidWZmZXIsICIxMjMiKSkKK3JldHVybiAxOwogCi0gICAgICByZXR1cm4gMDsKLSAgfQorcmV0dXJuIDA7Cit9CiAKIF9BQ0VPRgogaWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CkBAIC0xNTc0Miw5ICsxNTY4OCw4IEBACiAKIGZpCiAKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQiID4mNQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQiID4mNQogJGFzX2VjaG8gIiRhY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQiID4mNjsgfQotZmkKIAogaWYgdGVzdCAiJGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCIgPSB5ZXMKIHRoZW4KQEAgLTE2ODI2LDcgKzE2NzcxLDcgQEAKICMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgogIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KIGFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjYsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwpAQCAtMTY4ODgsNyArMTY4MzMsNyBAQAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiBhY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgogYWNfY3NfdmVyc2lvbj0iXFwKLXB5dGhvbiBjb25maWcuc3RhdHVzIDMuNQorcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy42CiBjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCiAgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggZmIyYWU2Ny4uNzg2Nzk2YSAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMyw3ICszLDcgQEAKIGRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAjIFNldCBWRVJTSU9OIHNvIHdlIG9ubHkgbmVlZCB0byBlZGl0IGluIG9uZSBwbGFjZSAoaS5lLiwgaGVyZSkKLW00X2RlZmluZShQWVRIT05fVkVSU0lPTiwgMy41KQorbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjYpCiAKIEFDX1BSRVJFUSgyLjY1KQogCkBAIC02OSw3ICs2OSw3IEBACiAgICAgaWYgdGVzdCAteiAiJFBZVEhPTl9GT1JfQlVJTEQiOyB0aGVuCiAgICAgICAgIGZvciBpbnRlcnAgaW4gcHl0aG9uJFBBQ0tBR0VfVkVSU0lPTiBweXRob24zIHB5dGhvbjsgZG8KIAkgICAgd2hpY2ggJGludGVycCA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKLQkgICAgaWYgJGludGVycCAtYyAnaW1wb3J0IHN5cztzeXMuZXhpdChub3Qgc3lzLnZlcnNpb25faW5mb0A8OkA6MkA6PkAgPj0gKDMsMykpJzsgdGhlbgorCSAgICBpZiAkaW50ZXJwIC1jICJpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCAnLicuam9pbihzdHIobikgZm9yIG4gaW4gc3lzLnZlcnNpb25faW5mb0A8OkA6MkA6PkApID09ICckUEFDS0FHRV9WRVJTSU9OJykiOyB0aGVuCiAJICAgICAgICBicmVhawogCSAgICBmaQogICAgICAgICAgICAgaW50ZXJwPQpAQCAtNzY4LDcgKzc2OCwzMSBAQAogI3VuZGVmIHBvd2VycGMKICN1bmRlZiBzcGFyYwogI3VuZGVmIHVuaXgKLSNpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorIyBpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19MUDY0X18pCisgICAgICAgIHg4Nl82NC1saW51eC1hbmRyb2lkCisjIGVsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgICAgICAgaTY4Ni1saW51eC1hbmRyb2lkCisjIGVsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgZGVmaW5lZChfX0FBUkNINjRFTF9fKQorIyAgaWYgZGVmaW5lZChfX0lMUDMyX18pCisgICAgICAgIGFhcmNoNjRfaWxwMzItbGludXgtYW5kcm9pZAorIyAgZWxzZQorICAgICAgICBhYXJjaDY0LWxpbnV4LWFuZHJvaWQKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0FSTV9FQUJJX18pICYmIGRlZmluZWQoX19BUk1FTF9fKQorICAgICAgICBhcm0tbGludXgtYW5kcm9pZGVhYmkKKyMgZWxpZiBkZWZpbmVkKF9fbWlwc19oYXJkX2Zsb2F0KSAmJiBkZWZpbmVkKF9NSVBTRUwpCisjICBpZiBfTUlQU19TSU0gPT0gX0FCSU8zMgorICAgICAgICBtaXBzZWwtbGludXgtYW5kcm9pZAorIyAgZWxpZiBfTUlQU19TSU0gPT0gX0FCSTY0CisgICAgICAgIG1pcHM2NGVsLWxpbnV4LWFuZHJvaWQKKyMgIGVsc2UKKyMgICBlcnJvciB1bmtub3duIHBsYXRmb3JtIHRyaXBsZXQKKyMgIGVuZGlmCisjIGVsc2UKKyMgICBlcnJvciB1bmtub3duIHBsYXRmb3JtIHRyaXBsZXQKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQogIyBpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19MUDY0X18pCiAgICAgICAgIHg4Nl82NC1saW51eC1nbnUKICMgZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIGRlZmluZWQoX19JTFAzMl9fKQpAQCAtODgyLDExICs5MDYsMjAgQEAKICAgaWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgIT0geCRNVUxUSUFSQ0g7IHRoZW4KICAgICBBQ19NU0dfRVJST1IoW2ludGVybmFsIGNvbmZpZ3VyZSBlcnJvciBmb3IgdGhlIHBsYXRmb3JtIHRyaXBsZXQsIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydF0pCiAgIGZpCitlbGlmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUICE9IHggJiYgdGVzdCB4JE1VTFRJQVJDSCA9IHg7IHRoZW4KKyAgTVVMVElBUkNIPSRQTEFURk9STV9UUklQTEVUCiBmaQotUExBVERJUj1wbGF0LSRNQUNIREVQCitpZiB0ZXN0IHgkUExBVEZPUk1fVFJJUExFVCA9IHg7IHRoZW4KKyAgUExBVERJUj1wbGF0LSRNQUNIREVQCitlbHNlCisgIFBMQVRESVI9cGxhdC0kUExBVEZPUk1fVFJJUExFVAorZmkKIEFDX1NVQlNUKFBMQVRESVIpCiBBQ19TVUJTVChQTEFURk9STV9UUklQTEVUKQotCitpZiB0ZXN0IHgkTVVMVElBUkNIICE9IHg7IHRoZW4KKyAgTVVMVElBUkNIX0NQUEZMQUdTPSItRE1VTFRJQVJDSD1cXFwiJE1VTFRJQVJDSFxcXCIiCitmaQorQUNfU1VCU1QoTVVMVElBUkNIX0NQUEZMQUdTKQogCiBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtV2wsLS1uby1hcy1uZWVkZWRdKQogc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKQEAgLTkwMyw2ICs5MzYsMjUgQEAKICMgY2hlY2tzIGZvciBVTklYIHZhcmlhbnRzIHRoYXQgc2V0IEMgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwogQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TCiAKK0FDX01TR19DSEVDS0lORyhbZm9yIHRoZSBBbmRyb2lkIEFQSSBsZXZlbF0pCitjYXQgPj4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KK19fQU5EUk9JRF9BUElfXworI2Vsc2UKKyNlcnJvciBub3QgQW5kcm9pZAorI2VuZGlmCitFT0YKKworaWYgJENQUCAkQ1BQRkxBR1MgY29uZnRlc3QuYyA+Y29uZnRlc3Qub3V0IDI+L2Rldi9udWxsOyB0aGVuCisgIEFORFJPSURfQVBJX0xFVkVMPWBncmVwIC12ICdeIycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAnXiAqJCdgCisgIEFDX01TR19SRVNVTFQoWyRBTkRST0lEX0FQSV9MRVZFTF0pCisgIEFDX0RFRklORV9VTlFVT1RFRChBTkRST0lEX0FQSV9MRVZFTCwgJEFORFJPSURfQVBJX0xFVkVMLCBbVGhlIEFuZHJvaWQgQVBJIGxldmVsLl0pCitlbHNlCisgIEFDX01TR19SRVNVTFQoW25vdCBBbmRyb2lkXSkKK2ZpCitybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0Lm91dAorCiAjIENoZWNrIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW1zCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgogYXRoZW9zKnxMaW51eCovMSopCkBAIC0xMjQ3LDEzICsxMjk5LDIwIEBACiBpZiB0ZXN0ICIkUHlfTFRPIiA9ICd0cnVlJyA7IHRoZW4KICAgY2FzZSAkQ0MgaW4KICAgICAqY2xhbmcqKQotICAgICAgIyBBbnkgY2hhbmdlcyBtYWRlIGhlcmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgR0NDK0RhcndpbiBjYXNlIGJlbG93Ci0gICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICBjYXNlICRhY19zeXNfc3lzdGVtIGluCisgICAgICAgIERhcndpbiopCisgICAgICAgICAgIyBBbnkgY2hhbmdlcyBtYWRlIGhlcmUgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgR0NDK0RhcndpbiBjYXNlIGJlbG93CisgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1XbCwtZXhwb3J0X2R5bmFtaWMiCisgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICBMVE9GTEFHUz0iLWZsdG8iCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKICAgICAgIDs7CiAgICAgKmdjYyopCiAgICAgICBjYXNlICRhY19zeXNfc3lzdGVtIGluCiAgICAgICAgIERhcndpbiopCi0gICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIgorICAgICAgICAgIExUT0ZMQUdTPSItZmx0byAtV2wsLWV4cG9ydF9keW5hbWljIgogICAgICAgICAgIDs7CiAgICAgICAgICopCiAgICAgICAgICAgTFRPRkxBR1M9Ii1mbHRvIC1mdXNlLWxpbmtlci1wbHVnaW4gLWZmYXQtbHRvLW9iamVjdHMgLWZsdG8tcGFydGl0aW9uPW5vbmUiCkBAIC0xNjExLDcgKzE2NzAsNyBAQAogICAgICAgICAjIENhbGN1bGF0ZSBhbiBhcHByb3ByaWF0ZSBkZXBsb3ltZW50IHRhcmdldCBmb3IgdGhpcyBidWlsZDoKICAgICAgICAgIyBUaGUgZGVwbG95bWVudCB0YXJnZXQgdmFsdWUgaXMgdXNlZCBleHBsaWNpdGx5IHRvIGVuYWJsZSBjZXJ0YWluCiAgICAgICAgICMgZmVhdHVyZXMgYXJlIGVuYWJsZWQgKHN1Y2ggYXMgYnVpbHRpbiBsaWJlZGl0IHN1cHBvcnQgZm9yIHJlYWRsaW5lKQotICAgICAgICAjIHRocm91Z2ggdGhlIHVzZSBvZiBBcHBsZSdzIEF2YWlsYWJpbGl5IE1hY3JvcyBhbmQgaXMgdXNlZCBhcyBhCisgICAgICAgICMgdGhyb3VnaCB0aGUgdXNlIG9mIEFwcGxlJ3MgQXZhaWxhYmlsaXR5IE1hY3JvcyBhbmQgaXMgdXNlZCBhcyBhCiAgICAgICAgICMgY29tcG9uZW50IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgZGlzdHV0aWxzLmdldF9wbGF0Zm9ybSgpLgogICAgICAgICAjCiAgICAgICAgICMgVXNlIHRoZSB2YWx1ZSBmcm9tOgpAQCAtMTg2Niw3ICsxOTI1LDcgQEAKIEFDX0NIRUNLX0hFQURFUlMoYXNtL3R5cGVzLmggY29uaW8uaCBkaXJlY3QuaCBkbGZjbi5oIGVycm5vLmggXAogZmNudGwuaCBncnAuaCBcCiBpZWVlZnAuaCBpby5oIGxhbmdpbmZvLmggbGliaW50bC5oIHByb2Nlc3MuaCBwdGhyZWFkLmggXAotc2NoZWQuaCBzaGFkb3cuaCBzaWduYWwuaCBzdGRpbnQuaCBzdHJvcHRzLmggdGVybWlvcy5oIFwKK3NjaGVkLmggc2hhZG93Lmggc2lnbmFsLmggc3Ryb3B0cy5oIHRlcm1pb3MuaCBcCiB1bmlzdGQuaCB1dGltZS5oIFwKIHBvbGwuaCBzeXMvZGV2cG9sbC5oIHN5cy9lcG9sbC5oIHN5cy9wb2xsLmggXAogc3lzL2F1ZGlvaW8uaCBzeXMveGF0dHIuaCBzeXMvYnNkdHR5Lmggc3lzL2V2ZW50Lmggc3lzL2ZpbGUuaCBzeXMvaW9jdGwuaCBcCkBAIC0xOTczLDYgKzIwMzIsMTEgQEAKICAgdXNlX2xmcz1ubwogZmkKIAorIyBEb24ndCB1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgZm9yIEdOVS9IdXJkCitjYXNlICRhY19zeXNfc3lzdGVtIGluIEdOVSopCisgIHVzZV9sZnM9bm8KK2VzYWMKKwogaWYgdGVzdCAiJHVzZV9sZnMiID0gInllcyI7IHRoZW4KICMgVHdvIGRlZmluZXMgbmVlZGVkIHRvIGVuYWJsZSBsYXJnZWZpbGUgc3VwcG9ydCBvbiB2YXJpb3VzIHBsYXRmb3JtcwogIyBUaGVzZSBtYXkgYWZmZWN0IHNvbWUgdHlwZWRlZnMKQEAgLTIwMDMsMjkgKzIwNjcsNiBAQAogQUNfVFlQRV9TSVpFX1QKIEFDX1RZUEVfVUlEX1QKIAotIyBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGNoZWNrcyBmb3IgZWFjaCBvZiB0aGUgZXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyB3ZQotIyBuZWVkLiAgRmlyc3Qgd2UgY2hlY2sgd2hldGhlciB0aGUgdHlwZSBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIHVzdWFsCi0jIEFDX0NIRUNLX1RZUEUgbWFjcm8gd2l0aCB0aGUgZGVmYXVsdCBpbmNsdWRlcyAod2hpY2ggaW5jbHVkZXMgPGludHR5cGVzLmg+Ci0jIGFuZCA8c3RkaW50Lmg+IHdoZXJlIGF2YWlsYWJsZSkuICBXZSB0aGVuIGFsc28gdXNlIHRoZSBzcGVjaWFsIHR5cGUgY2hlY2tzIG9mCi0jIHRoZSBmb3JtIEFDX1RZUEVfVUlOVDMyX1QsIHdoaWNoIGluIHRoZSBjYXNlIHRoYXQgdWludDMyX3QgaXMgbm90IGF2YWlsYWJsZQotIyBkaXJlY3RseSwgI2RlZmluZSdzIHVpbnQzMl90IHRvIGJlIGEgc3VpdGFibGUgdHlwZS4KLQotQUNfQ0hFQ0tfVFlQRSh1aW50MzJfdCwKLSAgQUNfREVGSU5FKEhBVkVfVUlOVDMyX1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50MzJfdC5dKSwsKQotQUNfVFlQRV9VSU5UMzJfVAotCi1BQ19DSEVDS19UWVBFKHVpbnQ2NF90LAotICBBQ19ERUZJTkUoSEFWRV9VSU5UNjRfVCwgMSwgW0RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQ2NF90Ll0pLCwpCi1BQ19UWVBFX1VJTlQ2NF9UCi0KLUFDX0NIRUNLX1RZUEUoaW50MzJfdCwKLSAgQUNfREVGSU5FKEhBVkVfSU5UMzJfVCwgMSwgW0RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGludDMyX3QuXSksLCkKLUFDX1RZUEVfSU5UMzJfVAotCi1BQ19DSEVDS19UWVBFKGludDY0X3QsCi0gIEFDX0RFRklORShIQVZFX0lOVDY0X1QsIDEsIFtEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBpbnQ2NF90Ll0pLCwpCi1BQ19UWVBFX0lOVDY0X1QKLQogQUNfQ0hFQ0tfVFlQRShzc2l6ZV90LAogICBBQ19ERUZJTkUoSEFWRV9TU0laRV9ULCAxLCBbRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgc3NpemVfdF0pLCwpCiBBQ19DSEVDS19UWVBFKF9fdWludDEyOF90LApAQCAtMjAzNSw2ICsyMDc2LDcgQEAKICMgQU5TSSBDIHJlcXVpcmVzIHNpemVvZihjaGFyKSA9PSAxLCBzbyBubyBuZWVkIHRvIGNoZWNrIGl0CiBBQ19DSEVDS19TSVpFT0YoaW50LCA0KQogQUNfQ0hFQ0tfU0laRU9GKGxvbmcsIDQpCitBQ19DSEVDS19TSVpFT0YobG9uZyBsb25nLCA4KQogQUNfQ0hFQ0tfU0laRU9GKHZvaWQgKiwgNCkKIEFDX0NIRUNLX1NJWkVPRihzaG9ydCwgMikKIEFDX0NIRUNLX1NJWkVPRihmbG9hdCwgNCkKQEAgLTIwNDIsMTcgKzIwODQsNyBAQAogQUNfQ0hFQ0tfU0laRU9GKGZwb3NfdCwgNCkKIEFDX0NIRUNLX1NJWkVPRihzaXplX3QsIDQpCiBBQ19DSEVDS19TSVpFT0YocGlkX3QsIDQpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgbG9uZyBsb25nIHN1cHBvcnQpCi1oYXZlX2xvbmdfbG9uZz1ubwotQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLCBbW2xvbmcgbG9uZyB4OyB4ID0gKGxvbmcgbG9uZykwO11dKV0sWwotICBBQ19ERUZJTkUoSEFWRV9MT05HX0xPTkcsIDEsIFtEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgdHlwZSBsb25nIGxvbmcuXSkKLSAgaGF2ZV9sb25nX2xvbmc9eWVzCi1dLFtdKQotQUNfTVNHX1JFU1VMVCgkaGF2ZV9sb25nX2xvbmcpCi1pZiB0ZXN0ICIkaGF2ZV9sb25nX2xvbmciID0geWVzIDsgdGhlbgotQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZywgOCkKLWZpCitBQ19DSEVDS19TSVpFT0YodWludHB0cl90KQogCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQpCiBoYXZlX2xvbmdfZG91YmxlPW5vCkBAIC0yMDc3LDE1ICsyMTA5LDYgQEAKIEFDX0NIRUNLX1NJWkVPRihfQm9vbCwgMSkKIGZpCiAKLUFDX0NIRUNLX1RZUEVTKHVpbnRwdHJfdCwKLSAgIFtBQ19DSEVDS19TSVpFT0YodWludHB0cl90LCA0KV0sCi0gICBbXSwgWyNpZmRlZiBIQVZFX1NURElOVF9ICi0gICAgICAgICNpbmNsdWRlIDxzdGRpbnQuaD4KLSAgICAgICAgI2VuZGlmCi0gICAgICAgICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSAgICAgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0gICAgICAgICNlbmRpZl0pCi0KIEFDX0NIRUNLX1NJWkVPRihvZmZfdCwgW10sIFsKICNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yMDkzLDggKzIxMTYsNiBAQAogXSkKIAogQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydCkKLWlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMKLXRoZW4KIGlmIHRlc3QgIiRhY19jdl9zaXplb2Zfb2ZmX3QiIC1ndCAiJGFjX2N2X3NpemVvZl9sb25nIiAtYSBcCiAJIiRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiAtZ2UgIiRhY19jdl9zaXplb2Zfb2ZmX3QiOyB0aGVuCiAgIEFDX0RFRklORShIQVZFX0xBUkdFRklMRV9TVVBQT1JULCAxLApAQCAtMjEwNiw5ICsyMTI3LDYgQEAKIGVsc2UKICAgQUNfTVNHX1JFU1VMVChubykKIGZpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQogCiBBQ19DSEVDS19TSVpFT0YodGltZV90LCBbXSwgWwogI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKQEAgLTM3NTUsNiArMzc3MywxMCBAQAogQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfZ2VuXSkKIEFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2JpcnRodGltZV0pCiBBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9ibG9ja3NdKQorQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHBhc3N3ZC5wd19nZWNvcywgc3RydWN0IHBhc3N3ZC5wd19wYXNzd2RdLCBbXSwgW10sIFtbCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorXV0pCiAKIEFDX01TR19DSEVDS0lORyhmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lKQogQUNfQ0FDSEVfVkFMKGFjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUsWwpAQCAtMzgwMyw2ICszODI1LDE5IEBACiAJQUNfREVGSU5FKEhBVkVfU09DS0FERFJfU1RPUkFHRSwgMSwgW3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIChzeXMvc29ja2V0LmgpXSkKIGZpCiAKK0FDX01TR19DSEVDS0lORyhmb3Igc29ja2FkZHJfYWxnKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9hbGcsCitBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMJCWluY2x1ZGUgPGxpbnV4L2lmX2FsZy5oPl1dLCBbW3N0cnVjdCBzb2NrYWRkcl9hbGcgc11dKV0sCisgIFthY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnPXllc10sCisgIFthY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnPW5vXSkpCitBQ19NU0dfUkVTVUxUKCRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfYWxnKQoraWYgdGVzdCAkYWNfY3Zfc3RydWN0X3NvY2thZGRyX2FsZyA9IHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX1NPQ0tBRERSX0FMRywgMSwgW3N0cnVjdCBzb2NrYWRkcl9hbGcgKGxpbnV4L2lmX2FsZy5oKV0pCitmaQorCiAjIGNoZWNrcyBmb3IgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzCiAKIEFDX0NfQ0hBUl9VTlNJR05FRApAQCAtNDMzMSw2ICs0MzY2LDggQEAKICAgW2RlZmluZSB0byAxIGlmIHlvdXIgc2VtX2dldHZhbHVlIGlzIGJyb2tlbi5dKQogZmkKIAorQUNfQ0hFQ0tfREVDTFMoW1JUTERfTEFaWSwgUlRMRF9OT1csIFJUTERfR0xPQkFMLCBSVExEX0xPQ0FMLCBSVExEX05PREVMRVRFLCBSVExEX05PTE9BRCwgUlRMRF9ERUVQQklORF0sIFtdLCBbXSwgW1sjaW5jbHVkZSA8ZGxmY24uaD5dXSkKKwogIyBkZXRlcm1pbmUgd2hhdCBzaXplIGRpZ2l0IHRvIHVzZSBmb3IgUHl0aG9uJ3MgbG9uZ3MKIEFDX01TR19DSEVDS0lORyhbZGlnaXQgc2l6ZSBmb3IgUHl0aG9uJ3MgbG9uZ3NdKQogQUNfQVJHX0VOQUJMRShiaWctZGlnaXRzLApAQCAtNDQ0OSw3ICs0NDg2LDExIEBACiAKIGRubCBkZWZpbmUgTElCUEwgYWZ0ZXIgQUJJRkxBR1MgYW5kIExEVkVSU0lPTiBpcyBkZWZpbmVkLgogQUNfU1VCU1QoUFlfRU5BQkxFX1NIQVJFRCkKLUxJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIExJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgorZWxzZQorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfS0ke1BMQVRGT1JNX1RSSVBMRVR9IgorZmkKIEFDX1NVQlNUKExJQlBMKQogCiAjIENoZWNrIHdoZXRoZXIgcmlnaHQgc2hpZnRpbmcgYSBuZWdhdGl2ZSBpbnRlZ2VyIGV4dGVuZHMgdGhlIHNpZ24gYml0CkBAIC00ODQ3LDYzICs0ODg4LDYwIEBACiAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgL2Rldi9wdGMgZGV2aWNlIGZpbGUuXSkKIGZpCiAKLWlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMKLXRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKGZvciAlbGxkIGFuZCAlbGx1IHByaW50ZigpIGZvcm1hdCBzdXBwb3J0KQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0LAotICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW1sKLSAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0gICNpbmNsdWRlIDxzdGRkZWYuaD4KLSAgI2luY2x1ZGUgPHN0cmluZy5oPgorQUNfTVNHX0NIRUNLSU5HKGZvciAlbGxkIGFuZCAlbGx1IHByaW50ZigpIGZvcm1hdCBzdXBwb3J0KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCwKK0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbWworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSAgI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotICAjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKIAotICBpbnQgbWFpbigpCi0gIHsKLSAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CitpbnQgbWFpbigpCit7CitjaGFyIGJ1ZmZlclsyNTZdOwogCi0gICAgICBpZiAoc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpIDwgMCkKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiMTIzIikpCi0gICAgICAgICAgcmV0dXJuIDE7CitpZiAoc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZykxMjMpIDwgMCkKK3JldHVybiAxOworaWYgKHN0cmNtcChidWZmZXIsICIxMjMiKSkKK3JldHVybiAxOwogCi0gICAgICBpZiAoc3ByaW50ZihidWZmZXIsICIlbGxkIiwgKGxvbmcgbG9uZyktMTIzKSA8IDApCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBpZiAoc3RyY21wKGJ1ZmZlciwgIi0xMjMiKSkKLSAgICAgICAgICByZXR1cm4gMTsKK2lmIChzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKS0xMjMpIDwgMCkKK3JldHVybiAxOworaWYgKHN0cmNtcChidWZmZXIsICItMTIzIikpCityZXR1cm4gMTsKIAotICAgICAgaWYgKHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKSA8IDApCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBpZiAoc3RyY21wKGJ1ZmZlciwgIjEyMyIpKQotICAgICAgICAgIHJldHVybiAxOworaWYgKHNwcmludGYoYnVmZmVyLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpMTIzKSA8IDApCityZXR1cm4gMTsKK2lmIChzdHJjbXAoYnVmZmVyLCAiMTIzIikpCityZXR1cm4gMTsKIAotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgXV1dKV0sCi0gIFthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9eWVzXSwKLSAgW2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD1ub10sCi0gIFthY19jdl9oYXZlX2xvbmdfbG9uZ19mb3JtYXQ9ImNyb3NzIC0tIGFzc3VtaW5nIG5vIgotICAgaWYgdGVzdCB4JEdDQyA9IHh5ZXM7IHRoZW4KLSAgICBzYXZlX0NGTEFHUz0kQ0ZMQUdTCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XZXJyb3IgLVdmb3JtYXQiCi0gICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotICAgICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KLSAgICAgICAgI2luY2x1ZGUgPHN0ZGRlZi5oPgotICAgICAgXV0sIFtbCi0gICAgICBjaGFyICpidWZmZXI7Ci0gICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKTEyMyk7Ci0gICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKS0xMjMpOwotICAgICAgc3ByaW50ZihidWZmZXIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykxMjMpOwotICAgICAgXV0pXSwKLSAgICAgIGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD15ZXMKLSAgICApCi0gICAgQ0ZMQUdTPSRzYXZlX0NGTEFHUwotICAgZmldKQotICApCi0gIEFDX01TR19SRVNVTFQoJGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCkKLWZpCityZXR1cm4gMDsKK30KK11dXSldLAorW2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD15ZXNdLAorW2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD1ub10sCitbYWNfY3ZfaGF2ZV9sb25nX2xvbmdfZm9ybWF0PSJjcm9zcyAtLSBhc3N1bWluZyBubyIKK2lmIHRlc3QgeCRHQ0MgPSB4eWVzOyB0aGVuCitzYXZlX0NGTEFHUz0kQ0ZMQUdTCitDRkxBR1M9IiRDRkxBR1MgLVdlcnJvciAtV2Zvcm1hdCIKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorXV0sIFtbCitjaGFyICpidWZmZXI7CitzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKTEyMyk7CitzcHJpbnRmKGJ1ZmZlciwgIiVsbGQiLCAobG9uZyBsb25nKS0xMjMpOworc3ByaW50ZihidWZmZXIsICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykxMjMpOworXV0pXSwKK2FjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdD15ZXMKKykKK0NGTEFHUz0kc2F2ZV9DRkxBR1MKK2ZpXSkKKykKK0FDX01TR19SRVNVTFQoJGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCkKIAogaWYgdGVzdCAiJGFjX2N2X2hhdmVfbG9uZ19sb25nX2Zvcm1hdCIgPSB5ZXMKIHRoZW4KZGlmZiAtLWdpdCBhL3B5Y29uZmlnLmguaW4gYi9weWNvbmZpZy5oLmluCmluZGV4IGJmNGJhNWIuLmVkNmI4MGQgMTAwNjQ0Ci0tLSBhL3B5Y29uZmlnLmguaW4KKysrIGIvcHljb25maWcuaC5pbgpAQCAtMTIsNiArMTIsOSBAQAogICAgc3VwcG9ydCBmb3IgQUlYIEMrKyBzaGFyZWQgZXh0ZW5zaW9uIG1vZHVsZXMuICovCiAjdW5kZWYgQUlYX0dFTlVJTkVfQ1BMVVNQTFVTCiAKKy8qIFRoZSBBbmRyb2lkIEFQSSBsZXZlbC4gKi8KKyN1bmRlZiBBTkRST0lEX0FQSV9MRVZFTAorCiAvKiBEZWZpbmUgaWYgQyBkb3VibGVzIGFyZSA2NC1iaXQgSUVFRSA3NTQgYmluYXJ5IGZvcm1hdCwgc3RvcmVkIGluIEFSTQogICAgbWl4ZWQtZW5kaWFuIG9yZGVyIChieXRlIG9yZGVyIDQ1NjcwMTIzKSAqLwogI3VuZGVmIERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQKQEAgLTE2Nyw2ICsxNzAsMzQgQEAKICAgICovCiAjdW5kZWYgSEFWRV9ERUNMX0lTTkFOCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9ERUVQQklORCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfREVFUEJJTkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX0dMT0JBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfR0xPQkFMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MQVpZJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9MQVpZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MT0NBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTE9DQUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PREVMRVRFJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfTk9MT0FEJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0xPQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PVycsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTk9XCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgdHpuYW1lJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgogICAgKi8KICN1bmRlZiBIQVZFX0RFQ0xfVFpOQU1FCkBAIC00NTMsMTIgKzQ4NCw2IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluaXRncm91cHMnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfSU5JVEdST1VQUwogCi0vKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBpbnQzMl90LiAqLwotI3VuZGVmIEhBVkVfSU5UMzJfVAotCi0vKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyBpbnQ2NF90LiAqLwotI3VuZGVmIEhBVkVfSU5UNjRfVAotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAogCkBAIC01NjEsOSArNTg2LDYgQEAKIC8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSB0eXBlIGxvbmcgZG91YmxlLiAqLwogI3VuZGVmIEhBVkVfTE9OR19ET1VCTEUKIAotLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIHR5cGUgbG9uZyBsb25nLiAqLwotI3VuZGVmIEhBVkVfTE9OR19MT05HCi0KIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbHN0YXQnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfTFNUQVQKIApAQCAtODYxLDYgKzg4Myw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1NOUFJJTlRGCiAKKy8qIHN0cnVjdCBzb2NrYWRkcl9hbGcgKGxpbnV4L2lmX2FsZy5oKSAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfQUxHCisKIC8qIERlZmluZSBpZiBzb2NrYWRkciBoYXMgc2FfbGVuIG1lbWJlciAqLwogI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAKQEAgLTkxNiw2ICs5NDEsMTIgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1NUUk9QVFNfSAogCisvKiBEZWZpbmUgdG8gMSBpZiBgcHdfZ2Vjb3MnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgcGFzc3dkJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfR0VDT1MKKworLyogRGVmaW5lIHRvIDEgaWYgYHB3X3Bhc3N3ZCcgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBwYXNzd2QnLiAqLworI3VuZGVmIEhBVkVfU1RSVUNUX1BBU1NXRF9QV19QQVNTV0QKKwogLyogRGVmaW5lIHRvIDEgaWYgYHN0X2JpcnRodGltZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KICN1bmRlZiBIQVZFX1NUUlVDVF9TVEFUX1NUX0JJUlRIVElNRQogCkBAIC0xMTAzLDE1ICsxMTM0LDYgQEAKIC8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRjbCBhbmQgVENMX1VURl9NQVg9PTYgKi8KICN1bmRlZiBIQVZFX1VDUzRfVENMCiAKLS8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQzMl90LiAqLwotI3VuZGVmIEhBVkVfVUlOVDMyX1QKLQotLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgdWludDY0X3QuICovCi0jdW5kZWYgSEFWRV9VSU5UNjRfVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdWludHB0cl90Jy4gKi8KLSN1bmRlZiBIQVZFX1VJTlRQVFJfVAotCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuYW1lJyBmdW5jdGlvbi4gKi8KICN1bmRlZiBIQVZFX1VOQU1FCiAKQEAgLTE0NDIsMTYgKzE0NjQsNiBAQAogLyogRGVmaW5lIHRvIGZvcmNlIHVzZSBvZiB0aHJlYWQtc2FmZSBlcnJubywgaF9lcnJubywgYW5kIG90aGVyIGZ1bmN0aW9ucyAqLwogI3VuZGVmIF9SRUVOVFJBTlQKIAotLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50MzJfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKLSAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQotICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KLSN1bmRlZiBfVUlOVDMyX1QKLQotLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50NjRfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKLSAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQotICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KLSN1bmRlZiBfVUlOVDY0X1QKLQogLyogRGVmaW5lIHRvIHRoZSBsZXZlbCBvZiBYL09wZW4gdGhhdCB5b3VyIHN5c3RlbSBzdXBwb3J0cyAqLwogI3VuZGVmIF9YT1BFTl9TT1VSQ0UKIApAQCAtMTQ4MSwxNCArMTQ5Myw2IEBACiAjdW5kZWYgaW5saW5lCiAjZW5kaWYKIAotLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGEgc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKLSAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCi0jdW5kZWYgaW50MzJfdAotCi0vKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgNjQgYml0cyBpZgotICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KLSN1bmRlZiBpbnQ2NF90Ci0KIC8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KICN1bmRlZiBtb2RlX3QKIApAQCAtMTUxMCwxNCArMTUxNCw2IEBACiAvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gKi8KICN1bmRlZiB1aWRfdAogCi0vKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgMzIgYml0cyBpZgotICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KLSN1bmRlZiB1aW50MzJfdAotCi0vKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgNjQgYml0cyBpZgotICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KLSN1bmRlZiB1aW50NjRfdAotCiAvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gKi8KICN1bmRlZiB2b2xhdGlsZQogCmRpZmYgLS1naXQgYS9zZXR1cC5weSBiL3NldHVwLnB5CmluZGV4IDE3NGNlNzIuLmVkMWFjZmQgMTAwNjQ0Ci0tLSBhL3NldHVwLnB5CisrKyBiL3NldHVwLnB5CkBAIC0xODYsNyArMTg2LDcgQEAKICAgICBpZiBub3QgbGlzdDoKICAgICAgICAgcmV0dXJuIG1vZHVsZQogICAgIGlmIGxlbihsaXN0KSA+IDE6Ci0gICAgICAgIGxvZy5pbmZvKCJXQVJOSU5HOiBtdWx0aXBsZSBjb3BpZXMgb2YgJXMgZm91bmQiJW1vZHVsZSkKKyAgICAgICAgbG9nLmluZm8oIldBUk5JTkc6IG11bHRpcGxlIGNvcGllcyBvZiAlcyBmb3VuZCIsIG1vZHVsZSkKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpc3RbMF0sIG1vZHVsZSkKIAogY2xhc3MgUHlCdWlsZEV4dChidWlsZF9leHQpOgpAQCAtODg5LDYgKzg4OSwyMiBAQAogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfc2hhMScsIFsnc2hhMW1vZHVsZS5jJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcz1bJ2hhc2hsaWIuaCddKSApCiAKKyAgICAgICAgYmxha2UyX2RlcHMgPSBnbG9iKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgc3JjZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNb2R1bGVzL19ibGFrZTIvaW1wbC8qJykpCisgICAgICAgIGJsYWtlMl9kZXBzLmFwcGVuZCgnaGFzaGxpYi5oJykKKworICAgICAgICBibGFrZTJfbWFjcm9zID0gW10KKyAgICAgICAgaWYgb3MudW5hbWUoKS5tYWNoaW5lID09ICJ4ODZfNjQiOgorICAgICAgICAgICAgIyBFdmVyeSB4ODZfNjQgbWFjaGluZSBoYXMgYXQgbGVhc3QgU1NFMi4KKyAgICAgICAgICAgIGJsYWtlMl9tYWNyb3MuYXBwZW5kKCgnQkxBS0UyX1VTRV9TU0UnLCAnMScpKQorCisgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19ibGFrZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnX2JsYWtlMi9ibGFrZTJtb2R1bGUuYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfYmxha2UyL2JsYWtlMmJfaW1wbC5jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19ibGFrZTIvYmxha2Uyc19pbXBsLmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zPWJsYWtlMl9tYWNyb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcz1ibGFrZTJfZGVwcykgKQorCiAgICAgICAgICMgTW9kdWxlcyB0aGF0IHByb3ZpZGUgcGVyc2lzdGVudCBkaWN0aW9uYXJ5LWxpa2Ugc2VtYW50aWNzLiAgWW91IHdpbGwKICAgICAgICAgIyBwcm9iYWJseSB3YW50IHRvIGFycmFuZ2UgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGVtIHRvIGJlIGF2YWlsYWJsZSBvbgogICAgICAgICAjIHlvdXIgbWFjaGluZSwgdGhvdWdoIG5vbmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBiZWNhdXNlIG9mIGxpYnJhcnkKQEAgLTIwMDcsNyArMjAyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBmZmlfbGliID0gTm9uZQogICAgICAgICBpZiBmZmlfaW5jIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZm9yIGxpYl9uYW1lIGluICgnZmZpX2NvbnZlbmllbmNlJywgJ2ZmaV9waWMnLCAnZmZpJyk6CisgICAgICAgICAgICBmb3IgbGliX25hbWUgaW4gKCdmZmknLCAnZmZpX3BpYycpOgogICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCBsaWJfbmFtZSkpOgogICAgICAgICAgICAgICAgICAgICBmZmlfbGliID0gbGliX25hbWUKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKQEAgLTIwNjAsNyArMjA3Niw3IEBACiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9mbnQuaCcsCiAgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9mb3Vyc3RlcC5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL2lvLmgnLAotICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmgnLAorICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL251bWJlcnRoZW9yeS5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL3NpeHN0ZXAuaCcsCkBAIC0yMjEzLDcgKzIyMjksNyBAQAogICAgICAgICAgICAgICAgIG5ld2ZpbGVuYW1lID0gZmlsZW5hbWUgKyBmdWxsdmVyc2lvbgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBuZXdmaWxlbmFtZSA9IGZpbGVuYW1lICsgbWlub3Jvbmx5Ci0gICAgICAgICAgICBsb2cuaW5mbygncmVuYW1pbmcge30gdG8ge30nLmZvcm1hdChmaWxlbmFtZSwgbmV3ZmlsZW5hbWUpKQorICAgICAgICAgICAgbG9nLmluZm8oJ3JlbmFtaW5nICVzIHRvICVzJywgZmlsZW5hbWUsIG5ld2ZpbGVuYW1lKQogICAgICAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lLCBuZXdmaWxlbmFtZSkKICAgICAgICAgICAgIG5ld291dGZpbGVzLmFwcGVuZChuZXdmaWxlbmFtZSkKICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGluIHVwZGF0ZWRfZmlsZXM6CkBAIC0yMjU1LDcgKzIyNzEsNyBAQAogICAgIHNldHVwKCMgUHlQSSBNZXRhZGF0YSAoUEVQIDMwMSkKICAgICAgICAgICBuYW1lID0gIlB5dGhvbiIsCiAgICAgICAgICAgdmVyc2lvbiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0sCi0gICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy8lcyIgJSBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy8lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICBtYWludGFpbmVyID0gIkd1aWRvIHZhbiBSb3NzdW0gYW5kIHRoZSBQeXRob24gY29tbXVuaXR5IiwKICAgICAgICAgICBtYWludGFpbmVyX2VtYWlsID0gInB5dGhvbi1kZXZAcHl0aG9uLm9yZyIsCiAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQSBoaWdoLWxldmVsIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyBsYW5ndWFnZSIsCg==